From 1de94c2b050ddc576c90d93cc9483b109323438e Mon Sep 17 00:00:00 2001 From: Pascal Thibaudeau Date: Fri, 8 Oct 2021 09:38:12 +0200 Subject: [PATCH] file attributes; cmake files updates Possible names for PETSC & SLEPC libraries first workflow error for petsc and slepc replacement libopenblas ready workflows for ubuntu-latest default paths parallel make Enhanced build instructions correction for petsc name cache test mpi for aarch64 architecture cleaning merge garbage lowercase message no default path problem update cmake and docker overrideable paths simplify include/src simplify SLEPC is required delete shared lib by default rm makefile make metis optional update readme fixes path search for slepc Better openblas search and flags whoops fix actions + slepc Use different header --- .github/workflows/compile.yaml | 49 + .gitignore | 1 + CMakeLists.txt | 92 +- Dockerfile | 50 + Makefile | 72 - README.md | 18 +- cMake/SetupBLAS.cmake | 47 - cMake/SetupGMSH.cmake | 43 - cMake/SetupMETIS.cmake | 47 - cMake/SetupMPI.cmake | 49 - cMake/SetupMUMPS.cmake | 47 - cMake/SetupPETSC.cmake | 60 - cMake/SetupSLEPC.cmake | 47 - cMake/functions.cmake | 45 - cmake/FindGMSH.cmake | 17 + cmake/FindMETIS.cmake | 17 + cmake/FindPETSC.cmake | 17 + cmake/FindSLEPC.cmake | 24 + {src/field => include}/coefmanager.h | 0 {src/formulation => include}/contribution.h | 0 {src/mesh => include}/coordinategroup.h | 0 {src => include}/densemat.h | 0 {src/mesh => include}/disjointregions.h | 0 .../mesh => include}/disjointregionselector.h | 0 {src/formulation => include}/dofinterpolate.h | 0 {src/formulation => include}/dofmanager.h | 0 {src/mesh => include}/dtracker.h | 0 {src/resolution => include}/eigenvalue.h | 0 {src => include}/element.h | 0 {src/mesh => include}/elements.h | 0 {src/mesh => include}/elementselector.h | 0 {src/expression => include}/expression.h | 0 include/expression/expression.h | 306 + {src => include}/expression/integration.h | 0 {src => include}/expression/oncontext.h | 0 {src => include}/expression/operation/opabs.h | 0 .../expression/operation/opacos.h | 0 .../expression/operation/opasin.h | 0 .../expression/operation/opatan.h | 0 .../expression/operation/opathp.h | 0 .../expression/operation/opcondition.h | 0 .../expression/operation/opconstant.h | 0 {src => include}/expression/operation/opcos.h | 0 .../expression/operation/opcustom.h | 0 .../expression/operation/opdetjac.h | 0 {src => include}/expression/operation/opdof.h | 0 .../expression/operation/opdtapprox.h | 0 .../expression/operation/operation.h | 0 .../expression/operation/opestimator.h | 0 .../expression/operation/opfield.h | 0 .../expression/operation/opfieldorder.h | 0 .../expression/operation/opharmonic.h | 0 .../expression/operation/opinversion.h | 0 .../expression/operation/opinvjac.h | 0 {src => include}/expression/operation/opjac.h | 0 {src => include}/expression/operation/oplog.h | 0 .../expression/operation/opmeshsize.h | 0 {src => include}/expression/operation/opmod.h | 0 {src => include}/expression/operation/opon.h | 0 .../expression/operation/oporientation.h | 0 .../expression/operation/opparameter.h | 0 .../expression/operation/opport.h | 0 .../expression/operation/oppower.h | 0 .../expression/operation/opproduct.h | 0 {src => include}/expression/operation/opsin.h | 0 .../expression/operation/opspline.h | 0 {src => include}/expression/operation/opsum.h | 0 {src => include}/expression/operation/optan.h | 0 {src => include}/expression/operation/optf.h | 0 .../expression/operation/optime.h | 0 {src => include}/expression/operation/sl.h | 0 {src => include}/expression/parameter.h | 0 .../expression/parameterselectedregion.h | 0 {src => include}/expression/port.h | 0 {src => include}/expression/portrelation.h | 0 {src => include}/expression/rawparameter.h | 0 {src => include}/expression/rawport.h | 0 .../expression/vectorfieldselect.h | 0 {src/field => include}/field.h | 0 include/field/coefmanager.h | 58 + include/field/field.h | 216 + {src => include}/field/jacobian.h | 0 {src => include}/field/rawfield.h | 0 {src/formulation => include}/formulation.h | 0 include/formulation/contribution.h | 98 + include/formulation/dofinterpolate.h | 79 + include/formulation/dofmanager.h | 170 + include/formulation/formulation.h | 125 + {src => include}/formulation/mat.h | 0 {src => include}/formulation/rawmat.h | 0 {src => include}/formulation/rawvec.h | 0 {src => include}/formulation/vec.h | 0 {src => include}/fourier.h | 0 {src => include}/gausspoint/gausspoints.h | 0 {src => include}/gausspoint/gphexahedron.h | 0 {src => include}/gausspoint/gpline.h | 0 {src => include}/gausspoint/gppoint.h | 0 {src => include}/gausspoint/gpprism.h | 0 {src => include}/gausspoint/gppyramid.h | 0 {src => include}/gausspoint/gpquadrangle.h | 0 {src => include}/gausspoint/gptetrahedron.h | 0 {src => include}/gausspoint/gptriangle.h | 0 include/gausspoints.h | 50 + {src/resolution => include}/genalpha.h | 0 {src/mesh => include}/gentools.h | 0 {src => include}/geometry/geotools.h | 0 {src => include}/geometry/rawarc.h | 0 {src => include}/geometry/rawdisk.h | 0 {src => include}/geometry/rawextrusion.h | 0 {src => include}/geometry/rawline.h | 0 {src => include}/geometry/rawpoint.h | 0 {src => include}/geometry/rawquadrangle.h | 0 {src => include}/geometry/rawshape.h | 0 {src => include}/geometry/rawsurface.h | 0 {src => include}/geometry/rawtriangle.h | 0 {src => include}/geometry/rawunion.h | 0 {src => include}/geometry/rawvolume.h | 0 {src => include}/geometry/shape.h | 0 include/geotools.h | 81 + {src/io => include}/gmsh/gmshinterface.h | 0 include/gmshinterface.h | 61 + include/gphexahedron.h | 21 + include/gpline.h | 21 + include/gppoint.h | 21 + include/gpprism.h | 21 + include/gppyramid.h | 21 + include/gpquadrangle.h | 21 + include/gptetrahedron.h | 21 + include/gptriangle.h | 21 + .../h1/h1hexahedron.h | 0 .../hierarchical => include}/h1/h1line.h | 0 .../hierarchical => include}/h1/h1point.h | 0 .../hierarchical => include}/h1/h1prism.h | 0 .../hierarchical => include}/h1/h1pyramid.h | 0 .../h1/h1quadrangle.h | 0 .../h1/h1tetrahedron.h | 0 .../hierarchical => include}/h1/h1triangle.h | 0 include/h1hexahedron.h | 47 + include/h1line.h | 47 + include/h1point.h | 43 + include/h1prism.h | 47 + include/h1pyramid.h | 38 + include/h1quadrangle.h | 47 + include/h1tetrahedron.h | 47 + include/h1triangle.h | 47 + {src => include}/harmonic.h | 0 .../hcurl/hcurlhexahedron.h | 0 .../hcurl/hcurlline.h | 0 .../hcurl/hcurlpoint.h | 0 .../hcurl/hcurlprism.h | 0 .../hcurl/hcurlpyramid.h | 0 .../hcurl/hcurlquadrangle.h | 0 .../hcurl/hcurltetrahedron.h | 0 .../hcurl/hcurltriangle.h | 0 include/hcurlhexahedron.h | 42 + include/hcurlline.h | 42 + include/hcurlpoint.h | 34 + include/hcurlprism.h | 42 + include/hcurlpyramid.h | 34 + include/hcurlquadrangle.h | 42 + include/hcurltetrahedron.h | 42 + include/hcurltriangle.h | 42 + include/hierarchical/h1/h1hexahedron.h | 47 + include/hierarchical/h1/h1line.h | 47 + include/hierarchical/h1/h1point.h | 43 + include/hierarchical/h1/h1prism.h | 47 + include/hierarchical/h1/h1pyramid.h | 38 + include/hierarchical/h1/h1quadrangle.h | 47 + include/hierarchical/h1/h1tetrahedron.h | 47 + include/hierarchical/h1/h1triangle.h | 47 + include/hierarchical/hcurl/hcurlhexahedron.h | 42 + include/hierarchical/hcurl/hcurlline.h | 42 + include/hierarchical/hcurl/hcurlpoint.h | 34 + include/hierarchical/hcurl/hcurlprism.h | 42 + include/hierarchical/hcurl/hcurlpyramid.h | 34 + include/hierarchical/hcurl/hcurlquadrangle.h | 42 + include/hierarchical/hcurl/hcurltetrahedron.h | 42 + include/hierarchical/hcurl/hcurltriangle.h | 42 + .../hierarchical/hierarchicalformfunction.h | 0 .../hierarchicalformfunctioncontainer.h | 0 .../hierarchicalformfunctioniterator.h | 0 .../hierarchical/legendre.h | 0 .../hierarchical/oneconstant.h | 0 .../hierarchical/orientation.h | 0 .../hierarchical/selector.h | 0 include/hierarchicalformfunction.h | 61 + include/hierarchicalformfunctioncontainer.h | 76 + include/hierarchicalformfunctioniterator.h | 74 + {src/mesh => include}/htracker.h | 0 {src/resolution => include}/impliciteuler.h | 0 {src => include}/indexmat.h | 0 include/integration.h | 62 + include/io/gmsh/gmshinterface.h | 61 + {src => include}/io/iodata.h | 0 {src => include}/io/iointerface.h | 0 {src => include}/io/nastran/nasdataline.h | 0 .../io/nastran/nastraninterface.h | 0 {src => include}/io/paraview/pvinterface.h | 0 include/iodata.h | 83 + include/iointerface.h | 40 + include/jacobian.h | 73 + .../lagrange/lagrangeformfunction.h | 0 .../lagrange/lagrangehexahedron.h | 0 .../lagrange/lagrangeline.h | 0 .../lagrange/lagrangepoint.h | 0 .../lagrange/lagrangeprism.h | 0 .../lagrange/lagrangepyramid.h | 0 .../lagrange/lagrangequadrangle.h | 0 .../lagrange/lagrangetetrahedron.h | 0 .../lagrange/lagrangetriangle.h | 0 include/lagrangeformfunction.h | 77 + include/lagrangehexahedron.h | 25 + include/lagrangeline.h | 25 + include/lagrangepoint.h | 25 + include/lagrangeprism.h | 25 + include/lagrangepyramid.h | 25 + include/lagrangequadrangle.h | 25 + include/lagrangetetrahedron.h | 25 + include/lagrangetriangle.h | 25 + include/legendre.h | 30 + include/mat.h | 93 + {src/mesh => include}/mesh.h | 0 include/mesh/coordinategroup.h | 58 + include/mesh/disjointregions.h | 62 + include/mesh/disjointregionselector.h | 33 + include/mesh/dtracker.h | 160 + include/mesh/elements.h | 253 + include/mesh/elementselector.h | 100 + include/mesh/gentools.h | 284 + include/mesh/htracker.h | 190 + include/mesh/mesh.h | 117 + {src => include}/mesh/mystring.h | 0 {src => include}/mesh/nodes.h | 0 {src => include}/mesh/petscmesh.h | 0 {src => include}/mesh/physicalregion.h | 0 {src => include}/mesh/physicalregions.h | 0 {src => include}/mesh/ptracker.h | 0 {src => include}/mesh/rawmesh.h | 0 {src => include}/mesh/rawspanningtree.h | 0 .../mesh/referencecoordinategroup.h | 0 {src => include}/mesh/regiondefiner.h | 0 {src => include}/mesh/spanningtree.h | 0 include/mystring.h | 50 + include/nasdataline.h | 64 + include/nastran/nasdataline.h | 64 + include/nastran/nastraninterface.h | 27 + include/nastraninterface.h | 27 + include/nodes.h | 54 + include/oncontext.h | 46 + include/oneconstant.h | 45 + include/opabs.h | 41 + include/opacos.h | 41 + include/opasin.h | 41 + include/opatan.h | 41 + include/opathp.h | 37 + include/opcondition.h | 43 + include/opconstant.h | 41 + include/opcos.h | 41 + include/opcustom.h | 49 + include/opdetjac.h | 28 + include/opdof.h | 77 + include/opdtapprox.h | 49 + include/operation.h | 200 + include/operation/opabs.h | 41 + include/operation/opacos.h | 41 + include/operation/opasin.h | 41 + include/operation/opatan.h | 41 + include/operation/opathp.h | 37 + include/operation/opcondition.h | 43 + include/operation/opconstant.h | 41 + include/operation/opcos.h | 41 + include/operation/opcustom.h | 49 + include/operation/opdetjac.h | 28 + include/operation/opdof.h | 77 + include/operation/opdtapprox.h | 49 + include/operation/operation.h | 200 + include/operation/opestimator.h | 53 + include/operation/opfield.h | 70 + include/operation/opfieldorder.h | 39 + include/operation/opharmonic.h | 45 + include/operation/opinversion.h | 41 + include/operation/opinvjac.h | 33 + include/operation/opjac.h | 33 + include/operation/oplog.h | 41 + include/operation/opmeshsize.h | 36 + include/operation/opmod.h | 44 + include/operation/opon.h | 44 + include/operation/oporientation.h | 36 + include/operation/opparameter.h | 52 + include/operation/opport.h | 45 + include/operation/oppower.h | 42 + include/operation/opproduct.h | 61 + include/operation/opsin.h | 41 + include/operation/opspline.h | 41 + include/operation/opsum.h | 57 + include/operation/optan.h | 41 + include/operation/optf.h | 67 + include/operation/optime.h | 36 + include/operation/sl.h | 339 + include/opestimator.h | 53 + include/opfield.h | 70 + include/opfieldorder.h | 39 + include/opharmonic.h | 45 + include/opinversion.h | 41 + include/opinvjac.h | 33 + include/opjac.h | 33 + include/oplog.h | 41 + include/opmeshsize.h | 36 + include/opmod.h | 44 + include/opon.h | 44 + include/oporientation.h | 36 + include/opparameter.h | 52 + include/opport.h | 45 + include/oppower.h | 42 + include/opproduct.h | 61 + include/opsin.h | 41 + include/opspline.h | 41 + include/opsum.h | 57 + include/optan.h | 41 + include/optf.h | 67 + include/optime.h | 36 + include/orientation.h | 105 + include/parameter.h | 93 + include/parameterselectedregion.h | 32 + include/paraview/pvinterface.h | 39 + include/petscmesh.h | 43 + include/physicalregion.h | 77 + include/physicalregions.h | 85 + {src/shapefunction => include}/polynomial.h | 0 {src/shapefunction => include}/polynomials.h | 0 include/port.h | 72 + include/portrelation.h | 63 + include/ptracker.h | 53 + include/pvinterface.h | 39 + include/rawarc.h | 83 + include/rawdisk.h | 85 + include/rawextrusion.h | 88 + include/rawfield.h | 291 + include/rawline.h | 85 + include/rawmat.h | 97 + include/rawmesh.h | 176 + include/rawparameter.h | 79 + include/rawpoint.h | 73 + include/rawport.h | 77 + include/rawquadrangle.h | 79 + include/rawshape.h | 77 + include/rawspanningtree.h | 93 + include/rawsurface.h | 75 + include/rawtriangle.h | 79 + include/rawunion.h | 73 + include/rawvec.h | 99 + include/rawvolume.h | 72 + include/referencecoordinategroup.h | 61 + include/regiondefiner.h | 118 + {src/resolution => include}/resolution.h | 0 include/resolution/eigenvalue.h | 68 + include/resolution/genalpha.h | 116 + include/resolution/impliciteuler.h | 105 + include/resolution/resolution.h | 21 + include/selector.h | 41 + include/shape.h | 100 + .../hierarchical/h1/h1hexahedron.h | 47 + .../shapefunction/hierarchical/h1/h1line.h | 47 + .../shapefunction/hierarchical/h1/h1point.h | 43 + .../shapefunction/hierarchical/h1/h1prism.h | 47 + .../shapefunction/hierarchical/h1/h1pyramid.h | 38 + .../hierarchical/h1/h1quadrangle.h | 47 + .../hierarchical/h1/h1tetrahedron.h | 47 + .../hierarchical/h1/h1triangle.h | 47 + .../hierarchical/hcurl/hcurlhexahedron.h | 42 + .../hierarchical/hcurl/hcurlline.h | 42 + .../hierarchical/hcurl/hcurlpoint.h | 34 + .../hierarchical/hcurl/hcurlprism.h | 42 + .../hierarchical/hcurl/hcurlpyramid.h | 34 + .../hierarchical/hcurl/hcurlquadrangle.h | 42 + .../hierarchical/hcurl/hcurltetrahedron.h | 42 + .../hierarchical/hcurl/hcurltriangle.h | 42 + .../hierarchical/hierarchicalformfunction.h | 61 + .../hierarchicalformfunctioncontainer.h | 76 + .../hierarchicalformfunctioniterator.h | 74 + include/shapefunction/hierarchical/legendre.h | 30 + .../shapefunction/hierarchical/oneconstant.h | 45 + .../shapefunction/hierarchical/orientation.h | 105 + include/shapefunction/hierarchical/selector.h | 41 + .../lagrange/lagrangeformfunction.h | 77 + .../lagrange/lagrangehexahedron.h | 25 + include/shapefunction/lagrange/lagrangeline.h | 25 + .../shapefunction/lagrange/lagrangepoint.h | 25 + .../shapefunction/lagrange/lagrangeprism.h | 25 + .../shapefunction/lagrange/lagrangepyramid.h | 25 + .../lagrange/lagrangequadrangle.h | 25 + .../lagrange/lagrangetetrahedron.h | 25 + .../shapefunction/lagrange/lagrangetriangle.h | 25 + include/shapefunction/polynomial.h | 60 + include/shapefunction/polynomials.h | 47 + {src => include}/shapefunction/spline.h | 0 include/sl.h | 339 + {src => include}/slmpi.h | 0 include/spanningtree.h | 41 + {src => include}/sparselizard.h | 0 include/spline.h | 54 + {src => include}/universe.h | 0 include/vec.h | 107 + include/vectorfieldselect.h | 38 + {src => include}/wallclock.h | 0 simulations/default/CMakeLists.txt | 8 +- simulations/default/disk.msh | 11084 ++++++++-------- simulations/default/main.cpp | 16 +- sparselizard.pdf | Bin 409 files changed, 20138 insertions(+), 6037 deletions(-) create mode 100644 .github/workflows/compile.yaml create mode 100644 Dockerfile delete mode 100755 Makefile delete mode 100644 cMake/SetupBLAS.cmake delete mode 100644 cMake/SetupGMSH.cmake delete mode 100644 cMake/SetupMETIS.cmake delete mode 100644 cMake/SetupMPI.cmake delete mode 100644 cMake/SetupMUMPS.cmake delete mode 100644 cMake/SetupPETSC.cmake delete mode 100644 cMake/SetupSLEPC.cmake delete mode 100644 cMake/functions.cmake create mode 100644 cmake/FindGMSH.cmake create mode 100644 cmake/FindMETIS.cmake create mode 100644 cmake/FindPETSC.cmake create mode 100644 cmake/FindSLEPC.cmake rename {src/field => include}/coefmanager.h (100%) mode change 100755 => 100644 rename {src/formulation => include}/contribution.h (100%) mode change 100755 => 100644 rename {src/mesh => include}/coordinategroup.h (100%) mode change 100755 => 100644 rename {src => include}/densemat.h (100%) mode change 100755 => 100644 rename {src/mesh => include}/disjointregions.h (100%) mode change 100755 => 100644 rename {src/mesh => include}/disjointregionselector.h (100%) mode change 100755 => 100644 rename {src/formulation => include}/dofinterpolate.h (100%) mode change 100755 => 100644 rename {src/formulation => include}/dofmanager.h (100%) mode change 100755 => 100644 rename {src/mesh => include}/dtracker.h (100%) mode change 100755 => 100644 rename {src/resolution => include}/eigenvalue.h (100%) rename {src => include}/element.h (100%) mode change 100755 => 100644 rename {src/mesh => include}/elements.h (100%) mode change 100755 => 100644 rename {src/mesh => include}/elementselector.h (100%) mode change 100755 => 100644 rename {src/expression => include}/expression.h (100%) mode change 100755 => 100644 create mode 100644 include/expression/expression.h rename {src => include}/expression/integration.h (100%) mode change 100755 => 100644 rename {src => include}/expression/oncontext.h (100%) mode change 100755 => 100644 rename {src => include}/expression/operation/opabs.h (100%) mode change 100755 => 100644 rename {src => include}/expression/operation/opacos.h (100%) mode change 100755 => 100644 rename {src => include}/expression/operation/opasin.h (100%) mode change 100755 => 100644 rename {src => include}/expression/operation/opatan.h (100%) mode change 100755 => 100644 rename {src => include}/expression/operation/opathp.h (100%) mode change 100755 => 100644 rename {src => include}/expression/operation/opcondition.h (100%) mode change 100755 => 100644 rename {src => include}/expression/operation/opconstant.h (100%) mode change 100755 => 100644 rename {src => include}/expression/operation/opcos.h (100%) mode change 100755 => 100644 rename {src => include}/expression/operation/opcustom.h (100%) mode change 100755 => 100644 rename {src => include}/expression/operation/opdetjac.h (100%) mode change 100755 => 100644 rename {src => include}/expression/operation/opdof.h (100%) mode change 100755 => 100644 rename {src => include}/expression/operation/opdtapprox.h (100%) rename {src => include}/expression/operation/operation.h (100%) mode change 100755 => 100644 rename {src => include}/expression/operation/opestimator.h (100%) mode change 100755 => 100644 rename {src => include}/expression/operation/opfield.h (100%) mode change 100755 => 100644 rename {src => include}/expression/operation/opfieldorder.h (100%) mode change 100755 => 100644 rename {src => include}/expression/operation/opharmonic.h (100%) mode change 100755 => 100644 rename {src => include}/expression/operation/opinversion.h (100%) mode change 100755 => 100644 rename {src => include}/expression/operation/opinvjac.h (100%) mode change 100755 => 100644 rename {src => include}/expression/operation/opjac.h (100%) mode change 100755 => 100644 rename {src => include}/expression/operation/oplog.h (100%) mode change 100755 => 100644 rename {src => include}/expression/operation/opmeshsize.h (100%) mode change 100755 => 100644 rename {src => include}/expression/operation/opmod.h (100%) mode change 100755 => 100644 rename {src => include}/expression/operation/opon.h (100%) mode change 100755 => 100644 rename {src => include}/expression/operation/oporientation.h (100%) mode change 100755 => 100644 rename {src => include}/expression/operation/opparameter.h (100%) mode change 100755 => 100644 rename {src => include}/expression/operation/opport.h (100%) mode change 100755 => 100644 rename {src => include}/expression/operation/oppower.h (100%) mode change 100755 => 100644 rename {src => include}/expression/operation/opproduct.h (100%) mode change 100755 => 100644 rename {src => include}/expression/operation/opsin.h (100%) mode change 100755 => 100644 rename {src => include}/expression/operation/opspline.h (100%) mode change 100755 => 100644 rename {src => include}/expression/operation/opsum.h (100%) mode change 100755 => 100644 rename {src => include}/expression/operation/optan.h (100%) mode change 100755 => 100644 rename {src => include}/expression/operation/optf.h (100%) mode change 100755 => 100644 rename {src => include}/expression/operation/optime.h (100%) mode change 100755 => 100644 rename {src => include}/expression/operation/sl.h (100%) mode change 100755 => 100644 rename {src => include}/expression/parameter.h (100%) mode change 100755 => 100644 rename {src => include}/expression/parameterselectedregion.h (100%) mode change 100755 => 100644 rename {src => include}/expression/port.h (100%) mode change 100755 => 100644 rename {src => include}/expression/portrelation.h (100%) mode change 100755 => 100644 rename {src => include}/expression/rawparameter.h (100%) mode change 100755 => 100644 rename {src => include}/expression/rawport.h (100%) mode change 100755 => 100644 rename {src => include}/expression/vectorfieldselect.h (100%) rename {src/field => include}/field.h (100%) mode change 100755 => 100644 create mode 100644 include/field/coefmanager.h create mode 100644 include/field/field.h rename {src => include}/field/jacobian.h (100%) mode change 100755 => 100644 rename {src => include}/field/rawfield.h (100%) mode change 100755 => 100644 rename {src/formulation => include}/formulation.h (100%) mode change 100755 => 100644 create mode 100644 include/formulation/contribution.h create mode 100644 include/formulation/dofinterpolate.h create mode 100644 include/formulation/dofmanager.h create mode 100644 include/formulation/formulation.h rename {src => include}/formulation/mat.h (100%) mode change 100755 => 100644 rename {src => include}/formulation/rawmat.h (100%) mode change 100755 => 100644 rename {src => include}/formulation/rawvec.h (100%) mode change 100755 => 100644 rename {src => include}/formulation/vec.h (100%) mode change 100755 => 100644 rename {src => include}/fourier.h (100%) mode change 100755 => 100644 rename {src => include}/gausspoint/gausspoints.h (100%) mode change 100755 => 100644 rename {src => include}/gausspoint/gphexahedron.h (100%) mode change 100755 => 100644 rename {src => include}/gausspoint/gpline.h (100%) mode change 100755 => 100644 rename {src => include}/gausspoint/gppoint.h (100%) mode change 100755 => 100644 rename {src => include}/gausspoint/gpprism.h (100%) mode change 100755 => 100644 rename {src => include}/gausspoint/gppyramid.h (100%) mode change 100755 => 100644 rename {src => include}/gausspoint/gpquadrangle.h (100%) mode change 100755 => 100644 rename {src => include}/gausspoint/gptetrahedron.h (100%) mode change 100755 => 100644 rename {src => include}/gausspoint/gptriangle.h (100%) mode change 100755 => 100644 create mode 100644 include/gausspoints.h rename {src/resolution => include}/genalpha.h (100%) rename {src/mesh => include}/gentools.h (100%) mode change 100755 => 100644 rename {src => include}/geometry/geotools.h (100%) mode change 100755 => 100644 rename {src => include}/geometry/rawarc.h (100%) mode change 100755 => 100644 rename {src => include}/geometry/rawdisk.h (100%) mode change 100755 => 100644 rename {src => include}/geometry/rawextrusion.h (100%) mode change 100755 => 100644 rename {src => include}/geometry/rawline.h (100%) mode change 100755 => 100644 rename {src => include}/geometry/rawpoint.h (100%) mode change 100755 => 100644 rename {src => include}/geometry/rawquadrangle.h (100%) mode change 100755 => 100644 rename {src => include}/geometry/rawshape.h (100%) mode change 100755 => 100644 rename {src => include}/geometry/rawsurface.h (100%) mode change 100755 => 100644 rename {src => include}/geometry/rawtriangle.h (100%) mode change 100755 => 100644 rename {src => include}/geometry/rawunion.h (100%) mode change 100755 => 100644 rename {src => include}/geometry/rawvolume.h (100%) mode change 100755 => 100644 rename {src => include}/geometry/shape.h (100%) mode change 100755 => 100644 create mode 100644 include/geotools.h rename {src/io => include}/gmsh/gmshinterface.h (100%) mode change 100755 => 100644 create mode 100644 include/gmshinterface.h create mode 100644 include/gphexahedron.h create mode 100644 include/gpline.h create mode 100644 include/gppoint.h create mode 100644 include/gpprism.h create mode 100644 include/gppyramid.h create mode 100644 include/gpquadrangle.h create mode 100644 include/gptetrahedron.h create mode 100644 include/gptriangle.h rename {src/shapefunction/hierarchical => include}/h1/h1hexahedron.h (100%) mode change 100755 => 100644 rename {src/shapefunction/hierarchical => include}/h1/h1line.h (100%) mode change 100755 => 100644 rename {src/shapefunction/hierarchical => include}/h1/h1point.h (100%) mode change 100755 => 100644 rename {src/shapefunction/hierarchical => include}/h1/h1prism.h (100%) mode change 100755 => 100644 rename {src/shapefunction/hierarchical => include}/h1/h1pyramid.h (100%) mode change 100755 => 100644 rename {src/shapefunction/hierarchical => include}/h1/h1quadrangle.h (100%) mode change 100755 => 100644 rename {src/shapefunction/hierarchical => include}/h1/h1tetrahedron.h (100%) mode change 100755 => 100644 rename {src/shapefunction/hierarchical => include}/h1/h1triangle.h (100%) mode change 100755 => 100644 create mode 100644 include/h1hexahedron.h create mode 100644 include/h1line.h create mode 100644 include/h1point.h create mode 100644 include/h1prism.h create mode 100644 include/h1pyramid.h create mode 100644 include/h1quadrangle.h create mode 100644 include/h1tetrahedron.h create mode 100644 include/h1triangle.h rename {src => include}/harmonic.h (100%) mode change 100755 => 100644 rename {src/shapefunction/hierarchical => include}/hcurl/hcurlhexahedron.h (100%) rename {src/shapefunction/hierarchical => include}/hcurl/hcurlline.h (100%) rename {src/shapefunction/hierarchical => include}/hcurl/hcurlpoint.h (100%) rename {src/shapefunction/hierarchical => include}/hcurl/hcurlprism.h (100%) rename {src/shapefunction/hierarchical => include}/hcurl/hcurlpyramid.h (100%) mode change 100755 => 100644 rename {src/shapefunction/hierarchical => include}/hcurl/hcurlquadrangle.h (100%) rename {src/shapefunction/hierarchical => include}/hcurl/hcurltetrahedron.h (100%) rename {src/shapefunction/hierarchical => include}/hcurl/hcurltriangle.h (100%) create mode 100644 include/hcurlhexahedron.h create mode 100644 include/hcurlline.h create mode 100644 include/hcurlpoint.h create mode 100644 include/hcurlprism.h create mode 100644 include/hcurlpyramid.h create mode 100644 include/hcurlquadrangle.h create mode 100644 include/hcurltetrahedron.h create mode 100644 include/hcurltriangle.h create mode 100644 include/hierarchical/h1/h1hexahedron.h create mode 100644 include/hierarchical/h1/h1line.h create mode 100644 include/hierarchical/h1/h1point.h create mode 100644 include/hierarchical/h1/h1prism.h create mode 100644 include/hierarchical/h1/h1pyramid.h create mode 100644 include/hierarchical/h1/h1quadrangle.h create mode 100644 include/hierarchical/h1/h1tetrahedron.h create mode 100644 include/hierarchical/h1/h1triangle.h create mode 100644 include/hierarchical/hcurl/hcurlhexahedron.h create mode 100644 include/hierarchical/hcurl/hcurlline.h create mode 100644 include/hierarchical/hcurl/hcurlpoint.h create mode 100644 include/hierarchical/hcurl/hcurlprism.h create mode 100644 include/hierarchical/hcurl/hcurlpyramid.h create mode 100644 include/hierarchical/hcurl/hcurlquadrangle.h create mode 100644 include/hierarchical/hcurl/hcurltetrahedron.h create mode 100644 include/hierarchical/hcurl/hcurltriangle.h rename {src/shapefunction => include}/hierarchical/hierarchicalformfunction.h (100%) mode change 100755 => 100644 rename {src/shapefunction => include}/hierarchical/hierarchicalformfunctioncontainer.h (100%) mode change 100755 => 100644 rename {src/shapefunction => include}/hierarchical/hierarchicalformfunctioniterator.h (100%) mode change 100755 => 100644 rename {src/shapefunction => include}/hierarchical/legendre.h (100%) mode change 100755 => 100644 rename {src/shapefunction => include}/hierarchical/oneconstant.h (100%) mode change 100755 => 100644 rename {src/shapefunction => include}/hierarchical/orientation.h (100%) mode change 100755 => 100644 rename {src/shapefunction => include}/hierarchical/selector.h (100%) mode change 100755 => 100644 create mode 100644 include/hierarchicalformfunction.h create mode 100644 include/hierarchicalformfunctioncontainer.h create mode 100644 include/hierarchicalformfunctioniterator.h rename {src/mesh => include}/htracker.h (100%) mode change 100755 => 100644 rename {src/resolution => include}/impliciteuler.h (100%) rename {src => include}/indexmat.h (100%) mode change 100755 => 100644 create mode 100644 include/integration.h create mode 100644 include/io/gmsh/gmshinterface.h rename {src => include}/io/iodata.h (100%) rename {src => include}/io/iointerface.h (100%) mode change 100755 => 100644 rename {src => include}/io/nastran/nasdataline.h (100%) mode change 100755 => 100644 rename {src => include}/io/nastran/nastraninterface.h (100%) mode change 100755 => 100644 rename {src => include}/io/paraview/pvinterface.h (100%) mode change 100755 => 100644 create mode 100644 include/iodata.h create mode 100644 include/iointerface.h create mode 100644 include/jacobian.h rename {src/shapefunction => include}/lagrange/lagrangeformfunction.h (100%) mode change 100755 => 100644 rename {src/shapefunction => include}/lagrange/lagrangehexahedron.h (100%) mode change 100755 => 100644 rename {src/shapefunction => include}/lagrange/lagrangeline.h (100%) mode change 100755 => 100644 rename {src/shapefunction => include}/lagrange/lagrangepoint.h (100%) mode change 100755 => 100644 rename {src/shapefunction => include}/lagrange/lagrangeprism.h (100%) mode change 100755 => 100644 rename {src/shapefunction => include}/lagrange/lagrangepyramid.h (100%) mode change 100755 => 100644 rename {src/shapefunction => include}/lagrange/lagrangequadrangle.h (100%) mode change 100755 => 100644 rename {src/shapefunction => include}/lagrange/lagrangetetrahedron.h (100%) mode change 100755 => 100644 rename {src/shapefunction => include}/lagrange/lagrangetriangle.h (100%) mode change 100755 => 100644 create mode 100644 include/lagrangeformfunction.h create mode 100644 include/lagrangehexahedron.h create mode 100644 include/lagrangeline.h create mode 100644 include/lagrangepoint.h create mode 100644 include/lagrangeprism.h create mode 100644 include/lagrangepyramid.h create mode 100644 include/lagrangequadrangle.h create mode 100644 include/lagrangetetrahedron.h create mode 100644 include/lagrangetriangle.h create mode 100644 include/legendre.h create mode 100644 include/mat.h rename {src/mesh => include}/mesh.h (100%) mode change 100755 => 100644 create mode 100644 include/mesh/coordinategroup.h create mode 100644 include/mesh/disjointregions.h create mode 100644 include/mesh/disjointregionselector.h create mode 100644 include/mesh/dtracker.h create mode 100644 include/mesh/elements.h create mode 100644 include/mesh/elementselector.h create mode 100644 include/mesh/gentools.h create mode 100644 include/mesh/htracker.h create mode 100644 include/mesh/mesh.h rename {src => include}/mesh/mystring.h (100%) mode change 100755 => 100644 rename {src => include}/mesh/nodes.h (100%) mode change 100755 => 100644 rename {src => include}/mesh/petscmesh.h (100%) mode change 100755 => 100644 rename {src => include}/mesh/physicalregion.h (100%) mode change 100755 => 100644 rename {src => include}/mesh/physicalregions.h (100%) mode change 100755 => 100644 rename {src => include}/mesh/ptracker.h (100%) mode change 100755 => 100644 rename {src => include}/mesh/rawmesh.h (100%) mode change 100755 => 100644 rename {src => include}/mesh/rawspanningtree.h (100%) mode change 100755 => 100644 rename {src => include}/mesh/referencecoordinategroup.h (100%) mode change 100755 => 100644 rename {src => include}/mesh/regiondefiner.h (100%) rename {src => include}/mesh/spanningtree.h (100%) create mode 100644 include/mystring.h create mode 100644 include/nasdataline.h create mode 100644 include/nastran/nasdataline.h create mode 100644 include/nastran/nastraninterface.h create mode 100644 include/nastraninterface.h create mode 100644 include/nodes.h create mode 100644 include/oncontext.h create mode 100644 include/oneconstant.h create mode 100644 include/opabs.h create mode 100644 include/opacos.h create mode 100644 include/opasin.h create mode 100644 include/opatan.h create mode 100644 include/opathp.h create mode 100644 include/opcondition.h create mode 100644 include/opconstant.h create mode 100644 include/opcos.h create mode 100644 include/opcustom.h create mode 100644 include/opdetjac.h create mode 100644 include/opdof.h create mode 100644 include/opdtapprox.h create mode 100644 include/operation.h create mode 100644 include/operation/opabs.h create mode 100644 include/operation/opacos.h create mode 100644 include/operation/opasin.h create mode 100644 include/operation/opatan.h create mode 100644 include/operation/opathp.h create mode 100644 include/operation/opcondition.h create mode 100644 include/operation/opconstant.h create mode 100644 include/operation/opcos.h create mode 100644 include/operation/opcustom.h create mode 100644 include/operation/opdetjac.h create mode 100644 include/operation/opdof.h create mode 100644 include/operation/opdtapprox.h create mode 100644 include/operation/operation.h create mode 100644 include/operation/opestimator.h create mode 100644 include/operation/opfield.h create mode 100644 include/operation/opfieldorder.h create mode 100644 include/operation/opharmonic.h create mode 100644 include/operation/opinversion.h create mode 100644 include/operation/opinvjac.h create mode 100644 include/operation/opjac.h create mode 100644 include/operation/oplog.h create mode 100644 include/operation/opmeshsize.h create mode 100644 include/operation/opmod.h create mode 100644 include/operation/opon.h create mode 100644 include/operation/oporientation.h create mode 100644 include/operation/opparameter.h create mode 100644 include/operation/opport.h create mode 100644 include/operation/oppower.h create mode 100644 include/operation/opproduct.h create mode 100644 include/operation/opsin.h create mode 100644 include/operation/opspline.h create mode 100644 include/operation/opsum.h create mode 100644 include/operation/optan.h create mode 100644 include/operation/optf.h create mode 100644 include/operation/optime.h create mode 100644 include/operation/sl.h create mode 100644 include/opestimator.h create mode 100644 include/opfield.h create mode 100644 include/opfieldorder.h create mode 100644 include/opharmonic.h create mode 100644 include/opinversion.h create mode 100644 include/opinvjac.h create mode 100644 include/opjac.h create mode 100644 include/oplog.h create mode 100644 include/opmeshsize.h create mode 100644 include/opmod.h create mode 100644 include/opon.h create mode 100644 include/oporientation.h create mode 100644 include/opparameter.h create mode 100644 include/opport.h create mode 100644 include/oppower.h create mode 100644 include/opproduct.h create mode 100644 include/opsin.h create mode 100644 include/opspline.h create mode 100644 include/opsum.h create mode 100644 include/optan.h create mode 100644 include/optf.h create mode 100644 include/optime.h create mode 100644 include/orientation.h create mode 100644 include/parameter.h create mode 100644 include/parameterselectedregion.h create mode 100644 include/paraview/pvinterface.h create mode 100644 include/petscmesh.h create mode 100644 include/physicalregion.h create mode 100644 include/physicalregions.h rename {src/shapefunction => include}/polynomial.h (100%) mode change 100755 => 100644 rename {src/shapefunction => include}/polynomials.h (100%) mode change 100755 => 100644 create mode 100644 include/port.h create mode 100644 include/portrelation.h create mode 100644 include/ptracker.h create mode 100644 include/pvinterface.h create mode 100644 include/rawarc.h create mode 100644 include/rawdisk.h create mode 100644 include/rawextrusion.h create mode 100644 include/rawfield.h create mode 100644 include/rawline.h create mode 100644 include/rawmat.h create mode 100644 include/rawmesh.h create mode 100644 include/rawparameter.h create mode 100644 include/rawpoint.h create mode 100644 include/rawport.h create mode 100644 include/rawquadrangle.h create mode 100644 include/rawshape.h create mode 100644 include/rawspanningtree.h create mode 100644 include/rawsurface.h create mode 100644 include/rawtriangle.h create mode 100644 include/rawunion.h create mode 100644 include/rawvec.h create mode 100644 include/rawvolume.h create mode 100644 include/referencecoordinategroup.h create mode 100644 include/regiondefiner.h rename {src/resolution => include}/resolution.h (100%) create mode 100644 include/resolution/eigenvalue.h create mode 100644 include/resolution/genalpha.h create mode 100644 include/resolution/impliciteuler.h create mode 100644 include/resolution/resolution.h create mode 100644 include/selector.h create mode 100644 include/shape.h create mode 100644 include/shapefunction/hierarchical/h1/h1hexahedron.h create mode 100644 include/shapefunction/hierarchical/h1/h1line.h create mode 100644 include/shapefunction/hierarchical/h1/h1point.h create mode 100644 include/shapefunction/hierarchical/h1/h1prism.h create mode 100644 include/shapefunction/hierarchical/h1/h1pyramid.h create mode 100644 include/shapefunction/hierarchical/h1/h1quadrangle.h create mode 100644 include/shapefunction/hierarchical/h1/h1tetrahedron.h create mode 100644 include/shapefunction/hierarchical/h1/h1triangle.h create mode 100644 include/shapefunction/hierarchical/hcurl/hcurlhexahedron.h create mode 100644 include/shapefunction/hierarchical/hcurl/hcurlline.h create mode 100644 include/shapefunction/hierarchical/hcurl/hcurlpoint.h create mode 100644 include/shapefunction/hierarchical/hcurl/hcurlprism.h create mode 100644 include/shapefunction/hierarchical/hcurl/hcurlpyramid.h create mode 100644 include/shapefunction/hierarchical/hcurl/hcurlquadrangle.h create mode 100644 include/shapefunction/hierarchical/hcurl/hcurltetrahedron.h create mode 100644 include/shapefunction/hierarchical/hcurl/hcurltriangle.h create mode 100644 include/shapefunction/hierarchical/hierarchicalformfunction.h create mode 100644 include/shapefunction/hierarchical/hierarchicalformfunctioncontainer.h create mode 100644 include/shapefunction/hierarchical/hierarchicalformfunctioniterator.h create mode 100644 include/shapefunction/hierarchical/legendre.h create mode 100644 include/shapefunction/hierarchical/oneconstant.h create mode 100644 include/shapefunction/hierarchical/orientation.h create mode 100644 include/shapefunction/hierarchical/selector.h create mode 100644 include/shapefunction/lagrange/lagrangeformfunction.h create mode 100644 include/shapefunction/lagrange/lagrangehexahedron.h create mode 100644 include/shapefunction/lagrange/lagrangeline.h create mode 100644 include/shapefunction/lagrange/lagrangepoint.h create mode 100644 include/shapefunction/lagrange/lagrangeprism.h create mode 100644 include/shapefunction/lagrange/lagrangepyramid.h create mode 100644 include/shapefunction/lagrange/lagrangequadrangle.h create mode 100644 include/shapefunction/lagrange/lagrangetetrahedron.h create mode 100644 include/shapefunction/lagrange/lagrangetriangle.h create mode 100644 include/shapefunction/polynomial.h create mode 100644 include/shapefunction/polynomials.h rename {src => include}/shapefunction/spline.h (100%) mode change 100755 => 100644 create mode 100644 include/sl.h rename {src => include}/slmpi.h (100%) mode change 100755 => 100644 create mode 100644 include/spanningtree.h rename {src => include}/sparselizard.h (100%) create mode 100644 include/spline.h rename {src => include}/universe.h (100%) mode change 100755 => 100644 create mode 100644 include/vec.h create mode 100644 include/vectorfieldselect.h rename {src => include}/wallclock.h (100%) mode change 100755 => 100644 mode change 100755 => 100644 sparselizard.pdf diff --git a/.github/workflows/compile.yaml b/.github/workflows/compile.yaml new file mode 100644 index 00000000..95bdb758 --- /dev/null +++ b/.github/workflows/compile.yaml @@ -0,0 +1,49 @@ +name: Sparselizard Compilation + +on: [push] + +jobs: + Compilation-Actions: + runs-on: ubuntu-latest + + env: + CCACHE_COMPRESS: "true" + CCACHE_MAXSIZE: 500M + + steps: + - name: Check out repository code + uses: actions/checkout@v2 + - run: echo "The ${{ github.repository }} repository has been cloned to the runner." + - run: echo "The workflow is now ready to test the code on the runner." + + - name: install ccache + run: sudo apt-get install ccache + + - name: identify machine architecture + run: | + gcc -### -E -march=native - &> machine-type.txt + cat machine-type.txt + + - name: restore cache + uses: actions/cache@v2 + with: + path: ~/.ccache + key: ccache-${{ hashFiles('machine-type.txt') }}-${{ github.sha }} + restore-keys: ccache-${{ hashFiles('machine-type.txt') }}- + + - name: Install mandatory packages + run: sudo apt-get install -y libomp-dev ninja-build cmake libopenblas-dev libmetis-dev libopenmpi-dev libmumps-dev petsc-dev slepc-dev libgmsh-dev + + - name: build + run: | + export PATH="/usr/lib/ccache:$PATH" + mkdir build + cmake -G Ninja -S . -B build + cmake --build build -- -j $(getconf NPROCESSORS_ONLN) + + - name: show ccache stats + run: | + ccache --show-stats + ccache --zero-stats + + - run: echo "🍏 This job's status is ${{ job.status }}." diff --git a/.gitignore b/.gitignore index 2630aa78..4a983022 100644 --- a/.gitignore +++ b/.gitignore @@ -36,3 +36,4 @@ build/ # CCLS cache .ccls-cache/ +machine-type.txt \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index aeeed1d0..f4aced0c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,43 +1,79 @@ # Thanks to S. Matsievskiy for bringing cmake to the project. -cmake_minimum_required(VERSION 3.0 FATAL_ERROR) +cmake_minimum_required(VERSION 3.23 FATAL_ERROR) project(Sparselizard LANGUAGES CXX) set(DEFAULT_BUILD_TYPE "Release") set(CMAKE_BUILD_TYPE "${DEFAULT_BUILD_TYPE}" CACHE STRING "Choose the type of build" FORCE) -set(PETSC_PATH "~/SLlibs/petsc" CACHE STRING "Provide the path to the petsc folder") -set(GMSH_PATH "~/SLlibs/gmsh" CACHE STRING "Provide the path to the gmsh folder") -set(MPI_PATH "" CACHE STRING "Provide the path to the mpi folder") - # Place library in build folder: set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) +SET(CMAKE_CXX_STANDARD 17) +SET(BUILD_MODE Debug) +SET(CMAKE_CXX_FLAGS "-Wall -Wextra -Wpedantic") +SET(CMAKE_CXX_FLAGS_DEBUG "-g -Og") +SET(CMAKE_CXX_FLAGS_RELEASE "-O3") +set(BLA_VENDOR OpenBLAS) -# Default flags: -set(BLAS_FOUND NO) -set(GMSH_FOUND NO) -set(METIS_FOUND NO) -set(MPI_FOUND NO) -set(MUMPS_FOUND NO) -set(PETSC_FOUND NO) -set(SLEPC_FOUND NO) +# Add cmake packages +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") +list(PREPEND CMAKE_PREFIX_PATH /opt/homebrew/opt/openblas) # Installation definitions include(GNUInstallDirs) -# Aux functions -include(cMake/functions.cmake) -include(cMake/SetupBLAS.cmake) -include(cMake/SetupGMSH.cmake) -include(cMake/SetupMETIS.cmake) -include(cMake/SetupMPI.cmake) -include(cMake/SetupMUMPS.cmake) -include(cMake/SetupPETSC.cmake) -include(cMake/SetupSLEPC.cmake) - -# Add libsparselizard target -add_subdirectory(src) - -# Add simulations targets -add_subdirectory(simulations) +# this is not the cmake-official way but it's a lot easier +file(GLOB_RECURSE SRC_FILES "src/*.cpp") +add_library(sparselizard SHARED ${SRC_FILES}) + +target_include_directories(sparselizard PUBLIC include) + +target_compile_options(sparselizard PUBLIC -fPIC -O3) + +find_package(OpenMP REQUIRED) +target_link_libraries(sparselizard PUBLIC OpenMP::OpenMP_CXX) + +find_package(MPI REQUIRED) +target_link_libraries(sparselizard PUBLIC MPI::MPI_CXX) + +find_package(BLAS REQUIRED) +target_link_libraries(sparselizard PUBLIC BLAS::BLAS) + +find_package(PETSC REQUIRED) +target_link_libraries(sparselizard PUBLIC PETSC::PETSC) + +find_package(SLEPC REQUIRED) +target_link_libraries(sparselizard PUBLIC SLEPC::SLEPC) + +find_package(GMSH) + +if(GMSH_FOUND) + target_link_libraries(sparselizard PUBLIC GMSH::GMSH) + target_compile_definitions(sparselizard PRIVATE -DHAVE_GMSH) +endif() + +find_package(METIS) + +if(METIS_FOUND) + target_link_libraries(sparselizard PUBLIC METIS::METIS) + target_compile_definitions(sparselizard PRIVATE -DHAVE_METIS) +endif() + +target_link_libraries(sparselizard PUBLIC cmumps) +target_compile_definitions(sparselizard PRIVATE + -DHAVE_BLAS + -DHAVE_MPI + -DHAVE_MUMPS + -DHAVE_PETSC + -DHAVE_SLEPC +) + +install(TARGETS sparselizard LIBRARY PUBLIC_HEADER) + +set(BUILD_SIMULATIONS YES) + +if(BUILD_SIMULATIONS) + add_subdirectory(simulations) + message(STATUS "Building simulations") +endif() diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..198497a2 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,50 @@ +FROM debian:testing-slim as build + +LABEL maintainer="pascal.thibaudeau@cea.fr" +LABEL version="0.2" +LABEL description="Sparselizard on docker. See https://github.com/pthibaud/dockerlizard" + +# Disable prompt during packages installation +ARG DEBIAN_FRONTEND=noninteractive + +# Update ubuntu software repository +# Install additional repository +RUN apt-get update && \ + apt-get -y upgrade && \ + apt-get -y dist-upgrade && \ + apt-get install -y apt-utils build-essential git cmake clang \ + libopenblas-dev \ + libopenmpi-dev \ + libmumps-dev \ + libmetis-dev \ + petsc-dev \ + slepc-dev \ + libgmsh-dev \ + libomp-dev \ + ninja-build + +# Clean the installation +RUN apt-get clean + + +# Clone git sparselizard repository +# RUN git clone https://github.com/araven/sparselizard.git +WORKDIR /sparselizard +COPY CMakeLists.txt . +COPY src src +COPY cmake cmake +COPY include include +COPY simulations simulations +RUN mkdir build +# Prepare compilation environment +RUN CXX=clang++ cmake -G Ninja -S . -B build +RUN cmake --build build -- -j 8 + +RUN mkdir -p /usr/local +RUN cmake --install build -v --prefix /usr/local + +# Install the library and headers; Put the env variables +# RUN make install +ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib +ENV OMPI_CXX=clang++ + diff --git a/Makefile b/Makefile deleted file mode 100755 index 97bd64c6..00000000 --- a/Makefile +++ /dev/null @@ -1,72 +0,0 @@ -UNAME := $(shell uname) - -ifeq ($(UNAME), Linux) -# With or without the GMSH API: -ifneq ("$(wildcard ~/SLlibs/gmsh)","") - LIBS = -L ~/SLlibs/gmsh/lib -l gmsh -L ~/SLlibs/petsc/arch-linux-c-opt/lib -l openblas -l petsc -l slepc -D HAVE_GMSH - INCL = -I ~/SLlibs/gmsh/include -I ~/SLlibs/petsc/include/petsc/mpiuni -I ~/SLlibs/petsc/arch-linux-c-opt/externalpackages/git.openblas -I ~/SLlibs/petsc/include/ -I ~/SLlibs/petsc/arch-linux-c-opt/include/ -else - LIBS = -L ~/SLlibs/petsc/arch-linux-c-opt/lib -l openblas -l petsc -l slepc - INCL = -I ~/SLlibs/petsc/include/petsc/mpiuni -I ~/SLlibs/petsc/arch-linux-c-opt/externalpackages/git.openblas -I ~/SLlibs/petsc/include/ -I ~/SLlibs/petsc/arch-linux-c-opt/include/ -endif -endif -ifeq ($(UNAME), Darwin) -LIBS = -L ~/SLlibs/petsc/arch-darwin-c-opt/lib -l openblas -l petsc -l slepc -INCL = -I ~/SLlibs/petsc/include/petsc/mpiuni -I ~/SLlibs/petsc/arch-darwin-c-opt/externalpackages/git.openblas -I ~/SLlibs/petsc/include/ -I ~/SLlibs/petsc/arch-darwin-c-opt/include/ -endif - - -# $@ is the filename representing the target. -# $< is the filename of the first prerequisite. -# $^ the filenames of all the prerequisites. -# $(@D) is the file path of the target file. -# D can be added to all of the above. - -CXX = g++ -fopenmp -fPIC -no-pie # openmp is used for parallel sorting on Linux -CXX_FLAGS= -std=c++11 -O3 - -# List of all directories containing the headers: -INCLUDES = -I src -I src/field -I src/expression -I src/expression/operation -I src/shapefunction -I src/formulation -I src/shapefunction/hierarchical -I src/shapefunction/hierarchical/h1 -I src/shapefunction/hierarchical/hcurl -I src/gausspoint -I src/shapefunction/lagrange -I src/mesh -I src/io -I src/io/gmsh -I src/io/paraview -I src/io/nastran -I src/resolution -I src/geometry - -# List of all .cpp source files: -CPPS= $(wildcard src/*.cpp) $(wildcard src/field/*.cpp) $(wildcard src/expression/*.cpp) $(wildcard src/expression/operation/*.cpp) $(wildcard src/shapefunction/*.cpp) $(wildcard src/formulation/*.cpp) $(wildcard src/shapefunction/hierarchical/*.cpp) $(wildcard src/shapefunction/hierarchical/h1/*.cpp) $(wildcard src/shapefunction/hierarchical/hcurl/*.cpp) $(wildcard src/gausspoint/*.cpp) $(wildcard src/shapefunction/lagrange/*.cpp) $(wildcard src/mesh/*.cpp) $(wildcard src/io/*.cpp) $(wildcard src/io/gmsh/*.cpp) $(wildcard src/io/paraview/*.cpp) $(wildcard src/io/nastran/*.cpp) $(wildcard src/resolution/*.cpp) $(wildcard src/geometry/*.cpp) - -# Final binary name: -BIN = sparselizard -# Put all generated stuff to this build directory: -BUILD_DIR = ./build - - -# Same list as CPP but with the .o object extension: -OBJECTS=$(CPPS:%.cpp=$(BUILD_DIR)/%.o) -# Gcc/Clang will create these .d files containing dependencies. -DEP = $(OBJECTS:%.o=%.d) - -all: $(OBJECTS) libsparselizard.so - @# The main is always recompiled (it could have been replaced): - @$(CXX) $(CXX_FLAGS) $(LIBS) $(INCL) $(INCLUDES) -c main.cpp -o $(BUILD_DIR)/main.o - @echo "Linking." - @$(CXX) $(BUILD_DIR)/main.o $(OBJECTS) $(LIBS) -o $(BIN) - @echo "Done." - -# Include all .d files --include $(DEP) - -$(BUILD_DIR)/%.o: %.cpp - @echo "Compiling" $< - @# Create the folder of the current target in the build directory: - @mkdir -p $(@D) - @# Compile .cpp file. MMD creates the dependencies. - @$(CXX) $(CXX_FLAGS) $(LIBS) $(INCL) $(INCLUDES) -MMD -c $< -o $@ - - -clean : - # Removes all files created. - rm -rf $(BUILD_DIR) - rm -f $(BIN) - rm -f libsparselizard.so - -LDFLAGS= -shared -libsparselizard.so : $(OBJECTS) - @echo "Creating shared library." - @$(CXX) $(CXX_FLAGS) $(OBJECTS) -o $@ $(LDFLAGS) diff --git a/README.md b/README.md index c82b6b61..5b8cf798 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,25 @@ # Build instructions -Run the scripts in the 'install_external_libs' folder then configure and build: +Sparselizard depends on mandatory and optional external libraries. + +On debian Linux, run +```sudo apt-get install -y libopenblas-dev libmetis-dev libopenmpi-dev libmumps-dev petsc-dev slepc-dev libgmsh-dev cmake ninja-build``` +or +run the scripts in the 'install_external_libs' folder to download and install these libraries locally. + +Then: ```bash -mkdir build && cd build -cmake .. -cmake --build . -j$(nproc) +CXX=clang++ cmake -G Ninja -S . -B build +cmake --build build -- -j 0 +mkdir -p /some/where/to/install +cmake --install build -v --prefix /some/where/to/install ``` --- Provide a custom path to the petsc, gmsh (optional) or mpi (optional) folder with: ```bash -cmake .. -DPETSC_PATH=/yourpath/petsc -DGMSH_PATH=/yourpath/gmsh -DMPI_PATH=/yourpath/mpi +cmake -B build . -DCMAKE_PREFIX_PATH="/custom/libs/and/headers" ``` It may be convenient to use the cmake GUI: diff --git a/cMake/SetupBLAS.cmake b/cMake/SetupBLAS.cmake deleted file mode 100644 index 39fa672e..00000000 --- a/cMake/SetupBLAS.cmake +++ /dev/null @@ -1,47 +0,0 @@ -function(ConfigureBLAS TARGET) - - -# Find blas headers: -FIND_PATH(BLAS_INCLUDE_PATH - NAMES cblas.h - PATHS - "${PETSC_PATH}/arch-linux-c-opt/include" - "${PETSC_PATH}/arch-linux2-c-opt/include" - "${PETSC_PATH}/arch-darwin-c-opt/include" - NO_DEFAULT_PATH - ) - -if(BLAS_INCLUDE_PATH) - message(STATUS "Blas header cblas.h found at " ${BLAS_INCLUDE_PATH}) -else() - message(STATUS "BLAS HEADER CBLAS.H NOT FOUND") -endif() - - -# Find blas library: -FIND_LIBRARY(BLAS_LIBRARIES - NAMES openblas - PATHS - "${PETSC_PATH}/arch-linux-c-opt/lib" - "${PETSC_PATH}/arch-linux2-c-opt/lib" - "${PETSC_PATH}/arch-darwin-c-opt/lib" - NO_DEFAULT_PATH - ) - -if(BLAS_LIBRARIES) - message(STATUS "Blas library found at " ${BLAS_LIBRARIES}) -else() - message(STATUS "BLAS LIBRARY NOT FOUND") -endif() - - -if(BLAS_INCLUDE_PATH AND BLAS_LIBRARIES) - SET(BLAS_FOUND YES PARENT_SCOPE) - - TARGET_INCLUDE_DIRECTORIES(${TARGET} PUBLIC ${BLAS_INCLUDE_PATH}) - TARGET_LINK_LIBRARIES(${TARGET} PUBLIC ${BLAS_LIBRARIES}) -endif() - - -endfunction(ConfigureBLAS) - diff --git a/cMake/SetupGMSH.cmake b/cMake/SetupGMSH.cmake deleted file mode 100644 index d3b0ba3b..00000000 --- a/cMake/SetupGMSH.cmake +++ /dev/null @@ -1,43 +0,0 @@ -function(ConfigureGMSH TARGET) - - -# Find gmsh headers: -FIND_PATH(GMSH_INCLUDE_PATH - NAMES gmsh.h - PATHS - "${GMSH_PATH}/include" - NO_DEFAULT_PATH - ) - -if(GMSH_INCLUDE_PATH) - message(STATUS "Gmsh headers found at " ${GMSH_INCLUDE_PATH}) -else() - message(STATUS "GMSH HEADERS NOT FOUND (OPTIONAL)") -endif() - - -# Find gmsh library: -FIND_LIBRARY(GMSH_LIBRARIES - NAMES gmsh - PATHS - "${GMSH_PATH}/lib" - NO_DEFAULT_PATH - ) - -if(GMSH_LIBRARIES) - message(STATUS "Gmsh library found at " ${GMSH_LIBRARIES}) -else() - message(STATUS "GMSH LIBRARY NOT FOUND (OPTIONAL)") -endif() - - -if(GMSH_INCLUDE_PATH AND GMSH_LIBRARIES) - SET(GMSH_FOUND YES PARENT_SCOPE) - - TARGET_INCLUDE_DIRECTORIES(${TARGET} PUBLIC ${GMSH_INCLUDE_PATH}) - TARGET_LINK_LIBRARIES(${TARGET} PUBLIC ${GMSH_LIBRARIES}) -endif() - - -endfunction(ConfigureGMSH) - diff --git a/cMake/SetupMETIS.cmake b/cMake/SetupMETIS.cmake deleted file mode 100644 index c1ff084b..00000000 --- a/cMake/SetupMETIS.cmake +++ /dev/null @@ -1,47 +0,0 @@ -function(ConfigureMETIS TARGET) - - -# Find metis headers: -FIND_PATH(METIS_INCLUDE_PATH - NAMES metis.h - PATHS - "${PETSC_PATH}/arch-linux-c-opt/include" - "${PETSC_PATH}/arch-linux2-c-opt/include" - "${PETSC_PATH}/arch-darwin-c-opt/include" - NO_DEFAULT_PATH - ) - -if(METIS_INCLUDE_PATH) - message(STATUS "Metis headers found at " ${METIS_INCLUDE_PATH}) -else() - message(STATUS "METIS HEADERS NOT FOUND") -endif() - - -# Find metis library: -FIND_LIBRARY(METIS_LIBRARIES - NAMES metis - PATHS - "${PETSC_PATH}/arch-linux-c-opt/lib" - "${PETSC_PATH}/arch-linux2-c-opt/lib" - "${PETSC_PATH}/arch-darwin-c-opt/lib" - NO_DEFAULT_PATH - ) - -if(METIS_LIBRARIES) - message(STATUS "Metis library found at " ${METIS_LIBRARIES}) -else() - message(STATUS "METIS LIBRARY NOT FOUND") -endif() - - -if(METIS_INCLUDE_PATH AND METIS_LIBRARIES) - SET(METIS_FOUND YES PARENT_SCOPE) - - TARGET_INCLUDE_DIRECTORIES(${TARGET} PUBLIC ${METIS_INCLUDE_PATH}) - TARGET_LINK_LIBRARIES(${TARGET} PUBLIC ${METIS_LIBRARIES}) -endif() - - -endfunction(ConfigureMETIS) - diff --git a/cMake/SetupMPI.cmake b/cMake/SetupMPI.cmake deleted file mode 100644 index f3fad061..00000000 --- a/cMake/SetupMPI.cmake +++ /dev/null @@ -1,49 +0,0 @@ -# Run the default example with MPICH using: -# -# module avail mpi -# module load mpi/mpich-x86_64 -# mpirun -n 4 ./default - -function(ConfigureMPI TARGET) - - -# Find mpi headers: -FIND_PATH(MPI_INCLUDE_PATH - NAMES mpi.h - PATHS - "${MPI_PATH}/include" - NO_DEFAULT_PATH - ) - -if(MPI_INCLUDE_PATH) - message(STATUS "MPI headers found at " ${MPI_INCLUDE_PATH}) -else() - message(STATUS "MPI HEADERS NOT FOUND (OPTIONAL)") -endif() - - -# Find mpi library: -FIND_LIBRARY(MPI_LIBRARIES - NAMES mpi - PATHS - "${MPI_PATH}/lib" - NO_DEFAULT_PATH - ) - -if(MPI_LIBRARIES) - message(STATUS "MPI library found at " ${MPI_LIBRARIES}) -else() - message(STATUS "MPI LIBRARY NOT FOUND (OPTIONAL)") -endif() - - -if(MPI_INCLUDE_PATH AND MPI_LIBRARIES) - SET(MPI_FOUND YES PARENT_SCOPE) - - TARGET_INCLUDE_DIRECTORIES(${TARGET} PUBLIC ${MPI_INCLUDE_PATH}) - TARGET_LINK_LIBRARIES(${TARGET} PUBLIC ${MPI_LIBRARIES}) -endif() - - -endfunction(ConfigureMPI) - diff --git a/cMake/SetupMUMPS.cmake b/cMake/SetupMUMPS.cmake deleted file mode 100644 index ee442e39..00000000 --- a/cMake/SetupMUMPS.cmake +++ /dev/null @@ -1,47 +0,0 @@ -function(ConfigureMUMPS TARGET) - - -# Find mumps headers: -FIND_PATH(MUMPS_INCLUDE_PATH - NAMES cmumps_c.h - PATHS - "${PETSC_PATH}/arch-linux-c-opt/include" - "${PETSC_PATH}/arch-linux2-c-opt/include" - "${PETSC_PATH}/arch-darwin-c-opt/include" - NO_DEFAULT_PATH - ) - -if(MUMPS_INCLUDE_PATH) - message(STATUS "Mumps headers found at " ${MUMPS_INCLUDE_PATH}) -else() - message(STATUS "MUMPS HEADERS NOT FOUND") -endif() - - -# Find mumps library: -FIND_LIBRARY(MUMPS_LIBRARIES - NAMES cmumps - PATHS - "${PETSC_PATH}/arch-linux-c-opt/lib" - "${PETSC_PATH}/arch-linux2-c-opt/lib" - "${PETSC_PATH}/arch-darwin-c-opt/lib" - NO_DEFAULT_PATH - ) - -if(MUMPS_LIBRARIES) - message(STATUS "Mumps library found at " ${MUMPS_LIBRARIES}) -else() - message(STATUS "MUMPS LIBRARY NOT FOUND") -endif() - - -if(MUMPS_INCLUDE_PATH AND MUMPS_LIBRARIES) - SET(MUMPS_FOUND YES PARENT_SCOPE) - - TARGET_INCLUDE_DIRECTORIES(${TARGET} PUBLIC ${MUMPS_INCLUDE_PATH}) - TARGET_LINK_LIBRARIES(${TARGET} PUBLIC ${MUMPS_LIBRARIES}) -endif() - - -endfunction(ConfigureMUMPS) - diff --git a/cMake/SetupPETSC.cmake b/cMake/SetupPETSC.cmake deleted file mode 100644 index 24bd6081..00000000 --- a/cMake/SetupPETSC.cmake +++ /dev/null @@ -1,60 +0,0 @@ -function(ConfigurePETSC TARGET) - - -# Find petsc headers: -FIND_PATH(PETSC_INCLUDE_PATH - NAMES petsc.h - PATHS - "${PETSC_PATH}/include" - NO_DEFAULT_PATH - ) - -if(PETSC_INCLUDE_PATH) - message(STATUS "Petsc header petsc.h found at " ${PETSC_INCLUDE_PATH}) -else() - message(STATUS "PETSC HEADER PETSC.H NOT FOUND") -endif() - -FIND_PATH(PETSCCONF_INCLUDE_PATH - NAMES petscconf.h - PATHS - "${PETSC_PATH}/arch-linux-c-opt/include" - "${PETSC_PATH}/arch-linux2-c-opt/include" - "${PETSC_PATH}/arch-darwin-c-opt/include" - NO_DEFAULT_PATH - ) - -if(PETSCCONF_INCLUDE_PATH) - message(STATUS "Petsc header petscconf.h found at " ${PETSCCONF_INCLUDE_PATH}) -else() - message(STATUS "PETSC HEADER PETSCCONF.H NOT FOUND") -endif() - - -# Find petsc library: -FIND_LIBRARY(PETSC_LIBRARIES - NAMES petsc - PATHS - "${PETSC_PATH}/arch-linux-c-opt/lib" - "${PETSC_PATH}/arch-linux2-c-opt/lib" - "${PETSC_PATH}/arch-darwin-c-opt/lib" - NO_DEFAULT_PATH - ) - -if(PETSC_LIBRARIES) - message(STATUS "Petsc library found at " ${PETSC_LIBRARIES}) -else() - message(STATUS "PETSC LIBRARY NOT FOUND") -endif() - - -if(PETSC_INCLUDE_PATH AND PETSCCONF_INCLUDE_PATH AND PETSC_LIBRARIES) - SET(PETSC_FOUND YES PARENT_SCOPE) - - TARGET_INCLUDE_DIRECTORIES(${TARGET} PUBLIC ${PETSC_INCLUDE_PATH} ${PETSCCONF_INCLUDE_PATH}) - TARGET_LINK_LIBRARIES(${TARGET} PUBLIC ${PETSC_LIBRARIES}) -endif() - - -endfunction(ConfigurePETSC) - diff --git a/cMake/SetupSLEPC.cmake b/cMake/SetupSLEPC.cmake deleted file mode 100644 index e57dbff8..00000000 --- a/cMake/SetupSLEPC.cmake +++ /dev/null @@ -1,47 +0,0 @@ -function(ConfigureSLEPC TARGET) - - -# Find slepc headers: -FIND_PATH(SLEPC_INCLUDE_PATH - NAMES slepc.h - PATHS - "${PETSC_PATH}/arch-linux-c-opt/include" - "${PETSC_PATH}/arch-linux2-c-opt/include" - "${PETSC_PATH}/arch-darwin-c-opt/include" - NO_DEFAULT_PATH - ) - -if(SLEPC_INCLUDE_PATH) - message(STATUS "Slepc headers found at " ${SLEPC_INCLUDE_PATH}) -else() - message(STATUS "SLEPC HEADERS NOT FOUND") -endif() - - -# Find slepc library: -FIND_LIBRARY(SLEPC_LIBRARIES - NAMES slepc - PATHS - "${PETSC_PATH}/arch-linux-c-opt/lib" - "${PETSC_PATH}/arch-linux2-c-opt/lib" - "${PETSC_PATH}/arch-darwin-c-opt/lib" - NO_DEFAULT_PATH - ) - -if(SLEPC_LIBRARIES) - message(STATUS "Slepc library found at " ${SLEPC_LIBRARIES}) -else() - message(STATUS "SLEPC LIBRARY NOT FOUND") -endif() - - -if(SLEPC_INCLUDE_PATH AND SLEPC_LIBRARIES) - SET(SLEPC_FOUND YES PARENT_SCOPE) - - TARGET_INCLUDE_DIRECTORIES(${TARGET} PUBLIC ${SLEPC_INCLUDE_PATH}) - TARGET_LINK_LIBRARIES(${TARGET} PUBLIC ${SLEPC_LIBRARIES}) -endif() - - -endfunction(ConfigureSLEPC) - diff --git a/cMake/functions.cmake b/cMake/functions.cmake deleted file mode 100644 index cbb7657f..00000000 --- a/cMake/functions.cmake +++ /dev/null @@ -1,45 +0,0 @@ -# Add library for dirs -function(custom_add_library_from_dir TARGET DIRLIST) - foreach(d IN LISTS DIRLIST) - file(GLOB SRC "${d}/*.cpp" "${d}/*.h" "${d}/*.hpp") - list(APPEND TARGET_SRC ${SRC}) - endforeach() - add_library(${TARGET} SHARED ${TARGET_SRC}) -endfunction(custom_add_library_from_dir) - -# Add executable for dirs -function(custom_add_executable_from_dir TARGET DIRLIST) - foreach(d IN LISTS DIRLIST) - file(GLOB SRC "${d}/*.cpp" "${d}/*.h" "${d}/*.hpp") - list(APPEND TARGET_SRC ${SRC}) - endforeach() - add_executable(${TARGET} ${TARGET_SRC}) -endfunction(custom_add_executable_from_dir) - -function(custom_copy_file TARGET FROMDIRS TODIR GLOBS) - foreach(d IN LISTS FROMDIRS) - foreach(g IN LISTS GLOBS) - file(GLOB SRC "${d}/${g}") - foreach(f IN LISTS SRC) - string(REGEX REPLACE "^.*/" "" DEST ${f}) - configure_file(${f} ${TODIR}/${DEST} COPYONLY) - endforeach() - endforeach() - endforeach() -endfunction(custom_copy_file) - -function(custom_symlink_file TARGET FROMDIRS TODIR GLOBS) - foreach(d IN LISTS FROMDIRS) - foreach(g IN LISTS GLOBS) - file(GLOB SRC "${d}/${g}") - foreach(f IN LISTS SRC) - get_filename_component(filename ${f} NAME) - if(NOT ${filename} STREQUAL "CMakeLists.txt") - string(REGEX REPLACE "^.*/" "" DEST ${f}) - file(CREATE_LINK ${f} ${TODIR}/${DEST} SYMBOLIC) - endif() - endforeach() - endforeach() - endforeach() -endfunction(custom_symlink_file) - diff --git a/cmake/FindGMSH.cmake b/cmake/FindGMSH.cmake new file mode 100644 index 00000000..1ad4e727 --- /dev/null +++ b/cmake/FindGMSH.cmake @@ -0,0 +1,17 @@ +include(FindPackageHandleStandardArgs) + +find_library(GMSH_LIBRARY NAMES gmsh) +find_path(GMSH_INCLUDE_DIR NAMES gmsh.h) + +find_package_handle_standard_args(GMSH DEFAULT_MSG GMSH_LIBRARY GMSH_INCLUDE_DIR) + +if(GMSH_FOUND) + mark_as_advanced(GMSH_INCLUDE_DIR) + mark_as_advanced(GMSH_LIBRARY) +endif() + +IF(GMSH_FOUND AND NOT TARGET GMSH::GMSH) + add_library(GMSH::GMSH IMPORTED SHARED) + set_property(TARGET GMSH::GMSH PROPERTY IMPORTED_LOCATION ${GMSH_LIBRARY}) + target_include_directories(GMSH::GMSH INTERFACE ${GMSH_INCLUDE_DIR}) +endif() diff --git a/cmake/FindMETIS.cmake b/cmake/FindMETIS.cmake new file mode 100644 index 00000000..9354fa8f --- /dev/null +++ b/cmake/FindMETIS.cmake @@ -0,0 +1,17 @@ +include(FindPackageHandleStandardArgs) + +find_library(METIS_LIBRARY NAMES metis) +find_path(METIS_INCLUDE_DIR NAMES metis.h) + +find_package_handle_standard_args(METIS DEFAULT_MSG METIS_LIBRARY METIS_INCLUDE_DIR) + +if(METIS_FOUND) + mark_as_advanced(METIS_INCLUDE_DIR) + mark_as_advanced(METIS_LIBRARY) +endif() + +IF(METIS_FOUND AND NOT TARGET METIS::METIS) + add_library(METIS::METIS IMPORTED SHARED) + set_property(TARGET METIS::METIS PROPERTY IMPORTED_LOCATION ${METIS_LIBRARY}) + target_include_directories(METIS::METIS INTERFACE ${METIS_INCLUDE_DIR}) +endif() diff --git a/cmake/FindPETSC.cmake b/cmake/FindPETSC.cmake new file mode 100644 index 00000000..e8785af1 --- /dev/null +++ b/cmake/FindPETSC.cmake @@ -0,0 +1,17 @@ +include(FindPackageHandleStandardArgs) + +find_library(PETSC_LIBRARY NAMES petsc petsc_real) +find_path(PETSC_INCLUDE_DIR NAMES petsc.h) + +find_package_handle_standard_args(PETSC DEFAULT_MSG PETSC_LIBRARY PETSC_INCLUDE_DIR) + +if(PETSC_FOUND) + mark_as_advanced(PETSC_INCLUDE_DIR) + mark_as_advanced(PETSC_LIBRARY) +endif() + +IF(PETSC_FOUND AND NOT TARGET PETSC::PETSC) + add_library(PETSC::PETSC IMPORTED SHARED) + set_property(TARGET PETSC::PETSC PROPERTY IMPORTED_LOCATION ${PETSC_LIBRARY}) + target_include_directories(PETSC::PETSC INTERFACE ${PETSC_INCLUDE_DIR}/petsc) +endif() diff --git a/cmake/FindSLEPC.cmake b/cmake/FindSLEPC.cmake new file mode 100644 index 00000000..0c73c7ca --- /dev/null +++ b/cmake/FindSLEPC.cmake @@ -0,0 +1,24 @@ +include(FindPackageHandleStandardArgs) + +find_library(SLEPC_LIBRARY NAMES slepc slepc_real) +find_path(SLEPC_INCLUDE_DIR NAMES slepcsys.h HINTS +/opt/homebrew/include/slepc/finclude +/opt/homebrew/include/slepc/private +/usr/include/slepc) + +find_path(SLEPC_INCLUDE_DIR_PRIVATE NAMES slepcversion.h HINTS +/opt/homebrew/include/slepc/private) + + +find_package_handle_standard_args(SLEPC DEFAULT_MSG SLEPC_LIBRARY SLEPC_INCLUDE_DIR SLEPC_INCLUDE_DIR_PRIVATE) + +if(SLEPC_FOUND) + mark_as_advanced(SLEPC_INCLUDE_DIR) + mark_as_advanced(SLEPC_LIBRARY) +endif() + +IF(SLEPC_FOUND AND NOT TARGET SLEPC::SLEPC) + add_library(SLEPC::SLEPC IMPORTED SHARED) + set_property(TARGET SLEPC::SLEPC PROPERTY IMPORTED_LOCATION ${SLEPC_LIBRARY}) + target_include_directories(SLEPC::SLEPC INTERFACE ${SLEPC_INCLUDE_DIR}) +endif() diff --git a/src/field/coefmanager.h b/include/coefmanager.h old mode 100755 new mode 100644 similarity index 100% rename from src/field/coefmanager.h rename to include/coefmanager.h diff --git a/src/formulation/contribution.h b/include/contribution.h old mode 100755 new mode 100644 similarity index 100% rename from src/formulation/contribution.h rename to include/contribution.h diff --git a/src/mesh/coordinategroup.h b/include/coordinategroup.h old mode 100755 new mode 100644 similarity index 100% rename from src/mesh/coordinategroup.h rename to include/coordinategroup.h diff --git a/src/densemat.h b/include/densemat.h old mode 100755 new mode 100644 similarity index 100% rename from src/densemat.h rename to include/densemat.h diff --git a/src/mesh/disjointregions.h b/include/disjointregions.h old mode 100755 new mode 100644 similarity index 100% rename from src/mesh/disjointregions.h rename to include/disjointregions.h diff --git a/src/mesh/disjointregionselector.h b/include/disjointregionselector.h old mode 100755 new mode 100644 similarity index 100% rename from src/mesh/disjointregionselector.h rename to include/disjointregionselector.h diff --git a/src/formulation/dofinterpolate.h b/include/dofinterpolate.h old mode 100755 new mode 100644 similarity index 100% rename from src/formulation/dofinterpolate.h rename to include/dofinterpolate.h diff --git a/src/formulation/dofmanager.h b/include/dofmanager.h old mode 100755 new mode 100644 similarity index 100% rename from src/formulation/dofmanager.h rename to include/dofmanager.h diff --git a/src/mesh/dtracker.h b/include/dtracker.h old mode 100755 new mode 100644 similarity index 100% rename from src/mesh/dtracker.h rename to include/dtracker.h diff --git a/src/resolution/eigenvalue.h b/include/eigenvalue.h similarity index 100% rename from src/resolution/eigenvalue.h rename to include/eigenvalue.h diff --git a/src/element.h b/include/element.h old mode 100755 new mode 100644 similarity index 100% rename from src/element.h rename to include/element.h diff --git a/src/mesh/elements.h b/include/elements.h old mode 100755 new mode 100644 similarity index 100% rename from src/mesh/elements.h rename to include/elements.h diff --git a/src/mesh/elementselector.h b/include/elementselector.h old mode 100755 new mode 100644 similarity index 100% rename from src/mesh/elementselector.h rename to include/elementselector.h diff --git a/src/expression/expression.h b/include/expression.h old mode 100755 new mode 100644 similarity index 100% rename from src/expression/expression.h rename to include/expression.h diff --git a/include/expression/expression.h b/include/expression/expression.h new file mode 100644 index 00000000..822f1f6f --- /dev/null +++ b/include/expression/expression.h @@ -0,0 +1,306 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef EXPRESSION_H +#define EXPRESSION_H + +#include +#include +#include +#include "universe.h" +#include "operation.h" +#include "field.h" +#include "disjointregions.h" +#include "physicalregions.h" +#include "physicalregion.h" +#include "elementselector.h" +#include "disjointregionselector.h" +#include +#include "gausspoints.h" +#include "jacobian.h" +#include +#include "parameter.h" +#include "polynomial.h" +#include "fourier.h" +#include +#include "rawfield.h" +#include "mystring.h" +#include "wallclock.h" +#include "shape.h" +#include "gentools.h" +#include "iointerface.h" +#include "spline.h" +#include "referencecoordinategroup.h" +#include "port.h" + + +class vec; +class operation; +class parameter; +class field; +class port; +class shape; + +class expression +{ + friend class opon; + + private: + + int mynumrows = 0; + int mynumcols = 0; + + // myoperations[i*mynumcols+j] gives the + // expression operation defined at row i, column j. + std::vector> myoperations = {}; + + std::vector> inrefcoord = {}; + + + // FUNCTIONS TO BE CALLED BY THE PUBLIC FUNCTIONS: + + std::vector max(int physreg, expression* meshdeform, int refinement, std::vector xyzrange); + void interpolate(int physreg, expression* meshdeform, std::vector& xyzcoord, std::vector& interpolated, std::vector& isfound); + void interpolate(int physreg, expression* meshdeform, std::vector& xyzcoord, std::vector>& interpolated, std::vector& isfound, int numtimeevals); + double integrate(int physreg, expression* meshdeform, int integrationorder); + void write(int physreg, int numfftharms, expression* meshdeform, std::string filename, int lagrangeorder, int numtimesteps); + + public: + + expression(void) {}; + // Implicit conversion from field, double and parameter to expression: + expression(field); + expression(double); + expression(parameter); + expression(port); + expression(int numrows, int numcols, std::vector); + // Concatenate expressions to create a new one: + expression(const std::vector> input); + // Expression whose value depends on if the first argument is greater or equal to zero. + // If true the expression value is the expression as second argument, if false it is the + // expression provided as third argument. + expression(expression condexpr, expression exprtrue, expression exprfalse); + // Expression based on a spline interpolation of a discrete function of argument 'arg': + expression(spline spl, expression arg); + // Piecewise expression definition: + expression(std::vector pos, std::vector exprs, expression tocompare); + // Custom expression based on a user-defined function: + expression(int m, int n, std::vector customfct(std::vector), std::vector exprs); + // Advanced custom function: + expression(int m, int n, std::vector advancedcustomfct(std::vector, std::vector, elementselector&, std::vector&, expression*), std::vector exprs, std::vector infields); + + // Define a 1x1 expression from an operation: + expression(std::shared_ptr); + + int countrows(void) { return mynumrows; }; + int countcolumns(void) { return mynumcols; }; + + // Get a given row/column in a matrix expression: + expression getrow(int rownum); + expression getcolumn(int colnum); + + void reorderrows(std::vector neworder); + void reordercolumns(std::vector neworder); + + // Get the max/min value. All elements will be split 'refinement' times in each direction + // to approximate the max/min value and position. Increase 'refinement' for more accuracy. + // Set {xrangemin, xrangemax, yrangemin, yrangemax, zrangemin, zrangemax} to get the + // max/min in a x, y and z bounded domain (optional). + // The output is {maxvalue, maxxcoord, maxycoord, maxzcoord}. + std::vector max(int physreg, int refinement, std::vector xyzrange = {}); + std::vector max(int physreg, expression meshdeform, int refinement, std::vector xyzrange = {}); + std::vector min(int physreg, int refinement, std::vector xyzrange = {}); + std::vector min(int physreg, expression meshdeform, int refinement, std::vector xyzrange = {}); + + // Interpolate the expression at N (x,y,z) coordinates (provided in 'xyzcoord' in format + // {x1,y1,z1, x2,y2,z2,...}). After the call the interpolated values of the expression + // are in 'interpolated' (non-scalar expressions are flattened and their interpolated + // values concatenated one after the other). + // Only the highest dimension elements in physical region 'physreg' are considered. + // In case the ith coordinate is not in the physical region or there was any other + // issue then 'isfound[i]' is false. + void interpolate(int physreg, std::vector& xyzcoord, std::vector& interpolated, std::vector& isfound); + void interpolate(int physreg, expression meshdeform, std::vector& xyzcoord, std::vector& interpolated, std::vector& isfound); + // These two functions are added for convenience and work only to interpolate at a single (x,y,z) coordinate. + // In case the coordinate is not in the physical region or there was any other issue the returned vector is empty. + std::vector interpolate(int physreg, const std::vector xyzcoord); + std::vector interpolate(int physreg, expression meshdeform, const std::vector xyzcoord); + + double integrate(int physreg, int integrationorder); + double integrate(int physreg, expression meshdeform, int integrationorder); + + // Compute an FFT transform of the expression and save all the 'numfftharms' harmonics: + void write(int physreg, int numfftharms, std::string filename, int lagrangeorder); + void write(int physreg, int numfftharms, expression meshdeform, std::string filename, int lagrangeorder); + // Save at 'numtimesteps' timesteps. Set -1 to save the harmonics for linear expressions. + void write(int physreg, std::string filename, int lagrangeorder, int numtimesteps = -1); + void write(int physreg, expression meshdeform, std::string filename, int lagrangeorder, int numtimesteps = -1); + + // Save to disk the part of the stream lines that lie on physical region 'physreg'. + // The stream lines are grown (upstream and downstream) starting from 'startcoords'. + // 'stepsize' is related to the distance between stream direction updates (decrease for more accuracy). + void streamline(int physreg, std::string filename, const std::vector& startcoords, double stepsize, bool downstreamonly = false); + + // Set a flag on this expression so that when an expression + // 'expr' including at least once this expression is + // interpolated this expression is only computed once + // and then reused for all other occurences in 'expr'. + void reuseit(bool istobereused = true); + + bool isscalar(void) { return (mynumrows == 1 && mynumcols == 1); }; + bool isharmonicone(std::vector disjregs); + bool isvalueorientationdependent(std::vector disjregs); + bool iszero(void); + + // Output a vector based on field 'onefield' that stores the barycenter values of the expression. + vec atbarycenter(int physreg, field onefield); + + // Print the expression: + void print(void); + + // Read the function documentation before using it! + void rotate(double ax, double ay, double az, std::string leftop = "default", std::string rightop = "default"); + + expression at(int row, int col); + + // Evaluate a space-independent scalar expression: + double evaluate(void); + // Same but allow x, y and/or z fields without derivatives: + std::vector evaluate(std::vector& xcoords, std::vector& ycoords, std::vector& zcoords); + + // Output the resized expression (filled with zero if larger): + expression resize(int numrows, int numcols); + + + + // THE FUNCTIONS BELOW ARE NOT MEANT TO BE CALLED BY THE USER! + + // 'whichderivative' is 1 for x, 2 for y and 3 for z. + expression spacederivative(int whichderivative); + // Now the derivative in the reference element. + // 'whichderivative' is 1 for ki, 2 for eta and 3 for phi. + expression kietaphiderivative(int whichderivative); + expression timederivative(int derivativeorder); + + std::vector> getinrefcoord(void); + + expression transpose(void); + // Get the submatrix obtained by removing a row and a column: + expression removerowandcol(int rowtoremove, int coltoremove); + expression determinant(void); + expression cofactormatrix(void); + expression invert(void); + + expression pow(expression); + // In dof() and tf() '-1' selects no physical region: + expression dof(int physreg); + expression tf(int physreg); + expression sin(void); + expression cos(void); + expression tan(void); + expression asin(void); + expression acos(void); + expression atan(void); + expression abs(void); + expression log(void); + expression mod(double modval); + + expression on(int physreg, expression* coordshift, bool errorifnotfound); + + // The time variable: + expression time(void); + + expression invjac(int row, int col); + expression jac(int row, int col); + expression detjac(void); + // Get the whole 3x3 Jacobian matrix: + expression invjac(void); + expression jac(void); + + expression getcopy(void); + + std::shared_ptr getoperationinarray(int row, int col); + + // Expand only the terms containing a dof or a testfun. + // The expression must be scalar! + void expand(void); + // After having expanded the expression its form should be a sum + // of terms like coef*dof*tf where coef does not include a dof or + // tf and where different operations can be applied to the dof and + // tf from one term in the sum to another. All coefs are put in + // the output at output[0], all dofs in output[1] and all tfs + // in output[2]. A coef can then be found at output[0][s][i]. + // All coefs corresponding to dof-tf pairs with the same applied + // space and time derivatives are added together in a new operation. + // They are added together at an a priori unknown index i. + // output[0], output[1] and output[2] may have multiple slices + // output[0][s] each corresponding to a unique dof field*-tf field* + // pair (with a unique combination of applied time derivatives). + // The expression must be scalar. + std::vector< std::vector>> > extractdoftf(int elementdimension); + + // Extract the ports, their time derivative orders as well as their + // coefficients from an expanded expression that can be rewritten + // as coefs[0]*ports[0] + ... + noportcoef where the coefficients + // are space-independent numerical values that do not include ports. + // The expression must be scalar. The ports extracted might contain + // duplicates. The no-port term is optional (empty vector if none). + void extractport(std::vector& ports, std::vector& dtorders, std::vector& coefs, std::vector& noportcoef); + + + // Defining the +, -, * and / operators: + expression operator+(void); + expression operator-(void); + + expression operator+(expression); + expression operator-(expression); + expression operator*(expression); + expression operator/(expression); + + expression operator+(field); + expression operator-(field); + expression operator*(field); + expression operator/(field); + + expression operator+(double); + expression operator-(double); + expression operator*(double); + expression operator/(double); + + expression operator+(parameter); + expression operator-(parameter); + expression operator*(parameter); + expression operator/(parameter); + + expression operator+(port); + expression operator-(port); + expression operator*(port); + expression operator/(port); +}; + +// Define the left version of the operators based on the right one. +expression operator+(double, expression); +expression operator-(double, expression); +expression operator*(double, expression); +expression operator/(double, expression); + +expression operator+(field, expression); +expression operator-(field, expression); +expression operator*(field, expression); +expression operator/(field, expression); + +expression operator+(parameter, expression); +expression operator-(parameter, expression); +expression operator*(parameter, expression); +expression operator/(parameter, expression); + +expression operator+(port, expression); +expression operator-(port, expression); +expression operator*(port, expression); +expression operator/(port, expression); + +#endif + diff --git a/src/expression/integration.h b/include/expression/integration.h old mode 100755 new mode 100644 similarity index 100% rename from src/expression/integration.h rename to include/expression/integration.h diff --git a/src/expression/oncontext.h b/include/expression/oncontext.h old mode 100755 new mode 100644 similarity index 100% rename from src/expression/oncontext.h rename to include/expression/oncontext.h diff --git a/src/expression/operation/opabs.h b/include/expression/operation/opabs.h old mode 100755 new mode 100644 similarity index 100% rename from src/expression/operation/opabs.h rename to include/expression/operation/opabs.h diff --git a/src/expression/operation/opacos.h b/include/expression/operation/opacos.h old mode 100755 new mode 100644 similarity index 100% rename from src/expression/operation/opacos.h rename to include/expression/operation/opacos.h diff --git a/src/expression/operation/opasin.h b/include/expression/operation/opasin.h old mode 100755 new mode 100644 similarity index 100% rename from src/expression/operation/opasin.h rename to include/expression/operation/opasin.h diff --git a/src/expression/operation/opatan.h b/include/expression/operation/opatan.h old mode 100755 new mode 100644 similarity index 100% rename from src/expression/operation/opatan.h rename to include/expression/operation/opatan.h diff --git a/src/expression/operation/opathp.h b/include/expression/operation/opathp.h old mode 100755 new mode 100644 similarity index 100% rename from src/expression/operation/opathp.h rename to include/expression/operation/opathp.h diff --git a/src/expression/operation/opcondition.h b/include/expression/operation/opcondition.h old mode 100755 new mode 100644 similarity index 100% rename from src/expression/operation/opcondition.h rename to include/expression/operation/opcondition.h diff --git a/src/expression/operation/opconstant.h b/include/expression/operation/opconstant.h old mode 100755 new mode 100644 similarity index 100% rename from src/expression/operation/opconstant.h rename to include/expression/operation/opconstant.h diff --git a/src/expression/operation/opcos.h b/include/expression/operation/opcos.h old mode 100755 new mode 100644 similarity index 100% rename from src/expression/operation/opcos.h rename to include/expression/operation/opcos.h diff --git a/src/expression/operation/opcustom.h b/include/expression/operation/opcustom.h old mode 100755 new mode 100644 similarity index 100% rename from src/expression/operation/opcustom.h rename to include/expression/operation/opcustom.h diff --git a/src/expression/operation/opdetjac.h b/include/expression/operation/opdetjac.h old mode 100755 new mode 100644 similarity index 100% rename from src/expression/operation/opdetjac.h rename to include/expression/operation/opdetjac.h diff --git a/src/expression/operation/opdof.h b/include/expression/operation/opdof.h old mode 100755 new mode 100644 similarity index 100% rename from src/expression/operation/opdof.h rename to include/expression/operation/opdof.h diff --git a/src/expression/operation/opdtapprox.h b/include/expression/operation/opdtapprox.h similarity index 100% rename from src/expression/operation/opdtapprox.h rename to include/expression/operation/opdtapprox.h diff --git a/src/expression/operation/operation.h b/include/expression/operation/operation.h old mode 100755 new mode 100644 similarity index 100% rename from src/expression/operation/operation.h rename to include/expression/operation/operation.h diff --git a/src/expression/operation/opestimator.h b/include/expression/operation/opestimator.h old mode 100755 new mode 100644 similarity index 100% rename from src/expression/operation/opestimator.h rename to include/expression/operation/opestimator.h diff --git a/src/expression/operation/opfield.h b/include/expression/operation/opfield.h old mode 100755 new mode 100644 similarity index 100% rename from src/expression/operation/opfield.h rename to include/expression/operation/opfield.h diff --git a/src/expression/operation/opfieldorder.h b/include/expression/operation/opfieldorder.h old mode 100755 new mode 100644 similarity index 100% rename from src/expression/operation/opfieldorder.h rename to include/expression/operation/opfieldorder.h diff --git a/src/expression/operation/opharmonic.h b/include/expression/operation/opharmonic.h old mode 100755 new mode 100644 similarity index 100% rename from src/expression/operation/opharmonic.h rename to include/expression/operation/opharmonic.h diff --git a/src/expression/operation/opinversion.h b/include/expression/operation/opinversion.h old mode 100755 new mode 100644 similarity index 100% rename from src/expression/operation/opinversion.h rename to include/expression/operation/opinversion.h diff --git a/src/expression/operation/opinvjac.h b/include/expression/operation/opinvjac.h old mode 100755 new mode 100644 similarity index 100% rename from src/expression/operation/opinvjac.h rename to include/expression/operation/opinvjac.h diff --git a/src/expression/operation/opjac.h b/include/expression/operation/opjac.h old mode 100755 new mode 100644 similarity index 100% rename from src/expression/operation/opjac.h rename to include/expression/operation/opjac.h diff --git a/src/expression/operation/oplog.h b/include/expression/operation/oplog.h old mode 100755 new mode 100644 similarity index 100% rename from src/expression/operation/oplog.h rename to include/expression/operation/oplog.h diff --git a/src/expression/operation/opmeshsize.h b/include/expression/operation/opmeshsize.h old mode 100755 new mode 100644 similarity index 100% rename from src/expression/operation/opmeshsize.h rename to include/expression/operation/opmeshsize.h diff --git a/src/expression/operation/opmod.h b/include/expression/operation/opmod.h old mode 100755 new mode 100644 similarity index 100% rename from src/expression/operation/opmod.h rename to include/expression/operation/opmod.h diff --git a/src/expression/operation/opon.h b/include/expression/operation/opon.h old mode 100755 new mode 100644 similarity index 100% rename from src/expression/operation/opon.h rename to include/expression/operation/opon.h diff --git a/src/expression/operation/oporientation.h b/include/expression/operation/oporientation.h old mode 100755 new mode 100644 similarity index 100% rename from src/expression/operation/oporientation.h rename to include/expression/operation/oporientation.h diff --git a/src/expression/operation/opparameter.h b/include/expression/operation/opparameter.h old mode 100755 new mode 100644 similarity index 100% rename from src/expression/operation/opparameter.h rename to include/expression/operation/opparameter.h diff --git a/src/expression/operation/opport.h b/include/expression/operation/opport.h old mode 100755 new mode 100644 similarity index 100% rename from src/expression/operation/opport.h rename to include/expression/operation/opport.h diff --git a/src/expression/operation/oppower.h b/include/expression/operation/oppower.h old mode 100755 new mode 100644 similarity index 100% rename from src/expression/operation/oppower.h rename to include/expression/operation/oppower.h diff --git a/src/expression/operation/opproduct.h b/include/expression/operation/opproduct.h old mode 100755 new mode 100644 similarity index 100% rename from src/expression/operation/opproduct.h rename to include/expression/operation/opproduct.h diff --git a/src/expression/operation/opsin.h b/include/expression/operation/opsin.h old mode 100755 new mode 100644 similarity index 100% rename from src/expression/operation/opsin.h rename to include/expression/operation/opsin.h diff --git a/src/expression/operation/opspline.h b/include/expression/operation/opspline.h old mode 100755 new mode 100644 similarity index 100% rename from src/expression/operation/opspline.h rename to include/expression/operation/opspline.h diff --git a/src/expression/operation/opsum.h b/include/expression/operation/opsum.h old mode 100755 new mode 100644 similarity index 100% rename from src/expression/operation/opsum.h rename to include/expression/operation/opsum.h diff --git a/src/expression/operation/optan.h b/include/expression/operation/optan.h old mode 100755 new mode 100644 similarity index 100% rename from src/expression/operation/optan.h rename to include/expression/operation/optan.h diff --git a/src/expression/operation/optf.h b/include/expression/operation/optf.h old mode 100755 new mode 100644 similarity index 100% rename from src/expression/operation/optf.h rename to include/expression/operation/optf.h diff --git a/src/expression/operation/optime.h b/include/expression/operation/optime.h old mode 100755 new mode 100644 similarity index 100% rename from src/expression/operation/optime.h rename to include/expression/operation/optime.h diff --git a/src/expression/operation/sl.h b/include/expression/operation/sl.h old mode 100755 new mode 100644 similarity index 100% rename from src/expression/operation/sl.h rename to include/expression/operation/sl.h diff --git a/src/expression/parameter.h b/include/expression/parameter.h old mode 100755 new mode 100644 similarity index 100% rename from src/expression/parameter.h rename to include/expression/parameter.h diff --git a/src/expression/parameterselectedregion.h b/include/expression/parameterselectedregion.h old mode 100755 new mode 100644 similarity index 100% rename from src/expression/parameterselectedregion.h rename to include/expression/parameterselectedregion.h diff --git a/src/expression/port.h b/include/expression/port.h old mode 100755 new mode 100644 similarity index 100% rename from src/expression/port.h rename to include/expression/port.h diff --git a/src/expression/portrelation.h b/include/expression/portrelation.h old mode 100755 new mode 100644 similarity index 100% rename from src/expression/portrelation.h rename to include/expression/portrelation.h diff --git a/src/expression/rawparameter.h b/include/expression/rawparameter.h old mode 100755 new mode 100644 similarity index 100% rename from src/expression/rawparameter.h rename to include/expression/rawparameter.h diff --git a/src/expression/rawport.h b/include/expression/rawport.h old mode 100755 new mode 100644 similarity index 100% rename from src/expression/rawport.h rename to include/expression/rawport.h diff --git a/src/expression/vectorfieldselect.h b/include/expression/vectorfieldselect.h similarity index 100% rename from src/expression/vectorfieldselect.h rename to include/expression/vectorfieldselect.h diff --git a/src/field/field.h b/include/field.h old mode 100755 new mode 100644 similarity index 100% rename from src/field/field.h rename to include/field.h diff --git a/include/field/coefmanager.h b/include/field/coefmanager.h new file mode 100644 index 00000000..0d2b4da6 --- /dev/null +++ b/include/field/coefmanager.h @@ -0,0 +1,58 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// This object manages the data of a field, i.e. the coefficients in the +// finite element discretisation of the field: requested entries that +// are non existing are automatically added and filled with zeros. +// The field in this object can only contain a single component and +// harmonic. The x, y and z coordinate fields are not supported. + +#ifndef COEFMANAGER_H +#define COEFMANAGER_H + +#include +#include "disjointregions.h" +#include "hierarchicalformfunction.h" +#include +#include "selector.h" + +class coefmanager +{ + + private: + + disjointregions mydisjointregions; + + std::string myfieldtypename; + + // 'coefs[disjreg][formfunc][elem]' gives the coefficient for + // + // - vertex, edge, face or volume type-disjoint region 'disjreg' + // - the 'formfunc'th vertex, edge, face or volume form function + // - element index 'elem' in the disjoint region + // + std::vector>> coefs; + + public: + + coefmanager() {}; + coefmanager(std::string fieldtypename, disjointregions* drs); + + bool isdefined(int disjreg, int formfunctionindex); + int countformfunctions(int disjreg); + + // Update the number of form functions considered in every disjoint region. + // To be called every time the interpolation order of the field changes. + void fitinterpolationorder(int disjreg, int interpolationorder); + + double getcoef(int disjreg, int formfunctionindex, int elementindexindisjointregion); + void setcoef(int disjreg, int formfunctionindex, int elementindexindisjointregion, double val); + + void print(bool databoundsonly); + +}; + +#endif diff --git a/include/field/field.h b/include/field/field.h new file mode 100644 index 00000000..586c4e4b --- /dev/null +++ b/include/field/field.h @@ -0,0 +1,216 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// This object is a wrapper of the actual field object 'rawfield' pointed +// by 'rawfieldptr' and to which most of the functions are redirected. +// The purpose of this object is to wrap the 'rawfield' object for a +// convenient user experience. +// An additional advantage is that the std::shared_ptr type pointer ensures +// the pointed 'rawfield' object is always available when there is +// at least one field using it. + +#ifndef FIELD_H +#define FIELD_H + +#include +#include +#include +#include "vec.h" +#include "memory.h" +#include "expression.h" +#include "parameter.h" +#include "rawfield.h" +#include "vectorfieldselect.h" +#include "spanningtree.h" +#include "port.h" + +class spanningtree; +class vectorfieldselect; +class parameter; +class rawfield; +class port; + +class field +{ + + private: + + // The actual field: + std::shared_ptr rawfieldptr = NULL; + + void errorifpointerisnull(void); + + public: + + field(void) {}; + // Provide the form function type name for the field. + field(std::string fieldtypename); + // Also provide the harmonics for a multiharmonic field: + field(std::string fieldtypename, const std::vector harmonicnumbers); + // Also provide the spanning tree used for gauging fields: + field(std::string fieldtypename, spanningtree spantree); + field(std::string fieldtypename, const std::vector harmonicnumbers, spanningtree spantree); + // The constructor below should not be used by the user: + field(std::shared_ptr rawfieldpointer) { rawfieldptr = rawfieldpointer; }; + + // Give the number of components in the field. + int countcomponents(void); + + // List all harmonics in the field. + std::vector getharmonics(void); + // Print a string showing the harmonics in the field. + void printharmonics(void); + + // Set the field name. + void setname(std::string name); + // Print the field name. + void print(void); + + // Set the interpolation order on a physical region. + void setorder(int physreg, int interpolorder); + void setorder(expression criterion, int loworder, int highorder); + void setorder(double targeterror, int loworder, int highorder, double absthres); + + // Associate the primal and dual port to the field. + void setport(int physreg, port primal, port dual); + + // Set a value for the field on a given geometrical region. + // Use the default order + 'extraintegrationdegree' to + // compute the finite element discretisation of 'input'. + void setvalue(int physreg, expression input, int extraintegrationdegree = 0); + // The 'input' expression is evaluated on the mesh deformed by 'meshdeform': + void setvalue(int physreg, expression meshdeform, expression input, int extraintegrationdegree = 0); + // An FFT is used to project the 'input' expression: + void setvalue(int physreg, int numfftharms, expression input, int extraintegrationdegree = 0); + void setvalue(int physreg, int numfftharms, expression meshdeform, expression input, int extraintegrationdegree = 0); + // Set a zero value: + void setvalue(int physreg); + + // Set/get value at nodes for 'h1' type fields: + void setnodalvalues(indexmat nodenumbers, densemat values); + densemat getnodalvalues(indexmat nodenumbers); + + // Set an 'input' valued constraint on a physical region. + // Use the default order + 'extraintegrationdegree' to + // compute the finite element discretisation of 'input'. + void setconstraint(int physreg, expression input, int extraintegrationdegree = 0); + // The 'input' expression is evaluated on the mesh deformed by 'meshdeform': + void setconstraint(int physreg, expression meshdeform, expression input, int extraintegrationdegree = 0); + // Set a constraint on each harmonic: + void setconstraint(int physreg, std::vector input, int extraintegrationdegree = 0); + void setconstraint(int physreg, expression meshdeform, std::vector input, int extraintegrationdegree = 0); + // An FFT is used to project the 'input' expression: + void setconstraint(int physreg, int numfftharms, expression input, int extraintegrationdegree = 0); + void setconstraint(int physreg, int numfftharms, expression meshdeform, expression input, int extraintegrationdegree = 0); + // Set an homogeneous Dirichlet constraint. + void setconstraint(int physreg); + + // Set a 'valexpr' valued constraint on the NODE-ASSOCIATED degrees of freedom of + // physical region 'physreg' for which 'condexpr' is greater or equal to zero. + // All dofs that are not associated to nodes or the nodes at which condexpr < 0 are + // left unconstrained (unless constrained by another constraint). + // + // This function should only be used for fields with nodal shape functions ("h1" like). + void setconditionalconstraint(int physreg, expression condexpr, expression valexpr); + + // Set a gauge condition on a given physical region: + void setgauge(int physreg); + + // Transfer data from a field in the solution vector to this field. + // Only the data corresponding to the physical region is transferred. + // 'op' can be 'add' or 'set'. + // Transfer data from field 'a' in 'vector|a' to the current field: + void setdata(int physreg, vectorfieldselect myvec, std::string op = "set"); + // Transfer data from and to the current field: + void setdata(int physreg, vec myvec, std::string op = "set"); + + // Set the source value at every cut: + void setcohomologysources(std::vector cutphysregs, std::vector cutvalues); + + // Allow/forbid automatic updating of the field value during hp-adaptivity: + void automaticupdate(bool updateit); + void noautomaticupdate(void); + + void setupdateaccuracy(int extraintegrationorder); + + std::shared_ptr getpointer(void) { return rawfieldptr; }; + + // Select a component. + field comp(int component); + field compx(void) { return comp(0); }; + field compy(void) { return comp(1); }; + field compz(void) { return comp(2); }; + + // Select a single or multiple harmonics. + // Outputs all components corresponding to the harmonic. + field harmonic(int harmonicnumber) { return harmonic(std::vector{harmonicnumber}); }; + field harmonic(const std::vector harmonicnumbers); + field sin(int freqindex) { return harmonic(2*freqindex); }; + field cos(int freqindex) { return harmonic(2*freqindex+1); }; + + + + vec atbarycenter(int physreg, field onefield); + + std::vector max(int physreg, int refinement, std::vector xyzrange = {}); + std::vector max(int physreg, expression meshdeform, int refinement, std::vector xyzrange = {}); + std::vector min(int physreg, int refinement, std::vector xyzrange = {}); + std::vector min(int physreg, expression meshdeform, int refinement, std::vector xyzrange = {}); + + void interpolate(int physreg, std::vector& xyzcoord, std::vector& interpolated, std::vector& isfound); + void interpolate(int physreg, expression meshdeform, std::vector& xyzcoord, std::vector& interpolated, std::vector& isfound); + + std::vector interpolate(int physreg, const std::vector xyzcoord); + std::vector interpolate(int physreg, expression meshdeform, const std::vector xyzcoord); + + double integrate(int physreg, expression meshdeform, int integrationorder); + double integrate(int physreg, int integrationorder); + + void write(int physreg, int numfftharms, std::string filename, int lagrangeorder); + void write(int physreg, int numfftharms, expression meshdeform, std::string filename, int lagrangeorder); + + void write(int physreg, std::string filename, int lagrangeorder, int numtimesteps = -1); + void write(int physreg, expression meshdeform, std::string filename, int lagrangeorder, int numtimesteps = -1); + + // Write/load the raw field data to/from compact sparselizard format: + void writeraw(int physreg, std::string filename, bool isbinary = false, std::vector extradata = {}); + std::vector loadraw(std::string filename, bool isbinary = false); + + + // Defining the +, -, * and / operators: + expression operator+(void); + expression operator-(void); + + expression operator+(field); + expression operator-(field); + expression operator*(field); + expression operator/(field); + + expression operator+(double); + expression operator-(double); + expression operator*(double); + expression operator/(double); + + expression operator+(parameter); + expression operator-(parameter); + expression operator*(parameter); + expression operator/(parameter); + +}; + +// Define the left version of the operators based on the right one. +expression operator+(double, field); +expression operator-(double, field); +expression operator*(double, field); +expression operator/(double, field); + +expression operator+(parameter, field); +expression operator-(parameter, field); +expression operator*(parameter, field); +expression operator/(parameter, field); + +#endif + diff --git a/src/field/jacobian.h b/include/field/jacobian.h old mode 100755 new mode 100644 similarity index 100% rename from src/field/jacobian.h rename to include/field/jacobian.h diff --git a/src/field/rawfield.h b/include/field/rawfield.h old mode 100755 new mode 100644 similarity index 100% rename from src/field/rawfield.h rename to include/field/rawfield.h diff --git a/src/formulation/formulation.h b/include/formulation.h old mode 100755 new mode 100644 similarity index 100% rename from src/formulation/formulation.h rename to include/formulation.h diff --git a/include/formulation/contribution.h b/include/formulation/contribution.h new file mode 100644 index 00000000..57434f58 --- /dev/null +++ b/include/formulation/contribution.h @@ -0,0 +1,98 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef CONTRIBUTION_H +#define CONTRIBUTION_H + +#include +#include +#include +#include +#include "operation.h" +#include "densemat.h" +#include "indexmat.h" +#include "dofmanager.h" +#include "rawfield.h" +#include "universe.h" +#include "jacobian.h" +#include "gausspoints.h" +#include "elementselector.h" +#include "disjointregions.h" +#include "disjointregionselector.h" +#include "expression.h" +#include "harmonic.h" +#include "fourier.h" +#include "selector.h" +#include "math.h" +#include "rawvec.h" +#include "rawmat.h" +#include "wallclock.h" +#include "operation.h" + +class rawvec; +class rawmat; +class operation; +class rawfield; + +class contribution +{ + + private: + + std::shared_ptr mydofmanager; + + // All elementary coef*dof*tf terms to assemble and add together: + std::vector> mydofs = {}; + std::vector> mytfs = {}; + std::vector> mycoeffs = {}; + + // The dof and tf field for all terms above. A NULL dof means rhs contribution: + std::shared_ptr doffield = NULL; + std::shared_ptr tffield = NULL; + + int integrationphysreg = -1; + int dofphysreg = -1; + int tfphysreg = -1; + + int integrationorderdelta = 0; + // Number of time evaluations for the FFT of the coef. Negative means no FFT. + int numfftcoeffs = -1; + + // Barycenter evaluation mode during rhs term assembly: + bool isbarycentereval = false; + + // The contribution is computed on the mesh deformed by (if any): + std::vector mymeshdeformation = {}; + + // The following vectors stores pointers to all the fragments that have been generated. + std::vector fragmentrowadresses = {}; + std::vector fragmentcoladresses = {}; + std::vector fragmentvalues = {}; + + public: + + contribution(std::shared_ptr dofmngr); + + void setdofs(std::vector> dofs); + void settfs(std::vector> tfs); + void setcoeffs(std::vector> coeffs); + void setdoffield(std::shared_ptr input); + void settffield(std::shared_ptr input); + void setmeshdeformation(expression meshdeform); + void setintegrationphysicalregion(int physreg); + void setdofphysicalregion(int physreg); + void settfphysicalregion(int physreg); + void setintegrationorderdelta(int integrorderdelta); + void setnumfftcoeffs(int numcoeffs); + void setbarycenterevalflag(void); + + // Generate the contribution and store it in the + // vec (for rhs contributions) or in the mat. + void generate(std::shared_ptr myvec, std::shared_ptr mymat); + +}; + +#endif diff --git a/include/formulation/dofinterpolate.h b/include/formulation/dofinterpolate.h new file mode 100644 index 00000000..5beb738f --- /dev/null +++ b/include/formulation/dofinterpolate.h @@ -0,0 +1,79 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + +#ifndef DOFINTERPOLATE_H +#define DOFINTERPOLATE_H + +#include "universe.h" +#include +#include "disjointregions.h" +#include "densemat.h" +#include "indexmat.h" +#include "dofmanager.h" +#include "field.h" +#include "rawfield.h" +#include "expression.h" +#include "disjointregionselector.h" +#include "elementselector.h" +#include "hierarchicalformfunction.h" +#include "oncontext.h" +#include + +class dofinterpolate +{ + private: + + // The dof field: + std::shared_ptr mydoffield = NULL; + // Dof operations on the above doffield. Same doffield for all operations! + std::vector> mydofops = {}; + + // Dof manager of the calling formulation: + std::shared_ptr mydofmanager = NULL; + + // Physical region on the dof side (can include different element types and dof orders). + int onphysreg = -1; + + // Reference evaluation coordinates. + std::vector myrefcoords = {}; + int mynumrefcoords = -1; + + // Dof interpolation x, y, z coordinates: + std::vector myxyzcoords = {}; + + // Keep track of which coordinate was found. + std::vector isfound = {}; + + referencecoordinategroup rcg; + + + // Max number of shape functions over all disjoint regions. + int mymaxnumff = 0; + + // One matrix per dof operation. + // Rows are the elements in the calling region. + // Number of columns is maxnumff*numevalpoints (blocks of numevalpoints side by side). + std::vector myvals = {}; + + // One matrix per dof harmonic. Harmonic h is at mydofnums[h][0]. + // Value is -2 for non existing entries. + std::vector> mydofnums = {}; + + + // Create the matrix containers: + void eval(void); + + public: + + dofinterpolate(void) {}; + + dofinterpolate(std::vector refcoords, elementselector& elemselec, std::vector> dofops, std::shared_ptr dofmngr); + + densemat getvalues(elementselector& elemselec, int dofopindex); + indexmat getaddresses(elementselector& elemselec, int harmnum); + +}; + +#endif diff --git a/include/formulation/dofmanager.h b/include/formulation/dofmanager.h new file mode 100644 index 00000000..5decc412 --- /dev/null +++ b/include/formulation/dofmanager.h @@ -0,0 +1,170 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// The 'dofmanager' object manages the structure which defines at which +// indexes of an assembled matrix the degrees of freedom can be found. + +#ifndef DOFMANAGER_H +#define DOFMANAGER_H + +#include "rawfield.h" +#include "element.h" +#include "universe.h" +#include +#include "disjointregions.h" +#include "indexmat.h" +#include +#include +#include "selector.h" +#include "rawport.h" + +class rawfield; +class rawport; + +class dofmanager +{ + private: + + // The number of dofs managed: + int numberofdofs = 0; + + // All the fields in the structure: + std::vector> myfields = {}; + // The currently selected field (if any) is myfields[selectedfieldnumber]: + int selectedfieldnumber = -1; + + // Order of each field on each disjoint region: + std::vector> myfieldorders = {}; + + // Map every added port to its dof index: + std::unordered_map myrawportmap; + + // 'primalondisjreg[selectedfieldnumber][disjreg]' gives + // the primal rawport on the disjoint region (NULL if none): + std::vector >> primalondisjreg = {}; + + // 'rangebegin[selectedfieldnumber][12][2]' gives the index of + // the first row/column in the matrix at which the data for + // + // - field pointed by myfields[selectedfieldnumber] + // - vertex, edge, face or volume type-disjoint region 12 + // - the third vertex, edge, face or volume form function + // + // can be found. + // + // 'rangeend[selectedfieldnumber][12][2]' gives the last row. + // + std::vector>> rangebegin = {}; + std::vector>> rangeend = {}; + + bool isitmanaged = true; + + + int mymeshnumber = 0; + + // Track the calls to 'addtostructure'. + std::vector> myportstructuretracker = {}; + std::vector, int>> mystructuretracker = {}; + + // Synchronize with the hp-adapted mesh: + void synchronize(void); + // To avoid infinite recursive calls: + bool issynchronizing = false; + + + // Actual function to add to the structure. + void addtostructure(std::shared_ptr fieldtoadd, std::vector selecteddisjointregions); + + public: + + dofmanager(void); + // Unmanaged structure: + dofmanager(int numdofs); + + bool ismanaged(void) { return isitmanaged; }; + + void donotsynchronize(void); + + // Add a rawport to the structure: + void addtostructure(std::shared_ptr porttoadd); + + // 'addtostructure' defines dofs for a field on the disjoint + // regions. Only fields with a single component are accepted. + void addtostructure(std::shared_ptr fieldtoadd, int physicalregionnumber); + + // Always select the field before accessing the dof structure. + void selectfield(std::shared_ptr selectedfield); + + // Get all disjoint regions on which the selected field has dofs: + std::vector getdisjointregionsofselectedfield(void); + + int getrangebegin(int disjreg, int formfunc); + int getrangeend(int disjreg, int formfunc); + + // Get the port dof index: + int getaddress(rawport* prt); + + // Get the pointer and dof index of every port defined in this object: + void getportsinds(std::vector& rps, indexmat& inds); + + // Return the primal and dual addresses for all associated ports: + std::pair findassociatedports(void); + + bool isdefined(int disjreg, int formfunc); + + bool isported(int disjreg); + + // For all types of constraints: + std::vector isconstrained(void); + indexmat getconstrainedindexes(void); + + int countdisjregconstraineddofs(void); + indexmat getdisjregconstrainedindexes(void); + + int countgaugeddofs(void); + indexmat getgaugedindexes(void); + + // Get the conditionally constrained adresses as well as the constraint values: + std::pair getconditionalconstraintdata(void); + + std::shared_ptr getselectedfield(void); + std::vector> getfields(void); + // The replacing field must have an identical type and order vector as the replaced one: + void replaceselectedfield(std::shared_ptr rf); + + std::vector getselectedfieldorders(void); + + // Count the total number of ports (primal, dual and not-associated): + int countports(void); + int countassociatedprimalports(void); + + int countdofs(void); + long long int allcountdofs(void); + int countformfunctions(int disjointregion); + + // Return {sendnewconstrainedinds, recvnewconstrainedinds, sendunconstrainedinds, recvunconstrainedinds} where + // + // - sendnewconstrainedinds[n] are the indexes of all interface dofs constrained on this rank but not constrained on the neighbour + // - recvnewconstrainedinds[n] are the indexes of all interface dofs not constrained on this rank but constrained on the neighbour + // - sendunconstrainedinds[n] are all unconstrained indexes in senddofinds (same ordering) + // - recvunconstrainedinds[n] are all unconstrained indexes in recvdofinds (same ordering) + // + std::vector> discovernewconstraints(std::vector neighbours, std::vector senddofinds, std::vector recvdofinds); + + void print(void); + + // 'getaddresses' is required in the matrix generation step. + // It returns an indexmat representing a numberofformfunctions + // by elementlist.size() matrix (row-major). The matrix gives + // the addresses in the formulation matrix at which the dofs of field + // 'inputfield' defined on the elements in elementlist can be found. + // Address -1 is used for field dofs not in 'fieldphysreg'. + // + indexmat getaddresses(std::shared_ptr inputfield, int fieldinterpolationorder, int elementtypenumber, std::vector &elementlist, int fieldphysreg); + +}; + +#endif diff --git a/include/formulation/formulation.h b/include/formulation/formulation.h new file mode 100644 index 00000000..60956ca2 --- /dev/null +++ b/include/formulation/formulation.h @@ -0,0 +1,125 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef FORMULATION_H +#define FORMULATION_H + +#include +#include +#include "integration.h" +#include "contribution.h" +#include "dofmanager.h" +#include "vec.h" +#include "mat.h" +#include "expression.h" +#include "sl.h" +#include "universe.h" +#include "memory.h" +#include "densemat.h" +#include "indexmat.h" +#include "rawvec.h" +#include "rawmat.h" +#include "integration.h" +#include "port.h" +#include "portrelation.h" + +class integration; +class contribution; +class port; +class portrelation; + +class formulation +{ + private: + + bool isstructurelocked = false; + + // myvec is the right handside vector rhs. + std::shared_ptr myvec = NULL; + // - mymat[0] is the stiffness matrix K + // - mymat[1] is the damping matrix C + // - mymat[2] is the mass matrix M + std::vector> mymat = {NULL, NULL, NULL}; + + // The link between the dof number and its row and column in the matrix: + std::shared_ptr mydofmanager = NULL; + + // The port relations: + std::vector> myportrelations = {}; + + // mycontributions[m][i][j] gives the jth contribution of block number i for: + // - the right handside if m = 0 + // - the stiffness matrix if m = 1 + // - the damping matrix if m = 2 + // - the mass matrix if m = 3 + std::vector< std::vector> > mycontributions = {{}, {}, {}, {}}; + + // Always call this generate from the public generate functions: + void generate(int m, int contributionnumber); + + public: + + formulation(void); + + // Add a port relation: + formulation& operator+=(expression expr); + + // The following adds the contribution defined in the integration object. + formulation& operator+=(integration integrationobject); + formulation& operator+=(std::vector integrationobject); + + int countdofs(void); + long long int allcountdofs(void); + + bool isstiffnessmatrixdefined(void); + bool isdampingmatrixdefined(void); + bool ismassmatrixdefined(void); + + // Generate all blocks: + void generate(void); + // Generate all contributions of K, C, M or rhs: + void generatestiffnessmatrix(void); + void generatedampingmatrix(void); + void generatemassmatrix(void); + void generaterhs(void); + + void generatein(int rhskcm, std::vector contributionnumbers); + void generate(std::vector contributionnumbers); + void generate(int contributionnumber); + + // Compute the no-port term value for every port relation: + densemat getportrelationrhs(void); + std::tuple getportrelations(int KCM); + + std::shared_ptr getdofmanager(void) { return mydofmanager; }; + + // Get the assembled matrices or get the right hanside vector. + // Choose to discard or not all values after getting the vector/matrix. + + // b() is an alias for rhs() and A() for K(): + vec b(bool keepvector = false, bool dirichletandportupdate = true); + mat A(bool keepfragments = false); + + vec rhs(bool keepvector = false, bool dirichletandportupdate = true); + mat K(bool keepfragments = false); + mat C(bool keepfragments = false); + mat M(bool keepfragments = false); + // KCM set to 0 gives K, 1 gives C and 2 gives M. + mat getmatrix(int KCM, bool keepfragments = false, std::vector additionalconstraints = {}); + + + // Generate, solve and save to fields: + void solve(std::string soltype = "lu", bool diagscaling = false, std::vector blockstoconsider = {-1}); + + // DDM resolution with Dirichlet / mixed interface conditions. The initial solution is taken from the fields state. The relative residual history is returned. + std::vector allsolve(double relrestol, int maxnumit, std::string soltype = "lu", int verbosity = 1); + std::vector allsolve(std::vector formulterms, std::vector> physicalterms, std::vector> artificialterms, double relrestol, int maxnumit, std::string soltype = "lu", int verbosity = 1); + +}; + + + +#endif diff --git a/src/formulation/mat.h b/include/formulation/mat.h old mode 100755 new mode 100644 similarity index 100% rename from src/formulation/mat.h rename to include/formulation/mat.h diff --git a/src/formulation/rawmat.h b/include/formulation/rawmat.h old mode 100755 new mode 100644 similarity index 100% rename from src/formulation/rawmat.h rename to include/formulation/rawmat.h diff --git a/src/formulation/rawvec.h b/include/formulation/rawvec.h old mode 100755 new mode 100644 similarity index 100% rename from src/formulation/rawvec.h rename to include/formulation/rawvec.h diff --git a/src/formulation/vec.h b/include/formulation/vec.h old mode 100755 new mode 100644 similarity index 100% rename from src/formulation/vec.h rename to include/formulation/vec.h diff --git a/src/fourier.h b/include/fourier.h old mode 100755 new mode 100644 similarity index 100% rename from src/fourier.h rename to include/fourier.h diff --git a/src/gausspoint/gausspoints.h b/include/gausspoint/gausspoints.h old mode 100755 new mode 100644 similarity index 100% rename from src/gausspoint/gausspoints.h rename to include/gausspoint/gausspoints.h diff --git a/src/gausspoint/gphexahedron.h b/include/gausspoint/gphexahedron.h old mode 100755 new mode 100644 similarity index 100% rename from src/gausspoint/gphexahedron.h rename to include/gausspoint/gphexahedron.h diff --git a/src/gausspoint/gpline.h b/include/gausspoint/gpline.h old mode 100755 new mode 100644 similarity index 100% rename from src/gausspoint/gpline.h rename to include/gausspoint/gpline.h diff --git a/src/gausspoint/gppoint.h b/include/gausspoint/gppoint.h old mode 100755 new mode 100644 similarity index 100% rename from src/gausspoint/gppoint.h rename to include/gausspoint/gppoint.h diff --git a/src/gausspoint/gpprism.h b/include/gausspoint/gpprism.h old mode 100755 new mode 100644 similarity index 100% rename from src/gausspoint/gpprism.h rename to include/gausspoint/gpprism.h diff --git a/src/gausspoint/gppyramid.h b/include/gausspoint/gppyramid.h old mode 100755 new mode 100644 similarity index 100% rename from src/gausspoint/gppyramid.h rename to include/gausspoint/gppyramid.h diff --git a/src/gausspoint/gpquadrangle.h b/include/gausspoint/gpquadrangle.h old mode 100755 new mode 100644 similarity index 100% rename from src/gausspoint/gpquadrangle.h rename to include/gausspoint/gpquadrangle.h diff --git a/src/gausspoint/gptetrahedron.h b/include/gausspoint/gptetrahedron.h old mode 100755 new mode 100644 similarity index 100% rename from src/gausspoint/gptetrahedron.h rename to include/gausspoint/gptetrahedron.h diff --git a/src/gausspoint/gptriangle.h b/include/gausspoint/gptriangle.h old mode 100755 new mode 100644 similarity index 100% rename from src/gausspoint/gptriangle.h rename to include/gausspoint/gptriangle.h diff --git a/include/gausspoints.h b/include/gausspoints.h new file mode 100644 index 00000000..af030f28 --- /dev/null +++ b/include/gausspoints.h @@ -0,0 +1,50 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef GAUSSPOINTS_H +#define GAUSSPOINTS_H + +#include +#include +#include + +#include "gppoint.h" +#include "gpline.h" +#include "gptriangle.h" +#include "gpquadrangle.h" +#include "gptetrahedron.h" +#include "gphexahedron.h" +#include "gpprism.h" +#include "gppyramid.h" + + +class gausspoints +{ + private: + + int myelementtypenumber; + + std::vector mycoordinates; + std::vector myweights; + + public: + + gausspoints(int elementtypenumber, int integrationorder); + // Find based on the element type and the gauss points coordinates: + gausspoints(int elementtypenumber, std::vector& gpcoords); + + // 'getcoordinates' returns a vector containing the reference + // element coordinates of the Gauss points in the format + // [kigp1 etagp1 phigp1 kigp2 ...]. + std::vector getcoordinates(void) { return mycoordinates; }; + std::vector getweights(void) { return myweights; }; + + int count(void) { return myweights.size(); }; + + void print(void); +}; + +#endif diff --git a/src/resolution/genalpha.h b/include/genalpha.h similarity index 100% rename from src/resolution/genalpha.h rename to include/genalpha.h diff --git a/src/mesh/gentools.h b/include/gentools.h old mode 100755 new mode 100644 similarity index 100% rename from src/mesh/gentools.h rename to include/gentools.h diff --git a/src/geometry/geotools.h b/include/geometry/geotools.h old mode 100755 new mode 100644 similarity index 100% rename from src/geometry/geotools.h rename to include/geometry/geotools.h diff --git a/src/geometry/rawarc.h b/include/geometry/rawarc.h old mode 100755 new mode 100644 similarity index 100% rename from src/geometry/rawarc.h rename to include/geometry/rawarc.h diff --git a/src/geometry/rawdisk.h b/include/geometry/rawdisk.h old mode 100755 new mode 100644 similarity index 100% rename from src/geometry/rawdisk.h rename to include/geometry/rawdisk.h diff --git a/src/geometry/rawextrusion.h b/include/geometry/rawextrusion.h old mode 100755 new mode 100644 similarity index 100% rename from src/geometry/rawextrusion.h rename to include/geometry/rawextrusion.h diff --git a/src/geometry/rawline.h b/include/geometry/rawline.h old mode 100755 new mode 100644 similarity index 100% rename from src/geometry/rawline.h rename to include/geometry/rawline.h diff --git a/src/geometry/rawpoint.h b/include/geometry/rawpoint.h old mode 100755 new mode 100644 similarity index 100% rename from src/geometry/rawpoint.h rename to include/geometry/rawpoint.h diff --git a/src/geometry/rawquadrangle.h b/include/geometry/rawquadrangle.h old mode 100755 new mode 100644 similarity index 100% rename from src/geometry/rawquadrangle.h rename to include/geometry/rawquadrangle.h diff --git a/src/geometry/rawshape.h b/include/geometry/rawshape.h old mode 100755 new mode 100644 similarity index 100% rename from src/geometry/rawshape.h rename to include/geometry/rawshape.h diff --git a/src/geometry/rawsurface.h b/include/geometry/rawsurface.h old mode 100755 new mode 100644 similarity index 100% rename from src/geometry/rawsurface.h rename to include/geometry/rawsurface.h diff --git a/src/geometry/rawtriangle.h b/include/geometry/rawtriangle.h old mode 100755 new mode 100644 similarity index 100% rename from src/geometry/rawtriangle.h rename to include/geometry/rawtriangle.h diff --git a/src/geometry/rawunion.h b/include/geometry/rawunion.h old mode 100755 new mode 100644 similarity index 100% rename from src/geometry/rawunion.h rename to include/geometry/rawunion.h diff --git a/src/geometry/rawvolume.h b/include/geometry/rawvolume.h old mode 100755 new mode 100644 similarity index 100% rename from src/geometry/rawvolume.h rename to include/geometry/rawvolume.h diff --git a/src/geometry/shape.h b/include/geometry/shape.h old mode 100755 new mode 100644 similarity index 100% rename from src/geometry/shape.h rename to include/geometry/shape.h diff --git a/include/geotools.h b/include/geotools.h new file mode 100644 index 00000000..bf68b8f4 --- /dev/null +++ b/include/geotools.h @@ -0,0 +1,81 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// This namespace provides tools for the geometry operations. + +#ifndef GEOTOOLS_H +#define GEOTOOLS_H + +#include +#include +#include +#include +#include +#include +#include "shape.h" +#include "rawshape.h" +#include "rawpoint.h" + +namespace geotools +{ + // An implementation of acos that is safe with respect to roundoff noise on the argument: + double acos(double arg); + + // Convert a list of point coordinates into point objects: + std::vector> coordstopoints(std::vector coords); + + // Get the distance between two points: + double getdistance(std::vector pt1coords, std::vector pt2coords); + double getdistance(int pt1, int pt2, std::vector& coords); + + // Get the angle (in degrees) which rotates the plane defined by the 3 input points + // around the x (or y) axis to bring it parallel to the y axis (or x axis). + // Get the angle around the x axis with "xrot" and around the y axis with "yrot" + double getplanerotation(std::string xy, std::vector p1, std::vector p2, std::vector p3); + + // Rotate a vector of coordinates by alphax, alphay and alphaz degrees around the x, y and z axis respectively: + void rotate(double alphax, double alphay, double alphaz, std::vector* coords); + + // Flip the nodes in a coordinate vector (3 coordinates per node): + std::vector flipcoords(std::vector& input); + + // Orient a list of line shapes to have them all pointing to the next one: + std::vector> orient(std::vector> input); + + // Transform a vector of shapes into a vector of rawshapes: + std::vector< std::shared_ptr > getrawshapes(std::vector shapes); + + // Transform a vector of rawshapes into a vector of shapes: + std::vector getshapes(std::vector< std::shared_ptr > rawshapes); + + // Transform a vector of rawshape shared pointers to a vector of rawshape pointers: + std::vector getpointers(std::vector< std::shared_ptr > sharedptrs); + + // Flip the rawshape vector direction: + std::vector< std::shared_ptr > flip(std::vector< std::shared_ptr > input); + + // Unique a list of rawshape pointers: + std::vector unique(std::vector ptrs); + + // Duplicate a list of rawshapes: + std::vector> duplicate(std::vector> input); + + // Concatenate lists of rawshapes: + std::vector> concatenate(std::vector>> input); + + // Get an int vector to sort a vector of rawshape pointers: + void sortrawshapepointers(std::vector& tosort, std::vector& reorderingvector); + + // Append the coordinate of multiple rawshapes: + std::vector appendcoords(std::vector> rawshapes); + // Append the elements of multiple rawshapes: + std::vector> appendelems(std::vector> rawshapes); + + // Get the curvature order (error if not all identical): + int getcurvatureorder(std::vector< std::shared_ptr > rawshapes); +}; + +#endif diff --git a/src/io/gmsh/gmshinterface.h b/include/gmsh/gmshinterface.h old mode 100755 new mode 100644 similarity index 100% rename from src/io/gmsh/gmshinterface.h rename to include/gmsh/gmshinterface.h diff --git a/include/gmshinterface.h b/include/gmshinterface.h new file mode 100644 index 00000000..db4b1c7e --- /dev/null +++ b/include/gmshinterface.h @@ -0,0 +1,61 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef GMSHINTERFACE_H +#define GMSHINTERFACE_H + +#include +#include "nodes.h" +#include "elements.h" +#include "physicalregions.h" +#include "densemat.h" +#include +#include +#include +#include +#include +#include +#include "wallclock.h" +#include "physicalregion.h" +#include "element.h" +#include "mystring.h" +#include "polynomial.h" +#include "iodata.h" +#include "lagrangeformfunction.h" + +namespace gmshinterface +{ + // Load the mesh from the API to the 'nodes', 'elements' and 'physicalregions' objects. + void readfromapi(nodes&, elements&, physicalregions&); + void readwithapi(std::string name, nodes&, elements&, physicalregions&); + + // Load the .msh mesh to the 'nodes', 'elements' and 'physicalregions' objects. + void readfromfile(std::string name, nodes&, elements&, physicalregions&); + // Write to .msh mesh format: + void writetofile(std::string name, nodes&, elements&, physicalregions&, disjointregions&, std::vector physicalregionstowrite); + + // Write to .pos format: + void writetofile(std::string name, iodata datatowrite); + + // Write or append the header of a new view in the .pos file: + void openview(std::string name, std::string viewname, double timetag, bool overwrite); + // Write a scalar field to the current view in the .pos format: + void appendtoview(std::string name, int elementtypenumber, densemat coordx, densemat coordy, densemat coordz, densemat compxinterpolated); + // Write a vector field to the current view in the .pos format: + void appendtoview(std::string name, int elementtypenumber, densemat coordx, densemat coordy, densemat coordz, densemat compxinterpolated, densemat compyinterpolated, densemat compzinterpolated); + // Write poly.size() interpolation schemes in the current view in the .pos file: + void writeinterpolationscheme(std::string name, std::vector> poly); + // Close the current view in the .pos file: + void closeview(std::string name); + + // GMSH comes with its own element type numbering: we translate it to and from ours: + int convertgmshelementtypenumber(int gmshtypenumber); + int converttogmshelementtypenumber(int ourtypenumber); + + char getelementidentifierinposformat(int ourtypenumber); +}; + +#endif diff --git a/include/gphexahedron.h b/include/gphexahedron.h new file mode 100644 index 00000000..ce4f2259 --- /dev/null +++ b/include/gphexahedron.h @@ -0,0 +1,21 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef GPHEXAHEDRON_H +#define GPHEXAHEDRON_H + +#include +#include +#include +#include "gausspoints.h" + +namespace gphexahedron +{ + int count(int integrationorder); // -1 if not defined + void set(int integrationorder, std::vector& coordinates, std::vector& weights); +}; + +#endif diff --git a/include/gpline.h b/include/gpline.h new file mode 100644 index 00000000..f4afd9d6 --- /dev/null +++ b/include/gpline.h @@ -0,0 +1,21 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef GPLINE_H +#define GPLINE_H + +#include +#include +#include +#include "gausspoints.h" + +namespace gpline +{ + int count(int integrationorder); // -1 if not defined + void set(int integrationorder, std::vector& coordinates, std::vector& weights); +}; + +#endif diff --git a/include/gppoint.h b/include/gppoint.h new file mode 100644 index 00000000..e83c2f5f --- /dev/null +++ b/include/gppoint.h @@ -0,0 +1,21 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef GPPOINT_H +#define GPPOINT_H + +#include +#include +#include +#include "gausspoints.h" + +namespace gppoint +{ + int count(int integrationorder); // -1 if not defined + void set(int integrationorder, std::vector& coordinates, std::vector& weights); +}; + +#endif diff --git a/include/gpprism.h b/include/gpprism.h new file mode 100644 index 00000000..57814953 --- /dev/null +++ b/include/gpprism.h @@ -0,0 +1,21 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef GPPRISM_H +#define GPPRISM_H + +#include +#include +#include +#include "gausspoints.h" + +namespace gpprism +{ + int count(int integrationorder); // -1 if not defined + void set(int integrationorder, std::vector& coordinates, std::vector& weights); +}; + +#endif diff --git a/include/gppyramid.h b/include/gppyramid.h new file mode 100644 index 00000000..adb21451 --- /dev/null +++ b/include/gppyramid.h @@ -0,0 +1,21 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef GPPYRAMID_H +#define GPPYRAMID_H + +#include +#include +#include +#include "gausspoints.h" + +namespace gppyramid +{ + int count(int integrationorder); // -1 if not defined + void set(int integrationorder, std::vector& coordinates, std::vector& weights); +}; + +#endif diff --git a/include/gpquadrangle.h b/include/gpquadrangle.h new file mode 100644 index 00000000..88bd3ba1 --- /dev/null +++ b/include/gpquadrangle.h @@ -0,0 +1,21 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef GPQUADRANGLE_H +#define GPQUADRANGLE_H + +#include +#include +#include +#include "gausspoints.h" + +namespace gpquadrangle +{ + int count(int integrationorder); // -1 if not defined + void set(int integrationorder, std::vector& coordinates, std::vector& weights); +}; + +#endif diff --git a/include/gptetrahedron.h b/include/gptetrahedron.h new file mode 100644 index 00000000..19915006 --- /dev/null +++ b/include/gptetrahedron.h @@ -0,0 +1,21 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef GPTETRAHEDRON_H +#define GPTETRAHEDRON_H + +#include +#include +#include +#include "gausspoints.h" + +namespace gptetrahedron +{ + int count(int integrationorder); // -1 if not defined + void set(int integrationorder, std::vector& coordinates, std::vector& weights); +}; + +#endif diff --git a/include/gptriangle.h b/include/gptriangle.h new file mode 100644 index 00000000..cf8ce154 --- /dev/null +++ b/include/gptriangle.h @@ -0,0 +1,21 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef GPTRIANGLE_H +#define GPTRIANGLE_H + +#include +#include +#include +#include "gausspoints.h" + +namespace gptriangle +{ + int count(int integrationorder); // -1 if not defined + void set(int integrationorder, std::vector& coordinates, std::vector& weights); +}; + +#endif diff --git a/src/shapefunction/hierarchical/h1/h1hexahedron.h b/include/h1/h1hexahedron.h old mode 100755 new mode 100644 similarity index 100% rename from src/shapefunction/hierarchical/h1/h1hexahedron.h rename to include/h1/h1hexahedron.h diff --git a/src/shapefunction/hierarchical/h1/h1line.h b/include/h1/h1line.h old mode 100755 new mode 100644 similarity index 100% rename from src/shapefunction/hierarchical/h1/h1line.h rename to include/h1/h1line.h diff --git a/src/shapefunction/hierarchical/h1/h1point.h b/include/h1/h1point.h old mode 100755 new mode 100644 similarity index 100% rename from src/shapefunction/hierarchical/h1/h1point.h rename to include/h1/h1point.h diff --git a/src/shapefunction/hierarchical/h1/h1prism.h b/include/h1/h1prism.h old mode 100755 new mode 100644 similarity index 100% rename from src/shapefunction/hierarchical/h1/h1prism.h rename to include/h1/h1prism.h diff --git a/src/shapefunction/hierarchical/h1/h1pyramid.h b/include/h1/h1pyramid.h old mode 100755 new mode 100644 similarity index 100% rename from src/shapefunction/hierarchical/h1/h1pyramid.h rename to include/h1/h1pyramid.h diff --git a/src/shapefunction/hierarchical/h1/h1quadrangle.h b/include/h1/h1quadrangle.h old mode 100755 new mode 100644 similarity index 100% rename from src/shapefunction/hierarchical/h1/h1quadrangle.h rename to include/h1/h1quadrangle.h diff --git a/src/shapefunction/hierarchical/h1/h1tetrahedron.h b/include/h1/h1tetrahedron.h old mode 100755 new mode 100644 similarity index 100% rename from src/shapefunction/hierarchical/h1/h1tetrahedron.h rename to include/h1/h1tetrahedron.h diff --git a/src/shapefunction/hierarchical/h1/h1triangle.h b/include/h1/h1triangle.h old mode 100755 new mode 100644 similarity index 100% rename from src/shapefunction/hierarchical/h1/h1triangle.h rename to include/h1/h1triangle.h diff --git a/include/h1hexahedron.h b/include/h1hexahedron.h new file mode 100644 index 00000000..ce4712d5 --- /dev/null +++ b/include/h1hexahedron.h @@ -0,0 +1,47 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// The following form functions have been derived in the PhD thesis +// "High Order Finite Element Methods for Electromagnetic Field Computation" +// of Dr. Sabine Zaglmayr at JOHANNES KEPLER UNIVERSITAET LINZ, AUSTRIA + +#ifndef H1HEXAHEDRON_H +#define H1HEXAHEDRON_H + +#include "hierarchicalformfunction.h" + +class h1hexahedron: public hierarchicalformfunction +{ + private: + + int targetdim = -1; + + public: + + h1hexahedron(int td) { targetdim = td; }; // -1 for h1 + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 1; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); + + // If 'isorientationdependent' is false then the assembly can + // be carried out without taking care of the element orientation. + // This provides an assembly speedup. + bool isorientationdependent(int order) { return (targetdim == -1 && order > 2); }; +}; + +#endif diff --git a/include/h1line.h b/include/h1line.h new file mode 100644 index 00000000..675bc267 --- /dev/null +++ b/include/h1line.h @@ -0,0 +1,47 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// The following form functions have been derived in the PhD thesis +// "High Order Finite Element Methods for Electromagnetic Field Computation" +// of Dr. Sabine Zaglmayr at JOHANNES KEPLER UNIVERSITAET LINZ, AUSTRIA + +#ifndef H1LINE_H +#define H1LINE_H + +#include "hierarchicalformfunction.h" + +class h1line: public hierarchicalformfunction +{ + private: + + int targetdim = -1; + + public: + + h1line(int td) { targetdim = td; }; // -1 for h1 + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 1; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); + + // If 'isorientationdependent' is false then the assembly can + // be carried out without taking care of the element orientation. + // This provides an assembly speedup. + bool isorientationdependent(int order) { return (targetdim == -1 && order > 2); }; +}; + +#endif diff --git a/include/h1point.h b/include/h1point.h new file mode 100644 index 00000000..5e7743d7 --- /dev/null +++ b/include/h1point.h @@ -0,0 +1,43 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef H1POINT_H +#define H1POINT_H + +#include "hierarchicalformfunction.h" + +class h1point: public hierarchicalformfunction +{ + private: + + int targetdim = -1; + + public: + + h1point(int td) { targetdim = td; }; // -1 for h1 + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 1; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); + + // If 'isorientationdependent' is false then the assembly can + // be carried out without taking care of the element orientation. + // This provides an assembly speedup. + bool isorientationdependent(int order) { return false; }; +}; + +#endif diff --git a/include/h1prism.h b/include/h1prism.h new file mode 100644 index 00000000..d62954bd --- /dev/null +++ b/include/h1prism.h @@ -0,0 +1,47 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// The following form functions have been derived in the PhD thesis +// "High Order Finite Element Methods for Electromagnetic Field Computation" +// of Dr. Sabine Zaglmayr at JOHANNES KEPLER UNIVERSITAET LINZ, AUSTRIA + +#ifndef H1PRISM_H +#define H1PRISM_H + +#include "hierarchicalformfunction.h" + +class h1prism: public hierarchicalformfunction +{ + private: + + int targetdim = -1; + + public: + + h1prism(int td) { targetdim = td; }; // -1 for h1 + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 1; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); + + // If 'isorientationdependent' is false then the assembly can + // be carried out without taking care of the element orientation. + // This provides an assembly speedup. + bool isorientationdependent(int order) { return (targetdim == -1 && order > 2); }; +}; + +#endif diff --git a/include/h1pyramid.h b/include/h1pyramid.h new file mode 100644 index 00000000..ec493cc3 --- /dev/null +++ b/include/h1pyramid.h @@ -0,0 +1,38 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef H1PYRAMID_H +#define H1PYRAMID_H + +#include "hierarchicalformfunction.h" + +class h1pyramid: public hierarchicalformfunction +{ + private: + + int targetdim = -1; + + public: + + h1pyramid(int td) { targetdim = td; }; // -1 for h1 + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 1; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); +}; + +#endif diff --git a/include/h1quadrangle.h b/include/h1quadrangle.h new file mode 100644 index 00000000..56a2fe00 --- /dev/null +++ b/include/h1quadrangle.h @@ -0,0 +1,47 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// The following form functions have been derived in the PhD thesis +// "High Order Finite Element Methods for Electromagnetic Field Computation" +// of Dr. Sabine Zaglmayr at JOHANNES KEPLER UNIVERSITAET LINZ, AUSTRIA + +#ifndef H1QUADRANGLE_H +#define H1QUADRANGLE_H + +#include "hierarchicalformfunction.h" + +class h1quadrangle: public hierarchicalformfunction +{ + private: + + int targetdim = -1; + + public: + + h1quadrangle(int td) { targetdim = td; }; // -1 for h1 + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 1; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); + + // If 'isorientationdependent' is false then the assembly can + // be carried out without taking care of the element orientation. + // This provides an assembly speedup. + bool isorientationdependent(int order) { return (targetdim == -1 && order > 2); }; +}; + +#endif diff --git a/include/h1tetrahedron.h b/include/h1tetrahedron.h new file mode 100644 index 00000000..1e996783 --- /dev/null +++ b/include/h1tetrahedron.h @@ -0,0 +1,47 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// The following form functions have been derived in the PhD thesis +// "High Order Finite Element Methods for Electromagnetic Field Computation" +// of Dr. Sabine Zaglmayr at JOHANNES KEPLER UNIVERSITAET LINZ, AUSTRIA + +#ifndef H1TETRAHEDRON_H +#define H1TETRAHEDRON_H + +#include "hierarchicalformfunction.h" + +class h1tetrahedron: public hierarchicalformfunction +{ + private: + + int targetdim = -1; + + public: + + h1tetrahedron(int td) { targetdim = td; }; // -1 for h1 + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 1; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); + + // If 'isorientationdependent' is false then the assembly can + // be carried out without taking care of the element orientation. + // This provides an assembly speedup. + bool isorientationdependent(int order) { return (targetdim == -1 && order > 2); }; +}; + +#endif diff --git a/include/h1triangle.h b/include/h1triangle.h new file mode 100644 index 00000000..91ace8e8 --- /dev/null +++ b/include/h1triangle.h @@ -0,0 +1,47 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// The following form functions have been derived in the PhD thesis +// "High Order Finite Element Methods for Electromagnetic Field Computation" +// of Dr. Sabine Zaglmayr at JOHANNES KEPLER UNIVERSITAET LINZ, AUSTRIA + +#ifndef H1TRIANGLE_H +#define H1TRIANGLE_H + +#include "hierarchicalformfunction.h" + +class h1triangle: public hierarchicalformfunction +{ + private: + + int targetdim = -1; + + public: + + h1triangle(int td) { targetdim = td; }; // -1 for h1 + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 1; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); + + // If 'isorientationdependent' is false then the assembly can + // be carried out without taking care of the element orientation. + // This provides an assembly speedup. + bool isorientationdependent(int order) { return (targetdim == -1 && order > 2); }; +}; + +#endif diff --git a/src/harmonic.h b/include/harmonic.h old mode 100755 new mode 100644 similarity index 100% rename from src/harmonic.h rename to include/harmonic.h diff --git a/src/shapefunction/hierarchical/hcurl/hcurlhexahedron.h b/include/hcurl/hcurlhexahedron.h similarity index 100% rename from src/shapefunction/hierarchical/hcurl/hcurlhexahedron.h rename to include/hcurl/hcurlhexahedron.h diff --git a/src/shapefunction/hierarchical/hcurl/hcurlline.h b/include/hcurl/hcurlline.h similarity index 100% rename from src/shapefunction/hierarchical/hcurl/hcurlline.h rename to include/hcurl/hcurlline.h diff --git a/src/shapefunction/hierarchical/hcurl/hcurlpoint.h b/include/hcurl/hcurlpoint.h similarity index 100% rename from src/shapefunction/hierarchical/hcurl/hcurlpoint.h rename to include/hcurl/hcurlpoint.h diff --git a/src/shapefunction/hierarchical/hcurl/hcurlprism.h b/include/hcurl/hcurlprism.h similarity index 100% rename from src/shapefunction/hierarchical/hcurl/hcurlprism.h rename to include/hcurl/hcurlprism.h diff --git a/src/shapefunction/hierarchical/hcurl/hcurlpyramid.h b/include/hcurl/hcurlpyramid.h old mode 100755 new mode 100644 similarity index 100% rename from src/shapefunction/hierarchical/hcurl/hcurlpyramid.h rename to include/hcurl/hcurlpyramid.h diff --git a/src/shapefunction/hierarchical/hcurl/hcurlquadrangle.h b/include/hcurl/hcurlquadrangle.h similarity index 100% rename from src/shapefunction/hierarchical/hcurl/hcurlquadrangle.h rename to include/hcurl/hcurlquadrangle.h diff --git a/src/shapefunction/hierarchical/hcurl/hcurltetrahedron.h b/include/hcurl/hcurltetrahedron.h similarity index 100% rename from src/shapefunction/hierarchical/hcurl/hcurltetrahedron.h rename to include/hcurl/hcurltetrahedron.h diff --git a/src/shapefunction/hierarchical/hcurl/hcurltriangle.h b/include/hcurl/hcurltriangle.h similarity index 100% rename from src/shapefunction/hierarchical/hcurl/hcurltriangle.h rename to include/hcurl/hcurltriangle.h diff --git a/include/hcurlhexahedron.h b/include/hcurlhexahedron.h new file mode 100644 index 00000000..39a55496 --- /dev/null +++ b/include/hcurlhexahedron.h @@ -0,0 +1,42 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// The following form functions have been derived in the PhD thesis +// "High Order Finite Element Methods for Electromagnetic Field Computation" +// of Dr. Sabine Zaglmayr at JOHANNES KEPLER UNIVERSITAET LINZ, AUSTRIA + +#ifndef HCURLHEXAHEDRON_H +#define HCURLHEXAHEDRON_H + +#include "hierarchicalformfunction.h" + +class hcurlhexahedron: public hierarchicalformfunction +{ + private: + + public: + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 3; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); + + // Return a vector whose index i is true if the ith form function + // associated to highest dimension elements is of gradient type. + std::vector isgradienttype(int order); +}; + +#endif diff --git a/include/hcurlline.h b/include/hcurlline.h new file mode 100644 index 00000000..7e3cd904 --- /dev/null +++ b/include/hcurlline.h @@ -0,0 +1,42 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// The following form functions have been derived in the PhD thesis +// "High Order Finite Element Methods for Electromagnetic Field Computation" +// of Dr. Sabine Zaglmayr at JOHANNES KEPLER UNIVERSITAET LINZ, AUSTRIA + +#ifndef HCURLLINE_H +#define HCURLLINE_H + +#include "hierarchicalformfunction.h" + +class hcurlline: public hierarchicalformfunction +{ + private: + + public: + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 3; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); + + // Return a vector whose index i is true if the ith form function + // associated to highest dimension elements is of gradient type. + std::vector isgradienttype(int order); +}; + +#endif diff --git a/include/hcurlpoint.h b/include/hcurlpoint.h new file mode 100644 index 00000000..2226d9de --- /dev/null +++ b/include/hcurlpoint.h @@ -0,0 +1,34 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef HCURLPOINT_H +#define HCURLPOINT_H + +#include "hierarchicalformfunction.h" + +class hcurlpoint: public hierarchicalformfunction +{ + private: + + public: + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 3; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); +}; + +#endif diff --git a/include/hcurlprism.h b/include/hcurlprism.h new file mode 100644 index 00000000..7203e961 --- /dev/null +++ b/include/hcurlprism.h @@ -0,0 +1,42 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// The following form functions have been derived in the PhD thesis +// "High Order Finite Element Methods for Electromagnetic Field Computation" +// of Dr. Sabine Zaglmayr at JOHANNES KEPLER UNIVERSITAET LINZ, AUSTRIA + +#ifndef HCURLPRISM_H +#define HCURLPRISM_H + +#include "hierarchicalformfunction.h" + +class hcurlprism: public hierarchicalformfunction +{ + private: + + public: + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 3; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); + + // Return a vector whose index i is true if the ith form function + // associated to highest dimension elements is of gradient type. + std::vector isgradienttype(int order); +}; + +#endif diff --git a/include/hcurlpyramid.h b/include/hcurlpyramid.h new file mode 100644 index 00000000..baa0f5be --- /dev/null +++ b/include/hcurlpyramid.h @@ -0,0 +1,34 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef HCURLPYRAMID_H +#define HCURLPYRAMID_H + +#include "hierarchicalformfunction.h" + +class hcurlpyramid: public hierarchicalformfunction +{ + private: + + public: + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 3; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); +}; + +#endif diff --git a/include/hcurlquadrangle.h b/include/hcurlquadrangle.h new file mode 100644 index 00000000..0e5980cd --- /dev/null +++ b/include/hcurlquadrangle.h @@ -0,0 +1,42 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// The following form functions have been derived in the PhD thesis +// "High Order Finite Element Methods for Electromagnetic Field Computation" +// of Dr. Sabine Zaglmayr at JOHANNES KEPLER UNIVERSITAET LINZ, AUSTRIA + +#ifndef HCURLQUADRANGLE_H +#define HCURLQUADRANGLE_H + +#include "hierarchicalformfunction.h" + +class hcurlquadrangle: public hierarchicalformfunction +{ + private: + + public: + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 3; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); + + // Return a vector whose index i is true if the ith form function + // associated to highest dimension elements is of gradient type. + std::vector isgradienttype(int order); +}; + +#endif diff --git a/include/hcurltetrahedron.h b/include/hcurltetrahedron.h new file mode 100644 index 00000000..840877ac --- /dev/null +++ b/include/hcurltetrahedron.h @@ -0,0 +1,42 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// The following form functions have been derived in the PhD thesis +// "High Order Finite Element Methods for Electromagnetic Field Computation" +// of Dr. Sabine Zaglmayr at JOHANNES KEPLER UNIVERSITAET LINZ, AUSTRIA + +#ifndef HCURLTETRAHEDRON_H +#define HCURLTETRAHEDRON_H + +#include "hierarchicalformfunction.h" + +class hcurltetrahedron: public hierarchicalformfunction +{ + private: + + public: + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 3; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); + + // Return a vector whose index i is true if the ith form function + // associated to highest dimension elements is of gradient type. + std::vector isgradienttype(int order); +}; + +#endif diff --git a/include/hcurltriangle.h b/include/hcurltriangle.h new file mode 100644 index 00000000..c660714c --- /dev/null +++ b/include/hcurltriangle.h @@ -0,0 +1,42 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// The following form functions have been derived in the PhD thesis +// "High Order Finite Element Methods for Electromagnetic Field Computation" +// of Dr. Sabine Zaglmayr at JOHANNES KEPLER UNIVERSITAET LINZ, AUSTRIA + +#ifndef HCURLTRIANGLE_H +#define HCURLTRIANGLE_H + +#include "hierarchicalformfunction.h" + +class hcurltriangle: public hierarchicalformfunction +{ + private: + + public: + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 3; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); + + // Return a vector whose index i is true if the ith form function + // associated to highest dimension elements is of gradient type. + std::vector isgradienttype(int order); +}; + +#endif diff --git a/include/hierarchical/h1/h1hexahedron.h b/include/hierarchical/h1/h1hexahedron.h new file mode 100644 index 00000000..ce4712d5 --- /dev/null +++ b/include/hierarchical/h1/h1hexahedron.h @@ -0,0 +1,47 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// The following form functions have been derived in the PhD thesis +// "High Order Finite Element Methods for Electromagnetic Field Computation" +// of Dr. Sabine Zaglmayr at JOHANNES KEPLER UNIVERSITAET LINZ, AUSTRIA + +#ifndef H1HEXAHEDRON_H +#define H1HEXAHEDRON_H + +#include "hierarchicalformfunction.h" + +class h1hexahedron: public hierarchicalformfunction +{ + private: + + int targetdim = -1; + + public: + + h1hexahedron(int td) { targetdim = td; }; // -1 for h1 + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 1; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); + + // If 'isorientationdependent' is false then the assembly can + // be carried out without taking care of the element orientation. + // This provides an assembly speedup. + bool isorientationdependent(int order) { return (targetdim == -1 && order > 2); }; +}; + +#endif diff --git a/include/hierarchical/h1/h1line.h b/include/hierarchical/h1/h1line.h new file mode 100644 index 00000000..675bc267 --- /dev/null +++ b/include/hierarchical/h1/h1line.h @@ -0,0 +1,47 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// The following form functions have been derived in the PhD thesis +// "High Order Finite Element Methods for Electromagnetic Field Computation" +// of Dr. Sabine Zaglmayr at JOHANNES KEPLER UNIVERSITAET LINZ, AUSTRIA + +#ifndef H1LINE_H +#define H1LINE_H + +#include "hierarchicalformfunction.h" + +class h1line: public hierarchicalformfunction +{ + private: + + int targetdim = -1; + + public: + + h1line(int td) { targetdim = td; }; // -1 for h1 + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 1; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); + + // If 'isorientationdependent' is false then the assembly can + // be carried out without taking care of the element orientation. + // This provides an assembly speedup. + bool isorientationdependent(int order) { return (targetdim == -1 && order > 2); }; +}; + +#endif diff --git a/include/hierarchical/h1/h1point.h b/include/hierarchical/h1/h1point.h new file mode 100644 index 00000000..5e7743d7 --- /dev/null +++ b/include/hierarchical/h1/h1point.h @@ -0,0 +1,43 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef H1POINT_H +#define H1POINT_H + +#include "hierarchicalformfunction.h" + +class h1point: public hierarchicalformfunction +{ + private: + + int targetdim = -1; + + public: + + h1point(int td) { targetdim = td; }; // -1 for h1 + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 1; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); + + // If 'isorientationdependent' is false then the assembly can + // be carried out without taking care of the element orientation. + // This provides an assembly speedup. + bool isorientationdependent(int order) { return false; }; +}; + +#endif diff --git a/include/hierarchical/h1/h1prism.h b/include/hierarchical/h1/h1prism.h new file mode 100644 index 00000000..d62954bd --- /dev/null +++ b/include/hierarchical/h1/h1prism.h @@ -0,0 +1,47 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// The following form functions have been derived in the PhD thesis +// "High Order Finite Element Methods for Electromagnetic Field Computation" +// of Dr. Sabine Zaglmayr at JOHANNES KEPLER UNIVERSITAET LINZ, AUSTRIA + +#ifndef H1PRISM_H +#define H1PRISM_H + +#include "hierarchicalformfunction.h" + +class h1prism: public hierarchicalformfunction +{ + private: + + int targetdim = -1; + + public: + + h1prism(int td) { targetdim = td; }; // -1 for h1 + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 1; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); + + // If 'isorientationdependent' is false then the assembly can + // be carried out without taking care of the element orientation. + // This provides an assembly speedup. + bool isorientationdependent(int order) { return (targetdim == -1 && order > 2); }; +}; + +#endif diff --git a/include/hierarchical/h1/h1pyramid.h b/include/hierarchical/h1/h1pyramid.h new file mode 100644 index 00000000..ec493cc3 --- /dev/null +++ b/include/hierarchical/h1/h1pyramid.h @@ -0,0 +1,38 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef H1PYRAMID_H +#define H1PYRAMID_H + +#include "hierarchicalformfunction.h" + +class h1pyramid: public hierarchicalformfunction +{ + private: + + int targetdim = -1; + + public: + + h1pyramid(int td) { targetdim = td; }; // -1 for h1 + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 1; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); +}; + +#endif diff --git a/include/hierarchical/h1/h1quadrangle.h b/include/hierarchical/h1/h1quadrangle.h new file mode 100644 index 00000000..56a2fe00 --- /dev/null +++ b/include/hierarchical/h1/h1quadrangle.h @@ -0,0 +1,47 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// The following form functions have been derived in the PhD thesis +// "High Order Finite Element Methods for Electromagnetic Field Computation" +// of Dr. Sabine Zaglmayr at JOHANNES KEPLER UNIVERSITAET LINZ, AUSTRIA + +#ifndef H1QUADRANGLE_H +#define H1QUADRANGLE_H + +#include "hierarchicalformfunction.h" + +class h1quadrangle: public hierarchicalformfunction +{ + private: + + int targetdim = -1; + + public: + + h1quadrangle(int td) { targetdim = td; }; // -1 for h1 + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 1; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); + + // If 'isorientationdependent' is false then the assembly can + // be carried out without taking care of the element orientation. + // This provides an assembly speedup. + bool isorientationdependent(int order) { return (targetdim == -1 && order > 2); }; +}; + +#endif diff --git a/include/hierarchical/h1/h1tetrahedron.h b/include/hierarchical/h1/h1tetrahedron.h new file mode 100644 index 00000000..1e996783 --- /dev/null +++ b/include/hierarchical/h1/h1tetrahedron.h @@ -0,0 +1,47 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// The following form functions have been derived in the PhD thesis +// "High Order Finite Element Methods for Electromagnetic Field Computation" +// of Dr. Sabine Zaglmayr at JOHANNES KEPLER UNIVERSITAET LINZ, AUSTRIA + +#ifndef H1TETRAHEDRON_H +#define H1TETRAHEDRON_H + +#include "hierarchicalformfunction.h" + +class h1tetrahedron: public hierarchicalformfunction +{ + private: + + int targetdim = -1; + + public: + + h1tetrahedron(int td) { targetdim = td; }; // -1 for h1 + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 1; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); + + // If 'isorientationdependent' is false then the assembly can + // be carried out without taking care of the element orientation. + // This provides an assembly speedup. + bool isorientationdependent(int order) { return (targetdim == -1 && order > 2); }; +}; + +#endif diff --git a/include/hierarchical/h1/h1triangle.h b/include/hierarchical/h1/h1triangle.h new file mode 100644 index 00000000..91ace8e8 --- /dev/null +++ b/include/hierarchical/h1/h1triangle.h @@ -0,0 +1,47 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// The following form functions have been derived in the PhD thesis +// "High Order Finite Element Methods for Electromagnetic Field Computation" +// of Dr. Sabine Zaglmayr at JOHANNES KEPLER UNIVERSITAET LINZ, AUSTRIA + +#ifndef H1TRIANGLE_H +#define H1TRIANGLE_H + +#include "hierarchicalformfunction.h" + +class h1triangle: public hierarchicalformfunction +{ + private: + + int targetdim = -1; + + public: + + h1triangle(int td) { targetdim = td; }; // -1 for h1 + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 1; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); + + // If 'isorientationdependent' is false then the assembly can + // be carried out without taking care of the element orientation. + // This provides an assembly speedup. + bool isorientationdependent(int order) { return (targetdim == -1 && order > 2); }; +}; + +#endif diff --git a/include/hierarchical/hcurl/hcurlhexahedron.h b/include/hierarchical/hcurl/hcurlhexahedron.h new file mode 100644 index 00000000..39a55496 --- /dev/null +++ b/include/hierarchical/hcurl/hcurlhexahedron.h @@ -0,0 +1,42 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// The following form functions have been derived in the PhD thesis +// "High Order Finite Element Methods for Electromagnetic Field Computation" +// of Dr. Sabine Zaglmayr at JOHANNES KEPLER UNIVERSITAET LINZ, AUSTRIA + +#ifndef HCURLHEXAHEDRON_H +#define HCURLHEXAHEDRON_H + +#include "hierarchicalformfunction.h" + +class hcurlhexahedron: public hierarchicalformfunction +{ + private: + + public: + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 3; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); + + // Return a vector whose index i is true if the ith form function + // associated to highest dimension elements is of gradient type. + std::vector isgradienttype(int order); +}; + +#endif diff --git a/include/hierarchical/hcurl/hcurlline.h b/include/hierarchical/hcurl/hcurlline.h new file mode 100644 index 00000000..7e3cd904 --- /dev/null +++ b/include/hierarchical/hcurl/hcurlline.h @@ -0,0 +1,42 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// The following form functions have been derived in the PhD thesis +// "High Order Finite Element Methods for Electromagnetic Field Computation" +// of Dr. Sabine Zaglmayr at JOHANNES KEPLER UNIVERSITAET LINZ, AUSTRIA + +#ifndef HCURLLINE_H +#define HCURLLINE_H + +#include "hierarchicalformfunction.h" + +class hcurlline: public hierarchicalformfunction +{ + private: + + public: + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 3; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); + + // Return a vector whose index i is true if the ith form function + // associated to highest dimension elements is of gradient type. + std::vector isgradienttype(int order); +}; + +#endif diff --git a/include/hierarchical/hcurl/hcurlpoint.h b/include/hierarchical/hcurl/hcurlpoint.h new file mode 100644 index 00000000..2226d9de --- /dev/null +++ b/include/hierarchical/hcurl/hcurlpoint.h @@ -0,0 +1,34 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef HCURLPOINT_H +#define HCURLPOINT_H + +#include "hierarchicalformfunction.h" + +class hcurlpoint: public hierarchicalformfunction +{ + private: + + public: + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 3; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); +}; + +#endif diff --git a/include/hierarchical/hcurl/hcurlprism.h b/include/hierarchical/hcurl/hcurlprism.h new file mode 100644 index 00000000..7203e961 --- /dev/null +++ b/include/hierarchical/hcurl/hcurlprism.h @@ -0,0 +1,42 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// The following form functions have been derived in the PhD thesis +// "High Order Finite Element Methods for Electromagnetic Field Computation" +// of Dr. Sabine Zaglmayr at JOHANNES KEPLER UNIVERSITAET LINZ, AUSTRIA + +#ifndef HCURLPRISM_H +#define HCURLPRISM_H + +#include "hierarchicalformfunction.h" + +class hcurlprism: public hierarchicalformfunction +{ + private: + + public: + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 3; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); + + // Return a vector whose index i is true if the ith form function + // associated to highest dimension elements is of gradient type. + std::vector isgradienttype(int order); +}; + +#endif diff --git a/include/hierarchical/hcurl/hcurlpyramid.h b/include/hierarchical/hcurl/hcurlpyramid.h new file mode 100644 index 00000000..baa0f5be --- /dev/null +++ b/include/hierarchical/hcurl/hcurlpyramid.h @@ -0,0 +1,34 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef HCURLPYRAMID_H +#define HCURLPYRAMID_H + +#include "hierarchicalformfunction.h" + +class hcurlpyramid: public hierarchicalformfunction +{ + private: + + public: + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 3; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); +}; + +#endif diff --git a/include/hierarchical/hcurl/hcurlquadrangle.h b/include/hierarchical/hcurl/hcurlquadrangle.h new file mode 100644 index 00000000..0e5980cd --- /dev/null +++ b/include/hierarchical/hcurl/hcurlquadrangle.h @@ -0,0 +1,42 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// The following form functions have been derived in the PhD thesis +// "High Order Finite Element Methods for Electromagnetic Field Computation" +// of Dr. Sabine Zaglmayr at JOHANNES KEPLER UNIVERSITAET LINZ, AUSTRIA + +#ifndef HCURLQUADRANGLE_H +#define HCURLQUADRANGLE_H + +#include "hierarchicalformfunction.h" + +class hcurlquadrangle: public hierarchicalformfunction +{ + private: + + public: + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 3; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); + + // Return a vector whose index i is true if the ith form function + // associated to highest dimension elements is of gradient type. + std::vector isgradienttype(int order); +}; + +#endif diff --git a/include/hierarchical/hcurl/hcurltetrahedron.h b/include/hierarchical/hcurl/hcurltetrahedron.h new file mode 100644 index 00000000..840877ac --- /dev/null +++ b/include/hierarchical/hcurl/hcurltetrahedron.h @@ -0,0 +1,42 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// The following form functions have been derived in the PhD thesis +// "High Order Finite Element Methods for Electromagnetic Field Computation" +// of Dr. Sabine Zaglmayr at JOHANNES KEPLER UNIVERSITAET LINZ, AUSTRIA + +#ifndef HCURLTETRAHEDRON_H +#define HCURLTETRAHEDRON_H + +#include "hierarchicalformfunction.h" + +class hcurltetrahedron: public hierarchicalformfunction +{ + private: + + public: + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 3; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); + + // Return a vector whose index i is true if the ith form function + // associated to highest dimension elements is of gradient type. + std::vector isgradienttype(int order); +}; + +#endif diff --git a/include/hierarchical/hcurl/hcurltriangle.h b/include/hierarchical/hcurl/hcurltriangle.h new file mode 100644 index 00000000..c660714c --- /dev/null +++ b/include/hierarchical/hcurl/hcurltriangle.h @@ -0,0 +1,42 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// The following form functions have been derived in the PhD thesis +// "High Order Finite Element Methods for Electromagnetic Field Computation" +// of Dr. Sabine Zaglmayr at JOHANNES KEPLER UNIVERSITAET LINZ, AUSTRIA + +#ifndef HCURLTRIANGLE_H +#define HCURLTRIANGLE_H + +#include "hierarchicalformfunction.h" + +class hcurltriangle: public hierarchicalformfunction +{ + private: + + public: + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 3; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); + + // Return a vector whose index i is true if the ith form function + // associated to highest dimension elements is of gradient type. + std::vector isgradienttype(int order); +}; + +#endif diff --git a/src/shapefunction/hierarchical/hierarchicalformfunction.h b/include/hierarchical/hierarchicalformfunction.h old mode 100755 new mode 100644 similarity index 100% rename from src/shapefunction/hierarchical/hierarchicalformfunction.h rename to include/hierarchical/hierarchicalformfunction.h diff --git a/src/shapefunction/hierarchical/hierarchicalformfunctioncontainer.h b/include/hierarchical/hierarchicalformfunctioncontainer.h old mode 100755 new mode 100644 similarity index 100% rename from src/shapefunction/hierarchical/hierarchicalformfunctioncontainer.h rename to include/hierarchical/hierarchicalformfunctioncontainer.h diff --git a/src/shapefunction/hierarchical/hierarchicalformfunctioniterator.h b/include/hierarchical/hierarchicalformfunctioniterator.h old mode 100755 new mode 100644 similarity index 100% rename from src/shapefunction/hierarchical/hierarchicalformfunctioniterator.h rename to include/hierarchical/hierarchicalformfunctioniterator.h diff --git a/src/shapefunction/hierarchical/legendre.h b/include/hierarchical/legendre.h old mode 100755 new mode 100644 similarity index 100% rename from src/shapefunction/hierarchical/legendre.h rename to include/hierarchical/legendre.h diff --git a/src/shapefunction/hierarchical/oneconstant.h b/include/hierarchical/oneconstant.h old mode 100755 new mode 100644 similarity index 100% rename from src/shapefunction/hierarchical/oneconstant.h rename to include/hierarchical/oneconstant.h diff --git a/src/shapefunction/hierarchical/orientation.h b/include/hierarchical/orientation.h old mode 100755 new mode 100644 similarity index 100% rename from src/shapefunction/hierarchical/orientation.h rename to include/hierarchical/orientation.h diff --git a/src/shapefunction/hierarchical/selector.h b/include/hierarchical/selector.h old mode 100755 new mode 100644 similarity index 100% rename from src/shapefunction/hierarchical/selector.h rename to include/hierarchical/selector.h diff --git a/include/hierarchicalformfunction.h b/include/hierarchicalformfunction.h new file mode 100644 index 00000000..ec02a190 --- /dev/null +++ b/include/hierarchicalformfunction.h @@ -0,0 +1,61 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef HIERARCHICALFORMFUNCTION_H +#define HIERARCHICALFORMFUNCTION_H + +#include "math.h" +#include +#include "orientation.h" +#include "element.h" +#include "legendre.h" +#include "polynomial.h" +#include +#include +#include "hierarchicalformfunctioncontainer.h" + +class hierarchicalformfunction +{ + private: + + // List all form function type names (type numbers are defined by the name ordering): + std::vector mytypenames = {"h1","hcurl","one0","one1","one2","one3","h1d0","h1d1","h1d2","h1d3"}; + + public: + + // Translate a form function type number to a type name and vice versa: + int gettypenumber(std::string fftypename); + std::string gettypename(int fftypenumber); + + // Get the minimum order allowed: + int getminorder(std::string fftypename); + + // Get the number of form functions of order <= 'order': + virtual int count(int order) { abort(); }; // fix return warning + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + virtual int count(int order, int dim, int num) { abort(); }; // fix return warning + + // Get the number of components in the form function. + virtual int countcomponents(void) { abort(); }; // fix return warning + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + virtual hierarchicalformfunctioncontainer evalat(int maxorder) { abort(); }; // fix return warning + + // If 'isorientationdependent' is false then the assembly can + // be carried out without taking care of the element orientation. + // This provides an assembly speedup. By default it is not used. + virtual bool isorientationdependent(int order) { return true; }; + + // Return a vector whose index i is true if the ith form function + // associated to highest dimension elements is of gradient type. + virtual std::vector isgradienttype(int order) { return std::vector(0); }; +}; + +#endif diff --git a/include/hierarchicalformfunctioncontainer.h b/include/hierarchicalformfunctioncontainer.h new file mode 100644 index 00000000..812983cd --- /dev/null +++ b/include/hierarchicalformfunctioncontainer.h @@ -0,0 +1,76 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef HIERARCHICALFORMFUNCTIONCONTAINER_H +#define HIERARCHICALFORMFUNCTIONCONTAINER_H + +#include +#include +#include +#include "densemat.h" +#include "polynomial.h" +#include "orientation.h" + +using namespace std; + +class hierarchicalformfunctioncontainer +{ + + private: + + std::string myformfunctiontypename; + int myelementtypenumber; + + std::vector myevaluationpoints = {}; + + // The values at evaluation points 'myevaluationpoints' of the hierarchical + // form functions are stored in the following format: + // + // 'val[h][i][j][k][l][m][n][o]' gives the value of the form function + // + // - specific to order h (i.e. order 0 is at index 0) + // - associated to nodes if i is 0, edges if 1, faces if 2 and volume if 3 + // - for node, edge, face or volume number j + // - for orientation k + // - number l + // - for derivative ki if m is 1, eta 2, phi 3, none 0 + // - at component n (0 for x, 1 for y and 2 for z) + // - evaluation point o + vector>>>>>>> val = {}; + + // The form function polynomials are stored in the same format but without [m] and [o]: + vector>>>>> ffpoly = {}; + + public: + + hierarchicalformfunctioncontainer(void) {}; + hierarchicalformfunctioncontainer(std::string formfunctiontypename, int elementtypenumber); + + // Know the highest order available in the container. + int gethighestorder(void) { return val.size()-1; }; + + // 'set' adds the form function polynomial to the ffpoly container. + // All other int arguments are the same as detailed for 'val' above. + // This function automatically preallocates the 'val' and 'ffpoly' containers. + void set(int h, int i, int j, int k, int l, int n, polynomial& poly); + + // Evaluate all form function polynomials at the evaluation points provided: + void evaluate(std::vector evaluationpoints); + + // 'tomatrix' puts all form function values corresponding to the + // input arguments into a 'densemat' object. The columns of the + // dense matrix correspond to the evaluation points while the rows + // correspond to all form functions. The form functions are ordered + // in the way defined in 'hierarchicalformfunctioniterator'. + densemat tomatrix(int totalorientation, int order, int whichderivative, int component); + densemat tomatrix(int h, int i, int j, int k, int l, int m, int n); + + // Print all form function values for debug. + void print(bool printallderivatives); + +}; + +#endif diff --git a/include/hierarchicalformfunctioniterator.h b/include/hierarchicalformfunctioniterator.h new file mode 100644 index 00000000..2de0759d --- /dev/null +++ b/include/hierarchicalformfunctioniterator.h @@ -0,0 +1,74 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// Hierarchical form functions are ordered as follows: +// +// 1. vertex based +// 2. edge based +// 3. face based +// 4. volume based +// +// In each category the form functions are then sorted according to the +// node, edge, face or volume on which they are defined. E.g. for the +// vertex based form functions we get first the form functions associated +// to node 1 then node 2, node 3,... +// On a given node, edge, face or volume the form functions are finally +// sorted with increasing order. + +#ifndef HIERARCHICALFORMFUNCTIONITERATOR_H +#define HIERARCHICALFORMFUNCTIONITERATOR_H + +#include +#include +#include +#include "element.h" +#include "hierarchicalformfunction.h" +#include +#include "selector.h" + + +class hierarchicalformfunctioniterator +{ + + private: + + std::shared_ptr myformfunction; + + int myelementtypenumber; + int myorder; + + // currentdimension is 0 for vertex based, 1 for edge, 2 for face and 3 for volume: + int currentdimension = 0; + // Which node/line/face/volume are we at? + int currentnodeedgefacevolumeindex = 0; + // The current form function index in the current node/edge/face/volume: + int currentformfunctionindexinnodeedgefacevolume = -1; + // The overall form function number: + int overallformfunctionindex = -1; + + public: + + hierarchicalformfunctioniterator(std::string formfunctiontypename, int elementtypenumber, int order); + + // Get the total number of form functions: + int count(void); + // 'next' moves to the next defined form function. + void next(void); + + int getdimension(void) { return currentdimension; }; + int getnodeedgefacevolumeindex(void) { return currentnodeedgefacevolumeindex; }; + int getformfunctionindexinnodeedgefacevolume(void) { return currentformfunctionindexinnodeedgefacevolume; }; + int getformfunctionindexincurrentorderinnodeedgefacevolume(void); + int getformfunctionorder(void); + int getassociatedelementtype(void); + int getoverallformfunctionindex(void) { return overallformfunctionindex; }; + + // Print info for the current form function. + void print(void); + +}; + +#endif diff --git a/src/mesh/htracker.h b/include/htracker.h old mode 100755 new mode 100644 similarity index 100% rename from src/mesh/htracker.h rename to include/htracker.h diff --git a/src/resolution/impliciteuler.h b/include/impliciteuler.h similarity index 100% rename from src/resolution/impliciteuler.h rename to include/impliciteuler.h diff --git a/src/indexmat.h b/include/indexmat.h old mode 100755 new mode 100644 similarity index 100% rename from src/indexmat.h rename to include/indexmat.h diff --git a/include/integration.h b/include/integration.h new file mode 100644 index 00000000..0d1d7e62 --- /dev/null +++ b/include/integration.h @@ -0,0 +1,62 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef INTEGRATION_H +#define INTEGRATION_H + +#include +#include +#include +#include "expression.h" + +class expression; + +class integration +{ + private: + + std::vector myexpression = {}; + // Empty if undefined: + std::vector mymeshdeform = {}; + + int myphysicalregion; + int myblocknumber; + int myintegrationorderdelta; + + int mynumcoefharms = -1; + + public: + + // Barycenter eval mode for a rhs term: + bool isbarycentereval = false; + + integration(void) {}; + + integration(int physreg, expression tointegrate, int integrationorderdelta = 0, int blocknumber = 0); + integration(int physreg, expression meshdeform, expression tointegrate, int integrationorderdelta = 0, int blocknumber = 0); + // For the multiharmonic computation an extra integer is required + // to know with how many harmonics the coef multiplying the tf + // and/or dof should be approximated. Set 'numcoefharms' to a + // negative integer and it will be as if you were calling + // the non multiharmonic functions above. + integration(int physreg, int numcoefharms, expression tointegrate, int integrationorderdelta = 0, int blocknumber = 0); + integration(int physreg, int numcoefharms, expression meshdeform, expression tointegrate, int integrationorderdelta = 0, int blocknumber = 0); + + expression getexpression(void); + bool ismeshdeformdefined(void) { return (mymeshdeform.size() == 1); }; + expression getmeshdeform(void); + + int getphysicalregion(void) { return myphysicalregion; }; + int getintegrationorderdelta(void) { return myintegrationorderdelta; }; + int getblocknumber(void) { return myblocknumber; }; + + bool isfftrequested(void) { return (mynumcoefharms > 0); }; + int getnumberofcoefharms(void) { return mynumcoefharms; }; + + void print(void); +}; + +#endif diff --git a/include/io/gmsh/gmshinterface.h b/include/io/gmsh/gmshinterface.h new file mode 100644 index 00000000..db4b1c7e --- /dev/null +++ b/include/io/gmsh/gmshinterface.h @@ -0,0 +1,61 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef GMSHINTERFACE_H +#define GMSHINTERFACE_H + +#include +#include "nodes.h" +#include "elements.h" +#include "physicalregions.h" +#include "densemat.h" +#include +#include +#include +#include +#include +#include +#include "wallclock.h" +#include "physicalregion.h" +#include "element.h" +#include "mystring.h" +#include "polynomial.h" +#include "iodata.h" +#include "lagrangeformfunction.h" + +namespace gmshinterface +{ + // Load the mesh from the API to the 'nodes', 'elements' and 'physicalregions' objects. + void readfromapi(nodes&, elements&, physicalregions&); + void readwithapi(std::string name, nodes&, elements&, physicalregions&); + + // Load the .msh mesh to the 'nodes', 'elements' and 'physicalregions' objects. + void readfromfile(std::string name, nodes&, elements&, physicalregions&); + // Write to .msh mesh format: + void writetofile(std::string name, nodes&, elements&, physicalregions&, disjointregions&, std::vector physicalregionstowrite); + + // Write to .pos format: + void writetofile(std::string name, iodata datatowrite); + + // Write or append the header of a new view in the .pos file: + void openview(std::string name, std::string viewname, double timetag, bool overwrite); + // Write a scalar field to the current view in the .pos format: + void appendtoview(std::string name, int elementtypenumber, densemat coordx, densemat coordy, densemat coordz, densemat compxinterpolated); + // Write a vector field to the current view in the .pos format: + void appendtoview(std::string name, int elementtypenumber, densemat coordx, densemat coordy, densemat coordz, densemat compxinterpolated, densemat compyinterpolated, densemat compzinterpolated); + // Write poly.size() interpolation schemes in the current view in the .pos file: + void writeinterpolationscheme(std::string name, std::vector> poly); + // Close the current view in the .pos file: + void closeview(std::string name); + + // GMSH comes with its own element type numbering: we translate it to and from ours: + int convertgmshelementtypenumber(int gmshtypenumber); + int converttogmshelementtypenumber(int ourtypenumber); + + char getelementidentifierinposformat(int ourtypenumber); +}; + +#endif diff --git a/src/io/iodata.h b/include/io/iodata.h similarity index 100% rename from src/io/iodata.h rename to include/io/iodata.h diff --git a/src/io/iointerface.h b/include/io/iointerface.h old mode 100755 new mode 100644 similarity index 100% rename from src/io/iointerface.h rename to include/io/iointerface.h diff --git a/src/io/nastran/nasdataline.h b/include/io/nastran/nasdataline.h old mode 100755 new mode 100644 similarity index 100% rename from src/io/nastran/nasdataline.h rename to include/io/nastran/nasdataline.h diff --git a/src/io/nastran/nastraninterface.h b/include/io/nastran/nastraninterface.h old mode 100755 new mode 100644 similarity index 100% rename from src/io/nastran/nastraninterface.h rename to include/io/nastran/nastraninterface.h diff --git a/src/io/paraview/pvinterface.h b/include/io/paraview/pvinterface.h old mode 100755 new mode 100644 similarity index 100% rename from src/io/paraview/pvinterface.h rename to include/io/paraview/pvinterface.h diff --git a/include/iodata.h b/include/iodata.h new file mode 100644 index 00000000..a662f8ce --- /dev/null +++ b/include/iodata.h @@ -0,0 +1,83 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + +#ifndef IODATA_H +#define IODATA_H + +#include +#include +#include "densemat.h" +#include "element.h" + +class iodata +{ + + private: + + // Interpolation order for the field data and for the geometry: + int myinterpolorder; + int mygeointerpolorder; + + // Scalar or vector data (3 components): + bool isscalardata; + + // IN CASE OF MULTIPLE TIMESTEPS THE DATA BLOCKS BELOW ARE + // THE COLUMN-WISE CONCATENATION OF SINGLE-TIMESTEP DATA. + // IT IS ALLOWED TO PROVIDE THE COORDINATES AND/OR DATA FOR + // A SINGLE TIMESTEP. IN SUCH A CASE THE COORDINATES/DATA IS + // SUPPOSED CONSTANT OVER TIME. IN ANY CASE THE NUMBER OF + // TIMESTEPS PROVIDED MUST BE CONSISTENT ACROSS ALL INPUTS. + // + // Time vals in case of data at multiple timesteps. + std::vector mytimevals = {}; + + int numcoordtimestepsprovided = -1; + int numdatatimestepsprovided = -1; + + // Coordinates of the nodes at which to write the data. + // mycoords[xyz][i] gives the x, y or z coordinates for all elements of type i. + // Every row corresponds to a given element. Every column corresponds to a node in the element. + std::vector>> mycoords; + + // mydata[comp][i] gives the data at component 'comp' for all elements of type i. + // The data for scalars is at component 0. + std::vector>> mydata; + + // Combine the data in every element type: + void combine(void); + + public: + + iodata(int interpolorder, int geointerpolorder, bool isitscalardata, std::vector timevals); + + bool isscalar(void); + int getinterpolorder(void); + int getgeointerpolorder(void); + + // Get time tag: + std::vector gettimetags(void); + + // ALWAYS CHECK THAT THERE IS DATA FOR A GIVEN ELEMENT TYPE BEFORE REQUESTING IT: + bool ispopulated(int elemtypenum); + std::vector getactiveelementtypes(void); + + // Rows correspond to the elements. Columns correspond to the element nodes. + void addcoordinates(int elemtypenum, densemat xcoords, densemat ycoords, densemat zcoords); + // Add all components vals[comp] of the data: + void adddata(int elemtypenum, std::vector vals); + + int countcoordnodes(int elemtypenum); + int countcoordnodes(void); + int countelements(int elemtypenum); + int countelements(void); + + // Get the x, y and z coordinates of the nodes in all elements of a given type: + std::vector getcoordinates(int elemtypenum, int timestepindex = -1); + // Get all components of the data at the nodes in all elements of a given type: + std::vector getdata(int elemtypenum, int timestepindex = -1); + +}; + +#endif diff --git a/include/iointerface.h b/include/iointerface.h new file mode 100644 index 00000000..582e122a --- /dev/null +++ b/include/iointerface.h @@ -0,0 +1,40 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . +// +// Supported data output formats are: +// +// - GMSH .pos +// - ParaView .vtk +// - ParaView .vtu +// - ParaView .pvd + +#ifndef IOINTERFACE_H +#define IOINTERFACE_H + +#include +#include "iodata.h" +#include "petsc.h" +#include "petscvec.h" + +#include "gmshinterface.h" +#include "pvinterface.h" + +namespace iointerface +{ + void writetofile(std::string filename, iodata datatowrite, std::string appendtofilename = ""); + // The file format might allow only isoparametric elements: + bool isonlyisoparametric(std::string filename); + + // Group .vtu timestep files in a .pvd file: + void grouptimesteps(std::string filename, std::vector filestogroup, std::vector timevals); + + // Write first an int vector then a double vector to ASCII or binary format: + void write(std::string filename, std::vector& intdata, std::vector& doubledata, bool isbinary); + + // Read first an int vector then a double vector from ASCII or binary format: + void load(std::string filename, std::vector& intdata, std::vector& doubledata, bool isbinary); +}; + +#endif diff --git a/include/jacobian.h b/include/jacobian.h new file mode 100644 index 00000000..c904bc14 --- /dev/null +++ b/include/jacobian.h @@ -0,0 +1,73 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// This function computes (at the given Gauss points) the Jacobian of the +// variable change bringing back the mesh element to the reference element. +// If requested the calculations are carried out on the mesh deformed by +// the provided vector expression 'meshdeform'. The expression must be +// constant in time (harmonic 1). +// +// The Jacobian matrix is defined as follows: +// +// dx/dki dy/dki dz/dki +// dx/deta dy/deta dz/deta +// dx/dphi dy/dphi dz/dphi +// +// Its inverse therefore equals: +// +// dki/dx deta/dx dphi/dx +// dki/dy deta/dy dphi/dy +// dki/dz deta/dz dphi/dz +// + +#ifndef JACOBIAN_H +#define JACOBIAN_H + +#include +#include +#include +#include +#include "field.h" +#include "rawfield.h" +#include "expression.h" +#include "universe.h" +#include "densemat.h" +#include "elementselector.h" +#include "disjointregions.h" + +class field; +class expression; +class elementselector; + +class jacobian +{ + + private: + + densemat detjac, xcoord; + std::vector jac = std::vector(3*3); + std::vector invjac = {}; + + public: + + jacobian(void) {}; + + // The Jacobian is computed on the mesh deformed by vector expression + // 'meshdeform'. The expression must be constant in time (harmonic 1). + jacobian(elementselector& elemselect, std::vector evaluationcoordinates, expression* meshdeform); + + // Return a jacobian object holding an element subset of this jacobian: + jacobian extractsubset(std::vector& selectedelementindexes); + + // The detjac and jac terms are computed in the constructor. + densemat getdetjac(void); + densemat getjac(int row, int column); + // The invjac terms are only computed when 'getinvjac' is called. + densemat getinvjac(int row, int column); + +}; + +#endif diff --git a/src/shapefunction/lagrange/lagrangeformfunction.h b/include/lagrange/lagrangeformfunction.h old mode 100755 new mode 100644 similarity index 100% rename from src/shapefunction/lagrange/lagrangeformfunction.h rename to include/lagrange/lagrangeformfunction.h diff --git a/src/shapefunction/lagrange/lagrangehexahedron.h b/include/lagrange/lagrangehexahedron.h old mode 100755 new mode 100644 similarity index 100% rename from src/shapefunction/lagrange/lagrangehexahedron.h rename to include/lagrange/lagrangehexahedron.h diff --git a/src/shapefunction/lagrange/lagrangeline.h b/include/lagrange/lagrangeline.h old mode 100755 new mode 100644 similarity index 100% rename from src/shapefunction/lagrange/lagrangeline.h rename to include/lagrange/lagrangeline.h diff --git a/src/shapefunction/lagrange/lagrangepoint.h b/include/lagrange/lagrangepoint.h old mode 100755 new mode 100644 similarity index 100% rename from src/shapefunction/lagrange/lagrangepoint.h rename to include/lagrange/lagrangepoint.h diff --git a/src/shapefunction/lagrange/lagrangeprism.h b/include/lagrange/lagrangeprism.h old mode 100755 new mode 100644 similarity index 100% rename from src/shapefunction/lagrange/lagrangeprism.h rename to include/lagrange/lagrangeprism.h diff --git a/src/shapefunction/lagrange/lagrangepyramid.h b/include/lagrange/lagrangepyramid.h old mode 100755 new mode 100644 similarity index 100% rename from src/shapefunction/lagrange/lagrangepyramid.h rename to include/lagrange/lagrangepyramid.h diff --git a/src/shapefunction/lagrange/lagrangequadrangle.h b/include/lagrange/lagrangequadrangle.h old mode 100755 new mode 100644 similarity index 100% rename from src/shapefunction/lagrange/lagrangequadrangle.h rename to include/lagrange/lagrangequadrangle.h diff --git a/src/shapefunction/lagrange/lagrangetetrahedron.h b/include/lagrange/lagrangetetrahedron.h old mode 100755 new mode 100644 similarity index 100% rename from src/shapefunction/lagrange/lagrangetetrahedron.h rename to include/lagrange/lagrangetetrahedron.h diff --git a/src/shapefunction/lagrange/lagrangetriangle.h b/include/lagrange/lagrangetriangle.h old mode 100755 new mode 100644 similarity index 100% rename from src/shapefunction/lagrange/lagrangetriangle.h rename to include/lagrange/lagrangetriangle.h diff --git a/include/lagrangeformfunction.h b/include/lagrangeformfunction.h new file mode 100644 index 00000000..cc7c5948 --- /dev/null +++ b/include/lagrangeformfunction.h @@ -0,0 +1,77 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef LAGRANGEFORMFUNCTION_H +#define LAGRANGEFORMFUNCTION_H + +#include +#include +#include "densemat.h" +#include "polynomial.h" +#include "element.h" +#include +#include "universe.h" + +#include "lagrangepoint.h" +#include "lagrangeline.h" +#include "lagrangetriangle.h" +#include "lagrangequadrangle.h" +#include "lagrangetetrahedron.h" +#include "lagrangehexahedron.h" +#include "lagrangeprism.h" +#include "lagrangepyramid.h" + + +class lagrangeformfunction +{ + private: + + int myorder; + int myelementtypenumber; + std::vector myevaluationpoints; + + std::vector mynodecoordinates = {}; + std::vector myformfunctionpolynomials = {}; + + // In the following dense matrices there is a row per Lagrange + // form function and a column per evaluation point. + // evaluated[i] stores the value of the Lagrange form functions: + // - without derivative for i = 0 + // - with ki derivative for i = 1 + // - with eta derivative for i = 2 + // - with phi derivative for i = 3 + std::vector evaluated = std::vector(4); + + // Make the Lagrange polynomials/coordinates available: + void preparepoly(void); + void preparecoords(void); + + public: + + lagrangeformfunction(void) {}; + + // The constructor takes the element type number, the form function + // order and the coordinates of the evaluation points as input. + // They are set once and for all for a given object. + // Format is [ki1 eta1 phi1 ki2 eta2 phi2 ki3 ...]. + lagrangeformfunction(int elementtypenumber, int order, const std::vector evaluationpoints); + + // getderivative gives the value of the Lagrange form functions: + // - without derivative for whichderivative = 0 + // - with ki derivative for whichderivative = 1 + // - with eta derivative for whichderivative = 2 + // - with phi derivative for whichderivative = 3 + // + // It outputs a copy of evaluated[whichderivative] if available. + densemat getderivative(int whichderivative); + + std::vector getnodecoordinates(void); + std::vector getformfunctionpolynomials(void); + + void print(void); +}; + +#endif diff --git a/include/lagrangehexahedron.h b/include/lagrangehexahedron.h new file mode 100644 index 00000000..3456a619 --- /dev/null +++ b/include/lagrangehexahedron.h @@ -0,0 +1,25 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef LAGRANGEHEXAHEDRON_H +#define LAGRANGEHEXAHEDRON_H + +#include +#include "polynomial.h" +#include "math.h" +#include "element.h" + + +namespace lagrangehexahedron +{ + // 'getnodecoordinates' gives the ki, eta and phi + // coordinates of every Lagrange node for the required order: + std::vector getnodecoordinates(int order); + // 'getformfunctionpolynomials' outputs a vector giving the form function polynomials: + std::vector getformfunctionpolynomials(int order); +} + +#endif diff --git a/include/lagrangeline.h b/include/lagrangeline.h new file mode 100644 index 00000000..2e48ec73 --- /dev/null +++ b/include/lagrangeline.h @@ -0,0 +1,25 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef LAGRANGELINE_H +#define LAGRANGELINE_H + +#include +#include "polynomial.h" +#include "math.h" +#include "element.h" + + +namespace lagrangeline +{ + // 'getnodecoordinates' gives the ki, eta and phi + // coordinates of every Lagrange node for the required order: + std::vector getnodecoordinates(int order); + // 'getformfunctionpolynomials' outputs a vector giving the form function polynomials: + std::vector getformfunctionpolynomials(int order); +} + +#endif diff --git a/include/lagrangepoint.h b/include/lagrangepoint.h new file mode 100644 index 00000000..34ecd1f9 --- /dev/null +++ b/include/lagrangepoint.h @@ -0,0 +1,25 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef LAGRANGEPOINT_H +#define LAGRANGEPOINT_H + +#include +#include "polynomial.h" +#include "math.h" +#include "element.h" + + +namespace lagrangepoint +{ + // 'getnodecoordinates' gives the ki, eta and phi + // coordinates of every Lagrange node for the required order: + std::vector getnodecoordinates(int order); + // 'getformfunctionpolynomials' outputs a vector giving the form function polynomials: + std::vector getformfunctionpolynomials(int order); +} + +#endif diff --git a/include/lagrangeprism.h b/include/lagrangeprism.h new file mode 100644 index 00000000..b64a3d4f --- /dev/null +++ b/include/lagrangeprism.h @@ -0,0 +1,25 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef LAGRANGEPRISM_H +#define LAGRANGEPRISM_H + +#include +#include "polynomial.h" +#include "math.h" +#include "element.h" + + +namespace lagrangeprism +{ + // 'getnodecoordinates' gives the ki, eta and phi + // coordinates of every Lagrange node for the required order: + std::vector getnodecoordinates(int order); + // 'getformfunctionpolynomials' outputs a vector giving the form function polynomials: + std::vector getformfunctionpolynomials(int order); +} + +#endif diff --git a/include/lagrangepyramid.h b/include/lagrangepyramid.h new file mode 100644 index 00000000..af4d50e5 --- /dev/null +++ b/include/lagrangepyramid.h @@ -0,0 +1,25 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef LAGRANGEPYRAMID_H +#define LAGRANGEPYRAMID_H + +#include +#include "polynomial.h" +#include "math.h" +#include "element.h" + + +namespace lagrangepyramid +{ + // 'getnodecoordinates' gives the ki, eta and phi + // coordinates of every Lagrange node for the required order: + std::vector getnodecoordinates(int order); + // 'getformfunctionpolynomials' outputs a vector giving the form function polynomials: + std::vector getformfunctionpolynomials(int order); +} + +#endif diff --git a/include/lagrangequadrangle.h b/include/lagrangequadrangle.h new file mode 100644 index 00000000..ca27f868 --- /dev/null +++ b/include/lagrangequadrangle.h @@ -0,0 +1,25 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef LAGRANGEQUADRANGLE_H +#define LAGRANGEQUADRANGLE_H + +#include +#include "polynomial.h" +#include "math.h" +#include "element.h" + + +namespace lagrangequadrangle +{ + // 'getnodecoordinates' gives the ki, eta and phi + // coordinates of every Lagrange node for the required order: + std::vector getnodecoordinates(int order); + // 'getformfunctionpolynomials' outputs a vector giving the form function polynomials: + std::vector getformfunctionpolynomials(int order); +} + +#endif diff --git a/include/lagrangetetrahedron.h b/include/lagrangetetrahedron.h new file mode 100644 index 00000000..c9311cda --- /dev/null +++ b/include/lagrangetetrahedron.h @@ -0,0 +1,25 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef LAGRANGETETRAHEDRON_H +#define LAGRANGETETRAHEDRON_H + +#include +#include "polynomial.h" +#include "math.h" +#include "element.h" + + +namespace lagrangetetrahedron +{ + // 'getnodecoordinates' gives the ki, eta and phi + // coordinates of every Lagrange node for the required order: + std::vector getnodecoordinates(int order); + // 'getformfunctionpolynomials' outputs a vector giving the form function polynomials: + std::vector getformfunctionpolynomials(int order); +} + +#endif diff --git a/include/lagrangetriangle.h b/include/lagrangetriangle.h new file mode 100644 index 00000000..d05f021f --- /dev/null +++ b/include/lagrangetriangle.h @@ -0,0 +1,25 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef LAGRANGETRIANGLE_H +#define LAGRANGETRIANGLE_H + +#include +#include "polynomial.h" +#include "math.h" +#include "element.h" + + +namespace lagrangetriangle +{ + // 'getnodecoordinates' gives the ki, eta and phi + // coordinates of every Lagrange node for the required order: + std::vector getnodecoordinates(int order); + // 'getformfunctionpolynomials' outputs a vector giving the form function polynomials: + std::vector getformfunctionpolynomials(int order); +} + +#endif diff --git a/include/legendre.h b/include/legendre.h new file mode 100644 index 00000000..cf74fc33 --- /dev/null +++ b/include/legendre.h @@ -0,0 +1,30 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// Legendre polynomials are required to define the hierarchical +// form functions used in Sabine Zaglmayr's thesis. + +#ifndef LEGENDRE_H +#define LEGENDRE_H + +#include +#include +#include "polynomial.h" + +namespace legendre +{ + // Legendre polynomials ln(x). + // Output is ln for n = 0 ... maxn. + std::vector l(int maxn, polynomial x); + // Integrated Legendre polynomials Ln(x): + std::vector L(int maxn, polynomial x); + // Scaled Legendre polynomials ls(x,t): + std::vector ls(int maxn, polynomial x, polynomial t); + // Scaled integrated Legendre polynomials Ls(x,t): + std::vector Ls(int maxn, polynomial x, polynomial t); +}; + +#endif diff --git a/include/mat.h b/include/mat.h new file mode 100644 index 00000000..16211d23 --- /dev/null +++ b/include/mat.h @@ -0,0 +1,93 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// This object is a wrapper of the actual mat object 'rawmat' pointed +// by 'rawmatptr' and to which all functions are redirected. + +#ifndef MAT_H +#define MAT_H + +#include +#include "petsc.h" +#include +#include "memory.h" +#include "rawmat.h" +#include "petscvec.h" +#include "petscmat.h" +#include "vec.h" +#include "rawvec.h" +#include "formulation.h" +#include "indexmat.h" +#include "densemat.h" + +class vec; +class rawmat; +class formulation; + +class mat +{ + private: + + // The actual matrix: + std::shared_ptr rawmatptr = NULL; + + void errorifpointerisnull(void); + void errorifinvalidated(void); + + public: + + mat(void) {}; + mat(std::shared_ptr inputrawmat) { rawmatptr = inputrawmat; }; + + // Create a pre-filled matrix: + mat(long long int matsize, indexmat rowadresses, indexmat coladresses, densemat vals); + // Create a matrix with structure based on a formulation and with initial values: + mat(formulation myformulation, indexmat rowadresses, indexmat coladresses, densemat vals); + + bool isdefined(void) { return (rawmatptr != NULL); }; + + long long int countrows(void); + long long int countcolumns(void); + + long long int countnnz(void); + + void reusefactorization(void); + + std::shared_ptr getpointer(void); + + // Return [x; bd]: + vec xbmerge(vec x, vec b); + // Return [x; 0]: + vec x0merge(vec x); + + // Return ba - D*bd: + vec eliminate(vec b); + + indexmat getainds(void); + indexmat getdinds(void); + + Mat getapetsc(void); + Mat getdpetsc(void); + + void print(void); + + mat copy(void); + + + mat operator+(void); + mat operator-(void); + mat operator*(double input); + mat operator/(double input); + mat operator*(mat input); + mat operator+(mat input); + mat operator-(mat input); + vec operator*(vec input); + +}; + +mat operator*(double, mat); + +#endif diff --git a/src/mesh/mesh.h b/include/mesh.h old mode 100755 new mode 100644 similarity index 100% rename from src/mesh/mesh.h rename to include/mesh.h diff --git a/include/mesh/coordinategroup.h b/include/mesh/coordinategroup.h new file mode 100644 index 00000000..75e1d4b1 --- /dev/null +++ b/include/mesh/coordinategroup.h @@ -0,0 +1,58 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef COORDINATEGROUP_H +#define COORDINATEGROUP_H + +#include +#include +#include + +class coordinategroup +{ + + private: + + int mynumcoords = 0; + + // Bounds gives {xmin, xmax, ymin, ymax, zmin, zmax}: + std::vector bounds = {}; + // Delta gives {deltax, deltay, deltaz} between two slice tics: + std::vector delta = {}; + // Number of x, y and z slices: + std::vector numslices = {}; + + std::vector noisethreshold = {}; + + // First index in 'mygroups' of each group (last element is number of coordinates): + std::vector mygroupads = {}; + // Coordinate indexes in each group: + std::shared_ptr mygroups; + // Coordinates in each group: + std::shared_ptr mygroupcoords; + + int selx1, selx2, sely1, sely2, selz1, selz2; + int curselx, cursely, curselz, curg; + + public: + + coordinategroup(void) {}; + coordinategroup(std::vector& coords); + + int countcoordinates(void); + + void select(double x, double y, double z, double radius); + // Move to next group. Return false if none. + bool next(void); + + int countgroupcoordinates(void); + int* getgroupindexes(void); + double* getgroupcoordinates(void); + +}; + +#endif + diff --git a/include/mesh/disjointregions.h b/include/mesh/disjointregions.h new file mode 100644 index 00000000..02f7c5de --- /dev/null +++ b/include/mesh/disjointregions.h @@ -0,0 +1,62 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef DISJOINTREGIONS_H +#define DISJOINTREGIONS_H + +#include +#include +#include "element.h" + +class disjointregions +{ + + private: + + std::vector rangebegin; + std::vector rangeend; + + // disjointregionsdefinition[i][j] is true if disjoint + // region number i is in the jth physical region. + std::vector> disjointregionsdefinition; + // 'elementtypenumbers[i]' gives the unique element + // type number of the elements in the disjoint region i. + std::vector elementtypenumbers; + + public: + + int count(void); + int countelements(int disjointregionnumber); + + // Add the disjoint region including elements of a given type number + // and defined by 'physicalregionsincludingit'. 'physicalregionsincludingit[i]' + // is true if the ith physical region geometrically covers the disjoint region. + // The output is the assigned disjoint region number. + int add(int elementtypenumber, std::vector& physicalregionsincludingit); + + void setrangebegin(int disjointregionnumber, int startrange); + void setrangeend(int disjointregionnumber, int endrange); + + int getrangebegin(int disjointregionnumber); + int getrangeend(int disjointregionnumber); + + int getelementtypenumber(int disjointregionnumber); + int getelementdimension(int disjointregionnumber); + + // Get the numbers of all disjoint regions of a given dimension/element type: + std::vector getindim(int dim); + std::vector getintype(int elementtypenumber); + + bool isinphysicalregion(int disjointregionnumber, int physicalregionindex); + + void removephysicalregions(std::vector istoremove); + + // Clear the content of this object: + void clear(void); + +}; + +#endif diff --git a/include/mesh/disjointregionselector.h b/include/mesh/disjointregionselector.h new file mode 100644 index 00000000..db7383bf --- /dev/null +++ b/include/mesh/disjointregionselector.h @@ -0,0 +1,33 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef DISJOINTREGIONSELECTOR_H +#define DISJOINTREGIONSELECTOR_H + +#include +#include "disjointregions.h" +#include "universe.h" +#include +#include + +class disjointregionselector +{ + private: + + // 'groupeddisjointregions[i]' holds the ith group. + std::vector> groupeddisjointregions = {}; + + public: + + // Group by same element type number and same value for all criteria[i]: + disjointregionselector(std::vector disjointregionnumbers, std::vector> criteria); + + int countgroups(void) { return groupeddisjointregions.size(); }; + std::vector getgroup(int groupnumber) { return groupeddisjointregions[groupnumber]; }; + +}; + +#endif diff --git a/include/mesh/dtracker.h b/include/mesh/dtracker.h new file mode 100644 index 00000000..0f3b3d5a --- /dev/null +++ b/include/mesh/dtracker.h @@ -0,0 +1,160 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// This object manages the decomposition of the mesh into domains. + +#ifndef DTRACKER_H +#define DTRACKER_H + +#include +#include +#include "rawmesh.h" +#include "slmpi.h" + + +class dtracker +{ + + private: + + // Skin of the global geometry (-1 if empty): + int myglobalgeometryskin = -1; + + // Number of overlap layers (0 for no-overlap): + int mynumoverlaplayers = -1; + + std::weak_ptr myrawmesh; + + // Neighbours (without this rank and without duplicates, sorted ascendingly): + std::vector myneighbours = {}; + // Direct access (length is numranks): + std::vector myisneighbour = {}; + + // No-overlap interfaces (length is 3*numranks, -1 if none). + // Entry 3*r+i is the interface of i-dimensional elements with rank r: + std::vector mynooverlapinterfaces = {}; + + // Inner and outer overlap interfaces (length is 3*numranks, -1 if none). + // Entry 3*r+i is the interface of i-dimensional elements with rank r: + std::vector myinneroverlapinterfaces = {}; + std::vector myouteroverlapinterfaces = {}; + // Inner and outer overlaps and their skins (length is numranks): + std::vector myinneroverlaps = {}; + std::vector myouteroverlaps = {}; + std::vector myinneroverlapskins = {}; + std::vector myouteroverlapskins = {}; + + // Map entry [n][type][i] gives the element number of type 'type' in this domain that corresponds to the + // ith element of that type in the nth neighbour domain. Only elements in the outer-overlap/no-overlap + // interfaces can be mapped. Curvature nodes cannot be mapped. The map has value -1 by default. + std::vector>> mymaptothisdomain = {}; + + // Global node numbers for every domain node (unrelated to the local node numbers, -1 for curvature nodes): + std::vector myglobalnodenumbers = {}; + + + // Discover up to 'numtrialelements' neighbours that share cell-1 dimension elements with this rank. + // The barycenter of all elements shared with the neighbours to discover must be provided as argument. + // The number of barycenters provided on all ranks is returned (if all zero an empty vector is returned). + std::vector discoversomeneighbours(int numtrialelements, std::vector& interfaceelembarys, std::vector& neighboursfound); + + // Upon return 'inneighbours[i]' is the number of the neighbour touching the ith interface element (-1 if no neighbour touching). + // The neighbours provided must be unique and sorted ascendingly. The number of interface elements for each rank must be provided in 'allnumelementsininterface'. + void discoverinterfaces(std::vector neighbours, std::vector& interfaceelembarys, std::vector& allnumelementsininterface, std::vector& inneighbour); + + // Find new interfaces and populate the output accordingly. Return false if no more interfaces can be found on any rank. + bool discovercrossinterfaces(std::vector& interfacenodelist, std::vector& interfaceedgelist, std::vector>& isnodeinneighbours, std::vector>& isedgeinneighbours); + + // Define the inner overlaps and their skins: + void defineinneroverlaps(void); + // Define the outer overlaps and their skins: + void exchangeoverlaps(void); + // Exchange the physical regions on the overlaps: + void exchangephysicalregions(void); + // Define the outer overlap interfaces. + // This works for any geometry whose global skin region does not intersect itself. + void defineouteroverlapinterfaces(void); + // Define the inner overlap interfaces: + void defineinneroverlapinterfaces(void); + + // Map the outer-overlap/no-overlap interfaces: + void mapnooverlapinterfaces(void); + void mapoverlapinterfaces(void); + + // Create the global node numbers for every domain node: + void createglobalnodenumbersnooverlap(void); + void createglobalnodenumbersoverlap(void); + + public: + + bool isdefined(void); + void errorundefined(void); + + dtracker(std::shared_ptr rm, int globalgeometryskin, int numoverlaplayers); + + std::shared_ptr getrawmesh(void); + + void setrawmesh(std::shared_ptr rm); + + bool isoverlap(void); + + // Set manually the no-overlap connectivity of this rank. + // 'nooverlapinterfaces[3*i+j]' is the interface of j-dimensional elements with the ith neighbour (-1 if none). + void setconnectivity(std::vector& neighbours, std::vector& nooverlapinterfaces); + // Discover automatically the no-overlap connectivity of this rank. + // This works for any geometry whose global skin region does not intersect itself. + void discoverconnectivity(int numtrialelements = 10, int verbosity = 0); + + // Exchange the overlaps (and the physical regions included) with the neighbours and define the overlap interfaces: + void overlap(void); + + // Map the outer-overlap/no-overlap interfaces: + void mapinterfaces(void); + + // Create the global node numbers for every domain node: + void createglobalnodenumbers(void); + + int countneighbours(void); + std::vector getneighbours(void); + int getneighbour(int neighbourindex); + + bool isneighbour(int neighbour); + + // Return -1 if not defined: + int getnooverlapinterface(int neighbour, int elementdimension); + int getinneroverlapinterface(int neighbour, int elementdimension); + int getouteroverlapinterface(int neighbour, int elementdimension); + int getinneroverlap(int neighbour); + int getouteroverlap(int neighbour); + int getinneroverlapskin(int neighbour); + int getouteroverlapskin(int neighbour); + + std::vector getnooverlapinterface(int neighbour); + std::vector getinneroverlapinterface(int neighbour); + std::vector getouteroverlapinterface(int neighbour); + + std::vector>>* getmap(void); + + long long int* getglobalnodenumbers(void); + void writeglobalnodenumbers(std::string filename); + + // Return the list of all ddm-specific regions: + std::vector listddmregions(void); + std::vector isddmdisjointregion(void); + + // Know which disjoint region is in the no-overlap region/is owned by this rank: + std::vector isdisjointregioninnooverlap(void); + std::vector isdisjointregionowned(void); + + // Print connectivity information: + void print(void); + // Write no-overlap domain interfaces: + void writeinterfaces(std::string filename); + +}; + +#endif + diff --git a/include/mesh/elements.h b/include/mesh/elements.h new file mode 100644 index 00000000..b543227d --- /dev/null +++ b/include/mesh/elements.h @@ -0,0 +1,253 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef ELEMENTS_H +#define ELEMENTS_H + +#include +#include +#include "element.h" +#include "nodes.h" +#include "physicalregions.h" +#include "disjointregions.h" +#include +#include +#include +#include "orientation.h" +#include "gentools.h" +#include "ptracker.h" + +class nodes; + +class elements +{ + + private: + + nodes* mynodes; + physicalregions* myphysicalregions; + disjointregions* mydisjointregions; + + // The curvature order of all elements. There can only + // be a single curvature order in the mesh. + int mycurvatureorder = -1; + + // subelementsinelements[typenum][subtypenum] gives for element of + // uncurved type number 'typenum' the list of all subelements of + // uncurved type 'subtypenum' (0, 1, 2 or 3) it is made of. + // [typenum][0] gives the node list in format [nodesinelement1 + // nodesinelement2 ...], [typenum][1] the line list, [typenum][2] + // the triangle list and [typenum][3] the quadrangle list. + // The element itself is not included, e.g. [0][0] is empty. + // For nodes all curved nodes are provided. + std::vector>> subelementsinelements = std::vector>>(8, std::vector>(4,std::vector(0))); + + // For speedup: number of subelements (nodes, lines, triangles + // and quadrangles) in every element. + std::vector> numberofsubelementsineveryelement = std::vector>(8,std::vector(4,0)); + + // indisjointregion[typenum][i] gives the disjoint region number + // in which the ith element of type 'typenum' is. + std::vector> indisjointregion = std::vector>(8, std::vector(0)); + + // totalorientations[typenum][i] gives the total orientation + // number for the ith element of type 'typenum'. + // totalorientations[typenum] is empty if not applicable. + std::vector> totalorientations = std::vector>(8, std::vector(0)); + + // barycenters[typenum][3*i] stores the x, y and z coordinates + // of the barycenter for the ith element of type 'typenum'. + // The x, y and z coordinates are concatenated one after the other. + std::vector> barycenters = std::vector>(8, std::vector(0)); + + // sphereradius[typenum][i] gives the smallest radius of the sphere (centered on + // the barycenter) that surrounds all nodes of the ith element of type 'typenum'. + // All nodes of the curved element are considered (but the barycenter is the one of the straight element). + std::vector> sphereradius = std::vector>(8, std::vector(0)); + // boxdimensions[typenum][3*i] gives the x, y and z distance between the element barycenter and the + // smallest box (centered on the barycenter) that surrounds all nodes of the ith element of type 'typenum'. + // All nodes of the curved element are considered (but the barycenter is the one of the straight element). + std::vector> boxdimensions = std::vector>(8, std::vector(0)); + + // Entries in 'edgesatnodes' from index 'adressedgesatnodes[i]' to 'adressedgesatnodes[i+1]-1' are all + // edges touching node i. Only the edge corner nodes (not the curvature nodes) have touching edges. + std::vector adressedgesatnodes = {}; + std::vector edgesatnodes = {}; + // Create the two vectors above: + void populateedgesatnodes(void); + + // Entries in 'cellsattype[0/1/2/3]' from index 'adresscellsattype[][i]' to 'adresscellsattype[][i+1]-1' are all cells + // (highest dimension elements) touching node/edge/tri/quad i and their type number in format {type0,cell0,type1,...}. + std::vector> adresscellsattype = std::vector>(4, std::vector(0)); + std::vector> cellsattype = std::vector>(4, std::vector(0)); + // Create the two vectors above: + void populatecellsattype(int subtype, std::vector& act, std::vector& ct); + + public: + + elements(void) {}; + elements(nodes&, physicalregions&, disjointregions&); + + nodes* getnodes(void); + physicalregions* getphysicalregions(void); + disjointregions* getdisjointregions(void); + + // Add an element defined by its element type number, curvature order and + // curved nodes. Return the created element number. Only 'pointsinelements' + // is changed. 'elementtypenumber' is the UNCURVED element type number. + int add(int elementtypenumber, int curvatureorder, std::vector& nodelist); + + void cleancoordinatedependentcontainers(void); + + // 'getsubelement' returns the number of the 'subelementindex'th + // subelement of type 'subelementtypenumber' in element number + // 'elementnumber' of type 'elementtypenumber'. + // E.g. getsubelement(0, 3, 245, 1) returns the second node in quadrangle number 245. + int getsubelement(int subelementtypenumber, int elementtypenumber, int elementnumber, int subelementindex); + + int getdisjointregion(int elementtypenumber, int elementnumber, bool errorifnegative = true); + int gettotalorientation(int elementtypenumber, int elementnumber); + + // Check if a subelement has the same orientation as in its parent element: + std::vector isflipped(int subelementtypenumber, std::vector& subelementnumbers, int elementtypenumber, std::vector& elementnumbers); + + // 'isinelementlists[i]' is true if the ith element of type 'elementtypenumber' is a (sub-)element of any element list provided. + // The number of true entries in 'isinelementlists' is returned. NULL element list pointers are ignored. + int istypeinelementlists(int elementtypenumber, std::vector>*> elementlists, std::vector& isinelementlists, bool considercurvaturenodes); + int istypeindisjointregions(int elementtypenumber, std::vector isdisjregselected, std::vector& isinelementlists, bool considercurvaturenodes); + + // Return the number of elements of a given type: + int count(int elementtypenumber); + // Same as above but returns 0 if the element type is not a cell: + int countcells(int elementtypenumber); + // Return the number of elements of a given dimension: + int countindim(int dim); + // Count in each type: + std::vector count(void); + // Return the curvature order: + int getcurvatureorder(void); + + // Get a vector containing all edges touching node 'nodenumber'. + // For curvature nodes an empty vector is returned. + int countedgesonnode(int nodenumber); + std::vector getedgesonnode(int nodenumber); + // Get a vector containing all cells (highest dimension elements) + // touching node/edge/tri/quad 'subnumber'. Format is {type0,cell0,type1,...}. + int countcellsontype(int subtype, int subnumber); + std::vector getcellsontype(int subtype, int subnumber); + + // Get the x, y or z coordinate of all nodes in the element + // (for xyz respectively set to 0, 1 or 2). + std::vector getnodecoordinates(int elementtypenumber, int elementnumber, int xyz); + // Get all coordinates at once: + std::vector getnodecoordinates(int elementtypenumber, int elementnumber); + + // Get the elements in format {type0,elemnum0,type1,...} and reference coordinates at the target disjoint regions. + // All elements have same reference coordinates at the origin. One reference coordinate per element at target. + // All target disjoint regions must have elements of same dimension. + void getrefcoordsondisjregs(int origintype, std::vector& elems, std::vector& refcoords, std::vector targetdisjregs, std::vector& targetelems, std::vector& targetrefcoords); + + // Get a pointer to the barycenters[elementtypenumber] vector. + // The 'barycenters' container is populated for the element type if empty. + std::vector* getbarycenters(int elementtypenumber); + // Get a pointer to the sphereradius[elementtypenumber] vector. + // The 'sphereradius' container is populated for the element type if empty. + std::vector* getsphereradius(int elementtypenumber); + // Get a pointer to the boxdimensions[elementtypenumber] vector. + // The 'boxdimensions' container is populated for the element type if empty. + std::vector* getboxdimensions(int elementtypenumber); + + // Get the barycenter of all elements in the flattened element list: + void getbarycenters(std::vector>* elementlist, std::vector& barycenters); + // Get the barycenter of all requested elements: + void getbarycenters(int elementtypenumber, std::vector& elementlist, std::vector& barycenters); + void getbarycenters(int elementtypenumber, std::vector& elementlist, double* barycenters); + + // Get the normal (not normed) to a straight face element: + std::vector getnormal(int elementtypenumber, int elementnumber); + + // Get the highest element dimension available: + int getdimension(void); + + // Count the number of interface element types (1/2/4 for a 1D/2D/3D mesh): + int countinterfaceelementtypes(void); + + // Print elements data for debug: + void printnumber(void); + void printsubelements(void); + void printtotalorientations(void); + // Visualize elements for debug: + void write(std::string filename, int elementtypenumber, std::vector elementnumbers, std::vector elementvalues); + // Visualize edge direction for debug: + void writeedgedirection(int physreg, std::string filename); + + // 'computebarycenters' computes the barycenter coordinates of all + // elements of type 'elementtypenumber'. The output vector has format + // [coordxelem1 coordyelem1 coordzelem1 coordxelem2 ...]. + // Only the corner element nodes are used. + std::vector computebarycenters(int elementtypenumber); + + // 'removeduplicates' removes the duplicated elements. + std::vector removeduplicates(int elementtypenumber); + + // 'renumber' updates the element numbers in 'linesinelements', + // 'trianglesinelements' and 'quadranglesinelements'. 'renumberingvector' + // is such that linesinelementsrenumbered = renumberingvector(linesinelements). + void renumber(int elementtypenumber, std::vector& renumberingvector); + // 'reorder' is similar to 'renumber' except that it reorders the elements + // using 'reorderingvector' such that orderedelements = elements(reorderingvector,:); + void reorder(int elementtypenumber, std::vector& reorderingvector); + + // 'explode' extract the subelements from the existing ones. The + // elements created are lines (the edges) and triangles/quadrangles + // (the faces) that are part of the original elements. This function + // creates duplicated elements that have to be uniqued afterwards. + void explode(void); + + // Follow the elements of highest dimension in 'elementlist' in the order provided. + // For each element follow the subelements of type 'subtype' in the element-subs order. + // Each subelement is passed only once. If the last argument is provided then only the + // subelements that are also subelements of any last argument element list are returned. + // NULL pointers in the last argument are empty lists. Curvature nodes are NOT returned. + void follow(std::vector>* elementlist, int subtype, std::vector& sublist, std::vector>*> mustbeinelementlists = {}); + + + // To call only after all renumbering and reordering steps: + void definedisjointregions(void); + // Reorder and renumber the elements by disjoint regions. + void reorderbydisjointregions(void); + // Same but here the renumbering used is provided in 'elementrenumbering' upon return. + void reorderbydisjointregions(std::vector>& elementrenumbering); + void definedisjointregionsranges(void); + + // Get a vector whose index i is true if node i is a corner node: + std::vector iscornernode(void); + + // 'orient' defines 'totalorientations'. Note: 'totalorientations' + // is untouched in all renumbering and reordering steps and + // should thus be called last, after all other steps. + void orient(long long int* noderenumbering = NULL); + + + // Make a full copy of this object (linking objects used are the arguments): + elements copy(nodes* nds, physicalregions* prs, disjointregions* drs); + + // Bring this object in the state corresponding to the target ptracker: + void toptracker(std::shared_ptr originpt, std::shared_ptr targetpt); + + // Merge with this object. The renumbering into the merged object of each + // (sub)element to merge must be provided (can include duplicates). + // The 'nodes' object known to this object is modified. + void merge(elements* elstomerge, std::vector>& renumbering, std::vector& numduplicates); + + // Merge with this object. New elements are appended. Duplicates in 'elstomerge' are + // removed. Duplicates in the intersection region between 'elstomerge' and this object + // are also removed. THIS OBJECT CAN NOT HAVE DUPLICATES on the intersection region. + // CELL DUPLICATES ARE NOT REMOVED. The 'nodes' object known to this object is modified. + void merge(std::vector intersectionphysregs, elements* elstomerge); +}; + +#endif diff --git a/include/mesh/elementselector.h b/include/mesh/elementselector.h new file mode 100644 index 00000000..e3ca1db1 --- /dev/null +++ b/include/mesh/elementselector.h @@ -0,0 +1,100 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef ELEMENTSELECTOR_H +#define ELEMENTSELECTOR_H + +#include +#include "disjointregions.h" +#include "gentools.h" +#include "elements.h" +#include "universe.h" +#include + +class elementselector +{ + private: + + // The disjoint regions from which the elements originate. + std::vector mydisjointregionnumbers = {}; + + // The current selected total orientation: + int currenttotalorientation; + + // The index range in 'elems' of the current total orientation. + int currentrangebegin = 0; + int currentrangeend = 0; + + // The currently selected disjoint regions. + std::vector selecteddisjointregions = {}; + + // The three containers below are sorted first with increasing + // orientation number (if orientation matters) then according to + // their disjoint regions in the 'mydisjointregionnumbers' order. + + // All element numbers: + std::vector elems = {}; + // Their total orientation: + std::vector totalorientations = {}; + // Their disjoint region: + std::vector disjointregions = {}; + // Their original indexes: + std::vector originalindexes = {}; + + + // Prepare the containers: + void prepare(bool isorientationdependent); + + public: + + elementselector(void) {}; + + // All disjoint region numbers must correspond to a same element type. + elementselector(std::vector disjointregionnumbers, bool isorientationdependent = true); + // Select a set of elements of same type: + elementselector(std::vector disjointregionnumbers, std::vector& elemnums, bool isorientationdependent = true); + + int getelementdimension(void); + int getelementtypenumber(void); + std::vector getdisjointregions(void) { return mydisjointregionnumbers; }; + int gettotalorientation(void) { return currenttotalorientation; }; + + // Select the next total orientation. Returns false if there is none. + bool next(void); + + // Count total number of elements: + int count(void) { return elems.size(); }; + + // Count number of elements in current orientation: + int countincurrentorientation(void) { return currentrangeend - currentrangebegin + 1; }; + + + void selectallelements(void); + + // Select specific disjoint regions. Set to {} for no selection. The + // selected disjoint regions must all be in 'mydisjointregionnumbers'. + void selectdisjointregions(std::vector disjregs); + + // Count the elements that are at the same time in the current + // total orientation and in the selected disjoint regions. + int countinselection(void); + // Get the numbers of all elements that are at the same time in the + // current total orientation and in the selected disjoint regions. + std::vector getelementnumbers(void); + // Get the indexes (w.r.t. the current total orientation) of all + // elements that are at the same time in the current total + // orientation and in the selected disjoint regions. + std::vector getelementindexes(void); + + // Get the indexes in the original ordering provided: + std::vector getoriginalindexes(void); + + // Extract a new element selector from the selection. + elementselector extractselection(void); + +}; + +#endif diff --git a/include/mesh/gentools.h b/include/mesh/gentools.h new file mode 100644 index 00000000..05cc1611 --- /dev/null +++ b/include/mesh/gentools.h @@ -0,0 +1,284 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef GENTOOLS_H +#define GENTOOLS_H + +#include +#include +#include +#include +#include +#include +#include "element.h" +#include "polynomial.h" +#include "polynomials.h" +#include "coordinategroup.h" +#include "densemat.h" + +namespace gentools +{ + // 'stablecoordinatesort' takes as input a vector of node coordinates + // in the format [coord1x coord1y coord1z coord2x ...] and provides a + // vector that can be used to reorder the nodes so that the coordinates + // are sorted according to first the x, then the y and finally the z + // coordinates: sortedcoordinates = coordinates(reorderingvector,:). + // The sorting is not affected by roundoff noise up to a threshold. + // The sorting algorithm is stable. + void stablecoordinatesort(std::vector noisethreshold, std::vector& coordinates, std::vector& reorderingvector); + // Same as above but first sort according to a vector of integers: + void stablecoordinatesort(std::vector noisethreshold, std::vector& elems, std::vector& coordinates, std::vector& reorderingvector); + + // Provide a renumbering vector to remove duplicated coordinates. + // Entry renumberingvector[i] is guaranteed lower or equal to i. + // The output gives the number of non-duplicated coordinates. + int removeduplicates(std::vector& coordinates, std::vector& renumberingvector); + // Provide a renumbering vector to remove duplicated blocks. + // Entry renumberingvector[i] is guaranteed lower or equal to i. + // The output gives the number of non-duplicated blocks. + int removeduplicates(std::vector toremove, std::vector& renumberingvector, int blocklen); + + // Remove duplicated coordinates: + void removeduplicates(std::vector& coordinates); + + // This is for a vector of ints: + void stablesort(std::vector& tosort, std::vector& reorderingvector); + // This is for a vector of doubles: + void stablesort(double noisethreshold, std::vector& tosort, std::vector& reorderingvector); + // Same but sort by blocks of size 'blocklen': + void stablesort(double noisethreshold, std::vector& tosort, std::vector& reorderingvector, int blocklen); + + void tuple3sort(std::vector>& tosort); + + // Slice coordinates 'toslice' in the x, y and z direction into nsx*nsy*nsz groups. First slice position and distance between slices is provided as argument. Returned containers are: + // + // - Group address 'ga[g]' gives the first position in 'pn' for group g (length of 'ga' is the number of groups + 1 and last value is the number of coordinates) + // - Point number 'pn[i]' gives the corresponding point number in 'toslice' (must be preallocated to number of coordinates) + // - Point coordinates 'pc[3*i+0/+1/+2]' gives the x, y and z coordinates of point 'pn[i]' (must be preallocated to 3 x number of coordinates) + // + void slicecoordinates(std::vector& toslice, double minx, double miny, double minz, double dx, double dy, double dz, int nsx, int nsy, int nsz, std::vector& ga, int* pn, double* pc); + + // Return {xmin,xmax,ymin,ymax,zmin,zmax} for the coordinates {x1,y1,z1,x2,...}: + std::vector getcoordbounds(std::vector& coordinates); + + std::vector unique(std::vector a); + + std::vector intersect(std::vector a, std::vector b); + std::vector exclude(std::vector a, std::vector b); + + // Compressed sparse row to ijk format converter for sparse matrices. + // 'csrrows' is in CSR format. The ijk row format is output in 'ijkrows'. + // 'ijkrows' must be preallocated with a size equal to the nnz. + void csrtoijk(int numberofrows, int* csrrows, int* ijkrows); + + // Get a single solution {ki,eta,phi} of a system of one up to three polynomials {poly1,poly2,...} equaled to the rhs. + // After convergence 1 is returned and the solution is placed in 'initialguess'. If at any iteration either ki, eta or phi + // is farther away than 'boxsize' from the origin then the function stops and returns 0. Value -1 is returned in any other case. + // The initial guess is supposed to be inside the box. + int getroot(polynomials& polys, std::vector& rhs, std::vector& initialguess, double boxsize = 2, double tol = 1e-10, int maxit = 20); + + // Get the reference coordinates and the element numbers corresponding to each (x,y,z) coordinate provided as argument. + // If the ith coordinate (xi,yi,zi) cannot be found in any element of the disjoint region then elems[i] is unchanged. + // Any coordinate for which elems[i] is not -1 is ignored. 'elems' and 'kietaphis' must be preallocated to size numcoords and 3*numcoords. + // This function is designed to be called in a for loop on multiple disjoint regions of same element type. + void getreferencecoordinates(coordinategroup& coordgroup, int disjreg, std::vector& elems, std::vector& kietaphis); + + // Split the 'tosplit' vector into 'blocklen' vectors of length tosplit.size()/blocklen. + std::vector> splitvector(std::vector& tosplit, int blocklen); + + // Split a vector in two vectors according to 'select': + void splitvector(std::vector& vec, std::vector& select, std::vector& falses, std::vector& trues); + + // Select indexes of a vector: + void select(std::vector& vals, std::vector& selectedindexes, std::vector& selected); + void select(std::vector& vals, indexmat selectedindexes, std::vector& selected); + + // Compare the ordering of two vectors (vectors must be circularly or anti-circularly identical and not empty). + // Length 1 is considered not flipped. Length 2 is considered flipped if not identical. + bool isflipped(std::vector& a, std::vector& b); + + // Norm each block in the vector: + std::vector normblocks(std::vector& tonorm, int blocklen); + + // Return the interval number in which 'val' is. The interval tics must be sorted ascendingly. + // Values out of bound are set to either the interval 0 or the last one. Size of 'tics' must be at least 2. + int findinterval(double val, std::vector& tics); + // Get the tics for equally sized intervals: + std::vector getintervaltics(double minval, double maxval, int numintervals); + + // Get the file extension (dot included) in a string (works for any extension length): + std::string getfileextension(std::string filename); + // Get the file name without the path and the extension: + std::string getfilename(std::string filename); + + // Return "s" for an argument bigger than 1, return "" otherwise: + std::string getplurals(int count); + + // Get a vector of equally spaced numbers: + std::vector getequallyspaced(int start, int space, int amount); + + // Create a vector equal to n duplicates of the argument vector: + std::vector duplicate(std::vector invec, int n); + + // Remove trailing CR (added in windows for newline): + void osclean(std::string& line); + + // Convert an int to/from a boolean vector: + std::vector inttobinary(int numbits, int num); + int binarytoint(std::vector num); + + // Return the exact conversion from integer to double (throw an error if not possible): + double exactinttodouble(long long int num); + + // Output a unique number for each combination of number inequalities (no equality allowed). + // The output is a number ranging from 0 to numbers.size()! - 1. + int identifyrelations(std::vector numbers); + + // Factorial of positive integers or zero: + int factorial(int n); + + // Provide the corner coordinates of each element concatenated in each element type. + // This function returns (flattened from lowest type to highest) the edge number of + // each edge in an element as well as a bool whose value is true if the edge barycenter + // is close enough to any node in the corner coordinates. In the DDM framework the own + // elements must include all / the inner overlap elements for no-overlap / overlap DDM. + void assignedgenumbers(std::vector& isownelem, std::vector>& cornercoords, std::vector& edgenumbers, std::vector& isbarycenteronnode); + + // For a vector 'vec' of repeating blocks [b0 b1 b2 ...] the output is [b0[sel[0]] b1[sel[0]] ... b0[sel[1]] b1[sel[1]] ...]. + std::vector separate(std::vector& v, int blocklen, std::vector sel); + + // Return the renumbering obtained when the original renumbering is renumbered again by a new renumbering: + std::vector chainrenumbering(std::vector& originalrenum, std::vector& newrenum); + + // Invert the renumbering: + std::vector invertrenumbering(std::vector& renum); + // Get the reordering vector corresponding to the renumbering vector: + std::vector getreordering(std::vector& renum); + + // Reorder an address-data pair based on a renumbering of the addresses (last entry in address vectors is data.size): + void reorder(std::vector& inad, std::vector& indat, std::vector& renumbering, std::vector& outad, std::vector& outdat); + + // 'elems' has format {elemtype0,elemnum0,elemtype1,...}. 'totalnumelems[i]' gives the number of elements of type i in the mesh. + // For the ith point in 'elems' the vector indexinrcsoforigin[i]' gives the index/3 in 'rcs[element type at ith point in elems]'. + void toaddressdata(std::vector& elems, std::vector& refcoords, std::vector totalnumelems, std::vector>& ads, std::vector>& rcs, std::vector& indexinrcsoforigin); + + // Concatenate vectors: + std::vector concatenate(std::vector> tocat); + void concatenate(std::vector>& tocat, std::vector& cated); + + // Return -1 if a < b, 0 if a = b and +1 if a > b: + int inequalitytoint(int a, int b); + + // Norm a vector: + void normvector(std::vector& tonorm); + + // Solve Ux = b where U is column-major upper triangular {r0c0,r0c1,r1c1,r0c2,...}: + void solveuppertriangular(int len, double* U, double* b, double* x); + + // Givens rotation: + void givensrotation(double a, double b, double& c, double& s, double& r); + + // Apply Givens rotation to h (the kth column of the unreduced upper Hessenberg matrix, h must have length k+2): + void applygivensrotation(double* h, std::vector& cs, std::vector& sn, int k); + + // Q has one row per Krylov vector (at least k+2 rows must be preallocated). + // Column k of the unreduced upper Hessenberg matrix is returned (length k+2): + std::vector arnoldi(densemat (*mymatmult)(densemat), densemat Q, int k); + + // Create a vector to renumber integer values with gaps to values without gap. + // Integers must all be positive or zero. The number of unique integers is returned. + int squeeze(std::vector& nums, int maxval, std::vector& renumbering); + + // Set 'numtrue' to -1 if the number of true entries is not known: + void find(std::vector& invec, int numtrue, std::vector& trueindexes); + + // For each coordinate to find this gives the index of the coordinate matched in the target (-1 if not found in the target). + // The number of matches is returned. It is allowed to have duplicate coordinates in the target. + int findcoordinates(std::vector& targetcoords, std::vector& tofindintarget, std::vector& posfound); + + // Write to 'selectedcoords' the coordinates in 'coords' that have a true selection value: + void selectcoordinates(std::vector& selection, std::vector& coords, double* selectedcoords); + + // From the candidates vector pick a set of coordinates that have rather equally spaced (possibly NOT UNIQUE) indexes: + void pickcandidates(int numbertopick, std::vector& candidatecoordinates, std::vector& picked); + + // 'data[i][j]' is a vector that can either have size 0 or a size larger or equal to 2. In the latter case the vector + // is the result of the concatenation of two vectors a and b and has format {lengtha, lengthb, ... valuesa ..., ... valuesb ...}. + // This function extracts the sizes of each a/b vector into 'sizesa'/'sizesb' and concatenates + // all valuesa/valuesb vectors together into the output 'dataa'/'datab'. + void split(std::vector< std::vector> >& data, std::vector& dataa, std::vector& datab, std::vector>& sizesa, std::vector>& sizesb); + + // This function creates 'packed' of size numtags where 'packed[k]' holds all data associated to the kth tag. + // 'topack' has size numtags^2 and 'topack[i*numtags+j]' (only j >= i+1 is considered, empty vectors are skipped) + // holds data of tag 'tags[j]' associated to the ith tag and data of tag 'tags[i]' associated to the jth tag. + // 'packed[k]' is the concatenation of all data from 'topack' associated to the kth tag. It has format + // {tag0, length0, ... data0 ..., tag1, length1, ... data1 ..., ...}. + void pack(std::vector tags, std::vector>& topack, std::vector>& packed); + + // Unpack 'packed' of format {tag0, length0, ... data0 ..., tag1, length1, ... data1 ..., ...} into 'unpack'. + // 'unpacked' has a size equal to the number of tags (possibly not unique) found in 'packed'. + // 'unpacked[i]' holds the ith dataset (of tag 'output[i]') found in 'packed'. + // All tags found are returned in the order of appearance. They might not be unique. + std::vector unpack(std::vector& packed, std::vector>& unpacked); + + // Return all values at data[i*period+shift] and remove them from 'data' (length of 'data' should be a multiple of the period): + std::vector extract(std::vector& data, int period, int shift); + std::vector extract(std::vector& data, int period, int shift); + + // Return the ceiled division a/b: + int ceildiv(int a, int b); + + // Get the number of integers in the packed vector: + int getpackedsize(int numbits); + // Pack a vector of booleans (works for an arbitrary sizeof(int) bytes): + void pack(std::vector& topack, std::vector& packed); + // Unpack the vector of booleans (was of length 'orignumbools' before being packed): + void unpack(int orignumbools, std::vector& packed, std::vector& unpacked); + + // Split values < val and >= val while keeping the ordering: + void split(std::vector& vals, int val, std::vector& lowervals, std::vector& highervals); + + // Count the number of true entries: + int counttrue(std::vector& tocount); + + // For a vector of positive or zero values compress consecutive zero values: + void compresszeros(std::vector& tocompress); + void decompresszeros(std::vector& todecompress); + + // Get the maximum element dimension found in the element list (-1 if empty): + int getmaxdim(std::vector>* elementlist); + + // Sum all entries in the vector (return 0 if empty): + int sum(std::vector& tosum); + double sum(std::vector& tosum); + + // Split a string at the first colon. If there is no colon then the string to split is placed in 'last': + void splitatcolon(std::string tosplit, std::string& first, std::string& last); + + // Find the true and false indexes in the argument vector and provide the renumbering of each vector entry to its true/false index: + void findtruefalse(std::vector& invec, indexmat& trueinds, indexmat& falseinds, std::vector& renum); + + // For every edge in 'physreg' (in the 'der' order) return a flag telling if its direction has to be flipped + // to fullfill the condition that at every node the touching edges point together either inwards or outwards. + void inoutorient(int physreg, std::vector& flipit); + // Helper function to be called recursively. + void inoutorient(int startnode, std::vector& edgestatus, bool isoutward, bool isrecursivecall); + + // The inner overlap cell values are decided by the owner of the inner overlap: + void fixatoverlap(std::vector>& cellvalues); + + // Get the list of edges in the inner overlap interface with each neighbour and preallocate for the outer overlap interface. + // In case of no-overlap DDM the inner and outer overlap interfaces both equal the no-overlap interface. + void getedgesininnerinterfaces(std::vector>& iiedgelists, std::vector>& oiedgelistspreallocated); + + // Append the values of this rank and all neighbour ranks (in case of DDM). Also get the value 'togroup' on each neighbour rank. + std::vector appendneighbourvalues(std::vector& toappendto, std::vector& toappend, int togroup); + + // From the provided disjoint regions (with same element type) return the elements with at least one active corner node: + std::vector getactiveelements(std::vector disjregs, std::vector& isnodeactive); +}; + +#endif diff --git a/include/mesh/htracker.h b/include/mesh/htracker.h new file mode 100644 index 00000000..83251ad6 --- /dev/null +++ b/include/mesh/htracker.h @@ -0,0 +1,190 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// This object manages the mesh h-adaptivity for all element types. + +#ifndef HTRACKER_H +#define HTRACKER_H + +#include +#include +#include +#include +#include "element.h" +#include "rawmesh.h" + +class rawmesh; + +class htracker +{ + + private: + + // Original mesh on which this tracker is based: + std::weak_ptr myoriginalmesh; + + // Store in compressed format all split info needed: + // + // 1. 1/0 for fullsplit/transition element (if 0 this element stops here) + // 2. 00/01/10/11 for 0/1/2/undefined through-edge tetrahedron fullsplit (only for tetrahedra) + // 3. 1/0 for fullsplit/transition element of first subelement + // 4. ... + // 5. 1/0 for fullsplit/transition element of second subelement + // 6. ... + // + // Transition elements are numbered for each type in the order in which they appear in the tree. + // A transition element can therefore be uniquely identified by its type and index in that type. + // + std::vector splitdata = {}; + + int maxdepth = 0; + int numleaves = 0; + + // Curvature order of the original elements: + int originalcurvatureorder; + // Number of elements in each type at the 0 depth: + std::vector originalcount = {}; + + // Number of subelements in each fullsplit type: + std::vector numsubelems = {1,2,4,4,8,8,8,10}; + // Number of corner/curvature nodes for each element type: + std::vector nn, ncn; + // Straight/curved reference coordinates for each element type: + std::vector> straightrefcoords; + std::vector> curvedrefcoords; + + // Straight/curved element object for each element type: + std::vector myelems; + std::vector mycurvedelems; + + // Information needed by the tree cursor: + bool isrefcalc = false; + int cursorposition = -1; + int currentdepth = -1; + int origindexintype = -1; + std::vector parenttypes = {}; + std::vector indexesinclusters = {}; + std::vector>> parentrefcoords = {}; + // End tree cursor information + + // Reference coordinates in the original element/leaf number for each transition element. + // Transition elements of each type are ordered in the way the appear in the tree. + std::vector> transitionsrefcoords = {}; + std::vector> leavesoftransitions = {}; + // At [i][2*j+0] and [i][2*j+1] this gives the type and index of the corresponding original element: + std::vector> originalsoftransitions = {}; + + // Transition elements renumbering: + std::vector> touser = {}; + std::vector> toht = {}; + + public: + + htracker(void) {}; + // Provide the original 'rawmesh' object (or the latter two arguments for debug): + htracker(std::shared_ptr origmesh, int curvatureorder = -1, std::vector numelemspertype = {}); + + std::shared_ptr getoriginalmesh(void); + + int countleaves(void); + int getmaxdepth(void); + + // Place cursor at beginning of tree. Request reference coordinate calculations or not. + void resetcursor(bool calcrefcoords = false); + // Move cursor to next node (crashes when exceeding number of leaves). Position might not be at a leaf. + // The through-edge number needed for the split is returned (-1 if n/a, 3 if undefined). In case it + // has not been defined yet and the 'resetcursor' argument is true it is calculated and stored. + int next(void); + + // Check if the cursor is at a leaf: + bool isatleaf(void); + // Count the number of splits used to reach the current position: + int countsplits(void); + // Get the element type number at current position: + int gettype(void); + // Get the element type number of the current parent (-1 if at depth 0): + int getparenttype(void); + // Get the index of the current element in the cluster: + int getindexincluster(void); + // Get the current reference coordinates in the original element (only if 'calcrefcoords' is true): + std::vector getreferencecoordinates(void); + + // Get the split depth of all leaves: + void countsplits(std::vector& numsplits); + // Get the element type number of all leaves: + void gettype(std::vector& types); + // Get the original element number of all leaves: + void getoriginalelementnumber(std::vector& oen); + // Get the original element type and index in type of all leaves: + void getoriginalelement(std::vector& oet, std::vector& oei); + // For each original element get the number of leaves of each type (by blocks of 8). + void countsons(std::vector& numsons); + + // Count the number of leaves of each type: + std::vector countintypes(void); + // Count the number of transition elements of a type: + int counttransitions(int elementtypenumber); + + // Update the operations to how they will actually be treated (priority is split > noop > group): + void fix(std::vector& operations); + + // Group/keep/split (-1/0/1) the requested leaves. Leaves are grouped if all + // leaves in the cluster are tagged for grouping and none is already split. + // NEIGBOUR ELEMENTS CANNOT DIFFER BY MORE THAN ONE SPLIT LEVEL. + // The argument vector must have a size equal to the number of leaves. + void adapt(std::vector& operations); + + // Get the reference/physical corner node coordinates (physical is optional) of all leaves. + // Leaves of each type are ordered in the way the appear in the tree. + void atleaves(std::vector>& arc, std::vector>& apc, bool withphysicals); + + // Get the node coordinates 'ac' of all transition elements after adaptation. + void getadaptedcoordinates(std::vector>& ac); + + // Check which leaves are in the inner overlap of this rank (do not call if not overlap DDM): + void isinneroverlapleaf(std::vector& isiol); + + // Get an upper bound of number of transition elements that can be created from all leaves: + std::vector countupperbound(void); + + // Renumber the transition elements: + void renumbertransitions(std::vector>& renumbering); + + // Get the reference coordinate in the original element 'orc' corresponding to the reference coordinates in the transition elements 'rc'. + // 'ad[t][i]' gives the first position in 'rc' where the ith transition element of type t is. 'oad[i]' does that for the first position + // of the ith original element in 'orc'. 'ad' and 'oad' have a 1 longer size and their last value is the vec size. + // 'maprctoorc[i][j]'x3 gives the position in 'orc' corresponding to the point at 'rc[i][3*j]'. + // DO NOT CALL THIS YOURSELF (RENUMBERING IS NOT TAKEN INTO ACCOUNT). + void tooriginal(std::vector>& ad, std::vector>& rc, std::vector& oad, std::vector& orc, std::vector>& maprctoorc); + // Inverse function of the above. 'maporctorc[2*i+0]' and 'maporctorc[2*i+1]' respectively + // give t and j such that the ith point in 'orc' corresponds to 'rc[t][3*j]'. + // DO NOT CALL THIS YOURSELF (RENUMBERING IS NOT TAKEN INTO ACCOUNT). + void fromoriginal(std::vector& oad, std::vector& orc, std::vector>& ad, std::vector>& rc, std::vector& maporctorc); + + // Get the corresponding point at the target. To each rc[i][3*j] is associated its corresponding transition element type and index in type + // (in targettranselems[i][2*j+0] and targettranselems[i][2*j+1]) and the associated reference coordinate in the target transition element. + void getattarget(std::vector>& ad, std::vector>& rc, htracker* target, std::vector>& targettranselems, std::vector>& targetrefcoords); + + // For a given transition element get the node/edge/face indexes of the original element (respectively in 'on', 'oe', 'of') + // in which each node/edge/face is (-1 if none). Data is only returned for boundaries. + void atoriginal(int transitiontype, int transitionnumber, int& originaltype, int& originalnumber, std::vector& on, std::vector& oe, std::vector& of); + + // Take a POSITIVE value for each leaf at the origin and return one for each leaf at the target. When values have to + // be merged the highest value is selected. This and the target htracker cannot differ by more than one adaptation. + void getattarget(std::vector& olv, htracker* target, std::vector& tlv); + + // Get the leaf number of a transition element: + int getleafnumber(int transitiontype, int transitionnumber); + + // Print the tree: + void print(void); + + // Length of 'splitdata': + int countbits(void); +}; + +#endif + diff --git a/include/mesh/mesh.h b/include/mesh/mesh.h new file mode 100644 index 00000000..2024cf81 --- /dev/null +++ b/include/mesh/mesh.h @@ -0,0 +1,117 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// This object is a wrapper of the actual mesh object 'rawmesh' pointed +// by 'rawmeshptr' and to which most of the functions are redirected. +// The purpose of this object is to wrap the 'rawmesh' object for a +// convenient user experience. +// An additional advantage is that the std::shared_ptr type pointer ensures +// the pointed 'rawmesh' object is always available when there is +// at least one object using it. + +#ifndef MESH_H +#define MESH_H + +#include +#include +#include +#include +#include "shape.h" +#include "rawmesh.h" +#include "field.h" +#include "expression.h" + +class field; +class expression; +class rawmesh; +class shape; + +class mesh +{ + private: + + bool isloaded = false; + void errorifloaded(void); + void errorifnotloaded(void); + + // The actual mesh: + std::shared_ptr rawmeshptr = NULL; + + public: + + mesh(void); + mesh(std::string filename, int verbosity = 1); + mesh(std::string filename, int globalgeometryskin, int numoverlaplayers, int verbosity = 1); + mesh(bool mergeduplicates, std::vector meshfiles, int verbosity = 1); + mesh(std::vector inputshapes, int verbosity = 1); + mesh(std::vector inputshapes, int globalgeometryskin, int numoverlaplayers, int verbosity = 1); + + // Load from file name: + void load(std::string name, int verbosity = 1); + void load(std::string name, int globalgeometryskin, int numoverlaplayers, int verbosity = 1); + // Load from multiple files: + void load(bool mergeduplicates, std::vector meshfiles, int verbosity = 1); + // Load from shape vector: + void load(std::vector inputshapes, int verbosity = 1); + void load(std::vector inputshapes, int globalgeometryskin, int numoverlaplayers, int verbosity = 1); + + // Write to file: + void write(int physreg, std::string name); + void write(std::string name, std::vector physregs = {-1}, int option = 1); + + // H-adaptivity: + void setadaptivity(expression criterion, int lownumsplits, int highnumsplits); + + // Split each element in the mesh n times: + void split(int n = 1); + + // Move the mesh in the x, y and z direction by a value given in the expression. + void move(int physreg, expression u); + void move(expression u); + // 'shift' translates the mesh in the 'x', 'y' and 'z' direction. + void shift(int physreg, double x, double y, double z); + void shift(double x, double y, double z); + // 'rotate' rotates the mesh by ax, ay and az degrees around the x, y and z axis respectively. + void rotate(int physreg, double ax, double ay, double az); + void rotate(double ax, double ay, double az); + // 'scale' scales the mesh in the 'x', 'y' and 'z' direction. + void scale(int physreg, double x, double y, double z); + void scale(double x, double y, double z); + + // 'getdimension' gives n for a mesh whose highest element dimension is n. + int getdimension(void); + + // Get the x, y and z mesh dimensions: + std::vector getdimensions(void); + std::vector printdimensions(void); + + // Get the physical regions of a given dimension (use -1 for all). + std::vector getphysicalregionnumbers(int dim = -1); + + // Additional region selection tools. Will become effective only after loading the mesh. Can reuse previous selections! + void selectskin(int newphysreg, int physregtoskin); + void selectskin(int newphysreg); + void selectbox(int newphysreg, int physregtobox, int selecteddim, std::vector boxlimit); + void selectbox(int newphysreg, int selecteddim, std::vector boxlimit); + void selectsphere(int newphysreg, int physregtosphere, int selecteddim, std::vector centercoords, double radius); + void selectsphere(int newphysreg, int selecteddim, std::vector centercoords, double radius); + void selectlayer(int newphysreg, int physregtoselectfrom, int physregtostartgrowth, int numlayers); + void selectlayer(int newphysreg, int physregtostartgrowth, int numlayers); + void selectexclusion(int newphysreg, int physregtoexcludefrom, std::vector physregstoexclude); + void selectexclusion(int newphysreg, std::vector physregstoexclude); + void selectanynode(int newphysreg, int physregtoselectfrom); + void selectanynode(int newphysreg); + + // Set this mesh as the one to use: + void use(void); + + std::shared_ptr getpointer(void) { return rawmeshptr; }; + +}; + + +#endif + diff --git a/src/mesh/mystring.h b/include/mesh/mystring.h old mode 100755 new mode 100644 similarity index 100% rename from src/mesh/mystring.h rename to include/mesh/mystring.h diff --git a/src/mesh/nodes.h b/include/mesh/nodes.h old mode 100755 new mode 100644 similarity index 100% rename from src/mesh/nodes.h rename to include/mesh/nodes.h diff --git a/src/mesh/petscmesh.h b/include/mesh/petscmesh.h old mode 100755 new mode 100644 similarity index 100% rename from src/mesh/petscmesh.h rename to include/mesh/petscmesh.h diff --git a/src/mesh/physicalregion.h b/include/mesh/physicalregion.h old mode 100755 new mode 100644 similarity index 100% rename from src/mesh/physicalregion.h rename to include/mesh/physicalregion.h diff --git a/src/mesh/physicalregions.h b/include/mesh/physicalregions.h old mode 100755 new mode 100644 similarity index 100% rename from src/mesh/physicalregions.h rename to include/mesh/physicalregions.h diff --git a/src/mesh/ptracker.h b/include/mesh/ptracker.h old mode 100755 new mode 100644 similarity index 100% rename from src/mesh/ptracker.h rename to include/mesh/ptracker.h diff --git a/src/mesh/rawmesh.h b/include/mesh/rawmesh.h old mode 100755 new mode 100644 similarity index 100% rename from src/mesh/rawmesh.h rename to include/mesh/rawmesh.h diff --git a/src/mesh/rawspanningtree.h b/include/mesh/rawspanningtree.h old mode 100755 new mode 100644 similarity index 100% rename from src/mesh/rawspanningtree.h rename to include/mesh/rawspanningtree.h diff --git a/src/mesh/referencecoordinategroup.h b/include/mesh/referencecoordinategroup.h old mode 100755 new mode 100644 similarity index 100% rename from src/mesh/referencecoordinategroup.h rename to include/mesh/referencecoordinategroup.h diff --git a/src/mesh/regiondefiner.h b/include/mesh/regiondefiner.h similarity index 100% rename from src/mesh/regiondefiner.h rename to include/mesh/regiondefiner.h diff --git a/src/mesh/spanningtree.h b/include/mesh/spanningtree.h similarity index 100% rename from src/mesh/spanningtree.h rename to include/mesh/spanningtree.h diff --git a/include/mystring.h b/include/mystring.h new file mode 100644 index 00000000..a3628a81 --- /dev/null +++ b/include/mystring.h @@ -0,0 +1,50 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef MYSTRING_H +#define MYSTRING_H + +#include +#include +#include +#include + +class mystring +{ + + private: + + int stringindex; + std::string stringtoprocess; + + public: + + mystring(std::string); + // 'setstringindex' is optional. The index is 0 by default. + void setstringindex(int stringindex); + + std::string getstring(void); + int getstringindex(void); + + // 'getstringtonextwhitespace' gets the string between the current + // string index and the next white space excluded. 'stringindex' + // is updated to the position of the next white space (or string end) + // plus 1. If no white space is found then the string is returned + // till the end. + std::string getstringtonextwhitespace(void); + // 'jumptonextwhitespace' moves 'stringindex' to the position of the + // next white space (or string end if none) plus 1. + void jumptonextwhitespace(void); + + // Similar to 'getstringtonextwhitespace'. + std::string getstringtonextcomma(void); + + std::string getstringwhileletter(void); + +}; + +#endif + diff --git a/include/nasdataline.h b/include/nasdataline.h new file mode 100644 index 00000000..5e0e143b --- /dev/null +++ b/include/nasdataline.h @@ -0,0 +1,64 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + +#ifndef NASDATALINE_H +#define NASDATALINE_H + +#include +#include +#include +#include "mystring.h" + +class nasdataline +{ + private: + + // Format 1 for 'small', 2 for 'large' and 3 for 'free'. + int lineformat = 0; + + bool isitgriddata = false; + bool isitelementdata = false; + + // For grid data: + std::vector nodecoordinate = std::vector(3,0); + + // For element data: + int elementtypenumber = -1; + int groupnumber = -1; + int currentvertexindex = 0; + std::vector vertices = {}; + + // Convert the element name to our type number and number of vertices: + std::vector translateelementname(std::string elemname); + + public: + + // Add a data line. True is returned in case any data can be returned + // (i.e. when at the end of multiple lines, not in a comment,...). + bool addline(std::string linetoadd); + + // Does the data correspond to grid data: + bool isgriddata(void) { return isitgriddata; }; + // Does the data correspond to element data (including the grid number list): + bool iselementdata(void) { return isitelementdata; }; + + ///// FOR GRID DATA. + // Only works if data is node data and when 'addline' has returned true. + std::vector getnodecoordinates(void) { return nodecoordinate; }; + + ///// FOR ELEMENT DATA. + // Only works if data is element data and when 'addline' has returned true. + // + // Get the element type number as defined in sparselizard: + int getelementtypenumber(void) { return elementtypenumber; }; + int getgroupnumber(void) { return groupnumber; }; + std::vector getvertices(void) { return vertices; }; + + // Format 1 for 'small', 2 for 'large' and 3 for 'free'. + int getformat(void) { return lineformat; }; +}; + +#endif + diff --git a/include/nastran/nasdataline.h b/include/nastran/nasdataline.h new file mode 100644 index 00000000..5e0e143b --- /dev/null +++ b/include/nastran/nasdataline.h @@ -0,0 +1,64 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + +#ifndef NASDATALINE_H +#define NASDATALINE_H + +#include +#include +#include +#include "mystring.h" + +class nasdataline +{ + private: + + // Format 1 for 'small', 2 for 'large' and 3 for 'free'. + int lineformat = 0; + + bool isitgriddata = false; + bool isitelementdata = false; + + // For grid data: + std::vector nodecoordinate = std::vector(3,0); + + // For element data: + int elementtypenumber = -1; + int groupnumber = -1; + int currentvertexindex = 0; + std::vector vertices = {}; + + // Convert the element name to our type number and number of vertices: + std::vector translateelementname(std::string elemname); + + public: + + // Add a data line. True is returned in case any data can be returned + // (i.e. when at the end of multiple lines, not in a comment,...). + bool addline(std::string linetoadd); + + // Does the data correspond to grid data: + bool isgriddata(void) { return isitgriddata; }; + // Does the data correspond to element data (including the grid number list): + bool iselementdata(void) { return isitelementdata; }; + + ///// FOR GRID DATA. + // Only works if data is node data and when 'addline' has returned true. + std::vector getnodecoordinates(void) { return nodecoordinate; }; + + ///// FOR ELEMENT DATA. + // Only works if data is element data and when 'addline' has returned true. + // + // Get the element type number as defined in sparselizard: + int getelementtypenumber(void) { return elementtypenumber; }; + int getgroupnumber(void) { return groupnumber; }; + std::vector getvertices(void) { return vertices; }; + + // Format 1 for 'small', 2 for 'large' and 3 for 'free'. + int getformat(void) { return lineformat; }; +}; + +#endif + diff --git a/include/nastran/nastraninterface.h b/include/nastran/nastraninterface.h new file mode 100644 index 00000000..066e9930 --- /dev/null +++ b/include/nastran/nastraninterface.h @@ -0,0 +1,27 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + +#ifndef NASTRANINTERFACE_H +#define NASTRANINTERFACE_H + +#include +#include "nodes.h" +#include "elements.h" +#include "physicalregions.h" +#include +#include +#include +#include +#include "physicalregion.h" +#include "element.h" +#include "nasdataline.h" + +namespace nastraninterface +{ + // Load the mesh to the 'nodes', 'elements' and 'physicalregions' objects. + void readfromfile(std::string name, nodes&, elements&, physicalregions&); +}; + +#endif diff --git a/include/nastraninterface.h b/include/nastraninterface.h new file mode 100644 index 00000000..066e9930 --- /dev/null +++ b/include/nastraninterface.h @@ -0,0 +1,27 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + +#ifndef NASTRANINTERFACE_H +#define NASTRANINTERFACE_H + +#include +#include "nodes.h" +#include "elements.h" +#include "physicalregions.h" +#include +#include +#include +#include +#include "physicalregion.h" +#include "element.h" +#include "nasdataline.h" + +namespace nastraninterface +{ + // Load the mesh to the 'nodes', 'elements' and 'physicalregions' objects. + void readfromfile(std::string name, nodes&, elements&, physicalregions&); +}; + +#endif diff --git a/include/nodes.h b/include/nodes.h new file mode 100644 index 00000000..d1768a7e --- /dev/null +++ b/include/nodes.h @@ -0,0 +1,54 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef NODES_H +#define NODES_H + +#include +#include +#include +#include + +class nodes +{ + + private: + + // Coordinates of every node. Format is [x1 y1 z1 x2 y2 z2 ... ]. + std::vector mycoordinates = {}; + + public: + + nodes(void); + + // Set the number of nodes. + void setnumber(int numberofnodes); + // Get the number of nodes: + int count(void); + // Get the coordinates: + std::vector* getcoordinates(void); + + // Print node coordinates for debugging: + void print(void); + + // 'removeduplicates' removes the duplicated nodes in 'mycoordinates'. + std::vector removeduplicates(void); + + // 'reorder' updates the node orders (i.e. renumbers them) in + // 'mycoordinates' based on the input vector. The reordering must be bijective. + void reorder(std::vector& nodereordering); + + // 'getgeometrydimension' gives the max length of the geometry in the x, y and z dimension. + std::vector getgeometrydimension(void); + // Get a round off noise threshold for each coordinate. + std::vector getnoisethreshold(void); + + // Set to zero all negative x coordinates if within the noise range. Throw an error if above the noise range. + void fixifaxisymmetric(void); + +}; + +#endif diff --git a/include/oncontext.h b/include/oncontext.h new file mode 100644 index 00000000..52fb99c2 --- /dev/null +++ b/include/oncontext.h @@ -0,0 +1,46 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef ONCONTEXT_H +#define ONCONTEXT_H + +#include +#include +#include +#include "expression.h" + +class oncontext +{ + + private: + + bool myisdefined = false; + + int myphysreg = -1; + bool myerrorifnotfound = true; + // Empty if not shifted: + std::vector mycoordshift = {}; + + public: + + oncontext(void) {}; + oncontext(int physreg, expression* coordshift, bool errorifnotfound); + + bool isdefined(void); + + int getphysicalregion(void); + + bool isshifted(void); + expression* getshift(void); + bool iserrorifnotfound(void); + + // Compare two oncontexes: + bool isequal(oncontext* tocompare); + +}; + +#endif + diff --git a/include/oneconstant.h b/include/oneconstant.h new file mode 100644 index 00000000..ffe8e1e7 --- /dev/null +++ b/include/oneconstant.h @@ -0,0 +1,45 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef ONECONSTANT_H +#define ONECONSTANT_H + +#include "hierarchicalformfunction.h" + +class oneconstant: public hierarchicalformfunction +{ + private: + + int targetdim = -1; + int elementtypenumber = -1; + int elementdimension = -1; + + public: + + oneconstant(int td, int et); + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 1; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); + + // If 'isorientationdependent' is false then the assembly can + // be carried out without taking care of the element orientation. + // This provides an assembly speedup. + bool isorientationdependent(int order) { return false; }; +}; + +#endif diff --git a/include/opabs.h b/include/opabs.h new file mode 100644 index 00000000..ee2e4428 --- /dev/null +++ b/include/opabs.h @@ -0,0 +1,41 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPABS_H +#define OPABS_H + +#include "operation.h" + +class opabs: public operation +{ + + private: + + bool reuse = false; + std::shared_ptr myarg; + + public: + + opabs(std::shared_ptr arg) { myarg = arg; }; + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::vector> getarguments(void) { return {myarg}; }; + std::shared_ptr simplify(std::vector disjregs); + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + + double evaluate(void); + std::vector evaluate(std::vector& xcoords, std::vector& ycoords, std::vector& zcoords); + + void print(void); + +}; + +#endif diff --git a/include/opacos.h b/include/opacos.h new file mode 100644 index 00000000..bfb0a848 --- /dev/null +++ b/include/opacos.h @@ -0,0 +1,41 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPACOS_H +#define OPACOS_H + +#include "operation.h" + +class opacos: public operation +{ + + private: + + bool reuse = false; + std::shared_ptr myarg; + + public: + + opacos(std::shared_ptr arg) { myarg = arg; }; + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::vector> getarguments(void) { return {myarg}; }; + std::shared_ptr simplify(std::vector disjregs); + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + + double evaluate(void); + std::vector evaluate(std::vector& xcoords, std::vector& ycoords, std::vector& zcoords); + + void print(void); + +}; + +#endif diff --git a/include/opasin.h b/include/opasin.h new file mode 100644 index 00000000..03a8dcb4 --- /dev/null +++ b/include/opasin.h @@ -0,0 +1,41 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPASIN_H +#define OPASIN_H + +#include "operation.h" + +class opasin: public operation +{ + + private: + + bool reuse = false; + std::shared_ptr myarg; + + public: + + opasin(std::shared_ptr arg) { myarg = arg; }; + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::vector> getarguments(void) { return {myarg}; }; + std::shared_ptr simplify(std::vector disjregs); + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + + double evaluate(void); + std::vector evaluate(std::vector& xcoords, std::vector& ycoords, std::vector& zcoords); + + void print(void); + +}; + +#endif diff --git a/include/opatan.h b/include/opatan.h new file mode 100644 index 00000000..3b0c9a37 --- /dev/null +++ b/include/opatan.h @@ -0,0 +1,41 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPATAN_H +#define OPATAN_H + +#include "operation.h" + +class opatan: public operation +{ + + private: + + bool reuse = false; + std::shared_ptr myarg; + + public: + + opatan(std::shared_ptr arg) { myarg = arg; }; + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::vector> getarguments(void) { return {myarg}; }; + std::shared_ptr simplify(std::vector disjregs); + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + + double evaluate(void); + std::vector evaluate(std::vector& xcoords, std::vector& ycoords, std::vector& zcoords); + + void print(void); + +}; + +#endif diff --git a/include/opathp.h b/include/opathp.h new file mode 100644 index 00000000..236b750f --- /dev/null +++ b/include/opathp.h @@ -0,0 +1,37 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPATHP_H +#define OPATHP_H + +#include "operation.h" + +class opathp: public operation +{ + + private: + + std::shared_ptr myarg; + + // Evaluation will be performed on this mesh state: + std::shared_ptr myrawmesh = NULL; + std::shared_ptr myptracker = NULL; + + public: + + opathp(std::shared_ptr arg, std::shared_ptr rm, std::shared_ptr pt); + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::vector> getarguments(void) { return {myarg}; }; + + bool isvalueorientationdependent(std::vector disjregs) { return false; }; + + void print(void); + +}; + +#endif diff --git a/include/opcondition.h b/include/opcondition.h new file mode 100644 index 00000000..77ea8491 --- /dev/null +++ b/include/opcondition.h @@ -0,0 +1,43 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPCONDITION_H +#define OPCONDITION_H + +#include "operation.h" + +class opcondition: public operation +{ + + private: + + bool reuse = false; + std::shared_ptr mycond; + std::shared_ptr mytrue; + std::shared_ptr myfalse; + + public: + + opcondition(std::shared_ptr condarg, std::shared_ptr truearg, std::shared_ptr falsearg); + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::vector> getarguments(void) { return {mycond, mytrue, myfalse}; }; + std::shared_ptr simplify(std::vector disjregs); + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + + double evaluate(void); + std::vector evaluate(std::vector& xcoords, std::vector& ycoords, std::vector& zcoords); + + void print(void); + +}; + +#endif diff --git a/include/opconstant.h b/include/opconstant.h new file mode 100644 index 00000000..405c7d09 --- /dev/null +++ b/include/opconstant.h @@ -0,0 +1,41 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPCONSTANT_H +#define OPCONSTANT_H + +#include "operation.h" + +class opconstant: public operation +{ + + private: + + bool reuse = false; + double constantvalue; + + public: + + opconstant(double val) { constantvalue = val; }; + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + bool isconstant(void) { return true; }; + double getvalue(void) { return constantvalue; }; + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + + double evaluate(void); + std::vector evaluate(std::vector& xcoords, std::vector& ycoords, std::vector& zcoords); + + void print(void); + +}; + +#endif diff --git a/include/opcos.h b/include/opcos.h new file mode 100644 index 00000000..b72a6bfb --- /dev/null +++ b/include/opcos.h @@ -0,0 +1,41 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPCOS_H +#define OPCOS_H + +#include "operation.h" + +class opcos: public operation +{ + + private: + + bool reuse = false; + std::shared_ptr myarg; + + public: + + opcos(std::shared_ptr arg) { myarg = arg; }; + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::vector> getarguments(void) { return {myarg}; }; + std::shared_ptr simplify(std::vector disjregs); + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + + double evaluate(void); + std::vector evaluate(std::vector& xcoords, std::vector& ycoords, std::vector& zcoords); + + void print(void); + +}; + +#endif diff --git a/include/opcustom.h b/include/opcustom.h new file mode 100644 index 00000000..cc94eb49 --- /dev/null +++ b/include/opcustom.h @@ -0,0 +1,49 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPCUSTOM_H +#define OPCUSTOM_H + +#include "operation.h" + +class opcustom: public operation +{ + + private: + + // Custom operations are always reused + + int myoutindex = -1; + + std::vector> myargs = {}; + std::vector myfields = {}; // for advanced custom function + + std::vector> myfamily = {}; + + std::vector (*myfunction)(std::vector) = NULL; + std::vector (*myadvancedfunction)(std::vector, std::vector, elementselector&, std::vector&, expression*) = NULL; + + public: + + opcustom(int outindex, std::vector fct(std::vector), std::vector> args); + opcustom(int outindex, std::vector fct(std::vector, std::vector, elementselector&, std::vector&, expression*), std::vector> args, std::vector infields); + + // Provide all related operations: + void setfamily(std::vector> ops) { myfamily = ops; }; + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::vector> getarguments(void) { return myargs; }; + std::shared_ptr simplify(std::vector disjregs); + + std::shared_ptr copy(void); + + void print(void); + +}; + +#endif diff --git a/include/opdetjac.h b/include/opdetjac.h new file mode 100644 index 00000000..0dda8a0e --- /dev/null +++ b/include/opdetjac.h @@ -0,0 +1,28 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPDETJAC_H +#define OPDETJAC_H + +#include "operation.h" + +class opdetjac: public operation +{ + + private: + + public: + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::shared_ptr copy(void); + + void print(void); + +}; + +#endif diff --git a/include/opdof.h b/include/opdof.h new file mode 100644 index 00000000..881151ed --- /dev/null +++ b/include/opdof.h @@ -0,0 +1,77 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPDOF_H +#define OPDOF_H + +#include "operation.h" + +class opdof: public operation +{ + + private: + + int timederivativeorder = 0; + // The space derivative is only temporary. It is split later on into + // a product of invjac terms and ki, eta and phi field derivatives. + // 0 is no derivative, 1 is x, 2 is y and 3 is z. + int spacederivative = 0; + // 0 is no derivative, 1 is ki, 2 is eta and 3 is phi. + int kietaphiderivative = 0; + + // The selected form function component in the field: + int formfunctioncomponent = 0; + // For printing purposes: + int fieldcomponent = -1; + + std::shared_ptr myfield; + + int myphysicalregion; + + + // In case of dof interpolation: + std::vector myoncontext = {}; + + public: + + opdof(std::shared_ptr fieldin, int physreg = -1); + + void setspacederivative(int whichderivative); + void increasetimederivativeorder(int amount); + void selectformfunctioncomponent(int comp) { formfunctioncomponent = comp; }; + + void setfieldcomponent(int comp) { fieldcomponent = comp; }; + + void setkietaphiderivative(int whichderivative) { kietaphiderivative = whichderivative; spacederivative = 0; }; + int getkietaphiderivative(void) { return kietaphiderivative; }; + + bool isdof(void) { return true; }; + + bool isharmonicone(std::vector disjregs); + + std::shared_ptr getfieldpointer(void) { return myfield; }; + bool isphysicalregiondefined(void) { return (myphysicalregion != -1); }; + int getphysicalregion(void) { return myphysicalregion; }; + int getspacederivative(void) { return spacederivative; }; + int gettimederivative(void) { return timederivativeorder; }; + int getformfunctioncomponent(void) { return formfunctioncomponent; }; + int getfieldcomponent(void) { return fieldcomponent; }; + + bool isvalueorientationdependent(std::vector disjregs); + + std::shared_ptr copy(void); + + void print(void); + + + // In case of dof interpolation: + bool ison(void); + void setoncontext(oncontext& cntxt); + oncontext* getoncontext(void); + +}; + +#endif diff --git a/include/opdtapprox.h b/include/opdtapprox.h new file mode 100644 index 00000000..0abeb479 --- /dev/null +++ b/include/opdtapprox.h @@ -0,0 +1,49 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPDTAPPROX_H +#define OPDTAPPROX_H + +#include "operation.h" + +class opdtapprox: public operation +{ + + private: + + int mydtorder; + + std::shared_ptr myarg; + + // Approximated dtx, dtdtx: + double mydtx, mydtdtx; + + std::vector mydtbkps = {}; + + public: + + opdtapprox(int dtorder, std::shared_ptr arg, double initdtx, double initdtdtx); + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::vector> getarguments(void) { return {myarg}; }; + std::shared_ptr simplify(std::vector disjregs); + + std::shared_ptr copy(void); + + double evaluate(void); + std::vector evaluate(std::vector& xcoords, std::vector& ycoords, std::vector& zcoords); + + void nextimpliciteuler(double tinit, double dt); + void nextgenalpha(double beta, double gamma, double alphaf, double alpham, double tinit, double dt); + + void approvetimestep(void); + + void print(void); + +}; + +#endif diff --git a/include/operation.h b/include/operation.h new file mode 100644 index 00000000..d1d8d2cb --- /dev/null +++ b/include/operation.h @@ -0,0 +1,200 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPERATION_H +#define OPERATION_H + +#include +#include +#include "densemat.h" +#include "universe.h" +#include "harmonic.h" +#include "jacobian.h" +#include +#include +#include "rawfield.h" +#include "rawparameter.h" +#include "selector.h" +#include "elementselector.h" +#include "hierarchicalformfunction.h" +#include "oncontext.h" +#include "rawport.h" + +// ALL SON-OPERATIONS ARE INCLUDED AT THE END OF THIS HEADER. + +class rawfield; +class rawparameter; +class rawport; +class oncontext; + +class operation : public std::enable_shared_from_this +{ + + private: + + public: + + // Print the operation: + virtual void print(void) {}; + + // Interpolate the operation on the evaluation coordinates. + // The returned value taken at [harm][0] gives the value of the + // harmonic harm. If ...[harm].size() is zero the harmonic is zero. + // This function can be used for non multiharmonic as well as + // LINEAR multiharmonic operations. In the first case only + // harmonic 1 (cos0) can be used. + virtual std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + // 'multiharmonicinterpolate' works for general nonlinear + // multiharmonic operations. It returns a matrix in which each + // column corresponds to a data point (e.g. an operation evaluated + // at an evaluation point) and each of the 'numtimeevals' rows to + // a time value at which the multiharmonic operation was computed. + // 'fourier.h' can be used to get back the harmonics from that matrix. + virtual densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + // This 'interpolate' is used only in the Jacobian computation. + virtual std::vector> interpolate(int kietaphiderivative, elementselector& elemselect, std::vector& evaluationcoordinates); + + virtual bool isdof(void) { return false; }; + virtual bool istf(void) { return false; }; + virtual bool issum(void) { return false; }; + virtual bool isproduct(void) { return false; }; + virtual bool isfield(void) { return false; }; + virtual bool isconstant(void) { return false; }; + virtual bool isparameter(void) { return false; }; + virtual bool isport(void) { return false; }; + + // True if the expression is a constant 0: + bool iszero(void); + + // True if the expression includes or is a dof/tf: + virtual bool isdofincluded(void); + virtual bool istfincluded(void); + + virtual bool isportincluded(void); + + // True if the operation only includes harmonic 1: + virtual bool isharmonicone(std::vector disjregs); + + // Get the value of a constant expression: + virtual double getvalue(void) { abort(); }; // fix return warning + + // Get the rawparameter of a parameter operation: + virtual std::shared_ptr getparameterpointer(void); + + // Get the selected row/column of a parameter operation: + virtual int getselectedrow(void) { abort(); }; // fix return warning + virtual int getselectedcol(void) { abort(); }; // fix return warning + + // Get the rawport of a port operation: + virtual std::shared_ptr getportpointer(void); + + // Get the field pointer of expressions including a field: + virtual std::shared_ptr getfieldpointer(void); + + // Remove the term of a sum or product: + virtual void removeterm(int whichterm) {}; + // Count the number of sum or product terms: + virtual int count(void) { abort(); }; // fix return warning + + // Set a flag on this operation so that when an operation + // 'op' including at least once this operation is + // interpolated this operation is only computed once + // and then reused for all other occurences in 'op'. + virtual void reuseit(bool istobereused) {}; + virtual bool isreused(void); + + // Set derivatives for fields, dofs and tfs: + virtual void setspacederivative(int whichderivative); + virtual void setkietaphiderivative(int whichderivative); + virtual void increasetimederivativeorder(int derivativeorder); + + // Get info for fields, dofs and tfs: + virtual int getphysicalregion(void) { abort(); }; // fix return warning + virtual int getspacederivative(void) { abort(); }; // fix return warning + virtual int gettimederivative(void) { abort(); }; // fix return warning + virtual int getkietaphiderivative(void) { abort(); }; // fix return warning + + // Get the 'argnum'th argument: + virtual std::shared_ptr getargument(int argnum) { abort(); }; // fix return warning + // Replace the 'argnum'th argument: + virtual void replaceargument(int argnum, std::shared_ptr newarg) {}; + + // Get the form function component number used in the field, dof or tf: + virtual int getformfunctioncomponent(void) { abort(); }; // fix return warning + // Know which subfield of the original field it was: + virtual int getfieldcomponent(void) { abort(); }; // fix return warning + + // True if the operation can be interpolated on all elements in + // the disjoint regions, no matter their total orientation number: + virtual bool isvalueorientationdependent(std::vector disjregs); + + // Duplicate the operation (argument operations are not duplicated!): + virtual std::shared_ptr copy(void); + + // Get the arguments of the operation (if any): + virtual std::vector> getarguments(void) { return {}; }; + + // Expand the operation: + virtual std::shared_ptr expand(void) { return shared_from_this(); }; + // Group all sum/product terms together: + virtual void group(void) {}; + // Simplify the operation as it is on the disjoint regions: + virtual std::shared_ptr simplify(std::vector disjregs) { return shared_from_this(); }; + + // Evaluate a space-independent scalar operation: + virtual double evaluate(void); + // Same but allow x, y and/or z fields without derivatives: + virtual std::vector evaluate(std::vector& xcoords, std::vector& ycoords, std::vector& zcoords); + + virtual double evaluateattime(double tm); + + // For dof interpolation: + virtual bool ison(void) { abort(); }; // fix return warning + virtual void setoncontext(oncontext& cntxt) {}; + virtual oncontext* getoncontext(void) { abort(); }; // fix return warning + + virtual void nextimpliciteuler(double tinit, double dt) {}; + virtual void nextgenalpha(double beta, double gamma, double alphaf, double alpham, double tinit, double dt) {}; + virtual void approvetimestep(void) {}; +}; + +#include "opabs.h" +#include "opacos.h" +#include "opasin.h" +#include "opatan.h" +#include "opathp.h" +#include "opcondition.h" +#include "opconstant.h" +#include "opcos.h" +#include "opcustom.h" +#include "opdetjac.h" +#include "opdof.h" +#include "opdtapprox.h" +#include "opestimator.h" +#include "opfield.h" +#include "opfieldorder.h" +#include "opharmonic.h" +#include "opinversion.h" +#include "opinvjac.h" +#include "opjac.h" +#include "oplog.h" +#include "opmeshsize.h" +#include "opmod.h" +#include "opon.h" +#include "oporientation.h" +#include "opparameter.h" +#include "opport.h" +#include "oppower.h" +#include "opproduct.h" +#include "opsin.h" +#include "opspline.h" +#include "opsum.h" +#include "optan.h" +#include "optf.h" +#include "optime.h" + +#endif diff --git a/include/operation/opabs.h b/include/operation/opabs.h new file mode 100644 index 00000000..ee2e4428 --- /dev/null +++ b/include/operation/opabs.h @@ -0,0 +1,41 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPABS_H +#define OPABS_H + +#include "operation.h" + +class opabs: public operation +{ + + private: + + bool reuse = false; + std::shared_ptr myarg; + + public: + + opabs(std::shared_ptr arg) { myarg = arg; }; + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::vector> getarguments(void) { return {myarg}; }; + std::shared_ptr simplify(std::vector disjregs); + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + + double evaluate(void); + std::vector evaluate(std::vector& xcoords, std::vector& ycoords, std::vector& zcoords); + + void print(void); + +}; + +#endif diff --git a/include/operation/opacos.h b/include/operation/opacos.h new file mode 100644 index 00000000..bfb0a848 --- /dev/null +++ b/include/operation/opacos.h @@ -0,0 +1,41 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPACOS_H +#define OPACOS_H + +#include "operation.h" + +class opacos: public operation +{ + + private: + + bool reuse = false; + std::shared_ptr myarg; + + public: + + opacos(std::shared_ptr arg) { myarg = arg; }; + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::vector> getarguments(void) { return {myarg}; }; + std::shared_ptr simplify(std::vector disjregs); + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + + double evaluate(void); + std::vector evaluate(std::vector& xcoords, std::vector& ycoords, std::vector& zcoords); + + void print(void); + +}; + +#endif diff --git a/include/operation/opasin.h b/include/operation/opasin.h new file mode 100644 index 00000000..03a8dcb4 --- /dev/null +++ b/include/operation/opasin.h @@ -0,0 +1,41 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPASIN_H +#define OPASIN_H + +#include "operation.h" + +class opasin: public operation +{ + + private: + + bool reuse = false; + std::shared_ptr myarg; + + public: + + opasin(std::shared_ptr arg) { myarg = arg; }; + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::vector> getarguments(void) { return {myarg}; }; + std::shared_ptr simplify(std::vector disjregs); + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + + double evaluate(void); + std::vector evaluate(std::vector& xcoords, std::vector& ycoords, std::vector& zcoords); + + void print(void); + +}; + +#endif diff --git a/include/operation/opatan.h b/include/operation/opatan.h new file mode 100644 index 00000000..3b0c9a37 --- /dev/null +++ b/include/operation/opatan.h @@ -0,0 +1,41 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPATAN_H +#define OPATAN_H + +#include "operation.h" + +class opatan: public operation +{ + + private: + + bool reuse = false; + std::shared_ptr myarg; + + public: + + opatan(std::shared_ptr arg) { myarg = arg; }; + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::vector> getarguments(void) { return {myarg}; }; + std::shared_ptr simplify(std::vector disjregs); + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + + double evaluate(void); + std::vector evaluate(std::vector& xcoords, std::vector& ycoords, std::vector& zcoords); + + void print(void); + +}; + +#endif diff --git a/include/operation/opathp.h b/include/operation/opathp.h new file mode 100644 index 00000000..236b750f --- /dev/null +++ b/include/operation/opathp.h @@ -0,0 +1,37 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPATHP_H +#define OPATHP_H + +#include "operation.h" + +class opathp: public operation +{ + + private: + + std::shared_ptr myarg; + + // Evaluation will be performed on this mesh state: + std::shared_ptr myrawmesh = NULL; + std::shared_ptr myptracker = NULL; + + public: + + opathp(std::shared_ptr arg, std::shared_ptr rm, std::shared_ptr pt); + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::vector> getarguments(void) { return {myarg}; }; + + bool isvalueorientationdependent(std::vector disjregs) { return false; }; + + void print(void); + +}; + +#endif diff --git a/include/operation/opcondition.h b/include/operation/opcondition.h new file mode 100644 index 00000000..77ea8491 --- /dev/null +++ b/include/operation/opcondition.h @@ -0,0 +1,43 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPCONDITION_H +#define OPCONDITION_H + +#include "operation.h" + +class opcondition: public operation +{ + + private: + + bool reuse = false; + std::shared_ptr mycond; + std::shared_ptr mytrue; + std::shared_ptr myfalse; + + public: + + opcondition(std::shared_ptr condarg, std::shared_ptr truearg, std::shared_ptr falsearg); + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::vector> getarguments(void) { return {mycond, mytrue, myfalse}; }; + std::shared_ptr simplify(std::vector disjregs); + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + + double evaluate(void); + std::vector evaluate(std::vector& xcoords, std::vector& ycoords, std::vector& zcoords); + + void print(void); + +}; + +#endif diff --git a/include/operation/opconstant.h b/include/operation/opconstant.h new file mode 100644 index 00000000..405c7d09 --- /dev/null +++ b/include/operation/opconstant.h @@ -0,0 +1,41 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPCONSTANT_H +#define OPCONSTANT_H + +#include "operation.h" + +class opconstant: public operation +{ + + private: + + bool reuse = false; + double constantvalue; + + public: + + opconstant(double val) { constantvalue = val; }; + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + bool isconstant(void) { return true; }; + double getvalue(void) { return constantvalue; }; + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + + double evaluate(void); + std::vector evaluate(std::vector& xcoords, std::vector& ycoords, std::vector& zcoords); + + void print(void); + +}; + +#endif diff --git a/include/operation/opcos.h b/include/operation/opcos.h new file mode 100644 index 00000000..b72a6bfb --- /dev/null +++ b/include/operation/opcos.h @@ -0,0 +1,41 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPCOS_H +#define OPCOS_H + +#include "operation.h" + +class opcos: public operation +{ + + private: + + bool reuse = false; + std::shared_ptr myarg; + + public: + + opcos(std::shared_ptr arg) { myarg = arg; }; + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::vector> getarguments(void) { return {myarg}; }; + std::shared_ptr simplify(std::vector disjregs); + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + + double evaluate(void); + std::vector evaluate(std::vector& xcoords, std::vector& ycoords, std::vector& zcoords); + + void print(void); + +}; + +#endif diff --git a/include/operation/opcustom.h b/include/operation/opcustom.h new file mode 100644 index 00000000..cc94eb49 --- /dev/null +++ b/include/operation/opcustom.h @@ -0,0 +1,49 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPCUSTOM_H +#define OPCUSTOM_H + +#include "operation.h" + +class opcustom: public operation +{ + + private: + + // Custom operations are always reused + + int myoutindex = -1; + + std::vector> myargs = {}; + std::vector myfields = {}; // for advanced custom function + + std::vector> myfamily = {}; + + std::vector (*myfunction)(std::vector) = NULL; + std::vector (*myadvancedfunction)(std::vector, std::vector, elementselector&, std::vector&, expression*) = NULL; + + public: + + opcustom(int outindex, std::vector fct(std::vector), std::vector> args); + opcustom(int outindex, std::vector fct(std::vector, std::vector, elementselector&, std::vector&, expression*), std::vector> args, std::vector infields); + + // Provide all related operations: + void setfamily(std::vector> ops) { myfamily = ops; }; + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::vector> getarguments(void) { return myargs; }; + std::shared_ptr simplify(std::vector disjregs); + + std::shared_ptr copy(void); + + void print(void); + +}; + +#endif diff --git a/include/operation/opdetjac.h b/include/operation/opdetjac.h new file mode 100644 index 00000000..0dda8a0e --- /dev/null +++ b/include/operation/opdetjac.h @@ -0,0 +1,28 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPDETJAC_H +#define OPDETJAC_H + +#include "operation.h" + +class opdetjac: public operation +{ + + private: + + public: + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::shared_ptr copy(void); + + void print(void); + +}; + +#endif diff --git a/include/operation/opdof.h b/include/operation/opdof.h new file mode 100644 index 00000000..881151ed --- /dev/null +++ b/include/operation/opdof.h @@ -0,0 +1,77 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPDOF_H +#define OPDOF_H + +#include "operation.h" + +class opdof: public operation +{ + + private: + + int timederivativeorder = 0; + // The space derivative is only temporary. It is split later on into + // a product of invjac terms and ki, eta and phi field derivatives. + // 0 is no derivative, 1 is x, 2 is y and 3 is z. + int spacederivative = 0; + // 0 is no derivative, 1 is ki, 2 is eta and 3 is phi. + int kietaphiderivative = 0; + + // The selected form function component in the field: + int formfunctioncomponent = 0; + // For printing purposes: + int fieldcomponent = -1; + + std::shared_ptr myfield; + + int myphysicalregion; + + + // In case of dof interpolation: + std::vector myoncontext = {}; + + public: + + opdof(std::shared_ptr fieldin, int physreg = -1); + + void setspacederivative(int whichderivative); + void increasetimederivativeorder(int amount); + void selectformfunctioncomponent(int comp) { formfunctioncomponent = comp; }; + + void setfieldcomponent(int comp) { fieldcomponent = comp; }; + + void setkietaphiderivative(int whichderivative) { kietaphiderivative = whichderivative; spacederivative = 0; }; + int getkietaphiderivative(void) { return kietaphiderivative; }; + + bool isdof(void) { return true; }; + + bool isharmonicone(std::vector disjregs); + + std::shared_ptr getfieldpointer(void) { return myfield; }; + bool isphysicalregiondefined(void) { return (myphysicalregion != -1); }; + int getphysicalregion(void) { return myphysicalregion; }; + int getspacederivative(void) { return spacederivative; }; + int gettimederivative(void) { return timederivativeorder; }; + int getformfunctioncomponent(void) { return formfunctioncomponent; }; + int getfieldcomponent(void) { return fieldcomponent; }; + + bool isvalueorientationdependent(std::vector disjregs); + + std::shared_ptr copy(void); + + void print(void); + + + // In case of dof interpolation: + bool ison(void); + void setoncontext(oncontext& cntxt); + oncontext* getoncontext(void); + +}; + +#endif diff --git a/include/operation/opdtapprox.h b/include/operation/opdtapprox.h new file mode 100644 index 00000000..0abeb479 --- /dev/null +++ b/include/operation/opdtapprox.h @@ -0,0 +1,49 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPDTAPPROX_H +#define OPDTAPPROX_H + +#include "operation.h" + +class opdtapprox: public operation +{ + + private: + + int mydtorder; + + std::shared_ptr myarg; + + // Approximated dtx, dtdtx: + double mydtx, mydtdtx; + + std::vector mydtbkps = {}; + + public: + + opdtapprox(int dtorder, std::shared_ptr arg, double initdtx, double initdtdtx); + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::vector> getarguments(void) { return {myarg}; }; + std::shared_ptr simplify(std::vector disjregs); + + std::shared_ptr copy(void); + + double evaluate(void); + std::vector evaluate(std::vector& xcoords, std::vector& ycoords, std::vector& zcoords); + + void nextimpliciteuler(double tinit, double dt); + void nextgenalpha(double beta, double gamma, double alphaf, double alpham, double tinit, double dt); + + void approvetimestep(void); + + void print(void); + +}; + +#endif diff --git a/include/operation/operation.h b/include/operation/operation.h new file mode 100644 index 00000000..d1d8d2cb --- /dev/null +++ b/include/operation/operation.h @@ -0,0 +1,200 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPERATION_H +#define OPERATION_H + +#include +#include +#include "densemat.h" +#include "universe.h" +#include "harmonic.h" +#include "jacobian.h" +#include +#include +#include "rawfield.h" +#include "rawparameter.h" +#include "selector.h" +#include "elementselector.h" +#include "hierarchicalformfunction.h" +#include "oncontext.h" +#include "rawport.h" + +// ALL SON-OPERATIONS ARE INCLUDED AT THE END OF THIS HEADER. + +class rawfield; +class rawparameter; +class rawport; +class oncontext; + +class operation : public std::enable_shared_from_this +{ + + private: + + public: + + // Print the operation: + virtual void print(void) {}; + + // Interpolate the operation on the evaluation coordinates. + // The returned value taken at [harm][0] gives the value of the + // harmonic harm. If ...[harm].size() is zero the harmonic is zero. + // This function can be used for non multiharmonic as well as + // LINEAR multiharmonic operations. In the first case only + // harmonic 1 (cos0) can be used. + virtual std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + // 'multiharmonicinterpolate' works for general nonlinear + // multiharmonic operations. It returns a matrix in which each + // column corresponds to a data point (e.g. an operation evaluated + // at an evaluation point) and each of the 'numtimeevals' rows to + // a time value at which the multiharmonic operation was computed. + // 'fourier.h' can be used to get back the harmonics from that matrix. + virtual densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + // This 'interpolate' is used only in the Jacobian computation. + virtual std::vector> interpolate(int kietaphiderivative, elementselector& elemselect, std::vector& evaluationcoordinates); + + virtual bool isdof(void) { return false; }; + virtual bool istf(void) { return false; }; + virtual bool issum(void) { return false; }; + virtual bool isproduct(void) { return false; }; + virtual bool isfield(void) { return false; }; + virtual bool isconstant(void) { return false; }; + virtual bool isparameter(void) { return false; }; + virtual bool isport(void) { return false; }; + + // True if the expression is a constant 0: + bool iszero(void); + + // True if the expression includes or is a dof/tf: + virtual bool isdofincluded(void); + virtual bool istfincluded(void); + + virtual bool isportincluded(void); + + // True if the operation only includes harmonic 1: + virtual bool isharmonicone(std::vector disjregs); + + // Get the value of a constant expression: + virtual double getvalue(void) { abort(); }; // fix return warning + + // Get the rawparameter of a parameter operation: + virtual std::shared_ptr getparameterpointer(void); + + // Get the selected row/column of a parameter operation: + virtual int getselectedrow(void) { abort(); }; // fix return warning + virtual int getselectedcol(void) { abort(); }; // fix return warning + + // Get the rawport of a port operation: + virtual std::shared_ptr getportpointer(void); + + // Get the field pointer of expressions including a field: + virtual std::shared_ptr getfieldpointer(void); + + // Remove the term of a sum or product: + virtual void removeterm(int whichterm) {}; + // Count the number of sum or product terms: + virtual int count(void) { abort(); }; // fix return warning + + // Set a flag on this operation so that when an operation + // 'op' including at least once this operation is + // interpolated this operation is only computed once + // and then reused for all other occurences in 'op'. + virtual void reuseit(bool istobereused) {}; + virtual bool isreused(void); + + // Set derivatives for fields, dofs and tfs: + virtual void setspacederivative(int whichderivative); + virtual void setkietaphiderivative(int whichderivative); + virtual void increasetimederivativeorder(int derivativeorder); + + // Get info for fields, dofs and tfs: + virtual int getphysicalregion(void) { abort(); }; // fix return warning + virtual int getspacederivative(void) { abort(); }; // fix return warning + virtual int gettimederivative(void) { abort(); }; // fix return warning + virtual int getkietaphiderivative(void) { abort(); }; // fix return warning + + // Get the 'argnum'th argument: + virtual std::shared_ptr getargument(int argnum) { abort(); }; // fix return warning + // Replace the 'argnum'th argument: + virtual void replaceargument(int argnum, std::shared_ptr newarg) {}; + + // Get the form function component number used in the field, dof or tf: + virtual int getformfunctioncomponent(void) { abort(); }; // fix return warning + // Know which subfield of the original field it was: + virtual int getfieldcomponent(void) { abort(); }; // fix return warning + + // True if the operation can be interpolated on all elements in + // the disjoint regions, no matter their total orientation number: + virtual bool isvalueorientationdependent(std::vector disjregs); + + // Duplicate the operation (argument operations are not duplicated!): + virtual std::shared_ptr copy(void); + + // Get the arguments of the operation (if any): + virtual std::vector> getarguments(void) { return {}; }; + + // Expand the operation: + virtual std::shared_ptr expand(void) { return shared_from_this(); }; + // Group all sum/product terms together: + virtual void group(void) {}; + // Simplify the operation as it is on the disjoint regions: + virtual std::shared_ptr simplify(std::vector disjregs) { return shared_from_this(); }; + + // Evaluate a space-independent scalar operation: + virtual double evaluate(void); + // Same but allow x, y and/or z fields without derivatives: + virtual std::vector evaluate(std::vector& xcoords, std::vector& ycoords, std::vector& zcoords); + + virtual double evaluateattime(double tm); + + // For dof interpolation: + virtual bool ison(void) { abort(); }; // fix return warning + virtual void setoncontext(oncontext& cntxt) {}; + virtual oncontext* getoncontext(void) { abort(); }; // fix return warning + + virtual void nextimpliciteuler(double tinit, double dt) {}; + virtual void nextgenalpha(double beta, double gamma, double alphaf, double alpham, double tinit, double dt) {}; + virtual void approvetimestep(void) {}; +}; + +#include "opabs.h" +#include "opacos.h" +#include "opasin.h" +#include "opatan.h" +#include "opathp.h" +#include "opcondition.h" +#include "opconstant.h" +#include "opcos.h" +#include "opcustom.h" +#include "opdetjac.h" +#include "opdof.h" +#include "opdtapprox.h" +#include "opestimator.h" +#include "opfield.h" +#include "opfieldorder.h" +#include "opharmonic.h" +#include "opinversion.h" +#include "opinvjac.h" +#include "opjac.h" +#include "oplog.h" +#include "opmeshsize.h" +#include "opmod.h" +#include "opon.h" +#include "oporientation.h" +#include "opparameter.h" +#include "opport.h" +#include "oppower.h" +#include "opproduct.h" +#include "opsin.h" +#include "opspline.h" +#include "opsum.h" +#include "optan.h" +#include "optf.h" +#include "optime.h" + +#endif diff --git a/include/operation/opestimator.h b/include/operation/opestimator.h new file mode 100644 index 00000000..c3fbe253 --- /dev/null +++ b/include/operation/opestimator.h @@ -0,0 +1,53 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPESTIMATOR_H +#define OPESTIMATOR_H + +#include "operation.h" +#include "opfield.h" + +class opfield; + +class opestimator: public operation +{ + + private: + + bool reuse = false; + // Estimator type: + std::string mytype = ""; + std::shared_ptr myarg; + + // This contains the estimated value: + std::shared_ptr myvalue = NULL; + + long long int mystatenumber = 0; + + public: + + opestimator(std::string estimatortype, std::shared_ptr arg); + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::vector> getarguments(void) { return {myarg}; }; + std::shared_ptr simplify(std::vector disjregs); + + bool isvalueorientationdependent(std::vector disjregs) { return false; }; + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + + void print(void); + + // Update 'myvalue' with the estimate: + void estimatezienkiewiczzhu(void); + +}; + +#endif diff --git a/include/operation/opfield.h b/include/operation/opfield.h new file mode 100644 index 00000000..a6929e68 --- /dev/null +++ b/include/operation/opfield.h @@ -0,0 +1,70 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPFIELD_H +#define OPFIELD_H + +#include "operation.h" + +class opfield: public operation +{ + + private: + + // Fields are always reused + + int timederivativeorder = 0; + // 0 is no derivative, 1 is x, 2 is y and 3 is z. + int spacederivative = 0; + // 0 is no derivative, 1 is ki, 2 is eta and 3 is phi. + int kietaphiderivative = 0; + + // The selected form function component in the field: + int formfunctioncomponent = 0; + // For printing purposes: + int fieldcomponent = -1; + + std::shared_ptr myfield; + + public: + + opfield(std::shared_ptr fieldin) { myfield = fieldin; }; + + void setspacederivative(int whichderivative); + void setkietaphiderivative(int whichderivative); + void increasetimederivativeorder(int amount); + void selectformfunctioncomponent(int comp) { formfunctioncomponent = comp; }; + + void setfieldcomponent(int comp) { fieldcomponent = comp; }; + + bool isfield(void) { return true; }; + + bool isharmonicone(std::vector disjregs); + + // This 'interpolate' is used only in the Jacobian computation. + std::vector> interpolate(int kietaphiderivative, elementselector& elemselect, std::vector& evaluationcoordinates); + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::shared_ptr getfieldpointer(void) { return myfield; }; + int getformfunctioncomponent(void) { return formfunctioncomponent; }; + int getfieldcomponent(void) { return fieldcomponent; }; + int getspacederivative(void) { return spacederivative; }; + int getkietaphiderivative(void) { return kietaphiderivative; }; + int gettimederivative(void) { return timederivativeorder; }; + + bool isvalueorientationdependent(std::vector disjregs); + + std::shared_ptr copy(void); + + std::vector evaluate(std::vector& xcoords, std::vector& ycoords, std::vector& zcoords); + + void print(void); + +}; + +#endif diff --git a/include/operation/opfieldorder.h b/include/operation/opfieldorder.h new file mode 100644 index 00000000..52c78077 --- /dev/null +++ b/include/operation/opfieldorder.h @@ -0,0 +1,39 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPFIELDORDER_H +#define OPFIELDORDER_H + +#include "operation.h" + +class opfieldorder: public operation +{ + + private: + + bool reuse = false; + + double myalpha = -1.0; + double mythreshold = 0.0; + + std::vector> myfields = {}; + + public: + + opfieldorder(std::vector> fieldsin, double alpha = -1.0, double absthres = 0.0); + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + + void print(void); + +}; + +#endif diff --git a/include/operation/opharmonic.h b/include/operation/opharmonic.h new file mode 100644 index 00000000..8d71627a --- /dev/null +++ b/include/operation/opharmonic.h @@ -0,0 +1,45 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPHARMONIC_H +#define OPHARMONIC_H + +#include "operation.h" + +class opharmonic: public operation +{ + + private: + + bool reuse = false; + std::shared_ptr myarg; + + int mynumfftharms; + + std::vector myorigharms; + std::vector mydestharms; + + public: + + opharmonic(std::vector origharms, std::vector destharms, std::shared_ptr arg, int numfftharms); + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + bool isharmonicone(std::vector disjregs); + + std::vector> getarguments(void) { return {myarg}; }; + std::shared_ptr simplify(std::vector disjregs); + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + + void print(void); + +}; + +#endif diff --git a/include/operation/opinversion.h b/include/operation/opinversion.h new file mode 100644 index 00000000..09fe6b8a --- /dev/null +++ b/include/operation/opinversion.h @@ -0,0 +1,41 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPINVERSION_H +#define OPINVERSION_H + +#include "operation.h" + +class opinversion: public operation +{ + + private: + + bool reuse = false; + std::shared_ptr myarg; + + public: + + opinversion(std::shared_ptr arg) { myarg = arg; }; + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::vector> getarguments(void) { return {myarg}; }; + std::shared_ptr simplify(std::vector disjregs); + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + + double evaluate(void); + std::vector evaluate(std::vector& xcoords, std::vector& ycoords, std::vector& zcoords); + + void print(void); + +}; + +#endif diff --git a/include/operation/opinvjac.h b/include/operation/opinvjac.h new file mode 100644 index 00000000..fb03a1d7 --- /dev/null +++ b/include/operation/opinvjac.h @@ -0,0 +1,33 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPINVJAC_H +#define OPINVJAC_H + +#include "operation.h" + +class opinvjac: public operation +{ + + private: + + int myrow, mycol; + + public: + + // Define as invjac(m,n): + opinvjac(int m, int n) { myrow = m; mycol = n; }; + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::shared_ptr copy(void); + + void print(void); + +}; + +#endif diff --git a/include/operation/opjac.h b/include/operation/opjac.h new file mode 100644 index 00000000..1b189e9a --- /dev/null +++ b/include/operation/opjac.h @@ -0,0 +1,33 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPJAC_H +#define OPJAC_H + +#include "operation.h" + +class opjac: public operation +{ + + private: + + int myrow, mycol; + + public: + + // Define as jac(m,n): + opjac(int m, int n) { myrow = m; mycol = n; }; + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::shared_ptr copy(void); + + void print(void); + +}; + +#endif diff --git a/include/operation/oplog.h b/include/operation/oplog.h new file mode 100644 index 00000000..a106aebf --- /dev/null +++ b/include/operation/oplog.h @@ -0,0 +1,41 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPLOG_H +#define OPLOG_H + +#include "operation.h" + +class oplog: public operation +{ + + private: + + bool reuse = false; + std::shared_ptr myarg; + + public: + + oplog(std::shared_ptr arg) { myarg = arg; }; + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::vector> getarguments(void) { return {myarg}; }; + std::shared_ptr simplify(std::vector disjregs); + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + + double evaluate(void); + std::vector evaluate(std::vector& xcoords, std::vector& ycoords, std::vector& zcoords); + + void print(void); + +}; + +#endif diff --git a/include/operation/opmeshsize.h b/include/operation/opmeshsize.h new file mode 100644 index 00000000..f9fc0564 --- /dev/null +++ b/include/operation/opmeshsize.h @@ -0,0 +1,36 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPMESHSIZE_H +#define OPMESHSIZE_H + +#include "operation.h" + +class opmeshsize: public operation +{ + + private: + + bool reuse = false; + + int myintegrationorder; + + public: + + opmeshsize(int integrationorder) { myintegrationorder = integrationorder; }; + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + + void print(void); + +}; + +#endif diff --git a/include/operation/opmod.h b/include/operation/opmod.h new file mode 100644 index 00000000..26c4dde8 --- /dev/null +++ b/include/operation/opmod.h @@ -0,0 +1,44 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPMOD_H +#define OPMOD_H + +#include "operation.h" +#include + +class opmod: public operation +{ + + private: + + bool reuse = false; + std::shared_ptr myarg; + + double mymodval; + + public: + + opmod(std::shared_ptr arg, double modval) { myarg = arg; mymodval = modval; }; + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::vector> getarguments(void) { return {myarg}; }; + std::shared_ptr simplify(std::vector disjregs); + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + + double evaluate(void); + std::vector evaluate(std::vector& xcoords, std::vector& ycoords, std::vector& zcoords); + + void print(void); + +}; + +#endif diff --git a/include/operation/opon.h b/include/operation/opon.h new file mode 100644 index 00000000..0d43eaba --- /dev/null +++ b/include/operation/opon.h @@ -0,0 +1,44 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPON_H +#define OPON_H + +#include "operation.h" +#include "expression.h" + +class opon: public operation +{ + + private: + + bool reuse = false; + + int myphysreg; + bool myerrorifnotfound; + // No shift if empty: + std::vector mycoordshift = {}; + std::shared_ptr myarg; + + public: + + opon(int physreg, expression* coordshift, std::shared_ptr arg, bool errorifnotfound); + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::vector> getarguments(void); + std::shared_ptr simplify(std::vector disjregs); + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + + void print(void); + +}; + +#endif diff --git a/include/operation/oporientation.h b/include/operation/oporientation.h new file mode 100644 index 00000000..56f3f3e8 --- /dev/null +++ b/include/operation/oporientation.h @@ -0,0 +1,36 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPORIENTATION_H +#define OPORIENTATION_H + +#include "operation.h" + +class oporientation: public operation +{ + + private: + + bool reuse = false; + + int myphysreg = -1; + + public: + + oporientation(int physreg) { myphysreg = physreg; }; + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + + void print(void); + +}; + +#endif diff --git a/include/operation/opparameter.h b/include/operation/opparameter.h new file mode 100644 index 00000000..13b048ec --- /dev/null +++ b/include/operation/opparameter.h @@ -0,0 +1,52 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPPARAMETER_H +#define OPPARAMETER_H + +#include "operation.h" +#include "rawparameter.h" + +class rawparameter; + +class opparameter: public operation +{ + + private: + + // Parameters are always reused + + int myrow; + int mycolumn; + + std::shared_ptr myparameter; + + public: + + opparameter(std::shared_ptr input, int row, int col) { myparameter = input; myrow = row; mycolumn = col; }; + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + bool isparameter(void) { return true; }; + + std::shared_ptr getparameterpointer(void) { return myparameter; }; + + int getselectedrow(void) { return myrow; }; + int getselectedcol(void) { return mycolumn; }; + + bool isharmonicone(std::vector disjregs); + + std::shared_ptr simplify(std::vector disjregs); + bool isvalueorientationdependent(std::vector disjregs); + + std::shared_ptr copy(void); + + void print(void); + +}; + +#endif diff --git a/include/operation/opport.h b/include/operation/opport.h new file mode 100644 index 00000000..df44364a --- /dev/null +++ b/include/operation/opport.h @@ -0,0 +1,45 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPPORT_H +#define OPPORT_H + +#include "operation.h" +#include "rawport.h" + +class opport: public operation +{ + + private: + + int timederivativeorder = 0; + + std::shared_ptr myport; + + public: + + opport(std::shared_ptr portin); + + void increasetimederivativeorder(int amount); + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + bool isport(void) { return true; }; + + int gettimederivative(void) { return timederivativeorder; }; + + std::shared_ptr getportpointer(void); + + bool isharmonicone(std::vector disjregs); + + std::shared_ptr copy(void); + + void print(void); + +}; + +#endif diff --git a/include/operation/oppower.h b/include/operation/oppower.h new file mode 100644 index 00000000..2f9ad050 --- /dev/null +++ b/include/operation/oppower.h @@ -0,0 +1,42 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPPOWER_H +#define OPPOWER_H + +#include "operation.h" + +class oppower: public operation +{ + + private: + + bool reuse = false; + std::shared_ptr mybase; + std::shared_ptr myexponent; + + public: + + oppower(std::shared_ptr base, std::shared_ptr exponent) { mybase = base; myexponent = exponent; }; + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::vector> getarguments(void) { return {mybase, myexponent}; }; + std::shared_ptr simplify(std::vector disjregs); + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + + double evaluate(void); + std::vector evaluate(std::vector& xcoords, std::vector& ycoords, std::vector& zcoords); + + void print(void); + +}; + +#endif diff --git a/include/operation/opproduct.h b/include/operation/opproduct.h new file mode 100644 index 00000000..57d0edf2 --- /dev/null +++ b/include/operation/opproduct.h @@ -0,0 +1,61 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPPRODUCT_H +#define OPPRODUCT_H + +#include "operation.h" +#include "harmonic.h" +#include "fourier.h" + +class opproduct: public operation +{ + + private: + + bool reuse = false; + std::vector> productterms = {}; + + public: + + opproduct(void) {}; + opproduct(std::vector> input) { productterms = input; }; + + void multiplybyterm(std::shared_ptr term) { productterms.push_back(term); }; + + void removeterm(int whichterm) { productterms.erase(productterms.begin() + whichterm); }; + + int count(void) { return productterms.size(); }; + bool isproduct(void) { return true; }; + + std::vector> getarguments(void) {return productterms;}; + std::shared_ptr getargument(int argnum) { return productterms[argnum]; }; + void replaceargument(int argnum, std::shared_ptr newarg) { productterms[argnum] = newarg; }; + + // Multiharmonic products are not allowed unless one of + // the two product arguments has only the cos0 harmonic. + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::shared_ptr expand(void); + // Group all productterms and the product terms they + // include recursively together in this object. + void group(void); + std::shared_ptr simplify(std::vector disjregs); + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + bool isreused(void) { return reuse; }; + + double evaluate(void); + std::vector evaluate(std::vector& xcoords, std::vector& ycoords, std::vector& zcoords); + + void print(void); + +}; + +#endif diff --git a/include/operation/opsin.h b/include/operation/opsin.h new file mode 100644 index 00000000..52d46896 --- /dev/null +++ b/include/operation/opsin.h @@ -0,0 +1,41 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPSIN_H +#define OPSIN_H + +#include "operation.h" + +class opsin: public operation +{ + + private: + + bool reuse = false; + std::shared_ptr myarg; + + public: + + opsin(std::shared_ptr arg) { myarg = arg; }; + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::vector> getarguments(void) { return {myarg}; }; + std::shared_ptr simplify(std::vector disjregs); + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + + double evaluate(void); + std::vector evaluate(std::vector& xcoords, std::vector& ycoords, std::vector& zcoords); + + void print(void); + +}; + +#endif diff --git a/include/operation/opspline.h b/include/operation/opspline.h new file mode 100644 index 00000000..6f225a46 --- /dev/null +++ b/include/operation/opspline.h @@ -0,0 +1,41 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPSPLINE_H +#define OPSPLINE_H + +#include "operation.h" +#include "spline.h" + +class opspline: public operation +{ + + private: + + bool reuse = false; + std::shared_ptr myarg; + + spline myspline; + + public: + + opspline(spline spl, std::shared_ptr arg); + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::vector> getarguments(void) { return {myarg}; }; + std::shared_ptr simplify(std::vector disjregs); + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + + void print(void); + +}; + +#endif diff --git a/include/operation/opsum.h b/include/operation/opsum.h new file mode 100644 index 00000000..37d5b14f --- /dev/null +++ b/include/operation/opsum.h @@ -0,0 +1,57 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPSUM_H +#define OPSUM_H + +#include "operation.h" + +class opsum: public operation +{ + + private: + + bool reuse = false; + std::vector> sumterms = {}; + + public: + + opsum(void) {}; + opsum(std::vector> input) { sumterms = input; }; + + void addterm(std::shared_ptr term) { sumterms.push_back(term); } + void subtractterm(std::shared_ptr term); + void removeterm(int whichterm) { sumterms.erase(sumterms.begin() + whichterm); }; + + int count(void) { return sumterms.size(); }; + bool issum(void) { return true; }; + + std::vector> getarguments(void) {return sumterms;}; + std::shared_ptr getargument(int argnum) { return sumterms[argnum]; }; + void replaceargument(int argnum, std::shared_ptr newarg) { sumterms[argnum] = newarg; }; + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::shared_ptr expand(void); + // Group all sumterms and the sum terms they + // include recursively together in this object. + void group(void); + std::shared_ptr simplify(std::vector disjregs); + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + bool isreused(void) { return reuse; }; + + double evaluate(void); + std::vector evaluate(std::vector& xcoords, std::vector& ycoords, std::vector& zcoords); + + void print(void); + +}; + +#endif diff --git a/include/operation/optan.h b/include/operation/optan.h new file mode 100644 index 00000000..e2cce9a4 --- /dev/null +++ b/include/operation/optan.h @@ -0,0 +1,41 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPTAN_H +#define OPTAN_H + +#include "operation.h" + +class optan: public operation +{ + + private: + + bool reuse = false; + std::shared_ptr myarg; + + public: + + optan(std::shared_ptr arg) { myarg = arg; }; + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::vector> getarguments(void) { return {myarg}; }; + std::shared_ptr simplify(std::vector disjregs); + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + + double evaluate(void); + std::vector evaluate(std::vector& xcoords, std::vector& ycoords, std::vector& zcoords); + + void print(void); + +}; + +#endif diff --git a/include/operation/optf.h b/include/operation/optf.h new file mode 100644 index 00000000..778b9d58 --- /dev/null +++ b/include/operation/optf.h @@ -0,0 +1,67 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPTF_H +#define OPTF_H + +#include "operation.h" + +class optf: public operation +{ + + private: + + int timederivativeorder = 0; + // The space derivative is only temporary. It is split later on into + // a product of invjac terms and ki, eta and phi field derivatives. + // 0 is no derivative, 1 is x, 2 is y and 3 is z. + int spacederivative = 0; + // 0 is no derivative, 1 is ki, 2 is eta and 3 is phi. + int kietaphiderivative = 0; + + // The selected form function component in the field: + int formfunctioncomponent = 0; + // For printing purposes: + int fieldcomponent = -1; + + std::shared_ptr myfield; + + int myphysicalregion; + + public: + + optf(std::shared_ptr fieldin, int physreg = -1) { myfield = fieldin; myphysicalregion = physreg; }; + + void setspacederivative(int whichderivative); + void increasetimederivativeorder(int amount); + void selectformfunctioncomponent(int comp) { formfunctioncomponent = comp; }; + + void setfieldcomponent(int comp) { fieldcomponent = comp; }; + + void setkietaphiderivative(int whichderivative) { kietaphiderivative = whichderivative; spacederivative = 0; }; + int getkietaphiderivative(void) { return kietaphiderivative; }; + + bool istf(void) { return true; }; + + bool isharmonicone(std::vector disjregs); + + std::shared_ptr getfieldpointer(void) { return myfield; }; + bool isphysicalregiondefined(void) { return (myphysicalregion != -1); }; + int getphysicalregion(void) { return myphysicalregion; }; + int getspacederivative(void) { return spacederivative; }; + int gettimederivative(void) { return timederivativeorder; }; + int getformfunctioncomponent(void) { return formfunctioncomponent; }; + int getfieldcomponent(void) { return fieldcomponent; }; + + bool isvalueorientationdependent(std::vector disjregs); + + std::shared_ptr copy(void); + + void print(void); + +}; + +#endif diff --git a/include/operation/optime.h b/include/operation/optime.h new file mode 100644 index 00000000..726fe2b8 --- /dev/null +++ b/include/operation/optime.h @@ -0,0 +1,36 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + +// This object treats the time variable 't'. + +#ifndef OPTIME_H +#define OPTIME_H + +#include "operation.h" + +class optime: public operation +{ + + private: + + bool reuse = false; + + public: + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + + double evaluate(void); + std::vector evaluate(std::vector& xcoords, std::vector& ycoords, std::vector& zcoords); + + void print(void); + +}; + +#endif diff --git a/include/operation/sl.h b/include/operation/sl.h new file mode 100644 index 00000000..8c1ec5df --- /dev/null +++ b/include/operation/sl.h @@ -0,0 +1,339 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . +// +// Thanks to R. Haouari for the stabilization terms. + +#ifndef SL_H +#define SL_H + +#include +#include +#include "expression.h" +#include "integration.h" +#include "universe.h" +#include "iointerface.h" +#include "vec.h" +#include "mat.h" +#include "formulation.h" +#include "rawmesh.h" +#include "dofmanager.h" + +class rawmesh; +class expression; +class integration; +class mat; +class vec; +class field; +class parameter; +class formulation; +class shape; +class dofmanager; + +namespace sl +{ + // Get the code version number and name: + void printversion(void); + int getversion(void); + int getsubversion(void); + std::string getversionname(void); + + void setmaxnumthreads(int mnt); + int getmaxnumthreads(void); + + field getx(void); + field gety(void); + field getz(void); + + double getpi(void); + + // Vacuum permeability/permittivity: + double getmu0(void); + double getepsilon0(void); + + // Get a random value uniformly distributed between 0.0 and 1.0: + double getrandom(void); + + // Perform operations (union, intersection) on physical regions: + int selectunion(std::vector physregs); + int selectintersection(std::vector physregs, int intersectdim); + int selectall(void); + + // Check if a region is defined/empty/fully included in another region/touches another region: + bool isdefined(int physreg); + bool isempty(int physreg); + bool isinside(int physregtocheck, int physreg); + bool istouching(int physregtocheck, int physreg); + + void printvector(std::vector input); + void printvector(std::vector input); + void printvector(std::vector input); + + void writevector(std::string filename, std::vector towrite, char delimiter = ',', bool writesize = false); + // Load a vector of doubles separated by a character: + std::vector loadvector(std::string filename, char delimiter = ',', bool sizeincluded = false); + + // Partition the mesh into numranks parts and return the mesh file name for each rank: + std::string allpartition(std::string meshfile); + + // Compute the L2 norm of an expression: + expression norm(expression expr); + + // Normal vector with unit norm and pointing outward of a physical region: + expression normal(void); + expression normal(int physreg); + expression getnormal(int physreg); + // Tangent vector with unit norm: + expression tangent(void); + + // Write scalar or vector values at given coordinates to file: + void scatterwrite(std::string filename, std::vector xcoords, std::vector ycoords, std::vector zcoords, std::vector compxevals, std::vector compyevals = {}, std::vector compzevals = {}); + + void setaxisymmetry(void); + + void setfundamentalfrequency(double f); + void settime(double t); + double gettime(void); + + expression meshsize(int integrationorder); + // Return the field order to hold alpha % of the total coefficient weight. Return the actual field order with alpha set to -1.0. + expression fieldorder(field input, double alpha = -1.0, double absthres = 0.0); + + // Get a single harmonic: + expression getharmonic(int harmnum, expression input, int numfftharms = -1); + // Make a harmonic expression: + expression makeharmonic(std::vector harms, std::vector exprs); + // Return an expression containing the origin harmonics moved to new harmonic positions: + expression moveharmonic(std::vector origharms, std::vector destharms, expression input, int numfftharms = -1); + + std::vector gettotalforce(int physreg, expression* meshdeform, expression EorH, expression epsilonormu, int extraintegrationorder); + std::vector gettotalforce(int physreg, expression EorH, expression epsilonormu, int extraintegrationorder = 0); + std::vector gettotalforce(int physreg, expression meshdeform, expression EorH, expression epsilonormu, int extraintegrationorder = 0); + + std::vector printtotalforce(int physreg, expression* meshdeform, expression EorH, expression epsilonormu, int extraintegrationorder); + std::vector printtotalforce(int physreg, expression EorH, expression epsilonormu, int extraintegrationorder = 0); + std::vector printtotalforce(int physreg, expression meshdeform, expression EorH, expression epsilonormu, int extraintegrationorder = 0); + + void setphysicalregionshift(int shiftamount); + + // Write all shape functions for an element type up to a given order: + void writeshapefunctions(std::string filename, std::string sftypename, int elementtypenumber, int maxorder, bool allorientations = false); + + // The time variable: + expression t(void); + + // Group .vtu timestep files in a .pvd file: + void grouptimesteps(std::string filename, std::vector filestogroup, std::vector timevals); + void grouptimesteps(std::string filename, std::string fileprefix, int firstint, std::vector timevals); + + // Load a mesh file into a shape. Return the list of shapes of all dimensions {{0D},{1D},{2D},{3D}} (if any): + std::vector> loadshape(std::string meshfile); + + // Make the time derivative vectors available in the universe: + void settimederivative(vec dtx); + void settimederivative(vec dtx, vec dtdtx); + + expression dx(expression input); + expression dy(expression input); + expression dz(expression input); + + expression dt(expression input); + expression dtdt(expression input); + expression dtdtdt(expression input); + expression dtdtdtdt(expression input); + + // Transient approximation of dt and dtdt: + expression dt(expression input, double initdt, double initdtdt); + expression dtdt(expression input, double initdt, double initdtdt); + + expression transientdtapprox(int dtorder, expression input, double initdt, double initdtdt); + + expression sin(expression input); + expression cos(expression input); + expression tan(expression input); + expression asin(expression input); + expression acos(expression input); + expression atan(expression input); + expression abs(expression input); + expression sqrt(expression input); + expression log(expression input); + expression pow(expression base, expression exponent); + expression exp(expression input); + expression mod(expression input, double modval); + + // Easy conditional functions for expressions (true if the expression value is >= 0): + expression ifpositive(expression condexpr, expression trueexpr, expression falseexpr); + expression andpositive(std::vector exprs); + expression orpositive(std::vector exprs); + + expression max(expression a, expression b); + expression max(field a, field b); + expression max(parameter a, parameter b); + expression min(expression a, expression b); + expression min(field a, field b); + expression min(parameter a, parameter b); + + + // Evaluate an expression on physical region 'physreg' using interpolation: + expression on(int physreg, expression expr, bool errorifnotfound = true); + // Interpolate at coordinates shifted by 'coordshift': + expression on(int physreg, expression coordshift, expression expr, bool errorifnotfound = true); + + expression comp(int selectedcomp, expression input); + expression compx(expression input); + expression compy(expression input); + expression compz(expression input); + + expression entry(int row, int col, expression input); + + expression eye(int size); + + expression transpose(expression input); + expression inverse(expression input); + expression determinant(expression input); + + expression grad(expression input); + expression div(expression input); + expression curl(expression input); + + // Cross product between vector a and vector b. + // Any argument that does not have 3 components will be filled with zeros. + expression crossproduct(expression a, expression b); + + // Double dot a:b product: + expression doubledotproduct(expression a, expression b); + + // Element-wise product: + expression elementwiseproduct(expression a, expression b); + + // Get the trace of a square matrix: + expression trace(expression a); + + // Get the rotation matrix and its inverse for a 3x3 tensor with (x,y,z) component + // ordering or a 6x6 tensor in Voigt form. Input angles are in degrees. + std::vector rotation(double alphax, double alphay, double alphaz, std::string type = ""); + + integration integral(int physreg, expression tointegrate, int integrationorderdelta = 0, int blocknumber = 0); + integration integral(int physreg, expression meshdeform, expression tointegrate, int integrationorderdelta = 0, int blocknumber = 0); + // For the multiharmonic resolution an extra integer is required + // to know with how many harmonics the coef multiplying the tf + // and/or dof should be approximated. Set 'numcoefharms' negative + // and it will be as if you were calling the above non + // multiharmonic functions. + integration integral(int physreg, int numcoefharms, expression tointegrate, int integrationorderdelta = 0, int blocknumber = 0); + integration integral(int physreg, int numcoefharms, expression meshdeform, expression tointegrate, int integrationorderdelta = 0, int blocknumber = 0); + + expression dof(expression input); + expression dof(expression input, int physreg); + expression tf(expression input); + expression tf(expression input, int physreg); + + // Return an expression whose value will be calculated on the argument mesh state (the expression is hp-synchronized to that mesh state after the call): + expression athp(expression expr, std::shared_ptr rm, std::shared_ptr pt); + + // hp-adaptation: + bool adapt(int verbosity = 0); + bool alladapt(int verbosity = 0); + + // Define a Zienkiewicz-Zhu type error indicator: + expression zienkiewiczzhu(expression input); + + // Define typically used arrays for convenience: + expression array1x1(expression term11); + expression array1x2(expression term11, expression term12); + expression array1x3(expression term11, expression term12, expression term13); + expression array2x1(expression term11, expression term21); + expression array2x2(expression term11, expression term12, expression term21, expression term22); + expression array2x3(expression term11, expression term12, expression term13, expression term21, expression term22, expression term23); + expression array3x1(expression term11, expression term21, expression term31); + expression array3x2(expression term11, expression term12, expression term21, expression term22, expression term31, expression term32); + expression array3x3(expression term11, expression term12, expression term13, expression term21, expression term22, expression term23, expression term31, expression term32, expression term33); + + + // Direct resolution (with or without diagonal scaling): + vec solve(mat A, vec b, std::string soltype = "lu", bool diagscaling = false); + // Multi-rhs direct resolution: + std::vector solve(mat A, std::vector b, std::string soltype = "lu"); + // Densematrix 'b' has size #rhs x #dofs: + densemat solve(mat A, densemat b, std::string soltype); + + // Iterative resolution (with or without diagonal scaling): + void solve(mat A, vec b, vec sol, double& relrestol, int& maxnumit, std::string soltype = "bicgstab", std::string precondtype = "sor", int verbosity = 1, bool diagscaling = false); + + + // Exchange densemat data with MPI: + void exchange(std::vector targetranks, std::vector sends, std::vector receives); + + // MPI based gmres with custom matrix free product (no restart). Initial guess and solution are in x. + // Relative residual at each iteration is returned. Length is number of iterations + 1 (first is initial residual). + std::vector gmres(densemat (*mymatmult)(densemat), densemat b, densemat x, double relrestol, int maxnumit, int verbosity = 1); + + // Know which dofs to send and at which dofs to receive for the DDM. Choose the rawfields and the domain interface dimensions (length 3) to consider. + void mapdofs(std::shared_ptr dm, std::vector> rfs, std::vector isdimactive, std::vector& sendinds, std::vector& recvinds); + + std::vector linspace(double a, double b, int num); + std::vector logspace(double a, double b, int num, double basis = 10.0); + + // Convert dB to Nepers: + expression dbtoneper(expression toconvert); + + + // Set all fields and ports to the values available in the vec object: + void setdata(vec invec); + + + ////////// PREDEFINED OPERATORS + + // Gives the engineering strains of a 2D or 3D mechanical displacement vector (Voigt form): + expression strain(expression input); + // Gives the Green-Lagrange strains of a 2D or 3D mechanical displacement vector (Voigt form): + expression greenlagrangestrain(expression input); + // Gives the von Mises stress (Voigt form expected for the argument): + expression vonmises(expression stress); + + // Weak form of the mass conservation for Navier-Stokes: + expression predefinedmassconservation(expression dofv, expression tfp, expression rho, expression dtrho, expression gradrho, bool includetimederivs, bool isdensityconstant); + // Weak form of the inertial forces for Navier-Stokes: + expression predefinedinertialforce(expression dofv, expression tfv, expression v, expression rho); + // Weak form of the viscous forces for Navier-Stokes: + expression predefinedviscousforce(expression dofv, expression tfv, expression mu, bool isdensityconstant, bool isviscosityconstant); + + + ////////// PREDEFINED FORMULATIONS + + std::vector continuitycondition(int gamma1, int gamma2, field u1, field u2, int lagmultorder, bool errorifnotfound = true); + std::vector continuitycondition(int gamma1, int gamma2, field u1, field u2, std::vector rotcent, double rotangz, double angzmod, double factor, int lagmultorder); + std::vector periodicitycondition(int gamma1, int gamma2, field u, std::vector dat1, std::vector dat2, double factor, int lagmultorder); + + // Isotropic linear elasticity: + expression predefinedelasticity(expression dofu, expression tfu, expression Eyoung, expression nupoisson, std::string myoption = ""); + // General anisotropic linear elasticity: + expression predefinedelasticity(expression dofu, expression tfu, expression elasticitymatrix, std::string myoption = ""); + + // Isotropic elasticity with geometrical nonlinearity and prestress (ignored if zero): + expression predefinedelasticity(expression dofu, expression tfu, field u, expression Eyoung, expression nupoisson, expression prestress, std::string myoption = ""); + // General anisotropic elasticity with geometrical nonlinearity and prestress (ignored if zero): + expression predefinedelasticity(expression dofu, expression tfu, field u, expression elasticitymatrix, expression prestress, std::string myoption = ""); + + expression predefinedelectrostaticforce(expression input, expression E, expression epsilon); + expression predefinedmagnetostaticforce(expression input, expression H, expression mu); + + expression predefinedacousticwave(expression dofp, expression tfp, expression soundspeed, expression neperattenuation); + expression predefinedacousticradiation(expression dofp, expression tfp, expression soundspeed, expression neperattenuation); + expression predefinedacousticstructureinteraction(expression dofp, expression tfp, expression dofu, expression tfu, expression soundspeed, expression fluiddensity, expression normal, expression neperattenuation, double scaling = 1.0); + + // Stokes flow for Newtonian fluids: + expression predefinedstokes(expression dofv, expression tfv, expression dofp, expression tfp, expression mu, expression rho, expression dtrho, expression gradrho, bool includetimederivs = false, bool isdensityconstant = true, bool isviscosityconstant = true); + // Navier-Stokes flow for Newtonian fluids: + expression predefinednavierstokes(expression dofv, expression tfv, expression v, expression dofp, expression tfp, expression mu, expression rho, expression dtrho, expression gradrho, bool includetimederivs = false, bool isdensityconstant = true, bool isviscosityconstant = true); + + // Advection-diffusion equations: + expression predefinedadvectiondiffusion(expression doff, expression tff, expression v, expression alpha, expression beta, expression gamma, bool isdivvzero = true); + expression predefineddiffusion(expression doff, expression tff, expression alpha, expression beta); + + // Stabilization for advection-diffusion problems: + expression predefinedstabilization(std::string stabtype, expression delta, expression f, expression v, expression diffusivity, expression residual); +}; + +#endif diff --git a/include/opestimator.h b/include/opestimator.h new file mode 100644 index 00000000..c3fbe253 --- /dev/null +++ b/include/opestimator.h @@ -0,0 +1,53 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPESTIMATOR_H +#define OPESTIMATOR_H + +#include "operation.h" +#include "opfield.h" + +class opfield; + +class opestimator: public operation +{ + + private: + + bool reuse = false; + // Estimator type: + std::string mytype = ""; + std::shared_ptr myarg; + + // This contains the estimated value: + std::shared_ptr myvalue = NULL; + + long long int mystatenumber = 0; + + public: + + opestimator(std::string estimatortype, std::shared_ptr arg); + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::vector> getarguments(void) { return {myarg}; }; + std::shared_ptr simplify(std::vector disjregs); + + bool isvalueorientationdependent(std::vector disjregs) { return false; }; + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + + void print(void); + + // Update 'myvalue' with the estimate: + void estimatezienkiewiczzhu(void); + +}; + +#endif diff --git a/include/opfield.h b/include/opfield.h new file mode 100644 index 00000000..a6929e68 --- /dev/null +++ b/include/opfield.h @@ -0,0 +1,70 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPFIELD_H +#define OPFIELD_H + +#include "operation.h" + +class opfield: public operation +{ + + private: + + // Fields are always reused + + int timederivativeorder = 0; + // 0 is no derivative, 1 is x, 2 is y and 3 is z. + int spacederivative = 0; + // 0 is no derivative, 1 is ki, 2 is eta and 3 is phi. + int kietaphiderivative = 0; + + // The selected form function component in the field: + int formfunctioncomponent = 0; + // For printing purposes: + int fieldcomponent = -1; + + std::shared_ptr myfield; + + public: + + opfield(std::shared_ptr fieldin) { myfield = fieldin; }; + + void setspacederivative(int whichderivative); + void setkietaphiderivative(int whichderivative); + void increasetimederivativeorder(int amount); + void selectformfunctioncomponent(int comp) { formfunctioncomponent = comp; }; + + void setfieldcomponent(int comp) { fieldcomponent = comp; }; + + bool isfield(void) { return true; }; + + bool isharmonicone(std::vector disjregs); + + // This 'interpolate' is used only in the Jacobian computation. + std::vector> interpolate(int kietaphiderivative, elementselector& elemselect, std::vector& evaluationcoordinates); + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::shared_ptr getfieldpointer(void) { return myfield; }; + int getformfunctioncomponent(void) { return formfunctioncomponent; }; + int getfieldcomponent(void) { return fieldcomponent; }; + int getspacederivative(void) { return spacederivative; }; + int getkietaphiderivative(void) { return kietaphiderivative; }; + int gettimederivative(void) { return timederivativeorder; }; + + bool isvalueorientationdependent(std::vector disjregs); + + std::shared_ptr copy(void); + + std::vector evaluate(std::vector& xcoords, std::vector& ycoords, std::vector& zcoords); + + void print(void); + +}; + +#endif diff --git a/include/opfieldorder.h b/include/opfieldorder.h new file mode 100644 index 00000000..52c78077 --- /dev/null +++ b/include/opfieldorder.h @@ -0,0 +1,39 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPFIELDORDER_H +#define OPFIELDORDER_H + +#include "operation.h" + +class opfieldorder: public operation +{ + + private: + + bool reuse = false; + + double myalpha = -1.0; + double mythreshold = 0.0; + + std::vector> myfields = {}; + + public: + + opfieldorder(std::vector> fieldsin, double alpha = -1.0, double absthres = 0.0); + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + + void print(void); + +}; + +#endif diff --git a/include/opharmonic.h b/include/opharmonic.h new file mode 100644 index 00000000..8d71627a --- /dev/null +++ b/include/opharmonic.h @@ -0,0 +1,45 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPHARMONIC_H +#define OPHARMONIC_H + +#include "operation.h" + +class opharmonic: public operation +{ + + private: + + bool reuse = false; + std::shared_ptr myarg; + + int mynumfftharms; + + std::vector myorigharms; + std::vector mydestharms; + + public: + + opharmonic(std::vector origharms, std::vector destharms, std::shared_ptr arg, int numfftharms); + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + bool isharmonicone(std::vector disjregs); + + std::vector> getarguments(void) { return {myarg}; }; + std::shared_ptr simplify(std::vector disjregs); + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + + void print(void); + +}; + +#endif diff --git a/include/opinversion.h b/include/opinversion.h new file mode 100644 index 00000000..09fe6b8a --- /dev/null +++ b/include/opinversion.h @@ -0,0 +1,41 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPINVERSION_H +#define OPINVERSION_H + +#include "operation.h" + +class opinversion: public operation +{ + + private: + + bool reuse = false; + std::shared_ptr myarg; + + public: + + opinversion(std::shared_ptr arg) { myarg = arg; }; + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::vector> getarguments(void) { return {myarg}; }; + std::shared_ptr simplify(std::vector disjregs); + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + + double evaluate(void); + std::vector evaluate(std::vector& xcoords, std::vector& ycoords, std::vector& zcoords); + + void print(void); + +}; + +#endif diff --git a/include/opinvjac.h b/include/opinvjac.h new file mode 100644 index 00000000..fb03a1d7 --- /dev/null +++ b/include/opinvjac.h @@ -0,0 +1,33 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPINVJAC_H +#define OPINVJAC_H + +#include "operation.h" + +class opinvjac: public operation +{ + + private: + + int myrow, mycol; + + public: + + // Define as invjac(m,n): + opinvjac(int m, int n) { myrow = m; mycol = n; }; + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::shared_ptr copy(void); + + void print(void); + +}; + +#endif diff --git a/include/opjac.h b/include/opjac.h new file mode 100644 index 00000000..1b189e9a --- /dev/null +++ b/include/opjac.h @@ -0,0 +1,33 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPJAC_H +#define OPJAC_H + +#include "operation.h" + +class opjac: public operation +{ + + private: + + int myrow, mycol; + + public: + + // Define as jac(m,n): + opjac(int m, int n) { myrow = m; mycol = n; }; + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::shared_ptr copy(void); + + void print(void); + +}; + +#endif diff --git a/include/oplog.h b/include/oplog.h new file mode 100644 index 00000000..a106aebf --- /dev/null +++ b/include/oplog.h @@ -0,0 +1,41 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPLOG_H +#define OPLOG_H + +#include "operation.h" + +class oplog: public operation +{ + + private: + + bool reuse = false; + std::shared_ptr myarg; + + public: + + oplog(std::shared_ptr arg) { myarg = arg; }; + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::vector> getarguments(void) { return {myarg}; }; + std::shared_ptr simplify(std::vector disjregs); + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + + double evaluate(void); + std::vector evaluate(std::vector& xcoords, std::vector& ycoords, std::vector& zcoords); + + void print(void); + +}; + +#endif diff --git a/include/opmeshsize.h b/include/opmeshsize.h new file mode 100644 index 00000000..f9fc0564 --- /dev/null +++ b/include/opmeshsize.h @@ -0,0 +1,36 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPMESHSIZE_H +#define OPMESHSIZE_H + +#include "operation.h" + +class opmeshsize: public operation +{ + + private: + + bool reuse = false; + + int myintegrationorder; + + public: + + opmeshsize(int integrationorder) { myintegrationorder = integrationorder; }; + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + + void print(void); + +}; + +#endif diff --git a/include/opmod.h b/include/opmod.h new file mode 100644 index 00000000..26c4dde8 --- /dev/null +++ b/include/opmod.h @@ -0,0 +1,44 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPMOD_H +#define OPMOD_H + +#include "operation.h" +#include + +class opmod: public operation +{ + + private: + + bool reuse = false; + std::shared_ptr myarg; + + double mymodval; + + public: + + opmod(std::shared_ptr arg, double modval) { myarg = arg; mymodval = modval; }; + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::vector> getarguments(void) { return {myarg}; }; + std::shared_ptr simplify(std::vector disjregs); + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + + double evaluate(void); + std::vector evaluate(std::vector& xcoords, std::vector& ycoords, std::vector& zcoords); + + void print(void); + +}; + +#endif diff --git a/include/opon.h b/include/opon.h new file mode 100644 index 00000000..0d43eaba --- /dev/null +++ b/include/opon.h @@ -0,0 +1,44 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPON_H +#define OPON_H + +#include "operation.h" +#include "expression.h" + +class opon: public operation +{ + + private: + + bool reuse = false; + + int myphysreg; + bool myerrorifnotfound; + // No shift if empty: + std::vector mycoordshift = {}; + std::shared_ptr myarg; + + public: + + opon(int physreg, expression* coordshift, std::shared_ptr arg, bool errorifnotfound); + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::vector> getarguments(void); + std::shared_ptr simplify(std::vector disjregs); + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + + void print(void); + +}; + +#endif diff --git a/include/oporientation.h b/include/oporientation.h new file mode 100644 index 00000000..56f3f3e8 --- /dev/null +++ b/include/oporientation.h @@ -0,0 +1,36 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPORIENTATION_H +#define OPORIENTATION_H + +#include "operation.h" + +class oporientation: public operation +{ + + private: + + bool reuse = false; + + int myphysreg = -1; + + public: + + oporientation(int physreg) { myphysreg = physreg; }; + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + + void print(void); + +}; + +#endif diff --git a/include/opparameter.h b/include/opparameter.h new file mode 100644 index 00000000..13b048ec --- /dev/null +++ b/include/opparameter.h @@ -0,0 +1,52 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPPARAMETER_H +#define OPPARAMETER_H + +#include "operation.h" +#include "rawparameter.h" + +class rawparameter; + +class opparameter: public operation +{ + + private: + + // Parameters are always reused + + int myrow; + int mycolumn; + + std::shared_ptr myparameter; + + public: + + opparameter(std::shared_ptr input, int row, int col) { myparameter = input; myrow = row; mycolumn = col; }; + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + bool isparameter(void) { return true; }; + + std::shared_ptr getparameterpointer(void) { return myparameter; }; + + int getselectedrow(void) { return myrow; }; + int getselectedcol(void) { return mycolumn; }; + + bool isharmonicone(std::vector disjregs); + + std::shared_ptr simplify(std::vector disjregs); + bool isvalueorientationdependent(std::vector disjregs); + + std::shared_ptr copy(void); + + void print(void); + +}; + +#endif diff --git a/include/opport.h b/include/opport.h new file mode 100644 index 00000000..df44364a --- /dev/null +++ b/include/opport.h @@ -0,0 +1,45 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPPORT_H +#define OPPORT_H + +#include "operation.h" +#include "rawport.h" + +class opport: public operation +{ + + private: + + int timederivativeorder = 0; + + std::shared_ptr myport; + + public: + + opport(std::shared_ptr portin); + + void increasetimederivativeorder(int amount); + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + bool isport(void) { return true; }; + + int gettimederivative(void) { return timederivativeorder; }; + + std::shared_ptr getportpointer(void); + + bool isharmonicone(std::vector disjregs); + + std::shared_ptr copy(void); + + void print(void); + +}; + +#endif diff --git a/include/oppower.h b/include/oppower.h new file mode 100644 index 00000000..2f9ad050 --- /dev/null +++ b/include/oppower.h @@ -0,0 +1,42 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPPOWER_H +#define OPPOWER_H + +#include "operation.h" + +class oppower: public operation +{ + + private: + + bool reuse = false; + std::shared_ptr mybase; + std::shared_ptr myexponent; + + public: + + oppower(std::shared_ptr base, std::shared_ptr exponent) { mybase = base; myexponent = exponent; }; + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::vector> getarguments(void) { return {mybase, myexponent}; }; + std::shared_ptr simplify(std::vector disjregs); + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + + double evaluate(void); + std::vector evaluate(std::vector& xcoords, std::vector& ycoords, std::vector& zcoords); + + void print(void); + +}; + +#endif diff --git a/include/opproduct.h b/include/opproduct.h new file mode 100644 index 00000000..57d0edf2 --- /dev/null +++ b/include/opproduct.h @@ -0,0 +1,61 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPPRODUCT_H +#define OPPRODUCT_H + +#include "operation.h" +#include "harmonic.h" +#include "fourier.h" + +class opproduct: public operation +{ + + private: + + bool reuse = false; + std::vector> productterms = {}; + + public: + + opproduct(void) {}; + opproduct(std::vector> input) { productterms = input; }; + + void multiplybyterm(std::shared_ptr term) { productterms.push_back(term); }; + + void removeterm(int whichterm) { productterms.erase(productterms.begin() + whichterm); }; + + int count(void) { return productterms.size(); }; + bool isproduct(void) { return true; }; + + std::vector> getarguments(void) {return productterms;}; + std::shared_ptr getargument(int argnum) { return productterms[argnum]; }; + void replaceargument(int argnum, std::shared_ptr newarg) { productterms[argnum] = newarg; }; + + // Multiharmonic products are not allowed unless one of + // the two product arguments has only the cos0 harmonic. + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::shared_ptr expand(void); + // Group all productterms and the product terms they + // include recursively together in this object. + void group(void); + std::shared_ptr simplify(std::vector disjregs); + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + bool isreused(void) { return reuse; }; + + double evaluate(void); + std::vector evaluate(std::vector& xcoords, std::vector& ycoords, std::vector& zcoords); + + void print(void); + +}; + +#endif diff --git a/include/opsin.h b/include/opsin.h new file mode 100644 index 00000000..52d46896 --- /dev/null +++ b/include/opsin.h @@ -0,0 +1,41 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPSIN_H +#define OPSIN_H + +#include "operation.h" + +class opsin: public operation +{ + + private: + + bool reuse = false; + std::shared_ptr myarg; + + public: + + opsin(std::shared_ptr arg) { myarg = arg; }; + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::vector> getarguments(void) { return {myarg}; }; + std::shared_ptr simplify(std::vector disjregs); + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + + double evaluate(void); + std::vector evaluate(std::vector& xcoords, std::vector& ycoords, std::vector& zcoords); + + void print(void); + +}; + +#endif diff --git a/include/opspline.h b/include/opspline.h new file mode 100644 index 00000000..6f225a46 --- /dev/null +++ b/include/opspline.h @@ -0,0 +1,41 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPSPLINE_H +#define OPSPLINE_H + +#include "operation.h" +#include "spline.h" + +class opspline: public operation +{ + + private: + + bool reuse = false; + std::shared_ptr myarg; + + spline myspline; + + public: + + opspline(spline spl, std::shared_ptr arg); + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::vector> getarguments(void) { return {myarg}; }; + std::shared_ptr simplify(std::vector disjregs); + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + + void print(void); + +}; + +#endif diff --git a/include/opsum.h b/include/opsum.h new file mode 100644 index 00000000..37d5b14f --- /dev/null +++ b/include/opsum.h @@ -0,0 +1,57 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPSUM_H +#define OPSUM_H + +#include "operation.h" + +class opsum: public operation +{ + + private: + + bool reuse = false; + std::vector> sumterms = {}; + + public: + + opsum(void) {}; + opsum(std::vector> input) { sumterms = input; }; + + void addterm(std::shared_ptr term) { sumterms.push_back(term); } + void subtractterm(std::shared_ptr term); + void removeterm(int whichterm) { sumterms.erase(sumterms.begin() + whichterm); }; + + int count(void) { return sumterms.size(); }; + bool issum(void) { return true; }; + + std::vector> getarguments(void) {return sumterms;}; + std::shared_ptr getargument(int argnum) { return sumterms[argnum]; }; + void replaceargument(int argnum, std::shared_ptr newarg) { sumterms[argnum] = newarg; }; + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::shared_ptr expand(void); + // Group all sumterms and the sum terms they + // include recursively together in this object. + void group(void); + std::shared_ptr simplify(std::vector disjregs); + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + bool isreused(void) { return reuse; }; + + double evaluate(void); + std::vector evaluate(std::vector& xcoords, std::vector& ycoords, std::vector& zcoords); + + void print(void); + +}; + +#endif diff --git a/include/optan.h b/include/optan.h new file mode 100644 index 00000000..e2cce9a4 --- /dev/null +++ b/include/optan.h @@ -0,0 +1,41 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPTAN_H +#define OPTAN_H + +#include "operation.h" + +class optan: public operation +{ + + private: + + bool reuse = false; + std::shared_ptr myarg; + + public: + + optan(std::shared_ptr arg) { myarg = arg; }; + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::vector> getarguments(void) { return {myarg}; }; + std::shared_ptr simplify(std::vector disjregs); + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + + double evaluate(void); + std::vector evaluate(std::vector& xcoords, std::vector& ycoords, std::vector& zcoords); + + void print(void); + +}; + +#endif diff --git a/include/optf.h b/include/optf.h new file mode 100644 index 00000000..778b9d58 --- /dev/null +++ b/include/optf.h @@ -0,0 +1,67 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef OPTF_H +#define OPTF_H + +#include "operation.h" + +class optf: public operation +{ + + private: + + int timederivativeorder = 0; + // The space derivative is only temporary. It is split later on into + // a product of invjac terms and ki, eta and phi field derivatives. + // 0 is no derivative, 1 is x, 2 is y and 3 is z. + int spacederivative = 0; + // 0 is no derivative, 1 is ki, 2 is eta and 3 is phi. + int kietaphiderivative = 0; + + // The selected form function component in the field: + int formfunctioncomponent = 0; + // For printing purposes: + int fieldcomponent = -1; + + std::shared_ptr myfield; + + int myphysicalregion; + + public: + + optf(std::shared_ptr fieldin, int physreg = -1) { myfield = fieldin; myphysicalregion = physreg; }; + + void setspacederivative(int whichderivative); + void increasetimederivativeorder(int amount); + void selectformfunctioncomponent(int comp) { formfunctioncomponent = comp; }; + + void setfieldcomponent(int comp) { fieldcomponent = comp; }; + + void setkietaphiderivative(int whichderivative) { kietaphiderivative = whichderivative; spacederivative = 0; }; + int getkietaphiderivative(void) { return kietaphiderivative; }; + + bool istf(void) { return true; }; + + bool isharmonicone(std::vector disjregs); + + std::shared_ptr getfieldpointer(void) { return myfield; }; + bool isphysicalregiondefined(void) { return (myphysicalregion != -1); }; + int getphysicalregion(void) { return myphysicalregion; }; + int getspacederivative(void) { return spacederivative; }; + int gettimederivative(void) { return timederivativeorder; }; + int getformfunctioncomponent(void) { return formfunctioncomponent; }; + int getfieldcomponent(void) { return fieldcomponent; }; + + bool isvalueorientationdependent(std::vector disjregs); + + std::shared_ptr copy(void); + + void print(void); + +}; + +#endif diff --git a/include/optime.h b/include/optime.h new file mode 100644 index 00000000..726fe2b8 --- /dev/null +++ b/include/optime.h @@ -0,0 +1,36 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + +// This object treats the time variable 't'. + +#ifndef OPTIME_H +#define OPTIME_H + +#include "operation.h" + +class optime: public operation +{ + + private: + + bool reuse = false; + + public: + + std::vector> interpolate(elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + std::shared_ptr copy(void); + + void reuseit(bool istobereused) { reuse = istobereused; }; + + double evaluate(void); + std::vector evaluate(std::vector& xcoords, std::vector& ycoords, std::vector& zcoords); + + void print(void); + +}; + +#endif diff --git a/include/orientation.h b/include/orientation.h new file mode 100644 index 00000000..538ee5fe --- /dev/null +++ b/include/orientation.h @@ -0,0 +1,105 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// The hierarchical form functions used change with the edges and faces orientations. +// This can lead to field discontinuity at the element interfaces if the orientations are not +// computed in a coherent way. The coherent way used is described below. +// +// EDGE ORIENTATION: +// +// An edge with nodes numbers [i j] has orientation +// +// - 0 if i > j | [0 1] +// - 1 if j > i | [1 0] +// +// The vector on the right of '|' gives the node reordering to be in orientation 0. +// +// TRIANGULAR SURFACE ORIENTATION: +// +// For the orientation of a triangle there are only 2 things of importance: +// - which node has the biggest number +// - what is the > < relation between the second and the third node +// +// A triangular face with node numbers [i j k] has orientation +// +// - 0 if i > j > k | [0 1 2] +// - 1 if i > k > j | [0 2 1] +// - 2 if j > k > i | [1 2 0] +// - 3 if j > i > k | [1 0 2] +// - 4 if k > i > j | [2 0 1] +// - 5 if k > j > i | [2 1 0] +// +// The vector on the right of '|' gives the node reordering to be in orientation 0. +// +// QUADRANGULAR SURFACE ORIENTATION: +// +// For the orientation of a quadrangle there are only 2 things of importance: +// - which node has the biggest number +// - what is the > < relation between the second and the fourth node +// The third node is fixed since it must be at the corner opposite to the first node. +// +// A quadrangular face with node numbers [i j k l] - a node and its next-next node must be at opposite corners - has orientation +// +// - 0 if max(i,j,k,l) = i and j > l | [0 1 2 3] +// - 1 if max(i,j,k,l) = i and l > j | [0 3 2 1] +// - 2 if max(i,j,k,l) = j and k > i | [1 2 3 0] +// - 3 if max(i,j,k,l) = j and i > k | [1 0 3 2] +// - 4 if max(i,j,k,l) = k and l > j | [2 3 0 1] +// - 5 if max(i,j,k,l) = k and j > l | [2 1 0 3] +// - 6 if max(i,j,k,l) = l and i > k | [3 0 1 2] +// - 7 if max(i,j,k,l) = l and k > i | [3 2 1 0] +// +// The vector on the right of '|' gives the node reordering to be in orientation 0. +// +// TOTAL ORIENTATION: +// +// The total orientation of an element is an integer that uniquely identifies all edges and faces +// orientations in the element. The number is computed as follows: +// totalorientation = sum on all edges(orientation of edge i * 2^i) + 2^numedges * sum on all faces(orientation of face j * 8^j). +// E.g. for a quad with edges orientations [0 1 1 0] and face orientation 7 we have: +// totalorientation = 0*2^0 + 1*2^1 + 1*2^2 + 0*2^3 + 2^4 * 7*8^0; + +#ifndef ORIENTATION_H +#define ORIENTATION_H + +#include +#include +#include "math.h" +#include "element.h" + +namespace orientation +{ + // Only the corner nodes must be provided in the node list. + std::vector gettotalorientation(int elementtypenumber, std::vector& nodelist); + + // Count the number of orientations for a given element type: + int countorientations(int elemtypenum); + + // 'getedgesorientationsfromtotalorientation'returns a vector whose + // index i gives the orientation of edge number i. + std::vector getedgesorientationsfromtotalorientation(int totalorientation, int elementtypenumber); + std::vector getfacesorientationsfromtotalorientation(int totalorientation, int elementtypenumber); + + // 'getreorderingtoreferenceedgeorientation' returns a vector of vectors 'a' + // such that if n is a vector containing the node list of an edge of + // orientation i then n(a(i)) is an edge of orientation number 0. + std::vector> getreorderingtoreferenceedgeorientation(void); + std::vector> getreorderingtoreferencetriangularfaceorientation(void); + std::vector> getreorderingtoreferencequadrangularfaceorientation(void); + + // 'getedgesorientationsinelement' outputs a vector listing the + // orientation of all edges in the element. + std::vector getedgesorientationsinelement(int elementtypenumber, std::vector& nodelist); + std::vector getfacesorientationsinelement(int elementtypenumber, std::vector& nodelist); + + // 'getorientationofedgeargument' gives the orientation + // of the edge whose nodes are provided as input argument + int getorientationofedge(std::vector& physicalnodesinedge); + int getorientationoftriangle(std::vector& physicalnodesintriangle); + int getorientationofquadrangle(std::vector& physicalnodesinquadrangle); +}; + +#endif diff --git a/include/parameter.h b/include/parameter.h new file mode 100644 index 00000000..5a5eda19 --- /dev/null +++ b/include/parameter.h @@ -0,0 +1,93 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef PARAMETER_H +#define PARAMETER_H + +#include +#include "universe.h" +#include "rawparameter.h" +#include "parameterselectedregion.h" +#include "expression.h" +#include "field.h" +#include "vec.h" + +class field; +class vec; +class expression; +class parameterselectedregion; + +class parameter +{ + + private: + + // The actual parameter: + std::shared_ptr rawparamptr = NULL; + + public: + + parameter(void); + parameter(int numrows, int numcols); + + int countrows(void); + int countcolumns(void); + + parameterselectedregion operator|(int physreg); + + void setvalue(int physreg, expression input); + + void print(void); + + std::shared_ptr getpointer(void) { return rawparamptr; }; + + + vec atbarycenter(int physreg, field onefield); + + std::vector max(int physreg, int refinement, std::vector xyzrange = {}); + std::vector max(int physreg, expression meshdeform, int refinement, std::vector xyzrange = {}); + std::vector min(int physreg, int refinement, std::vector xyzrange = {}); + std::vector min(int physreg, expression meshdeform, int refinement, std::vector xyzrange = {}); + + void interpolate(int physreg, std::vector& xyzcoord, std::vector& interpolated, std::vector& isfound); + void interpolate(int physreg, expression meshdeform, std::vector& xyzcoord, std::vector& interpolated, std::vector& isfound); + + std::vector interpolate(int physreg, const std::vector xyzcoord); + std::vector interpolate(int physreg, expression meshdeform, const std::vector xyzcoord); + + double integrate(int physreg, expression meshdeform, int integrationorder); + double integrate(int physreg, int integrationorder); + + void write(int physreg, int numfftharms, std::string filename, int lagrangeorder); + void write(int physreg, int numfftharms, expression meshdeform, std::string filename, int lagrangeorder); + + void write(int physreg, std::string filename, int lagrangeorder, int numtimesteps = -1); + void write(int physreg, expression meshdeform, std::string filename, int lagrangeorder, int numtimesteps = -1); + + + // Defining the +, -, * and / operators: + expression operator+(void); + expression operator-(void); + + expression operator+(parameter); + expression operator-(parameter); + expression operator*(parameter); + expression operator/(parameter); + + expression operator+(double); + expression operator-(double); + expression operator*(double); + expression operator/(double); + +}; + +// Define the left version of the operators based on the right one. +expression operator+(double, parameter); +expression operator-(double, parameter); +expression operator*(double, parameter); +expression operator/(double, parameter); + +#endif diff --git a/include/parameterselectedregion.h b/include/parameterselectedregion.h new file mode 100644 index 00000000..bd07499f --- /dev/null +++ b/include/parameterselectedregion.h @@ -0,0 +1,32 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef PARAMETERSELECTEDREGION_H +#define PARAMETERSELECTEDREGION_H + +#include +#include "expression.h" +#include "rawparameter.h" + +class rawparameter; +class expression; + +class parameterselectedregion +{ + + private: + + std::shared_ptr myparam; + int myphysreg; + + public: + + parameterselectedregion(std::shared_ptr param, int physreg) { myparam = param; myphysreg = physreg; }; + + void operator=(expression input); +}; + +#endif diff --git a/include/paraview/pvinterface.h b/include/paraview/pvinterface.h new file mode 100644 index 00000000..2da2f03e --- /dev/null +++ b/include/paraview/pvinterface.h @@ -0,0 +1,39 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . +// +// Thanks to R. Haouari for the support of the .vtu output format. + + +#ifndef PVINTERFACE_H +#define PVINTERFACE_H + +#include +#include +#include +#include +#include +#include +#include "densemat.h" +#include "iodata.h" +#include "element.h" +#include "mystring.h" +#include "universe.h" + +namespace pvinterface +{ + void writetovtkfile(std::string name, iodata datatowrite); + void writetovtufile(std::string name, iodata datatowrite); + void writetovtkfile(std::string name, iodata datatowrite, int timestepindex); + void writetovtufile(std::string name, iodata datatowrite, int timestepindex); + + void grouptopvdfile(std::string filename, std::vector filestogroup, std::vector timevals); + + // ParaView comes with its own element type numbering: + int converttoparaviewelementtypenumber(int ourtypenumber); + // ParaView comes with its own element node ordering: + std::vector getnodereordering(int ourtypenumber); +}; + +#endif diff --git a/include/petscmesh.h b/include/petscmesh.h new file mode 100644 index 00000000..0f2f5a53 --- /dev/null +++ b/include/petscmesh.h @@ -0,0 +1,43 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef PETSCMESH_H +#define PETSCMESH_H + +#include +#include "element.h" +#include "nodes.h" +#include "elements.h" +#include "physicalregions.h" +#include "densemat.h" +#include "indexmat.h" +#include "petscdmplex.h" +#include "petscviewer.h" + +class petscmesh +{ + private: + + DM mypetscmesh; + + int meshdim; + + int curvatureorder = 1; + + void reordernodes(int ourtypenum, std::vector& toreorder); + + public: + + petscmesh(std::string filename); + ~petscmesh(void); + + void extract(nodes& mynodes, elements& myelements, physicalregions& myphysicalregions, bool verbosity = false); + + // Write the petsc view to 'petscview.txt': + void view(void); +}; + +#endif diff --git a/include/physicalregion.h b/include/physicalregion.h new file mode 100644 index 00000000..bf1f342b --- /dev/null +++ b/include/physicalregion.h @@ -0,0 +1,77 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef PHYSICALREGION_H +#define PHYSICALREGION_H + +#include +#include "disjointregions.h" +#include "physicalregions.h" +#include +#include +#include "element.h" + +class physicalregions; + +class physicalregion +{ + + private: + + // The physical region can only hold elements of a single dimension (0D, 1D, 2D or 3D). + int myelementdimension = -1; + + int myphysicalregionnumber; + + disjointregions* mydisjointregions; + physicalregions* myphysicalregions; + + // 'includesdisjointregion[i]' is true if disjoint region i is in the physical region. + std::vector includesdisjointregion = {}; + // List of all element numbers in the physical region. + std::vector> elementlist = std::vector>(8, std::vector(0)); + + public: + + physicalregion(void) {}; + physicalregion(disjointregions&, physicalregions&, int physicalregionnumber, int elementdimension); + + int getnumber(void); + // Add an element of uncurved type 'elementtypenumber' to the physical region: + void addelement(int elementtypenumber, int elementnumber); + + int countelements(void); + int getelementdimension(void); + + // Define the physical region in terms of the disjoint regions it contains: + void definewithdisjointregions(int physregdim, std::vector disjointregionlist, bool ismeshloading = false); + + // Get the definition of this physical region based on the disjoint regions it contains: + std::vector getdefinition(void); + + // Get all disjoint regions of the max dimension: + std::vector getdisjointregions(void); + // Get all disjoint regions of a given dimension (use -1 for all): + std::vector getdisjointregions(int dim); + // Get all disjoint regions of a given element type: + std::vector getdisjointregionsoftype(int elementtypenumber); + + // 'renumberelements' updates the element numbers in 'elementlist' based on the input vector. + // 'elementtypenumber' is the uncurved version of the actual element. + void renumberelements(int elementtypenumber, std::vector& elementrenumbering); + + // 'removeduplicatedelements' removes all duplicated elements in 'elementlist' (this call SORTS THE ELEMENTS). + void removeduplicatedelements(void); + + // Get the elements in the physical region that have the region dimension: + std::vector>* getelementlist(void); + + // Make a full copy of this object (linking objects used are the arguments): + std::shared_ptr copy(physicalregions* prs, disjointregions* drs); + +}; + +#endif diff --git a/include/physicalregions.h b/include/physicalregions.h new file mode 100644 index 00000000..d2e4cbfe --- /dev/null +++ b/include/physicalregions.h @@ -0,0 +1,85 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef PHYSICALREGIONS_H +#define PHYSICALREGIONS_H + +#include +#include +#include +#include "physicalregion.h" +#include "disjointregions.h" +#include +#include "gentools.h" + +class physicalregion; + +class physicalregions +{ + + private: + + std::vector> myphysicalregions = {}; + std::vector myphysicalregionnumbers = {}; + + disjointregions* mydisjointregions = NULL; + + public: + + physicalregions(disjointregions&); + + // Create a new physical region that is the union of all regions: + int createunion(std::vector input, bool createifexisting = true); + int createintersection(std::vector input, int physregdim, bool createifexisting = true); + int createunionofall(bool createifexisting = true); + + // Create a physical region from a list of disjoint regions: + int createfromdisjointregionlist(int physregdim, std::vector drs); + + // Define the physical regions based on the disjoint regions they contain: + void definewithdisjointregions(void); + + int getmaxphysicalregionnumber(void); + + // 'get' creates any non-existent physical region object of requested dimension: + physicalregion* get(int physicalregionnumber, int elementdimension = -1); + // 'getatindex' does not create non-existent physical region objects. + physicalregion* getatindex(int physicalregionindex); + // Get the number of physical regions of a given dimension (use -1 for all): + int count(int dim = -1); + // Get the total number of elements in all physical regions: + int countelements(void); + // Get all physical region numbers of a given dimension (use -1 for all): + std::vector getallnumbers(int dim = -1); + // Get the physical region number of the physicalregionindex th physical region: + int getnumber(int physicalregionindex); + // Get the index of the physical region number (-1 if undefined): + int getindex(int physicalregionnumber); + + // Find the physical region of given dimension and disjoint regions (-1 if not found): + int find(int physregdim, std::vector disjregsinphysreg); + + // Get the list of physical regions in which each element of a given type is. + // 'addresses[i]' gives the first index in 'prs' where to find the physical + // regions for the ith element. Length is numelems+1 and last entry gives prs.size(). + void inphysicalregions(int elementtypenumber, int totalnumelemsintype, std::vector& addresses, std::vector& prs); + + // Remove physical regions (do not call this yourself). + void remove(std::vector toremove, bool ispartofdisjregstructure); + + // Extract the positively renumbered physical regions: + physicalregions extract(std::vector& renumbering); + + // Give an error if any of the physical regions is not defined: + void errorundefined(std::vector physregs); + // Give an error if not all physical regions have the same dimension: + void errornotsamedim(std::vector physregs); + + // Make a full copy of this object (linking objects used are the arguments): + void copy(disjointregions* drs, physicalregions* target); +}; + +#endif diff --git a/src/shapefunction/polynomial.h b/include/polynomial.h old mode 100755 new mode 100644 similarity index 100% rename from src/shapefunction/polynomial.h rename to include/polynomial.h diff --git a/src/shapefunction/polynomials.h b/include/polynomials.h old mode 100755 new mode 100644 similarity index 100% rename from src/shapefunction/polynomials.h rename to include/polynomials.h diff --git a/include/port.h b/include/port.h new file mode 100644 index 00000000..afaffc21 --- /dev/null +++ b/include/port.h @@ -0,0 +1,72 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// This object is a wrapper of the actual port object 'rawport' pointed +// by 'rawportptr' and to which most of the functions are redirected. + +#ifndef PORT_H +#define PORT_H + +#include +#include "rawport.h" + +class rawport; + +class port +{ + + private: + + std::shared_ptr rawportptr = NULL; + + public: + + port(void); + // Provide the harmonics for a multiharmonic port: + port(std::vector harmonicnumbers); + port(std::shared_ptr rp); + + void setvalue(double portval); + double getvalue(void); + + void setname(std::string name); + std::string getname(void); + + std::vector getharmonics(void); + + port harmonic(int harmonicnumber); + port harmonic(std::vector harmonicnumbers); + port sin(int freqindex); + port cos(int freqindex); + + std::shared_ptr getpointer(void); + + void print(void); + + // Defining the +, -, * and / operators: + expression operator+(void); + expression operator-(void); + + expression operator+(port); + expression operator-(port); + expression operator*(port); + expression operator/(port); + + expression operator+(double); + expression operator-(double); + expression operator*(double); + expression operator/(double); + +}; + +// Define the left version of the operators based on the right one. +expression operator+(double, port); +expression operator-(double, port); +expression operator*(double, port); +expression operator/(double, port); + +#endif + diff --git a/include/portrelation.h b/include/portrelation.h new file mode 100644 index 00000000..ffcd0fbb --- /dev/null +++ b/include/portrelation.h @@ -0,0 +1,63 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + +// This object stores a port relation. In the multiharmonic case +// the relation for every harmonic is extracted and stored. + +#ifndef PORTRELATION_H +#define PORTRELATION_H + +#include +#include "rawport.h" +#include "expression.h" + +class portrelation +{ + + private: + + // Coefficient of each port (cannot be multiharmonic): + std::vector mycoefs = {}; + + // Optional no-port term (cannot be multiharmonic): + std::vector mynoportterm = {}; + + + // Below are the containers for every relation. Entry [h] gives + // all terms for the harmonic h relation (no terms if no relation). + + // Rawports: + std::vector< std::vector> > myrawports = {}; + + // Index of each associated coefficient: + std::vector< std::vector > mycoefinds = {}; + + // KCM targets: + std::vector< std::vector > mykcm = {}; + + // Factors and f0 powers (use 1.0 and 0.0 for none): + std::vector< std::vector> > myfactors = {}; + + public: + + portrelation(expression prtrel); + + // Count the number of sub-relations: + int count(void); + + // Get all (possibly duplicated) rawports in the relation: + std::vector> getrawports(void); + + bool hasnoportterm(void); + // Evaluate the no-port term + double evalnoportterm(void); + + // For each term in KCM get the associated rawport, relation index and value: + void evalrelations(int KCM, std::vector>& rps, std::vector& relinds, std::vector& relvals); + +}; + +#endif + diff --git a/include/ptracker.h b/include/ptracker.h new file mode 100644 index 00000000..9a31c966 --- /dev/null +++ b/include/ptracker.h @@ -0,0 +1,53 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// This object keeps track of the element numbering when the mesh is p-adapted. + +#ifndef PTRACKER_H +#define PTRACKER_H + +#include +#include +#include +#include +#include "disjointregions.h" + +class ptracker +{ + + private: + + disjointregions mydisjointregions; + + // The elements of type i can be renumbered as new number = elementrenumbering[i][old number]. + std::vector> elementrenumbering = {}; + + public: + + ptracker(std::vector numelemspertype); + + // This updates the disjoint region object: + void updatedisjointregions(disjointregions* input); + + // Update the stored renumbering according to the subsequent renumbering step provided as argument. + void updaterenumbering(std::vector>& renumber); + + // The element number in the mesh tracked by this mesh tracker can be renumbered to the one + // in the mesh tracked by the 'mt' tracker by using mtelemnum = renumbering[thiselemnum]. + // In case 'mt' is NULL it is considered to have identity renumbering (no number change). + void getrenumbering(std::shared_ptr mt, std::vector>& renumbering); + + disjointregions* getdisjointregions(void); + + // Provides a vector indisjregs[i][e] giving the disjoint region in which element e of type i is (in the mesh state of this mesh tracker). + void getindisjointregions(std::vector>& indisjregs); + + void print(void); + +}; + +#endif + diff --git a/include/pvinterface.h b/include/pvinterface.h new file mode 100644 index 00000000..2da2f03e --- /dev/null +++ b/include/pvinterface.h @@ -0,0 +1,39 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . +// +// Thanks to R. Haouari for the support of the .vtu output format. + + +#ifndef PVINTERFACE_H +#define PVINTERFACE_H + +#include +#include +#include +#include +#include +#include +#include "densemat.h" +#include "iodata.h" +#include "element.h" +#include "mystring.h" +#include "universe.h" + +namespace pvinterface +{ + void writetovtkfile(std::string name, iodata datatowrite); + void writetovtufile(std::string name, iodata datatowrite); + void writetovtkfile(std::string name, iodata datatowrite, int timestepindex); + void writetovtufile(std::string name, iodata datatowrite, int timestepindex); + + void grouptopvdfile(std::string filename, std::vector filestogroup, std::vector timevals); + + // ParaView comes with its own element type numbering: + int converttoparaviewelementtypenumber(int ourtypenumber); + // ParaView comes with its own element node ordering: + std::vector getnodereordering(int ourtypenumber); +}; + +#endif diff --git a/include/rawarc.h b/include/rawarc.h new file mode 100644 index 00000000..d97d2bc3 --- /dev/null +++ b/include/rawarc.h @@ -0,0 +1,83 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// This object holds a geometrical shape. + +#ifndef RAWARC_H +#define RAWARC_H + +#include +#include +#include + +#include "geotools.h" +#include "rawshape.h" +#include "rawpoint.h" +#include "rawextrusion.h" + +class rawarc: public rawshape +{ + + private: + + int myphysicalregion = -1; + + int mycurvatureorder = 1; + + int mynummeshpoints; + + // Son shapes: + std::vector> sons = {}; + // Arc center point: + std::shared_ptr mycenterpoint; + + // Coordinates of the nodes in the mesh: + std::vector mycoords = {}; + // Elements in the mesh: + std::vector> myelems = std::vector>(8, std::vector(0)); + + public: + + rawarc(void) {}; + + // Provide to this constructor the point rawshapes at the two ends of the arc and at its center. + // Order is start point, end point, center point. + rawarc(int physreg, std::vector> inputpoints, int nummeshpoints); + + std::shared_ptr extrude(int physreg, double height, int numlayers, std::vector extrudedirection); + + std::shared_ptr duplicate(void); + + // Flip the direction: + void flip(void); + + void setphysicalregion(int physreg); + + int getcurvatureorder(void); + + int getdimension(void); + + std::string getname(void); + + std::vector> getsons(void); + + // Get subshapes (sons are included): + std::vector> getsubshapes(void); + void setsubshapes(std::vector> subshapes); + + // Get the mesh info of the shape: + int getphysicalregion(void); + std::vector* getcoords(void); + std::vector>* getelems(void); + + + std::shared_ptr getpointer(void); + + void mesh(void); + +}; + +#endif diff --git a/include/rawdisk.h b/include/rawdisk.h new file mode 100644 index 00000000..c7c0c79e --- /dev/null +++ b/include/rawdisk.h @@ -0,0 +1,85 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// This object holds a geometrical shape. + +#ifndef RAWDISK_H +#define RAWDISK_H + +#include +#include + +#include "expression.h" + +#include "rawshape.h" +#include "rawpoint.h" +#include "rawline.h" +#include "rawarc.h" +#include "rawquadrangle.h" +#include "geotools.h" +#include "shape.h" +#include "rawextrusion.h" + +class rawdisk: public rawshape +{ + + private: + + int myphysicalregion = -1; + + int mycurvatureorder = 1; + + int mynummeshpoints; + + // Son shapes (lines defining the contour of the surface). + std::vector> sons = {}; + // Disk center point: + std::shared_ptr mycenterpoint; + + double myradius; + + // Coordinates of the nodes in the mesh: + std::vector mycoords = {}; + // Elements in the mesh: + std::vector> myelems = std::vector>(8, std::vector(0)); + + public: + + rawdisk(void) {}; + + rawdisk(int physreg, std::shared_ptr centerpoint, double radius, int nummeshpts); + + std::shared_ptr extrude(int physreg, double height, int numlayers, std::vector extrudedirection); + + std::shared_ptr duplicate(void); + + void setphysicalregion(int physreg); + + int getcurvatureorder(void); + + int getdimension(void); + + std::string getname(void); + + std::vector> getsons(void); + + // Get subshapes (sons are included): + std::vector> getsubshapes(void); + void setsubshapes(std::vector> subshapes); + + // Get the mesh info of the shape: + int getphysicalregion(void); + std::vector* getcoords(void); + std::vector>* getelems(void); + + + std::shared_ptr getpointer(void); + + void mesh(void); + +}; + +#endif diff --git a/include/rawextrusion.h b/include/rawextrusion.h new file mode 100644 index 00000000..060b78b9 --- /dev/null +++ b/include/rawextrusion.h @@ -0,0 +1,88 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// This object holds a geometrical shape. + +#ifndef RAWEXTRUSION_H +#define RAWEXTRUSION_H + +#include +#include + +#include "expression.h" + +#include "rawshape.h" +#include "rawquadrangle.h" +#include "rawtriangle.h" +#include "rawline.h" +#include "rawpoint.h" +#include "geotools.h" + +class rawextrusion: public rawshape +{ + + private: + + int myphysicalregion = -1; + + int mycurvatureorder = 1; + + // Son shapes: + std::vector> sons = {}; + + // Coordinates of the nodes in the mesh: + std::vector mycoords = {}; + // Elements in the mesh: + std::vector> myelems = std::vector>(8, std::vector(0)); + + + // Number of node layers in the extrusion: + int mynumlayers; + + // Extrusion length: + double myheight; + + // Extrusion direction: + std::vector myextrudedirection; + + // Unextruded rawshape: + std::shared_ptr mybaseshape; + + public: + + rawextrusion(void) {}; + + rawextrusion(int physreg, std::shared_ptr innerrawshape, double height, int numlayers, std::vector extrudedirection); + + std::shared_ptr duplicate(void); + + void setphysicalregion(int physreg); + + int getcurvatureorder(void); + + int getdimension(void); + + std::string getname(void); + + std::vector> getsons(void); + + // Get subshapes (sons are included): + std::vector> getsubshapes(void); + void setsubshapes(std::vector> subshapes); + + // Get the mesh info of the shape: + int getphysicalregion(void); + std::vector* getcoords(void); + std::vector>* getelems(void); + + + std::shared_ptr getpointer(void); + + void mesh(void); + +}; + +#endif diff --git a/include/rawfield.h b/include/rawfield.h new file mode 100644 index 00000000..8aad042a --- /dev/null +++ b/include/rawfield.h @@ -0,0 +1,291 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// The 'rawfield' object is the actual field object. The 'field' +// object is just a user-friendly wrapper for a 'rawfield' object. +// +// A 'rawfield' can include subfields (e.g. for "h1xyz" it includes 3 +// "h1" subfields) in 'mysubfields[i][0]'. It can also include harmonics +// in 'myharmonics'. In that case 'mysubfields' must be empty. Harmonic +// h is available at myharmonics[h][0] if it exists (otherwise +// myharmonics[h] is empty). +// When 'mysubfields' AND 'myharmonics' are empty then the raw field +// actually stores field data in its containers. +// +// Note: a raw field can include subfields which can include harmonics but: +// - an included subfield can not itself include subfields, only harmonics +// - an included harmonic can not itself include subfields or harmonics + +#ifndef RAWFIELD_H +#define RAWFIELD_H + +#include +#include +#include +#include +#include +#include "coefmanager.h" +#include "universe.h" +#include "expression.h" +#include "sl.h" +#include "harmonic.h" +#include "densemat.h" +#include "element.h" +#include "elements.h" +#include "nodes.h" +#include "disjointregions.h" +#include "hierarchicalformfunction.h" +#include "hierarchicalformfunctioncontainer.h" +#include "hierarchicalformfunctioniterator.h" +#include "lagrangeformfunction.h" +#include "elementselector.h" +#include "memory.h" +#include "selector.h" +#include "field.h" +#include "vectorfieldselect.h" +#include "rawspanningtree.h" +#include "rawmesh.h" +#include "rawport.h" + +class rawmesh; +class vectorfieldselect; +class coefmanager; +class rawvec; +class expression; +class elementselector; +class rawspanningtree; + +class rawfield : public std::enable_shared_from_this +{ + + private: + + bool amimultiharmonic = false; + + std::string myname = ""; + std::string mytypename = ""; + + std::vector >> mysubfields = {}; + std::vector >> myharmonics = {}; + + + // In case there is neither a subfield nor a harmonic, i.e. both + // vectors above are empty, then the raw field actually stores + // field data in the containers below. + // In this case the harmonic is said to be equal 1. + + std::shared_ptr mycoefmanager = NULL; + + // interpolationorder[disjreg] gives the interpolation + // order of the field on disjoint region 'disjreg'. + std::vector interpolationorder = {}; + // mydisjregconstraints[disjreg] gives the information to compute the + // constraint value on the disjoint region. NULL means unconstrained. + std::vector, expression, int, int>>> mydisjregconstraints = {}; + // myconditionalconstraints[disjreg] gives the {conditional expression, constraint value} + // on the NODAL disjoint region 'disjreg'. Empty means unconstrained. + std::vector> myconditionalconstraints = {}; + + // The spanning tree used for gauging fields (NULL if none): + std::shared_ptr myspanningtree = NULL; + + // isitgauged[disjreg] is true if disjoint region 'disjreg' is gauged. + std::vector isitgauged = {}; + + // isitported[disjreg] is true if a port is associated to the disjoint region. + std::vector isitported = {}; + + + + bool ispadaptive = false; + + std::shared_ptr myptracker = NULL; + + // Track the calls to 'setorder', 'setdisjregconstraint', 'setconditionalconstraint', 'setgauge', 'setport'. + std::vector> myordertracker = {}; + std::vector, expression, int>> mydisjregconstrainttracker = {}; + std::vector> myconditionalconstrainttracker = {}; + std::vector mygaugetracker = {}; + std::vector, std::shared_ptr>> myporttracker = {}; + + // To avoid infinite recursive calls: + bool issynchronizing = false; + // Allow/forbid syncing: + bool issynchronizingallowed = true; + // Allow/forbid value syncing: + bool isvaluesynchronizingallowed = true; + + int myupdateaccuracy = 0; + + + // Mesh on which this object is based: + std::shared_ptr myrawmesh = NULL; + + public: + + // Synchronize with the hp-adapted mesh. + // If provided, 'physregsfororder' must be {physreg1,orderpr1,physreg2,orderpr2,...} with ORDERS SORTED ASCENDINGLY. + void synchronize(std::vector physregsfororder = {}, std::vector disjregsfororder = {}); + + void updateshapefunctions(expression updateexpr, expression* meshdeform, std::vector> drsindims, int updateaccuracy, bool withtiming = false); + void updatenodalshapefunctions(expression updateexpr, expression* meshdeform, std::vector> drsindims); + void updateothershapefunctions(int dim, expression updateexpr, expression* meshdeform, std::vector> drsindims, int updateaccuracy); + + void allowsynchronizing(bool allowit); + void allowvaluesynchronizing(bool allowit); + + void setupdateaccuracy(int extraintegrationorder); + + rawfield(std::string fieldtypename, const std::vector harmonicnumbers, bool ismultiharm); + rawfield(void); + // Get a new field with interpolation orders from 'dm' (the corresponding field must have been selected in 'dm'): + rawfield(dofmanager* dm, std::shared_ptr rm, std::shared_ptr pt); + + ~rawfield(void); + + bool ismultiharmonic(void) { return amimultiharmonic; }; + + int countcomponents(void); + int countsubfields(void) { return mysubfields.size(); }; + int countformfunctioncomponents(void); + + // List all harmonics in the raw field. + std::vector getharmonics(void); + int getfirstharmonic(void); + bool isharmonicincluded(int harmonic); + // Print a string showing the harmonics in the field: + void printharmonics(void); + + // Reset the coef manager to all zero and return the current one: + std::shared_ptr resetcoefmanager(void); + void setcoefmanager(std::shared_ptr cm); + + // Print the raw field name: + void print(void); + void printvalues(bool databoundsonly = true); + // Set the raw field name: + void setname(std::string name); + std::string gettypename(bool familyonly = true); + + void setorder(int physreg, int interpolorder, bool iscalledbyuser = true); + void setorder(expression criterion, int loworder, int highorder, double critrange); // critrange -1 for automatic choice + + // Associate the primal and dual port to the field: + void setport(int physreg, std::shared_ptr primal, std::shared_ptr dual); + + void setvalue(int physreg, int numfftharms, expression* meshdeform, expression input, int extraintegrationdegree = 0); + // Set a zero value: + void setvalue(int physreg); + + // Selected elements can include multiple orientations and field orders. + // 'gpcoordsin' must correspond to Gauss coordinates for the selected element type. + // If reuse is allowed then all arguments must correspond to the reused data. + void setvalue(elementselector& elemselect, std::vector& gpcoordsin, expression* meshdeform, densemat values); + + // Set/get value at nodes for 'h1' type fields: + void setnodalvalues(indexmat nodenumbers, densemat values); + densemat getnodalvalues(indexmat nodenumbers); + + // Zero all dofs on the requested physical region: + void setzerovalue(int physreg); + + void setdisjregconstraint(int physreg, int numfftharms, expression* meshdeform, expression input, int extraintegrationdegree = 0); + // Set homogeneous Dirichlet constraints: + void setdisjregconstraint(int physreg); + + // Set a conditional constraint: + void setconditionalconstraint(int physreg, expression condexpr, expression valexpr); + + // Set a gauge condition: + void setgauge(int physreg); + + void setspanningtree(std::shared_ptr spantree); + // This should only be called on a field without subfields or harmonics: + std::shared_ptr getspanningtree(void); + + std::shared_ptr getpointer(void); + std::shared_ptr getrawmesh(void); + std::shared_ptr getptracker(void); + + std::shared_ptr getcoefmanager(void); + + // Transfer data from a solution vector to the field. + // Get from all regions with physreg set to -1. 'op' can be 'add' or 'set'. + void setdata(int physreg, vectorfieldselect myvec, std::string op = "set"); + + // Transfer data from the rawfield to a vectorfieldselect: + void transferdata(int physreg, vectorfieldselect myvec, std::string op); + + // Set the source value at every cut: + void setcohomologysources(std::vector cutphysregs, std::vector cutvalues); + + // Select a component. + std::shared_ptr comp(int component); + // Select a single or several harmonics. + // Outputs all components corresponding to that harmonic. + std::shared_ptr harmonic(int harmonicnumber); + std::shared_ptr harmonic(const std::vector harmonicnumbers); + + // Get all included rawfields (subfields and harmonics in each subfield): + std::vector> getsons(void); + + // Only valid for fields without subfields. + bool isdisjregconstrained(int disjreg); + std::vector, expression, int, int>>> getdisjregconstraints(void); + + bool isconditionallyconstrained(int disjreg); + std::vector> getconditionalconstraints(void); + + bool isgauged(int disjreg); + + // Get the interpolation order on a disjoint region. + // Only valid for fields without subfields. + int getinterpolationorder(int disjreg); + std::vector getinterpolationorders(void); + // This function returns the field interpolation order on all elements requested and the max order encountered. + int getinterpolationorders(int elementtypenumber, std::vector& elementnumbers, std::vector& fieldorders); + // This function returns the lowest order containing alpha % of the shape function coefficient weight. + void getinterpolationorders(int fieldorder, double alpha, double absthres, std::vector& weightsforeachorder, std::vector& lowestorders); + + // 'weightsforeachorder' has size numelems x fieldorder+1: + void getweightsforeachorder(int elementtypenumber, int fieldorder, std::vector& elementnumbers, std::vector& weightsforeachorder); + + // Give an error if all harmonics have not the same interpolation order. + // Only valid for fields without subfields. + void errornotsameinterpolationorder(int disjreg); + + // Get the average of the coefficients for all shape functions up to a given order: + void getaverage(int elementtypenumber, std::vector& elementnumbers, int maxorder, std::vector& averagevals); + + + // Get a vector listing all subfields and every harmonic for every subfield + // as a pair of {subfieldnum,harmnum} and the rawfield pointer: + std::vector, std::shared_ptr>> getallsons(void); + + // Write/load the raw data to/from compact sparselizard format: + void writeraw(int physreg, std::string filename, bool isbinary, std::vector extradata); + std::vector loadraw(std::string filename, bool isbinary); + + + // Return {dkix,dkiy,...,detax,detay,...}: + std::vector getjacterms(elementselector& elemselect, std::vector& evaluationcoordinates); + + + // This interpolate is called in practice: + std::vector> interpolate(int whichderivative, int formfunctioncomponent, elementselector& elemselect, std::vector& evaluationcoordinates); + + // The function works only on fields that are not containers. + densemat getcoefficients(int elementtypenumber, int interpolorder, std::vector elementnumbers); + // 'interpolate' outputs the field value at the evaluation coordinates + // provided as second argument for all elements in 'elementlist'. + // Set 'whichderivative' to 0, 1, 2 or 3 to get respectively the + // no derivative, ki, eta or phi derivative of the field. + std::vector> interpolate(int whichderivative, int formfunctioncomponent, int elementtypenumber, int totalorientation, int interpolorder, std::vector elementnumbers, std::vector& evaluationcoordinates); + +}; + + +#endif diff --git a/include/rawline.h b/include/rawline.h new file mode 100644 index 00000000..1e127bc7 --- /dev/null +++ b/include/rawline.h @@ -0,0 +1,85 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// This object holds a geometrical shape. + +#ifndef RAWLINE_H +#define RAWLINE_H + +#include +#include +#include + +#include "rawshape.h" +#include "rawpoint.h" +#include "rawextrusion.h" + +class rawline: public rawshape +{ + + private: + + int myphysicalregion = -1; + + int mycurvatureorder = 1; + + int mynummeshpoints; + + // Son shapes: + std::vector> sons = {}; + + // Coordinates of the nodes in the mesh: + std::vector mycoords = {}; + // Elements in the mesh: + std::vector> myelems = std::vector>(8, std::vector(0)); + + public: + + rawline(void) {}; + + // Provide to this constructor the coordinates of all mesh nodes in the line: + rawline(int physreg, std::vector allcoords); + + // Provide to this constructor the point rawshapes at the two ends of the line: + rawline(int physreg, std::vector> inputpoints, int nummeshpoints); + + // Provide to this constructor the coordinates of all mesh nodes and elements in the line: + rawline(int physreg, std::vector& allcoords, std::vector>& allelems, int curvatureorder); + + std::shared_ptr extrude(int physreg, double height, int numlayers, std::vector extrudedirection); + + std::shared_ptr duplicate(void); + + // Flip the direction: + void flip(void); + + void setphysicalregion(int physreg); + + int getcurvatureorder(void); + + int getdimension(void); + + std::string getname(void); + + std::vector> getsons(void); + + // Get subshapes (sons are included): + std::vector> getsubshapes(void); + void setsubshapes(std::vector> subshapes); + + // Get the mesh info of the shape: + int getphysicalregion(void); + std::vector* getcoords(void); + std::vector>* getelems(void); + + + std::shared_ptr getpointer(void); + + void mesh(void); + +}; + +#endif diff --git a/include/rawmat.h b/include/rawmat.h new file mode 100644 index 00000000..a71efde8 --- /dev/null +++ b/include/rawmat.h @@ -0,0 +1,97 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + +// This code calls the PETSc library. See https://www.mcs.anl.gov/petsc/ for more information. + +#ifndef RAWMAT_H +#define RAWMAT_H + +#include +#include +#include "dofmanager.h" +#include +#include "gentools.h" +#include "indexmat.h" +#include "densemat.h" +#include "memory.h" +#include "petsc.h" +#include "petscmat.h" + +class dofmanager; + +class rawmat +{ + private: + + // Combining all accumulated fragments below gives the overall matrix. + std::vector accumulatedrowindices = {}; + std::vector accumulatedcolindices = {}; + std::vector accumulatedvals = {}; + + + long long int nnzA = -1, nnzD = -1; + + // The sparse matrix is stored in csr format. Dirichlet constraints are eliminated using A and D in Atotal = [A D; 0 1]. + // The rows and columns in A and D are renumbered consecutively from zero. + indexmat Arows, Acols, Drows, Dcols; + densemat Avals, Dvals; + // Ainds[i] is the index in Atotal of the ith index in A: + indexmat Ainds, Dinds; + + Mat Amat = PETSC_NULL, Dmat = PETSC_NULL; + + // 'myksp' will store the factorization if it is to be reused: + KSP myksp = PETSC_NULL; + bool factorizationreuse = false; + bool isitfactored = false; + + std::shared_ptr mydofmanager = NULL; + + int mymeshnumber = 0; + + public: + + rawmat(std::shared_ptr dofmngr); + rawmat(std::shared_ptr dofmngr, Mat inA, Mat inD, indexmat inAinds, indexmat inDinds); + + ~rawmat(void); + + long long int countrows(void); + long long int countcolumns(void); + + long long int countnnz(void) { return nnzA; }; + + int getmeshnumber(void) { return mymeshnumber; }; + + void reusefactorization(void) { factorizationreuse = true; }; + bool isfactorizationreuseallowed(void) { return factorizationreuse; }; + bool isfactored(void) { return isitfactored; }; + void isfactored(bool isfact) { isitfactored = isfact; }; + + // Add a fragment to the matrix (empty fragments are ignored): + void accumulate(indexmat rowadresses, indexmat coladresses, densemat vals); + // Create the petsc matrices: + void process(std::vector& isconstrained); + // Clear all the fragments: + void clearfragments(void); + + void print(void); + + // Extract a new initialized rawmat that has all accumulated data: + std::shared_ptr extractaccumulated(void); + + indexmat getainds(void); + indexmat getdinds(void); + + Mat getapetsc(void); + Mat getdpetsc(void); + + std::shared_ptr getdofmanager(void); + + KSP* getksp(void); + +}; + +#endif diff --git a/include/rawmesh.h b/include/rawmesh.h new file mode 100644 index 00000000..ce6022ac --- /dev/null +++ b/include/rawmesh.h @@ -0,0 +1,176 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef RAWMESH_H +#define RAWMESH_H + +#include +#include "nodes.h" +#include "elements.h" +#include "physicalregions.h" +#include "disjointregions.h" +#include "universe.h" +#include +#include +#include +#include "wallclock.h" +#include "physicalregion.h" +#include "gmshinterface.h" +#include "nastraninterface.h" +#include "element.h" +#include +#include "shape.h" +#include "rawshape.h" +#include "regiondefiner.h" +#include "petscmesh.h" +#include "ptracker.h" +#include "htracker.h" +#include "rawfield.h" +#include "dtracker.h" + +class dtracker; +class htracker; +class nodes; +class elements; +class shape; + +class rawmesh : public std::enable_shared_from_this +{ + private: + + nodes mynodes; + elements myelements; + physicalregions myphysicalregions; + disjointregions mydisjointregions; + + int mynumsplitrequested = 0; + void splitmesh(void); + regiondefiner myregiondefiner; + + int mynumber = 0; + + // For domain decomposition: + std::shared_ptr mydtracker = NULL; + + // For p-adaptivity: + std::shared_ptr myptracker = NULL; + std::vector, expression, int, int, double>> mypadaptdata = {}; + + // For h-adaptivity (only for original mesh): + std::shared_ptr myhadaptedmesh = NULL; + std::vector> myhadaptdata = {}; // only one element or empty if not h-adaptive + // For the h-adapted mesh: + std::shared_ptr myhtracker = NULL; + + public: + + // 'readfromfile' hands over to the function reading the format of the mesh file. + void readfromfile(std::string tool, std::string source); + // 'writetofile' hands over to the function writing the format of the mesh file. + void writetofile(std::string name, std::vector physregstowrite); + + // 'removeduplicates' removes the duplicated elements (and nodes). + void removeduplicates(int lasttypetoprocess = 7); + + // 'printcount' prints the number of elements for every type. + void printcount(void); + + rawmesh(void); + ~rawmesh(void); + + nodes* getnodes(void); + elements* getelements(void); + physicalregions* getphysicalregions(void); + disjointregions* getdisjointregions(void); + std::shared_ptr getdtracker(void); + std::shared_ptr getptracker(void); + std::shared_ptr gethtracker(void); + int getmeshnumber(void) { return mynumber; }; + + // Get a full copy of this rawmesh: + std::shared_ptr copy(void); + + // Get a full copy of this rawmesh adapted to the target ptracker. + // If the target ptracker is identical to 'myptracker' then this object is returned. + std::shared_ptr getattarget(std::shared_ptr targetpt); + + // Load from file name: + void load(std::string name, int globalgeometryskin, int numoverlaplayers, int verbosity); + // Load from multiple files: + void load(bool mergeduplicates, std::vector meshfiles, int verbosity); + // Load from shape vector: + void load(std::vector inputshapes, int globalgeometryskin, int numoverlaplayers, int verbosity); + + // Write to file: + void write(int physreg, std::string name); + void write(std::string name, std::vector physregs, int option); + + // Split each element in the mesh n times: + void split(int n); + + // Get a bool vector telling if the nodes are in a physical region: + std::vector isnodeinphysicalregion(int physreg); + + // Move the mesh in the x, y and z direction by a value given in the expression. + void move(int physreg, expression u); + // 'shift' translates the mesh in the 'x', 'y' and 'z' direction. + void shift(int physreg, double x, double y, double z); + // 'rotate' rotates the mesh by ax, ay and az degrees around the x, y and z axis respectively. + void rotate(int physreg, double ax, double ay, double az); + // 'scale' scales the mesh in the 'x', 'y' and 'z' direction. + void scale(int physreg, double x, double y, double z); + + // 'getmeshdimension' gives n for a mesh whose highest element dimension is n. + int getmeshdimension(void); + + // Get the physical regions of a given dimension (use -1 for all). + std::vector getphysicalregionnumbers(int dim); + + // Additional region selection tools. Will become effective only after loading the mesh. Can reuse previous selections! + void selectskin(int newphysreg, int physregtoskin); + void selectbox(int newphysreg, int physregtobox, int selecteddim, std::vector boxlimit); + void selectsphere(int newphysreg, int physregtosphere, int selecteddim, std::vector centercoords, double radius); + void selectlayer(int newphysreg, int physregtoselectfrom, int physregtostartgrowth, int numlayers); + void selectexclusion(int newphysreg, int physregtoexcludefrom, std::vector physregstoexclude); + void selectanynode(int newphysreg, int physregtoselectfrom); + + + bool adapthp(int verbosity); + // Get the POSITIVE values[elementtype][elementnumber] at the target mesh (take the highest value + // if values must be merged). This and the target mesh cannot differ by more than one adaptation. + void getattarget(std::vector>& values, std::shared_ptr target); + + // For p-adaptivity: + void add(std::shared_ptr inrawfield, expression criterion, int loworder, int highorder, double critrange); + void remove(rawfield* inrawfield); + bool adaptp(std::vector>>& neworders, int verbosity); + + // For h-adaptivity: + bool adapth(std::vector>& groupkeepsplit, int verbosity); + void setadaptivity(expression criterion, int lownumsplits, int highnumsplits, double critrange); // critrange -1 for automatic choice + + // Guarantee same cell ordering between inner overlap and neighbour outer overlap: + void fixoverlapcellordering(void); + + // FOR DEBUG. The physical regions are replaced by disjoint regions + 1: + void writewithdisjointregions(std::string); + // Print the disjoint region list in every physical region: + void printphysicalregions(void); + // Print the physical region list in every disjoint region: + void printdisjointregions(void); + // Print the elements in every physical region: + void printelementsinphysicalregions(bool isdebug = false); + + // Check for disconnected lower dimension geometrical entities (e.g. disconnected faces in 3D): + void errorondisconnecteddisjointregion(void); + + std::shared_ptr gethadaptedpointer(void); + std::shared_ptr getoriginalmeshpointer(void); +}; + + +#endif + diff --git a/include/rawparameter.h b/include/rawparameter.h new file mode 100644 index 00000000..06ff1301 --- /dev/null +++ b/include/rawparameter.h @@ -0,0 +1,79 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef RAWPARAMETER_H +#define RAWPARAMETER_H + +#include +#include "operation.h" +#include "densemat.h" +#include "universe.h" +#include "elementselector.h" +#include "expression.h" + +class operation; + +class rawparameter +{ + + private: + + int mynumrows; + int mynumcols; + + // myexpressions[disjreg][i*mynumcols+j] stores the ith row, jth + // columns of the parameter expression defined on disjreg. + std::vector>> myoperations = {}; + + // Store a number associated to the operation on a given disjoint + // region. The operations on the disjoint regions on which the + // parameter has been defined with the same .set call have the same + // number because they are the same. This enables to interpolate on + // groups of disjoint regions that share the same operation number. + int maxopnum = -1; + std::vector opnums = {}; + + + int mymeshnumber = 0; + + // Track the calls to 'set'. + std::vector> mystructuretracker = {}; + + // Synchronize with the hp-adapted mesh: + void synchronize(void); + // To avoid infinite recursive calls: + bool issynchronizing = false; + + + // Give an error if the parameter is undefined on at least one disj. reg. + void errorifundefined(std::vector disjregs); + + // Get the operation numbers for the requested disjoint regions. + std::vector getopnums(std::vector disjregs); + + public: + + rawparameter(int numrows, int numcols); + + // A parameter cannot store an expression with a dof or a tf. + // It can also only store expression arrays of a same dimension. + void set(int physreg, expression input); + + std::shared_ptr get(int disjreg, int row, int col); + + int countrows(void); + int countcolumns(void); + + std::vector> interpolate(int row, int col, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + densemat multiharmonicinterpolate(int row, int col, int numtimeevals, elementselector& elemselect, std::vector& evaluationcoordinates, expression* meshdeform); + + void simplify(int row, int col, int disjreg); + + void print(void); + +}; + +#endif diff --git a/include/rawpoint.h b/include/rawpoint.h new file mode 100644 index 00000000..6ad6656c --- /dev/null +++ b/include/rawpoint.h @@ -0,0 +1,73 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// This object holds a geometrical shape. + +#ifndef RAWPOINT_H +#define RAWPOINT_H + +#include +#include +#include +#include + +#include "rawshape.h" +#include "rawextrusion.h" + +class rawpoint: public rawshape +{ + + private: + + int myphysicalregion = -1; + + int mycurvatureorder = 1; + + // Son shapes: + std::vector> sons = {}; + + // Coordinates of the nodes in the mesh: + std::vector mycoords = {}; + // Elements in the mesh: + std::vector> myelems = std::vector>(8, std::vector(0)); + + public: + + rawpoint(void) {}; + + rawpoint(int physreg, std::vector coords); + + // Provide to this constructor the coordinates of all mesh nodes and elements in the point cloud: + rawpoint(int physreg, std::vector& allcoords, std::vector>& allelems, int curvatureorder); + + std::shared_ptr extrude(int physreg, double height, int numlayers, std::vector extrudedirection); + + std::shared_ptr duplicate(void); + + void setphysicalregion(int physreg); + + int getcurvatureorder(void); + + int getdimension(void); + + std::string getname(void); + + std::vector> getsons(void); + + // Get subshapes (sons are included): + std::vector> getsubshapes(void); + void setsubshapes(std::vector> subshapes); + + // Get the mesh info of the shape: + int getphysicalregion(void); + std::vector* getcoords(void); + std::vector>* getelems(void); + + + std::shared_ptr getpointer(void); +}; + +#endif diff --git a/include/rawport.h b/include/rawport.h new file mode 100644 index 00000000..07b2b9f5 --- /dev/null +++ b/include/rawport.h @@ -0,0 +1,77 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// A rawport can either be associated to a rawfield or live its own life. + +#ifndef RAWPORT_H +#define RAWPORT_H + +#include "rawfield.h" + +class rawfield; + +class rawport : public std::enable_shared_from_this +{ + + private: + + bool amimultiharmonic = false; + + std::string myname = ""; + + std::vector >> myharmonics = {}; + + // The data below is not defined if the above vector is not empty. + + double myvalue = 0.0; + + bool myisprimal = true; + + // Dual/primal port if this is the primal/dual: + std::weak_ptr mybrother; + + // This port can be associated to a unique rawfield and physical region: + int myphysreg = -1; + std::weak_ptr myrawfield; + + public: + + rawport(void) {}; + rawport(std::vector harmonicnumbers, bool ismultiharm); + + bool ismultiharmonic(void) { return amimultiharmonic; }; + + void setvalue(double portval); + double getvalue(void); + + void setname(std::string name); + std::string getname(void); + + bool isharmonicone(void); + std::vector getharmonics(void); + std::shared_ptr harmonic(int harmonicnumber); + std::shared_ptr harmonic(std::vector harmonicnumbers); + + bool isprimal(void); + + int getphysicalregion(void); + + std::shared_ptr getrawfield(void); + + // Get the primal/dual corresponding to this port: + std::shared_ptr getprimal(void); + std::shared_ptr getdual(void); + + // Check if this rawport is associated to a rawfield: + bool isassociated(void); + + // Associate the rawport to a rawfield: + void associate(bool isprim, std::shared_ptr bro, int physreg, std::shared_ptr rf); + +}; + +#endif + diff --git a/include/rawquadrangle.h b/include/rawquadrangle.h new file mode 100644 index 00000000..4999c7fb --- /dev/null +++ b/include/rawquadrangle.h @@ -0,0 +1,79 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// This object holds a geometrical shape. + +#ifndef RAWQUADRANGLE_H +#define RAWQUADRANGLE_H + +#include +#include +#include + +#include "rawshape.h" +#include "rawpoint.h" +#include "rawline.h" +#include "rawextrusion.h" + +class rawquadrangle: public rawshape +{ + + private: + + int myphysicalregion = -1; + + int mycurvatureorder = 1; + + // Son shapes: + std::vector> sons = {}; + + // Coordinates of the nodes in the mesh: + std::vector mycoords = {}; + // Elements in the mesh: + std::vector> myelems = std::vector>(8, std::vector(0)); + + + public: + + rawquadrangle(void) {}; + + // Provide to this constructor the corner rawpoints in the quadrangle: + rawquadrangle(int physreg, std::vector> inputpoints, std::vector nummeshpoints); + + // Provide to this constructor the contour rawlines in the quadrangle: + rawquadrangle(int physreg, std::vector> inputlines); + + std::shared_ptr extrude(int physreg, double height, int numlayers, std::vector extrudedirection); + + std::shared_ptr duplicate(void); + + void setphysicalregion(int physreg); + + int getcurvatureorder(void); + + int getdimension(void); + + std::string getname(void); + + std::vector> getsons(void); + + // Get subshapes (sons are included): + std::vector> getsubshapes(void); + void setsubshapes(std::vector> subshapes); + + // Get the mesh info of the shape: + int getphysicalregion(void); + std::vector* getcoords(void); + std::vector>* getelems(void); + + + std::shared_ptr getpointer(void); + + void mesh(void); + +}; + +#endif diff --git a/include/rawshape.h b/include/rawshape.h new file mode 100644 index 00000000..d0ba2f55 --- /dev/null +++ b/include/rawshape.h @@ -0,0 +1,77 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// This object holds a geometrical shape. + +#ifndef RAWSHAPE_H +#define RAWSHAPE_H + +#include +#include +#include +#include "mesh.h" +#include "expression.h" + +class expression; + +class rawshape : public std::enable_shared_from_this +{ + + private: + + + public: + + virtual void move(expression xmove, expression ymove, expression zmove, bool recursively = true); + + virtual void shift(double shiftx, double shifty, double shiftz, bool recursively = true); + virtual void scale(double scalex, double scaley, double scalez, bool recursively = true); + virtual void rotate(double alphax, double alphay, double alphaz, bool recursively = true); + + + virtual std::shared_ptr extrude(int physreg, double height, int numlayers, std::vector extrudedirection); + + virtual std::shared_ptr duplicate(void); + + // Flip a line direction: + virtual void flip(void); + + virtual void setphysicalregion(int physreg); + + virtual int getcurvatureorder(void); + + virtual int getdimension(void); + + virtual std::string getname(void); + + virtual std::vector> getsons(void); + + // Get subshapes (sons are included): + virtual std::vector> getsubshapes(void); + // Get all subshapes recursively: + virtual std::vector> getsubshapesrecursively(void); + + virtual void setsubshapes(std::vector> subshapes); + virtual void setsubshapesrecursively(std::vector> subshapes); + + virtual int countsubshapesrecursively(void); + + // With this the pointer equalities between subshapes in the origin are replicated in this rawshape: + void replicatelinks(std::shared_ptr origin); + + // Get the mesh info of the shape: + virtual int getphysicalregion(void); + virtual std::vector* getcoords(void); + virtual std::vector>* getelems(void); + + + virtual std::shared_ptr getpointer(void); + + virtual void mesh(void); +}; + + +#endif diff --git a/include/rawspanningtree.h b/include/rawspanningtree.h new file mode 100644 index 00000000..1f6fb4e0 --- /dev/null +++ b/include/rawspanningtree.h @@ -0,0 +1,93 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef RAWSPANNINGTREE_H +#define RAWSPANNINGTREE_H + +#include +#include +#include "elements.h" +#include + +class rawspanningtree +{ + private: + + std::vector startphysregs; + + elements* myelements; + disjointregions* mydisjointregions; + + // Vector whose ith entry tells whether the edge number i is in the tree or not: + std::vector isedgeintree; + + // Number of edges that are in the tree: + int numberofedgesintree = 0; + + // True at index i if disjoint (edge) region i has priority in the tree construction: + std::vector isprioritydisjointregion; + + + // TEMPORARY CONTAINERS used during the tree construction. + int numberofsubtrees = 0; + // Entry i of this vector gives the subtree number in which edge i is: + std::vector insubtree; + // List all edges in every subtree: + std::vector> edgesinsubtree; + // This vector gives true at entry i if subtree i has been added to the tree: + std::vector issubtreeintree; + // Entry i is true if node i is in tree: + std::vector isnodeintree; + + + + // First phase of the tree creation. All (unconnected) subtrees + // are created on the priority disjoint edge regions. + // Subtrees are not allowed to share nodes or edges with each other. + void growsubtrees(void); + // Grow the subtree that has edges only on the priority edge disjoint regions and + // starting at node 'nodenumber'. Give it subtree number 'subtreenumber'. + // This can only be called if at least one edge can be added to the subtree. + void growsubtree(int nodenumber, int subtreenumber); + + // Create the final tree by connecting all subtrees together: + void connectsubtrees(void); + // Grow the tree starting at a given node. + // The subtrees must have been defined before the call. + void growtree(int nodenumber); + + void grow(void); + + + int mymeshnumber = 0; + // Synchronize with the hp-adapted mesh: + void synchronize(void); + // To avoid infinite recursive calls: + bool issynchronizing = false; + + public: + + // Create a spanning tree on the whole mesh. + // The tree is first created on the physical regions provided. + rawspanningtree(std::vector physregs); + + // Is the index th element of the disjoint region in the tree? Always false if not an edge. + bool isintree(int index, int disjreg); + + // Count edges in a disjoint edge region of the tree (return 0 if not a disjoint edge region): + int countedgesintree(int disjreg); + + // Count edges in the tree: + int countedgesintree(void); + // Get all edges in the tree (ordering does not follow tree): + std::vector getedgesintree(void); + + // Write to file to visualize the tree: + void write(std::string filename); +}; + +#endif + diff --git a/include/rawsurface.h b/include/rawsurface.h new file mode 100644 index 00000000..bbf6651a --- /dev/null +++ b/include/rawsurface.h @@ -0,0 +1,75 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// This object holds a geometrical shape. + +#ifndef RAWSURFACE_H +#define RAWSURFACE_H + +#include +#include +#include + +#include "rawshape.h" +#include "rawextrusion.h" +#include "geotools.h" + +class rawsurface: public rawshape +{ + + private: + + int myphysicalregion = -1; + + int mycurvatureorder = 1; + + // Son shapes: + std::vector> sons = {}; + + // Coordinates of the nodes in the mesh: + std::vector mycoords = {}; + // Elements in the mesh: + std::vector> myelems = std::vector>(8, std::vector(0)); + + + public: + + rawsurface(void) {}; + + // Provide to this constructor the coordinates of all mesh nodes and elements in the surface: + rawsurface(int physreg, std::vector& allcoords, std::vector>& allelems, int curvatureorder); + + std::shared_ptr extrude(int physreg, double height, int numlayers, std::vector extrudedirection); + + std::shared_ptr duplicate(void); + + void setphysicalregion(int physreg); + + int getcurvatureorder(void); + + int getdimension(void); + + std::string getname(void); + + std::vector> getsons(void); + + // Get subshapes (sons are included): + std::vector> getsubshapes(void); + void setsubshapes(std::vector> subshapes); + + // Get the mesh info of the shape: + int getphysicalregion(void); + std::vector* getcoords(void); + std::vector>* getelems(void); + + + std::shared_ptr getpointer(void); + + void mesh(void); + +}; + +#endif diff --git a/include/rawtriangle.h b/include/rawtriangle.h new file mode 100644 index 00000000..9fa944d9 --- /dev/null +++ b/include/rawtriangle.h @@ -0,0 +1,79 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// This object holds a geometrical shape. + +#ifndef RAWTRIANGLE_H +#define RAWTRIANGLE_H + +#include +#include +#include + +#include "rawshape.h" +#include "rawpoint.h" +#include "rawline.h" +#include "rawextrusion.h" + +class rawtriangle: public rawshape +{ + + private: + + int myphysicalregion = -1; + + int mycurvatureorder = 1; + + // Son shapes: + std::vector> sons = {}; + + // Coordinates of the nodes in the mesh: + std::vector mycoords = {}; + // Elements in the mesh: + std::vector> myelems = std::vector>(8, std::vector(0)); + + + public: + + rawtriangle(void) {}; + + // Provide to this constructor the corner rawpoints in the triangle: + rawtriangle(int physreg, std::vector> inputpoints, std::vector nummeshpoints); + + // Provide to this constructor the contour rawlines in the triangle: + rawtriangle(int physreg, std::vector> inputlines); + + std::shared_ptr extrude(int physreg, double height, int numlayers, std::vector extrudedirection); + + std::shared_ptr duplicate(void); + + void setphysicalregion(int physreg); + + int getcurvatureorder(void); + + int getdimension(void); + + std::string getname(void); + + std::vector> getsons(void); + + // Get subshapes (sons are included): + std::vector> getsubshapes(void); + void setsubshapes(std::vector> subshapes); + + // Get the mesh info of the shape: + int getphysicalregion(void); + std::vector* getcoords(void); + std::vector>* getelems(void); + + + std::shared_ptr getpointer(void); + + void mesh(void); + +}; + +#endif diff --git a/include/rawunion.h b/include/rawunion.h new file mode 100644 index 00000000..96695391 --- /dev/null +++ b/include/rawunion.h @@ -0,0 +1,73 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// This object holds a geometrical shape. + +#ifndef RAWUNION_H +#define RAWUNION_H + +#include +#include +#include + +#include "rawshape.h" +#include "rawextrusion.h" + +class rawunion: public rawshape +{ + + private: + + int myphysicalregion = -1; + + int mycurvatureorder = 1; + + // Shapes that have been united: + std::vector> sons = {}; + + // Coordinates of the nodes in the mesh: + std::vector mycoords = {}; + // Elements in the mesh: + std::vector> myelems = std::vector>(8, std::vector(0)); + + public: + + rawunion(void) {}; + + // Provide to this constructor the rawshapes to unite: + rawunion(int physreg, std::vector> input); + + std::shared_ptr extrude(int physreg, double height, int numlayers, std::vector extrudedirection); + + std::shared_ptr duplicate(void); + + void setphysicalregion(int physreg); + + int getcurvatureorder(void); + + int getdimension(void); + + std::string getname(void); + + std::vector> getsons(void); + + // Get subshapes: + std::vector> getsubshapes(void); + void setsubshapes(std::vector> subshapes); + + // Get the mesh info of the shape: + int getphysicalregion(void); + std::vector* getcoords(void); + std::vector>* getelems(void); + + + std::shared_ptr getpointer(void); + + void mesh(void); + +}; + +#endif diff --git a/include/rawvec.h b/include/rawvec.h new file mode 100644 index 00000000..085b12f5 --- /dev/null +++ b/include/rawvec.h @@ -0,0 +1,99 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + +// This code calls the PETSc library. See https://www.mcs.anl.gov/petsc/ for more information. + +#ifndef RAWVEC_H +#define RAWVEC_H + +#include +#include +#include "dofmanager.h" +#include "indexmat.h" +#include "densemat.h" +#include "vectorfieldselect.h" +#include "rawfield.h" +#include "memory.h" +#include "petsc.h" +#include "petscvec.h" +#include "sl.h" +#include "ptracker.h" +#include "rawmesh.h" + +class vectorfieldselect; +class dofmanager; +class rawfield; +class rawmesh; + +class rawvec : public std::enable_shared_from_this +{ + private: + + Vec myvec = PETSC_NULL; + std::shared_ptr mydofmanager = NULL; + + + std::shared_ptr myptracker = NULL; + std::vector mycurrentstructure = {}; + + // Synchronize with the hp-adapted mesh: + void synchronize(void); + // To avoid infinite recursive calls: + bool issynchronizing = false; + // Allow/forbid value syncing: + bool isvaluesynchronizingallowed = true; + + + // Mesh on which this object is based: + std::shared_ptr myrawmesh = NULL; + + public: + + rawvec(std::shared_ptr dofmngr); + rawvec(std::shared_ptr dofmngr, Vec input); + + ~rawvec(void); + + void allowvaluesynchronizing(bool allowit); + + int size(void); + + // Update the indexes that correspond to constrained values of a rawfield: + void updatedisjregconstraints(std::shared_ptr constrainedfield); + + // Negative addresses are ignored. 'op' can be 'add' or 'set'. + void setvalues(indexmat addresses, densemat valsmat, std::string op = "set"); + // Set value at a single index: + void setvalue(int address, double value, std::string op = "set"); + + densemat getvalues(indexmat addresses); + // Get value at a single index: + double getvalue(int address); + + void setvalues(std::shared_ptr selectedfield, int disjointregionnumber, int formfunctionindex, densemat vals, std::string op); + densemat getvalues(std::shared_ptr selectedfield, int disjointregionnumber, int formfunctionindex); + + void setvaluestoports(void); + void setvaluesfromports(void); + + // Write and load raw vec data: + void write(std::string filename); + void load(std::string filename); + + void print(void); + + std::shared_ptr getdofmanager(void); + Vec getpetsc(void); + + std::shared_ptr getpointer(void); + std::shared_ptr getrawmesh(void); + std::shared_ptr getptracker(void); + + // Transfer data between the 'inputvec' vector and this vector: + void setdata(std::shared_ptr inputvec, int disjreg, std::shared_ptr inputfield); + +}; + +#endif diff --git a/include/rawvolume.h b/include/rawvolume.h new file mode 100644 index 00000000..a025f0ae --- /dev/null +++ b/include/rawvolume.h @@ -0,0 +1,72 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// This object holds a geometrical shape. + +#ifndef RAWVOLUME_H +#define RAWVOLUME_H + +#include +#include +#include + +#include "rawshape.h" +#include "geotools.h" + +class rawvolume: public rawshape +{ + + private: + + int myphysicalregion = -1; + + int mycurvatureorder = 1; + + // Son shapes: + std::vector> sons = {}; + + // Coordinates of the nodes in the mesh: + std::vector mycoords = {}; + // Elements in the mesh: + std::vector> myelems = std::vector>(8, std::vector(0)); + + + public: + + rawvolume(void) {}; + + // Provide to this constructor the coordinates of all mesh nodes and elements in the volume: + rawvolume(int physreg, std::vector& allcoords, std::vector>& allelems, int curvatureorder); + + std::shared_ptr duplicate(void); + + void setphysicalregion(int physreg); + + int getcurvatureorder(void); + + int getdimension(void); + + std::string getname(void); + + std::vector> getsons(void); + + // Get subshapes (sons are included): + std::vector> getsubshapes(void); + void setsubshapes(std::vector> subshapes); + + // Get the mesh info of the shape: + int getphysicalregion(void); + std::vector* getcoords(void); + std::vector>* getelems(void); + + + std::shared_ptr getpointer(void); + + void mesh(void); + +}; + +#endif diff --git a/include/referencecoordinategroup.h b/include/referencecoordinategroup.h new file mode 100644 index 00000000..125a570e --- /dev/null +++ b/include/referencecoordinategroup.h @@ -0,0 +1,61 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef REFERENCECOORDINATEGROUP_H +#define REFERENCECOORDINATEGROUP_H + +#include +#include +#include "gentools.h" +#include "coordinategroup.h" + +class referencecoordinategroup +{ + + private: + + double noisethreshold = 1e-10; + + coordinategroup mycoordgroup; + std::vector myinputelems = {}; + std::vector myinputrefcoords = {}; + + // One entry per number of reference coordinates in an element: + std::vector> myelems = {}; + std::vector> mycoordnums = {}; + std::vector> mykietaphis = {}; + + + // Current position status: + int myrangebegin = 0, mynumrefcoords = 0; + + std::vector mycurrefcoords = {}; + std::vector mycurcoordnums = {}; + std::vector mycurelems = {}; + + public: + + referencecoordinategroup(void) {}; + referencecoordinategroup(std::vector& coords); + // Provide in 'elems' the element types and numbers {type0,elemnum0,type1,...}: + referencecoordinategroup(std::vector& elems, std::vector& refcoords); + + // All disjoint regions should hold the same element type number: + void evalat(std::vector inputdisjregs); + void evalat(int elemtypenum); + + void evalat(std::vector& elems, std::vector& kietaphis, std::vector& coordnums); + + bool next(void); + + std::vector getreferencecoordinates(void) { return mycurrefcoords; }; + std::vector getcoordinatenumber(void) { return mycurcoordnums; }; + std::vector getelements(void) { return mycurelems; }; + +}; + +#endif + diff --git a/include/regiondefiner.h b/include/regiondefiner.h new file mode 100644 index 00000000..45967f9b --- /dev/null +++ b/include/regiondefiner.h @@ -0,0 +1,118 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef REGIONDEFINER_H +#define REGIONDEFINER_H + +#include +#include +#include "element.h" +#include "elements.h" +#include "nodes.h" +#include "physicalregions.h" + +class regiondefiner +{ + private: + + double noisethreshold = -1; + + nodes* mynodes; + elements* myelements; + physicalregions* myphysicalregions; + + // mypriority[i] gives {operationtype,operationindex} for operation of priority i. + std::vector> mypriority = {}; + + + // SKIN (operation type 0) + // + // List of new skin physical regions: + std::vector skins = {}; + // List of physical regions for which the skin is requested: + std::vector toskin = {}; + + // BOX SELECTION (operation type 1) + // + // List of new box-selected physical regions: + std::vector boxed = {}; + // List of physical regions for which the box selection is requested: + std::vector tobox = {}; + // List of element dimensions to select: + std::vector boxelemdims = {}; + // List of the x, y and z box limits {x1,x2,y1,y2,z1,z2}: + std::vector> boxlimits = {}; + + // SPHERE SELECTION (operation type 2) + // + // List of new sphere-selected physical regions: + std::vector sphered = {}; + // List of physical regions for which the sphere selection is requested: + std::vector tosphere = {}; + // List of element dimensions to select: + std::vector sphereelemdims = {}; + // List of the x, y and z sphere centers {xc,yc,zc}: + std::vector> spherecenters = {}; + // List of the sphere radii: + std::vector sphereradii = {}; + + // EXCLUSION (operation type 3) + // + // List of new exclusion physical regions: + std::vector excluded = {}; + // List of physical regions from which an exclusion is requested: + std::vector toexcludefrom = {}; + // List of physical regions to exclude: + std::vector> toexclude = {}; + + // LAYER SELECTION (operation type 4) + // + // List of new layer-selected physical regions: + std::vector layered = {}; + // List of physical regions from which the layer selection is requested: + std::vector tolayer = {}; + // List of physical regions where the layer selection growth starts: + std::vector growthstart = {}; + // List of number of layers to select: + std::vector numlayers = {}; + + // ANY NODE SELECTION (operation type 5) + // + // List of new node regions: + std::vector anynoded = {}; + // List of physical regions from which any node is requested: + std::vector toanynode = {}; + + + void defineskinregion(int regnum); + void defineboxregion(int regnum); + void definesphereregion(int regnum); + void defineexclusionregion(int regnum); + void definelayerregion(int regnum); + void defineanynoderegion(int regnum); + + public: + + regiondefiner(void) {}; + regiondefiner(nodes& inputnodes, elements& inputelems, physicalregions& inputphysregs); + + void regionskin(int newphysreg, int physregtoskin); + void regionbox(int newphysreg, int selecteddim, std::vector boxlimit, int physregtobox); + void regionsphere(int newphysreg, int selecteddim, std::vector centercoords, double radius, int physregtosphere); + void regionexclusion(int newphysreg, int physregtoexcludefrom, std::vector physregstoexclude); + void regionlayer(int newphysreg, int physregtoselectfrom, int physregtostartgrowth, int nl); + void regionanynode(int newphysreg, int physregtoselectfrom); + + bool isanyregiondefined(void); + bool isanycoordinatedependentregiondefined(void); + + void defineregions(void); + + // Make a full copy of this object (linking objects used are the arguments): + regiondefiner copy(nodes* nds, elements* els, physicalregions* prs); +}; + +#endif diff --git a/src/resolution/resolution.h b/include/resolution.h similarity index 100% rename from src/resolution/resolution.h rename to include/resolution.h diff --git a/include/resolution/eigenvalue.h b/include/resolution/eigenvalue.h new file mode 100644 index 00000000..c1a429fb --- /dev/null +++ b/include/resolution/eigenvalue.h @@ -0,0 +1,68 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . +// +// Thanks to R. Haouari for the damped eigenvalue calculation code. + +// This object uses the SLEPc library to get the eigenvalues and eigenvectors. +// More information on SLEPc can be found at http://slepc.upv.es + +#ifndef EIGENVALUE_H +#define EIGENVALUE_H + +#include +#include +#include +#include "vec.h" +#include "mat.h" +#include "rawvec.h" +#include "memory" + +class eigenvalue +{ + private: + + mat myA; + mat myB; + std::vector mymats = {}; + + // Real and imaginary part of the eigenvalues and eigenvectors: + std::vector eigenvaluereal = {}; + std::vector eigenvalueimaginary = {}; + + std::vector eigenvectorreal = {}; + std::vector eigenvectorimaginary = {}; + + public: + + // Define a standard eigenvalue problem A*x = lambda*x: + eigenvalue(mat A); + // Define a generalized eigenvalue problem A*x = lambda*B*x: + eigenvalue(mat A, mat B); + + // Define an eigenvalue problem of the form (M*lambda^2 + C*lambda + K)*u = 0: + eigenvalue(mat K, mat C, mat M); + // Define a general polynomial eigenvalue problem of the form + // inmats[0] + inmats[1]*lambda + inmats[2]*lambda^2 + ... + eigenvalue(std::vector inmats); + + void compute(int numeigenvaluestocompute, double targeteigenvaluemagnitude = 0.0); + + // Get the number of eigs found: + int count(void); + + std::vector geteigenvaluerealpart(void); + std::vector geteigenvalueimaginarypart(void); + + std::vector geteigenvectorrealpart(void); + std::vector geteigenvectorimaginarypart(void); + + // Print the eigenvalues: + void printeigenvalues(void); + + void printeigenfrequencies(void); + +}; + +#endif diff --git a/include/resolution/genalpha.h b/include/resolution/genalpha.h new file mode 100644 index 00000000..9ef78d38 --- /dev/null +++ b/include/resolution/genalpha.h @@ -0,0 +1,116 @@ +// sparselizard - Copyright (C) see copyright file. +// +// Contributions kindly provided by R. Haouari. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + +// This object implements the generalized alpha method to solve in time the problem +// +// M*dtdtx + C*dtx + K*x = b +// +// be it linear or nonlinear. + +#ifndef GENALPHA_H +#define GENALPHA_H + +#include +#include +#include "vec.h" +#include "universe.h" +#include "sl.h" +#include "formulation.h" + +class genalpha +{ + private: + + int myverbosity = 1; + + formulation myformulation; + + // The four parameters for generalized alpha (set to unconditionally stable Newmark by default): + double beta = 0.25, gamma = 0.5, alphaf = 0.0, alpham = 0.0; + + // The convergence tolerance for the fixed-point nonlinear iteration: + double nltol = 1e-3; + + // The relaxation factor for the nonlinear iteration: + double relaxationfactor = 1.0; + + // Set 'isconstant[i]' to true and the corresponding matrix/vector is + // supposed constant in time and will only be generated once then reused. + // + // - i = 0 corresponds to the rhs vector + // - i = 1 corresponds to the K matrix + // - i = 2 corresponds to the C matrix + // - i = 3 corresponds to the M matrix + // + // Note: even if the rhs vector can be reused the Dirichlet + // constraints will nevertheless be recomputed at each time step. + // + std::vector isconstant = {false, false, false, false}; + + // Formulations to solve before/after 'myformulation' is solved: + std::vector tosolvebefore = {}; + std::vector tosolveafter = {}; + + // Current timestep: + double dt = -1; + // All time values stepped-through: + std::vector mytimes = {}; + + // Time-adaptivity settings: + double mindt = -1, maxdt = -1, tatol = -1, rfact = -1, cfact = -1, cthres = -1; + + // The speed v and acceleration a at the current time step: + vec v, a; + + // Objects required at every timestep (possibly reused): + vec rhs; mat K, C, M, leftmat; + // Parameters for which these objects are defined: + double defbeta = -1, defgamma = -1, defalphaf = -1, defalpham = -1, defdt = -1; + + int run(bool islinear, double timestep, int maxnumnlit); + + public: + + genalpha(formulation formul, vec initspeed, vec initacceleration, int verbosity = 3, std::vector isrhskcmconstant = {false, false, false, false}); + + void setverbosity(int verbosity) { myverbosity = verbosity; }; + + // Manually specify all four parameters: + void setparameter(double b, double g, double af, double am) { beta = b; gamma = g; alphaf = af; alpham = am; }; + // Specify a high-frequency dissipation and let the four parameters be optimally deduced: + void setparameter(double rinf); + + // Set the tolerance for the inner nonlinear fixed-point iteration: + void settolerance(double tol) { nltol = tol; }; + + // Set the relaxation factor for the inner nonlinear fixed-point iteration: + void setrelaxationfactor(double relaxfact) { relaxationfactor = relaxfact; }; + + std::vector gettimederivative(void) { return {v, a}; }; + void settimederivative(std::vector sol); + + void settimestep(double timestep) { dt = timestep; }; + double gettimestep(void) { return dt; }; + + // Count the number of timesteps computed: + int count(void) { return mytimes.size(); }; + std::vector gettimes(void) { return mytimes; }; + + // Set the time-adaptivity settings: + void setadaptivity(double tol, double mints, double maxts, double reffact = 0.5, double coarfact = 2.0, double coarthres = 0.5); + + // Define a list of formulations to solve at the beginning/end of the nonlinear loop: + void presolve(std::vector formuls); + void postsolve(std::vector formuls); + + // Advance the solution by the provided timestep for a linear/nonlinear problem. + void next(double timestep); + int next(double timestep, int maxnumnlit); + +}; + +#endif diff --git a/include/resolution/impliciteuler.h b/include/resolution/impliciteuler.h new file mode 100644 index 00000000..ca350422 --- /dev/null +++ b/include/resolution/impliciteuler.h @@ -0,0 +1,105 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + +// This object implements the implicit Euler (also called backward Euler) method to solve in time the problem +// +// C*dtx + K*x = b +// +// be it linear or nonlinear. + +#ifndef IMPLICITEULER_H +#define IMPLICITEULER_H + +#include +#include +#include "vec.h" +#include "universe.h" +#include "sl.h" +#include "formulation.h" + +class impliciteuler +{ + private: + + int myverbosity = 1; + + formulation myformulation; + + // The convergence tolerance for the fixed-point nonlinear iteration: + double nltol = 1e-3; + + // The relaxation factor for the nonlinear iteration: + double relaxationfactor = 1.0; + + // Set 'isconstant[i]' to true and the corresponding matrix/vector is + // supposed constant in time and will only be generated once then reused. + // + // - i = 0 corresponds to the rhs vector + // - i = 1 corresponds to the K matrix + // - i = 2 corresponds to the C matrix + // + // Note: even if the rhs vector can be reused the Dirichlet + // constraints will nevertheless be recomputed at each time step. + // + std::vector isconstant = {false, false, false}; + + // Formulations to solve before/after 'myformulation' is solved: + std::vector tosolvebefore = {}; + std::vector tosolveafter = {}; + + // Current timestep: + double dt = -1; + // All time values stepped-through: + std::vector mytimes = {}; + + // Time-adaptivity settings: + double mindt = -1, maxdt = -1, tatol = -1, rfact = -1, cfact = -1, cthres = -1; + + // Vector dt(x) at the current time step: + vec dtx; + + // Objects required at every timestep (possibly reused): + vec rhs; mat K, C, leftmat; + // Parameters for which these objects are defined: + double defdt = -1; + + int run(bool islinear, double timestep, int maxnumnlit); + + public: + + impliciteuler(formulation formul, vec dtxinit, int verbosity = 3, std::vector isrhskcconstant = {false, false, false}); + + void setverbosity(int verbosity) { myverbosity = verbosity; }; + + // Set the tolerance for the inner nonlinear fixed-point iteration: + void settolerance(double tol) { nltol = tol; }; + + // Set the relaxation factor for the inner nonlinear fixed-point iteration: + void setrelaxationfactor(double relaxfact) { relaxationfactor = relaxfact; }; + + vec gettimederivative(void) { return dtx; }; + void settimederivative(vec sol); + + void settimestep(double timestep) { dt = timestep; }; + double gettimestep(void) { return dt; }; + + // Count the number of timesteps computed: + int count(void) { return mytimes.size(); }; + std::vector gettimes(void) { return mytimes; }; + + // Set the time-adaptivity settings: + void setadaptivity(double tol, double mints, double maxts, double reffact = 0.5, double coarfact = 2.0, double coarthres = 0.5); + + // Define a list of formulations to solve at the beginning/end of the nonlinear loop: + void presolve(std::vector formuls); + void postsolve(std::vector formuls); + + // Advance the solution by the provided timestep for a linear/nonlinear problem. + void next(double timestep); + int next(double timestep, int maxnumnlit); + +}; + +#endif diff --git a/include/resolution/resolution.h b/include/resolution/resolution.h new file mode 100644 index 00000000..664f7ae5 --- /dev/null +++ b/include/resolution/resolution.h @@ -0,0 +1,21 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + +#ifndef RESOLUTION_H +#define RESOLUTION_H + +#include "eigenvalue.h" +#include "genalpha.h" +#include "impliciteuler.h" + +class resolution +{ + private: + + public: + +}; + +#endif diff --git a/include/selector.h b/include/selector.h new file mode 100644 index 00000000..a6b4d879 --- /dev/null +++ b/include/selector.h @@ -0,0 +1,41 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef SELECTOR_H +#define SELECTOR_H + +#include +#include +#include + +#include "h1point.h" +#include "h1line.h" +#include "h1triangle.h" +#include "h1quadrangle.h" +#include "h1tetrahedron.h" +#include "h1hexahedron.h" +#include "h1prism.h" +#include "h1pyramid.h" + +#include "hcurlpoint.h" +#include "hcurlline.h" +#include "hcurltriangle.h" +#include "hcurlquadrangle.h" +#include "hcurltetrahedron.h" +#include "hcurlhexahedron.h" +#include "hcurlprism.h" +#include "hcurlpyramid.h" + +#include "oneconstant.h" + + +namespace selector +{ + // Get a pointer to the selected form function: + std::shared_ptr select(int elementtypenumber, std::string formfunctiontypename); +}; + +#endif diff --git a/include/shape.h b/include/shape.h new file mode 100644 index 00000000..15dce4ef --- /dev/null +++ b/include/shape.h @@ -0,0 +1,100 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// This object is a wrapper of the actual shape object 'rawshape' pointed +// by 'rawshapeptr' and to which most of the functions are redirected. +// The purpose of this object is to wrap the 'rawshape' object for a +// convenient user experience. +// An additional advantage is that the std::shared_ptr type pointer ensures +// the pointed 'rawshape' object is always available when there is +// at least one shape using it. + + +#ifndef SHAPE_H +#define SHAPE_H + +#include +#include +#include +#include +#include "expression.h" +#include "rawshape.h" + +class expression; +class rawshape; + +class shape +{ + + private: + + std::shared_ptr rawshapeptr = NULL; + + // Give an error on a NULL rawshape pointer: + void errornullpointer(void); + + public: + + shape(void); + // Define a shape based on a rawshape pointer: + shape(std::shared_ptr inputptr); + + // Constructor with the coordinates of all nodes in the shape provided as input (for points and lines only): + shape(std::string shapename, int physreg, std::vector coords); + + // Constructor based on the coordinates of the corner nodes in the shape: + shape(std::string shapename, int physreg, std::vector coords, int nummeshpts); + shape(std::string shapename, int physreg, std::vector coords, std::vector nummeshpts); + + // Constructor based on sub-shapes (not for point shapes): + shape(std::string shapename, int physreg, std::vector subshapes, int nummeshpts); + shape(std::string shapename, int physreg, std::vector subshapes, std::vector nummeshpts); + shape(std::string shapename, int physreg, std::vector subshapes); + + // Define a disk: + shape(std::string shapename, int physreg, std::vector centercoords, double radius, int nummeshpts); + shape(std::string shapename, int physreg, shape centerpoint, double radius, int nummeshpts); + + + void setphysicalregion(int physreg); + + int getcurvatureorder(void); + + // Move the shape in the x, y and z direction by a value given in the expression. + // Only the x, y and z coordinate field are allowed in the expression. + void move(expression u); + + // Shift the shape in the x, y and z direction. + void shift(double shiftx, double shifty, double shiftz); + // Scale the shape in the x, y and z direction. + void scale(double scalex, double scaley, double scalez); + // Rotate the mesh by alphax, alphay and alphaz degrees around the x, y and z axis respectively: + void rotate(double alphax, double alphay, double alphaz); + + shape extrude(int physreg, double height, int numlayers, std::vector extrudedirection = {0,0,1}); + std::vector extrude(std::vector physreg, std::vector height, std::vector numlayers, std::vector extrudedirection = {0,0,1}); + + // Duplicate the shape and all subshapes. + shape duplicate(void); + + // Return the dimension of the shape (0D, 1D, 2D or 3D): + int getdimension(void); + + // Return the coordinates of the shape mesh nodes: + std::vector getcoords(void); + + std::string getname(void); + + std::vector getsons(void); + + int getphysicalregion(void); + + std::shared_ptr getpointer(void); +}; + + + +#endif diff --git a/include/shapefunction/hierarchical/h1/h1hexahedron.h b/include/shapefunction/hierarchical/h1/h1hexahedron.h new file mode 100644 index 00000000..ce4712d5 --- /dev/null +++ b/include/shapefunction/hierarchical/h1/h1hexahedron.h @@ -0,0 +1,47 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// The following form functions have been derived in the PhD thesis +// "High Order Finite Element Methods for Electromagnetic Field Computation" +// of Dr. Sabine Zaglmayr at JOHANNES KEPLER UNIVERSITAET LINZ, AUSTRIA + +#ifndef H1HEXAHEDRON_H +#define H1HEXAHEDRON_H + +#include "hierarchicalformfunction.h" + +class h1hexahedron: public hierarchicalformfunction +{ + private: + + int targetdim = -1; + + public: + + h1hexahedron(int td) { targetdim = td; }; // -1 for h1 + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 1; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); + + // If 'isorientationdependent' is false then the assembly can + // be carried out without taking care of the element orientation. + // This provides an assembly speedup. + bool isorientationdependent(int order) { return (targetdim == -1 && order > 2); }; +}; + +#endif diff --git a/include/shapefunction/hierarchical/h1/h1line.h b/include/shapefunction/hierarchical/h1/h1line.h new file mode 100644 index 00000000..675bc267 --- /dev/null +++ b/include/shapefunction/hierarchical/h1/h1line.h @@ -0,0 +1,47 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// The following form functions have been derived in the PhD thesis +// "High Order Finite Element Methods for Electromagnetic Field Computation" +// of Dr. Sabine Zaglmayr at JOHANNES KEPLER UNIVERSITAET LINZ, AUSTRIA + +#ifndef H1LINE_H +#define H1LINE_H + +#include "hierarchicalformfunction.h" + +class h1line: public hierarchicalformfunction +{ + private: + + int targetdim = -1; + + public: + + h1line(int td) { targetdim = td; }; // -1 for h1 + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 1; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); + + // If 'isorientationdependent' is false then the assembly can + // be carried out without taking care of the element orientation. + // This provides an assembly speedup. + bool isorientationdependent(int order) { return (targetdim == -1 && order > 2); }; +}; + +#endif diff --git a/include/shapefunction/hierarchical/h1/h1point.h b/include/shapefunction/hierarchical/h1/h1point.h new file mode 100644 index 00000000..5e7743d7 --- /dev/null +++ b/include/shapefunction/hierarchical/h1/h1point.h @@ -0,0 +1,43 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef H1POINT_H +#define H1POINT_H + +#include "hierarchicalformfunction.h" + +class h1point: public hierarchicalformfunction +{ + private: + + int targetdim = -1; + + public: + + h1point(int td) { targetdim = td; }; // -1 for h1 + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 1; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); + + // If 'isorientationdependent' is false then the assembly can + // be carried out without taking care of the element orientation. + // This provides an assembly speedup. + bool isorientationdependent(int order) { return false; }; +}; + +#endif diff --git a/include/shapefunction/hierarchical/h1/h1prism.h b/include/shapefunction/hierarchical/h1/h1prism.h new file mode 100644 index 00000000..d62954bd --- /dev/null +++ b/include/shapefunction/hierarchical/h1/h1prism.h @@ -0,0 +1,47 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// The following form functions have been derived in the PhD thesis +// "High Order Finite Element Methods for Electromagnetic Field Computation" +// of Dr. Sabine Zaglmayr at JOHANNES KEPLER UNIVERSITAET LINZ, AUSTRIA + +#ifndef H1PRISM_H +#define H1PRISM_H + +#include "hierarchicalformfunction.h" + +class h1prism: public hierarchicalformfunction +{ + private: + + int targetdim = -1; + + public: + + h1prism(int td) { targetdim = td; }; // -1 for h1 + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 1; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); + + // If 'isorientationdependent' is false then the assembly can + // be carried out without taking care of the element orientation. + // This provides an assembly speedup. + bool isorientationdependent(int order) { return (targetdim == -1 && order > 2); }; +}; + +#endif diff --git a/include/shapefunction/hierarchical/h1/h1pyramid.h b/include/shapefunction/hierarchical/h1/h1pyramid.h new file mode 100644 index 00000000..ec493cc3 --- /dev/null +++ b/include/shapefunction/hierarchical/h1/h1pyramid.h @@ -0,0 +1,38 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef H1PYRAMID_H +#define H1PYRAMID_H + +#include "hierarchicalformfunction.h" + +class h1pyramid: public hierarchicalformfunction +{ + private: + + int targetdim = -1; + + public: + + h1pyramid(int td) { targetdim = td; }; // -1 for h1 + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 1; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); +}; + +#endif diff --git a/include/shapefunction/hierarchical/h1/h1quadrangle.h b/include/shapefunction/hierarchical/h1/h1quadrangle.h new file mode 100644 index 00000000..56a2fe00 --- /dev/null +++ b/include/shapefunction/hierarchical/h1/h1quadrangle.h @@ -0,0 +1,47 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// The following form functions have been derived in the PhD thesis +// "High Order Finite Element Methods for Electromagnetic Field Computation" +// of Dr. Sabine Zaglmayr at JOHANNES KEPLER UNIVERSITAET LINZ, AUSTRIA + +#ifndef H1QUADRANGLE_H +#define H1QUADRANGLE_H + +#include "hierarchicalformfunction.h" + +class h1quadrangle: public hierarchicalformfunction +{ + private: + + int targetdim = -1; + + public: + + h1quadrangle(int td) { targetdim = td; }; // -1 for h1 + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 1; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); + + // If 'isorientationdependent' is false then the assembly can + // be carried out without taking care of the element orientation. + // This provides an assembly speedup. + bool isorientationdependent(int order) { return (targetdim == -1 && order > 2); }; +}; + +#endif diff --git a/include/shapefunction/hierarchical/h1/h1tetrahedron.h b/include/shapefunction/hierarchical/h1/h1tetrahedron.h new file mode 100644 index 00000000..1e996783 --- /dev/null +++ b/include/shapefunction/hierarchical/h1/h1tetrahedron.h @@ -0,0 +1,47 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// The following form functions have been derived in the PhD thesis +// "High Order Finite Element Methods for Electromagnetic Field Computation" +// of Dr. Sabine Zaglmayr at JOHANNES KEPLER UNIVERSITAET LINZ, AUSTRIA + +#ifndef H1TETRAHEDRON_H +#define H1TETRAHEDRON_H + +#include "hierarchicalformfunction.h" + +class h1tetrahedron: public hierarchicalformfunction +{ + private: + + int targetdim = -1; + + public: + + h1tetrahedron(int td) { targetdim = td; }; // -1 for h1 + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 1; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); + + // If 'isorientationdependent' is false then the assembly can + // be carried out without taking care of the element orientation. + // This provides an assembly speedup. + bool isorientationdependent(int order) { return (targetdim == -1 && order > 2); }; +}; + +#endif diff --git a/include/shapefunction/hierarchical/h1/h1triangle.h b/include/shapefunction/hierarchical/h1/h1triangle.h new file mode 100644 index 00000000..91ace8e8 --- /dev/null +++ b/include/shapefunction/hierarchical/h1/h1triangle.h @@ -0,0 +1,47 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// The following form functions have been derived in the PhD thesis +// "High Order Finite Element Methods for Electromagnetic Field Computation" +// of Dr. Sabine Zaglmayr at JOHANNES KEPLER UNIVERSITAET LINZ, AUSTRIA + +#ifndef H1TRIANGLE_H +#define H1TRIANGLE_H + +#include "hierarchicalformfunction.h" + +class h1triangle: public hierarchicalformfunction +{ + private: + + int targetdim = -1; + + public: + + h1triangle(int td) { targetdim = td; }; // -1 for h1 + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 1; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); + + // If 'isorientationdependent' is false then the assembly can + // be carried out without taking care of the element orientation. + // This provides an assembly speedup. + bool isorientationdependent(int order) { return (targetdim == -1 && order > 2); }; +}; + +#endif diff --git a/include/shapefunction/hierarchical/hcurl/hcurlhexahedron.h b/include/shapefunction/hierarchical/hcurl/hcurlhexahedron.h new file mode 100644 index 00000000..39a55496 --- /dev/null +++ b/include/shapefunction/hierarchical/hcurl/hcurlhexahedron.h @@ -0,0 +1,42 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// The following form functions have been derived in the PhD thesis +// "High Order Finite Element Methods for Electromagnetic Field Computation" +// of Dr. Sabine Zaglmayr at JOHANNES KEPLER UNIVERSITAET LINZ, AUSTRIA + +#ifndef HCURLHEXAHEDRON_H +#define HCURLHEXAHEDRON_H + +#include "hierarchicalformfunction.h" + +class hcurlhexahedron: public hierarchicalformfunction +{ + private: + + public: + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 3; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); + + // Return a vector whose index i is true if the ith form function + // associated to highest dimension elements is of gradient type. + std::vector isgradienttype(int order); +}; + +#endif diff --git a/include/shapefunction/hierarchical/hcurl/hcurlline.h b/include/shapefunction/hierarchical/hcurl/hcurlline.h new file mode 100644 index 00000000..7e3cd904 --- /dev/null +++ b/include/shapefunction/hierarchical/hcurl/hcurlline.h @@ -0,0 +1,42 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// The following form functions have been derived in the PhD thesis +// "High Order Finite Element Methods for Electromagnetic Field Computation" +// of Dr. Sabine Zaglmayr at JOHANNES KEPLER UNIVERSITAET LINZ, AUSTRIA + +#ifndef HCURLLINE_H +#define HCURLLINE_H + +#include "hierarchicalformfunction.h" + +class hcurlline: public hierarchicalformfunction +{ + private: + + public: + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 3; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); + + // Return a vector whose index i is true if the ith form function + // associated to highest dimension elements is of gradient type. + std::vector isgradienttype(int order); +}; + +#endif diff --git a/include/shapefunction/hierarchical/hcurl/hcurlpoint.h b/include/shapefunction/hierarchical/hcurl/hcurlpoint.h new file mode 100644 index 00000000..2226d9de --- /dev/null +++ b/include/shapefunction/hierarchical/hcurl/hcurlpoint.h @@ -0,0 +1,34 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef HCURLPOINT_H +#define HCURLPOINT_H + +#include "hierarchicalformfunction.h" + +class hcurlpoint: public hierarchicalformfunction +{ + private: + + public: + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 3; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); +}; + +#endif diff --git a/include/shapefunction/hierarchical/hcurl/hcurlprism.h b/include/shapefunction/hierarchical/hcurl/hcurlprism.h new file mode 100644 index 00000000..7203e961 --- /dev/null +++ b/include/shapefunction/hierarchical/hcurl/hcurlprism.h @@ -0,0 +1,42 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// The following form functions have been derived in the PhD thesis +// "High Order Finite Element Methods for Electromagnetic Field Computation" +// of Dr. Sabine Zaglmayr at JOHANNES KEPLER UNIVERSITAET LINZ, AUSTRIA + +#ifndef HCURLPRISM_H +#define HCURLPRISM_H + +#include "hierarchicalformfunction.h" + +class hcurlprism: public hierarchicalformfunction +{ + private: + + public: + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 3; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); + + // Return a vector whose index i is true if the ith form function + // associated to highest dimension elements is of gradient type. + std::vector isgradienttype(int order); +}; + +#endif diff --git a/include/shapefunction/hierarchical/hcurl/hcurlpyramid.h b/include/shapefunction/hierarchical/hcurl/hcurlpyramid.h new file mode 100644 index 00000000..baa0f5be --- /dev/null +++ b/include/shapefunction/hierarchical/hcurl/hcurlpyramid.h @@ -0,0 +1,34 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef HCURLPYRAMID_H +#define HCURLPYRAMID_H + +#include "hierarchicalformfunction.h" + +class hcurlpyramid: public hierarchicalformfunction +{ + private: + + public: + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 3; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); +}; + +#endif diff --git a/include/shapefunction/hierarchical/hcurl/hcurlquadrangle.h b/include/shapefunction/hierarchical/hcurl/hcurlquadrangle.h new file mode 100644 index 00000000..0e5980cd --- /dev/null +++ b/include/shapefunction/hierarchical/hcurl/hcurlquadrangle.h @@ -0,0 +1,42 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// The following form functions have been derived in the PhD thesis +// "High Order Finite Element Methods for Electromagnetic Field Computation" +// of Dr. Sabine Zaglmayr at JOHANNES KEPLER UNIVERSITAET LINZ, AUSTRIA + +#ifndef HCURLQUADRANGLE_H +#define HCURLQUADRANGLE_H + +#include "hierarchicalformfunction.h" + +class hcurlquadrangle: public hierarchicalformfunction +{ + private: + + public: + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 3; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); + + // Return a vector whose index i is true if the ith form function + // associated to highest dimension elements is of gradient type. + std::vector isgradienttype(int order); +}; + +#endif diff --git a/include/shapefunction/hierarchical/hcurl/hcurltetrahedron.h b/include/shapefunction/hierarchical/hcurl/hcurltetrahedron.h new file mode 100644 index 00000000..840877ac --- /dev/null +++ b/include/shapefunction/hierarchical/hcurl/hcurltetrahedron.h @@ -0,0 +1,42 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// The following form functions have been derived in the PhD thesis +// "High Order Finite Element Methods for Electromagnetic Field Computation" +// of Dr. Sabine Zaglmayr at JOHANNES KEPLER UNIVERSITAET LINZ, AUSTRIA + +#ifndef HCURLTETRAHEDRON_H +#define HCURLTETRAHEDRON_H + +#include "hierarchicalformfunction.h" + +class hcurltetrahedron: public hierarchicalformfunction +{ + private: + + public: + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 3; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); + + // Return a vector whose index i is true if the ith form function + // associated to highest dimension elements is of gradient type. + std::vector isgradienttype(int order); +}; + +#endif diff --git a/include/shapefunction/hierarchical/hcurl/hcurltriangle.h b/include/shapefunction/hierarchical/hcurl/hcurltriangle.h new file mode 100644 index 00000000..c660714c --- /dev/null +++ b/include/shapefunction/hierarchical/hcurl/hcurltriangle.h @@ -0,0 +1,42 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// The following form functions have been derived in the PhD thesis +// "High Order Finite Element Methods for Electromagnetic Field Computation" +// of Dr. Sabine Zaglmayr at JOHANNES KEPLER UNIVERSITAET LINZ, AUSTRIA + +#ifndef HCURLTRIANGLE_H +#define HCURLTRIANGLE_H + +#include "hierarchicalformfunction.h" + +class hcurltriangle: public hierarchicalformfunction +{ + private: + + public: + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 3; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); + + // Return a vector whose index i is true if the ith form function + // associated to highest dimension elements is of gradient type. + std::vector isgradienttype(int order); +}; + +#endif diff --git a/include/shapefunction/hierarchical/hierarchicalformfunction.h b/include/shapefunction/hierarchical/hierarchicalformfunction.h new file mode 100644 index 00000000..ec02a190 --- /dev/null +++ b/include/shapefunction/hierarchical/hierarchicalformfunction.h @@ -0,0 +1,61 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef HIERARCHICALFORMFUNCTION_H +#define HIERARCHICALFORMFUNCTION_H + +#include "math.h" +#include +#include "orientation.h" +#include "element.h" +#include "legendre.h" +#include "polynomial.h" +#include +#include +#include "hierarchicalformfunctioncontainer.h" + +class hierarchicalformfunction +{ + private: + + // List all form function type names (type numbers are defined by the name ordering): + std::vector mytypenames = {"h1","hcurl","one0","one1","one2","one3","h1d0","h1d1","h1d2","h1d3"}; + + public: + + // Translate a form function type number to a type name and vice versa: + int gettypenumber(std::string fftypename); + std::string gettypename(int fftypenumber); + + // Get the minimum order allowed: + int getminorder(std::string fftypename); + + // Get the number of form functions of order <= 'order': + virtual int count(int order) { abort(); }; // fix return warning + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + virtual int count(int order, int dim, int num) { abort(); }; // fix return warning + + // Get the number of components in the form function. + virtual int countcomponents(void) { abort(); }; // fix return warning + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + virtual hierarchicalformfunctioncontainer evalat(int maxorder) { abort(); }; // fix return warning + + // If 'isorientationdependent' is false then the assembly can + // be carried out without taking care of the element orientation. + // This provides an assembly speedup. By default it is not used. + virtual bool isorientationdependent(int order) { return true; }; + + // Return a vector whose index i is true if the ith form function + // associated to highest dimension elements is of gradient type. + virtual std::vector isgradienttype(int order) { return std::vector(0); }; +}; + +#endif diff --git a/include/shapefunction/hierarchical/hierarchicalformfunctioncontainer.h b/include/shapefunction/hierarchical/hierarchicalformfunctioncontainer.h new file mode 100644 index 00000000..812983cd --- /dev/null +++ b/include/shapefunction/hierarchical/hierarchicalformfunctioncontainer.h @@ -0,0 +1,76 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef HIERARCHICALFORMFUNCTIONCONTAINER_H +#define HIERARCHICALFORMFUNCTIONCONTAINER_H + +#include +#include +#include +#include "densemat.h" +#include "polynomial.h" +#include "orientation.h" + +using namespace std; + +class hierarchicalformfunctioncontainer +{ + + private: + + std::string myformfunctiontypename; + int myelementtypenumber; + + std::vector myevaluationpoints = {}; + + // The values at evaluation points 'myevaluationpoints' of the hierarchical + // form functions are stored in the following format: + // + // 'val[h][i][j][k][l][m][n][o]' gives the value of the form function + // + // - specific to order h (i.e. order 0 is at index 0) + // - associated to nodes if i is 0, edges if 1, faces if 2 and volume if 3 + // - for node, edge, face or volume number j + // - for orientation k + // - number l + // - for derivative ki if m is 1, eta 2, phi 3, none 0 + // - at component n (0 for x, 1 for y and 2 for z) + // - evaluation point o + vector>>>>>>> val = {}; + + // The form function polynomials are stored in the same format but without [m] and [o]: + vector>>>>> ffpoly = {}; + + public: + + hierarchicalformfunctioncontainer(void) {}; + hierarchicalformfunctioncontainer(std::string formfunctiontypename, int elementtypenumber); + + // Know the highest order available in the container. + int gethighestorder(void) { return val.size()-1; }; + + // 'set' adds the form function polynomial to the ffpoly container. + // All other int arguments are the same as detailed for 'val' above. + // This function automatically preallocates the 'val' and 'ffpoly' containers. + void set(int h, int i, int j, int k, int l, int n, polynomial& poly); + + // Evaluate all form function polynomials at the evaluation points provided: + void evaluate(std::vector evaluationpoints); + + // 'tomatrix' puts all form function values corresponding to the + // input arguments into a 'densemat' object. The columns of the + // dense matrix correspond to the evaluation points while the rows + // correspond to all form functions. The form functions are ordered + // in the way defined in 'hierarchicalformfunctioniterator'. + densemat tomatrix(int totalorientation, int order, int whichderivative, int component); + densemat tomatrix(int h, int i, int j, int k, int l, int m, int n); + + // Print all form function values for debug. + void print(bool printallderivatives); + +}; + +#endif diff --git a/include/shapefunction/hierarchical/hierarchicalformfunctioniterator.h b/include/shapefunction/hierarchical/hierarchicalformfunctioniterator.h new file mode 100644 index 00000000..2de0759d --- /dev/null +++ b/include/shapefunction/hierarchical/hierarchicalformfunctioniterator.h @@ -0,0 +1,74 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// Hierarchical form functions are ordered as follows: +// +// 1. vertex based +// 2. edge based +// 3. face based +// 4. volume based +// +// In each category the form functions are then sorted according to the +// node, edge, face or volume on which they are defined. E.g. for the +// vertex based form functions we get first the form functions associated +// to node 1 then node 2, node 3,... +// On a given node, edge, face or volume the form functions are finally +// sorted with increasing order. + +#ifndef HIERARCHICALFORMFUNCTIONITERATOR_H +#define HIERARCHICALFORMFUNCTIONITERATOR_H + +#include +#include +#include +#include "element.h" +#include "hierarchicalformfunction.h" +#include +#include "selector.h" + + +class hierarchicalformfunctioniterator +{ + + private: + + std::shared_ptr myformfunction; + + int myelementtypenumber; + int myorder; + + // currentdimension is 0 for vertex based, 1 for edge, 2 for face and 3 for volume: + int currentdimension = 0; + // Which node/line/face/volume are we at? + int currentnodeedgefacevolumeindex = 0; + // The current form function index in the current node/edge/face/volume: + int currentformfunctionindexinnodeedgefacevolume = -1; + // The overall form function number: + int overallformfunctionindex = -1; + + public: + + hierarchicalformfunctioniterator(std::string formfunctiontypename, int elementtypenumber, int order); + + // Get the total number of form functions: + int count(void); + // 'next' moves to the next defined form function. + void next(void); + + int getdimension(void) { return currentdimension; }; + int getnodeedgefacevolumeindex(void) { return currentnodeedgefacevolumeindex; }; + int getformfunctionindexinnodeedgefacevolume(void) { return currentformfunctionindexinnodeedgefacevolume; }; + int getformfunctionindexincurrentorderinnodeedgefacevolume(void); + int getformfunctionorder(void); + int getassociatedelementtype(void); + int getoverallformfunctionindex(void) { return overallformfunctionindex; }; + + // Print info for the current form function. + void print(void); + +}; + +#endif diff --git a/include/shapefunction/hierarchical/legendre.h b/include/shapefunction/hierarchical/legendre.h new file mode 100644 index 00000000..cf74fc33 --- /dev/null +++ b/include/shapefunction/hierarchical/legendre.h @@ -0,0 +1,30 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// Legendre polynomials are required to define the hierarchical +// form functions used in Sabine Zaglmayr's thesis. + +#ifndef LEGENDRE_H +#define LEGENDRE_H + +#include +#include +#include "polynomial.h" + +namespace legendre +{ + // Legendre polynomials ln(x). + // Output is ln for n = 0 ... maxn. + std::vector l(int maxn, polynomial x); + // Integrated Legendre polynomials Ln(x): + std::vector L(int maxn, polynomial x); + // Scaled Legendre polynomials ls(x,t): + std::vector ls(int maxn, polynomial x, polynomial t); + // Scaled integrated Legendre polynomials Ls(x,t): + std::vector Ls(int maxn, polynomial x, polynomial t); +}; + +#endif diff --git a/include/shapefunction/hierarchical/oneconstant.h b/include/shapefunction/hierarchical/oneconstant.h new file mode 100644 index 00000000..ffe8e1e7 --- /dev/null +++ b/include/shapefunction/hierarchical/oneconstant.h @@ -0,0 +1,45 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef ONECONSTANT_H +#define ONECONSTANT_H + +#include "hierarchicalformfunction.h" + +class oneconstant: public hierarchicalformfunction +{ + private: + + int targetdim = -1; + int elementtypenumber = -1; + int elementdimension = -1; + + public: + + oneconstant(int td, int et); + + // Get the number of form functions of order <= 'order': + int count(int order); + // Get the number of form functions of order <= 'order' that are associated to the num th + // - node in case dim = 0 + // - edge in case dim = 1 + // - face in case dim = 2 + // - volume in case dim = 3 + int count(int order, int dim, int num); + + // Get the number of components in the form function. + int countcomponents(void) { return 1; }; + + // 'evalat' takes an integer giving the highest order up to which to output the form function polynomials. + hierarchicalformfunctioncontainer evalat(int maxorder); + + // If 'isorientationdependent' is false then the assembly can + // be carried out without taking care of the element orientation. + // This provides an assembly speedup. + bool isorientationdependent(int order) { return false; }; +}; + +#endif diff --git a/include/shapefunction/hierarchical/orientation.h b/include/shapefunction/hierarchical/orientation.h new file mode 100644 index 00000000..538ee5fe --- /dev/null +++ b/include/shapefunction/hierarchical/orientation.h @@ -0,0 +1,105 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// The hierarchical form functions used change with the edges and faces orientations. +// This can lead to field discontinuity at the element interfaces if the orientations are not +// computed in a coherent way. The coherent way used is described below. +// +// EDGE ORIENTATION: +// +// An edge with nodes numbers [i j] has orientation +// +// - 0 if i > j | [0 1] +// - 1 if j > i | [1 0] +// +// The vector on the right of '|' gives the node reordering to be in orientation 0. +// +// TRIANGULAR SURFACE ORIENTATION: +// +// For the orientation of a triangle there are only 2 things of importance: +// - which node has the biggest number +// - what is the > < relation between the second and the third node +// +// A triangular face with node numbers [i j k] has orientation +// +// - 0 if i > j > k | [0 1 2] +// - 1 if i > k > j | [0 2 1] +// - 2 if j > k > i | [1 2 0] +// - 3 if j > i > k | [1 0 2] +// - 4 if k > i > j | [2 0 1] +// - 5 if k > j > i | [2 1 0] +// +// The vector on the right of '|' gives the node reordering to be in orientation 0. +// +// QUADRANGULAR SURFACE ORIENTATION: +// +// For the orientation of a quadrangle there are only 2 things of importance: +// - which node has the biggest number +// - what is the > < relation between the second and the fourth node +// The third node is fixed since it must be at the corner opposite to the first node. +// +// A quadrangular face with node numbers [i j k l] - a node and its next-next node must be at opposite corners - has orientation +// +// - 0 if max(i,j,k,l) = i and j > l | [0 1 2 3] +// - 1 if max(i,j,k,l) = i and l > j | [0 3 2 1] +// - 2 if max(i,j,k,l) = j and k > i | [1 2 3 0] +// - 3 if max(i,j,k,l) = j and i > k | [1 0 3 2] +// - 4 if max(i,j,k,l) = k and l > j | [2 3 0 1] +// - 5 if max(i,j,k,l) = k and j > l | [2 1 0 3] +// - 6 if max(i,j,k,l) = l and i > k | [3 0 1 2] +// - 7 if max(i,j,k,l) = l and k > i | [3 2 1 0] +// +// The vector on the right of '|' gives the node reordering to be in orientation 0. +// +// TOTAL ORIENTATION: +// +// The total orientation of an element is an integer that uniquely identifies all edges and faces +// orientations in the element. The number is computed as follows: +// totalorientation = sum on all edges(orientation of edge i * 2^i) + 2^numedges * sum on all faces(orientation of face j * 8^j). +// E.g. for a quad with edges orientations [0 1 1 0] and face orientation 7 we have: +// totalorientation = 0*2^0 + 1*2^1 + 1*2^2 + 0*2^3 + 2^4 * 7*8^0; + +#ifndef ORIENTATION_H +#define ORIENTATION_H + +#include +#include +#include "math.h" +#include "element.h" + +namespace orientation +{ + // Only the corner nodes must be provided in the node list. + std::vector gettotalorientation(int elementtypenumber, std::vector& nodelist); + + // Count the number of orientations for a given element type: + int countorientations(int elemtypenum); + + // 'getedgesorientationsfromtotalorientation'returns a vector whose + // index i gives the orientation of edge number i. + std::vector getedgesorientationsfromtotalorientation(int totalorientation, int elementtypenumber); + std::vector getfacesorientationsfromtotalorientation(int totalorientation, int elementtypenumber); + + // 'getreorderingtoreferenceedgeorientation' returns a vector of vectors 'a' + // such that if n is a vector containing the node list of an edge of + // orientation i then n(a(i)) is an edge of orientation number 0. + std::vector> getreorderingtoreferenceedgeorientation(void); + std::vector> getreorderingtoreferencetriangularfaceorientation(void); + std::vector> getreorderingtoreferencequadrangularfaceorientation(void); + + // 'getedgesorientationsinelement' outputs a vector listing the + // orientation of all edges in the element. + std::vector getedgesorientationsinelement(int elementtypenumber, std::vector& nodelist); + std::vector getfacesorientationsinelement(int elementtypenumber, std::vector& nodelist); + + // 'getorientationofedgeargument' gives the orientation + // of the edge whose nodes are provided as input argument + int getorientationofedge(std::vector& physicalnodesinedge); + int getorientationoftriangle(std::vector& physicalnodesintriangle); + int getorientationofquadrangle(std::vector& physicalnodesinquadrangle); +}; + +#endif diff --git a/include/shapefunction/hierarchical/selector.h b/include/shapefunction/hierarchical/selector.h new file mode 100644 index 00000000..a6b4d879 --- /dev/null +++ b/include/shapefunction/hierarchical/selector.h @@ -0,0 +1,41 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef SELECTOR_H +#define SELECTOR_H + +#include +#include +#include + +#include "h1point.h" +#include "h1line.h" +#include "h1triangle.h" +#include "h1quadrangle.h" +#include "h1tetrahedron.h" +#include "h1hexahedron.h" +#include "h1prism.h" +#include "h1pyramid.h" + +#include "hcurlpoint.h" +#include "hcurlline.h" +#include "hcurltriangle.h" +#include "hcurlquadrangle.h" +#include "hcurltetrahedron.h" +#include "hcurlhexahedron.h" +#include "hcurlprism.h" +#include "hcurlpyramid.h" + +#include "oneconstant.h" + + +namespace selector +{ + // Get a pointer to the selected form function: + std::shared_ptr select(int elementtypenumber, std::string formfunctiontypename); +}; + +#endif diff --git a/include/shapefunction/lagrange/lagrangeformfunction.h b/include/shapefunction/lagrange/lagrangeformfunction.h new file mode 100644 index 00000000..cc7c5948 --- /dev/null +++ b/include/shapefunction/lagrange/lagrangeformfunction.h @@ -0,0 +1,77 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef LAGRANGEFORMFUNCTION_H +#define LAGRANGEFORMFUNCTION_H + +#include +#include +#include "densemat.h" +#include "polynomial.h" +#include "element.h" +#include +#include "universe.h" + +#include "lagrangepoint.h" +#include "lagrangeline.h" +#include "lagrangetriangle.h" +#include "lagrangequadrangle.h" +#include "lagrangetetrahedron.h" +#include "lagrangehexahedron.h" +#include "lagrangeprism.h" +#include "lagrangepyramid.h" + + +class lagrangeformfunction +{ + private: + + int myorder; + int myelementtypenumber; + std::vector myevaluationpoints; + + std::vector mynodecoordinates = {}; + std::vector myformfunctionpolynomials = {}; + + // In the following dense matrices there is a row per Lagrange + // form function and a column per evaluation point. + // evaluated[i] stores the value of the Lagrange form functions: + // - without derivative for i = 0 + // - with ki derivative for i = 1 + // - with eta derivative for i = 2 + // - with phi derivative for i = 3 + std::vector evaluated = std::vector(4); + + // Make the Lagrange polynomials/coordinates available: + void preparepoly(void); + void preparecoords(void); + + public: + + lagrangeformfunction(void) {}; + + // The constructor takes the element type number, the form function + // order and the coordinates of the evaluation points as input. + // They are set once and for all for a given object. + // Format is [ki1 eta1 phi1 ki2 eta2 phi2 ki3 ...]. + lagrangeformfunction(int elementtypenumber, int order, const std::vector evaluationpoints); + + // getderivative gives the value of the Lagrange form functions: + // - without derivative for whichderivative = 0 + // - with ki derivative for whichderivative = 1 + // - with eta derivative for whichderivative = 2 + // - with phi derivative for whichderivative = 3 + // + // It outputs a copy of evaluated[whichderivative] if available. + densemat getderivative(int whichderivative); + + std::vector getnodecoordinates(void); + std::vector getformfunctionpolynomials(void); + + void print(void); +}; + +#endif diff --git a/include/shapefunction/lagrange/lagrangehexahedron.h b/include/shapefunction/lagrange/lagrangehexahedron.h new file mode 100644 index 00000000..3456a619 --- /dev/null +++ b/include/shapefunction/lagrange/lagrangehexahedron.h @@ -0,0 +1,25 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef LAGRANGEHEXAHEDRON_H +#define LAGRANGEHEXAHEDRON_H + +#include +#include "polynomial.h" +#include "math.h" +#include "element.h" + + +namespace lagrangehexahedron +{ + // 'getnodecoordinates' gives the ki, eta and phi + // coordinates of every Lagrange node for the required order: + std::vector getnodecoordinates(int order); + // 'getformfunctionpolynomials' outputs a vector giving the form function polynomials: + std::vector getformfunctionpolynomials(int order); +} + +#endif diff --git a/include/shapefunction/lagrange/lagrangeline.h b/include/shapefunction/lagrange/lagrangeline.h new file mode 100644 index 00000000..2e48ec73 --- /dev/null +++ b/include/shapefunction/lagrange/lagrangeline.h @@ -0,0 +1,25 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef LAGRANGELINE_H +#define LAGRANGELINE_H + +#include +#include "polynomial.h" +#include "math.h" +#include "element.h" + + +namespace lagrangeline +{ + // 'getnodecoordinates' gives the ki, eta and phi + // coordinates of every Lagrange node for the required order: + std::vector getnodecoordinates(int order); + // 'getformfunctionpolynomials' outputs a vector giving the form function polynomials: + std::vector getformfunctionpolynomials(int order); +} + +#endif diff --git a/include/shapefunction/lagrange/lagrangepoint.h b/include/shapefunction/lagrange/lagrangepoint.h new file mode 100644 index 00000000..34ecd1f9 --- /dev/null +++ b/include/shapefunction/lagrange/lagrangepoint.h @@ -0,0 +1,25 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef LAGRANGEPOINT_H +#define LAGRANGEPOINT_H + +#include +#include "polynomial.h" +#include "math.h" +#include "element.h" + + +namespace lagrangepoint +{ + // 'getnodecoordinates' gives the ki, eta and phi + // coordinates of every Lagrange node for the required order: + std::vector getnodecoordinates(int order); + // 'getformfunctionpolynomials' outputs a vector giving the form function polynomials: + std::vector getformfunctionpolynomials(int order); +} + +#endif diff --git a/include/shapefunction/lagrange/lagrangeprism.h b/include/shapefunction/lagrange/lagrangeprism.h new file mode 100644 index 00000000..b64a3d4f --- /dev/null +++ b/include/shapefunction/lagrange/lagrangeprism.h @@ -0,0 +1,25 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef LAGRANGEPRISM_H +#define LAGRANGEPRISM_H + +#include +#include "polynomial.h" +#include "math.h" +#include "element.h" + + +namespace lagrangeprism +{ + // 'getnodecoordinates' gives the ki, eta and phi + // coordinates of every Lagrange node for the required order: + std::vector getnodecoordinates(int order); + // 'getformfunctionpolynomials' outputs a vector giving the form function polynomials: + std::vector getformfunctionpolynomials(int order); +} + +#endif diff --git a/include/shapefunction/lagrange/lagrangepyramid.h b/include/shapefunction/lagrange/lagrangepyramid.h new file mode 100644 index 00000000..af4d50e5 --- /dev/null +++ b/include/shapefunction/lagrange/lagrangepyramid.h @@ -0,0 +1,25 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef LAGRANGEPYRAMID_H +#define LAGRANGEPYRAMID_H + +#include +#include "polynomial.h" +#include "math.h" +#include "element.h" + + +namespace lagrangepyramid +{ + // 'getnodecoordinates' gives the ki, eta and phi + // coordinates of every Lagrange node for the required order: + std::vector getnodecoordinates(int order); + // 'getformfunctionpolynomials' outputs a vector giving the form function polynomials: + std::vector getformfunctionpolynomials(int order); +} + +#endif diff --git a/include/shapefunction/lagrange/lagrangequadrangle.h b/include/shapefunction/lagrange/lagrangequadrangle.h new file mode 100644 index 00000000..ca27f868 --- /dev/null +++ b/include/shapefunction/lagrange/lagrangequadrangle.h @@ -0,0 +1,25 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef LAGRANGEQUADRANGLE_H +#define LAGRANGEQUADRANGLE_H + +#include +#include "polynomial.h" +#include "math.h" +#include "element.h" + + +namespace lagrangequadrangle +{ + // 'getnodecoordinates' gives the ki, eta and phi + // coordinates of every Lagrange node for the required order: + std::vector getnodecoordinates(int order); + // 'getformfunctionpolynomials' outputs a vector giving the form function polynomials: + std::vector getformfunctionpolynomials(int order); +} + +#endif diff --git a/include/shapefunction/lagrange/lagrangetetrahedron.h b/include/shapefunction/lagrange/lagrangetetrahedron.h new file mode 100644 index 00000000..c9311cda --- /dev/null +++ b/include/shapefunction/lagrange/lagrangetetrahedron.h @@ -0,0 +1,25 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef LAGRANGETETRAHEDRON_H +#define LAGRANGETETRAHEDRON_H + +#include +#include "polynomial.h" +#include "math.h" +#include "element.h" + + +namespace lagrangetetrahedron +{ + // 'getnodecoordinates' gives the ki, eta and phi + // coordinates of every Lagrange node for the required order: + std::vector getnodecoordinates(int order); + // 'getformfunctionpolynomials' outputs a vector giving the form function polynomials: + std::vector getformfunctionpolynomials(int order); +} + +#endif diff --git a/include/shapefunction/lagrange/lagrangetriangle.h b/include/shapefunction/lagrange/lagrangetriangle.h new file mode 100644 index 00000000..d05f021f --- /dev/null +++ b/include/shapefunction/lagrange/lagrangetriangle.h @@ -0,0 +1,25 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef LAGRANGETRIANGLE_H +#define LAGRANGETRIANGLE_H + +#include +#include "polynomial.h" +#include "math.h" +#include "element.h" + + +namespace lagrangetriangle +{ + // 'getnodecoordinates' gives the ki, eta and phi + // coordinates of every Lagrange node for the required order: + std::vector getnodecoordinates(int order); + // 'getformfunctionpolynomials' outputs a vector giving the form function polynomials: + std::vector getformfunctionpolynomials(int order); +} + +#endif diff --git a/include/shapefunction/polynomial.h b/include/shapefunction/polynomial.h new file mode 100644 index 00000000..8b6d0b5c --- /dev/null +++ b/include/shapefunction/polynomial.h @@ -0,0 +1,60 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef POLYNOMIAL_H +#define POLYNOMIAL_H + +#include +#include +#include "polynomials.h" + +class polynomial +{ + friend class polynomials; + + private: + + // 'mycoefficients[i][j][k]' gives the coefficient of the monomial ki^i*eta^j*phi^k + std::vector>> mycoefficients = {}; + + public: + + void set(const std::vector>>& coefficients); + + std::vector>> get(void) { return mycoefficients; }; + + // 'print' prints the polynomial to the console: + void print(void); + // Compute for the ki, eta and phi values provided. + // Format is [ki1 eta1 phi1 ki2 eta2 phi2 ...]. + // Set the int to 0 to get the no derivative value, 1 for dki, 2 for deta and 3 for dphi. + std::vector evalat(const std::vector& evaluationpoints, int whichderivative); + // Defining the +, - and * operators for polynomials: + polynomial operator*(polynomial); + polynomial operator+(polynomial); + polynomial operator-(polynomial); + polynomial operator+(); + polynomial operator-(); + // Define the right product poly*double: + polynomial operator*(double); + polynomial operator+(double); + polynomial operator-(double); + + // Defining the ki, eta and phi derivatives: + void dki(void); + void deta(void); + void dphi(void); + // Defining a generic derivative operator. + // Argument set to 0 gives dki, 1 deta and 2 dphi. + polynomial derivative(int whichderivative); +}; + +// Define the left version of the operators based on the right one. +polynomial operator*(double, polynomial); +polynomial operator+(double, polynomial); +polynomial operator-(double, polynomial); + +#endif diff --git a/include/shapefunction/polynomials.h b/include/shapefunction/polynomials.h new file mode 100644 index 00000000..37ea3044 --- /dev/null +++ b/include/shapefunction/polynomials.h @@ -0,0 +1,47 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef POLYNOMIALS_H +#define POLYNOMIALS_H + +#include +#include +#include "polynomial.h" + +class polynomial; + +class polynomials +{ + private: + + int mynumpolys = 0; + + // Size in the ki, eta and phi direction: + int mykilen = 0, myetalen = 0, myphilen = 0, mynummonomials = 0; + std::vector mycoeffs = {}; + + public: + + polynomials(void) {}; + polynomials(std::vector input); + + int count(void) { return mynumpolys; }; + + // Evaluate at a single {ki,eta,phi} point: + void evalatsingle(const std::vector& evaluationpoint, std::vector& evaled); + // Same as above but {poly1,dkipoly1,detapoly1,...,poly2,dkipoly2,detapoly2,...} is returned. + // 'num' equal to 0/1/2/3 returns respectively poly/poly+dki/poly+dki+deta/poly+dki+deta+dphi. + void evalatsingle(const std::vector& evaluationpoint, int num, std::vector& evaled); + + // Return the weighted sum of the original polynomials. + // Output holds {p1,p2,...} where pi = sum_k( weights[ i * mynumpolys + k ] * originalpoly[k] ). + polynomials sum(std::vector& weights); + + void print(void); + +}; + +#endif diff --git a/src/shapefunction/spline.h b/include/shapefunction/spline.h old mode 100755 new mode 100644 similarity index 100% rename from src/shapefunction/spline.h rename to include/shapefunction/spline.h diff --git a/include/sl.h b/include/sl.h new file mode 100644 index 00000000..8c1ec5df --- /dev/null +++ b/include/sl.h @@ -0,0 +1,339 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . +// +// Thanks to R. Haouari for the stabilization terms. + +#ifndef SL_H +#define SL_H + +#include +#include +#include "expression.h" +#include "integration.h" +#include "universe.h" +#include "iointerface.h" +#include "vec.h" +#include "mat.h" +#include "formulation.h" +#include "rawmesh.h" +#include "dofmanager.h" + +class rawmesh; +class expression; +class integration; +class mat; +class vec; +class field; +class parameter; +class formulation; +class shape; +class dofmanager; + +namespace sl +{ + // Get the code version number and name: + void printversion(void); + int getversion(void); + int getsubversion(void); + std::string getversionname(void); + + void setmaxnumthreads(int mnt); + int getmaxnumthreads(void); + + field getx(void); + field gety(void); + field getz(void); + + double getpi(void); + + // Vacuum permeability/permittivity: + double getmu0(void); + double getepsilon0(void); + + // Get a random value uniformly distributed between 0.0 and 1.0: + double getrandom(void); + + // Perform operations (union, intersection) on physical regions: + int selectunion(std::vector physregs); + int selectintersection(std::vector physregs, int intersectdim); + int selectall(void); + + // Check if a region is defined/empty/fully included in another region/touches another region: + bool isdefined(int physreg); + bool isempty(int physreg); + bool isinside(int physregtocheck, int physreg); + bool istouching(int physregtocheck, int physreg); + + void printvector(std::vector input); + void printvector(std::vector input); + void printvector(std::vector input); + + void writevector(std::string filename, std::vector towrite, char delimiter = ',', bool writesize = false); + // Load a vector of doubles separated by a character: + std::vector loadvector(std::string filename, char delimiter = ',', bool sizeincluded = false); + + // Partition the mesh into numranks parts and return the mesh file name for each rank: + std::string allpartition(std::string meshfile); + + // Compute the L2 norm of an expression: + expression norm(expression expr); + + // Normal vector with unit norm and pointing outward of a physical region: + expression normal(void); + expression normal(int physreg); + expression getnormal(int physreg); + // Tangent vector with unit norm: + expression tangent(void); + + // Write scalar or vector values at given coordinates to file: + void scatterwrite(std::string filename, std::vector xcoords, std::vector ycoords, std::vector zcoords, std::vector compxevals, std::vector compyevals = {}, std::vector compzevals = {}); + + void setaxisymmetry(void); + + void setfundamentalfrequency(double f); + void settime(double t); + double gettime(void); + + expression meshsize(int integrationorder); + // Return the field order to hold alpha % of the total coefficient weight. Return the actual field order with alpha set to -1.0. + expression fieldorder(field input, double alpha = -1.0, double absthres = 0.0); + + // Get a single harmonic: + expression getharmonic(int harmnum, expression input, int numfftharms = -1); + // Make a harmonic expression: + expression makeharmonic(std::vector harms, std::vector exprs); + // Return an expression containing the origin harmonics moved to new harmonic positions: + expression moveharmonic(std::vector origharms, std::vector destharms, expression input, int numfftharms = -1); + + std::vector gettotalforce(int physreg, expression* meshdeform, expression EorH, expression epsilonormu, int extraintegrationorder); + std::vector gettotalforce(int physreg, expression EorH, expression epsilonormu, int extraintegrationorder = 0); + std::vector gettotalforce(int physreg, expression meshdeform, expression EorH, expression epsilonormu, int extraintegrationorder = 0); + + std::vector printtotalforce(int physreg, expression* meshdeform, expression EorH, expression epsilonormu, int extraintegrationorder); + std::vector printtotalforce(int physreg, expression EorH, expression epsilonormu, int extraintegrationorder = 0); + std::vector printtotalforce(int physreg, expression meshdeform, expression EorH, expression epsilonormu, int extraintegrationorder = 0); + + void setphysicalregionshift(int shiftamount); + + // Write all shape functions for an element type up to a given order: + void writeshapefunctions(std::string filename, std::string sftypename, int elementtypenumber, int maxorder, bool allorientations = false); + + // The time variable: + expression t(void); + + // Group .vtu timestep files in a .pvd file: + void grouptimesteps(std::string filename, std::vector filestogroup, std::vector timevals); + void grouptimesteps(std::string filename, std::string fileprefix, int firstint, std::vector timevals); + + // Load a mesh file into a shape. Return the list of shapes of all dimensions {{0D},{1D},{2D},{3D}} (if any): + std::vector> loadshape(std::string meshfile); + + // Make the time derivative vectors available in the universe: + void settimederivative(vec dtx); + void settimederivative(vec dtx, vec dtdtx); + + expression dx(expression input); + expression dy(expression input); + expression dz(expression input); + + expression dt(expression input); + expression dtdt(expression input); + expression dtdtdt(expression input); + expression dtdtdtdt(expression input); + + // Transient approximation of dt and dtdt: + expression dt(expression input, double initdt, double initdtdt); + expression dtdt(expression input, double initdt, double initdtdt); + + expression transientdtapprox(int dtorder, expression input, double initdt, double initdtdt); + + expression sin(expression input); + expression cos(expression input); + expression tan(expression input); + expression asin(expression input); + expression acos(expression input); + expression atan(expression input); + expression abs(expression input); + expression sqrt(expression input); + expression log(expression input); + expression pow(expression base, expression exponent); + expression exp(expression input); + expression mod(expression input, double modval); + + // Easy conditional functions for expressions (true if the expression value is >= 0): + expression ifpositive(expression condexpr, expression trueexpr, expression falseexpr); + expression andpositive(std::vector exprs); + expression orpositive(std::vector exprs); + + expression max(expression a, expression b); + expression max(field a, field b); + expression max(parameter a, parameter b); + expression min(expression a, expression b); + expression min(field a, field b); + expression min(parameter a, parameter b); + + + // Evaluate an expression on physical region 'physreg' using interpolation: + expression on(int physreg, expression expr, bool errorifnotfound = true); + // Interpolate at coordinates shifted by 'coordshift': + expression on(int physreg, expression coordshift, expression expr, bool errorifnotfound = true); + + expression comp(int selectedcomp, expression input); + expression compx(expression input); + expression compy(expression input); + expression compz(expression input); + + expression entry(int row, int col, expression input); + + expression eye(int size); + + expression transpose(expression input); + expression inverse(expression input); + expression determinant(expression input); + + expression grad(expression input); + expression div(expression input); + expression curl(expression input); + + // Cross product between vector a and vector b. + // Any argument that does not have 3 components will be filled with zeros. + expression crossproduct(expression a, expression b); + + // Double dot a:b product: + expression doubledotproduct(expression a, expression b); + + // Element-wise product: + expression elementwiseproduct(expression a, expression b); + + // Get the trace of a square matrix: + expression trace(expression a); + + // Get the rotation matrix and its inverse for a 3x3 tensor with (x,y,z) component + // ordering or a 6x6 tensor in Voigt form. Input angles are in degrees. + std::vector rotation(double alphax, double alphay, double alphaz, std::string type = ""); + + integration integral(int physreg, expression tointegrate, int integrationorderdelta = 0, int blocknumber = 0); + integration integral(int physreg, expression meshdeform, expression tointegrate, int integrationorderdelta = 0, int blocknumber = 0); + // For the multiharmonic resolution an extra integer is required + // to know with how many harmonics the coef multiplying the tf + // and/or dof should be approximated. Set 'numcoefharms' negative + // and it will be as if you were calling the above non + // multiharmonic functions. + integration integral(int physreg, int numcoefharms, expression tointegrate, int integrationorderdelta = 0, int blocknumber = 0); + integration integral(int physreg, int numcoefharms, expression meshdeform, expression tointegrate, int integrationorderdelta = 0, int blocknumber = 0); + + expression dof(expression input); + expression dof(expression input, int physreg); + expression tf(expression input); + expression tf(expression input, int physreg); + + // Return an expression whose value will be calculated on the argument mesh state (the expression is hp-synchronized to that mesh state after the call): + expression athp(expression expr, std::shared_ptr rm, std::shared_ptr pt); + + // hp-adaptation: + bool adapt(int verbosity = 0); + bool alladapt(int verbosity = 0); + + // Define a Zienkiewicz-Zhu type error indicator: + expression zienkiewiczzhu(expression input); + + // Define typically used arrays for convenience: + expression array1x1(expression term11); + expression array1x2(expression term11, expression term12); + expression array1x3(expression term11, expression term12, expression term13); + expression array2x1(expression term11, expression term21); + expression array2x2(expression term11, expression term12, expression term21, expression term22); + expression array2x3(expression term11, expression term12, expression term13, expression term21, expression term22, expression term23); + expression array3x1(expression term11, expression term21, expression term31); + expression array3x2(expression term11, expression term12, expression term21, expression term22, expression term31, expression term32); + expression array3x3(expression term11, expression term12, expression term13, expression term21, expression term22, expression term23, expression term31, expression term32, expression term33); + + + // Direct resolution (with or without diagonal scaling): + vec solve(mat A, vec b, std::string soltype = "lu", bool diagscaling = false); + // Multi-rhs direct resolution: + std::vector solve(mat A, std::vector b, std::string soltype = "lu"); + // Densematrix 'b' has size #rhs x #dofs: + densemat solve(mat A, densemat b, std::string soltype); + + // Iterative resolution (with or without diagonal scaling): + void solve(mat A, vec b, vec sol, double& relrestol, int& maxnumit, std::string soltype = "bicgstab", std::string precondtype = "sor", int verbosity = 1, bool diagscaling = false); + + + // Exchange densemat data with MPI: + void exchange(std::vector targetranks, std::vector sends, std::vector receives); + + // MPI based gmres with custom matrix free product (no restart). Initial guess and solution are in x. + // Relative residual at each iteration is returned. Length is number of iterations + 1 (first is initial residual). + std::vector gmres(densemat (*mymatmult)(densemat), densemat b, densemat x, double relrestol, int maxnumit, int verbosity = 1); + + // Know which dofs to send and at which dofs to receive for the DDM. Choose the rawfields and the domain interface dimensions (length 3) to consider. + void mapdofs(std::shared_ptr dm, std::vector> rfs, std::vector isdimactive, std::vector& sendinds, std::vector& recvinds); + + std::vector linspace(double a, double b, int num); + std::vector logspace(double a, double b, int num, double basis = 10.0); + + // Convert dB to Nepers: + expression dbtoneper(expression toconvert); + + + // Set all fields and ports to the values available in the vec object: + void setdata(vec invec); + + + ////////// PREDEFINED OPERATORS + + // Gives the engineering strains of a 2D or 3D mechanical displacement vector (Voigt form): + expression strain(expression input); + // Gives the Green-Lagrange strains of a 2D or 3D mechanical displacement vector (Voigt form): + expression greenlagrangestrain(expression input); + // Gives the von Mises stress (Voigt form expected for the argument): + expression vonmises(expression stress); + + // Weak form of the mass conservation for Navier-Stokes: + expression predefinedmassconservation(expression dofv, expression tfp, expression rho, expression dtrho, expression gradrho, bool includetimederivs, bool isdensityconstant); + // Weak form of the inertial forces for Navier-Stokes: + expression predefinedinertialforce(expression dofv, expression tfv, expression v, expression rho); + // Weak form of the viscous forces for Navier-Stokes: + expression predefinedviscousforce(expression dofv, expression tfv, expression mu, bool isdensityconstant, bool isviscosityconstant); + + + ////////// PREDEFINED FORMULATIONS + + std::vector continuitycondition(int gamma1, int gamma2, field u1, field u2, int lagmultorder, bool errorifnotfound = true); + std::vector continuitycondition(int gamma1, int gamma2, field u1, field u2, std::vector rotcent, double rotangz, double angzmod, double factor, int lagmultorder); + std::vector periodicitycondition(int gamma1, int gamma2, field u, std::vector dat1, std::vector dat2, double factor, int lagmultorder); + + // Isotropic linear elasticity: + expression predefinedelasticity(expression dofu, expression tfu, expression Eyoung, expression nupoisson, std::string myoption = ""); + // General anisotropic linear elasticity: + expression predefinedelasticity(expression dofu, expression tfu, expression elasticitymatrix, std::string myoption = ""); + + // Isotropic elasticity with geometrical nonlinearity and prestress (ignored if zero): + expression predefinedelasticity(expression dofu, expression tfu, field u, expression Eyoung, expression nupoisson, expression prestress, std::string myoption = ""); + // General anisotropic elasticity with geometrical nonlinearity and prestress (ignored if zero): + expression predefinedelasticity(expression dofu, expression tfu, field u, expression elasticitymatrix, expression prestress, std::string myoption = ""); + + expression predefinedelectrostaticforce(expression input, expression E, expression epsilon); + expression predefinedmagnetostaticforce(expression input, expression H, expression mu); + + expression predefinedacousticwave(expression dofp, expression tfp, expression soundspeed, expression neperattenuation); + expression predefinedacousticradiation(expression dofp, expression tfp, expression soundspeed, expression neperattenuation); + expression predefinedacousticstructureinteraction(expression dofp, expression tfp, expression dofu, expression tfu, expression soundspeed, expression fluiddensity, expression normal, expression neperattenuation, double scaling = 1.0); + + // Stokes flow for Newtonian fluids: + expression predefinedstokes(expression dofv, expression tfv, expression dofp, expression tfp, expression mu, expression rho, expression dtrho, expression gradrho, bool includetimederivs = false, bool isdensityconstant = true, bool isviscosityconstant = true); + // Navier-Stokes flow for Newtonian fluids: + expression predefinednavierstokes(expression dofv, expression tfv, expression v, expression dofp, expression tfp, expression mu, expression rho, expression dtrho, expression gradrho, bool includetimederivs = false, bool isdensityconstant = true, bool isviscosityconstant = true); + + // Advection-diffusion equations: + expression predefinedadvectiondiffusion(expression doff, expression tff, expression v, expression alpha, expression beta, expression gamma, bool isdivvzero = true); + expression predefineddiffusion(expression doff, expression tff, expression alpha, expression beta); + + // Stabilization for advection-diffusion problems: + expression predefinedstabilization(std::string stabtype, expression delta, expression f, expression v, expression diffusivity, expression residual); +}; + +#endif diff --git a/src/slmpi.h b/include/slmpi.h old mode 100755 new mode 100644 similarity index 100% rename from src/slmpi.h rename to include/slmpi.h diff --git a/include/spanningtree.h b/include/spanningtree.h new file mode 100644 index 00000000..98b4ac21 --- /dev/null +++ b/include/spanningtree.h @@ -0,0 +1,41 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef SPANNINGTREE_H +#define SPANNINGTREE_H + +#include +#include +#include +#include "rawspanningtree.h" + +class rawspanningtree; + +class spanningtree +{ + private: + + std::shared_ptr myrawspantree = NULL; + + public: + + // Create a spanning tree on the whole mesh: + spanningtree(std::vector physregs); + + // Count the number of edges in the tree: + int countedgesintree(void); + // Get all edges in the tree (ordering does not follow tree): + std::vector getedgesintree(void); + + // Get the raw spanning tree pointer: + std::shared_ptr getpointer(void); + + // Write to file to visualize the tree: + void write(std::string filename); +}; + +#endif + diff --git a/src/sparselizard.h b/include/sparselizard.h similarity index 100% rename from src/sparselizard.h rename to include/sparselizard.h diff --git a/include/spline.h b/include/spline.h new file mode 100644 index 00000000..46818038 --- /dev/null +++ b/include/spline.h @@ -0,0 +1,54 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . +// +// This object holds a cubic natural spline interpolation of a dataset. + + +#ifndef SPLINE_H +#define SPLINE_H + +#include +#include +#include +#include "densemat.h" + +class spline +{ + + private: + + double noisethreshold = 1e-10; + + double xmin, xmax; + // The x and y axis data (sorted ascendingly): + densemat myx, myy; + // The spline parameters: + densemat mya, myb; + + int derivativeorder = 0; + + public: + + spline(void) {}; + spline(std::string filename, char delimiter = '\n'); + spline(std::vector xin, std::vector yin); + + void set(std::vector& xin, std::vector& yin); + + spline getderivative(void); + + double getxmin(void) { return xmin; }; + double getxmax(void) { return xmax; }; + + double evalat(double input); + std::vector evalat(std::vector input); + densemat evalat(densemat input); + + void write(std::string filename, int numsplits, char delimiter = '\n'); + +}; + +#endif + diff --git a/src/universe.h b/include/universe.h old mode 100755 new mode 100644 similarity index 100% rename from src/universe.h rename to include/universe.h diff --git a/include/vec.h b/include/vec.h new file mode 100644 index 00000000..118133e0 --- /dev/null +++ b/include/vec.h @@ -0,0 +1,107 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +// This object is a wrapper of the actual vec object 'rawvec' pointed +// by 'rawvecptr' and to which all functions are redirected. + +#ifndef VEC_H +#define VEC_H + +#include "formulation.h" +#include +#include +#include +#include "petsc.h" +#include "field.h" +#include "vectorfieldselect.h" +#include "memory.h" +#include "rawvec.h" +#include "petscvec.h" +#include "port.h" + +class field; +class rawvec; +class formulation; + +class vec +{ + private: + + // The actual vector: + std::shared_ptr rawvecptr = NULL; + + void errorifpointerisnull(void); + + public: + + vec(void) {}; + vec(formulation formul); + vec(std::shared_ptr inputrawvec) { rawvecptr = inputrawvec; }; + + // Create a pre-filled vector: + vec(int vecsize, indexmat addresses, densemat vals); + + int size(void); + + void permute(indexmat rowpermute, bool invertit = false); + + // Update the Dirichlet constraints: + void updateconstraints(void); + + // Negative addresses are ignored. 'op' can be 'add' or 'set'. + void setvalues(indexmat addresses, densemat valsmat, std::string op = "set"); + void setallvalues(densemat valsmat, std::string op = "set"); + densemat getvalues(indexmat addresses); + densemat getallvalues(void); + // Set and get value at a single index: + void setvalue(int address, double value, std::string op = "set"); + double getvalue(int address); + // Set and get value of a port: + void setvalue(port prt, double value, std::string op = "set"); + double getvalue(port prt); + + vectorfieldselect operator|(field selectedfield); + + std::shared_ptr getpointer(void) { return rawvecptr; }; + + // Transfer data from a field to this vector. + // Only the data corresponding to the physical region is transferred. + // 'op' can be 'add' or 'set'. + void setdata(int physreg, field myfield, std::string op = "set"); + // Transfer data from all fields and ports to this vector. + void setdata(void); + + // Allow/forbid automatic updating of the vec value during hp-adaptivity: + void automaticupdate(bool updateit); + void noautomaticupdate(void); + + Vec getpetsc(void); + + // Write and load raw vec data: + void write(std::string filename); + void load(std::string filename); + + void print(void); + + vec copy(void); + + vec extract(indexmat addresses); + + double norm(std::string type = "2"); + double sum(void); + + vec operator+(void); + vec operator-(void); + vec operator*(double input); + vec operator/(double input); + vec operator+(vec input); + vec operator-(vec input); + +}; + +vec operator*(double, vec); + +#endif diff --git a/include/vectorfieldselect.h b/include/vectorfieldselect.h new file mode 100644 index 00000000..dc310b39 --- /dev/null +++ b/include/vectorfieldselect.h @@ -0,0 +1,38 @@ +// sparselizard - Copyright (C) see copyright file. +// +// See the LICENSE file for license information. Please report all +// bugs and problems to . + + +#ifndef VECTORFIELDSELECT_H +#define VECTORFIELDSELECT_H + +#include "memory.h" +#include "rawfield.h" +#include "rawvec.h" +#include "field.h" + +class rawfield; +class rawvec; +class field; + +class vectorfieldselect +{ + + private: + + std::shared_ptr myrawvec; + std::shared_ptr myrawfield; + + public: + + vectorfieldselect(std::shared_ptr vecin, std::shared_ptr fieldin) { myrawvec = vecin; myrawfield = fieldin; }; + + std::shared_ptr getrawvector(void) { return myrawvec; }; + std::shared_ptr getrawfield(void) { return myrawfield; }; + + void setdata(int physreg, field myfield, std::string op = "set"); + +}; + +#endif diff --git a/src/wallclock.h b/include/wallclock.h old mode 100755 new mode 100644 similarity index 100% rename from src/wallclock.h rename to include/wallclock.h diff --git a/simulations/default/CMakeLists.txt b/simulations/default/CMakeLists.txt index 49cf00a2..54afc5eb 100644 --- a/simulations/default/CMakeLists.txt +++ b/simulations/default/CMakeLists.txt @@ -1,4 +1,6 @@ -custom_add_executable_from_dir(default ${CMAKE_CURRENT_SOURCE_DIR}) -target_link_libraries(default sparselizard) -custom_symlink_file(default ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} "*.msh;*.geo;*.txt;*.csv;*.nas;*.slz") +add_executable(default main.cpp) +target_link_libraries(default sparselizard) +install(TARGETS default RUNTIME) +set(DATA disk.geo disk.msh) +install(FILES ${DATA} DESTINATION ${CMAKE_INSTALL_BINDIR}) diff --git a/simulations/default/disk.msh b/simulations/default/disk.msh index 399660fb..6cb6cf97 100644 --- a/simulations/default/disk.msh +++ b/simulations/default/disk.msh @@ -2,7 +2,7 @@ $MeshFormat 2.2 0 8 $EndMeshFormat $Nodes -2718 +2724 1 1 0 0 2 0 -1 0 3 0 1 0 @@ -11,126 +11,126 @@ $Nodes 6 0 1 0.1 7 1 0 0.1 8 0 -1 0.1 -9 -0.9951847266722343 0.09801714032917982 0 -10 -0.9807852804033356 0.1950903220155996 0 -11 -0.9569403357324345 0.2902846772537184 0 -12 -0.9238795325116899 0.3826834323641164 0 -13 -0.8819212643489727 0.4713967368248421 0 -14 -0.8314696123033888 0.5555702330183399 0 -15 -0.7730104533638363 0.6343932841623059 0 -16 -0.7071067811878894 0.7071067811852056 0 -17 -0.6343932841648996 0.7730104533617078 0 -18 -0.5555702330207417 0.8314696123017838 0 -19 -0.4713967368269896 0.8819212643478248 0 -20 -0.382683432365871 0.9238795325109631 0 -21 -0.290284677254992 0.9569403357320482 0 -22 -0.1950903220164424 0.9807852804031679 0 -23 -0.09801714032963502 0.9951847266721896 0 -24 0.09801714032917982 0.9951847266722343 0 -25 0.1950903220155996 0.9807852804033356 0 -26 0.2902846772537184 0.9569403357324345 0 -27 0.3826834323641164 0.9238795325116899 0 -28 0.4713967368248421 0.8819212643489727 0 -29 0.5555702330183399 0.8314696123033888 0 -30 0.6343932841623059 0.7730104533638363 0 -31 0.7071067811852056 0.7071067811878894 0 -32 0.7730104533617078 0.6343932841648996 0 -33 0.8314696123017838 0.5555702330207417 0 -34 0.8819212643478248 0.4713967368269896 0 -35 0.9238795325109631 0.382683432365871 0 -36 0.9569403357320482 0.290284677254992 0 -37 0.9807852804031679 0.1950903220164424 0 -38 0.9951847266721896 0.09801714032963502 0 -39 0.9951847266722343 -0.09801714032917982 0 -40 0.9807852804033356 -0.1950903220155996 0 -41 0.9569403357324345 -0.2902846772537184 0 -42 0.9238795325116899 -0.3826834323641164 0 -43 0.8819212643489727 -0.4713967368248421 0 -44 0.8314696123033888 -0.5555702330183399 0 -45 0.7730104533638363 -0.6343932841623059 0 -46 0.7071067811878894 -0.7071067811852056 0 -47 0.6343932841648996 -0.7730104533617078 0 -48 0.5555702330207417 -0.8314696123017838 0 -49 0.4713967368269896 -0.8819212643478248 0 -50 0.382683432365871 -0.9238795325109631 0 -51 0.290284677254992 -0.9569403357320482 0 -52 0.1950903220164424 -0.9807852804031679 0 -53 0.09801714032963502 -0.9951847266721896 0 -54 -0.09801714032917982 -0.9951847266722343 0 -55 -0.1950903220155996 -0.9807852804033356 0 -56 -0.2902846772537184 -0.9569403357324345 0 -57 -0.3826834323641164 -0.9238795325116899 0 -58 -0.4713967368248421 -0.8819212643489727 0 -59 -0.5555702330183399 -0.8314696123033888 0 -60 -0.6343932841623059 -0.7730104533638363 0 -61 -0.7071067811852056 -0.7071067811878894 0 -62 -0.7730104533617078 -0.6343932841648996 0 -63 -0.8314696123017838 -0.5555702330207417 0 -64 -0.8819212643478248 -0.4713967368269896 0 -65 -0.9238795325109631 -0.382683432365871 0 -66 -0.9569403357320482 -0.290284677254992 0 -67 -0.9807852804031679 -0.1950903220164424 0 -68 -0.9951847266721896 -0.09801714032963502 0 -69 -0.9951847266722343 0.09801714032917982 0.1 -70 -0.9807852804033356 0.1950903220155996 0.1 -71 -0.9569403357324345 0.2902846772537184 0.1 -72 -0.9238795325116899 0.3826834323641164 0.1 -73 -0.8819212643489727 0.4713967368248421 0.1 -74 -0.8314696123033888 0.5555702330183399 0.1 -75 -0.7730104533638363 0.6343932841623059 0.1 -76 -0.7071067811878894 0.7071067811852056 0.1 -77 -0.6343932841648996 0.7730104533617078 0.1 -78 -0.5555702330207417 0.8314696123017838 0.1 -79 -0.4713967368269896 0.8819212643478248 0.1 -80 -0.382683432365871 0.9238795325109631 0.1 -81 -0.290284677254992 0.9569403357320482 0.1 -82 -0.1950903220164424 0.9807852804031679 0.1 -83 -0.09801714032963502 0.9951847266721896 0.1 -84 0.09801714032917982 0.9951847266722343 0.1 -85 0.1950903220155996 0.9807852804033356 0.1 -86 0.2902846772537184 0.9569403357324345 0.1 -87 0.3826834323641164 0.9238795325116899 0.1 -88 0.4713967368248421 0.8819212643489727 0.1 -89 0.5555702330183399 0.8314696123033888 0.1 -90 0.6343932841623059 0.7730104533638363 0.1 -91 0.7071067811852056 0.7071067811878894 0.1 -92 0.7730104533617078 0.6343932841648996 0.1 -93 0.8314696123017838 0.5555702330207417 0.1 -94 0.8819212643478248 0.4713967368269896 0.1 -95 0.9238795325109631 0.382683432365871 0.1 -96 0.9569403357320482 0.290284677254992 0.1 -97 0.9807852804031679 0.1950903220164424 0.1 -98 0.9951847266721896 0.09801714032963502 0.1 -99 0.9951847266722343 -0.09801714032917982 0.1 -100 0.9807852804033356 -0.1950903220155996 0.1 -101 0.9569403357324345 -0.2902846772537184 0.1 -102 0.9238795325116899 -0.3826834323641164 0.1 -103 0.8819212643489727 -0.4713967368248421 0.1 -104 0.8314696123033888 -0.5555702330183399 0.1 -105 0.7730104533638363 -0.6343932841623059 0.1 -106 0.7071067811878894 -0.7071067811852056 0.1 -107 0.6343932841648996 -0.7730104533617078 0.1 -108 0.5555702330207417 -0.8314696123017838 0.1 -109 0.4713967368269896 -0.8819212643478248 0.1 -110 0.382683432365871 -0.9238795325109631 0.1 -111 0.290284677254992 -0.9569403357320482 0.1 -112 0.1950903220164424 -0.9807852804031679 0.1 -113 0.09801714032963502 -0.9951847266721896 0.1 -114 -0.09801714032917982 -0.9951847266722343 0.1 -115 -0.1950903220155996 -0.9807852804033356 0.1 -116 -0.2902846772537184 -0.9569403357324345 0.1 -117 -0.3826834323641164 -0.9238795325116899 0.1 -118 -0.4713967368248421 -0.8819212643489727 0.1 -119 -0.5555702330183399 -0.8314696123033888 0.1 -120 -0.6343932841623059 -0.7730104533638363 0.1 -121 -0.7071067811852056 -0.7071067811878894 0.1 -122 -0.7730104533617078 -0.6343932841648996 0.1 -123 -0.8314696123017838 -0.5555702330207417 0.1 -124 -0.8819212643478248 -0.4713967368269896 0.1 -125 -0.9238795325109631 -0.382683432365871 0.1 -126 -0.9569403357320482 -0.290284677254992 0.1 -127 -0.9807852804031679 -0.1950903220164424 0.1 -128 -0.9951847266721896 -0.09801714032963502 0.1 +9 -0.9951847266502585 0.09801714055230534 0 +10 -0.9807852803038259 0.1950903225158687 0 +11 -0.9569403355024331 0.2902846780119318 0 +12 -0.9238795320817892 0.3826834334019886 0 +13 -0.8819212636904032 0.4713967380569389 0 +14 -0.8314696113679687 0.5555702344182949 0 +15 -0.7730104520841969 0.6343932857215511 0 +16 -0.7071067795733449 0.7071067827997501 0 +17 -0.634393282646958 0.7730104546074502 0 +18 -0.5555702316245595 0.8314696132346829 0 +19 -0.471396735522105 0.8819212650453002 0 +20 -0.3826834312318057 0.9238795329807084 0 +21 -0.2902846763682919 0.9569403360010258 0 +22 -0.1950903214145686 0.980785280522888 0 +23 -0.0980171400302339 0.995184726701678 0 +24 0.09801714055230534 0.9951847266502585 0 +25 0.1950903225158687 0.9807852803038259 0 +26 0.2902846780119318 0.9569403355024331 0 +27 0.3826834334019886 0.9238795320817892 0 +28 0.4713967380569389 0.8819212636904032 0 +29 0.5555702344182949 0.8314696113679687 0 +30 0.6343932857215511 0.7730104520841969 0 +31 0.7071067827997501 0.7071067795733449 0 +32 0.7730104546074502 0.634393282646958 0 +33 0.8314696132346829 0.5555702316245595 0 +34 0.8819212650453002 0.471396735522105 0 +35 0.9238795329807084 0.3826834312318057 0 +36 0.9569403360010258 0.2902846763682919 0 +37 0.980785280522888 0.1950903214145686 0 +38 0.995184726701678 0.0980171400302339 0 +39 0.9951847266502585 -0.09801714055230534 0 +40 0.9807852803038259 -0.1950903225158687 0 +41 0.9569403355024331 -0.2902846780119318 0 +42 0.9238795320817892 -0.3826834334019886 0 +43 0.8819212636904032 -0.4713967380569389 0 +44 0.8314696113679687 -0.5555702344182949 0 +45 0.7730104520841969 -0.6343932857215511 0 +46 0.7071067795733449 -0.7071067827997501 0 +47 0.634393282646958 -0.7730104546074502 0 +48 0.5555702316245595 -0.8314696132346829 0 +49 0.471396735522105 -0.8819212650453002 0 +50 0.3826834312318057 -0.9238795329807084 0 +51 0.2902846763682919 -0.9569403360010258 0 +52 0.1950903214145686 -0.980785280522888 0 +53 0.0980171400302339 -0.995184726701678 0 +54 -0.09801714055230534 -0.9951847266502585 0 +55 -0.1950903225158687 -0.9807852803038259 0 +56 -0.2902846780119318 -0.9569403355024331 0 +57 -0.3826834334019886 -0.9238795320817892 0 +58 -0.4713967380569389 -0.8819212636904032 0 +59 -0.5555702344182949 -0.8314696113679687 0 +60 -0.6343932857215511 -0.7730104520841969 0 +61 -0.7071067827997501 -0.7071067795733449 0 +62 -0.7730104546074502 -0.634393282646958 0 +63 -0.8314696132346829 -0.5555702316245595 0 +64 -0.8819212650453002 -0.471396735522105 0 +65 -0.9238795329807084 -0.3826834312318057 0 +66 -0.9569403360010258 -0.2902846763682919 0 +67 -0.980785280522888 -0.1950903214145686 0 +68 -0.995184726701678 -0.0980171400302339 0 +69 -0.9951847266502585 0.09801714055230534 0.1 +70 -0.9807852803038259 0.1950903225158687 0.1 +71 -0.9569403355024331 0.2902846780119318 0.1 +72 -0.9238795320817892 0.3826834334019886 0.1 +73 -0.8819212636904032 0.4713967380569389 0.1 +74 -0.8314696113679687 0.5555702344182949 0.1 +75 -0.7730104520841969 0.6343932857215511 0.1 +76 -0.7071067795733449 0.7071067827997501 0.1 +77 -0.634393282646958 0.7730104546074502 0.1 +78 -0.5555702316245595 0.8314696132346829 0.1 +79 -0.471396735522105 0.8819212650453002 0.1 +80 -0.3826834312318057 0.9238795329807084 0.1 +81 -0.2902846763682919 0.9569403360010258 0.1 +82 -0.1950903214145686 0.980785280522888 0.1 +83 -0.0980171400302339 0.995184726701678 0.1 +84 0.09801714055230534 0.9951847266502585 0.1 +85 0.1950903225158687 0.9807852803038259 0.1 +86 0.2902846780119318 0.9569403355024331 0.1 +87 0.3826834334019886 0.9238795320817892 0.1 +88 0.4713967380569389 0.8819212636904032 0.1 +89 0.5555702344182949 0.8314696113679687 0.1 +90 0.6343932857215511 0.7730104520841969 0.1 +91 0.7071067827997501 0.7071067795733449 0.1 +92 0.7730104546074502 0.634393282646958 0.1 +93 0.8314696132346829 0.5555702316245595 0.1 +94 0.8819212650453002 0.471396735522105 0.1 +95 0.9238795329807084 0.3826834312318057 0.1 +96 0.9569403360010258 0.2902846763682919 0.1 +97 0.980785280522888 0.1950903214145686 0.1 +98 0.995184726701678 0.0980171400302339 0.1 +99 0.9951847266502585 -0.09801714055230534 0.1 +100 0.9807852803038259 -0.1950903225158687 0.1 +101 0.9569403355024331 -0.2902846780119318 0.1 +102 0.9238795320817892 -0.3826834334019886 0.1 +103 0.8819212636904032 -0.4713967380569389 0.1 +104 0.8314696113679687 -0.5555702344182949 0.1 +105 0.7730104520841969 -0.6343932857215511 0.1 +106 0.7071067795733449 -0.7071067827997501 0.1 +107 0.634393282646958 -0.7730104546074502 0.1 +108 0.5555702316245595 -0.8314696132346829 0.1 +109 0.471396735522105 -0.8819212650453002 0.1 +110 0.3826834312318057 -0.9238795329807084 0.1 +111 0.2902846763682919 -0.9569403360010258 0.1 +112 0.1950903214145686 -0.980785280522888 0.1 +113 0.0980171400302339 -0.995184726701678 0.1 +114 -0.09801714055230534 -0.9951847266502585 0.1 +115 -0.1950903225158687 -0.9807852803038259 0.1 +116 -0.2902846780119318 -0.9569403355024331 0.1 +117 -0.3826834334019886 -0.9238795320817892 0.1 +118 -0.4713967380569389 -0.8819212636904032 0.1 +119 -0.5555702344182949 -0.8314696113679687 0.1 +120 -0.6343932857215511 -0.7730104520841969 0.1 +121 -0.7071067827997501 -0.7071067795733449 0.1 +122 -0.7730104546074502 -0.634393282646958 0.1 +123 -0.8314696132346829 -0.5555702316245595 0.1 +124 -0.8819212650453002 -0.471396735522105 0.1 +125 -0.9238795329807084 -0.3826834312318057 0.1 +126 -0.9569403360010258 -0.2902846763682919 0.1 +127 -0.980785280522888 -0.1950903214145686 0.1 +128 -0.995184726701678 -0.0980171400302339 0.1 129 -1 0 0.02 130 -1 0 0.04000000000000001 131 -1 0 0.06 @@ -147,2583 +147,2589 @@ $Nodes 142 0 -1 0.04000000000000001 143 0 -1 0.06 144 0 -1 0.08000000000000002 -145 0.03756306029641092 -0.02093446866751775 0 -146 0.4717784974923993 -0.02490808041101154 0 -147 -0.03852862222892565 -0.5106398982715344 0 -148 0.01745826490869877 0.4756782531760523 0 -149 -0.4991992942367677 -0.002747209135073027 0 -150 -0.3895380551416743 0.4115709446422399 0 -151 0.4460730547695202 0.3645630925462455 0 -152 0.3667139841427748 -0.4481162897424609 0 -153 -0.4359659455494101 -0.4016008317171993 0 -154 0.2752144976090569 0.1473320643758561 0 -155 -0.1652740533831175 0.2638313032138305 0 -156 0.1358823391562783 -0.2913065357419242 0 -157 -0.6426665832350795 0.2887729710070104 0 -158 0.293075152803309 0.6462358241085087 0 -159 0.645481545076644 -0.2934423659608753 0 -160 -0.2808700608021808 -0.6349347676940268 0 -161 -0.2312371538379003 0.67197272940937 0 -162 0.7070077408304654 0.2028286828581633 0 -163 0.1990756646981323 -0.705780651758859 0 -164 -0.6552526265249643 -0.2291356393218923 0 -165 0.7370416813050018 -0.0323880487297482 0 -166 -0.01007312301488713 -0.7499297198657263 0 -167 0.004233118916560361 0.7548984250302462 0 -168 -0.7422958609374829 0.03219982924355699 0 -169 -0.2378119664469096 0.01722296050754561 0 -170 0.27161521538255 -0.08523518342628889 0 -171 0.08584980778242617 0.2839475096018558 0 -172 -0.3808405777755483 -0.1849406693159914 0 -173 -0.3723461936529736 0.1966319143494792 0 -174 -0.6031947462785038 0.4727711882503794 0 -175 0.5162949590880913 0.5914758385178045 0 -176 0.5920878098522259 -0.51679985685799 0 -177 -0.5129774283587911 -0.5875519916829098 0 -178 -0.4263041114025644 0.6556723249958001 0 -179 0.6672471386365406 0.4659580270351875 0 -180 0.4663873700531773 -0.6677310103174087 0 -181 -0.6479542242062676 -0.4489260662706759 0 -182 0.4091505945967308 -0.2041168478006838 0 -183 0.2034571166068496 0.4122289302070589 0 -184 -0.2147270819573788 -0.4573666667268824 0 -185 0.4969166933618057 0.1757459476004287 0 -186 0.2027047708021964 -0.4890073439589892 0 -187 -0.1536557615163792 0.4535832094628838 0 -188 -0.009743727202841938 -0.3500084148164871 0 -189 -0.823597263543015 0.1811518920157068 0 -190 0.1789428062342819 0.8266336840954982 0 -191 0.8047841126731803 -0.1808380146892324 0 -192 -0.1895032565702806 -0.8273213509093948 0 -193 -0.1294880785920715 0.8290719054824465 0 -194 0.8009311167265003 0.1256412191505321 0 -195 0.1257927913827351 -0.802562868982628 0 -196 -0.8204330428923108 -0.1613657335275316 0 -197 -0.0790943930006117 -0.17068306722752 0 -198 -0.02199391310075206 0.194943590783138 0 -199 0.1400710230706294 0.01925663180423098 0 -200 -0.7311124087878886 0.4280563822694354 0 -201 0.4076469448163015 0.7357641759548181 0 -202 0.7345089649697516 -0.4081201462112941 0 -203 -0.4036184171460266 -0.7376650375477497 0 -204 -0.3381285885860201 0.7691726317410515 0 -205 0.7711957557164628 0.3334242122860396 0 -206 0.3331894292058933 -0.7714645933713635 0 -207 -0.7653226123121951 -0.3581131418827533 0 -208 -0.546930555803006 -0.132800021577047 0 -209 0.6118659137082836 -0.1075080319861763 0 -210 -0.1296951276148151 -0.6128472400119508 0 -211 0.1369483605942518 0.6221186496019506 0 -212 -0.641710880419295 0.1090802591991031 0 -213 0.6148798164141557 0.07355404173479176 0 -214 0.0469820303108977 -0.6323667922308401 0 -215 -0.05185856153157737 0.6340766973433336 0 -216 0.3057036788152149 0.2723789797201044 0 -217 0.2731069792877739 -0.3175337402858784 0 -218 -0.4684804775508656 0.3351144626898162 0 -219 -0.5351246134763195 -0.261208979745711 0 -220 -0.01892219538805212 0.3894321594473692 0 -221 0.3833366726461777 0.01534006368643153 0 -222 -0.3085211536290005 -0.3105829195453509 0 -223 -0.1663024721198338 -0.07772147510349153 0 -224 0.3621732754311218 0.5103233921898143 0 -225 0.5124070353603776 -0.3633750557512553 0 -226 -0.3580181609175846 -0.5165209282323437 0 -227 -0.3024547537984817 0.5467570942006423 0 -228 0.5434030071622173 0.3398085175284811 0 -229 0.3412263502806463 -0.5440226347822177 0 -230 0.1427909787838089 -0.09417538405911514 0 -231 -0.5663922685314257 0.6425754721707017 0 -232 0.6282900774874124 0.5777681321272297 0 -233 0.5780377585191204 -0.6285274660788117 0 -234 -0.6231131190450461 -0.573868228879201 0 -235 -0.6590539041252332 -0.05499729333104572 0 -236 -0.3647422845064503 -0.03507149787757582 0 -237 -0.2254924746200966 0.1787614208253395 0 -238 0.1050234704128963 0.1624012712872464 0 -239 -0.1329773886914627 0.07944681520979355 0 -240 -0.518455292474102 0.1999562692103366 0 -241 -0.8777355500062206 0.1031055213213803 0 -242 0.06803670459116642 0.8413820703684696 0 -243 0.8634244194224607 -0.07110194992195185 0 -244 -0.07121209647875529 -0.8639554548972228 0 -245 -0.4771655939180982 0.5314707538740274 0 -246 0.5072613652802174 0.4562492667112779 0 -247 0.4577941758260904 -0.5085539913241318 0 -248 0.07849340518994517 0.395490257991046 0 -249 0.3907476688564666 -0.07945627887879825 0 -250 -0.1202872187579756 -0.4375289673591386 0 -251 0.03444001021364659 -0.4319547458830146 0 -252 -0.3725609470319531 0.08959323598478858 0 -253 -0.2826464467832236 -0.1430461109708211 0 -254 -0.8408438148768203 0.3038013548530046 0 -255 0.351228889949187 0.8257505215600353 0 -256 0.8223404218233199 -0.3520198013927796 0 -257 -0.348706369474017 -0.8249278871031077 0 -258 -0.2775517435119676 0.8509733807337551 0 -259 0.8536829037897484 0.243720026876074 0 -260 0.2434247277543624 -0.8539466871977011 0 -261 -0.8627168884831342 -0.2533316685384274 0 -262 0.1974725576933337 0.2744378051418535 0 -263 0.2524148593535875 -0.198771987733323 0 -264 -0.4854883131142653 0.7457220906583607 0 -265 0.7591277353994388 0.5028439303284484 0 -266 0.5029253644977369 -0.7592621410337915 0 -267 -0.7647672911111083 -0.4674543772749559 0 -268 -0.7108361793314534 0.5254634771313555 0 -269 0.5342656219837573 0.7117378556409467 0 -270 0.7116540461975485 -0.5344260626000876 0 -271 -0.5330506322892616 -0.7120032950176953 0 -272 0.9150414785819491 0.01626100262132995 0 -273 0.0168197995996419 -0.9155771050154591 0 -274 -0.05350908974080526 0.9151953275153393 0 -275 -0.8901615806910763 -0.0433805318403859 0 -276 0.2147677259148433 0.5698932509556739 0 -277 0.5647887066986577 -0.2120278627447944 0 -278 -0.5757671858882061 0.3936411221794321 0 -279 -0.6070323526085064 -0.3109178609707977 0 -280 -0.4096256734583312 -0.2809930040728906 0 -281 -0.2110480791535164 -0.5460554661904444 0 -282 0.5264780395750118 0.06874829613321352 0 -283 -0.09339557691895344 0.5095184410983614 0 -284 0.1409715130134561 -0.5824566884795823 0 -285 0.4250953470729131 0.2534863589530039 0 -286 0.2607674988127206 -0.4294567986325282 0 -287 -0.5962435801721753 0.02177650693100434 0 -288 0.3543799131986165 0.2008389525262718 0 -289 0.2050244252436291 -0.3697654746143469 0 -290 0.3911056953167414 0.6195981550639392 0 -291 0.6210850838019899 -0.3921697392321514 0 -292 -0.3793846915294252 -0.5948869561524985 0 -293 -0.3266134346837702 0.6581666973346364 0 -294 0.6699093482451687 0.329271236138755 0 -295 0.3288731630542405 -0.669907566319805 0 -296 -0.2745762489355235 0.4330540180843155 0 -297 0.3313195231713995 0.3949050141693721 0 -298 0.395427680824704 -0.3342230814466719 0 -299 0.6029887232638651 0.1605941325141005 0 -300 -0.158230445589056 0.5891332823906208 0 -301 -0.3246331599733343 -0.4160665096979641 0 -302 0.01385141188671195 -0.2671072870111226 0 -303 -0.03147662884905398 0.281533647774432 0 -304 0.2667882956404315 0.02536235504018402 0 -305 -0.1986604585418896 0.3868511452052981 0 -306 -0.3696449774910689 0.3114268201399531 0 -307 -0.2344405688441173 -0.3532254518328403 0 -308 0.6993377794783857 -0.1415398440126267 0 -309 -0.1238206489616964 -0.700517702832118 0 -310 0.1373233247404103 0.7242512962695071 0 -311 -0.7263487332761797 0.1153887086184411 0 -312 0.7024971252519646 0.08267563104139442 0 -313 0.07736683597355803 -0.709023865972092 0 -314 -0.08638177708908419 0.7232802735362753 0 -315 -0.4782994778060585 0.4302448821838745 0 -316 0.1169512531531725 0.4869059176068478 0 -317 0.4790867050754448 -0.1184475504002031 0 -318 -0.1252851620567597 -0.5262213943342389 0 -319 0.05717581322842313 -0.5044143803136956 0 -320 -0.5590519308461908 -0.3860630008521712 0 -321 -0.1150418949277563 0.1539988247904993 0 -322 0.625740041369007 -0.01898109204536381 0 -323 -0.03317037890731243 -0.6688942094680634 0 -324 0.03624433566558084 0.6730118549863521 0 -325 -0.2603602255713895 -0.06027892483867578 0 -326 -0.06710066711579087 -0.08893426543085253 0 -327 -0.4573870695037332 -0.07642760186582892 0 -328 -0.09564073712273591 -0.2573381514755134 0 -329 0.1400109526938527 0.3452526017721837 0 -330 0.3361492571141538 -0.1404719131497 0 -331 -0.5876433989377084 0.7113331346157019 0 -332 0.7182531413760752 0.5730427977930983 0 -333 0.5731253148319749 -0.7183424706146012 0 -334 -0.7267637888520205 -0.5521997695027439 0 -335 -0.6501122839396156 0.6284622386129644 0 -336 0.6261338336978031 0.6753788591518668 0 -337 0.6754268178891599 -0.6262038638839817 0 -338 -0.6247774023037141 -0.6752677848129451 0 -339 0.05961375655305829 0.05433076127850857 0 -340 -0.4533454490453802 -0.196936480116006 0 -341 0.07158624384248355 -0.379769591245705 0 -342 -0.7358296271717679 0.2871230360154149 0 -343 0.2742396572924233 0.7517700822479314 0 -344 0.7436450706181265 -0.2750690386147977 0 -345 -0.2432002687080442 -0.7366468062073843 0 -346 -0.2119625161807704 0.7684636695715725 0 -347 -0.7420287683091251 -0.1960377794221552 0 -348 0.2078480314046554 -0.03108453521993102 0 -349 -0.7623744926063392 -0.07374826076866341 0 -350 -0.909714444924309 0.1962016670549832 0 -351 0.196878670604156 0.9276089183973528 0 -352 0.9193957067130305 -0.1962984183531116 0 -353 -0.1997934070668995 -0.923321303029304 0 -354 -0.1192602115718688 0.9075770128178854 0 -355 0.9102749207305986 0.107494640156683 0 -356 0.1078427730155398 -0.9107691188307522 0 -357 -0.9047070132952686 -0.1254546072148296 0 -358 0.03289221532974201 -0.09665339993729041 0 -359 -0.6339771303171474 0.1989722782787046 0 -360 -0.2825586775368157 0.09219772267569844 0 -361 -0.1120676417551462 -0.3482995528674908 0 -362 -0.5764632137055026 -0.2101910176660774 0 -363 0.1041409808248331 -0.02940891186701775 0 -364 -0.3059507321927566 0.2524534980281406 0 -365 -0.03067866374111903 -0.4334518599590248 0 -366 -0.7721004376432828 0.4777513885211878 0 -367 0.4820252404437138 0.780162643954427 0 -368 0.7796091221420068 -0.4822688004229307 0 -369 -0.4809833399183051 -0.7803828576843836 0 -370 -0.4087448112792932 0.8200465835534014 0 -371 0.8002865935476932 0.4281836062087549 0 -372 0.4281928958874004 -0.8004453282351094 0 -373 -0.8344702347942566 -0.431935076849929 0 -374 -0.5449938075776911 0.08085138723857922 0 -375 -0.1036385592557349 0.4200407985042778 0 -376 0.4059447738493815 0.1254769569297251 0 -377 -0.1480365604421043 0.002340056667267008 0 -378 0.4435118176807452 0.5462711800987253 0 -379 0.5481423609560856 -0.444702129821462 0 -380 -0.4501631950861821 -0.5270557191543739 0 -381 -0.4247568760849733 0.5096373509841007 0 -382 0.4988201351912681 0.3841490403209035 0 -383 0.3859265328060342 -0.5001732242911401 0 -384 0.1997661751917058 0.08583574604225598 0 -385 -0.2997409692737895 -0.490908174504708 0 -386 0.2526718728084643 -0.5230506066767192 0 -387 -0.5764312502826053 -0.03692554837926267 0 -388 0.233317559360037 0.6745601648264888 0 -389 0.6664834809029515 -0.2317937327447079 0 -390 -0.2172157307211868 -0.6308083555875714 0 -391 -0.1729333115087907 0.6911077680080351 0 -392 0.671980368914682 0.1502079082329276 0 -393 0.1408397166201512 -0.6705572836873781 0 -394 0.2773272845560157 0.4690803297873597 0 -395 0.4685969294965288 -0.2785336807628994 0 -396 0.5264882656905799 0.2476519001455232 0 -397 0.1358362248963335 -0.1899752134225425 0 -398 -0.6584505608993372 0.3710092945353671 0 -399 0.02775643679018649 0.2312244083777829 0 -400 -0.035369291719122 0.0692857418446034 0 -401 -0.7283330523393017 0.1989359825089343 0 -402 0.02803555178491281 0.4215173175592299 0 -403 0.4172254733843679 -0.03095085732469068 0 -404 -0.5531542396079592 0.5703748075432478 0 -405 -0.2233020411609802 0.5024859737199666 0 -406 -0.2212601963844741 0.08942363684758572 0 -407 0.549376261754289 -0.08148282591001121 0 -408 -0.04231427324180136 -0.5913297424500011 0 -409 0.0725037981604873 0.5892004017059468 0 -410 -0.3591430595110624 0.8665004124274038 0 -411 0.8343808092508768 0.3491396519037765 0 -412 0.3490014339920512 -0.8345450539496075 0 -413 -0.8455494643298137 -0.3622401242500555 0 -414 -0.8108956770324737 0.4052978005386882 0 -415 0.4391324951811535 0.8296031461190513 0 -416 0.8286770874347554 -0.4394358472307961 0 -417 -0.4381482979571988 -0.8296944782760699 0 -418 0.9196395491480548 -0.04889650790274243 0 -419 -0.04888861491479355 -0.9203381901848371 0 -420 0.04106626710905541 0.9181987594861903 0 -421 -0.9181231607368404 0.05673640264366658 0 -422 -0.4306746377266381 0.2616975499548028 0 -423 -0.3189848618778681 -0.234485804771236 0 -424 -0.703576291382104 -0.2848750589314329 0 -425 -0.6831740336737175 -0.3467728689088223 0 -426 -0.6776336270939101 0.4472363103286253 0 -427 0.8311384623550437 0.01015308251562548 0 -428 0.01299828530500507 -0.8326571797651593 0 -429 -0.025132545105463 0.8347230416713295 0 -430 0.3403081250555418 0.6872880204304391 0 -431 0.6857575313013643 -0.3410204422452798 0 -432 -0.3329818888151 -0.70054125787045 0 -433 -0.2753392895102883 0.716238531094035 0 -434 0.7474057402732359 0.2772263054801198 0 -435 0.2763713755837198 -0.747361843857577 0 -436 0.4617302352672168 0.6641000163382851 0 -437 0.6641755837987446 -0.462212035469022 0 -438 -0.4584144402846274 -0.6600817508765464 0 -439 -0.3928163526354655 0.7039129685139371 0 -440 0.7294991524264004 0.3854010828019568 0 -441 0.3853629890688207 -0.7297691905569295 0 -442 -0.0828478864105468 0.222787057711827 0 -443 0.2237235225184439 -0.2707048071622312 0 -444 0.3363303964504248 -0.2651986651500947 0 -445 0.2586737271877743 0.3397244032112927 0 -446 0.3770982996489567 0.3222179808712004 0 -447 0.3243809176449824 -0.3822680017017484 0 -448 0.3327262017821993 0.07817155868686239 0 -449 0.5425497768767584 -0.01734534175699794 0 -450 -0.01396045536158918 0.5512496575805828 0 -451 -0.5512651160614166 0.3076523146195421 0 -452 -0.7163852872670544 -0.1396422161982286 0 -453 -0.6511422473993753 -0.1359071396149372 0 -454 -0.2042242108415093 -0.2485075156706113 0 -455 -0.2468751991455828 0.3173863441431322 0 -456 0.3017869585304819 -0.4881825219737158 0 -457 -0.1030402550787832 0.3499083778867725 0 -458 0.3270211387810611 -0.03121154280665032 0 -459 0.02727508435104043 0.3369905382921691 0 -460 -0.2578249858272362 0.6182155773360569 0 -461 0.6061696451656114 0.2572709168094842 0 -462 -0.4318218663118083 0.1398381052134658 0 -463 -0.9205186074618348 0.1366894840511481 0 -464 0.1506053976324923 0.9178021341169079 0 -465 0.8961617825212087 -0.1412708049913559 0 -466 -0.1445920171026402 -0.8993514124303486 0 -467 0.5875350688548576 -0.3176646077228484 0 -468 0.3107398266737773 0.5743105207625626 0 -469 0.0215285107957243 -0.5792545448201298 0 -470 -0.8183358037921321 0.05809053621261764 0 -471 -0.3660491832059855 -0.1289731166193481 0 -472 -0.6511366897577591 0.6830709418777637 0 -473 0.6686280648860022 0.6362368024514752 0 -474 0.6363155520610249 -0.6687063593393362 0 -475 -0.6680603702042858 -0.6321668587665613 0 -476 0.02769532188719278 -0.1809798170660305 0 -477 0.8044144611153137 -0.09385616407477533 0 -478 -0.1002863638630045 -0.7852101999905228 0 -479 0.06870526471661453 0.7758573409478231 0 -480 -0.7867498094787946 0.1161645029703253 0 -481 -0.3907157361541361 -0.4680680653996436 0 -482 -0.2893241395812635 -0.5707646901788088 0 -483 0.2561513611091514 -0.6027654634273024 0 -484 -0.4841285488756676 -0.331212121059707 0 -485 -0.41035322793612 0.3541633250263723 0 -486 -0.3654807829429786 -0.3498455739180449 0 -487 0.4080435269900474 0.4324779728220703 0 -488 0.4339502900149312 -0.4099232310603246 0 -489 -0.3924975512659823 0.5931502331897853 0 -490 0.5989929827374207 0.3937454361019145 0 -491 0.3944019080138368 -0.5994397262004321 0 -492 -0.4871370735134125 0.653385648932151 0 -493 0.6710715855360113 0.5418687690565018 0 -494 0.5421353608160783 -0.6713299701740467 0 -495 -0.6665608639534191 -0.5291225418108081 0 -496 -0.3194860514249929 0.36885599465078 0 -497 -0.3121988124129413 0.04460383481307665 0 -498 0.1306023701377939 0.2475632241635774 0 -499 -0.4293564094573099 0.03972846391576743 0 -500 0.4879081786416791 0.2969280465148749 0 -501 -0.05320371329411603 -0.009659407080246684 0 -502 -0.6577428723468374 0.02540735873934022 0 -503 -0.1842366086518172 -0.1604188104733459 0 -504 -0.9042717039943147 0.2604669003446903 0 -505 0.2534009727067292 0.8872303433587414 0 -506 0.879485847683671 -0.2534884627103633 0 -507 -0.2540536016905275 -0.8838698627750295 0 -508 -0.2023131121857017 0.8840239738062975 0 -509 0.9159608545231839 0.1786551861801368 0 -510 0.1786954499012877 -0.9162855689932536 0 -511 -0.9188532323694281 -0.1886018490274433 0 -512 0.226029674240702 0.2157176894791872 0 -513 0.2240314634922111 -0.124647710263943 0 -514 -0.6318326364397403 0.5515572359157516 0 -515 0.5793539672022744 0.6413232820841559 0 -516 0.6415316364092868 -0.5795931917484853 0 -517 -0.5764588254413486 -0.640012685369551 0 -518 0.1377546984813269 -0.4339063387353258 0 -519 -0.02209326306719091 0.1449551558571982 0 -520 -0.3150939235960785 0.1368642893014297 0 -521 -0.466900808070744 0.09003406461315078 0 -522 -0.7419738530354105 0.3535618685369996 0 -523 -0.7632972713564267 -0.2734702965429466 0 -524 -0.4806778814717604 0.5839008529212468 0 -525 0.5779479113575234 0.5244590282321654 0 -526 0.5252194168129798 -0.5785686771437204 0 -527 -0.5691077666073547 -0.5183984890058063 0 -528 -0.4263000086588776 -0.1284501041782039 0 -529 0.4473086990931153 0.04841531432543322 0 -530 -0.05321214679547854 0.4472234736699625 0 -531 -0.3498104304433999 0.475653056603885 0 -532 -0.5052068046863671 -0.4586317500222058 0 -533 -0.5282901268025465 0.5035158489667795 0 -534 -0.9951847266722343 0.09801714032917982 0.02 -535 -0.9951847266722343 0.09801714032917982 0.04000000000000001 -536 -0.9951847266722343 0.09801714032917982 0.06 -537 -0.9951847266722343 0.09801714032917982 0.08000000000000002 -538 -0.9807852804033356 0.1950903220155996 0.02 -539 -0.9807852804033356 0.1950903220155996 0.04000000000000001 -540 -0.9807852804033356 0.1950903220155996 0.06 -541 -0.9807852804033356 0.1950903220155996 0.08000000000000002 -542 -0.9569403357324345 0.2902846772537184 0.02 -543 -0.9569403357324345 0.2902846772537184 0.04000000000000001 -544 -0.9569403357324345 0.2902846772537184 0.06 -545 -0.9569403357324345 0.2902846772537184 0.08000000000000002 -546 -0.9238795325116899 0.3826834323641164 0.02 -547 -0.9238795325116899 0.3826834323641164 0.04000000000000001 -548 -0.9238795325116899 0.3826834323641164 0.06 -549 -0.9238795325116899 0.3826834323641164 0.08000000000000002 -550 -0.8819212643489727 0.4713967368248421 0.02 -551 -0.8819212643489727 0.4713967368248421 0.04000000000000001 -552 -0.8819212643489727 0.4713967368248421 0.06 -553 -0.8819212643489727 0.4713967368248421 0.08000000000000002 -554 -0.8314696123033888 0.5555702330183399 0.02 -555 -0.8314696123033888 0.5555702330183399 0.04000000000000001 -556 -0.8314696123033888 0.5555702330183399 0.06 -557 -0.8314696123033888 0.5555702330183399 0.08000000000000002 -558 -0.7730104533638363 0.6343932841623059 0.02 -559 -0.7730104533638363 0.6343932841623059 0.04000000000000001 -560 -0.7730104533638363 0.6343932841623059 0.06 -561 -0.7730104533638363 0.6343932841623059 0.08000000000000002 -562 -0.7071067811878894 0.7071067811852056 0.02 -563 -0.7071067811878894 0.7071067811852056 0.04000000000000001 -564 -0.7071067811878894 0.7071067811852056 0.06 -565 -0.7071067811878894 0.7071067811852056 0.08000000000000002 -566 -0.6343932841648996 0.7730104533617078 0.02 -567 -0.6343932841648996 0.7730104533617078 0.04000000000000001 -568 -0.6343932841648996 0.7730104533617078 0.06 -569 -0.6343932841648996 0.7730104533617078 0.08000000000000002 -570 -0.5555702330207417 0.8314696123017838 0.02 -571 -0.5555702330207417 0.8314696123017838 0.04000000000000001 -572 -0.5555702330207417 0.8314696123017838 0.06 -573 -0.5555702330207417 0.8314696123017838 0.08000000000000002 -574 -0.4713967368269896 0.8819212643478248 0.02 -575 -0.4713967368269896 0.8819212643478248 0.04000000000000001 -576 -0.4713967368269896 0.8819212643478248 0.06 -577 -0.4713967368269896 0.8819212643478248 0.08000000000000002 -578 -0.382683432365871 0.9238795325109631 0.02 -579 -0.382683432365871 0.9238795325109631 0.04000000000000001 -580 -0.382683432365871 0.9238795325109631 0.06 -581 -0.382683432365871 0.9238795325109631 0.08000000000000002 -582 -0.290284677254992 0.9569403357320482 0.02 -583 -0.290284677254992 0.9569403357320482 0.04000000000000001 -584 -0.290284677254992 0.9569403357320482 0.06 -585 -0.290284677254992 0.9569403357320482 0.08000000000000002 -586 -0.1950903220164424 0.9807852804031679 0.02 -587 -0.1950903220164424 0.9807852804031679 0.04000000000000001 -588 -0.1950903220164424 0.9807852804031679 0.06 -589 -0.1950903220164424 0.9807852804031679 0.08000000000000002 -590 -0.09801714032963502 0.9951847266721896 0.02 -591 -0.09801714032963502 0.9951847266721896 0.04000000000000001 -592 -0.09801714032963502 0.9951847266721896 0.06 -593 -0.09801714032963502 0.9951847266721896 0.08000000000000002 -594 0.09801714032917982 0.9951847266722343 0.02 -595 0.09801714032917982 0.9951847266722343 0.04000000000000001 -596 0.09801714032917982 0.9951847266722343 0.06 -597 0.09801714032917982 0.9951847266722343 0.08000000000000002 -598 0.1950903220155996 0.9807852804033356 0.02 -599 0.1950903220155996 0.9807852804033356 0.04000000000000001 -600 0.1950903220155996 0.9807852804033356 0.06 -601 0.1950903220155996 0.9807852804033356 0.08000000000000002 -602 0.2902846772537184 0.9569403357324345 0.02 -603 0.2902846772537184 0.9569403357324345 0.04000000000000001 -604 0.2902846772537184 0.9569403357324345 0.06 -605 0.2902846772537184 0.9569403357324345 0.08000000000000002 -606 0.3826834323641164 0.9238795325116899 0.02 -607 0.3826834323641164 0.9238795325116899 0.04000000000000001 -608 0.3826834323641164 0.9238795325116899 0.06 -609 0.3826834323641164 0.9238795325116899 0.08000000000000002 -610 0.4713967368248421 0.8819212643489727 0.02 -611 0.4713967368248421 0.8819212643489727 0.04000000000000001 -612 0.4713967368248421 0.8819212643489727 0.06 -613 0.4713967368248421 0.8819212643489727 0.08000000000000002 -614 0.5555702330183399 0.8314696123033888 0.02 -615 0.5555702330183399 0.8314696123033888 0.04000000000000001 -616 0.5555702330183399 0.8314696123033888 0.06 -617 0.5555702330183399 0.8314696123033888 0.08000000000000002 -618 0.6343932841623059 0.7730104533638363 0.02 -619 0.6343932841623059 0.7730104533638363 0.04000000000000001 -620 0.6343932841623059 0.7730104533638363 0.06 -621 0.6343932841623059 0.7730104533638363 0.08000000000000002 -622 0.7071067811852056 0.7071067811878894 0.02 -623 0.7071067811852056 0.7071067811878894 0.04000000000000001 -624 0.7071067811852056 0.7071067811878894 0.06 -625 0.7071067811852056 0.7071067811878894 0.08000000000000002 -626 0.7730104533617078 0.6343932841648996 0.02 -627 0.7730104533617078 0.6343932841648996 0.04000000000000001 -628 0.7730104533617078 0.6343932841648996 0.06 -629 0.7730104533617078 0.6343932841648996 0.08000000000000002 -630 0.8314696123017838 0.5555702330207417 0.02 -631 0.8314696123017838 0.5555702330207417 0.04000000000000001 -632 0.8314696123017838 0.5555702330207417 0.06 -633 0.8314696123017838 0.5555702330207417 0.08000000000000002 -634 0.8819212643478248 0.4713967368269896 0.02 -635 0.8819212643478248 0.4713967368269896 0.04000000000000001 -636 0.8819212643478248 0.4713967368269896 0.06 -637 0.8819212643478248 0.4713967368269896 0.08000000000000002 -638 0.9238795325109631 0.382683432365871 0.02 -639 0.9238795325109631 0.382683432365871 0.04000000000000001 -640 0.9238795325109631 0.382683432365871 0.06 -641 0.9238795325109631 0.382683432365871 0.08000000000000002 -642 0.9569403357320482 0.290284677254992 0.02 -643 0.9569403357320482 0.290284677254992 0.04000000000000001 -644 0.9569403357320482 0.290284677254992 0.06 -645 0.9569403357320482 0.290284677254992 0.08000000000000002 -646 0.9807852804031679 0.1950903220164424 0.02 -647 0.9807852804031679 0.1950903220164424 0.04000000000000001 -648 0.9807852804031679 0.1950903220164424 0.06 -649 0.9807852804031679 0.1950903220164424 0.08000000000000002 -650 0.9951847266721896 0.09801714032963502 0.02 -651 0.9951847266721896 0.09801714032963502 0.04000000000000001 -652 0.9951847266721896 0.09801714032963502 0.06 -653 0.9951847266721896 0.09801714032963502 0.08000000000000002 -654 0.9951847266722343 -0.09801714032917982 0.02 -655 0.9951847266722343 -0.09801714032917982 0.04000000000000001 -656 0.9951847266722343 -0.09801714032917982 0.06 -657 0.9951847266722343 -0.09801714032917982 0.08000000000000002 -658 0.9807852804033356 -0.1950903220155996 0.02 -659 0.9807852804033356 -0.1950903220155996 0.04000000000000001 -660 0.9807852804033356 -0.1950903220155996 0.06 -661 0.9807852804033356 -0.1950903220155996 0.08000000000000002 -662 0.9569403357324345 -0.2902846772537184 0.02 -663 0.9569403357324345 -0.2902846772537184 0.04000000000000001 -664 0.9569403357324345 -0.2902846772537184 0.06 -665 0.9569403357324345 -0.2902846772537184 0.08000000000000002 -666 0.9238795325116899 -0.3826834323641164 0.02 -667 0.9238795325116899 -0.3826834323641164 0.04000000000000001 -668 0.9238795325116899 -0.3826834323641164 0.06 -669 0.9238795325116899 -0.3826834323641164 0.08000000000000002 -670 0.8819212643489727 -0.4713967368248421 0.02 -671 0.8819212643489727 -0.4713967368248421 0.04000000000000001 -672 0.8819212643489727 -0.4713967368248421 0.06 -673 0.8819212643489727 -0.4713967368248421 0.08000000000000002 -674 0.8314696123033888 -0.5555702330183399 0.02 -675 0.8314696123033888 -0.5555702330183399 0.04000000000000001 -676 0.8314696123033888 -0.5555702330183399 0.06 -677 0.8314696123033888 -0.5555702330183399 0.08000000000000002 -678 0.7730104533638363 -0.6343932841623059 0.02 -679 0.7730104533638363 -0.6343932841623059 0.04000000000000001 -680 0.7730104533638363 -0.6343932841623059 0.06 -681 0.7730104533638363 -0.6343932841623059 0.08000000000000002 -682 0.7071067811878894 -0.7071067811852056 0.02 -683 0.7071067811878894 -0.7071067811852056 0.04000000000000001 -684 0.7071067811878894 -0.7071067811852056 0.06 -685 0.7071067811878894 -0.7071067811852056 0.08000000000000002 -686 0.6343932841648996 -0.7730104533617078 0.02 -687 0.6343932841648996 -0.7730104533617078 0.04000000000000001 -688 0.6343932841648996 -0.7730104533617078 0.06 -689 0.6343932841648996 -0.7730104533617078 0.08000000000000002 -690 0.5555702330207417 -0.8314696123017838 0.02 -691 0.5555702330207417 -0.8314696123017838 0.04000000000000001 -692 0.5555702330207417 -0.8314696123017838 0.06 -693 0.5555702330207417 -0.8314696123017838 0.08000000000000002 -694 0.4713967368269896 -0.8819212643478248 0.02 -695 0.4713967368269896 -0.8819212643478248 0.04000000000000001 -696 0.4713967368269896 -0.8819212643478248 0.06 -697 0.4713967368269896 -0.8819212643478248 0.08000000000000002 -698 0.382683432365871 -0.9238795325109631 0.02 -699 0.382683432365871 -0.9238795325109631 0.04000000000000001 -700 0.382683432365871 -0.9238795325109631 0.06 -701 0.382683432365871 -0.9238795325109631 0.08000000000000002 -702 0.290284677254992 -0.9569403357320482 0.02 -703 0.290284677254992 -0.9569403357320482 0.04000000000000001 -704 0.290284677254992 -0.9569403357320482 0.06 -705 0.290284677254992 -0.9569403357320482 0.08000000000000002 -706 0.1950903220164424 -0.9807852804031679 0.02 -707 0.1950903220164424 -0.9807852804031679 0.04000000000000001 -708 0.1950903220164424 -0.9807852804031679 0.06 -709 0.1950903220164424 -0.9807852804031679 0.08000000000000002 -710 0.09801714032963502 -0.9951847266721896 0.02 -711 0.09801714032963502 -0.9951847266721896 0.04000000000000001 -712 0.09801714032963502 -0.9951847266721896 0.06 -713 0.09801714032963502 -0.9951847266721896 0.08000000000000002 -714 -0.09801714032917982 -0.9951847266722343 0.02 -715 -0.09801714032917982 -0.9951847266722343 0.04000000000000001 -716 -0.09801714032917982 -0.9951847266722343 0.06 -717 -0.09801714032917982 -0.9951847266722343 0.08000000000000002 -718 -0.1950903220155996 -0.9807852804033356 0.02 -719 -0.1950903220155996 -0.9807852804033356 0.04000000000000001 -720 -0.1950903220155996 -0.9807852804033356 0.06 -721 -0.1950903220155996 -0.9807852804033356 0.08000000000000002 -722 -0.2902846772537184 -0.9569403357324345 0.02 -723 -0.2902846772537184 -0.9569403357324345 0.04000000000000001 -724 -0.2902846772537184 -0.9569403357324345 0.06 -725 -0.2902846772537184 -0.9569403357324345 0.08000000000000002 -726 -0.3826834323641164 -0.9238795325116899 0.02 -727 -0.3826834323641164 -0.9238795325116899 0.04000000000000001 -728 -0.3826834323641164 -0.9238795325116899 0.06 -729 -0.3826834323641164 -0.9238795325116899 0.08000000000000002 -730 -0.4713967368248421 -0.8819212643489727 0.02 -731 -0.4713967368248421 -0.8819212643489727 0.04000000000000001 -732 -0.4713967368248421 -0.8819212643489727 0.06 -733 -0.4713967368248421 -0.8819212643489727 0.08000000000000002 -734 -0.5555702330183399 -0.8314696123033888 0.02 -735 -0.5555702330183399 -0.8314696123033888 0.04000000000000001 -736 -0.5555702330183399 -0.8314696123033888 0.06 -737 -0.5555702330183399 -0.8314696123033888 0.08000000000000002 -738 -0.6343932841623059 -0.7730104533638363 0.02 -739 -0.6343932841623059 -0.7730104533638363 0.04000000000000001 -740 -0.6343932841623059 -0.7730104533638363 0.06 -741 -0.6343932841623059 -0.7730104533638363 0.08000000000000002 -742 -0.7071067811852056 -0.7071067811878894 0.02 -743 -0.7071067811852056 -0.7071067811878894 0.04000000000000001 -744 -0.7071067811852056 -0.7071067811878894 0.06 -745 -0.7071067811852056 -0.7071067811878894 0.08000000000000002 -746 -0.7730104533617078 -0.6343932841648996 0.02 -747 -0.7730104533617078 -0.6343932841648996 0.04000000000000001 -748 -0.7730104533617078 -0.6343932841648996 0.06 -749 -0.7730104533617078 -0.6343932841648996 0.08000000000000002 -750 -0.8314696123017838 -0.5555702330207417 0.02 -751 -0.8314696123017838 -0.5555702330207417 0.04000000000000001 -752 -0.8314696123017838 -0.5555702330207417 0.06 -753 -0.8314696123017838 -0.5555702330207417 0.08000000000000002 -754 -0.8819212643478248 -0.4713967368269896 0.02 -755 -0.8819212643478248 -0.4713967368269896 0.04000000000000001 -756 -0.8819212643478248 -0.4713967368269896 0.06 -757 -0.8819212643478248 -0.4713967368269896 0.08000000000000002 -758 -0.9238795325109631 -0.382683432365871 0.02 -759 -0.9238795325109631 -0.382683432365871 0.04000000000000001 -760 -0.9238795325109631 -0.382683432365871 0.06 -761 -0.9238795325109631 -0.382683432365871 0.08000000000000002 -762 -0.9569403357320482 -0.290284677254992 0.02 -763 -0.9569403357320482 -0.290284677254992 0.04000000000000001 -764 -0.9569403357320482 -0.290284677254992 0.06 -765 -0.9569403357320482 -0.290284677254992 0.08000000000000002 -766 -0.9807852804031679 -0.1950903220164424 0.02 -767 -0.9807852804031679 -0.1950903220164424 0.04000000000000001 -768 -0.9807852804031679 -0.1950903220164424 0.06 -769 -0.9807852804031679 -0.1950903220164424 0.08000000000000002 -770 -0.9951847266721896 -0.09801714032963502 0.02 -771 -0.9951847266721896 -0.09801714032963502 0.04000000000000001 -772 -0.9951847266721896 -0.09801714032963502 0.06 -773 -0.9951847266721896 -0.09801714032963502 0.08000000000000002 -774 0.03756306029641092 -0.02093446866751775 0.1 -775 0.4717784974923993 -0.02490808041101154 0.1 -776 -0.03852862222892565 -0.5106398982715344 0.1 -777 0.01745826490869877 0.4756782531760523 0.1 -778 -0.4991992942367677 -0.002747209135073027 0.1 -779 -0.3895380551416743 0.4115709446422399 0.1 -780 0.4460730547695202 0.3645630925462455 0.1 -781 0.3667139841427748 -0.4481162897424609 0.1 -782 -0.4359659455494101 -0.4016008317171993 0.1 -783 0.2752144976090569 0.1473320643758561 0.1 -784 -0.1652740533831175 0.2638313032138305 0.1 -785 0.1358823391562783 -0.2913065357419242 0.1 -786 -0.6426665832350795 0.2887729710070104 0.1 -787 0.293075152803309 0.6462358241085087 0.1 -788 0.645481545076644 -0.2934423659608753 0.1 -789 -0.2808700608021808 -0.6349347676940268 0.1 -790 -0.2312371538379003 0.67197272940937 0.1 -791 0.7070077408304654 0.2028286828581633 0.1 -792 0.1990756646981323 -0.705780651758859 0.1 -793 -0.6552526265249643 -0.2291356393218923 0.1 -794 0.7370416813050018 -0.0323880487297482 0.1 -795 -0.01007312301488713 -0.7499297198657263 0.1 -796 0.004233118916560361 0.7548984250302462 0.1 -797 -0.7422958609374829 0.03219982924355699 0.1 -798 -0.2378119664469096 0.01722296050754561 0.1 -799 0.27161521538255 -0.08523518342628889 0.1 -800 0.08584980778242617 0.2839475096018558 0.1 -801 -0.3808405777755483 -0.1849406693159914 0.1 -802 -0.3723461936529736 0.1966319143494792 0.1 -803 -0.6031947462785038 0.4727711882503794 0.1 -804 0.5162949590880913 0.5914758385178045 0.1 -805 0.5920878098522259 -0.51679985685799 0.1 -806 -0.5129774283587911 -0.5875519916829098 0.1 -807 -0.4263041114025644 0.6556723249958001 0.1 -808 0.6672471386365406 0.4659580270351875 0.1 -809 0.4663873700531773 -0.6677310103174087 0.1 -810 -0.6479542242062676 -0.4489260662706759 0.1 -811 0.4091505945967308 -0.2041168478006838 0.1 -812 0.2034571166068496 0.4122289302070589 0.1 -813 -0.2147270819573788 -0.4573666667268824 0.1 -814 0.4969166933618057 0.1757459476004287 0.1 -815 0.2027047708021964 -0.4890073439589892 0.1 -816 -0.1536557615163792 0.4535832094628838 0.1 -817 -0.009743727202841938 -0.3500084148164871 0.1 -818 -0.823597263543015 0.1811518920157068 0.1 -819 0.1789428062342819 0.8266336840954982 0.1 -820 0.8047841126731803 -0.1808380146892324 0.1 -821 -0.1895032565702806 -0.8273213509093948 0.1 -822 -0.1294880785920715 0.8290719054824465 0.1 -823 0.8009311167265003 0.1256412191505321 0.1 -824 0.1257927913827351 -0.802562868982628 0.1 -825 -0.8204330428923108 -0.1613657335275316 0.1 -826 -0.0790943930006117 -0.17068306722752 0.1 -827 -0.02199391310075206 0.194943590783138 0.1 -828 0.1400710230706294 0.01925663180423098 0.1 -829 -0.7311124087878886 0.4280563822694354 0.1 -830 0.4076469448163015 0.7357641759548181 0.1 -831 0.7345089649697516 -0.4081201462112941 0.1 -832 -0.4036184171460266 -0.7376650375477497 0.1 -833 -0.3381285885860201 0.7691726317410515 0.1 -834 0.7711957557164628 0.3334242122860396 0.1 -835 0.3331894292058933 -0.7714645933713635 0.1 -836 -0.7653226123121951 -0.3581131418827533 0.1 -837 -0.546930555803006 -0.132800021577047 0.1 -838 0.6118659137082836 -0.1075080319861763 0.1 -839 -0.1296951276148151 -0.6128472400119508 0.1 -840 0.1369483605942518 0.6221186496019506 0.1 -841 -0.641710880419295 0.1090802591991031 0.1 -842 0.6148798164141557 0.07355404173479176 0.1 -843 0.0469820303108977 -0.6323667922308401 0.1 -844 -0.05185856153157737 0.6340766973433336 0.1 -845 0.3057036788152149 0.2723789797201044 0.1 -846 0.2731069792877739 -0.3175337402858784 0.1 -847 -0.4684804775508656 0.3351144626898162 0.1 -848 -0.5351246134763195 -0.261208979745711 0.1 -849 -0.01892219538805212 0.3894321594473692 0.1 -850 0.3833366726461777 0.01534006368643153 0.1 -851 -0.3085211536290005 -0.3105829195453509 0.1 -852 -0.1663024721198338 -0.07772147510349153 0.1 -853 0.3621732754311218 0.5103233921898143 0.1 -854 0.5124070353603776 -0.3633750557512553 0.1 -855 -0.3580181609175846 -0.5165209282323437 0.1 -856 -0.3024547537984817 0.5467570942006423 0.1 -857 0.5434030071622173 0.3398085175284811 0.1 -858 0.3412263502806463 -0.5440226347822177 0.1 -859 0.1427909787838089 -0.09417538405911514 0.1 -860 -0.5663922685314257 0.6425754721707017 0.1 -861 0.6282900774874124 0.5777681321272297 0.1 -862 0.5780377585191204 -0.6285274660788117 0.1 -863 -0.6231131190450461 -0.573868228879201 0.1 -864 -0.6590539041252332 -0.05499729333104572 0.1 -865 -0.3647422845064503 -0.03507149787757582 0.1 -866 -0.2254924746200966 0.1787614208253395 0.1 -867 0.1050234704128963 0.1624012712872464 0.1 -868 -0.1329773886914627 0.07944681520979355 0.1 -869 -0.518455292474102 0.1999562692103366 0.1 -870 -0.8777355500062206 0.1031055213213803 0.1 -871 0.06803670459116642 0.8413820703684696 0.1 -872 0.8634244194224607 -0.07110194992195185 0.1 -873 -0.07121209647875529 -0.8639554548972228 0.1 -874 -0.4771655939180982 0.5314707538740274 0.1 -875 0.5072613652802174 0.4562492667112779 0.1 -876 0.4577941758260904 -0.5085539913241318 0.1 -877 0.07849340518994517 0.395490257991046 0.1 -878 0.3907476688564666 -0.07945627887879825 0.1 -879 -0.1202872187579756 -0.4375289673591386 0.1 -880 0.03444001021364659 -0.4319547458830146 0.1 -881 -0.3725609470319531 0.08959323598478858 0.1 -882 -0.2826464467832236 -0.1430461109708211 0.1 -883 -0.8408438148768203 0.3038013548530046 0.1 -884 0.351228889949187 0.8257505215600353 0.1 -885 0.8223404218233199 -0.3520198013927796 0.1 -886 -0.348706369474017 -0.8249278871031077 0.1 -887 -0.2775517435119676 0.8509733807337551 0.1 -888 0.8536829037897484 0.243720026876074 0.1 -889 0.2434247277543624 -0.8539466871977011 0.1 -890 -0.8627168884831342 -0.2533316685384274 0.1 -891 0.1974725576933337 0.2744378051418535 0.1 -892 0.2524148593535875 -0.198771987733323 0.1 -893 -0.4854883131142653 0.7457220906583607 0.1 -894 0.7591277353994388 0.5028439303284484 0.1 -895 0.5029253644977369 -0.7592621410337915 0.1 -896 -0.7647672911111083 -0.4674543772749559 0.1 -897 -0.7108361793314534 0.5254634771313555 0.1 -898 0.5342656219837573 0.7117378556409467 0.1 -899 0.7116540461975485 -0.5344260626000876 0.1 -900 -0.5330506322892616 -0.7120032950176953 0.1 -901 0.9150414785819491 0.01626100262132995 0.1 -902 0.0168197995996419 -0.9155771050154591 0.1 -903 -0.05350908974080526 0.9151953275153393 0.1 -904 -0.8901615806910763 -0.0433805318403859 0.1 -905 0.2147677259148433 0.5698932509556739 0.1 -906 0.5647887066986577 -0.2120278627447944 0.1 -907 -0.5757671858882061 0.3936411221794321 0.1 -908 -0.6070323526085064 -0.3109178609707977 0.1 -909 -0.4096256734583312 -0.2809930040728906 0.1 -910 -0.2110480791535164 -0.5460554661904444 0.1 -911 0.5264780395750118 0.06874829613321352 0.1 -912 -0.09339557691895344 0.5095184410983614 0.1 -913 0.1409715130134561 -0.5824566884795823 0.1 -914 0.4250953470729131 0.2534863589530039 0.1 -915 0.2607674988127206 -0.4294567986325282 0.1 -916 -0.5962435801721753 0.02177650693100434 0.1 -917 0.3543799131986165 0.2008389525262718 0.1 -918 0.2050244252436291 -0.3697654746143469 0.1 -919 0.3911056953167414 0.6195981550639392 0.1 -920 0.6210850838019899 -0.3921697392321514 0.1 -921 -0.3793846915294252 -0.5948869561524985 0.1 -922 -0.3266134346837702 0.6581666973346364 0.1 -923 0.6699093482451687 0.329271236138755 0.1 -924 0.3288731630542405 -0.669907566319805 0.1 -925 -0.2745762489355235 0.4330540180843155 0.1 -926 0.3313195231713995 0.3949050141693721 0.1 -927 0.395427680824704 -0.3342230814466719 0.1 -928 0.6029887232638651 0.1605941325141005 0.1 -929 -0.158230445589056 0.5891332823906208 0.1 -930 -0.3246331599733343 -0.4160665096979641 0.1 -931 0.01385141188671195 -0.2671072870111226 0.1 -932 -0.03147662884905398 0.281533647774432 0.1 -933 0.2667882956404315 0.02536235504018402 0.1 -934 -0.1986604585418896 0.3868511452052981 0.1 -935 -0.3696449774910689 0.3114268201399531 0.1 -936 -0.2344405688441173 -0.3532254518328403 0.1 -937 0.6993377794783857 -0.1415398440126267 0.1 -938 -0.1238206489616964 -0.700517702832118 0.1 -939 0.1373233247404103 0.7242512962695071 0.1 -940 -0.7263487332761797 0.1153887086184411 0.1 -941 0.7024971252519646 0.08267563104139442 0.1 -942 0.07736683597355803 -0.709023865972092 0.1 -943 -0.08638177708908419 0.7232802735362753 0.1 -944 -0.4782994778060585 0.4302448821838745 0.1 -945 0.1169512531531725 0.4869059176068478 0.1 -946 0.4790867050754448 -0.1184475504002031 0.1 -947 -0.1252851620567597 -0.5262213943342389 0.1 -948 0.05717581322842313 -0.5044143803136956 0.1 -949 -0.5590519308461908 -0.3860630008521712 0.1 -950 -0.1150418949277563 0.1539988247904993 0.1 -951 0.625740041369007 -0.01898109204536381 0.1 -952 -0.03317037890731243 -0.6688942094680634 0.1 -953 0.03624433566558084 0.6730118549863521 0.1 -954 -0.2603602255713895 -0.06027892483867578 0.1 -955 -0.06710066711579087 -0.08893426543085253 0.1 -956 -0.4573870695037332 -0.07642760186582892 0.1 -957 -0.09564073712273591 -0.2573381514755134 0.1 -958 0.1400109526938527 0.3452526017721837 0.1 -959 0.3361492571141538 -0.1404719131497 0.1 -960 -0.5876433989377084 0.7113331346157019 0.1 -961 0.7182531413760752 0.5730427977930983 0.1 -962 0.5731253148319749 -0.7183424706146012 0.1 -963 -0.7267637888520205 -0.5521997695027439 0.1 -964 -0.6501122839396156 0.6284622386129644 0.1 -965 0.6261338336978031 0.6753788591518668 0.1 -966 0.6754268178891599 -0.6262038638839817 0.1 -967 -0.6247774023037141 -0.6752677848129451 0.1 -968 0.05961375655305829 0.05433076127850857 0.1 -969 -0.4533454490453802 -0.196936480116006 0.1 -970 0.07158624384248355 -0.379769591245705 0.1 -971 -0.7358296271717679 0.2871230360154149 0.1 -972 0.2742396572924233 0.7517700822479314 0.1 -973 0.7436450706181265 -0.2750690386147977 0.1 -974 -0.2432002687080442 -0.7366468062073843 0.1 -975 -0.2119625161807704 0.7684636695715725 0.1 -976 -0.7420287683091251 -0.1960377794221552 0.1 -977 0.2078480314046554 -0.03108453521993102 0.1 -978 -0.7623744926063392 -0.07374826076866341 0.1 -979 -0.909714444924309 0.1962016670549832 0.1 -980 0.196878670604156 0.9276089183973528 0.1 -981 0.9193957067130305 -0.1962984183531116 0.1 -982 -0.1997934070668995 -0.923321303029304 0.1 -983 -0.1192602115718688 0.9075770128178854 0.1 -984 0.9102749207305986 0.107494640156683 0.1 -985 0.1078427730155398 -0.9107691188307522 0.1 -986 -0.9047070132952686 -0.1254546072148296 0.1 -987 0.03289221532974201 -0.09665339993729041 0.1 -988 -0.6339771303171474 0.1989722782787046 0.1 -989 -0.2825586775368157 0.09219772267569844 0.1 -990 -0.1120676417551462 -0.3482995528674908 0.1 -991 -0.5764632137055026 -0.2101910176660774 0.1 -992 0.1041409808248331 -0.02940891186701775 0.1 -993 -0.3059507321927566 0.2524534980281406 0.1 -994 -0.03067866374111903 -0.4334518599590248 0.1 -995 -0.7721004376432828 0.4777513885211878 0.1 -996 0.4820252404437138 0.780162643954427 0.1 -997 0.7796091221420068 -0.4822688004229307 0.1 -998 -0.4809833399183051 -0.7803828576843836 0.1 -999 -0.4087448112792932 0.8200465835534014 0.1 -1000 0.8002865935476932 0.4281836062087549 0.1 -1001 0.4281928958874004 -0.8004453282351094 0.1 -1002 -0.8344702347942566 -0.431935076849929 0.1 -1003 -0.5449938075776911 0.08085138723857922 0.1 -1004 -0.1036385592557349 0.4200407985042778 0.1 -1005 0.4059447738493815 0.1254769569297251 0.1 -1006 -0.1480365604421043 0.002340056667267008 0.1 -1007 0.4435118176807452 0.5462711800987253 0.1 -1008 0.5481423609560856 -0.444702129821462 0.1 -1009 -0.4501631950861821 -0.5270557191543739 0.1 -1010 -0.4247568760849733 0.5096373509841007 0.1 -1011 0.4988201351912681 0.3841490403209035 0.1 -1012 0.3859265328060342 -0.5001732242911401 0.1 -1013 0.1997661751917058 0.08583574604225598 0.1 -1014 -0.2997409692737895 -0.490908174504708 0.1 -1015 0.2526718728084643 -0.5230506066767192 0.1 -1016 -0.5764312502826053 -0.03692554837926267 0.1 -1017 0.233317559360037 0.6745601648264888 0.1 -1018 0.6664834809029515 -0.2317937327447079 0.1 -1019 -0.2172157307211868 -0.6308083555875714 0.1 -1020 -0.1729333115087907 0.6911077680080351 0.1 -1021 0.671980368914682 0.1502079082329276 0.1 -1022 0.1408397166201512 -0.6705572836873781 0.1 -1023 0.2773272845560157 0.4690803297873597 0.1 -1024 0.4685969294965288 -0.2785336807628994 0.1 -1025 0.5264882656905799 0.2476519001455232 0.1 -1026 0.1358362248963335 -0.1899752134225425 0.1 -1027 -0.6584505608993372 0.3710092945353671 0.1 -1028 0.02775643679018649 0.2312244083777829 0.1 -1029 -0.035369291719122 0.0692857418446034 0.1 -1030 -0.7283330523393017 0.1989359825089343 0.1 -1031 0.02803555178491281 0.4215173175592299 0.1 -1032 0.4172254733843679 -0.03095085732469068 0.1 -1033 -0.5531542396079592 0.5703748075432478 0.1 -1034 -0.2233020411609802 0.5024859737199666 0.1 -1035 -0.2212601963844741 0.08942363684758572 0.1 -1036 0.549376261754289 -0.08148282591001121 0.1 -1037 -0.04231427324180136 -0.5913297424500011 0.1 -1038 0.0725037981604873 0.5892004017059468 0.1 -1039 -0.3591430595110624 0.8665004124274038 0.1 -1040 0.8343808092508768 0.3491396519037765 0.1 -1041 0.3490014339920512 -0.8345450539496075 0.1 -1042 -0.8455494643298137 -0.3622401242500555 0.1 -1043 -0.8108956770324737 0.4052978005386882 0.1 -1044 0.4391324951811535 0.8296031461190513 0.1 -1045 0.8286770874347554 -0.4394358472307961 0.1 -1046 -0.4381482979571988 -0.8296944782760699 0.1 -1047 0.9196395491480548 -0.04889650790274243 0.1 -1048 -0.04888861491479355 -0.9203381901848371 0.1 -1049 0.04106626710905541 0.9181987594861903 0.1 -1050 -0.9181231607368404 0.05673640264366658 0.1 -1051 -0.4306746377266381 0.2616975499548028 0.1 -1052 -0.3189848618778681 -0.234485804771236 0.1 -1053 -0.703576291382104 -0.2848750589314329 0.1 -1054 -0.6831740336737175 -0.3467728689088223 0.1 -1055 -0.6776336270939101 0.4472363103286253 0.1 -1056 0.8311384623550437 0.01015308251562548 0.1 -1057 0.01299828530500507 -0.8326571797651593 0.1 -1058 -0.025132545105463 0.8347230416713295 0.1 -1059 0.3403081250555418 0.6872880204304391 0.1 -1060 0.6857575313013643 -0.3410204422452798 0.1 -1061 -0.3329818888151 -0.70054125787045 0.1 -1062 -0.2753392895102883 0.716238531094035 0.1 -1063 0.7474057402732359 0.2772263054801198 0.1 -1064 0.2763713755837198 -0.747361843857577 0.1 -1065 0.4617302352672168 0.6641000163382851 0.1 -1066 0.6641755837987446 -0.462212035469022 0.1 -1067 -0.4584144402846274 -0.6600817508765464 0.1 -1068 -0.3928163526354655 0.7039129685139371 0.1 -1069 0.7294991524264004 0.3854010828019568 0.1 -1070 0.3853629890688207 -0.7297691905569295 0.1 -1071 -0.0828478864105468 0.222787057711827 0.1 -1072 0.2237235225184439 -0.2707048071622312 0.1 -1073 0.3363303964504248 -0.2651986651500947 0.1 -1074 0.2586737271877743 0.3397244032112927 0.1 -1075 0.3770982996489567 0.3222179808712004 0.1 -1076 0.3243809176449824 -0.3822680017017484 0.1 -1077 0.3327262017821993 0.07817155868686239 0.1 -1078 0.5425497768767584 -0.01734534175699794 0.1 -1079 -0.01396045536158918 0.5512496575805828 0.1 -1080 -0.5512651160614166 0.3076523146195421 0.1 -1081 -0.7163852872670544 -0.1396422161982286 0.1 -1082 -0.6511422473993753 -0.1359071396149372 0.1 -1083 -0.2042242108415093 -0.2485075156706113 0.1 -1084 -0.2468751991455828 0.3173863441431322 0.1 -1085 0.3017869585304819 -0.4881825219737158 0.1 -1086 -0.1030402550787832 0.3499083778867725 0.1 -1087 0.3270211387810611 -0.03121154280665032 0.1 -1088 0.02727508435104043 0.3369905382921691 0.1 -1089 -0.2578249858272362 0.6182155773360569 0.1 -1090 0.6061696451656114 0.2572709168094842 0.1 -1091 -0.4318218663118083 0.1398381052134658 0.1 -1092 -0.9205186074618348 0.1366894840511481 0.1 -1093 0.1506053976324923 0.9178021341169079 0.1 -1094 0.8961617825212087 -0.1412708049913559 0.1 -1095 -0.1445920171026402 -0.8993514124303486 0.1 -1096 0.5875350688548576 -0.3176646077228484 0.1 -1097 0.3107398266737773 0.5743105207625626 0.1 -1098 0.0215285107957243 -0.5792545448201298 0.1 -1099 -0.8183358037921321 0.05809053621261764 0.1 -1100 -0.3660491832059855 -0.1289731166193481 0.1 -1101 -0.6511366897577591 0.6830709418777637 0.1 -1102 0.6686280648860022 0.6362368024514752 0.1 -1103 0.6363155520610249 -0.6687063593393362 0.1 -1104 -0.6680603702042858 -0.6321668587665613 0.1 -1105 0.02769532188719278 -0.1809798170660305 0.1 -1106 0.8044144611153137 -0.09385616407477533 0.1 -1107 -0.1002863638630045 -0.7852101999905228 0.1 -1108 0.06870526471661453 0.7758573409478231 0.1 -1109 -0.7867498094787946 0.1161645029703253 0.1 -1110 -0.3907157361541361 -0.4680680653996436 0.1 -1111 -0.2893241395812635 -0.5707646901788088 0.1 -1112 0.2561513611091514 -0.6027654634273024 0.1 -1113 -0.4841285488756676 -0.331212121059707 0.1 -1114 -0.41035322793612 0.3541633250263723 0.1 -1115 -0.3654807829429786 -0.3498455739180449 0.1 -1116 0.4080435269900474 0.4324779728220703 0.1 -1117 0.4339502900149312 -0.4099232310603246 0.1 -1118 -0.3924975512659823 0.5931502331897853 0.1 -1119 0.5989929827374207 0.3937454361019145 0.1 -1120 0.3944019080138368 -0.5994397262004321 0.1 -1121 -0.4871370735134125 0.653385648932151 0.1 -1122 0.6710715855360113 0.5418687690565018 0.1 -1123 0.5421353608160783 -0.6713299701740467 0.1 -1124 -0.6665608639534191 -0.5291225418108081 0.1 -1125 -0.3194860514249929 0.36885599465078 0.1 -1126 -0.3121988124129413 0.04460383481307665 0.1 -1127 0.1306023701377939 0.2475632241635774 0.1 -1128 -0.4293564094573099 0.03972846391576743 0.1 -1129 0.4879081786416791 0.2969280465148749 0.1 -1130 -0.05320371329411603 -0.009659407080246684 0.1 -1131 -0.6577428723468374 0.02540735873934022 0.1 -1132 -0.1842366086518172 -0.1604188104733459 0.1 -1133 -0.9042717039943147 0.2604669003446903 0.1 -1134 0.2534009727067292 0.8872303433587414 0.1 -1135 0.879485847683671 -0.2534884627103633 0.1 -1136 -0.2540536016905275 -0.8838698627750295 0.1 -1137 -0.2023131121857017 0.8840239738062975 0.1 -1138 0.9159608545231839 0.1786551861801368 0.1 -1139 0.1786954499012877 -0.9162855689932536 0.1 -1140 -0.9188532323694281 -0.1886018490274433 0.1 -1141 0.226029674240702 0.2157176894791872 0.1 -1142 0.2240314634922111 -0.124647710263943 0.1 -1143 -0.6318326364397403 0.5515572359157516 0.1 -1144 0.5793539672022744 0.6413232820841559 0.1 -1145 0.6415316364092868 -0.5795931917484853 0.1 -1146 -0.5764588254413486 -0.640012685369551 0.1 -1147 0.1377546984813269 -0.4339063387353258 0.1 -1148 -0.02209326306719091 0.1449551558571982 0.1 -1149 -0.3150939235960785 0.1368642893014297 0.1 -1150 -0.466900808070744 0.09003406461315078 0.1 -1151 -0.7419738530354105 0.3535618685369996 0.1 -1152 -0.7632972713564267 -0.2734702965429466 0.1 -1153 -0.4806778814717604 0.5839008529212468 0.1 -1154 0.5779479113575234 0.5244590282321654 0.1 -1155 0.5252194168129798 -0.5785686771437204 0.1 -1156 -0.5691077666073547 -0.5183984890058063 0.1 -1157 -0.4263000086588776 -0.1284501041782039 0.1 -1158 0.4473086990931153 0.04841531432543322 0.1 -1159 -0.05321214679547854 0.4472234736699625 0.1 -1160 -0.3498104304433999 0.475653056603885 0.1 -1161 -0.5052068046863671 -0.4586317500222058 0.1 -1162 -0.5282901268025465 0.5035158489667795 0.1 -1163 0.03756306029641092 -0.02093446866751775 0.02 -1164 0.03756306029641092 -0.02093446866751775 0.04000000000000001 -1165 0.03756306029641092 -0.02093446866751775 0.06 -1166 0.03756306029641092 -0.02093446866751775 0.08000000000000002 -1167 0.4717784974923993 -0.02490808041101154 0.02 -1168 0.4717784974923993 -0.02490808041101154 0.04000000000000001 -1169 0.4717784974923993 -0.02490808041101154 0.06 -1170 0.4717784974923993 -0.02490808041101154 0.08000000000000002 -1171 -0.03852862222892565 -0.5106398982715344 0.02 -1172 -0.03852862222892565 -0.5106398982715344 0.04000000000000001 -1173 -0.03852862222892565 -0.5106398982715344 0.06 -1174 -0.03852862222892565 -0.5106398982715344 0.08000000000000002 -1175 0.01745826490869877 0.4756782531760523 0.02 -1176 0.01745826490869877 0.4756782531760523 0.04000000000000001 -1177 0.01745826490869877 0.4756782531760523 0.06 -1178 0.01745826490869877 0.4756782531760523 0.08000000000000002 -1179 -0.4991992942367677 -0.002747209135073027 0.02 -1180 -0.4991992942367677 -0.002747209135073027 0.04000000000000001 -1181 -0.4991992942367677 -0.002747209135073027 0.06 -1182 -0.4991992942367677 -0.002747209135073027 0.08000000000000002 -1183 -0.3895380551416743 0.4115709446422399 0.02 -1184 -0.3895380551416743 0.4115709446422399 0.04000000000000001 -1185 -0.3895380551416743 0.4115709446422399 0.06 -1186 -0.3895380551416743 0.4115709446422399 0.08000000000000002 -1187 0.4460730547695202 0.3645630925462455 0.02 -1188 0.4460730547695202 0.3645630925462455 0.04000000000000001 -1189 0.4460730547695202 0.3645630925462455 0.06 -1190 0.4460730547695202 0.3645630925462455 0.08000000000000002 -1191 0.3667139841427748 -0.4481162897424609 0.02 -1192 0.3667139841427748 -0.4481162897424609 0.04000000000000001 -1193 0.3667139841427748 -0.4481162897424609 0.06 -1194 0.3667139841427748 -0.4481162897424609 0.08000000000000002 -1195 -0.4359659455494101 -0.4016008317171993 0.02 -1196 -0.4359659455494101 -0.4016008317171993 0.04000000000000001 -1197 -0.4359659455494101 -0.4016008317171993 0.06 -1198 -0.4359659455494101 -0.4016008317171993 0.08000000000000002 -1199 0.2752144976090569 0.1473320643758561 0.02 -1200 0.2752144976090569 0.1473320643758561 0.04000000000000001 -1201 0.2752144976090569 0.1473320643758561 0.06 -1202 0.2752144976090569 0.1473320643758561 0.08000000000000002 -1203 -0.1652740533831175 0.2638313032138305 0.02 -1204 -0.1652740533831175 0.2638313032138305 0.04000000000000001 -1205 -0.1652740533831175 0.2638313032138305 0.06 -1206 -0.1652740533831175 0.2638313032138305 0.08000000000000002 -1207 0.1358823391562783 -0.2913065357419242 0.02 -1208 0.1358823391562783 -0.2913065357419242 0.04000000000000001 -1209 0.1358823391562783 -0.2913065357419242 0.06 -1210 0.1358823391562783 -0.2913065357419242 0.08000000000000002 -1211 -0.6426665832350795 0.2887729710070104 0.02 -1212 -0.6426665832350795 0.2887729710070104 0.04000000000000001 -1213 -0.6426665832350795 0.2887729710070104 0.06 -1214 -0.6426665832350795 0.2887729710070104 0.08000000000000002 -1215 0.293075152803309 0.6462358241085087 0.02 -1216 0.293075152803309 0.6462358241085087 0.04000000000000001 -1217 0.293075152803309 0.6462358241085087 0.06 -1218 0.293075152803309 0.6462358241085087 0.08000000000000002 -1219 0.645481545076644 -0.2934423659608753 0.02 -1220 0.645481545076644 -0.2934423659608753 0.04000000000000001 -1221 0.645481545076644 -0.2934423659608753 0.06 -1222 0.645481545076644 -0.2934423659608753 0.08000000000000002 -1223 -0.2808700608021808 -0.6349347676940268 0.02 -1224 -0.2808700608021808 -0.6349347676940268 0.04000000000000001 -1225 -0.2808700608021808 -0.6349347676940268 0.06 -1226 -0.2808700608021808 -0.6349347676940268 0.08000000000000002 -1227 -0.2312371538379003 0.67197272940937 0.02 -1228 -0.2312371538379003 0.67197272940937 0.04000000000000001 -1229 -0.2312371538379003 0.67197272940937 0.06 -1230 -0.2312371538379003 0.67197272940937 0.08000000000000002 -1231 0.7070077408304654 0.2028286828581633 0.02 -1232 0.7070077408304654 0.2028286828581633 0.04000000000000001 -1233 0.7070077408304654 0.2028286828581633 0.06 -1234 0.7070077408304654 0.2028286828581633 0.08000000000000002 -1235 0.1990756646981323 -0.705780651758859 0.02 -1236 0.1990756646981323 -0.705780651758859 0.04000000000000001 -1237 0.1990756646981323 -0.705780651758859 0.06 -1238 0.1990756646981323 -0.705780651758859 0.08000000000000002 -1239 -0.6552526265249643 -0.2291356393218923 0.02 -1240 -0.6552526265249643 -0.2291356393218923 0.04000000000000001 -1241 -0.6552526265249643 -0.2291356393218923 0.06 -1242 -0.6552526265249643 -0.2291356393218923 0.08000000000000002 -1243 0.7370416813050018 -0.0323880487297482 0.02 -1244 0.7370416813050018 -0.0323880487297482 0.04000000000000001 -1245 0.7370416813050018 -0.0323880487297482 0.06 -1246 0.7370416813050018 -0.0323880487297482 0.08000000000000002 -1247 -0.01007312301488713 -0.7499297198657263 0.02 -1248 -0.01007312301488713 -0.7499297198657263 0.04000000000000001 -1249 -0.01007312301488713 -0.7499297198657263 0.06 -1250 -0.01007312301488713 -0.7499297198657263 0.08000000000000002 -1251 0.004233118916560361 0.7548984250302462 0.02 -1252 0.004233118916560361 0.7548984250302462 0.04000000000000001 -1253 0.004233118916560361 0.7548984250302462 0.06 -1254 0.004233118916560361 0.7548984250302462 0.08000000000000002 -1255 -0.7422958609374829 0.03219982924355699 0.02 -1256 -0.7422958609374829 0.03219982924355699 0.04000000000000001 -1257 -0.7422958609374829 0.03219982924355699 0.06 -1258 -0.7422958609374829 0.03219982924355699 0.08000000000000002 -1259 -0.2378119664469096 0.01722296050754561 0.02 -1260 -0.2378119664469096 0.01722296050754561 0.04000000000000001 -1261 -0.2378119664469096 0.01722296050754561 0.06 -1262 -0.2378119664469096 0.01722296050754561 0.08000000000000002 -1263 0.27161521538255 -0.08523518342628889 0.02 -1264 0.27161521538255 -0.08523518342628889 0.04000000000000001 -1265 0.27161521538255 -0.08523518342628889 0.06 -1266 0.27161521538255 -0.08523518342628889 0.08000000000000002 -1267 0.08584980778242617 0.2839475096018558 0.02 -1268 0.08584980778242617 0.2839475096018558 0.04000000000000001 -1269 0.08584980778242617 0.2839475096018558 0.06 -1270 0.08584980778242617 0.2839475096018558 0.08000000000000002 -1271 -0.3808405777755483 -0.1849406693159914 0.02 -1272 -0.3808405777755483 -0.1849406693159914 0.04000000000000001 -1273 -0.3808405777755483 -0.1849406693159914 0.06 -1274 -0.3808405777755483 -0.1849406693159914 0.08000000000000002 -1275 -0.3723461936529736 0.1966319143494792 0.02 -1276 -0.3723461936529736 0.1966319143494792 0.04000000000000001 -1277 -0.3723461936529736 0.1966319143494792 0.06 -1278 -0.3723461936529736 0.1966319143494792 0.08000000000000002 -1279 -0.6031947462785038 0.4727711882503794 0.02 -1280 -0.6031947462785038 0.4727711882503794 0.04000000000000001 -1281 -0.6031947462785038 0.4727711882503794 0.06 -1282 -0.6031947462785038 0.4727711882503794 0.08000000000000002 -1283 0.5162949590880913 0.5914758385178045 0.02 -1284 0.5162949590880913 0.5914758385178045 0.04000000000000001 -1285 0.5162949590880913 0.5914758385178045 0.06 -1286 0.5162949590880913 0.5914758385178045 0.08000000000000002 -1287 0.5920878098522259 -0.51679985685799 0.02 -1288 0.5920878098522259 -0.51679985685799 0.04000000000000001 -1289 0.5920878098522259 -0.51679985685799 0.06 -1290 0.5920878098522259 -0.51679985685799 0.08000000000000002 -1291 -0.5129774283587911 -0.5875519916829098 0.02 -1292 -0.5129774283587911 -0.5875519916829098 0.04000000000000001 -1293 -0.5129774283587911 -0.5875519916829098 0.06 -1294 -0.5129774283587911 -0.5875519916829098 0.08000000000000002 -1295 -0.4263041114025644 0.6556723249958001 0.02 -1296 -0.4263041114025644 0.6556723249958001 0.04000000000000001 -1297 -0.4263041114025644 0.6556723249958001 0.06 -1298 -0.4263041114025644 0.6556723249958001 0.08000000000000002 -1299 0.6672471386365406 0.4659580270351875 0.02 -1300 0.6672471386365406 0.4659580270351875 0.04000000000000001 -1301 0.6672471386365406 0.4659580270351875 0.06 -1302 0.6672471386365406 0.4659580270351875 0.08000000000000002 -1303 0.4663873700531773 -0.6677310103174087 0.02 -1304 0.4663873700531773 -0.6677310103174087 0.04000000000000001 -1305 0.4663873700531773 -0.6677310103174087 0.06 -1306 0.4663873700531773 -0.6677310103174087 0.08000000000000002 -1307 -0.6479542242062676 -0.4489260662706759 0.02 -1308 -0.6479542242062676 -0.4489260662706759 0.04000000000000001 -1309 -0.6479542242062676 -0.4489260662706759 0.06 -1310 -0.6479542242062676 -0.4489260662706759 0.08000000000000002 -1311 0.4091505945967308 -0.2041168478006838 0.02 -1312 0.4091505945967308 -0.2041168478006838 0.04000000000000001 -1313 0.4091505945967308 -0.2041168478006838 0.06 -1314 0.4091505945967308 -0.2041168478006838 0.08000000000000002 -1315 0.2034571166068496 0.4122289302070589 0.02 -1316 0.2034571166068496 0.4122289302070589 0.04000000000000001 -1317 0.2034571166068496 0.4122289302070589 0.06 -1318 0.2034571166068496 0.4122289302070589 0.08000000000000002 -1319 -0.2147270819573788 -0.4573666667268824 0.02 -1320 -0.2147270819573788 -0.4573666667268824 0.04000000000000001 -1321 -0.2147270819573788 -0.4573666667268824 0.06 -1322 -0.2147270819573788 -0.4573666667268824 0.08000000000000002 -1323 0.4969166933618057 0.1757459476004287 0.02 -1324 0.4969166933618057 0.1757459476004287 0.04000000000000001 -1325 0.4969166933618057 0.1757459476004287 0.06 -1326 0.4969166933618057 0.1757459476004287 0.08000000000000002 -1327 0.2027047708021964 -0.4890073439589892 0.02 -1328 0.2027047708021964 -0.4890073439589892 0.04000000000000001 -1329 0.2027047708021964 -0.4890073439589892 0.06 -1330 0.2027047708021964 -0.4890073439589892 0.08000000000000002 -1331 -0.1536557615163792 0.4535832094628838 0.02 -1332 -0.1536557615163792 0.4535832094628838 0.04000000000000001 -1333 -0.1536557615163792 0.4535832094628838 0.06 -1334 -0.1536557615163792 0.4535832094628838 0.08000000000000002 -1335 -0.009743727202841938 -0.3500084148164871 0.02 -1336 -0.009743727202841938 -0.3500084148164871 0.04000000000000001 -1337 -0.009743727202841938 -0.3500084148164871 0.06 -1338 -0.009743727202841938 -0.3500084148164871 0.08000000000000002 -1339 -0.823597263543015 0.1811518920157068 0.02 -1340 -0.823597263543015 0.1811518920157068 0.04000000000000001 -1341 -0.823597263543015 0.1811518920157068 0.06 -1342 -0.823597263543015 0.1811518920157068 0.08000000000000002 -1343 0.1789428062342819 0.8266336840954982 0.02 -1344 0.1789428062342819 0.8266336840954982 0.04000000000000001 -1345 0.1789428062342819 0.8266336840954982 0.06 -1346 0.1789428062342819 0.8266336840954982 0.08000000000000002 -1347 0.8047841126731803 -0.1808380146892324 0.02 -1348 0.8047841126731803 -0.1808380146892324 0.04000000000000001 -1349 0.8047841126731803 -0.1808380146892324 0.06 -1350 0.8047841126731803 -0.1808380146892324 0.08000000000000002 -1351 -0.1895032565702806 -0.8273213509093948 0.02 -1352 -0.1895032565702806 -0.8273213509093948 0.04000000000000001 -1353 -0.1895032565702806 -0.8273213509093948 0.06 -1354 -0.1895032565702806 -0.8273213509093948 0.08000000000000002 -1355 -0.1294880785920715 0.8290719054824465 0.02 -1356 -0.1294880785920715 0.8290719054824465 0.04000000000000001 -1357 -0.1294880785920715 0.8290719054824465 0.06 -1358 -0.1294880785920715 0.8290719054824465 0.08000000000000002 -1359 0.8009311167265003 0.1256412191505321 0.02 -1360 0.8009311167265003 0.1256412191505321 0.04000000000000001 -1361 0.8009311167265003 0.1256412191505321 0.06 -1362 0.8009311167265003 0.1256412191505321 0.08000000000000002 -1363 0.1257927913827351 -0.802562868982628 0.02 -1364 0.1257927913827351 -0.802562868982628 0.04000000000000001 -1365 0.1257927913827351 -0.802562868982628 0.06 -1366 0.1257927913827351 -0.802562868982628 0.08000000000000002 -1367 -0.8204330428923108 -0.1613657335275316 0.02 -1368 -0.8204330428923108 -0.1613657335275316 0.04000000000000001 -1369 -0.8204330428923108 -0.1613657335275316 0.06 -1370 -0.8204330428923108 -0.1613657335275316 0.08000000000000002 -1371 -0.0790943930006117 -0.17068306722752 0.02 -1372 -0.0790943930006117 -0.17068306722752 0.04000000000000001 -1373 -0.0790943930006117 -0.17068306722752 0.06 -1374 -0.0790943930006117 -0.17068306722752 0.08000000000000002 -1375 -0.02199391310075206 0.194943590783138 0.02 -1376 -0.02199391310075206 0.194943590783138 0.04000000000000001 -1377 -0.02199391310075206 0.194943590783138 0.06 -1378 -0.02199391310075206 0.194943590783138 0.08000000000000002 -1379 0.1400710230706294 0.01925663180423098 0.02 -1380 0.1400710230706294 0.01925663180423098 0.04000000000000001 -1381 0.1400710230706294 0.01925663180423098 0.06 -1382 0.1400710230706294 0.01925663180423098 0.08000000000000002 -1383 -0.7311124087878886 0.4280563822694354 0.02 -1384 -0.7311124087878886 0.4280563822694354 0.04000000000000001 -1385 -0.7311124087878886 0.4280563822694354 0.06 -1386 -0.7311124087878886 0.4280563822694354 0.08000000000000002 -1387 0.4076469448163015 0.7357641759548181 0.02 -1388 0.4076469448163015 0.7357641759548181 0.04000000000000001 -1389 0.4076469448163015 0.7357641759548181 0.06 -1390 0.4076469448163015 0.7357641759548181 0.08000000000000002 -1391 0.7345089649697516 -0.4081201462112941 0.02 -1392 0.7345089649697516 -0.4081201462112941 0.04000000000000001 -1393 0.7345089649697516 -0.4081201462112941 0.06 -1394 0.7345089649697516 -0.4081201462112941 0.08000000000000002 -1395 -0.4036184171460266 -0.7376650375477497 0.02 -1396 -0.4036184171460266 -0.7376650375477497 0.04000000000000001 -1397 -0.4036184171460266 -0.7376650375477497 0.06 -1398 -0.4036184171460266 -0.7376650375477497 0.08000000000000002 -1399 -0.3381285885860201 0.7691726317410515 0.02 -1400 -0.3381285885860201 0.7691726317410515 0.04000000000000001 -1401 -0.3381285885860201 0.7691726317410515 0.06 -1402 -0.3381285885860201 0.7691726317410515 0.08000000000000002 -1403 0.7711957557164628 0.3334242122860396 0.02 -1404 0.7711957557164628 0.3334242122860396 0.04000000000000001 -1405 0.7711957557164628 0.3334242122860396 0.06 -1406 0.7711957557164628 0.3334242122860396 0.08000000000000002 -1407 0.3331894292058933 -0.7714645933713635 0.02 -1408 0.3331894292058933 -0.7714645933713635 0.04000000000000001 -1409 0.3331894292058933 -0.7714645933713635 0.06 -1410 0.3331894292058933 -0.7714645933713635 0.08000000000000002 -1411 -0.7653226123121951 -0.3581131418827533 0.02 -1412 -0.7653226123121951 -0.3581131418827533 0.04000000000000001 -1413 -0.7653226123121951 -0.3581131418827533 0.06 -1414 -0.7653226123121951 -0.3581131418827533 0.08000000000000002 -1415 -0.546930555803006 -0.132800021577047 0.02 -1416 -0.546930555803006 -0.132800021577047 0.04000000000000001 -1417 -0.546930555803006 -0.132800021577047 0.06 -1418 -0.546930555803006 -0.132800021577047 0.08000000000000002 -1419 0.6118659137082836 -0.1075080319861763 0.02 -1420 0.6118659137082836 -0.1075080319861763 0.04000000000000001 -1421 0.6118659137082836 -0.1075080319861763 0.06 -1422 0.6118659137082836 -0.1075080319861763 0.08000000000000002 -1423 -0.1296951276148151 -0.6128472400119508 0.02 -1424 -0.1296951276148151 -0.6128472400119508 0.04000000000000001 -1425 -0.1296951276148151 -0.6128472400119508 0.06 -1426 -0.1296951276148151 -0.6128472400119508 0.08000000000000002 -1427 0.1369483605942518 0.6221186496019506 0.02 -1428 0.1369483605942518 0.6221186496019506 0.04000000000000001 -1429 0.1369483605942518 0.6221186496019506 0.06 -1430 0.1369483605942518 0.6221186496019506 0.08000000000000002 -1431 -0.641710880419295 0.1090802591991031 0.02 -1432 -0.641710880419295 0.1090802591991031 0.04000000000000001 -1433 -0.641710880419295 0.1090802591991031 0.06 -1434 -0.641710880419295 0.1090802591991031 0.08000000000000002 -1435 0.6148798164141557 0.07355404173479176 0.02 -1436 0.6148798164141557 0.07355404173479176 0.04000000000000001 -1437 0.6148798164141557 0.07355404173479176 0.06 -1438 0.6148798164141557 0.07355404173479176 0.08000000000000002 -1439 0.0469820303108977 -0.6323667922308401 0.02 -1440 0.0469820303108977 -0.6323667922308401 0.04000000000000001 -1441 0.0469820303108977 -0.6323667922308401 0.06 -1442 0.0469820303108977 -0.6323667922308401 0.08000000000000002 -1443 -0.05185856153157737 0.6340766973433336 0.02 -1444 -0.05185856153157737 0.6340766973433336 0.04000000000000001 -1445 -0.05185856153157737 0.6340766973433336 0.06 -1446 -0.05185856153157737 0.6340766973433336 0.08000000000000002 -1447 0.3057036788152149 0.2723789797201044 0.02 -1448 0.3057036788152149 0.2723789797201044 0.04000000000000001 -1449 0.3057036788152149 0.2723789797201044 0.06 -1450 0.3057036788152149 0.2723789797201044 0.08000000000000002 -1451 0.2731069792877739 -0.3175337402858784 0.02 -1452 0.2731069792877739 -0.3175337402858784 0.04000000000000001 -1453 0.2731069792877739 -0.3175337402858784 0.06 -1454 0.2731069792877739 -0.3175337402858784 0.08000000000000002 -1455 -0.4684804775508656 0.3351144626898162 0.02 -1456 -0.4684804775508656 0.3351144626898162 0.04000000000000001 -1457 -0.4684804775508656 0.3351144626898162 0.06 -1458 -0.4684804775508656 0.3351144626898162 0.08000000000000002 -1459 -0.5351246134763195 -0.261208979745711 0.02 -1460 -0.5351246134763195 -0.261208979745711 0.04000000000000001 -1461 -0.5351246134763195 -0.261208979745711 0.06 -1462 -0.5351246134763195 -0.261208979745711 0.08000000000000002 -1463 -0.01892219538805212 0.3894321594473692 0.02 -1464 -0.01892219538805212 0.3894321594473692 0.04000000000000001 -1465 -0.01892219538805212 0.3894321594473692 0.06 -1466 -0.01892219538805212 0.3894321594473692 0.08000000000000002 -1467 0.3833366726461777 0.01534006368643153 0.02 -1468 0.3833366726461777 0.01534006368643153 0.04000000000000001 -1469 0.3833366726461777 0.01534006368643153 0.06 -1470 0.3833366726461777 0.01534006368643153 0.08000000000000002 -1471 -0.3085211536290005 -0.3105829195453509 0.02 -1472 -0.3085211536290005 -0.3105829195453509 0.04000000000000001 -1473 -0.3085211536290005 -0.3105829195453509 0.06 -1474 -0.3085211536290005 -0.3105829195453509 0.08000000000000002 -1475 -0.1663024721198338 -0.07772147510349153 0.02 -1476 -0.1663024721198338 -0.07772147510349153 0.04000000000000001 -1477 -0.1663024721198338 -0.07772147510349153 0.06 -1478 -0.1663024721198338 -0.07772147510349153 0.08000000000000002 -1479 0.3621732754311218 0.5103233921898143 0.02 -1480 0.3621732754311218 0.5103233921898143 0.04000000000000001 -1481 0.3621732754311218 0.5103233921898143 0.06 -1482 0.3621732754311218 0.5103233921898143 0.08000000000000002 -1483 0.5124070353603776 -0.3633750557512553 0.02 -1484 0.5124070353603776 -0.3633750557512553 0.04000000000000001 -1485 0.5124070353603776 -0.3633750557512553 0.06 -1486 0.5124070353603776 -0.3633750557512553 0.08000000000000002 -1487 -0.3580181609175846 -0.5165209282323437 0.02 -1488 -0.3580181609175846 -0.5165209282323437 0.04000000000000001 -1489 -0.3580181609175846 -0.5165209282323437 0.06 -1490 -0.3580181609175846 -0.5165209282323437 0.08000000000000002 -1491 -0.3024547537984817 0.5467570942006423 0.02 -1492 -0.3024547537984817 0.5467570942006423 0.04000000000000001 -1493 -0.3024547537984817 0.5467570942006423 0.06 -1494 -0.3024547537984817 0.5467570942006423 0.08000000000000002 -1495 0.5434030071622173 0.3398085175284811 0.02 -1496 0.5434030071622173 0.3398085175284811 0.04000000000000001 -1497 0.5434030071622173 0.3398085175284811 0.06 -1498 0.5434030071622173 0.3398085175284811 0.08000000000000002 -1499 0.3412263502806463 -0.5440226347822177 0.02 -1500 0.3412263502806463 -0.5440226347822177 0.04000000000000001 -1501 0.3412263502806463 -0.5440226347822177 0.06 -1502 0.3412263502806463 -0.5440226347822177 0.08000000000000002 -1503 0.1427909787838089 -0.09417538405911514 0.02 -1504 0.1427909787838089 -0.09417538405911514 0.04000000000000001 -1505 0.1427909787838089 -0.09417538405911514 0.06 -1506 0.1427909787838089 -0.09417538405911514 0.08000000000000002 -1507 -0.5663922685314257 0.6425754721707017 0.02 -1508 -0.5663922685314257 0.6425754721707017 0.04000000000000001 -1509 -0.5663922685314257 0.6425754721707017 0.06 -1510 -0.5663922685314257 0.6425754721707017 0.08000000000000002 -1511 0.6282900774874124 0.5777681321272297 0.02 -1512 0.6282900774874124 0.5777681321272297 0.04000000000000001 -1513 0.6282900774874124 0.5777681321272297 0.06 -1514 0.6282900774874124 0.5777681321272297 0.08000000000000002 -1515 0.5780377585191204 -0.6285274660788117 0.02 -1516 0.5780377585191204 -0.6285274660788117 0.04000000000000001 -1517 0.5780377585191204 -0.6285274660788117 0.06 -1518 0.5780377585191204 -0.6285274660788117 0.08000000000000002 -1519 -0.6231131190450461 -0.573868228879201 0.02 -1520 -0.6231131190450461 -0.573868228879201 0.04000000000000001 -1521 -0.6231131190450461 -0.573868228879201 0.06 -1522 -0.6231131190450461 -0.573868228879201 0.08000000000000002 -1523 -0.6590539041252332 -0.05499729333104572 0.02 -1524 -0.6590539041252332 -0.05499729333104572 0.04000000000000001 -1525 -0.6590539041252332 -0.05499729333104572 0.06 -1526 -0.6590539041252332 -0.05499729333104572 0.08000000000000002 -1527 -0.3647422845064503 -0.03507149787757582 0.02 -1528 -0.3647422845064503 -0.03507149787757582 0.04000000000000001 -1529 -0.3647422845064503 -0.03507149787757582 0.06 -1530 -0.3647422845064503 -0.03507149787757582 0.08000000000000002 -1531 -0.2254924746200966 0.1787614208253395 0.02 -1532 -0.2254924746200966 0.1787614208253395 0.04000000000000001 -1533 -0.2254924746200966 0.1787614208253395 0.06 -1534 -0.2254924746200966 0.1787614208253395 0.08000000000000002 -1535 0.1050234704128963 0.1624012712872464 0.02 -1536 0.1050234704128963 0.1624012712872464 0.04000000000000001 -1537 0.1050234704128963 0.1624012712872464 0.06 -1538 0.1050234704128963 0.1624012712872464 0.08000000000000002 -1539 -0.1329773886914627 0.07944681520979355 0.02 -1540 -0.1329773886914627 0.07944681520979355 0.04000000000000001 -1541 -0.1329773886914627 0.07944681520979355 0.06 -1542 -0.1329773886914627 0.07944681520979355 0.08000000000000002 -1543 -0.518455292474102 0.1999562692103366 0.02 -1544 -0.518455292474102 0.1999562692103366 0.04000000000000001 -1545 -0.518455292474102 0.1999562692103366 0.06 -1546 -0.518455292474102 0.1999562692103366 0.08000000000000002 -1547 -0.8777355500062206 0.1031055213213803 0.02 -1548 -0.8777355500062206 0.1031055213213803 0.04000000000000001 -1549 -0.8777355500062206 0.1031055213213803 0.06 -1550 -0.8777355500062206 0.1031055213213803 0.08000000000000002 -1551 0.06803670459116642 0.8413820703684696 0.02 -1552 0.06803670459116642 0.8413820703684696 0.04000000000000001 -1553 0.06803670459116642 0.8413820703684696 0.06 -1554 0.06803670459116642 0.8413820703684696 0.08000000000000002 -1555 0.8634244194224607 -0.07110194992195185 0.02 -1556 0.8634244194224607 -0.07110194992195185 0.04000000000000001 -1557 0.8634244194224607 -0.07110194992195185 0.06 -1558 0.8634244194224607 -0.07110194992195185 0.08000000000000002 -1559 -0.07121209647875529 -0.8639554548972228 0.02 -1560 -0.07121209647875529 -0.8639554548972228 0.04000000000000001 -1561 -0.07121209647875529 -0.8639554548972228 0.06 -1562 -0.07121209647875529 -0.8639554548972228 0.08000000000000002 -1563 -0.4771655939180982 0.5314707538740274 0.02 -1564 -0.4771655939180982 0.5314707538740274 0.04000000000000001 -1565 -0.4771655939180982 0.5314707538740274 0.06 -1566 -0.4771655939180982 0.5314707538740274 0.08000000000000002 -1567 0.5072613652802174 0.4562492667112779 0.02 -1568 0.5072613652802174 0.4562492667112779 0.04000000000000001 -1569 0.5072613652802174 0.4562492667112779 0.06 -1570 0.5072613652802174 0.4562492667112779 0.08000000000000002 -1571 0.4577941758260904 -0.5085539913241318 0.02 -1572 0.4577941758260904 -0.5085539913241318 0.04000000000000001 -1573 0.4577941758260904 -0.5085539913241318 0.06 -1574 0.4577941758260904 -0.5085539913241318 0.08000000000000002 -1575 0.07849340518994517 0.395490257991046 0.02 -1576 0.07849340518994517 0.395490257991046 0.04000000000000001 -1577 0.07849340518994517 0.395490257991046 0.06 -1578 0.07849340518994517 0.395490257991046 0.08000000000000002 -1579 0.3907476688564666 -0.07945627887879825 0.02 -1580 0.3907476688564666 -0.07945627887879825 0.04000000000000001 -1581 0.3907476688564666 -0.07945627887879825 0.06 -1582 0.3907476688564666 -0.07945627887879825 0.08000000000000002 -1583 -0.1202872187579756 -0.4375289673591386 0.02 -1584 -0.1202872187579756 -0.4375289673591386 0.04000000000000001 -1585 -0.1202872187579756 -0.4375289673591386 0.06 -1586 -0.1202872187579756 -0.4375289673591386 0.08000000000000002 -1587 0.03444001021364659 -0.4319547458830146 0.02 -1588 0.03444001021364659 -0.4319547458830146 0.04000000000000001 -1589 0.03444001021364659 -0.4319547458830146 0.06 -1590 0.03444001021364659 -0.4319547458830146 0.08000000000000002 -1591 -0.3725609470319531 0.08959323598478858 0.02 -1592 -0.3725609470319531 0.08959323598478858 0.04000000000000001 -1593 -0.3725609470319531 0.08959323598478858 0.06 -1594 -0.3725609470319531 0.08959323598478858 0.08000000000000002 -1595 -0.2826464467832236 -0.1430461109708211 0.02 -1596 -0.2826464467832236 -0.1430461109708211 0.04000000000000001 -1597 -0.2826464467832236 -0.1430461109708211 0.06 -1598 -0.2826464467832236 -0.1430461109708211 0.08000000000000002 -1599 -0.8408438148768203 0.3038013548530046 0.02 -1600 -0.8408438148768203 0.3038013548530046 0.04000000000000001 -1601 -0.8408438148768203 0.3038013548530046 0.06 -1602 -0.8408438148768203 0.3038013548530046 0.08000000000000002 -1603 0.351228889949187 0.8257505215600353 0.02 -1604 0.351228889949187 0.8257505215600353 0.04000000000000001 -1605 0.351228889949187 0.8257505215600353 0.06 -1606 0.351228889949187 0.8257505215600353 0.08000000000000002 -1607 0.8223404218233199 -0.3520198013927796 0.02 -1608 0.8223404218233199 -0.3520198013927796 0.04000000000000001 -1609 0.8223404218233199 -0.3520198013927796 0.06 -1610 0.8223404218233199 -0.3520198013927796 0.08000000000000002 -1611 -0.348706369474017 -0.8249278871031077 0.02 -1612 -0.348706369474017 -0.8249278871031077 0.04000000000000001 -1613 -0.348706369474017 -0.8249278871031077 0.06 -1614 -0.348706369474017 -0.8249278871031077 0.08000000000000002 -1615 -0.2775517435119676 0.8509733807337551 0.02 -1616 -0.2775517435119676 0.8509733807337551 0.04000000000000001 -1617 -0.2775517435119676 0.8509733807337551 0.06 -1618 -0.2775517435119676 0.8509733807337551 0.08000000000000002 -1619 0.8536829037897484 0.243720026876074 0.02 -1620 0.8536829037897484 0.243720026876074 0.04000000000000001 -1621 0.8536829037897484 0.243720026876074 0.06 -1622 0.8536829037897484 0.243720026876074 0.08000000000000002 -1623 0.2434247277543624 -0.8539466871977011 0.02 -1624 0.2434247277543624 -0.8539466871977011 0.04000000000000001 -1625 0.2434247277543624 -0.8539466871977011 0.06 -1626 0.2434247277543624 -0.8539466871977011 0.08000000000000002 -1627 -0.8627168884831342 -0.2533316685384274 0.02 -1628 -0.8627168884831342 -0.2533316685384274 0.04000000000000001 -1629 -0.8627168884831342 -0.2533316685384274 0.06 -1630 -0.8627168884831342 -0.2533316685384274 0.08000000000000002 -1631 0.1974725576933337 0.2744378051418535 0.02 -1632 0.1974725576933337 0.2744378051418535 0.04000000000000001 -1633 0.1974725576933337 0.2744378051418535 0.06 -1634 0.1974725576933337 0.2744378051418535 0.08000000000000002 -1635 0.2524148593535875 -0.198771987733323 0.02 -1636 0.2524148593535875 -0.198771987733323 0.04000000000000001 -1637 0.2524148593535875 -0.198771987733323 0.06 -1638 0.2524148593535875 -0.198771987733323 0.08000000000000002 -1639 -0.4854883131142653 0.7457220906583607 0.02 -1640 -0.4854883131142653 0.7457220906583607 0.04000000000000001 -1641 -0.4854883131142653 0.7457220906583607 0.06 -1642 -0.4854883131142653 0.7457220906583607 0.08000000000000002 -1643 0.7591277353994388 0.5028439303284484 0.02 -1644 0.7591277353994388 0.5028439303284484 0.04000000000000001 -1645 0.7591277353994388 0.5028439303284484 0.06 -1646 0.7591277353994388 0.5028439303284484 0.08000000000000002 -1647 0.5029253644977369 -0.7592621410337915 0.02 -1648 0.5029253644977369 -0.7592621410337915 0.04000000000000001 -1649 0.5029253644977369 -0.7592621410337915 0.06 -1650 0.5029253644977369 -0.7592621410337915 0.08000000000000002 -1651 -0.7647672911111083 -0.4674543772749559 0.02 -1652 -0.7647672911111083 -0.4674543772749559 0.04000000000000001 -1653 -0.7647672911111083 -0.4674543772749559 0.06 -1654 -0.7647672911111083 -0.4674543772749559 0.08000000000000002 -1655 -0.7108361793314534 0.5254634771313555 0.02 -1656 -0.7108361793314534 0.5254634771313555 0.04000000000000001 -1657 -0.7108361793314534 0.5254634771313555 0.06 -1658 -0.7108361793314534 0.5254634771313555 0.08000000000000002 -1659 0.5342656219837573 0.7117378556409467 0.02 -1660 0.5342656219837573 0.7117378556409467 0.04000000000000001 -1661 0.5342656219837573 0.7117378556409467 0.06 -1662 0.5342656219837573 0.7117378556409467 0.08000000000000002 -1663 0.7116540461975485 -0.5344260626000876 0.02 -1664 0.7116540461975485 -0.5344260626000876 0.04000000000000001 -1665 0.7116540461975485 -0.5344260626000876 0.06 -1666 0.7116540461975485 -0.5344260626000876 0.08000000000000002 -1667 -0.5330506322892616 -0.7120032950176953 0.02 -1668 -0.5330506322892616 -0.7120032950176953 0.04000000000000001 -1669 -0.5330506322892616 -0.7120032950176953 0.06 -1670 -0.5330506322892616 -0.7120032950176953 0.08000000000000002 -1671 0.9150414785819491 0.01626100262132995 0.02 -1672 0.9150414785819491 0.01626100262132995 0.04000000000000001 -1673 0.9150414785819491 0.01626100262132995 0.06 -1674 0.9150414785819491 0.01626100262132995 0.08000000000000002 -1675 0.0168197995996419 -0.9155771050154591 0.02 -1676 0.0168197995996419 -0.9155771050154591 0.04000000000000001 -1677 0.0168197995996419 -0.9155771050154591 0.06 -1678 0.0168197995996419 -0.9155771050154591 0.08000000000000002 -1679 -0.05350908974080526 0.9151953275153393 0.02 -1680 -0.05350908974080526 0.9151953275153393 0.04000000000000001 -1681 -0.05350908974080526 0.9151953275153393 0.06 -1682 -0.05350908974080526 0.9151953275153393 0.08000000000000002 -1683 -0.8901615806910763 -0.0433805318403859 0.02 -1684 -0.8901615806910763 -0.0433805318403859 0.04000000000000001 -1685 -0.8901615806910763 -0.0433805318403859 0.06 -1686 -0.8901615806910763 -0.0433805318403859 0.08000000000000002 -1687 0.2147677259148433 0.5698932509556739 0.02 -1688 0.2147677259148433 0.5698932509556739 0.04000000000000001 -1689 0.2147677259148433 0.5698932509556739 0.06 -1690 0.2147677259148433 0.5698932509556739 0.08000000000000002 -1691 0.5647887066986577 -0.2120278627447944 0.02 -1692 0.5647887066986577 -0.2120278627447944 0.04000000000000001 -1693 0.5647887066986577 -0.2120278627447944 0.06 -1694 0.5647887066986577 -0.2120278627447944 0.08000000000000002 -1695 -0.5757671858882061 0.3936411221794321 0.02 -1696 -0.5757671858882061 0.3936411221794321 0.04000000000000001 -1697 -0.5757671858882061 0.3936411221794321 0.06 -1698 -0.5757671858882061 0.3936411221794321 0.08000000000000002 -1699 -0.6070323526085064 -0.3109178609707977 0.02 -1700 -0.6070323526085064 -0.3109178609707977 0.04000000000000001 -1701 -0.6070323526085064 -0.3109178609707977 0.06 -1702 -0.6070323526085064 -0.3109178609707977 0.08000000000000002 -1703 -0.4096256734583312 -0.2809930040728906 0.02 -1704 -0.4096256734583312 -0.2809930040728906 0.04000000000000001 -1705 -0.4096256734583312 -0.2809930040728906 0.06 -1706 -0.4096256734583312 -0.2809930040728906 0.08000000000000002 -1707 -0.2110480791535164 -0.5460554661904444 0.02 -1708 -0.2110480791535164 -0.5460554661904444 0.04000000000000001 -1709 -0.2110480791535164 -0.5460554661904444 0.06 -1710 -0.2110480791535164 -0.5460554661904444 0.08000000000000002 -1711 0.5264780395750118 0.06874829613321352 0.02 -1712 0.5264780395750118 0.06874829613321352 0.04000000000000001 -1713 0.5264780395750118 0.06874829613321352 0.06 -1714 0.5264780395750118 0.06874829613321352 0.08000000000000002 -1715 -0.09339557691895344 0.5095184410983614 0.02 -1716 -0.09339557691895344 0.5095184410983614 0.04000000000000001 -1717 -0.09339557691895344 0.5095184410983614 0.06 -1718 -0.09339557691895344 0.5095184410983614 0.08000000000000002 -1719 0.1409715130134561 -0.5824566884795823 0.02 -1720 0.1409715130134561 -0.5824566884795823 0.04000000000000001 -1721 0.1409715130134561 -0.5824566884795823 0.06 -1722 0.1409715130134561 -0.5824566884795823 0.08000000000000002 -1723 0.4250953470729131 0.2534863589530039 0.02 -1724 0.4250953470729131 0.2534863589530039 0.04000000000000001 -1725 0.4250953470729131 0.2534863589530039 0.06 -1726 0.4250953470729131 0.2534863589530039 0.08000000000000002 -1727 0.2607674988127206 -0.4294567986325282 0.02 -1728 0.2607674988127206 -0.4294567986325282 0.04000000000000001 -1729 0.2607674988127206 -0.4294567986325282 0.06 -1730 0.2607674988127206 -0.4294567986325282 0.08000000000000002 -1731 -0.5962435801721753 0.02177650693100434 0.02 -1732 -0.5962435801721753 0.02177650693100434 0.04000000000000001 -1733 -0.5962435801721753 0.02177650693100434 0.06 -1734 -0.5962435801721753 0.02177650693100434 0.08000000000000002 -1735 0.3543799131986165 0.2008389525262718 0.02 -1736 0.3543799131986165 0.2008389525262718 0.04000000000000001 -1737 0.3543799131986165 0.2008389525262718 0.06 -1738 0.3543799131986165 0.2008389525262718 0.08000000000000002 -1739 0.2050244252436291 -0.3697654746143469 0.02 -1740 0.2050244252436291 -0.3697654746143469 0.04000000000000001 -1741 0.2050244252436291 -0.3697654746143469 0.06 -1742 0.2050244252436291 -0.3697654746143469 0.08000000000000002 -1743 0.3911056953167414 0.6195981550639392 0.02 -1744 0.3911056953167414 0.6195981550639392 0.04000000000000001 -1745 0.3911056953167414 0.6195981550639392 0.06 -1746 0.3911056953167414 0.6195981550639392 0.08000000000000002 -1747 0.6210850838019899 -0.3921697392321514 0.02 -1748 0.6210850838019899 -0.3921697392321514 0.04000000000000001 -1749 0.6210850838019899 -0.3921697392321514 0.06 -1750 0.6210850838019899 -0.3921697392321514 0.08000000000000002 -1751 -0.3793846915294252 -0.5948869561524985 0.02 -1752 -0.3793846915294252 -0.5948869561524985 0.04000000000000001 -1753 -0.3793846915294252 -0.5948869561524985 0.06 -1754 -0.3793846915294252 -0.5948869561524985 0.08000000000000002 -1755 -0.3266134346837702 0.6581666973346364 0.02 -1756 -0.3266134346837702 0.6581666973346364 0.04000000000000001 -1757 -0.3266134346837702 0.6581666973346364 0.06 -1758 -0.3266134346837702 0.6581666973346364 0.08000000000000002 -1759 0.6699093482451687 0.329271236138755 0.02 -1760 0.6699093482451687 0.329271236138755 0.04000000000000001 -1761 0.6699093482451687 0.329271236138755 0.06 -1762 0.6699093482451687 0.329271236138755 0.08000000000000002 -1763 0.3288731630542405 -0.669907566319805 0.02 -1764 0.3288731630542405 -0.669907566319805 0.04000000000000001 -1765 0.3288731630542405 -0.669907566319805 0.06 -1766 0.3288731630542405 -0.669907566319805 0.08000000000000002 -1767 -0.2745762489355235 0.4330540180843155 0.02 -1768 -0.2745762489355235 0.4330540180843155 0.04000000000000001 -1769 -0.2745762489355235 0.4330540180843155 0.06 -1770 -0.2745762489355235 0.4330540180843155 0.08000000000000002 -1771 0.3313195231713995 0.3949050141693721 0.02 -1772 0.3313195231713995 0.3949050141693721 0.04000000000000001 -1773 0.3313195231713995 0.3949050141693721 0.06 -1774 0.3313195231713995 0.3949050141693721 0.08000000000000002 -1775 0.395427680824704 -0.3342230814466719 0.02 -1776 0.395427680824704 -0.3342230814466719 0.04000000000000001 -1777 0.395427680824704 -0.3342230814466719 0.06 -1778 0.395427680824704 -0.3342230814466719 0.08000000000000002 -1779 0.6029887232638651 0.1605941325141005 0.02 -1780 0.6029887232638651 0.1605941325141005 0.04000000000000001 -1781 0.6029887232638651 0.1605941325141005 0.06 -1782 0.6029887232638651 0.1605941325141005 0.08000000000000002 -1783 -0.158230445589056 0.5891332823906208 0.02 -1784 -0.158230445589056 0.5891332823906208 0.04000000000000001 -1785 -0.158230445589056 0.5891332823906208 0.06 -1786 -0.158230445589056 0.5891332823906208 0.08000000000000002 -1787 -0.3246331599733343 -0.4160665096979641 0.02 -1788 -0.3246331599733343 -0.4160665096979641 0.04000000000000001 -1789 -0.3246331599733343 -0.4160665096979641 0.06 -1790 -0.3246331599733343 -0.4160665096979641 0.08000000000000002 -1791 0.01385141188671195 -0.2671072870111226 0.02 -1792 0.01385141188671195 -0.2671072870111226 0.04000000000000001 -1793 0.01385141188671195 -0.2671072870111226 0.06 -1794 0.01385141188671195 -0.2671072870111226 0.08000000000000002 -1795 -0.03147662884905398 0.281533647774432 0.02 -1796 -0.03147662884905398 0.281533647774432 0.04000000000000001 -1797 -0.03147662884905398 0.281533647774432 0.06 -1798 -0.03147662884905398 0.281533647774432 0.08000000000000002 -1799 0.2667882956404315 0.02536235504018402 0.02 -1800 0.2667882956404315 0.02536235504018402 0.04000000000000001 -1801 0.2667882956404315 0.02536235504018402 0.06 -1802 0.2667882956404315 0.02536235504018402 0.08000000000000002 -1803 -0.1986604585418896 0.3868511452052981 0.02 -1804 -0.1986604585418896 0.3868511452052981 0.04000000000000001 -1805 -0.1986604585418896 0.3868511452052981 0.06 -1806 -0.1986604585418896 0.3868511452052981 0.08000000000000002 -1807 -0.3696449774910689 0.3114268201399531 0.02 -1808 -0.3696449774910689 0.3114268201399531 0.04000000000000001 -1809 -0.3696449774910689 0.3114268201399531 0.06 -1810 -0.3696449774910689 0.3114268201399531 0.08000000000000002 -1811 -0.2344405688441173 -0.3532254518328403 0.02 -1812 -0.2344405688441173 -0.3532254518328403 0.04000000000000001 -1813 -0.2344405688441173 -0.3532254518328403 0.06 -1814 -0.2344405688441173 -0.3532254518328403 0.08000000000000002 -1815 0.6993377794783857 -0.1415398440126267 0.02 -1816 0.6993377794783857 -0.1415398440126267 0.04000000000000001 -1817 0.6993377794783857 -0.1415398440126267 0.06 -1818 0.6993377794783857 -0.1415398440126267 0.08000000000000002 -1819 -0.1238206489616964 -0.700517702832118 0.02 -1820 -0.1238206489616964 -0.700517702832118 0.04000000000000001 -1821 -0.1238206489616964 -0.700517702832118 0.06 -1822 -0.1238206489616964 -0.700517702832118 0.08000000000000002 -1823 0.1373233247404103 0.7242512962695071 0.02 -1824 0.1373233247404103 0.7242512962695071 0.04000000000000001 -1825 0.1373233247404103 0.7242512962695071 0.06 -1826 0.1373233247404103 0.7242512962695071 0.08000000000000002 -1827 -0.7263487332761797 0.1153887086184411 0.02 -1828 -0.7263487332761797 0.1153887086184411 0.04000000000000001 -1829 -0.7263487332761797 0.1153887086184411 0.06 -1830 -0.7263487332761797 0.1153887086184411 0.08000000000000002 -1831 0.7024971252519646 0.08267563104139442 0.02 -1832 0.7024971252519646 0.08267563104139442 0.04000000000000001 -1833 0.7024971252519646 0.08267563104139442 0.06 -1834 0.7024971252519646 0.08267563104139442 0.08000000000000002 -1835 0.07736683597355803 -0.709023865972092 0.02 -1836 0.07736683597355803 -0.709023865972092 0.04000000000000001 -1837 0.07736683597355803 -0.709023865972092 0.06 -1838 0.07736683597355803 -0.709023865972092 0.08000000000000002 -1839 -0.08638177708908419 0.7232802735362753 0.02 -1840 -0.08638177708908419 0.7232802735362753 0.04000000000000001 -1841 -0.08638177708908419 0.7232802735362753 0.06 -1842 -0.08638177708908419 0.7232802735362753 0.08000000000000002 -1843 -0.4782994778060585 0.4302448821838745 0.02 -1844 -0.4782994778060585 0.4302448821838745 0.04000000000000001 -1845 -0.4782994778060585 0.4302448821838745 0.06 -1846 -0.4782994778060585 0.4302448821838745 0.08000000000000002 -1847 0.1169512531531725 0.4869059176068478 0.02 -1848 0.1169512531531725 0.4869059176068478 0.04000000000000001 -1849 0.1169512531531725 0.4869059176068478 0.06 -1850 0.1169512531531725 0.4869059176068478 0.08000000000000002 -1851 0.4790867050754448 -0.1184475504002031 0.02 -1852 0.4790867050754448 -0.1184475504002031 0.04000000000000001 -1853 0.4790867050754448 -0.1184475504002031 0.06 -1854 0.4790867050754448 -0.1184475504002031 0.08000000000000002 -1855 -0.1252851620567597 -0.5262213943342389 0.02 -1856 -0.1252851620567597 -0.5262213943342389 0.04000000000000001 -1857 -0.1252851620567597 -0.5262213943342389 0.06 -1858 -0.1252851620567597 -0.5262213943342389 0.08000000000000002 -1859 0.05717581322842313 -0.5044143803136956 0.02 -1860 0.05717581322842313 -0.5044143803136956 0.04000000000000001 -1861 0.05717581322842313 -0.5044143803136956 0.06 -1862 0.05717581322842313 -0.5044143803136956 0.08000000000000002 -1863 -0.5590519308461908 -0.3860630008521712 0.02 -1864 -0.5590519308461908 -0.3860630008521712 0.04000000000000001 -1865 -0.5590519308461908 -0.3860630008521712 0.06 -1866 -0.5590519308461908 -0.3860630008521712 0.08000000000000002 -1867 -0.1150418949277563 0.1539988247904993 0.02 -1868 -0.1150418949277563 0.1539988247904993 0.04000000000000001 -1869 -0.1150418949277563 0.1539988247904993 0.06 -1870 -0.1150418949277563 0.1539988247904993 0.08000000000000002 -1871 0.625740041369007 -0.01898109204536381 0.02 -1872 0.625740041369007 -0.01898109204536381 0.04000000000000001 -1873 0.625740041369007 -0.01898109204536381 0.06 -1874 0.625740041369007 -0.01898109204536381 0.08000000000000002 -1875 -0.03317037890731243 -0.6688942094680634 0.02 -1876 -0.03317037890731243 -0.6688942094680634 0.04000000000000001 -1877 -0.03317037890731243 -0.6688942094680634 0.06 -1878 -0.03317037890731243 -0.6688942094680634 0.08000000000000002 -1879 0.03624433566558084 0.6730118549863521 0.02 -1880 0.03624433566558084 0.6730118549863521 0.04000000000000001 -1881 0.03624433566558084 0.6730118549863521 0.06 -1882 0.03624433566558084 0.6730118549863521 0.08000000000000002 -1883 -0.2603602255713895 -0.06027892483867578 0.02 -1884 -0.2603602255713895 -0.06027892483867578 0.04000000000000001 -1885 -0.2603602255713895 -0.06027892483867578 0.06 -1886 -0.2603602255713895 -0.06027892483867578 0.08000000000000002 -1887 -0.06710066711579087 -0.08893426543085253 0.02 -1888 -0.06710066711579087 -0.08893426543085253 0.04000000000000001 -1889 -0.06710066711579087 -0.08893426543085253 0.06 -1890 -0.06710066711579087 -0.08893426543085253 0.08000000000000002 -1891 -0.4573870695037332 -0.07642760186582892 0.02 -1892 -0.4573870695037332 -0.07642760186582892 0.04000000000000001 -1893 -0.4573870695037332 -0.07642760186582892 0.06 -1894 -0.4573870695037332 -0.07642760186582892 0.08000000000000002 -1895 -0.09564073712273591 -0.2573381514755134 0.02 -1896 -0.09564073712273591 -0.2573381514755134 0.04000000000000001 -1897 -0.09564073712273591 -0.2573381514755134 0.06 -1898 -0.09564073712273591 -0.2573381514755134 0.08000000000000002 -1899 0.1400109526938527 0.3452526017721837 0.02 -1900 0.1400109526938527 0.3452526017721837 0.04000000000000001 -1901 0.1400109526938527 0.3452526017721837 0.06 -1902 0.1400109526938527 0.3452526017721837 0.08000000000000002 -1903 0.3361492571141538 -0.1404719131497 0.02 -1904 0.3361492571141538 -0.1404719131497 0.04000000000000001 -1905 0.3361492571141538 -0.1404719131497 0.06 -1906 0.3361492571141538 -0.1404719131497 0.08000000000000002 -1907 -0.5876433989377084 0.7113331346157019 0.02 -1908 -0.5876433989377084 0.7113331346157019 0.04000000000000001 -1909 -0.5876433989377084 0.7113331346157019 0.06 -1910 -0.5876433989377084 0.7113331346157019 0.08000000000000002 -1911 0.7182531413760752 0.5730427977930983 0.02 -1912 0.7182531413760752 0.5730427977930983 0.04000000000000001 -1913 0.7182531413760752 0.5730427977930983 0.06 -1914 0.7182531413760752 0.5730427977930983 0.08000000000000002 -1915 0.5731253148319749 -0.7183424706146012 0.02 -1916 0.5731253148319749 -0.7183424706146012 0.04000000000000001 -1917 0.5731253148319749 -0.7183424706146012 0.06 -1918 0.5731253148319749 -0.7183424706146012 0.08000000000000002 -1919 -0.7267637888520205 -0.5521997695027439 0.02 -1920 -0.7267637888520205 -0.5521997695027439 0.04000000000000001 -1921 -0.7267637888520205 -0.5521997695027439 0.06 -1922 -0.7267637888520205 -0.5521997695027439 0.08000000000000002 -1923 -0.6501122839396156 0.6284622386129644 0.02 -1924 -0.6501122839396156 0.6284622386129644 0.04000000000000001 -1925 -0.6501122839396156 0.6284622386129644 0.06 -1926 -0.6501122839396156 0.6284622386129644 0.08000000000000002 -1927 0.6261338336978031 0.6753788591518668 0.02 -1928 0.6261338336978031 0.6753788591518668 0.04000000000000001 -1929 0.6261338336978031 0.6753788591518668 0.06 -1930 0.6261338336978031 0.6753788591518668 0.08000000000000002 -1931 0.6754268178891599 -0.6262038638839817 0.02 -1932 0.6754268178891599 -0.6262038638839817 0.04000000000000001 -1933 0.6754268178891599 -0.6262038638839817 0.06 -1934 0.6754268178891599 -0.6262038638839817 0.08000000000000002 -1935 -0.6247774023037141 -0.6752677848129451 0.02 -1936 -0.6247774023037141 -0.6752677848129451 0.04000000000000001 -1937 -0.6247774023037141 -0.6752677848129451 0.06 -1938 -0.6247774023037141 -0.6752677848129451 0.08000000000000002 -1939 0.05961375655305829 0.05433076127850857 0.02 -1940 0.05961375655305829 0.05433076127850857 0.04000000000000001 -1941 0.05961375655305829 0.05433076127850857 0.06 -1942 0.05961375655305829 0.05433076127850857 0.08000000000000002 -1943 -0.4533454490453802 -0.196936480116006 0.02 -1944 -0.4533454490453802 -0.196936480116006 0.04000000000000001 -1945 -0.4533454490453802 -0.196936480116006 0.06 -1946 -0.4533454490453802 -0.196936480116006 0.08000000000000002 -1947 0.07158624384248355 -0.379769591245705 0.02 -1948 0.07158624384248355 -0.379769591245705 0.04000000000000001 -1949 0.07158624384248355 -0.379769591245705 0.06 -1950 0.07158624384248355 -0.379769591245705 0.08000000000000002 -1951 -0.7358296271717679 0.2871230360154149 0.02 -1952 -0.7358296271717679 0.2871230360154149 0.04000000000000001 -1953 -0.7358296271717679 0.2871230360154149 0.06 -1954 -0.7358296271717679 0.2871230360154149 0.08000000000000002 -1955 0.2742396572924233 0.7517700822479314 0.02 -1956 0.2742396572924233 0.7517700822479314 0.04000000000000001 -1957 0.2742396572924233 0.7517700822479314 0.06 -1958 0.2742396572924233 0.7517700822479314 0.08000000000000002 -1959 0.7436450706181265 -0.2750690386147977 0.02 -1960 0.7436450706181265 -0.2750690386147977 0.04000000000000001 -1961 0.7436450706181265 -0.2750690386147977 0.06 -1962 0.7436450706181265 -0.2750690386147977 0.08000000000000002 -1963 -0.2432002687080442 -0.7366468062073843 0.02 -1964 -0.2432002687080442 -0.7366468062073843 0.04000000000000001 -1965 -0.2432002687080442 -0.7366468062073843 0.06 -1966 -0.2432002687080442 -0.7366468062073843 0.08000000000000002 -1967 -0.2119625161807704 0.7684636695715725 0.02 -1968 -0.2119625161807704 0.7684636695715725 0.04000000000000001 -1969 -0.2119625161807704 0.7684636695715725 0.06 -1970 -0.2119625161807704 0.7684636695715725 0.08000000000000002 -1971 -0.7420287683091251 -0.1960377794221552 0.02 -1972 -0.7420287683091251 -0.1960377794221552 0.04000000000000001 -1973 -0.7420287683091251 -0.1960377794221552 0.06 -1974 -0.7420287683091251 -0.1960377794221552 0.08000000000000002 -1975 0.2078480314046554 -0.03108453521993102 0.02 -1976 0.2078480314046554 -0.03108453521993102 0.04000000000000001 -1977 0.2078480314046554 -0.03108453521993102 0.06 -1978 0.2078480314046554 -0.03108453521993102 0.08000000000000002 -1979 -0.7623744926063392 -0.07374826076866341 0.02 -1980 -0.7623744926063392 -0.07374826076866341 0.04000000000000001 -1981 -0.7623744926063392 -0.07374826076866341 0.06 -1982 -0.7623744926063392 -0.07374826076866341 0.08000000000000002 -1983 -0.909714444924309 0.1962016670549832 0.02 -1984 -0.909714444924309 0.1962016670549832 0.04000000000000001 -1985 -0.909714444924309 0.1962016670549832 0.06 -1986 -0.909714444924309 0.1962016670549832 0.08000000000000002 -1987 0.196878670604156 0.9276089183973528 0.02 -1988 0.196878670604156 0.9276089183973528 0.04000000000000001 -1989 0.196878670604156 0.9276089183973528 0.06 -1990 0.196878670604156 0.9276089183973528 0.08000000000000002 -1991 0.9193957067130305 -0.1962984183531116 0.02 -1992 0.9193957067130305 -0.1962984183531116 0.04000000000000001 -1993 0.9193957067130305 -0.1962984183531116 0.06 -1994 0.9193957067130305 -0.1962984183531116 0.08000000000000002 -1995 -0.1997934070668995 -0.923321303029304 0.02 -1996 -0.1997934070668995 -0.923321303029304 0.04000000000000001 -1997 -0.1997934070668995 -0.923321303029304 0.06 -1998 -0.1997934070668995 -0.923321303029304 0.08000000000000002 -1999 -0.1192602115718688 0.9075770128178854 0.02 -2000 -0.1192602115718688 0.9075770128178854 0.04000000000000001 -2001 -0.1192602115718688 0.9075770128178854 0.06 -2002 -0.1192602115718688 0.9075770128178854 0.08000000000000002 -2003 0.9102749207305986 0.107494640156683 0.02 -2004 0.9102749207305986 0.107494640156683 0.04000000000000001 -2005 0.9102749207305986 0.107494640156683 0.06 -2006 0.9102749207305986 0.107494640156683 0.08000000000000002 -2007 0.1078427730155398 -0.9107691188307522 0.02 -2008 0.1078427730155398 -0.9107691188307522 0.04000000000000001 -2009 0.1078427730155398 -0.9107691188307522 0.06 -2010 0.1078427730155398 -0.9107691188307522 0.08000000000000002 -2011 -0.9047070132952686 -0.1254546072148296 0.02 -2012 -0.9047070132952686 -0.1254546072148296 0.04000000000000001 -2013 -0.9047070132952686 -0.1254546072148296 0.06 -2014 -0.9047070132952686 -0.1254546072148296 0.08000000000000002 -2015 0.03289221532974201 -0.09665339993729041 0.02 -2016 0.03289221532974201 -0.09665339993729041 0.04000000000000001 -2017 0.03289221532974201 -0.09665339993729041 0.06 -2018 0.03289221532974201 -0.09665339993729041 0.08000000000000002 -2019 -0.6339771303171474 0.1989722782787046 0.02 -2020 -0.6339771303171474 0.1989722782787046 0.04000000000000001 -2021 -0.6339771303171474 0.1989722782787046 0.06 -2022 -0.6339771303171474 0.1989722782787046 0.08000000000000002 -2023 -0.2825586775368157 0.09219772267569844 0.02 -2024 -0.2825586775368157 0.09219772267569844 0.04000000000000001 -2025 -0.2825586775368157 0.09219772267569844 0.06 -2026 -0.2825586775368157 0.09219772267569844 0.08000000000000002 -2027 -0.1120676417551462 -0.3482995528674908 0.02 -2028 -0.1120676417551462 -0.3482995528674908 0.04000000000000001 -2029 -0.1120676417551462 -0.3482995528674908 0.06 -2030 -0.1120676417551462 -0.3482995528674908 0.08000000000000002 -2031 -0.5764632137055026 -0.2101910176660774 0.02 -2032 -0.5764632137055026 -0.2101910176660774 0.04000000000000001 -2033 -0.5764632137055026 -0.2101910176660774 0.06 -2034 -0.5764632137055026 -0.2101910176660774 0.08000000000000002 -2035 0.1041409808248331 -0.02940891186701775 0.02 -2036 0.1041409808248331 -0.02940891186701775 0.04000000000000001 -2037 0.1041409808248331 -0.02940891186701775 0.06 -2038 0.1041409808248331 -0.02940891186701775 0.08000000000000002 -2039 -0.3059507321927566 0.2524534980281406 0.02 -2040 -0.3059507321927566 0.2524534980281406 0.04000000000000001 -2041 -0.3059507321927566 0.2524534980281406 0.06 -2042 -0.3059507321927566 0.2524534980281406 0.08000000000000002 -2043 -0.03067866374111903 -0.4334518599590248 0.02 -2044 -0.03067866374111903 -0.4334518599590248 0.04000000000000001 -2045 -0.03067866374111903 -0.4334518599590248 0.06 -2046 -0.03067866374111903 -0.4334518599590248 0.08000000000000002 -2047 -0.7721004376432828 0.4777513885211878 0.02 -2048 -0.7721004376432828 0.4777513885211878 0.04000000000000001 -2049 -0.7721004376432828 0.4777513885211878 0.06 -2050 -0.7721004376432828 0.4777513885211878 0.08000000000000002 -2051 0.4820252404437138 0.780162643954427 0.02 -2052 0.4820252404437138 0.780162643954427 0.04000000000000001 -2053 0.4820252404437138 0.780162643954427 0.06 -2054 0.4820252404437138 0.780162643954427 0.08000000000000002 -2055 0.7796091221420068 -0.4822688004229307 0.02 -2056 0.7796091221420068 -0.4822688004229307 0.04000000000000001 -2057 0.7796091221420068 -0.4822688004229307 0.06 -2058 0.7796091221420068 -0.4822688004229307 0.08000000000000002 -2059 -0.4809833399183051 -0.7803828576843836 0.02 -2060 -0.4809833399183051 -0.7803828576843836 0.04000000000000001 -2061 -0.4809833399183051 -0.7803828576843836 0.06 -2062 -0.4809833399183051 -0.7803828576843836 0.08000000000000002 -2063 -0.4087448112792932 0.8200465835534014 0.02 -2064 -0.4087448112792932 0.8200465835534014 0.04000000000000001 -2065 -0.4087448112792932 0.8200465835534014 0.06 -2066 -0.4087448112792932 0.8200465835534014 0.08000000000000002 -2067 0.8002865935476932 0.4281836062087549 0.02 -2068 0.8002865935476932 0.4281836062087549 0.04000000000000001 -2069 0.8002865935476932 0.4281836062087549 0.06 -2070 0.8002865935476932 0.4281836062087549 0.08000000000000002 -2071 0.4281928958874004 -0.8004453282351094 0.02 -2072 0.4281928958874004 -0.8004453282351094 0.04000000000000001 -2073 0.4281928958874004 -0.8004453282351094 0.06 -2074 0.4281928958874004 -0.8004453282351094 0.08000000000000002 -2075 -0.8344702347942566 -0.431935076849929 0.02 -2076 -0.8344702347942566 -0.431935076849929 0.04000000000000001 -2077 -0.8344702347942566 -0.431935076849929 0.06 -2078 -0.8344702347942566 -0.431935076849929 0.08000000000000002 -2079 -0.5449938075776911 0.08085138723857922 0.02 -2080 -0.5449938075776911 0.08085138723857922 0.04000000000000001 -2081 -0.5449938075776911 0.08085138723857922 0.06 -2082 -0.5449938075776911 0.08085138723857922 0.08000000000000002 -2083 -0.1036385592557349 0.4200407985042778 0.02 -2084 -0.1036385592557349 0.4200407985042778 0.04000000000000001 -2085 -0.1036385592557349 0.4200407985042778 0.06 -2086 -0.1036385592557349 0.4200407985042778 0.08000000000000002 -2087 0.4059447738493815 0.1254769569297251 0.02 -2088 0.4059447738493815 0.1254769569297251 0.04000000000000001 -2089 0.4059447738493815 0.1254769569297251 0.06 -2090 0.4059447738493815 0.1254769569297251 0.08000000000000002 -2091 -0.1480365604421043 0.002340056667267008 0.02 -2092 -0.1480365604421043 0.002340056667267008 0.04000000000000001 -2093 -0.1480365604421043 0.002340056667267008 0.06 -2094 -0.1480365604421043 0.002340056667267008 0.08000000000000002 -2095 0.4435118176807452 0.5462711800987253 0.02 -2096 0.4435118176807452 0.5462711800987253 0.04000000000000001 -2097 0.4435118176807452 0.5462711800987253 0.06 -2098 0.4435118176807452 0.5462711800987253 0.08000000000000002 -2099 0.5481423609560856 -0.444702129821462 0.02 -2100 0.5481423609560856 -0.444702129821462 0.04000000000000001 -2101 0.5481423609560856 -0.444702129821462 0.06 -2102 0.5481423609560856 -0.444702129821462 0.08000000000000002 -2103 -0.4501631950861821 -0.5270557191543739 0.02 -2104 -0.4501631950861821 -0.5270557191543739 0.04000000000000001 -2105 -0.4501631950861821 -0.5270557191543739 0.06 -2106 -0.4501631950861821 -0.5270557191543739 0.08000000000000002 -2107 -0.4247568760849733 0.5096373509841007 0.02 -2108 -0.4247568760849733 0.5096373509841007 0.04000000000000001 -2109 -0.4247568760849733 0.5096373509841007 0.06 -2110 -0.4247568760849733 0.5096373509841007 0.08000000000000002 -2111 0.4988201351912681 0.3841490403209035 0.02 -2112 0.4988201351912681 0.3841490403209035 0.04000000000000001 -2113 0.4988201351912681 0.3841490403209035 0.06 -2114 0.4988201351912681 0.3841490403209035 0.08000000000000002 -2115 0.3859265328060342 -0.5001732242911401 0.02 -2116 0.3859265328060342 -0.5001732242911401 0.04000000000000001 -2117 0.3859265328060342 -0.5001732242911401 0.06 -2118 0.3859265328060342 -0.5001732242911401 0.08000000000000002 -2119 0.1997661751917058 0.08583574604225598 0.02 -2120 0.1997661751917058 0.08583574604225598 0.04000000000000001 -2121 0.1997661751917058 0.08583574604225598 0.06 -2122 0.1997661751917058 0.08583574604225598 0.08000000000000002 -2123 -0.2997409692737895 -0.490908174504708 0.02 -2124 -0.2997409692737895 -0.490908174504708 0.04000000000000001 -2125 -0.2997409692737895 -0.490908174504708 0.06 -2126 -0.2997409692737895 -0.490908174504708 0.08000000000000002 -2127 0.2526718728084643 -0.5230506066767192 0.02 -2128 0.2526718728084643 -0.5230506066767192 0.04000000000000001 -2129 0.2526718728084643 -0.5230506066767192 0.06 -2130 0.2526718728084643 -0.5230506066767192 0.08000000000000002 -2131 -0.5764312502826053 -0.03692554837926267 0.02 -2132 -0.5764312502826053 -0.03692554837926267 0.04000000000000001 -2133 -0.5764312502826053 -0.03692554837926267 0.06 -2134 -0.5764312502826053 -0.03692554837926267 0.08000000000000002 -2135 0.233317559360037 0.6745601648264888 0.02 -2136 0.233317559360037 0.6745601648264888 0.04000000000000001 -2137 0.233317559360037 0.6745601648264888 0.06 -2138 0.233317559360037 0.6745601648264888 0.08000000000000002 -2139 0.6664834809029515 -0.2317937327447079 0.02 -2140 0.6664834809029515 -0.2317937327447079 0.04000000000000001 -2141 0.6664834809029515 -0.2317937327447079 0.06 -2142 0.6664834809029515 -0.2317937327447079 0.08000000000000002 -2143 -0.2172157307211868 -0.6308083555875714 0.02 -2144 -0.2172157307211868 -0.6308083555875714 0.04000000000000001 -2145 -0.2172157307211868 -0.6308083555875714 0.06 -2146 -0.2172157307211868 -0.6308083555875714 0.08000000000000002 -2147 -0.1729333115087907 0.6911077680080351 0.02 -2148 -0.1729333115087907 0.6911077680080351 0.04000000000000001 -2149 -0.1729333115087907 0.6911077680080351 0.06 -2150 -0.1729333115087907 0.6911077680080351 0.08000000000000002 -2151 0.671980368914682 0.1502079082329276 0.02 -2152 0.671980368914682 0.1502079082329276 0.04000000000000001 -2153 0.671980368914682 0.1502079082329276 0.06 -2154 0.671980368914682 0.1502079082329276 0.08000000000000002 -2155 0.1408397166201512 -0.6705572836873781 0.02 -2156 0.1408397166201512 -0.6705572836873781 0.04000000000000001 -2157 0.1408397166201512 -0.6705572836873781 0.06 -2158 0.1408397166201512 -0.6705572836873781 0.08000000000000002 -2159 0.2773272845560157 0.4690803297873597 0.02 -2160 0.2773272845560157 0.4690803297873597 0.04000000000000001 -2161 0.2773272845560157 0.4690803297873597 0.06 -2162 0.2773272845560157 0.4690803297873597 0.08000000000000002 -2163 0.4685969294965288 -0.2785336807628994 0.02 -2164 0.4685969294965288 -0.2785336807628994 0.04000000000000001 -2165 0.4685969294965288 -0.2785336807628994 0.06 -2166 0.4685969294965288 -0.2785336807628994 0.08000000000000002 -2167 0.5264882656905799 0.2476519001455232 0.02 -2168 0.5264882656905799 0.2476519001455232 0.04000000000000001 -2169 0.5264882656905799 0.2476519001455232 0.06 -2170 0.5264882656905799 0.2476519001455232 0.08000000000000002 -2171 0.1358362248963335 -0.1899752134225425 0.02 -2172 0.1358362248963335 -0.1899752134225425 0.04000000000000001 -2173 0.1358362248963335 -0.1899752134225425 0.06 -2174 0.1358362248963335 -0.1899752134225425 0.08000000000000002 -2175 -0.6584505608993372 0.3710092945353671 0.02 -2176 -0.6584505608993372 0.3710092945353671 0.04000000000000001 -2177 -0.6584505608993372 0.3710092945353671 0.06 -2178 -0.6584505608993372 0.3710092945353671 0.08000000000000002 -2179 0.02775643679018649 0.2312244083777829 0.02 -2180 0.02775643679018649 0.2312244083777829 0.04000000000000001 -2181 0.02775643679018649 0.2312244083777829 0.06 -2182 0.02775643679018649 0.2312244083777829 0.08000000000000002 -2183 -0.035369291719122 0.0692857418446034 0.02 -2184 -0.035369291719122 0.0692857418446034 0.04000000000000001 -2185 -0.035369291719122 0.0692857418446034 0.06 -2186 -0.035369291719122 0.0692857418446034 0.08000000000000002 -2187 -0.7283330523393017 0.1989359825089343 0.02 -2188 -0.7283330523393017 0.1989359825089343 0.04000000000000001 -2189 -0.7283330523393017 0.1989359825089343 0.06 -2190 -0.7283330523393017 0.1989359825089343 0.08000000000000002 -2191 0.02803555178491281 0.4215173175592299 0.02 -2192 0.02803555178491281 0.4215173175592299 0.04000000000000001 -2193 0.02803555178491281 0.4215173175592299 0.06 -2194 0.02803555178491281 0.4215173175592299 0.08000000000000002 -2195 0.4172254733843679 -0.03095085732469068 0.02 -2196 0.4172254733843679 -0.03095085732469068 0.04000000000000001 -2197 0.4172254733843679 -0.03095085732469068 0.06 -2198 0.4172254733843679 -0.03095085732469068 0.08000000000000002 -2199 -0.5531542396079592 0.5703748075432478 0.02 -2200 -0.5531542396079592 0.5703748075432478 0.04000000000000001 -2201 -0.5531542396079592 0.5703748075432478 0.06 -2202 -0.5531542396079592 0.5703748075432478 0.08000000000000002 -2203 -0.2233020411609802 0.5024859737199666 0.02 -2204 -0.2233020411609802 0.5024859737199666 0.04000000000000001 -2205 -0.2233020411609802 0.5024859737199666 0.06 -2206 -0.2233020411609802 0.5024859737199666 0.08000000000000002 -2207 -0.2212601963844741 0.08942363684758572 0.02 -2208 -0.2212601963844741 0.08942363684758572 0.04000000000000001 -2209 -0.2212601963844741 0.08942363684758572 0.06 -2210 -0.2212601963844741 0.08942363684758572 0.08000000000000002 -2211 0.549376261754289 -0.08148282591001121 0.02 -2212 0.549376261754289 -0.08148282591001121 0.04000000000000001 -2213 0.549376261754289 -0.08148282591001121 0.06 -2214 0.549376261754289 -0.08148282591001121 0.08000000000000002 -2215 -0.04231427324180136 -0.5913297424500011 0.02 -2216 -0.04231427324180136 -0.5913297424500011 0.04000000000000001 -2217 -0.04231427324180136 -0.5913297424500011 0.06 -2218 -0.04231427324180136 -0.5913297424500011 0.08000000000000002 -2219 0.0725037981604873 0.5892004017059468 0.02 -2220 0.0725037981604873 0.5892004017059468 0.04000000000000001 -2221 0.0725037981604873 0.5892004017059468 0.06 -2222 0.0725037981604873 0.5892004017059468 0.08000000000000002 -2223 -0.3591430595110624 0.8665004124274038 0.02 -2224 -0.3591430595110624 0.8665004124274038 0.04000000000000001 -2225 -0.3591430595110624 0.8665004124274038 0.06 -2226 -0.3591430595110624 0.8665004124274038 0.08000000000000002 -2227 0.8343808092508768 0.3491396519037765 0.02 -2228 0.8343808092508768 0.3491396519037765 0.04000000000000001 -2229 0.8343808092508768 0.3491396519037765 0.06 -2230 0.8343808092508768 0.3491396519037765 0.08000000000000002 -2231 0.3490014339920512 -0.8345450539496075 0.02 -2232 0.3490014339920512 -0.8345450539496075 0.04000000000000001 -2233 0.3490014339920512 -0.8345450539496075 0.06 -2234 0.3490014339920512 -0.8345450539496075 0.08000000000000002 -2235 -0.8455494643298137 -0.3622401242500555 0.02 -2236 -0.8455494643298137 -0.3622401242500555 0.04000000000000001 -2237 -0.8455494643298137 -0.3622401242500555 0.06 -2238 -0.8455494643298137 -0.3622401242500555 0.08000000000000002 -2239 -0.8108956770324737 0.4052978005386882 0.02 -2240 -0.8108956770324737 0.4052978005386882 0.04000000000000001 -2241 -0.8108956770324737 0.4052978005386882 0.06 -2242 -0.8108956770324737 0.4052978005386882 0.08000000000000002 -2243 0.4391324951811535 0.8296031461190513 0.02 -2244 0.4391324951811535 0.8296031461190513 0.04000000000000001 -2245 0.4391324951811535 0.8296031461190513 0.06 -2246 0.4391324951811535 0.8296031461190513 0.08000000000000002 -2247 0.8286770874347554 -0.4394358472307961 0.02 -2248 0.8286770874347554 -0.4394358472307961 0.04000000000000001 -2249 0.8286770874347554 -0.4394358472307961 0.06 -2250 0.8286770874347554 -0.4394358472307961 0.08000000000000002 -2251 -0.4381482979571988 -0.8296944782760699 0.02 -2252 -0.4381482979571988 -0.8296944782760699 0.04000000000000001 -2253 -0.4381482979571988 -0.8296944782760699 0.06 -2254 -0.4381482979571988 -0.8296944782760699 0.08000000000000002 -2255 0.9196395491480548 -0.04889650790274243 0.02 -2256 0.9196395491480548 -0.04889650790274243 0.04000000000000001 -2257 0.9196395491480548 -0.04889650790274243 0.06 -2258 0.9196395491480548 -0.04889650790274243 0.08000000000000002 -2259 -0.04888861491479355 -0.9203381901848371 0.02 -2260 -0.04888861491479355 -0.9203381901848371 0.04000000000000001 -2261 -0.04888861491479355 -0.9203381901848371 0.06 -2262 -0.04888861491479355 -0.9203381901848371 0.08000000000000002 -2263 0.04106626710905541 0.9181987594861903 0.02 -2264 0.04106626710905541 0.9181987594861903 0.04000000000000001 -2265 0.04106626710905541 0.9181987594861903 0.06 -2266 0.04106626710905541 0.9181987594861903 0.08000000000000002 -2267 -0.9181231607368404 0.05673640264366658 0.02 -2268 -0.9181231607368404 0.05673640264366658 0.04000000000000001 -2269 -0.9181231607368404 0.05673640264366658 0.06 -2270 -0.9181231607368404 0.05673640264366658 0.08000000000000002 -2271 -0.4306746377266381 0.2616975499548028 0.02 -2272 -0.4306746377266381 0.2616975499548028 0.04000000000000001 -2273 -0.4306746377266381 0.2616975499548028 0.06 -2274 -0.4306746377266381 0.2616975499548028 0.08000000000000002 -2275 -0.3189848618778681 -0.234485804771236 0.02 -2276 -0.3189848618778681 -0.234485804771236 0.04000000000000001 -2277 -0.3189848618778681 -0.234485804771236 0.06 -2278 -0.3189848618778681 -0.234485804771236 0.08000000000000002 -2279 -0.703576291382104 -0.2848750589314329 0.02 -2280 -0.703576291382104 -0.2848750589314329 0.04000000000000001 -2281 -0.703576291382104 -0.2848750589314329 0.06 -2282 -0.703576291382104 -0.2848750589314329 0.08000000000000002 -2283 -0.6831740336737175 -0.3467728689088223 0.02 -2284 -0.6831740336737175 -0.3467728689088223 0.04000000000000001 -2285 -0.6831740336737175 -0.3467728689088223 0.06 -2286 -0.6831740336737175 -0.3467728689088223 0.08000000000000002 -2287 -0.6776336270939101 0.4472363103286253 0.02 -2288 -0.6776336270939101 0.4472363103286253 0.04000000000000001 -2289 -0.6776336270939101 0.4472363103286253 0.06 -2290 -0.6776336270939101 0.4472363103286253 0.08000000000000002 -2291 0.8311384623550437 0.01015308251562548 0.02 -2292 0.8311384623550437 0.01015308251562548 0.04000000000000001 -2293 0.8311384623550437 0.01015308251562548 0.06 -2294 0.8311384623550437 0.01015308251562548 0.08000000000000002 -2295 0.01299828530500507 -0.8326571797651593 0.02 -2296 0.01299828530500507 -0.8326571797651593 0.04000000000000001 -2297 0.01299828530500507 -0.8326571797651593 0.06 -2298 0.01299828530500507 -0.8326571797651593 0.08000000000000002 -2299 -0.025132545105463 0.8347230416713295 0.02 -2300 -0.025132545105463 0.8347230416713295 0.04000000000000001 -2301 -0.025132545105463 0.8347230416713295 0.06 -2302 -0.025132545105463 0.8347230416713295 0.08000000000000002 -2303 0.3403081250555418 0.6872880204304391 0.02 -2304 0.3403081250555418 0.6872880204304391 0.04000000000000001 -2305 0.3403081250555418 0.6872880204304391 0.06 -2306 0.3403081250555418 0.6872880204304391 0.08000000000000002 -2307 0.6857575313013643 -0.3410204422452798 0.02 -2308 0.6857575313013643 -0.3410204422452798 0.04000000000000001 -2309 0.6857575313013643 -0.3410204422452798 0.06 -2310 0.6857575313013643 -0.3410204422452798 0.08000000000000002 -2311 -0.3329818888151 -0.70054125787045 0.02 -2312 -0.3329818888151 -0.70054125787045 0.04000000000000001 -2313 -0.3329818888151 -0.70054125787045 0.06 -2314 -0.3329818888151 -0.70054125787045 0.08000000000000002 -2315 -0.2753392895102883 0.716238531094035 0.02 -2316 -0.2753392895102883 0.716238531094035 0.04000000000000001 -2317 -0.2753392895102883 0.716238531094035 0.06 -2318 -0.2753392895102883 0.716238531094035 0.08000000000000002 -2319 0.7474057402732359 0.2772263054801198 0.02 -2320 0.7474057402732359 0.2772263054801198 0.04000000000000001 -2321 0.7474057402732359 0.2772263054801198 0.06 -2322 0.7474057402732359 0.2772263054801198 0.08000000000000002 -2323 0.2763713755837198 -0.747361843857577 0.02 -2324 0.2763713755837198 -0.747361843857577 0.04000000000000001 -2325 0.2763713755837198 -0.747361843857577 0.06 -2326 0.2763713755837198 -0.747361843857577 0.08000000000000002 -2327 0.4617302352672168 0.6641000163382851 0.02 -2328 0.4617302352672168 0.6641000163382851 0.04000000000000001 -2329 0.4617302352672168 0.6641000163382851 0.06 -2330 0.4617302352672168 0.6641000163382851 0.08000000000000002 -2331 0.6641755837987446 -0.462212035469022 0.02 -2332 0.6641755837987446 -0.462212035469022 0.04000000000000001 -2333 0.6641755837987446 -0.462212035469022 0.06 -2334 0.6641755837987446 -0.462212035469022 0.08000000000000002 -2335 -0.4584144402846274 -0.6600817508765464 0.02 -2336 -0.4584144402846274 -0.6600817508765464 0.04000000000000001 -2337 -0.4584144402846274 -0.6600817508765464 0.06 -2338 -0.4584144402846274 -0.6600817508765464 0.08000000000000002 -2339 -0.3928163526354655 0.7039129685139371 0.02 -2340 -0.3928163526354655 0.7039129685139371 0.04000000000000001 -2341 -0.3928163526354655 0.7039129685139371 0.06 -2342 -0.3928163526354655 0.7039129685139371 0.08000000000000002 -2343 0.7294991524264004 0.3854010828019568 0.02 -2344 0.7294991524264004 0.3854010828019568 0.04000000000000001 -2345 0.7294991524264004 0.3854010828019568 0.06 -2346 0.7294991524264004 0.3854010828019568 0.08000000000000002 -2347 0.3853629890688207 -0.7297691905569295 0.02 -2348 0.3853629890688207 -0.7297691905569295 0.04000000000000001 -2349 0.3853629890688207 -0.7297691905569295 0.06 -2350 0.3853629890688207 -0.7297691905569295 0.08000000000000002 -2351 -0.0828478864105468 0.222787057711827 0.02 -2352 -0.0828478864105468 0.222787057711827 0.04000000000000001 -2353 -0.0828478864105468 0.222787057711827 0.06 -2354 -0.0828478864105468 0.222787057711827 0.08000000000000002 -2355 0.2237235225184439 -0.2707048071622312 0.02 -2356 0.2237235225184439 -0.2707048071622312 0.04000000000000001 -2357 0.2237235225184439 -0.2707048071622312 0.06 -2358 0.2237235225184439 -0.2707048071622312 0.08000000000000002 -2359 0.3363303964504248 -0.2651986651500947 0.02 -2360 0.3363303964504248 -0.2651986651500947 0.04000000000000001 -2361 0.3363303964504248 -0.2651986651500947 0.06 -2362 0.3363303964504248 -0.2651986651500947 0.08000000000000002 -2363 0.2586737271877743 0.3397244032112927 0.02 -2364 0.2586737271877743 0.3397244032112927 0.04000000000000001 -2365 0.2586737271877743 0.3397244032112927 0.06 -2366 0.2586737271877743 0.3397244032112927 0.08000000000000002 -2367 0.3770982996489567 0.3222179808712004 0.02 -2368 0.3770982996489567 0.3222179808712004 0.04000000000000001 -2369 0.3770982996489567 0.3222179808712004 0.06 -2370 0.3770982996489567 0.3222179808712004 0.08000000000000002 -2371 0.3243809176449824 -0.3822680017017484 0.02 -2372 0.3243809176449824 -0.3822680017017484 0.04000000000000001 -2373 0.3243809176449824 -0.3822680017017484 0.06 -2374 0.3243809176449824 -0.3822680017017484 0.08000000000000002 -2375 0.3327262017821993 0.07817155868686239 0.02 -2376 0.3327262017821993 0.07817155868686239 0.04000000000000001 -2377 0.3327262017821993 0.07817155868686239 0.06 -2378 0.3327262017821993 0.07817155868686239 0.08000000000000002 -2379 0.5425497768767584 -0.01734534175699794 0.02 -2380 0.5425497768767584 -0.01734534175699794 0.04000000000000001 -2381 0.5425497768767584 -0.01734534175699794 0.06 -2382 0.5425497768767584 -0.01734534175699794 0.08000000000000002 -2383 -0.01396045536158918 0.5512496575805828 0.02 -2384 -0.01396045536158918 0.5512496575805828 0.04000000000000001 -2385 -0.01396045536158918 0.5512496575805828 0.06 -2386 -0.01396045536158918 0.5512496575805828 0.08000000000000002 -2387 -0.5512651160614166 0.3076523146195421 0.02 -2388 -0.5512651160614166 0.3076523146195421 0.04000000000000001 -2389 -0.5512651160614166 0.3076523146195421 0.06 -2390 -0.5512651160614166 0.3076523146195421 0.08000000000000002 -2391 -0.7163852872670544 -0.1396422161982286 0.02 -2392 -0.7163852872670544 -0.1396422161982286 0.04000000000000001 -2393 -0.7163852872670544 -0.1396422161982286 0.06 -2394 -0.7163852872670544 -0.1396422161982286 0.08000000000000002 -2395 -0.6511422473993753 -0.1359071396149372 0.02 -2396 -0.6511422473993753 -0.1359071396149372 0.04000000000000001 -2397 -0.6511422473993753 -0.1359071396149372 0.06 -2398 -0.6511422473993753 -0.1359071396149372 0.08000000000000002 -2399 -0.2042242108415093 -0.2485075156706113 0.02 -2400 -0.2042242108415093 -0.2485075156706113 0.04000000000000001 -2401 -0.2042242108415093 -0.2485075156706113 0.06 -2402 -0.2042242108415093 -0.2485075156706113 0.08000000000000002 -2403 -0.2468751991455828 0.3173863441431322 0.02 -2404 -0.2468751991455828 0.3173863441431322 0.04000000000000001 -2405 -0.2468751991455828 0.3173863441431322 0.06 -2406 -0.2468751991455828 0.3173863441431322 0.08000000000000002 -2407 0.3017869585304819 -0.4881825219737158 0.02 -2408 0.3017869585304819 -0.4881825219737158 0.04000000000000001 -2409 0.3017869585304819 -0.4881825219737158 0.06 -2410 0.3017869585304819 -0.4881825219737158 0.08000000000000002 -2411 -0.1030402550787832 0.3499083778867725 0.02 -2412 -0.1030402550787832 0.3499083778867725 0.04000000000000001 -2413 -0.1030402550787832 0.3499083778867725 0.06 -2414 -0.1030402550787832 0.3499083778867725 0.08000000000000002 -2415 0.3270211387810611 -0.03121154280665032 0.02 -2416 0.3270211387810611 -0.03121154280665032 0.04000000000000001 -2417 0.3270211387810611 -0.03121154280665032 0.06 -2418 0.3270211387810611 -0.03121154280665032 0.08000000000000002 -2419 0.02727508435104043 0.3369905382921691 0.02 -2420 0.02727508435104043 0.3369905382921691 0.04000000000000001 -2421 0.02727508435104043 0.3369905382921691 0.06 -2422 0.02727508435104043 0.3369905382921691 0.08000000000000002 -2423 -0.2578249858272362 0.6182155773360569 0.02 -2424 -0.2578249858272362 0.6182155773360569 0.04000000000000001 -2425 -0.2578249858272362 0.6182155773360569 0.06 -2426 -0.2578249858272362 0.6182155773360569 0.08000000000000002 -2427 0.6061696451656114 0.2572709168094842 0.02 -2428 0.6061696451656114 0.2572709168094842 0.04000000000000001 -2429 0.6061696451656114 0.2572709168094842 0.06 -2430 0.6061696451656114 0.2572709168094842 0.08000000000000002 -2431 -0.4318218663118083 0.1398381052134658 0.02 -2432 -0.4318218663118083 0.1398381052134658 0.04000000000000001 -2433 -0.4318218663118083 0.1398381052134658 0.06 -2434 -0.4318218663118083 0.1398381052134658 0.08000000000000002 -2435 -0.9205186074618348 0.1366894840511481 0.02 -2436 -0.9205186074618348 0.1366894840511481 0.04000000000000001 -2437 -0.9205186074618348 0.1366894840511481 0.06 -2438 -0.9205186074618348 0.1366894840511481 0.08000000000000002 -2439 0.1506053976324923 0.9178021341169079 0.02 -2440 0.1506053976324923 0.9178021341169079 0.04000000000000001 -2441 0.1506053976324923 0.9178021341169079 0.06 -2442 0.1506053976324923 0.9178021341169079 0.08000000000000002 -2443 0.8961617825212087 -0.1412708049913559 0.02 -2444 0.8961617825212087 -0.1412708049913559 0.04000000000000001 -2445 0.8961617825212087 -0.1412708049913559 0.06 -2446 0.8961617825212087 -0.1412708049913559 0.08000000000000002 -2447 -0.1445920171026402 -0.8993514124303486 0.02 -2448 -0.1445920171026402 -0.8993514124303486 0.04000000000000001 -2449 -0.1445920171026402 -0.8993514124303486 0.06 -2450 -0.1445920171026402 -0.8993514124303486 0.08000000000000002 -2451 0.5875350688548576 -0.3176646077228484 0.02 -2452 0.5875350688548576 -0.3176646077228484 0.04000000000000001 -2453 0.5875350688548576 -0.3176646077228484 0.06 -2454 0.5875350688548576 -0.3176646077228484 0.08000000000000002 -2455 0.3107398266737773 0.5743105207625626 0.02 -2456 0.3107398266737773 0.5743105207625626 0.04000000000000001 -2457 0.3107398266737773 0.5743105207625626 0.06 -2458 0.3107398266737773 0.5743105207625626 0.08000000000000002 -2459 0.0215285107957243 -0.5792545448201298 0.02 -2460 0.0215285107957243 -0.5792545448201298 0.04000000000000001 -2461 0.0215285107957243 -0.5792545448201298 0.06 -2462 0.0215285107957243 -0.5792545448201298 0.08000000000000002 -2463 -0.8183358037921321 0.05809053621261764 0.02 -2464 -0.8183358037921321 0.05809053621261764 0.04000000000000001 -2465 -0.8183358037921321 0.05809053621261764 0.06 -2466 -0.8183358037921321 0.05809053621261764 0.08000000000000002 -2467 -0.3660491832059855 -0.1289731166193481 0.02 -2468 -0.3660491832059855 -0.1289731166193481 0.04000000000000001 -2469 -0.3660491832059855 -0.1289731166193481 0.06 -2470 -0.3660491832059855 -0.1289731166193481 0.08000000000000002 -2471 -0.6511366897577591 0.6830709418777637 0.02 -2472 -0.6511366897577591 0.6830709418777637 0.04000000000000001 -2473 -0.6511366897577591 0.6830709418777637 0.06 -2474 -0.6511366897577591 0.6830709418777637 0.08000000000000002 -2475 0.6686280648860022 0.6362368024514752 0.02 -2476 0.6686280648860022 0.6362368024514752 0.04000000000000001 -2477 0.6686280648860022 0.6362368024514752 0.06 -2478 0.6686280648860022 0.6362368024514752 0.08000000000000002 -2479 0.6363155520610249 -0.6687063593393362 0.02 -2480 0.6363155520610249 -0.6687063593393362 0.04000000000000001 -2481 0.6363155520610249 -0.6687063593393362 0.06 -2482 0.6363155520610249 -0.6687063593393362 0.08000000000000002 -2483 -0.6680603702042858 -0.6321668587665613 0.02 -2484 -0.6680603702042858 -0.6321668587665613 0.04000000000000001 -2485 -0.6680603702042858 -0.6321668587665613 0.06 -2486 -0.6680603702042858 -0.6321668587665613 0.08000000000000002 -2487 0.02769532188719278 -0.1809798170660305 0.02 -2488 0.02769532188719278 -0.1809798170660305 0.04000000000000001 -2489 0.02769532188719278 -0.1809798170660305 0.06 -2490 0.02769532188719278 -0.1809798170660305 0.08000000000000002 -2491 0.8044144611153137 -0.09385616407477533 0.02 -2492 0.8044144611153137 -0.09385616407477533 0.04000000000000001 -2493 0.8044144611153137 -0.09385616407477533 0.06 -2494 0.8044144611153137 -0.09385616407477533 0.08000000000000002 -2495 -0.1002863638630045 -0.7852101999905228 0.02 -2496 -0.1002863638630045 -0.7852101999905228 0.04000000000000001 -2497 -0.1002863638630045 -0.7852101999905228 0.06 -2498 -0.1002863638630045 -0.7852101999905228 0.08000000000000002 -2499 0.06870526471661453 0.7758573409478231 0.02 -2500 0.06870526471661453 0.7758573409478231 0.04000000000000001 -2501 0.06870526471661453 0.7758573409478231 0.06 -2502 0.06870526471661453 0.7758573409478231 0.08000000000000002 -2503 -0.7867498094787946 0.1161645029703253 0.02 -2504 -0.7867498094787946 0.1161645029703253 0.04000000000000001 -2505 -0.7867498094787946 0.1161645029703253 0.06 -2506 -0.7867498094787946 0.1161645029703253 0.08000000000000002 -2507 -0.3907157361541361 -0.4680680653996436 0.02 -2508 -0.3907157361541361 -0.4680680653996436 0.04000000000000001 -2509 -0.3907157361541361 -0.4680680653996436 0.06 -2510 -0.3907157361541361 -0.4680680653996436 0.08000000000000002 -2511 -0.2893241395812635 -0.5707646901788088 0.02 -2512 -0.2893241395812635 -0.5707646901788088 0.04000000000000001 -2513 -0.2893241395812635 -0.5707646901788088 0.06 -2514 -0.2893241395812635 -0.5707646901788088 0.08000000000000002 -2515 0.2561513611091514 -0.6027654634273024 0.02 -2516 0.2561513611091514 -0.6027654634273024 0.04000000000000001 -2517 0.2561513611091514 -0.6027654634273024 0.06 -2518 0.2561513611091514 -0.6027654634273024 0.08000000000000002 -2519 -0.4841285488756676 -0.331212121059707 0.02 -2520 -0.4841285488756676 -0.331212121059707 0.04000000000000001 -2521 -0.4841285488756676 -0.331212121059707 0.06 -2522 -0.4841285488756676 -0.331212121059707 0.08000000000000002 -2523 -0.41035322793612 0.3541633250263723 0.02 -2524 -0.41035322793612 0.3541633250263723 0.04000000000000001 -2525 -0.41035322793612 0.3541633250263723 0.06 -2526 -0.41035322793612 0.3541633250263723 0.08000000000000002 -2527 -0.3654807829429786 -0.3498455739180449 0.02 -2528 -0.3654807829429786 -0.3498455739180449 0.04000000000000001 -2529 -0.3654807829429786 -0.3498455739180449 0.06 -2530 -0.3654807829429786 -0.3498455739180449 0.08000000000000002 -2531 0.4080435269900474 0.4324779728220703 0.02 -2532 0.4080435269900474 0.4324779728220703 0.04000000000000001 -2533 0.4080435269900474 0.4324779728220703 0.06 -2534 0.4080435269900474 0.4324779728220703 0.08000000000000002 -2535 0.4339502900149312 -0.4099232310603246 0.02 -2536 0.4339502900149312 -0.4099232310603246 0.04000000000000001 -2537 0.4339502900149312 -0.4099232310603246 0.06 -2538 0.4339502900149312 -0.4099232310603246 0.08000000000000002 -2539 -0.3924975512659823 0.5931502331897853 0.02 -2540 -0.3924975512659823 0.5931502331897853 0.04000000000000001 -2541 -0.3924975512659823 0.5931502331897853 0.06 -2542 -0.3924975512659823 0.5931502331897853 0.08000000000000002 -2543 0.5989929827374207 0.3937454361019145 0.02 -2544 0.5989929827374207 0.3937454361019145 0.04000000000000001 -2545 0.5989929827374207 0.3937454361019145 0.06 -2546 0.5989929827374207 0.3937454361019145 0.08000000000000002 -2547 0.3944019080138368 -0.5994397262004321 0.02 -2548 0.3944019080138368 -0.5994397262004321 0.04000000000000001 -2549 0.3944019080138368 -0.5994397262004321 0.06 -2550 0.3944019080138368 -0.5994397262004321 0.08000000000000002 -2551 -0.4871370735134125 0.653385648932151 0.02 -2552 -0.4871370735134125 0.653385648932151 0.04000000000000001 -2553 -0.4871370735134125 0.653385648932151 0.06 -2554 -0.4871370735134125 0.653385648932151 0.08000000000000002 -2555 0.6710715855360113 0.5418687690565018 0.02 -2556 0.6710715855360113 0.5418687690565018 0.04000000000000001 -2557 0.6710715855360113 0.5418687690565018 0.06 -2558 0.6710715855360113 0.5418687690565018 0.08000000000000002 -2559 0.5421353608160783 -0.6713299701740467 0.02 -2560 0.5421353608160783 -0.6713299701740467 0.04000000000000001 -2561 0.5421353608160783 -0.6713299701740467 0.06 -2562 0.5421353608160783 -0.6713299701740467 0.08000000000000002 -2563 -0.6665608639534191 -0.5291225418108081 0.02 -2564 -0.6665608639534191 -0.5291225418108081 0.04000000000000001 -2565 -0.6665608639534191 -0.5291225418108081 0.06 -2566 -0.6665608639534191 -0.5291225418108081 0.08000000000000002 -2567 -0.3194860514249929 0.36885599465078 0.02 -2568 -0.3194860514249929 0.36885599465078 0.04000000000000001 -2569 -0.3194860514249929 0.36885599465078 0.06 -2570 -0.3194860514249929 0.36885599465078 0.08000000000000002 -2571 -0.3121988124129413 0.04460383481307665 0.02 -2572 -0.3121988124129413 0.04460383481307665 0.04000000000000001 -2573 -0.3121988124129413 0.04460383481307665 0.06 -2574 -0.3121988124129413 0.04460383481307665 0.08000000000000002 -2575 0.1306023701377939 0.2475632241635774 0.02 -2576 0.1306023701377939 0.2475632241635774 0.04000000000000001 -2577 0.1306023701377939 0.2475632241635774 0.06 -2578 0.1306023701377939 0.2475632241635774 0.08000000000000002 -2579 -0.4293564094573099 0.03972846391576743 0.02 -2580 -0.4293564094573099 0.03972846391576743 0.04000000000000001 -2581 -0.4293564094573099 0.03972846391576743 0.06 -2582 -0.4293564094573099 0.03972846391576743 0.08000000000000002 -2583 0.4879081786416791 0.2969280465148749 0.02 -2584 0.4879081786416791 0.2969280465148749 0.04000000000000001 -2585 0.4879081786416791 0.2969280465148749 0.06 -2586 0.4879081786416791 0.2969280465148749 0.08000000000000002 -2587 -0.05320371329411603 -0.009659407080246684 0.02 -2588 -0.05320371329411603 -0.009659407080246684 0.04000000000000001 -2589 -0.05320371329411603 -0.009659407080246684 0.06 -2590 -0.05320371329411603 -0.009659407080246684 0.08000000000000002 -2591 -0.6577428723468374 0.02540735873934022 0.02 -2592 -0.6577428723468374 0.02540735873934022 0.04000000000000001 -2593 -0.6577428723468374 0.02540735873934022 0.06 -2594 -0.6577428723468374 0.02540735873934022 0.08000000000000002 -2595 -0.1842366086518172 -0.1604188104733459 0.02 -2596 -0.1842366086518172 -0.1604188104733459 0.04000000000000001 -2597 -0.1842366086518172 -0.1604188104733459 0.06 -2598 -0.1842366086518172 -0.1604188104733459 0.08000000000000002 -2599 -0.9042717039943147 0.2604669003446903 0.02 -2600 -0.9042717039943147 0.2604669003446903 0.04000000000000001 -2601 -0.9042717039943147 0.2604669003446903 0.06 -2602 -0.9042717039943147 0.2604669003446903 0.08000000000000002 -2603 0.2534009727067292 0.8872303433587414 0.02 -2604 0.2534009727067292 0.8872303433587414 0.04000000000000001 -2605 0.2534009727067292 0.8872303433587414 0.06 -2606 0.2534009727067292 0.8872303433587414 0.08000000000000002 -2607 0.879485847683671 -0.2534884627103633 0.02 -2608 0.879485847683671 -0.2534884627103633 0.04000000000000001 -2609 0.879485847683671 -0.2534884627103633 0.06 -2610 0.879485847683671 -0.2534884627103633 0.08000000000000002 -2611 -0.2540536016905275 -0.8838698627750295 0.02 -2612 -0.2540536016905275 -0.8838698627750295 0.04000000000000001 -2613 -0.2540536016905275 -0.8838698627750295 0.06 -2614 -0.2540536016905275 -0.8838698627750295 0.08000000000000002 -2615 -0.2023131121857017 0.8840239738062975 0.02 -2616 -0.2023131121857017 0.8840239738062975 0.04000000000000001 -2617 -0.2023131121857017 0.8840239738062975 0.06 -2618 -0.2023131121857017 0.8840239738062975 0.08000000000000002 -2619 0.9159608545231839 0.1786551861801368 0.02 -2620 0.9159608545231839 0.1786551861801368 0.04000000000000001 -2621 0.9159608545231839 0.1786551861801368 0.06 -2622 0.9159608545231839 0.1786551861801368 0.08000000000000002 -2623 0.1786954499012877 -0.9162855689932536 0.02 -2624 0.1786954499012877 -0.9162855689932536 0.04000000000000001 -2625 0.1786954499012877 -0.9162855689932536 0.06 -2626 0.1786954499012877 -0.9162855689932536 0.08000000000000002 -2627 -0.9188532323694281 -0.1886018490274433 0.02 -2628 -0.9188532323694281 -0.1886018490274433 0.04000000000000001 -2629 -0.9188532323694281 -0.1886018490274433 0.06 -2630 -0.9188532323694281 -0.1886018490274433 0.08000000000000002 -2631 0.226029674240702 0.2157176894791872 0.02 -2632 0.226029674240702 0.2157176894791872 0.04000000000000001 -2633 0.226029674240702 0.2157176894791872 0.06 -2634 0.226029674240702 0.2157176894791872 0.08000000000000002 -2635 0.2240314634922111 -0.124647710263943 0.02 -2636 0.2240314634922111 -0.124647710263943 0.04000000000000001 -2637 0.2240314634922111 -0.124647710263943 0.06 -2638 0.2240314634922111 -0.124647710263943 0.08000000000000002 -2639 -0.6318326364397403 0.5515572359157516 0.02 -2640 -0.6318326364397403 0.5515572359157516 0.04000000000000001 -2641 -0.6318326364397403 0.5515572359157516 0.06 -2642 -0.6318326364397403 0.5515572359157516 0.08000000000000002 -2643 0.5793539672022744 0.6413232820841559 0.02 -2644 0.5793539672022744 0.6413232820841559 0.04000000000000001 -2645 0.5793539672022744 0.6413232820841559 0.06 -2646 0.5793539672022744 0.6413232820841559 0.08000000000000002 -2647 0.6415316364092868 -0.5795931917484853 0.02 -2648 0.6415316364092868 -0.5795931917484853 0.04000000000000001 -2649 0.6415316364092868 -0.5795931917484853 0.06 -2650 0.6415316364092868 -0.5795931917484853 0.08000000000000002 -2651 -0.5764588254413486 -0.640012685369551 0.02 -2652 -0.5764588254413486 -0.640012685369551 0.04000000000000001 -2653 -0.5764588254413486 -0.640012685369551 0.06 -2654 -0.5764588254413486 -0.640012685369551 0.08000000000000002 -2655 0.1377546984813269 -0.4339063387353258 0.02 -2656 0.1377546984813269 -0.4339063387353258 0.04000000000000001 -2657 0.1377546984813269 -0.4339063387353258 0.06 -2658 0.1377546984813269 -0.4339063387353258 0.08000000000000002 -2659 -0.02209326306719091 0.1449551558571982 0.02 -2660 -0.02209326306719091 0.1449551558571982 0.04000000000000001 -2661 -0.02209326306719091 0.1449551558571982 0.06 -2662 -0.02209326306719091 0.1449551558571982 0.08000000000000002 -2663 -0.3150939235960785 0.1368642893014297 0.02 -2664 -0.3150939235960785 0.1368642893014297 0.04000000000000001 -2665 -0.3150939235960785 0.1368642893014297 0.06 -2666 -0.3150939235960785 0.1368642893014297 0.08000000000000002 -2667 -0.466900808070744 0.09003406461315078 0.02 -2668 -0.466900808070744 0.09003406461315078 0.04000000000000001 -2669 -0.466900808070744 0.09003406461315078 0.06 -2670 -0.466900808070744 0.09003406461315078 0.08000000000000002 -2671 -0.7419738530354105 0.3535618685369996 0.02 -2672 -0.7419738530354105 0.3535618685369996 0.04000000000000001 -2673 -0.7419738530354105 0.3535618685369996 0.06 -2674 -0.7419738530354105 0.3535618685369996 0.08000000000000002 -2675 -0.7632972713564267 -0.2734702965429466 0.02 -2676 -0.7632972713564267 -0.2734702965429466 0.04000000000000001 -2677 -0.7632972713564267 -0.2734702965429466 0.06 -2678 -0.7632972713564267 -0.2734702965429466 0.08000000000000002 -2679 -0.4806778814717604 0.5839008529212468 0.02 -2680 -0.4806778814717604 0.5839008529212468 0.04000000000000001 -2681 -0.4806778814717604 0.5839008529212468 0.06 -2682 -0.4806778814717604 0.5839008529212468 0.08000000000000002 -2683 0.5779479113575234 0.5244590282321654 0.02 -2684 0.5779479113575234 0.5244590282321654 0.04000000000000001 -2685 0.5779479113575234 0.5244590282321654 0.06 -2686 0.5779479113575234 0.5244590282321654 0.08000000000000002 -2687 0.5252194168129798 -0.5785686771437204 0.02 -2688 0.5252194168129798 -0.5785686771437204 0.04000000000000001 -2689 0.5252194168129798 -0.5785686771437204 0.06 -2690 0.5252194168129798 -0.5785686771437204 0.08000000000000002 -2691 -0.5691077666073547 -0.5183984890058063 0.02 -2692 -0.5691077666073547 -0.5183984890058063 0.04000000000000001 -2693 -0.5691077666073547 -0.5183984890058063 0.06 -2694 -0.5691077666073547 -0.5183984890058063 0.08000000000000002 -2695 -0.4263000086588776 -0.1284501041782039 0.02 -2696 -0.4263000086588776 -0.1284501041782039 0.04000000000000001 -2697 -0.4263000086588776 -0.1284501041782039 0.06 -2698 -0.4263000086588776 -0.1284501041782039 0.08000000000000002 -2699 0.4473086990931153 0.04841531432543322 0.02 -2700 0.4473086990931153 0.04841531432543322 0.04000000000000001 -2701 0.4473086990931153 0.04841531432543322 0.06 -2702 0.4473086990931153 0.04841531432543322 0.08000000000000002 -2703 -0.05321214679547854 0.4472234736699625 0.02 -2704 -0.05321214679547854 0.4472234736699625 0.04000000000000001 -2705 -0.05321214679547854 0.4472234736699625 0.06 -2706 -0.05321214679547854 0.4472234736699625 0.08000000000000002 -2707 -0.3498104304433999 0.475653056603885 0.02 -2708 -0.3498104304433999 0.475653056603885 0.04000000000000001 -2709 -0.3498104304433999 0.475653056603885 0.06 -2710 -0.3498104304433999 0.475653056603885 0.08000000000000002 -2711 -0.5052068046863671 -0.4586317500222058 0.02 -2712 -0.5052068046863671 -0.4586317500222058 0.04000000000000001 -2713 -0.5052068046863671 -0.4586317500222058 0.06 -2714 -0.5052068046863671 -0.4586317500222058 0.08000000000000002 -2715 -0.5282901268025465 0.5035158489667795 0.02 -2716 -0.5282901268025465 0.5035158489667795 0.04000000000000001 -2717 -0.5282901268025465 0.5035158489667795 0.06 -2718 -0.5282901268025465 0.5035158489667795 0.08000000000000002 +145 -0.009273488353678911 0.00916045810881088 0 +146 -0.3630757820983154 -0.3469955703472844 0 +147 -0.3393006016430918 0.3877434125507266 0 +148 0.3759340602624919 -0.3846653235599609 0 +149 0.3524664372975868 0.3583892688703587 0 +150 0.5945328787981766 -0.05308291975789954 0 +151 0.05703874903711088 0.574683245119211 0 +152 -0.02502078444027175 -0.5909257686005999 0 +153 -0.553250235107575 0.0248350547261034 0 +154 -0.2701686041813701 -0.05030882783090838 0 +155 -0.08123670647713568 -0.2827079133847872 0 +156 -0.04536846116906931 0.2663583983810881 0 +157 0.2725511038357648 -0.07407296486584727 0 +158 -0.2497016688426531 0.630211821622997 0 +159 -0.6281347627917859 -0.2409434073981337 0 +160 0.6521237629694814 0.2478355799742357 0 +161 0.2375690798479049 -0.6687849541529669 0 +162 -0.3135728558412498 -0.6341788989468249 0 +163 -0.6325695068199148 0.2977590446030966 0 +164 0.619475281910241 -0.3106710996108289 0 +165 0.327865472326411 0.5988727915217128 0 +166 -0.4926294405313521 0.588725473095845 0 +167 0.4788156722542137 -0.5449491703199971 0 +168 0.5568717745949999 0.4914867485725393 0 +169 0.1870695488335059 0.1762698172214709 0 +170 0.169842222390587 0.4004228188402753 0 +171 0.1383114125696776 -0.4008401040703973 0 +172 -0.3846671881792733 0.1695499096432111 0 +173 0.4470135045497297 0.1399912156133567 0 +174 -0.04571939008393861 0.7470409208310167 0 +175 -0.7503493500451387 -0.04072142303306085 0 +176 0.7830886023934636 0.07683592262980812 0 +177 0.07516629693371091 -0.745765768452798 0 +178 -0.1712448564845363 -0.770373506906975 0 +179 -0.7615778434895033 0.1185068855776851 0 +180 0.7668907673496597 -0.1567625310611865 0 +181 0.1235115021054526 0.7582282788488385 0 +182 0.09035507534711798 -0.1912831764255331 0 +183 -0.1743740890750027 0.1355463453084745 0 +184 -0.4543060044470116 -0.1450809754112376 0 +185 -0.1746169779603575 0.471317392059293 0 +186 -0.2075093441284043 -0.4544221264604095 0 +187 0.4586913258454594 -0.2085694286770441 0 +188 -0.2540017658890998 -0.1996413487670297 0 +189 -0.4435465925282415 0.7031650572959909 0 +190 -0.7508781529949816 -0.4305927328461222 0 +191 0.7106809742073578 0.4214695806199034 0 +192 0.4377205446574154 -0.7296945023261667 0 +193 -0.4983469704067841 -0.6704998311070786 0 +194 -0.6699453466572191 0.5095662850023257 0 +195 0.6677082690910396 -0.4961827525596115 0 +196 0.5066026866417465 0.6763056530401219 0 +197 -0.1245789130043155 -0.07581960131543526 0 +198 0.02045559625759278 0.1761745275927596 0 +199 -0.2271664414560042 0.8140695588238773 0 +200 -0.8117991378053704 -0.2269708645051213 0 +201 -0.3119629502622372 -0.7809122323920169 0 +202 -0.7525927492882537 0.2908226447508215 0 +203 0.7786824181801033 -0.303468213931925 0 +204 0.2969994631013257 0.7681053406624917 0 +205 0.2386361192590425 -0.512311802796792 0 +206 0.2839300050214306 0.4870112192367937 0 +207 -0.4638035146850763 0.2850045449981252 0 +208 -0.3384081372294015 0.5195995794965675 0 +209 -0.5570448424526959 -0.3324418155365523 0 +210 0.5464114727398809 0.3412697479596888 0 +211 -0.3984370042975314 -0.4651402068380363 0 +212 0.4757732615849015 -0.4003478393343251 0 +213 0.2664507717780748 -0.2571856814868128 0 +214 -0.2094045914961626 0.2666905255521942 0 +215 0.5638909551732338 0.09686906104084264 0 +216 0.1794250986628849 -0.009426761015043944 0 +217 0.1394329841046863 -0.5869660143561526 0 +218 -0.5628192835211518 0.1874140771451427 0 +219 0.1792253963761268 0.5746954242594616 0 +220 0.4464337145448064 -0.02948821903061176 0 +221 -0.452682225086054 -0.008442605724991302 0 +222 -0.03240794943122387 -0.4091479152074091 0 +223 -0.005405641633195541 0.4267693938557921 0 +224 -0.08193709304225939 0.6445946124371349 0 +225 -0.6425688896393558 -0.08292930323856634 0 +226 -0.1775581279604183 -0.6056765638685718 0 +227 0.6095518270225001 -0.1445913150009022 0 +228 -0.8382711392463122 0.04499953522558203 0 +229 -0.03409621994624469 -0.8401419789675956 0 +230 0.04438081038954167 0.836419664956622 0 +231 0.8553675062584657 -0.05386684210448676 0 +232 0.3749386715962159 -0.5487754583110536 0 +233 0.3974359820942239 0.5215042692528412 0 +234 -0.5041576228621361 0.4333723785373178 0 +235 0.2364611986036771 0.2798634810348056 0 +236 0.2849503733965617 0.03118901498650395 0 +237 -0.011675368022789 -0.1583646189613644 0 +238 0.1206626040530767 0.2446482506595883 0 +239 0.4970837880675948 0.2480293971507536 0 +240 -0.6105405940863746 -0.5349387521475042 0 +241 -0.553991735346019 0.6655815144261268 0 +242 0.6597459497119282 0.5464669372594945 0 +243 0.5400899340776318 -0.6566914551128153 0 +244 -0.7087023166319029 0.03326067134231309 0 +245 -0.02493190515371452 -0.6959354983668804 0 +246 0.694063866360876 -0.02538340807346447 0 +247 0.03982010370461493 -0.3177642321309389 0 +248 -0.2792299368920985 0.06186444744713838 0 +249 -0.3808110359368689 -0.2121926627689711 0 +250 -0.2276452154991185 -0.3341328615566676 0 +251 0.3397134731995448 0.1996534621165916 0 +252 -0.1019499545891515 0.02438360087543125 0 +253 0.8365403305290204 0.3599025089438682 0 +254 0.3639269354255869 -0.8351171068682989 0 +255 -0.3319516295196943 0.8327481288423965 0 +256 -0.8333013038828953 -0.3287324073197915 0 +257 0.7938047051295087 -0.4102751112783604 0 +258 0.444808774696317 0.7961722113720798 0 +259 -0.4127852419823073 -0.7949611030251975 0 +260 -0.7915141740889436 0.4443857241644811 0 +261 -0.3406250179730959 0.2705330993773377 0 +262 0.2397166078874612 -0.3186594518216563 0 +263 -0.854582551441107 0.2060173065942562 0 +264 -0.2141080697608677 -0.8586786596798476 0 +265 0.207761903824096 0.8574333639541414 0 +266 0.8702274683783644 -0.1831600288236168 0 +267 -0.9058378278550592 -0.1171729149352221 0 +268 -0.1174153984494048 0.9059350404172869 0 +269 0.09393394886261931 -0.8697094920958993 0 +270 0.8687844944930114 0.1250958483641025 0 +271 0.613476042990282 0.6597072786234576 0 +272 0.6563391835241257 -0.6085138609223993 0 +273 -0.6589078743885748 0.615595447751677 0 +274 -0.6077926747047573 -0.6566320489753026 0 +275 -0.06455234163770032 0.1905609960067338 0 +276 0.6723200260837866 0.1042959368376399 0 +277 0.06924415183346858 -0.08393017700741348 0 +278 0.1424852488362597 -0.6745915873019526 0 +279 -0.6560236018933121 0.1957683112241136 0 +280 0.2261335291230376 0.6724451430202616 0 +281 0.05344537732330912 -0.4972496141312576 0 +282 -0.4820616617036059 0.09639661489927862 0 +283 0.09915707861606107 0.4904305652463083 0 +284 -0.5294269027832078 -0.229361943472022 0 +285 -0.2434414406797225 0.5484307460752702 0 +286 0.4323794103526783 -0.3333644853485817 0 +287 -0.2779188756682962 -0.5381002730158441 0 +288 0.4199394697088852 -0.4677534687941777 0 +289 -0.4024304770888812 0.4441972293962587 0 +290 0.4615115682168016 0.4236986619354352 0 +291 -0.2164334946980676 0.3968245142626498 0 +292 0.3154575257583962 -0.1554414062667671 0 +293 0.168646802800918 -0.1135306217596707 0 +294 -0.1307746275873545 0.3441637217611287 0 +295 -0.1404269256120112 0.7107768933630642 0 +296 -0.7112296458136502 -0.1365941812077176 0 +297 -0.2399545607912618 -0.6977579734372208 0 +298 0.6747833944187278 -0.2118895710801944 0 +299 0.5176698580334621 -0.103819867884 0 +300 0.5085251556188322 -0.2907820503817347 0 +301 -0.05716641689026527 0.5297210956392591 0 +302 -0.5317823103397754 -0.06535435449405379 0 +303 -0.1143466599777276 -0.5079348162494908 0 +304 -0.1552003731363872 -0.1882414588162507 0 +305 0.4807495171113731 0.06444083946329973 0 +306 -0.3935460045730921 -0.07322906953870696 0 +307 -0.1364424208872183 -0.4017880099381987 0 +308 -0.6099576367888768 -0.4080701547928401 0 +309 -0.4184976473519184 0.6069185768899372 0 +310 0.6015858447097795 0.4168994824662515 0 +311 -0.493656346274863 -0.5791291481875378 0 +312 0.5739436060474877 -0.4818993768051738 0 +313 0.6283101313585021 0.01284599179099455 0 +314 -0.43419467902241 -0.2889496462323161 0 +315 -0.2916385303663842 -0.4300562263662718 0 +316 0.06487005994819951 -0.6783808943290489 0 +317 -0.6642386657586006 0.09051471157143443 0 +318 0.119352651218099 0.6521462566346119 0 +319 0.09935639842703067 0.08740076794828069 0 +320 0.05963876045316886 0.3348085960046109 0 +321 -0.189697863908265 0.04565283320092126 0 +322 -0.5158315599457346 -0.4720096234205078 0 +323 0.2611642942788689 0.3813926235659463 0 +324 -0.2000795210665827 -0.1353554083626738 0 +325 0.1457369485756468 -0.2841370987613376 0 +326 -0.2777089402540138 0.1797753259785467 0 +327 -0.9085460880639742 0.1237878018187586 0 +328 -0.1019900043913622 -0.893259472605428 0 +329 0.1238200652537517 0.9085964392549061 0 +330 0.9180062739236612 -0.09598573992101976 0 +331 -0.912655932260213 -0.02398319083466645 0 +332 0.008367413925278861 -0.9198853063971549 0 +333 -0.02431317099512088 0.9123210735134266 0 +334 0.9041300124986519 0.01379330183484605 0 +335 0.1387887380973432 -0.4978667689867478 0 +336 -0.4733497580335891 0.1784879591508934 0 +337 0.1809814155632116 0.4861297825179496 0 +338 -0.1805252126171017 -0.2504896943144203 0 +339 -0.702180347906077 -0.3422747202427379 0 +340 -0.3371324926778692 0.7180705547772359 0 +341 0.3355235802450693 -0.7346391500484335 0 +342 0.7547539480769733 0.3256658213326131 0 +343 -0.4040050818669008 -0.6858069966967554 0 +344 -0.6869510428621548 0.4053059519181766 0 +345 0.6816618408241883 -0.4004997666741786 0 +346 0.4043189186425183 0.7061993611488281 0 +347 0.4357872263118142 -0.6278912731197483 0 +348 -0.577044321219035 0.5053568079175584 0 +349 0.4929783347874608 0.5898093814039689 0 +350 -0.5099423846696907 0.7915982151319552 0 +351 0.7917668927146317 0.5073383363124405 0 +352 0.5099364616038597 -0.7943442416782676 0 +353 -0.7865708918099946 -0.4788062647442327 0 +354 0.7310466732033456 -0.5861211886606393 0 +355 -0.5864063496396488 -0.7314837302855907 0 +356 -0.732024773425717 0.5904014501328559 0 +357 0.5896793499421527 0.7330948876097587 0 +358 -0.2793304508241014 0.4475639742663415 0 +359 0.355203053584752 -0.2590326189704956 0 +360 -0.01764621587658752 -0.07623595338571734 0 +361 0.5559773824930981 0.2815234913734928 0 +362 0.2715128434122404 0.1309277237798032 0 +363 -0.3255162704041832 -0.137329482215004 0 +364 0.2024784117148658 -0.5888155563916311 0 +365 -0.5536400196553282 0.2520376402006607 0 +366 0.2490883574581664 0.5851115407104762 0 +367 0.03906613347282865 0.2559297725173381 0 +368 0.4081527767190752 0.02302872598445437 0 +369 -0.3067585558051941 -0.2746393252055986 0 +370 -0.8994457602932987 -0.2073009716668192 0 +371 -0.2076698327299657 0.8998125051190659 0 +372 0.1987056795586867 -0.874783771414067 0 +373 0.8759565811829598 0.2037109161691198 0 +374 -0.8508362851736823 0.2881177627471704 0 +375 -0.2984712019525212 -0.8664311478158504 0 +376 0.2903693012897265 0.8560987865782422 0 +377 0.8677922460246092 -0.2907370381259845 0 +378 0.449230552178808 0.3267512102983695 0 +379 -0.1399529961133417 0.2186072262024135 0 +380 -0.683414355426208 -0.01935594619362641 0 +381 -0.03848963524996514 0.6908527686263575 0 +382 -0.09355424524288704 -0.6602750515835725 0 +383 0.6548160552512688 -0.09067689612227429 0 +384 0.417424725225269 -0.1037522646626998 0 +385 -0.1482953535684708 0.5688844037848088 0 +386 -0.5890035306409565 -0.1409938566407858 0 +387 -0.1950236064179035 -0.5214276096103913 0 +388 0.3374555497534149 -0.4604931408653773 0 +389 0.3765379904706818 0.4436653946632465 0 +390 -0.4609699033777138 0.391672450158235 0 +391 -0.336152767929308 0.6216329239395814 0 +392 -0.6243763223467242 -0.3021434256504772 0 +393 0.5727462232380477 -0.3757599397230176 0 +394 -0.3767864243565537 -0.5793464411761597 0 +395 0.2064568728237731 0.08584647913822206 0 +396 0.244069845375065 -0.0173076257160734 0 +397 0.1071212263637422 0.169783383677218 0 +398 0.2267165873343268 -0.404196491767902 0 +399 -0.3921243599547922 0.237380356580334 0 +400 0.7762264538031828 0.1334299110335727 0 +401 0.6255619678532343 0.3623554477175763 0 +402 -0.3847763662517107 0.06131267630738398 0 +403 0.05175361961460756 -0.4060401688047797 0 +404 0.7971758261607385 -0.009677090010098406 0 +405 0.02903964021997372 -0.7868651127330674 0 +406 0.5436385913445115 -0.1780222692551246 0 +407 -0.4766052200995599 -0.3691499610194545 0 +408 -0.09227480672418116 0.446412833215618 0 +409 -0.8276707036086602 0.3663654908505932 0 +410 -0.3625720175441697 -0.8654470711559323 0 +411 0.3679768792395708 0.8339255635922422 0 +412 0.8653158533360795 -0.3596237269740152 0 +413 -0.8993152141046745 -0.2735310195472121 0 +414 -0.2742080431142168 0.8995416986589064 0 +415 0.2823776819579458 -0.8614674305440521 0 +416 0.8638372874845223 0.2814474457157449 0 +417 0.005720196065220282 0.09510058453179887 0 +418 -0.4113563739337736 0.5440605170594375 0 +419 0.5429183323635547 0.4174161733166027 0 +420 0.4898446896719412 -0.4725834207981396 0 +421 0.6799180594625716 0.6093546310769131 0 +422 0.6066775018333774 -0.6769050674404204 0 +423 -0.6113192359830126 0.6822383870521778 0 +424 -0.6879780354527674 -0.5869202945565708 0 +425 0.13280865311488 -0.7626550897371936 0 +426 0.212519693716841 -0.7781235116252192 0 +427 0.3115820850724765 0.6840739216783392 0 +428 -0.7540258566496366 0.2033190372303242 0 +429 0.2132391670384238 0.7627843083827193 0 +430 0.7797283856855453 0.2135271098329889 0 +431 -0.5691980284264325 -0.5855742751261486 0 +432 0.5590107420116385 -0.5712906149700842 0 +433 0.01295413502917306 -0.237090692226727 0 +434 -0.2420698239367897 0.7210400773243747 0 +435 -0.7178312364409216 -0.2376826902164933 0 +436 0.6869006122989217 -0.3099083198112231 0 +437 -0.3178499970389874 -0.6970785036289955 0 +438 -0.1320844404820838 0.8166337655205012 0 +439 -0.8165365137081694 -0.1305531797328427 0 +440 -0.2302830524795657 -0.7755656321644682 0 +441 0.772124284225815 -0.214291273801193 0 +442 0.2289943343655265 -0.2041911189604385 0 +443 0.313385418863572 -0.3478517310539778 0 +444 -0.2749889886035179 0.3283958766372468 0 +445 0.1784513232539571 0.2321332968991923 0 +446 0.5372461404555327 0.177259879833838 0 +447 0.3569536974980164 -0.6511397036653975 0 +448 -0.5707219917837311 0.4230779019485903 0 +449 0.4068507250445134 0.6023778940918366 0 +450 0.3104463105053766 -0.5973784833279926 0 +451 0.3392484760137726 0.5379185813946928 0 +452 -0.5334581930932596 0.3510954155040024 0 +453 -0.1049004877290534 0.2733072360264381 0 +454 0.08684016475009505 -0.0001154658118619617 0 +455 0.3433509849726744 -0.02839693236601738 0 +456 0.421966220427518 -0.418371918983939 0 +457 0.1448711585619036 0.3177504243506497 0 +458 -0.3502316867446068 -0.02250865640264687 0 +459 -0.02440853505205695 -0.3407757724541551 0 +460 0.5856187551363887 -0.2523089995580183 0 +461 0.4192608875569094 0.2159642076241164 0 +462 -0.7477960516123059 -0.5244744744882651 0 +463 -0.5317252840918131 0.7369538594664218 0 +464 0.5239913252132835 -0.7380102585252672 0 +465 0.7356460351243852 0.5245181246208961 0 +466 -0.4124412670844655 -0.3949244298615737 0 +467 -0.02700536791140639 0.3447334599804672 0 +468 -0.568650677347752 0.5898376576967671 0 +469 0.5786789825822586 0.5695912541022239 0 +470 -0.9142972860505157 0.06340918818020852 0 +471 -0.06784932272078724 -0.9375851412550555 0 +472 0.06318415345401196 0.9138848214484351 0 +473 0.943323287043117 -0.02436457279393412 0 +474 -0.6766940123516199 -0.4736898381042419 0 +475 -0.4995573255429975 0.649323325952923 0 +476 0.628873771450369 0.4689806786238402 0 +477 -0.01525709683040301 0.6058672437123304 0 +478 -0.6023929760809482 -0.04690466966469053 0 +479 -0.638041146495291 -0.1772508545139594 0 +480 -0.1833411205769646 0.6368071204091833 0 +481 -0.254820601188139 -0.620523774733428 0 +482 0.0573373956269707 -0.5893050347178428 0 +483 -0.5648702794078161 0.1017551343549891 0 +484 0.1098839761223454 0.5471577958965221 0 +485 0.5739079163391468 0.03388011106382179 0 +486 0.0807550665592261 0.4134849456169955 0 +487 -0.03071133818100915 -0.5000764508891952 0 +488 -0.4952495834676112 0.0363249356686037 0 +489 0.02221053103249053 0.5046568980768951 0 +490 -0.1509883085519089 -0.7011934499747617 0 +491 0.7157119856144909 -0.1306786726026019 0 +492 -0.8454461547050278 0.1242180958366506 0 +493 -0.1404332347510375 -0.8246621089137849 0 +494 0.1255049929716144 0.8452124970473215 0 +495 0.8082875074664617 -0.115339449568752 0 +496 0.5205442209132707 -0.01668693502320576 0 +497 -0.08356141445332145 0.1110702249359781 0 +498 0.3370260710945491 0.2772924701028578 0 +499 0.4234759520057531 -0.5205743629890647 0 +500 0.4769846664590845 0.5067502606822457 0 +501 -0.4758324437609096 0.5029522421326716 0 +502 0.2615712986181207 0.1899663861767313 0 +503 0.05115140286568221 -0.14350526630773 0 +504 0.2887213389972646 -0.4039475650165419 0 +505 -0.4008244299391783 0.3351032680280133 0 +506 0.8076009813815366 0.4420606581071422 0 +507 0.4465565815629323 -0.809466605352179 0 +508 -0.4422024039427189 0.8037926887271941 0 +509 -0.8159159053992495 -0.4076165205093536 0 +510 0.7537866005416408 -0.5174461579498879 0 +511 0.5258920943680429 0.7578896955346317 0 +512 -0.5184324220664533 -0.7547537594941177 0 +513 -0.7546511382409899 0.526557102599275 0 +514 -0.2331734409113291 0.4906122615105926 0 +515 -0.04023174618598973 0.8267240701620343 0 +516 0.8393639335741593 0.05264228469825077 0 +517 -0.8281986127176854 -0.03860013002446162 0 +518 -0.1950579950872454 -0.02377408596863028 0 +519 0.347430933875454 0.1052452981826389 0 +520 0.3997633875258403 0.2711437116297114 0 +521 0.795411454699938 0.2727801199271267 0 +522 0.273758664450472 -0.791853893524051 0 +523 0.354311183601827 0.7722213983503817 0 +524 -0.7569610725054408 0.3508809227011437 0 +525 -0.7624425825752122 0.03883371116524456 0 +526 -0.08573001837619887 -0.769643021286046 0 +527 0.0369242159646908 0.7555384349414538 0 +528 0.7539941802596171 -0.06910515729163667 0 +529 -0.09392048167665304 -0.176128945220071 0 +530 0.5734523063403572 -0.09936457676711502 0 +531 0.02081977010202333 0.6781228317328531 0 +532 -0.6217052436174334 0.006945684980102823 0 +533 0.7407066992742855 0.0357574307154823 0 +534 -0.1020069572301296 -0.5953093552003388 0 +535 -0.9951847266502585 0.09801714055230534 0.02 +536 -0.9951847266502585 0.09801714055230534 0.04000000000000001 +537 -0.9951847266502585 0.09801714055230534 0.06 +538 -0.9951847266502585 0.09801714055230534 0.08000000000000002 +539 -0.9807852803038259 0.1950903225158687 0.02 +540 -0.9807852803038259 0.1950903225158687 0.04000000000000001 +541 -0.9807852803038259 0.1950903225158687 0.06 +542 -0.9807852803038259 0.1950903225158687 0.08000000000000002 +543 -0.9569403355024331 0.2902846780119318 0.02 +544 -0.9569403355024331 0.2902846780119318 0.04000000000000001 +545 -0.9569403355024331 0.2902846780119318 0.06 +546 -0.9569403355024331 0.2902846780119318 0.08000000000000002 +547 -0.9238795320817892 0.3826834334019886 0.02 +548 -0.9238795320817892 0.3826834334019886 0.04000000000000001 +549 -0.9238795320817892 0.3826834334019886 0.06 +550 -0.9238795320817892 0.3826834334019886 0.08000000000000002 +551 -0.8819212636904032 0.4713967380569389 0.02 +552 -0.8819212636904032 0.4713967380569389 0.04000000000000001 +553 -0.8819212636904032 0.4713967380569389 0.06 +554 -0.8819212636904032 0.4713967380569389 0.08000000000000002 +555 -0.8314696113679687 0.5555702344182949 0.02 +556 -0.8314696113679687 0.5555702344182949 0.04000000000000001 +557 -0.8314696113679687 0.5555702344182949 0.06 +558 -0.8314696113679687 0.5555702344182949 0.08000000000000002 +559 -0.7730104520841969 0.6343932857215511 0.02 +560 -0.7730104520841969 0.6343932857215511 0.04000000000000001 +561 -0.7730104520841969 0.6343932857215511 0.06 +562 -0.7730104520841969 0.6343932857215511 0.08000000000000002 +563 -0.7071067795733449 0.7071067827997501 0.02 +564 -0.7071067795733449 0.7071067827997501 0.04000000000000001 +565 -0.7071067795733449 0.7071067827997501 0.06 +566 -0.7071067795733449 0.7071067827997501 0.08000000000000002 +567 -0.634393282646958 0.7730104546074502 0.02 +568 -0.634393282646958 0.7730104546074502 0.04000000000000001 +569 -0.634393282646958 0.7730104546074502 0.06 +570 -0.634393282646958 0.7730104546074502 0.08000000000000002 +571 -0.5555702316245595 0.8314696132346829 0.02 +572 -0.5555702316245595 0.8314696132346829 0.04000000000000001 +573 -0.5555702316245595 0.8314696132346829 0.06 +574 -0.5555702316245595 0.8314696132346829 0.08000000000000002 +575 -0.471396735522105 0.8819212650453002 0.02 +576 -0.471396735522105 0.8819212650453002 0.04000000000000001 +577 -0.471396735522105 0.8819212650453002 0.06 +578 -0.471396735522105 0.8819212650453002 0.08000000000000002 +579 -0.3826834312318057 0.9238795329807084 0.02 +580 -0.3826834312318057 0.9238795329807084 0.04000000000000001 +581 -0.3826834312318057 0.9238795329807084 0.06 +582 -0.3826834312318057 0.9238795329807084 0.08000000000000002 +583 -0.2902846763682919 0.9569403360010258 0.02 +584 -0.2902846763682919 0.9569403360010258 0.04000000000000001 +585 -0.2902846763682919 0.9569403360010258 0.06 +586 -0.2902846763682919 0.9569403360010258 0.08000000000000002 +587 -0.1950903214145686 0.980785280522888 0.02 +588 -0.1950903214145686 0.980785280522888 0.04000000000000001 +589 -0.1950903214145686 0.980785280522888 0.06 +590 -0.1950903214145686 0.980785280522888 0.08000000000000002 +591 -0.0980171400302339 0.995184726701678 0.02 +592 -0.0980171400302339 0.995184726701678 0.04000000000000001 +593 -0.0980171400302339 0.995184726701678 0.06 +594 -0.0980171400302339 0.995184726701678 0.08000000000000002 +595 0.09801714055230534 0.9951847266502585 0.02 +596 0.09801714055230534 0.9951847266502585 0.04000000000000001 +597 0.09801714055230534 0.9951847266502585 0.06 +598 0.09801714055230534 0.9951847266502585 0.08000000000000002 +599 0.1950903225158687 0.9807852803038259 0.02 +600 0.1950903225158687 0.9807852803038259 0.04000000000000001 +601 0.1950903225158687 0.9807852803038259 0.06 +602 0.1950903225158687 0.9807852803038259 0.08000000000000002 +603 0.2902846780119318 0.9569403355024331 0.02 +604 0.2902846780119318 0.9569403355024331 0.04000000000000001 +605 0.2902846780119318 0.9569403355024331 0.06 +606 0.2902846780119318 0.9569403355024331 0.08000000000000002 +607 0.3826834334019886 0.9238795320817892 0.02 +608 0.3826834334019886 0.9238795320817892 0.04000000000000001 +609 0.3826834334019886 0.9238795320817892 0.06 +610 0.3826834334019886 0.9238795320817892 0.08000000000000002 +611 0.4713967380569389 0.8819212636904032 0.02 +612 0.4713967380569389 0.8819212636904032 0.04000000000000001 +613 0.4713967380569389 0.8819212636904032 0.06 +614 0.4713967380569389 0.8819212636904032 0.08000000000000002 +615 0.5555702344182949 0.8314696113679687 0.02 +616 0.5555702344182949 0.8314696113679687 0.04000000000000001 +617 0.5555702344182949 0.8314696113679687 0.06 +618 0.5555702344182949 0.8314696113679687 0.08000000000000002 +619 0.6343932857215511 0.7730104520841969 0.02 +620 0.6343932857215511 0.7730104520841969 0.04000000000000001 +621 0.6343932857215511 0.7730104520841969 0.06 +622 0.6343932857215511 0.7730104520841969 0.08000000000000002 +623 0.7071067827997501 0.7071067795733449 0.02 +624 0.7071067827997501 0.7071067795733449 0.04000000000000001 +625 0.7071067827997501 0.7071067795733449 0.06 +626 0.7071067827997501 0.7071067795733449 0.08000000000000002 +627 0.7730104546074502 0.634393282646958 0.02 +628 0.7730104546074502 0.634393282646958 0.04000000000000001 +629 0.7730104546074502 0.634393282646958 0.06 +630 0.7730104546074502 0.634393282646958 0.08000000000000002 +631 0.8314696132346829 0.5555702316245595 0.02 +632 0.8314696132346829 0.5555702316245595 0.04000000000000001 +633 0.8314696132346829 0.5555702316245595 0.06 +634 0.8314696132346829 0.5555702316245595 0.08000000000000002 +635 0.8819212650453002 0.471396735522105 0.02 +636 0.8819212650453002 0.471396735522105 0.04000000000000001 +637 0.8819212650453002 0.471396735522105 0.06 +638 0.8819212650453002 0.471396735522105 0.08000000000000002 +639 0.9238795329807084 0.3826834312318057 0.02 +640 0.9238795329807084 0.3826834312318057 0.04000000000000001 +641 0.9238795329807084 0.3826834312318057 0.06 +642 0.9238795329807084 0.3826834312318057 0.08000000000000002 +643 0.9569403360010258 0.2902846763682919 0.02 +644 0.9569403360010258 0.2902846763682919 0.04000000000000001 +645 0.9569403360010258 0.2902846763682919 0.06 +646 0.9569403360010258 0.2902846763682919 0.08000000000000002 +647 0.980785280522888 0.1950903214145686 0.02 +648 0.980785280522888 0.1950903214145686 0.04000000000000001 +649 0.980785280522888 0.1950903214145686 0.06 +650 0.980785280522888 0.1950903214145686 0.08000000000000002 +651 0.995184726701678 0.0980171400302339 0.02 +652 0.995184726701678 0.0980171400302339 0.04000000000000001 +653 0.995184726701678 0.0980171400302339 0.06 +654 0.995184726701678 0.0980171400302339 0.08000000000000002 +655 0.9951847266502585 -0.09801714055230534 0.02 +656 0.9951847266502585 -0.09801714055230534 0.04000000000000001 +657 0.9951847266502585 -0.09801714055230534 0.06 +658 0.9951847266502585 -0.09801714055230534 0.08000000000000002 +659 0.9807852803038259 -0.1950903225158687 0.02 +660 0.9807852803038259 -0.1950903225158687 0.04000000000000001 +661 0.9807852803038259 -0.1950903225158687 0.06 +662 0.9807852803038259 -0.1950903225158687 0.08000000000000002 +663 0.9569403355024331 -0.2902846780119318 0.02 +664 0.9569403355024331 -0.2902846780119318 0.04000000000000001 +665 0.9569403355024331 -0.2902846780119318 0.06 +666 0.9569403355024331 -0.2902846780119318 0.08000000000000002 +667 0.9238795320817892 -0.3826834334019886 0.02 +668 0.9238795320817892 -0.3826834334019886 0.04000000000000001 +669 0.9238795320817892 -0.3826834334019886 0.06 +670 0.9238795320817892 -0.3826834334019886 0.08000000000000002 +671 0.8819212636904032 -0.4713967380569389 0.02 +672 0.8819212636904032 -0.4713967380569389 0.04000000000000001 +673 0.8819212636904032 -0.4713967380569389 0.06 +674 0.8819212636904032 -0.4713967380569389 0.08000000000000002 +675 0.8314696113679687 -0.5555702344182949 0.02 +676 0.8314696113679687 -0.5555702344182949 0.04000000000000001 +677 0.8314696113679687 -0.5555702344182949 0.06 +678 0.8314696113679687 -0.5555702344182949 0.08000000000000002 +679 0.7730104520841969 -0.6343932857215511 0.02 +680 0.7730104520841969 -0.6343932857215511 0.04000000000000001 +681 0.7730104520841969 -0.6343932857215511 0.06 +682 0.7730104520841969 -0.6343932857215511 0.08000000000000002 +683 0.7071067795733449 -0.7071067827997501 0.02 +684 0.7071067795733449 -0.7071067827997501 0.04000000000000001 +685 0.7071067795733449 -0.7071067827997501 0.06 +686 0.7071067795733449 -0.7071067827997501 0.08000000000000002 +687 0.634393282646958 -0.7730104546074502 0.02 +688 0.634393282646958 -0.7730104546074502 0.04000000000000001 +689 0.634393282646958 -0.7730104546074502 0.06 +690 0.634393282646958 -0.7730104546074502 0.08000000000000002 +691 0.5555702316245595 -0.8314696132346829 0.02 +692 0.5555702316245595 -0.8314696132346829 0.04000000000000001 +693 0.5555702316245595 -0.8314696132346829 0.06 +694 0.5555702316245595 -0.8314696132346829 0.08000000000000002 +695 0.471396735522105 -0.8819212650453002 0.02 +696 0.471396735522105 -0.8819212650453002 0.04000000000000001 +697 0.471396735522105 -0.8819212650453002 0.06 +698 0.471396735522105 -0.8819212650453002 0.08000000000000002 +699 0.3826834312318057 -0.9238795329807084 0.02 +700 0.3826834312318057 -0.9238795329807084 0.04000000000000001 +701 0.3826834312318057 -0.9238795329807084 0.06 +702 0.3826834312318057 -0.9238795329807084 0.08000000000000002 +703 0.2902846763682919 -0.9569403360010258 0.02 +704 0.2902846763682919 -0.9569403360010258 0.04000000000000001 +705 0.2902846763682919 -0.9569403360010258 0.06 +706 0.2902846763682919 -0.9569403360010258 0.08000000000000002 +707 0.1950903214145686 -0.980785280522888 0.02 +708 0.1950903214145686 -0.980785280522888 0.04000000000000001 +709 0.1950903214145686 -0.980785280522888 0.06 +710 0.1950903214145686 -0.980785280522888 0.08000000000000002 +711 0.0980171400302339 -0.995184726701678 0.02 +712 0.0980171400302339 -0.995184726701678 0.04000000000000001 +713 0.0980171400302339 -0.995184726701678 0.06 +714 0.0980171400302339 -0.995184726701678 0.08000000000000002 +715 -0.09801714055230534 -0.9951847266502585 0.02 +716 -0.09801714055230534 -0.9951847266502585 0.04000000000000001 +717 -0.09801714055230534 -0.9951847266502585 0.06 +718 -0.09801714055230534 -0.9951847266502585 0.08000000000000002 +719 -0.1950903225158687 -0.9807852803038259 0.02 +720 -0.1950903225158687 -0.9807852803038259 0.04000000000000001 +721 -0.1950903225158687 -0.9807852803038259 0.06 +722 -0.1950903225158687 -0.9807852803038259 0.08000000000000002 +723 -0.2902846780119318 -0.9569403355024331 0.02 +724 -0.2902846780119318 -0.9569403355024331 0.04000000000000001 +725 -0.2902846780119318 -0.9569403355024331 0.06 +726 -0.2902846780119318 -0.9569403355024331 0.08000000000000002 +727 -0.3826834334019886 -0.9238795320817892 0.02 +728 -0.3826834334019886 -0.9238795320817892 0.04000000000000001 +729 -0.3826834334019886 -0.9238795320817892 0.06 +730 -0.3826834334019886 -0.9238795320817892 0.08000000000000002 +731 -0.4713967380569389 -0.8819212636904032 0.02 +732 -0.4713967380569389 -0.8819212636904032 0.04000000000000001 +733 -0.4713967380569389 -0.8819212636904032 0.06 +734 -0.4713967380569389 -0.8819212636904032 0.08000000000000002 +735 -0.5555702344182949 -0.8314696113679687 0.02 +736 -0.5555702344182949 -0.8314696113679687 0.04000000000000001 +737 -0.5555702344182949 -0.8314696113679687 0.06 +738 -0.5555702344182949 -0.8314696113679687 0.08000000000000002 +739 -0.6343932857215511 -0.7730104520841969 0.02 +740 -0.6343932857215511 -0.7730104520841969 0.04000000000000001 +741 -0.6343932857215511 -0.7730104520841969 0.06 +742 -0.6343932857215511 -0.7730104520841969 0.08000000000000002 +743 -0.7071067827997501 -0.7071067795733449 0.02 +744 -0.7071067827997501 -0.7071067795733449 0.04000000000000001 +745 -0.7071067827997501 -0.7071067795733449 0.06 +746 -0.7071067827997501 -0.7071067795733449 0.08000000000000002 +747 -0.7730104546074502 -0.634393282646958 0.02 +748 -0.7730104546074502 -0.634393282646958 0.04000000000000001 +749 -0.7730104546074502 -0.634393282646958 0.06 +750 -0.7730104546074502 -0.634393282646958 0.08000000000000002 +751 -0.8314696132346829 -0.5555702316245595 0.02 +752 -0.8314696132346829 -0.5555702316245595 0.04000000000000001 +753 -0.8314696132346829 -0.5555702316245595 0.06 +754 -0.8314696132346829 -0.5555702316245595 0.08000000000000002 +755 -0.8819212650453002 -0.471396735522105 0.02 +756 -0.8819212650453002 -0.471396735522105 0.04000000000000001 +757 -0.8819212650453002 -0.471396735522105 0.06 +758 -0.8819212650453002 -0.471396735522105 0.08000000000000002 +759 -0.9238795329807084 -0.3826834312318057 0.02 +760 -0.9238795329807084 -0.3826834312318057 0.04000000000000001 +761 -0.9238795329807084 -0.3826834312318057 0.06 +762 -0.9238795329807084 -0.3826834312318057 0.08000000000000002 +763 -0.9569403360010258 -0.2902846763682919 0.02 +764 -0.9569403360010258 -0.2902846763682919 0.04000000000000001 +765 -0.9569403360010258 -0.2902846763682919 0.06 +766 -0.9569403360010258 -0.2902846763682919 0.08000000000000002 +767 -0.980785280522888 -0.1950903214145686 0.02 +768 -0.980785280522888 -0.1950903214145686 0.04000000000000001 +769 -0.980785280522888 -0.1950903214145686 0.06 +770 -0.980785280522888 -0.1950903214145686 0.08000000000000002 +771 -0.995184726701678 -0.0980171400302339 0.02 +772 -0.995184726701678 -0.0980171400302339 0.04000000000000001 +773 -0.995184726701678 -0.0980171400302339 0.06 +774 -0.995184726701678 -0.0980171400302339 0.08000000000000002 +775 -0.009273488353678911 0.00916045810881088 0.1 +776 -0.3630757820983154 -0.3469955703472844 0.1 +777 -0.3393006016430918 0.3877434125507266 0.1 +778 0.3759340602624919 -0.3846653235599609 0.1 +779 0.3524664372975868 0.3583892688703587 0.1 +780 0.5945328787981766 -0.05308291975789954 0.1 +781 0.05703874903711088 0.574683245119211 0.1 +782 -0.02502078444027175 -0.5909257686005999 0.1 +783 -0.553250235107575 0.0248350547261034 0.1 +784 -0.2701686041813701 -0.05030882783090838 0.1 +785 -0.08123670647713568 -0.2827079133847872 0.1 +786 -0.04536846116906931 0.2663583983810881 0.1 +787 0.2725511038357648 -0.07407296486584727 0.1 +788 -0.2497016688426531 0.630211821622997 0.1 +789 -0.6281347627917859 -0.2409434073981337 0.1 +790 0.6521237629694814 0.2478355799742357 0.1 +791 0.2375690798479049 -0.6687849541529669 0.1 +792 -0.3135728558412498 -0.6341788989468249 0.1 +793 -0.6325695068199148 0.2977590446030966 0.1 +794 0.619475281910241 -0.3106710996108289 0.1 +795 0.327865472326411 0.5988727915217128 0.1 +796 -0.4926294405313521 0.588725473095845 0.1 +797 0.4788156722542137 -0.5449491703199971 0.1 +798 0.5568717745949999 0.4914867485725393 0.1 +799 0.1870695488335059 0.1762698172214709 0.1 +800 0.169842222390587 0.4004228188402753 0.1 +801 0.1383114125696776 -0.4008401040703973 0.1 +802 -0.3846671881792733 0.1695499096432111 0.1 +803 0.4470135045497297 0.1399912156133567 0.1 +804 -0.04571939008393861 0.7470409208310167 0.1 +805 -0.7503493500451387 -0.04072142303306085 0.1 +806 0.7830886023934636 0.07683592262980812 0.1 +807 0.07516629693371091 -0.745765768452798 0.1 +808 -0.1712448564845363 -0.770373506906975 0.1 +809 -0.7615778434895033 0.1185068855776851 0.1 +810 0.7668907673496597 -0.1567625310611865 0.1 +811 0.1235115021054526 0.7582282788488385 0.1 +812 0.09035507534711798 -0.1912831764255331 0.1 +813 -0.1743740890750027 0.1355463453084745 0.1 +814 -0.4543060044470116 -0.1450809754112376 0.1 +815 -0.1746169779603575 0.471317392059293 0.1 +816 -0.2075093441284043 -0.4544221264604095 0.1 +817 0.4586913258454594 -0.2085694286770441 0.1 +818 -0.2540017658890998 -0.1996413487670297 0.1 +819 -0.4435465925282415 0.7031650572959909 0.1 +820 -0.7508781529949816 -0.4305927328461222 0.1 +821 0.7106809742073578 0.4214695806199034 0.1 +822 0.4377205446574154 -0.7296945023261667 0.1 +823 -0.4983469704067841 -0.6704998311070786 0.1 +824 -0.6699453466572191 0.5095662850023257 0.1 +825 0.6677082690910396 -0.4961827525596115 0.1 +826 0.5066026866417465 0.6763056530401219 0.1 +827 -0.1245789130043155 -0.07581960131543526 0.1 +828 0.02045559625759278 0.1761745275927596 0.1 +829 -0.2271664414560042 0.8140695588238773 0.1 +830 -0.8117991378053704 -0.2269708645051213 0.1 +831 -0.3119629502622372 -0.7809122323920169 0.1 +832 -0.7525927492882537 0.2908226447508215 0.1 +833 0.7786824181801033 -0.303468213931925 0.1 +834 0.2969994631013257 0.7681053406624917 0.1 +835 0.2386361192590425 -0.512311802796792 0.1 +836 0.2839300050214306 0.4870112192367937 0.1 +837 -0.4638035146850763 0.2850045449981252 0.1 +838 -0.3384081372294015 0.5195995794965675 0.1 +839 -0.5570448424526959 -0.3324418155365523 0.1 +840 0.5464114727398809 0.3412697479596888 0.1 +841 -0.3984370042975314 -0.4651402068380363 0.1 +842 0.4757732615849015 -0.4003478393343251 0.1 +843 0.2664507717780748 -0.2571856814868128 0.1 +844 -0.2094045914961626 0.2666905255521942 0.1 +845 0.5638909551732338 0.09686906104084264 0.1 +846 0.1794250986628849 -0.009426761015043944 0.1 +847 0.1394329841046863 -0.5869660143561526 0.1 +848 -0.5628192835211518 0.1874140771451427 0.1 +849 0.1792253963761268 0.5746954242594616 0.1 +850 0.4464337145448064 -0.02948821903061176 0.1 +851 -0.452682225086054 -0.008442605724991302 0.1 +852 -0.03240794943122387 -0.4091479152074091 0.1 +853 -0.005405641633195541 0.4267693938557921 0.1 +854 -0.08193709304225939 0.6445946124371349 0.1 +855 -0.6425688896393558 -0.08292930323856634 0.1 +856 -0.1775581279604183 -0.6056765638685718 0.1 +857 0.6095518270225001 -0.1445913150009022 0.1 +858 -0.8382711392463122 0.04499953522558203 0.1 +859 -0.03409621994624469 -0.8401419789675956 0.1 +860 0.04438081038954167 0.836419664956622 0.1 +861 0.8553675062584657 -0.05386684210448676 0.1 +862 0.3749386715962159 -0.5487754583110536 0.1 +863 0.3974359820942239 0.5215042692528412 0.1 +864 -0.5041576228621361 0.4333723785373178 0.1 +865 0.2364611986036771 0.2798634810348056 0.1 +866 0.2849503733965617 0.03118901498650395 0.1 +867 -0.011675368022789 -0.1583646189613644 0.1 +868 0.1206626040530767 0.2446482506595883 0.1 +869 0.4970837880675948 0.2480293971507536 0.1 +870 -0.6105405940863746 -0.5349387521475042 0.1 +871 -0.553991735346019 0.6655815144261268 0.1 +872 0.6597459497119282 0.5464669372594945 0.1 +873 0.5400899340776318 -0.6566914551128153 0.1 +874 -0.7087023166319029 0.03326067134231309 0.1 +875 -0.02493190515371452 -0.6959354983668804 0.1 +876 0.694063866360876 -0.02538340807346447 0.1 +877 0.03982010370461493 -0.3177642321309389 0.1 +878 -0.2792299368920985 0.06186444744713838 0.1 +879 -0.3808110359368689 -0.2121926627689711 0.1 +880 -0.2276452154991185 -0.3341328615566676 0.1 +881 0.3397134731995448 0.1996534621165916 0.1 +882 -0.1019499545891515 0.02438360087543125 0.1 +883 0.8365403305290204 0.3599025089438682 0.1 +884 0.3639269354255869 -0.8351171068682989 0.1 +885 -0.3319516295196943 0.8327481288423965 0.1 +886 -0.8333013038828953 -0.3287324073197915 0.1 +887 0.7938047051295087 -0.4102751112783604 0.1 +888 0.444808774696317 0.7961722113720798 0.1 +889 -0.4127852419823073 -0.7949611030251975 0.1 +890 -0.7915141740889436 0.4443857241644811 0.1 +891 -0.3406250179730959 0.2705330993773377 0.1 +892 0.2397166078874612 -0.3186594518216563 0.1 +893 -0.854582551441107 0.2060173065942562 0.1 +894 -0.2141080697608677 -0.8586786596798476 0.1 +895 0.207761903824096 0.8574333639541414 0.1 +896 0.8702274683783644 -0.1831600288236168 0.1 +897 -0.9058378278550592 -0.1171729149352221 0.1 +898 -0.1174153984494048 0.9059350404172869 0.1 +899 0.09393394886261931 -0.8697094920958993 0.1 +900 0.8687844944930114 0.1250958483641025 0.1 +901 0.613476042990282 0.6597072786234576 0.1 +902 0.6563391835241257 -0.6085138609223993 0.1 +903 -0.6589078743885748 0.615595447751677 0.1 +904 -0.6077926747047573 -0.6566320489753026 0.1 +905 -0.06455234163770032 0.1905609960067338 0.1 +906 0.6723200260837866 0.1042959368376399 0.1 +907 0.06924415183346858 -0.08393017700741348 0.1 +908 0.1424852488362597 -0.6745915873019526 0.1 +909 -0.6560236018933121 0.1957683112241136 0.1 +910 0.2261335291230376 0.6724451430202616 0.1 +911 0.05344537732330912 -0.4972496141312576 0.1 +912 -0.4820616617036059 0.09639661489927862 0.1 +913 0.09915707861606107 0.4904305652463083 0.1 +914 -0.5294269027832078 -0.229361943472022 0.1 +915 -0.2434414406797225 0.5484307460752702 0.1 +916 0.4323794103526783 -0.3333644853485817 0.1 +917 -0.2779188756682962 -0.5381002730158441 0.1 +918 0.4199394697088852 -0.4677534687941777 0.1 +919 -0.4024304770888812 0.4441972293962587 0.1 +920 0.4615115682168016 0.4236986619354352 0.1 +921 -0.2164334946980676 0.3968245142626498 0.1 +922 0.3154575257583962 -0.1554414062667671 0.1 +923 0.168646802800918 -0.1135306217596707 0.1 +924 -0.1307746275873545 0.3441637217611287 0.1 +925 -0.1404269256120112 0.7107768933630642 0.1 +926 -0.7112296458136502 -0.1365941812077176 0.1 +927 -0.2399545607912618 -0.6977579734372208 0.1 +928 0.6747833944187278 -0.2118895710801944 0.1 +929 0.5176698580334621 -0.103819867884 0.1 +930 0.5085251556188322 -0.2907820503817347 0.1 +931 -0.05716641689026527 0.5297210956392591 0.1 +932 -0.5317823103397754 -0.06535435449405379 0.1 +933 -0.1143466599777276 -0.5079348162494908 0.1 +934 -0.1552003731363872 -0.1882414588162507 0.1 +935 0.4807495171113731 0.06444083946329973 0.1 +936 -0.3935460045730921 -0.07322906953870696 0.1 +937 -0.1364424208872183 -0.4017880099381987 0.1 +938 -0.6099576367888768 -0.4080701547928401 0.1 +939 -0.4184976473519184 0.6069185768899372 0.1 +940 0.6015858447097795 0.4168994824662515 0.1 +941 -0.493656346274863 -0.5791291481875378 0.1 +942 0.5739436060474877 -0.4818993768051738 0.1 +943 0.6283101313585021 0.01284599179099455 0.1 +944 -0.43419467902241 -0.2889496462323161 0.1 +945 -0.2916385303663842 -0.4300562263662718 0.1 +946 0.06487005994819951 -0.6783808943290489 0.1 +947 -0.6642386657586006 0.09051471157143443 0.1 +948 0.119352651218099 0.6521462566346119 0.1 +949 0.09935639842703067 0.08740076794828069 0.1 +950 0.05963876045316886 0.3348085960046109 0.1 +951 -0.189697863908265 0.04565283320092126 0.1 +952 -0.5158315599457346 -0.4720096234205078 0.1 +953 0.2611642942788689 0.3813926235659463 0.1 +954 -0.2000795210665827 -0.1353554083626738 0.1 +955 0.1457369485756468 -0.2841370987613376 0.1 +956 -0.2777089402540138 0.1797753259785467 0.1 +957 -0.9085460880639742 0.1237878018187586 0.1 +958 -0.1019900043913622 -0.893259472605428 0.1 +959 0.1238200652537517 0.9085964392549061 0.1 +960 0.9180062739236612 -0.09598573992101976 0.1 +961 -0.912655932260213 -0.02398319083466645 0.1 +962 0.008367413925278861 -0.9198853063971549 0.1 +963 -0.02431317099512088 0.9123210735134266 0.1 +964 0.9041300124986519 0.01379330183484605 0.1 +965 0.1387887380973432 -0.4978667689867478 0.1 +966 -0.4733497580335891 0.1784879591508934 0.1 +967 0.1809814155632116 0.4861297825179496 0.1 +968 -0.1805252126171017 -0.2504896943144203 0.1 +969 -0.702180347906077 -0.3422747202427379 0.1 +970 -0.3371324926778692 0.7180705547772359 0.1 +971 0.3355235802450693 -0.7346391500484335 0.1 +972 0.7547539480769733 0.3256658213326131 0.1 +973 -0.4040050818669008 -0.6858069966967554 0.1 +974 -0.6869510428621548 0.4053059519181766 0.1 +975 0.6816618408241883 -0.4004997666741786 0.1 +976 0.4043189186425183 0.7061993611488281 0.1 +977 0.4357872263118142 -0.6278912731197483 0.1 +978 -0.577044321219035 0.5053568079175584 0.1 +979 0.4929783347874608 0.5898093814039689 0.1 +980 -0.5099423846696907 0.7915982151319552 0.1 +981 0.7917668927146317 0.5073383363124405 0.1 +982 0.5099364616038597 -0.7943442416782676 0.1 +983 -0.7865708918099946 -0.4788062647442327 0.1 +984 0.7310466732033456 -0.5861211886606393 0.1 +985 -0.5864063496396488 -0.7314837302855907 0.1 +986 -0.732024773425717 0.5904014501328559 0.1 +987 0.5896793499421527 0.7330948876097587 0.1 +988 -0.2793304508241014 0.4475639742663415 0.1 +989 0.355203053584752 -0.2590326189704956 0.1 +990 -0.01764621587658752 -0.07623595338571734 0.1 +991 0.5559773824930981 0.2815234913734928 0.1 +992 0.2715128434122404 0.1309277237798032 0.1 +993 -0.3255162704041832 -0.137329482215004 0.1 +994 0.2024784117148658 -0.5888155563916311 0.1 +995 -0.5536400196553282 0.2520376402006607 0.1 +996 0.2490883574581664 0.5851115407104762 0.1 +997 0.03906613347282865 0.2559297725173381 0.1 +998 0.4081527767190752 0.02302872598445437 0.1 +999 -0.3067585558051941 -0.2746393252055986 0.1 +1000 -0.8994457602932987 -0.2073009716668192 0.1 +1001 -0.2076698327299657 0.8998125051190659 0.1 +1002 0.1987056795586867 -0.874783771414067 0.1 +1003 0.8759565811829598 0.2037109161691198 0.1 +1004 -0.8508362851736823 0.2881177627471704 0.1 +1005 -0.2984712019525212 -0.8664311478158504 0.1 +1006 0.2903693012897265 0.8560987865782422 0.1 +1007 0.8677922460246092 -0.2907370381259845 0.1 +1008 0.449230552178808 0.3267512102983695 0.1 +1009 -0.1399529961133417 0.2186072262024135 0.1 +1010 -0.683414355426208 -0.01935594619362641 0.1 +1011 -0.03848963524996514 0.6908527686263575 0.1 +1012 -0.09355424524288704 -0.6602750515835725 0.1 +1013 0.6548160552512688 -0.09067689612227429 0.1 +1014 0.417424725225269 -0.1037522646626998 0.1 +1015 -0.1482953535684708 0.5688844037848088 0.1 +1016 -0.5890035306409565 -0.1409938566407858 0.1 +1017 -0.1950236064179035 -0.5214276096103913 0.1 +1018 0.3374555497534149 -0.4604931408653773 0.1 +1019 0.3765379904706818 0.4436653946632465 0.1 +1020 -0.4609699033777138 0.391672450158235 0.1 +1021 -0.336152767929308 0.6216329239395814 0.1 +1022 -0.6243763223467242 -0.3021434256504772 0.1 +1023 0.5727462232380477 -0.3757599397230176 0.1 +1024 -0.3767864243565537 -0.5793464411761597 0.1 +1025 0.2064568728237731 0.08584647913822206 0.1 +1026 0.244069845375065 -0.0173076257160734 0.1 +1027 0.1071212263637422 0.169783383677218 0.1 +1028 0.2267165873343268 -0.404196491767902 0.1 +1029 -0.3921243599547922 0.237380356580334 0.1 +1030 0.7762264538031828 0.1334299110335727 0.1 +1031 0.6255619678532343 0.3623554477175763 0.1 +1032 -0.3847763662517107 0.06131267630738398 0.1 +1033 0.05175361961460756 -0.4060401688047797 0.1 +1034 0.7971758261607385 -0.009677090010098406 0.1 +1035 0.02903964021997372 -0.7868651127330674 0.1 +1036 0.5436385913445115 -0.1780222692551246 0.1 +1037 -0.4766052200995599 -0.3691499610194545 0.1 +1038 -0.09227480672418116 0.446412833215618 0.1 +1039 -0.8276707036086602 0.3663654908505932 0.1 +1040 -0.3625720175441697 -0.8654470711559323 0.1 +1041 0.3679768792395708 0.8339255635922422 0.1 +1042 0.8653158533360795 -0.3596237269740152 0.1 +1043 -0.8993152141046745 -0.2735310195472121 0.1 +1044 -0.2742080431142168 0.8995416986589064 0.1 +1045 0.2823776819579458 -0.8614674305440521 0.1 +1046 0.8638372874845223 0.2814474457157449 0.1 +1047 0.005720196065220282 0.09510058453179887 0.1 +1048 -0.4113563739337736 0.5440605170594375 0.1 +1049 0.5429183323635547 0.4174161733166027 0.1 +1050 0.4898446896719412 -0.4725834207981396 0.1 +1051 0.6799180594625716 0.6093546310769131 0.1 +1052 0.6066775018333774 -0.6769050674404204 0.1 +1053 -0.6113192359830126 0.6822383870521778 0.1 +1054 -0.6879780354527674 -0.5869202945565708 0.1 +1055 0.13280865311488 -0.7626550897371936 0.1 +1056 0.212519693716841 -0.7781235116252192 0.1 +1057 0.3115820850724765 0.6840739216783392 0.1 +1058 -0.7540258566496366 0.2033190372303242 0.1 +1059 0.2132391670384238 0.7627843083827193 0.1 +1060 0.7797283856855453 0.2135271098329889 0.1 +1061 -0.5691980284264325 -0.5855742751261486 0.1 +1062 0.5590107420116385 -0.5712906149700842 0.1 +1063 0.01295413502917306 -0.237090692226727 0.1 +1064 -0.2420698239367897 0.7210400773243747 0.1 +1065 -0.7178312364409216 -0.2376826902164933 0.1 +1066 0.6869006122989217 -0.3099083198112231 0.1 +1067 -0.3178499970389874 -0.6970785036289955 0.1 +1068 -0.1320844404820838 0.8166337655205012 0.1 +1069 -0.8165365137081694 -0.1305531797328427 0.1 +1070 -0.2302830524795657 -0.7755656321644682 0.1 +1071 0.772124284225815 -0.214291273801193 0.1 +1072 0.2289943343655265 -0.2041911189604385 0.1 +1073 0.313385418863572 -0.3478517310539778 0.1 +1074 -0.2749889886035179 0.3283958766372468 0.1 +1075 0.1784513232539571 0.2321332968991923 0.1 +1076 0.5372461404555327 0.177259879833838 0.1 +1077 0.3569536974980164 -0.6511397036653975 0.1 +1078 -0.5707219917837311 0.4230779019485903 0.1 +1079 0.4068507250445134 0.6023778940918366 0.1 +1080 0.3104463105053766 -0.5973784833279926 0.1 +1081 0.3392484760137726 0.5379185813946928 0.1 +1082 -0.5334581930932596 0.3510954155040024 0.1 +1083 -0.1049004877290534 0.2733072360264381 0.1 +1084 0.08684016475009505 -0.0001154658118619617 0.1 +1085 0.3433509849726744 -0.02839693236601738 0.1 +1086 0.421966220427518 -0.418371918983939 0.1 +1087 0.1448711585619036 0.3177504243506497 0.1 +1088 -0.3502316867446068 -0.02250865640264687 0.1 +1089 -0.02440853505205695 -0.3407757724541551 0.1 +1090 0.5856187551363887 -0.2523089995580183 0.1 +1091 0.4192608875569094 0.2159642076241164 0.1 +1092 -0.7477960516123059 -0.5244744744882651 0.1 +1093 -0.5317252840918131 0.7369538594664218 0.1 +1094 0.5239913252132835 -0.7380102585252672 0.1 +1095 0.7356460351243852 0.5245181246208961 0.1 +1096 -0.4124412670844655 -0.3949244298615737 0.1 +1097 -0.02700536791140639 0.3447334599804672 0.1 +1098 -0.568650677347752 0.5898376576967671 0.1 +1099 0.5786789825822586 0.5695912541022239 0.1 +1100 -0.9142972860505157 0.06340918818020852 0.1 +1101 -0.06784932272078724 -0.9375851412550555 0.1 +1102 0.06318415345401196 0.9138848214484351 0.1 +1103 0.943323287043117 -0.02436457279393412 0.1 +1104 -0.6766940123516199 -0.4736898381042419 0.1 +1105 -0.4995573255429975 0.649323325952923 0.1 +1106 0.628873771450369 0.4689806786238402 0.1 +1107 -0.01525709683040301 0.6058672437123304 0.1 +1108 -0.6023929760809482 -0.04690466966469053 0.1 +1109 -0.638041146495291 -0.1772508545139594 0.1 +1110 -0.1833411205769646 0.6368071204091833 0.1 +1111 -0.254820601188139 -0.620523774733428 0.1 +1112 0.0573373956269707 -0.5893050347178428 0.1 +1113 -0.5648702794078161 0.1017551343549891 0.1 +1114 0.1098839761223454 0.5471577958965221 0.1 +1115 0.5739079163391468 0.03388011106382179 0.1 +1116 0.0807550665592261 0.4134849456169955 0.1 +1117 -0.03071133818100915 -0.5000764508891952 0.1 +1118 -0.4952495834676112 0.0363249356686037 0.1 +1119 0.02221053103249053 0.5046568980768951 0.1 +1120 -0.1509883085519089 -0.7011934499747617 0.1 +1121 0.7157119856144909 -0.1306786726026019 0.1 +1122 -0.8454461547050278 0.1242180958366506 0.1 +1123 -0.1404332347510375 -0.8246621089137849 0.1 +1124 0.1255049929716144 0.8452124970473215 0.1 +1125 0.8082875074664617 -0.115339449568752 0.1 +1126 0.5205442209132707 -0.01668693502320576 0.1 +1127 -0.08356141445332145 0.1110702249359781 0.1 +1128 0.3370260710945491 0.2772924701028578 0.1 +1129 0.4234759520057531 -0.5205743629890647 0.1 +1130 0.4769846664590845 0.5067502606822457 0.1 +1131 -0.4758324437609096 0.5029522421326716 0.1 +1132 0.2615712986181207 0.1899663861767313 0.1 +1133 0.05115140286568221 -0.14350526630773 0.1 +1134 0.2887213389972646 -0.4039475650165419 0.1 +1135 -0.4008244299391783 0.3351032680280133 0.1 +1136 0.8076009813815366 0.4420606581071422 0.1 +1137 0.4465565815629323 -0.809466605352179 0.1 +1138 -0.4422024039427189 0.8037926887271941 0.1 +1139 -0.8159159053992495 -0.4076165205093536 0.1 +1140 0.7537866005416408 -0.5174461579498879 0.1 +1141 0.5258920943680429 0.7578896955346317 0.1 +1142 -0.5184324220664533 -0.7547537594941177 0.1 +1143 -0.7546511382409899 0.526557102599275 0.1 +1144 -0.2331734409113291 0.4906122615105926 0.1 +1145 -0.04023174618598973 0.8267240701620343 0.1 +1146 0.8393639335741593 0.05264228469825077 0.1 +1147 -0.8281986127176854 -0.03860013002446162 0.1 +1148 -0.1950579950872454 -0.02377408596863028 0.1 +1149 0.347430933875454 0.1052452981826389 0.1 +1150 0.3997633875258403 0.2711437116297114 0.1 +1151 0.795411454699938 0.2727801199271267 0.1 +1152 0.273758664450472 -0.791853893524051 0.1 +1153 0.354311183601827 0.7722213983503817 0.1 +1154 -0.7569610725054408 0.3508809227011437 0.1 +1155 -0.7624425825752122 0.03883371116524456 0.1 +1156 -0.08573001837619887 -0.769643021286046 0.1 +1157 0.0369242159646908 0.7555384349414538 0.1 +1158 0.7539941802596171 -0.06910515729163667 0.1 +1159 -0.09392048167665304 -0.176128945220071 0.1 +1160 0.5734523063403572 -0.09936457676711502 0.1 +1161 0.02081977010202333 0.6781228317328531 0.1 +1162 -0.6217052436174334 0.006945684980102823 0.1 +1163 0.7407066992742855 0.0357574307154823 0.1 +1164 -0.1020069572301296 -0.5953093552003388 0.1 +1165 -0.009273488353678911 0.00916045810881088 0.02 +1166 -0.009273488353678911 0.00916045810881088 0.04000000000000001 +1167 -0.009273488353678911 0.00916045810881088 0.06 +1168 -0.009273488353678911 0.00916045810881088 0.08000000000000002 +1169 -0.3630757820983154 -0.3469955703472844 0.02 +1170 -0.3630757820983154 -0.3469955703472844 0.04000000000000001 +1171 -0.3630757820983154 -0.3469955703472844 0.06 +1172 -0.3630757820983154 -0.3469955703472844 0.08000000000000002 +1173 -0.3393006016430918 0.3877434125507266 0.02 +1174 -0.3393006016430918 0.3877434125507266 0.04000000000000001 +1175 -0.3393006016430918 0.3877434125507266 0.06 +1176 -0.3393006016430918 0.3877434125507266 0.08000000000000002 +1177 0.3759340602624919 -0.3846653235599609 0.02 +1178 0.3759340602624919 -0.3846653235599609 0.04000000000000001 +1179 0.3759340602624919 -0.3846653235599609 0.06 +1180 0.3759340602624919 -0.3846653235599609 0.08000000000000002 +1181 0.3524664372975868 0.3583892688703587 0.02 +1182 0.3524664372975868 0.3583892688703587 0.04000000000000001 +1183 0.3524664372975868 0.3583892688703587 0.06 +1184 0.3524664372975868 0.3583892688703587 0.08000000000000002 +1185 0.5945328787981766 -0.05308291975789954 0.02 +1186 0.5945328787981766 -0.05308291975789954 0.04000000000000001 +1187 0.5945328787981766 -0.05308291975789954 0.06 +1188 0.5945328787981766 -0.05308291975789954 0.08000000000000002 +1189 0.05703874903711088 0.574683245119211 0.02 +1190 0.05703874903711088 0.574683245119211 0.04000000000000001 +1191 0.05703874903711088 0.574683245119211 0.06 +1192 0.05703874903711088 0.574683245119211 0.08000000000000002 +1193 -0.02502078444027175 -0.5909257686005999 0.02 +1194 -0.02502078444027175 -0.5909257686005999 0.04000000000000001 +1195 -0.02502078444027175 -0.5909257686005999 0.06 +1196 -0.02502078444027175 -0.5909257686005999 0.08000000000000002 +1197 -0.553250235107575 0.0248350547261034 0.02 +1198 -0.553250235107575 0.0248350547261034 0.04000000000000001 +1199 -0.553250235107575 0.0248350547261034 0.06 +1200 -0.553250235107575 0.0248350547261034 0.08000000000000002 +1201 -0.2701686041813701 -0.05030882783090838 0.02 +1202 -0.2701686041813701 -0.05030882783090838 0.04000000000000001 +1203 -0.2701686041813701 -0.05030882783090838 0.06 +1204 -0.2701686041813701 -0.05030882783090838 0.08000000000000002 +1205 -0.08123670647713568 -0.2827079133847872 0.02 +1206 -0.08123670647713568 -0.2827079133847872 0.04000000000000001 +1207 -0.08123670647713568 -0.2827079133847872 0.06 +1208 -0.08123670647713568 -0.2827079133847872 0.08000000000000002 +1209 -0.04536846116906931 0.2663583983810881 0.02 +1210 -0.04536846116906931 0.2663583983810881 0.04000000000000001 +1211 -0.04536846116906931 0.2663583983810881 0.06 +1212 -0.04536846116906931 0.2663583983810881 0.08000000000000002 +1213 0.2725511038357648 -0.07407296486584727 0.02 +1214 0.2725511038357648 -0.07407296486584727 0.04000000000000001 +1215 0.2725511038357648 -0.07407296486584727 0.06 +1216 0.2725511038357648 -0.07407296486584727 0.08000000000000002 +1217 -0.2497016688426531 0.630211821622997 0.02 +1218 -0.2497016688426531 0.630211821622997 0.04000000000000001 +1219 -0.2497016688426531 0.630211821622997 0.06 +1220 -0.2497016688426531 0.630211821622997 0.08000000000000002 +1221 -0.6281347627917859 -0.2409434073981337 0.02 +1222 -0.6281347627917859 -0.2409434073981337 0.04000000000000001 +1223 -0.6281347627917859 -0.2409434073981337 0.06 +1224 -0.6281347627917859 -0.2409434073981337 0.08000000000000002 +1225 0.6521237629694814 0.2478355799742357 0.02 +1226 0.6521237629694814 0.2478355799742357 0.04000000000000001 +1227 0.6521237629694814 0.2478355799742357 0.06 +1228 0.6521237629694814 0.2478355799742357 0.08000000000000002 +1229 0.2375690798479049 -0.6687849541529669 0.02 +1230 0.2375690798479049 -0.6687849541529669 0.04000000000000001 +1231 0.2375690798479049 -0.6687849541529669 0.06 +1232 0.2375690798479049 -0.6687849541529669 0.08000000000000002 +1233 -0.3135728558412498 -0.6341788989468249 0.02 +1234 -0.3135728558412498 -0.6341788989468249 0.04000000000000001 +1235 -0.3135728558412498 -0.6341788989468249 0.06 +1236 -0.3135728558412498 -0.6341788989468249 0.08000000000000002 +1237 -0.6325695068199148 0.2977590446030966 0.02 +1238 -0.6325695068199148 0.2977590446030966 0.04000000000000001 +1239 -0.6325695068199148 0.2977590446030966 0.06 +1240 -0.6325695068199148 0.2977590446030966 0.08000000000000002 +1241 0.619475281910241 -0.3106710996108289 0.02 +1242 0.619475281910241 -0.3106710996108289 0.04000000000000001 +1243 0.619475281910241 -0.3106710996108289 0.06 +1244 0.619475281910241 -0.3106710996108289 0.08000000000000002 +1245 0.327865472326411 0.5988727915217128 0.02 +1246 0.327865472326411 0.5988727915217128 0.04000000000000001 +1247 0.327865472326411 0.5988727915217128 0.06 +1248 0.327865472326411 0.5988727915217128 0.08000000000000002 +1249 -0.4926294405313521 0.588725473095845 0.02 +1250 -0.4926294405313521 0.588725473095845 0.04000000000000001 +1251 -0.4926294405313521 0.588725473095845 0.06 +1252 -0.4926294405313521 0.588725473095845 0.08000000000000002 +1253 0.4788156722542137 -0.5449491703199971 0.02 +1254 0.4788156722542137 -0.5449491703199971 0.04000000000000001 +1255 0.4788156722542137 -0.5449491703199971 0.06 +1256 0.4788156722542137 -0.5449491703199971 0.08000000000000002 +1257 0.5568717745949999 0.4914867485725393 0.02 +1258 0.5568717745949999 0.4914867485725393 0.04000000000000001 +1259 0.5568717745949999 0.4914867485725393 0.06 +1260 0.5568717745949999 0.4914867485725393 0.08000000000000002 +1261 0.1870695488335059 0.1762698172214709 0.02 +1262 0.1870695488335059 0.1762698172214709 0.04000000000000001 +1263 0.1870695488335059 0.1762698172214709 0.06 +1264 0.1870695488335059 0.1762698172214709 0.08000000000000002 +1265 0.169842222390587 0.4004228188402753 0.02 +1266 0.169842222390587 0.4004228188402753 0.04000000000000001 +1267 0.169842222390587 0.4004228188402753 0.06 +1268 0.169842222390587 0.4004228188402753 0.08000000000000002 +1269 0.1383114125696776 -0.4008401040703973 0.02 +1270 0.1383114125696776 -0.4008401040703973 0.04000000000000001 +1271 0.1383114125696776 -0.4008401040703973 0.06 +1272 0.1383114125696776 -0.4008401040703973 0.08000000000000002 +1273 -0.3846671881792733 0.1695499096432111 0.02 +1274 -0.3846671881792733 0.1695499096432111 0.04000000000000001 +1275 -0.3846671881792733 0.1695499096432111 0.06 +1276 -0.3846671881792733 0.1695499096432111 0.08000000000000002 +1277 0.4470135045497297 0.1399912156133567 0.02 +1278 0.4470135045497297 0.1399912156133567 0.04000000000000001 +1279 0.4470135045497297 0.1399912156133567 0.06 +1280 0.4470135045497297 0.1399912156133567 0.08000000000000002 +1281 -0.04571939008393861 0.7470409208310167 0.02 +1282 -0.04571939008393861 0.7470409208310167 0.04000000000000001 +1283 -0.04571939008393861 0.7470409208310167 0.06 +1284 -0.04571939008393861 0.7470409208310167 0.08000000000000002 +1285 -0.7503493500451387 -0.04072142303306085 0.02 +1286 -0.7503493500451387 -0.04072142303306085 0.04000000000000001 +1287 -0.7503493500451387 -0.04072142303306085 0.06 +1288 -0.7503493500451387 -0.04072142303306085 0.08000000000000002 +1289 0.7830886023934636 0.07683592262980812 0.02 +1290 0.7830886023934636 0.07683592262980812 0.04000000000000001 +1291 0.7830886023934636 0.07683592262980812 0.06 +1292 0.7830886023934636 0.07683592262980812 0.08000000000000002 +1293 0.07516629693371091 -0.745765768452798 0.02 +1294 0.07516629693371091 -0.745765768452798 0.04000000000000001 +1295 0.07516629693371091 -0.745765768452798 0.06 +1296 0.07516629693371091 -0.745765768452798 0.08000000000000002 +1297 -0.1712448564845363 -0.770373506906975 0.02 +1298 -0.1712448564845363 -0.770373506906975 0.04000000000000001 +1299 -0.1712448564845363 -0.770373506906975 0.06 +1300 -0.1712448564845363 -0.770373506906975 0.08000000000000002 +1301 -0.7615778434895033 0.1185068855776851 0.02 +1302 -0.7615778434895033 0.1185068855776851 0.04000000000000001 +1303 -0.7615778434895033 0.1185068855776851 0.06 +1304 -0.7615778434895033 0.1185068855776851 0.08000000000000002 +1305 0.7668907673496597 -0.1567625310611865 0.02 +1306 0.7668907673496597 -0.1567625310611865 0.04000000000000001 +1307 0.7668907673496597 -0.1567625310611865 0.06 +1308 0.7668907673496597 -0.1567625310611865 0.08000000000000002 +1309 0.1235115021054526 0.7582282788488385 0.02 +1310 0.1235115021054526 0.7582282788488385 0.04000000000000001 +1311 0.1235115021054526 0.7582282788488385 0.06 +1312 0.1235115021054526 0.7582282788488385 0.08000000000000002 +1313 0.09035507534711798 -0.1912831764255331 0.02 +1314 0.09035507534711798 -0.1912831764255331 0.04000000000000001 +1315 0.09035507534711798 -0.1912831764255331 0.06 +1316 0.09035507534711798 -0.1912831764255331 0.08000000000000002 +1317 -0.1743740890750027 0.1355463453084745 0.02 +1318 -0.1743740890750027 0.1355463453084745 0.04000000000000001 +1319 -0.1743740890750027 0.1355463453084745 0.06 +1320 -0.1743740890750027 0.1355463453084745 0.08000000000000002 +1321 -0.4543060044470116 -0.1450809754112376 0.02 +1322 -0.4543060044470116 -0.1450809754112376 0.04000000000000001 +1323 -0.4543060044470116 -0.1450809754112376 0.06 +1324 -0.4543060044470116 -0.1450809754112376 0.08000000000000002 +1325 -0.1746169779603575 0.471317392059293 0.02 +1326 -0.1746169779603575 0.471317392059293 0.04000000000000001 +1327 -0.1746169779603575 0.471317392059293 0.06 +1328 -0.1746169779603575 0.471317392059293 0.08000000000000002 +1329 -0.2075093441284043 -0.4544221264604095 0.02 +1330 -0.2075093441284043 -0.4544221264604095 0.04000000000000001 +1331 -0.2075093441284043 -0.4544221264604095 0.06 +1332 -0.2075093441284043 -0.4544221264604095 0.08000000000000002 +1333 0.4586913258454594 -0.2085694286770441 0.02 +1334 0.4586913258454594 -0.2085694286770441 0.04000000000000001 +1335 0.4586913258454594 -0.2085694286770441 0.06 +1336 0.4586913258454594 -0.2085694286770441 0.08000000000000002 +1337 -0.2540017658890998 -0.1996413487670297 0.02 +1338 -0.2540017658890998 -0.1996413487670297 0.04000000000000001 +1339 -0.2540017658890998 -0.1996413487670297 0.06 +1340 -0.2540017658890998 -0.1996413487670297 0.08000000000000002 +1341 -0.4435465925282415 0.7031650572959909 0.02 +1342 -0.4435465925282415 0.7031650572959909 0.04000000000000001 +1343 -0.4435465925282415 0.7031650572959909 0.06 +1344 -0.4435465925282415 0.7031650572959909 0.08000000000000002 +1345 -0.7508781529949816 -0.4305927328461222 0.02 +1346 -0.7508781529949816 -0.4305927328461222 0.04000000000000001 +1347 -0.7508781529949816 -0.4305927328461222 0.06 +1348 -0.7508781529949816 -0.4305927328461222 0.08000000000000002 +1349 0.7106809742073578 0.4214695806199034 0.02 +1350 0.7106809742073578 0.4214695806199034 0.04000000000000001 +1351 0.7106809742073578 0.4214695806199034 0.06 +1352 0.7106809742073578 0.4214695806199034 0.08000000000000002 +1353 0.4377205446574154 -0.7296945023261667 0.02 +1354 0.4377205446574154 -0.7296945023261667 0.04000000000000001 +1355 0.4377205446574154 -0.7296945023261667 0.06 +1356 0.4377205446574154 -0.7296945023261667 0.08000000000000002 +1357 -0.4983469704067841 -0.6704998311070786 0.02 +1358 -0.4983469704067841 -0.6704998311070786 0.04000000000000001 +1359 -0.4983469704067841 -0.6704998311070786 0.06 +1360 -0.4983469704067841 -0.6704998311070786 0.08000000000000002 +1361 -0.6699453466572191 0.5095662850023257 0.02 +1362 -0.6699453466572191 0.5095662850023257 0.04000000000000001 +1363 -0.6699453466572191 0.5095662850023257 0.06 +1364 -0.6699453466572191 0.5095662850023257 0.08000000000000002 +1365 0.6677082690910396 -0.4961827525596115 0.02 +1366 0.6677082690910396 -0.4961827525596115 0.04000000000000001 +1367 0.6677082690910396 -0.4961827525596115 0.06 +1368 0.6677082690910396 -0.4961827525596115 0.08000000000000002 +1369 0.5066026866417465 0.6763056530401219 0.02 +1370 0.5066026866417465 0.6763056530401219 0.04000000000000001 +1371 0.5066026866417465 0.6763056530401219 0.06 +1372 0.5066026866417465 0.6763056530401219 0.08000000000000002 +1373 -0.1245789130043155 -0.07581960131543526 0.02 +1374 -0.1245789130043155 -0.07581960131543526 0.04000000000000001 +1375 -0.1245789130043155 -0.07581960131543526 0.06 +1376 -0.1245789130043155 -0.07581960131543526 0.08000000000000002 +1377 0.02045559625759278 0.1761745275927596 0.02 +1378 0.02045559625759278 0.1761745275927596 0.04000000000000001 +1379 0.02045559625759278 0.1761745275927596 0.06 +1380 0.02045559625759278 0.1761745275927596 0.08000000000000002 +1381 -0.2271664414560042 0.8140695588238773 0.02 +1382 -0.2271664414560042 0.8140695588238773 0.04000000000000001 +1383 -0.2271664414560042 0.8140695588238773 0.06 +1384 -0.2271664414560042 0.8140695588238773 0.08000000000000002 +1385 -0.8117991378053704 -0.2269708645051213 0.02 +1386 -0.8117991378053704 -0.2269708645051213 0.04000000000000001 +1387 -0.8117991378053704 -0.2269708645051213 0.06 +1388 -0.8117991378053704 -0.2269708645051213 0.08000000000000002 +1389 -0.3119629502622372 -0.7809122323920169 0.02 +1390 -0.3119629502622372 -0.7809122323920169 0.04000000000000001 +1391 -0.3119629502622372 -0.7809122323920169 0.06 +1392 -0.3119629502622372 -0.7809122323920169 0.08000000000000002 +1393 -0.7525927492882537 0.2908226447508215 0.02 +1394 -0.7525927492882537 0.2908226447508215 0.04000000000000001 +1395 -0.7525927492882537 0.2908226447508215 0.06 +1396 -0.7525927492882537 0.2908226447508215 0.08000000000000002 +1397 0.7786824181801033 -0.303468213931925 0.02 +1398 0.7786824181801033 -0.303468213931925 0.04000000000000001 +1399 0.7786824181801033 -0.303468213931925 0.06 +1400 0.7786824181801033 -0.303468213931925 0.08000000000000002 +1401 0.2969994631013257 0.7681053406624917 0.02 +1402 0.2969994631013257 0.7681053406624917 0.04000000000000001 +1403 0.2969994631013257 0.7681053406624917 0.06 +1404 0.2969994631013257 0.7681053406624917 0.08000000000000002 +1405 0.2386361192590425 -0.512311802796792 0.02 +1406 0.2386361192590425 -0.512311802796792 0.04000000000000001 +1407 0.2386361192590425 -0.512311802796792 0.06 +1408 0.2386361192590425 -0.512311802796792 0.08000000000000002 +1409 0.2839300050214306 0.4870112192367937 0.02 +1410 0.2839300050214306 0.4870112192367937 0.04000000000000001 +1411 0.2839300050214306 0.4870112192367937 0.06 +1412 0.2839300050214306 0.4870112192367937 0.08000000000000002 +1413 -0.4638035146850763 0.2850045449981252 0.02 +1414 -0.4638035146850763 0.2850045449981252 0.04000000000000001 +1415 -0.4638035146850763 0.2850045449981252 0.06 +1416 -0.4638035146850763 0.2850045449981252 0.08000000000000002 +1417 -0.3384081372294015 0.5195995794965675 0.02 +1418 -0.3384081372294015 0.5195995794965675 0.04000000000000001 +1419 -0.3384081372294015 0.5195995794965675 0.06 +1420 -0.3384081372294015 0.5195995794965675 0.08000000000000002 +1421 -0.5570448424526959 -0.3324418155365523 0.02 +1422 -0.5570448424526959 -0.3324418155365523 0.04000000000000001 +1423 -0.5570448424526959 -0.3324418155365523 0.06 +1424 -0.5570448424526959 -0.3324418155365523 0.08000000000000002 +1425 0.5464114727398809 0.3412697479596888 0.02 +1426 0.5464114727398809 0.3412697479596888 0.04000000000000001 +1427 0.5464114727398809 0.3412697479596888 0.06 +1428 0.5464114727398809 0.3412697479596888 0.08000000000000002 +1429 -0.3984370042975314 -0.4651402068380363 0.02 +1430 -0.3984370042975314 -0.4651402068380363 0.04000000000000001 +1431 -0.3984370042975314 -0.4651402068380363 0.06 +1432 -0.3984370042975314 -0.4651402068380363 0.08000000000000002 +1433 0.4757732615849015 -0.4003478393343251 0.02 +1434 0.4757732615849015 -0.4003478393343251 0.04000000000000001 +1435 0.4757732615849015 -0.4003478393343251 0.06 +1436 0.4757732615849015 -0.4003478393343251 0.08000000000000002 +1437 0.2664507717780748 -0.2571856814868128 0.02 +1438 0.2664507717780748 -0.2571856814868128 0.04000000000000001 +1439 0.2664507717780748 -0.2571856814868128 0.06 +1440 0.2664507717780748 -0.2571856814868128 0.08000000000000002 +1441 -0.2094045914961626 0.2666905255521942 0.02 +1442 -0.2094045914961626 0.2666905255521942 0.04000000000000001 +1443 -0.2094045914961626 0.2666905255521942 0.06 +1444 -0.2094045914961626 0.2666905255521942 0.08000000000000002 +1445 0.5638909551732338 0.09686906104084264 0.02 +1446 0.5638909551732338 0.09686906104084264 0.04000000000000001 +1447 0.5638909551732338 0.09686906104084264 0.06 +1448 0.5638909551732338 0.09686906104084264 0.08000000000000002 +1449 0.1794250986628849 -0.009426761015043944 0.02 +1450 0.1794250986628849 -0.009426761015043944 0.04000000000000001 +1451 0.1794250986628849 -0.009426761015043944 0.06 +1452 0.1794250986628849 -0.009426761015043944 0.08000000000000002 +1453 0.1394329841046863 -0.5869660143561526 0.02 +1454 0.1394329841046863 -0.5869660143561526 0.04000000000000001 +1455 0.1394329841046863 -0.5869660143561526 0.06 +1456 0.1394329841046863 -0.5869660143561526 0.08000000000000002 +1457 -0.5628192835211518 0.1874140771451427 0.02 +1458 -0.5628192835211518 0.1874140771451427 0.04000000000000001 +1459 -0.5628192835211518 0.1874140771451427 0.06 +1460 -0.5628192835211518 0.1874140771451427 0.08000000000000002 +1461 0.1792253963761268 0.5746954242594616 0.02 +1462 0.1792253963761268 0.5746954242594616 0.04000000000000001 +1463 0.1792253963761268 0.5746954242594616 0.06 +1464 0.1792253963761268 0.5746954242594616 0.08000000000000002 +1465 0.4464337145448064 -0.02948821903061176 0.02 +1466 0.4464337145448064 -0.02948821903061176 0.04000000000000001 +1467 0.4464337145448064 -0.02948821903061176 0.06 +1468 0.4464337145448064 -0.02948821903061176 0.08000000000000002 +1469 -0.452682225086054 -0.008442605724991302 0.02 +1470 -0.452682225086054 -0.008442605724991302 0.04000000000000001 +1471 -0.452682225086054 -0.008442605724991302 0.06 +1472 -0.452682225086054 -0.008442605724991302 0.08000000000000002 +1473 -0.03240794943122387 -0.4091479152074091 0.02 +1474 -0.03240794943122387 -0.4091479152074091 0.04000000000000001 +1475 -0.03240794943122387 -0.4091479152074091 0.06 +1476 -0.03240794943122387 -0.4091479152074091 0.08000000000000002 +1477 -0.005405641633195541 0.4267693938557921 0.02 +1478 -0.005405641633195541 0.4267693938557921 0.04000000000000001 +1479 -0.005405641633195541 0.4267693938557921 0.06 +1480 -0.005405641633195541 0.4267693938557921 0.08000000000000002 +1481 -0.08193709304225939 0.6445946124371349 0.02 +1482 -0.08193709304225939 0.6445946124371349 0.04000000000000001 +1483 -0.08193709304225939 0.6445946124371349 0.06 +1484 -0.08193709304225939 0.6445946124371349 0.08000000000000002 +1485 -0.6425688896393558 -0.08292930323856634 0.02 +1486 -0.6425688896393558 -0.08292930323856634 0.04000000000000001 +1487 -0.6425688896393558 -0.08292930323856634 0.06 +1488 -0.6425688896393558 -0.08292930323856634 0.08000000000000002 +1489 -0.1775581279604183 -0.6056765638685718 0.02 +1490 -0.1775581279604183 -0.6056765638685718 0.04000000000000001 +1491 -0.1775581279604183 -0.6056765638685718 0.06 +1492 -0.1775581279604183 -0.6056765638685718 0.08000000000000002 +1493 0.6095518270225001 -0.1445913150009022 0.02 +1494 0.6095518270225001 -0.1445913150009022 0.04000000000000001 +1495 0.6095518270225001 -0.1445913150009022 0.06 +1496 0.6095518270225001 -0.1445913150009022 0.08000000000000002 +1497 -0.8382711392463122 0.04499953522558203 0.02 +1498 -0.8382711392463122 0.04499953522558203 0.04000000000000001 +1499 -0.8382711392463122 0.04499953522558203 0.06 +1500 -0.8382711392463122 0.04499953522558203 0.08000000000000002 +1501 -0.03409621994624469 -0.8401419789675956 0.02 +1502 -0.03409621994624469 -0.8401419789675956 0.04000000000000001 +1503 -0.03409621994624469 -0.8401419789675956 0.06 +1504 -0.03409621994624469 -0.8401419789675956 0.08000000000000002 +1505 0.04438081038954167 0.836419664956622 0.02 +1506 0.04438081038954167 0.836419664956622 0.04000000000000001 +1507 0.04438081038954167 0.836419664956622 0.06 +1508 0.04438081038954167 0.836419664956622 0.08000000000000002 +1509 0.8553675062584657 -0.05386684210448676 0.02 +1510 0.8553675062584657 -0.05386684210448676 0.04000000000000001 +1511 0.8553675062584657 -0.05386684210448676 0.06 +1512 0.8553675062584657 -0.05386684210448676 0.08000000000000002 +1513 0.3749386715962159 -0.5487754583110536 0.02 +1514 0.3749386715962159 -0.5487754583110536 0.04000000000000001 +1515 0.3749386715962159 -0.5487754583110536 0.06 +1516 0.3749386715962159 -0.5487754583110536 0.08000000000000002 +1517 0.3974359820942239 0.5215042692528412 0.02 +1518 0.3974359820942239 0.5215042692528412 0.04000000000000001 +1519 0.3974359820942239 0.5215042692528412 0.06 +1520 0.3974359820942239 0.5215042692528412 0.08000000000000002 +1521 -0.5041576228621361 0.4333723785373178 0.02 +1522 -0.5041576228621361 0.4333723785373178 0.04000000000000001 +1523 -0.5041576228621361 0.4333723785373178 0.06 +1524 -0.5041576228621361 0.4333723785373178 0.08000000000000002 +1525 0.2364611986036771 0.2798634810348056 0.02 +1526 0.2364611986036771 0.2798634810348056 0.04000000000000001 +1527 0.2364611986036771 0.2798634810348056 0.06 +1528 0.2364611986036771 0.2798634810348056 0.08000000000000002 +1529 0.2849503733965617 0.03118901498650395 0.02 +1530 0.2849503733965617 0.03118901498650395 0.04000000000000001 +1531 0.2849503733965617 0.03118901498650395 0.06 +1532 0.2849503733965617 0.03118901498650395 0.08000000000000002 +1533 -0.011675368022789 -0.1583646189613644 0.02 +1534 -0.011675368022789 -0.1583646189613644 0.04000000000000001 +1535 -0.011675368022789 -0.1583646189613644 0.06 +1536 -0.011675368022789 -0.1583646189613644 0.08000000000000002 +1537 0.1206626040530767 0.2446482506595883 0.02 +1538 0.1206626040530767 0.2446482506595883 0.04000000000000001 +1539 0.1206626040530767 0.2446482506595883 0.06 +1540 0.1206626040530767 0.2446482506595883 0.08000000000000002 +1541 0.4970837880675948 0.2480293971507536 0.02 +1542 0.4970837880675948 0.2480293971507536 0.04000000000000001 +1543 0.4970837880675948 0.2480293971507536 0.06 +1544 0.4970837880675948 0.2480293971507536 0.08000000000000002 +1545 -0.6105405940863746 -0.5349387521475042 0.02 +1546 -0.6105405940863746 -0.5349387521475042 0.04000000000000001 +1547 -0.6105405940863746 -0.5349387521475042 0.06 +1548 -0.6105405940863746 -0.5349387521475042 0.08000000000000002 +1549 -0.553991735346019 0.6655815144261268 0.02 +1550 -0.553991735346019 0.6655815144261268 0.04000000000000001 +1551 -0.553991735346019 0.6655815144261268 0.06 +1552 -0.553991735346019 0.6655815144261268 0.08000000000000002 +1553 0.6597459497119282 0.5464669372594945 0.02 +1554 0.6597459497119282 0.5464669372594945 0.04000000000000001 +1555 0.6597459497119282 0.5464669372594945 0.06 +1556 0.6597459497119282 0.5464669372594945 0.08000000000000002 +1557 0.5400899340776318 -0.6566914551128153 0.02 +1558 0.5400899340776318 -0.6566914551128153 0.04000000000000001 +1559 0.5400899340776318 -0.6566914551128153 0.06 +1560 0.5400899340776318 -0.6566914551128153 0.08000000000000002 +1561 -0.7087023166319029 0.03326067134231309 0.02 +1562 -0.7087023166319029 0.03326067134231309 0.04000000000000001 +1563 -0.7087023166319029 0.03326067134231309 0.06 +1564 -0.7087023166319029 0.03326067134231309 0.08000000000000002 +1565 -0.02493190515371452 -0.6959354983668804 0.02 +1566 -0.02493190515371452 -0.6959354983668804 0.04000000000000001 +1567 -0.02493190515371452 -0.6959354983668804 0.06 +1568 -0.02493190515371452 -0.6959354983668804 0.08000000000000002 +1569 0.694063866360876 -0.02538340807346447 0.02 +1570 0.694063866360876 -0.02538340807346447 0.04000000000000001 +1571 0.694063866360876 -0.02538340807346447 0.06 +1572 0.694063866360876 -0.02538340807346447 0.08000000000000002 +1573 0.03982010370461493 -0.3177642321309389 0.02 +1574 0.03982010370461493 -0.3177642321309389 0.04000000000000001 +1575 0.03982010370461493 -0.3177642321309389 0.06 +1576 0.03982010370461493 -0.3177642321309389 0.08000000000000002 +1577 -0.2792299368920985 0.06186444744713838 0.02 +1578 -0.2792299368920985 0.06186444744713838 0.04000000000000001 +1579 -0.2792299368920985 0.06186444744713838 0.06 +1580 -0.2792299368920985 0.06186444744713838 0.08000000000000002 +1581 -0.3808110359368689 -0.2121926627689711 0.02 +1582 -0.3808110359368689 -0.2121926627689711 0.04000000000000001 +1583 -0.3808110359368689 -0.2121926627689711 0.06 +1584 -0.3808110359368689 -0.2121926627689711 0.08000000000000002 +1585 -0.2276452154991185 -0.3341328615566676 0.02 +1586 -0.2276452154991185 -0.3341328615566676 0.04000000000000001 +1587 -0.2276452154991185 -0.3341328615566676 0.06 +1588 -0.2276452154991185 -0.3341328615566676 0.08000000000000002 +1589 0.3397134731995448 0.1996534621165916 0.02 +1590 0.3397134731995448 0.1996534621165916 0.04000000000000001 +1591 0.3397134731995448 0.1996534621165916 0.06 +1592 0.3397134731995448 0.1996534621165916 0.08000000000000002 +1593 -0.1019499545891515 0.02438360087543125 0.02 +1594 -0.1019499545891515 0.02438360087543125 0.04000000000000001 +1595 -0.1019499545891515 0.02438360087543125 0.06 +1596 -0.1019499545891515 0.02438360087543125 0.08000000000000002 +1597 0.8365403305290204 0.3599025089438682 0.02 +1598 0.8365403305290204 0.3599025089438682 0.04000000000000001 +1599 0.8365403305290204 0.3599025089438682 0.06 +1600 0.8365403305290204 0.3599025089438682 0.08000000000000002 +1601 0.3639269354255869 -0.8351171068682989 0.02 +1602 0.3639269354255869 -0.8351171068682989 0.04000000000000001 +1603 0.3639269354255869 -0.8351171068682989 0.06 +1604 0.3639269354255869 -0.8351171068682989 0.08000000000000002 +1605 -0.3319516295196943 0.8327481288423965 0.02 +1606 -0.3319516295196943 0.8327481288423965 0.04000000000000001 +1607 -0.3319516295196943 0.8327481288423965 0.06 +1608 -0.3319516295196943 0.8327481288423965 0.08000000000000002 +1609 -0.8333013038828953 -0.3287324073197915 0.02 +1610 -0.8333013038828953 -0.3287324073197915 0.04000000000000001 +1611 -0.8333013038828953 -0.3287324073197915 0.06 +1612 -0.8333013038828953 -0.3287324073197915 0.08000000000000002 +1613 0.7938047051295087 -0.4102751112783604 0.02 +1614 0.7938047051295087 -0.4102751112783604 0.04000000000000001 +1615 0.7938047051295087 -0.4102751112783604 0.06 +1616 0.7938047051295087 -0.4102751112783604 0.08000000000000002 +1617 0.444808774696317 0.7961722113720798 0.02 +1618 0.444808774696317 0.7961722113720798 0.04000000000000001 +1619 0.444808774696317 0.7961722113720798 0.06 +1620 0.444808774696317 0.7961722113720798 0.08000000000000002 +1621 -0.4127852419823073 -0.7949611030251975 0.02 +1622 -0.4127852419823073 -0.7949611030251975 0.04000000000000001 +1623 -0.4127852419823073 -0.7949611030251975 0.06 +1624 -0.4127852419823073 -0.7949611030251975 0.08000000000000002 +1625 -0.7915141740889436 0.4443857241644811 0.02 +1626 -0.7915141740889436 0.4443857241644811 0.04000000000000001 +1627 -0.7915141740889436 0.4443857241644811 0.06 +1628 -0.7915141740889436 0.4443857241644811 0.08000000000000002 +1629 -0.3406250179730959 0.2705330993773377 0.02 +1630 -0.3406250179730959 0.2705330993773377 0.04000000000000001 +1631 -0.3406250179730959 0.2705330993773377 0.06 +1632 -0.3406250179730959 0.2705330993773377 0.08000000000000002 +1633 0.2397166078874612 -0.3186594518216563 0.02 +1634 0.2397166078874612 -0.3186594518216563 0.04000000000000001 +1635 0.2397166078874612 -0.3186594518216563 0.06 +1636 0.2397166078874612 -0.3186594518216563 0.08000000000000002 +1637 -0.854582551441107 0.2060173065942562 0.02 +1638 -0.854582551441107 0.2060173065942562 0.04000000000000001 +1639 -0.854582551441107 0.2060173065942562 0.06 +1640 -0.854582551441107 0.2060173065942562 0.08000000000000002 +1641 -0.2141080697608677 -0.8586786596798476 0.02 +1642 -0.2141080697608677 -0.8586786596798476 0.04000000000000001 +1643 -0.2141080697608677 -0.8586786596798476 0.06 +1644 -0.2141080697608677 -0.8586786596798476 0.08000000000000002 +1645 0.207761903824096 0.8574333639541414 0.02 +1646 0.207761903824096 0.8574333639541414 0.04000000000000001 +1647 0.207761903824096 0.8574333639541414 0.06 +1648 0.207761903824096 0.8574333639541414 0.08000000000000002 +1649 0.8702274683783644 -0.1831600288236168 0.02 +1650 0.8702274683783644 -0.1831600288236168 0.04000000000000001 +1651 0.8702274683783644 -0.1831600288236168 0.06 +1652 0.8702274683783644 -0.1831600288236168 0.08000000000000002 +1653 -0.9058378278550592 -0.1171729149352221 0.02 +1654 -0.9058378278550592 -0.1171729149352221 0.04000000000000001 +1655 -0.9058378278550592 -0.1171729149352221 0.06 +1656 -0.9058378278550592 -0.1171729149352221 0.08000000000000002 +1657 -0.1174153984494048 0.9059350404172869 0.02 +1658 -0.1174153984494048 0.9059350404172869 0.04000000000000001 +1659 -0.1174153984494048 0.9059350404172869 0.06 +1660 -0.1174153984494048 0.9059350404172869 0.08000000000000002 +1661 0.09393394886261931 -0.8697094920958993 0.02 +1662 0.09393394886261931 -0.8697094920958993 0.04000000000000001 +1663 0.09393394886261931 -0.8697094920958993 0.06 +1664 0.09393394886261931 -0.8697094920958993 0.08000000000000002 +1665 0.8687844944930114 0.1250958483641025 0.02 +1666 0.8687844944930114 0.1250958483641025 0.04000000000000001 +1667 0.8687844944930114 0.1250958483641025 0.06 +1668 0.8687844944930114 0.1250958483641025 0.08000000000000002 +1669 0.613476042990282 0.6597072786234576 0.02 +1670 0.613476042990282 0.6597072786234576 0.04000000000000001 +1671 0.613476042990282 0.6597072786234576 0.06 +1672 0.613476042990282 0.6597072786234576 0.08000000000000002 +1673 0.6563391835241257 -0.6085138609223993 0.02 +1674 0.6563391835241257 -0.6085138609223993 0.04000000000000001 +1675 0.6563391835241257 -0.6085138609223993 0.06 +1676 0.6563391835241257 -0.6085138609223993 0.08000000000000002 +1677 -0.6589078743885748 0.615595447751677 0.02 +1678 -0.6589078743885748 0.615595447751677 0.04000000000000001 +1679 -0.6589078743885748 0.615595447751677 0.06 +1680 -0.6589078743885748 0.615595447751677 0.08000000000000002 +1681 -0.6077926747047573 -0.6566320489753026 0.02 +1682 -0.6077926747047573 -0.6566320489753026 0.04000000000000001 +1683 -0.6077926747047573 -0.6566320489753026 0.06 +1684 -0.6077926747047573 -0.6566320489753026 0.08000000000000002 +1685 -0.06455234163770032 0.1905609960067338 0.02 +1686 -0.06455234163770032 0.1905609960067338 0.04000000000000001 +1687 -0.06455234163770032 0.1905609960067338 0.06 +1688 -0.06455234163770032 0.1905609960067338 0.08000000000000002 +1689 0.6723200260837866 0.1042959368376399 0.02 +1690 0.6723200260837866 0.1042959368376399 0.04000000000000001 +1691 0.6723200260837866 0.1042959368376399 0.06 +1692 0.6723200260837866 0.1042959368376399 0.08000000000000002 +1693 0.06924415183346858 -0.08393017700741348 0.02 +1694 0.06924415183346858 -0.08393017700741348 0.04000000000000001 +1695 0.06924415183346858 -0.08393017700741348 0.06 +1696 0.06924415183346858 -0.08393017700741348 0.08000000000000002 +1697 0.1424852488362597 -0.6745915873019526 0.02 +1698 0.1424852488362597 -0.6745915873019526 0.04000000000000001 +1699 0.1424852488362597 -0.6745915873019526 0.06 +1700 0.1424852488362597 -0.6745915873019526 0.08000000000000002 +1701 -0.6560236018933121 0.1957683112241136 0.02 +1702 -0.6560236018933121 0.1957683112241136 0.04000000000000001 +1703 -0.6560236018933121 0.1957683112241136 0.06 +1704 -0.6560236018933121 0.1957683112241136 0.08000000000000002 +1705 0.2261335291230376 0.6724451430202616 0.02 +1706 0.2261335291230376 0.6724451430202616 0.04000000000000001 +1707 0.2261335291230376 0.6724451430202616 0.06 +1708 0.2261335291230376 0.6724451430202616 0.08000000000000002 +1709 0.05344537732330912 -0.4972496141312576 0.02 +1710 0.05344537732330912 -0.4972496141312576 0.04000000000000001 +1711 0.05344537732330912 -0.4972496141312576 0.06 +1712 0.05344537732330912 -0.4972496141312576 0.08000000000000002 +1713 -0.4820616617036059 0.09639661489927862 0.02 +1714 -0.4820616617036059 0.09639661489927862 0.04000000000000001 +1715 -0.4820616617036059 0.09639661489927862 0.06 +1716 -0.4820616617036059 0.09639661489927862 0.08000000000000002 +1717 0.09915707861606107 0.4904305652463083 0.02 +1718 0.09915707861606107 0.4904305652463083 0.04000000000000001 +1719 0.09915707861606107 0.4904305652463083 0.06 +1720 0.09915707861606107 0.4904305652463083 0.08000000000000002 +1721 -0.5294269027832078 -0.229361943472022 0.02 +1722 -0.5294269027832078 -0.229361943472022 0.04000000000000001 +1723 -0.5294269027832078 -0.229361943472022 0.06 +1724 -0.5294269027832078 -0.229361943472022 0.08000000000000002 +1725 -0.2434414406797225 0.5484307460752702 0.02 +1726 -0.2434414406797225 0.5484307460752702 0.04000000000000001 +1727 -0.2434414406797225 0.5484307460752702 0.06 +1728 -0.2434414406797225 0.5484307460752702 0.08000000000000002 +1729 0.4323794103526783 -0.3333644853485817 0.02 +1730 0.4323794103526783 -0.3333644853485817 0.04000000000000001 +1731 0.4323794103526783 -0.3333644853485817 0.06 +1732 0.4323794103526783 -0.3333644853485817 0.08000000000000002 +1733 -0.2779188756682962 -0.5381002730158441 0.02 +1734 -0.2779188756682962 -0.5381002730158441 0.04000000000000001 +1735 -0.2779188756682962 -0.5381002730158441 0.06 +1736 -0.2779188756682962 -0.5381002730158441 0.08000000000000002 +1737 0.4199394697088852 -0.4677534687941777 0.02 +1738 0.4199394697088852 -0.4677534687941777 0.04000000000000001 +1739 0.4199394697088852 -0.4677534687941777 0.06 +1740 0.4199394697088852 -0.4677534687941777 0.08000000000000002 +1741 -0.4024304770888812 0.4441972293962587 0.02 +1742 -0.4024304770888812 0.4441972293962587 0.04000000000000001 +1743 -0.4024304770888812 0.4441972293962587 0.06 +1744 -0.4024304770888812 0.4441972293962587 0.08000000000000002 +1745 0.4615115682168016 0.4236986619354352 0.02 +1746 0.4615115682168016 0.4236986619354352 0.04000000000000001 +1747 0.4615115682168016 0.4236986619354352 0.06 +1748 0.4615115682168016 0.4236986619354352 0.08000000000000002 +1749 -0.2164334946980676 0.3968245142626498 0.02 +1750 -0.2164334946980676 0.3968245142626498 0.04000000000000001 +1751 -0.2164334946980676 0.3968245142626498 0.06 +1752 -0.2164334946980676 0.3968245142626498 0.08000000000000002 +1753 0.3154575257583962 -0.1554414062667671 0.02 +1754 0.3154575257583962 -0.1554414062667671 0.04000000000000001 +1755 0.3154575257583962 -0.1554414062667671 0.06 +1756 0.3154575257583962 -0.1554414062667671 0.08000000000000002 +1757 0.168646802800918 -0.1135306217596707 0.02 +1758 0.168646802800918 -0.1135306217596707 0.04000000000000001 +1759 0.168646802800918 -0.1135306217596707 0.06 +1760 0.168646802800918 -0.1135306217596707 0.08000000000000002 +1761 -0.1307746275873545 0.3441637217611287 0.02 +1762 -0.1307746275873545 0.3441637217611287 0.04000000000000001 +1763 -0.1307746275873545 0.3441637217611287 0.06 +1764 -0.1307746275873545 0.3441637217611287 0.08000000000000002 +1765 -0.1404269256120112 0.7107768933630642 0.02 +1766 -0.1404269256120112 0.7107768933630642 0.04000000000000001 +1767 -0.1404269256120112 0.7107768933630642 0.06 +1768 -0.1404269256120112 0.7107768933630642 0.08000000000000002 +1769 -0.7112296458136502 -0.1365941812077176 0.02 +1770 -0.7112296458136502 -0.1365941812077176 0.04000000000000001 +1771 -0.7112296458136502 -0.1365941812077176 0.06 +1772 -0.7112296458136502 -0.1365941812077176 0.08000000000000002 +1773 -0.2399545607912618 -0.6977579734372208 0.02 +1774 -0.2399545607912618 -0.6977579734372208 0.04000000000000001 +1775 -0.2399545607912618 -0.6977579734372208 0.06 +1776 -0.2399545607912618 -0.6977579734372208 0.08000000000000002 +1777 0.6747833944187278 -0.2118895710801944 0.02 +1778 0.6747833944187278 -0.2118895710801944 0.04000000000000001 +1779 0.6747833944187278 -0.2118895710801944 0.06 +1780 0.6747833944187278 -0.2118895710801944 0.08000000000000002 +1781 0.5176698580334621 -0.103819867884 0.02 +1782 0.5176698580334621 -0.103819867884 0.04000000000000001 +1783 0.5176698580334621 -0.103819867884 0.06 +1784 0.5176698580334621 -0.103819867884 0.08000000000000002 +1785 0.5085251556188322 -0.2907820503817347 0.02 +1786 0.5085251556188322 -0.2907820503817347 0.04000000000000001 +1787 0.5085251556188322 -0.2907820503817347 0.06 +1788 0.5085251556188322 -0.2907820503817347 0.08000000000000002 +1789 -0.05716641689026527 0.5297210956392591 0.02 +1790 -0.05716641689026527 0.5297210956392591 0.04000000000000001 +1791 -0.05716641689026527 0.5297210956392591 0.06 +1792 -0.05716641689026527 0.5297210956392591 0.08000000000000002 +1793 -0.5317823103397754 -0.06535435449405379 0.02 +1794 -0.5317823103397754 -0.06535435449405379 0.04000000000000001 +1795 -0.5317823103397754 -0.06535435449405379 0.06 +1796 -0.5317823103397754 -0.06535435449405379 0.08000000000000002 +1797 -0.1143466599777276 -0.5079348162494908 0.02 +1798 -0.1143466599777276 -0.5079348162494908 0.04000000000000001 +1799 -0.1143466599777276 -0.5079348162494908 0.06 +1800 -0.1143466599777276 -0.5079348162494908 0.08000000000000002 +1801 -0.1552003731363872 -0.1882414588162507 0.02 +1802 -0.1552003731363872 -0.1882414588162507 0.04000000000000001 +1803 -0.1552003731363872 -0.1882414588162507 0.06 +1804 -0.1552003731363872 -0.1882414588162507 0.08000000000000002 +1805 0.4807495171113731 0.06444083946329973 0.02 +1806 0.4807495171113731 0.06444083946329973 0.04000000000000001 +1807 0.4807495171113731 0.06444083946329973 0.06 +1808 0.4807495171113731 0.06444083946329973 0.08000000000000002 +1809 -0.3935460045730921 -0.07322906953870696 0.02 +1810 -0.3935460045730921 -0.07322906953870696 0.04000000000000001 +1811 -0.3935460045730921 -0.07322906953870696 0.06 +1812 -0.3935460045730921 -0.07322906953870696 0.08000000000000002 +1813 -0.1364424208872183 -0.4017880099381987 0.02 +1814 -0.1364424208872183 -0.4017880099381987 0.04000000000000001 +1815 -0.1364424208872183 -0.4017880099381987 0.06 +1816 -0.1364424208872183 -0.4017880099381987 0.08000000000000002 +1817 -0.6099576367888768 -0.4080701547928401 0.02 +1818 -0.6099576367888768 -0.4080701547928401 0.04000000000000001 +1819 -0.6099576367888768 -0.4080701547928401 0.06 +1820 -0.6099576367888768 -0.4080701547928401 0.08000000000000002 +1821 -0.4184976473519184 0.6069185768899372 0.02 +1822 -0.4184976473519184 0.6069185768899372 0.04000000000000001 +1823 -0.4184976473519184 0.6069185768899372 0.06 +1824 -0.4184976473519184 0.6069185768899372 0.08000000000000002 +1825 0.6015858447097795 0.4168994824662515 0.02 +1826 0.6015858447097795 0.4168994824662515 0.04000000000000001 +1827 0.6015858447097795 0.4168994824662515 0.06 +1828 0.6015858447097795 0.4168994824662515 0.08000000000000002 +1829 -0.493656346274863 -0.5791291481875378 0.02 +1830 -0.493656346274863 -0.5791291481875378 0.04000000000000001 +1831 -0.493656346274863 -0.5791291481875378 0.06 +1832 -0.493656346274863 -0.5791291481875378 0.08000000000000002 +1833 0.5739436060474877 -0.4818993768051738 0.02 +1834 0.5739436060474877 -0.4818993768051738 0.04000000000000001 +1835 0.5739436060474877 -0.4818993768051738 0.06 +1836 0.5739436060474877 -0.4818993768051738 0.08000000000000002 +1837 0.6283101313585021 0.01284599179099455 0.02 +1838 0.6283101313585021 0.01284599179099455 0.04000000000000001 +1839 0.6283101313585021 0.01284599179099455 0.06 +1840 0.6283101313585021 0.01284599179099455 0.08000000000000002 +1841 -0.43419467902241 -0.2889496462323161 0.02 +1842 -0.43419467902241 -0.2889496462323161 0.04000000000000001 +1843 -0.43419467902241 -0.2889496462323161 0.06 +1844 -0.43419467902241 -0.2889496462323161 0.08000000000000002 +1845 -0.2916385303663842 -0.4300562263662718 0.02 +1846 -0.2916385303663842 -0.4300562263662718 0.04000000000000001 +1847 -0.2916385303663842 -0.4300562263662718 0.06 +1848 -0.2916385303663842 -0.4300562263662718 0.08000000000000002 +1849 0.06487005994819951 -0.6783808943290489 0.02 +1850 0.06487005994819951 -0.6783808943290489 0.04000000000000001 +1851 0.06487005994819951 -0.6783808943290489 0.06 +1852 0.06487005994819951 -0.6783808943290489 0.08000000000000002 +1853 -0.6642386657586006 0.09051471157143443 0.02 +1854 -0.6642386657586006 0.09051471157143443 0.04000000000000001 +1855 -0.6642386657586006 0.09051471157143443 0.06 +1856 -0.6642386657586006 0.09051471157143443 0.08000000000000002 +1857 0.119352651218099 0.6521462566346119 0.02 +1858 0.119352651218099 0.6521462566346119 0.04000000000000001 +1859 0.119352651218099 0.6521462566346119 0.06 +1860 0.119352651218099 0.6521462566346119 0.08000000000000002 +1861 0.09935639842703067 0.08740076794828069 0.02 +1862 0.09935639842703067 0.08740076794828069 0.04000000000000001 +1863 0.09935639842703067 0.08740076794828069 0.06 +1864 0.09935639842703067 0.08740076794828069 0.08000000000000002 +1865 0.05963876045316886 0.3348085960046109 0.02 +1866 0.05963876045316886 0.3348085960046109 0.04000000000000001 +1867 0.05963876045316886 0.3348085960046109 0.06 +1868 0.05963876045316886 0.3348085960046109 0.08000000000000002 +1869 -0.189697863908265 0.04565283320092126 0.02 +1870 -0.189697863908265 0.04565283320092126 0.04000000000000001 +1871 -0.189697863908265 0.04565283320092126 0.06 +1872 -0.189697863908265 0.04565283320092126 0.08000000000000002 +1873 -0.5158315599457346 -0.4720096234205078 0.02 +1874 -0.5158315599457346 -0.4720096234205078 0.04000000000000001 +1875 -0.5158315599457346 -0.4720096234205078 0.06 +1876 -0.5158315599457346 -0.4720096234205078 0.08000000000000002 +1877 0.2611642942788689 0.3813926235659463 0.02 +1878 0.2611642942788689 0.3813926235659463 0.04000000000000001 +1879 0.2611642942788689 0.3813926235659463 0.06 +1880 0.2611642942788689 0.3813926235659463 0.08000000000000002 +1881 -0.2000795210665827 -0.1353554083626738 0.02 +1882 -0.2000795210665827 -0.1353554083626738 0.04000000000000001 +1883 -0.2000795210665827 -0.1353554083626738 0.06 +1884 -0.2000795210665827 -0.1353554083626738 0.08000000000000002 +1885 0.1457369485756468 -0.2841370987613376 0.02 +1886 0.1457369485756468 -0.2841370987613376 0.04000000000000001 +1887 0.1457369485756468 -0.2841370987613376 0.06 +1888 0.1457369485756468 -0.2841370987613376 0.08000000000000002 +1889 -0.2777089402540138 0.1797753259785467 0.02 +1890 -0.2777089402540138 0.1797753259785467 0.04000000000000001 +1891 -0.2777089402540138 0.1797753259785467 0.06 +1892 -0.2777089402540138 0.1797753259785467 0.08000000000000002 +1893 -0.9085460880639742 0.1237878018187586 0.02 +1894 -0.9085460880639742 0.1237878018187586 0.04000000000000001 +1895 -0.9085460880639742 0.1237878018187586 0.06 +1896 -0.9085460880639742 0.1237878018187586 0.08000000000000002 +1897 -0.1019900043913622 -0.893259472605428 0.02 +1898 -0.1019900043913622 -0.893259472605428 0.04000000000000001 +1899 -0.1019900043913622 -0.893259472605428 0.06 +1900 -0.1019900043913622 -0.893259472605428 0.08000000000000002 +1901 0.1238200652537517 0.9085964392549061 0.02 +1902 0.1238200652537517 0.9085964392549061 0.04000000000000001 +1903 0.1238200652537517 0.9085964392549061 0.06 +1904 0.1238200652537517 0.9085964392549061 0.08000000000000002 +1905 0.9180062739236612 -0.09598573992101976 0.02 +1906 0.9180062739236612 -0.09598573992101976 0.04000000000000001 +1907 0.9180062739236612 -0.09598573992101976 0.06 +1908 0.9180062739236612 -0.09598573992101976 0.08000000000000002 +1909 -0.912655932260213 -0.02398319083466645 0.02 +1910 -0.912655932260213 -0.02398319083466645 0.04000000000000001 +1911 -0.912655932260213 -0.02398319083466645 0.06 +1912 -0.912655932260213 -0.02398319083466645 0.08000000000000002 +1913 0.008367413925278861 -0.9198853063971549 0.02 +1914 0.008367413925278861 -0.9198853063971549 0.04000000000000001 +1915 0.008367413925278861 -0.9198853063971549 0.06 +1916 0.008367413925278861 -0.9198853063971549 0.08000000000000002 +1917 -0.02431317099512088 0.9123210735134266 0.02 +1918 -0.02431317099512088 0.9123210735134266 0.04000000000000001 +1919 -0.02431317099512088 0.9123210735134266 0.06 +1920 -0.02431317099512088 0.9123210735134266 0.08000000000000002 +1921 0.9041300124986519 0.01379330183484605 0.02 +1922 0.9041300124986519 0.01379330183484605 0.04000000000000001 +1923 0.9041300124986519 0.01379330183484605 0.06 +1924 0.9041300124986519 0.01379330183484605 0.08000000000000002 +1925 0.1387887380973432 -0.4978667689867478 0.02 +1926 0.1387887380973432 -0.4978667689867478 0.04000000000000001 +1927 0.1387887380973432 -0.4978667689867478 0.06 +1928 0.1387887380973432 -0.4978667689867478 0.08000000000000002 +1929 -0.4733497580335891 0.1784879591508934 0.02 +1930 -0.4733497580335891 0.1784879591508934 0.04000000000000001 +1931 -0.4733497580335891 0.1784879591508934 0.06 +1932 -0.4733497580335891 0.1784879591508934 0.08000000000000002 +1933 0.1809814155632116 0.4861297825179496 0.02 +1934 0.1809814155632116 0.4861297825179496 0.04000000000000001 +1935 0.1809814155632116 0.4861297825179496 0.06 +1936 0.1809814155632116 0.4861297825179496 0.08000000000000002 +1937 -0.1805252126171017 -0.2504896943144203 0.02 +1938 -0.1805252126171017 -0.2504896943144203 0.04000000000000001 +1939 -0.1805252126171017 -0.2504896943144203 0.06 +1940 -0.1805252126171017 -0.2504896943144203 0.08000000000000002 +1941 -0.702180347906077 -0.3422747202427379 0.02 +1942 -0.702180347906077 -0.3422747202427379 0.04000000000000001 +1943 -0.702180347906077 -0.3422747202427379 0.06 +1944 -0.702180347906077 -0.3422747202427379 0.08000000000000002 +1945 -0.3371324926778692 0.7180705547772359 0.02 +1946 -0.3371324926778692 0.7180705547772359 0.04000000000000001 +1947 -0.3371324926778692 0.7180705547772359 0.06 +1948 -0.3371324926778692 0.7180705547772359 0.08000000000000002 +1949 0.3355235802450693 -0.7346391500484335 0.02 +1950 0.3355235802450693 -0.7346391500484335 0.04000000000000001 +1951 0.3355235802450693 -0.7346391500484335 0.06 +1952 0.3355235802450693 -0.7346391500484335 0.08000000000000002 +1953 0.7547539480769733 0.3256658213326131 0.02 +1954 0.7547539480769733 0.3256658213326131 0.04000000000000001 +1955 0.7547539480769733 0.3256658213326131 0.06 +1956 0.7547539480769733 0.3256658213326131 0.08000000000000002 +1957 -0.4040050818669008 -0.6858069966967554 0.02 +1958 -0.4040050818669008 -0.6858069966967554 0.04000000000000001 +1959 -0.4040050818669008 -0.6858069966967554 0.06 +1960 -0.4040050818669008 -0.6858069966967554 0.08000000000000002 +1961 -0.6869510428621548 0.4053059519181766 0.02 +1962 -0.6869510428621548 0.4053059519181766 0.04000000000000001 +1963 -0.6869510428621548 0.4053059519181766 0.06 +1964 -0.6869510428621548 0.4053059519181766 0.08000000000000002 +1965 0.6816618408241883 -0.4004997666741786 0.02 +1966 0.6816618408241883 -0.4004997666741786 0.04000000000000001 +1967 0.6816618408241883 -0.4004997666741786 0.06 +1968 0.6816618408241883 -0.4004997666741786 0.08000000000000002 +1969 0.4043189186425183 0.7061993611488281 0.02 +1970 0.4043189186425183 0.7061993611488281 0.04000000000000001 +1971 0.4043189186425183 0.7061993611488281 0.06 +1972 0.4043189186425183 0.7061993611488281 0.08000000000000002 +1973 0.4357872263118142 -0.6278912731197483 0.02 +1974 0.4357872263118142 -0.6278912731197483 0.04000000000000001 +1975 0.4357872263118142 -0.6278912731197483 0.06 +1976 0.4357872263118142 -0.6278912731197483 0.08000000000000002 +1977 -0.577044321219035 0.5053568079175584 0.02 +1978 -0.577044321219035 0.5053568079175584 0.04000000000000001 +1979 -0.577044321219035 0.5053568079175584 0.06 +1980 -0.577044321219035 0.5053568079175584 0.08000000000000002 +1981 0.4929783347874608 0.5898093814039689 0.02 +1982 0.4929783347874608 0.5898093814039689 0.04000000000000001 +1983 0.4929783347874608 0.5898093814039689 0.06 +1984 0.4929783347874608 0.5898093814039689 0.08000000000000002 +1985 -0.5099423846696907 0.7915982151319552 0.02 +1986 -0.5099423846696907 0.7915982151319552 0.04000000000000001 +1987 -0.5099423846696907 0.7915982151319552 0.06 +1988 -0.5099423846696907 0.7915982151319552 0.08000000000000002 +1989 0.7917668927146317 0.5073383363124405 0.02 +1990 0.7917668927146317 0.5073383363124405 0.04000000000000001 +1991 0.7917668927146317 0.5073383363124405 0.06 +1992 0.7917668927146317 0.5073383363124405 0.08000000000000002 +1993 0.5099364616038597 -0.7943442416782676 0.02 +1994 0.5099364616038597 -0.7943442416782676 0.04000000000000001 +1995 0.5099364616038597 -0.7943442416782676 0.06 +1996 0.5099364616038597 -0.7943442416782676 0.08000000000000002 +1997 -0.7865708918099946 -0.4788062647442327 0.02 +1998 -0.7865708918099946 -0.4788062647442327 0.04000000000000001 +1999 -0.7865708918099946 -0.4788062647442327 0.06 +2000 -0.7865708918099946 -0.4788062647442327 0.08000000000000002 +2001 0.7310466732033456 -0.5861211886606393 0.02 +2002 0.7310466732033456 -0.5861211886606393 0.04000000000000001 +2003 0.7310466732033456 -0.5861211886606393 0.06 +2004 0.7310466732033456 -0.5861211886606393 0.08000000000000002 +2005 -0.5864063496396488 -0.7314837302855907 0.02 +2006 -0.5864063496396488 -0.7314837302855907 0.04000000000000001 +2007 -0.5864063496396488 -0.7314837302855907 0.06 +2008 -0.5864063496396488 -0.7314837302855907 0.08000000000000002 +2009 -0.732024773425717 0.5904014501328559 0.02 +2010 -0.732024773425717 0.5904014501328559 0.04000000000000001 +2011 -0.732024773425717 0.5904014501328559 0.06 +2012 -0.732024773425717 0.5904014501328559 0.08000000000000002 +2013 0.5896793499421527 0.7330948876097587 0.02 +2014 0.5896793499421527 0.7330948876097587 0.04000000000000001 +2015 0.5896793499421527 0.7330948876097587 0.06 +2016 0.5896793499421527 0.7330948876097587 0.08000000000000002 +2017 -0.2793304508241014 0.4475639742663415 0.02 +2018 -0.2793304508241014 0.4475639742663415 0.04000000000000001 +2019 -0.2793304508241014 0.4475639742663415 0.06 +2020 -0.2793304508241014 0.4475639742663415 0.08000000000000002 +2021 0.355203053584752 -0.2590326189704956 0.02 +2022 0.355203053584752 -0.2590326189704956 0.04000000000000001 +2023 0.355203053584752 -0.2590326189704956 0.06 +2024 0.355203053584752 -0.2590326189704956 0.08000000000000002 +2025 -0.01764621587658752 -0.07623595338571734 0.02 +2026 -0.01764621587658752 -0.07623595338571734 0.04000000000000001 +2027 -0.01764621587658752 -0.07623595338571734 0.06 +2028 -0.01764621587658752 -0.07623595338571734 0.08000000000000002 +2029 0.5559773824930981 0.2815234913734928 0.02 +2030 0.5559773824930981 0.2815234913734928 0.04000000000000001 +2031 0.5559773824930981 0.2815234913734928 0.06 +2032 0.5559773824930981 0.2815234913734928 0.08000000000000002 +2033 0.2715128434122404 0.1309277237798032 0.02 +2034 0.2715128434122404 0.1309277237798032 0.04000000000000001 +2035 0.2715128434122404 0.1309277237798032 0.06 +2036 0.2715128434122404 0.1309277237798032 0.08000000000000002 +2037 -0.3255162704041832 -0.137329482215004 0.02 +2038 -0.3255162704041832 -0.137329482215004 0.04000000000000001 +2039 -0.3255162704041832 -0.137329482215004 0.06 +2040 -0.3255162704041832 -0.137329482215004 0.08000000000000002 +2041 0.2024784117148658 -0.5888155563916311 0.02 +2042 0.2024784117148658 -0.5888155563916311 0.04000000000000001 +2043 0.2024784117148658 -0.5888155563916311 0.06 +2044 0.2024784117148658 -0.5888155563916311 0.08000000000000002 +2045 -0.5536400196553282 0.2520376402006607 0.02 +2046 -0.5536400196553282 0.2520376402006607 0.04000000000000001 +2047 -0.5536400196553282 0.2520376402006607 0.06 +2048 -0.5536400196553282 0.2520376402006607 0.08000000000000002 +2049 0.2490883574581664 0.5851115407104762 0.02 +2050 0.2490883574581664 0.5851115407104762 0.04000000000000001 +2051 0.2490883574581664 0.5851115407104762 0.06 +2052 0.2490883574581664 0.5851115407104762 0.08000000000000002 +2053 0.03906613347282865 0.2559297725173381 0.02 +2054 0.03906613347282865 0.2559297725173381 0.04000000000000001 +2055 0.03906613347282865 0.2559297725173381 0.06 +2056 0.03906613347282865 0.2559297725173381 0.08000000000000002 +2057 0.4081527767190752 0.02302872598445437 0.02 +2058 0.4081527767190752 0.02302872598445437 0.04000000000000001 +2059 0.4081527767190752 0.02302872598445437 0.06 +2060 0.4081527767190752 0.02302872598445437 0.08000000000000002 +2061 -0.3067585558051941 -0.2746393252055986 0.02 +2062 -0.3067585558051941 -0.2746393252055986 0.04000000000000001 +2063 -0.3067585558051941 -0.2746393252055986 0.06 +2064 -0.3067585558051941 -0.2746393252055986 0.08000000000000002 +2065 -0.8994457602932987 -0.2073009716668192 0.02 +2066 -0.8994457602932987 -0.2073009716668192 0.04000000000000001 +2067 -0.8994457602932987 -0.2073009716668192 0.06 +2068 -0.8994457602932987 -0.2073009716668192 0.08000000000000002 +2069 -0.2076698327299657 0.8998125051190659 0.02 +2070 -0.2076698327299657 0.8998125051190659 0.04000000000000001 +2071 -0.2076698327299657 0.8998125051190659 0.06 +2072 -0.2076698327299657 0.8998125051190659 0.08000000000000002 +2073 0.1987056795586867 -0.874783771414067 0.02 +2074 0.1987056795586867 -0.874783771414067 0.04000000000000001 +2075 0.1987056795586867 -0.874783771414067 0.06 +2076 0.1987056795586867 -0.874783771414067 0.08000000000000002 +2077 0.8759565811829598 0.2037109161691198 0.02 +2078 0.8759565811829598 0.2037109161691198 0.04000000000000001 +2079 0.8759565811829598 0.2037109161691198 0.06 +2080 0.8759565811829598 0.2037109161691198 0.08000000000000002 +2081 -0.8508362851736823 0.2881177627471704 0.02 +2082 -0.8508362851736823 0.2881177627471704 0.04000000000000001 +2083 -0.8508362851736823 0.2881177627471704 0.06 +2084 -0.8508362851736823 0.2881177627471704 0.08000000000000002 +2085 -0.2984712019525212 -0.8664311478158504 0.02 +2086 -0.2984712019525212 -0.8664311478158504 0.04000000000000001 +2087 -0.2984712019525212 -0.8664311478158504 0.06 +2088 -0.2984712019525212 -0.8664311478158504 0.08000000000000002 +2089 0.2903693012897265 0.8560987865782422 0.02 +2090 0.2903693012897265 0.8560987865782422 0.04000000000000001 +2091 0.2903693012897265 0.8560987865782422 0.06 +2092 0.2903693012897265 0.8560987865782422 0.08000000000000002 +2093 0.8677922460246092 -0.2907370381259845 0.02 +2094 0.8677922460246092 -0.2907370381259845 0.04000000000000001 +2095 0.8677922460246092 -0.2907370381259845 0.06 +2096 0.8677922460246092 -0.2907370381259845 0.08000000000000002 +2097 0.449230552178808 0.3267512102983695 0.02 +2098 0.449230552178808 0.3267512102983695 0.04000000000000001 +2099 0.449230552178808 0.3267512102983695 0.06 +2100 0.449230552178808 0.3267512102983695 0.08000000000000002 +2101 -0.1399529961133417 0.2186072262024135 0.02 +2102 -0.1399529961133417 0.2186072262024135 0.04000000000000001 +2103 -0.1399529961133417 0.2186072262024135 0.06 +2104 -0.1399529961133417 0.2186072262024135 0.08000000000000002 +2105 -0.683414355426208 -0.01935594619362641 0.02 +2106 -0.683414355426208 -0.01935594619362641 0.04000000000000001 +2107 -0.683414355426208 -0.01935594619362641 0.06 +2108 -0.683414355426208 -0.01935594619362641 0.08000000000000002 +2109 -0.03848963524996514 0.6908527686263575 0.02 +2110 -0.03848963524996514 0.6908527686263575 0.04000000000000001 +2111 -0.03848963524996514 0.6908527686263575 0.06 +2112 -0.03848963524996514 0.6908527686263575 0.08000000000000002 +2113 -0.09355424524288704 -0.6602750515835725 0.02 +2114 -0.09355424524288704 -0.6602750515835725 0.04000000000000001 +2115 -0.09355424524288704 -0.6602750515835725 0.06 +2116 -0.09355424524288704 -0.6602750515835725 0.08000000000000002 +2117 0.6548160552512688 -0.09067689612227429 0.02 +2118 0.6548160552512688 -0.09067689612227429 0.04000000000000001 +2119 0.6548160552512688 -0.09067689612227429 0.06 +2120 0.6548160552512688 -0.09067689612227429 0.08000000000000002 +2121 0.417424725225269 -0.1037522646626998 0.02 +2122 0.417424725225269 -0.1037522646626998 0.04000000000000001 +2123 0.417424725225269 -0.1037522646626998 0.06 +2124 0.417424725225269 -0.1037522646626998 0.08000000000000002 +2125 -0.1482953535684708 0.5688844037848088 0.02 +2126 -0.1482953535684708 0.5688844037848088 0.04000000000000001 +2127 -0.1482953535684708 0.5688844037848088 0.06 +2128 -0.1482953535684708 0.5688844037848088 0.08000000000000002 +2129 -0.5890035306409565 -0.1409938566407858 0.02 +2130 -0.5890035306409565 -0.1409938566407858 0.04000000000000001 +2131 -0.5890035306409565 -0.1409938566407858 0.06 +2132 -0.5890035306409565 -0.1409938566407858 0.08000000000000002 +2133 -0.1950236064179035 -0.5214276096103913 0.02 +2134 -0.1950236064179035 -0.5214276096103913 0.04000000000000001 +2135 -0.1950236064179035 -0.5214276096103913 0.06 +2136 -0.1950236064179035 -0.5214276096103913 0.08000000000000002 +2137 0.3374555497534149 -0.4604931408653773 0.02 +2138 0.3374555497534149 -0.4604931408653773 0.04000000000000001 +2139 0.3374555497534149 -0.4604931408653773 0.06 +2140 0.3374555497534149 -0.4604931408653773 0.08000000000000002 +2141 0.3765379904706818 0.4436653946632465 0.02 +2142 0.3765379904706818 0.4436653946632465 0.04000000000000001 +2143 0.3765379904706818 0.4436653946632465 0.06 +2144 0.3765379904706818 0.4436653946632465 0.08000000000000002 +2145 -0.4609699033777138 0.391672450158235 0.02 +2146 -0.4609699033777138 0.391672450158235 0.04000000000000001 +2147 -0.4609699033777138 0.391672450158235 0.06 +2148 -0.4609699033777138 0.391672450158235 0.08000000000000002 +2149 -0.336152767929308 0.6216329239395814 0.02 +2150 -0.336152767929308 0.6216329239395814 0.04000000000000001 +2151 -0.336152767929308 0.6216329239395814 0.06 +2152 -0.336152767929308 0.6216329239395814 0.08000000000000002 +2153 -0.6243763223467242 -0.3021434256504772 0.02 +2154 -0.6243763223467242 -0.3021434256504772 0.04000000000000001 +2155 -0.6243763223467242 -0.3021434256504772 0.06 +2156 -0.6243763223467242 -0.3021434256504772 0.08000000000000002 +2157 0.5727462232380477 -0.3757599397230176 0.02 +2158 0.5727462232380477 -0.3757599397230176 0.04000000000000001 +2159 0.5727462232380477 -0.3757599397230176 0.06 +2160 0.5727462232380477 -0.3757599397230176 0.08000000000000002 +2161 -0.3767864243565537 -0.5793464411761597 0.02 +2162 -0.3767864243565537 -0.5793464411761597 0.04000000000000001 +2163 -0.3767864243565537 -0.5793464411761597 0.06 +2164 -0.3767864243565537 -0.5793464411761597 0.08000000000000002 +2165 0.2064568728237731 0.08584647913822206 0.02 +2166 0.2064568728237731 0.08584647913822206 0.04000000000000001 +2167 0.2064568728237731 0.08584647913822206 0.06 +2168 0.2064568728237731 0.08584647913822206 0.08000000000000002 +2169 0.244069845375065 -0.0173076257160734 0.02 +2170 0.244069845375065 -0.0173076257160734 0.04000000000000001 +2171 0.244069845375065 -0.0173076257160734 0.06 +2172 0.244069845375065 -0.0173076257160734 0.08000000000000002 +2173 0.1071212263637422 0.169783383677218 0.02 +2174 0.1071212263637422 0.169783383677218 0.04000000000000001 +2175 0.1071212263637422 0.169783383677218 0.06 +2176 0.1071212263637422 0.169783383677218 0.08000000000000002 +2177 0.2267165873343268 -0.404196491767902 0.02 +2178 0.2267165873343268 -0.404196491767902 0.04000000000000001 +2179 0.2267165873343268 -0.404196491767902 0.06 +2180 0.2267165873343268 -0.404196491767902 0.08000000000000002 +2181 -0.3921243599547922 0.237380356580334 0.02 +2182 -0.3921243599547922 0.237380356580334 0.04000000000000001 +2183 -0.3921243599547922 0.237380356580334 0.06 +2184 -0.3921243599547922 0.237380356580334 0.08000000000000002 +2185 0.7762264538031828 0.1334299110335727 0.02 +2186 0.7762264538031828 0.1334299110335727 0.04000000000000001 +2187 0.7762264538031828 0.1334299110335727 0.06 +2188 0.7762264538031828 0.1334299110335727 0.08000000000000002 +2189 0.6255619678532343 0.3623554477175763 0.02 +2190 0.6255619678532343 0.3623554477175763 0.04000000000000001 +2191 0.6255619678532343 0.3623554477175763 0.06 +2192 0.6255619678532343 0.3623554477175763 0.08000000000000002 +2193 -0.3847763662517107 0.06131267630738398 0.02 +2194 -0.3847763662517107 0.06131267630738398 0.04000000000000001 +2195 -0.3847763662517107 0.06131267630738398 0.06 +2196 -0.3847763662517107 0.06131267630738398 0.08000000000000002 +2197 0.05175361961460756 -0.4060401688047797 0.02 +2198 0.05175361961460756 -0.4060401688047797 0.04000000000000001 +2199 0.05175361961460756 -0.4060401688047797 0.06 +2200 0.05175361961460756 -0.4060401688047797 0.08000000000000002 +2201 0.7971758261607385 -0.009677090010098406 0.02 +2202 0.7971758261607385 -0.009677090010098406 0.04000000000000001 +2203 0.7971758261607385 -0.009677090010098406 0.06 +2204 0.7971758261607385 -0.009677090010098406 0.08000000000000002 +2205 0.02903964021997372 -0.7868651127330674 0.02 +2206 0.02903964021997372 -0.7868651127330674 0.04000000000000001 +2207 0.02903964021997372 -0.7868651127330674 0.06 +2208 0.02903964021997372 -0.7868651127330674 0.08000000000000002 +2209 0.5436385913445115 -0.1780222692551246 0.02 +2210 0.5436385913445115 -0.1780222692551246 0.04000000000000001 +2211 0.5436385913445115 -0.1780222692551246 0.06 +2212 0.5436385913445115 -0.1780222692551246 0.08000000000000002 +2213 -0.4766052200995599 -0.3691499610194545 0.02 +2214 -0.4766052200995599 -0.3691499610194545 0.04000000000000001 +2215 -0.4766052200995599 -0.3691499610194545 0.06 +2216 -0.4766052200995599 -0.3691499610194545 0.08000000000000002 +2217 -0.09227480672418116 0.446412833215618 0.02 +2218 -0.09227480672418116 0.446412833215618 0.04000000000000001 +2219 -0.09227480672418116 0.446412833215618 0.06 +2220 -0.09227480672418116 0.446412833215618 0.08000000000000002 +2221 -0.8276707036086602 0.3663654908505932 0.02 +2222 -0.8276707036086602 0.3663654908505932 0.04000000000000001 +2223 -0.8276707036086602 0.3663654908505932 0.06 +2224 -0.8276707036086602 0.3663654908505932 0.08000000000000002 +2225 -0.3625720175441697 -0.8654470711559323 0.02 +2226 -0.3625720175441697 -0.8654470711559323 0.04000000000000001 +2227 -0.3625720175441697 -0.8654470711559323 0.06 +2228 -0.3625720175441697 -0.8654470711559323 0.08000000000000002 +2229 0.3679768792395708 0.8339255635922422 0.02 +2230 0.3679768792395708 0.8339255635922422 0.04000000000000001 +2231 0.3679768792395708 0.8339255635922422 0.06 +2232 0.3679768792395708 0.8339255635922422 0.08000000000000002 +2233 0.8653158533360795 -0.3596237269740152 0.02 +2234 0.8653158533360795 -0.3596237269740152 0.04000000000000001 +2235 0.8653158533360795 -0.3596237269740152 0.06 +2236 0.8653158533360795 -0.3596237269740152 0.08000000000000002 +2237 -0.8993152141046745 -0.2735310195472121 0.02 +2238 -0.8993152141046745 -0.2735310195472121 0.04000000000000001 +2239 -0.8993152141046745 -0.2735310195472121 0.06 +2240 -0.8993152141046745 -0.2735310195472121 0.08000000000000002 +2241 -0.2742080431142168 0.8995416986589064 0.02 +2242 -0.2742080431142168 0.8995416986589064 0.04000000000000001 +2243 -0.2742080431142168 0.8995416986589064 0.06 +2244 -0.2742080431142168 0.8995416986589064 0.08000000000000002 +2245 0.2823776819579458 -0.8614674305440521 0.02 +2246 0.2823776819579458 -0.8614674305440521 0.04000000000000001 +2247 0.2823776819579458 -0.8614674305440521 0.06 +2248 0.2823776819579458 -0.8614674305440521 0.08000000000000002 +2249 0.8638372874845223 0.2814474457157449 0.02 +2250 0.8638372874845223 0.2814474457157449 0.04000000000000001 +2251 0.8638372874845223 0.2814474457157449 0.06 +2252 0.8638372874845223 0.2814474457157449 0.08000000000000002 +2253 0.005720196065220282 0.09510058453179887 0.02 +2254 0.005720196065220282 0.09510058453179887 0.04000000000000001 +2255 0.005720196065220282 0.09510058453179887 0.06 +2256 0.005720196065220282 0.09510058453179887 0.08000000000000002 +2257 -0.4113563739337736 0.5440605170594375 0.02 +2258 -0.4113563739337736 0.5440605170594375 0.04000000000000001 +2259 -0.4113563739337736 0.5440605170594375 0.06 +2260 -0.4113563739337736 0.5440605170594375 0.08000000000000002 +2261 0.5429183323635547 0.4174161733166027 0.02 +2262 0.5429183323635547 0.4174161733166027 0.04000000000000001 +2263 0.5429183323635547 0.4174161733166027 0.06 +2264 0.5429183323635547 0.4174161733166027 0.08000000000000002 +2265 0.4898446896719412 -0.4725834207981396 0.02 +2266 0.4898446896719412 -0.4725834207981396 0.04000000000000001 +2267 0.4898446896719412 -0.4725834207981396 0.06 +2268 0.4898446896719412 -0.4725834207981396 0.08000000000000002 +2269 0.6799180594625716 0.6093546310769131 0.02 +2270 0.6799180594625716 0.6093546310769131 0.04000000000000001 +2271 0.6799180594625716 0.6093546310769131 0.06 +2272 0.6799180594625716 0.6093546310769131 0.08000000000000002 +2273 0.6066775018333774 -0.6769050674404204 0.02 +2274 0.6066775018333774 -0.6769050674404204 0.04000000000000001 +2275 0.6066775018333774 -0.6769050674404204 0.06 +2276 0.6066775018333774 -0.6769050674404204 0.08000000000000002 +2277 -0.6113192359830126 0.6822383870521778 0.02 +2278 -0.6113192359830126 0.6822383870521778 0.04000000000000001 +2279 -0.6113192359830126 0.6822383870521778 0.06 +2280 -0.6113192359830126 0.6822383870521778 0.08000000000000002 +2281 -0.6879780354527674 -0.5869202945565708 0.02 +2282 -0.6879780354527674 -0.5869202945565708 0.04000000000000001 +2283 -0.6879780354527674 -0.5869202945565708 0.06 +2284 -0.6879780354527674 -0.5869202945565708 0.08000000000000002 +2285 0.13280865311488 -0.7626550897371936 0.02 +2286 0.13280865311488 -0.7626550897371936 0.04000000000000001 +2287 0.13280865311488 -0.7626550897371936 0.06 +2288 0.13280865311488 -0.7626550897371936 0.08000000000000002 +2289 0.212519693716841 -0.7781235116252192 0.02 +2290 0.212519693716841 -0.7781235116252192 0.04000000000000001 +2291 0.212519693716841 -0.7781235116252192 0.06 +2292 0.212519693716841 -0.7781235116252192 0.08000000000000002 +2293 0.3115820850724765 0.6840739216783392 0.02 +2294 0.3115820850724765 0.6840739216783392 0.04000000000000001 +2295 0.3115820850724765 0.6840739216783392 0.06 +2296 0.3115820850724765 0.6840739216783392 0.08000000000000002 +2297 -0.7540258566496366 0.2033190372303242 0.02 +2298 -0.7540258566496366 0.2033190372303242 0.04000000000000001 +2299 -0.7540258566496366 0.2033190372303242 0.06 +2300 -0.7540258566496366 0.2033190372303242 0.08000000000000002 +2301 0.2132391670384238 0.7627843083827193 0.02 +2302 0.2132391670384238 0.7627843083827193 0.04000000000000001 +2303 0.2132391670384238 0.7627843083827193 0.06 +2304 0.2132391670384238 0.7627843083827193 0.08000000000000002 +2305 0.7797283856855453 0.2135271098329889 0.02 +2306 0.7797283856855453 0.2135271098329889 0.04000000000000001 +2307 0.7797283856855453 0.2135271098329889 0.06 +2308 0.7797283856855453 0.2135271098329889 0.08000000000000002 +2309 -0.5691980284264325 -0.5855742751261486 0.02 +2310 -0.5691980284264325 -0.5855742751261486 0.04000000000000001 +2311 -0.5691980284264325 -0.5855742751261486 0.06 +2312 -0.5691980284264325 -0.5855742751261486 0.08000000000000002 +2313 0.5590107420116385 -0.5712906149700842 0.02 +2314 0.5590107420116385 -0.5712906149700842 0.04000000000000001 +2315 0.5590107420116385 -0.5712906149700842 0.06 +2316 0.5590107420116385 -0.5712906149700842 0.08000000000000002 +2317 0.01295413502917306 -0.237090692226727 0.02 +2318 0.01295413502917306 -0.237090692226727 0.04000000000000001 +2319 0.01295413502917306 -0.237090692226727 0.06 +2320 0.01295413502917306 -0.237090692226727 0.08000000000000002 +2321 -0.2420698239367897 0.7210400773243747 0.02 +2322 -0.2420698239367897 0.7210400773243747 0.04000000000000001 +2323 -0.2420698239367897 0.7210400773243747 0.06 +2324 -0.2420698239367897 0.7210400773243747 0.08000000000000002 +2325 -0.7178312364409216 -0.2376826902164933 0.02 +2326 -0.7178312364409216 -0.2376826902164933 0.04000000000000001 +2327 -0.7178312364409216 -0.2376826902164933 0.06 +2328 -0.7178312364409216 -0.2376826902164933 0.08000000000000002 +2329 0.6869006122989217 -0.3099083198112231 0.02 +2330 0.6869006122989217 -0.3099083198112231 0.04000000000000001 +2331 0.6869006122989217 -0.3099083198112231 0.06 +2332 0.6869006122989217 -0.3099083198112231 0.08000000000000002 +2333 -0.3178499970389874 -0.6970785036289955 0.02 +2334 -0.3178499970389874 -0.6970785036289955 0.04000000000000001 +2335 -0.3178499970389874 -0.6970785036289955 0.06 +2336 -0.3178499970389874 -0.6970785036289955 0.08000000000000002 +2337 -0.1320844404820838 0.8166337655205012 0.02 +2338 -0.1320844404820838 0.8166337655205012 0.04000000000000001 +2339 -0.1320844404820838 0.8166337655205012 0.06 +2340 -0.1320844404820838 0.8166337655205012 0.08000000000000002 +2341 -0.8165365137081694 -0.1305531797328427 0.02 +2342 -0.8165365137081694 -0.1305531797328427 0.04000000000000001 +2343 -0.8165365137081694 -0.1305531797328427 0.06 +2344 -0.8165365137081694 -0.1305531797328427 0.08000000000000002 +2345 -0.2302830524795657 -0.7755656321644682 0.02 +2346 -0.2302830524795657 -0.7755656321644682 0.04000000000000001 +2347 -0.2302830524795657 -0.7755656321644682 0.06 +2348 -0.2302830524795657 -0.7755656321644682 0.08000000000000002 +2349 0.772124284225815 -0.214291273801193 0.02 +2350 0.772124284225815 -0.214291273801193 0.04000000000000001 +2351 0.772124284225815 -0.214291273801193 0.06 +2352 0.772124284225815 -0.214291273801193 0.08000000000000002 +2353 0.2289943343655265 -0.2041911189604385 0.02 +2354 0.2289943343655265 -0.2041911189604385 0.04000000000000001 +2355 0.2289943343655265 -0.2041911189604385 0.06 +2356 0.2289943343655265 -0.2041911189604385 0.08000000000000002 +2357 0.313385418863572 -0.3478517310539778 0.02 +2358 0.313385418863572 -0.3478517310539778 0.04000000000000001 +2359 0.313385418863572 -0.3478517310539778 0.06 +2360 0.313385418863572 -0.3478517310539778 0.08000000000000002 +2361 -0.2749889886035179 0.3283958766372468 0.02 +2362 -0.2749889886035179 0.3283958766372468 0.04000000000000001 +2363 -0.2749889886035179 0.3283958766372468 0.06 +2364 -0.2749889886035179 0.3283958766372468 0.08000000000000002 +2365 0.1784513232539571 0.2321332968991923 0.02 +2366 0.1784513232539571 0.2321332968991923 0.04000000000000001 +2367 0.1784513232539571 0.2321332968991923 0.06 +2368 0.1784513232539571 0.2321332968991923 0.08000000000000002 +2369 0.5372461404555327 0.177259879833838 0.02 +2370 0.5372461404555327 0.177259879833838 0.04000000000000001 +2371 0.5372461404555327 0.177259879833838 0.06 +2372 0.5372461404555327 0.177259879833838 0.08000000000000002 +2373 0.3569536974980164 -0.6511397036653975 0.02 +2374 0.3569536974980164 -0.6511397036653975 0.04000000000000001 +2375 0.3569536974980164 -0.6511397036653975 0.06 +2376 0.3569536974980164 -0.6511397036653975 0.08000000000000002 +2377 -0.5707219917837311 0.4230779019485903 0.02 +2378 -0.5707219917837311 0.4230779019485903 0.04000000000000001 +2379 -0.5707219917837311 0.4230779019485903 0.06 +2380 -0.5707219917837311 0.4230779019485903 0.08000000000000002 +2381 0.4068507250445134 0.6023778940918366 0.02 +2382 0.4068507250445134 0.6023778940918366 0.04000000000000001 +2383 0.4068507250445134 0.6023778940918366 0.06 +2384 0.4068507250445134 0.6023778940918366 0.08000000000000002 +2385 0.3104463105053766 -0.5973784833279926 0.02 +2386 0.3104463105053766 -0.5973784833279926 0.04000000000000001 +2387 0.3104463105053766 -0.5973784833279926 0.06 +2388 0.3104463105053766 -0.5973784833279926 0.08000000000000002 +2389 0.3392484760137726 0.5379185813946928 0.02 +2390 0.3392484760137726 0.5379185813946928 0.04000000000000001 +2391 0.3392484760137726 0.5379185813946928 0.06 +2392 0.3392484760137726 0.5379185813946928 0.08000000000000002 +2393 -0.5334581930932596 0.3510954155040024 0.02 +2394 -0.5334581930932596 0.3510954155040024 0.04000000000000001 +2395 -0.5334581930932596 0.3510954155040024 0.06 +2396 -0.5334581930932596 0.3510954155040024 0.08000000000000002 +2397 -0.1049004877290534 0.2733072360264381 0.02 +2398 -0.1049004877290534 0.2733072360264381 0.04000000000000001 +2399 -0.1049004877290534 0.2733072360264381 0.06 +2400 -0.1049004877290534 0.2733072360264381 0.08000000000000002 +2401 0.08684016475009505 -0.0001154658118619617 0.02 +2402 0.08684016475009505 -0.0001154658118619617 0.04000000000000001 +2403 0.08684016475009505 -0.0001154658118619617 0.06 +2404 0.08684016475009505 -0.0001154658118619617 0.08000000000000002 +2405 0.3433509849726744 -0.02839693236601738 0.02 +2406 0.3433509849726744 -0.02839693236601738 0.04000000000000001 +2407 0.3433509849726744 -0.02839693236601738 0.06 +2408 0.3433509849726744 -0.02839693236601738 0.08000000000000002 +2409 0.421966220427518 -0.418371918983939 0.02 +2410 0.421966220427518 -0.418371918983939 0.04000000000000001 +2411 0.421966220427518 -0.418371918983939 0.06 +2412 0.421966220427518 -0.418371918983939 0.08000000000000002 +2413 0.1448711585619036 0.3177504243506497 0.02 +2414 0.1448711585619036 0.3177504243506497 0.04000000000000001 +2415 0.1448711585619036 0.3177504243506497 0.06 +2416 0.1448711585619036 0.3177504243506497 0.08000000000000002 +2417 -0.3502316867446068 -0.02250865640264687 0.02 +2418 -0.3502316867446068 -0.02250865640264687 0.04000000000000001 +2419 -0.3502316867446068 -0.02250865640264687 0.06 +2420 -0.3502316867446068 -0.02250865640264687 0.08000000000000002 +2421 -0.02440853505205695 -0.3407757724541551 0.02 +2422 -0.02440853505205695 -0.3407757724541551 0.04000000000000001 +2423 -0.02440853505205695 -0.3407757724541551 0.06 +2424 -0.02440853505205695 -0.3407757724541551 0.08000000000000002 +2425 0.5856187551363887 -0.2523089995580183 0.02 +2426 0.5856187551363887 -0.2523089995580183 0.04000000000000001 +2427 0.5856187551363887 -0.2523089995580183 0.06 +2428 0.5856187551363887 -0.2523089995580183 0.08000000000000002 +2429 0.4192608875569094 0.2159642076241164 0.02 +2430 0.4192608875569094 0.2159642076241164 0.04000000000000001 +2431 0.4192608875569094 0.2159642076241164 0.06 +2432 0.4192608875569094 0.2159642076241164 0.08000000000000002 +2433 -0.7477960516123059 -0.5244744744882651 0.02 +2434 -0.7477960516123059 -0.5244744744882651 0.04000000000000001 +2435 -0.7477960516123059 -0.5244744744882651 0.06 +2436 -0.7477960516123059 -0.5244744744882651 0.08000000000000002 +2437 -0.5317252840918131 0.7369538594664218 0.02 +2438 -0.5317252840918131 0.7369538594664218 0.04000000000000001 +2439 -0.5317252840918131 0.7369538594664218 0.06 +2440 -0.5317252840918131 0.7369538594664218 0.08000000000000002 +2441 0.5239913252132835 -0.7380102585252672 0.02 +2442 0.5239913252132835 -0.7380102585252672 0.04000000000000001 +2443 0.5239913252132835 -0.7380102585252672 0.06 +2444 0.5239913252132835 -0.7380102585252672 0.08000000000000002 +2445 0.7356460351243852 0.5245181246208961 0.02 +2446 0.7356460351243852 0.5245181246208961 0.04000000000000001 +2447 0.7356460351243852 0.5245181246208961 0.06 +2448 0.7356460351243852 0.5245181246208961 0.08000000000000002 +2449 -0.4124412670844655 -0.3949244298615737 0.02 +2450 -0.4124412670844655 -0.3949244298615737 0.04000000000000001 +2451 -0.4124412670844655 -0.3949244298615737 0.06 +2452 -0.4124412670844655 -0.3949244298615737 0.08000000000000002 +2453 -0.02700536791140639 0.3447334599804672 0.02 +2454 -0.02700536791140639 0.3447334599804672 0.04000000000000001 +2455 -0.02700536791140639 0.3447334599804672 0.06 +2456 -0.02700536791140639 0.3447334599804672 0.08000000000000002 +2457 -0.568650677347752 0.5898376576967671 0.02 +2458 -0.568650677347752 0.5898376576967671 0.04000000000000001 +2459 -0.568650677347752 0.5898376576967671 0.06 +2460 -0.568650677347752 0.5898376576967671 0.08000000000000002 +2461 0.5786789825822586 0.5695912541022239 0.02 +2462 0.5786789825822586 0.5695912541022239 0.04000000000000001 +2463 0.5786789825822586 0.5695912541022239 0.06 +2464 0.5786789825822586 0.5695912541022239 0.08000000000000002 +2465 -0.9142972860505157 0.06340918818020852 0.02 +2466 -0.9142972860505157 0.06340918818020852 0.04000000000000001 +2467 -0.9142972860505157 0.06340918818020852 0.06 +2468 -0.9142972860505157 0.06340918818020852 0.08000000000000002 +2469 -0.06784932272078724 -0.9375851412550555 0.02 +2470 -0.06784932272078724 -0.9375851412550555 0.04000000000000001 +2471 -0.06784932272078724 -0.9375851412550555 0.06 +2472 -0.06784932272078724 -0.9375851412550555 0.08000000000000002 +2473 0.06318415345401196 0.9138848214484351 0.02 +2474 0.06318415345401196 0.9138848214484351 0.04000000000000001 +2475 0.06318415345401196 0.9138848214484351 0.06 +2476 0.06318415345401196 0.9138848214484351 0.08000000000000002 +2477 0.943323287043117 -0.02436457279393412 0.02 +2478 0.943323287043117 -0.02436457279393412 0.04000000000000001 +2479 0.943323287043117 -0.02436457279393412 0.06 +2480 0.943323287043117 -0.02436457279393412 0.08000000000000002 +2481 -0.6766940123516199 -0.4736898381042419 0.02 +2482 -0.6766940123516199 -0.4736898381042419 0.04000000000000001 +2483 -0.6766940123516199 -0.4736898381042419 0.06 +2484 -0.6766940123516199 -0.4736898381042419 0.08000000000000002 +2485 -0.4995573255429975 0.649323325952923 0.02 +2486 -0.4995573255429975 0.649323325952923 0.04000000000000001 +2487 -0.4995573255429975 0.649323325952923 0.06 +2488 -0.4995573255429975 0.649323325952923 0.08000000000000002 +2489 0.628873771450369 0.4689806786238402 0.02 +2490 0.628873771450369 0.4689806786238402 0.04000000000000001 +2491 0.628873771450369 0.4689806786238402 0.06 +2492 0.628873771450369 0.4689806786238402 0.08000000000000002 +2493 -0.01525709683040301 0.6058672437123304 0.02 +2494 -0.01525709683040301 0.6058672437123304 0.04000000000000001 +2495 -0.01525709683040301 0.6058672437123304 0.06 +2496 -0.01525709683040301 0.6058672437123304 0.08000000000000002 +2497 -0.6023929760809482 -0.04690466966469053 0.02 +2498 -0.6023929760809482 -0.04690466966469053 0.04000000000000001 +2499 -0.6023929760809482 -0.04690466966469053 0.06 +2500 -0.6023929760809482 -0.04690466966469053 0.08000000000000002 +2501 -0.638041146495291 -0.1772508545139594 0.02 +2502 -0.638041146495291 -0.1772508545139594 0.04000000000000001 +2503 -0.638041146495291 -0.1772508545139594 0.06 +2504 -0.638041146495291 -0.1772508545139594 0.08000000000000002 +2505 -0.1833411205769646 0.6368071204091833 0.02 +2506 -0.1833411205769646 0.6368071204091833 0.04000000000000001 +2507 -0.1833411205769646 0.6368071204091833 0.06 +2508 -0.1833411205769646 0.6368071204091833 0.08000000000000002 +2509 -0.254820601188139 -0.620523774733428 0.02 +2510 -0.254820601188139 -0.620523774733428 0.04000000000000001 +2511 -0.254820601188139 -0.620523774733428 0.06 +2512 -0.254820601188139 -0.620523774733428 0.08000000000000002 +2513 0.0573373956269707 -0.5893050347178428 0.02 +2514 0.0573373956269707 -0.5893050347178428 0.04000000000000001 +2515 0.0573373956269707 -0.5893050347178428 0.06 +2516 0.0573373956269707 -0.5893050347178428 0.08000000000000002 +2517 -0.5648702794078161 0.1017551343549891 0.02 +2518 -0.5648702794078161 0.1017551343549891 0.04000000000000001 +2519 -0.5648702794078161 0.1017551343549891 0.06 +2520 -0.5648702794078161 0.1017551343549891 0.08000000000000002 +2521 0.1098839761223454 0.5471577958965221 0.02 +2522 0.1098839761223454 0.5471577958965221 0.04000000000000001 +2523 0.1098839761223454 0.5471577958965221 0.06 +2524 0.1098839761223454 0.5471577958965221 0.08000000000000002 +2525 0.5739079163391468 0.03388011106382179 0.02 +2526 0.5739079163391468 0.03388011106382179 0.04000000000000001 +2527 0.5739079163391468 0.03388011106382179 0.06 +2528 0.5739079163391468 0.03388011106382179 0.08000000000000002 +2529 0.0807550665592261 0.4134849456169955 0.02 +2530 0.0807550665592261 0.4134849456169955 0.04000000000000001 +2531 0.0807550665592261 0.4134849456169955 0.06 +2532 0.0807550665592261 0.4134849456169955 0.08000000000000002 +2533 -0.03071133818100915 -0.5000764508891952 0.02 +2534 -0.03071133818100915 -0.5000764508891952 0.04000000000000001 +2535 -0.03071133818100915 -0.5000764508891952 0.06 +2536 -0.03071133818100915 -0.5000764508891952 0.08000000000000002 +2537 -0.4952495834676112 0.0363249356686037 0.02 +2538 -0.4952495834676112 0.0363249356686037 0.04000000000000001 +2539 -0.4952495834676112 0.0363249356686037 0.06 +2540 -0.4952495834676112 0.0363249356686037 0.08000000000000002 +2541 0.02221053103249053 0.5046568980768951 0.02 +2542 0.02221053103249053 0.5046568980768951 0.04000000000000001 +2543 0.02221053103249053 0.5046568980768951 0.06 +2544 0.02221053103249053 0.5046568980768951 0.08000000000000002 +2545 -0.1509883085519089 -0.7011934499747617 0.02 +2546 -0.1509883085519089 -0.7011934499747617 0.04000000000000001 +2547 -0.1509883085519089 -0.7011934499747617 0.06 +2548 -0.1509883085519089 -0.7011934499747617 0.08000000000000002 +2549 0.7157119856144909 -0.1306786726026019 0.02 +2550 0.7157119856144909 -0.1306786726026019 0.04000000000000001 +2551 0.7157119856144909 -0.1306786726026019 0.06 +2552 0.7157119856144909 -0.1306786726026019 0.08000000000000002 +2553 -0.8454461547050278 0.1242180958366506 0.02 +2554 -0.8454461547050278 0.1242180958366506 0.04000000000000001 +2555 -0.8454461547050278 0.1242180958366506 0.06 +2556 -0.8454461547050278 0.1242180958366506 0.08000000000000002 +2557 -0.1404332347510375 -0.8246621089137849 0.02 +2558 -0.1404332347510375 -0.8246621089137849 0.04000000000000001 +2559 -0.1404332347510375 -0.8246621089137849 0.06 +2560 -0.1404332347510375 -0.8246621089137849 0.08000000000000002 +2561 0.1255049929716144 0.8452124970473215 0.02 +2562 0.1255049929716144 0.8452124970473215 0.04000000000000001 +2563 0.1255049929716144 0.8452124970473215 0.06 +2564 0.1255049929716144 0.8452124970473215 0.08000000000000002 +2565 0.8082875074664617 -0.115339449568752 0.02 +2566 0.8082875074664617 -0.115339449568752 0.04000000000000001 +2567 0.8082875074664617 -0.115339449568752 0.06 +2568 0.8082875074664617 -0.115339449568752 0.08000000000000002 +2569 0.5205442209132707 -0.01668693502320576 0.02 +2570 0.5205442209132707 -0.01668693502320576 0.04000000000000001 +2571 0.5205442209132707 -0.01668693502320576 0.06 +2572 0.5205442209132707 -0.01668693502320576 0.08000000000000002 +2573 -0.08356141445332145 0.1110702249359781 0.02 +2574 -0.08356141445332145 0.1110702249359781 0.04000000000000001 +2575 -0.08356141445332145 0.1110702249359781 0.06 +2576 -0.08356141445332145 0.1110702249359781 0.08000000000000002 +2577 0.3370260710945491 0.2772924701028578 0.02 +2578 0.3370260710945491 0.2772924701028578 0.04000000000000001 +2579 0.3370260710945491 0.2772924701028578 0.06 +2580 0.3370260710945491 0.2772924701028578 0.08000000000000002 +2581 0.4234759520057531 -0.5205743629890647 0.02 +2582 0.4234759520057531 -0.5205743629890647 0.04000000000000001 +2583 0.4234759520057531 -0.5205743629890647 0.06 +2584 0.4234759520057531 -0.5205743629890647 0.08000000000000002 +2585 0.4769846664590845 0.5067502606822457 0.02 +2586 0.4769846664590845 0.5067502606822457 0.04000000000000001 +2587 0.4769846664590845 0.5067502606822457 0.06 +2588 0.4769846664590845 0.5067502606822457 0.08000000000000002 +2589 -0.4758324437609096 0.5029522421326716 0.02 +2590 -0.4758324437609096 0.5029522421326716 0.04000000000000001 +2591 -0.4758324437609096 0.5029522421326716 0.06 +2592 -0.4758324437609096 0.5029522421326716 0.08000000000000002 +2593 0.2615712986181207 0.1899663861767313 0.02 +2594 0.2615712986181207 0.1899663861767313 0.04000000000000001 +2595 0.2615712986181207 0.1899663861767313 0.06 +2596 0.2615712986181207 0.1899663861767313 0.08000000000000002 +2597 0.05115140286568221 -0.14350526630773 0.02 +2598 0.05115140286568221 -0.14350526630773 0.04000000000000001 +2599 0.05115140286568221 -0.14350526630773 0.06 +2600 0.05115140286568221 -0.14350526630773 0.08000000000000002 +2601 0.2887213389972646 -0.4039475650165419 0.02 +2602 0.2887213389972646 -0.4039475650165419 0.04000000000000001 +2603 0.2887213389972646 -0.4039475650165419 0.06 +2604 0.2887213389972646 -0.4039475650165419 0.08000000000000002 +2605 -0.4008244299391783 0.3351032680280133 0.02 +2606 -0.4008244299391783 0.3351032680280133 0.04000000000000001 +2607 -0.4008244299391783 0.3351032680280133 0.06 +2608 -0.4008244299391783 0.3351032680280133 0.08000000000000002 +2609 0.8076009813815366 0.4420606581071422 0.02 +2610 0.8076009813815366 0.4420606581071422 0.04000000000000001 +2611 0.8076009813815366 0.4420606581071422 0.06 +2612 0.8076009813815366 0.4420606581071422 0.08000000000000002 +2613 0.4465565815629323 -0.809466605352179 0.02 +2614 0.4465565815629323 -0.809466605352179 0.04000000000000001 +2615 0.4465565815629323 -0.809466605352179 0.06 +2616 0.4465565815629323 -0.809466605352179 0.08000000000000002 +2617 -0.4422024039427189 0.8037926887271941 0.02 +2618 -0.4422024039427189 0.8037926887271941 0.04000000000000001 +2619 -0.4422024039427189 0.8037926887271941 0.06 +2620 -0.4422024039427189 0.8037926887271941 0.08000000000000002 +2621 -0.8159159053992495 -0.4076165205093536 0.02 +2622 -0.8159159053992495 -0.4076165205093536 0.04000000000000001 +2623 -0.8159159053992495 -0.4076165205093536 0.06 +2624 -0.8159159053992495 -0.4076165205093536 0.08000000000000002 +2625 0.7537866005416408 -0.5174461579498879 0.02 +2626 0.7537866005416408 -0.5174461579498879 0.04000000000000001 +2627 0.7537866005416408 -0.5174461579498879 0.06 +2628 0.7537866005416408 -0.5174461579498879 0.08000000000000002 +2629 0.5258920943680429 0.7578896955346317 0.02 +2630 0.5258920943680429 0.7578896955346317 0.04000000000000001 +2631 0.5258920943680429 0.7578896955346317 0.06 +2632 0.5258920943680429 0.7578896955346317 0.08000000000000002 +2633 -0.5184324220664533 -0.7547537594941177 0.02 +2634 -0.5184324220664533 -0.7547537594941177 0.04000000000000001 +2635 -0.5184324220664533 -0.7547537594941177 0.06 +2636 -0.5184324220664533 -0.7547537594941177 0.08000000000000002 +2637 -0.7546511382409899 0.526557102599275 0.02 +2638 -0.7546511382409899 0.526557102599275 0.04000000000000001 +2639 -0.7546511382409899 0.526557102599275 0.06 +2640 -0.7546511382409899 0.526557102599275 0.08000000000000002 +2641 -0.2331734409113291 0.4906122615105926 0.02 +2642 -0.2331734409113291 0.4906122615105926 0.04000000000000001 +2643 -0.2331734409113291 0.4906122615105926 0.06 +2644 -0.2331734409113291 0.4906122615105926 0.08000000000000002 +2645 -0.04023174618598973 0.8267240701620343 0.02 +2646 -0.04023174618598973 0.8267240701620343 0.04000000000000001 +2647 -0.04023174618598973 0.8267240701620343 0.06 +2648 -0.04023174618598973 0.8267240701620343 0.08000000000000002 +2649 0.8393639335741593 0.05264228469825077 0.02 +2650 0.8393639335741593 0.05264228469825077 0.04000000000000001 +2651 0.8393639335741593 0.05264228469825077 0.06 +2652 0.8393639335741593 0.05264228469825077 0.08000000000000002 +2653 -0.8281986127176854 -0.03860013002446162 0.02 +2654 -0.8281986127176854 -0.03860013002446162 0.04000000000000001 +2655 -0.8281986127176854 -0.03860013002446162 0.06 +2656 -0.8281986127176854 -0.03860013002446162 0.08000000000000002 +2657 -0.1950579950872454 -0.02377408596863028 0.02 +2658 -0.1950579950872454 -0.02377408596863028 0.04000000000000001 +2659 -0.1950579950872454 -0.02377408596863028 0.06 +2660 -0.1950579950872454 -0.02377408596863028 0.08000000000000002 +2661 0.347430933875454 0.1052452981826389 0.02 +2662 0.347430933875454 0.1052452981826389 0.04000000000000001 +2663 0.347430933875454 0.1052452981826389 0.06 +2664 0.347430933875454 0.1052452981826389 0.08000000000000002 +2665 0.3997633875258403 0.2711437116297114 0.02 +2666 0.3997633875258403 0.2711437116297114 0.04000000000000001 +2667 0.3997633875258403 0.2711437116297114 0.06 +2668 0.3997633875258403 0.2711437116297114 0.08000000000000002 +2669 0.795411454699938 0.2727801199271267 0.02 +2670 0.795411454699938 0.2727801199271267 0.04000000000000001 +2671 0.795411454699938 0.2727801199271267 0.06 +2672 0.795411454699938 0.2727801199271267 0.08000000000000002 +2673 0.273758664450472 -0.791853893524051 0.02 +2674 0.273758664450472 -0.791853893524051 0.04000000000000001 +2675 0.273758664450472 -0.791853893524051 0.06 +2676 0.273758664450472 -0.791853893524051 0.08000000000000002 +2677 0.354311183601827 0.7722213983503817 0.02 +2678 0.354311183601827 0.7722213983503817 0.04000000000000001 +2679 0.354311183601827 0.7722213983503817 0.06 +2680 0.354311183601827 0.7722213983503817 0.08000000000000002 +2681 -0.7569610725054408 0.3508809227011437 0.02 +2682 -0.7569610725054408 0.3508809227011437 0.04000000000000001 +2683 -0.7569610725054408 0.3508809227011437 0.06 +2684 -0.7569610725054408 0.3508809227011437 0.08000000000000002 +2685 -0.7624425825752122 0.03883371116524456 0.02 +2686 -0.7624425825752122 0.03883371116524456 0.04000000000000001 +2687 -0.7624425825752122 0.03883371116524456 0.06 +2688 -0.7624425825752122 0.03883371116524456 0.08000000000000002 +2689 -0.08573001837619887 -0.769643021286046 0.02 +2690 -0.08573001837619887 -0.769643021286046 0.04000000000000001 +2691 -0.08573001837619887 -0.769643021286046 0.06 +2692 -0.08573001837619887 -0.769643021286046 0.08000000000000002 +2693 0.0369242159646908 0.7555384349414538 0.02 +2694 0.0369242159646908 0.7555384349414538 0.04000000000000001 +2695 0.0369242159646908 0.7555384349414538 0.06 +2696 0.0369242159646908 0.7555384349414538 0.08000000000000002 +2697 0.7539941802596171 -0.06910515729163667 0.02 +2698 0.7539941802596171 -0.06910515729163667 0.04000000000000001 +2699 0.7539941802596171 -0.06910515729163667 0.06 +2700 0.7539941802596171 -0.06910515729163667 0.08000000000000002 +2701 -0.09392048167665304 -0.176128945220071 0.02 +2702 -0.09392048167665304 -0.176128945220071 0.04000000000000001 +2703 -0.09392048167665304 -0.176128945220071 0.06 +2704 -0.09392048167665304 -0.176128945220071 0.08000000000000002 +2705 0.5734523063403572 -0.09936457676711502 0.02 +2706 0.5734523063403572 -0.09936457676711502 0.04000000000000001 +2707 0.5734523063403572 -0.09936457676711502 0.06 +2708 0.5734523063403572 -0.09936457676711502 0.08000000000000002 +2709 0.02081977010202333 0.6781228317328531 0.02 +2710 0.02081977010202333 0.6781228317328531 0.04000000000000001 +2711 0.02081977010202333 0.6781228317328531 0.06 +2712 0.02081977010202333 0.6781228317328531 0.08000000000000002 +2713 -0.6217052436174334 0.006945684980102823 0.02 +2714 -0.6217052436174334 0.006945684980102823 0.04000000000000001 +2715 -0.6217052436174334 0.006945684980102823 0.06 +2716 -0.6217052436174334 0.006945684980102823 0.08000000000000002 +2717 0.7407066992742855 0.0357574307154823 0.02 +2718 0.7407066992742855 0.0357574307154823 0.04000000000000001 +2719 0.7407066992742855 0.0357574307154823 0.06 +2720 0.7407066992742855 0.0357574307154823 0.08000000000000002 +2721 -0.1020069572301296 -0.5953093552003388 0.02 +2722 -0.1020069572301296 -0.5953093552003388 0.04000000000000001 +2723 -0.1020069572301296 -0.5953093552003388 0.06 +2724 -0.1020069572301296 -0.5953093552003388 0.08000000000000002 $EndNodes $Elements -2904 +2910 1 1 2 4 8 5 69 2 1 2 4 8 69 70 3 1 2 4 8 70 71 @@ -2788,2844 +2794,2850 @@ $Elements 62 1 2 4 11 126 127 63 1 2 4 11 127 128 64 1 2 4 11 128 5 -65 3 2 2 15 4 9 534 129 -66 3 2 2 15 129 534 535 130 -67 3 2 2 15 130 535 536 131 -68 3 2 2 15 131 536 537 132 -69 3 2 2 15 132 537 69 5 -70 3 2 2 15 9 10 538 534 -71 3 2 2 15 534 538 539 535 -72 3 2 2 15 535 539 540 536 -73 3 2 2 15 536 540 541 537 -74 3 2 2 15 537 541 70 69 -75 3 2 2 15 10 11 542 538 -76 3 2 2 15 538 542 543 539 -77 3 2 2 15 539 543 544 540 -78 3 2 2 15 540 544 545 541 -79 3 2 2 15 541 545 71 70 -80 3 2 2 15 11 12 546 542 -81 3 2 2 15 542 546 547 543 -82 3 2 2 15 543 547 548 544 -83 3 2 2 15 544 548 549 545 -84 3 2 2 15 545 549 72 71 -85 3 2 2 15 12 13 550 546 -86 3 2 2 15 546 550 551 547 -87 3 2 2 15 547 551 552 548 -88 3 2 2 15 548 552 553 549 -89 3 2 2 15 549 553 73 72 -90 3 2 2 15 13 14 554 550 -91 3 2 2 15 550 554 555 551 -92 3 2 2 15 551 555 556 552 -93 3 2 2 15 552 556 557 553 -94 3 2 2 15 553 557 74 73 -95 3 2 2 15 14 15 558 554 -96 3 2 2 15 554 558 559 555 -97 3 2 2 15 555 559 560 556 -98 3 2 2 15 556 560 561 557 -99 3 2 2 15 557 561 75 74 -100 3 2 2 15 15 16 562 558 -101 3 2 2 15 558 562 563 559 -102 3 2 2 15 559 563 564 560 -103 3 2 2 15 560 564 565 561 -104 3 2 2 15 561 565 76 75 -105 3 2 2 15 16 17 566 562 -106 3 2 2 15 562 566 567 563 -107 3 2 2 15 563 567 568 564 -108 3 2 2 15 564 568 569 565 -109 3 2 2 15 565 569 77 76 -110 3 2 2 15 17 18 570 566 -111 3 2 2 15 566 570 571 567 -112 3 2 2 15 567 571 572 568 -113 3 2 2 15 568 572 573 569 -114 3 2 2 15 569 573 78 77 -115 3 2 2 15 18 19 574 570 -116 3 2 2 15 570 574 575 571 -117 3 2 2 15 571 575 576 572 -118 3 2 2 15 572 576 577 573 -119 3 2 2 15 573 577 79 78 -120 3 2 2 15 19 20 578 574 -121 3 2 2 15 574 578 579 575 -122 3 2 2 15 575 579 580 576 -123 3 2 2 15 576 580 581 577 -124 3 2 2 15 577 581 80 79 -125 3 2 2 15 20 21 582 578 -126 3 2 2 15 578 582 583 579 -127 3 2 2 15 579 583 584 580 -128 3 2 2 15 580 584 585 581 -129 3 2 2 15 581 585 81 80 -130 3 2 2 15 21 22 586 582 -131 3 2 2 15 582 586 587 583 -132 3 2 2 15 583 587 588 584 -133 3 2 2 15 584 588 589 585 -134 3 2 2 15 585 589 82 81 -135 3 2 2 15 22 23 590 586 -136 3 2 2 15 586 590 591 587 -137 3 2 2 15 587 591 592 588 -138 3 2 2 15 588 592 593 589 -139 3 2 2 15 589 593 83 82 -140 3 2 2 15 23 3 133 590 -141 3 2 2 15 590 133 134 591 -142 3 2 2 15 591 134 135 592 -143 3 2 2 15 592 135 136 593 -144 3 2 2 15 593 136 6 83 -145 3 2 2 19 3 24 594 133 -146 3 2 2 19 133 594 595 134 -147 3 2 2 19 134 595 596 135 -148 3 2 2 19 135 596 597 136 -149 3 2 2 19 136 597 84 6 -150 3 2 2 19 24 25 598 594 -151 3 2 2 19 594 598 599 595 -152 3 2 2 19 595 599 600 596 -153 3 2 2 19 596 600 601 597 -154 3 2 2 19 597 601 85 84 -155 3 2 2 19 25 26 602 598 -156 3 2 2 19 598 602 603 599 -157 3 2 2 19 599 603 604 600 -158 3 2 2 19 600 604 605 601 -159 3 2 2 19 601 605 86 85 -160 3 2 2 19 26 27 606 602 -161 3 2 2 19 602 606 607 603 -162 3 2 2 19 603 607 608 604 -163 3 2 2 19 604 608 609 605 -164 3 2 2 19 605 609 87 86 -165 3 2 2 19 27 28 610 606 -166 3 2 2 19 606 610 611 607 -167 3 2 2 19 607 611 612 608 -168 3 2 2 19 608 612 613 609 -169 3 2 2 19 609 613 88 87 -170 3 2 2 19 28 29 614 610 -171 3 2 2 19 610 614 615 611 -172 3 2 2 19 611 615 616 612 -173 3 2 2 19 612 616 617 613 -174 3 2 2 19 613 617 89 88 -175 3 2 2 19 29 30 618 614 -176 3 2 2 19 614 618 619 615 -177 3 2 2 19 615 619 620 616 -178 3 2 2 19 616 620 621 617 -179 3 2 2 19 617 621 90 89 -180 3 2 2 19 30 31 622 618 -181 3 2 2 19 618 622 623 619 -182 3 2 2 19 619 623 624 620 -183 3 2 2 19 620 624 625 621 -184 3 2 2 19 621 625 91 90 -185 3 2 2 19 31 32 626 622 -186 3 2 2 19 622 626 627 623 -187 3 2 2 19 623 627 628 624 -188 3 2 2 19 624 628 629 625 -189 3 2 2 19 625 629 92 91 -190 3 2 2 19 32 33 630 626 -191 3 2 2 19 626 630 631 627 -192 3 2 2 19 627 631 632 628 -193 3 2 2 19 628 632 633 629 -194 3 2 2 19 629 633 93 92 -195 3 2 2 19 33 34 634 630 -196 3 2 2 19 630 634 635 631 -197 3 2 2 19 631 635 636 632 -198 3 2 2 19 632 636 637 633 -199 3 2 2 19 633 637 94 93 -200 3 2 2 19 34 35 638 634 -201 3 2 2 19 634 638 639 635 -202 3 2 2 19 635 639 640 636 -203 3 2 2 19 636 640 641 637 -204 3 2 2 19 637 641 95 94 -205 3 2 2 19 35 36 642 638 -206 3 2 2 19 638 642 643 639 -207 3 2 2 19 639 643 644 640 -208 3 2 2 19 640 644 645 641 -209 3 2 2 19 641 645 96 95 -210 3 2 2 19 36 37 646 642 -211 3 2 2 19 642 646 647 643 -212 3 2 2 19 643 647 648 644 -213 3 2 2 19 644 648 649 645 -214 3 2 2 19 645 649 97 96 -215 3 2 2 19 37 38 650 646 -216 3 2 2 19 646 650 651 647 -217 3 2 2 19 647 651 652 648 -218 3 2 2 19 648 652 653 649 -219 3 2 2 19 649 653 98 97 -220 3 2 2 19 38 1 137 650 -221 3 2 2 19 650 137 138 651 -222 3 2 2 19 651 138 139 652 -223 3 2 2 19 652 139 140 653 -224 3 2 2 19 653 140 7 98 -225 3 2 2 23 1 39 654 137 -226 3 2 2 23 137 654 655 138 -227 3 2 2 23 138 655 656 139 -228 3 2 2 23 139 656 657 140 -229 3 2 2 23 140 657 99 7 -230 3 2 2 23 39 40 658 654 -231 3 2 2 23 654 658 659 655 -232 3 2 2 23 655 659 660 656 -233 3 2 2 23 656 660 661 657 -234 3 2 2 23 657 661 100 99 -235 3 2 2 23 40 41 662 658 -236 3 2 2 23 658 662 663 659 -237 3 2 2 23 659 663 664 660 -238 3 2 2 23 660 664 665 661 -239 3 2 2 23 661 665 101 100 -240 3 2 2 23 41 42 666 662 -241 3 2 2 23 662 666 667 663 -242 3 2 2 23 663 667 668 664 -243 3 2 2 23 664 668 669 665 -244 3 2 2 23 665 669 102 101 -245 3 2 2 23 42 43 670 666 -246 3 2 2 23 666 670 671 667 -247 3 2 2 23 667 671 672 668 -248 3 2 2 23 668 672 673 669 -249 3 2 2 23 669 673 103 102 -250 3 2 2 23 43 44 674 670 -251 3 2 2 23 670 674 675 671 -252 3 2 2 23 671 675 676 672 -253 3 2 2 23 672 676 677 673 -254 3 2 2 23 673 677 104 103 -255 3 2 2 23 44 45 678 674 -256 3 2 2 23 674 678 679 675 -257 3 2 2 23 675 679 680 676 -258 3 2 2 23 676 680 681 677 -259 3 2 2 23 677 681 105 104 -260 3 2 2 23 45 46 682 678 -261 3 2 2 23 678 682 683 679 -262 3 2 2 23 679 683 684 680 -263 3 2 2 23 680 684 685 681 -264 3 2 2 23 681 685 106 105 -265 3 2 2 23 46 47 686 682 -266 3 2 2 23 682 686 687 683 -267 3 2 2 23 683 687 688 684 -268 3 2 2 23 684 688 689 685 -269 3 2 2 23 685 689 107 106 -270 3 2 2 23 47 48 690 686 -271 3 2 2 23 686 690 691 687 -272 3 2 2 23 687 691 692 688 -273 3 2 2 23 688 692 693 689 -274 3 2 2 23 689 693 108 107 -275 3 2 2 23 48 49 694 690 -276 3 2 2 23 690 694 695 691 -277 3 2 2 23 691 695 696 692 -278 3 2 2 23 692 696 697 693 -279 3 2 2 23 693 697 109 108 -280 3 2 2 23 49 50 698 694 -281 3 2 2 23 694 698 699 695 -282 3 2 2 23 695 699 700 696 -283 3 2 2 23 696 700 701 697 -284 3 2 2 23 697 701 110 109 -285 3 2 2 23 50 51 702 698 -286 3 2 2 23 698 702 703 699 -287 3 2 2 23 699 703 704 700 -288 3 2 2 23 700 704 705 701 -289 3 2 2 23 701 705 111 110 -290 3 2 2 23 51 52 706 702 -291 3 2 2 23 702 706 707 703 -292 3 2 2 23 703 707 708 704 -293 3 2 2 23 704 708 709 705 -294 3 2 2 23 705 709 112 111 -295 3 2 2 23 52 53 710 706 -296 3 2 2 23 706 710 711 707 -297 3 2 2 23 707 711 712 708 -298 3 2 2 23 708 712 713 709 -299 3 2 2 23 709 713 113 112 -300 3 2 2 23 53 2 141 710 -301 3 2 2 23 710 141 142 711 -302 3 2 2 23 711 142 143 712 -303 3 2 2 23 712 143 144 713 -304 3 2 2 23 713 144 8 113 -305 3 2 2 27 2 54 714 141 -306 3 2 2 27 141 714 715 142 -307 3 2 2 27 142 715 716 143 -308 3 2 2 27 143 716 717 144 -309 3 2 2 27 144 717 114 8 -310 3 2 2 27 54 55 718 714 -311 3 2 2 27 714 718 719 715 -312 3 2 2 27 715 719 720 716 -313 3 2 2 27 716 720 721 717 -314 3 2 2 27 717 721 115 114 -315 3 2 2 27 55 56 722 718 -316 3 2 2 27 718 722 723 719 -317 3 2 2 27 719 723 724 720 -318 3 2 2 27 720 724 725 721 -319 3 2 2 27 721 725 116 115 -320 3 2 2 27 56 57 726 722 -321 3 2 2 27 722 726 727 723 -322 3 2 2 27 723 727 728 724 -323 3 2 2 27 724 728 729 725 -324 3 2 2 27 725 729 117 116 -325 3 2 2 27 57 58 730 726 -326 3 2 2 27 726 730 731 727 -327 3 2 2 27 727 731 732 728 -328 3 2 2 27 728 732 733 729 -329 3 2 2 27 729 733 118 117 -330 3 2 2 27 58 59 734 730 -331 3 2 2 27 730 734 735 731 -332 3 2 2 27 731 735 736 732 -333 3 2 2 27 732 736 737 733 -334 3 2 2 27 733 737 119 118 -335 3 2 2 27 59 60 738 734 -336 3 2 2 27 734 738 739 735 -337 3 2 2 27 735 739 740 736 -338 3 2 2 27 736 740 741 737 -339 3 2 2 27 737 741 120 119 -340 3 2 2 27 60 61 742 738 -341 3 2 2 27 738 742 743 739 -342 3 2 2 27 739 743 744 740 -343 3 2 2 27 740 744 745 741 -344 3 2 2 27 741 745 121 120 -345 3 2 2 27 61 62 746 742 -346 3 2 2 27 742 746 747 743 -347 3 2 2 27 743 747 748 744 -348 3 2 2 27 744 748 749 745 -349 3 2 2 27 745 749 122 121 -350 3 2 2 27 62 63 750 746 -351 3 2 2 27 746 750 751 747 -352 3 2 2 27 747 751 752 748 -353 3 2 2 27 748 752 753 749 -354 3 2 2 27 749 753 123 122 -355 3 2 2 27 63 64 754 750 -356 3 2 2 27 750 754 755 751 -357 3 2 2 27 751 755 756 752 -358 3 2 2 27 752 756 757 753 -359 3 2 2 27 753 757 124 123 -360 3 2 2 27 64 65 758 754 -361 3 2 2 27 754 758 759 755 -362 3 2 2 27 755 759 760 756 -363 3 2 2 27 756 760 761 757 -364 3 2 2 27 757 761 125 124 -365 3 2 2 27 65 66 762 758 -366 3 2 2 27 758 762 763 759 -367 3 2 2 27 759 763 764 760 -368 3 2 2 27 760 764 765 761 -369 3 2 2 27 761 765 126 125 -370 3 2 2 27 66 67 766 762 -371 3 2 2 27 762 766 767 763 -372 3 2 2 27 763 767 768 764 -373 3 2 2 27 764 768 769 765 -374 3 2 2 27 765 769 127 126 -375 3 2 2 27 67 68 770 766 -376 3 2 2 27 766 770 771 767 -377 3 2 2 27 767 771 772 768 -378 3 2 2 27 768 772 773 769 -379 3 2 2 27 769 773 128 127 -380 3 2 2 27 68 4 129 770 -381 3 2 2 27 770 129 130 771 -382 3 2 2 27 771 130 131 772 -383 3 2 2 27 772 131 132 773 -384 3 2 2 27 773 132 5 128 -385 3 2 3 28 1105 1026 785 931 -386 3 2 3 28 819 972 1017 939 -387 3 2 3 28 820 973 1018 937 -388 3 2 3 28 823 941 1021 791 -389 3 2 3 28 824 942 1022 792 -390 3 2 3 28 822 943 1020 975 -391 3 2 3 28 775 946 878 1032 -392 3 2 3 28 777 945 877 1031 -393 3 2 3 28 891 1127 800 958 -394 3 2 3 28 7 901 984 98 -395 3 2 3 28 8 902 985 113 -396 3 2 3 28 5 904 986 128 -397 3 2 3 28 872 1106 794 1056 -398 3 2 3 28 873 1107 795 1057 -399 3 2 3 28 871 1108 796 1058 -400 3 2 3 28 892 1142 799 959 -401 3 2 3 28 848 908 793 991 -402 3 2 3 28 794 937 838 951 -403 3 2 3 28 794 951 842 941 -404 3 2 3 28 795 952 843 942 -405 3 2 3 28 796 953 844 943 -406 3 2 3 28 879 947 910 813 -407 3 2 3 28 1147 815 913 948 -408 3 2 3 28 1094 820 1106 872 -409 3 2 3 28 1095 821 1107 873 -410 3 2 3 28 1116 875 1011 780 -411 3 2 3 28 1117 876 1012 781 -412 3 2 3 28 870 1092 979 818 -413 3 2 3 28 978 825 986 904 -414 3 2 3 28 946 811 959 878 -415 3 2 3 28 945 812 958 877 -416 3 2 3 28 869 1080 847 1051 -417 3 2 3 28 813 936 990 879 -418 3 2 3 28 815 915 1085 1015 -419 3 2 3 28 842 911 814 928 -420 3 2 3 28 852 954 798 1006 -421 3 2 3 28 958 800 1088 877 -422 3 2 3 28 959 799 1087 878 -423 3 2 3 28 954 852 1132 882 -424 3 2 3 28 947 879 994 776 -425 3 2 3 28 948 776 994 880 -426 3 2 3 28 990 817 994 879 -427 3 2 3 28 970 880 994 817 -428 3 2 3 28 1157 956 865 1100 -429 3 2 3 28 830 996 898 1065 -430 3 2 3 28 831 997 899 1066 -431 3 2 3 28 832 998 900 1067 -432 3 2 3 28 833 1068 893 999 -433 3 2 3 28 914 814 1005 917 -434 3 2 3 28 1030 818 883 971 -435 3 2 3 28 1134 884 972 819 -436 3 2 3 28 1135 885 973 820 -437 3 2 3 28 1136 886 974 821 -438 3 2 3 28 1137 822 975 887 -439 3 2 3 28 1074 845 1141 891 -440 3 2 3 28 1073 846 1072 892 -441 3 2 3 28 1013 783 1077 933 -442 3 2 3 28 883 818 979 1133 -443 3 2 3 28 1093 980 1134 819 -444 3 2 3 28 1094 981 1135 820 -445 3 2 3 28 1095 982 1136 821 -446 3 2 3 28 888 1138 984 823 -447 3 2 3 28 889 1139 985 824 -448 3 2 3 28 890 1140 986 825 -449 3 2 3 28 1052 801 1100 882 -450 3 2 3 28 1063 834 1040 888 -451 3 2 3 28 1064 835 1041 889 -452 3 2 3 28 1161 949 1113 782 -453 3 2 3 28 810 896 836 1054 -454 3 2 3 28 867 1013 828 968 -455 3 2 3 28 75 897 995 74 -456 3 2 3 28 90 898 996 89 -457 3 2 3 28 105 899 997 104 -458 3 2 3 28 120 900 998 119 -459 3 2 3 28 78 79 999 893 -460 3 2 3 28 93 94 1000 894 -461 3 2 3 28 108 109 1001 895 -462 3 2 3 28 123 124 1002 896 -463 3 2 3 28 1055 829 995 897 -464 3 2 3 28 906 946 1036 838 -465 3 2 3 28 905 945 1038 840 -466 3 2 3 28 1086 932 1071 784 -467 3 2 3 28 947 839 1019 910 -468 3 2 3 28 841 988 869 1003 -469 3 2 3 28 983 903 1058 822 -470 3 2 3 28 984 901 1056 823 -471 3 2 3 28 985 902 1057 824 -472 3 2 3 28 830 1059 972 884 -473 3 2 3 28 831 1060 973 885 -474 3 2 3 28 832 1061 974 886 -475 3 2 3 28 833 887 975 1062 -476 3 2 3 28 823 791 1063 888 -477 3 2 3 28 824 792 1064 889 -478 3 2 3 28 1027 786 971 1151 -479 3 2 3 28 852 1006 1130 955 -480 3 2 3 28 1121 893 1068 807 -481 3 2 3 28 1000 1069 808 894 -482 3 2 3 28 1001 1070 809 895 -483 3 2 3 28 1065 898 1144 804 -484 3 2 3 28 1066 899 1145 805 -485 3 2 3 28 1067 900 1146 806 -486 3 2 3 28 1055 897 1143 803 -487 3 2 3 28 83 6 1049 903 -488 3 2 3 28 1058 903 1049 871 -489 3 2 3 28 1056 901 1047 872 -490 3 2 3 28 1057 902 1048 873 -491 3 2 3 28 816 1004 1086 934 -492 3 2 3 28 977 828 1013 933 -493 3 2 3 28 945 905 1023 812 -494 3 2 3 28 946 906 1024 811 -495 3 2 3 28 1017 787 1097 905 -496 3 2 3 28 1018 788 1096 906 -497 3 2 3 28 944 847 1080 907 -498 3 2 3 28 1052 909 969 801 -499 3 2 3 28 810 949 1161 1156 -500 3 2 3 28 936 813 1014 930 -501 3 2 3 28 785 918 1147 970 -502 3 2 3 28 1080 786 1027 907 -503 3 2 3 28 803 1162 944 907 -504 3 2 3 28 881 1091 802 1149 -505 3 2 3 28 931 817 990 957 -506 3 2 3 28 814 1025 1090 928 -507 3 2 3 28 859 992 828 977 -508 3 2 3 28 1007 919 1065 804 -509 3 2 3 28 1008 920 1066 805 -510 3 2 3 28 1009 921 1067 806 -511 3 2 3 28 1118 807 1068 922 -512 3 2 3 28 1119 808 1069 923 -513 3 2 3 28 1120 809 1070 924 -514 3 2 3 28 817 931 785 970 -515 3 2 3 28 1019 789 1111 910 -516 3 2 3 28 1022 913 1112 792 -517 3 2 3 28 893 960 77 78 -518 3 2 3 28 894 961 92 93 -519 3 2 3 28 895 962 107 108 -520 3 2 3 28 896 963 122 123 -521 3 2 3 28 1153 1118 1010 874 -522 3 2 3 28 913 843 1098 948 -523 3 2 3 28 930 1014 855 1110 -524 3 2 3 28 864 1016 837 1082 -525 3 2 3 28 848 991 837 969 -526 3 2 3 28 1052 851 1115 909 -527 3 2 3 28 969 909 1113 848 -528 3 2 3 28 949 810 1054 908 -529 3 2 3 28 917 845 1075 914 -530 3 2 3 28 918 846 1076 915 -531 3 2 3 28 808 1122 961 894 -532 3 2 3 28 809 1123 962 895 -533 3 2 3 28 810 1124 963 896 -534 3 2 3 28 1003 778 1016 916 -535 3 2 3 28 806 1156 1161 1009 -536 3 2 3 28 1030 940 1109 818 -537 3 2 3 28 871 819 939 1108 -538 3 2 3 28 974 938 1107 821 -539 3 2 3 28 929 844 1079 912 -540 3 2 3 28 934 925 1034 816 -541 3 2 3 28 784 866 993 1084 -542 3 2 3 28 1076 781 1085 915 -543 3 2 3 28 845 917 783 1141 -544 3 2 3 28 846 918 785 1072 -545 3 2 3 28 1075 780 1129 914 -546 3 2 3 28 1003 916 1131 841 -547 3 2 3 28 1008 854 1096 920 -548 3 2 3 28 1007 853 1097 919 -549 3 2 3 28 1016 864 1131 916 -550 3 2 3 28 892 1072 785 1026 -551 3 2 3 28 868 1006 798 1035 -552 3 2 3 28 993 802 1051 935 -553 3 2 3 28 1082 793 976 1081 -554 3 2 3 28 1089 856 1118 922 -555 3 2 3 28 1090 857 1119 923 -556 3 2 3 28 69 1092 870 1050 -557 3 2 3 28 819 871 1049 1093 -558 3 2 3 28 99 1094 872 1047 -559 3 2 3 28 114 1095 873 1048 -560 3 2 3 28 1077 850 1087 933 -561 3 2 3 28 1086 849 1088 932 -562 3 2 3 28 977 933 1087 799 -563 3 2 3 28 1028 932 1088 800 -564 3 2 3 28 904 1099 797 978 -565 3 2 3 28 1120 924 1112 858 -566 3 2 3 28 911 842 951 1078 -567 3 2 3 28 839 947 776 1037 -568 3 2 3 28 903 983 82 83 -569 3 2 3 28 915 815 1147 918 -570 3 2 3 28 1024 854 1117 927 -571 3 2 3 28 1023 853 1116 926 -572 3 2 3 28 912 816 1034 929 -573 3 2 3 28 1005 1077 783 917 -574 3 2 3 28 1097 787 1059 919 -575 3 2 3 28 1096 788 1060 920 -576 3 2 3 28 1111 789 1061 921 -577 3 2 3 28 1065 919 1059 830 -578 3 2 3 28 1066 920 1060 831 -579 3 2 3 28 1067 921 1061 832 -580 3 2 3 28 1089 922 1062 790 -581 3 2 3 28 1090 923 1063 791 -582 3 2 3 28 1112 924 1064 792 -583 3 2 3 28 1068 833 1062 922 -584 3 2 3 28 1069 834 1063 923 -585 3 2 3 28 1070 835 1064 924 -586 3 2 3 28 905 840 939 1017 -587 3 2 3 28 906 838 937 1018 -588 3 2 3 28 974 1019 839 938 -589 3 2 3 28 928 1021 941 842 -590 3 2 3 28 913 1022 942 843 -591 3 2 3 28 929 1020 943 844 -592 3 2 3 28 936 930 1115 851 -593 3 2 3 28 797 940 841 1131 -594 3 2 3 28 934 1084 1125 925 -595 3 2 3 28 1160 925 1125 779 -596 3 2 3 28 1023 926 1074 812 -597 3 2 3 28 1024 927 1073 811 -598 3 2 3 28 1117 781 1076 927 -599 3 2 3 28 1116 780 1075 926 -600 3 2 3 28 936 1083 957 990 -601 3 2 3 28 798 954 865 1126 -602 3 2 3 28 1028 827 1071 932 -603 3 2 3 28 1020 929 1089 790 -604 3 2 3 28 1021 928 1090 791 -605 3 2 3 28 1115 930 1110 782 -606 3 2 3 28 957 826 1105 931 -607 3 2 3 28 892 959 811 1073 -608 3 2 3 28 891 958 812 1074 -609 3 2 3 28 1084 934 1086 784 -610 3 2 3 28 1051 847 1114 935 -611 3 2 3 28 948 880 970 1147 -612 3 2 3 28 993 935 1125 1084 -613 3 2 3 28 836 1042 890 1152 -614 3 2 3 28 887 1039 80 81 -615 3 2 3 28 888 1040 95 96 -616 3 2 3 28 889 1041 110 111 -617 3 2 3 28 890 1042 125 126 -618 3 2 3 28 883 72 73 1043 -619 3 2 3 28 884 87 88 1044 -620 3 2 3 28 885 102 103 1045 -621 3 2 3 28 886 117 118 1046 -622 3 2 3 28 823 1056 794 941 -623 3 2 3 28 824 1057 795 942 -624 3 2 3 28 822 1058 796 943 -625 3 2 3 28 75 964 1143 897 -626 3 2 3 28 90 965 1144 898 -627 3 2 3 28 105 966 1145 899 -628 3 2 3 28 120 967 1146 900 -629 3 2 3 28 774 968 828 992 -630 3 2 3 28 870 1099 904 1050 -631 3 2 3 28 1151 1043 995 829 -632 3 2 3 28 884 1044 996 830 -633 3 2 3 28 885 1045 997 831 -634 3 2 3 28 886 1046 998 832 -635 3 2 3 28 887 833 999 1039 -636 3 2 3 28 1069 1000 1040 834 -637 3 2 3 28 1070 1001 1041 835 -638 3 2 3 28 896 1002 1042 836 -639 3 2 3 28 908 848 1113 949 -640 3 2 3 28 912 1079 777 1159 -641 3 2 3 28 911 1078 775 1158 -642 3 2 3 28 778 956 837 1016 -643 3 2 3 28 883 1133 71 72 -644 3 2 3 28 884 1134 86 87 -645 3 2 3 28 885 1135 101 102 -646 3 2 3 28 886 1136 116 117 -647 3 2 3 28 887 81 82 1137 -648 3 2 3 28 888 96 97 1138 -649 3 2 3 28 889 111 112 1139 -650 3 2 3 28 890 126 127 1140 -651 3 2 3 28 793 1053 1152 976 -652 3 2 3 28 778 1128 865 956 -653 3 2 3 28 820 937 794 1106 -654 3 2 3 28 952 795 1107 938 -655 3 2 3 28 953 796 1108 939 -656 3 2 3 28 921 1009 1110 855 -657 3 2 3 28 1033 860 1121 1153 -658 3 2 3 28 1003 869 1091 1150 -659 3 2 3 28 844 953 1038 1079 -660 3 2 3 28 868 1035 866 950 -661 3 2 3 28 901 7 99 1047 -662 3 2 3 28 902 8 114 1048 -663 3 2 3 28 1093 1049 6 84 -664 3 2 3 28 904 5 69 1050 -665 3 2 3 28 847 944 779 1114 -666 3 2 3 28 1010 944 1162 874 -667 3 2 3 28 940 1030 988 841 -668 3 2 3 28 1078 951 838 1036 -669 3 2 3 28 938 839 1037 952 -670 3 2 3 28 939 840 1038 953 -671 3 2 3 28 859 987 774 992 -672 3 2 3 28 866 784 1071 950 -673 3 2 3 28 875 1154 808 1119 -674 3 2 3 28 876 1155 809 1120 -675 3 2 3 28 881 1126 865 1128 -676 3 2 3 28 75 76 1101 964 -677 3 2 3 28 90 91 1102 965 -678 3 2 3 28 105 106 1103 966 -679 3 2 3 28 120 121 1104 967 -680 3 2 3 28 960 860 964 1101 -681 3 2 3 28 813 910 1111 1014 -682 3 2 3 28 815 1015 1112 913 -683 3 2 3 28 1149 989 1126 881 -684 3 2 3 28 976 825 978 1081 -685 3 2 3 28 956 1157 969 837 -686 3 2 3 28 843 952 1037 1098 -687 3 2 3 28 803 907 1027 1055 -688 3 2 3 28 909 1115 782 1113 -689 3 2 3 28 882 1100 865 954 -690 3 2 3 28 960 1101 76 77 -691 3 2 3 28 961 1102 91 92 -692 3 2 3 28 962 1103 106 107 -693 3 2 3 28 963 1104 121 122 -694 3 2 3 28 1102 861 1144 965 -695 3 2 3 28 1103 862 1145 966 -696 3 2 3 28 1104 863 1146 967 -697 3 2 3 28 971 786 988 1030 -698 3 2 3 28 987 955 1130 774 -699 3 2 3 28 1017 972 1059 787 -700 3 2 3 28 1018 973 1060 788 -701 3 2 3 28 1019 974 1061 789 -702 3 2 3 28 1020 790 1062 975 -703 3 2 3 28 935 1114 779 1125 -704 3 2 3 28 1077 1005 1158 850 -705 3 2 3 28 1086 1004 1159 849 -706 3 2 3 28 893 1121 860 960 -707 3 2 3 28 1102 961 1122 861 -708 3 2 3 28 1103 962 1123 862 -709 3 2 3 28 1104 963 1124 863 -710 3 2 3 28 1082 1081 978 864 -711 3 2 3 28 797 1131 864 978 -712 3 2 3 28 79 80 1039 999 -713 3 2 3 28 94 95 1040 1000 -714 3 2 3 28 109 110 1041 1001 -715 3 2 3 28 124 125 1042 1002 -716 3 2 3 28 74 995 1043 73 -717 3 2 3 28 89 996 1044 88 -718 3 2 3 28 104 997 1045 103 -719 3 2 3 28 119 998 1046 118 -720 3 2 3 28 869 1051 802 1091 -721 3 2 3 28 1132 1083 1052 882 -722 3 2 3 28 793 908 1054 1053 -723 3 2 3 28 69 70 979 1092 -724 3 2 3 28 84 85 980 1093 -725 3 2 3 28 99 100 981 1094 -726 3 2 3 28 114 115 982 1095 -727 3 2 3 28 869 988 786 1080 -728 3 2 3 28 1029 1148 867 968 -729 3 2 3 28 955 987 1105 826 -730 3 2 3 28 845 1074 926 1075 -731 3 2 3 28 846 1073 927 1076 -732 3 2 3 28 793 1082 837 991 -733 3 2 3 28 1100 801 969 1157 -734 3 2 3 28 944 1010 1160 779 -735 3 2 3 28 955 826 1132 852 -736 3 2 3 28 1090 1025 1129 857 -737 3 2 3 28 859 977 799 1142 -738 3 2 3 28 1026 1105 987 859 -739 3 2 3 28 1043 1151 971 883 -740 3 2 3 28 825 976 1152 890 -741 3 2 3 28 70 71 1133 979 -742 3 2 3 28 85 86 1134 980 -743 3 2 3 28 100 101 1135 981 -744 3 2 3 28 115 116 1136 982 -745 3 2 3 28 822 1137 82 983 -746 3 2 3 28 98 984 1138 97 -747 3 2 3 28 113 985 1139 112 -748 3 2 3 28 128 986 1140 127 -749 3 2 3 28 781 1012 858 1085 -750 3 2 3 28 1035 798 1126 989 -751 3 2 3 28 925 1160 856 1034 -752 3 2 3 28 929 1034 856 1089 -753 3 2 3 28 957 1083 1132 826 -754 3 2 3 28 964 860 1033 1143 -755 3 2 3 28 1154 804 1144 861 -756 3 2 3 28 1155 805 1145 862 -757 3 2 3 28 948 1098 1037 776 -758 3 2 3 28 800 1127 867 1028 -759 3 2 3 28 906 1096 854 1024 -760 3 2 3 28 905 1097 853 1023 -761 3 2 3 28 946 775 1078 1036 -762 3 2 3 28 945 777 1079 1038 -763 3 2 3 28 1055 1027 1151 829 -764 3 2 3 28 921 855 1014 1111 -765 3 2 3 28 1085 858 1112 1015 -766 3 2 3 28 875 1116 853 1007 -767 3 2 3 28 876 1117 854 1008 -768 3 2 3 28 875 1119 857 1011 -769 3 2 3 28 876 1120 858 1012 -770 3 2 3 28 1006 868 1029 1130 -771 3 2 3 28 968 774 1130 1029 -772 3 2 3 28 878 1087 850 1032 -773 3 2 3 28 877 1088 849 1031 -774 3 2 3 28 1035 989 1149 866 -775 3 2 3 28 866 1149 802 993 -776 3 2 3 28 816 912 1159 1004 -777 3 2 3 28 814 911 1158 1005 -778 3 2 3 28 936 851 1052 1083 -779 3 2 3 28 783 1013 867 1141 -780 3 2 3 28 814 914 1129 1025 -781 3 2 3 28 859 1142 892 1026 -782 3 2 3 28 857 1129 780 1011 -783 3 2 3 28 818 1109 1099 870 -784 3 2 3 28 940 797 1099 1109 -785 3 2 3 28 950 1071 827 1148 -786 3 2 3 28 867 1148 827 1028 -787 3 2 3 28 1118 856 1160 1010 -788 3 2 3 28 1162 803 1143 1033 -789 3 2 3 28 863 1156 806 1146 -790 3 2 3 28 1162 1033 1153 874 -791 3 2 3 28 1007 804 1154 875 -792 3 2 3 28 1008 805 1155 876 -793 3 2 3 28 950 1148 1029 868 -794 3 2 3 28 849 1159 777 1031 -795 3 2 3 28 850 1158 775 1032 -796 3 2 3 28 1054 836 1152 1053 -797 3 2 3 28 1003 1150 1128 778 -798 3 2 3 28 1128 1150 1091 881 -799 3 2 3 28 1118 1153 1121 807 -800 3 2 3 28 861 1122 808 1154 -801 3 2 3 28 862 1123 809 1155 -802 3 2 3 28 863 1124 810 1156 -803 3 2 3 28 867 1127 891 1141 -804 3 2 3 28 1009 1161 782 1110 -805 5 2 1 1 156 397 476 302 1207 2171 2487 1791 -806 5 2 1 1 1207 2171 2487 1791 1208 2172 2488 1792 -807 5 2 1 1 1208 2172 2488 1792 1209 2173 2489 1793 -808 5 2 1 1 1209 2173 2489 1793 1210 2174 2490 1794 -809 5 2 1 1 1210 2174 2490 1794 785 1026 1105 931 -810 5 2 1 1 388 343 190 310 2135 1955 1343 1823 -811 5 2 1 1 2135 1955 1343 1823 2136 1956 1344 1824 -812 5 2 1 1 2136 1956 1344 1824 2137 1957 1345 1825 -813 5 2 1 1 2137 1957 1345 1825 2138 1958 1346 1826 -814 5 2 1 1 2138 1958 1346 1826 1017 972 819 939 -815 5 2 1 1 389 344 191 308 2139 1959 1347 1815 -816 5 2 1 1 2139 1959 1347 1815 2140 1960 1348 1816 -817 5 2 1 1 2140 1960 1348 1816 2141 1961 1349 1817 -818 5 2 1 1 2141 1961 1349 1817 2142 1962 1350 1818 -819 5 2 1 1 2142 1962 1350 1818 1018 973 820 937 -820 5 2 1 1 392 312 194 162 2151 1831 1359 1231 -821 5 2 1 1 2151 1831 1359 1231 2152 1832 1360 1232 -822 5 2 1 1 2152 1832 1360 1232 2153 1833 1361 1233 -823 5 2 1 1 2153 1833 1361 1233 2154 1834 1362 1234 -824 5 2 1 1 2154 1834 1362 1234 1021 941 823 791 -825 5 2 1 1 393 313 195 163 2155 1835 1363 1235 -826 5 2 1 1 2155 1835 1363 1235 2156 1836 1364 1236 -827 5 2 1 1 2156 1836 1364 1236 2157 1837 1365 1237 -828 5 2 1 1 2157 1837 1365 1237 2158 1838 1366 1238 -829 5 2 1 1 2158 1838 1366 1238 1022 942 824 792 -830 5 2 1 1 391 314 193 346 2147 1839 1355 1967 -831 5 2 1 1 2147 1839 1355 1967 2148 1840 1356 1968 -832 5 2 1 1 2148 1840 1356 1968 2149 1841 1357 1969 -833 5 2 1 1 2149 1841 1357 1969 2150 1842 1358 1970 -834 5 2 1 1 2150 1842 1358 1970 1020 943 822 975 -835 5 2 1 1 249 317 146 403 1579 1851 1167 2195 -836 5 2 1 1 1579 1851 1167 2195 1580 1852 1168 2196 -837 5 2 1 1 1580 1852 1168 2196 1581 1853 1169 2197 -838 5 2 1 1 1581 1853 1169 2197 1582 1854 1170 2198 -839 5 2 1 1 1582 1854 1170 2198 878 946 775 1032 -840 5 2 1 1 248 316 148 402 1575 1847 1175 2191 -841 5 2 1 1 1575 1847 1175 2191 1576 1848 1176 2192 -842 5 2 1 1 1576 1848 1176 2192 1577 1849 1177 2193 -843 5 2 1 1 1577 1849 1177 2193 1578 1850 1178 2194 -844 5 2 1 1 1578 1850 1178 2194 877 945 777 1031 -845 5 2 1 1 171 498 262 329 1267 2575 1631 1899 -846 5 2 1 1 1267 2575 1631 1899 1268 2576 1632 1900 -847 5 2 1 1 1268 2576 1632 1900 1269 2577 1633 1901 -848 5 2 1 1 1269 2577 1633 1901 1270 2578 1634 1902 -849 5 2 1 1 1270 2578 1634 1902 800 1127 891 958 -850 5 2 1 1 355 272 1 38 2003 1671 137 650 -851 5 2 1 1 2003 1671 137 650 2004 1672 138 651 -852 5 2 1 1 2004 1672 138 651 2005 1673 139 652 -853 5 2 1 1 2005 1673 139 652 2006 1674 140 653 -854 5 2 1 1 2006 1674 140 653 984 901 7 98 -855 5 2 1 1 356 273 2 53 2007 1675 141 710 -856 5 2 1 1 2007 1675 141 710 2008 1676 142 711 -857 5 2 1 1 2008 1676 142 711 2009 1677 143 712 -858 5 2 1 1 2009 1677 143 712 2010 1678 144 713 -859 5 2 1 1 2010 1678 144 713 985 902 8 113 -860 5 2 1 1 357 275 4 68 2011 1683 129 770 -861 5 2 1 1 2011 1683 129 770 2012 1684 130 771 -862 5 2 1 1 2012 1684 130 771 2013 1685 131 772 -863 5 2 1 1 2013 1685 131 772 2014 1686 132 773 -864 5 2 1 1 2014 1686 132 773 986 904 5 128 -865 5 2 1 1 165 477 243 427 1243 2491 1555 2291 -866 5 2 1 1 1243 2491 1555 2291 1244 2492 1556 2292 -867 5 2 1 1 1244 2492 1556 2292 1245 2493 1557 2293 -868 5 2 1 1 1245 2493 1557 2293 1246 2494 1558 2294 -869 5 2 1 1 1246 2494 1558 2294 794 1106 872 1056 -870 5 2 1 1 166 478 244 428 1247 2495 1559 2295 -871 5 2 1 1 1247 2495 1559 2295 1248 2496 1560 2296 -872 5 2 1 1 1248 2496 1560 2296 1249 2497 1561 2297 -873 5 2 1 1 1249 2497 1561 2297 1250 2498 1562 2298 -874 5 2 1 1 1250 2498 1562 2298 795 1107 873 1057 -875 5 2 1 1 167 479 242 429 1251 2499 1551 2299 -876 5 2 1 1 1251 2499 1551 2299 1252 2500 1552 2300 -877 5 2 1 1 1252 2500 1552 2300 1253 2501 1553 2301 -878 5 2 1 1 1253 2501 1553 2301 1254 2502 1554 2302 -879 5 2 1 1 1254 2502 1554 2302 796 1108 871 1058 -880 5 2 1 1 170 513 263 330 1263 2635 1635 1903 -881 5 2 1 1 1263 2635 1635 1903 1264 2636 1636 1904 -882 5 2 1 1 1264 2636 1636 1904 1265 2637 1637 1905 -883 5 2 1 1 1265 2637 1637 1905 1266 2638 1638 1906 -884 5 2 1 1 1266 2638 1638 1906 799 1142 892 959 -885 5 2 1 1 164 279 219 362 1239 1699 1459 2031 -886 5 2 1 1 1239 1699 1459 2031 1240 1700 1460 2032 -887 5 2 1 1 1240 1700 1460 2032 1241 1701 1461 2033 -888 5 2 1 1 1241 1701 1461 2033 1242 1702 1462 2034 -889 5 2 1 1 1242 1702 1462 2034 793 908 848 991 -890 5 2 1 1 209 308 165 322 1419 1815 1243 1871 -891 5 2 1 1 1419 1815 1243 1871 1420 1816 1244 1872 -892 5 2 1 1 1420 1816 1244 1872 1421 1817 1245 1873 -893 5 2 1 1 1421 1817 1245 1873 1422 1818 1246 1874 -894 5 2 1 1 1422 1818 1246 1874 838 937 794 951 -895 5 2 1 1 213 322 165 312 1435 1871 1243 1831 -896 5 2 1 1 1435 1871 1243 1831 1436 1872 1244 1832 -897 5 2 1 1 1436 1872 1244 1832 1437 1873 1245 1833 -898 5 2 1 1 1437 1873 1245 1833 1438 1874 1246 1834 -899 5 2 1 1 1438 1874 1246 1834 842 951 794 941 -900 5 2 1 1 214 323 166 313 1439 1875 1247 1835 -901 5 2 1 1 1439 1875 1247 1835 1440 1876 1248 1836 -902 5 2 1 1 1440 1876 1248 1836 1441 1877 1249 1837 -903 5 2 1 1 1441 1877 1249 1837 1442 1878 1250 1838 -904 5 2 1 1 1442 1878 1250 1838 843 952 795 942 -905 5 2 1 1 215 324 167 314 1443 1879 1251 1839 -906 5 2 1 1 1443 1879 1251 1839 1444 1880 1252 1840 -907 5 2 1 1 1444 1880 1252 1840 1445 1881 1253 1841 -908 5 2 1 1 1445 1881 1253 1841 1446 1882 1254 1842 -909 5 2 1 1 1446 1882 1254 1842 844 953 796 943 -910 5 2 1 1 281 318 250 184 1707 1855 1583 1319 -911 5 2 1 1 1707 1855 1583 1319 1708 1856 1584 1320 -912 5 2 1 1 1708 1856 1584 1320 1709 1857 1585 1321 -913 5 2 1 1 1709 1857 1585 1321 1710 1858 1586 1322 -914 5 2 1 1 1710 1858 1586 1322 910 947 879 813 -915 5 2 1 1 284 186 518 319 1719 1327 2655 1859 -916 5 2 1 1 1719 1327 2655 1859 1720 1328 2656 1860 -917 5 2 1 1 1720 1328 2656 1860 1721 1329 2657 1861 -918 5 2 1 1 1721 1329 2657 1861 1722 1330 2658 1862 -919 5 2 1 1 1722 1330 2658 1862 913 815 1147 948 -920 5 2 1 1 477 191 465 243 2491 1347 2443 1555 -921 5 2 1 1 2491 1347 2443 1555 2492 1348 2444 1556 -922 5 2 1 1 2492 1348 2444 1556 2493 1349 2445 1557 -923 5 2 1 1 2493 1349 2445 1557 2494 1350 2446 1558 -924 5 2 1 1 2494 1350 2446 1558 1106 820 1094 872 -925 5 2 1 1 478 192 466 244 2495 1351 2447 1559 -926 5 2 1 1 2495 1351 2447 1559 2496 1352 2448 1560 -927 5 2 1 1 2496 1352 2448 1560 2497 1353 2449 1561 -928 5 2 1 1 2497 1353 2449 1561 2498 1354 2450 1562 -929 5 2 1 1 2498 1354 2450 1562 1107 821 1095 873 -930 5 2 1 1 382 246 487 151 2111 1567 2531 1187 -931 5 2 1 1 2111 1567 2531 1187 2112 1568 2532 1188 -932 5 2 1 1 2112 1568 2532 1188 2113 1569 2533 1189 -933 5 2 1 1 2113 1569 2533 1189 2114 1570 2534 1190 -934 5 2 1 1 2114 1570 2534 1190 1011 875 1116 780 -935 5 2 1 1 383 247 488 152 2115 1571 2535 1191 -936 5 2 1 1 2115 1571 2535 1191 2116 1572 2536 1192 -937 5 2 1 1 2116 1572 2536 1192 2117 1573 2537 1193 -938 5 2 1 1 2117 1573 2537 1193 2118 1574 2538 1194 -939 5 2 1 1 2118 1574 2538 1194 1012 876 1117 781 -940 5 2 1 1 350 463 241 189 1983 2435 1547 1339 -941 5 2 1 1 1983 2435 1547 1339 1984 2436 1548 1340 -942 5 2 1 1 1984 2436 1548 1340 1985 2437 1549 1341 -943 5 2 1 1 1985 2437 1549 1341 1986 2438 1550 1342 -944 5 2 1 1 1986 2438 1550 1342 979 1092 870 818 -945 5 2 1 1 357 196 349 275 2011 1367 1979 1683 -946 5 2 1 1 2011 1367 1979 1683 2012 1368 1980 1684 -947 5 2 1 1 2012 1368 1980 1684 2013 1369 1981 1685 -948 5 2 1 1 2013 1369 1981 1685 2014 1370 1982 1686 -949 5 2 1 1 2014 1370 1982 1686 986 825 978 904 -950 5 2 1 1 330 182 317 249 1903 1311 1851 1579 -951 5 2 1 1 1903 1311 1851 1579 1904 1312 1852 1580 -952 5 2 1 1 1904 1312 1852 1580 1905 1313 1853 1581 -953 5 2 1 1 1905 1313 1853 1581 1906 1314 1854 1582 -954 5 2 1 1 1906 1314 1854 1582 959 811 946 878 -955 5 2 1 1 329 183 316 248 1899 1315 1847 1575 -956 5 2 1 1 1899 1315 1847 1575 1900 1316 1848 1576 -957 5 2 1 1 1900 1316 1848 1576 1901 1317 1849 1577 -958 5 2 1 1 1901 1317 1849 1577 1902 1318 1850 1578 -959 5 2 1 1 1902 1318 1850 1578 958 812 945 877 -960 5 2 1 1 218 451 240 422 1455 2387 1543 2271 -961 5 2 1 1 1455 2387 1543 2271 1456 2388 1544 2272 -962 5 2 1 1 1456 2388 1544 2272 1457 2389 1545 2273 -963 5 2 1 1 1457 2389 1545 2273 1458 2390 1546 2274 -964 5 2 1 1 1458 2390 1546 2274 847 1080 869 1051 -965 5 2 1 1 361 307 184 250 2027 1811 1319 1583 -966 5 2 1 1 2027 1811 1319 1583 2028 1812 1320 1584 -967 5 2 1 1 2028 1812 1320 1584 2029 1813 1321 1585 -968 5 2 1 1 2029 1813 1321 1585 2030 1814 1322 1586 -969 5 2 1 1 2030 1814 1322 1586 990 936 813 879 -970 5 2 1 1 456 286 186 386 2407 1727 1327 2127 -971 5 2 1 1 2407 1727 1327 2127 2408 1728 1328 2128 -972 5 2 1 1 2408 1728 1328 2128 2409 1729 1329 2129 -973 5 2 1 1 2409 1729 1329 2129 2410 1730 1330 2130 -974 5 2 1 1 2410 1730 1330 2130 1085 915 815 1015 -975 5 2 1 1 185 282 213 299 1323 1711 1435 1779 -976 5 2 1 1 1323 1711 1435 1779 1324 1712 1436 1780 -977 5 2 1 1 1324 1712 1436 1780 1325 1713 1437 1781 -978 5 2 1 1 1325 1713 1437 1781 1326 1714 1438 1782 -979 5 2 1 1 1326 1714 1438 1782 814 911 842 928 -980 5 2 1 1 169 325 223 377 1259 1883 1475 2091 -981 5 2 1 1 1259 1883 1475 2091 1260 1884 1476 2092 -982 5 2 1 1 1260 1884 1476 2092 1261 1885 1477 2093 -983 5 2 1 1 1261 1885 1477 2093 1262 1886 1478 2094 -984 5 2 1 1 1262 1886 1478 2094 798 954 852 1006 -985 5 2 1 1 459 171 329 248 2419 1267 1899 1575 -986 5 2 1 1 2419 1267 1899 1575 2420 1268 1900 1576 -987 5 2 1 1 2420 1268 1900 1576 2421 1269 1901 1577 -988 5 2 1 1 2421 1269 1901 1577 2422 1270 1902 1578 -989 5 2 1 1 2422 1270 1902 1578 1088 800 958 877 -990 5 2 1 1 458 170 330 249 2415 1263 1903 1579 -991 5 2 1 1 2415 1263 1903 1579 2416 1264 1904 1580 -992 5 2 1 1 2416 1264 1904 1580 2417 1265 1905 1581 -993 5 2 1 1 2417 1265 1905 1581 2418 1266 1906 1582 -994 5 2 1 1 2418 1266 1906 1582 1087 799 959 878 -995 5 2 1 1 503 223 325 253 2595 1475 1883 1595 -996 5 2 1 1 2595 1475 1883 1595 2596 1476 1884 1596 -997 5 2 1 1 2596 1476 1884 1596 2597 1477 1885 1597 -998 5 2 1 1 2597 1477 1885 1597 2598 1478 1886 1598 -999 5 2 1 1 2598 1478 1886 1598 1132 852 954 882 -1000 5 2 1 1 365 250 318 147 2043 1583 1855 1171 -1001 5 2 1 1 2043 1583 1855 1171 2044 1584 1856 1172 -1002 5 2 1 1 2044 1584 1856 1172 2045 1585 1857 1173 -1003 5 2 1 1 2045 1585 1857 1173 2046 1586 1858 1174 -1004 5 2 1 1 2046 1586 1858 1174 994 879 947 776 -1005 5 2 1 1 365 147 319 251 2043 1171 1859 1587 -1006 5 2 1 1 2043 1171 1859 1587 2044 1172 1860 1588 -1007 5 2 1 1 2044 1172 1860 1588 2045 1173 1861 1589 -1008 5 2 1 1 2045 1173 1861 1589 2046 1174 1862 1590 -1009 5 2 1 1 2046 1174 1862 1590 994 776 948 880 -1010 5 2 1 1 365 188 361 250 2043 1335 2027 1583 -1011 5 2 1 1 2043 1335 2027 1583 2044 1336 2028 1584 -1012 5 2 1 1 2044 1336 2028 1584 2045 1337 2029 1585 -1013 5 2 1 1 2045 1337 2029 1585 2046 1338 2030 1586 -1014 5 2 1 1 2046 1338 2030 1586 994 817 990 879 -1015 5 2 1 1 365 251 341 188 2043 1587 1947 1335 -1016 5 2 1 1 2043 1587 1947 1335 2044 1588 1948 1336 -1017 5 2 1 1 2044 1588 1948 1336 2045 1589 1949 1337 -1018 5 2 1 1 2045 1589 1949 1337 2046 1590 1950 1338 -1019 5 2 1 1 2046 1590 1950 1338 994 880 970 817 -1020 5 2 1 1 236 327 528 471 1527 1891 2695 2467 -1021 5 2 1 1 1527 1891 2695 2467 1528 1892 2696 2468 -1022 5 2 1 1 1528 1892 2696 2468 1529 1893 2697 2469 -1023 5 2 1 1 1529 1893 2697 2469 1530 1894 2698 2470 -1024 5 2 1 1 1530 1894 2698 2470 865 956 1157 1100 -1025 5 2 1 1 269 367 201 436 1659 2051 1387 2327 -1026 5 2 1 1 1659 2051 1387 2327 1660 2052 1388 2328 -1027 5 2 1 1 1660 2052 1388 2328 1661 2053 1389 2329 -1028 5 2 1 1 1661 2053 1389 2329 1662 2054 1390 2330 -1029 5 2 1 1 1662 2054 1390 2330 898 996 830 1065 -1030 5 2 1 1 270 368 202 437 1663 2055 1391 2331 -1031 5 2 1 1 1663 2055 1391 2331 1664 2056 1392 2332 -1032 5 2 1 1 1664 2056 1392 2332 1665 2057 1393 2333 -1033 5 2 1 1 1665 2057 1393 2333 1666 2058 1394 2334 -1034 5 2 1 1 1666 2058 1394 2334 899 997 831 1066 -1035 5 2 1 1 271 369 203 438 1667 2059 1395 2335 -1036 5 2 1 1 1667 2059 1395 2335 1668 2060 1396 2336 -1037 5 2 1 1 1668 2060 1396 2336 1669 2061 1397 2337 -1038 5 2 1 1 1669 2061 1397 2337 1670 2062 1398 2338 -1039 5 2 1 1 1670 2062 1398 2338 900 998 832 1067 -1040 5 2 1 1 264 439 204 370 1639 2339 1399 2063 -1041 5 2 1 1 1639 2339 1399 2063 1640 2340 1400 2064 -1042 5 2 1 1 1640 2340 1400 2064 1641 2341 1401 2065 -1043 5 2 1 1 1641 2341 1401 2065 1642 2342 1402 2066 -1044 5 2 1 1 1642 2342 1402 2066 893 1068 833 999 -1045 5 2 1 1 376 185 285 288 2087 1323 1723 1735 -1046 5 2 1 1 2087 1323 1723 1735 2088 1324 1724 1736 -1047 5 2 1 1 2088 1324 1724 1736 2089 1325 1725 1737 -1048 5 2 1 1 2089 1325 1725 1737 2090 1326 1726 1738 -1049 5 2 1 1 2090 1326 1726 1738 1005 814 914 917 -1050 5 2 1 1 254 189 401 342 1599 1339 2187 1951 -1051 5 2 1 1 1599 1339 2187 1951 1600 1340 2188 1952 -1052 5 2 1 1 1600 1340 2188 1952 1601 1341 2189 1953 -1053 5 2 1 1 1601 1341 2189 1953 1602 1342 2190 1954 -1054 5 2 1 1 1602 1342 2190 1954 883 818 1030 971 -1055 5 2 1 1 343 255 505 190 1955 1603 2603 1343 -1056 5 2 1 1 1955 1603 2603 1343 1956 1604 2604 1344 -1057 5 2 1 1 1956 1604 2604 1344 1957 1605 2605 1345 -1058 5 2 1 1 1957 1605 2605 1345 1958 1606 2606 1346 -1059 5 2 1 1 1958 1606 2606 1346 972 884 1134 819 -1060 5 2 1 1 344 256 506 191 1959 1607 2607 1347 -1061 5 2 1 1 1959 1607 2607 1347 1960 1608 2608 1348 -1062 5 2 1 1 1960 1608 2608 1348 1961 1609 2609 1349 -1063 5 2 1 1 1961 1609 2609 1349 1962 1610 2610 1350 -1064 5 2 1 1 1962 1610 2610 1350 973 885 1135 820 -1065 5 2 1 1 345 257 507 192 1963 1611 2611 1351 -1066 5 2 1 1 1963 1611 2611 1351 1964 1612 2612 1352 -1067 5 2 1 1 1964 1612 2612 1352 1965 1613 2613 1353 -1068 5 2 1 1 1965 1613 2613 1353 1966 1614 2614 1354 -1069 5 2 1 1 1966 1614 2614 1354 974 886 1136 821 -1070 5 2 1 1 346 193 508 258 1967 1355 2615 1615 -1071 5 2 1 1 1967 1355 2615 1615 1968 1356 2616 1616 -1072 5 2 1 1 1968 1356 2616 1616 1969 1357 2617 1617 -1073 5 2 1 1 1969 1357 2617 1617 1970 1358 2618 1618 -1074 5 2 1 1 1970 1358 2618 1618 975 822 1137 887 -1075 5 2 1 1 512 216 445 262 2631 1447 2363 1631 -1076 5 2 1 1 2631 1447 2363 1631 2632 1448 2364 1632 -1077 5 2 1 1 2632 1448 2364 1632 2633 1449 2365 1633 -1078 5 2 1 1 2633 1449 2365 1633 2634 1450 2366 1634 -1079 5 2 1 1 2634 1450 2366 1634 1141 845 1074 891 -1080 5 2 1 1 443 217 444 263 2355 1451 2359 1635 -1081 5 2 1 1 2355 1451 2359 1635 2356 1452 2360 1636 -1082 5 2 1 1 2356 1452 2360 1636 2357 1453 2361 1637 -1083 5 2 1 1 2357 1453 2361 1637 2358 1454 2362 1638 -1084 5 2 1 1 2358 1454 2362 1638 1072 846 1073 892 -1085 5 2 1 1 448 154 384 304 2375 1199 2119 1799 -1086 5 2 1 1 2375 1199 2119 1799 2376 1200 2120 1800 -1087 5 2 1 1 2376 1200 2120 1800 2377 1201 2121 1801 -1088 5 2 1 1 2377 1201 2121 1801 2378 1202 2122 1802 -1089 5 2 1 1 2378 1202 2122 1802 1077 783 1013 933 -1090 5 2 1 1 350 189 254 504 1983 1339 1599 2599 -1091 5 2 1 1 1983 1339 1599 2599 1984 1340 1600 2600 -1092 5 2 1 1 1984 1340 1600 2600 1985 1341 1601 2601 -1093 5 2 1 1 1985 1341 1601 2601 1986 1342 1602 2602 -1094 5 2 1 1 1986 1342 1602 2602 979 818 883 1133 -1095 5 2 1 1 505 351 464 190 2603 1987 2439 1343 -1096 5 2 1 1 2603 1987 2439 1343 2604 1988 2440 1344 -1097 5 2 1 1 2604 1988 2440 1344 2605 1989 2441 1345 -1098 5 2 1 1 2605 1989 2441 1345 2606 1990 2442 1346 -1099 5 2 1 1 2606 1990 2442 1346 1134 980 1093 819 -1100 5 2 1 1 506 352 465 191 2607 1991 2443 1347 -1101 5 2 1 1 2607 1991 2443 1347 2608 1992 2444 1348 -1102 5 2 1 1 2608 1992 2444 1348 2609 1993 2445 1349 -1103 5 2 1 1 2609 1993 2445 1349 2610 1994 2446 1350 -1104 5 2 1 1 2610 1994 2446 1350 1135 981 1094 820 -1105 5 2 1 1 507 353 466 192 2611 1995 2447 1351 -1106 5 2 1 1 2611 1995 2447 1351 2612 1996 2448 1352 -1107 5 2 1 1 2612 1996 2448 1352 2613 1997 2449 1353 -1108 5 2 1 1 2613 1997 2449 1353 2614 1998 2450 1354 -1109 5 2 1 1 2614 1998 2450 1354 1136 982 1095 821 -1110 5 2 1 1 355 509 259 194 2003 2619 1619 1359 -1111 5 2 1 1 2003 2619 1619 1359 2004 2620 1620 1360 -1112 5 2 1 1 2004 2620 1620 1360 2005 2621 1621 1361 -1113 5 2 1 1 2005 2621 1621 1361 2006 2622 1622 1362 -1114 5 2 1 1 2006 2622 1622 1362 984 1138 888 823 -1115 5 2 1 1 356 510 260 195 2007 2623 1623 1363 -1116 5 2 1 1 2007 2623 1623 1363 2008 2624 1624 1364 -1117 5 2 1 1 2008 2624 1624 1364 2009 2625 1625 1365 -1118 5 2 1 1 2009 2625 1625 1365 2010 2626 1626 1366 -1119 5 2 1 1 2010 2626 1626 1366 985 1139 889 824 -1120 5 2 1 1 357 511 261 196 2011 2627 1627 1367 -1121 5 2 1 1 2011 2627 1627 1367 2012 2628 1628 1368 -1122 5 2 1 1 2012 2628 1628 1368 2013 2629 1629 1369 -1123 5 2 1 1 2013 2629 1629 1369 2014 2630 1630 1370 -1124 5 2 1 1 2014 2630 1630 1370 986 1140 890 825 -1125 5 2 1 1 471 172 423 253 2467 1271 2275 1595 -1126 5 2 1 1 2467 1271 2275 1595 2468 1272 2276 1596 -1127 5 2 1 1 2468 1272 2276 1596 2469 1273 2277 1597 -1128 5 2 1 1 2469 1273 2277 1597 2470 1274 2278 1598 -1129 5 2 1 1 2470 1274 2278 1598 1100 801 1052 882 -1130 5 2 1 1 411 205 434 259 2227 1403 2319 1619 -1131 5 2 1 1 2227 1403 2319 1619 2228 1404 2320 1620 -1132 5 2 1 1 2228 1404 2320 1620 2229 1405 2321 1621 -1133 5 2 1 1 2229 1405 2321 1621 2230 1406 2322 1622 -1134 5 2 1 1 2230 1406 2322 1622 1040 834 1063 888 -1135 5 2 1 1 412 206 435 260 2231 1407 2323 1623 -1136 5 2 1 1 2231 1407 2323 1623 2232 1408 2324 1624 -1137 5 2 1 1 2232 1408 2324 1624 2233 1409 2325 1625 -1138 5 2 1 1 2233 1409 2325 1625 2234 1410 2326 1626 -1139 5 2 1 1 2234 1410 2326 1626 1041 835 1064 889 -1140 5 2 1 1 484 320 532 153 2519 1863 2711 1195 -1141 5 2 1 1 2519 1863 2711 1195 2520 1864 2712 1196 -1142 5 2 1 1 2520 1864 2712 1196 2521 1865 2713 1197 -1143 5 2 1 1 2521 1865 2713 1197 2522 1866 2714 1198 -1144 5 2 1 1 2522 1866 2714 1198 1113 949 1161 782 -1145 5 2 1 1 207 267 181 425 1411 1651 1307 2283 -1146 5 2 1 1 1411 1651 1307 2283 1412 1652 1308 2284 -1147 5 2 1 1 1412 1652 1308 2284 1413 1653 1309 2285 -1148 5 2 1 1 1413 1653 1309 2285 1414 1654 1310 2286 -1149 5 2 1 1 1414 1654 1310 2286 836 896 810 1054 -1150 5 2 1 1 199 384 238 339 1379 2119 1535 1939 -1151 5 2 1 1 1379 2119 1535 1939 1380 2120 1536 1940 -1152 5 2 1 1 1380 2120 1536 1940 1381 2121 1537 1941 -1153 5 2 1 1 1381 2121 1537 1941 1382 2122 1538 1942 -1154 5 2 1 1 1382 2122 1538 1942 828 1013 867 968 -1155 5 2 1 1 366 268 15 14 2047 1655 558 554 -1156 5 2 1 1 2047 1655 558 554 2048 1656 559 555 -1157 5 2 1 1 2048 1656 559 555 2049 1657 560 556 -1158 5 2 1 1 2049 1657 560 556 2050 1658 561 557 -1159 5 2 1 1 2050 1658 561 557 995 897 75 74 -1160 5 2 1 1 367 269 30 29 2051 1659 618 614 -1161 5 2 1 1 2051 1659 618 614 2052 1660 619 615 -1162 5 2 1 1 2052 1660 619 615 2053 1661 620 616 -1163 5 2 1 1 2053 1661 620 616 2054 1662 621 617 -1164 5 2 1 1 2054 1662 621 617 996 898 90 89 -1165 5 2 1 1 368 270 45 44 2055 1663 678 674 -1166 5 2 1 1 2055 1663 678 674 2056 1664 679 675 -1167 5 2 1 1 2056 1664 679 675 2057 1665 680 676 -1168 5 2 1 1 2057 1665 680 676 2058 1666 681 677 -1169 5 2 1 1 2058 1666 681 677 997 899 105 104 -1170 5 2 1 1 369 271 60 59 2059 1667 738 734 -1171 5 2 1 1 2059 1667 738 734 2060 1668 739 735 -1172 5 2 1 1 2060 1668 739 735 2061 1669 740 736 -1173 5 2 1 1 2061 1669 740 736 2062 1670 741 737 -1174 5 2 1 1 2062 1670 741 737 998 900 120 119 -1175 5 2 1 1 370 19 18 264 2063 574 570 1639 -1176 5 2 1 1 2063 574 570 1639 2064 575 571 1640 -1177 5 2 1 1 2064 575 571 1640 2065 576 572 1641 -1178 5 2 1 1 2065 576 572 1641 2066 577 573 1642 -1179 5 2 1 1 2066 577 573 1642 999 79 78 893 -1180 5 2 1 1 371 34 33 265 2067 634 630 1643 -1181 5 2 1 1 2067 634 630 1643 2068 635 631 1644 -1182 5 2 1 1 2068 635 631 1644 2069 636 632 1645 -1183 5 2 1 1 2069 636 632 1645 2070 637 633 1646 -1184 5 2 1 1 2070 637 633 1646 1000 94 93 894 -1185 5 2 1 1 372 49 48 266 2071 694 690 1647 -1186 5 2 1 1 2071 694 690 1647 2072 695 691 1648 -1187 5 2 1 1 2072 695 691 1648 2073 696 692 1649 -1188 5 2 1 1 2073 696 692 1649 2074 697 693 1650 -1189 5 2 1 1 2074 697 693 1650 1001 109 108 895 -1190 5 2 1 1 373 64 63 267 2075 754 750 1651 -1191 5 2 1 1 2075 754 750 1651 2076 755 751 1652 -1192 5 2 1 1 2076 755 751 1652 2077 756 752 1653 -1193 5 2 1 1 2077 756 752 1653 2078 757 753 1654 -1194 5 2 1 1 2078 757 753 1654 1002 124 123 896 -1195 5 2 1 1 366 200 426 268 2047 1383 2287 1655 -1196 5 2 1 1 2047 1383 2287 1655 2048 1384 2288 1656 -1197 5 2 1 1 2048 1384 2288 1656 2049 1385 2289 1657 -1198 5 2 1 1 2049 1385 2289 1657 2050 1386 2290 1658 -1199 5 2 1 1 2050 1386 2290 1658 995 829 1055 897 -1200 5 2 1 1 407 317 277 209 2211 1851 1691 1419 -1201 5 2 1 1 2211 1851 1691 1419 2212 1852 1692 1420 -1202 5 2 1 1 2212 1852 1692 1420 2213 1853 1693 1421 -1203 5 2 1 1 2213 1853 1693 1421 2214 1854 1694 1422 -1204 5 2 1 1 2214 1854 1694 1422 1036 946 906 838 -1205 5 2 1 1 409 316 276 211 2219 1847 1687 1427 -1206 5 2 1 1 2219 1847 1687 1427 2220 1848 1688 1428 -1207 5 2 1 1 2220 1848 1688 1428 2221 1849 1689 1429 -1208 5 2 1 1 2221 1849 1689 1429 2222 1850 1690 1430 -1209 5 2 1 1 2222 1850 1690 1430 1038 945 905 840 -1210 5 2 1 1 442 303 457 155 2351 1795 2411 1203 -1211 5 2 1 1 2351 1795 2411 1203 2352 1796 2412 1204 -1212 5 2 1 1 2352 1796 2412 1204 2353 1797 2413 1205 -1213 5 2 1 1 2353 1797 2413 1205 2354 1798 2414 1206 -1214 5 2 1 1 2354 1798 2414 1206 1071 932 1086 784 -1215 5 2 1 1 390 210 318 281 2143 1423 1855 1707 -1216 5 2 1 1 2143 1423 1855 1707 2144 1424 1856 1708 -1217 5 2 1 1 2144 1424 1856 1708 2145 1425 1857 1709 -1218 5 2 1 1 2145 1425 1857 1709 2146 1426 1858 1710 -1219 5 2 1 1 2146 1426 1858 1710 1019 839 947 910 -1220 5 2 1 1 240 359 212 374 1543 2019 1431 2079 -1221 5 2 1 1 1543 2019 1431 2079 1544 2020 1432 2080 -1222 5 2 1 1 1544 2020 1432 2080 1545 2021 1433 2081 -1223 5 2 1 1 1545 2021 1433 2081 1546 2022 1434 2082 -1224 5 2 1 1 1546 2022 1434 2082 869 988 841 1003 -1225 5 2 1 1 429 274 354 193 2299 1679 1999 1355 -1226 5 2 1 1 2299 1679 1999 1355 2300 1680 2000 1356 -1227 5 2 1 1 2300 1680 2000 1356 2301 1681 2001 1357 -1228 5 2 1 1 2301 1681 2001 1357 2302 1682 2002 1358 -1229 5 2 1 1 2302 1682 2002 1358 1058 903 983 822 -1230 5 2 1 1 427 272 355 194 2291 1671 2003 1359 -1231 5 2 1 1 2291 1671 2003 1359 2292 1672 2004 1360 -1232 5 2 1 1 2292 1672 2004 1360 2293 1673 2005 1361 -1233 5 2 1 1 2293 1673 2005 1361 2294 1674 2006 1362 -1234 5 2 1 1 2294 1674 2006 1362 1056 901 984 823 -1235 5 2 1 1 428 273 356 195 2295 1675 2007 1363 -1236 5 2 1 1 2295 1675 2007 1363 2296 1676 2008 1364 -1237 5 2 1 1 2296 1676 2008 1364 2297 1677 2009 1365 -1238 5 2 1 1 2297 1677 2009 1365 2298 1678 2010 1366 -1239 5 2 1 1 2298 1678 2010 1366 1057 902 985 824 -1240 5 2 1 1 343 430 201 255 1955 2303 1387 1603 -1241 5 2 1 1 1955 2303 1387 1603 1956 2304 1388 1604 -1242 5 2 1 1 1956 2304 1388 1604 1957 2305 1389 1605 -1243 5 2 1 1 1957 2305 1389 1605 1958 2306 1390 1606 -1244 5 2 1 1 1958 2306 1390 1606 972 1059 830 884 -1245 5 2 1 1 344 431 202 256 1959 2307 1391 1607 -1246 5 2 1 1 1959 2307 1391 1607 1960 2308 1392 1608 -1247 5 2 1 1 1960 2308 1392 1608 1961 2309 1393 1609 -1248 5 2 1 1 1961 2309 1393 1609 1962 2310 1394 1610 -1249 5 2 1 1 1962 2310 1394 1610 973 1060 831 885 -1250 5 2 1 1 345 432 203 257 1963 2311 1395 1611 -1251 5 2 1 1 1963 2311 1395 1611 1964 2312 1396 1612 -1252 5 2 1 1 1964 2312 1396 1612 1965 2313 1397 1613 -1253 5 2 1 1 1965 2313 1397 1613 1966 2314 1398 1614 -1254 5 2 1 1 1966 2314 1398 1614 974 1061 832 886 -1255 5 2 1 1 346 258 204 433 1967 1615 1399 2315 -1256 5 2 1 1 1967 1615 1399 2315 1968 1616 1400 2316 -1257 5 2 1 1 1968 1616 1400 2316 1969 1617 1401 2317 -1258 5 2 1 1 1969 1617 1401 2317 1970 1618 1402 2318 -1259 5 2 1 1 1970 1618 1402 2318 975 887 833 1062 -1260 5 2 1 1 434 162 194 259 2319 1231 1359 1619 -1261 5 2 1 1 2319 1231 1359 1619 2320 1232 1360 1620 -1262 5 2 1 1 2320 1232 1360 1620 2321 1233 1361 1621 -1263 5 2 1 1 2321 1233 1361 1621 2322 1234 1362 1622 -1264 5 2 1 1 2322 1234 1362 1622 1063 791 823 888 -1265 5 2 1 1 435 163 195 260 2323 1235 1363 1623 -1266 5 2 1 1 2323 1235 1363 1623 2324 1236 1364 1624 -1267 5 2 1 1 2324 1236 1364 1624 2325 1237 1365 1625 -1268 5 2 1 1 2325 1237 1365 1625 2326 1238 1366 1626 -1269 5 2 1 1 2326 1238 1366 1626 1064 792 824 889 -1270 5 2 1 1 342 157 398 522 1951 1211 2175 2671 -1271 5 2 1 1 1951 1211 2175 2671 1952 1212 2176 2672 -1272 5 2 1 1 1952 1212 2176 2672 1953 1213 2177 2673 -1273 5 2 1 1 1953 1213 2177 2673 1954 1214 2178 2674 -1274 5 2 1 1 1954 1214 2178 2674 971 786 1027 1151 -1275 5 2 1 1 501 377 223 326 2587 2091 1475 1887 -1276 5 2 1 1 2587 2091 1475 1887 2588 2092 1476 1888 -1277 5 2 1 1 2588 2092 1476 1888 2589 2093 1477 1889 -1278 5 2 1 1 2589 2093 1477 1889 2590 2094 1478 1890 -1279 5 2 1 1 2590 2094 1478 1890 1130 1006 852 955 -1280 5 2 1 1 439 264 492 178 2339 1639 2551 1295 -1281 5 2 1 1 2339 1639 2551 1295 2340 1640 2552 1296 -1282 5 2 1 1 2340 1640 2552 1296 2341 1641 2553 1297 -1283 5 2 1 1 2341 1641 2553 1297 2342 1642 2554 1298 -1284 5 2 1 1 2342 1642 2554 1298 1068 893 1121 807 -1285 5 2 1 1 179 440 371 265 1299 2343 2067 1643 -1286 5 2 1 1 1299 2343 2067 1643 1300 2344 2068 1644 -1287 5 2 1 1 1300 2344 2068 1644 1301 2345 2069 1645 -1288 5 2 1 1 1301 2345 2069 1645 1302 2346 2070 1646 -1289 5 2 1 1 1302 2346 2070 1646 808 1069 1000 894 -1290 5 2 1 1 180 441 372 266 1303 2347 2071 1647 -1291 5 2 1 1 1303 2347 2071 1647 1304 2348 2072 1648 -1292 5 2 1 1 1304 2348 2072 1648 1305 2349 2073 1649 -1293 5 2 1 1 1305 2349 2073 1649 1306 2350 2074 1650 -1294 5 2 1 1 1306 2350 2074 1650 809 1070 1001 895 -1295 5 2 1 1 515 269 436 175 2643 1659 2327 1283 -1296 5 2 1 1 2643 1659 2327 1283 2644 1660 2328 1284 -1297 5 2 1 1 2644 1660 2328 1284 2645 1661 2329 1285 -1298 5 2 1 1 2645 1661 2329 1285 2646 1662 2330 1286 -1299 5 2 1 1 2646 1662 2330 1286 1144 898 1065 804 -1300 5 2 1 1 516 270 437 176 2647 1663 2331 1287 -1301 5 2 1 1 2647 1663 2331 1287 2648 1664 2332 1288 -1302 5 2 1 1 2648 1664 2332 1288 2649 1665 2333 1289 -1303 5 2 1 1 2649 1665 2333 1289 2650 1666 2334 1290 -1304 5 2 1 1 2650 1666 2334 1290 1145 899 1066 805 -1305 5 2 1 1 517 271 438 177 2651 1667 2335 1291 -1306 5 2 1 1 2651 1667 2335 1291 2652 1668 2336 1292 -1307 5 2 1 1 2652 1668 2336 1292 2653 1669 2337 1293 -1308 5 2 1 1 2653 1669 2337 1293 2654 1670 2338 1294 -1309 5 2 1 1 2654 1670 2338 1294 1146 900 1067 806 -1310 5 2 1 1 514 268 426 174 2639 1655 2287 1279 -1311 5 2 1 1 2639 1655 2287 1279 2640 1656 2288 1280 -1312 5 2 1 1 2640 1656 2288 1280 2641 1657 2289 1281 -1313 5 2 1 1 2641 1657 2289 1281 2642 1658 2290 1282 -1314 5 2 1 1 2642 1658 2290 1282 1143 897 1055 803 -1315 5 2 1 1 420 3 23 274 2263 133 590 1679 -1316 5 2 1 1 2263 133 590 1679 2264 134 591 1680 -1317 5 2 1 1 2264 134 591 1680 2265 135 592 1681 -1318 5 2 1 1 2265 135 592 1681 2266 136 593 1682 -1319 5 2 1 1 2266 136 593 1682 1049 6 83 903 -1320 5 2 1 1 420 274 429 242 2263 1679 2299 1551 -1321 5 2 1 1 2263 1679 2299 1551 2264 1680 2300 1552 -1322 5 2 1 1 2264 1680 2300 1552 2265 1681 2301 1553 -1323 5 2 1 1 2265 1681 2301 1553 2266 1682 2302 1554 -1324 5 2 1 1 2266 1682 2302 1554 1049 903 1058 871 -1325 5 2 1 1 418 272 427 243 2255 1671 2291 1555 -1326 5 2 1 1 2255 1671 2291 1555 2256 1672 2292 1556 -1327 5 2 1 1 2256 1672 2292 1556 2257 1673 2293 1557 -1328 5 2 1 1 2257 1673 2293 1557 2258 1674 2294 1558 -1329 5 2 1 1 2258 1674 2294 1558 1047 901 1056 872 -1330 5 2 1 1 419 273 428 244 2259 1675 2295 1559 -1331 5 2 1 1 2259 1675 2295 1559 2260 1676 2296 1560 -1332 5 2 1 1 2260 1676 2296 1560 2261 1677 2297 1561 -1333 5 2 1 1 2261 1677 2297 1561 2262 1678 2298 1562 -1334 5 2 1 1 2262 1678 2298 1562 1048 902 1057 873 -1335 5 2 1 1 457 375 187 305 2411 2083 1331 1803 -1336 5 2 1 1 2411 2083 1331 1803 2412 2084 1332 1804 -1337 5 2 1 1 2412 2084 1332 1804 2413 2085 1333 1805 -1338 5 2 1 1 2413 2085 1333 1805 2414 2086 1334 1806 -1339 5 2 1 1 2414 2086 1334 1806 1086 1004 816 934 -1340 5 2 1 1 384 199 348 304 2119 1379 1975 1799 -1341 5 2 1 1 2119 1379 1975 1799 2120 1380 1976 1800 -1342 5 2 1 1 2120 1380 1976 1800 2121 1381 1977 1801 -1343 5 2 1 1 2121 1381 1977 1801 2122 1382 1978 1802 -1344 5 2 1 1 2122 1382 1978 1802 1013 828 977 933 -1345 5 2 1 1 394 276 316 183 2159 1687 1847 1315 -1346 5 2 1 1 2159 1687 1847 1315 2160 1688 1848 1316 -1347 5 2 1 1 2160 1688 1848 1316 2161 1689 1849 1317 -1348 5 2 1 1 2161 1689 1849 1317 2162 1690 1850 1318 -1349 5 2 1 1 2162 1690 1850 1318 1023 905 945 812 -1350 5 2 1 1 395 277 317 182 2163 1691 1851 1311 -1351 5 2 1 1 2163 1691 1851 1311 2164 1692 1852 1312 -1352 5 2 1 1 2164 1692 1852 1312 2165 1693 1853 1313 -1353 5 2 1 1 2165 1693 1853 1313 2166 1694 1854 1314 -1354 5 2 1 1 2166 1694 1854 1314 1024 906 946 811 -1355 5 2 1 1 468 158 388 276 2455 1215 2135 1687 -1356 5 2 1 1 2455 1215 2135 1687 2456 1216 2136 1688 -1357 5 2 1 1 2456 1216 2136 1688 2457 1217 2137 1689 -1358 5 2 1 1 2457 1217 2137 1689 2458 1218 2138 1690 -1359 5 2 1 1 2458 1218 2138 1690 1097 787 1017 905 -1360 5 2 1 1 467 159 389 277 2451 1219 2139 1691 -1361 5 2 1 1 2451 1219 2139 1691 2452 1220 2140 1692 -1362 5 2 1 1 2452 1220 2140 1692 2453 1221 2141 1693 -1363 5 2 1 1 2453 1221 2141 1693 2454 1222 2142 1694 -1364 5 2 1 1 2454 1222 2142 1694 1096 788 1018 906 -1365 5 2 1 1 451 218 315 278 2387 1455 1843 1695 -1366 5 2 1 1 2387 1455 1843 1695 2388 1456 1844 1696 -1367 5 2 1 1 2388 1456 1844 1696 2389 1457 1845 1697 -1368 5 2 1 1 2389 1457 1845 1697 2390 1458 1846 1698 -1369 5 2 1 1 2390 1458 1846 1698 1080 847 944 907 -1370 5 2 1 1 340 280 423 172 1943 1703 2275 1271 -1371 5 2 1 1 1943 1703 2275 1271 1944 1704 2276 1272 -1372 5 2 1 1 1944 1704 2276 1272 1945 1705 2277 1273 -1373 5 2 1 1 1945 1705 2277 1273 1946 1706 2278 1274 -1374 5 2 1 1 1946 1706 2278 1274 969 909 1052 801 -1375 5 2 1 1 532 320 181 527 2711 1863 1307 2691 -1376 5 2 1 1 2711 1863 1307 2691 2712 1864 1308 2692 -1377 5 2 1 1 2712 1864 1308 2692 2713 1865 1309 2693 -1378 5 2 1 1 2713 1865 1309 2693 2714 1866 1310 2694 -1379 5 2 1 1 2714 1866 1310 2694 1161 949 810 1156 -1380 5 2 1 1 385 184 307 301 2123 1319 1811 1787 -1381 5 2 1 1 2123 1319 1811 1787 2124 1320 1812 1788 -1382 5 2 1 1 2124 1320 1812 1788 2125 1321 1813 1789 -1383 5 2 1 1 2125 1321 1813 1789 2126 1322 1814 1790 -1384 5 2 1 1 2126 1322 1814 1790 1014 813 936 930 -1385 5 2 1 1 518 289 156 341 2655 1739 1207 1947 -1386 5 2 1 1 2655 1739 1207 1947 2656 1740 1208 1948 -1387 5 2 1 1 2656 1740 1208 1948 2657 1741 1209 1949 -1388 5 2 1 1 2657 1741 1209 1949 2658 1742 1210 1950 -1389 5 2 1 1 2658 1742 1210 1950 1147 918 785 970 -1390 5 2 1 1 398 157 451 278 2175 1211 2387 1695 -1391 5 2 1 1 2175 1211 2387 1695 2176 1212 2388 1696 -1392 5 2 1 1 2176 1212 2388 1696 2177 1213 2389 1697 -1393 5 2 1 1 2177 1213 2389 1697 2178 1214 2390 1698 -1394 5 2 1 1 2178 1214 2390 1698 1027 786 1080 907 -1395 5 2 1 1 315 533 174 278 1843 2715 1279 1695 -1396 5 2 1 1 1843 2715 1279 1695 1844 2716 1280 1696 -1397 5 2 1 1 1844 2716 1280 1696 1845 2717 1281 1697 -1398 5 2 1 1 1845 2717 1281 1697 1846 2718 1282 1698 -1399 5 2 1 1 1846 2718 1282 1698 944 1162 803 907 -1400 5 2 1 1 173 462 252 520 1275 2431 1591 2663 -1401 5 2 1 1 1275 2431 1591 2663 1276 2432 1592 2664 -1402 5 2 1 1 1276 2432 1592 2664 1277 2433 1593 2665 -1403 5 2 1 1 1277 2433 1593 2665 1278 2434 1594 2666 -1404 5 2 1 1 1278 2434 1594 2666 802 1091 881 1149 -1405 5 2 1 1 361 188 302 328 2027 1335 1791 1895 -1406 5 2 1 1 2027 1335 1791 1895 2028 1336 1792 1896 -1407 5 2 1 1 2028 1336 1792 1896 2029 1337 1793 1897 -1408 5 2 1 1 2029 1337 1793 1897 2030 1338 1794 1898 -1409 5 2 1 1 2030 1338 1794 1898 990 817 931 957 -1410 5 2 1 1 461 396 185 299 2427 2167 1323 1779 -1411 5 2 1 1 2427 2167 1323 1779 2428 2168 1324 1780 -1412 5 2 1 1 2428 2168 1324 1780 2429 2169 1325 1781 -1413 5 2 1 1 2429 2169 1325 1781 2430 2170 1326 1782 -1414 5 2 1 1 2430 2170 1326 1782 1090 1025 814 928 -1415 5 2 1 1 199 363 230 348 1379 2035 1503 1975 -1416 5 2 1 1 1379 2035 1503 1975 1380 2036 1504 1976 -1417 5 2 1 1 1380 2036 1504 1976 1381 2037 1505 1977 -1418 5 2 1 1 1381 2037 1505 1977 1382 2038 1506 1978 -1419 5 2 1 1 1382 2038 1506 1978 828 992 859 977 -1420 5 2 1 1 436 290 378 175 2327 1743 2095 1283 -1421 5 2 1 1 2327 1743 2095 1283 2328 1744 2096 1284 -1422 5 2 1 1 2328 1744 2096 1284 2329 1745 2097 1285 -1423 5 2 1 1 2329 1745 2097 1285 2330 1746 2098 1286 -1424 5 2 1 1 2330 1746 2098 1286 1065 919 1007 804 -1425 5 2 1 1 437 291 379 176 2331 1747 2099 1287 -1426 5 2 1 1 2331 1747 2099 1287 2332 1748 2100 1288 -1427 5 2 1 1 2332 1748 2100 1288 2333 1749 2101 1289 -1428 5 2 1 1 2333 1749 2101 1289 2334 1750 2102 1290 -1429 5 2 1 1 2334 1750 2102 1290 1066 920 1008 805 -1430 5 2 1 1 438 292 380 177 2335 1751 2103 1291 -1431 5 2 1 1 2335 1751 2103 1291 2336 1752 2104 1292 -1432 5 2 1 1 2336 1752 2104 1292 2337 1753 2105 1293 -1433 5 2 1 1 2337 1753 2105 1293 2338 1754 2106 1294 -1434 5 2 1 1 2338 1754 2106 1294 1067 921 1009 806 -1435 5 2 1 1 439 178 489 293 2339 1295 2539 1755 -1436 5 2 1 1 2339 1295 2539 1755 2340 1296 2540 1756 -1437 5 2 1 1 2340 1296 2540 1756 2341 1297 2541 1757 -1438 5 2 1 1 2341 1297 2541 1757 2342 1298 2542 1758 -1439 5 2 1 1 2342 1298 2542 1758 1068 807 1118 922 -1440 5 2 1 1 440 179 490 294 2343 1299 2543 1759 -1441 5 2 1 1 2343 1299 2543 1759 2344 1300 2544 1760 -1442 5 2 1 1 2344 1300 2544 1760 2345 1301 2545 1761 -1443 5 2 1 1 2345 1301 2545 1761 2346 1302 2546 1762 -1444 5 2 1 1 2346 1302 2546 1762 1069 808 1119 923 -1445 5 2 1 1 441 180 491 295 2347 1303 2547 1763 -1446 5 2 1 1 2347 1303 2547 1763 2348 1304 2548 1764 -1447 5 2 1 1 2348 1304 2548 1764 2349 1305 2549 1765 -1448 5 2 1 1 2349 1305 2549 1765 2350 1306 2550 1766 -1449 5 2 1 1 2350 1306 2550 1766 1070 809 1120 924 -1450 5 2 1 1 156 302 188 341 1207 1791 1335 1947 -1451 5 2 1 1 1207 1791 1335 1947 1208 1792 1336 1948 -1452 5 2 1 1 1208 1792 1336 1948 1209 1793 1337 1949 -1453 5 2 1 1 1209 1793 1337 1949 1210 1794 1338 1950 -1454 5 2 1 1 1210 1794 1338 1950 785 931 817 970 -1455 5 2 1 1 482 160 390 281 2511 1223 2143 1707 -1456 5 2 1 1 2511 1223 2143 1707 2512 1224 2144 1708 -1457 5 2 1 1 2512 1224 2144 1708 2513 1225 2145 1709 -1458 5 2 1 1 2513 1225 2145 1709 2514 1226 2146 1710 -1459 5 2 1 1 2514 1226 2146 1710 1111 789 1019 910 -1460 5 2 1 1 483 284 393 163 2515 1719 2155 1235 -1461 5 2 1 1 2515 1719 2155 1235 2516 1720 2156 1236 -1462 5 2 1 1 2516 1720 2156 1236 2517 1721 2157 1237 -1463 5 2 1 1 2517 1721 2157 1237 2518 1722 2158 1238 -1464 5 2 1 1 2518 1722 2158 1238 1112 913 1022 792 -1465 5 2 1 1 17 331 264 18 566 1907 1639 570 -1466 5 2 1 1 566 1907 1639 570 567 1908 1640 571 -1467 5 2 1 1 567 1908 1640 571 568 1909 1641 572 -1468 5 2 1 1 568 1909 1641 572 569 1910 1642 573 -1469 5 2 1 1 569 1910 1642 573 77 960 893 78 -1470 5 2 1 1 32 332 265 33 626 1911 1643 630 -1471 5 2 1 1 626 1911 1643 630 627 1912 1644 631 -1472 5 2 1 1 627 1912 1644 631 628 1913 1645 632 -1473 5 2 1 1 628 1913 1645 632 629 1914 1646 633 -1474 5 2 1 1 629 1914 1646 633 92 961 894 93 -1475 5 2 1 1 47 333 266 48 686 1915 1647 690 -1476 5 2 1 1 686 1915 1647 690 687 1916 1648 691 -1477 5 2 1 1 687 1916 1648 691 688 1917 1649 692 -1478 5 2 1 1 688 1917 1649 692 689 1918 1650 693 -1479 5 2 1 1 689 1918 1650 693 107 962 895 108 -1480 5 2 1 1 62 334 267 63 746 1919 1651 750 -1481 5 2 1 1 746 1919 1651 750 747 1920 1652 751 -1482 5 2 1 1 747 1920 1652 751 748 1921 1653 752 -1483 5 2 1 1 748 1921 1653 752 749 1922 1654 753 -1484 5 2 1 1 749 1922 1654 753 122 963 896 123 -1485 5 2 1 1 381 489 524 245 2107 2539 2679 1563 -1486 5 2 1 1 2107 2539 2679 1563 2108 2540 2680 1564 -1487 5 2 1 1 2108 2540 2680 1564 2109 2541 2681 1565 -1488 5 2 1 1 2109 2541 2681 1565 2110 2542 2682 1566 -1489 5 2 1 1 2110 2542 2682 1566 1010 1118 1153 874 -1490 5 2 1 1 469 214 284 319 2459 1439 1719 1859 -1491 5 2 1 1 2459 1439 1719 1859 2460 1440 1720 1860 -1492 5 2 1 1 2460 1440 1720 1860 2461 1441 1721 1861 -1493 5 2 1 1 2461 1441 1721 1861 2462 1442 1722 1862 -1494 5 2 1 1 2462 1442 1722 1862 1098 843 913 948 -1495 5 2 1 1 226 385 301 481 1487 2123 1787 2507 -1496 5 2 1 1 1487 2123 1787 2507 1488 2124 1788 2508 -1497 5 2 1 1 1488 2124 1788 2508 1489 2125 1789 2509 -1498 5 2 1 1 1489 2125 1789 2509 1490 2126 1790 2510 -1499 5 2 1 1 1490 2126 1790 2510 855 1014 930 1110 -1500 5 2 1 1 208 387 235 453 1415 2131 1523 2395 -1501 5 2 1 1 1415 2131 1523 2395 1416 2132 1524 2396 -1502 5 2 1 1 1416 2132 1524 2396 1417 2133 1525 2397 -1503 5 2 1 1 1417 2133 1525 2397 1418 2134 1526 2398 -1504 5 2 1 1 1418 2134 1526 2398 837 1016 864 1082 -1505 5 2 1 1 208 362 219 340 1415 2031 1459 1943 -1506 5 2 1 1 1415 2031 1459 1943 1416 2032 1460 1944 -1507 5 2 1 1 1416 2032 1460 1944 1417 2033 1461 1945 -1508 5 2 1 1 1417 2033 1461 1945 1418 2034 1462 1946 -1509 5 2 1 1 1418 2034 1462 1946 837 991 848 969 -1510 5 2 1 1 486 222 423 280 2527 1471 2275 1703 -1511 5 2 1 1 2527 1471 2275 1703 2528 1472 2276 1704 -1512 5 2 1 1 2528 1472 2276 1704 2529 1473 2277 1705 -1513 5 2 1 1 2529 1473 2277 1705 2530 1474 2278 1706 -1514 5 2 1 1 2530 1474 2278 1706 1115 851 1052 909 -1515 5 2 1 1 484 280 340 219 2519 1703 1943 1459 -1516 5 2 1 1 2519 1703 1943 1459 2520 1704 1944 1460 -1517 5 2 1 1 2520 1704 1944 1460 2521 1705 1945 1461 -1518 5 2 1 1 2521 1705 1945 1461 2522 1706 1946 1462 -1519 5 2 1 1 2522 1706 1946 1462 1113 909 969 848 -1520 5 2 1 1 425 181 320 279 2283 1307 1863 1699 -1521 5 2 1 1 2283 1307 1863 1699 2284 1308 1864 1700 -1522 5 2 1 1 2284 1308 1864 1700 2285 1309 1865 1701 -1523 5 2 1 1 2285 1309 1865 1701 2286 1310 1866 1702 -1524 5 2 1 1 2286 1310 1866 1702 1054 810 949 908 -1525 5 2 1 1 446 216 288 285 2367 1447 1735 1723 -1526 5 2 1 1 2367 1447 1735 1723 2368 1448 1736 1724 -1527 5 2 1 1 2368 1448 1736 1724 2369 1449 1737 1725 -1528 5 2 1 1 2369 1449 1737 1725 2370 1450 1738 1726 -1529 5 2 1 1 2370 1450 1738 1726 1075 845 917 914 -1530 5 2 1 1 447 217 289 286 2371 1451 1739 1727 -1531 5 2 1 1 2371 1451 1739 1727 2372 1452 1740 1728 -1532 5 2 1 1 2372 1452 1740 1728 2373 1453 1741 1729 -1533 5 2 1 1 2373 1453 1741 1729 2374 1454 1742 1730 -1534 5 2 1 1 2374 1454 1742 1730 1076 846 918 915 -1535 5 2 1 1 332 493 179 265 1911 2555 1299 1643 -1536 5 2 1 1 1911 2555 1299 1643 1912 2556 1300 1644 -1537 5 2 1 1 1912 2556 1300 1644 1913 2557 1301 1645 -1538 5 2 1 1 1913 2557 1301 1645 1914 2558 1302 1646 -1539 5 2 1 1 1914 2558 1302 1646 961 1122 808 894 -1540 5 2 1 1 333 494 180 266 1915 2559 1303 1647 -1541 5 2 1 1 1915 2559 1303 1647 1916 2560 1304 1648 -1542 5 2 1 1 1916 2560 1304 1648 1917 2561 1305 1649 -1543 5 2 1 1 1917 2561 1305 1649 1918 2562 1306 1650 -1544 5 2 1 1 1918 2562 1306 1650 962 1123 809 895 -1545 5 2 1 1 334 495 181 267 1919 2563 1307 1651 -1546 5 2 1 1 1919 2563 1307 1651 1920 2564 1308 1652 -1547 5 2 1 1 1920 2564 1308 1652 1921 2565 1309 1653 -1548 5 2 1 1 1921 2565 1309 1653 1922 2566 1310 1654 -1549 5 2 1 1 1922 2566 1310 1654 963 1124 810 896 -1550 5 2 1 1 387 149 374 287 2131 1179 2079 1731 -1551 5 2 1 1 2131 1179 2079 1731 2132 1180 2080 1732 -1552 5 2 1 1 2132 1180 2080 1732 2133 1181 2081 1733 -1553 5 2 1 1 2133 1181 2081 1733 2134 1182 2082 1734 -1554 5 2 1 1 2134 1182 2082 1734 1016 778 1003 916 -1555 5 2 1 1 532 527 177 380 2711 2691 1291 2103 -1556 5 2 1 1 2711 2691 1291 2103 2712 2692 1292 2104 -1557 5 2 1 1 2712 2692 1292 2104 2713 2693 1293 2105 -1558 5 2 1 1 2713 2693 1293 2105 2714 2694 1294 2106 -1559 5 2 1 1 2714 2694 1294 2106 1161 1156 806 1009 -1560 5 2 1 1 480 311 401 189 2503 1827 2187 1339 -1561 5 2 1 1 2503 1827 2187 1339 2504 1828 2188 1340 -1562 5 2 1 1 2504 1828 2188 1340 2505 1829 2189 1341 -1563 5 2 1 1 2505 1829 2189 1341 2506 1830 2190 1342 -1564 5 2 1 1 2506 1830 2190 1342 1109 940 1030 818 -1565 5 2 1 1 310 190 242 479 1823 1343 1551 2499 -1566 5 2 1 1 1823 1343 1551 2499 1824 1344 1552 2500 -1567 5 2 1 1 1824 1344 1552 2500 1825 1345 1553 2501 -1568 5 2 1 1 1825 1345 1553 2501 1826 1346 1554 2502 -1569 5 2 1 1 1826 1346 1554 2502 939 819 871 1108 -1570 5 2 1 1 478 309 345 192 2495 1819 1963 1351 -1571 5 2 1 1 2495 1819 1963 1351 2496 1820 1964 1352 -1572 5 2 1 1 2496 1820 1964 1352 2497 1821 1965 1353 -1573 5 2 1 1 2497 1821 1965 1353 2498 1822 1966 1354 -1574 5 2 1 1 2498 1822 1966 1354 1107 938 974 821 -1575 5 2 1 1 450 215 300 283 2383 1443 1783 1715 -1576 5 2 1 1 2383 1443 1783 1715 2384 1444 1784 1716 -1577 5 2 1 1 2384 1444 1784 1716 2385 1445 1785 1717 -1578 5 2 1 1 2385 1445 1785 1717 2386 1446 1786 1718 -1579 5 2 1 1 2386 1446 1786 1718 1079 844 929 912 -1580 5 2 1 1 405 296 305 187 2203 1767 1803 1331 -1581 5 2 1 1 2203 1767 1803 1331 2204 1768 1804 1332 -1582 5 2 1 1 2204 1768 1804 1332 2205 1769 1805 1333 -1583 5 2 1 1 2205 1769 1805 1333 2206 1770 1806 1334 -1584 5 2 1 1 2206 1770 1806 1334 1034 925 934 816 -1585 5 2 1 1 364 237 155 455 2039 1531 1203 2403 -1586 5 2 1 1 2039 1531 1203 2403 2040 1532 1204 2404 -1587 5 2 1 1 2040 1532 1204 2404 2041 1533 1205 2405 -1588 5 2 1 1 2041 1533 1205 2405 2042 1534 1206 2406 -1589 5 2 1 1 2042 1534 1206 2406 993 866 784 1084 -1590 5 2 1 1 456 152 447 286 2407 1191 2371 1727 -1591 5 2 1 1 2407 1191 2371 1727 2408 1192 2372 1728 -1592 5 2 1 1 2408 1192 2372 1728 2409 1193 2373 1729 -1593 5 2 1 1 2409 1193 2373 1729 2410 1194 2374 1730 -1594 5 2 1 1 2410 1194 2374 1730 1085 781 1076 915 -1595 5 2 1 1 154 288 216 512 1199 1735 1447 2631 -1596 5 2 1 1 1199 1735 1447 2631 1200 1736 1448 2632 -1597 5 2 1 1 1200 1736 1448 2632 1201 1737 1449 2633 -1598 5 2 1 1 1201 1737 1449 2633 1202 1738 1450 2634 -1599 5 2 1 1 1202 1738 1450 2634 783 917 845 1141 -1600 5 2 1 1 156 289 217 443 1207 1739 1451 2355 -1601 5 2 1 1 1207 1739 1451 2355 1208 1740 1452 2356 -1602 5 2 1 1 1208 1740 1452 2356 1209 1741 1453 2357 -1603 5 2 1 1 1209 1741 1453 2357 1210 1742 1454 2358 -1604 5 2 1 1 1210 1742 1454 2358 785 918 846 1072 -1605 5 2 1 1 500 151 446 285 2583 1187 2367 1723 -1606 5 2 1 1 2583 1187 2367 1723 2584 1188 2368 1724 -1607 5 2 1 1 2584 1188 2368 1724 2585 1189 2369 1725 -1608 5 2 1 1 2585 1189 2369 1725 2586 1190 2370 1726 -1609 5 2 1 1 2586 1190 2370 1726 1129 780 1075 914 -1610 5 2 1 1 502 287 374 212 2591 1731 2079 1431 -1611 5 2 1 1 2591 1731 2079 1431 2592 1732 2080 1432 -1612 5 2 1 1 2592 1732 2080 1432 2593 1733 2081 1433 -1613 5 2 1 1 2593 1733 2081 1433 2594 1734 2082 1434 -1614 5 2 1 1 2594 1734 2082 1434 1131 916 1003 841 -1615 5 2 1 1 467 225 379 291 2451 1483 2099 1747 -1616 5 2 1 1 2451 1483 2099 1747 2452 1484 2100 1748 -1617 5 2 1 1 2452 1484 2100 1748 2453 1485 2101 1749 -1618 5 2 1 1 2453 1485 2101 1749 2454 1486 2102 1750 -1619 5 2 1 1 2454 1486 2102 1750 1096 854 1008 920 -1620 5 2 1 1 468 224 378 290 2455 1479 2095 1743 -1621 5 2 1 1 2455 1479 2095 1743 2456 1480 2096 1744 -1622 5 2 1 1 2456 1480 2096 1744 2457 1481 2097 1745 -1623 5 2 1 1 2457 1481 2097 1745 2458 1482 2098 1746 -1624 5 2 1 1 2458 1482 2098 1746 1097 853 1007 919 -1625 5 2 1 1 502 235 387 287 2591 1523 2131 1731 -1626 5 2 1 1 2591 1523 2131 1731 2592 1524 2132 1732 -1627 5 2 1 1 2592 1524 2132 1732 2593 1525 2133 1733 -1628 5 2 1 1 2593 1525 2133 1733 2594 1526 2134 1734 -1629 5 2 1 1 2594 1526 2134 1734 1131 864 1016 916 -1630 5 2 1 1 156 443 263 397 1207 2355 1635 2171 -1631 5 2 1 1 1207 2355 1635 2171 1208 2356 1636 2172 -1632 5 2 1 1 1208 2356 1636 2172 1209 2357 1637 2173 -1633 5 2 1 1 1209 2357 1637 2173 1210 2358 1638 2174 -1634 5 2 1 1 1210 2358 1638 2174 785 1072 892 1026 -1635 5 2 1 1 169 377 239 406 1259 2091 1539 2207 -1636 5 2 1 1 1259 2091 1539 2207 1260 2092 1540 2208 -1637 5 2 1 1 1260 2092 1540 2208 1261 2093 1541 2209 -1638 5 2 1 1 1261 2093 1541 2209 1262 2094 1542 2210 -1639 5 2 1 1 1262 2094 1542 2210 798 1006 868 1035 -1640 5 2 1 1 422 173 364 306 2271 1275 2039 1807 -1641 5 2 1 1 2271 1275 2039 1807 2272 1276 2040 1808 -1642 5 2 1 1 2272 1276 2040 1808 2273 1277 2041 1809 -1643 5 2 1 1 2273 1277 2041 1809 2274 1278 2042 1810 -1644 5 2 1 1 2274 1278 2042 1810 1051 802 993 935 -1645 5 2 1 1 347 164 453 452 1971 1239 2395 2391 -1646 5 2 1 1 1971 1239 2395 2391 1972 1240 2396 2392 -1647 5 2 1 1 1972 1240 2396 2392 1973 1241 2397 2393 -1648 5 2 1 1 1973 1241 2397 2393 1974 1242 2398 2394 -1649 5 2 1 1 1974 1242 2398 2394 976 793 1082 1081 -1650 5 2 1 1 489 227 460 293 2539 1491 2423 1755 -1651 5 2 1 1 2539 1491 2423 1755 2540 1492 2424 1756 -1652 5 2 1 1 2540 1492 2424 1756 2541 1493 2425 1757 -1653 5 2 1 1 2541 1493 2425 1757 2542 1494 2426 1758 -1654 5 2 1 1 2542 1494 2426 1758 1118 856 1089 922 -1655 5 2 1 1 490 228 461 294 2543 1495 2427 1759 -1656 5 2 1 1 2543 1495 2427 1759 2544 1496 2428 1760 -1657 5 2 1 1 2544 1496 2428 1760 2545 1497 2429 1761 -1658 5 2 1 1 2545 1497 2429 1761 2546 1498 2430 1762 -1659 5 2 1 1 2546 1498 2430 1762 1119 857 1090 923 -1660 5 2 1 1 241 463 9 421 1547 2435 534 2267 -1661 5 2 1 1 1547 2435 534 2267 1548 2436 535 2268 -1662 5 2 1 1 1548 2436 535 2268 1549 2437 536 2269 -1663 5 2 1 1 1549 2437 536 2269 1550 2438 537 2270 -1664 5 2 1 1 1550 2438 537 2270 870 1092 69 1050 -1665 5 2 1 1 420 242 190 464 2263 1551 1343 2439 -1666 5 2 1 1 2263 1551 1343 2439 2264 1552 1344 2440 -1667 5 2 1 1 2264 1552 1344 2440 2265 1553 1345 2441 -1668 5 2 1 1 2265 1553 1345 2441 2266 1554 1346 2442 -1669 5 2 1 1 2266 1554 1346 2442 1049 871 819 1093 -1670 5 2 1 1 243 465 39 418 1555 2443 654 2255 -1671 5 2 1 1 1555 2443 654 2255 1556 2444 655 2256 -1672 5 2 1 1 1556 2444 655 2256 1557 2445 656 2257 -1673 5 2 1 1 1557 2445 656 2257 1558 2446 657 2258 -1674 5 2 1 1 1558 2446 657 2258 872 1094 99 1047 -1675 5 2 1 1 244 466 54 419 1559 2447 714 2259 -1676 5 2 1 1 1559 2447 714 2259 1560 2448 715 2260 -1677 5 2 1 1 1560 2448 715 2260 1561 2449 716 2261 -1678 5 2 1 1 1561 2449 716 2261 1562 2450 717 2262 -1679 5 2 1 1 1562 2450 717 2262 873 1095 114 1048 -1680 5 2 1 1 458 221 448 304 2415 1467 2375 1799 -1681 5 2 1 1 2415 1467 2375 1799 2416 1468 2376 1800 -1682 5 2 1 1 2416 1468 2376 1800 2417 1469 2377 1801 -1683 5 2 1 1 2417 1469 2377 1801 2418 1470 2378 1802 -1684 5 2 1 1 2418 1470 2378 1802 1087 850 1077 933 -1685 5 2 1 1 459 220 457 303 2419 1463 2411 1795 -1686 5 2 1 1 2419 1463 2411 1795 2420 1464 2412 1796 -1687 5 2 1 1 2420 1464 2412 1796 2421 1465 2413 1797 -1688 5 2 1 1 2421 1465 2413 1797 2422 1466 2414 1798 -1689 5 2 1 1 2422 1466 2414 1798 1088 849 1086 932 -1690 5 2 1 1 458 304 348 170 2415 1799 1975 1263 -1691 5 2 1 1 2415 1799 1975 1263 2416 1800 1976 1264 -1692 5 2 1 1 2416 1800 1976 1264 2417 1801 1977 1265 -1693 5 2 1 1 2417 1801 1977 1265 2418 1802 1978 1266 -1694 5 2 1 1 2418 1802 1978 1266 1087 933 977 799 -1695 5 2 1 1 459 303 399 171 2419 1795 2179 1267 -1696 5 2 1 1 2419 1795 2179 1267 2420 1796 2180 1268 -1697 5 2 1 1 2420 1796 2180 1268 2421 1797 2181 1269 -1698 5 2 1 1 2421 1797 2181 1269 2422 1798 2182 1270 -1699 5 2 1 1 2422 1798 2182 1270 1088 932 1028 800 -1700 5 2 1 1 168 470 275 349 1255 2463 1683 1979 -1701 5 2 1 1 1255 2463 1683 1979 1256 2464 1684 1980 -1702 5 2 1 1 1256 2464 1684 1980 1257 2465 1685 1981 -1703 5 2 1 1 1257 2465 1685 1981 1258 2466 1686 1982 -1704 5 2 1 1 1258 2466 1686 1982 797 1099 904 978 -1705 5 2 1 1 483 295 491 229 2515 1763 2547 1499 -1706 5 2 1 1 2515 1763 2547 1499 2516 1764 2548 1500 -1707 5 2 1 1 2516 1764 2548 1500 2517 1765 2549 1501 -1708 5 2 1 1 2517 1765 2549 1501 2518 1766 2550 1502 -1709 5 2 1 1 2518 1766 2550 1502 1112 924 1120 858 -1710 5 2 1 1 322 213 282 449 1871 1435 1711 2379 -1711 5 2 1 1 1871 1435 1711 2379 1872 1436 1712 2380 -1712 5 2 1 1 1872 1436 1712 2380 1873 1437 1713 2381 -1713 5 2 1 1 1873 1437 1713 2381 1874 1438 1714 2382 -1714 5 2 1 1 1874 1438 1714 2382 951 842 911 1078 -1715 5 2 1 1 147 318 210 408 1171 1855 1423 2215 -1716 5 2 1 1 1171 1855 1423 2215 1172 1856 1424 2216 -1717 5 2 1 1 1172 1856 1424 2216 1173 1857 1425 2217 -1718 5 2 1 1 1173 1857 1425 2217 1174 1858 1426 2218 -1719 5 2 1 1 1174 1858 1426 2218 776 947 839 1037 -1720 5 2 1 1 22 354 274 23 586 1999 1679 590 -1721 5 2 1 1 586 1999 1679 590 587 2000 1680 591 -1722 5 2 1 1 587 2000 1680 591 588 2001 1681 592 -1723 5 2 1 1 588 2001 1681 592 589 2002 1682 593 -1724 5 2 1 1 589 2002 1682 593 82 983 903 83 -1725 5 2 1 1 518 186 286 289 2655 1327 1727 1739 -1726 5 2 1 1 2655 1327 1727 1739 2656 1328 1728 1740 -1727 5 2 1 1 2656 1328 1728 1740 2657 1329 1729 1741 -1728 5 2 1 1 2657 1329 1729 1741 2658 1330 1730 1742 -1729 5 2 1 1 2658 1330 1730 1742 1147 815 915 918 -1730 5 2 1 1 488 225 395 298 2535 1483 2163 1775 -1731 5 2 1 1 2535 1483 2163 1775 2536 1484 2164 1776 -1732 5 2 1 1 2536 1484 2164 1776 2537 1485 2165 1777 -1733 5 2 1 1 2537 1485 2165 1777 2538 1486 2166 1778 -1734 5 2 1 1 2538 1486 2166 1778 1117 854 1024 927 -1735 5 2 1 1 487 224 394 297 2531 1479 2159 1771 -1736 5 2 1 1 2531 1479 2159 1771 2532 1480 2160 1772 -1737 5 2 1 1 2532 1480 2160 1772 2533 1481 2161 1773 -1738 5 2 1 1 2533 1481 2161 1773 2534 1482 2162 1774 -1739 5 2 1 1 2534 1482 2162 1774 1116 853 1023 926 -1740 5 2 1 1 405 187 283 300 2203 1331 1715 1783 -1741 5 2 1 1 2203 1331 1715 1783 2204 1332 1716 1784 -1742 5 2 1 1 2204 1332 1716 1784 2205 1333 1717 1785 -1743 5 2 1 1 2205 1333 1717 1785 2206 1334 1718 1786 -1744 5 2 1 1 2206 1334 1718 1786 1034 816 912 929 -1745 5 2 1 1 154 448 376 288 1199 2375 2087 1735 -1746 5 2 1 1 1199 2375 2087 1735 1200 2376 2088 1736 -1747 5 2 1 1 1200 2376 2088 1736 1201 2377 2089 1737 -1748 5 2 1 1 1201 2377 2089 1737 1202 2378 2090 1738 -1749 5 2 1 1 1202 2378 2090 1738 783 1077 1005 917 -1750 5 2 1 1 430 158 468 290 2303 1215 2455 1743 -1751 5 2 1 1 2303 1215 2455 1743 2304 1216 2456 1744 -1752 5 2 1 1 2304 1216 2456 1744 2305 1217 2457 1745 -1753 5 2 1 1 2305 1217 2457 1745 2306 1218 2458 1746 -1754 5 2 1 1 2306 1218 2458 1746 1059 787 1097 919 -1755 5 2 1 1 431 159 467 291 2307 1219 2451 1747 -1756 5 2 1 1 2307 1219 2451 1747 2308 1220 2452 1748 -1757 5 2 1 1 2308 1220 2452 1748 2309 1221 2453 1749 -1758 5 2 1 1 2309 1221 2453 1749 2310 1222 2454 1750 -1759 5 2 1 1 2310 1222 2454 1750 1060 788 1096 920 -1760 5 2 1 1 432 160 482 292 2311 1223 2511 1751 -1761 5 2 1 1 2311 1223 2511 1751 2312 1224 2512 1752 -1762 5 2 1 1 2312 1224 2512 1752 2313 1225 2513 1753 -1763 5 2 1 1 2313 1225 2513 1753 2314 1226 2514 1754 -1764 5 2 1 1 2314 1226 2514 1754 1061 789 1111 921 -1765 5 2 1 1 430 290 436 201 2303 1743 2327 1387 -1766 5 2 1 1 2303 1743 2327 1387 2304 1744 2328 1388 -1767 5 2 1 1 2304 1744 2328 1388 2305 1745 2329 1389 -1768 5 2 1 1 2305 1745 2329 1389 2306 1746 2330 1390 -1769 5 2 1 1 2306 1746 2330 1390 1059 919 1065 830 -1770 5 2 1 1 431 291 437 202 2307 1747 2331 1391 -1771 5 2 1 1 2307 1747 2331 1391 2308 1748 2332 1392 -1772 5 2 1 1 2308 1748 2332 1392 2309 1749 2333 1393 -1773 5 2 1 1 2309 1749 2333 1393 2310 1750 2334 1394 -1774 5 2 1 1 2310 1750 2334 1394 1060 920 1066 831 -1775 5 2 1 1 432 292 438 203 2311 1751 2335 1395 -1776 5 2 1 1 2311 1751 2335 1395 2312 1752 2336 1396 -1777 5 2 1 1 2312 1752 2336 1396 2313 1753 2337 1397 -1778 5 2 1 1 2313 1753 2337 1397 2314 1754 2338 1398 -1779 5 2 1 1 2314 1754 2338 1398 1061 921 1067 832 -1780 5 2 1 1 433 293 460 161 2315 1755 2423 1227 -1781 5 2 1 1 2315 1755 2423 1227 2316 1756 2424 1228 -1782 5 2 1 1 2316 1756 2424 1228 2317 1757 2425 1229 -1783 5 2 1 1 2317 1757 2425 1229 2318 1758 2426 1230 -1784 5 2 1 1 2318 1758 2426 1230 1062 922 1089 790 -1785 5 2 1 1 434 294 461 162 2319 1759 2427 1231 -1786 5 2 1 1 2319 1759 2427 1231 2320 1760 2428 1232 -1787 5 2 1 1 2320 1760 2428 1232 2321 1761 2429 1233 -1788 5 2 1 1 2321 1761 2429 1233 2322 1762 2430 1234 -1789 5 2 1 1 2322 1762 2430 1234 1063 923 1090 791 -1790 5 2 1 1 435 295 483 163 2323 1763 2515 1235 -1791 5 2 1 1 2323 1763 2515 1235 2324 1764 2516 1236 -1792 5 2 1 1 2324 1764 2516 1236 2325 1765 2517 1237 -1793 5 2 1 1 2325 1765 2517 1237 2326 1766 2518 1238 -1794 5 2 1 1 2326 1766 2518 1238 1064 924 1112 792 -1795 5 2 1 1 433 204 439 293 2315 1399 2339 1755 -1796 5 2 1 1 2315 1399 2339 1755 2316 1400 2340 1756 -1797 5 2 1 1 2316 1400 2340 1756 2317 1401 2341 1757 -1798 5 2 1 1 2317 1401 2341 1757 2318 1402 2342 1758 -1799 5 2 1 1 2318 1402 2342 1758 1062 833 1068 922 -1800 5 2 1 1 434 205 440 294 2319 1403 2343 1759 -1801 5 2 1 1 2319 1403 2343 1759 2320 1404 2344 1760 -1802 5 2 1 1 2320 1404 2344 1760 2321 1405 2345 1761 -1803 5 2 1 1 2321 1405 2345 1761 2322 1406 2346 1762 -1804 5 2 1 1 2322 1406 2346 1762 1063 834 1069 923 -1805 5 2 1 1 435 206 441 295 2323 1407 2347 1763 -1806 5 2 1 1 2323 1407 2347 1763 2324 1408 2348 1764 -1807 5 2 1 1 2324 1408 2348 1764 2325 1409 2349 1765 -1808 5 2 1 1 2325 1409 2349 1765 2326 1410 2350 1766 -1809 5 2 1 1 2326 1410 2350 1766 1064 835 1070 924 -1810 5 2 1 1 310 211 276 388 1823 1427 1687 2135 -1811 5 2 1 1 1823 1427 1687 2135 1824 1428 1688 2136 -1812 5 2 1 1 1824 1428 1688 2136 1825 1429 1689 2137 -1813 5 2 1 1 1825 1429 1689 2137 1826 1430 1690 2138 -1814 5 2 1 1 1826 1430 1690 2138 939 840 905 1017 -1815 5 2 1 1 308 209 277 389 1815 1419 1691 2139 -1816 5 2 1 1 1815 1419 1691 2139 1816 1420 1692 2140 -1817 5 2 1 1 1816 1420 1692 2140 1817 1421 1693 2141 -1818 5 2 1 1 1817 1421 1693 2141 1818 1422 1694 2142 -1819 5 2 1 1 1818 1422 1694 2142 937 838 906 1018 -1820 5 2 1 1 210 390 345 309 1423 2143 1963 1819 -1821 5 2 1 1 1423 2143 1963 1819 1424 2144 1964 1820 -1822 5 2 1 1 1424 2144 1964 1820 1425 2145 1965 1821 -1823 5 2 1 1 1425 2145 1965 1821 1426 2146 1966 1822 -1824 5 2 1 1 1426 2146 1966 1822 839 1019 974 938 -1825 5 2 1 1 312 392 299 213 1831 2151 1779 1435 -1826 5 2 1 1 1831 2151 1779 1435 1832 2152 1780 1436 -1827 5 2 1 1 1832 2152 1780 1436 1833 2153 1781 1437 -1828 5 2 1 1 1833 2153 1781 1437 1834 2154 1782 1438 -1829 5 2 1 1 1834 2154 1782 1438 941 1021 928 842 -1830 5 2 1 1 313 393 284 214 1835 2155 1719 1439 -1831 5 2 1 1 1835 2155 1719 1439 1836 2156 1720 1440 -1832 5 2 1 1 1836 2156 1720 1440 1837 2157 1721 1441 -1833 5 2 1 1 1837 2157 1721 1441 1838 2158 1722 1442 -1834 5 2 1 1 1838 2158 1722 1442 942 1022 913 843 -1835 5 2 1 1 314 391 300 215 1839 2147 1783 1443 -1836 5 2 1 1 1839 2147 1783 1443 1840 2148 1784 1444 -1837 5 2 1 1 1840 2148 1784 1444 1841 2149 1785 1445 -1838 5 2 1 1 1841 2149 1785 1445 1842 2150 1786 1446 -1839 5 2 1 1 1842 2150 1786 1446 943 1020 929 844 -1840 5 2 1 1 486 301 307 222 2527 1787 1811 1471 -1841 5 2 1 1 2527 1787 1811 1471 2528 1788 1812 1472 -1842 5 2 1 1 2528 1788 1812 1472 2529 1789 1813 1473 -1843 5 2 1 1 2529 1789 1813 1473 2530 1790 1814 1474 -1844 5 2 1 1 2530 1790 1814 1474 1115 930 936 851 -1845 5 2 1 1 212 311 168 502 1431 1827 1255 2591 -1846 5 2 1 1 1431 1827 1255 2591 1432 1828 1256 2592 -1847 5 2 1 1 1432 1828 1256 2592 1433 1829 1257 2593 -1848 5 2 1 1 1433 1829 1257 2593 1434 1830 1258 2594 -1849 5 2 1 1 1434 1830 1258 2594 841 940 797 1131 -1850 5 2 1 1 496 455 305 296 2567 2403 1803 1767 -1851 5 2 1 1 2567 2403 1803 1767 2568 2404 1804 1768 -1852 5 2 1 1 2568 2404 1804 1768 2569 2405 1805 1769 -1853 5 2 1 1 2569 2405 1805 1769 2570 2406 1806 1770 -1854 5 2 1 1 2570 2406 1806 1770 1125 1084 934 925 -1855 5 2 1 1 496 296 531 150 2567 1767 2707 1183 -1856 5 2 1 1 2567 1767 2707 1183 2568 1768 2708 1184 -1857 5 2 1 1 2568 1768 2708 1184 2569 1769 2709 1185 -1858 5 2 1 1 2569 1769 2709 1185 2570 1770 2710 1186 -1859 5 2 1 1 2570 1770 2710 1186 1125 925 1160 779 -1860 5 2 1 1 445 297 394 183 2363 1771 2159 1315 -1861 5 2 1 1 2363 1771 2159 1315 2364 1772 2160 1316 -1862 5 2 1 1 2364 1772 2160 1316 2365 1773 2161 1317 -1863 5 2 1 1 2365 1773 2161 1317 2366 1774 2162 1318 -1864 5 2 1 1 2366 1774 2162 1318 1074 926 1023 812 -1865 5 2 1 1 444 298 395 182 2359 1775 2163 1311 -1866 5 2 1 1 2359 1775 2163 1311 2360 1776 2164 1312 -1867 5 2 1 1 2360 1776 2164 1312 2361 1777 2165 1313 -1868 5 2 1 1 2361 1777 2165 1313 2362 1778 2166 1314 -1869 5 2 1 1 2362 1778 2166 1314 1073 927 1024 811 -1870 5 2 1 1 447 152 488 298 2371 1191 2535 1775 -1871 5 2 1 1 2371 1191 2535 1775 2372 1192 2536 1776 -1872 5 2 1 1 2372 1192 2536 1776 2373 1193 2537 1777 -1873 5 2 1 1 2373 1193 2537 1777 2374 1194 2538 1778 -1874 5 2 1 1 2374 1194 2538 1778 1076 781 1117 927 -1875 5 2 1 1 446 151 487 297 2367 1187 2531 1771 -1876 5 2 1 1 2367 1187 2531 1771 2368 1188 2532 1772 -1877 5 2 1 1 2368 1188 2532 1772 2369 1189 2533 1773 -1878 5 2 1 1 2369 1189 2533 1773 2370 1190 2534 1774 -1879 5 2 1 1 2370 1190 2534 1774 1075 780 1116 926 -1880 5 2 1 1 328 454 307 361 1895 2399 1811 2027 -1881 5 2 1 1 1895 2399 1811 2027 1896 2400 1812 2028 -1882 5 2 1 1 1896 2400 1812 2028 1897 2401 1813 2029 -1883 5 2 1 1 1897 2401 1813 2029 1898 2402 1814 2030 -1884 5 2 1 1 1898 2402 1814 2030 957 1083 936 990 -1885 5 2 1 1 236 325 169 497 1527 1883 1259 2571 -1886 5 2 1 1 1527 1883 1259 2571 1528 1884 1260 2572 -1887 5 2 1 1 1528 1884 1260 2572 1529 1885 1261 2573 -1888 5 2 1 1 1529 1885 1261 2573 1530 1886 1262 2574 -1889 5 2 1 1 1530 1886 1262 2574 865 954 798 1126 -1890 5 2 1 1 442 198 399 303 2351 1375 2179 1795 -1891 5 2 1 1 2351 1375 2179 1795 2352 1376 2180 1796 -1892 5 2 1 1 2352 1376 2180 1796 2353 1377 2181 1797 -1893 5 2 1 1 2353 1377 2181 1797 2354 1378 2182 1798 -1894 5 2 1 1 2354 1378 2182 1798 1071 827 1028 932 -1895 5 2 1 1 460 300 391 161 2423 1783 2147 1227 -1896 5 2 1 1 2423 1783 2147 1227 2424 1784 2148 1228 -1897 5 2 1 1 2424 1784 2148 1228 2425 1785 2149 1229 -1898 5 2 1 1 2425 1785 2149 1229 2426 1786 2150 1230 -1899 5 2 1 1 2426 1786 2150 1230 1089 929 1020 790 -1900 5 2 1 1 461 299 392 162 2427 1779 2151 1231 -1901 5 2 1 1 2427 1779 2151 1231 2428 1780 2152 1232 -1902 5 2 1 1 2428 1780 2152 1232 2429 1781 2153 1233 -1903 5 2 1 1 2429 1781 2153 1233 2430 1782 2154 1234 -1904 5 2 1 1 2430 1782 2154 1234 1090 928 1021 791 -1905 5 2 1 1 481 301 486 153 2507 1787 2527 1195 -1906 5 2 1 1 2507 1787 2527 1195 2508 1788 2528 1196 -1907 5 2 1 1 2508 1788 2528 1196 2509 1789 2529 1197 -1908 5 2 1 1 2509 1789 2529 1197 2510 1790 2530 1198 -1909 5 2 1 1 2510 1790 2530 1198 1110 930 1115 782 -1910 5 2 1 1 476 197 328 302 2487 1371 1895 1791 -1911 5 2 1 1 2487 1371 1895 1791 2488 1372 1896 1792 -1912 5 2 1 1 2488 1372 1896 1792 2489 1373 1897 1793 -1913 5 2 1 1 2489 1373 1897 1793 2490 1374 1898 1794 -1914 5 2 1 1 2490 1374 1898 1794 1105 826 957 931 -1915 5 2 1 1 182 330 263 444 1311 1903 1635 2359 -1916 5 2 1 1 1311 1903 1635 2359 1312 1904 1636 2360 -1917 5 2 1 1 1312 1904 1636 2360 1313 1905 1637 2361 -1918 5 2 1 1 1313 1905 1637 2361 1314 1906 1638 2362 -1919 5 2 1 1 1314 1906 1638 2362 811 959 892 1073 -1920 5 2 1 1 183 329 262 445 1315 1899 1631 2363 -1921 5 2 1 1 1315 1899 1631 2363 1316 1900 1632 2364 -1922 5 2 1 1 1316 1900 1632 2364 1317 1901 1633 2365 -1923 5 2 1 1 1317 1901 1633 2365 1318 1902 1634 2366 -1924 5 2 1 1 1318 1902 1634 2366 812 958 891 1074 -1925 5 2 1 1 457 305 455 155 2411 1803 2403 1203 -1926 5 2 1 1 2411 1803 2403 1203 2412 1804 2404 1204 -1927 5 2 1 1 2412 1804 2404 1204 2413 1805 2405 1205 -1928 5 2 1 1 2413 1805 2405 1205 2414 1806 2406 1206 -1929 5 2 1 1 2414 1806 2406 1206 1086 934 1084 784 -1930 5 2 1 1 485 218 422 306 2523 1455 2271 1807 -1931 5 2 1 1 2523 1455 2271 1807 2524 1456 2272 1808 -1932 5 2 1 1 2524 1456 2272 1808 2525 1457 2273 1809 -1933 5 2 1 1 2525 1457 2273 1809 2526 1458 2274 1810 -1934 5 2 1 1 2526 1458 2274 1810 1114 847 1051 935 -1935 5 2 1 1 341 251 319 518 1947 1587 1859 2655 -1936 5 2 1 1 1947 1587 1859 2655 1948 1588 1860 2656 -1937 5 2 1 1 1948 1588 1860 2656 1949 1589 1861 2657 -1938 5 2 1 1 1949 1589 1861 2657 1950 1590 1862 2658 -1939 5 2 1 1 1950 1590 1862 2658 970 880 948 1147 -1940 5 2 1 1 496 306 364 455 2567 1807 2039 2403 -1941 5 2 1 1 2567 1807 2039 2403 2568 1808 2040 2404 -1942 5 2 1 1 2568 1808 2040 2404 2569 1809 2041 2405 -1943 5 2 1 1 2569 1809 2041 2405 2570 1810 2042 2406 -1944 5 2 1 1 2570 1810 2042 2406 1125 935 993 1084 -1945 5 2 1 1 261 413 207 523 1627 2235 1411 2675 -1946 5 2 1 1 1627 2235 1411 2675 1628 2236 1412 2676 -1947 5 2 1 1 1628 2236 1412 2676 1629 2237 1413 2677 -1948 5 2 1 1 1629 2237 1413 2677 1630 2238 1414 2678 -1949 5 2 1 1 1630 2238 1414 2678 890 1042 836 1152 -1950 5 2 1 1 20 410 258 21 578 2223 1615 582 -1951 5 2 1 1 578 2223 1615 582 579 2224 1616 583 -1952 5 2 1 1 579 2224 1616 583 580 2225 1617 584 -1953 5 2 1 1 580 2225 1617 584 581 2226 1618 585 -1954 5 2 1 1 581 2226 1618 585 80 1039 887 81 -1955 5 2 1 1 35 411 259 36 638 2227 1619 642 -1956 5 2 1 1 638 2227 1619 642 639 2228 1620 643 -1957 5 2 1 1 639 2228 1620 643 640 2229 1621 644 -1958 5 2 1 1 640 2229 1621 644 641 2230 1622 645 -1959 5 2 1 1 641 2230 1622 645 95 1040 888 96 -1960 5 2 1 1 50 412 260 51 698 2231 1623 702 -1961 5 2 1 1 698 2231 1623 702 699 2232 1624 703 -1962 5 2 1 1 699 2232 1624 703 700 2233 1625 704 -1963 5 2 1 1 700 2233 1625 704 701 2234 1626 705 -1964 5 2 1 1 701 2234 1626 705 110 1041 889 111 -1965 5 2 1 1 65 413 261 66 758 2235 1627 762 -1966 5 2 1 1 758 2235 1627 762 759 2236 1628 763 -1967 5 2 1 1 759 2236 1628 763 760 2237 1629 764 -1968 5 2 1 1 760 2237 1629 764 761 2238 1630 765 -1969 5 2 1 1 761 2238 1630 765 125 1042 890 126 -1970 5 2 1 1 13 12 254 414 550 546 1599 2239 -1971 5 2 1 1 550 546 1599 2239 551 547 1600 2240 -1972 5 2 1 1 551 547 1600 2240 552 548 1601 2241 -1973 5 2 1 1 552 548 1601 2241 553 549 1602 2242 -1974 5 2 1 1 553 549 1602 2242 73 72 883 1043 -1975 5 2 1 1 28 27 255 415 610 606 1603 2243 -1976 5 2 1 1 610 606 1603 2243 611 607 1604 2244 -1977 5 2 1 1 611 607 1604 2244 612 608 1605 2245 -1978 5 2 1 1 612 608 1605 2245 613 609 1606 2246 -1979 5 2 1 1 613 609 1606 2246 88 87 884 1044 -1980 5 2 1 1 43 42 256 416 670 666 1607 2247 -1981 5 2 1 1 670 666 1607 2247 671 667 1608 2248 -1982 5 2 1 1 671 667 1608 2248 672 668 1609 2249 -1983 5 2 1 1 672 668 1609 2249 673 669 1610 2250 -1984 5 2 1 1 673 669 1610 2250 103 102 885 1045 -1985 5 2 1 1 58 57 257 417 730 726 1611 2251 -1986 5 2 1 1 730 726 1611 2251 731 727 1612 2252 -1987 5 2 1 1 731 727 1612 2252 732 728 1613 2253 -1988 5 2 1 1 732 728 1613 2253 733 729 1614 2254 -1989 5 2 1 1 733 729 1614 2254 118 117 886 1046 -1990 5 2 1 1 165 427 194 312 1243 2291 1359 1831 -1991 5 2 1 1 1243 2291 1359 1831 1244 2292 1360 1832 -1992 5 2 1 1 1244 2292 1360 1832 1245 2293 1361 1833 -1993 5 2 1 1 1245 2293 1361 1833 1246 2294 1362 1834 -1994 5 2 1 1 1246 2294 1362 1834 794 1056 823 941 -1995 5 2 1 1 166 428 195 313 1247 2295 1363 1835 -1996 5 2 1 1 1247 2295 1363 1835 1248 2296 1364 1836 -1997 5 2 1 1 1248 2296 1364 1836 1249 2297 1365 1837 -1998 5 2 1 1 1249 2297 1365 1837 1250 2298 1366 1838 -1999 5 2 1 1 1250 2298 1366 1838 795 1057 824 942 -2000 5 2 1 1 167 429 193 314 1251 2299 1355 1839 -2001 5 2 1 1 1251 2299 1355 1839 1252 2300 1356 1840 -2002 5 2 1 1 1252 2300 1356 1840 1253 2301 1357 1841 -2003 5 2 1 1 1253 2301 1357 1841 1254 2302 1358 1842 -2004 5 2 1 1 1254 2302 1358 1842 796 1058 822 943 -2005 5 2 1 1 514 335 15 268 2639 1923 558 1655 -2006 5 2 1 1 2639 1923 558 1655 2640 1924 559 1656 -2007 5 2 1 1 2640 1924 559 1656 2641 1925 560 1657 -2008 5 2 1 1 2641 1925 560 1657 2642 1926 561 1658 -2009 5 2 1 1 2642 1926 561 1658 1143 964 75 897 -2010 5 2 1 1 515 336 30 269 2643 1927 618 1659 -2011 5 2 1 1 2643 1927 618 1659 2644 1928 619 1660 -2012 5 2 1 1 2644 1928 619 1660 2645 1929 620 1661 -2013 5 2 1 1 2645 1929 620 1661 2646 1930 621 1662 -2014 5 2 1 1 2646 1930 621 1662 1144 965 90 898 -2015 5 2 1 1 516 337 45 270 2647 1931 678 1663 -2016 5 2 1 1 2647 1931 678 1663 2648 1932 679 1664 -2017 5 2 1 1 2648 1932 679 1664 2649 1933 680 1665 -2018 5 2 1 1 2649 1933 680 1665 2650 1934 681 1666 -2019 5 2 1 1 2650 1934 681 1666 1145 966 105 899 -2020 5 2 1 1 517 338 60 271 2651 1935 738 1667 -2021 5 2 1 1 2651 1935 738 1667 2652 1936 739 1668 -2022 5 2 1 1 2652 1936 739 1668 2653 1937 740 1669 -2023 5 2 1 1 2653 1937 740 1669 2654 1938 741 1670 -2024 5 2 1 1 2654 1938 741 1670 1146 967 120 900 -2025 5 2 1 1 199 339 145 363 1379 1939 1163 2035 -2026 5 2 1 1 1379 1939 1163 2035 1380 1940 1164 2036 -2027 5 2 1 1 1380 1940 1164 2036 1381 1941 1165 2037 -2028 5 2 1 1 1381 1941 1165 2037 1382 1942 1166 2038 -2029 5 2 1 1 1382 1942 1166 2038 828 968 774 992 -2030 5 2 1 1 275 470 241 421 1683 2463 1547 2267 -2031 5 2 1 1 1683 2463 1547 2267 1684 2464 1548 2268 -2032 5 2 1 1 1684 2464 1548 2268 1685 2465 1549 2269 -2033 5 2 1 1 1685 2465 1549 2269 1686 2466 1550 2270 -2034 5 2 1 1 1686 2466 1550 2270 904 1099 870 1050 -2035 5 2 1 1 366 414 522 200 2047 2239 2671 1383 -2036 5 2 1 1 2047 2239 2671 1383 2048 2240 2672 1384 -2037 5 2 1 1 2048 2240 2672 1384 2049 2241 2673 1385 -2038 5 2 1 1 2049 2241 2673 1385 2050 2242 2674 1386 -2039 5 2 1 1 2050 2242 2674 1386 995 1043 1151 829 -2040 5 2 1 1 367 415 255 201 2051 2243 1603 1387 -2041 5 2 1 1 2051 2243 1603 1387 2052 2244 1604 1388 -2042 5 2 1 1 2052 2244 1604 1388 2053 2245 1605 1389 -2043 5 2 1 1 2053 2245 1605 1389 2054 2246 1606 1390 -2044 5 2 1 1 2054 2246 1606 1390 996 1044 884 830 -2045 5 2 1 1 368 416 256 202 2055 2247 1607 1391 -2046 5 2 1 1 2055 2247 1607 1391 2056 2248 1608 1392 -2047 5 2 1 1 2056 2248 1608 1392 2057 2249 1609 1393 -2048 5 2 1 1 2057 2249 1609 1393 2058 2250 1610 1394 -2049 5 2 1 1 2058 2250 1610 1394 997 1045 885 831 -2050 5 2 1 1 369 417 257 203 2059 2251 1611 1395 -2051 5 2 1 1 2059 2251 1611 1395 2060 2252 1612 1396 -2052 5 2 1 1 2060 2252 1612 1396 2061 2253 1613 1397 -2053 5 2 1 1 2061 2253 1613 1397 2062 2254 1614 1398 -2054 5 2 1 1 2062 2254 1614 1398 998 1046 886 832 -2055 5 2 1 1 370 204 258 410 2063 1399 1615 2223 -2056 5 2 1 1 2063 1399 1615 2223 2064 1400 1616 2224 -2057 5 2 1 1 2064 1400 1616 2224 2065 1401 1617 2225 -2058 5 2 1 1 2065 1401 1617 2225 2066 1402 1618 2226 -2059 5 2 1 1 2066 1402 1618 2226 999 833 887 1039 -2060 5 2 1 1 411 371 440 205 2227 2067 2343 1403 -2061 5 2 1 1 2227 2067 2343 1403 2228 2068 2344 1404 -2062 5 2 1 1 2228 2068 2344 1404 2229 2069 2345 1405 -2063 5 2 1 1 2229 2069 2345 1405 2230 2070 2346 1406 -2064 5 2 1 1 2230 2070 2346 1406 1040 1000 1069 834 -2065 5 2 1 1 412 372 441 206 2231 2071 2347 1407 -2066 5 2 1 1 2231 2071 2347 1407 2232 2072 2348 1408 -2067 5 2 1 1 2232 2072 2348 1408 2233 2073 2349 1409 -2068 5 2 1 1 2233 2073 2349 1409 2234 2074 2350 1410 -2069 5 2 1 1 2234 2074 2350 1410 1041 1001 1070 835 -2070 5 2 1 1 413 373 267 207 2235 2075 1651 1411 -2071 5 2 1 1 2235 2075 1651 1411 2236 2076 1652 1412 -2072 5 2 1 1 2236 2076 1652 1412 2237 2077 1653 1413 -2073 5 2 1 1 2237 2077 1653 1413 2238 2078 1654 1414 -2074 5 2 1 1 2238 2078 1654 1414 1042 1002 896 836 -2075 5 2 1 1 484 219 279 320 2519 1459 1699 1863 -2076 5 2 1 1 2519 1459 1699 1863 2520 1460 1700 1864 -2077 5 2 1 1 2520 1460 1700 1864 2521 1461 1701 1865 -2078 5 2 1 1 2521 1461 1701 1865 2522 1462 1702 1866 -2079 5 2 1 1 2522 1462 1702 1866 1113 848 908 949 -2080 5 2 1 1 148 450 283 530 1175 2383 1715 2703 -2081 5 2 1 1 1175 2383 1715 2703 1176 2384 1716 2704 -2082 5 2 1 1 1176 2384 1716 2704 1177 2385 1717 2705 -2083 5 2 1 1 1177 2385 1717 2705 1178 2386 1718 2706 -2084 5 2 1 1 1178 2386 1718 2706 777 1079 912 1159 -2085 5 2 1 1 146 449 282 529 1167 2379 1711 2699 -2086 5 2 1 1 1167 2379 1711 2699 1168 2380 1712 2700 -2087 5 2 1 1 1168 2380 1712 2700 1169 2381 1713 2701 -2088 5 2 1 1 1169 2381 1713 2701 1170 2382 1714 2702 -2089 5 2 1 1 1170 2382 1714 2702 775 1078 911 1158 -2090 5 2 1 1 208 327 149 387 1415 1891 1179 2131 -2091 5 2 1 1 1415 1891 1179 2131 1416 1892 1180 2132 -2092 5 2 1 1 1416 1892 1180 2132 1417 1893 1181 2133 -2093 5 2 1 1 1417 1893 1181 2133 1418 1894 1182 2134 -2094 5 2 1 1 1418 1894 1182 2134 837 956 778 1016 -2095 5 2 1 1 11 504 254 12 542 2599 1599 546 -2096 5 2 1 1 542 2599 1599 546 543 2600 1600 547 -2097 5 2 1 1 543 2600 1600 547 544 2601 1601 548 -2098 5 2 1 1 544 2601 1601 548 545 2602 1602 549 -2099 5 2 1 1 545 2602 1602 549 71 1133 883 72 -2100 5 2 1 1 26 505 255 27 602 2603 1603 606 -2101 5 2 1 1 602 2603 1603 606 603 2604 1604 607 -2102 5 2 1 1 603 2604 1604 607 604 2605 1605 608 -2103 5 2 1 1 604 2605 1605 608 605 2606 1606 609 -2104 5 2 1 1 605 2606 1606 609 86 1134 884 87 -2105 5 2 1 1 41 506 256 42 662 2607 1607 666 -2106 5 2 1 1 662 2607 1607 666 663 2608 1608 667 -2107 5 2 1 1 663 2608 1608 667 664 2609 1609 668 -2108 5 2 1 1 664 2609 1609 668 665 2610 1610 669 -2109 5 2 1 1 665 2610 1610 669 101 1135 885 102 -2110 5 2 1 1 56 507 257 57 722 2611 1611 726 -2111 5 2 1 1 722 2611 1611 726 723 2612 1612 727 -2112 5 2 1 1 723 2612 1612 727 724 2613 1613 728 -2113 5 2 1 1 724 2613 1613 728 725 2614 1614 729 -2114 5 2 1 1 725 2614 1614 729 116 1136 886 117 -2115 5 2 1 1 22 21 258 508 586 582 1615 2615 -2116 5 2 1 1 586 582 1615 2615 587 583 1616 2616 -2117 5 2 1 1 587 583 1616 2616 588 584 1617 2617 -2118 5 2 1 1 588 584 1617 2617 589 585 1618 2618 -2119 5 2 1 1 589 585 1618 2618 82 81 887 1137 -2120 5 2 1 1 37 36 259 509 646 642 1619 2619 -2121 5 2 1 1 646 642 1619 2619 647 643 1620 2620 -2122 5 2 1 1 647 643 1620 2620 648 644 1621 2621 -2123 5 2 1 1 648 644 1621 2621 649 645 1622 2622 -2124 5 2 1 1 649 645 1622 2622 97 96 888 1138 -2125 5 2 1 1 52 51 260 510 706 702 1623 2623 -2126 5 2 1 1 706 702 1623 2623 707 703 1624 2624 -2127 5 2 1 1 707 703 1624 2624 708 704 1625 2625 -2128 5 2 1 1 708 704 1625 2625 709 705 1626 2626 -2129 5 2 1 1 709 705 1626 2626 112 111 889 1139 -2130 5 2 1 1 67 66 261 511 766 762 1627 2627 -2131 5 2 1 1 766 762 1627 2627 767 763 1628 2628 -2132 5 2 1 1 767 763 1628 2628 768 764 1629 2629 -2133 5 2 1 1 768 764 1629 2629 769 765 1630 2630 -2134 5 2 1 1 769 765 1630 2630 127 126 890 1140 -2135 5 2 1 1 523 424 164 347 2675 2279 1239 1971 -2136 5 2 1 1 2675 2279 1239 1971 2676 2280 1240 1972 -2137 5 2 1 1 2676 2280 1240 1972 2677 2281 1241 1973 -2138 5 2 1 1 2677 2281 1241 1973 2678 2282 1242 1974 -2139 5 2 1 1 2678 2282 1242 1974 1152 1053 793 976 -2140 5 2 1 1 236 499 149 327 1527 2579 1179 1891 -2141 5 2 1 1 1527 2579 1179 1891 1528 2580 1180 1892 -2142 5 2 1 1 1528 2580 1180 1892 1529 2581 1181 1893 -2143 5 2 1 1 1529 2581 1181 1893 1530 2582 1182 1894 -2144 5 2 1 1 1530 2582 1182 1894 865 1128 778 956 -2145 5 2 1 1 165 308 191 477 1243 1815 1347 2491 -2146 5 2 1 1 1243 1815 1347 2491 1244 1816 1348 2492 -2147 5 2 1 1 1244 1816 1348 2492 1245 1817 1349 2493 -2148 5 2 1 1 1245 1817 1349 2493 1246 1818 1350 2494 -2149 5 2 1 1 1246 1818 1350 2494 794 937 820 1106 -2150 5 2 1 1 478 166 323 309 2495 1247 1875 1819 -2151 5 2 1 1 2495 1247 1875 1819 2496 1248 1876 1820 -2152 5 2 1 1 2496 1248 1876 1820 2497 1249 1877 1821 -2153 5 2 1 1 2497 1249 1877 1821 2498 1250 1878 1822 -2154 5 2 1 1 2498 1250 1878 1822 1107 795 952 938 -2155 5 2 1 1 479 167 324 310 2499 1251 1879 1823 -2156 5 2 1 1 2499 1251 1879 1823 2500 1252 1880 1824 -2157 5 2 1 1 2500 1252 1880 1824 2501 1253 1881 1825 -2158 5 2 1 1 2501 1253 1881 1825 2502 1254 1882 1826 -2159 5 2 1 1 2502 1254 1882 1826 1108 796 953 939 -2160 5 2 1 1 481 380 292 226 2507 2103 1751 1487 -2161 5 2 1 1 2507 2103 1751 1487 2508 2104 1752 1488 -2162 5 2 1 1 2508 2104 1752 1488 2509 2105 1753 1489 -2163 5 2 1 1 2509 2105 1753 1489 2510 2106 1754 1490 -2164 5 2 1 1 2510 2106 1754 1490 1110 1009 921 855 -2165 5 2 1 1 492 231 404 524 2551 1507 2199 2679 -2166 5 2 1 1 2551 1507 2199 2679 2552 1508 2200 2680 -2167 5 2 1 1 2552 1508 2200 2680 2553 1509 2201 2681 -2168 5 2 1 1 2553 1509 2201 2681 2554 1510 2202 2682 -2169 5 2 1 1 2554 1510 2202 2682 1121 860 1033 1153 -2170 5 2 1 1 462 240 374 521 2431 1543 2079 2667 -2171 5 2 1 1 2431 1543 2079 2667 2432 1544 2080 2668 -2172 5 2 1 1 2432 1544 2080 2668 2433 1545 2081 2669 -2173 5 2 1 1 2433 1545 2081 2669 2434 1546 2082 2670 -2174 5 2 1 1 2434 1546 2082 2670 1091 869 1003 1150 -2175 5 2 1 1 409 324 215 450 2219 1879 1443 2383 -2176 5 2 1 1 2219 1879 1443 2383 2220 1880 1444 2384 -2177 5 2 1 1 2220 1880 1444 2384 2221 1881 1445 2385 -2178 5 2 1 1 2221 1881 1445 2385 2222 1882 1446 2386 -2179 5 2 1 1 2222 1882 1446 2386 1038 953 844 1079 -2180 5 2 1 1 237 406 239 321 1531 2207 1539 1867 -2181 5 2 1 1 1531 2207 1539 1867 1532 2208 1540 1868 -2182 5 2 1 1 1532 2208 1540 1868 1533 2209 1541 1869 -2183 5 2 1 1 1533 2209 1541 1869 1534 2210 1542 1870 -2184 5 2 1 1 1534 2210 1542 1870 866 1035 868 950 -2185 5 2 1 1 39 1 272 418 654 137 1671 2255 -2186 5 2 1 1 654 137 1671 2255 655 138 1672 2256 -2187 5 2 1 1 655 138 1672 2256 656 139 1673 2257 -2188 5 2 1 1 656 139 1673 2257 657 140 1674 2258 -2189 5 2 1 1 657 140 1674 2258 99 7 901 1047 -2190 5 2 1 1 54 2 273 419 714 141 1675 2259 -2191 5 2 1 1 714 141 1675 2259 715 142 1676 2260 -2192 5 2 1 1 715 142 1676 2260 716 143 1677 2261 -2193 5 2 1 1 716 143 1677 2261 717 144 1678 2262 -2194 5 2 1 1 717 144 1678 2262 114 8 902 1048 -2195 5 2 1 1 3 420 464 24 133 2263 2439 594 -2196 5 2 1 1 133 2263 2439 594 134 2264 2440 595 -2197 5 2 1 1 134 2264 2440 595 135 2265 2441 596 -2198 5 2 1 1 135 2265 2441 596 136 2266 2442 597 -2199 5 2 1 1 136 2266 2442 597 6 1049 1093 84 -2200 5 2 1 1 9 4 275 421 534 129 1683 2267 -2201 5 2 1 1 534 129 1683 2267 535 130 1684 2268 -2202 5 2 1 1 535 130 1684 2268 536 131 1685 2269 -2203 5 2 1 1 536 131 1685 2269 537 132 1686 2270 -2204 5 2 1 1 537 132 1686 2270 69 5 904 1050 -2205 5 2 1 1 150 315 218 485 1183 1843 1455 2523 -2206 5 2 1 1 1183 1843 1455 2523 1184 1844 1456 2524 -2207 5 2 1 1 1184 1844 1456 2524 1185 1845 1457 2525 -2208 5 2 1 1 1185 1845 1457 2525 1186 1846 1458 2526 -2209 5 2 1 1 1186 1846 1458 2526 779 944 847 1114 -2210 5 2 1 1 533 315 381 245 2715 1843 2107 1563 -2211 5 2 1 1 2715 1843 2107 1563 2716 1844 2108 1564 -2212 5 2 1 1 2716 1844 2108 1564 2717 1845 2109 1565 -2213 5 2 1 1 2717 1845 2109 1565 2718 1846 2110 1566 -2214 5 2 1 1 2718 1846 2110 1566 1162 944 1010 874 -2215 5 2 1 1 359 401 311 212 2019 2187 1827 1431 -2216 5 2 1 1 2019 2187 1827 1431 2020 2188 1828 1432 -2217 5 2 1 1 2020 2188 1828 1432 2021 2189 1829 1433 -2218 5 2 1 1 2021 2189 1829 1433 2022 2190 1830 1434 -2219 5 2 1 1 2022 2190 1830 1434 988 1030 940 841 -2220 5 2 1 1 209 322 449 407 1419 1871 2379 2211 -2221 5 2 1 1 1419 1871 2379 2211 1420 1872 2380 2212 -2222 5 2 1 1 1420 1872 2380 2212 1421 1873 2381 2213 -2223 5 2 1 1 1421 1873 2381 2213 1422 1874 2382 2214 -2224 5 2 1 1 1422 1874 2382 2214 838 951 1078 1036 -2225 5 2 1 1 408 210 309 323 2215 1423 1819 1875 -2226 5 2 1 1 2215 1423 1819 1875 2216 1424 1820 1876 -2227 5 2 1 1 2216 1424 1820 1876 2217 1425 1821 1877 -2228 5 2 1 1 2217 1425 1821 1877 2218 1426 1822 1878 -2229 5 2 1 1 2218 1426 1822 1878 1037 839 938 952 -2230 5 2 1 1 409 211 310 324 2219 1427 1823 1879 -2231 5 2 1 1 2219 1427 1823 1879 2220 1428 1824 1880 -2232 5 2 1 1 2220 1428 1824 1880 2221 1429 1825 1881 -2233 5 2 1 1 2221 1429 1825 1881 2222 1430 1826 1882 -2234 5 2 1 1 2222 1430 1826 1882 1038 840 939 953 -2235 5 2 1 1 145 358 230 363 1163 2015 1503 2035 -2236 5 2 1 1 1163 2015 1503 2035 1164 2016 1504 2036 -2237 5 2 1 1 1164 2016 1504 2036 1165 2017 1505 2037 -2238 5 2 1 1 1165 2017 1505 2037 1166 2018 1506 2038 -2239 5 2 1 1 1166 2018 1506 2038 774 987 859 992 -2240 5 2 1 1 442 155 237 321 2351 1203 1531 1867 -2241 5 2 1 1 2351 1203 1531 1867 2352 1204 1532 1868 -2242 5 2 1 1 2352 1204 1532 1868 2353 1205 1533 1869 -2243 5 2 1 1 2353 1205 1533 1869 2354 1206 1534 1870 -2244 5 2 1 1 2354 1206 1534 1870 1071 784 866 950 -2245 5 2 1 1 179 525 246 490 1299 2683 1567 2543 -2246 5 2 1 1 1299 2683 1567 2543 1300 2684 1568 2544 -2247 5 2 1 1 1300 2684 1568 2544 1301 2685 1569 2545 -2248 5 2 1 1 1301 2685 1569 2545 1302 2686 1570 2546 -2249 5 2 1 1 1302 2686 1570 2546 808 1154 875 1119 -2250 5 2 1 1 180 526 247 491 1303 2687 1571 2547 -2251 5 2 1 1 1303 2687 1571 2547 1304 2688 1572 2548 -2252 5 2 1 1 1304 2688 1572 2548 1305 2689 1573 2549 -2253 5 2 1 1 1305 2689 1573 2549 1306 2690 1574 2550 -2254 5 2 1 1 1306 2690 1574 2550 809 1155 876 1120 -2255 5 2 1 1 236 497 252 499 1527 2571 1591 2579 -2256 5 2 1 1 1527 2571 1591 2579 1528 2572 1592 2580 -2257 5 2 1 1 1528 2572 1592 2580 1529 2573 1593 2581 -2258 5 2 1 1 1529 2573 1593 2581 1530 2574 1594 2582 -2259 5 2 1 1 1530 2574 1594 2582 865 1126 881 1128 -2260 5 2 1 1 472 16 15 335 2471 562 558 1923 -2261 5 2 1 1 2471 562 558 1923 2472 563 559 1924 -2262 5 2 1 1 2472 563 559 1924 2473 564 560 1925 -2263 5 2 1 1 2473 564 560 1925 2474 565 561 1926 -2264 5 2 1 1 2474 565 561 1926 1101 76 75 964 -2265 5 2 1 1 473 31 30 336 2475 622 618 1927 -2266 5 2 1 1 2475 622 618 1927 2476 623 619 1928 -2267 5 2 1 1 2476 623 619 1928 2477 624 620 1929 -2268 5 2 1 1 2477 624 620 1929 2478 625 621 1930 -2269 5 2 1 1 2478 625 621 1930 1102 91 90 965 -2270 5 2 1 1 474 46 45 337 2479 682 678 1931 -2271 5 2 1 1 2479 682 678 1931 2480 683 679 1932 -2272 5 2 1 1 2480 683 679 1932 2481 684 680 1933 -2273 5 2 1 1 2481 684 680 1933 2482 685 681 1934 -2274 5 2 1 1 2482 685 681 1934 1103 106 105 966 -2275 5 2 1 1 475 61 60 338 2483 742 738 1935 -2276 5 2 1 1 2483 742 738 1935 2484 743 739 1936 -2277 5 2 1 1 2484 743 739 1936 2485 744 740 1937 -2278 5 2 1 1 2485 744 740 1937 2486 745 741 1938 -2279 5 2 1 1 2486 745 741 1938 1104 121 120 967 -2280 5 2 1 1 335 231 331 472 1923 1507 1907 2471 -2281 5 2 1 1 1923 1507 1907 2471 1924 1508 1908 2472 -2282 5 2 1 1 1924 1508 1908 2472 1925 1509 1909 2473 -2283 5 2 1 1 1925 1509 1909 2473 1926 1510 1910 2474 -2284 5 2 1 1 1926 1510 1910 2474 964 860 960 1101 -2285 5 2 1 1 482 281 184 385 2511 1707 1319 2123 -2286 5 2 1 1 2511 1707 1319 2123 2512 1708 1320 2124 -2287 5 2 1 1 2512 1708 1320 2124 2513 1709 1321 2125 -2288 5 2 1 1 2513 1709 1321 2125 2514 1710 1322 2126 -2289 5 2 1 1 2514 1710 1322 2126 1111 910 813 1014 -2290 5 2 1 1 483 386 186 284 2515 2127 1327 1719 -2291 5 2 1 1 2515 2127 1327 1719 2516 2128 1328 1720 -2292 5 2 1 1 2516 2128 1328 1720 2517 2129 1329 1721 -2293 5 2 1 1 2517 2129 1329 1721 2518 2130 1330 1722 -2294 5 2 1 1 2518 2130 1330 1722 1112 1015 815 913 -2295 5 2 1 1 497 360 520 252 2571 2023 2663 1591 -2296 5 2 1 1 2571 2023 2663 1591 2572 2024 2664 1592 -2297 5 2 1 1 2572 2024 2664 1592 2573 2025 2665 1593 -2298 5 2 1 1 2573 2025 2665 1593 2574 2026 2666 1594 -2299 5 2 1 1 2574 2026 2666 1594 1126 989 1149 881 -2300 5 2 1 1 349 196 347 452 1979 1367 1971 2391 -2301 5 2 1 1 1979 1367 1971 2391 1980 1368 1972 2392 -2302 5 2 1 1 1980 1368 1972 2392 1981 1369 1973 2393 -2303 5 2 1 1 1981 1369 1973 2393 1982 1370 1974 2394 -2304 5 2 1 1 1982 1370 1974 2394 978 825 976 1081 -2305 5 2 1 1 340 528 327 208 1943 2695 1891 1415 -2306 5 2 1 1 1943 2695 1891 1415 1944 2696 1892 1416 -2307 5 2 1 1 1944 2696 1892 1416 1945 2697 1893 1417 -2308 5 2 1 1 1945 2697 1893 1417 1946 2698 1894 1418 -2309 5 2 1 1 1946 2698 1894 1418 969 1157 956 837 -2310 5 2 1 1 408 323 214 469 2215 1875 1439 2459 -2311 5 2 1 1 2215 1875 1439 2459 2216 1876 1440 2460 -2312 5 2 1 1 2216 1876 1440 2460 2217 1877 1441 2461 -2313 5 2 1 1 2217 1877 1441 2461 2218 1878 1442 2462 -2314 5 2 1 1 2218 1878 1442 2462 1037 952 843 1098 -2315 5 2 1 1 398 278 174 426 2175 1695 1279 2287 -2316 5 2 1 1 2175 1695 1279 2287 2176 1696 1280 2288 -2317 5 2 1 1 2176 1696 1280 2288 2177 1697 1281 2289 -2318 5 2 1 1 2177 1697 1281 2289 2178 1698 1282 2290 -2319 5 2 1 1 2178 1698 1282 2290 1027 907 803 1055 -2320 5 2 1 1 153 486 280 484 1195 2527 1703 2519 -2321 5 2 1 1 1195 2527 1703 2519 1196 2528 1704 2520 -2322 5 2 1 1 1196 2528 1704 2520 1197 2529 1705 2521 -2323 5 2 1 1 1197 2529 1705 2521 1198 2530 1706 2522 -2324 5 2 1 1 1198 2530 1706 2522 782 1115 909 1113 -2325 5 2 1 1 236 471 253 325 1527 2467 1595 1883 -2326 5 2 1 1 1527 2467 1595 1883 1528 2468 1596 1884 -2327 5 2 1 1 1528 2468 1596 1884 1529 2469 1597 1885 -2328 5 2 1 1 1529 2469 1597 1885 1530 2470 1598 1886 -2329 5 2 1 1 1530 2470 1598 1886 865 1100 882 954 -2330 5 2 1 1 16 472 331 17 562 2471 1907 566 -2331 5 2 1 1 562 2471 1907 566 563 2472 1908 567 -2332 5 2 1 1 563 2472 1908 567 564 2473 1909 568 -2333 5 2 1 1 564 2473 1909 568 565 2474 1910 569 -2334 5 2 1 1 565 2474 1910 569 76 1101 960 77 -2335 5 2 1 1 31 473 332 32 622 2475 1911 626 -2336 5 2 1 1 622 2475 1911 626 623 2476 1912 627 -2337 5 2 1 1 623 2476 1912 627 624 2477 1913 628 -2338 5 2 1 1 624 2477 1913 628 625 2478 1914 629 -2339 5 2 1 1 625 2478 1914 629 91 1102 961 92 -2340 5 2 1 1 46 474 333 47 682 2479 1915 686 -2341 5 2 1 1 682 2479 1915 686 683 2480 1916 687 -2342 5 2 1 1 683 2480 1916 687 684 2481 1917 688 -2343 5 2 1 1 684 2481 1917 688 685 2482 1918 689 -2344 5 2 1 1 685 2482 1918 689 106 1103 962 107 -2345 5 2 1 1 61 475 334 62 742 2483 1919 746 -2346 5 2 1 1 742 2483 1919 746 743 2484 1920 747 -2347 5 2 1 1 743 2484 1920 747 744 2485 1921 748 -2348 5 2 1 1 744 2485 1921 748 745 2486 1922 749 -2349 5 2 1 1 745 2486 1922 749 121 1104 963 122 -2350 5 2 1 1 515 232 473 336 2643 1511 2475 1927 -2351 5 2 1 1 2643 1511 2475 1927 2644 1512 2476 1928 -2352 5 2 1 1 2644 1512 2476 1928 2645 1513 2477 1929 -2353 5 2 1 1 2645 1513 2477 1929 2646 1514 2478 1930 -2354 5 2 1 1 2646 1514 2478 1930 1144 861 1102 965 -2355 5 2 1 1 516 233 474 337 2647 1515 2479 1931 -2356 5 2 1 1 2647 1515 2479 1931 2648 1516 2480 1932 -2357 5 2 1 1 2648 1516 2480 1932 2649 1517 2481 1933 -2358 5 2 1 1 2649 1517 2481 1933 2650 1518 2482 1934 -2359 5 2 1 1 2650 1518 2482 1934 1145 862 1103 966 -2360 5 2 1 1 517 234 475 338 2651 1519 2483 1935 -2361 5 2 1 1 2651 1519 2483 1935 2652 1520 2484 1936 -2362 5 2 1 1 2652 1520 2484 1936 2653 1521 2485 1937 -2363 5 2 1 1 2653 1521 2485 1937 2654 1522 2486 1938 -2364 5 2 1 1 2654 1522 2486 1938 1146 863 1104 967 -2365 5 2 1 1 359 157 342 401 2019 1211 1951 2187 -2366 5 2 1 1 2019 1211 1951 2187 2020 1212 1952 2188 -2367 5 2 1 1 2020 1212 1952 2188 2021 1213 1953 2189 -2368 5 2 1 1 2021 1213 1953 2189 2022 1214 1954 2190 -2369 5 2 1 1 2022 1214 1954 2190 988 786 971 1030 -2370 5 2 1 1 501 326 358 145 2587 1887 2015 1163 -2371 5 2 1 1 2587 1887 2015 1163 2588 1888 2016 1164 -2372 5 2 1 1 2588 1888 2016 1164 2589 1889 2017 1165 -2373 5 2 1 1 2589 1889 2017 1165 2590 1890 2018 1166 -2374 5 2 1 1 2590 1890 2018 1166 1130 955 987 774 -2375 5 2 1 1 430 343 388 158 2303 1955 2135 1215 -2376 5 2 1 1 2303 1955 2135 1215 2304 1956 2136 1216 -2377 5 2 1 1 2304 1956 2136 1216 2305 1957 2137 1217 -2378 5 2 1 1 2305 1957 2137 1217 2306 1958 2138 1218 -2379 5 2 1 1 2306 1958 2138 1218 1059 972 1017 787 -2380 5 2 1 1 431 344 389 159 2307 1959 2139 1219 -2381 5 2 1 1 2307 1959 2139 1219 2308 1960 2140 1220 -2382 5 2 1 1 2308 1960 2140 1220 2309 1961 2141 1221 -2383 5 2 1 1 2309 1961 2141 1221 2310 1962 2142 1222 -2384 5 2 1 1 2310 1962 2142 1222 1060 973 1018 788 -2385 5 2 1 1 432 345 390 160 2311 1963 2143 1223 -2386 5 2 1 1 2311 1963 2143 1223 2312 1964 2144 1224 -2387 5 2 1 1 2312 1964 2144 1224 2313 1965 2145 1225 -2388 5 2 1 1 2313 1965 2145 1225 2314 1966 2146 1226 -2389 5 2 1 1 2314 1966 2146 1226 1061 974 1019 789 -2390 5 2 1 1 433 161 391 346 2315 1227 2147 1967 -2391 5 2 1 1 2315 1227 2147 1967 2316 1228 2148 1968 -2392 5 2 1 1 2316 1228 2148 1968 2317 1229 2149 1969 -2393 5 2 1 1 2317 1229 2149 1969 2318 1230 2150 1970 -2394 5 2 1 1 2318 1230 2150 1970 1062 790 1020 975 -2395 5 2 1 1 150 485 306 496 1183 2523 1807 2567 -2396 5 2 1 1 1183 2523 1807 2567 1184 2524 1808 2568 -2397 5 2 1 1 1184 2524 1808 2568 1185 2525 1809 2569 -2398 5 2 1 1 1185 2525 1809 2569 1186 2526 1810 2570 -2399 5 2 1 1 1186 2526 1810 2570 779 1114 935 1125 -2400 5 2 1 1 529 376 448 221 2699 2087 2375 1467 -2401 5 2 1 1 2699 2087 2375 1467 2700 2088 2376 1468 -2402 5 2 1 1 2700 2088 2376 1468 2701 2089 2377 1469 -2403 5 2 1 1 2701 2089 2377 1469 2702 2090 2378 1470 -2404 5 2 1 1 2702 2090 2378 1470 1158 1005 1077 850 -2405 5 2 1 1 530 375 457 220 2703 2083 2411 1463 -2406 5 2 1 1 2703 2083 2411 1463 2704 2084 2412 1464 -2407 5 2 1 1 2704 2084 2412 1464 2705 2085 2413 1465 -2408 5 2 1 1 2705 2085 2413 1465 2706 2086 2414 1466 -2409 5 2 1 1 2706 2086 2414 1466 1159 1004 1086 849 -2410 5 2 1 1 231 492 264 331 1507 2551 1639 1907 -2411 5 2 1 1 1507 2551 1639 1907 1508 2552 1640 1908 -2412 5 2 1 1 1508 2552 1640 1908 1509 2553 1641 1909 -2413 5 2 1 1 1509 2553 1641 1909 1510 2554 1642 1910 -2414 5 2 1 1 1510 2554 1642 1910 860 1121 893 960 -2415 5 2 1 1 493 332 473 232 2555 1911 2475 1511 -2416 5 2 1 1 2555 1911 2475 1511 2556 1912 2476 1512 -2417 5 2 1 1 2556 1912 2476 1512 2557 1913 2477 1513 -2418 5 2 1 1 2557 1913 2477 1513 2558 1914 2478 1514 -2419 5 2 1 1 2558 1914 2478 1514 1122 961 1102 861 -2420 5 2 1 1 494 333 474 233 2559 1915 2479 1515 -2421 5 2 1 1 2559 1915 2479 1515 2560 1916 2480 1516 -2422 5 2 1 1 2560 1916 2480 1516 2561 1917 2481 1517 -2423 5 2 1 1 2561 1917 2481 1517 2562 1918 2482 1518 -2424 5 2 1 1 2562 1918 2482 1518 1123 962 1103 862 -2425 5 2 1 1 495 334 475 234 2563 1919 2483 1519 -2426 5 2 1 1 2563 1919 2483 1519 2564 1920 2484 1520 -2427 5 2 1 1 2564 1920 2484 1520 2565 1921 2485 1521 -2428 5 2 1 1 2565 1921 2485 1521 2566 1922 2486 1522 -2429 5 2 1 1 2566 1922 2486 1522 1124 963 1104 863 -2430 5 2 1 1 349 452 453 235 1979 2391 2395 1523 -2431 5 2 1 1 1979 2391 2395 1523 1980 2392 2396 1524 -2432 5 2 1 1 1980 2392 2396 1524 1981 2393 2397 1525 -2433 5 2 1 1 1981 2393 2397 1525 1982 2394 2398 1526 -2434 5 2 1 1 1982 2394 2398 1526 978 1081 1082 864 -2435 5 2 1 1 235 502 168 349 1523 2591 1255 1979 -2436 5 2 1 1 1523 2591 1255 1979 1524 2592 1256 1980 -2437 5 2 1 1 1524 2592 1256 1980 1525 2593 1257 1981 -2438 5 2 1 1 1525 2593 1257 1981 1526 2594 1258 1982 -2439 5 2 1 1 1526 2594 1258 1982 864 1131 797 978 -2440 5 2 1 1 410 20 19 370 2223 578 574 2063 -2441 5 2 1 1 2223 578 574 2063 2224 579 575 2064 -2442 5 2 1 1 2224 579 575 2064 2225 580 576 2065 -2443 5 2 1 1 2225 580 576 2065 2226 581 577 2066 -2444 5 2 1 1 2226 581 577 2066 1039 80 79 999 -2445 5 2 1 1 411 35 34 371 2227 638 634 2067 -2446 5 2 1 1 2227 638 634 2067 2228 639 635 2068 -2447 5 2 1 1 2228 639 635 2068 2229 640 636 2069 -2448 5 2 1 1 2229 640 636 2069 2230 641 637 2070 -2449 5 2 1 1 2230 641 637 2070 1040 95 94 1000 -2450 5 2 1 1 412 50 49 372 2231 698 694 2071 -2451 5 2 1 1 2231 698 694 2071 2232 699 695 2072 -2452 5 2 1 1 2232 699 695 2072 2233 700 696 2073 -2453 5 2 1 1 2233 700 696 2073 2234 701 697 2074 -2454 5 2 1 1 2234 701 697 2074 1041 110 109 1001 -2455 5 2 1 1 413 65 64 373 2235 758 754 2075 -2456 5 2 1 1 2235 758 754 2075 2236 759 755 2076 -2457 5 2 1 1 2236 759 755 2076 2237 760 756 2077 -2458 5 2 1 1 2237 760 756 2077 2238 761 757 2078 -2459 5 2 1 1 2238 761 757 2078 1042 125 124 1002 -2460 5 2 1 1 414 366 14 13 2239 2047 554 550 -2461 5 2 1 1 2239 2047 554 550 2240 2048 555 551 -2462 5 2 1 1 2240 2048 555 551 2241 2049 556 552 -2463 5 2 1 1 2241 2049 556 552 2242 2050 557 553 -2464 5 2 1 1 2242 2050 557 553 1043 995 74 73 -2465 5 2 1 1 415 367 29 28 2243 2051 614 610 -2466 5 2 1 1 2243 2051 614 610 2244 2052 615 611 -2467 5 2 1 1 2244 2052 615 611 2245 2053 616 612 -2468 5 2 1 1 2245 2053 616 612 2246 2054 617 613 -2469 5 2 1 1 2246 2054 617 613 1044 996 89 88 -2470 5 2 1 1 416 368 44 43 2247 2055 674 670 -2471 5 2 1 1 2247 2055 674 670 2248 2056 675 671 -2472 5 2 1 1 2248 2056 675 671 2249 2057 676 672 -2473 5 2 1 1 2249 2057 676 672 2250 2058 677 673 -2474 5 2 1 1 2250 2058 677 673 1045 997 104 103 -2475 5 2 1 1 417 369 59 58 2251 2059 734 730 -2476 5 2 1 1 2251 2059 734 730 2252 2060 735 731 -2477 5 2 1 1 2252 2060 735 731 2253 2061 736 732 -2478 5 2 1 1 2253 2061 736 732 2254 2062 737 733 -2479 5 2 1 1 2254 2062 737 733 1046 998 119 118 -2480 5 2 1 1 173 422 240 462 1275 2271 1543 2431 -2481 5 2 1 1 1275 2271 1543 2431 1276 2272 1544 2432 -2482 5 2 1 1 1276 2272 1544 2432 1277 2273 1545 2433 -2483 5 2 1 1 1277 2273 1545 2433 1278 2274 1546 2434 -2484 5 2 1 1 1278 2274 1546 2434 802 1051 869 1091 -2485 5 2 1 1 423 454 503 253 2275 2399 2595 1595 -2486 5 2 1 1 2275 2399 2595 1595 2276 2400 2596 1596 -2487 5 2 1 1 2276 2400 2596 1596 2277 2401 2597 1597 -2488 5 2 1 1 2277 2401 2597 1597 2278 2402 2598 1598 -2489 5 2 1 1 2278 2402 2598 1598 1052 1083 1132 882 -2490 5 2 1 1 425 279 164 424 2283 1699 1239 2279 -2491 5 2 1 1 2283 1699 1239 2279 2284 1700 1240 2280 -2492 5 2 1 1 2284 1700 1240 2280 2285 1701 1241 2281 -2493 5 2 1 1 2285 1701 1241 2281 2286 1702 1242 2282 -2494 5 2 1 1 2286 1702 1242 2282 1054 908 793 1053 -2495 5 2 1 1 350 10 9 463 1983 538 534 2435 -2496 5 2 1 1 1983 538 534 2435 1984 539 535 2436 -2497 5 2 1 1 1984 539 535 2436 1985 540 536 2437 -2498 5 2 1 1 1985 540 536 2437 1986 541 537 2438 -2499 5 2 1 1 1986 541 537 2438 979 70 69 1092 -2500 5 2 1 1 351 25 24 464 1987 598 594 2439 -2501 5 2 1 1 1987 598 594 2439 1988 599 595 2440 -2502 5 2 1 1 1988 599 595 2440 1989 600 596 2441 -2503 5 2 1 1 1989 600 596 2441 1990 601 597 2442 -2504 5 2 1 1 1990 601 597 2442 980 85 84 1093 -2505 5 2 1 1 352 40 39 465 1991 658 654 2443 -2506 5 2 1 1 1991 658 654 2443 1992 659 655 2444 -2507 5 2 1 1 1992 659 655 2444 1993 660 656 2445 -2508 5 2 1 1 1993 660 656 2445 1994 661 657 2446 -2509 5 2 1 1 1994 661 657 2446 981 100 99 1094 -2510 5 2 1 1 353 55 54 466 1995 718 714 2447 -2511 5 2 1 1 1995 718 714 2447 1996 719 715 2448 -2512 5 2 1 1 1996 719 715 2448 1997 720 716 2449 -2513 5 2 1 1 1997 720 716 2449 1998 721 717 2450 -2514 5 2 1 1 1998 721 717 2450 982 115 114 1095 -2515 5 2 1 1 157 359 240 451 1211 2019 1543 2387 -2516 5 2 1 1 1211 2019 1543 2387 1212 2020 1544 2388 -2517 5 2 1 1 1212 2020 1544 2388 1213 2021 1545 2389 -2518 5 2 1 1 1213 2021 1545 2389 1214 2022 1546 2390 -2519 5 2 1 1 1214 2022 1546 2390 786 988 869 1080 -2520 5 2 1 1 238 519 400 339 1535 2659 2183 1939 -2521 5 2 1 1 1535 2659 2183 1939 1536 2660 2184 1940 -2522 5 2 1 1 1536 2660 2184 1940 1537 2661 2185 1941 -2523 5 2 1 1 1537 2661 2185 1941 1538 2662 2186 1942 -2524 5 2 1 1 1538 2662 2186 1942 867 1148 1029 968 -2525 5 2 1 1 476 358 326 197 2487 2015 1887 1371 -2526 5 2 1 1 2487 2015 1887 1371 2488 2016 1888 1372 -2527 5 2 1 1 2488 2016 1888 1372 2489 2017 1889 1373 -2528 5 2 1 1 2489 2017 1889 1373 2490 2018 1890 1374 -2529 5 2 1 1 2490 2018 1890 1374 1105 987 955 826 -2530 5 2 1 1 297 445 216 446 1771 2363 1447 2367 -2531 5 2 1 1 1771 2363 1447 2367 1772 2364 1448 2368 -2532 5 2 1 1 1772 2364 1448 2368 1773 2365 1449 2369 -2533 5 2 1 1 1773 2365 1449 2369 1774 2366 1450 2370 -2534 5 2 1 1 1774 2366 1450 2370 926 1074 845 1075 -2535 5 2 1 1 298 444 217 447 1775 2359 1451 2371 -2536 5 2 1 1 1775 2359 1451 2371 1776 2360 1452 2372 -2537 5 2 1 1 1776 2360 1452 2372 1777 2361 1453 2373 -2538 5 2 1 1 1777 2361 1453 2373 1778 2362 1454 2374 -2539 5 2 1 1 1778 2362 1454 2374 927 1073 846 1076 -2540 5 2 1 1 208 453 164 362 1415 2395 1239 2031 -2541 5 2 1 1 1415 2395 1239 2031 1416 2396 1240 2032 -2542 5 2 1 1 1416 2396 1240 2032 1417 2397 1241 2033 -2543 5 2 1 1 1417 2397 1241 2033 1418 2398 1242 2034 -2544 5 2 1 1 1418 2398 1242 2034 837 1082 793 991 -2545 5 2 1 1 340 172 471 528 1943 1271 2467 2695 -2546 5 2 1 1 1943 1271 2467 2695 1944 1272 2468 2696 -2547 5 2 1 1 1944 1272 2468 2696 1945 1273 2469 2697 -2548 5 2 1 1 1945 1273 2469 2697 1946 1274 2470 2698 -2549 5 2 1 1 1946 1274 2470 2698 969 801 1100 1157 -2550 5 2 1 1 531 381 315 150 2707 2107 1843 1183 -2551 5 2 1 1 2707 2107 1843 1183 2708 2108 1844 1184 -2552 5 2 1 1 2708 2108 1844 1184 2709 2109 1845 1185 -2553 5 2 1 1 2709 2109 1845 1185 2710 2110 1846 1186 -2554 5 2 1 1 2710 2110 1846 1186 1160 1010 944 779 -2555 5 2 1 1 503 197 326 223 2595 1371 1887 1475 -2556 5 2 1 1 2595 1371 1887 1475 2596 1372 1888 1476 -2557 5 2 1 1 2596 1372 1888 1476 2597 1373 1889 1477 -2558 5 2 1 1 2597 1373 1889 1477 2598 1374 1890 1478 -2559 5 2 1 1 2598 1374 1890 1478 1132 826 955 852 -2560 5 2 1 1 500 396 461 228 2583 2167 2427 1495 -2561 5 2 1 1 2583 2167 2427 1495 2584 2168 2428 1496 -2562 5 2 1 1 2584 2168 2428 1496 2585 2169 2429 1497 -2563 5 2 1 1 2585 2169 2429 1497 2586 2170 2430 1498 -2564 5 2 1 1 2586 2170 2430 1498 1129 1025 1090 857 -2565 5 2 1 1 170 348 230 513 1263 1975 1503 2635 -2566 5 2 1 1 1263 1975 1503 2635 1264 1976 1504 2636 -2567 5 2 1 1 1264 1976 1504 2636 1265 1977 1505 2637 -2568 5 2 1 1 1265 1977 1505 2637 1266 1978 1506 2638 -2569 5 2 1 1 1266 1978 1506 2638 799 977 859 1142 -2570 5 2 1 1 358 476 397 230 2015 2487 2171 1503 -2571 5 2 1 1 2015 2487 2171 1503 2016 2488 2172 1504 -2572 5 2 1 1 2016 2488 2172 1504 2017 2489 2173 1505 -2573 5 2 1 1 2017 2489 2173 1505 2018 2490 2174 1506 -2574 5 2 1 1 2018 2490 2174 1506 987 1105 1026 859 -2575 5 2 1 1 342 522 414 254 1951 2671 2239 1599 -2576 5 2 1 1 1951 2671 2239 1599 1952 2672 2240 1600 -2577 5 2 1 1 1952 2672 2240 1600 1953 2673 2241 1601 -2578 5 2 1 1 1953 2673 2241 1601 1954 2674 2242 1602 -2579 5 2 1 1 1954 2674 2242 1602 971 1151 1043 883 -2580 5 2 1 1 523 347 196 261 2675 1971 1367 1627 -2581 5 2 1 1 2675 1971 1367 1627 2676 1972 1368 1628 -2582 5 2 1 1 2676 1972 1368 1628 2677 1973 1369 1629 -2583 5 2 1 1 2677 1973 1369 1629 2678 1974 1370 1630 -2584 5 2 1 1 2678 1974 1370 1630 1152 976 825 890 -2585 5 2 1 1 504 11 10 350 2599 542 538 1983 -2586 5 2 1 1 2599 542 538 1983 2600 543 539 1984 -2587 5 2 1 1 2600 543 539 1984 2601 544 540 1985 -2588 5 2 1 1 2601 544 540 1985 2602 545 541 1986 -2589 5 2 1 1 2602 545 541 1986 1133 71 70 979 -2590 5 2 1 1 505 26 25 351 2603 602 598 1987 -2591 5 2 1 1 2603 602 598 1987 2604 603 599 1988 -2592 5 2 1 1 2604 603 599 1988 2605 604 600 1989 -2593 5 2 1 1 2605 604 600 1989 2606 605 601 1990 -2594 5 2 1 1 2606 605 601 1990 1134 86 85 980 -2595 5 2 1 1 506 41 40 352 2607 662 658 1991 -2596 5 2 1 1 2607 662 658 1991 2608 663 659 1992 -2597 5 2 1 1 2608 663 659 1992 2609 664 660 1993 -2598 5 2 1 1 2609 664 660 1993 2610 665 661 1994 -2599 5 2 1 1 2610 665 661 1994 1135 101 100 981 -2600 5 2 1 1 507 56 55 353 2611 722 718 1995 -2601 5 2 1 1 2611 722 718 1995 2612 723 719 1996 -2602 5 2 1 1 2612 723 719 1996 2613 724 720 1997 -2603 5 2 1 1 2613 724 720 1997 2614 725 721 1998 -2604 5 2 1 1 2614 725 721 1998 1136 116 115 982 -2605 5 2 1 1 22 508 193 354 586 2615 1355 1999 -2606 5 2 1 1 586 2615 1355 1999 587 2616 1356 2000 -2607 5 2 1 1 587 2616 1356 2000 588 2617 1357 2001 -2608 5 2 1 1 588 2617 1357 2001 589 2618 1358 2002 -2609 5 2 1 1 589 2618 1358 2002 82 1137 822 983 -2610 5 2 1 1 509 355 38 37 2619 2003 650 646 -2611 5 2 1 1 2619 2003 650 646 2620 2004 651 647 -2612 5 2 1 1 2620 2004 651 647 2621 2005 652 648 -2613 5 2 1 1 2621 2005 652 648 2622 2006 653 649 -2614 5 2 1 1 2622 2006 653 649 1138 984 98 97 -2615 5 2 1 1 510 356 53 52 2623 2007 710 706 -2616 5 2 1 1 2623 2007 710 706 2624 2008 711 707 -2617 5 2 1 1 2624 2008 711 707 2625 2009 712 708 -2618 5 2 1 1 2625 2009 712 708 2626 2010 713 709 -2619 5 2 1 1 2626 2010 713 709 1139 985 113 112 -2620 5 2 1 1 511 357 68 67 2627 2011 770 766 -2621 5 2 1 1 2627 2011 770 766 2628 2012 771 767 -2622 5 2 1 1 2628 2012 771 767 2629 2013 772 768 -2623 5 2 1 1 2629 2013 772 768 2630 2014 773 769 -2624 5 2 1 1 2630 2014 773 769 1140 986 128 127 -2625 5 2 1 1 229 383 152 456 1499 2115 1191 2407 -2626 5 2 1 1 1499 2115 1191 2407 1500 2116 1192 2408 -2627 5 2 1 1 1500 2116 1192 2408 1501 2117 1193 2409 -2628 5 2 1 1 1501 2117 1193 2409 1502 2118 1194 2410 -2629 5 2 1 1 1502 2118 1194 2410 858 1012 781 1085 -2630 5 2 1 1 497 169 406 360 2571 1259 2207 2023 -2631 5 2 1 1 2571 1259 2207 2023 2572 1260 2208 2024 -2632 5 2 1 1 2572 1260 2208 2024 2573 1261 2209 2025 -2633 5 2 1 1 2573 1261 2209 2025 2574 1262 2210 2026 -2634 5 2 1 1 2574 1262 2210 2026 1126 798 1035 989 -2635 5 2 1 1 227 531 296 405 1491 2707 1767 2203 -2636 5 2 1 1 1491 2707 1767 2203 1492 2708 1768 2204 -2637 5 2 1 1 1492 2708 1768 2204 1493 2709 1769 2205 -2638 5 2 1 1 1493 2709 1769 2205 1494 2710 1770 2206 -2639 5 2 1 1 1494 2710 1770 2206 856 1160 925 1034 -2640 5 2 1 1 227 405 300 460 1491 2203 1783 2423 -2641 5 2 1 1 1491 2203 1783 2423 1492 2204 1784 2424 -2642 5 2 1 1 1492 2204 1784 2424 1493 2205 1785 2425 -2643 5 2 1 1 1493 2205 1785 2425 1494 2206 1786 2426 -2644 5 2 1 1 1494 2206 1786 2426 856 1034 929 1089 -2645 5 2 1 1 503 454 328 197 2595 2399 1895 1371 -2646 5 2 1 1 2595 2399 1895 1371 2596 2400 1896 1372 -2647 5 2 1 1 2596 2400 1896 1372 2597 2401 1897 1373 -2648 5 2 1 1 2597 2401 1897 1373 2598 2402 1898 1374 -2649 5 2 1 1 2598 2402 1898 1374 1132 1083 957 826 -2650 5 2 1 1 404 231 335 514 2199 1507 1923 2639 -2651 5 2 1 1 2199 1507 1923 2639 2200 1508 1924 2640 -2652 5 2 1 1 2200 1508 1924 2640 2201 1509 1925 2641 -2653 5 2 1 1 2201 1509 1925 2641 2202 1510 1926 2642 -2654 5 2 1 1 2202 1510 1926 2642 1033 860 964 1143 -2655 5 2 1 1 515 175 525 232 2643 1283 2683 1511 -2656 5 2 1 1 2643 1283 2683 1511 2644 1284 2684 1512 -2657 5 2 1 1 2644 1284 2684 1512 2645 1285 2685 1513 -2658 5 2 1 1 2645 1285 2685 1513 2646 1286 2686 1514 -2659 5 2 1 1 2646 1286 2686 1514 1144 804 1154 861 -2660 5 2 1 1 516 176 526 233 2647 1287 2687 1515 -2661 5 2 1 1 2647 1287 2687 1515 2648 1288 2688 1516 -2662 5 2 1 1 2648 1288 2688 1516 2649 1289 2689 1517 -2663 5 2 1 1 2649 1289 2689 1517 2650 1290 2690 1518 -2664 5 2 1 1 2650 1290 2690 1518 1145 805 1155 862 -2665 5 2 1 1 408 469 319 147 2215 2459 1859 1171 -2666 5 2 1 1 2215 2459 1859 1171 2216 2460 1860 1172 -2667 5 2 1 1 2216 2460 1860 1172 2217 2461 1861 1173 -2668 5 2 1 1 2217 2461 1861 1173 2218 2462 1862 1174 -2669 5 2 1 1 2218 2462 1862 1174 1037 1098 948 776 -2670 5 2 1 1 238 498 171 399 1535 2575 1267 2179 -2671 5 2 1 1 1535 2575 1267 2179 1536 2576 1268 2180 -2672 5 2 1 1 1536 2576 1268 2180 1537 2577 1269 2181 -2673 5 2 1 1 1537 2577 1269 2181 1538 2578 1270 2182 -2674 5 2 1 1 1538 2578 1270 2182 867 1127 800 1028 -2675 5 2 1 1 225 467 277 395 1483 2451 1691 2163 -2676 5 2 1 1 1483 2451 1691 2163 1484 2452 1692 2164 -2677 5 2 1 1 1484 2452 1692 2164 1485 2453 1693 2165 -2678 5 2 1 1 1485 2453 1693 2165 1486 2454 1694 2166 -2679 5 2 1 1 1486 2454 1694 2166 854 1096 906 1024 -2680 5 2 1 1 224 468 276 394 1479 2455 1687 2159 -2681 5 2 1 1 1479 2455 1687 2159 1480 2456 1688 2160 -2682 5 2 1 1 1480 2456 1688 2160 1481 2457 1689 2161 -2683 5 2 1 1 1481 2457 1689 2161 1482 2458 1690 2162 -2684 5 2 1 1 1482 2458 1690 2162 853 1097 905 1023 -2685 5 2 1 1 449 146 317 407 2379 1167 1851 2211 -2686 5 2 1 1 2379 1167 1851 2211 2380 1168 1852 2212 -2687 5 2 1 1 2380 1168 1852 2212 2381 1169 1853 2213 -2688 5 2 1 1 2381 1169 1853 2213 2382 1170 1854 2214 -2689 5 2 1 1 2382 1170 1854 2214 1078 775 946 1036 -2690 5 2 1 1 450 148 316 409 2383 1175 1847 2219 -2691 5 2 1 1 2383 1175 1847 2219 2384 1176 1848 2220 -2692 5 2 1 1 2384 1176 1848 2220 2385 1177 1849 2221 -2693 5 2 1 1 2385 1177 1849 2221 2386 1178 1850 2222 -2694 5 2 1 1 2386 1178 1850 2222 1079 777 945 1038 -2695 5 2 1 1 522 398 426 200 2671 2175 2287 1383 -2696 5 2 1 1 2671 2175 2287 1383 2672 2176 2288 1384 -2697 5 2 1 1 2672 2176 2288 1384 2673 2177 2289 1385 -2698 5 2 1 1 2673 2177 2289 1385 2674 2178 2290 1386 -2699 5 2 1 1 2674 2178 2290 1386 1151 1027 1055 829 -2700 5 2 1 1 385 226 292 482 2123 1487 1751 2511 -2701 5 2 1 1 2123 1487 1751 2511 2124 1488 1752 2512 -2702 5 2 1 1 2124 1488 1752 2512 2125 1489 1753 2513 -2703 5 2 1 1 2125 1489 1753 2513 2126 1490 1754 2514 -2704 5 2 1 1 2126 1490 1754 2514 1014 855 921 1111 -2705 5 2 1 1 483 229 456 386 2515 1499 2407 2127 -2706 5 2 1 1 2515 1499 2407 2127 2516 1500 2408 2128 -2707 5 2 1 1 2516 1500 2408 2128 2517 1501 2409 2129 -2708 5 2 1 1 2517 1501 2409 2129 2518 1502 2410 2130 -2709 5 2 1 1 2518 1502 2410 2130 1112 858 1085 1015 -2710 5 2 1 1 224 487 246 378 1479 2531 1567 2095 -2711 5 2 1 1 1479 2531 1567 2095 1480 2532 1568 2096 -2712 5 2 1 1 1480 2532 1568 2096 1481 2533 1569 2097 -2713 5 2 1 1 1481 2533 1569 2097 1482 2534 1570 2098 -2714 5 2 1 1 1482 2534 1570 2098 853 1116 875 1007 -2715 5 2 1 1 225 488 247 379 1483 2535 1571 2099 -2716 5 2 1 1 1483 2535 1571 2099 1484 2536 1572 2100 -2717 5 2 1 1 1484 2536 1572 2100 1485 2537 1573 2101 -2718 5 2 1 1 1485 2537 1573 2101 1486 2538 1574 2102 -2719 5 2 1 1 1486 2538 1574 2102 854 1117 876 1008 -2720 5 2 1 1 228 490 246 382 1495 2543 1567 2111 -2721 5 2 1 1 1495 2543 1567 2111 1496 2544 1568 2112 -2722 5 2 1 1 1496 2544 1568 2112 1497 2545 1569 2113 -2723 5 2 1 1 1497 2545 1569 2113 1498 2546 1570 2114 -2724 5 2 1 1 1498 2546 1570 2114 857 1119 875 1011 -2725 5 2 1 1 229 491 247 383 1499 2547 1571 2115 -2726 5 2 1 1 1499 2547 1571 2115 1500 2548 1572 2116 -2727 5 2 1 1 1500 2548 1572 2116 1501 2549 1573 2117 -2728 5 2 1 1 1501 2549 1573 2117 1502 2550 1574 2118 -2729 5 2 1 1 1502 2550 1574 2118 858 1120 876 1012 -2730 5 2 1 1 400 239 377 501 2183 1539 2091 2587 -2731 5 2 1 1 2183 1539 2091 2587 2184 1540 2092 2588 -2732 5 2 1 1 2184 1540 2092 2588 2185 1541 2093 2589 -2733 5 2 1 1 2185 1541 2093 2589 2186 1542 2094 2590 -2734 5 2 1 1 2186 1542 2094 2590 1029 868 1006 1130 -2735 5 2 1 1 501 145 339 400 2587 1163 1939 2183 -2736 5 2 1 1 2587 1163 1939 2183 2588 1164 1940 2184 -2737 5 2 1 1 2588 1164 1940 2184 2589 1165 1941 2185 -2738 5 2 1 1 2589 1165 1941 2185 2590 1166 1942 2186 -2739 5 2 1 1 2590 1166 1942 2186 1130 774 968 1029 -2740 5 2 1 1 221 458 249 403 1467 2415 1579 2195 -2741 5 2 1 1 1467 2415 1579 2195 1468 2416 1580 2196 -2742 5 2 1 1 1468 2416 1580 2196 1469 2417 1581 2197 -2743 5 2 1 1 1469 2417 1581 2197 1470 2418 1582 2198 -2744 5 2 1 1 1470 2418 1582 2198 850 1087 878 1032 -2745 5 2 1 1 220 459 248 402 1463 2419 1575 2191 -2746 5 2 1 1 1463 2419 1575 2191 1464 2420 1576 2192 -2747 5 2 1 1 1464 2420 1576 2192 1465 2421 1577 2193 -2748 5 2 1 1 1465 2421 1577 2193 1466 2422 1578 2194 -2749 5 2 1 1 1466 2422 1578 2194 849 1088 877 1031 -2750 5 2 1 1 520 360 406 237 2663 2023 2207 1531 -2751 5 2 1 1 2663 2023 2207 1531 2664 2024 2208 1532 -2752 5 2 1 1 2664 2024 2208 1532 2665 2025 2209 1533 -2753 5 2 1 1 2665 2025 2209 1533 2666 2026 2210 1534 -2754 5 2 1 1 2666 2026 2210 1534 1149 989 1035 866 -2755 5 2 1 1 173 520 237 364 1275 2663 1531 2039 -2756 5 2 1 1 1275 2663 1531 2039 1276 2664 1532 2040 -2757 5 2 1 1 1276 2664 1532 2040 1277 2665 1533 2041 -2758 5 2 1 1 1277 2665 1533 2041 1278 2666 1534 2042 -2759 5 2 1 1 1278 2666 1534 2042 802 1149 866 993 -2760 5 2 1 1 530 283 187 375 2703 1715 1331 2083 -2761 5 2 1 1 2703 1715 1331 2083 2704 1716 1332 2084 -2762 5 2 1 1 2704 1716 1332 2084 2705 1717 1333 2085 -2763 5 2 1 1 2705 1717 1333 2085 2706 1718 1334 2086 -2764 5 2 1 1 2706 1718 1334 2086 1159 912 816 1004 -2765 5 2 1 1 529 282 185 376 2699 1711 1323 2087 -2766 5 2 1 1 2699 1711 1323 2087 2700 1712 1324 2088 -2767 5 2 1 1 2700 1712 1324 2088 2701 1713 1325 2089 -2768 5 2 1 1 2701 1713 1325 2089 2702 1714 1326 2090 -2769 5 2 1 1 2702 1714 1326 2090 1158 911 814 1005 -2770 5 2 1 1 423 222 307 454 2275 1471 1811 2399 -2771 5 2 1 1 2275 1471 1811 2399 2276 1472 1812 2400 -2772 5 2 1 1 2276 1472 1812 2400 2277 1473 1813 2401 -2773 5 2 1 1 2277 1473 1813 2401 2278 1474 1814 2402 -2774 5 2 1 1 2278 1474 1814 2402 1052 851 936 1083 -2775 5 2 1 1 238 384 154 512 1535 2119 1199 2631 -2776 5 2 1 1 1535 2119 1199 2631 1536 2120 1200 2632 -2777 5 2 1 1 1536 2120 1200 2632 1537 2121 1201 2633 -2778 5 2 1 1 1537 2121 1201 2633 1538 2122 1202 2634 -2779 5 2 1 1 1538 2122 1202 2634 867 1013 783 1141 -2780 5 2 1 1 500 285 185 396 2583 1723 1323 2167 -2781 5 2 1 1 2583 1723 1323 2167 2584 1724 1324 2168 -2782 5 2 1 1 2584 1724 1324 2168 2585 1725 1325 2169 -2783 5 2 1 1 2585 1725 1325 2169 2586 1726 1326 2170 -2784 5 2 1 1 2586 1726 1326 2170 1129 914 814 1025 -2785 5 2 1 1 263 513 230 397 1635 2635 1503 2171 -2786 5 2 1 1 1635 2635 1503 2171 1636 2636 1504 2172 -2787 5 2 1 1 1636 2636 1504 2172 1637 2637 1505 2173 -2788 5 2 1 1 1637 2637 1505 2173 1638 2638 1506 2174 -2789 5 2 1 1 1638 2638 1506 2174 892 1142 859 1026 -2790 5 2 1 1 151 500 228 382 1187 2583 1495 2111 -2791 5 2 1 1 1187 2583 1495 2111 1188 2584 1496 2112 -2792 5 2 1 1 1188 2584 1496 2112 1189 2585 1497 2113 -2793 5 2 1 1 1189 2585 1497 2113 1190 2586 1498 2114 -2794 5 2 1 1 1190 2586 1498 2114 780 1129 857 1011 -2795 5 2 1 1 470 480 189 241 2463 2503 1339 1547 -2796 5 2 1 1 2463 2503 1339 1547 2464 2504 1340 1548 -2797 5 2 1 1 2464 2504 1340 1548 2465 2505 1341 1549 -2798 5 2 1 1 2465 2505 1341 1549 2466 2506 1342 1550 -2799 5 2 1 1 2466 2506 1342 1550 1099 1109 818 870 -2800 5 2 1 1 470 168 311 480 2463 1255 1827 2503 -2801 5 2 1 1 2463 1255 1827 2503 2464 1256 1828 2504 -2802 5 2 1 1 2464 1256 1828 2504 2465 1257 1829 2505 -2803 5 2 1 1 2465 1257 1829 2505 2466 1258 1830 2506 -2804 5 2 1 1 2466 1258 1830 2506 1099 797 940 1109 -2805 5 2 1 1 198 442 321 519 1375 2351 1867 2659 -2806 5 2 1 1 1375 2351 1867 2659 1376 2352 1868 2660 -2807 5 2 1 1 1376 2352 1868 2660 1377 2353 1869 2661 -2808 5 2 1 1 1377 2353 1869 2661 1378 2354 1870 2662 -2809 5 2 1 1 1378 2354 1870 2662 827 1071 950 1148 -2810 5 2 1 1 198 519 238 399 1375 2659 1535 2179 -2811 5 2 1 1 1375 2659 1535 2179 1376 2660 1536 2180 -2812 5 2 1 1 1376 2660 1536 2180 1377 2661 1537 2181 -2813 5 2 1 1 1377 2661 1537 2181 1378 2662 1538 2182 -2814 5 2 1 1 1378 2662 1538 2182 827 1148 867 1028 -2815 5 2 1 1 531 227 489 381 2707 1491 2539 2107 -2816 5 2 1 1 2707 1491 2539 2107 2708 1492 2540 2108 -2817 5 2 1 1 2708 1492 2540 2108 2709 1493 2541 2109 -2818 5 2 1 1 2709 1493 2541 2109 2710 1494 2542 2110 -2819 5 2 1 1 2710 1494 2542 2110 1160 856 1118 1010 -2820 5 2 1 1 514 174 533 404 2639 1279 2715 2199 -2821 5 2 1 1 2639 1279 2715 2199 2640 1280 2716 2200 -2822 5 2 1 1 2640 1280 2716 2200 2641 1281 2717 2201 -2823 5 2 1 1 2641 1281 2717 2201 2642 1282 2718 2202 -2824 5 2 1 1 2642 1282 2718 2202 1143 803 1162 1033 -2825 5 2 1 1 177 527 234 517 1291 2691 1519 2651 -2826 5 2 1 1 1291 2691 1519 2651 1292 2692 1520 2652 -2827 5 2 1 1 1292 2692 1520 2652 1293 2693 1521 2653 -2828 5 2 1 1 1293 2693 1521 2653 1294 2694 1522 2654 -2829 5 2 1 1 1294 2694 1522 2654 806 1156 863 1146 -2830 5 2 1 1 524 404 533 245 2679 2199 2715 1563 -2831 5 2 1 1 2679 2199 2715 1563 2680 2200 2716 1564 -2832 5 2 1 1 2680 2200 2716 1564 2681 2201 2717 1565 -2833 5 2 1 1 2681 2201 2717 1565 2682 2202 2718 1566 -2834 5 2 1 1 2682 2202 2718 1566 1153 1033 1162 874 -2835 5 2 1 1 525 175 378 246 2683 1283 2095 1567 -2836 5 2 1 1 2683 1283 2095 1567 2684 1284 2096 1568 -2837 5 2 1 1 2684 1284 2096 1568 2685 1285 2097 1569 -2838 5 2 1 1 2685 1285 2097 1569 2686 1286 2098 1570 -2839 5 2 1 1 2686 1286 2098 1570 1154 804 1007 875 -2840 5 2 1 1 526 176 379 247 2687 1287 2099 1571 -2841 5 2 1 1 2687 1287 2099 1571 2688 1288 2100 1572 -2842 5 2 1 1 2688 1288 2100 1572 2689 1289 2101 1573 -2843 5 2 1 1 2689 1289 2101 1573 2690 1290 2102 1574 -2844 5 2 1 1 2690 1290 2102 1574 1155 805 1008 876 -2845 5 2 1 1 400 519 321 239 2183 2659 1867 1539 -2846 5 2 1 1 2183 2659 1867 1539 2184 2660 1868 1540 -2847 5 2 1 1 2184 2660 1868 1540 2185 2661 1869 1541 -2848 5 2 1 1 2185 2661 1869 1541 2186 2662 1870 1542 -2849 5 2 1 1 2186 2662 1870 1542 1029 1148 950 868 -2850 5 2 1 1 148 530 220 402 1175 2703 1463 2191 -2851 5 2 1 1 1175 2703 1463 2191 1176 2704 1464 2192 -2852 5 2 1 1 1176 2704 1464 2192 1177 2705 1465 2193 -2853 5 2 1 1 1177 2705 1465 2193 1178 2706 1466 2194 -2854 5 2 1 1 1178 2706 1466 2194 777 1159 849 1031 -2855 5 2 1 1 146 529 221 403 1167 2699 1467 2195 -2856 5 2 1 1 1167 2699 1467 2195 1168 2700 1468 2196 -2857 5 2 1 1 1168 2700 1468 2196 1169 2701 1469 2197 -2858 5 2 1 1 1169 2701 1469 2197 1170 2702 1470 2198 -2859 5 2 1 1 1170 2702 1470 2198 775 1158 850 1032 -2860 5 2 1 1 523 207 425 424 2675 1411 2283 2279 -2861 5 2 1 1 2675 1411 2283 2279 2676 1412 2284 2280 -2862 5 2 1 1 2676 1412 2284 2280 2677 1413 2285 2281 -2863 5 2 1 1 2677 1413 2285 2281 2678 1414 2286 2282 -2864 5 2 1 1 2678 1414 2286 2282 1152 836 1054 1053 -2865 5 2 1 1 499 521 374 149 2579 2667 2079 1179 -2866 5 2 1 1 2579 2667 2079 1179 2580 2668 2080 1180 -2867 5 2 1 1 2580 2668 2080 1180 2581 2669 2081 1181 -2868 5 2 1 1 2581 2669 2081 1181 2582 2670 2082 1182 -2869 5 2 1 1 2582 2670 2082 1182 1128 1150 1003 778 -2870 5 2 1 1 462 521 499 252 2431 2667 2579 1591 -2871 5 2 1 1 2431 2667 2579 1591 2432 2668 2580 1592 -2872 5 2 1 1 2432 2668 2580 1592 2433 2669 2581 1593 -2873 5 2 1 1 2433 2669 2581 1593 2434 2670 2582 1594 -2874 5 2 1 1 2434 2670 2582 1594 1091 1150 1128 881 -2875 5 2 1 1 492 524 489 178 2551 2679 2539 1295 -2876 5 2 1 1 2551 2679 2539 1295 2552 2680 2540 1296 -2877 5 2 1 1 2552 2680 2540 1296 2553 2681 2541 1297 -2878 5 2 1 1 2553 2681 2541 1297 2554 2682 2542 1298 -2879 5 2 1 1 2554 2682 2542 1298 1121 1153 1118 807 -2880 5 2 1 1 179 493 232 525 1299 2555 1511 2683 -2881 5 2 1 1 1299 2555 1511 2683 1300 2556 1512 2684 -2882 5 2 1 1 1300 2556 1512 2684 1301 2557 1513 2685 -2883 5 2 1 1 1301 2557 1513 2685 1302 2558 1514 2686 -2884 5 2 1 1 1302 2558 1514 2686 808 1122 861 1154 -2885 5 2 1 1 180 494 233 526 1303 2559 1515 2687 -2886 5 2 1 1 1303 2559 1515 2687 1304 2560 1516 2688 -2887 5 2 1 1 1304 2560 1516 2688 1305 2561 1517 2689 -2888 5 2 1 1 1305 2561 1517 2689 1306 2562 1518 2690 -2889 5 2 1 1 1306 2562 1518 2690 809 1123 862 1155 -2890 5 2 1 1 181 495 234 527 1307 2563 1519 2691 -2891 5 2 1 1 1307 2563 1519 2691 1308 2564 1520 2692 -2892 5 2 1 1 1308 2564 1520 2692 1309 2565 1521 2693 -2893 5 2 1 1 1309 2565 1521 2693 1310 2566 1522 2694 -2894 5 2 1 1 1310 2566 1522 2694 810 1124 863 1156 -2895 5 2 1 1 262 498 238 512 1631 2575 1535 2631 -2896 5 2 1 1 1631 2575 1535 2631 1632 2576 1536 2632 -2897 5 2 1 1 1632 2576 1536 2632 1633 2577 1537 2633 -2898 5 2 1 1 1633 2577 1537 2633 1634 2578 1538 2634 -2899 5 2 1 1 1634 2578 1538 2634 891 1127 867 1141 -2900 5 2 1 1 153 532 380 481 1195 2711 2103 2507 -2901 5 2 1 1 1195 2711 2103 2507 1196 2712 2104 2508 -2902 5 2 1 1 1196 2712 2104 2508 1197 2713 2105 2509 -2903 5 2 1 1 1197 2713 2105 2509 1198 2714 2106 2510 -2904 5 2 1 1 1198 2714 2106 2510 782 1161 1009 1110 +65 3 2 2 15 4 9 535 129 +66 3 2 2 15 129 535 536 130 +67 3 2 2 15 130 536 537 131 +68 3 2 2 15 131 537 538 132 +69 3 2 2 15 132 538 69 5 +70 3 2 2 15 9 10 539 535 +71 3 2 2 15 535 539 540 536 +72 3 2 2 15 536 540 541 537 +73 3 2 2 15 537 541 542 538 +74 3 2 2 15 538 542 70 69 +75 3 2 2 15 10 11 543 539 +76 3 2 2 15 539 543 544 540 +77 3 2 2 15 540 544 545 541 +78 3 2 2 15 541 545 546 542 +79 3 2 2 15 542 546 71 70 +80 3 2 2 15 11 12 547 543 +81 3 2 2 15 543 547 548 544 +82 3 2 2 15 544 548 549 545 +83 3 2 2 15 545 549 550 546 +84 3 2 2 15 546 550 72 71 +85 3 2 2 15 12 13 551 547 +86 3 2 2 15 547 551 552 548 +87 3 2 2 15 548 552 553 549 +88 3 2 2 15 549 553 554 550 +89 3 2 2 15 550 554 73 72 +90 3 2 2 15 13 14 555 551 +91 3 2 2 15 551 555 556 552 +92 3 2 2 15 552 556 557 553 +93 3 2 2 15 553 557 558 554 +94 3 2 2 15 554 558 74 73 +95 3 2 2 15 14 15 559 555 +96 3 2 2 15 555 559 560 556 +97 3 2 2 15 556 560 561 557 +98 3 2 2 15 557 561 562 558 +99 3 2 2 15 558 562 75 74 +100 3 2 2 15 15 16 563 559 +101 3 2 2 15 559 563 564 560 +102 3 2 2 15 560 564 565 561 +103 3 2 2 15 561 565 566 562 +104 3 2 2 15 562 566 76 75 +105 3 2 2 15 16 17 567 563 +106 3 2 2 15 563 567 568 564 +107 3 2 2 15 564 568 569 565 +108 3 2 2 15 565 569 570 566 +109 3 2 2 15 566 570 77 76 +110 3 2 2 15 17 18 571 567 +111 3 2 2 15 567 571 572 568 +112 3 2 2 15 568 572 573 569 +113 3 2 2 15 569 573 574 570 +114 3 2 2 15 570 574 78 77 +115 3 2 2 15 18 19 575 571 +116 3 2 2 15 571 575 576 572 +117 3 2 2 15 572 576 577 573 +118 3 2 2 15 573 577 578 574 +119 3 2 2 15 574 578 79 78 +120 3 2 2 15 19 20 579 575 +121 3 2 2 15 575 579 580 576 +122 3 2 2 15 576 580 581 577 +123 3 2 2 15 577 581 582 578 +124 3 2 2 15 578 582 80 79 +125 3 2 2 15 20 21 583 579 +126 3 2 2 15 579 583 584 580 +127 3 2 2 15 580 584 585 581 +128 3 2 2 15 581 585 586 582 +129 3 2 2 15 582 586 81 80 +130 3 2 2 15 21 22 587 583 +131 3 2 2 15 583 587 588 584 +132 3 2 2 15 584 588 589 585 +133 3 2 2 15 585 589 590 586 +134 3 2 2 15 586 590 82 81 +135 3 2 2 15 22 23 591 587 +136 3 2 2 15 587 591 592 588 +137 3 2 2 15 588 592 593 589 +138 3 2 2 15 589 593 594 590 +139 3 2 2 15 590 594 83 82 +140 3 2 2 15 23 3 133 591 +141 3 2 2 15 591 133 134 592 +142 3 2 2 15 592 134 135 593 +143 3 2 2 15 593 135 136 594 +144 3 2 2 15 594 136 6 83 +145 3 2 2 19 3 24 595 133 +146 3 2 2 19 133 595 596 134 +147 3 2 2 19 134 596 597 135 +148 3 2 2 19 135 597 598 136 +149 3 2 2 19 136 598 84 6 +150 3 2 2 19 24 25 599 595 +151 3 2 2 19 595 599 600 596 +152 3 2 2 19 596 600 601 597 +153 3 2 2 19 597 601 602 598 +154 3 2 2 19 598 602 85 84 +155 3 2 2 19 25 26 603 599 +156 3 2 2 19 599 603 604 600 +157 3 2 2 19 600 604 605 601 +158 3 2 2 19 601 605 606 602 +159 3 2 2 19 602 606 86 85 +160 3 2 2 19 26 27 607 603 +161 3 2 2 19 603 607 608 604 +162 3 2 2 19 604 608 609 605 +163 3 2 2 19 605 609 610 606 +164 3 2 2 19 606 610 87 86 +165 3 2 2 19 27 28 611 607 +166 3 2 2 19 607 611 612 608 +167 3 2 2 19 608 612 613 609 +168 3 2 2 19 609 613 614 610 +169 3 2 2 19 610 614 88 87 +170 3 2 2 19 28 29 615 611 +171 3 2 2 19 611 615 616 612 +172 3 2 2 19 612 616 617 613 +173 3 2 2 19 613 617 618 614 +174 3 2 2 19 614 618 89 88 +175 3 2 2 19 29 30 619 615 +176 3 2 2 19 615 619 620 616 +177 3 2 2 19 616 620 621 617 +178 3 2 2 19 617 621 622 618 +179 3 2 2 19 618 622 90 89 +180 3 2 2 19 30 31 623 619 +181 3 2 2 19 619 623 624 620 +182 3 2 2 19 620 624 625 621 +183 3 2 2 19 621 625 626 622 +184 3 2 2 19 622 626 91 90 +185 3 2 2 19 31 32 627 623 +186 3 2 2 19 623 627 628 624 +187 3 2 2 19 624 628 629 625 +188 3 2 2 19 625 629 630 626 +189 3 2 2 19 626 630 92 91 +190 3 2 2 19 32 33 631 627 +191 3 2 2 19 627 631 632 628 +192 3 2 2 19 628 632 633 629 +193 3 2 2 19 629 633 634 630 +194 3 2 2 19 630 634 93 92 +195 3 2 2 19 33 34 635 631 +196 3 2 2 19 631 635 636 632 +197 3 2 2 19 632 636 637 633 +198 3 2 2 19 633 637 638 634 +199 3 2 2 19 634 638 94 93 +200 3 2 2 19 34 35 639 635 +201 3 2 2 19 635 639 640 636 +202 3 2 2 19 636 640 641 637 +203 3 2 2 19 637 641 642 638 +204 3 2 2 19 638 642 95 94 +205 3 2 2 19 35 36 643 639 +206 3 2 2 19 639 643 644 640 +207 3 2 2 19 640 644 645 641 +208 3 2 2 19 641 645 646 642 +209 3 2 2 19 642 646 96 95 +210 3 2 2 19 36 37 647 643 +211 3 2 2 19 643 647 648 644 +212 3 2 2 19 644 648 649 645 +213 3 2 2 19 645 649 650 646 +214 3 2 2 19 646 650 97 96 +215 3 2 2 19 37 38 651 647 +216 3 2 2 19 647 651 652 648 +217 3 2 2 19 648 652 653 649 +218 3 2 2 19 649 653 654 650 +219 3 2 2 19 650 654 98 97 +220 3 2 2 19 38 1 137 651 +221 3 2 2 19 651 137 138 652 +222 3 2 2 19 652 138 139 653 +223 3 2 2 19 653 139 140 654 +224 3 2 2 19 654 140 7 98 +225 3 2 2 23 1 39 655 137 +226 3 2 2 23 137 655 656 138 +227 3 2 2 23 138 656 657 139 +228 3 2 2 23 139 657 658 140 +229 3 2 2 23 140 658 99 7 +230 3 2 2 23 39 40 659 655 +231 3 2 2 23 655 659 660 656 +232 3 2 2 23 656 660 661 657 +233 3 2 2 23 657 661 662 658 +234 3 2 2 23 658 662 100 99 +235 3 2 2 23 40 41 663 659 +236 3 2 2 23 659 663 664 660 +237 3 2 2 23 660 664 665 661 +238 3 2 2 23 661 665 666 662 +239 3 2 2 23 662 666 101 100 +240 3 2 2 23 41 42 667 663 +241 3 2 2 23 663 667 668 664 +242 3 2 2 23 664 668 669 665 +243 3 2 2 23 665 669 670 666 +244 3 2 2 23 666 670 102 101 +245 3 2 2 23 42 43 671 667 +246 3 2 2 23 667 671 672 668 +247 3 2 2 23 668 672 673 669 +248 3 2 2 23 669 673 674 670 +249 3 2 2 23 670 674 103 102 +250 3 2 2 23 43 44 675 671 +251 3 2 2 23 671 675 676 672 +252 3 2 2 23 672 676 677 673 +253 3 2 2 23 673 677 678 674 +254 3 2 2 23 674 678 104 103 +255 3 2 2 23 44 45 679 675 +256 3 2 2 23 675 679 680 676 +257 3 2 2 23 676 680 681 677 +258 3 2 2 23 677 681 682 678 +259 3 2 2 23 678 682 105 104 +260 3 2 2 23 45 46 683 679 +261 3 2 2 23 679 683 684 680 +262 3 2 2 23 680 684 685 681 +263 3 2 2 23 681 685 686 682 +264 3 2 2 23 682 686 106 105 +265 3 2 2 23 46 47 687 683 +266 3 2 2 23 683 687 688 684 +267 3 2 2 23 684 688 689 685 +268 3 2 2 23 685 689 690 686 +269 3 2 2 23 686 690 107 106 +270 3 2 2 23 47 48 691 687 +271 3 2 2 23 687 691 692 688 +272 3 2 2 23 688 692 693 689 +273 3 2 2 23 689 693 694 690 +274 3 2 2 23 690 694 108 107 +275 3 2 2 23 48 49 695 691 +276 3 2 2 23 691 695 696 692 +277 3 2 2 23 692 696 697 693 +278 3 2 2 23 693 697 698 694 +279 3 2 2 23 694 698 109 108 +280 3 2 2 23 49 50 699 695 +281 3 2 2 23 695 699 700 696 +282 3 2 2 23 696 700 701 697 +283 3 2 2 23 697 701 702 698 +284 3 2 2 23 698 702 110 109 +285 3 2 2 23 50 51 703 699 +286 3 2 2 23 699 703 704 700 +287 3 2 2 23 700 704 705 701 +288 3 2 2 23 701 705 706 702 +289 3 2 2 23 702 706 111 110 +290 3 2 2 23 51 52 707 703 +291 3 2 2 23 703 707 708 704 +292 3 2 2 23 704 708 709 705 +293 3 2 2 23 705 709 710 706 +294 3 2 2 23 706 710 112 111 +295 3 2 2 23 52 53 711 707 +296 3 2 2 23 707 711 712 708 +297 3 2 2 23 708 712 713 709 +298 3 2 2 23 709 713 714 710 +299 3 2 2 23 710 714 113 112 +300 3 2 2 23 53 2 141 711 +301 3 2 2 23 711 141 142 712 +302 3 2 2 23 712 142 143 713 +303 3 2 2 23 713 143 144 714 +304 3 2 2 23 714 144 8 113 +305 3 2 2 27 2 54 715 141 +306 3 2 2 27 141 715 716 142 +307 3 2 2 27 142 716 717 143 +308 3 2 2 27 143 717 718 144 +309 3 2 2 27 144 718 114 8 +310 3 2 2 27 54 55 719 715 +311 3 2 2 27 715 719 720 716 +312 3 2 2 27 716 720 721 717 +313 3 2 2 27 717 721 722 718 +314 3 2 2 27 718 722 115 114 +315 3 2 2 27 55 56 723 719 +316 3 2 2 27 719 723 724 720 +317 3 2 2 27 720 724 725 721 +318 3 2 2 27 721 725 726 722 +319 3 2 2 27 722 726 116 115 +320 3 2 2 27 56 57 727 723 +321 3 2 2 27 723 727 728 724 +322 3 2 2 27 724 728 729 725 +323 3 2 2 27 725 729 730 726 +324 3 2 2 27 726 730 117 116 +325 3 2 2 27 57 58 731 727 +326 3 2 2 27 727 731 732 728 +327 3 2 2 27 728 732 733 729 +328 3 2 2 27 729 733 734 730 +329 3 2 2 27 730 734 118 117 +330 3 2 2 27 58 59 735 731 +331 3 2 2 27 731 735 736 732 +332 3 2 2 27 732 736 737 733 +333 3 2 2 27 733 737 738 734 +334 3 2 2 27 734 738 119 118 +335 3 2 2 27 59 60 739 735 +336 3 2 2 27 735 739 740 736 +337 3 2 2 27 736 740 741 737 +338 3 2 2 27 737 741 742 738 +339 3 2 2 27 738 742 120 119 +340 3 2 2 27 60 61 743 739 +341 3 2 2 27 739 743 744 740 +342 3 2 2 27 740 744 745 741 +343 3 2 2 27 741 745 746 742 +344 3 2 2 27 742 746 121 120 +345 3 2 2 27 61 62 747 743 +346 3 2 2 27 743 747 748 744 +347 3 2 2 27 744 748 749 745 +348 3 2 2 27 745 749 750 746 +349 3 2 2 27 746 750 122 121 +350 3 2 2 27 62 63 751 747 +351 3 2 2 27 747 751 752 748 +352 3 2 2 27 748 752 753 749 +353 3 2 2 27 749 753 754 750 +354 3 2 2 27 750 754 123 122 +355 3 2 2 27 63 64 755 751 +356 3 2 2 27 751 755 756 752 +357 3 2 2 27 752 756 757 753 +358 3 2 2 27 753 757 758 754 +359 3 2 2 27 754 758 124 123 +360 3 2 2 27 64 65 759 755 +361 3 2 2 27 755 759 760 756 +362 3 2 2 27 756 760 761 757 +363 3 2 2 27 757 761 762 758 +364 3 2 2 27 758 762 125 124 +365 3 2 2 27 65 66 763 759 +366 3 2 2 27 759 763 764 760 +367 3 2 2 27 760 764 765 761 +368 3 2 2 27 761 765 766 762 +369 3 2 2 27 762 766 126 125 +370 3 2 2 27 66 67 767 763 +371 3 2 2 27 763 767 768 764 +372 3 2 2 27 764 768 769 765 +373 3 2 2 27 765 769 770 766 +374 3 2 2 27 766 770 127 126 +375 3 2 2 27 67 68 771 767 +376 3 2 2 27 767 771 772 768 +377 3 2 2 27 768 772 773 769 +378 3 2 2 27 769 773 774 770 +379 3 2 2 27 770 774 128 127 +380 3 2 2 27 68 4 129 771 +381 3 2 2 27 771 129 130 772 +382 3 2 2 27 772 130 131 773 +383 3 2 2 27 773 131 132 774 +384 3 2 2 27 774 132 5 128 +385 3 2 3 28 819 970 1021 939 +386 3 2 3 28 825 942 1023 975 +387 3 2 3 28 823 941 1024 973 +388 3 2 3 28 91 901 987 90 +389 3 2 3 28 106 902 984 105 +390 3 2 3 28 76 903 986 75 +391 3 2 3 28 121 904 985 120 +392 3 2 3 28 1062 873 977 797 +393 3 2 3 28 950 1116 800 1087 +394 3 2 3 28 892 955 1072 843 +395 3 2 3 28 814 932 851 936 +396 3 2 3 28 827 882 775 990 +397 3 2 3 28 937 816 945 880 +398 3 2 3 28 977 873 1094 822 +399 3 2 3 28 862 1080 835 1018 +400 3 2 3 28 916 930 1023 842 +401 3 2 3 28 1014 922 787 1085 +402 3 2 3 28 791 908 847 994 +403 3 2 3 28 848 909 793 995 +404 3 2 3 28 946 807 1035 875 +405 3 2 3 28 824 903 1098 978 +406 3 2 3 28 826 901 1099 979 +407 3 2 3 28 951 813 1127 882 +408 3 2 3 28 879 944 914 814 +409 3 2 3 28 943 876 1013 780 +410 3 2 3 28 786 997 828 905 +411 3 2 3 28 838 988 777 919 +412 3 2 3 28 1104 1092 983 820 +413 3 2 3 28 800 953 865 1087 +414 3 2 3 28 951 878 956 813 +415 3 2 3 28 814 936 993 879 +416 3 2 3 28 955 801 1033 877 +417 3 2 3 28 956 878 1032 802 +418 3 2 3 28 989 817 930 916 +419 3 2 3 28 1063 877 1089 785 +420 3 2 3 28 944 879 999 776 +421 3 2 3 28 945 776 999 880 +422 3 2 3 28 993 818 999 879 +423 3 2 3 28 968 880 999 818 +424 3 2 3 28 846 1026 787 923 +425 3 2 3 28 877 1063 812 955 +426 3 2 3 28 805 1010 855 926 +427 3 2 3 28 804 1011 854 925 +428 3 2 3 28 819 1105 871 1093 +429 3 2 3 28 821 1106 872 1095 +430 3 2 3 28 1136 883 972 821 +431 3 2 3 28 1138 885 970 819 +432 3 2 3 28 1137 884 971 822 +433 3 2 3 28 1139 886 969 820 +434 3 2 3 28 1140 825 975 887 +435 3 2 3 28 1142 823 973 889 +436 3 2 3 28 1141 826 976 888 +437 3 2 3 28 1143 824 974 890 +438 3 2 3 28 956 891 1074 844 +439 3 2 3 28 1093 980 1138 819 +440 3 2 3 28 1094 982 1137 822 +441 3 2 3 28 1095 981 1136 821 +442 3 2 3 28 904 823 1142 985 +443 3 2 3 28 903 824 1143 986 +444 3 2 3 28 901 826 1141 987 +445 3 2 3 28 902 825 1140 984 +446 3 2 3 28 844 1009 813 956 +447 3 2 3 28 907 1133 867 990 +448 3 2 3 28 875 782 1112 946 +449 3 2 3 28 1162 947 1113 783 +450 3 2 3 28 1122 893 1058 809 +451 3 2 3 28 1124 895 1059 811 +452 3 2 3 28 996 849 948 910 +453 3 2 3 28 955 892 1028 801 +454 3 2 3 28 956 802 1029 891 +455 3 2 3 28 98 900 1003 97 +456 3 2 3 28 113 899 1002 112 +457 3 2 3 28 83 898 1001 82 +458 3 2 3 28 128 897 1000 127 +459 3 2 3 28 100 101 1007 896 +460 3 2 3 28 85 86 1006 895 +461 3 2 3 28 115 116 1005 894 +462 3 2 3 28 70 71 1004 893 +463 3 2 3 28 1030 1060 1003 900 +464 3 2 3 28 1055 1056 1002 899 +465 3 2 3 28 1058 893 1004 832 +466 3 2 3 28 1059 895 1006 834 +467 3 2 3 28 789 914 839 1022 +468 3 2 3 28 788 915 838 1021 +469 3 2 3 28 945 917 1024 841 +470 3 2 3 28 840 991 869 1008 +471 3 2 3 28 829 1064 970 885 +472 3 2 3 28 830 1065 969 886 +473 3 2 3 28 831 889 973 1067 +474 3 2 3 28 833 887 975 1066 +475 3 2 3 28 1123 894 1070 808 +476 3 2 3 28 1125 896 1071 810 +477 3 2 3 28 1005 831 1070 894 +478 3 2 3 28 1007 833 1071 896 +479 3 2 3 28 1000 897 1069 830 +480 3 2 3 28 1001 898 1068 829 +481 3 2 3 28 1055 899 1035 807 +482 3 2 3 28 1030 900 1146 806 +483 3 2 3 28 1062 902 1052 873 +484 3 2 3 28 1061 904 1054 870 +485 3 2 3 28 923 812 1133 907 +486 3 2 3 28 880 968 785 937 +487 3 2 3 28 790 906 845 1076 +488 3 2 3 28 1033 801 965 911 +489 3 2 3 28 1032 912 966 802 +490 3 2 3 28 809 947 874 1155 +491 3 2 3 28 811 948 1161 1157 +492 3 2 3 28 937 933 1017 816 +493 3 2 3 28 923 907 1084 846 +494 3 2 3 28 990 775 1084 907 +495 3 2 3 28 827 1148 951 882 +496 3 2 3 28 1009 905 1127 813 +497 3 2 3 28 1163 906 1030 806 +498 3 2 3 28 881 1091 803 1149 +499 3 2 3 28 866 1085 787 1026 +500 3 2 3 28 914 944 1037 839 +501 3 2 3 28 786 905 1009 1083 +502 3 2 3 28 954 934 968 818 +503 3 2 3 28 1110 788 1064 925 +504 3 2 3 28 1109 789 1065 926 +505 3 2 3 28 1120 808 1070 927 +506 3 2 3 28 1121 810 1071 928 +507 3 2 3 28 916 778 1073 989 +508 3 2 3 28 1024 917 1111 792 +509 3 2 3 28 899 113 8 962 +510 3 2 3 28 897 128 5 961 +511 3 2 3 28 898 83 6 963 +512 3 2 3 28 896 960 99 100 +513 3 2 3 28 1156 1120 1012 875 +514 3 2 3 28 1158 1121 1013 876 +515 3 2 3 28 931 1015 854 1107 +516 3 2 3 28 932 1016 855 1108 +517 3 2 3 28 863 1019 836 1081 +518 3 2 3 28 967 800 1116 913 +519 3 2 3 28 989 922 1014 817 +520 3 2 3 28 847 965 835 994 +521 3 2 3 28 849 996 836 967 +522 3 2 3 28 848 995 837 966 +523 3 2 3 28 932 814 914 1016 +524 3 2 3 28 945 816 1017 917 +525 3 2 3 28 1033 911 1117 852 +526 3 2 3 28 1032 851 1118 912 +527 3 2 3 28 1116 853 1119 913 +528 3 2 3 28 965 847 1112 911 +529 3 2 3 28 966 912 1113 848 +530 3 2 3 28 967 913 1114 849 +531 3 2 3 28 946 908 1055 807 +532 3 2 3 28 996 910 1057 795 +533 3 2 3 28 947 809 1058 909 +534 3 2 3 28 948 811 1059 910 +535 3 2 3 28 868 1027 828 997 +536 3 2 3 28 795 1079 863 1081 +537 3 2 3 28 1020 1082 1078 864 +538 3 2 3 28 989 843 1072 922 +539 3 2 3 28 70 893 1122 957 +540 3 2 3 28 115 894 1123 958 +541 3 2 3 28 85 895 1124 959 +542 3 2 3 28 1008 779 1019 920 +543 3 2 3 28 904 1061 941 823 +544 3 2 3 28 902 1062 942 825 +545 3 2 3 28 804 1157 1161 1011 +546 3 2 3 28 805 1155 874 1010 +547 3 2 3 28 952 870 1104 938 +548 3 2 3 28 915 1015 815 1144 +549 3 2 3 28 778 916 842 1086 +550 3 2 3 28 988 921 1074 777 +551 3 2 3 28 924 844 1074 921 +552 3 2 3 28 1036 817 1014 929 +553 3 2 3 28 1008 920 1049 840 +554 3 2 3 28 1018 918 1129 862 +555 3 2 3 28 1020 864 1131 919 +556 3 2 3 28 1019 863 1130 920 +557 3 2 3 28 1050 918 1086 842 +558 3 2 3 28 1018 778 1086 918 +559 3 2 3 28 845 935 803 1076 +560 3 2 3 28 1080 1077 971 791 +561 3 2 3 28 1082 793 974 1078 +562 3 2 3 28 906 943 1115 845 +563 3 2 3 28 921 815 1038 924 +564 3 2 3 28 107 1094 873 1052 +565 3 2 3 28 92 1095 872 1051 +566 3 2 3 28 1104 870 1054 1092 +567 3 2 3 28 77 1093 871 1053 +568 3 2 3 28 922 1072 923 787 +569 3 2 3 28 1015 931 1038 815 +570 3 2 3 28 1120 927 1111 856 +571 3 2 3 28 838 915 1144 988 +572 3 2 3 28 1079 795 1057 976 +573 3 2 3 28 1087 868 997 950 +574 3 2 3 28 955 812 923 1072 +575 3 2 3 28 993 936 1088 784 +576 3 2 3 28 852 937 785 1089 +577 3 2 3 28 1084 949 1025 846 +578 3 2 3 28 1083 924 1097 786 +579 3 2 3 28 1090 928 1066 794 +580 3 2 3 28 1111 927 1067 792 +581 3 2 3 28 1070 831 1067 927 +582 3 2 3 28 1071 833 1066 928 +583 3 2 3 28 969 1022 839 938 +584 3 2 3 28 952 841 1024 941 +585 3 2 3 28 1064 829 1068 925 +586 3 2 3 28 1065 830 1069 926 +587 3 2 3 28 1145 804 925 1068 +588 3 2 3 28 1147 805 926 1069 +589 3 2 3 28 1038 931 1119 853 +590 3 2 3 28 783 1118 851 932 +591 3 2 3 28 937 852 1117 933 +592 3 2 3 28 1106 940 1049 798 +593 3 2 3 28 1021 838 1048 939 +594 3 2 3 28 1031 840 1049 940 +595 3 2 3 28 1023 942 1050 842 +596 3 2 3 28 1160 929 1126 780 +597 3 2 3 28 1014 850 1126 929 +598 3 2 3 28 968 934 1159 785 +599 3 2 3 28 954 827 1159 934 +600 3 2 3 28 1117 782 1164 933 +601 3 2 3 28 818 993 784 954 +602 3 2 3 28 1023 930 1090 794 +603 3 2 3 28 1119 931 1107 781 +604 3 2 3 28 998 935 1126 850 +605 3 2 3 28 890 1039 72 73 +606 3 2 3 28 887 1042 102 103 +607 3 2 3 28 889 1040 117 118 +608 3 2 3 28 888 1041 87 88 +609 3 2 3 28 886 125 126 1043 +610 3 2 3 28 885 80 81 1044 +611 3 2 3 28 883 95 96 1046 +612 3 2 3 28 884 110 111 1045 +613 3 2 3 28 821 972 790 1031 +614 3 2 3 28 952 941 1061 870 +615 3 2 3 28 1050 942 1062 797 +616 3 2 3 28 1028 1134 1018 835 +617 3 2 3 28 1082 1020 1135 837 +618 3 2 3 28 1068 898 963 1145 +619 3 2 3 28 1069 897 961 1147 +620 3 2 3 28 98 964 1146 900 +621 3 2 3 28 796 1098 871 1105 +622 3 2 3 28 798 1099 872 1106 +623 3 2 3 28 878 951 1148 784 +624 3 2 3 28 871 1098 903 1053 +625 3 2 3 28 872 1099 901 1051 +626 3 2 3 28 885 1044 1001 829 +627 3 2 3 28 1151 1046 1003 1060 +628 3 2 3 28 1152 1045 1002 1056 +629 3 2 3 28 886 1043 1000 830 +630 3 2 3 28 889 831 1005 1040 +631 3 2 3 28 887 833 1007 1042 +632 3 2 3 28 1153 834 1006 1041 +633 3 2 3 28 1154 832 1004 1039 +634 3 2 3 28 908 946 1112 847 +635 3 2 3 28 781 948 849 1114 +636 3 2 3 28 909 848 1113 947 +637 3 2 3 28 1025 949 1027 799 +638 3 2 3 28 1054 122 123 1092 +639 3 2 3 28 779 953 836 1019 +640 3 2 3 28 885 1138 79 80 +641 3 2 3 28 883 1136 94 95 +642 3 2 3 28 886 1139 124 125 +643 3 2 3 28 884 1137 109 110 +644 3 2 3 28 887 103 104 1140 +645 3 2 3 28 890 73 74 1143 +646 3 2 3 28 889 118 119 1142 +647 3 2 3 28 888 88 89 1141 +648 3 2 3 28 791 971 1152 1056 +649 3 2 3 28 793 832 1154 974 +650 3 2 3 28 779 1128 865 953 +651 3 2 3 28 969 938 1104 820 +652 3 2 3 28 796 1105 819 939 +653 3 2 3 28 1031 940 1106 821 +654 3 2 3 28 1027 949 1047 828 +655 3 2 3 28 1034 861 1125 1158 +656 3 2 3 28 1008 869 1091 1150 +657 3 2 3 28 785 1159 867 1063 +658 3 2 3 28 790 972 1151 1060 +659 3 2 3 28 841 1096 776 945 +660 3 2 3 28 904 121 122 1054 +661 3 2 3 28 902 106 107 1052 +662 3 2 3 28 903 76 77 1053 +663 3 2 3 28 901 91 92 1051 +664 3 2 3 28 906 1163 876 943 +665 3 2 3 28 938 839 1037 952 +666 3 2 3 28 997 786 1097 950 +667 3 2 3 28 70 957 1100 69 +668 3 2 3 28 115 958 1101 114 +669 3 2 3 28 85 959 1102 84 +670 3 2 3 28 98 7 1103 964 +671 3 2 3 28 958 859 962 1101 +672 3 2 3 28 960 861 964 1103 +673 3 2 3 28 788 1110 1015 915 +674 3 2 3 28 789 1109 1016 914 +675 3 2 3 28 784 1088 1032 878 +676 3 2 3 28 801 1028 835 965 +677 3 2 3 28 802 966 837 1029 +678 3 2 3 28 828 1047 1127 905 +679 3 2 3 28 854 1011 1161 1107 +680 3 2 3 28 855 1010 1162 1108 +681 3 2 3 28 971 1077 977 822 +682 3 2 3 28 974 824 978 1078 +683 3 2 3 28 976 826 979 1079 +684 3 2 3 28 933 1164 856 1017 +685 3 2 3 28 953 800 967 836 +686 3 2 3 28 841 952 1037 1096 +687 3 2 3 28 1097 853 1116 950 +688 3 2 3 28 790 1060 1030 906 +689 3 2 3 28 911 1112 782 1117 +690 3 2 3 28 783 1113 912 1118 +691 3 2 3 28 781 1114 913 1119 +692 3 2 3 28 961 5 69 1100 +693 3 2 3 28 962 8 114 1101 +694 3 2 3 28 963 6 84 1102 +695 3 2 3 28 960 1103 7 99 +696 3 2 3 28 1100 858 1147 961 +697 3 2 3 28 899 962 859 1035 +698 3 2 3 28 1102 860 1145 963 +699 3 2 3 28 775 882 1127 1047 +700 3 2 3 28 840 1031 790 991 +701 3 2 3 28 1021 970 1064 788 +702 3 2 3 28 1022 969 1065 789 +703 3 2 3 28 1024 792 1067 973 +704 3 2 3 28 1023 794 1066 975 +705 3 2 3 28 845 1115 1126 935 +706 3 2 3 28 943 780 1126 1115 +707 3 2 3 28 866 1026 846 1025 +708 3 2 3 28 1149 992 1132 881 +709 3 2 3 28 1100 957 1122 858 +710 3 2 3 28 1156 859 958 1123 +711 3 2 3 28 1102 959 1124 860 +712 3 2 3 28 896 1125 861 960 +713 3 2 3 28 784 1148 827 954 +714 3 2 3 28 892 843 989 1073 +715 3 2 3 28 1080 862 977 1077 +716 3 2 3 28 1099 798 1130 979 +717 3 2 3 28 1098 796 1131 978 +718 3 2 3 28 797 977 862 1129 +719 3 2 3 28 1079 979 1130 863 +720 3 2 3 28 1078 978 1131 864 +721 3 2 3 28 881 1132 865 1128 +722 3 2 3 28 71 72 1039 1004 +723 3 2 3 28 116 117 1040 1005 +724 3 2 3 28 86 87 1041 1006 +725 3 2 3 28 101 102 1042 1007 +726 3 2 3 28 127 1000 1043 126 +727 3 2 3 28 82 1001 1044 81 +728 3 2 3 28 112 1002 1045 111 +729 3 2 3 28 97 1003 1046 96 +730 3 2 3 28 869 1076 803 1091 +731 3 2 3 28 791 1056 1055 908 +732 3 2 3 28 793 909 1058 832 +733 3 2 3 28 910 1059 834 1057 +734 3 2 3 28 124 983 1092 123 +735 3 2 3 28 77 78 980 1093 +736 3 2 3 28 107 108 982 1094 +737 3 2 3 28 92 93 981 1095 +738 3 2 3 28 869 991 790 1076 +739 3 2 3 28 815 921 988 1144 +740 3 2 3 28 868 1075 799 1027 +741 3 2 3 28 777 1074 891 1135 +742 3 2 3 28 835 1080 791 994 +743 3 2 3 28 795 1081 836 996 +744 3 2 3 28 793 1082 837 995 +745 3 2 3 28 1025 799 1132 992 +746 3 2 3 28 949 1084 775 1047 +747 3 2 3 28 875 1012 1164 782 +748 3 2 3 28 1046 1151 972 883 +749 3 2 3 28 1045 1152 971 884 +750 3 2 3 28 1039 890 974 1154 +751 3 2 3 28 1041 888 976 1153 +752 3 2 3 28 1014 1085 998 850 +753 3 2 3 28 867 1159 827 990 +754 3 2 3 28 78 79 1138 980 +755 3 2 3 28 93 94 1136 981 +756 3 2 3 28 108 109 1137 982 +757 3 2 3 28 820 983 124 1139 +758 3 2 3 28 105 984 1140 104 +759 3 2 3 28 120 985 1142 119 +760 3 2 3 28 90 987 1141 89 +761 3 2 3 28 75 986 1143 74 +762 3 2 3 28 924 1083 1009 844 +763 3 2 3 28 929 1160 857 1036 +764 3 2 3 28 928 1090 1036 857 +765 3 2 3 28 817 1036 1090 930 +766 3 2 3 28 838 919 1131 1048 +767 3 2 3 28 865 1075 868 1087 +768 3 2 3 28 964 861 1034 1146 +769 3 2 3 28 944 776 1096 1037 +770 3 2 3 28 926 855 1016 1109 +771 3 2 3 28 925 854 1015 1110 +772 3 2 3 28 917 1017 856 1111 +773 3 2 3 28 928 857 1013 1121 +774 3 2 3 28 936 851 1032 1088 +775 3 2 3 28 877 1033 852 1089 +776 3 2 3 28 1025 992 1149 866 +777 3 2 3 28 935 998 1149 803 +778 3 2 3 28 1085 866 1149 998 +779 3 2 3 28 924 1038 853 1097 +780 3 2 3 28 1073 1134 1028 892 +781 3 2 3 28 837 1135 891 1029 +782 3 2 3 28 1073 778 1018 1134 +783 3 2 3 28 919 777 1135 1020 +784 3 2 3 28 780 1013 857 1160 +785 3 2 3 28 947 1162 1010 874 +786 3 2 3 28 1120 856 1164 1012 +787 3 2 3 28 920 1130 798 1049 +788 3 2 3 28 939 1048 1131 796 +789 3 2 3 28 918 1050 797 1129 +790 3 2 3 28 1163 806 1146 1034 +791 3 2 3 28 860 1157 804 1145 +792 3 2 3 28 858 1155 805 1147 +793 3 2 3 28 859 1156 875 1035 +794 3 2 3 28 1163 1034 1158 876 +795 3 2 3 28 812 1063 867 1133 +796 3 2 3 28 799 1075 865 1132 +797 3 2 3 28 976 1057 834 1153 +798 3 2 3 28 1008 1150 1128 779 +799 3 2 3 28 1128 1150 1091 881 +800 3 2 3 28 1121 1158 1125 810 +801 3 2 3 28 860 1124 811 1157 +802 3 2 3 28 1120 1156 1123 808 +803 3 2 3 28 858 1122 809 1155 +804 3 2 3 28 932 1108 1162 783 +805 3 2 3 28 948 781 1107 1161 +806 5 2 1 1 391 340 189 309 2149 1945 1341 1821 +807 5 2 1 1 2149 1945 1341 1821 2150 1946 1342 1822 +808 5 2 1 1 2150 1946 1342 1822 2151 1947 1343 1823 +809 5 2 1 1 2151 1947 1343 1823 2152 1948 1344 1824 +810 5 2 1 1 2152 1948 1344 1824 1021 970 819 939 +811 5 2 1 1 393 312 195 345 2157 1833 1365 1965 +812 5 2 1 1 2157 1833 1365 1965 2158 1834 1366 1966 +813 5 2 1 1 2158 1834 1366 1966 2159 1835 1367 1967 +814 5 2 1 1 2159 1835 1367 1967 2160 1836 1368 1968 +815 5 2 1 1 2160 1836 1368 1968 1023 942 825 975 +816 5 2 1 1 394 311 193 343 2161 1829 1357 1957 +817 5 2 1 1 2161 1829 1357 1957 2162 1830 1358 1958 +818 5 2 1 1 2162 1830 1358 1958 2163 1831 1359 1959 +819 5 2 1 1 2163 1831 1359 1959 2164 1832 1360 1960 +820 5 2 1 1 2164 1832 1360 1960 1024 941 823 973 +821 5 2 1 1 357 271 31 30 2013 1669 623 619 +822 5 2 1 1 2013 1669 623 619 2014 1670 624 620 +823 5 2 1 1 2014 1670 624 620 2015 1671 625 621 +824 5 2 1 1 2015 1671 625 621 2016 1672 626 622 +825 5 2 1 1 2016 1672 626 622 987 901 91 90 +826 5 2 1 1 354 272 46 45 2001 1673 683 679 +827 5 2 1 1 2001 1673 683 679 2002 1674 684 680 +828 5 2 1 1 2002 1674 684 680 2003 1675 685 681 +829 5 2 1 1 2003 1675 685 681 2004 1676 686 682 +830 5 2 1 1 2004 1676 686 682 984 902 106 105 +831 5 2 1 1 356 273 16 15 2009 1677 563 559 +832 5 2 1 1 2009 1677 563 559 2010 1678 564 560 +833 5 2 1 1 2010 1678 564 560 2011 1679 565 561 +834 5 2 1 1 2011 1679 565 561 2012 1680 566 562 +835 5 2 1 1 2012 1680 566 562 986 903 76 75 +836 5 2 1 1 355 274 61 60 2005 1681 743 739 +837 5 2 1 1 2005 1681 743 739 2006 1682 744 740 +838 5 2 1 1 2006 1682 744 740 2007 1683 745 741 +839 5 2 1 1 2007 1683 745 741 2008 1684 746 742 +840 5 2 1 1 2008 1684 746 742 985 904 121 120 +841 5 2 1 1 347 243 432 167 1973 1557 2313 1253 +842 5 2 1 1 1973 1557 2313 1253 1974 1558 2314 1254 +843 5 2 1 1 1974 1558 2314 1254 1975 1559 2315 1255 +844 5 2 1 1 1975 1559 2315 1255 1976 1560 2316 1256 +845 5 2 1 1 1976 1560 2316 1256 977 873 1062 797 +846 5 2 1 1 170 486 320 457 1265 2529 1865 2413 +847 5 2 1 1 1265 2529 1865 2413 1266 2530 1866 2414 +848 5 2 1 1 1266 2530 1866 2414 1267 2531 1867 2415 +849 5 2 1 1 1267 2531 1867 2415 1268 2532 1868 2416 +850 5 2 1 1 1268 2532 1868 2416 800 1116 950 1087 +851 5 2 1 1 442 325 262 213 2353 1885 1633 1437 +852 5 2 1 1 2353 1885 1633 1437 2354 1886 1634 1438 +853 5 2 1 1 2354 1886 1634 1438 2355 1887 1635 1439 +854 5 2 1 1 2355 1887 1635 1439 2356 1888 1636 1440 +855 5 2 1 1 2356 1888 1636 1440 1072 955 892 843 +856 5 2 1 1 221 302 184 306 1469 1793 1321 1809 +857 5 2 1 1 1469 1793 1321 1809 1470 1794 1322 1810 +858 5 2 1 1 1470 1794 1322 1810 1471 1795 1323 1811 +859 5 2 1 1 1471 1795 1323 1811 1472 1796 1324 1812 +860 5 2 1 1 1472 1796 1324 1812 851 932 814 936 +861 5 2 1 1 145 252 197 360 1165 1593 1373 2025 +862 5 2 1 1 1165 1593 1373 2025 1166 1594 1374 2026 +863 5 2 1 1 1166 1594 1374 2026 1167 1595 1375 2027 +864 5 2 1 1 1167 1595 1375 2027 1168 1596 1376 2028 +865 5 2 1 1 1168 1596 1376 2028 775 882 827 990 +866 5 2 1 1 315 186 307 250 1845 1329 1813 1585 +867 5 2 1 1 1845 1329 1813 1585 1846 1330 1814 1586 +868 5 2 1 1 1846 1330 1814 1586 1847 1331 1815 1587 +869 5 2 1 1 1847 1331 1815 1587 1848 1332 1816 1588 +870 5 2 1 1 1848 1332 1816 1588 945 816 937 880 +871 5 2 1 1 464 243 347 192 2441 1557 1973 1353 +872 5 2 1 1 2441 1557 1973 1353 2442 1558 1974 1354 +873 5 2 1 1 2442 1558 1974 1354 2443 1559 1975 1355 +874 5 2 1 1 2443 1559 1975 1355 2444 1560 1976 1356 +875 5 2 1 1 2444 1560 1976 1356 1094 873 977 822 +876 5 2 1 1 205 450 232 388 1405 2385 1513 2137 +877 5 2 1 1 1405 2385 1513 2137 1406 2386 1514 2138 +878 5 2 1 1 1406 2386 1514 2138 1407 2387 1515 2139 +879 5 2 1 1 1407 2387 1515 2139 1408 2388 1516 2140 +880 5 2 1 1 1408 2388 1516 2140 835 1080 862 1018 +881 5 2 1 1 393 300 286 212 2157 1785 1729 1433 +882 5 2 1 1 2157 1785 1729 1433 2158 1786 1730 1434 +883 5 2 1 1 2158 1786 1730 1434 2159 1787 1731 1435 +884 5 2 1 1 2159 1787 1731 1435 2160 1788 1732 1436 +885 5 2 1 1 2160 1788 1732 1436 1023 930 916 842 +886 5 2 1 1 157 292 384 455 1213 1753 2121 2405 +887 5 2 1 1 1213 1753 2121 2405 1214 1754 2122 2406 +888 5 2 1 1 1214 1754 2122 2406 1215 1755 2123 2407 +889 5 2 1 1 1215 1755 2123 2407 1216 1756 2124 2408 +890 5 2 1 1 1216 1756 2124 2408 787 922 1014 1085 +891 5 2 1 1 217 278 161 364 1453 1697 1229 2041 +892 5 2 1 1 1453 1697 1229 2041 1454 1698 1230 2042 +893 5 2 1 1 1454 1698 1230 2042 1455 1699 1231 2043 +894 5 2 1 1 1455 1699 1231 2043 1456 1700 1232 2044 +895 5 2 1 1 1456 1700 1232 2044 847 908 791 994 +896 5 2 1 1 163 279 218 365 1237 1701 1457 2045 +897 5 2 1 1 1237 1701 1457 2045 1238 1702 1458 2046 +898 5 2 1 1 1238 1702 1458 2046 1239 1703 1459 2047 +899 5 2 1 1 1239 1703 1459 2047 1240 1704 1460 2048 +900 5 2 1 1 1240 1704 1460 2048 793 909 848 995 +901 5 2 1 1 405 177 316 245 2205 1293 1849 1565 +902 5 2 1 1 2205 1293 1849 1565 2206 1294 1850 1566 +903 5 2 1 1 2206 1294 1850 1566 2207 1295 1851 1567 +904 5 2 1 1 2207 1295 1851 1567 2208 1296 1852 1568 +905 5 2 1 1 2208 1296 1852 1568 1035 807 946 875 +906 5 2 1 1 468 273 194 348 2457 1677 1361 1977 +907 5 2 1 1 2457 1677 1361 1977 2458 1678 1362 1978 +908 5 2 1 1 2458 1678 1362 1978 2459 1679 1363 1979 +909 5 2 1 1 2459 1679 1363 1979 2460 1680 1364 1980 +910 5 2 1 1 2460 1680 1364 1980 1098 903 824 978 +911 5 2 1 1 469 271 196 349 2461 1669 1369 1981 +912 5 2 1 1 2461 1669 1369 1981 2462 1670 1370 1982 +913 5 2 1 1 2462 1670 1370 1982 2463 1671 1371 1983 +914 5 2 1 1 2463 1671 1371 1983 2464 1672 1372 1984 +915 5 2 1 1 2464 1672 1372 1984 1099 901 826 979 +916 5 2 1 1 497 183 321 252 2573 1317 1869 1593 +917 5 2 1 1 2573 1317 1869 1593 2574 1318 1870 1594 +918 5 2 1 1 2574 1318 1870 1594 2575 1319 1871 1595 +919 5 2 1 1 2575 1319 1871 1595 2576 1320 1872 1596 +920 5 2 1 1 2576 1320 1872 1596 1127 813 951 882 +921 5 2 1 1 284 314 249 184 1721 1841 1581 1321 +922 5 2 1 1 1721 1841 1581 1321 1722 1842 1582 1322 +923 5 2 1 1 1722 1842 1582 1322 1723 1843 1583 1323 +924 5 2 1 1 1723 1843 1583 1323 1724 1844 1584 1324 +925 5 2 1 1 1724 1844 1584 1324 914 944 879 814 +926 5 2 1 1 383 246 313 150 2117 1569 1837 1185 +927 5 2 1 1 2117 1569 1837 1185 2118 1570 1838 1186 +928 5 2 1 1 2118 1570 1838 1186 2119 1571 1839 1187 +929 5 2 1 1 2119 1571 1839 1187 2120 1572 1840 1188 +930 5 2 1 1 2120 1572 1840 1188 1013 876 943 780 +931 5 2 1 1 198 367 156 275 1377 2053 1209 1685 +932 5 2 1 1 1377 2053 1209 1685 1378 2054 1210 1686 +933 5 2 1 1 1378 2054 1210 1686 1379 2055 1211 1687 +934 5 2 1 1 1379 2055 1211 1687 1380 2056 1212 1688 +935 5 2 1 1 1380 2056 1212 1688 828 997 786 905 +936 5 2 1 1 147 358 208 289 1173 2017 1417 1741 +937 5 2 1 1 1173 2017 1417 1741 1174 2018 1418 1742 +938 5 2 1 1 1174 2018 1418 1742 1175 2019 1419 1743 +939 5 2 1 1 1175 2019 1419 1743 1176 2020 1420 1744 +940 5 2 1 1 1176 2020 1420 1744 777 988 838 919 +941 5 2 1 1 353 462 474 190 1997 2433 2481 1345 +942 5 2 1 1 1997 2433 2481 1345 1998 2434 2482 1346 +943 5 2 1 1 1998 2434 2482 1346 1999 2435 2483 1347 +944 5 2 1 1 1999 2435 2483 1347 2000 2436 2484 1348 +945 5 2 1 1 2000 2436 2484 1348 983 1092 1104 820 +946 5 2 1 1 235 323 170 457 1525 1877 1265 2413 +947 5 2 1 1 1525 1877 1265 2413 1526 1878 1266 2414 +948 5 2 1 1 1526 1878 1266 2414 1527 1879 1267 2415 +949 5 2 1 1 1527 1879 1267 2415 1528 1880 1268 2416 +950 5 2 1 1 1528 1880 1268 2416 865 953 800 1087 +951 5 2 1 1 326 248 321 183 1889 1577 1869 1317 +952 5 2 1 1 1889 1577 1869 1317 1890 1578 1870 1318 +953 5 2 1 1 1890 1578 1870 1318 1891 1579 1871 1319 +954 5 2 1 1 1891 1579 1871 1319 1892 1580 1872 1320 +955 5 2 1 1 1892 1580 1872 1320 956 878 951 813 +956 5 2 1 1 363 306 184 249 2037 1809 1321 1581 +957 5 2 1 1 2037 1809 1321 1581 2038 1810 1322 1582 +958 5 2 1 1 2038 1810 1322 1582 2039 1811 1323 1583 +959 5 2 1 1 2039 1811 1323 1583 2040 1812 1324 1584 +960 5 2 1 1 2040 1812 1324 1584 993 936 814 879 +961 5 2 1 1 403 171 325 247 2197 1269 1885 1573 +962 5 2 1 1 2197 1269 1885 1573 2198 1270 1886 1574 +963 5 2 1 1 2198 1270 1886 1574 2199 1271 1887 1575 +964 5 2 1 1 2199 1271 1887 1575 2200 1272 1888 1576 +965 5 2 1 1 2200 1272 1888 1576 1033 801 955 877 +966 5 2 1 1 402 248 326 172 2193 1577 1889 1273 +967 5 2 1 1 2193 1577 1889 1273 2194 1578 1890 1274 +968 5 2 1 1 2194 1578 1890 1274 2195 1579 1891 1275 +969 5 2 1 1 2195 1579 1891 1275 2196 1580 1892 1276 +970 5 2 1 1 2196 1580 1892 1276 1032 878 956 802 +971 5 2 1 1 300 187 359 286 1785 1333 2021 1729 +972 5 2 1 1 1785 1333 2021 1729 1786 1334 2022 1730 +973 5 2 1 1 1786 1334 2022 1730 1787 1335 2023 1731 +974 5 2 1 1 1787 1335 2023 1731 1788 1336 2024 1732 +975 5 2 1 1 1788 1336 2024 1732 930 817 989 916 +976 5 2 1 1 459 247 433 155 2421 1573 2317 1205 +977 5 2 1 1 2421 1573 2317 1205 2422 1574 2318 1206 +978 5 2 1 1 2422 1574 2318 1206 2423 1575 2319 1207 +979 5 2 1 1 2423 1575 2319 1207 2424 1576 2320 1208 +980 5 2 1 1 2424 1576 2320 1208 1089 877 1063 785 +981 5 2 1 1 369 249 314 146 2061 1581 1841 1169 +982 5 2 1 1 2061 1581 1841 1169 2062 1582 1842 1170 +983 5 2 1 1 2062 1582 1842 1170 2063 1583 1843 1171 +984 5 2 1 1 2063 1583 1843 1171 2064 1584 1844 1172 +985 5 2 1 1 2064 1584 1844 1172 999 879 944 776 +986 5 2 1 1 369 146 315 250 2061 1169 1845 1585 +987 5 2 1 1 2061 1169 1845 1585 2062 1170 1846 1586 +988 5 2 1 1 2062 1170 1846 1586 2063 1171 1847 1587 +989 5 2 1 1 2063 1171 1847 1587 2064 1172 1848 1588 +990 5 2 1 1 2064 1172 1848 1588 999 776 945 880 +991 5 2 1 1 369 188 363 249 2061 1337 2037 1581 +992 5 2 1 1 2061 1337 2037 1581 2062 1338 2038 1582 +993 5 2 1 1 2062 1338 2038 1582 2063 1339 2039 1583 +994 5 2 1 1 2063 1339 2039 1583 2064 1340 2040 1584 +995 5 2 1 1 2064 1340 2040 1584 999 818 993 879 +996 5 2 1 1 369 250 338 188 2061 1585 1937 1337 +997 5 2 1 1 2061 1585 1937 1337 2062 1586 1938 1338 +998 5 2 1 1 2062 1586 1938 1338 2063 1587 1939 1339 +999 5 2 1 1 2063 1587 1939 1339 2064 1588 1940 1340 +1000 5 2 1 1 2064 1588 1940 1340 999 880 968 818 +1001 5 2 1 1 157 396 216 293 1213 2169 1449 1757 +1002 5 2 1 1 1213 2169 1449 1757 1214 2170 1450 1758 +1003 5 2 1 1 1214 2170 1450 1758 1215 2171 1451 1759 +1004 5 2 1 1 1215 2171 1451 1759 1216 2172 1452 1760 +1005 5 2 1 1 1216 2172 1452 1760 787 1026 846 923 +1006 5 2 1 1 182 433 247 325 1313 2317 1573 1885 +1007 5 2 1 1 1313 2317 1573 1885 1314 2318 1574 1886 +1008 5 2 1 1 1314 2318 1574 1886 1315 2319 1575 1887 +1009 5 2 1 1 1315 2319 1575 1887 1316 2320 1576 1888 +1010 5 2 1 1 1316 2320 1576 1888 812 1063 877 955 +1011 5 2 1 1 225 380 175 296 1485 2105 1285 1769 +1012 5 2 1 1 1485 2105 1285 1769 1486 2106 1286 1770 +1013 5 2 1 1 1486 2106 1286 1770 1487 2107 1287 1771 +1014 5 2 1 1 1487 2107 1287 1771 1488 2108 1288 1772 +1015 5 2 1 1 1488 2108 1288 1772 855 1010 805 926 +1016 5 2 1 1 224 381 174 295 1481 2109 1281 1765 +1017 5 2 1 1 1481 2109 1281 1765 1482 2110 1282 1766 +1018 5 2 1 1 1482 2110 1282 1766 1483 2111 1283 1767 +1019 5 2 1 1 1483 2111 1283 1767 1484 2112 1284 1768 +1020 5 2 1 1 1484 2112 1284 1768 854 1011 804 925 +1021 5 2 1 1 241 475 189 463 1549 2485 1341 2437 +1022 5 2 1 1 1549 2485 1341 2437 1550 2486 1342 2438 +1023 5 2 1 1 1550 2486 1342 2438 1551 2487 1343 2439 +1024 5 2 1 1 1551 2487 1343 2439 1552 2488 1344 2440 +1025 5 2 1 1 1552 2488 1344 2440 871 1105 819 1093 +1026 5 2 1 1 242 476 191 465 1553 2489 1349 2445 +1027 5 2 1 1 1553 2489 1349 2445 1554 2490 1350 2446 +1028 5 2 1 1 1554 2490 1350 2446 1555 2491 1351 2447 +1029 5 2 1 1 1555 2491 1351 2447 1556 2492 1352 2448 +1030 5 2 1 1 1556 2492 1352 2448 872 1106 821 1095 +1031 5 2 1 1 342 253 506 191 1953 1597 2609 1349 +1032 5 2 1 1 1953 1597 2609 1349 1954 1598 2610 1350 +1033 5 2 1 1 1954 1598 2610 1350 1955 1599 2611 1351 +1034 5 2 1 1 1955 1599 2611 1351 1956 1600 2612 1352 +1035 5 2 1 1 1956 1600 2612 1352 972 883 1136 821 +1036 5 2 1 1 340 255 508 189 1945 1605 2617 1341 +1037 5 2 1 1 1945 1605 2617 1341 1946 1606 2618 1342 +1038 5 2 1 1 1946 1606 2618 1342 1947 1607 2619 1343 +1039 5 2 1 1 1947 1607 2619 1343 1948 1608 2620 1344 +1040 5 2 1 1 1948 1608 2620 1344 970 885 1138 819 +1041 5 2 1 1 341 254 507 192 1949 1601 2613 1353 +1042 5 2 1 1 1949 1601 2613 1353 1950 1602 2614 1354 +1043 5 2 1 1 1950 1602 2614 1354 1951 1603 2615 1355 +1044 5 2 1 1 1951 1603 2615 1355 1952 1604 2616 1356 +1045 5 2 1 1 1952 1604 2616 1356 971 884 1137 822 +1046 5 2 1 1 339 256 509 190 1941 1609 2621 1345 +1047 5 2 1 1 1941 1609 2621 1345 1942 1610 2622 1346 +1048 5 2 1 1 1942 1610 2622 1346 1943 1611 2623 1347 +1049 5 2 1 1 1943 1611 2623 1347 1944 1612 2624 1348 +1050 5 2 1 1 1944 1612 2624 1348 969 886 1139 820 +1051 5 2 1 1 345 195 510 257 1965 1365 2625 1613 +1052 5 2 1 1 1965 1365 2625 1613 1966 1366 2626 1614 +1053 5 2 1 1 1966 1366 2626 1614 1967 1367 2627 1615 +1054 5 2 1 1 1967 1367 2627 1615 1968 1368 2628 1616 +1055 5 2 1 1 1968 1368 2628 1616 975 825 1140 887 +1056 5 2 1 1 343 193 512 259 1957 1357 2633 1621 +1057 5 2 1 1 1957 1357 2633 1621 1958 1358 2634 1622 +1058 5 2 1 1 1958 1358 2634 1622 1959 1359 2635 1623 +1059 5 2 1 1 1959 1359 2635 1623 1960 1360 2636 1624 +1060 5 2 1 1 1960 1360 2636 1624 973 823 1142 889 +1061 5 2 1 1 346 196 511 258 1969 1369 2629 1617 +1062 5 2 1 1 1969 1369 2629 1617 1970 1370 2630 1618 +1063 5 2 1 1 1970 1370 2630 1618 1971 1371 2631 1619 +1064 5 2 1 1 1971 1371 2631 1619 1972 1372 2632 1620 +1065 5 2 1 1 1972 1372 2632 1620 976 826 1141 888 +1066 5 2 1 1 344 194 513 260 1961 1361 2637 1625 +1067 5 2 1 1 1961 1361 2637 1625 1962 1362 2638 1626 +1068 5 2 1 1 1962 1362 2638 1626 1963 1363 2639 1627 +1069 5 2 1 1 1963 1363 2639 1627 1964 1364 2640 1628 +1070 5 2 1 1 1964 1364 2640 1628 974 824 1143 890 +1071 5 2 1 1 444 261 326 214 2361 1629 1889 1441 +1072 5 2 1 1 2361 1629 1889 1441 2362 1630 1890 1442 +1073 5 2 1 1 2362 1630 1890 1442 2363 1631 1891 1443 +1074 5 2 1 1 2363 1631 1891 1443 2364 1632 1892 1444 +1075 5 2 1 1 2364 1632 1892 1444 1074 891 956 844 +1076 5 2 1 1 508 350 463 189 2617 1985 2437 1341 +1077 5 2 1 1 2617 1985 2437 1341 2618 1986 2438 1342 +1078 5 2 1 1 2618 1986 2438 1342 2619 1987 2439 1343 +1079 5 2 1 1 2619 1987 2439 1343 2620 1988 2440 1344 +1080 5 2 1 1 2620 1988 2440 1344 1138 980 1093 819 +1081 5 2 1 1 507 352 464 192 2613 1993 2441 1353 +1082 5 2 1 1 2613 1993 2441 1353 2614 1994 2442 1354 +1083 5 2 1 1 2614 1994 2442 1354 2615 1995 2443 1355 +1084 5 2 1 1 2615 1995 2443 1355 2616 1996 2444 1356 +1085 5 2 1 1 2616 1996 2444 1356 1137 982 1094 822 +1086 5 2 1 1 506 351 465 191 2609 1989 2445 1349 +1087 5 2 1 1 2609 1989 2445 1349 2610 1990 2446 1350 +1088 5 2 1 1 2610 1990 2446 1350 2611 1991 2447 1351 +1089 5 2 1 1 2611 1991 2447 1351 2612 1992 2448 1352 +1090 5 2 1 1 2612 1992 2448 1352 1136 981 1095 821 +1091 5 2 1 1 512 193 274 355 2633 1357 1681 2005 +1092 5 2 1 1 2633 1357 1681 2005 2634 1358 1682 2006 +1093 5 2 1 1 2634 1358 1682 2006 2635 1359 1683 2007 +1094 5 2 1 1 2635 1359 1683 2007 2636 1360 1684 2008 +1095 5 2 1 1 2636 1360 1684 2008 1142 823 904 985 +1096 5 2 1 1 513 194 273 356 2637 1361 1677 2009 +1097 5 2 1 1 2637 1361 1677 2009 2638 1362 1678 2010 +1098 5 2 1 1 2638 1362 1678 2010 2639 1363 1679 2011 +1099 5 2 1 1 2639 1363 1679 2011 2640 1364 1680 2012 +1100 5 2 1 1 2640 1364 1680 2012 1143 824 903 986 +1101 5 2 1 1 511 196 271 357 2629 1369 1669 2013 +1102 5 2 1 1 2629 1369 1669 2013 2630 1370 1670 2014 +1103 5 2 1 1 2630 1370 1670 2014 2631 1371 1671 2015 +1104 5 2 1 1 2631 1371 1671 2015 2632 1372 1672 2016 +1105 5 2 1 1 2632 1372 1672 2016 1141 826 901 987 +1106 5 2 1 1 510 195 272 354 2625 1365 1673 2001 +1107 5 2 1 1 2625 1365 1673 2001 2626 1366 1674 2002 +1108 5 2 1 1 2626 1366 1674 2002 2627 1367 1675 2003 +1109 5 2 1 1 2627 1367 1675 2003 2628 1368 1676 2004 +1110 5 2 1 1 2628 1368 1676 2004 1140 825 902 984 +1111 5 2 1 1 183 379 214 326 1317 2101 1441 1889 +1112 5 2 1 1 1317 2101 1441 1889 1318 2102 1442 1890 +1113 5 2 1 1 1318 2102 1442 1890 1319 2103 1443 1891 +1114 5 2 1 1 1319 2103 1443 1891 1320 2104 1444 1892 +1115 5 2 1 1 1320 2104 1444 1892 813 1009 844 956 +1116 5 2 1 1 237 503 277 360 1533 2597 1693 2025 +1117 5 2 1 1 1533 2597 1693 2025 1534 2598 1694 2026 +1118 5 2 1 1 1534 2598 1694 2026 1535 2599 1695 2027 +1119 5 2 1 1 1535 2599 1695 2027 1536 2600 1696 2028 +1120 5 2 1 1 1536 2600 1696 2028 867 1133 907 990 +1121 5 2 1 1 482 152 245 316 2513 1193 1565 1849 +1122 5 2 1 1 2513 1193 1565 1849 2514 1194 1566 1850 +1123 5 2 1 1 2514 1194 1566 1850 2515 1195 1567 1851 +1124 5 2 1 1 2515 1195 1567 1851 2516 1196 1568 1852 +1125 5 2 1 1 2516 1196 1568 1852 1112 782 875 946 +1126 5 2 1 1 483 317 532 153 2517 1853 2713 1197 +1127 5 2 1 1 2517 1853 2713 1197 2518 1854 2714 1198 +1128 5 2 1 1 2518 1854 2714 1198 2519 1855 2715 1199 +1129 5 2 1 1 2519 1855 2715 1199 2520 1856 2716 1200 +1130 5 2 1 1 2520 1856 2716 1200 1113 947 1162 783 +1131 5 2 1 1 428 263 492 179 2297 1637 2553 1301 +1132 5 2 1 1 2297 1637 2553 1301 2298 1638 2554 1302 +1133 5 2 1 1 2298 1638 2554 1302 2299 1639 2555 1303 +1134 5 2 1 1 2299 1639 2555 1303 2300 1640 2556 1304 +1135 5 2 1 1 2300 1640 2556 1304 1058 893 1122 809 +1136 5 2 1 1 429 265 494 181 2301 1645 2561 1309 +1137 5 2 1 1 2301 1645 2561 1309 2302 1646 2562 1310 +1138 5 2 1 1 2302 1646 2562 1310 2303 1647 2563 1311 +1139 5 2 1 1 2303 1647 2563 1311 2304 1648 2564 1312 +1140 5 2 1 1 2304 1648 2564 1312 1059 895 1124 811 +1141 5 2 1 1 318 219 366 280 1857 1461 2049 1705 +1142 5 2 1 1 1857 1461 2049 1705 1858 1462 2050 1706 +1143 5 2 1 1 1858 1462 2050 1706 1859 1463 2051 1707 +1144 5 2 1 1 1859 1463 2051 1707 1860 1464 2052 1708 +1145 5 2 1 1 1860 1464 2052 1708 948 849 996 910 +1146 5 2 1 1 398 262 325 171 2177 1633 1885 1269 +1147 5 2 1 1 2177 1633 1885 1269 2178 1634 1886 1270 +1148 5 2 1 1 2178 1634 1886 1270 2179 1635 1887 1271 +1149 5 2 1 1 2179 1635 1887 1271 2180 1636 1888 1272 +1150 5 2 1 1 2180 1636 1888 1272 1028 892 955 801 +1151 5 2 1 1 399 172 326 261 2181 1273 1889 1629 +1152 5 2 1 1 2181 1273 1889 1629 2182 1274 1890 1630 +1153 5 2 1 1 2182 1274 1890 1630 2183 1275 1891 1631 +1154 5 2 1 1 2183 1275 1891 1631 2184 1276 1892 1632 +1155 5 2 1 1 2184 1276 1892 1632 1029 802 956 891 +1156 5 2 1 1 373 270 38 37 2077 1665 651 647 +1157 5 2 1 1 2077 1665 651 647 2078 1666 652 648 +1158 5 2 1 1 2078 1666 652 648 2079 1667 653 649 +1159 5 2 1 1 2079 1667 653 649 2080 1668 654 650 +1160 5 2 1 1 2080 1668 654 650 1003 900 98 97 +1161 5 2 1 1 372 269 53 52 2073 1661 711 707 +1162 5 2 1 1 2073 1661 711 707 2074 1662 712 708 +1163 5 2 1 1 2074 1662 712 708 2075 1663 713 709 +1164 5 2 1 1 2075 1663 713 709 2076 1664 714 710 +1165 5 2 1 1 2076 1664 714 710 1002 899 113 112 +1166 5 2 1 1 371 268 23 22 2069 1657 591 587 +1167 5 2 1 1 2069 1657 591 587 2070 1658 592 588 +1168 5 2 1 1 2070 1658 592 588 2071 1659 593 589 +1169 5 2 1 1 2071 1659 593 589 2072 1660 594 590 +1170 5 2 1 1 2072 1660 594 590 1001 898 83 82 +1171 5 2 1 1 370 267 68 67 2065 1653 771 767 +1172 5 2 1 1 2065 1653 771 767 2066 1654 772 768 +1173 5 2 1 1 2066 1654 772 768 2067 1655 773 769 +1174 5 2 1 1 2067 1655 773 769 2068 1656 774 770 +1175 5 2 1 1 2068 1656 774 770 1000 897 128 127 +1176 5 2 1 1 377 41 40 266 2093 663 659 1649 +1177 5 2 1 1 2093 663 659 1649 2094 664 660 1650 +1178 5 2 1 1 2094 664 660 1650 2095 665 661 1651 +1179 5 2 1 1 2095 665 661 1651 2096 666 662 1652 +1180 5 2 1 1 2096 666 662 1652 1007 101 100 896 +1181 5 2 1 1 376 26 25 265 2089 603 599 1645 +1182 5 2 1 1 2089 603 599 1645 2090 604 600 1646 +1183 5 2 1 1 2090 604 600 1646 2091 605 601 1647 +1184 5 2 1 1 2091 605 601 1647 2092 606 602 1648 +1185 5 2 1 1 2092 606 602 1648 1006 86 85 895 +1186 5 2 1 1 375 56 55 264 2085 723 719 1641 +1187 5 2 1 1 2085 723 719 1641 2086 724 720 1642 +1188 5 2 1 1 2086 724 720 1642 2087 725 721 1643 +1189 5 2 1 1 2087 725 721 1643 2088 726 722 1644 +1190 5 2 1 1 2088 726 722 1644 1005 116 115 894 +1191 5 2 1 1 374 11 10 263 2081 543 539 1637 +1192 5 2 1 1 2081 543 539 1637 2082 544 540 1638 +1193 5 2 1 1 2082 544 540 1638 2083 545 541 1639 +1194 5 2 1 1 2083 545 541 1639 2084 546 542 1640 +1195 5 2 1 1 2084 546 542 1640 1004 71 70 893 +1196 5 2 1 1 373 430 400 270 2077 2305 2185 1665 +1197 5 2 1 1 2077 2305 2185 1665 2078 2306 2186 1666 +1198 5 2 1 1 2078 2306 2186 1666 2079 2307 2187 1667 +1199 5 2 1 1 2079 2307 2187 1667 2080 2308 2188 1668 +1200 5 2 1 1 2080 2308 2188 1668 1003 1060 1030 900 +1201 5 2 1 1 372 426 425 269 2073 2289 2285 1661 +1202 5 2 1 1 2073 2289 2285 1661 2074 2290 2286 1662 +1203 5 2 1 1 2074 2290 2286 1662 2075 2291 2287 1663 +1204 5 2 1 1 2075 2291 2287 1663 2076 2292 2288 1664 +1205 5 2 1 1 2076 2292 2288 1664 1002 1056 1055 899 +1206 5 2 1 1 374 263 428 202 2081 1637 2297 1393 +1207 5 2 1 1 2081 1637 2297 1393 2082 1638 2298 1394 +1208 5 2 1 1 2082 1638 2298 1394 2083 1639 2299 1395 +1209 5 2 1 1 2083 1639 2299 1395 2084 1640 2300 1396 +1210 5 2 1 1 2084 1640 2300 1396 1004 893 1058 832 +1211 5 2 1 1 376 265 429 204 2089 1645 2301 1401 +1212 5 2 1 1 2089 1645 2301 1401 2090 1646 2302 1402 +1213 5 2 1 1 2090 1646 2302 1402 2091 1647 2303 1403 +1214 5 2 1 1 2091 1647 2303 1403 2092 1648 2304 1404 +1215 5 2 1 1 2092 1648 2304 1404 1006 895 1059 834 +1216 5 2 1 1 209 284 159 392 1421 1721 1221 2153 +1217 5 2 1 1 1421 1721 1221 2153 1422 1722 1222 2154 +1218 5 2 1 1 1422 1722 1222 2154 1423 1723 1223 2155 +1219 5 2 1 1 1423 1723 1223 2155 1424 1724 1224 2156 +1220 5 2 1 1 1424 1724 1224 2156 839 914 789 1022 +1221 5 2 1 1 208 285 158 391 1417 1725 1217 2149 +1222 5 2 1 1 1417 1725 1217 2149 1418 1726 1218 2150 +1223 5 2 1 1 1418 1726 1218 2150 1419 1727 1219 2151 +1224 5 2 1 1 1419 1727 1219 2151 1420 1728 1220 2152 +1225 5 2 1 1 1420 1728 1220 2152 838 915 788 1021 +1226 5 2 1 1 394 287 315 211 2161 1733 1845 1429 +1227 5 2 1 1 2161 1733 1845 1429 2162 1734 1846 1430 +1228 5 2 1 1 2162 1734 1846 1430 2163 1735 1847 1431 +1229 5 2 1 1 2163 1735 1847 1431 2164 1736 1848 1432 +1230 5 2 1 1 2164 1736 1848 1432 1024 917 945 841 +1231 5 2 1 1 239 361 210 378 1541 2029 1425 2097 +1232 5 2 1 1 1541 2029 1425 2097 1542 2030 1426 2098 +1233 5 2 1 1 1542 2030 1426 2098 1543 2031 1427 2099 +1234 5 2 1 1 1543 2031 1427 2099 1544 2032 1428 2100 +1235 5 2 1 1 1544 2032 1428 2100 869 991 840 1008 +1236 5 2 1 1 340 434 199 255 1945 2321 1381 1605 +1237 5 2 1 1 1945 2321 1381 1605 1946 2322 1382 1606 +1238 5 2 1 1 1946 2322 1382 1606 1947 2323 1383 1607 +1239 5 2 1 1 1947 2323 1383 1607 1948 2324 1384 1608 +1240 5 2 1 1 1948 2324 1384 1608 970 1064 829 885 +1241 5 2 1 1 339 435 200 256 1941 2325 1385 1609 +1242 5 2 1 1 1941 2325 1385 1609 1942 2326 1386 1610 +1243 5 2 1 1 1942 2326 1386 1610 1943 2327 1387 1611 +1244 5 2 1 1 1943 2327 1387 1611 1944 2328 1388 1612 +1245 5 2 1 1 1944 2328 1388 1612 969 1065 830 886 +1246 5 2 1 1 343 259 201 437 1957 1621 1389 2333 +1247 5 2 1 1 1957 1621 1389 2333 1958 1622 1390 2334 +1248 5 2 1 1 1958 1622 1390 2334 1959 1623 1391 2335 +1249 5 2 1 1 1959 1623 1391 2335 1960 1624 1392 2336 +1250 5 2 1 1 1960 1624 1392 2336 973 889 831 1067 +1251 5 2 1 1 345 257 203 436 1965 1613 1397 2329 +1252 5 2 1 1 1965 1613 1397 2329 1966 1614 1398 2330 +1253 5 2 1 1 1966 1614 1398 2330 1967 1615 1399 2331 +1254 5 2 1 1 1967 1615 1399 2331 1968 1616 1400 2332 +1255 5 2 1 1 1968 1616 1400 2332 975 887 833 1066 +1256 5 2 1 1 440 264 493 178 2345 1641 2557 1297 +1257 5 2 1 1 2345 1641 2557 1297 2346 1642 2558 1298 +1258 5 2 1 1 2346 1642 2558 1298 2347 1643 2559 1299 +1259 5 2 1 1 2347 1643 2559 1299 2348 1644 2560 1300 +1260 5 2 1 1 2348 1644 2560 1300 1070 894 1123 808 +1261 5 2 1 1 441 266 495 180 2349 1649 2565 1305 +1262 5 2 1 1 2349 1649 2565 1305 2350 1650 2566 1306 +1263 5 2 1 1 2350 1650 2566 1306 2351 1651 2567 1307 +1264 5 2 1 1 2351 1651 2567 1307 2352 1652 2568 1308 +1265 5 2 1 1 2352 1652 2568 1308 1071 896 1125 810 +1266 5 2 1 1 440 201 375 264 2345 1389 2085 1641 +1267 5 2 1 1 2345 1389 2085 1641 2346 1390 2086 1642 +1268 5 2 1 1 2346 1390 2086 1642 2347 1391 2087 1643 +1269 5 2 1 1 2347 1391 2087 1643 2348 1392 2088 1644 +1270 5 2 1 1 2348 1392 2088 1644 1070 831 1005 894 +1271 5 2 1 1 441 203 377 266 2349 1397 2093 1649 +1272 5 2 1 1 2349 1397 2093 1649 2350 1398 2094 1650 +1273 5 2 1 1 2350 1398 2094 1650 2351 1399 2095 1651 +1274 5 2 1 1 2351 1399 2095 1651 2352 1400 2096 1652 +1275 5 2 1 1 2352 1400 2096 1652 1071 833 1007 896 +1276 5 2 1 1 439 267 370 200 2341 1653 2065 1385 +1277 5 2 1 1 2341 1653 2065 1385 2342 1654 2066 1386 +1278 5 2 1 1 2342 1654 2066 1386 2343 1655 2067 1387 +1279 5 2 1 1 2343 1655 2067 1387 2344 1656 2068 1388 +1280 5 2 1 1 2344 1656 2068 1388 1069 897 1000 830 +1281 5 2 1 1 438 268 371 199 2337 1657 2069 1381 +1282 5 2 1 1 2337 1657 2069 1381 2338 1658 2070 1382 +1283 5 2 1 1 2338 1658 2070 1382 2339 1659 2071 1383 +1284 5 2 1 1 2339 1659 2071 1383 2340 1660 2072 1384 +1285 5 2 1 1 2340 1660 2072 1384 1068 898 1001 829 +1286 5 2 1 1 405 269 425 177 2205 1661 2285 1293 +1287 5 2 1 1 2205 1661 2285 1293 2206 1662 2286 1294 +1288 5 2 1 1 2206 1662 2286 1294 2207 1663 2287 1295 +1289 5 2 1 1 2207 1663 2287 1295 2208 1664 2288 1296 +1290 5 2 1 1 2208 1664 2288 1296 1035 899 1055 807 +1291 5 2 1 1 516 270 400 176 2649 1665 2185 1289 +1292 5 2 1 1 2649 1665 2185 1289 2650 1666 2186 1290 +1293 5 2 1 1 2650 1666 2186 1290 2651 1667 2187 1291 +1294 5 2 1 1 2651 1667 2187 1291 2652 1668 2188 1292 +1295 5 2 1 1 2652 1668 2188 1292 1146 900 1030 806 +1296 5 2 1 1 422 272 432 243 2273 1673 2313 1557 +1297 5 2 1 1 2273 1673 2313 1557 2274 1674 2314 1558 +1298 5 2 1 1 2274 1674 2314 1558 2275 1675 2315 1559 +1299 5 2 1 1 2275 1675 2315 1559 2276 1676 2316 1560 +1300 5 2 1 1 2276 1676 2316 1560 1052 902 1062 873 +1301 5 2 1 1 424 274 431 240 2281 1681 2309 1545 +1302 5 2 1 1 2281 1681 2309 1545 2282 1682 2310 1546 +1303 5 2 1 1 2282 1682 2310 1546 2283 1683 2311 1547 +1304 5 2 1 1 2283 1683 2311 1547 2284 1684 2312 1548 +1305 5 2 1 1 2284 1684 2312 1548 1054 904 1061 870 +1306 5 2 1 1 503 182 293 277 2597 1313 1757 1693 +1307 5 2 1 1 2597 1313 1757 1693 2598 1314 1758 1694 +1308 5 2 1 1 2598 1314 1758 1694 2599 1315 1759 1695 +1309 5 2 1 1 2599 1315 1759 1695 2600 1316 1760 1696 +1310 5 2 1 1 2600 1316 1760 1696 1133 812 923 907 +1311 5 2 1 1 155 338 250 307 1205 1937 1585 1813 +1312 5 2 1 1 1205 1937 1585 1813 1206 1938 1586 1814 +1313 5 2 1 1 1206 1938 1586 1814 1207 1939 1587 1815 +1314 5 2 1 1 1207 1939 1587 1815 1208 1940 1588 1816 +1315 5 2 1 1 1208 1940 1588 1816 785 968 880 937 +1316 5 2 1 1 215 276 160 446 1445 1689 1225 2369 +1317 5 2 1 1 1445 1689 1225 2369 1446 1690 1226 2370 +1318 5 2 1 1 1446 1690 1226 2370 1447 1691 1227 2371 +1319 5 2 1 1 1447 1691 1227 2371 1448 1692 1228 2372 +1320 5 2 1 1 1448 1692 1228 2372 845 906 790 1076 +1321 5 2 1 1 335 171 403 281 1925 1269 2197 1709 +1322 5 2 1 1 1925 1269 2197 1709 1926 1270 2198 1710 +1323 5 2 1 1 1926 1270 2198 1710 1927 1271 2199 1711 +1324 5 2 1 1 1927 1271 2199 1711 1928 1272 2200 1712 +1325 5 2 1 1 1928 1272 2200 1712 965 801 1033 911 +1326 5 2 1 1 336 282 402 172 1929 1713 2193 1273 +1327 5 2 1 1 1929 1713 2193 1273 1930 1714 2194 1274 +1328 5 2 1 1 1930 1714 2194 1274 1931 1715 2195 1275 +1329 5 2 1 1 1931 1715 2195 1275 1932 1716 2196 1276 +1330 5 2 1 1 1932 1716 2196 1276 966 912 1032 802 +1331 5 2 1 1 244 317 179 525 1561 1853 1301 2685 +1332 5 2 1 1 1561 1853 1301 2685 1562 1854 1302 2686 +1333 5 2 1 1 1562 1854 1302 2686 1563 1855 1303 2687 +1334 5 2 1 1 1563 1855 1303 2687 1564 1856 1304 2688 +1335 5 2 1 1 1564 1856 1304 2688 874 947 809 1155 +1336 5 2 1 1 531 318 181 527 2709 1857 1309 2693 +1337 5 2 1 1 2709 1857 1309 2693 2710 1858 1310 2694 +1338 5 2 1 1 2710 1858 1310 2694 2711 1859 1311 2695 +1339 5 2 1 1 2711 1859 1311 2695 2712 1860 1312 2696 +1340 5 2 1 1 2712 1860 1312 2696 1161 948 811 1157 +1341 5 2 1 1 387 303 307 186 2133 1797 1813 1329 +1342 5 2 1 1 2133 1797 1813 1329 2134 1798 1814 1330 +1343 5 2 1 1 2134 1798 1814 1330 2135 1799 1815 1331 +1344 5 2 1 1 2135 1799 1815 1331 2136 1800 1816 1332 +1345 5 2 1 1 2136 1800 1816 1332 1017 933 937 816 +1346 5 2 1 1 454 277 293 216 2401 1693 1757 1449 +1347 5 2 1 1 2401 1693 1757 1449 2402 1694 1758 1450 +1348 5 2 1 1 2402 1694 1758 1450 2403 1695 1759 1451 +1349 5 2 1 1 2403 1695 1759 1451 2404 1696 1760 1452 +1350 5 2 1 1 2404 1696 1760 1452 1084 907 923 846 +1351 5 2 1 1 454 145 360 277 2401 1165 2025 1693 +1352 5 2 1 1 2401 1165 2025 1693 2402 1166 2026 1694 +1353 5 2 1 1 2402 1166 2026 1694 2403 1167 2027 1695 +1354 5 2 1 1 2403 1167 2027 1695 2404 1168 2028 1696 +1355 5 2 1 1 2404 1168 2028 1696 1084 775 990 907 +1356 5 2 1 1 321 518 197 252 1869 2657 1373 1593 +1357 5 2 1 1 1869 2657 1373 1593 1870 2658 1374 1594 +1358 5 2 1 1 1870 2658 1374 1594 1871 2659 1375 1595 +1359 5 2 1 1 1871 2659 1375 1595 1872 2660 1376 1596 +1360 5 2 1 1 1872 2660 1376 1596 951 1148 827 882 +1361 5 2 1 1 497 275 379 183 2573 1685 2101 1317 +1362 5 2 1 1 2573 1685 2101 1317 2574 1686 2102 1318 +1363 5 2 1 1 2574 1686 2102 1318 2575 1687 2103 1319 +1364 5 2 1 1 2575 1687 2103 1319 2576 1688 2104 1320 +1365 5 2 1 1 2576 1688 2104 1320 1127 905 1009 813 +1366 5 2 1 1 400 276 533 176 2185 1689 2717 1289 +1367 5 2 1 1 2185 1689 2717 1289 2186 1690 2718 1290 +1368 5 2 1 1 2186 1690 2718 1290 2187 1691 2719 1291 +1369 5 2 1 1 2187 1691 2719 1291 2188 1692 2720 1292 +1370 5 2 1 1 2188 1692 2720 1292 1030 906 1163 806 +1371 5 2 1 1 173 461 251 519 1277 2429 1589 2661 +1372 5 2 1 1 1277 2429 1589 2661 1278 2430 1590 2662 +1373 5 2 1 1 1278 2430 1590 2662 1279 2431 1591 2663 +1374 5 2 1 1 1279 2431 1591 2663 1280 2432 1592 2664 +1375 5 2 1 1 1280 2432 1592 2664 803 1091 881 1149 +1376 5 2 1 1 157 455 236 396 1213 2405 1529 2169 +1377 5 2 1 1 1213 2405 1529 2169 1214 2406 1530 2170 +1378 5 2 1 1 1214 2406 1530 2170 1215 2407 1531 2171 +1379 5 2 1 1 1215 2407 1531 2171 1216 2408 1532 2172 +1380 5 2 1 1 1216 2408 1532 2172 787 1085 866 1026 +1381 5 2 1 1 407 314 284 209 2213 1841 1721 1421 +1382 5 2 1 1 2213 1841 1721 1421 2214 1842 1722 1422 +1383 5 2 1 1 2214 1842 1722 1422 2215 1843 1723 1423 +1384 5 2 1 1 2215 1843 1723 1423 2216 1844 1724 1424 +1385 5 2 1 1 2216 1844 1724 1424 1037 944 914 839 +1386 5 2 1 1 379 275 156 453 2101 1685 1209 2397 +1387 5 2 1 1 2101 1685 1209 2397 2102 1686 1210 2398 +1388 5 2 1 1 2102 1686 1210 2398 2103 1687 1211 2399 +1389 5 2 1 1 2103 1687 1211 2399 2104 1688 1212 2400 +1390 5 2 1 1 2104 1688 1212 2400 1009 905 786 1083 +1391 5 2 1 1 338 304 324 188 1937 1801 1881 1337 +1392 5 2 1 1 1937 1801 1881 1337 1938 1802 1882 1338 +1393 5 2 1 1 1938 1802 1882 1338 1939 1803 1883 1339 +1394 5 2 1 1 1939 1803 1883 1339 1940 1804 1884 1340 +1395 5 2 1 1 1940 1804 1884 1340 968 934 954 818 +1396 5 2 1 1 434 158 480 295 2321 1217 2505 1765 +1397 5 2 1 1 2321 1217 2505 1765 2322 1218 2506 1766 +1398 5 2 1 1 2322 1218 2506 1766 2323 1219 2507 1767 +1399 5 2 1 1 2323 1219 2507 1767 2324 1220 2508 1768 +1400 5 2 1 1 2324 1220 2508 1768 1064 788 1110 925 +1401 5 2 1 1 435 159 479 296 2325 1221 2501 1769 +1402 5 2 1 1 2325 1221 2501 1769 2326 1222 2502 1770 +1403 5 2 1 1 2326 1222 2502 1770 2327 1223 2503 1771 +1404 5 2 1 1 2327 1223 2503 1771 2328 1224 2504 1772 +1405 5 2 1 1 2328 1224 2504 1772 1065 789 1109 926 +1406 5 2 1 1 440 178 490 297 2345 1297 2545 1773 +1407 5 2 1 1 2345 1297 2545 1773 2346 1298 2546 1774 +1408 5 2 1 1 2346 1298 2546 1774 2347 1299 2547 1775 +1409 5 2 1 1 2347 1299 2547 1775 2348 1300 2548 1776 +1410 5 2 1 1 2348 1300 2548 1776 1070 808 1120 927 +1411 5 2 1 1 441 180 491 298 2349 1305 2549 1777 +1412 5 2 1 1 2349 1305 2549 1777 2350 1306 2550 1778 +1413 5 2 1 1 2350 1306 2550 1778 2351 1307 2551 1779 +1414 5 2 1 1 2351 1307 2551 1779 2352 1308 2552 1780 +1415 5 2 1 1 2352 1308 2552 1780 1071 810 1121 928 +1416 5 2 1 1 443 148 286 359 2357 1177 1729 2021 +1417 5 2 1 1 2357 1177 1729 2021 2358 1178 1730 2022 +1418 5 2 1 1 2358 1178 1730 2022 2359 1179 1731 2023 +1419 5 2 1 1 2359 1179 1731 2023 2360 1180 1732 2024 +1420 5 2 1 1 2360 1180 1732 2024 1073 778 916 989 +1421 5 2 1 1 481 287 394 162 2509 1733 2161 1233 +1422 5 2 1 1 2509 1733 2161 1233 2510 1734 2162 1234 +1423 5 2 1 1 2510 1734 2162 1234 2511 1735 2163 1235 +1424 5 2 1 1 2511 1735 2163 1235 2512 1736 2164 1236 +1425 5 2 1 1 2512 1736 2164 1236 1111 917 1024 792 +1426 5 2 1 1 2 53 269 332 141 711 1661 1913 +1427 5 2 1 1 141 711 1661 1913 142 712 1662 1914 +1428 5 2 1 1 142 712 1662 1914 143 713 1663 1915 +1429 5 2 1 1 143 713 1663 1915 144 714 1664 1916 +1430 5 2 1 1 144 714 1664 1916 8 113 899 962 +1431 5 2 1 1 4 68 267 331 129 771 1653 1909 +1432 5 2 1 1 129 771 1653 1909 130 772 1654 1910 +1433 5 2 1 1 130 772 1654 1910 131 773 1655 1911 +1434 5 2 1 1 131 773 1655 1911 132 774 1656 1912 +1435 5 2 1 1 132 774 1656 1912 5 128 897 961 +1436 5 2 1 1 3 23 268 333 133 591 1657 1917 +1437 5 2 1 1 133 591 1657 1917 134 592 1658 1918 +1438 5 2 1 1 134 592 1658 1918 135 593 1659 1919 +1439 5 2 1 1 135 593 1659 1919 136 594 1660 1920 +1440 5 2 1 1 136 594 1660 1920 6 83 898 963 +1441 5 2 1 1 39 330 266 40 655 1905 1649 659 +1442 5 2 1 1 655 1905 1649 659 656 1906 1650 660 +1443 5 2 1 1 656 1906 1650 660 657 1907 1651 661 +1444 5 2 1 1 657 1907 1651 661 658 1908 1652 662 +1445 5 2 1 1 658 1908 1652 662 99 960 896 100 +1446 5 2 1 1 382 490 526 245 2113 2545 2689 1565 +1447 5 2 1 1 2113 2545 2689 1565 2114 2546 2690 1566 +1448 5 2 1 1 2114 2546 2690 1566 2115 2547 2691 1567 +1449 5 2 1 1 2115 2547 2691 1567 2116 2548 2692 1568 +1450 5 2 1 1 2116 2548 2692 1568 1012 1120 1156 875 +1451 5 2 1 1 383 491 528 246 2117 2549 2697 1569 +1452 5 2 1 1 2117 2549 2697 1569 2118 2550 2698 1570 +1453 5 2 1 1 2118 2550 2698 1570 2119 2551 2699 1571 +1454 5 2 1 1 2119 2551 2699 1571 2120 2552 2700 1572 +1455 5 2 1 1 2120 2552 2700 1572 1013 1121 1158 876 +1456 5 2 1 1 224 385 301 477 1481 2125 1789 2493 +1457 5 2 1 1 1481 2125 1789 2493 1482 2126 1790 2494 +1458 5 2 1 1 1482 2126 1790 2494 1483 2127 1791 2495 +1459 5 2 1 1 1483 2127 1791 2495 1484 2128 1792 2496 +1460 5 2 1 1 1484 2128 1792 2496 854 1015 931 1107 +1461 5 2 1 1 225 386 302 478 1485 2129 1793 2497 +1462 5 2 1 1 1485 2129 1793 2497 1486 2130 1794 2498 +1463 5 2 1 1 1486 2130 1794 2498 1487 2131 1795 2499 +1464 5 2 1 1 1487 2131 1795 2499 1488 2132 1796 2500 +1465 5 2 1 1 1488 2132 1796 2500 855 1016 932 1108 +1466 5 2 1 1 206 389 233 451 1409 2141 1517 2389 +1467 5 2 1 1 1409 2141 1517 2389 1410 2142 1518 2390 +1468 5 2 1 1 1410 2142 1518 2390 1411 2143 1519 2391 +1469 5 2 1 1 1411 2143 1519 2391 1412 2144 1520 2392 +1470 5 2 1 1 1412 2144 1520 2392 836 1019 863 1081 +1471 5 2 1 1 486 170 337 283 2529 1265 1933 1717 +1472 5 2 1 1 2529 1265 1933 1717 2530 1266 1934 1718 +1473 5 2 1 1 2530 1266 1934 1718 2531 1267 1935 1719 +1474 5 2 1 1 2531 1267 1935 1719 2532 1268 1936 1720 +1475 5 2 1 1 2532 1268 1936 1720 1116 800 967 913 +1476 5 2 1 1 384 292 359 187 2121 1753 2021 1333 +1477 5 2 1 1 2121 1753 2021 1333 2122 1754 2022 1334 +1478 5 2 1 1 2122 1754 2022 1334 2123 1755 2023 1335 +1479 5 2 1 1 2123 1755 2023 1335 2124 1756 2024 1336 +1480 5 2 1 1 2124 1756 2024 1336 1014 922 989 817 +1481 5 2 1 1 205 335 217 364 1405 1925 1453 2041 +1482 5 2 1 1 1405 1925 1453 2041 1406 1926 1454 2042 +1483 5 2 1 1 1406 1926 1454 2042 1407 1927 1455 2043 +1484 5 2 1 1 1407 1927 1455 2043 1408 1928 1456 2044 +1485 5 2 1 1 1408 1928 1456 2044 835 965 847 994 +1486 5 2 1 1 206 366 219 337 1409 2049 1461 1933 +1487 5 2 1 1 1409 2049 1461 1933 1410 2050 1462 1934 +1488 5 2 1 1 1410 2050 1462 1934 1411 2051 1463 1935 +1489 5 2 1 1 1411 2051 1463 1935 1412 2052 1464 1936 +1490 5 2 1 1 1412 2052 1464 1936 836 996 849 967 +1491 5 2 1 1 207 365 218 336 1413 2045 1457 1929 +1492 5 2 1 1 1413 2045 1457 1929 1414 2046 1458 1930 +1493 5 2 1 1 1414 2046 1458 1930 1415 2047 1459 1931 +1494 5 2 1 1 1415 2047 1459 1931 1416 2048 1460 1932 +1495 5 2 1 1 1416 2048 1460 1932 837 995 848 966 +1496 5 2 1 1 284 184 302 386 1721 1321 1793 2129 +1497 5 2 1 1 1721 1321 1793 2129 1722 1322 1794 2130 +1498 5 2 1 1 1722 1322 1794 2130 1723 1323 1795 2131 +1499 5 2 1 1 1723 1323 1795 2131 1724 1324 1796 2132 +1500 5 2 1 1 1724 1324 1796 2132 914 814 932 1016 +1501 5 2 1 1 387 186 315 287 2133 1329 1845 1733 +1502 5 2 1 1 2133 1329 1845 1733 2134 1330 1846 1734 +1503 5 2 1 1 2134 1330 1846 1734 2135 1331 1847 1735 +1504 5 2 1 1 2135 1331 1847 1735 2136 1332 1848 1736 +1505 5 2 1 1 2136 1332 1848 1736 1017 816 945 917 +1506 5 2 1 1 487 281 403 222 2533 1709 2197 1473 +1507 5 2 1 1 2533 1709 2197 1473 2534 1710 2198 1474 +1508 5 2 1 1 2534 1710 2198 1474 2535 1711 2199 1475 +1509 5 2 1 1 2535 1711 2199 1475 2536 1712 2200 1476 +1510 5 2 1 1 2536 1712 2200 1476 1117 911 1033 852 +1511 5 2 1 1 488 221 402 282 2537 1469 2193 1713 +1512 5 2 1 1 2537 1469 2193 1713 2538 1470 2194 1714 +1513 5 2 1 1 2538 1470 2194 1714 2539 1471 2195 1715 +1514 5 2 1 1 2539 1471 2195 1715 2540 1472 2196 1716 +1515 5 2 1 1 2540 1472 2196 1716 1118 851 1032 912 +1516 5 2 1 1 489 223 486 283 2541 1477 2529 1717 +1517 5 2 1 1 2541 1477 2529 1717 2542 1478 2530 1718 +1518 5 2 1 1 2542 1478 2530 1718 2543 1479 2531 1719 +1519 5 2 1 1 2543 1479 2531 1719 2544 1480 2532 1720 +1520 5 2 1 1 2544 1480 2532 1720 1119 853 1116 913 +1521 5 2 1 1 482 217 335 281 2513 1453 1925 1709 +1522 5 2 1 1 2513 1453 1925 1709 2514 1454 1926 1710 +1523 5 2 1 1 2514 1454 1926 1710 2515 1455 1927 1711 +1524 5 2 1 1 2515 1455 1927 1711 2516 1456 1928 1712 +1525 5 2 1 1 2516 1456 1928 1712 1112 847 965 911 +1526 5 2 1 1 483 282 336 218 2517 1713 1929 1457 +1527 5 2 1 1 2517 1713 1929 1457 2518 1714 1930 1458 +1528 5 2 1 1 2518 1714 1930 1458 2519 1715 1931 1459 +1529 5 2 1 1 2519 1715 1931 1459 2520 1716 1932 1460 +1530 5 2 1 1 2520 1716 1932 1460 1113 912 966 848 +1531 5 2 1 1 484 283 337 219 2521 1717 1933 1461 +1532 5 2 1 1 2521 1717 1933 1461 2522 1718 1934 1462 +1533 5 2 1 1 2522 1718 1934 1462 2523 1719 1935 1463 +1534 5 2 1 1 2523 1719 1935 1463 2524 1720 1936 1464 +1535 5 2 1 1 2524 1720 1936 1464 1114 913 967 849 +1536 5 2 1 1 425 278 316 177 2285 1697 1849 1293 +1537 5 2 1 1 2285 1697 1849 1293 2286 1698 1850 1294 +1538 5 2 1 1 2286 1698 1850 1294 2287 1699 1851 1295 +1539 5 2 1 1 2287 1699 1851 1295 2288 1700 1852 1296 +1540 5 2 1 1 2288 1700 1852 1296 1055 908 946 807 +1541 5 2 1 1 427 280 366 165 2293 1705 2049 1245 +1542 5 2 1 1 2293 1705 2049 1245 2294 1706 2050 1246 +1543 5 2 1 1 2294 1706 2050 1246 2295 1707 2051 1247 +1544 5 2 1 1 2295 1707 2051 1247 2296 1708 2052 1248 +1545 5 2 1 1 2296 1708 2052 1248 1057 910 996 795 +1546 5 2 1 1 428 179 317 279 2297 1301 1853 1701 +1547 5 2 1 1 2297 1301 1853 1701 2298 1302 1854 1702 +1548 5 2 1 1 2298 1302 1854 1702 2299 1303 1855 1703 +1549 5 2 1 1 2299 1303 1855 1703 2300 1304 1856 1704 +1550 5 2 1 1 2300 1304 1856 1704 1058 809 947 909 +1551 5 2 1 1 429 181 318 280 2301 1309 1857 1705 +1552 5 2 1 1 2301 1309 1857 1705 2302 1310 1858 1706 +1553 5 2 1 1 2302 1310 1858 1706 2303 1311 1859 1707 +1554 5 2 1 1 2303 1311 1859 1707 2304 1312 1860 1708 +1555 5 2 1 1 2304 1312 1860 1708 1059 811 948 910 +1556 5 2 1 1 198 397 238 367 1377 2173 1537 2053 +1557 5 2 1 1 1377 2173 1537 2053 1378 2174 1538 2054 +1558 5 2 1 1 1378 2174 1538 2054 1379 2175 1539 2055 +1559 5 2 1 1 1379 2175 1539 2055 1380 2176 1540 2056 +1560 5 2 1 1 1380 2176 1540 2056 828 1027 868 997 +1561 5 2 1 1 233 449 165 451 1517 2381 1245 2389 +1562 5 2 1 1 1517 2381 1245 2389 1518 2382 1246 2390 +1563 5 2 1 1 1518 2382 1246 2390 1519 2383 1247 2391 +1564 5 2 1 1 1519 2383 1247 2391 1520 2384 1248 2392 +1565 5 2 1 1 1520 2384 1248 2392 863 1079 795 1081 +1566 5 2 1 1 448 452 390 234 2377 2393 2145 1521 +1567 5 2 1 1 2377 2393 2145 1521 2378 2394 2146 1522 +1568 5 2 1 1 2378 2394 2146 1522 2379 2395 2147 1523 +1569 5 2 1 1 2379 2395 2147 1523 2380 2396 2148 1524 +1570 5 2 1 1 2380 2396 2148 1524 1078 1082 1020 864 +1571 5 2 1 1 442 213 359 292 2353 1437 2021 1753 +1572 5 2 1 1 2353 1437 2021 1753 2354 1438 2022 1754 +1573 5 2 1 1 2354 1438 2022 1754 2355 1439 2023 1755 +1574 5 2 1 1 2355 1439 2023 1755 2356 1440 2024 1756 +1575 5 2 1 1 2356 1440 2024 1756 1072 843 989 922 +1576 5 2 1 1 492 263 10 327 2553 1637 539 1893 +1577 5 2 1 1 2553 1637 539 1893 2554 1638 540 1894 +1578 5 2 1 1 2554 1638 540 1894 2555 1639 541 1895 +1579 5 2 1 1 2555 1639 541 1895 2556 1640 542 1896 +1580 5 2 1 1 2556 1640 542 1896 1122 893 70 957 +1581 5 2 1 1 493 264 55 328 2557 1641 719 1897 +1582 5 2 1 1 2557 1641 719 1897 2558 1642 720 1898 +1583 5 2 1 1 2558 1642 720 1898 2559 1643 721 1899 +1584 5 2 1 1 2559 1643 721 1899 2560 1644 722 1900 +1585 5 2 1 1 2560 1644 722 1900 1123 894 115 958 +1586 5 2 1 1 494 265 25 329 2561 1645 599 1901 +1587 5 2 1 1 2561 1645 599 1901 2562 1646 600 1902 +1588 5 2 1 1 2562 1646 600 1902 2563 1647 601 1903 +1589 5 2 1 1 2563 1647 601 1903 2564 1648 602 1904 +1590 5 2 1 1 2564 1648 602 1904 1124 895 85 959 +1591 5 2 1 1 389 149 378 290 2141 1181 2097 1745 +1592 5 2 1 1 2141 1181 2097 1745 2142 1182 2098 1746 +1593 5 2 1 1 2142 1182 2098 1746 2143 1183 2099 1747 +1594 5 2 1 1 2143 1183 2099 1747 2144 1184 2100 1748 +1595 5 2 1 1 2144 1184 2100 1748 1019 779 1008 920 +1596 5 2 1 1 311 431 274 193 1829 2309 1681 1357 +1597 5 2 1 1 1829 2309 1681 1357 1830 2310 1682 1358 +1598 5 2 1 1 1830 2310 1682 1358 1831 2311 1683 1359 +1599 5 2 1 1 1831 2311 1683 1359 1832 2312 1684 1360 +1600 5 2 1 1 1832 2312 1684 1360 941 1061 904 823 +1601 5 2 1 1 312 432 272 195 1833 2313 1673 1365 +1602 5 2 1 1 1833 2313 1673 1365 1834 2314 1674 1366 +1603 5 2 1 1 1834 2314 1674 1366 1835 2315 1675 1367 +1604 5 2 1 1 1835 2315 1675 1367 1836 2316 1676 1368 +1605 5 2 1 1 1836 2316 1676 1368 942 1062 902 825 +1606 5 2 1 1 531 527 174 381 2709 2693 1281 2109 +1607 5 2 1 1 2709 2693 1281 2109 2710 2694 1282 2110 +1608 5 2 1 1 2710 2694 1282 2110 2711 2695 1283 2111 +1609 5 2 1 1 2711 2695 1283 2111 2712 2696 1284 2112 +1610 5 2 1 1 2712 2696 1284 2112 1161 1157 804 1011 +1611 5 2 1 1 244 525 175 380 1561 2685 1285 2105 +1612 5 2 1 1 1561 2685 1285 2105 1562 2686 1286 2106 +1613 5 2 1 1 1562 2686 1286 2106 1563 2687 1287 2107 +1614 5 2 1 1 1563 2687 1287 2107 1564 2688 1288 2108 +1615 5 2 1 1 1564 2688 1288 2108 874 1155 805 1010 +1616 5 2 1 1 474 240 322 308 2481 1545 1873 1817 +1617 5 2 1 1 2481 1545 1873 1817 2482 1546 1874 1818 +1618 5 2 1 1 2482 1546 1874 1818 2483 1547 1875 1819 +1619 5 2 1 1 2483 1547 1875 1819 2484 1548 1876 1820 +1620 5 2 1 1 2484 1548 1876 1820 1104 870 952 938 +1621 5 2 1 1 185 385 285 514 1325 2125 1725 2641 +1622 5 2 1 1 1325 2125 1725 2641 1326 2126 1726 2642 +1623 5 2 1 1 1326 2126 1726 2642 1327 2127 1727 2643 +1624 5 2 1 1 1327 2127 1727 2643 1328 2128 1728 2644 +1625 5 2 1 1 1328 2128 1728 2644 815 1015 915 1144 +1626 5 2 1 1 212 286 148 456 1433 1729 1177 2409 +1627 5 2 1 1 1433 1729 1177 2409 1434 1730 1178 2410 +1628 5 2 1 1 1434 1730 1178 2410 1435 1731 1179 2411 +1629 5 2 1 1 1435 1731 1179 2411 1436 1732 1180 2412 +1630 5 2 1 1 1436 1732 1180 2412 842 916 778 1086 +1631 5 2 1 1 444 291 358 147 2361 1749 2017 1173 +1632 5 2 1 1 2361 1749 2017 1173 2362 1750 2018 1174 +1633 5 2 1 1 2362 1750 2018 1174 2363 1751 2019 1175 +1634 5 2 1 1 2363 1751 2019 1175 2364 1752 2020 1176 +1635 5 2 1 1 2364 1752 2020 1176 1074 921 988 777 +1636 5 2 1 1 444 214 294 291 2361 1441 1761 1749 +1637 5 2 1 1 2361 1441 1761 1749 2362 1442 1762 1750 +1638 5 2 1 1 2362 1442 1762 1750 2363 1443 1763 1751 +1639 5 2 1 1 2363 1443 1763 1751 2364 1444 1764 1752 +1640 5 2 1 1 2364 1444 1764 1752 1074 844 924 921 +1641 5 2 1 1 384 187 406 299 2121 1333 2209 1781 +1642 5 2 1 1 2121 1333 2209 1781 2122 1334 2210 1782 +1643 5 2 1 1 2122 1334 2210 1782 2123 1335 2211 1783 +1644 5 2 1 1 2123 1335 2211 1783 2124 1336 2212 1784 +1645 5 2 1 1 2124 1336 2212 1784 1014 817 1036 929 +1646 5 2 1 1 419 290 378 210 2261 1745 2097 1425 +1647 5 2 1 1 2261 1745 2097 1425 2262 1746 2098 1426 +1648 5 2 1 1 2262 1746 2098 1426 2263 1747 2099 1427 +1649 5 2 1 1 2263 1747 2099 1427 2264 1748 2100 1428 +1650 5 2 1 1 2264 1748 2100 1428 1049 920 1008 840 +1651 5 2 1 1 499 288 388 232 2581 1737 2137 1513 +1652 5 2 1 1 2581 1737 2137 1513 2582 1738 2138 1514 +1653 5 2 1 1 2582 1738 2138 1514 2583 1739 2139 1515 +1654 5 2 1 1 2583 1739 2139 1515 2584 1740 2140 1516 +1655 5 2 1 1 2584 1740 2140 1516 1129 918 1018 862 +1656 5 2 1 1 501 234 390 289 2589 1521 2145 1741 +1657 5 2 1 1 2589 1521 2145 1741 2590 1522 2146 1742 +1658 5 2 1 1 2590 1522 2146 1742 2591 1523 2147 1743 +1659 5 2 1 1 2591 1523 2147 1743 2592 1524 2148 1744 +1660 5 2 1 1 2592 1524 2148 1744 1131 864 1020 919 +1661 5 2 1 1 500 233 389 290 2585 1517 2141 1745 +1662 5 2 1 1 2585 1517 2141 1745 2586 1518 2142 1746 +1663 5 2 1 1 2586 1518 2142 1746 2587 1519 2143 1747 +1664 5 2 1 1 2587 1519 2143 1747 2588 1520 2144 1748 +1665 5 2 1 1 2588 1520 2144 1748 1130 863 1019 920 +1666 5 2 1 1 456 288 420 212 2409 1737 2265 1433 +1667 5 2 1 1 2409 1737 2265 1433 2410 1738 2266 1434 +1668 5 2 1 1 2410 1738 2266 1434 2411 1739 2267 1435 +1669 5 2 1 1 2411 1739 2267 1435 2412 1740 2268 1436 +1670 5 2 1 1 2412 1740 2268 1436 1086 918 1050 842 +1671 5 2 1 1 456 148 388 288 2409 1177 2137 1737 +1672 5 2 1 1 2409 1177 2137 1737 2410 1178 2138 1738 +1673 5 2 1 1 2410 1178 2138 1738 2411 1179 2139 1739 +1674 5 2 1 1 2411 1179 2139 1739 2412 1180 2140 1740 +1675 5 2 1 1 2412 1180 2140 1740 1086 778 1018 918 +1676 5 2 1 1 173 305 215 446 1277 1805 1445 2369 +1677 5 2 1 1 1277 1805 1445 2369 1278 1806 1446 2370 +1678 5 2 1 1 1278 1806 1446 2370 1279 1807 1447 2371 +1679 5 2 1 1 1279 1807 1447 2371 1280 1808 1448 2372 +1680 5 2 1 1 1280 1808 1448 2372 803 935 845 1076 +1681 5 2 1 1 341 447 450 161 1949 2373 2385 1229 +1682 5 2 1 1 1949 2373 2385 1229 1950 2374 2386 1230 +1683 5 2 1 1 1950 2374 2386 1230 1951 2375 2387 1231 +1684 5 2 1 1 1951 2375 2387 1231 1952 2376 2388 1232 +1685 5 2 1 1 1952 2376 2388 1232 971 1077 1080 791 +1686 5 2 1 1 344 163 452 448 1961 1237 2393 2377 +1687 5 2 1 1 1961 1237 2393 2377 1962 1238 2394 2378 +1688 5 2 1 1 1962 1238 2394 2378 1963 1239 2395 2379 +1689 5 2 1 1 1963 1239 2395 2379 1964 1240 2396 2380 +1690 5 2 1 1 1964 1240 2396 2380 974 793 1082 1078 +1691 5 2 1 1 485 313 276 215 2525 1837 1689 1445 +1692 5 2 1 1 2525 1837 1689 1445 2526 1838 1690 1446 +1693 5 2 1 1 2526 1838 1690 1446 2527 1839 1691 1447 +1694 5 2 1 1 2527 1839 1691 1447 2528 1840 1692 1448 +1695 5 2 1 1 2528 1840 1692 1448 1115 943 906 845 +1696 5 2 1 1 408 185 291 294 2217 1325 1749 1761 +1697 5 2 1 1 2217 1325 1749 1761 2218 1326 1750 1762 +1698 5 2 1 1 2218 1326 1750 1762 2219 1327 1751 1763 +1699 5 2 1 1 2219 1327 1751 1763 2220 1328 1752 1764 +1700 5 2 1 1 2220 1328 1752 1764 1038 815 921 924 +1701 5 2 1 1 243 464 47 422 1557 2441 687 2273 +1702 5 2 1 1 1557 2441 687 2273 1558 2442 688 2274 +1703 5 2 1 1 1558 2442 688 2274 1559 2443 689 2275 +1704 5 2 1 1 1559 2443 689 2275 1560 2444 690 2276 +1705 5 2 1 1 1560 2444 690 2276 873 1094 107 1052 +1706 5 2 1 1 242 465 32 421 1553 2445 627 2269 +1707 5 2 1 1 1553 2445 627 2269 1554 2446 628 2270 +1708 5 2 1 1 1554 2446 628 2270 1555 2447 629 2271 +1709 5 2 1 1 1555 2447 629 2271 1556 2448 630 2272 +1710 5 2 1 1 1556 2448 630 2272 872 1095 92 1051 +1711 5 2 1 1 424 240 474 462 2281 1545 2481 2433 +1712 5 2 1 1 2281 1545 2481 2433 2282 1546 2482 2434 +1713 5 2 1 1 2282 1546 2482 2434 2283 1547 2483 2435 +1714 5 2 1 1 2283 1547 2483 2435 2284 1548 2484 2436 +1715 5 2 1 1 2284 1548 2484 2436 1054 870 1104 1092 +1716 5 2 1 1 241 463 17 423 1549 2437 567 2277 +1717 5 2 1 1 1549 2437 567 2277 1550 2438 568 2278 +1718 5 2 1 1 1550 2438 568 2278 1551 2439 569 2279 +1719 5 2 1 1 1551 2439 569 2279 1552 2440 570 2280 +1720 5 2 1 1 1552 2440 570 2280 871 1093 77 1053 +1721 5 2 1 1 293 442 292 157 1757 2353 1753 1213 +1722 5 2 1 1 1757 2353 1753 1213 1758 2354 1754 1214 +1723 5 2 1 1 1758 2354 1754 1214 1759 2355 1755 1215 +1724 5 2 1 1 1759 2355 1755 1215 1760 2356 1756 1216 +1725 5 2 1 1 1760 2356 1756 1216 923 1072 922 787 +1726 5 2 1 1 408 301 385 185 2217 1789 2125 1325 +1727 5 2 1 1 2217 1789 2125 1325 2218 1790 2126 1326 +1728 5 2 1 1 2218 1790 2126 1326 2219 1791 2127 1327 +1729 5 2 1 1 2219 1791 2127 1327 2220 1792 2128 1328 +1730 5 2 1 1 2220 1792 2128 1328 1038 931 1015 815 +1731 5 2 1 1 481 297 490 226 2509 1773 2545 1489 +1732 5 2 1 1 2509 1773 2545 1489 2510 1774 2546 1490 +1733 5 2 1 1 2510 1774 2546 1490 2511 1775 2547 1491 +1734 5 2 1 1 2511 1775 2547 1491 2512 1776 2548 1492 +1735 5 2 1 1 2512 1776 2548 1492 1111 927 1120 856 +1736 5 2 1 1 514 285 208 358 2641 1725 1417 2017 +1737 5 2 1 1 2641 1725 1417 2017 2642 1726 1418 2018 +1738 5 2 1 1 2642 1726 1418 2018 2643 1727 1419 2019 +1739 5 2 1 1 2643 1727 1419 2019 2644 1728 1420 2020 +1740 5 2 1 1 2644 1728 1420 2020 1144 915 838 988 +1741 5 2 1 1 427 165 449 346 2293 1245 2381 1969 +1742 5 2 1 1 2293 1245 2381 1969 2294 1246 2382 1970 +1743 5 2 1 1 2294 1246 2382 1970 2295 1247 2383 1971 +1744 5 2 1 1 2295 1247 2383 1971 2296 1248 2384 1972 +1745 5 2 1 1 2296 1248 2384 1972 1057 795 1079 976 +1746 5 2 1 1 367 238 457 320 2053 1537 2413 1865 +1747 5 2 1 1 2053 1537 2413 1865 2054 1538 2414 1866 +1748 5 2 1 1 2054 1538 2414 1866 2055 1539 2415 1867 +1749 5 2 1 1 2055 1539 2415 1867 2056 1540 2416 1868 +1750 5 2 1 1 2056 1540 2416 1868 997 868 1087 950 +1751 5 2 1 1 293 182 325 442 1757 1313 1885 2353 +1752 5 2 1 1 1757 1313 1885 2353 1758 1314 1886 2354 +1753 5 2 1 1 1758 1314 1886 2354 1759 1315 1887 2355 +1754 5 2 1 1 1759 1315 1887 2355 1760 1316 1888 2356 +1755 5 2 1 1 1760 1316 1888 2356 923 812 955 1072 +1756 5 2 1 1 458 306 363 154 2417 1809 2037 1201 +1757 5 2 1 1 2417 1809 2037 1201 2418 1810 2038 1202 +1758 5 2 1 1 2418 1810 2038 1202 2419 1811 2039 1203 +1759 5 2 1 1 2419 1811 2039 1203 2420 1812 2040 1204 +1760 5 2 1 1 2420 1812 2040 1204 1088 936 993 784 +1761 5 2 1 1 155 307 222 459 1205 1813 1473 2421 +1762 5 2 1 1 1205 1813 1473 2421 1206 1814 1474 2422 +1763 5 2 1 1 1206 1814 1474 2422 1207 1815 1475 2423 +1764 5 2 1 1 1207 1815 1475 2423 1208 1816 1476 2424 +1765 5 2 1 1 1208 1816 1476 2424 785 937 852 1089 +1766 5 2 1 1 395 319 454 216 2165 1861 2401 1449 +1767 5 2 1 1 2165 1861 2401 1449 2166 1862 2402 1450 +1768 5 2 1 1 2166 1862 2402 1450 2167 1863 2403 1451 +1769 5 2 1 1 2167 1863 2403 1451 2168 1864 2404 1452 +1770 5 2 1 1 2168 1864 2404 1452 1025 949 1084 846 +1771 5 2 1 1 467 294 453 156 2453 1761 2397 1209 +1772 5 2 1 1 2453 1761 2397 1209 2454 1762 2398 1210 +1773 5 2 1 1 2454 1762 2398 1210 2455 1763 2399 1211 +1774 5 2 1 1 2455 1763 2399 1211 2456 1764 2400 1212 +1775 5 2 1 1 2456 1764 2400 1212 1097 924 1083 786 +1776 5 2 1 1 436 298 460 164 2329 1777 2425 1241 +1777 5 2 1 1 2329 1777 2425 1241 2330 1778 2426 1242 +1778 5 2 1 1 2330 1778 2426 1242 2331 1779 2427 1243 +1779 5 2 1 1 2331 1779 2427 1243 2332 1780 2428 1244 +1780 5 2 1 1 2332 1780 2428 1244 1066 928 1090 794 +1781 5 2 1 1 437 297 481 162 2333 1773 2509 1233 +1782 5 2 1 1 2333 1773 2509 1233 2334 1774 2510 1234 +1783 5 2 1 1 2334 1774 2510 1234 2335 1775 2511 1235 +1784 5 2 1 1 2335 1775 2511 1235 2336 1776 2512 1236 +1785 5 2 1 1 2336 1776 2512 1236 1067 927 1111 792 +1786 5 2 1 1 437 201 440 297 2333 1389 2345 1773 +1787 5 2 1 1 2333 1389 2345 1773 2334 1390 2346 1774 +1788 5 2 1 1 2334 1390 2346 1774 2335 1391 2347 1775 +1789 5 2 1 1 2335 1391 2347 1775 2336 1392 2348 1776 +1790 5 2 1 1 2336 1392 2348 1776 1067 831 1070 927 +1791 5 2 1 1 436 203 441 298 2329 1397 2349 1777 +1792 5 2 1 1 2329 1397 2349 1777 2330 1398 2350 1778 +1793 5 2 1 1 2330 1398 2350 1778 2331 1399 2351 1779 +1794 5 2 1 1 2331 1399 2351 1779 2332 1400 2352 1780 +1795 5 2 1 1 2332 1400 2352 1780 1066 833 1071 928 +1796 5 2 1 1 209 392 339 308 1421 2153 1941 1817 +1797 5 2 1 1 1421 2153 1941 1817 1422 2154 1942 1818 +1798 5 2 1 1 1422 2154 1942 1818 1423 2155 1943 1819 +1799 5 2 1 1 1423 2155 1943 1819 1424 2156 1944 1820 +1800 5 2 1 1 1424 2156 1944 1820 839 1022 969 938 +1801 5 2 1 1 394 211 322 311 2161 1429 1873 1829 +1802 5 2 1 1 2161 1429 1873 1829 2162 1430 1874 1830 +1803 5 2 1 1 2162 1430 1874 1830 2163 1431 1875 1831 +1804 5 2 1 1 2163 1431 1875 1831 2164 1432 1876 1832 +1805 5 2 1 1 2164 1432 1876 1832 1024 841 952 941 +1806 5 2 1 1 438 199 434 295 2337 1381 2321 1765 +1807 5 2 1 1 2337 1381 2321 1765 2338 1382 2322 1766 +1808 5 2 1 1 2338 1382 2322 1766 2339 1383 2323 1767 +1809 5 2 1 1 2339 1383 2323 1767 2340 1384 2324 1768 +1810 5 2 1 1 2340 1384 2324 1768 1068 829 1064 925 +1811 5 2 1 1 439 200 435 296 2341 1385 2325 1769 +1812 5 2 1 1 2341 1385 2325 1769 2342 1386 2326 1770 +1813 5 2 1 1 2342 1386 2326 1770 2343 1387 2327 1771 +1814 5 2 1 1 2343 1387 2327 1771 2344 1388 2328 1772 +1815 5 2 1 1 2344 1388 2328 1772 1069 830 1065 926 +1816 5 2 1 1 295 174 515 438 1765 1281 2645 2337 +1817 5 2 1 1 1765 1281 2645 2337 1766 1282 2646 2338 +1818 5 2 1 1 1766 1282 2646 2338 1767 1283 2647 2339 +1819 5 2 1 1 1767 1283 2647 2339 1768 1284 2648 2340 +1820 5 2 1 1 1768 1284 2648 2340 925 804 1145 1068 +1821 5 2 1 1 296 175 517 439 1769 1285 2653 2341 +1822 5 2 1 1 1769 1285 2653 2341 1770 1286 2654 2342 +1823 5 2 1 1 1770 1286 2654 2342 1771 1287 2655 2343 +1824 5 2 1 1 1771 1287 2655 2343 1772 1288 2656 2344 +1825 5 2 1 1 1772 1288 2656 2344 926 805 1147 1069 +1826 5 2 1 1 489 301 408 223 2541 1789 2217 1477 +1827 5 2 1 1 2541 1789 2217 1477 2542 1790 2218 1478 +1828 5 2 1 1 2542 1790 2218 1478 2543 1791 2219 1479 +1829 5 2 1 1 2543 1791 2219 1479 2544 1792 2220 1480 +1830 5 2 1 1 2544 1792 2220 1480 1119 931 1038 853 +1831 5 2 1 1 221 488 153 302 1469 2537 1197 1793 +1832 5 2 1 1 1469 2537 1197 1793 1470 2538 1198 1794 +1833 5 2 1 1 1470 2538 1198 1794 1471 2539 1199 1795 +1834 5 2 1 1 1471 2539 1199 1795 1472 2540 1200 1796 +1835 5 2 1 1 1472 2540 1200 1796 851 1118 783 932 +1836 5 2 1 1 487 222 307 303 2533 1473 1813 1797 +1837 5 2 1 1 2533 1473 1813 1797 2534 1474 1814 1798 +1838 5 2 1 1 2534 1474 1814 1798 2535 1475 1815 1799 +1839 5 2 1 1 2535 1475 1815 1799 2536 1476 1816 1800 +1840 5 2 1 1 2536 1476 1816 1800 1117 852 937 933 +1841 5 2 1 1 419 310 476 168 2261 1825 2489 1257 +1842 5 2 1 1 2261 1825 2489 1257 2262 1826 2490 1258 +1843 5 2 1 1 2262 1826 2490 1258 2263 1827 2491 1259 +1844 5 2 1 1 2263 1827 2491 1259 2264 1828 2492 1260 +1845 5 2 1 1 2264 1828 2492 1260 1049 940 1106 798 +1846 5 2 1 1 418 208 391 309 2257 1417 2149 1821 +1847 5 2 1 1 2257 1417 2149 1821 2258 1418 2150 1822 +1848 5 2 1 1 2258 1418 2150 1822 2259 1419 2151 1823 +1849 5 2 1 1 2259 1419 2151 1823 2260 1420 2152 1824 +1850 5 2 1 1 2260 1420 2152 1824 1048 838 1021 939 +1851 5 2 1 1 419 210 401 310 2261 1425 2189 1825 +1852 5 2 1 1 2261 1425 2189 1825 2262 1426 2190 1826 +1853 5 2 1 1 2262 1426 2190 1826 2263 1427 2191 1827 +1854 5 2 1 1 2263 1427 2191 1827 2264 1428 2192 1828 +1855 5 2 1 1 2264 1428 2192 1828 1049 840 1031 940 +1856 5 2 1 1 420 312 393 212 2265 1833 2157 1433 +1857 5 2 1 1 2265 1833 2157 1433 2266 1834 2158 1434 +1858 5 2 1 1 2266 1834 2158 1434 2267 1835 2159 1435 +1859 5 2 1 1 2267 1835 2159 1435 2268 1836 2160 1436 +1860 5 2 1 1 2268 1836 2160 1436 1050 942 1023 842 +1861 5 2 1 1 496 299 530 150 2569 1781 2705 1185 +1862 5 2 1 1 2569 1781 2705 1185 2570 1782 2706 1186 +1863 5 2 1 1 2570 1782 2706 1186 2571 1783 2707 1187 +1864 5 2 1 1 2571 1783 2707 1187 2572 1784 2708 1188 +1865 5 2 1 1 2572 1784 2708 1188 1126 929 1160 780 +1866 5 2 1 1 496 220 384 299 2569 1465 2121 1781 +1867 5 2 1 1 2569 1465 2121 1781 2570 1466 2122 1782 +1868 5 2 1 1 2570 1466 2122 1782 2571 1467 2123 1783 +1869 5 2 1 1 2571 1467 2123 1783 2572 1468 2124 1784 +1870 5 2 1 1 2572 1468 2124 1784 1126 850 1014 929 +1871 5 2 1 1 529 304 338 155 2701 1801 1937 1205 +1872 5 2 1 1 2701 1801 1937 1205 2702 1802 1938 1206 +1873 5 2 1 1 2702 1802 1938 1206 2703 1803 1939 1207 +1874 5 2 1 1 2703 1803 1939 1207 2704 1804 1940 1208 +1875 5 2 1 1 2704 1804 1940 1208 1159 934 968 785 +1876 5 2 1 1 529 197 324 304 2701 1373 1881 1801 +1877 5 2 1 1 2701 1373 1881 1801 2702 1374 1882 1802 +1878 5 2 1 1 2702 1374 1882 1802 2703 1375 1883 1803 +1879 5 2 1 1 2703 1375 1883 1803 2704 1376 1884 1804 +1880 5 2 1 1 2704 1376 1884 1804 1159 827 954 934 +1881 5 2 1 1 534 152 487 303 2721 1193 2533 1797 +1882 5 2 1 1 2721 1193 2533 1797 2722 1194 2534 1798 +1883 5 2 1 1 2722 1194 2534 1798 2723 1195 2535 1799 +1884 5 2 1 1 2723 1195 2535 1799 2724 1196 2536 1800 +1885 5 2 1 1 2724 1196 2536 1800 1164 782 1117 933 +1886 5 2 1 1 154 363 188 324 1201 2037 1337 1881 +1887 5 2 1 1 1201 2037 1337 1881 1202 2038 1338 1882 +1888 5 2 1 1 1202 2038 1338 1882 1203 2039 1339 1883 +1889 5 2 1 1 1203 2039 1339 1883 1204 2040 1340 1884 +1890 5 2 1 1 1204 2040 1340 1884 784 993 818 954 +1891 5 2 1 1 460 300 393 164 2425 1785 2157 1241 +1892 5 2 1 1 2425 1785 2157 1241 2426 1786 2158 1242 +1893 5 2 1 1 2426 1786 2158 1242 2427 1787 2159 1243 +1894 5 2 1 1 2427 1787 2159 1243 2428 1788 2160 1244 +1895 5 2 1 1 2428 1788 2160 1244 1090 930 1023 794 +1896 5 2 1 1 477 301 489 151 2493 1789 2541 1189 +1897 5 2 1 1 2493 1789 2541 1189 2494 1790 2542 1190 +1898 5 2 1 1 2494 1790 2542 1190 2495 1791 2543 1191 +1899 5 2 1 1 2495 1791 2543 1191 2496 1792 2544 1192 +1900 5 2 1 1 2496 1792 2544 1192 1107 931 1119 781 +1901 5 2 1 1 496 305 368 220 2569 1805 2057 1465 +1902 5 2 1 1 2569 1805 2057 1465 2570 1806 2058 1466 +1903 5 2 1 1 2570 1806 2058 1466 2571 1807 2059 1467 +1904 5 2 1 1 2571 1807 2059 1467 2572 1808 2060 1468 +1905 5 2 1 1 2572 1808 2060 1468 1126 935 998 850 +1906 5 2 1 1 12 409 260 13 547 2221 1625 551 +1907 5 2 1 1 547 2221 1625 551 548 2222 1626 552 +1908 5 2 1 1 548 2222 1626 552 549 2223 1627 553 +1909 5 2 1 1 549 2223 1627 553 550 2224 1628 554 +1910 5 2 1 1 550 2224 1628 554 72 1039 890 73 +1911 5 2 1 1 42 412 257 43 667 2233 1613 671 +1912 5 2 1 1 667 2233 1613 671 668 2234 1614 672 +1913 5 2 1 1 668 2234 1614 672 669 2235 1615 673 +1914 5 2 1 1 669 2235 1615 673 670 2236 1616 674 +1915 5 2 1 1 670 2236 1616 674 102 1042 887 103 +1916 5 2 1 1 57 410 259 58 727 2225 1621 731 +1917 5 2 1 1 727 2225 1621 731 728 2226 1622 732 +1918 5 2 1 1 728 2226 1622 732 729 2227 1623 733 +1919 5 2 1 1 729 2227 1623 733 730 2228 1624 734 +1920 5 2 1 1 730 2228 1624 734 117 1040 889 118 +1921 5 2 1 1 27 411 258 28 607 2229 1617 611 +1922 5 2 1 1 607 2229 1617 611 608 2230 1618 612 +1923 5 2 1 1 608 2230 1618 612 609 2231 1619 613 +1924 5 2 1 1 609 2231 1619 613 610 2232 1620 614 +1925 5 2 1 1 610 2232 1620 614 87 1041 888 88 +1926 5 2 1 1 66 65 256 413 763 759 1609 2237 +1927 5 2 1 1 763 759 1609 2237 764 760 1610 2238 +1928 5 2 1 1 764 760 1610 2238 765 761 1611 2239 +1929 5 2 1 1 765 761 1611 2239 766 762 1612 2240 +1930 5 2 1 1 766 762 1612 2240 126 125 886 1043 +1931 5 2 1 1 21 20 255 414 583 579 1605 2241 +1932 5 2 1 1 583 579 1605 2241 584 580 1606 2242 +1933 5 2 1 1 584 580 1606 2242 585 581 1607 2243 +1934 5 2 1 1 585 581 1607 2243 586 582 1608 2244 +1935 5 2 1 1 586 582 1608 2244 81 80 885 1044 +1936 5 2 1 1 36 35 253 416 643 639 1597 2249 +1937 5 2 1 1 643 639 1597 2249 644 640 1598 2250 +1938 5 2 1 1 644 640 1598 2250 645 641 1599 2251 +1939 5 2 1 1 645 641 1599 2251 646 642 1600 2252 +1940 5 2 1 1 646 642 1600 2252 96 95 883 1046 +1941 5 2 1 1 51 50 254 415 703 699 1601 2245 +1942 5 2 1 1 703 699 1601 2245 704 700 1602 2246 +1943 5 2 1 1 704 700 1602 2246 705 701 1603 2247 +1944 5 2 1 1 705 701 1603 2247 706 702 1604 2248 +1945 5 2 1 1 706 702 1604 2248 111 110 884 1045 +1946 5 2 1 1 160 342 191 401 1225 1953 1349 2189 +1947 5 2 1 1 1225 1953 1349 2189 1226 1954 1350 2190 +1948 5 2 1 1 1226 1954 1350 2190 1227 1955 1351 2191 +1949 5 2 1 1 1227 1955 1351 2191 1228 1956 1352 2192 +1950 5 2 1 1 1228 1956 1352 2192 790 972 821 1031 +1951 5 2 1 1 431 311 322 240 2309 1829 1873 1545 +1952 5 2 1 1 2309 1829 1873 1545 2310 1830 1874 1546 +1953 5 2 1 1 2310 1830 1874 1546 2311 1831 1875 1547 +1954 5 2 1 1 2311 1831 1875 1547 2312 1832 1876 1548 +1955 5 2 1 1 2312 1832 1876 1548 1061 941 952 870 +1956 5 2 1 1 432 312 420 167 2313 1833 2265 1253 +1957 5 2 1 1 2313 1833 2265 1253 2314 1834 2266 1254 +1958 5 2 1 1 2314 1834 2266 1254 2315 1835 2267 1255 +1959 5 2 1 1 2315 1835 2267 1255 2316 1836 2268 1256 +1960 5 2 1 1 2316 1836 2268 1256 1062 942 1050 797 +1961 5 2 1 1 388 504 398 205 2137 2601 2177 1405 +1962 5 2 1 1 2137 2601 2177 1405 2138 2602 2178 1406 +1963 5 2 1 1 2138 2602 2178 1406 2139 2603 2179 1407 +1964 5 2 1 1 2139 2603 2179 1407 2140 2604 2180 1408 +1965 5 2 1 1 2140 2604 2180 1408 1018 1134 1028 835 +1966 5 2 1 1 505 390 452 207 2605 2145 2393 1413 +1967 5 2 1 1 2605 2145 2393 1413 2606 2146 2394 1414 +1968 5 2 1 1 2606 2146 2394 1414 2607 2147 2395 1415 +1969 5 2 1 1 2607 2147 2395 1415 2608 2148 2396 1416 +1970 5 2 1 1 2608 2148 2396 1416 1135 1020 1082 837 +1971 5 2 1 1 333 268 438 515 1917 1657 2337 2645 +1972 5 2 1 1 1917 1657 2337 2645 1918 1658 2338 2646 +1973 5 2 1 1 1918 1658 2338 2646 1919 1659 2339 2647 +1974 5 2 1 1 1919 1659 2339 2647 1920 1660 2340 2648 +1975 5 2 1 1 1920 1660 2340 2648 963 898 1068 1145 +1976 5 2 1 1 331 267 439 517 1909 1653 2341 2653 +1977 5 2 1 1 1909 1653 2341 2653 1910 1654 2342 2654 +1978 5 2 1 1 1910 1654 2342 2654 1911 1655 2343 2655 +1979 5 2 1 1 1911 1655 2343 2655 1912 1656 2344 2656 +1980 5 2 1 1 1912 1656 2344 2656 961 897 1069 1147 +1981 5 2 1 1 516 334 38 270 2649 1921 651 1665 +1982 5 2 1 1 2649 1921 651 1665 2650 1922 652 1666 +1983 5 2 1 1 2650 1922 652 1666 2651 1923 653 1667 +1984 5 2 1 1 2651 1923 653 1667 2652 1924 654 1668 +1985 5 2 1 1 2652 1924 654 1668 1146 964 98 900 +1986 5 2 1 1 241 468 166 475 1549 2457 1249 2485 +1987 5 2 1 1 1549 2457 1249 2485 1550 2458 1250 2486 +1988 5 2 1 1 1550 2458 1250 2486 1551 2459 1251 2487 +1989 5 2 1 1 1551 2459 1251 2487 1552 2460 1252 2488 +1990 5 2 1 1 1552 2460 1252 2488 871 1098 796 1105 +1991 5 2 1 1 242 469 168 476 1553 2461 1257 2489 +1992 5 2 1 1 1553 2461 1257 2489 1554 2462 1258 2490 +1993 5 2 1 1 1554 2462 1258 2490 1555 2463 1259 2491 +1994 5 2 1 1 1555 2463 1259 2491 1556 2464 1260 2492 +1995 5 2 1 1 1556 2464 1260 2492 872 1099 798 1106 +1996 5 2 1 1 518 321 248 154 2657 1869 1577 1201 +1997 5 2 1 1 2657 1869 1577 1201 2658 1870 1578 1202 +1998 5 2 1 1 2658 1870 1578 1202 2659 1871 1579 1203 +1999 5 2 1 1 2659 1871 1579 1203 2660 1872 1580 1204 +2000 5 2 1 1 2660 1872 1580 1204 1148 951 878 784 +2001 5 2 1 1 273 468 241 423 1677 2457 1549 2277 +2002 5 2 1 1 1677 2457 1549 2277 1678 2458 1550 2278 +2003 5 2 1 1 1678 2458 1550 2278 1679 2459 1551 2279 +2004 5 2 1 1 1679 2459 1551 2279 1680 2460 1552 2280 +2005 5 2 1 1 1680 2460 1552 2280 903 1098 871 1053 +2006 5 2 1 1 271 469 242 421 1669 2461 1553 2269 +2007 5 2 1 1 1669 2461 1553 2269 1670 2462 1554 2270 +2008 5 2 1 1 1670 2462 1554 2270 1671 2463 1555 2271 +2009 5 2 1 1 1671 2463 1555 2271 1672 2464 1556 2272 +2010 5 2 1 1 1672 2464 1556 2272 901 1099 872 1051 +2011 5 2 1 1 371 414 255 199 2069 2241 1605 1381 +2012 5 2 1 1 2069 2241 1605 1381 2070 2242 1606 1382 +2013 5 2 1 1 2070 2242 1606 1382 2071 2243 1607 1383 +2014 5 2 1 1 2071 2243 1607 1383 2072 2244 1608 1384 +2015 5 2 1 1 2072 2244 1608 1384 1001 1044 885 829 +2016 5 2 1 1 373 416 521 430 2077 2249 2669 2305 +2017 5 2 1 1 2077 2249 2669 2305 2078 2250 2670 2306 +2018 5 2 1 1 2078 2250 2670 2306 2079 2251 2671 2307 +2019 5 2 1 1 2079 2251 2671 2307 2080 2252 2672 2308 +2020 5 2 1 1 2080 2252 2672 2308 1003 1046 1151 1060 +2021 5 2 1 1 372 415 522 426 2073 2245 2673 2289 +2022 5 2 1 1 2073 2245 2673 2289 2074 2246 2674 2290 +2023 5 2 1 1 2074 2246 2674 2290 2075 2247 2675 2291 +2024 5 2 1 1 2075 2247 2675 2291 2076 2248 2676 2292 +2025 5 2 1 1 2076 2248 2676 2292 1002 1045 1152 1056 +2026 5 2 1 1 370 413 256 200 2065 2237 1609 1385 +2027 5 2 1 1 2065 2237 1609 1385 2066 2238 1610 1386 +2028 5 2 1 1 2066 2238 1610 1386 2067 2239 1611 1387 +2029 5 2 1 1 2067 2239 1611 1387 2068 2240 1612 1388 +2030 5 2 1 1 2068 2240 1612 1388 1000 1043 886 830 +2031 5 2 1 1 375 201 259 410 2085 1389 1621 2225 +2032 5 2 1 1 2085 1389 1621 2225 2086 1390 1622 2226 +2033 5 2 1 1 2086 1390 1622 2226 2087 1391 1623 2227 +2034 5 2 1 1 2087 1391 1623 2227 2088 1392 1624 2228 +2035 5 2 1 1 2088 1392 1624 2228 1005 831 889 1040 +2036 5 2 1 1 377 203 257 412 2093 1397 1613 2233 +2037 5 2 1 1 2093 1397 1613 2233 2094 1398 1614 2234 +2038 5 2 1 1 2094 1398 1614 2234 2095 1399 1615 2235 +2039 5 2 1 1 2095 1399 1615 2235 2096 1400 1616 2236 +2040 5 2 1 1 2096 1400 1616 2236 1007 833 887 1042 +2041 5 2 1 1 376 204 523 411 2089 1401 2677 2229 +2042 5 2 1 1 2089 1401 2677 2229 2090 1402 2678 2230 +2043 5 2 1 1 2090 1402 2678 2230 2091 1403 2679 2231 +2044 5 2 1 1 2091 1403 2679 2231 2092 1404 2680 2232 +2045 5 2 1 1 2092 1404 2680 2232 1006 834 1153 1041 +2046 5 2 1 1 374 202 524 409 2081 1393 2681 2221 +2047 5 2 1 1 2081 1393 2681 2221 2082 1394 2682 2222 +2048 5 2 1 1 2082 1394 2682 2222 2083 1395 2683 2223 +2049 5 2 1 1 2083 1395 2683 2223 2084 1396 2684 2224 +2050 5 2 1 1 2084 1396 2684 2224 1004 832 1154 1039 +2051 5 2 1 1 482 316 278 217 2513 1849 1697 1453 +2052 5 2 1 1 2513 1849 1697 1453 2514 1850 1698 1454 +2053 5 2 1 1 2514 1850 1698 1454 2515 1851 1699 1455 +2054 5 2 1 1 2515 1851 1699 1455 2516 1852 1700 1456 +2055 5 2 1 1 2516 1852 1700 1456 1112 946 908 847 +2056 5 2 1 1 219 318 151 484 1461 1857 1189 2521 +2057 5 2 1 1 1461 1857 1189 2521 1462 1858 1190 2522 +2058 5 2 1 1 1462 1858 1190 2522 1463 1859 1191 2523 +2059 5 2 1 1 1463 1859 1191 2523 1464 1860 1192 2524 +2060 5 2 1 1 1464 1860 1192 2524 849 948 781 1114 +2061 5 2 1 1 483 218 279 317 2517 1457 1701 1853 +2062 5 2 1 1 2517 1457 1701 1853 2518 1458 1702 1854 +2063 5 2 1 1 2518 1458 1702 1854 2519 1459 1703 1855 +2064 5 2 1 1 2519 1459 1703 1855 2520 1460 1704 1856 +2065 5 2 1 1 2520 1460 1704 1856 1113 848 909 947 +2066 5 2 1 1 397 319 395 169 2173 1861 2165 1261 +2067 5 2 1 1 2173 1861 2165 1261 2174 1862 2166 1262 +2068 5 2 1 1 2174 1862 2166 1262 2175 1863 2167 1263 +2069 5 2 1 1 2175 1863 2167 1263 2176 1864 2168 1264 +2070 5 2 1 1 2176 1864 2168 1264 1027 949 1025 799 +2071 5 2 1 1 63 62 424 462 751 747 2281 2433 +2072 5 2 1 1 751 747 2281 2433 752 748 2282 2434 +2073 5 2 1 1 752 748 2282 2434 753 749 2283 2435 +2074 5 2 1 1 753 749 2283 2435 754 750 2284 2436 +2075 5 2 1 1 754 750 2284 2436 123 122 1054 1092 +2076 5 2 1 1 206 323 149 389 1409 1877 1181 2141 +2077 5 2 1 1 1409 1877 1181 2141 1410 1878 1182 2142 +2078 5 2 1 1 1410 1878 1182 2142 1411 1879 1183 2143 +2079 5 2 1 1 1411 1879 1183 2143 1412 1880 1184 2144 +2080 5 2 1 1 1412 1880 1184 2144 836 953 779 1019 +2081 5 2 1 1 19 508 255 20 575 2617 1605 579 +2082 5 2 1 1 575 2617 1605 579 576 2618 1606 580 +2083 5 2 1 1 576 2618 1606 580 577 2619 1607 581 +2084 5 2 1 1 577 2619 1607 581 578 2620 1608 582 +2085 5 2 1 1 578 2620 1608 582 79 1138 885 80 +2086 5 2 1 1 34 506 253 35 635 2609 1597 639 +2087 5 2 1 1 635 2609 1597 639 636 2610 1598 640 +2088 5 2 1 1 636 2610 1598 640 637 2611 1599 641 +2089 5 2 1 1 637 2611 1599 641 638 2612 1600 642 +2090 5 2 1 1 638 2612 1600 642 94 1136 883 95 +2091 5 2 1 1 64 509 256 65 755 2621 1609 759 +2092 5 2 1 1 755 2621 1609 759 756 2622 1610 760 +2093 5 2 1 1 756 2622 1610 760 757 2623 1611 761 +2094 5 2 1 1 757 2623 1611 761 758 2624 1612 762 +2095 5 2 1 1 758 2624 1612 762 124 1139 886 125 +2096 5 2 1 1 49 507 254 50 695 2613 1601 699 +2097 5 2 1 1 695 2613 1601 699 696 2614 1602 700 +2098 5 2 1 1 696 2614 1602 700 697 2615 1603 701 +2099 5 2 1 1 697 2615 1603 701 698 2616 1604 702 +2100 5 2 1 1 698 2616 1604 702 109 1137 884 110 +2101 5 2 1 1 44 43 257 510 675 671 1613 2625 +2102 5 2 1 1 675 671 1613 2625 676 672 1614 2626 +2103 5 2 1 1 676 672 1614 2626 677 673 1615 2627 +2104 5 2 1 1 677 673 1615 2627 678 674 1616 2628 +2105 5 2 1 1 678 674 1616 2628 104 103 887 1140 +2106 5 2 1 1 14 13 260 513 555 551 1625 2637 +2107 5 2 1 1 555 551 1625 2637 556 552 1626 2638 +2108 5 2 1 1 556 552 1626 2638 557 553 1627 2639 +2109 5 2 1 1 557 553 1627 2639 558 554 1628 2640 +2110 5 2 1 1 558 554 1628 2640 74 73 890 1143 +2111 5 2 1 1 59 58 259 512 735 731 1621 2633 +2112 5 2 1 1 735 731 1621 2633 736 732 1622 2634 +2113 5 2 1 1 736 732 1622 2634 737 733 1623 2635 +2114 5 2 1 1 737 733 1623 2635 738 734 1624 2636 +2115 5 2 1 1 738 734 1624 2636 119 118 889 1142 +2116 5 2 1 1 29 28 258 511 615 611 1617 2629 +2117 5 2 1 1 615 611 1617 2629 616 612 1618 2630 +2118 5 2 1 1 616 612 1618 2630 617 613 1619 2631 +2119 5 2 1 1 617 613 1619 2631 618 614 1620 2632 +2120 5 2 1 1 618 614 1620 2632 89 88 888 1141 +2121 5 2 1 1 522 341 161 426 2673 1949 1229 2289 +2122 5 2 1 1 2673 1949 1229 2289 2674 1950 1230 2290 +2123 5 2 1 1 2674 1950 1230 2290 2675 1951 1231 2291 +2124 5 2 1 1 2675 1951 1231 2291 2676 1952 1232 2292 +2125 5 2 1 1 2676 1952 1232 2292 1152 971 791 1056 +2126 5 2 1 1 524 202 163 344 2681 1393 1237 1961 +2127 5 2 1 1 2681 1393 1237 1961 2682 1394 1238 1962 +2128 5 2 1 1 2682 1394 1238 1962 2683 1395 1239 1963 +2129 5 2 1 1 2683 1395 1239 1963 2684 1396 1240 1964 +2130 5 2 1 1 2684 1396 1240 1964 1154 832 793 974 +2131 5 2 1 1 235 498 149 323 1525 2577 1181 1877 +2132 5 2 1 1 1525 2577 1181 1877 1526 2578 1182 1878 +2133 5 2 1 1 1526 2578 1182 1878 1527 2579 1183 1879 +2134 5 2 1 1 1527 2579 1183 1879 1528 2580 1184 1880 +2135 5 2 1 1 1528 2580 1184 1880 865 1128 779 953 +2136 5 2 1 1 474 308 339 190 2481 1817 1941 1345 +2137 5 2 1 1 2481 1817 1941 1345 2482 1818 1942 1346 +2138 5 2 1 1 2482 1818 1942 1346 2483 1819 1943 1347 +2139 5 2 1 1 2483 1819 1943 1347 2484 1820 1944 1348 +2140 5 2 1 1 2484 1820 1944 1348 1104 938 969 820 +2141 5 2 1 1 189 475 166 309 1341 2485 1249 1821 +2142 5 2 1 1 1341 2485 1249 1821 1342 2486 1250 1822 +2143 5 2 1 1 1342 2486 1250 1822 1343 2487 1251 1823 +2144 5 2 1 1 1343 2487 1251 1823 1344 2488 1252 1824 +2145 5 2 1 1 1344 2488 1252 1824 819 1105 796 939 +2146 5 2 1 1 476 310 401 191 2489 1825 2189 1349 +2147 5 2 1 1 2489 1825 2189 1349 2490 1826 2190 1350 +2148 5 2 1 1 2490 1826 2190 1350 2491 1827 2191 1351 +2149 5 2 1 1 2491 1827 2191 1351 2492 1828 2192 1352 +2150 5 2 1 1 2492 1828 2192 1352 1106 940 1031 821 +2151 5 2 1 1 417 319 397 198 2253 1861 2173 1377 +2152 5 2 1 1 2253 1861 2173 1377 2254 1862 2174 1378 +2153 5 2 1 1 2254 1862 2174 1378 2255 1863 2175 1379 +2154 5 2 1 1 2255 1863 2175 1379 2256 1864 2176 1380 +2155 5 2 1 1 2256 1864 2176 1380 1047 949 1027 828 +2156 5 2 1 1 495 231 404 528 2565 1509 2201 2697 +2157 5 2 1 1 2565 1509 2201 2697 2566 1510 2202 2698 +2158 5 2 1 1 2566 1510 2202 2698 2567 1511 2203 2699 +2159 5 2 1 1 2567 1511 2203 2699 2568 1512 2204 2700 +2160 5 2 1 1 2568 1512 2204 2700 1125 861 1034 1158 +2161 5 2 1 1 461 239 378 520 2429 1541 2097 2665 +2162 5 2 1 1 2429 1541 2097 2665 2430 1542 2098 2666 +2163 5 2 1 1 2430 1542 2098 2666 2431 1543 2099 2667 +2164 5 2 1 1 2431 1543 2099 2667 2432 1544 2100 2668 +2165 5 2 1 1 2432 1544 2100 2668 1091 869 1008 1150 +2166 5 2 1 1 237 529 155 433 1533 2701 1205 2317 +2167 5 2 1 1 1533 2701 1205 2317 1534 2702 1206 2318 +2168 5 2 1 1 1534 2702 1206 2318 1535 2703 1207 2319 +2169 5 2 1 1 1535 2703 1207 2319 1536 2704 1208 2320 +2170 5 2 1 1 1536 2704 1208 2320 867 1159 785 1063 +2171 5 2 1 1 521 342 160 430 2669 1953 1225 2305 +2172 5 2 1 1 2669 1953 1225 2305 2670 1954 1226 2306 +2173 5 2 1 1 2670 1954 1226 2306 2671 1955 1227 2307 +2174 5 2 1 1 2671 1955 1227 2307 2672 1956 1228 2308 +2175 5 2 1 1 2672 1956 1228 2308 1151 972 790 1060 +2176 5 2 1 1 146 466 211 315 1169 2449 1429 1845 +2177 5 2 1 1 1169 2449 1429 1845 1170 2450 1430 1846 +2178 5 2 1 1 1170 2450 1430 1846 1171 2451 1431 1847 +2179 5 2 1 1 1171 2451 1431 1847 1172 2452 1432 1848 +2180 5 2 1 1 1172 2452 1432 1848 776 1096 841 945 +2181 5 2 1 1 62 61 274 424 747 743 1681 2281 +2182 5 2 1 1 747 743 1681 2281 748 744 1682 2282 +2183 5 2 1 1 748 744 1682 2282 749 745 1683 2283 +2184 5 2 1 1 749 745 1683 2283 750 746 1684 2284 +2185 5 2 1 1 750 746 1684 2284 122 121 904 1054 +2186 5 2 1 1 47 46 272 422 687 683 1673 2273 +2187 5 2 1 1 687 683 1673 2273 688 684 1674 2274 +2188 5 2 1 1 688 684 1674 2274 689 685 1675 2275 +2189 5 2 1 1 689 685 1675 2275 690 686 1676 2276 +2190 5 2 1 1 690 686 1676 2276 107 106 902 1052 +2191 5 2 1 1 17 16 273 423 567 563 1677 2277 +2192 5 2 1 1 567 563 1677 2277 568 564 1678 2278 +2193 5 2 1 1 568 564 1678 2278 569 565 1679 2279 +2194 5 2 1 1 569 565 1679 2279 570 566 1680 2280 +2195 5 2 1 1 570 566 1680 2280 77 76 903 1053 +2196 5 2 1 1 32 31 271 421 627 623 1669 2269 +2197 5 2 1 1 627 623 1669 2269 628 624 1670 2270 +2198 5 2 1 1 628 624 1670 2270 629 625 1671 2271 +2199 5 2 1 1 629 625 1671 2271 630 626 1672 2272 +2200 5 2 1 1 630 626 1672 2272 92 91 901 1051 +2201 5 2 1 1 246 533 276 313 1569 2717 1689 1837 +2202 5 2 1 1 1569 2717 1689 1837 1570 2718 1690 1838 +2203 5 2 1 1 1570 2718 1690 1838 1571 2719 1691 1839 +2204 5 2 1 1 1571 2719 1691 1839 1572 2720 1692 1840 +2205 5 2 1 1 1572 2720 1692 1840 876 1163 906 943 +2206 5 2 1 1 407 209 308 322 2213 1421 1817 1873 +2207 5 2 1 1 2213 1421 1817 1873 2214 1422 1818 1874 +2208 5 2 1 1 2214 1422 1818 1874 2215 1423 1819 1875 +2209 5 2 1 1 2215 1423 1819 1875 2216 1424 1820 1876 +2210 5 2 1 1 2216 1424 1820 1876 1037 839 938 952 +2211 5 2 1 1 467 156 367 320 2453 1209 2053 1865 +2212 5 2 1 1 2453 1209 2053 1865 2454 1210 2054 1866 +2213 5 2 1 1 2454 1210 2054 1866 2455 1211 2055 1867 +2214 5 2 1 1 2455 1211 2055 1867 2456 1212 2056 1868 +2215 5 2 1 1 2456 1212 2056 1868 1097 786 997 950 +2216 5 2 1 1 470 327 10 9 2465 1893 539 535 +2217 5 2 1 1 2465 1893 539 535 2466 1894 540 536 +2218 5 2 1 1 2466 1894 540 536 2467 1895 541 537 +2219 5 2 1 1 2467 1895 541 537 2468 1896 542 538 +2220 5 2 1 1 2468 1896 542 538 1100 957 70 69 +2221 5 2 1 1 471 328 55 54 2469 1897 719 715 +2222 5 2 1 1 2469 1897 719 715 2470 1898 720 716 +2223 5 2 1 1 2470 1898 720 716 2471 1899 721 717 +2224 5 2 1 1 2471 1899 721 717 2472 1900 722 718 +2225 5 2 1 1 2472 1900 722 718 1101 958 115 114 +2226 5 2 1 1 472 329 25 24 2473 1901 599 595 +2227 5 2 1 1 2473 1901 599 595 2474 1902 600 596 +2228 5 2 1 1 2474 1902 600 596 2475 1903 601 597 +2229 5 2 1 1 2475 1903 601 597 2476 1904 602 598 +2230 5 2 1 1 2476 1904 602 598 1102 959 85 84 +2231 5 2 1 1 473 1 38 334 2477 137 651 1921 +2232 5 2 1 1 2477 137 651 1921 2478 138 652 1922 +2233 5 2 1 1 2478 138 652 1922 2479 139 653 1923 +2234 5 2 1 1 2479 139 653 1923 2480 140 654 1924 +2235 5 2 1 1 2480 140 654 1924 1103 7 98 964 +2236 5 2 1 1 332 229 328 471 1913 1501 1897 2469 +2237 5 2 1 1 1913 1501 1897 2469 1914 1502 1898 2470 +2238 5 2 1 1 1914 1502 1898 2470 1915 1503 1899 2471 +2239 5 2 1 1 1915 1503 1899 2471 1916 1504 1900 2472 +2240 5 2 1 1 1916 1504 1900 2472 962 859 958 1101 +2241 5 2 1 1 334 231 330 473 1921 1509 1905 2477 +2242 5 2 1 1 1921 1509 1905 2477 1922 1510 1906 2478 +2243 5 2 1 1 1922 1510 1906 2478 1923 1511 1907 2479 +2244 5 2 1 1 1923 1511 1907 2479 1924 1512 1908 2480 +2245 5 2 1 1 1924 1512 1908 2480 964 861 960 1103 +2246 5 2 1 1 385 480 158 285 2125 2505 1217 1725 +2247 5 2 1 1 2125 2505 1217 1725 2126 2506 1218 1726 +2248 5 2 1 1 2126 2506 1218 1726 2127 2507 1219 1727 +2249 5 2 1 1 2127 2507 1219 1727 2128 2508 1220 1728 +2250 5 2 1 1 2128 2508 1220 1728 1015 1110 788 915 +2251 5 2 1 1 386 479 159 284 2129 2501 1221 1721 +2252 5 2 1 1 2129 2501 1221 1721 2130 2502 1222 1722 +2253 5 2 1 1 2130 2502 1222 1722 2131 2503 1223 1723 +2254 5 2 1 1 2131 2503 1223 1723 2132 2504 1224 1724 +2255 5 2 1 1 2132 2504 1224 1724 1016 1109 789 914 +2256 5 2 1 1 402 458 154 248 2193 2417 1201 1577 +2257 5 2 1 1 2193 2417 1201 1577 2194 2418 1202 1578 +2258 5 2 1 1 2194 2418 1202 1578 2195 2419 1203 1579 +2259 5 2 1 1 2195 2419 1203 1579 2196 2420 1204 1580 +2260 5 2 1 1 2196 2420 1204 1580 1032 1088 784 878 +2261 5 2 1 1 205 398 171 335 1405 2177 1269 1925 +2262 5 2 1 1 1405 2177 1269 1925 1406 2178 1270 1926 +2263 5 2 1 1 1406 2178 1270 1926 1407 2179 1271 1927 +2264 5 2 1 1 1407 2179 1271 1927 1408 2180 1272 1928 +2265 5 2 1 1 1408 2180 1272 1928 835 1028 801 965 +2266 5 2 1 1 207 336 172 399 1413 1929 1273 2181 +2267 5 2 1 1 1413 1929 1273 2181 1414 1930 1274 2182 +2268 5 2 1 1 1414 1930 1274 2182 1415 1931 1275 2183 +2269 5 2 1 1 1415 1931 1275 2183 1416 1932 1276 2184 +2270 5 2 1 1 1416 1932 1276 2184 837 966 802 1029 +2271 5 2 1 1 497 417 198 275 2573 2253 1377 1685 +2272 5 2 1 1 2573 2253 1377 1685 2574 2254 1378 1686 +2273 5 2 1 1 2574 2254 1378 1686 2575 2255 1379 1687 +2274 5 2 1 1 2575 2255 1379 1687 2576 2256 1380 1688 +2275 5 2 1 1 2576 2256 1380 1688 1127 1047 828 905 +2276 5 2 1 1 531 381 224 477 2709 2109 1481 2493 +2277 5 2 1 1 2709 2109 1481 2493 2710 2110 1482 2494 +2278 5 2 1 1 2710 2110 1482 2494 2711 2111 1483 2495 +2279 5 2 1 1 2711 2111 1483 2495 2712 2112 1484 2496 +2280 5 2 1 1 2712 2112 1484 2496 1161 1011 854 1107 +2281 5 2 1 1 532 380 225 478 2713 2105 1485 2497 +2282 5 2 1 1 2713 2105 1485 2497 2714 2106 1486 2498 +2283 5 2 1 1 2714 2106 1486 2498 2715 2107 1487 2499 +2284 5 2 1 1 2715 2107 1487 2499 2716 2108 1488 2500 +2285 5 2 1 1 2716 2108 1488 2500 1162 1010 855 1108 +2286 5 2 1 1 347 447 341 192 1973 2373 1949 1353 +2287 5 2 1 1 1973 2373 1949 1353 1974 2374 1950 1354 +2288 5 2 1 1 1974 2374 1950 1354 1975 2375 1951 1355 +2289 5 2 1 1 1975 2375 1951 1355 1976 2376 1952 1356 +2290 5 2 1 1 1976 2376 1952 1356 977 1077 971 822 +2291 5 2 1 1 348 194 344 448 1977 1361 1961 2377 +2292 5 2 1 1 1977 1361 1961 2377 1978 1362 1962 2378 +2293 5 2 1 1 1978 1362 1962 2378 1979 1363 1963 2379 +2294 5 2 1 1 1979 1363 1963 2379 1980 1364 1964 2380 +2295 5 2 1 1 1980 1364 1964 2380 978 824 974 1078 +2296 5 2 1 1 349 196 346 449 1981 1369 1969 2381 +2297 5 2 1 1 1981 1369 1969 2381 1982 1370 1970 2382 +2298 5 2 1 1 1982 1370 1970 2382 1983 1371 1971 2383 +2299 5 2 1 1 1983 1371 1971 2383 1984 1372 1972 2384 +2300 5 2 1 1 1984 1372 1972 2384 979 826 976 1079 +2301 5 2 1 1 226 534 303 387 1489 2721 1797 2133 +2302 5 2 1 1 1489 2721 1797 2133 1490 2722 1798 2134 +2303 5 2 1 1 1490 2722 1798 2134 1491 2723 1799 2135 +2304 5 2 1 1 1491 2723 1799 2135 1492 2724 1800 2136 +2305 5 2 1 1 1492 2724 1800 2136 856 1164 933 1017 +2306 5 2 1 1 337 170 323 206 1933 1265 1877 1409 +2307 5 2 1 1 1933 1265 1877 1409 1934 1266 1878 1410 +2308 5 2 1 1 1934 1266 1878 1410 1935 1267 1879 1411 +2309 5 2 1 1 1935 1267 1879 1411 1936 1268 1880 1412 +2310 5 2 1 1 1936 1268 1880 1412 967 800 953 836 +2311 5 2 1 1 407 322 211 466 2213 1873 1429 2449 +2312 5 2 1 1 2213 1873 1429 2449 2214 1874 1430 2450 +2313 5 2 1 1 2214 1874 1430 2450 2215 1875 1431 2451 +2314 5 2 1 1 2215 1875 1431 2451 2216 1876 1432 2452 +2315 5 2 1 1 2216 1876 1432 2452 1037 952 841 1096 +2316 5 2 1 1 486 223 467 320 2529 1477 2453 1865 +2317 5 2 1 1 2529 1477 2453 1865 2530 1478 2454 1866 +2318 5 2 1 1 2530 1478 2454 1866 2531 1479 2455 1867 +2319 5 2 1 1 2531 1479 2455 1867 2532 1480 2456 1868 +2320 5 2 1 1 2532 1480 2456 1868 1116 853 1097 950 +2321 5 2 1 1 400 430 160 276 2185 2305 1225 1689 +2322 5 2 1 1 2185 2305 1225 1689 2186 2306 1226 1690 +2323 5 2 1 1 2186 2306 1226 1690 2187 2307 1227 1691 +2324 5 2 1 1 2187 2307 1227 1691 2188 2308 1228 1692 +2325 5 2 1 1 2188 2308 1228 1692 1030 1060 790 906 +2326 5 2 1 1 152 482 281 487 1193 2513 1709 2533 +2327 5 2 1 1 1193 2513 1709 2533 1194 2514 1710 2534 +2328 5 2 1 1 1194 2514 1710 2534 1195 2515 1711 2535 +2329 5 2 1 1 1195 2515 1711 2535 1196 2516 1712 2536 +2330 5 2 1 1 1196 2516 1712 2536 782 1112 911 1117 +2331 5 2 1 1 282 483 153 488 1713 2517 1197 2537 +2332 5 2 1 1 1713 2517 1197 2537 1714 2518 1198 2538 +2333 5 2 1 1 1714 2518 1198 2538 1715 2519 1199 2539 +2334 5 2 1 1 1715 2519 1199 2539 1716 2520 1200 2540 +2335 5 2 1 1 1716 2520 1200 2540 912 1113 783 1118 +2336 5 2 1 1 283 484 151 489 1717 2521 1189 2541 +2337 5 2 1 1 1717 2521 1189 2541 1718 2522 1190 2542 +2338 5 2 1 1 1718 2522 1190 2542 1719 2523 1191 2543 +2339 5 2 1 1 1719 2523 1191 2543 1720 2524 1192 2544 +2340 5 2 1 1 1720 2524 1192 2544 913 1114 781 1119 +2341 5 2 1 1 9 4 331 470 535 129 1909 2465 +2342 5 2 1 1 535 129 1909 2465 536 130 1910 2466 +2343 5 2 1 1 536 130 1910 2466 537 131 1911 2467 +2344 5 2 1 1 537 131 1911 2467 538 132 1912 2468 +2345 5 2 1 1 538 132 1912 2468 69 5 961 1100 +2346 5 2 1 1 54 2 332 471 715 141 1913 2469 +2347 5 2 1 1 715 141 1913 2469 716 142 1914 2470 +2348 5 2 1 1 716 142 1914 2470 717 143 1915 2471 +2349 5 2 1 1 717 143 1915 2471 718 144 1916 2472 +2350 5 2 1 1 718 144 1916 2472 114 8 962 1101 +2351 5 2 1 1 24 3 333 472 595 133 1917 2473 +2352 5 2 1 1 595 133 1917 2473 596 134 1918 2474 +2353 5 2 1 1 596 134 1918 2474 597 135 1919 2475 +2354 5 2 1 1 597 135 1919 2475 598 136 1920 2476 +2355 5 2 1 1 598 136 1920 2476 84 6 963 1102 +2356 5 2 1 1 1 473 330 39 137 2477 1905 655 +2357 5 2 1 1 137 2477 1905 655 138 2478 1906 656 +2358 5 2 1 1 138 2478 1906 656 139 2479 1907 657 +2359 5 2 1 1 139 2479 1907 657 140 2480 1908 658 +2360 5 2 1 1 140 2480 1908 658 7 1103 960 99 +2361 5 2 1 1 517 228 470 331 2653 1497 2465 1909 +2362 5 2 1 1 2653 1497 2465 1909 2654 1498 2466 1910 +2363 5 2 1 1 2654 1498 2466 1910 2655 1499 2467 1911 +2364 5 2 1 1 2655 1499 2467 1911 2656 1500 2468 1912 +2365 5 2 1 1 2656 1500 2468 1912 1147 858 1100 961 +2366 5 2 1 1 229 332 269 405 1501 1913 1661 2205 +2367 5 2 1 1 1501 1913 1661 2205 1502 1914 1662 2206 +2368 5 2 1 1 1502 1914 1662 2206 1503 1915 1663 2207 +2369 5 2 1 1 1503 1915 1663 2207 1504 1916 1664 2208 +2370 5 2 1 1 1504 1916 1664 2208 859 962 899 1035 +2371 5 2 1 1 515 230 472 333 2645 1505 2473 1917 +2372 5 2 1 1 2645 1505 2473 1917 2646 1506 2474 1918 +2373 5 2 1 1 2646 1506 2474 1918 2647 1507 2475 1919 +2374 5 2 1 1 2647 1507 2475 1919 2648 1508 2476 1920 +2375 5 2 1 1 2648 1508 2476 1920 1145 860 1102 963 +2376 5 2 1 1 497 252 145 417 2573 1593 1165 2253 +2377 5 2 1 1 2573 1593 1165 2253 2574 1594 1166 2254 +2378 5 2 1 1 2574 1594 1166 2254 2575 1595 1167 2255 +2379 5 2 1 1 2575 1595 1167 2255 2576 1596 1168 2256 +2380 5 2 1 1 2576 1596 1168 2256 1127 882 775 1047 +2381 5 2 1 1 160 401 210 361 1225 2189 1425 2029 +2382 5 2 1 1 1225 2189 1425 2029 1226 2190 1426 2030 +2383 5 2 1 1 1226 2190 1426 2030 1227 2191 1427 2031 +2384 5 2 1 1 1227 2191 1427 2031 1228 2192 1428 2032 +2385 5 2 1 1 1228 2192 1428 2032 790 1031 840 991 +2386 5 2 1 1 434 340 391 158 2321 1945 2149 1217 +2387 5 2 1 1 2321 1945 2149 1217 2322 1946 2150 1218 +2388 5 2 1 1 2322 1946 2150 1218 2323 1947 2151 1219 +2389 5 2 1 1 2323 1947 2151 1219 2324 1948 2152 1220 +2390 5 2 1 1 2324 1948 2152 1220 1064 970 1021 788 +2391 5 2 1 1 435 339 392 159 2325 1941 2153 1221 +2392 5 2 1 1 2325 1941 2153 1221 2326 1942 2154 1222 +2393 5 2 1 1 2326 1942 2154 1222 2327 1943 2155 1223 +2394 5 2 1 1 2327 1943 2155 1223 2328 1944 2156 1224 +2395 5 2 1 1 2328 1944 2156 1224 1065 969 1022 789 +2396 5 2 1 1 437 162 394 343 2333 1233 2161 1957 +2397 5 2 1 1 2333 1233 2161 1957 2334 1234 2162 1958 +2398 5 2 1 1 2334 1234 2162 1958 2335 1235 2163 1959 +2399 5 2 1 1 2335 1235 2163 1959 2336 1236 2164 1960 +2400 5 2 1 1 2336 1236 2164 1960 1067 792 1024 973 +2401 5 2 1 1 436 164 393 345 2329 1241 2157 1965 +2402 5 2 1 1 2329 1241 2157 1965 2330 1242 2158 1966 +2403 5 2 1 1 2330 1242 2158 1966 2331 1243 2159 1967 +2404 5 2 1 1 2331 1243 2159 1967 2332 1244 2160 1968 +2405 5 2 1 1 2332 1244 2160 1968 1066 794 1023 975 +2406 5 2 1 1 496 485 215 305 2569 2525 1445 1805 +2407 5 2 1 1 2569 2525 1445 1805 2570 2526 1446 1806 +2408 5 2 1 1 2570 2526 1446 1806 2571 2527 1447 1807 +2409 5 2 1 1 2571 2527 1447 1807 2572 2528 1448 1808 +2410 5 2 1 1 2572 2528 1448 1808 1126 1115 845 935 +2411 5 2 1 1 496 150 313 485 2569 1185 1837 2525 +2412 5 2 1 1 2569 1185 1837 2525 2570 1186 1838 2526 +2413 5 2 1 1 2570 1186 1838 2526 2571 1187 1839 2527 +2414 5 2 1 1 2571 1187 1839 2527 2572 1188 1840 2528 +2415 5 2 1 1 2572 1188 1840 2528 1126 780 943 1115 +2416 5 2 1 1 216 396 236 395 1449 2169 1529 2165 +2417 5 2 1 1 1449 2169 1529 2165 1450 2170 1530 2166 +2418 5 2 1 1 1450 2170 1530 2166 1451 2171 1531 2167 +2419 5 2 1 1 1451 2171 1531 2167 1452 2172 1532 2168 +2420 5 2 1 1 1452 2172 1532 2168 846 1026 866 1025 +2421 5 2 1 1 502 362 519 251 2593 2033 2661 1589 +2422 5 2 1 1 2593 2033 2661 1589 2594 2034 2662 1590 +2423 5 2 1 1 2594 2034 2662 1590 2595 2035 2663 1591 +2424 5 2 1 1 2595 2035 2663 1591 2596 2036 2664 1592 +2425 5 2 1 1 2596 2036 2664 1592 1132 992 1149 881 +2426 5 2 1 1 492 327 470 228 2553 1893 2465 1497 +2427 5 2 1 1 2553 1893 2465 1497 2554 1894 2466 1498 +2428 5 2 1 1 2554 1894 2466 1498 2555 1895 2467 1499 +2429 5 2 1 1 2555 1895 2467 1499 2556 1896 2468 1500 +2430 5 2 1 1 2556 1896 2468 1500 1122 957 1100 858 +2431 5 2 1 1 328 229 526 493 1897 1501 2689 2557 +2432 5 2 1 1 1897 1501 2689 2557 1898 1502 2690 2558 +2433 5 2 1 1 1898 1502 2690 2558 1899 1503 2691 2559 +2434 5 2 1 1 1899 1503 2691 2559 1900 1504 2692 2560 +2435 5 2 1 1 1900 1504 2692 2560 958 859 1156 1123 +2436 5 2 1 1 494 329 472 230 2561 1901 2473 1505 +2437 5 2 1 1 2561 1901 2473 1505 2562 1902 2474 1506 +2438 5 2 1 1 2562 1902 2474 1506 2563 1903 2475 1507 +2439 5 2 1 1 2563 1903 2475 1507 2564 1904 2476 1508 +2440 5 2 1 1 2564 1904 2476 1508 1124 959 1102 860 +2441 5 2 1 1 231 495 266 330 1509 2565 1649 1905 +2442 5 2 1 1 1509 2565 1649 1905 1510 2566 1650 1906 +2443 5 2 1 1 1510 2566 1650 1906 1511 2567 1651 1907 +2444 5 2 1 1 1511 2567 1651 1907 1512 2568 1652 1908 +2445 5 2 1 1 1512 2568 1652 1908 861 1125 896 960 +2446 5 2 1 1 197 518 154 324 1373 2657 1201 1881 +2447 5 2 1 1 1373 2657 1201 1881 1374 2658 1202 1882 +2448 5 2 1 1 1374 2658 1202 1882 1375 2659 1203 1883 +2449 5 2 1 1 1375 2659 1203 1883 1376 2660 1204 1884 +2450 5 2 1 1 1376 2660 1204 1884 827 1148 784 954 +2451 5 2 1 1 359 213 262 443 2021 1437 1633 2357 +2452 5 2 1 1 2021 1437 1633 2357 2022 1438 1634 2358 +2453 5 2 1 1 2022 1438 1634 2358 2023 1439 1635 2359 +2454 5 2 1 1 2023 1439 1635 2359 2024 1440 1636 2360 +2455 5 2 1 1 2024 1440 1636 2360 989 843 892 1073 +2456 5 2 1 1 347 232 450 447 1973 1513 2385 2373 +2457 5 2 1 1 1973 1513 2385 2373 1974 1514 2386 2374 +2458 5 2 1 1 1974 1514 2386 2374 1975 1515 2387 2375 +2459 5 2 1 1 1975 1515 2387 2375 1976 1516 2388 2376 +2460 5 2 1 1 1976 1516 2388 2376 977 862 1080 1077 +2461 5 2 1 1 500 168 469 349 2585 1257 2461 1981 +2462 5 2 1 1 2585 1257 2461 1981 2586 1258 2462 1982 +2463 5 2 1 1 2586 1258 2462 1982 2587 1259 2463 1983 +2464 5 2 1 1 2587 1259 2463 1983 2588 1260 2464 1984 +2465 5 2 1 1 2588 1260 2464 1984 1130 798 1099 979 +2466 5 2 1 1 501 166 468 348 2589 1249 2457 1977 +2467 5 2 1 1 2589 1249 2457 1977 2590 1250 2458 1978 +2468 5 2 1 1 2590 1250 2458 1978 2591 1251 2459 1979 +2469 5 2 1 1 2591 1251 2459 1979 2592 1252 2460 1980 +2470 5 2 1 1 2592 1252 2460 1980 1131 796 1098 978 +2471 5 2 1 1 232 347 167 499 1513 1973 1253 2581 +2472 5 2 1 1 1513 1973 1253 2581 1514 1974 1254 2582 +2473 5 2 1 1 1514 1974 1254 2582 1515 1975 1255 2583 +2474 5 2 1 1 1515 1975 1255 2583 1516 1976 1256 2584 +2475 5 2 1 1 1516 1976 1256 2584 862 977 797 1129 +2476 5 2 1 1 500 349 449 233 2585 1981 2381 1517 +2477 5 2 1 1 2585 1981 2381 1517 2586 1982 2382 1518 +2478 5 2 1 1 2586 1982 2382 1518 2587 1983 2383 1519 +2479 5 2 1 1 2587 1983 2383 1519 2588 1984 2384 1520 +2480 5 2 1 1 2588 1984 2384 1520 1130 979 1079 863 +2481 5 2 1 1 501 348 448 234 2589 1977 2377 1521 +2482 5 2 1 1 2589 1977 2377 1521 2590 1978 2378 1522 +2483 5 2 1 1 2590 1978 2378 1522 2591 1979 2379 1523 +2484 5 2 1 1 2591 1979 2379 1523 2592 1980 2380 1524 +2485 5 2 1 1 2592 1980 2380 1524 1131 978 1078 864 +2486 5 2 1 1 235 502 251 498 1525 2593 1589 2577 +2487 5 2 1 1 1525 2593 1589 2577 1526 2594 1590 2578 +2488 5 2 1 1 1526 2594 1590 2578 1527 2595 1591 2579 +2489 5 2 1 1 1527 2595 1591 2579 1528 2596 1592 2580 +2490 5 2 1 1 1528 2596 1592 2580 865 1132 881 1128 +2491 5 2 1 1 409 12 11 374 2221 547 543 2081 +2492 5 2 1 1 2221 547 543 2081 2222 548 544 2082 +2493 5 2 1 1 2222 548 544 2082 2223 549 545 2083 +2494 5 2 1 1 2223 549 545 2083 2224 550 546 2084 +2495 5 2 1 1 2224 550 546 2084 1039 72 71 1004 +2496 5 2 1 1 410 57 56 375 2225 727 723 2085 +2497 5 2 1 1 2225 727 723 2085 2226 728 724 2086 +2498 5 2 1 1 2226 728 724 2086 2227 729 725 2087 +2499 5 2 1 1 2227 729 725 2087 2228 730 726 2088 +2500 5 2 1 1 2228 730 726 2088 1040 117 116 1005 +2501 5 2 1 1 411 27 26 376 2229 607 603 2089 +2502 5 2 1 1 2229 607 603 2089 2230 608 604 2090 +2503 5 2 1 1 2230 608 604 2090 2231 609 605 2091 +2504 5 2 1 1 2231 609 605 2091 2232 610 606 2092 +2505 5 2 1 1 2232 610 606 2092 1041 87 86 1006 +2506 5 2 1 1 412 42 41 377 2233 667 663 2093 +2507 5 2 1 1 2233 667 663 2093 2234 668 664 2094 +2508 5 2 1 1 2234 668 664 2094 2235 669 665 2095 +2509 5 2 1 1 2235 669 665 2095 2236 670 666 2096 +2510 5 2 1 1 2236 670 666 2096 1042 102 101 1007 +2511 5 2 1 1 413 370 67 66 2237 2065 767 763 +2512 5 2 1 1 2237 2065 767 763 2238 2066 768 764 +2513 5 2 1 1 2238 2066 768 764 2239 2067 769 765 +2514 5 2 1 1 2239 2067 769 765 2240 2068 770 766 +2515 5 2 1 1 2240 2068 770 766 1043 1000 127 126 +2516 5 2 1 1 414 371 22 21 2241 2069 587 583 +2517 5 2 1 1 2241 2069 587 583 2242 2070 588 584 +2518 5 2 1 1 2242 2070 588 584 2243 2071 589 585 +2519 5 2 1 1 2243 2071 589 585 2244 2072 590 586 +2520 5 2 1 1 2244 2072 590 586 1044 1001 82 81 +2521 5 2 1 1 415 372 52 51 2245 2073 707 703 +2522 5 2 1 1 2245 2073 707 703 2246 2074 708 704 +2523 5 2 1 1 2246 2074 708 704 2247 2075 709 705 +2524 5 2 1 1 2247 2075 709 705 2248 2076 710 706 +2525 5 2 1 1 2248 2076 710 706 1045 1002 112 111 +2526 5 2 1 1 416 373 37 36 2249 2077 647 643 +2527 5 2 1 1 2249 2077 647 643 2250 2078 648 644 +2528 5 2 1 1 2250 2078 648 644 2251 2079 649 645 +2529 5 2 1 1 2251 2079 649 645 2252 2080 650 646 +2530 5 2 1 1 2252 2080 650 646 1046 1003 97 96 +2531 5 2 1 1 173 446 239 461 1277 2369 1541 2429 +2532 5 2 1 1 1277 2369 1541 2429 1278 2370 1542 2430 +2533 5 2 1 1 1278 2370 1542 2430 1279 2371 1543 2431 +2534 5 2 1 1 1279 2371 1543 2431 1280 2372 1544 2432 +2535 5 2 1 1 1280 2372 1544 2432 803 1076 869 1091 +2536 5 2 1 1 425 426 161 278 2285 2289 1229 1697 +2537 5 2 1 1 2285 2289 1229 1697 2286 2290 1230 1698 +2538 5 2 1 1 2286 2290 1230 1698 2287 2291 1231 1699 +2539 5 2 1 1 2287 2291 1231 1699 2288 2292 1232 1700 +2540 5 2 1 1 2288 2292 1232 1700 1055 1056 791 908 +2541 5 2 1 1 428 279 163 202 2297 1701 1237 1393 +2542 5 2 1 1 2297 1701 1237 1393 2298 1702 1238 1394 +2543 5 2 1 1 2298 1702 1238 1394 2299 1703 1239 1395 +2544 5 2 1 1 2299 1703 1239 1395 2300 1704 1240 1396 +2545 5 2 1 1 2300 1704 1240 1396 1058 909 793 832 +2546 5 2 1 1 204 429 280 427 1401 2301 1705 2293 +2547 5 2 1 1 1401 2301 1705 2293 1402 2302 1706 2294 +2548 5 2 1 1 1402 2302 1706 2294 1403 2303 1707 2295 +2549 5 2 1 1 1403 2303 1707 2295 1404 2304 1708 2296 +2550 5 2 1 1 1404 2304 1708 2296 834 1059 910 1057 +2551 5 2 1 1 462 353 64 63 2433 1997 755 751 +2552 5 2 1 1 2433 1997 755 751 2434 1998 756 752 +2553 5 2 1 1 2434 1998 756 752 2435 1999 757 753 +2554 5 2 1 1 2435 1999 757 753 2436 2000 758 754 +2555 5 2 1 1 2436 2000 758 754 1092 983 124 123 +2556 5 2 1 1 350 18 17 463 1985 571 567 2437 +2557 5 2 1 1 1985 571 567 2437 1986 572 568 2438 +2558 5 2 1 1 1986 572 568 2438 1987 573 569 2439 +2559 5 2 1 1 1987 573 569 2439 1988 574 570 2440 +2560 5 2 1 1 1988 574 570 2440 980 78 77 1093 +2561 5 2 1 1 352 48 47 464 1993 691 687 2441 +2562 5 2 1 1 1993 691 687 2441 1994 692 688 2442 +2563 5 2 1 1 1994 692 688 2442 1995 693 689 2443 +2564 5 2 1 1 1995 693 689 2443 1996 694 690 2444 +2565 5 2 1 1 1996 694 690 2444 982 108 107 1094 +2566 5 2 1 1 351 33 32 465 1989 631 627 2445 +2567 5 2 1 1 1989 631 627 2445 1990 632 628 2446 +2568 5 2 1 1 1990 632 628 2446 1991 633 629 2447 +2569 5 2 1 1 1991 633 629 2447 1992 634 630 2448 +2570 5 2 1 1 1992 634 630 2448 981 93 92 1095 +2571 5 2 1 1 160 361 239 446 1225 2029 1541 2369 +2572 5 2 1 1 1225 2029 1541 2369 1226 2030 1542 2370 +2573 5 2 1 1 1226 2030 1542 2370 1227 2031 1543 2371 +2574 5 2 1 1 1227 2031 1543 2371 1228 2032 1544 2372 +2575 5 2 1 1 1228 2032 1544 2372 790 991 869 1076 +2576 5 2 1 1 358 291 185 514 2017 1749 1325 2641 +2577 5 2 1 1 2017 1749 1325 2641 2018 1750 1326 2642 +2578 5 2 1 1 2018 1750 1326 2642 2019 1751 1327 2643 +2579 5 2 1 1 2019 1751 1327 2643 2020 1752 1328 2644 +2580 5 2 1 1 2020 1752 1328 2644 988 921 815 1144 +2581 5 2 1 1 169 445 238 397 1261 2365 1537 2173 +2582 5 2 1 1 1261 2365 1537 2173 1262 2366 1538 2174 +2583 5 2 1 1 1262 2366 1538 2174 1263 2367 1539 2175 +2584 5 2 1 1 1263 2367 1539 2175 1264 2368 1540 2176 +2585 5 2 1 1 1264 2368 1540 2176 799 1075 868 1027 +2586 5 2 1 1 261 444 147 505 1629 2361 1173 2605 +2587 5 2 1 1 1629 2361 1173 2605 1630 2362 1174 2606 +2588 5 2 1 1 1630 2362 1174 2606 1631 2363 1175 2607 +2589 5 2 1 1 1631 2363 1175 2607 1632 2364 1176 2608 +2590 5 2 1 1 1632 2364 1176 2608 891 1074 777 1135 +2591 5 2 1 1 161 450 205 364 1229 2385 1405 2041 +2592 5 2 1 1 1229 2385 1405 2041 1230 2386 1406 2042 +2593 5 2 1 1 1230 2386 1406 2042 1231 2387 1407 2043 +2594 5 2 1 1 1231 2387 1407 2043 1232 2388 1408 2044 +2595 5 2 1 1 1232 2388 1408 2044 791 1080 835 994 +2596 5 2 1 1 206 451 165 366 1409 2389 1245 2049 +2597 5 2 1 1 1409 2389 1245 2049 1410 2390 1246 2050 +2598 5 2 1 1 1410 2390 1246 2050 1411 2391 1247 2051 +2599 5 2 1 1 1411 2391 1247 2051 1412 2392 1248 2052 +2600 5 2 1 1 1412 2392 1248 2052 836 1081 795 996 +2601 5 2 1 1 207 452 163 365 1413 2393 1237 2045 +2602 5 2 1 1 1413 2393 1237 2045 1414 2394 1238 2046 +2603 5 2 1 1 1414 2394 1238 2046 1415 2395 1239 2047 +2604 5 2 1 1 1415 2395 1239 2047 1416 2396 1240 2048 +2605 5 2 1 1 1416 2396 1240 2048 837 1082 793 995 +2606 5 2 1 1 502 169 395 362 2593 1261 2165 2033 +2607 5 2 1 1 2593 1261 2165 2033 2594 1262 2166 2034 +2608 5 2 1 1 2594 1262 2166 2034 2595 1263 2167 2035 +2609 5 2 1 1 2595 1263 2167 2035 2596 1264 2168 2036 +2610 5 2 1 1 2596 1264 2168 2036 1132 799 1025 992 +2611 5 2 1 1 145 454 319 417 1165 2401 1861 2253 +2612 5 2 1 1 1165 2401 1861 2253 1166 2402 1862 2254 +2613 5 2 1 1 1166 2402 1862 2254 1167 2403 1863 2255 +2614 5 2 1 1 1167 2403 1863 2255 1168 2404 1864 2256 +2615 5 2 1 1 1168 2404 1864 2256 775 1084 949 1047 +2616 5 2 1 1 534 382 245 152 2721 2113 1565 1193 +2617 5 2 1 1 2721 2113 1565 1193 2722 2114 1566 1194 +2618 5 2 1 1 2722 2114 1566 1194 2723 2115 1567 1195 +2619 5 2 1 1 2723 2115 1567 1195 2724 2116 1568 1196 +2620 5 2 1 1 2724 2116 1568 1196 1164 1012 875 782 +2621 5 2 1 1 342 521 416 253 1953 2669 2249 1597 +2622 5 2 1 1 1953 2669 2249 1597 1954 2670 2250 1598 +2623 5 2 1 1 1954 2670 2250 1598 1955 2671 2251 1599 +2624 5 2 1 1 1955 2671 2251 1599 1956 2672 2252 1600 +2625 5 2 1 1 1956 2672 2252 1600 972 1151 1046 883 +2626 5 2 1 1 341 522 415 254 1949 2673 2245 1601 +2627 5 2 1 1 1949 2673 2245 1601 1950 2674 2246 1602 +2628 5 2 1 1 1950 2674 2246 1602 1951 2675 2247 1603 +2629 5 2 1 1 1951 2675 2247 1603 1952 2676 2248 1604 +2630 5 2 1 1 1952 2676 2248 1604 971 1152 1045 884 +2631 5 2 1 1 344 260 409 524 1961 1625 2221 2681 +2632 5 2 1 1 1961 1625 2221 2681 1962 1626 2222 2682 +2633 5 2 1 1 1962 1626 2222 2682 1963 1627 2223 2683 +2634 5 2 1 1 1963 1627 2223 2683 1964 1628 2224 2684 +2635 5 2 1 1 1964 1628 2224 2684 974 890 1039 1154 +2636 5 2 1 1 346 258 411 523 1969 1617 2229 2677 +2637 5 2 1 1 1969 1617 2229 2677 1970 1618 2230 2678 +2638 5 2 1 1 1970 1618 2230 2678 1971 1619 2231 2679 +2639 5 2 1 1 1971 1619 2231 2679 1972 1620 2232 2680 +2640 5 2 1 1 1972 1620 2232 2680 976 888 1041 1153 +2641 5 2 1 1 368 455 384 220 2057 2405 2121 1465 +2642 5 2 1 1 2057 2405 2121 1465 2058 2406 2122 1466 +2643 5 2 1 1 2058 2406 2122 1466 2059 2407 2123 1467 +2644 5 2 1 1 2059 2407 2123 1467 2060 2408 2124 1468 +2645 5 2 1 1 2060 2408 2124 1468 998 1085 1014 850 +2646 5 2 1 1 197 529 237 360 1373 2701 1533 2025 +2647 5 2 1 1 1373 2701 1533 2025 1374 2702 1534 2026 +2648 5 2 1 1 1374 2702 1534 2026 1375 2703 1535 2027 +2649 5 2 1 1 1375 2703 1535 2027 1376 2704 1536 2028 +2650 5 2 1 1 1376 2704 1536 2028 827 1159 867 990 +2651 5 2 1 1 508 19 18 350 2617 575 571 1985 +2652 5 2 1 1 2617 575 571 1985 2618 576 572 1986 +2653 5 2 1 1 2618 576 572 1986 2619 577 573 1987 +2654 5 2 1 1 2619 577 573 1987 2620 578 574 1988 +2655 5 2 1 1 2620 578 574 1988 1138 79 78 980 +2656 5 2 1 1 506 34 33 351 2609 635 631 1989 +2657 5 2 1 1 2609 635 631 1989 2610 636 632 1990 +2658 5 2 1 1 2610 636 632 1990 2611 637 633 1991 +2659 5 2 1 1 2611 637 633 1991 2612 638 634 1992 +2660 5 2 1 1 2612 638 634 1992 1136 94 93 981 +2661 5 2 1 1 507 49 48 352 2613 695 691 1993 +2662 5 2 1 1 2613 695 691 1993 2614 696 692 1994 +2663 5 2 1 1 2614 696 692 1994 2615 697 693 1995 +2664 5 2 1 1 2615 697 693 1995 2616 698 694 1996 +2665 5 2 1 1 2616 698 694 1996 1137 109 108 982 +2666 5 2 1 1 64 353 190 509 755 1997 1345 2621 +2667 5 2 1 1 755 1997 1345 2621 756 1998 1346 2622 +2668 5 2 1 1 756 1998 1346 2622 757 1999 1347 2623 +2669 5 2 1 1 757 1999 1347 2623 758 2000 1348 2624 +2670 5 2 1 1 758 2000 1348 2624 124 983 820 1139 +2671 5 2 1 1 510 354 45 44 2625 2001 679 675 +2672 5 2 1 1 2625 2001 679 675 2626 2002 680 676 +2673 5 2 1 1 2626 2002 680 676 2627 2003 681 677 +2674 5 2 1 1 2627 2003 681 677 2628 2004 682 678 +2675 5 2 1 1 2628 2004 682 678 1140 984 105 104 +2676 5 2 1 1 512 355 60 59 2633 2005 739 735 +2677 5 2 1 1 2633 2005 739 735 2634 2006 740 736 +2678 5 2 1 1 2634 2006 740 736 2635 2007 741 737 +2679 5 2 1 1 2635 2007 741 737 2636 2008 742 738 +2680 5 2 1 1 2636 2008 742 738 1142 985 120 119 +2681 5 2 1 1 511 357 30 29 2629 2013 619 615 +2682 5 2 1 1 2629 2013 619 615 2630 2014 620 616 +2683 5 2 1 1 2630 2014 620 616 2631 2015 621 617 +2684 5 2 1 1 2631 2015 621 617 2632 2016 622 618 +2685 5 2 1 1 2632 2016 622 618 1141 987 90 89 +2686 5 2 1 1 513 356 15 14 2637 2009 559 555 +2687 5 2 1 1 2637 2009 559 555 2638 2010 560 556 +2688 5 2 1 1 2638 2010 560 556 2639 2011 561 557 +2689 5 2 1 1 2639 2011 561 557 2640 2012 562 558 +2690 5 2 1 1 2640 2012 562 558 1143 986 75 74 +2691 5 2 1 1 379 453 294 214 2101 2397 1761 1441 +2692 5 2 1 1 2101 2397 1761 1441 2102 2398 1762 1442 +2693 5 2 1 1 2102 2398 1762 1442 2103 2399 1763 1443 +2694 5 2 1 1 2103 2399 1763 1443 2104 2400 1764 1444 +2695 5 2 1 1 2104 2400 1764 1444 1009 1083 924 844 +2696 5 2 1 1 227 530 299 406 1493 2705 1781 2209 +2697 5 2 1 1 1493 2705 1781 2209 1494 2706 1782 2210 +2698 5 2 1 1 1494 2706 1782 2210 1495 2707 1783 2211 +2699 5 2 1 1 1495 2707 1783 2211 1496 2708 1784 2212 +2700 5 2 1 1 1496 2708 1784 2212 857 1160 929 1036 +2701 5 2 1 1 406 460 298 227 2209 2425 1777 1493 +2702 5 2 1 1 2209 2425 1777 1493 2210 2426 1778 1494 +2703 5 2 1 1 2210 2426 1778 1494 2211 2427 1779 1495 +2704 5 2 1 1 2211 2427 1779 1495 2212 2428 1780 1496 +2705 5 2 1 1 2212 2428 1780 1496 1036 1090 928 857 +2706 5 2 1 1 460 406 187 300 2425 2209 1333 1785 +2707 5 2 1 1 2425 2209 1333 1785 2426 2210 1334 1786 +2708 5 2 1 1 2426 2210 1334 1786 2427 2211 1335 1787 +2709 5 2 1 1 2427 2211 1335 1787 2428 2212 1336 1788 +2710 5 2 1 1 2428 2212 1336 1788 1090 1036 817 930 +2711 5 2 1 1 501 289 208 418 2589 1741 1417 2257 +2712 5 2 1 1 2589 1741 1417 2257 2590 1742 1418 2258 +2713 5 2 1 1 2590 1742 1418 2258 2591 1743 1419 2259 +2714 5 2 1 1 2591 1743 1419 2259 2592 1744 1420 2260 +2715 5 2 1 1 2592 1744 1420 2260 1131 919 838 1048 +2716 5 2 1 1 238 445 235 457 1537 2365 1525 2413 +2717 5 2 1 1 1537 2365 1525 2413 1538 2366 1526 2414 +2718 5 2 1 1 1538 2366 1526 2414 1539 2367 1527 2415 +2719 5 2 1 1 1539 2367 1527 2415 1540 2368 1528 2416 +2720 5 2 1 1 1540 2368 1528 2416 868 1075 865 1087 +2721 5 2 1 1 404 231 334 516 2201 1509 1921 2649 +2722 5 2 1 1 2201 1509 1921 2649 2202 1510 1922 2650 +2723 5 2 1 1 2202 1510 1922 2650 2203 1511 1923 2651 +2724 5 2 1 1 2203 1511 1923 2651 2204 1512 1924 2652 +2725 5 2 1 1 2204 1512 1924 2652 1034 861 964 1146 +2726 5 2 1 1 466 146 314 407 2449 1169 1841 2213 +2727 5 2 1 1 2449 1169 1841 2213 2450 1170 1842 2214 +2728 5 2 1 1 2450 1170 1842 2214 2451 1171 1843 2215 +2729 5 2 1 1 2451 1171 1843 2215 2452 1172 1844 2216 +2730 5 2 1 1 2452 1172 1844 2216 1096 776 944 1037 +2731 5 2 1 1 386 225 296 479 2129 1485 1769 2501 +2732 5 2 1 1 2129 1485 1769 2501 2130 1486 1770 2502 +2733 5 2 1 1 2130 1486 1770 2502 2131 1487 1771 2503 +2734 5 2 1 1 2131 1487 1771 2503 2132 1488 1772 2504 +2735 5 2 1 1 2132 1488 1772 2504 1016 855 926 1109 +2736 5 2 1 1 385 224 295 480 2125 1481 1765 2505 +2737 5 2 1 1 2125 1481 1765 2505 2126 1482 1766 2506 +2738 5 2 1 1 2126 1482 1766 2506 2127 1483 1767 2507 +2739 5 2 1 1 2127 1483 1767 2507 2128 1484 1768 2508 +2740 5 2 1 1 2128 1484 1768 2508 1015 854 925 1110 +2741 5 2 1 1 226 387 287 481 1489 2133 1733 2509 +2742 5 2 1 1 1489 2133 1733 2509 1490 2134 1734 2510 +2743 5 2 1 1 1490 2134 1734 2510 1491 2135 1735 2511 +2744 5 2 1 1 1491 2135 1735 2511 1492 2136 1736 2512 +2745 5 2 1 1 1492 2136 1736 2512 856 1017 917 1111 +2746 5 2 1 1 383 227 298 491 2117 1493 1777 2549 +2747 5 2 1 1 2117 1493 1777 2549 2118 1494 1778 2550 +2748 5 2 1 1 2118 1494 1778 2550 2119 1495 1779 2551 +2749 5 2 1 1 2119 1495 1779 2551 2120 1496 1780 2552 +2750 5 2 1 1 2120 1496 1780 2552 1013 857 928 1121 +2751 5 2 1 1 402 221 306 458 2193 1469 1809 2417 +2752 5 2 1 1 2193 1469 1809 2417 2194 1470 1810 2418 +2753 5 2 1 1 2194 1470 1810 2418 2195 1471 1811 2419 +2754 5 2 1 1 2195 1471 1811 2419 2196 1472 1812 2420 +2755 5 2 1 1 2196 1472 1812 2420 1032 851 936 1088 +2756 5 2 1 1 222 403 247 459 1473 2197 1573 2421 +2757 5 2 1 1 1473 2197 1573 2421 1474 2198 1574 2422 +2758 5 2 1 1 1474 2198 1574 2422 1475 2199 1575 2423 +2759 5 2 1 1 1475 2199 1575 2423 1476 2200 1576 2424 +2760 5 2 1 1 1476 2200 1576 2424 852 1033 877 1089 +2761 5 2 1 1 519 362 395 236 2661 2033 2165 1529 +2762 5 2 1 1 2661 2033 2165 1529 2662 2034 2166 1530 +2763 5 2 1 1 2662 2034 2166 1530 2663 2035 2167 1531 +2764 5 2 1 1 2663 2035 2167 1531 2664 2036 2168 1532 +2765 5 2 1 1 2664 2036 2168 1532 1149 992 1025 866 +2766 5 2 1 1 519 368 305 173 2661 2057 1805 1277 +2767 5 2 1 1 2661 2057 1805 1277 2662 2058 1806 1278 +2768 5 2 1 1 2662 2058 1806 1278 2663 2059 1807 1279 +2769 5 2 1 1 2663 2059 1807 1279 2664 2060 1808 1280 +2770 5 2 1 1 2664 2060 1808 1280 1149 998 935 803 +2771 5 2 1 1 519 236 455 368 2661 1529 2405 2057 +2772 5 2 1 1 2661 1529 2405 2057 2662 1530 2406 2058 +2773 5 2 1 1 2662 1530 2406 2058 2663 1531 2407 2059 +2774 5 2 1 1 2663 1531 2407 2059 2664 1532 2408 2060 +2775 5 2 1 1 2664 1532 2408 2060 1149 866 1085 998 +2776 5 2 1 1 223 408 294 467 1477 2217 1761 2453 +2777 5 2 1 1 1477 2217 1761 2453 1478 2218 1762 2454 +2778 5 2 1 1 1478 2218 1762 2454 1479 2219 1763 2455 +2779 5 2 1 1 1479 2219 1763 2455 1480 2220 1764 2456 +2780 5 2 1 1 1480 2220 1764 2456 853 1038 924 1097 +2781 5 2 1 1 398 504 443 262 2177 2601 2357 1633 +2782 5 2 1 1 2177 2601 2357 1633 2178 2602 2358 1634 +2783 5 2 1 1 2178 2602 2358 1634 2179 2603 2359 1635 +2784 5 2 1 1 2179 2603 2359 1635 2180 2604 2360 1636 +2785 5 2 1 1 2180 2604 2360 1636 1028 1134 1073 892 +2786 5 2 1 1 261 505 207 399 1629 2605 1413 2181 +2787 5 2 1 1 1629 2605 1413 2181 1630 2606 1414 2182 +2788 5 2 1 1 1630 2606 1414 2182 1631 2607 1415 2183 +2789 5 2 1 1 1631 2607 1415 2183 1632 2608 1416 2184 +2790 5 2 1 1 1632 2608 1416 2184 891 1135 837 1029 +2791 5 2 1 1 388 148 443 504 2137 1177 2357 2601 +2792 5 2 1 1 2137 1177 2357 2601 2138 1178 2358 2602 +2793 5 2 1 1 2138 1178 2358 2602 2139 1179 2359 2603 +2794 5 2 1 1 2139 1179 2359 2603 2140 1180 2360 2604 +2795 5 2 1 1 2140 1180 2360 2604 1018 778 1073 1134 +2796 5 2 1 1 505 147 289 390 2605 1173 1741 2145 +2797 5 2 1 1 2605 1173 1741 2145 2606 1174 1742 2146 +2798 5 2 1 1 2606 1174 1742 2146 2607 1175 1743 2147 +2799 5 2 1 1 2607 1175 1743 2147 2608 1176 1744 2148 +2800 5 2 1 1 2608 1176 1744 2148 1135 777 919 1020 +2801 5 2 1 1 227 383 150 530 1493 2117 1185 2705 +2802 5 2 1 1 1493 2117 1185 2705 1494 2118 1186 2706 +2803 5 2 1 1 1494 2118 1186 2706 1495 2119 1187 2707 +2804 5 2 1 1 1495 2119 1187 2707 1496 2120 1188 2708 +2805 5 2 1 1 1496 2120 1188 2708 857 1013 780 1160 +2806 5 2 1 1 380 532 317 244 2105 2713 1853 1561 +2807 5 2 1 1 2105 2713 1853 1561 2106 2714 1854 1562 +2808 5 2 1 1 2106 2714 1854 1562 2107 2715 1855 1563 +2809 5 2 1 1 2107 2715 1855 1563 2108 2716 1856 1564 +2810 5 2 1 1 2108 2716 1856 1564 1010 1162 947 874 +2811 5 2 1 1 534 226 490 382 2721 1489 2545 2113 +2812 5 2 1 1 2721 1489 2545 2113 2722 1490 2546 2114 +2813 5 2 1 1 2722 1490 2546 2114 2723 1491 2547 2115 +2814 5 2 1 1 2723 1491 2547 2115 2724 1492 2548 2116 +2815 5 2 1 1 2724 1492 2548 2116 1164 856 1120 1012 +2816 5 2 1 1 168 500 290 419 1257 2585 1745 2261 +2817 5 2 1 1 1257 2585 1745 2261 1258 2586 1746 2262 +2818 5 2 1 1 1258 2586 1746 2262 1259 2587 1747 2263 +2819 5 2 1 1 1259 2587 1747 2263 1260 2588 1748 2264 +2820 5 2 1 1 1260 2588 1748 2264 798 1130 920 1049 +2821 5 2 1 1 501 418 309 166 2589 2257 1821 1249 +2822 5 2 1 1 2589 2257 1821 1249 2590 2258 1822 1250 +2823 5 2 1 1 2590 2258 1822 1250 2591 2259 1823 1251 +2824 5 2 1 1 2591 2259 1823 1251 2592 2260 1824 1252 +2825 5 2 1 1 2592 2260 1824 1252 1131 1048 939 796 +2826 5 2 1 1 167 420 288 499 1253 2265 1737 2581 +2827 5 2 1 1 1253 2265 1737 2581 1254 2266 1738 2582 +2828 5 2 1 1 1254 2266 1738 2582 1255 2267 1739 2583 +2829 5 2 1 1 1255 2267 1739 2583 1256 2268 1740 2584 +2830 5 2 1 1 1256 2268 1740 2584 797 1050 918 1129 +2831 5 2 1 1 516 176 533 404 2649 1289 2717 2201 +2832 5 2 1 1 2649 1289 2717 2201 2650 1290 2718 2202 +2833 5 2 1 1 2650 1290 2718 2202 2651 1291 2719 2203 +2834 5 2 1 1 2651 1291 2719 2203 2652 1292 2720 2204 +2835 5 2 1 1 2652 1292 2720 2204 1146 806 1163 1034 +2836 5 2 1 1 174 527 230 515 1281 2693 1505 2645 +2837 5 2 1 1 1281 2693 1505 2645 1282 2694 1506 2646 +2838 5 2 1 1 1282 2694 1506 2646 1283 2695 1507 2647 +2839 5 2 1 1 1283 2695 1507 2647 1284 2696 1508 2648 +2840 5 2 1 1 1284 2696 1508 2648 804 1157 860 1145 +2841 5 2 1 1 175 525 228 517 1285 2685 1497 2653 +2842 5 2 1 1 1285 2685 1497 2653 1286 2686 1498 2654 +2843 5 2 1 1 1286 2686 1498 2654 1287 2687 1499 2655 +2844 5 2 1 1 1287 2687 1499 2655 1288 2688 1500 2656 +2845 5 2 1 1 1288 2688 1500 2656 805 1155 858 1147 +2846 5 2 1 1 245 526 229 405 1565 2689 1501 2205 +2847 5 2 1 1 1565 2689 1501 2205 1566 2690 1502 2206 +2848 5 2 1 1 1566 2690 1502 2206 1567 2691 1503 2207 +2849 5 2 1 1 1567 2691 1503 2207 1568 2692 1504 2208 +2850 5 2 1 1 1568 2692 1504 2208 875 1156 859 1035 +2851 5 2 1 1 528 404 533 246 2697 2201 2717 1569 +2852 5 2 1 1 2697 2201 2717 1569 2698 2202 2718 1570 +2853 5 2 1 1 2698 2202 2718 1570 2699 2203 2719 1571 +2854 5 2 1 1 2699 2203 2719 1571 2700 2204 2720 1572 +2855 5 2 1 1 2700 2204 2720 1572 1158 1034 1163 876 +2856 5 2 1 1 237 433 182 503 1533 2317 1313 2597 +2857 5 2 1 1 1533 2317 1313 2597 1534 2318 1314 2598 +2858 5 2 1 1 1534 2318 1314 2598 1535 2319 1315 2599 +2859 5 2 1 1 1535 2319 1315 2599 1536 2320 1316 2600 +2860 5 2 1 1 1536 2320 1316 2600 867 1063 812 1133 +2861 5 2 1 1 235 445 169 502 1525 2365 1261 2593 +2862 5 2 1 1 1525 2365 1261 2593 1526 2366 1262 2594 +2863 5 2 1 1 1526 2366 1262 2594 1527 2367 1263 2595 +2864 5 2 1 1 1527 2367 1263 2595 1528 2368 1264 2596 +2865 5 2 1 1 1528 2368 1264 2596 865 1075 799 1132 +2866 5 2 1 1 204 427 346 523 1401 2293 1969 2677 +2867 5 2 1 1 1401 2293 1969 2677 1402 2294 1970 2678 +2868 5 2 1 1 1402 2294 1970 2678 1403 2295 1971 2679 +2869 5 2 1 1 1403 2295 1971 2679 1404 2296 1972 2680 +2870 5 2 1 1 1404 2296 1972 2680 834 1057 976 1153 +2871 5 2 1 1 498 520 378 149 2577 2665 2097 1181 +2872 5 2 1 1 2577 2665 2097 1181 2578 2666 2098 1182 +2873 5 2 1 1 2578 2666 2098 1182 2579 2667 2099 1183 +2874 5 2 1 1 2579 2667 2099 1183 2580 2668 2100 1184 +2875 5 2 1 1 2580 2668 2100 1184 1128 1150 1008 779 +2876 5 2 1 1 461 520 498 251 2429 2665 2577 1589 +2877 5 2 1 1 2429 2665 2577 1589 2430 2666 2578 1590 +2878 5 2 1 1 2430 2666 2578 1590 2431 2667 2579 1591 +2879 5 2 1 1 2431 2667 2579 1591 2432 2668 2580 1592 +2880 5 2 1 1 2432 2668 2580 1592 1091 1150 1128 881 +2881 5 2 1 1 495 528 491 180 2565 2697 2549 1305 +2882 5 2 1 1 2565 2697 2549 1305 2566 2698 2550 1306 +2883 5 2 1 1 2566 2698 2550 1306 2567 2699 2551 1307 +2884 5 2 1 1 2567 2699 2551 1307 2568 2700 2552 1308 +2885 5 2 1 1 2568 2700 2552 1308 1125 1158 1121 810 +2886 5 2 1 1 181 494 230 527 1309 2561 1505 2693 +2887 5 2 1 1 1309 2561 1505 2693 1310 2562 1506 2694 +2888 5 2 1 1 1310 2562 1506 2694 1311 2563 1507 2695 +2889 5 2 1 1 1311 2563 1507 2695 1312 2564 1508 2696 +2890 5 2 1 1 1312 2564 1508 2696 811 1124 860 1157 +2891 5 2 1 1 493 526 490 178 2557 2689 2545 1297 +2892 5 2 1 1 2557 2689 2545 1297 2558 2690 2546 1298 +2893 5 2 1 1 2558 2690 2546 1298 2559 2691 2547 1299 +2894 5 2 1 1 2559 2691 2547 1299 2560 2692 2548 1300 +2895 5 2 1 1 2560 2692 2548 1300 1123 1156 1120 808 +2896 5 2 1 1 179 492 228 525 1301 2553 1497 2685 +2897 5 2 1 1 1301 2553 1497 2685 1302 2554 1498 2686 +2898 5 2 1 1 1302 2554 1498 2686 1303 2555 1499 2687 +2899 5 2 1 1 1303 2555 1499 2687 1304 2556 1500 2688 +2900 5 2 1 1 1304 2556 1500 2688 809 1122 858 1155 +2901 5 2 1 1 532 478 302 153 2713 2497 1793 1197 +2902 5 2 1 1 2713 2497 1793 1197 2714 2498 1794 1198 +2903 5 2 1 1 2714 2498 1794 1198 2715 2499 1795 1199 +2904 5 2 1 1 2715 2499 1795 1199 2716 2500 1796 1200 +2905 5 2 1 1 2716 2500 1796 1200 1162 1108 932 783 +2906 5 2 1 1 477 151 318 531 2493 1189 1857 2709 +2907 5 2 1 1 2493 1189 1857 2709 2494 1190 1858 2710 +2908 5 2 1 1 2494 1190 1858 2710 2495 1191 1859 2711 +2909 5 2 1 1 2495 1191 1859 2711 2496 1192 1860 2712 +2910 5 2 1 1 2496 1192 1860 2712 1107 781 948 1161 $EndElements diff --git a/simulations/default/main.cpp b/simulations/default/main.cpp index 0f49b110..75e642a6 100644 --- a/simulations/default/main.cpp +++ b/simulations/default/main.cpp @@ -3,27 +3,27 @@ using namespace sl; int main(void) -{ +{ // The domain regions as defined in 'disk.geo': int vol = 1, sur = 2, top = 3; - + // The mesh can be curved! mesh mymesh("disk.msh"); - + // Nodal shape functions 'h1' with 3 components. // Field u is the membrane deflection. field u("h1xyz"); // Use interpolation order 2 on 'vol', the whole domain: u.setorder(vol, 2); - + // Clamp on surface 'sur' (i.e. 0 valued-Dirichlet conditions): u.setconstraint(sur); - - // E is Young's modulus. nu is Poisson's ratio. + + // E is Young's modulus. nu is Poisson's ratio. parameter E, nu; E|vol = 150e9; nu|vol = 0.3; - + formulation elasticity; // The linear elasticity formulation is classical and thus predefined: @@ -33,7 +33,7 @@ int main(void) // Generate, solve and transfer the solution to field u: elasticity.solve(); - + // Write the deflection to ParaView .vtk format. // Write with an order 2 interpolation. Exaggerate the deflection by a factor 0.5e9. (0.5e9*u).write(vol, "u.vtk", 2); diff --git a/sparselizard.pdf b/sparselizard.pdf old mode 100755 new mode 100644