diff --git a/.gitignore b/.gitignore index 674933ff96a792eba653dd24786ca39fd513292f..70af320b4a8a6d4ca1b6aa767985288e9152ca8a 100644 --- a/.gitignore +++ b/.gitignore @@ -12,7 +12,7 @@ doc/doxygen/html *.so *.so.* *# - +*.pyc ## CLion directories .idea cmake-build-* diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 23ede5db32649e504a4b1c19e3d689a4e8d284eb..f0ed84a4942478e9628f314e9f891318b1e29a7b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -18,7 +18,7 @@ variables: # ---------------------------------------------- linux64_ci: - image: onelab/ubuntu18.04 + image: onelab/ubuntu18.10 script: - mkdir build - cd build @@ -34,7 +34,7 @@ linux64_ci: - tags linux64_compatibility_ci: - image: onelab/ubuntu18.04 + image: onelab/ubuntu18.10 script: - mkdir build - cd build @@ -44,7 +44,7 @@ linux64_compatibility_ci: - make -j 8 - cmake -DENABLE_POST=1 .. - make -j 8 - - cmake -DENABLE_MESH=1 .. + - cmake -DENABLE_MESH=1 -DENABLE_BUILD_DYNAMIC=1 -DENABLE_PRIVATE_API=1 -DENABLE_WRAP_PYTHON=1 .. - make -j 8 - rm -rf * - export CXXFLAGS=-std=c++98 @@ -309,7 +309,7 @@ macos64-sdk_official_release: # ---------------------------------------------- .source_official: &source_official - image: onelab/ubuntu18.04.simple + image: onelab/ubuntu18.10 only: - master@gmsh/gmsh <<: *ssh_config @@ -341,7 +341,7 @@ source_official_release: # ---------------------------------------------- doc_official_snapshot: - image: onelab/ubuntu18.04.simple + image: onelab/ubuntu18.10 only: - master@gmsh/gmsh <<: *ssh_config @@ -359,7 +359,7 @@ doc_official_snapshot: - tags doc_official_release: - image: onelab/ubuntu18.04.simple + image: onelab/ubuntu18.10 variables: EXTRA_OPTION: "-DGMSH_RELEASE=1" only: diff --git a/CHANGELOG.txt b/CHANGELOG.txt index eb09535a1ec3394df0f15a1e15e0b270cbe12efb..4de22a28cbfb95e0cfa13fa997b3af7494d36022 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,6 +1,18 @@ -4.2.3: added STL export by physical surface; added ability to remove embedded -entities; added handling of boundary entities in addDiscreteEntity; small bug -fixes. +4.4.0: added API support for color options, mesh optimization, recombination and +smoothing; changed getJacobians and getBasisFunctions API to specify integration +points explicitely; exposed additional METIS options; improved support for +periodic entities in legacy MSH2 format; small bug fixes. + +4.3.0 (April 19, 2019): improved meshing of surfaces with singular +parametrizations; added API support for aliasing and combining views, copying +view options, setting point coordinates, extruding built-in CAD entities along +normals and retrieving mass, center of mass and inertia from OpenCASCADE CAD +entities; fixed regression introduced in 4.1.4 that could lead to +non-deterministic 2D meshes; small bug fixes. + +4.2.3 (April 3, 2019): added STL export by physical surface; added ability to +remove embedded entities; added handling of boundary entities in +addDiscreteEntity; small bug fixes. 4.2.2 (March 13, 2019): fixed regression in reading of extruded meshes; added ability to export one solid per surface in STL format. diff --git a/CMakeLists.txt b/CMakeLists.txt index 0bf0cab473b0b70f84ca99f00ea1650d4f60b5dc..5ab6e553d1025c5bfd5673776ec4e5ea068ad781 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -38,7 +38,7 @@ opt(BLAS_LAPACK "Enable BLAS/Lapack for linear algebra (required for meshing)" O opt(BLOSSOM "Enable Blossom algorithm (needed for full quad meshing)" ${DEFAULT}) opt(BUILD_LIB "Enable 'lib' target for building static Gmsh library" OFF) opt(BUILD_SHARED "Enable 'shared' target for building shared Gmsh library" OFF) -opt(BUILD_DYNAMIC "Enable dynamic Gmsh executable (linked with shared lib)" OFF) +opt(BUILD_DYNAMIC "Enable dynamic Gmsh executable (linked with shared library)" OFF) opt(BUILD_ANDROID "Enable Android NDK library target (experimental)" OFF) opt(BUILD_IOS "Enable iOS library target (experimental)" OFF) opt(CGNS "Enable CGNS mesh import (experimental)" ${DEFAULT}) @@ -97,8 +97,8 @@ opt(WRAP_PYTHON "Enable generation of Python wrappers for private API" OFF) opt(ZIPPER "Enable Zip file compression/decompression" OFF) set(GMSH_MAJOR_VERSION 4) -set(GMSH_MINOR_VERSION 2) -set(GMSH_PATCH_VERSION 3) +set(GMSH_MINOR_VERSION 4) +set(GMSH_PATCH_VERSION 0) set(GMSH_EXTRA_VERSION "") set(GMSH_EXTRA_VERSION_TEXI "${GMSH_EXTRA_VERSION}") diff --git a/CREDITS.txt b/CREDITS.txt index d2b27b91e8a171bd13aa052d8e0460d39f3206c7..0b231c29bfbae7eb65b755a835ba2dcb944f2cd1 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -27,9 +27,10 @@ wrappers), Maxime Graulich (iOS/Android port), Francois Henrotte (onelab metamodels), Sebastian Eiser (PGF output), Alexis Salzman (compressed IO), Hang Si (TetGen/BR boundary recovery code), Fernando Lorenzo (Tochnog support), Larry Price (Gambit export), Anthony Royer (new partitioning code, MSH4 format), Darcy -Beurle (code cleanup and performance improvements), Zhidong Han (LSDYNA -output). See comments in the sources for more information. If we forgot to list -your contributions please send us an email! +Beurle (code cleanup and performance improvements), Zhidong Han (LSDYNA output); +Ismail Badia (Hierarchical basis functions). See comments in the sources for +more information. If we forgot to list your contributions please send us an +email! Thanks to the following folks who have contributed by providing fresh ideas on theoretical or programming topics, who have sent patches, requests for changes @@ -48,7 +49,7 @@ Laurent Van Miegroet, Shahrokh Ghavamian, Geordie McBain, Jose Paulo Moitinho de Almeida, Guillaume Demesy, Wendy Merks-Swolfs, Cosmin Stefan Deaconu, Nigel Nunn, Serban Georgescu, Julien Troufflard, Michele Mocciola, Matthijs Sypkens Smit, Sauli Ruuska, Romain Boman, Fredrik Ekre, Mark Burton, Max Orok, Paul -Cristini, Isuru Fernando. +Cristini, Isuru Fernando, Jose Paulo Moitinho de Almeida. Special thanks to Bill Spitzak, Michael Sweet, Matthias Melcher, Greg Ercolano and others for the Fast Light Tool Kit on which Gmsh's GUI is based. See diff --git a/Common/CommandLine.cpp b/Common/CommandLine.cpp index 73fa20fe2b5425229da801e0cf04f850f56b1d1b..b839003446920532b4f4fd7c2e19c3bdbc36333f 100644 --- a/Common/CommandLine.cpp +++ b/Common/CommandLine.cpp @@ -143,6 +143,7 @@ std::vector<std::pair<std::string, std::string> > GetUsage() s.push_back(mp("-new", "Create new model before merge next file")); s.push_back(mp("-merge", "Merge next files")); s.push_back(mp("-open", "Open next files")); + s.push_back(mp("-log filename", "Log all messages to filename")); #if defined(HAVE_FLTK) s.push_back(mp("-a, -g, -m, -s, -p", "Start in automatic, geometry, mesh, solver or " "post-processing mode")); @@ -429,8 +430,14 @@ void GetOptions(int argc, char *argv[], bool readConfigFiles, bool exitOnError) i++; } else if(!strcmp(argv[i] + 1, "log")) { - Msg::SetLogFile("gmsh.log"); i++; + if(argv[i]){ + Msg::SetLogFile(argv[i++]); + } + else{ + Msg::Error("Missing filename"); + if(exitOnError) Msg::Exit(1); + } } else if(!strcmp(argv[i] + 1, "refine")) { CTX::instance()->batch = 5; @@ -622,7 +629,12 @@ void GetOptions(int argc, char *argv[], bool readConfigFiles, bool exitOnError) } else if(!strcmp(argv[i] + 1, "debugSurface")) { i++; - CTX::instance()->debugSurface = atoi(argv[i++]); + if(argv[i]) + CTX::instance()->debugSurface = atoi(argv[i++]); + else{ + Msg::Error("Missing number"); + if(exitOnError) Msg::Exit(1); + } } else if(!strcmp(argv[i] + 1, "ho_max")) { i++; @@ -929,7 +941,7 @@ void GetOptions(int argc, char *argv[], bool readConfigFiles, bool exitOnError) if(argv[i]) { CTX::instance()->mesh.toleranceEdgeLength = atof(argv[i++]); if(CTX::instance()->mesh.toleranceEdgeLength <= 0.0){ - Msg::Error("Tolerance for model edge length must be > 0 (here %g)", + Msg::Error("Tolerance for model curve length must be > 0 (here %g)", CTX::instance()->mesh.toleranceEdgeLength); if(exitOnError) Msg::Exit(1); } diff --git a/Common/Context.h b/Common/Context.h index 66452a21a9be4f53cb9883debc03a6b723bcea10..3458328a3c4657650feb6b5438f831fa7392911b 100644 --- a/Common/Context.h +++ b/Common/Context.h @@ -33,6 +33,7 @@ struct contextMeshOptions { int order, secondOrderLinear, secondOrderIncomplete, secondOrderExperimental; int meshOnlyVisible, minCircPoints, minCurvPoints; int hoOptimize, hoPeriodic, hoNLayers, hoPrimSurfMesh, hoIterMax, hoPassMax; + int hoDistCAD; double hoThresholdMin, hoThresholdMax, hoPoissonRatio; std::map<int, int> algo2dPerFace; std::map<int, int> curvatureControlPerFace; @@ -44,7 +45,7 @@ struct contextMeshOptions { // mesh IO int fileFormat; double mshFileVersion, medFileMinorVersion, scalingFactor; - int medImportGroupsOfNodes; + int medImportGroupsOfNodes, medSingleModel; int saveAll, saveTri, saveGroupsOfNodes, binary, bdfFieldFormat; int unvStrictFormat, stlRemoveDuplicateTriangles, stlOneSolidPerSurface; int saveParametric, saveTopology, zoneDefinition; @@ -60,6 +61,8 @@ struct contextMeshOptions { int partitionPriWeight, partitionPyrWeight, partitionTrihWeight; int partitionOldStyleMsh2; int metisAlgorithm, metisEdgeMatching, metisRefinementAlgorithm; + int metisObjective, metisMinConn; + double metisMaxLoadImbalance; // mesh display int draw, changed, light, lightTwoSide, lightLines, pointType; int points, lines, triangles, quadrangles, tetrahedra, hexahedra, prisms; @@ -193,8 +196,8 @@ public: double min[3], max[3]; // "center of mass" of the current geometry, used for graphics only double cg[3]; - // characteristic length for the whole problem (never used in mesh - // generation ->only for geo/post) + // characteristic length for the whole problem, measuring the overall bounding + // box (used to set tolerances relative to the overall model size) double lc; // double buffer/antialias/stereo graphics? int db, antialiasing, stereo, camera; diff --git a/Common/DefaultOptions.h b/Common/DefaultOptions.h index 1bca221d6d4cd7335d46ce3ec1a494441b3b5d56..3e10e21043cb414df5c8f5c1049b2efee99ea183 100644 --- a/Common/DefaultOptions.h +++ b/Common/DefaultOptions.h @@ -146,8 +146,8 @@ StringXString GeometryOptions_String[] = { { F|O, "OCCTargetUnit" , opt_geometry_occ_target_unit , "" , "Length unit to which coordinates from STEP and IGES files are converted to when " - "imported by OpenCASCADE, e.g. 'M' for meters (leave empty to keep the unit defined " - "in the STEP and IGES file)"}, + "imported by OpenCASCADE, e.g. 'M' for meters (leave empty to use OpenCASCADE " + "default bahavior)"}, { 0, 0 , 0 , "" , 0 } } ; @@ -1068,6 +1068,8 @@ StringXNumber MeshOptions_Number[] = { "(between -1.0 and 0.5, excluded)"}, { F|O, "HighOrderPrimSurfMesh", opt_mesh_ho_prim_surf_mesh, 0, "Try to fix flipped surface mesh elements in high-order optimizer?"}, + { F|O, "HighOrderDistCAD", opt_mesh_ho_dist_cad, 0, + "Try to optimize distance to CAD in high-order optimizer?"}, { F|O, "HighOrderThresholdMin", opt_mesh_ho_threshold_min, 0.1, "Minimum threshold for high-order element optimization"}, { F|O, "HighOrderThresholdMax", opt_mesh_ho_threshold_max, 2.0, @@ -1102,11 +1104,17 @@ StringXNumber MeshOptions_Number[] = { { F|O, "MeshOnlyVisible" , opt_mesh_mesh_only_visible, 0. , "Mesh only visible entities (experimental: use with caution!)" }, { F|O, "MetisAlgorithm" , opt_mesh_partition_metis_algorithm, 1. , - "METIS partitioning algorithm (1: Recursive, 2: K-way)" }, + "METIS partitioning algorithm 'ptype' (1: Recursive, 2: K-way)" }, { F|O, "MetisEdgeMatching" , opt_mesh_partition_metis_edge_matching, 2. , - "METIS edge matching type (1: Random, 2: Sorted Heavy-Edge)" }, + "METIS edge matching type 'ctype' (1: Random, 2: Sorted Heavy-Edge)" }, + { F|O, "MetisMaxLoadImbalance" , opt_mesh_partition_metis_max_load_imbalance, -1. , + "METIS maximum load imbalance 'ufactor' (-1: default, i.e. 30 for K-way and 1 for Recursive)" }, + { F|O, "MetisObjective" , opt_mesh_partition_metis_objective, 1. , + "METIS objective type 'objtype' (1: min. edge-cut, 2: min. communication volume)" }, + { F|O, "MetisMinConn" , opt_mesh_partition_metis_min_conn, -1. , + "METIS minimize maximum connectivity of partitions 'minconn' (-1: default)" }, { F|O, "MetisRefinementAlgorithm" , opt_mesh_partition_metis_refinement_algorithm, 2. , - "METIS algorithm for k-way refinement (1: FM-based cut, 2: Greedy, " + "METIS algorithm for k-way refinement 'rtype' (1: FM-based cut, 2: Greedy, " "3: Two-sided node FM, 4: One-sided node FM)" }, { F|O, "MinimumCirclePoints" , opt_mesh_min_circ_points, 7. , "Minimum number of nodes used to mesh a circle (and number of nodes per 2*pi " @@ -1119,6 +1127,8 @@ StringXNumber MeshOptions_Number[] = { "Minor version of the MED file format to use (-1: use minor version of the MED library)" }, { F|O, "MedImportGroupsOfNodes" , opt_mesh_med_import_groups_of_nodes , 0. , "Import groups of nodes (0: no; 1: create geometrical point for each node)?" }, + { F|O, "MedSingleModel" , opt_mesh_med_single_model , 0. , + "Import MED meshes in the current model, even if several MED mesh names exist" }, { F|O, "PartitionHexWeight" , opt_mesh_partition_hex_weight , -1 , "Weight of hexahedral element for METIS load balancing (-1: automatic)" }, { F|O, "PartitionLineWeight" , opt_mesh_partition_line_weight , -1 , @@ -1221,7 +1231,7 @@ StringXNumber MeshOptions_Number[] = { "Preserve element numbering in MSH2 format (will break meshes with multiple " "physical groups for a single elementary entity)"}, { F|O, "IgnorePeriodicity" , opt_mesh_ignore_periodicity , 0. , - "Ignore alignment of periodic boundaries when reading the mesh " + "Ignore alignment of periodic boundaries when reading the mesh in MSH2 format " "(used by ParaView plugin)"}, #if defined(HAVE_BLOSSOM) { F|O, "RecombinationAlgorithm" , opt_mesh_algo_recombine , 1 , diff --git a/Common/GmshMessage.cpp b/Common/GmshMessage.cpp index 3d04bce579aadf9a73556bc9ba53898851ee0119..67299ceb5759776cd095d2b4ed5f86e06ab1d9f6 100644 --- a/Common/GmshMessage.cpp +++ b/Common/GmshMessage.cpp @@ -207,8 +207,11 @@ void Msg::SetLogFile(const std::string &name) { _logFileName = name; if(_logFile) fclose(_logFile); - if(name.size()) + if(name.size()){ _logFile = Fopen(name.c_str(), "w"); + if(!_logFile) + Msg::Error("Could not open file '%s'", name.c_str()); + } else _logFile = 0; } @@ -664,6 +667,21 @@ void Msg::Direct(const char *fmt, ...) } } +void Msg::Auto(const char *fmt, ...) +{ + char str[5000]; + va_list args; + va_start(args, fmt); + vsnprintf(str, sizeof(str), fmt, args); + va_end(args); + if(strstr(str, "Error") || strstr(str, "error")) + Msg::Error("%s", str); + else if(strstr(str, "Warning") || strstr(str, "warning")) + Msg::Warning("%s", str); + else + Msg::Info("%s", str); +} + void Msg::StatusBar(bool log, const char *fmt, ...) { if(GetVerbosity() < 4) return; diff --git a/Common/GmshMessage.h b/Common/GmshMessage.h index 08836cd617a1db90034276eef04658659d0a56c4..434ca25b4fca21b1690edad5751a7db745f635b1 100644 --- a/Common/GmshMessage.h +++ b/Common/GmshMessage.h @@ -94,6 +94,7 @@ public: static void Info(const char *fmt, ...); static void RequestRender(); static void Direct(const char *fmt, ...); + static void Auto(const char *fmt, ...); static void StatusBar(bool log, const char *fmt, ...); static void StatusGl(const char *fmt, ...); static void SetWindowTitle(const std::string &title); diff --git a/Common/OpenFile.cpp b/Common/OpenFile.cpp index 5ed2f4f1494f39428000de43a219bdaa6e12bdef..acf12ffe9cd86b0b4c3c2b9a6303d2cdbd4e1d93 100644 --- a/Common/OpenFile.cpp +++ b/Common/OpenFile.cpp @@ -415,7 +415,10 @@ int MergeFile(const std::string &fileName, bool warnIfMissing, } else if(ext == ".med" || ext == ".MED" || ext == ".mmed" || ext == ".MMED" || ext == ".rmed" || ext == ".RMED") { - status = GModel::readMED(fileName); + if(CTX::instance()->mesh.medSingleModel) + status = GModel::current()->readMED(fileName, 0); + else + status = GModel::readMED(fileName); mesh = true; #if defined(HAVE_POST) if(status > 1) status = PView::readMED(fileName); @@ -522,6 +525,9 @@ int MergeFile(const std::string &fileName, bool warnIfMissing, #endif } #if defined(HAVE_POST) + else if(ext == ".pch") { + status = PView::readPCH(fileName); + } else if(!strncmp(header, "$PostFormat", 11) || !strncmp(header, "$View", 5)) { status = PView::readPOS(fileName); diff --git a/Common/Options.cpp b/Common/Options.cpp index 28fa5983a3457699eedaa0445cad0ed9c3b643e6..0c5e6f8cd32bf25a587b3efa6347a4c118af93ed 100644 --- a/Common/Options.cpp +++ b/Common/Options.cpp @@ -5788,6 +5788,13 @@ double opt_mesh_med_import_groups_of_nodes(OPT_ARGS_NUM) return CTX::instance()->mesh.medImportGroupsOfNodes; } +double opt_mesh_med_single_model(OPT_ARGS_NUM) +{ + if(action & GMSH_SET) + CTX::instance()->mesh.medSingleModel = (int)val; + return CTX::instance()->mesh.medSingleModel; +} + double opt_mesh_partition_split_mesh_files(OPT_ARGS_NUM) { if(action & GMSH_SET) @@ -6237,6 +6244,13 @@ double opt_mesh_ho_prim_surf_mesh(OPT_ARGS_NUM) return CTX::instance()->mesh.hoPrimSurfMesh; } +double opt_mesh_ho_dist_cad(OPT_ARGS_NUM) +{ + if(action & GMSH_SET) + CTX::instance()->mesh.hoDistCAD = (int)val; + return CTX::instance()->mesh.hoDistCAD; +} + double opt_mesh_ho_iter_max(OPT_ARGS_NUM) { if(action & GMSH_SET) @@ -6503,35 +6517,46 @@ double opt_mesh_partition_num(OPT_ARGS_NUM) double opt_mesh_partition_metis_algorithm(OPT_ARGS_NUM) { - if(action & GMSH_SET) { - int ival = (int)val; - if(ival < 1 || ival > 2) - ival = (CTX::instance()->mesh.numPartitions <= 8) ? 1 : 2; - CTX::instance()->mesh.metisAlgorithm = ival; - } + if(action & GMSH_SET) + CTX::instance()->mesh.metisAlgorithm = (int)val; return CTX::instance()->mesh.metisAlgorithm; } double opt_mesh_partition_metis_edge_matching(OPT_ARGS_NUM) { - if(action & GMSH_SET) { - const int ival = (int)val; - CTX::instance()->mesh.metisEdgeMatching = - (ival < 1 || ival > 2) ? 2 : ival; - } + if(action & GMSH_SET) + CTX::instance()->mesh.metisEdgeMatching = (int)val; return CTX::instance()->mesh.metisEdgeMatching; } double opt_mesh_partition_metis_refinement_algorithm(OPT_ARGS_NUM) { - if(action & GMSH_SET) { - const int ival = (int)val; - CTX::instance()->mesh.metisRefinementAlgorithm = - (ival < 1 || ival > 4) ? 2 : ival; - } + if(action & GMSH_SET) + CTX::instance()->mesh.metisRefinementAlgorithm = (int)val; return CTX::instance()->mesh.metisRefinementAlgorithm; } +double opt_mesh_partition_metis_max_load_imbalance(OPT_ARGS_NUM) +{ + if(action & GMSH_SET) + CTX::instance()->mesh.metisMaxLoadImbalance = val; + return CTX::instance()->mesh.metisMaxLoadImbalance; +} + +double opt_mesh_partition_metis_objective(OPT_ARGS_NUM) +{ + if(action & GMSH_SET) + CTX::instance()->mesh.metisObjective = (int)val; + return CTX::instance()->mesh.metisObjective; +} + +double opt_mesh_partition_metis_min_conn(OPT_ARGS_NUM) +{ + if(action & GMSH_SET) + CTX::instance()->mesh.metisMinConn = (int)val; + return CTX::instance()->mesh.metisMinConn; +} + double opt_mesh_clip(OPT_ARGS_NUM) { if(action & GMSH_SET) diff --git a/Common/Options.h b/Common/Options.h index 2e4e1de017ba809f2fb011a4fc3e69079240016a..1f1d069089c410fae34a98ae739fcbc8047a5ebe 100644 --- a/Common/Options.h +++ b/Common/Options.h @@ -477,12 +477,16 @@ double opt_mesh_newton_convergence_test_xyz(OPT_ARGS_NUM); double opt_mesh_msh_file_version(OPT_ARGS_NUM); double opt_mesh_med_file_minor_version(OPT_ARGS_NUM); double opt_mesh_med_import_groups_of_nodes(OPT_ARGS_NUM); +double opt_mesh_med_single_model(OPT_ARGS_NUM); double opt_mesh_partition_split_mesh_files(OPT_ARGS_NUM); double opt_mesh_partition_save_topology_file(OPT_ARGS_NUM); double opt_mesh_partition_num(OPT_ARGS_NUM); double opt_mesh_partition_metis_algorithm(OPT_ARGS_NUM); double opt_mesh_partition_metis_edge_matching(OPT_ARGS_NUM); double opt_mesh_partition_metis_refinement_algorithm(OPT_ARGS_NUM); +double opt_mesh_partition_metis_max_load_imbalance(OPT_ARGS_NUM); +double opt_mesh_partition_metis_objective(OPT_ARGS_NUM); +double opt_mesh_partition_metis_min_conn(OPT_ARGS_NUM); double opt_mesh_partition_hex_weight(OPT_ARGS_NUM); double opt_mesh_partition_pri_weight(OPT_ARGS_NUM); double opt_mesh_partition_pyr_weight(OPT_ARGS_NUM); @@ -525,6 +529,7 @@ double opt_mesh_ho_threshold_min(OPT_ARGS_NUM); double opt_mesh_ho_threshold_max(OPT_ARGS_NUM); double opt_mesh_ho_poisson(OPT_ARGS_NUM); double opt_mesh_ho_prim_surf_mesh(OPT_ARGS_NUM); +double opt_mesh_ho_dist_cad(OPT_ARGS_NUM); double opt_mesh_ho_iter_max(OPT_ARGS_NUM); double opt_mesh_ho_pass_max(OPT_ARGS_NUM); double opt_mesh_second_order_experimental(OPT_ARGS_NUM); diff --git a/Common/gmsh.cpp b/Common/gmsh.cpp index 2631e537a6a8b5e0ae8dfeca3cc1d99fd7035671..e584d75d8305277fc456e3fe3978b53fad6014ec 100644 --- a/Common/gmsh.cpp +++ b/Common/gmsh.cpp @@ -42,7 +42,14 @@ #include "pyramidalBasis.h" #include "Numeric.h" #include "OS.h" - +#include "HierarchicalBasisH1Quad.h" +#include "HierarchicalBasisH1Tria.h" +#include "HierarchicalBasisH1Line.h" +#include "HierarchicalBasisH1Brick.h" +#include "HierarchicalBasisH1Tetra.h" +#include "HierarchicalBasisH1Pri.h" +#include "HierarchicalBasisHcurlQuad.h" +#include "HierarchicalBasisHcurlBrick.h" #if defined(HAVE_MESH) #include "Field.h" #include "meshGFaceOptimize.h" @@ -118,9 +125,7 @@ GMSH_API void gmsh::initialize(int argc, char **argv, bool readConfigFiles) GMSH_API void gmsh::finalize() { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } if(GmshFinalize()) { _argc = 0; if(_argv) delete[] _argv; @@ -134,36 +139,28 @@ GMSH_API void gmsh::finalize() GMSH_API void gmsh::open(const std::string &fileName) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } if(GmshOpenProject(fileName)) return; throw 1; } GMSH_API void gmsh::merge(const std::string &fileName) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } if(GmshMergeFile(fileName)) return; throw 1; } GMSH_API void gmsh::write(const std::string &fileName) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } if(GmshWriteFile(fileName)) return; throw 1; } GMSH_API void gmsh::clear() { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } if(GmshClearProject()) return; throw 1; } @@ -173,9 +170,7 @@ GMSH_API void gmsh::clear() GMSH_API void gmsh::option::setNumber(const std::string &name, const double value) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } std::string c, n; int i; SplitOptionName(name, c, n, i); @@ -185,9 +180,7 @@ GMSH_API void gmsh::option::setNumber(const std::string &name, GMSH_API void gmsh::option::getNumber(const std::string &name, double &value) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } std::string c, n; int i; SplitOptionName(name, c, n, i); @@ -198,9 +191,7 @@ GMSH_API void gmsh::option::getNumber(const std::string &name, double &value) GMSH_API void gmsh::option::setString(const std::string &name, const std::string &value) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } std::string c, n; int i; SplitOptionName(name, c, n, i); @@ -211,9 +202,7 @@ GMSH_API void gmsh::option::setString(const std::string &name, GMSH_API void gmsh::option::getString(const std::string &name, std::string &value) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } std::string c, n; int i; SplitOptionName(name, c, n, i); @@ -221,57 +210,73 @@ GMSH_API void gmsh::option::getString(const std::string &name, throw 1; } +GMSH_API void gmsh::option::setColor(const std::string &name, + const int r, const int g, + const int b, const int a) +{ + if(!_isInitialized()) { throw -1; } + std::string c, n; + int i; + SplitOptionName(name, c, n, i); + unsigned int value = CTX::instance()->packColor(r, g, b, a); + if(GmshSetOption(c, n, value, i)) return; + throw 1; +} + +GMSH_API void gmsh::option::getColor(const std::string &name, + int &r, int &g, + int &b, int &a) +{ + if(!_isInitialized()) { throw -1; } + std::string c, n; + int i; + SplitOptionName(name, c, n, i); + unsigned int value; + if(GmshGetOption(c, n, value, i)){ + r = CTX::instance()->unpackRed(value); + g = CTX::instance()->unpackGreen(value); + b = CTX::instance()->unpackBlue(value); + a = CTX::instance()->unpackAlpha(value); + return; + } + throw 1; +} + // gmsh::model GMSH_API void gmsh::model::add(const std::string &name) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } GModel *m = new GModel(name); - if(!m) { - throw 1; - } + if(!m) { throw 1; } } GMSH_API void gmsh::model::remove() { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } GModel *m = GModel::current(); - if(!m) { - throw 1; - } + if(!m) { throw 1; } delete m; } GMSH_API void gmsh::model::list(std::vector<std::string> &names) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } for(std::size_t i = 0; i < GModel::list.size(); i++) names.push_back(GModel::list[i]->getName()); } GMSH_API void gmsh::model::setCurrent(const std::string &name) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } GModel *m = GModel::findByName(name); - if(!m) { - throw 1; - } + if(!m) { throw 1; } GModel::setCurrent(m); } GMSH_API void gmsh::model::getEntities(vectorpair &dimTags, const int dim) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } dimTags.clear(); std::vector<GEntity *> entities; GModel::current()->getEntities(entities, dim); @@ -281,28 +286,22 @@ GMSH_API void gmsh::model::getEntities(vectorpair &dimTags, const int dim) } GMSH_API void gmsh::model::setEntityName(const int dim, const int tag, - const std::string &name) + const std::string &name) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } GModel::current()->setElementaryName(dim, tag, name); } GMSH_API void gmsh::model::getEntityName(const int dim, const int tag, std::string &name) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } name = GModel::current()->getElementaryName(dim, tag); } GMSH_API void gmsh::model::getPhysicalGroups(vectorpair &dimTags, const int dim) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } dimTags.clear(); std::map<int, std::vector<GEntity *> > groups[4]; GModel::current()->getPhysicalGroups(groups); @@ -333,9 +332,7 @@ GMSH_API void gmsh::model::getEntitiesForPhysicalGroup(const int dim, const int tag, std::vector<int> &tags) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } tags.clear(); std::map<int, std::vector<GEntity *> > groups; GModel::current()->getPhysicalGroups(dim, groups); @@ -354,9 +351,7 @@ GMSH_API void gmsh::model::getPhysicalGroupsForEntity(const int dim, const int tag, std::vector<int> &physicalTags) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } physicalTags.clear(); GEntity *ge = GModel::current()->getEntityByTag(dim, tag); if(!ge) { @@ -365,23 +360,27 @@ gmsh::model::getPhysicalGroupsForEntity(const int dim, const int tag, } std::vector<int> phy = ge->getPhysicalEntities(); physicalTags.resize(phy.size()); - for(std::size_t i = 0; i < phy.size(); i++) { - physicalTags[i] = phy[i]; - } + for(std::size_t i = 0; i < phy.size(); i++) { physicalTags[i] = phy[i]; } } GMSH_API int gmsh::model::addPhysicalGroup(const int dim, const std::vector<int> &tags, const int tag) { - if(!_isInitialized()) { - throw -1; - } + // FIXME: We currently still store the "original" physical groups in + // GEOInternals, because some operations in the built-in kernel directly + // manipulate physicals (most notably Coherence). Until we fully move the + // physicals to GModel, we need to add the physicals in GEOInternals and + // perform a hidden sync. + if(!_isInitialized()) { throw -1; } int outTag = tag; - if(outTag < 0) - outTag = GModel::current()->getGEOInternals()->getMaxPhysicalTag() + 1; - if(!GModel::current()->getGEOInternals()->modifyPhysicalGroup(dim, outTag, 0, - tags)) { + if(outTag < 0){ + outTag = std::max + (GModel::current()->getMaxPhysicalNumber(dim), + GModel::current()->getGEOInternals()->getMaxPhysicalTag()) + 1; + } + if(!GModel::current()->getGEOInternals()->modifyPhysicalGroup + (dim, outTag, 0, tags)) { throw 1; } GModel::current()->getGEOInternals()->synchronize(GModel::current()); @@ -391,18 +390,14 @@ GMSH_API int gmsh::model::addPhysicalGroup(const int dim, GMSH_API void gmsh::model::setPhysicalName(const int dim, const int tag, const std::string &name) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } GModel::current()->setPhysicalName(name, dim, tag); } GMSH_API void gmsh::model::getPhysicalName(const int dim, const int tag, std::string &name) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } name = GModel::current()->getPhysicalName(dim, tag); } @@ -411,9 +406,7 @@ GMSH_API void gmsh::model::getBoundary(const vectorpair &dimTags, const bool combined, const bool oriented, const bool recursive) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } outDimTags.clear(); if(!GModel::current()->getBoundaryTags(dimTags, outDimTags, combined, oriented, recursive)) { @@ -425,9 +418,7 @@ GMSH_API void gmsh::model::getEntitiesInBoundingBox( const double xmin, const double ymin, const double zmin, const double xmax, const double ymax, const double zmax, vectorpair &dimTags, const int dim) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } dimTags.clear(); SBoundingBox3d box(xmin, ymin, zmin, xmax, ymax, zmax); std::vector<GEntity *> entities; @@ -442,16 +433,12 @@ GMSH_API void gmsh::model::getBoundingBox(const int dim, const int tag, double &zmin, double &xmax, double &ymax, double &zmax) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } SBoundingBox3d box; if(dim < 0 && tag < 0) { box = GModel::current()->bounds(); - if(box.empty()) { - throw(3); - } + if(box.empty()) { throw(3); } } else { GEntity *ge = GModel::current()->getEntityByTag(dim, tag); @@ -461,9 +448,7 @@ GMSH_API void gmsh::model::getBoundingBox(const int dim, const int tag, } box = ge->bounds(); } - if(box.empty()) { - throw(3); - } + if(box.empty()) { throw(3); } xmin = box.min().x(); ymin = box.min().y(); zmin = box.min().z(); @@ -474,9 +459,7 @@ GMSH_API void gmsh::model::getBoundingBox(const int dim, const int tag, GMSH_API int gmsh::model::getDimension() { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } return GModel::current()->getDim(); } @@ -484,12 +467,10 @@ GMSH_API int gmsh::model::getDimension() GMSH_API int gmsh::model::addDiscreteEntity(const int dim, const int tag, const std::vector<int> &boundary) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } int outTag = tag; if(outTag < 0) { - outTag = GModel::current()->getMaxElementaryNumber(dim)+1; + outTag = GModel::current()->getMaxElementaryNumber(dim) + 1; } GEntity *e = GModel::current()->getEntityByTag(dim, outTag); if(e) { @@ -515,7 +496,7 @@ GMSH_API int gmsh::model::addDiscreteEntity(const int dim, const int tag, case 2: { discreteFace *gf = new discreteFace(GModel::current(), outTag); std::vector<int> tagEdges, signEdges; - for(std::size_t i = 0; i < boundary.size(); i++){ + for(std::size_t i = 0; i < boundary.size(); i++) { tagEdges.push_back(std::abs(boundary[i])); signEdges.push_back(gmsh_sign(boundary[i])); } @@ -526,7 +507,7 @@ GMSH_API int gmsh::model::addDiscreteEntity(const int dim, const int tag, case 3: { discreteRegion *gr = new discreteRegion(GModel::current(), outTag); std::vector<int> tagFaces, signFaces; - for(std::size_t i = 0; i < boundary.size(); i++){ + for(std::size_t i = 0; i < boundary.size(); i++) { tagFaces.push_back(std::abs(boundary[i])); signFaces.push_back(gmsh_sign(boundary[i])); } @@ -542,53 +523,44 @@ GMSH_API int gmsh::model::addDiscreteEntity(const int dim, const int tag, GMSH_API void gmsh::model::removeEntities(const vectorpair &dimTags, const bool recursive) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } GModel::current()->remove(dimTags, recursive); } GMSH_API void gmsh::model::removeEntityName(const std::string &name) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } GModel::current()->removeElementaryName(name); } GMSH_API void gmsh::model::removePhysicalGroups(const vectorpair &dimTags) { - if(!_isInitialized()) { - throw -1; - } - if(dimTags.empty()){ + if(!_isInitialized()) { throw -1; } + if(dimTags.empty()) { GModel::current()->getGEOInternals()->resetPhysicalGroups(); GModel::current()->removePhysicalGroups(); } - else{ + else { // FIXME: // - move the physical code from GEO factory to GModel: // if a mesh is loaded the GEO sync will re-create the group in GModel... // - rewrite the unerlying code: it's slow for(std::size_t i = 0; i < dimTags.size(); i++) - GModel::current()->removePhysicalGroup(dimTags[i].first, dimTags[i].second); + GModel::current()->removePhysicalGroup(dimTags[i].first, + dimTags[i].second); } } GMSH_API void gmsh::model::removePhysicalName(const std::string &name) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } GModel::current()->removePhysicalName(name); } GMSH_API void gmsh::model::getType(const int dim, const int tag, std::string &entityType) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } GEntity *ge = GModel::current()->getEntityByTag(dim, tag); if(!ge) { Msg::Error("%s does not exist", _getEntityName(dim, tag).c_str()); @@ -600,9 +572,7 @@ GMSH_API void gmsh::model::getType(const int dim, const int tag, GMSH_API void gmsh::model::getParent(const int dim, const int tag, int &parentDim, int &parentTag) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } parentDim = -1; parentTag = -1; GEntity *ge = GModel::current()->getEntityByTag(dim, tag); @@ -620,9 +590,7 @@ GMSH_API void gmsh::model::getParent(const int dim, const int tag, GMSH_API void gmsh::model::getPartitions(const int dim, const int tag, std::vector<int> &partitions) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } partitions.clear(); GEntity *ge = GModel::current()->getEntityByTag(dim, tag); if(!ge) { @@ -631,31 +599,28 @@ GMSH_API void gmsh::model::getPartitions(const int dim, const int tag, } std::vector<unsigned int> p; if(ge->geomType() == GEntity::PartitionPoint) - p = static_cast<partitionVertex*>(ge)->getPartitions(); + p = static_cast<partitionVertex *>(ge)->getPartitions(); else if(ge->geomType() == GEntity::PartitionCurve) - p = static_cast<partitionEdge*>(ge)->getPartitions(); + p = static_cast<partitionEdge *>(ge)->getPartitions(); else if(ge->geomType() == GEntity::PartitionSurface) - p = static_cast<partitionFace*>(ge)->getPartitions(); + p = static_cast<partitionFace *>(ge)->getPartitions(); else if(ge->geomType() == GEntity::PartitionVolume) - p = static_cast<partitionRegion*>(ge)->getPartitions(); + p = static_cast<partitionRegion *>(ge)->getPartitions(); else if(ge->geomType() == GEntity::GhostCurve) - p.push_back(static_cast<ghostEdge*>(ge)->getPartition()); + p.push_back(static_cast<ghostEdge *>(ge)->getPartition()); else if(ge->geomType() == GEntity::GhostSurface) - p.push_back(static_cast<ghostFace*>(ge)->getPartition()); + p.push_back(static_cast<ghostFace *>(ge)->getPartition()); else if(ge->geomType() == GEntity::GhostVolume) - p.push_back(static_cast<ghostRegion*>(ge)->getPartition()); + p.push_back(static_cast<ghostRegion *>(ge)->getPartition()); - for(std::size_t i = 0; i < p.size(); i++) - partitions.push_back(p[i]); + for(std::size_t i = 0; i < p.size(); i++) partitions.push_back(p[i]); } GMSH_API void gmsh::model::getValue(const int dim, const int tag, const std::vector<double> ¶metricCoord, std::vector<double> &points) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } points.clear(); GEntity *entity = GModel::current()->getEntityByTag(dim, tag); if(!entity) { @@ -694,9 +659,7 @@ gmsh::model::getDerivative(const int dim, const int tag, const std::vector<double> ¶metricCoord, std::vector<double> &deriv) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } deriv.clear(); GEntity *entity = GModel::current()->getEntityByTag(dim, tag); if(!entity) { @@ -733,9 +696,7 @@ gmsh::model::getCurvature(const int dim, const int tag, const std::vector<double> ¶metricCoord, std::vector<double> &curvatures) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } curvatures.clear(); GEntity *entity = GModel::current()->getEntityByTag(dim, tag); if(!entity) { @@ -762,9 +723,7 @@ GMSH_API void gmsh::model::getPrincipalCurvatures( std::vector<double> &curvaturesMax, std::vector<double> &curvaturesMin, std::vector<double> &directionsMax, std::vector<double> &directionsMin) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } GFace *gf = GModel::current()->getFaceByTag(tag); if(!gf) { Msg::Error("%s does not exist", _getEntityName(2, tag).c_str()); @@ -795,9 +754,7 @@ GMSH_API void gmsh::model::getNormal(const int tag, const std::vector<double> ¶metricCoord, std::vector<double> &normals) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } GFace *gf = GModel::current()->getFaceByTag(tag); if(!gf) { Msg::Error("%s does not exist", _getEntityName(2, tag).c_str()); @@ -815,15 +772,12 @@ GMSH_API void gmsh::model::getNormal(const int tag, } GMSH_API void gmsh::model::setVisibility(const vectorpair &dimTags, - const int value, - const bool recursive) + const int value, const bool recursive) { - if(!_isInitialized()) { - throw -1; - } - for(std::size_t i = 0; i < dimTags.size(); i++){ - GEntity *ge = GModel::current()->getEntityByTag - (dimTags[i].first, std::abs(dimTags[i].second)); + if(!_isInitialized()) { throw -1; } + for(std::size_t i = 0; i < dimTags.size(); i++) { + GEntity *ge = GModel::current()->getEntityByTag( + dimTags[i].first, std::abs(dimTags[i].second)); if(ge) ge->setVisibility(value, recursive); } } @@ -831,9 +785,7 @@ GMSH_API void gmsh::model::setVisibility(const vectorpair &dimTags, GMSH_API void gmsh::model::getVisibility(const int dim, const int tag, int &value) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } GEntity *ge = GModel::current()->getEntityByTag(dim, tag); if(!ge) { Msg::Error("%s does not exist", _getEntityName(dim, tag).c_str()); @@ -846,25 +798,21 @@ GMSH_API void gmsh::model::setColor(const vectorpair &dimTags, const int r, const int g, const int b, const int a, const bool recursive) { - if(!_isInitialized()) { - throw -1; - } - for(std::size_t i = 0; i < dimTags.size(); i++){ - GEntity *ge = GModel::current()->getEntityByTag - (dimTags[i].first, std::abs(dimTags[i].second)); - if(ge){ + if(!_isInitialized()) { throw -1; } + for(std::size_t i = 0; i < dimTags.size(); i++) { + GEntity *ge = GModel::current()->getEntityByTag( + dimTags[i].first, std::abs(dimTags[i].second)); + if(ge) { unsigned int val = CTX::instance()->packColor(r, g, b, a); ge->setColor(val, recursive); } } } -GMSH_API void gmsh::model::getColor(const int dim, const int tag, - int &r, int &g, int &b, int &a) +GMSH_API void gmsh::model::getColor(const int dim, const int tag, int &r, + int &g, int &b, int &a) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } GEntity *ge = GModel::current()->getEntityByTag(dim, tag); if(!ge) { Msg::Error("%s does not exist", _getEntityName(dim, tag).c_str()); @@ -877,22 +825,31 @@ GMSH_API void gmsh::model::getColor(const int dim, const int tag, a = CTX::instance()->unpackAlpha(value); } +GMSH_API void gmsh::model::setCoordinates(const int tag, const double x, + const double y, const double z) +{ + if(!_isInitialized()) { throw -1; } + GVertex *gv = GModel::current()->getVertexByTag(tag); + if(!gv) { + Msg::Error("%s does not exist", _getEntityName(0, tag).c_str()); + throw 2; + } + GPoint p(x, y, z); + gv->setPosition(p); +} + // gmsh::model::mesh GMSH_API void gmsh::model::mesh::generate(const int dim) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } GModel::current()->mesh(dim); CTX::instance()->mesh.changed = ENT_ALL; } GMSH_API void gmsh::model::mesh::partition(const int numPart) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } GModel::current()->partitionMesh( numPart >= 0 ? numPart : CTX::instance()->mesh.numPartitions); CTX::instance()->mesh.changed = ENT_ALL; @@ -900,34 +857,47 @@ GMSH_API void gmsh::model::mesh::partition(const int numPart) GMSH_API void gmsh::model::mesh::unpartition() { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } GModel::current()->unpartitionMesh(); CTX::instance()->mesh.changed = ENT_ALL; } GMSH_API void gmsh::model::mesh::refine() { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } GModel::current()->refineMesh(CTX::instance()->mesh.secondOrderLinear); CTX::instance()->mesh.changed = ENT_ALL; } +GMSH_API void gmsh::model::mesh::recombine() +{ + if(!_isInitialized()) { throw -1; } + GModel::current()->recombineMesh(); + CTX::instance()->mesh.changed = ENT_ALL; +} + +GMSH_API void gmsh::model::mesh::smooth() +{ + if(!_isInitialized()) { throw -1; } + GModel::current()->smoothMesh(); + CTX::instance()->mesh.changed = ENT_ALL; +} + +GMSH_API void gmsh::model::mesh::optimize(const std::string &how) +{ + if(!_isInitialized()) { throw -1; } + GModel::current()->optimizeMesh(how); + CTX::instance()->mesh.changed = ENT_ALL; +} + GMSH_API void gmsh::model::mesh::splitQuadrangles(const double quality, const int tag) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } #if defined(HAVE_MESH) std::vector<GEntity *> entities; - if(tag < 0){ - GModel::current()->getEntities(entities, 2); - } - else{ + if(tag < 0) { GModel::current()->getEntities(entities, 2); } + else { GEntity *ge = GModel::current()->getEntityByTag(2, tag); if(!ge) { Msg::Error("%s does not exist", _getEntityName(2, tag).c_str()); @@ -935,8 +905,8 @@ GMSH_API void gmsh::model::mesh::splitQuadrangles(const double quality, } entities.push_back(ge); } - for(std::size_t i = 0; i < entities.size(); i++){ - GFace *gf = static_cast<GFace*>(entities[i]); + for(std::size_t i = 0; i < entities.size(); i++) { + GFace *gf = static_cast<GFace *>(entities[i]); quadsToTriangles(gf, quality); } CTX::instance()->mesh.changed = ENT_ALL; @@ -948,9 +918,7 @@ GMSH_API void gmsh::model::mesh::splitQuadrangles(const double quality, GMSH_API void gmsh::model::mesh::setOrder(const int order) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } GModel::current()->setOrderN(order, CTX::instance()->mesh.secondOrderLinear, CTX::instance()->mesh.secondOrderIncomplete); CTX::instance()->mesh.changed = ENT_ALL; @@ -958,20 +926,17 @@ GMSH_API void gmsh::model::mesh::setOrder(const int order) GMSH_API void gmsh::model::mesh::getLastEntityError(vectorpair &dimTags) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } std::vector<GEntity *> e = GModel::current()->getLastMeshEntityError(); dimTags.clear(); for(std::size_t i = 0; i < e.size(); i++) dimTags.push_back(std::pair<int, int>(e[i]->dim(), e[i]->tag())); } -GMSH_API void gmsh::model::mesh::getLastNodeError(std::vector<std::size_t> &nodeTags) +GMSH_API void +gmsh::model::mesh::getLastNodeError(std::vector<std::size_t> &nodeTags) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } std::vector<MVertex *> v = GModel::current()->getLastMeshVertexError(); nodeTags.clear(); for(std::size_t i = 0; i < v.size(); i++) nodeTags.push_back(v[i]->getNum()); @@ -1036,7 +1001,7 @@ static void _getAdditionalNodesOnBoundary(GEntity *entity, else if(entity->dim() == 1 && parametric) { double param; if(!reparamMeshVertexOnEdge(v, (GEdge *)entity, param)) - Msg::Warning("Failed to compute parameters of node %d on edge %d", + Msg::Warning("Failed to compute parameters of node %d on curve %d", v->getNum(), entity->tag()); parametricCoord.push_back(param); } @@ -1048,11 +1013,10 @@ GMSH_API void gmsh::model::mesh::getNodes(std::vector<std::size_t> &nodeTags, std::vector<double> &coord, std::vector<double> ¶metricCoord, const int dim, const int tag, - const bool includeBoundary) + const bool includeBoundary, + const bool returnParametricCoord) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } nodeTags.clear(); coord.clear(); parametricCoord.clear(); @@ -1076,7 +1040,7 @@ GMSH_API void gmsh::model::mesh::getNodes(std::vector<std::size_t> &nodeTags, coord.push_back(v->x()); coord.push_back(v->y()); coord.push_back(v->z()); - if(dim > 0) { + if(dim > 0 && returnParametricCoord) { double par; for(int k = 0; k < dim; k++) { if(v->getParameter(k, par)) parametricCoord.push_back(par); @@ -1085,7 +1049,7 @@ GMSH_API void gmsh::model::mesh::getNodes(std::vector<std::size_t> &nodeTags, } if(includeBoundary) _getAdditionalNodesOnBoundary(ge, nodeTags, coord, parametricCoord, - dim > 0); + dim > 0 && returnParametricCoord); } } @@ -1093,9 +1057,7 @@ GMSH_API void gmsh::model::mesh::getNode(const std::size_t nodeTag, std::vector<double> &coord, std::vector<double> ¶metricCoord) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } MVertex *v = GModel::current()->getMeshVertexByTag(nodeTag); if(!v) { Msg::Error("Unknown node %d", nodeTag); @@ -1113,9 +1075,7 @@ GMSH_API void gmsh::model::mesh::getNode(const std::size_t nodeTag, GMSH_API void gmsh::model::mesh::rebuildNodeCache(bool onlyIfNecessary) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } GModel::current()->rebuildMeshVertexCache(onlyIfNecessary); } @@ -1124,9 +1084,7 @@ gmsh::model::mesh::getNodesForPhysicalGroup(const int dim, const int tag, std::vector<std::size_t> &nodeTags, std::vector<double> &coord) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } nodeTags.clear(); coord.clear(); std::vector<MVertex *> v; @@ -1146,16 +1104,14 @@ GMSH_API void gmsh::model::mesh::setNodes( const int dim, const int tag, const std::vector<std::size_t> &nodeTags, const std::vector<double> &coord, const std::vector<double> ¶metricCoord) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } GEntity *ge = GModel::current()->getEntityByTag(dim, tag); if(!ge) { Msg::Error("%s does not exist", _getEntityName(dim, tag).c_str()); throw 2; } int numNodeTags = nodeTags.size(), numNodes = nodeTags.size(); - if(!numNodeTags){ // this is allowed: we will assign new tags + if(!numNodeTags) { // this is allowed: we will assign new tags numNodes = coord.size() / 3; } if((int)coord.size() != 3 * numNodes) { @@ -1195,18 +1151,13 @@ GMSH_API void gmsh::model::mesh::setNodes( GMSH_API void gmsh::model::mesh::reclassifyNodes() { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } GModel::current()->pruneMeshVertexAssociations(); } -GMSH_API void gmsh::model::mesh::relocateNodes(const int dim, - const int tag) +GMSH_API void gmsh::model::mesh::relocateNodes(const int dim, const int tag) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } std::vector<GEntity *> entities; if(dim >= 0 && tag >= 0) { GEntity *ge = GModel::current()->getEntityByTag(dim, tag); @@ -1223,9 +1174,9 @@ GMSH_API void gmsh::model::mesh::relocateNodes(const int dim, entities[i]->relocateMeshVertices(); } -static void _getEntitiesForElementTypes( - int dim, int tag, - std::map<int, std::vector<GEntity *> > &typeEnt) +static void +_getEntitiesForElementTypes(int dim, int tag, + std::map<int, std::vector<GEntity *> > &typeEnt) { std::vector<GEntity *> entities; if(dim >= 0 && tag >= 0) { @@ -1281,19 +1232,18 @@ static void _getEntitiesForElementTypes( GMSH_API void gmsh::model::mesh::getElements( std::vector<int> &elementTypes, std::vector<std::vector<std::size_t> > &elementTags, - std::vector<std::vector<std::size_t> > &nodeTags, - const int dim, const int tag) + std::vector<std::vector<std::size_t> > &nodeTags, const int dim, + const int tag) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } elementTypes.clear(); elementTags.clear(); nodeTags.clear(); std::map<int, std::vector<GEntity *> > typeEnt; _getEntitiesForElementTypes(dim, tag, typeEnt); for(std::map<int, std::vector<GEntity *> >::const_iterator it = - typeEnt.begin(); it != typeEnt.end(); it++) { + typeEnt.begin(); + it != typeEnt.end(); it++) { elementTypes.push_back(it->first); elementTags.push_back(std::vector<std::size_t>()); nodeTags.push_back(std::vector<std::size_t>()); @@ -1317,9 +1267,7 @@ GMSH_API void gmsh::model::mesh::getElement(const std::size_t elementTag, int &elementType, std::vector<std::size_t> &nodeTags) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } MElement *e = GModel::current()->getMeshElementByTag(elementTag); if(!e) { Msg::Error("Unknown element %d", elementTag); @@ -1339,13 +1287,12 @@ GMSH_API void gmsh::model::mesh::getElement(const std::size_t elementTag, GMSH_API void gmsh::model::mesh::getElementByCoordinates( const double x, const double y, const double z, std::size_t &elementTag, - int &elementType, std::vector<std::size_t> &nodeTags) + int &elementType, std::vector<std::size_t> &nodeTags, + double &u, double &v, double &w, const int dim, const bool strict) { - if(!_isInitialized()) { - throw -1; - } - SPoint3 p(x, y, z); - MElement *e = GModel::current()->getMeshElementByCoord(p); + if(!_isInitialized()) { throw -1; } + SPoint3 xyz(x, y, z), uvw; + MElement *e = GModel::current()->getMeshElementByCoord(xyz, uvw, dim, strict); if(!e) { Msg::Error("No element found at (%g, %g, %g)", x, y, z); throw 2; @@ -1361,11 +1308,13 @@ GMSH_API void gmsh::model::mesh::getElementByCoordinates( } nodeTags.push_back(v->getNum()); } + u = uvw.x(); + v = uvw.y(); + w = uvw.z(); } template <class T> -static void _addElements(int dim, int tag, - const std::vector<MElement *> &src, +static void _addElements(int dim, int tag, const std::vector<MElement *> &src, std::vector<T *> &dst) { for(std::size_t i = 0; i < src.size(); i++) @@ -1380,9 +1329,7 @@ static void _addElements(int dim, int tag, GEntity *ge, int type, if(!numNodesPerEle) return; std::size_t numEleTags = elementTags.size(); std::size_t numEle = numEleTags; - if(!numEle){ - numEle = nodeTags.size() / numNodesPerEle; - } + if(!numEle) { numEle = nodeTags.size() / numNodesPerEle; } if(!numEle) return; if(numEle * numNodesPerEle != nodeTags.size()) { Msg::Error("Wrong number of node tags for element type %d", type); @@ -1440,7 +1387,8 @@ static void _addElements(int dim, int tag, GEntity *ge, int type, break; } if(!ok) { - Msg::Error("Wrong type of element for %s", _getEntityName(dim, tag).c_str()); + Msg::Error("Wrong type of element for %s", + _getEntityName(dim, tag).c_str()); throw 2; } } @@ -1450,9 +1398,7 @@ GMSH_API void gmsh::model::mesh::setElements( const std::vector<std::vector<std::size_t> > &elementTags, const std::vector<std::vector<std::size_t> > &nodeTags) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } GEntity *ge = GModel::current()->getEntityByTag(dim, tag); if(!ge) { Msg::Error("%s does not exist", _getEntityName(dim, tag).c_str()); @@ -1477,9 +1423,7 @@ GMSH_API void gmsh::model::mesh::setElementsByType( const std::vector<std::size_t> &elementTags, const std::vector<std::size_t> &nodeTags) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } int dim = ElementType::getDimension(elementType); GEntity *ge = GModel::current()->getEntityByTag(dim, tag); if(!ge) { @@ -1492,14 +1436,13 @@ GMSH_API void gmsh::model::mesh::setElementsByType( GMSH_API void gmsh::model::mesh::getElementTypes(std::vector<int> &elementTypes, const int dim, const int tag) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } elementTypes.clear(); std::map<int, std::vector<GEntity *> > typeEnt; _getEntitiesForElementTypes(dim, tag, typeEnt); for(std::map<int, std::vector<GEntity *> >::const_iterator it = - typeEnt.begin(); it != typeEnt.end(); it++) { + typeEnt.begin(); + it != typeEnt.end(); it++) { elementTypes.push_back(it->first); } } @@ -1508,21 +1451,28 @@ GMSH_API int gmsh::model::mesh::getElementType(const std::string &family, const int order, const bool serendip) { - if(!_isInitialized()) { - throw -1; - } - int familyType = - (family == "point") ? TYPE_PNT : - (family == "line") ? TYPE_LIN : - (family == "triangle") ? TYPE_TRI : - (family == "quadrangle") ? TYPE_QUA : - (family == "tetrahedron") ? TYPE_TET : - (family == "pyramid") ? TYPE_PYR : - (family == "prism") ? TYPE_PRI : - (family == "hexahedron") ? TYPE_HEX : - (family == "polygon") ? TYPE_POLYG : - (family == "polyhedron") ? TYPE_POLYH : - (family == "trihedron") ? TYPE_TRIH : -1; + if(!_isInitialized()) { throw -1; } + int familyType = (family == "point") ? + TYPE_PNT : + (family == "line") ? + TYPE_LIN : + (family == "triangle") ? + TYPE_TRI : + (family == "quadrangle") ? + TYPE_QUA : + (family == "tetrahedron") ? + TYPE_TET : + (family == "pyramid") ? + TYPE_PYR : + (family == "prism") ? + TYPE_PRI : + (family == "hexahedron") ? + TYPE_HEX : + (family == "polygon") ? + TYPE_POLYG : + (family == "polyhedron") ? + TYPE_POLYH : + (family == "trihedron") ? TYPE_TRIH : -1; return ElementType::getType(familyType, order, serendip); } @@ -1530,9 +1480,7 @@ GMSH_API void gmsh::model::mesh::getElementProperties( const int elementType, std::string &name, int &dim, int &order, int &numNodes, std::vector<double> ¶metricCoord) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } const char *n; numNodes = MElement::getInfoMSH(elementType, &n); name = n; @@ -1551,17 +1499,12 @@ GMSH_API void gmsh::model::mesh::getElementProperties( delete basis; } -GMSH_API void -gmsh::model::mesh::getElementsByType(const int elementType, - std::vector<std::size_t> &elementTags, - std::vector<std::size_t> &nodeTags, - const int tag, - const std::size_t task, - const std::size_t numTasks) +GMSH_API void gmsh::model::mesh::getElementsByType( + const int elementType, std::vector<std::size_t> &elementTags, + std::vector<std::size_t> &nodeTags, const int tag, const std::size_t task, + const std::size_t numTasks) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } int dim = ElementType::getDimension(elementType); std::map<int, std::vector<GEntity *> > typeEnt; _getEntitiesForElementTypes(dim, tag, typeEnt); @@ -1571,7 +1514,7 @@ gmsh::model::mesh::getElementsByType(const int elementType, for(std::size_t i = 0; i < entities.size(); i++) numElements += entities[i]->getNumMeshElementsByType(familyType); const int numNodes = ElementType::getNumVertices(elementType); - if(!numTasks){ + if(!numTasks) { Msg::Error("Number of tasks should be > 0"); throw 4; } @@ -1582,8 +1525,8 @@ gmsh::model::mesh::getElementsByType(const int elementType, bool haveNodeTags = nodeTags.size(); if(!haveElementTags && !haveNodeTags) { if(numTasks > 1) - Msg::Error("ElementTags and nodeTags should be preallocated " - "if numTasks > 1"); + Msg::Warning("ElementTags and nodeTags should be preallocated " + "if numTasks > 1"); haveElementTags = haveNodeTags = true; preallocateElementsByType(elementType, haveElementTags, haveNodeTags, elementTags, nodeTags, tag); @@ -1602,8 +1545,7 @@ gmsh::model::mesh::getElementsByType(const int elementType, size_t idx = begin * numNodes; for(std::size_t i = 0; i < entities.size(); i++) { GEntity *ge = entities[i]; - for(std::size_t j = 0; j < ge->getNumMeshElementsByType(familyType); - j++) { + for(std::size_t j = 0; j < ge->getNumMeshElementsByType(familyType); j++) { if(o >= begin && o < end) { MElement *e = ge->getMeshElementByType(familyType, j); if(haveElementTags) elementTags[o] = e->getNum(); @@ -1623,9 +1565,7 @@ GMSH_API void gmsh::model::mesh::preallocateElementsByType( std::vector<std::size_t> &elementTags, std::vector<std::size_t> &nodeTags, const int tag) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } int dim = ElementType::getDimension(elementType); std::map<int, std::vector<GEntity *> > typeEnt; _getEntitiesForElementTypes(dim, tag, typeEnt); @@ -1645,12 +1585,32 @@ GMSH_API void gmsh::model::mesh::preallocateElementsByType( } } -static bool _getIntegrationInfo(const std::string &intType, - std::string &intName, int &intOrder) +static bool _getHierarchicalFunctionSpaceInfo(const std::string &fsType, + std::string &fsName, + int &basisOrder, int &fsComp) { - if(intType.substr(0, 5) == "Gauss") { - intName = "Gauss"; - intOrder = atoi(intType.substr(5).c_str()); + if(fsType.substr(0, 10) == "H1Legendre") { + fsComp = 1; + basisOrder = atoi(fsType.substr(10).c_str()); + fsName = "H1Legendre"; + return true; + } + if(fsType.substr(0, 14) == "GradH1Legendre") { + fsComp = 3; + basisOrder = atoi(fsType.substr(14).c_str()); + fsName = "GradH1Legendre"; + return true; + } + if(fsType.substr(0, 13) == "HcurlLegendre") { + fsComp = 3; + basisOrder = atoi(fsType.substr(13).c_str()); + fsName = "HcurlLegendre"; + return true; + } + if(fsType.substr(0, 17) == "CurlHcurlLegendre") { + fsComp = 3; + basisOrder = atoi(fsType.substr(17).c_str()); + fsName = "CurlHcurlLegendre"; return true; } return false; @@ -1682,44 +1642,28 @@ static bool _getFunctionSpaceInfo(const std::string &fsType, } GMSH_API void gmsh::model::mesh::getJacobians( - const int elementType, const std::string &integrationType, + const int elementType, const std::vector<double> &integrationPoints, std::vector<double> &jacobians, std::vector<double> &determinants, std::vector<double> &points, const int tag, const std::size_t task, const std::size_t numTasks) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } int dim = ElementType::getDimension(elementType); std::map<int, std::vector<GEntity *> > typeEnt; _getEntitiesForElementTypes(dim, tag, typeEnt); const std::vector<GEntity *> &entities(typeEnt[elementType]); - std::string intName = ""; - int intOrder = 0; - if(!_getIntegrationInfo(integrationType, intName, intOrder)) { - Msg::Error("Unknown quadrature type '%s'", integrationType.c_str()); - throw 2; - } - // get quadrature info int familyType = ElementType::getParentType(elementType); - fullMatrix<double> pts; - fullVector<double> weights; - gaussIntegration::get(familyType, intOrder, pts, weights); - if(pts.size1() != weights.size() || pts.size2() != 3) { - Msg::Error("Wrong integration point format"); - throw 3; - } - int numIntPoints = weights.size(); + int numIntegrationPoints = integrationPoints.size() / 3; // check arrays bool haveJacobians = jacobians.size(); bool haveDeterminants = determinants.size(); bool havePoints = points.size(); if(!haveDeterminants && !haveJacobians && !havePoints) { if(numTasks > 1) - Msg::Error("Jacobians, determinants and points should be preallocated " - "if numTasks > 1"); + Msg::Warning("Jacobians, determinants and points should be preallocated " + "if numTasks > 1"); haveJacobians = haveDeterminants = havePoints = true; - preallocateJacobians(elementType, integrationType, haveJacobians, + preallocateJacobians(elementType, numIntegrationPoints, haveJacobians, haveDeterminants, havePoints, jacobians, determinants, points, tag); } @@ -1730,31 +1674,31 @@ GMSH_API void gmsh::model::mesh::getJacobians( GEntity *ge = entities[i]; numElements += ge->getNumMeshElementsByType(familyType); } - if(!numTasks){ + if(!numTasks) { Msg::Error("Number of tasks should be > 0"); throw 4; } const size_t begin = (task * numElements) / numTasks; const size_t end = ((task + 1) * numElements) / numTasks; - if(haveDeterminants && (end * numIntPoints > determinants.size())) { + if(haveDeterminants && (end * numIntegrationPoints > determinants.size())) { Msg::Error("Wrong size of determinants array (%d < %d)", - determinants.size(), end * numIntPoints); + determinants.size(), end * numIntegrationPoints); throw 4; } - if(haveJacobians && (9 * end * numIntPoints > jacobians.size())) { + if(haveJacobians && (9 * end * numIntegrationPoints > jacobians.size())) { Msg::Error("Wrong size of jacobians array (%d < %d)", jacobians.size(), - 9 * end * numIntPoints); + 9 * end * numIntegrationPoints); throw 4; } - if(havePoints && (3 * end * numIntPoints > points.size())) { + if(havePoints && (3 * end * numIntegrationPoints > points.size())) { Msg::Error("Wrong size of points array (%d < %d)", points.size(), - 3 * end * numIntPoints); + 3 * end * numIntegrationPoints); throw 4; } if(haveDeterminants && haveJacobians && havePoints) { std::vector<std::vector<SVector3> > gsf; size_t o = 0; - size_t idx = begin * numIntPoints; + size_t idx = begin * numIntegrationPoints; for(std::size_t i = 0; i < entities.size(); i++) { GEntity *ge = entities[i]; for(std::size_t j = 0; j < ge->getNumMeshElementsByType(familyType); @@ -1762,10 +1706,12 @@ GMSH_API void gmsh::model::mesh::getJacobians( if(o >= begin && o < end) { MElement *e = ge->getMeshElementByType(familyType, j); if(gsf.size() == 0) { - gsf.resize(numIntPoints); - for(int k = 0; k < numIntPoints; k++) { + gsf.resize(numIntegrationPoints); + for(int k = 0; k < numIntegrationPoints; k++) { double value[1256][3]; - e->getGradShapeFunctions(pts(k, 0), pts(k, 1), pts(k, 2), + e->getGradShapeFunctions(integrationPoints[3 * k], + integrationPoints[3 * k + 1], + integrationPoints[3 * k + 2], value); gsf[k].resize(e->getNumShapeFunctions()); for(int l = 0; l < e->getNumShapeFunctions(); l++) { @@ -1775,8 +1721,10 @@ GMSH_API void gmsh::model::mesh::getJacobians( } } } - for(int k = 0; k < numIntPoints; k++) { - e->pnt(pts(k, 0), pts(k, 1), pts(k, 2), &points[idx * 3]); + for(int k = 0; k < numIntegrationPoints; k++) { + e->pnt(integrationPoints[3 * k], + integrationPoints[3 * k + 1], + integrationPoints[3 * k + 2], &points[idx * 3]); determinants[idx] = e->getJacobian(gsf[k], &jacobians[idx * 9]); idx++; } @@ -1788,7 +1736,7 @@ GMSH_API void gmsh::model::mesh::getJacobians( else if(haveDeterminants && haveJacobians && !havePoints) { std::vector<std::vector<SVector3> > gsf; size_t o = 0; - size_t idx = begin * numIntPoints; + size_t idx = begin * numIntegrationPoints; for(std::size_t i = 0; i < entities.size(); i++) { GEntity *ge = entities[i]; for(std::size_t j = 0; j < ge->getNumMeshElementsByType(familyType); @@ -1796,10 +1744,12 @@ GMSH_API void gmsh::model::mesh::getJacobians( if(o >= begin && o < end) { MElement *e = ge->getMeshElementByType(familyType, j); if(gsf.size() == 0) { - gsf.resize(numIntPoints); - for(int k = 0; k < numIntPoints; k++) { + gsf.resize(numIntegrationPoints); + for(int k = 0; k < numIntegrationPoints; k++) { double value[1256][3]; - e->getGradShapeFunctions(pts(k, 0), pts(k, 1), pts(k, 2), + e->getGradShapeFunctions(integrationPoints[3 * k], + integrationPoints[3 * k + 1], + integrationPoints[3 * k + 2], value); gsf[k].resize(e->getNumShapeFunctions()); for(int l = 0; l < e->getNumShapeFunctions(); l++) { @@ -1809,7 +1759,7 @@ GMSH_API void gmsh::model::mesh::getJacobians( } } } - for(int k = 0; k < numIntPoints; k++) { + for(int k = 0; k < numIntegrationPoints; k++) { determinants[idx] = e->getJacobian(gsf[k], &jacobians[idx * 9]); idx++; } @@ -1822,7 +1772,7 @@ GMSH_API void gmsh::model::mesh::getJacobians( std::vector<double> jac(9, 0.); std::vector<std::vector<SVector3> > gsf; size_t o = 0; - size_t idx = begin * numIntPoints; + size_t idx = begin * numIntegrationPoints; for(std::size_t i = 0; i < entities.size(); i++) { GEntity *ge = entities[i]; for(std::size_t j = 0; j < ge->getNumMeshElementsByType(familyType); @@ -1830,10 +1780,12 @@ GMSH_API void gmsh::model::mesh::getJacobians( if(o >= begin && o < end) { MElement *e = ge->getMeshElementByType(familyType, j); if(gsf.size() == 0) { - gsf.resize(numIntPoints); - for(int k = 0; k < numIntPoints; k++) { + gsf.resize(numIntegrationPoints); + for(int k = 0; k < numIntegrationPoints; k++) { double value[1256][3]; - e->getGradShapeFunctions(pts(k, 0), pts(k, 1), pts(k, 2), + e->getGradShapeFunctions(integrationPoints[3 * k], + integrationPoints[3 * k + 1], + integrationPoints[3 * k + 2], value); gsf[k].resize(e->getNumShapeFunctions()); for(int l = 0; l < e->getNumShapeFunctions(); l++) { @@ -1843,8 +1795,10 @@ GMSH_API void gmsh::model::mesh::getJacobians( } } } - for(int k = 0; k < numIntPoints; k++) { - e->pnt(pts(k, 0), pts(k, 1), pts(k, 2), &points[idx * 3]); + for(int k = 0; k < numIntegrationPoints; k++) { + e->pnt(integrationPoints[3 * k], + integrationPoints[3 * k + 1], + integrationPoints[3 * k + 2], &points[idx * 3]); determinants[idx] = e->getJacobian(gsf[k], &jac[0]); idx++; } @@ -1857,7 +1811,7 @@ GMSH_API void gmsh::model::mesh::getJacobians( std::vector<double> jac(9, 0.); std::vector<std::vector<SVector3> > gsf; size_t o = 0; - size_t idx = begin * numIntPoints; + size_t idx = begin * numIntegrationPoints; for(std::size_t i = 0; i < entities.size(); i++) { GEntity *ge = entities[i]; for(std::size_t j = 0; j < ge->getNumMeshElementsByType(familyType); @@ -1865,10 +1819,12 @@ GMSH_API void gmsh::model::mesh::getJacobians( if(o >= begin && o < end) { MElement *e = ge->getMeshElementByType(familyType, j); if(gsf.size() == 0) { - gsf.resize(numIntPoints); - for(int k = 0; k < numIntPoints; k++) { + gsf.resize(numIntegrationPoints); + for(int k = 0; k < numIntegrationPoints; k++) { double value[1256][3]; - e->getGradShapeFunctions(pts(k, 0), pts(k, 1), pts(k, 2), + e->getGradShapeFunctions(integrationPoints[3 * k], + integrationPoints[3 * k + 1], + integrationPoints[3 * k + 2], value); gsf[k].resize(e->getNumShapeFunctions()); for(int l = 0; l < e->getNumShapeFunctions(); l++) { @@ -1878,7 +1834,7 @@ GMSH_API void gmsh::model::mesh::getJacobians( } } } - for(int k = 0; k < numIntPoints; k++) { + for(int k = 0; k < numIntegrationPoints; k++) { determinants[idx] = e->getJacobian(gsf[k], &jac[0]); idx++; } @@ -1892,14 +1848,12 @@ GMSH_API void gmsh::model::mesh::getJacobians( } GMSH_API void gmsh::model::mesh::preallocateJacobians( - const int elementType, const std::string &integrationType, + const int elementType, const int numIntegrationPoints, const bool jacobian, const bool determinant, const bool point, std::vector<double> &jacobians, std::vector<double> &determinants, std::vector<double> &points, const int tag) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } int dim = ElementType::getDimension(elementType); std::map<int, std::vector<GEntity *> > typeEnt; _getEntitiesForElementTypes(dim, tag, typeEnt); @@ -1908,85 +1862,55 @@ GMSH_API void gmsh::model::mesh::preallocateJacobians( std::size_t numElements = 0; for(std::size_t i = 0; i < entities.size(); i++) numElements += entities[i]->getNumMeshElementsByType(familyType); - std::string intName = ""; - int intOrder = 0; - if(!_getIntegrationInfo(integrationType, intName, intOrder)) { - Msg::Error("Unknown quadrature type '%s'", integrationType.c_str()); - throw 2; - } - fullMatrix<double> pts; - fullVector<double> weights; - gaussIntegration::get(familyType, intOrder, pts, weights); - const std::size_t numIntPoints = weights.size(); if(jacobian) { jacobians.clear(); - jacobians.resize(9 * numElements * numIntPoints, 0.); + jacobians.resize(9 * numElements * numIntegrationPoints, 0.); } if(determinant) { determinants.clear(); - determinants.resize(numElements * numIntPoints, 0.); + determinants.resize(numElements * numIntegrationPoints, 0.); } if(point) { points.clear(); - points.resize(3 * numElements * numIntPoints, 0.); + points.resize(3 * numElements * numIntegrationPoints, 0.); } } GMSH_API void gmsh::model::mesh::getBasisFunctions( - const int elementType, const std::string &integrationType, - const std::string &functionSpaceType, std::vector<double> &integrationPoints, - int &numComponents, std::vector<double> &basisFunctions) + const int elementType, const std::vector<double> &integrationPoints, + const std::string &functionSpaceType, int &numComponents, + std::vector<double> &basisFunctions) { - if(!_isInitialized()) { - throw -1; - } - integrationPoints.clear(); + if(!_isInitialized()) { throw -1; } numComponents = 0; basisFunctions.clear(); - std::string intName = "", fsName = ""; - int intOrder = 0, fsOrder = 0; - if(!_getIntegrationInfo(integrationType, intName, intOrder)) { - Msg::Error("Unknown quadrature type '%s'", integrationType.c_str()); - throw 2; - } + std::string fsName = ""; + int fsOrder = 0; if(!_getFunctionSpaceInfo(functionSpaceType, fsName, fsOrder, numComponents)) { Msg::Error("Unknown function space type '%s'", functionSpaceType.c_str()); throw 2; } - // get quadrature info - int familyType = ElementType::getParentType(elementType); - fullMatrix<double> pts; - fullVector<double> weights; - gaussIntegration::get(familyType, intOrder, pts, weights); - if(pts.size1() != weights.size() || pts.size2() != 3) { - Msg::Error("Wrong integration point format"); - throw 3; - } - for(int i = 0; i < pts.size1(); i++) { - integrationPoints.push_back(pts(i, 0)); - integrationPoints.push_back(pts(i, 1)); - integrationPoints.push_back(pts(i, 2)); - integrationPoints.push_back(weights(i)); - } - // get function space info const nodalBasis *basis = 0; if(numComponents) { if(fsOrder == -1) { // isoparametric basis = BasisFactory::getNodalBasis(elementType); } else { + int familyType = ElementType::getParentType(elementType); int newType = ElementType::getType(familyType, fsOrder, false); basis = BasisFactory::getNodalBasis(newType); } } if(basis) { - int nq = weights.size(); + int nq = integrationPoints.size() / 3; int n = basis->getNumShapeFunctions(); basisFunctions.resize(n * numComponents * nq, 0.); double s[1256], ds[1256][3]; for(int i = 0; i < nq; i++) { - double u = pts(i, 0), v = pts(i, 1), w = pts(i, 2); + double u = integrationPoints[i * 3]; + double v = integrationPoints[i * 3 + 1]; + double w = integrationPoints[i * 3 + 2]; switch(numComponents) { case 1: basis->f(u, v, w, s); @@ -2005,11 +1929,542 @@ GMSH_API void gmsh::model::mesh::getBasisFunctions( } } -GMSH_API void gmsh::model::mesh::precomputeBasisFunctions(const int elementType) +GMSH_API void gmsh::model::mesh::getBasisFunctionsForElements( + const int elementType, const std::vector<double> &integrationPoints, + const std::string &functionSpaceType, int &numComponents, + int &numFunctionsPerElement, std::vector<double> &basisFunctions, + const int tag) { - if(!_isInitialized()) { - throw -1; + basisFunctions.clear(); + int basisOrder = 0; + std::string fsName = ""; + if(!_getHierarchicalFunctionSpaceInfo(functionSpaceType, fsName, basisOrder, + numComponents)) { + Msg::Error("Unknown function space type '%s'", functionSpaceType.c_str()); + throw 2; + } + int dim = ElementType::getDimension(elementType); + std::map<int, std::vector<GEntity *> > typeEnt; + _getEntitiesForElementTypes(dim, tag, typeEnt); + HierarchicalBasis *basis(0); + const std::vector<GEntity *> &entities(typeEnt[elementType]); + int familyType = ElementType::getParentType(elementType); + if(fsName == "H1Legendre" || fsName == "GradH1Legendre") { + switch(familyType) { + case TYPE_HEX: { + basis = new HierarchicalBasisH1Brick(basisOrder); + } break; + case TYPE_PRI: { + basis = new HierarchicalBasisH1Pri(basisOrder); + } break; + case TYPE_TET: { + basis = new HierarchicalBasisH1Tetra(basisOrder); + } break; + case TYPE_QUA: { + basis = new HierarchicalBasisH1Quad(basisOrder); + } break; + case TYPE_TRI: { + basis = new HierarchicalBasisH1Tria(basisOrder); + } break; + case TYPE_LIN: { + basis = new HierarchicalBasisH1Line(basisOrder); + } break; + default: Msg::Error("Unknown familyType "); throw 2; + } + } + else { + switch(familyType) { + case TYPE_QUA: { + basis = new HierarchicalBasisHcurlQuad(basisOrder); + } break; + case TYPE_HEX: { + basis = new HierarchicalBasisHcurlBrick(basisOrder); + } break; + default: Msg::Error("Unknown familyType "); throw 2; + } + } + int nq = integrationPoints.size() / 3; + int vSize = basis->getnVertexFunction(); + int bSize = basis->getnBubbleFunction(); + int eSize = basis->getnEdgeFunction(); + int fSize = basis->getnTriFaceFunction() + basis->getnQuadFaceFunction(); + numFunctionsPerElement = vSize + bSize + eSize + fSize; + // compute the number of Element : + std::size_t numElements = 0; + for(std::size_t i = 0; i < entities.size(); i++) { + GEntity *ge = entities[i]; + std::size_t numElementsInEntitie = ge->getNumMeshElementsByType(familyType); + numElements += numElementsInEntitie; + } + basisFunctions.resize( + numFunctionsPerElement * numElements * numComponents * nq, 0.); + int const1 = nq * numFunctionsPerElement * numComponents; + switch(numComponents) { + case 1: { + for(int i = 0; i < nq; i++) { + double u = integrationPoints[3 * i]; + double v = integrationPoints[3 * i + 1]; + double w = integrationPoints[3 * i + 2]; + std::vector<double> vTable(vSize); // Vertex functions of one element + std::vector<double> bTable(bSize); // bubble functions of one element + std::vector<double> fTable(fSize); // face functions of one element + std::vector<double> eTable(eSize); // edge functions of one element + basis->generateBasis(u, v, w, vTable, eTable, fTable, bTable); + size_t indexNumElement = 0; + int const2 = i * numFunctionsPerElement; + for(std::size_t ii = 0; ii < entities.size(); ii++) { + GEntity *ge = entities[ii]; + for(std::size_t j = 0; j < ge->getNumMeshElementsByType(familyType); + j++) { + std::size_t const3 = indexNumElement * const1 + const2; + MElement *e = ge->getMeshElementByType(familyType, j); + std::vector<double> eTableCopy( + eSize); // use eTableCopy to orient the edges + for(int r = 0; r < eSize; r++) { eTableCopy[r] = eTable[r]; } + if(eSize > 0) { + for(int jj = 0; jj < basis->getNumEdge(); jj++) { + MEdge edge = e->getEdge(jj); + int orientationFlag = 1; + if(edge.getMinVertex()->getNum() != + unsigned(e->getVertexSolin(jj, 0))) { + orientationFlag = -1; + } + else { + orientationFlag = 1; + } + basis->orientEdge(orientationFlag, jj, eTableCopy); + } + } + std::vector<double> fTableCopy(fSize); + for(int r = 0; r < fSize; r++) { fTableCopy[r] = fTable[r]; } + if(fSize > 0) { + for(int jj = 0; + jj < basis->getNumTriFace() + basis->getNumQuadFace(); jj++) { + MFace face = e->getFaceSolin(jj); + std::vector<int> faceOrientationFlag(3); + face.getOrientationFlagForFace(faceOrientationFlag); + basis->orientFace(u, v, w, faceOrientationFlag[0], + faceOrientationFlag[1], faceOrientationFlag[2], + jj, fTableCopy); + } + } + for(int k = 0; k < vSize; k++) { + basisFunctions[const3 + k] = vTable[k]; + } + std::size_t const4 = const3 + vSize; + for(int k = 0; k < eSize; k++) { + basisFunctions[const4 + k] = eTableCopy[k]; + } + std::size_t const5 = const4 + eSize; + for(int k = 0; k < fSize; k++) { + basisFunctions[const5 + k] = fTableCopy[k]; + } + std::size_t const6 = const5 + fSize; + for(int k = 0; k < bSize; k++) { + basisFunctions[const6 + k] = bTable[k]; + } + + indexNumElement++; + } + } + } + break; + } + case 3: { + int prod1 = vSize * numComponents; + int prod2 = eSize * numComponents; + int prod3 = fSize * numComponents; + for(int i = 0; i < nq; i++) { + double u = integrationPoints[3 * i]; + double v = integrationPoints[3 * i + 1]; + double w = integrationPoints[3 * i + 2]; + std::vector<std::vector<double> > gradientVertex( + vSize, std::vector<double>(3, 0.)); + std::vector<std::vector<double> > gradientEdge( + eSize, std::vector<double>(3, 0.)); + std::vector<std::vector<double> > gradientFace( + fSize, std::vector<double>(3, 0.)); + std::vector<std::vector<double> > gradientBubble( + bSize, std::vector<double>(3, 0.)); + basis->generateBasis(u, v, w, gradientVertex, gradientEdge, gradientFace, + gradientBubble, fsName); + int const2 = i * numFunctionsPerElement * numComponents; + size_t indexNumElement = 0; + for(std::size_t ii = 0; ii < entities.size(); ii++) { + GEntity *ge = entities[ii]; + for(std::size_t j = 0; j < ge->getNumMeshElementsByType(familyType); + j++) { + std::size_t const3 = indexNumElement * const1 + const2; + MElement *e = ge->getMeshElementByType(familyType, j); + std::vector<std::vector<double> > eTableCopy( + eSize, std::vector<double>(3, 0.)); + for(int r = 0; r < eSize; r++) { + eTableCopy[r][0] = gradientEdge[r][0]; + eTableCopy[r][1] = gradientEdge[r][1]; + eTableCopy[r][2] = gradientEdge[r][2]; + } + if(eSize > 0) { + for(int jj = 0; jj < basis->getNumEdge(); jj++) { + MEdge edge = e->getEdge(jj); + int orientationFlag = 1; + if(edge.getMinVertex()->getNum() != + unsigned(e->getVertexSolin(jj, 0))) { + orientationFlag = -1; + } + else { + orientationFlag = 1; + } + basis->orientEdge(orientationFlag, jj, eTableCopy); + } + } + std::vector<std::vector<double> > fTableCopy( + fSize, std::vector<double>(3, 0.)); + for(int r = 0; r < fSize; r++) { + fTableCopy[r][0] = gradientFace[r][0]; + fTableCopy[r][1] = gradientFace[r][1]; + fTableCopy[r][2] = gradientFace[r][2]; + } + if(fSize > 0) { + for(int jj = 0; + jj < basis->getNumTriFace() + basis->getNumQuadFace(); jj++) { + MFace face = e->getFaceSolin(jj); + std::vector<int> faceOrientationFlag(3); + face.getOrientationFlagForFace(faceOrientationFlag); + basis->orientFace(u, v, w, faceOrientationFlag[0], + faceOrientationFlag[1], faceOrientationFlag[2], + jj, fTableCopy, fsName); + } + } + std::size_t const4 = const3 + prod1; + std::size_t const5 = const4 + prod2; + std::size_t const6 = const5 + prod3; + for(int indexNumComp = 0; indexNumComp < numComponents; + indexNumComp++) { + for(int k = 0; k < vSize; k++) { + basisFunctions[const3 + k * numComponents + indexNumComp] = + gradientVertex[k][indexNumComp]; + } + for(int k = 0; k < eSize; k++) { + basisFunctions[const4 + k * numComponents + indexNumComp] = + eTableCopy[k][indexNumComp]; + } + for(int k = 0; k < fSize; k++) { + basisFunctions[const5 + k * numComponents + indexNumComp] = + fTableCopy[k][indexNumComp]; + } + for(int k = 0; k < bSize; k++) { + basisFunctions[const6 + k * numComponents + indexNumComp] = + gradientBubble[k][indexNumComp]; + } + } + indexNumElement++; + } + } + } + break; + } + } + delete basis; +} + +GMSH_API void gmsh::model::mesh::getKeysForElements( + const int elementType, const std::string &functionSpaceType, + gmsh::vectorpair &keys, std::vector<double> &coord, const int tag, + const bool generateCoord) +{ + if(!_isInitialized()) { throw -1; } + coord.clear(); + keys.clear(); + int order = 0; + int numComponents = 0; + std::string fsName = ""; + if(!_getHierarchicalFunctionSpaceInfo(functionSpaceType, fsName, order, + numComponents)) { + Msg::Error("Unknown function space type '%s'", functionSpaceType.c_str()); + throw 2; + } + int dim = ElementType::getDimension(elementType); + std::map<int, std::vector<GEntity *> > typeEnt; + _getEntitiesForElementTypes(dim, tag, typeEnt); + const std::vector<GEntity *> &entities(typeEnt[elementType]); + int familyType = ElementType::getParentType(elementType); + if(familyType == TYPE_PNT) { + GEntity *ge = entities[0]; + MElement *e = ge->getMeshElementByType(familyType, 0); + keys.push_back(std::pair<int, std::size_t>(0, e->getVertex(0)->getNum())); + coord.push_back(e->getVertex(0)->x()); + coord.push_back(e->getVertex(0)->y()); + coord.push_back(e->getVertex(0)->z()); } + + else { + HierarchicalBasis *basis(0); + if(fsName == "H1Legendre" || fsName == "GradH1Legendre") { + switch(familyType) { + case TYPE_HEX: { + basis = new HierarchicalBasisH1Brick(order); + } break; + case TYPE_PRI: { + basis = new HierarchicalBasisH1Pri(order); + } break; + case TYPE_TET: { + basis = new HierarchicalBasisH1Tetra(order); + } break; + case TYPE_QUA: { + basis = new HierarchicalBasisH1Quad(order); + } break; + case TYPE_TRI: { + basis = new HierarchicalBasisH1Tria(order); + } break; + case TYPE_LIN: { + basis = new HierarchicalBasisH1Line(order); + } break; + default: Msg::Error("Unknown familyType "); throw 2; + } + } + else { + switch(familyType) { + case TYPE_QUA: { + basis = new HierarchicalBasisHcurlQuad(order); + } break; + case TYPE_HEX: { + basis = new HierarchicalBasisHcurlBrick(order); + } break; + } + } + int vSize = basis->getnVertexFunction(); + int bSize = basis->getnBubbleFunction(); + int eSize = basis->getnEdgeFunction(); + int quadFSize = basis->getnQuadFaceFunction(); + int triFSize = basis->getnTriFaceFunction(); + int fSize = quadFSize + triFSize; + int numDofsPerElement = vSize + bSize + eSize + fSize; + int numberQuadFaces = basis->getNumQuadFace(); + int numberTriFaces = basis->getNumTriFace(); + int numTriFaceFunction = 0; + if(basis->getNumTriFace() != 0) { + numTriFaceFunction = + triFSize / + basis->getNumTriFace(); // number of Tri face functions for one face + } + int numQuadFaceFunction = 0; + if(basis->getNumQuadFace() != 0) { + numQuadFaceFunction = + quadFSize / + basis->getNumQuadFace(); // number of Tri face functions for one face + } + int numEdgeFunction = 0; + if(basis->getNumEdge() != 0) { + numEdgeFunction = + eSize / basis->getNumEdge(); // number of edge functions for one edge + } + int const1 = numEdgeFunction + 1; + int const2 = const1 + numQuadFaceFunction; + int const3 = const1 + numTriFaceFunction; + int const4 = bSize + std::max(const3, const2); + delete basis; + if(generateCoord) { + for(std::size_t i = 0; i < entities.size(); i++) { + GEntity *ge = entities[i]; + std::size_t numElementsInEntitie = + ge->getNumMeshElementsByType(familyType); + coord.reserve(coord.size() + + numElementsInEntitie * numDofsPerElement * 3); + keys.reserve(keys.size() + numElementsInEntitie * numDofsPerElement); + for(std::size_t j = 0; j < numElementsInEntitie; j++) { + MElement *e = ge->getMeshElementByType(familyType, j); + for(int k = 0; k < vSize; k++) { + keys.push_back( + std::pair<int, std::size_t>(0, e->getVertex(k)->getNum())); + coord.push_back(e->getVertex(k)->x()); + coord.push_back(e->getVertex(k)->y()); + coord.push_back(e->getVertex(k)->z()); + } + if(eSize > 0) { + for(int jj = 0; jj < e->getNumEdges(); jj++) { + MEdge edge = e->getEdge(jj); + MVertex *v1 = edge.getVertex(0); + MVertex *v2 = edge.getVertex(1); + std::vector<double> coordEdge(3); + coordEdge[0] = (v1->x() + v2->x()) / 2; + coordEdge[1] = (v1->y() + v2->y()) / 2; + coordEdge[2] = (v1->z() + v2->z()) / 2; + int edgeGlobalIndice = GModel::current()->addMEdge(edge); + for(int k = 1; k < const1; k++) { + keys.push_back( + std::pair<int, std::size_t>(k, edgeGlobalIndice)); + coord.push_back(coordEdge[0]); + coord.push_back(coordEdge[1]); + coord.push_back(coordEdge[2]); + } + } + } + // faces + if(fSize > 0) { + for(int jj = 0; jj < numberQuadFaces + numberTriFaces; jj++) { + // Number the faces + MFace face = e->getFaceSolin(jj); + std::vector<double> coordFace(3, 0); + for(std::size_t i = 0; i < face.getNumVertices(); i++) { + coordFace[0] += face.getVertex(i)->x(); + coordFace[1] += face.getVertex(i)->y(); + coordFace[2] += face.getVertex(i)->z(); + } + coordFace[0] = coordFace[0] / face.getNumVertices(); + coordFace[1] = coordFace[1] / face.getNumVertices(); + coordFace[2] = coordFace[2] / face.getNumVertices(); + int faceGlobalIndice = GModel::current()->addMFace(face); + int it2 = const2; + if(jj >= numberQuadFaces) { it2 = const3; } + for(int k = const1; k < it2; k++) { + keys.push_back( + std::pair<int, std::size_t>(k, faceGlobalIndice)); + coord.push_back(coordFace[0]); + coord.push_back(coordFace[1]); + coord.push_back(coordFace[2]); + } + } + } + if(bSize > 0) { + std::vector<double> bubbleCenterCoord(3, 0); + for(unsigned int k = 0; k < e->getNumVertices(); k++) { + bubbleCenterCoord[0] += e->getVertex(k)->x(); + bubbleCenterCoord[1] += e->getVertex(k)->y(); + bubbleCenterCoord[2] += e->getVertex(k)->z(); + } + bubbleCenterCoord[0] = bubbleCenterCoord[0] / e->getNumVertices(); + bubbleCenterCoord[1] = bubbleCenterCoord[1] / e->getNumVertices(); + bubbleCenterCoord[2] = bubbleCenterCoord[2] / e->getNumVertices(); + for(int k = std::max(const3, const2); k < const4; k++) { + keys.push_back(std::pair<int, std::size_t>(k, e->getNum())); + coord.push_back(bubbleCenterCoord[0]); + coord.push_back(bubbleCenterCoord[1]); + coord.push_back(bubbleCenterCoord[2]); + } + } + } + } + } + + else { + for(std::size_t i = 0; i < entities.size(); i++) { + GEntity *ge = entities[i]; + std::size_t numElementsInEntitie = + ge->getNumMeshElementsByType(familyType); + keys.reserve(keys.size() + numElementsInEntitie * numDofsPerElement); + for(std::size_t j = 0; j < numElementsInEntitie; j++) { + MElement *e = ge->getMeshElementByType(familyType, j); + for(int k = 0; k < vSize; k++) { + keys.push_back( + std::pair<int, std::size_t>(0, e->getVertex(k)->getNum())); + } + if(eSize > 0) { + for(int jj = 0; jj < e->getNumEdges(); jj++) { + MEdge edge = e->getEdge(jj); + int edgeGlobalIndice = GModel::current()->addMEdge(edge); + for(int k = 1; k < const1; k++) { + keys.push_back( + std::pair<int, std::size_t>(k, edgeGlobalIndice)); + } + } + } + // faces + if(fSize > 0) { + for(int jj = 0; jj < numberQuadFaces + numberTriFaces; jj++) { + // Number the faces + MFace face = e->getFaceSolin(jj); + int faceGlobalIndice = GModel::current()->addMFace(face); + int it2 = const2; + if(jj >= numberQuadFaces) { it2 = const3; } + for(int k = const1; k < it2; k++) { + keys.push_back( + std::pair<int, std::size_t>(k, faceGlobalIndice)); + } + } + } + if(bSize > 0) { + for(int k = std::max(const3, const2); k < const4; k++) { + keys.push_back(std::pair<int, std::size_t>(k, e->getNum())); + } + } + } + } + } + } +} + +GMSH_API void gmsh::model::mesh::getInformationForElements( + const gmsh::vectorpair &keys, gmsh::vectorpair &info, const int order, + const int elementType) +{ + // to modify! ,this function will return the global order! + int familyType = ElementType::getParentType(elementType); + switch(familyType) { + case TYPE_QUA: { + std::vector<int> bubbleOrder((order - 1) * (order - 1)); + int it = 0; + for(int n1 = 2; n1 <= order; n1++) { + for(int n2 = 2; n2 <= order; n2++) { + bubbleOrder[it] = n1 + n2; + it++; + } + } + int bnumElement = 0; + int it2 = 0; + for(std::size_t i = 0; i < keys.size(); i++) { + if(keys[i].first == 2) { info.push_back(std::pair<int, int>(2, 1)); } + else { + if(keys[i].first > 2 && keys[i].first < order + 2) { + info.push_back(std::pair<int, int>(keys[i].first, 2)); + } + else { + int numElement = keys[i].second; + if(numElement != bnumElement) { it2 = 0; } + info.push_back(std::pair<int, int>(bubbleOrder[it2], 4)); + it2++; + bnumElement = numElement; + } + } + } + } break; + case TYPE_TRI: { + int bnumElement = 0; + int it2 = 0; + std::vector<int> bubbleOrder(int((order - 1) * (order - 2) / 2)); + int it = 0; + for(int n1 = 1; n1 <= order - 2; n1++) { + for(int n2 = 1; n2 <= order - 1 - n1; n2++) { + bubbleOrder[it] = 1 + n1 + n2; + it++; + } + } + for(std::size_t i = 0; i < keys.size(); i++) { + if(keys[i].first == 2) { info.push_back(std::pair<int, int>(1, 1)); } + else { + if(keys[i].first > 2 && keys[i].first < order + 2) { + info.push_back(std::pair<int, int>(keys[i].first - 1, 2)); + } + else { + int numElement = keys[i].second; + if(numElement != bnumElement) { it2 = 0; } + info.push_back(std::pair<int, int>(bubbleOrder[it2], 4)); + it2++; + bnumElement = numElement; + } + } + } + + } break; + case TYPE_HEX: std::cout << "not done yet" << std::endl; break; + case TYPE_LIN: std::cout << "not done yet" << std::endl; break; + case TYPE_TET: std::cout << "not done yet" << std::endl; break; + default: Msg::Error("Unknown familyType "); throw 2; + } +} + +GMSH_API void gmsh::model::mesh::precomputeBasisFunctions(const int elementType) +{ + if(!_isInitialized()) { throw -1; } BasisFactory::getNodalBasis(elementType); } @@ -2018,9 +2473,7 @@ GMSH_API void gmsh::model::mesh::getBarycenters( std::vector<double> &barycenters, const std::size_t task, const std::size_t numTasks) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } int dim = ElementType::getDimension(elementType); std::map<int, std::vector<GEntity *> > typeEnt; _getEntitiesForElementTypes(dim, tag, typeEnt); @@ -2031,7 +2484,7 @@ GMSH_API void gmsh::model::mesh::getBarycenters( GEntity *ge = entities[i]; numElements += ge->getNumMeshElementsByType(familyType); } - if(!numTasks){ + if(!numTasks) { Msg::Error("Number of tasks should be > 0"); throw 4; } @@ -2039,7 +2492,7 @@ GMSH_API void gmsh::model::mesh::getBarycenters( const size_t end = ((task + 1) * numElements) / numTasks; if(3 * end > barycenters.size()) { if(numTasks > 1) - Msg::Error("Barycenters should be preallocated if numTasks > 1"); + Msg::Warning("Barycenters should be preallocated if numTasks > 1"); barycenters.resize(3 * numElements); } size_t o = 0; @@ -2078,12 +2531,54 @@ GMSH_API void gmsh::model::mesh::getBarycenters( } } +static bool _getIntegrationInfo(const std::string &intType, + std::string &intName, int &intOrder) +{ + if(intType.substr(0, 5) == "Gauss") { + intName = "Gauss"; + intOrder = atoi(intType.substr(5).c_str()); + return true; + } + return false; +} + +GMSH_API void gmsh::model::mesh::getIntegrationPoints( + const int elementType, const std::string &integrationType, + std::vector<double> &integrationPoints, + std::vector<double> &integrationWeigths) +{ + if(!_isInitialized()) { throw -1; } + integrationPoints.clear(); + integrationWeigths.clear(); + std::string intName = ""; + int intOrder = 0; + if(!_getIntegrationInfo(integrationType, intName, intOrder)) { + Msg::Error("Unknown quadrature type '%s'", integrationType.c_str()); + throw 2; + } + // get quadrature info + int familyType = ElementType::getParentType(elementType); + fullMatrix<double> pts; + fullVector<double> weights; + gaussIntegration::get(familyType, intOrder, pts, weights); + if(pts.size1() != weights.size() || pts.size2() != 3) { + Msg::Error("Wrong integration point format"); + throw 3; + } + integrationPoints.resize(3 * pts.size1()); + integrationWeigths.resize(pts.size1()); + for(int i = 0; i < pts.size1(); i++) { + integrationPoints[3 * i] = pts(i, 0); + integrationPoints[3 * i + 1] = pts(i, 1); + integrationPoints[3 * i + 2] = pts(i, 2); + integrationWeigths[i] = weights(i); + } +} + GMSH_API void gmsh::model::mesh::preallocateBarycenters( const int elementType, std::vector<double> &barycenters, const int tag) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } int dim = ElementType::getDimension(elementType); std::map<int, std::vector<GEntity *> > typeEnt; _getEntitiesForElementTypes(dim, tag, typeEnt); @@ -2097,13 +2592,10 @@ GMSH_API void gmsh::model::mesh::preallocateBarycenters( } GMSH_API void gmsh::model::mesh::getElementEdgeNodes( - const int elementType, std::vector<std::size_t> &nodeTags, - const int tag, const bool primary, - const std::size_t task, const std::size_t numTasks) + const int elementType, std::vector<std::size_t> &nodeTags, const int tag, + const bool primary, const std::size_t task, const std::size_t numTasks) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } int dim = ElementType::getDimension(elementType); std::map<int, std::vector<GEntity *> > typeEnt; _getEntitiesForElementTypes(dim, tag, typeEnt); @@ -2114,14 +2606,12 @@ GMSH_API void gmsh::model::mesh::getElementEdgeNodes( for(std::size_t i = 0; i < entities.size(); i++) { GEntity *ge = entities[i]; int n = ge->getNumMeshElementsByType(familyType); - if(n && !numNodesPerEdge){ + if(n && !numNodesPerEdge) { MElement *e = ge->getMeshElementByType(familyType, i); numEdgesPerEle = e->getNumEdges(); - if(primary){ - numNodesPerEdge = 2; - } - else{ - std::vector<MVertex*> v; + if(primary) { numNodesPerEdge = 2; } + else { + std::vector<MVertex *> v; // we could use e->getHighOrderEdge() here if we decide to remove // getEdgeVertices e->getEdgeVertices(0, v); @@ -2130,7 +2620,7 @@ GMSH_API void gmsh::model::mesh::getElementEdgeNodes( } numElements += n; } - if(!numTasks){ + if(!numTasks) { Msg::Error("Number of tasks should be > 0"); throw 4; } @@ -2138,7 +2628,7 @@ GMSH_API void gmsh::model::mesh::getElementEdgeNodes( const size_t end = ((task + 1) * numElements) / numTasks; if(numEdgesPerEle * numNodesPerEdge * end > nodeTags.size()) { if(numTasks > 1) - Msg::Error("Nodes should be preallocated if numTasks > 1"); + Msg::Warning("Nodes should be preallocated if numTasks > 1"); nodeTags.resize(numEdgesPerEle * numNodesPerEdge * numElements); } size_t o = 0; @@ -2148,13 +2638,13 @@ GMSH_API void gmsh::model::mesh::getElementEdgeNodes( for(std::size_t j = 0; j < ge->getNumMeshElementsByType(familyType); j++) { if(o >= begin && o < end) { MElement *e = ge->getMeshElementByType(familyType, j); - for(int k = 0; k < numEdgesPerEle; k++){ - std::vector<MVertex*> v; + for(int k = 0; k < numEdgesPerEle; k++) { + std::vector<MVertex *> v; // we could use e->getHighOrderEdge() here if we decide to remove // getEdgeVertices e->getEdgeVertices(k, v); std::size_t N = primary ? 2 : v.size(); - for(std::size_t l = 0; l < N; l++){ + for(std::size_t l = 0; l < N; l++) { nodeTags[idx++] = v[l]->getNum(); } } @@ -2165,14 +2655,11 @@ GMSH_API void gmsh::model::mesh::getElementEdgeNodes( } GMSH_API void gmsh::model::mesh::getElementFaceNodes( - const int elementType, const int faceType, - std::vector<std::size_t> &nodeTags, - const int tag, const bool primary, - const std::size_t task, const std::size_t numTasks) + const int elementType, const int faceType, std::vector<std::size_t> &nodeTags, + const int tag, const bool primary, const std::size_t task, + const std::size_t numTasks) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } int dim = ElementType::getDimension(elementType); std::map<int, std::vector<GEntity *> > typeEnt; _getEntitiesForElementTypes(dim, tag, typeEnt); @@ -2183,20 +2670,17 @@ GMSH_API void gmsh::model::mesh::getElementFaceNodes( for(std::size_t i = 0; i < entities.size(); i++) { GEntity *ge = entities[i]; int n = ge->getNumMeshElementsByType(familyType); - if(n && !numNodesPerFace){ + if(n && !numNodesPerFace) { MElement *e = ge->getMeshElementByType(familyType, i); int nf = e->getNumFaces(); numFacesPerEle = 0; - for(int j = 0; j < nf; j++){ + for(int j = 0; j < nf; j++) { MFace f = e->getFace(j); - if(faceType == (int)f.getNumVertices()) - numFacesPerEle++; - } - if(primary){ - numNodesPerFace = faceType; + if(faceType == (int)f.getNumVertices()) numFacesPerEle++; } - else{ - std::vector<MVertex*> v; + if(primary) { numNodesPerFace = faceType; } + else { + std::vector<MVertex *> v; // we could use e->getHighOrderFace() here if we decide to remove // getFaceVertices e->getFaceVertices(0, v); @@ -2205,7 +2689,7 @@ GMSH_API void gmsh::model::mesh::getElementFaceNodes( } numElements += n; } - if(!numTasks){ + if(!numTasks) { Msg::Error("Number of tasks should be > 0"); throw 4; } @@ -2213,7 +2697,7 @@ GMSH_API void gmsh::model::mesh::getElementFaceNodes( const size_t end = ((task + 1) * numElements) / numTasks; if(numFacesPerEle * numNodesPerFace * end > nodeTags.size()) { if(numTasks > 1) - Msg::Error("Nodes should be preallocated if numTasks > 1"); + Msg::Warning("Nodes should be preallocated if numTasks > 1"); nodeTags.resize(numFacesPerEle * numNodesPerFace * numElements); } size_t o = 0; @@ -2224,15 +2708,15 @@ GMSH_API void gmsh::model::mesh::getElementFaceNodes( if(o >= begin && o < end) { MElement *e = ge->getMeshElementByType(familyType, j); int nf = e->getNumFaces(); - for(int k = 0; k < nf; k++){ + for(int k = 0; k < nf; k++) { MFace f = e->getFace(k); if(faceType != (int)f.getNumVertices()) continue; - std::vector<MVertex*> v; + std::vector<MVertex *> v; // we could use e->getHighOrderFace() here if we decide to remove // getFaceVertices e->getFaceVertices(k, v); std::size_t N = primary ? faceType : v.size(); - for(std::size_t l = 0; l < N; l++){ + for(std::size_t l = 0; l < N; l++) { nodeTags[idx++] = v[l]->getNum(); } } @@ -2242,14 +2726,12 @@ GMSH_API void gmsh::model::mesh::getElementFaceNodes( } } -GMSH_API void gmsh::model::mesh::getGhostElements( - const int dim, const int tag, - std::vector<std::size_t> &elementTags, - std::vector<int> &partitions) +GMSH_API void +gmsh::model::mesh::getGhostElements(const int dim, const int tag, + std::vector<std::size_t> &elementTags, + std::vector<int> &partitions) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } elementTags.clear(); partitions.clear(); GEntity *ge = GModel::current()->getEntityByTag(dim, tag); @@ -2259,14 +2741,15 @@ GMSH_API void gmsh::model::mesh::getGhostElements( } std::map<MElement *, unsigned int> ghostCells; if(ge->geomType() == GEntity::GhostCurve) - ghostCells = static_cast<ghostEdge*>(ge)->getGhostCells(); + ghostCells = static_cast<ghostEdge *>(ge)->getGhostCells(); else if(ge->geomType() == GEntity::GhostSurface) - ghostCells = static_cast<ghostFace*>(ge)->getGhostCells(); + ghostCells = static_cast<ghostFace *>(ge)->getGhostCells(); else if(ge->geomType() == GEntity::GhostVolume) - ghostCells = static_cast<ghostRegion*>(ge)->getGhostCells(); + ghostCells = static_cast<ghostRegion *>(ge)->getGhostCells(); - for(std::map<MElement *, unsigned int>::const_iterator it = ghostCells.begin(); - it != ghostCells.end(); it++){ + for(std::map<MElement *, unsigned int>::const_iterator it = + ghostCells.begin(); + it != ghostCells.end(); it++) { elementTags.push_back(it->first->getNum()); partitions.push_back(it->second); } @@ -2281,9 +2764,7 @@ GMSH_API void gmsh::model::mesh::getGhostElements( GMSH_API void gmsh::model::mesh::setSize(const vectorpair &dimTags, const double size) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } for(std::size_t i = 0; i < dimTags.size(); i++) { int dim = dimTags[i].first, tag = dimTags[i].second; if(dim == 0) { @@ -2298,9 +2779,7 @@ gmsh::model::mesh::setTransfiniteCurve(const int tag, const int numNodes, const std::string &meshType, const double coef) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } GEdge *ge = GModel::current()->getEdgeByTag(tag); if(!ge) { Msg::Error("%s does not exist", _getEntityName(1, tag).c_str()); @@ -2322,9 +2801,7 @@ gmsh::model::mesh::setTransfiniteSurface(const int tag, const std::string &arrangement, const std::vector<int> &cornerTags) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } GFace *gf = GModel::current()->getFaceByTag(tag); if(!gf) { Msg::Error("%s does not exist", _getEntityName(2, tag).c_str()); @@ -2352,9 +2829,7 @@ GMSH_API void gmsh::model::mesh::setTransfiniteVolume(const int tag, const std::vector<int> &cornerTags) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } GRegion *gr = GModel::current()->getRegionByTag(tag); if(!gr) { Msg::Error("%s does not exist", _getEntityName(3, tag).c_str()); @@ -2371,12 +2846,8 @@ gmsh::model::mesh::setTransfiniteVolume(const int tag, GMSH_API void gmsh::model::mesh::setRecombine(const int dim, const int tag) { - if(!_isInitialized()) { - throw -1; - } - if(dim != 2) { - throw 2; - } + if(!_isInitialized()) { throw -1; } + if(dim != 2) { throw 2; } GFace *gf = GModel::current()->getFaceByTag(tag); if(!gf) { Msg::Error("%s does not exist", _getEntityName(dim, tag).c_str()); @@ -2389,12 +2860,8 @@ GMSH_API void gmsh::model::mesh::setRecombine(const int dim, const int tag) GMSH_API void gmsh::model::mesh::setSmoothing(const int dim, const int tag, const int val) { - if(!_isInitialized()) { - throw -1; - } - if(dim != 2) { - throw 2; - } + if(!_isInitialized()) { throw -1; } + if(dim != 2) { throw 2; } GFace *gf = GModel::current()->getFaceByTag(tag); if(!gf) { Msg::Error("%s does not exist", _getEntityName(dim, tag).c_str()); @@ -2406,9 +2873,7 @@ GMSH_API void gmsh::model::mesh::setSmoothing(const int dim, const int tag, GMSH_API void gmsh::model::mesh::setReverse(const int dim, const int tag, const bool val) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } if(dim == 1) { GEdge *ge = GModel::current()->getEdgeByTag(tag); if(!ge) { @@ -2429,9 +2894,7 @@ GMSH_API void gmsh::model::mesh::setReverse(const int dim, const int tag, GMSH_API void gmsh::model::mesh::setOutwardOrientation(const int tag) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } GRegion *gr = GModel::current()->getRegionByTag(tag); if(!gr) { Msg::Error("%s does not exist", _getEntityName(3, tag).c_str()); @@ -2444,9 +2907,7 @@ GMSH_API void gmsh::model::mesh::embed(const int dim, const std::vector<int> &tags, const int inDim, const int inTag) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } if(inDim == 2) { GFace *gf = GModel::current()->getFaceByTag(inTag); if(!gf) { @@ -2510,12 +2971,10 @@ GMSH_API void gmsh::model::mesh::embed(const int dim, GMSH_API void gmsh::model::mesh::removeEmbedded(const vectorpair &dimTags, const int rdim) { - if(!_isInitialized()) { - throw -1; - } - for(std::size_t i = 0; i < dimTags.size(); i++){ + if(!_isInitialized()) { throw -1; } + for(std::size_t i = 0; i < dimTags.size(); i++) { int dim = dimTags[i].first, tag = dimTags[i].second; - if(dim == 2){ + if(dim == 2) { GFace *gf = GModel::current()->getFaceByTag(tag); if(!gf) { Msg::Error("%s does not exist", _getEntityName(dim, tag).c_str()); @@ -2524,7 +2983,7 @@ GMSH_API void gmsh::model::mesh::removeEmbedded(const vectorpair &dimTags, if(rdim < 0 || rdim == 1) gf->embeddedEdges().clear(); if(rdim < 0 || rdim == 0) gf->embeddedVertices().clear(); } - else if(dimTags[i].first == 3){ + else if(dimTags[i].first == 3) { GRegion *gr = GModel::current()->getRegionByTag(tag); if(!gr) { Msg::Error("%s does not exist", _getEntityName(dim, tag).c_str()); @@ -2541,9 +3000,7 @@ GMSH_API void gmsh::model::mesh::reorderElements(const int elementType, const int tag, const std::vector<std::size_t> &ordering) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } int dim = ElementType::getDimension(elementType); std::map<int, std::vector<GEntity *> > typeEnt; _getEntitiesForElementTypes(dim, tag, typeEnt); @@ -2552,7 +3009,7 @@ gmsh::model::mesh::reorderElements(const int elementType, const int tag, Msg::Error("No elements to reorder"); throw 2; } - for(std::size_t i = 0; i < entities.size(); i++){ + for(std::size_t i = 0; i < entities.size(); i++) { if(!entities[i]->reorder(elementType, ordering)) { Msg::Error("Could not reorder elements"); throw 3; @@ -2562,17 +3019,13 @@ gmsh::model::mesh::reorderElements(const int elementType, const int tag, GMSH_API void gmsh::model::mesh::renumberNodes() { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } GModel::current()->renumberMeshVertices(); } GMSH_API void gmsh::model::mesh::renumberElements() { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } GModel::current()->renumberMeshElements(); } @@ -2581,9 +3034,7 @@ gmsh::model::mesh::setPeriodic(const int dim, const std::vector<int> &tags, const std::vector<int> &tagsMaster, const std::vector<double> &affineTransform) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } if(tags.size() != tagsMaster.size()) { Msg::Error("Incompatible number of tags and master tags for periodic mesh"); throw 2; @@ -2625,15 +3076,12 @@ gmsh::model::mesh::setPeriodic(const int dim, const std::vector<int> &tags, } } -GMSH_API void -gmsh::model::mesh::getPeriodicNodes(const int dim, const int tag, int &tagMaster, - std::vector<std::size_t> &nodeTags, - std::vector<std::size_t> &nodeTagsMaster, - std::vector<double> &affineTransform) +GMSH_API void gmsh::model::mesh::getPeriodicNodes( + const int dim, const int tag, int &tagMaster, + std::vector<std::size_t> &nodeTags, std::vector<std::size_t> &nodeTagsMaster, + std::vector<double> &affineTransform) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } GEntity *ge = GModel::current()->getEntityByTag(dim, tag); if(!ge) { Msg::Error("%s does not exist", _getEntityName(dim, tag).c_str()); @@ -2643,7 +3091,7 @@ gmsh::model::mesh::getPeriodicNodes(const int dim, const int tag, int &tagMaster tagMaster = ge->getMeshMaster()->tag(); for(std::map<MVertex *, MVertex *>::iterator it = ge->correspondingVertices.begin(); - it != ge->correspondingVertices.end(); ++it){ + it != ge->correspondingVertices.end(); ++it) { nodeTags.push_back(it->first->getNum()); nodeTagsMaster.push_back(it->second->getNum()); } @@ -2659,9 +3107,7 @@ gmsh::model::mesh::getPeriodicNodes(const int dim, const int tag, int &tagMaster GMSH_API void gmsh::model::mesh::removeDuplicateNodes() { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } GModel::current()->removeDuplicateMeshVertices( CTX::instance()->geom.tolerance); CTX::instance()->mesh.changed = ENT_ALL; @@ -2670,25 +3116,19 @@ GMSH_API void gmsh::model::mesh::removeDuplicateNodes() GMSH_API void gmsh::model::mesh::classifySurfaces(const double angle, const bool boundary) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } GModel::current()->classifyAllFaces(angle, boundary); } GMSH_API void gmsh::model::mesh::createTopology() { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } GModel::current()->createTopologyFromMesh(); } GMSH_API void gmsh::model::mesh::createGeometry() { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } GModel::current()->createGeometryOfDiscreteEntities(); } @@ -2697,9 +3137,7 @@ gmsh::model::mesh::computeHomology(const std::vector<int> &domainTags, const std::vector<int> &subdomainTags, const std::vector<int> &dims) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } GModel::current()->addHomologyRequest("Homology", domainTags, subdomainTags, dims); } @@ -2709,9 +3147,7 @@ gmsh::model::mesh::computeCohomology(const std::vector<int> &domainTags, const std::vector<int> &subdomainTags, const std::vector<int> &dims) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } GModel::current()->addHomologyRequest("Cohomology", domainTags, subdomainTags, dims); } @@ -2721,14 +3157,10 @@ gmsh::model::mesh::computeCohomology(const std::vector<int> &domainTags, GMSH_API int gmsh::model::mesh::field::add(const std::string &fieldType, const int tag) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } int outTag = tag; #if defined(HAVE_MESH) - if(outTag < 0) { - outTag = GModel::current()->getFields()->newId(); - } + if(outTag < 0) { outTag = GModel::current()->getFields()->newId(); } if(!GModel::current()->getFields()->newField(outTag, fieldType)) { Msg::Error("Cannot add Field %i of type '%s'", outTag, fieldType.c_str()); throw 1; @@ -2745,9 +3177,7 @@ GMSH_API int gmsh::model::mesh::field::add(const std::string &fieldType, GMSH_API void gmsh::model::mesh::field::remove(const int tag) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } #if defined(HAVE_MESH) GModel::current()->getFields()->deleteField(tag); #if defined(HAVE_FLTK) @@ -2781,14 +3211,10 @@ GMSH_API void gmsh::model::mesh::field::setNumber(const int tag, const std::string &option, const double value) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } #if defined(HAVE_MESH) FieldOption *o = _getFieldOption(tag, option); - if(!o) { - throw 1; - } + if(!o) { throw 1; } try { o->numericalValue(value); } catch(...) { @@ -2806,14 +3232,10 @@ GMSH_API void gmsh::model::mesh::field::setString(const int tag, const std::string &option, const std::string &value) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } #if defined(HAVE_MESH) FieldOption *o = _getFieldOption(tag, option); - if(!o) { - throw 1; - } + if(!o) { throw 1; } try { o->string(value); } catch(...) { @@ -2831,19 +3253,14 @@ GMSH_API void gmsh::model::mesh::field::setNumbers(const int tag, const std::string &option, const std::vector<double> &value) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } #if defined(HAVE_MESH) FieldOption *o = _getFieldOption(tag, option); - if(!o) { - throw 1; - } + if(!o) { throw 1; } try { if(o->getType() == FIELD_OPTION_LIST) { std::list<int> vl; - for(std::size_t i = 0; i < value.size(); i++) - vl.push_back((int)value[i]); + for(std::size_t i = 0; i < value.size(); i++) vl.push_back((int)value[i]); o->list(vl); } else { @@ -2864,9 +3281,7 @@ gmsh::model::mesh::field::setNumbers(const int tag, const std::string &option, GMSH_API void gmsh::model::mesh::field::setAsBackgroundMesh(const int tag) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } #if defined(HAVE_MESH) GModel::current()->getFields()->setBackgroundFieldId(tag); #else @@ -2877,9 +3292,7 @@ GMSH_API void gmsh::model::mesh::field::setAsBackgroundMesh(const int tag) GMSH_API void gmsh::model::mesh::field::setAsBoundaryLayer(const int tag) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } #if defined(HAVE_MESH) GModel::current()->getFields()->addBoundaryLayerFieldId(tag); #else @@ -2894,9 +3307,7 @@ GMSH_API int gmsh::model::geo::addPoint(const double x, const double y, const double z, const double meshSize, const int tag) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } int outTag = tag; double xx = CTX::instance()->geom.scalingFactor * x; double yy = CTX::instance()->geom.scalingFactor * y; @@ -2911,9 +3322,7 @@ GMSH_API int gmsh::model::geo::addPoint(const double x, const double y, GMSH_API int gmsh::model::geo::addLine(const int startTag, const int endTag, const int tag) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } int outTag = tag; if(!GModel::current()->getGEOInternals()->addLine(outTag, startTag, endTag)) { throw 1; @@ -2927,9 +3336,7 @@ GMSH_API int gmsh::model::geo::addCircleArc(const int startTag, const double nx, const double ny, const double nz) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } int outTag = tag; if(!GModel::current()->getGEOInternals()->addCircleArc( outTag, startTag, centerTag, endTag, nx, ny, nz)) { @@ -2942,9 +3349,7 @@ GMSH_API int gmsh::model::geo::addEllipseArc( const int startTag, const int centerTag, const int majorTag, const int endTag, const int tag, const double nx, const double ny, const double nz) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } int outTag = tag; if(!GModel::current()->getGEOInternals()->addEllipseArc( outTag, startTag, centerTag, majorTag, endTag, nx, ny, nz)) { @@ -2956,9 +3361,7 @@ GMSH_API int gmsh::model::geo::addEllipseArc( GMSH_API int gmsh::model::geo::addSpline(const std::vector<int> &pointTags, const int tag) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } int outTag = tag; if(!GModel::current()->getGEOInternals()->addSpline(outTag, pointTags)) { throw 1; @@ -2969,9 +3372,7 @@ GMSH_API int gmsh::model::geo::addSpline(const std::vector<int> &pointTags, GMSH_API int gmsh::model::geo::addBSpline(const std::vector<int> &pointTags, const int tag) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } int outTag = tag; if(!GModel::current()->getGEOInternals()->addBSpline(outTag, pointTags)) { throw 1; @@ -2982,9 +3383,7 @@ GMSH_API int gmsh::model::geo::addBSpline(const std::vector<int> &pointTags, GMSH_API int gmsh::model::geo::addBezier(const std::vector<int> &pointTags, const int tag) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } int outTag = tag; if(!GModel::current()->getGEOInternals()->addBezier(outTag, pointTags)) { throw 1; @@ -2995,9 +3394,7 @@ GMSH_API int gmsh::model::geo::addBezier(const std::vector<int> &pointTags, GMSH_API int gmsh::model::geo::addCurveLoop(const std::vector<int> &curveTags, const int tag) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } int outTag = tag; if(!GModel::current()->getGEOInternals()->addLineLoop(outTag, curveTags)) { throw 1; @@ -3008,9 +3405,7 @@ GMSH_API int gmsh::model::geo::addCurveLoop(const std::vector<int> &curveTags, GMSH_API int gmsh::model::geo::addPlaneSurface(const std::vector<int> &wireTags, const int tag) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } int outTag = tag; if(!GModel::current()->getGEOInternals()->addPlaneSurface(outTag, wireTags)) { throw 1; @@ -3022,9 +3417,7 @@ GMSH_API int gmsh::model::geo::addSurfaceFilling(const std::vector<int> &wireTags, const int tag, const int sphereCenterTag) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } int outTag = tag; if(!GModel::current()->getGEOInternals()->addSurfaceFilling( outTag, wireTags, sphereCenterTag)) { @@ -3037,9 +3430,7 @@ GMSH_API int gmsh::model::geo::addSurfaceLoop(const std::vector<int> &surfaceTags, const int tag) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } int outTag = tag; if(!GModel::current()->getGEOInternals()->addSurfaceLoop(outTag, surfaceTags)) { @@ -3051,9 +3442,7 @@ gmsh::model::geo::addSurfaceLoop(const std::vector<int> &surfaceTags, GMSH_API int gmsh::model::geo::addVolume(const std::vector<int> &shellTags, const int tag) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } int outTag = tag; if(!GModel::current()->getGEOInternals()->addVolume(outTag, shellTags)) { throw 1; @@ -3090,14 +3479,21 @@ GMSH_API void gmsh::model::geo::extrude(const vectorpair &dimTags, const std::vector<double> &heights, const bool recombine) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } outDimTags.clear(); - if(!GModel::current()->getGEOInternals()->extrude( - dimTags, dx, dy, dz, outDimTags, - _getExtrudeParams(numElements, heights, recombine))) { - throw 1; + if(dx || dy || dz){ + if(!GModel::current()->getGEOInternals()->extrude + (dimTags, dx, dy, dz, outDimTags, + _getExtrudeParams(numElements, heights, recombine))) { + throw 1; + } + } + else{ + if(!GModel::current()->getGEOInternals()->boundaryLayer + (dimTags, outDimTags, + _getExtrudeParams(numElements, heights, recombine))) { + throw 1; + } } } @@ -3107,9 +3503,7 @@ GMSH_API void gmsh::model::geo::revolve( vectorpair &outDimTags, const std::vector<int> &numElements, const std::vector<double> &heights, const bool recombine) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } outDimTags.clear(); if(!GModel::current()->getGEOInternals()->revolve( dimTags, x, y, z, ax, ay, az, angle, outDimTags, @@ -3125,9 +3519,7 @@ GMSH_API void gmsh::model::geo::twist( const std::vector<int> &numElements, const std::vector<double> &heights, const bool recombine) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } outDimTags.clear(); if(!GModel::current()->getGEOInternals()->twist( dimTags, x, y, z, dx, dy, dz, ax, ay, az, angle, outDimTags, @@ -3140,9 +3532,7 @@ GMSH_API void gmsh::model::geo::translate(const vectorpair &dimTags, const double dx, const double dy, const double dz) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } if(!GModel::current()->getGEOInternals()->translate(dimTags, dx, dy, dz)) { throw 1; } @@ -3154,9 +3544,7 @@ GMSH_API void gmsh::model::geo::rotate(const vectorpair &dimTags, const double ay, const double az, const double angle) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } if(!GModel::current()->getGEOInternals()->rotate(dimTags, x, y, z, ax, ay, az, angle)) { throw 1; @@ -3168,9 +3556,7 @@ GMSH_API void gmsh::model::geo::dilate(const vectorpair &dimTags, const double z, const double a, const double b, const double c) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } if(!GModel::current()->getGEOInternals()->dilate(dimTags, x, y, z, a, b, c)) { throw 1; } @@ -3180,9 +3566,7 @@ GMSH_API void gmsh::model::geo::symmetrize(const vectorpair &dimTags, const double a, const double b, const double c, const double d) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } if(!GModel::current()->getGEOInternals()->symmetry(dimTags, a, b, c, d)) { throw 1; } @@ -3191,9 +3575,7 @@ GMSH_API void gmsh::model::geo::symmetrize(const vectorpair &dimTags, GMSH_API void gmsh::model::geo::copy(const vectorpair &dimTags, vectorpair &outDimTags) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } outDimTags.clear(); if(!GModel::current()->getGEOInternals()->copy(dimTags, outDimTags)) { throw 1; @@ -3203,9 +3585,7 @@ GMSH_API void gmsh::model::geo::copy(const vectorpair &dimTags, GMSH_API void gmsh::model::geo::remove(const vectorpair &dimTags, const bool recursive) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } if(!GModel::current()->getGEOInternals()->remove(dimTags, recursive)) { throw 1; } @@ -3213,17 +3593,13 @@ GMSH_API void gmsh::model::geo::remove(const vectorpair &dimTags, GMSH_API void gmsh::model::geo::removeAllDuplicates() { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } GModel::current()->getGEOInternals()->removeAllDuplicates(); } GMSH_API void gmsh::model::geo::synchronize() { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } GModel::current()->getGEOInternals()->synchronize(GModel::current()); } @@ -3234,9 +3610,7 @@ gmsh::model::geo::mesh::setTransfiniteCurve(const int tag, const int nPoints, const std::string &meshType, const double coef) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } int t = (meshType == "Progression" || meshType == "Power") ? 1 : (meshType == "Bump") ? 2 : 1; @@ -3249,10 +3623,8 @@ gmsh::model::geo::mesh::setTransfiniteCurve(const int tag, const int nPoints, GMSH_API void gmsh::model::geo::mesh::setTransfiniteSurface( const int tag, const std::string &arrangement, const std::vector<int> &cornerTags) -{ - if(!_isInitialized()) { - throw -1; - } +{ + if(!_isInitialized()) { throw -1; } int t = (arrangement == "Right") ? 1 : (arrangement == "Left") ? -1 : @@ -3269,48 +3641,36 @@ GMSH_API void gmsh::model::geo::mesh::setTransfiniteVolume(const int tag, const std::vector<int> &cornerTags) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } GModel::current()->getGEOInternals()->setTransfiniteVolume(tag, cornerTags); } GMSH_API void gmsh::model::geo::mesh::setRecombine(const int dim, const int tag, const double angle) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } GModel::current()->getGEOInternals()->setRecombine(dim, tag, angle); } GMSH_API void gmsh::model::geo::mesh::setSmoothing(const int dim, const int tag, const int val) { - if(!_isInitialized()) { - throw -1; - } - if(dim != 2) { - throw 2; - } + if(!_isInitialized()) { throw -1; } + if(dim != 2) { throw 2; } GModel::current()->getGEOInternals()->setSmoothing(tag, val); } GMSH_API void gmsh::model::geo::mesh::setReverse(const int dim, const int tag, const bool val) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } GModel::current()->getGEOInternals()->setReverseMesh(dim, tag, val); } GMSH_API void gmsh::model::geo::mesh::setSize(const vectorpair &dimTags, const double size) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } for(std::size_t i = 0; i < dimTags.size(); i++) { int dim = dimTags[i].first, tag = dimTags[i].second; GModel::current()->getGEOInternals()->setMeshSize(dim, tag, size); @@ -3329,9 +3689,7 @@ GMSH_API int gmsh::model::occ::addPoint(const double x, const double y, const double z, const double meshSize, const int tag) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } _createOcc(); int outTag = tag; if(!GModel::current()->getOCCInternals()->addVertex(outTag, x, y, z, @@ -3344,9 +3702,7 @@ GMSH_API int gmsh::model::occ::addPoint(const double x, const double y, GMSH_API int gmsh::model::occ::addLine(const int startTag, const int endTag, const int tag) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } _createOcc(); int outTag = tag; if(!GModel::current()->getOCCInternals()->addLine(outTag, startTag, endTag)) { @@ -3359,9 +3715,7 @@ GMSH_API int gmsh::model::occ::addCircleArc(const int startTag, const int centerTag, const int endTag, const int tag) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } _createOcc(); int outTag = tag; if(!GModel::current()->getOCCInternals()->addCircleArc(outTag, startTag, @@ -3376,9 +3730,7 @@ GMSH_API int gmsh::model::occ::addCircle(const double x, const double y, const int tag, const double angle1, const double angle2) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } _createOcc(); int outTag = tag; if(!GModel::current()->getOCCInternals()->addCircle(outTag, x, y, z, r, @@ -3392,9 +3744,7 @@ GMSH_API int gmsh::model::occ::addEllipseArc(const int startTag, const int centerTag, const int endTag, const int tag) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } _createOcc(); int outTag = tag; if(!GModel::current()->getOCCInternals()->addEllipseArc(outTag, startTag, @@ -3410,9 +3760,7 @@ GMSH_API int gmsh::model::occ::addEllipse(const double x, const double y, const double angle1, const double angle2) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } _createOcc(); int outTag = tag; if(!GModel::current()->getOCCInternals()->addEllipse(outTag, x, y, z, r1, r2, @@ -3425,9 +3773,7 @@ GMSH_API int gmsh::model::occ::addEllipse(const double x, const double y, GMSH_API int gmsh::model::occ::addSpline(const std::vector<int> &pointTags, const int tag) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } _createOcc(); int outTag = tag; if(!GModel::current()->getOCCInternals()->addSpline(outTag, pointTags)) { @@ -3441,9 +3787,7 @@ GMSH_API int gmsh::model::occ::addBSpline( const std::vector<double> &weights, const std::vector<double> &knots, const std::vector<int> &multiplicities) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } int outTag = tag; if(!GModel::current()->getOCCInternals()->addBSpline( outTag, pointTags, degree, weights, knots, multiplicities)) { @@ -3455,9 +3799,7 @@ GMSH_API int gmsh::model::occ::addBSpline( GMSH_API int gmsh::model::occ::addBezier(const std::vector<int> &pointTags, const int tag) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } _createOcc(); int outTag = tag; if(!GModel::current()->getOCCInternals()->addBezier(outTag, pointTags)) { @@ -3469,9 +3811,7 @@ GMSH_API int gmsh::model::occ::addBezier(const std::vector<int> &pointTags, GMSH_API int gmsh::model::occ::addWire(const std::vector<int> &curveTags, const int tag, const bool checkClosed) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } _createOcc(); int outTag = tag; if(!GModel::current()->getOCCInternals()->addWire(outTag, curveTags, @@ -3484,9 +3824,7 @@ GMSH_API int gmsh::model::occ::addWire(const std::vector<int> &curveTags, GMSH_API int gmsh::model::occ::addCurveLoop(const std::vector<int> &curveTags, const int tag) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } _createOcc(); int outTag = tag; if(!GModel::current()->getOCCInternals()->addLineLoop(outTag, curveTags)) { @@ -3500,9 +3838,7 @@ GMSH_API int gmsh::model::occ::addRectangle(const double x, const double y, const double dy, const int tag, const double roundedRadius) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } _createOcc(); int outTag = tag; if(!GModel::current()->getOCCInternals()->addRectangle(outTag, x, y, z, dx, @@ -3516,9 +3852,7 @@ GMSH_API int gmsh::model::occ::addDisk(const double xc, const double yc, const double zc, const double rx, const double ry, const int tag) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } _createOcc(); int outTag = tag; if(!GModel::current()->getOCCInternals()->addDisk(outTag, xc, yc, zc, rx, @@ -3531,9 +3865,7 @@ GMSH_API int gmsh::model::occ::addDisk(const double xc, const double yc, GMSH_API int gmsh::model::occ::addPlaneSurface(const std::vector<int> &wireTags, const int tag) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } _createOcc(); int outTag = tag; if(!GModel::current()->getOCCInternals()->addPlaneSurface(outTag, wireTags)) { @@ -3542,17 +3874,15 @@ GMSH_API int gmsh::model::occ::addPlaneSurface(const std::vector<int> &wireTags, return outTag; } -GMSH_API int gmsh::model::occ::addSurfaceFilling(const int wireTag, - const int tag, - const std::vector<int> &pointTags) +GMSH_API int +gmsh::model::occ::addSurfaceFilling(const int wireTag, const int tag, + const std::vector<int> &pointTags) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } _createOcc(); int outTag = tag; - if(!GModel::current()->getOCCInternals()->addSurfaceFilling - (outTag, wireTag, pointTags)) { + if(!GModel::current()->getOCCInternals()->addSurfaceFilling(outTag, wireTag, + pointTags)) { throw 1; } return outTag; @@ -3562,9 +3892,7 @@ GMSH_API int gmsh::model::occ::addSurfaceLoop(const std::vector<int> &surfaceTags, const int tag) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } _createOcc(); int outTag = tag; if(!GModel::current()->getOCCInternals()->addSurfaceLoop(outTag, @@ -3577,9 +3905,7 @@ gmsh::model::occ::addSurfaceLoop(const std::vector<int> &surfaceTags, GMSH_API int gmsh::model::occ::addVolume(const std::vector<int> &shellTags, const int tag) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } _createOcc(); int outTag = tag; if(!GModel::current()->getOCCInternals()->addVolume(outTag, shellTags)) { @@ -3594,9 +3920,7 @@ GMSH_API int gmsh::model::occ::addSphere(const double xc, const double yc, const double angle2, const double angle3) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } _createOcc(); int outTag = tag; if(!GModel::current()->getOCCInternals()->addSphere( @@ -3611,9 +3935,7 @@ GMSH_API int gmsh::model::occ::addBox(const double x, const double y, const double dy, const double dz, const int tag) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } _createOcc(); int outTag = tag; if(!GModel::current()->getOCCInternals()->addBox(outTag, x, y, z, dx, dy, @@ -3629,9 +3951,7 @@ GMSH_API int gmsh::model::occ::addCylinder(const double x, const double y, const double r, const int tag, const double angle) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } _createOcc(); int outTag = tag; if(!GModel::current()->getOCCInternals()->addCylinder(outTag, x, y, z, dx, dy, @@ -3647,9 +3967,7 @@ GMSH_API int gmsh::model::occ::addCone(const double x, const double y, const double r1, const double r2, const int tag, const double angle) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } _createOcc(); int outTag = tag; if(!GModel::current()->getOCCInternals()->addCone(outTag, x, y, z, dx, dy, dz, @@ -3664,9 +3982,7 @@ GMSH_API int gmsh::model::occ::addWedge(const double x, const double y, const double dy, const double dz, const int tag, const double ltx) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } _createOcc(); int outTag = tag; if(!GModel::current()->getOCCInternals()->addWedge(outTag, x, y, z, dx, dy, @@ -3681,9 +3997,7 @@ GMSH_API int gmsh::model::occ::addTorus(const double x, const double y, const double r2, const int tag, const double angle) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } _createOcc(); int outTag = tag; if(!GModel::current()->getOCCInternals()->addTorus(outTag, x, y, z, r1, r2, @@ -3698,9 +4012,7 @@ gmsh::model::occ::addThruSections(const std::vector<int> &wireTags, vectorpair &outDimTags, const int tag, const bool makeSolid, const bool makeRuled) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } _createOcc(); outDimTags.clear(); if(!GModel::current()->getOCCInternals()->addThruSections( @@ -3713,9 +4025,7 @@ GMSH_API void gmsh::model::occ::addThickSolid( const int volumeTag, const std::vector<int> &excludeSurfaceTags, const double offset, vectorpair &outDimTags, const int tag) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } _createOcc(); outDimTags.clear(); if(!GModel::current()->getOCCInternals()->addThickSolid( @@ -3731,9 +4041,7 @@ GMSH_API void gmsh::model::occ::extrude(const vectorpair &dimTags, const std::vector<double> &heights, const bool recombine) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } _createOcc(); outDimTags.clear(); if(!GModel::current()->getOCCInternals()->extrude( @@ -3749,9 +4057,7 @@ GMSH_API void gmsh::model::occ::revolve( vectorpair &outDimTags, const std::vector<int> &numElements, const std::vector<double> &heights, const bool recombine) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } _createOcc(); outDimTags.clear(); if(!GModel::current()->getOCCInternals()->revolve( @@ -3765,9 +4071,7 @@ GMSH_API void gmsh::model::occ::addPipe(const vectorpair &dimTags, const int wireTag, vectorpair &outDimTags) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } _createOcc(); outDimTags.clear(); if(!GModel::current()->getOCCInternals()->addPipe(dimTags, wireTag, @@ -3782,9 +4086,7 @@ GMSH_API void gmsh::model::occ::fillet(const std::vector<int> &volumeTags, vectorpair &outDimTags, const bool removeVolume) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } _createOcc(); outDimTags.clear(); if(!GModel::current()->getOCCInternals()->fillet(volumeTags, curveTags, radii, @@ -3800,9 +4102,7 @@ GMSH_API void gmsh::model::occ::chamfer(const std::vector<int> &volumeTags, vectorpair &outDimTags, const bool removeVolume) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } _createOcc(); outDimTags.clear(); if(!GModel::current()->getOCCInternals()->chamfer(volumeTags, curveTags, @@ -3819,9 +4119,7 @@ GMSH_API void gmsh::model::occ::fuse(const vectorpair &objectDimTags, const int tag, const bool removeObject, const bool removeTool) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } _createOcc(); outDimTags.clear(); outDimTagsMap.clear(); @@ -3837,9 +4135,7 @@ GMSH_API void gmsh::model::occ::intersect( vectorpair &outDimTags, std::vector<vectorpair> &outDimTagsMap, const int tag, const bool removeObject, const bool removeTool) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } _createOcc(); outDimTags.clear(); outDimTagsMap.clear(); @@ -3857,9 +4153,7 @@ GMSH_API void gmsh::model::occ::cut(const vectorpair &objectDimTags, const int tag, const bool removeObject, const bool removeTool) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } _createOcc(); outDimTags.clear(); outDimTagsMap.clear(); @@ -3877,9 +4171,7 @@ GMSH_API void gmsh::model::occ::fragment(const vectorpair &objectDimTags, const int tag, const bool removeObject, const bool removeTool) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } _createOcc(); outDimTags.clear(); outDimTagsMap.clear(); @@ -3894,9 +4186,7 @@ GMSH_API void gmsh::model::occ::translate(const vectorpair &dimTags, const double dx, const double dy, const double dz) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } _createOcc(); if(!GModel::current()->getOCCInternals()->translate(dimTags, dx, dy, dz)) { throw 1; @@ -3909,9 +4199,7 @@ GMSH_API void gmsh::model::occ::rotate(const vectorpair &dimTags, const double ay, const double az, const double angle) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } _createOcc(); if(!GModel::current()->getOCCInternals()->rotate(dimTags, x, y, z, ax, ay, az, angle)) { @@ -3924,9 +4212,7 @@ GMSH_API void gmsh::model::occ::dilate(const vectorpair &dimTags, const double z, const double a, const double b, const double c) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } _createOcc(); if(!GModel::current()->getOCCInternals()->dilate(dimTags, x, y, z, a, b, c)) { throw 1; @@ -3937,9 +4223,7 @@ GMSH_API void gmsh::model::occ::symmetrize(const vectorpair &dimTags, const double a, const double b, const double c, const double d) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } _createOcc(); if(!GModel::current()->getOCCInternals()->symmetry(dimTags, a, b, c, d)) { throw 1; @@ -3949,21 +4233,15 @@ GMSH_API void gmsh::model::occ::symmetrize(const vectorpair &dimTags, GMSH_API void gmsh::model::occ::affineTransform(const vectorpair &dimTags, const std::vector<double> &a) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } _createOcc(); - if(!GModel::current()->getOCCInternals()->affine(dimTags, a)) { - throw 1; - } + if(!GModel::current()->getOCCInternals()->affine(dimTags, a)) { throw 1; } } GMSH_API void gmsh::model::occ::copy(const vectorpair &dimTags, vectorpair &outDimTags) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } _createOcc(); outDimTags.clear(); if(!GModel::current()->getOCCInternals()->copy(dimTags, outDimTags)) { @@ -3974,9 +4252,7 @@ GMSH_API void gmsh::model::occ::copy(const vectorpair &dimTags, GMSH_API void gmsh::model::occ::remove(const vectorpair &dimTags, const bool recursive) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } _createOcc(); if(!GModel::current()->getOCCInternals()->remove(dimTags, recursive)) { throw 1; @@ -3985,9 +4261,7 @@ GMSH_API void gmsh::model::occ::remove(const vectorpair &dimTags, GMSH_API void gmsh::model::occ::removeAllDuplicates() { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } _createOcc(); GModel::current()->getOCCInternals()->removeAllDuplicates(); } @@ -3997,9 +4271,7 @@ GMSH_API void gmsh::model::occ::importShapes(const std::string &fileName, const bool highestDimOnly, const std::string &format) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } _createOcc(); outDimTags.clear(); if(!GModel::current()->getOCCInternals()->importShapes( @@ -4011,9 +4283,7 @@ GMSH_API void gmsh::model::occ::importShapes(const std::string &fileName, GMSH_API void gmsh::model::occ::importShapesNativePointer( const void *shape, vectorpair &outDimTags, const bool highestDimOnly) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } _createOcc(); outDimTags.clear(); #if defined(HAVE_OCC) @@ -4030,9 +4300,7 @@ GMSH_API void gmsh::model::occ::importShapesNativePointer( GMSH_API void gmsh::model::occ::setMeshSize(const vectorpair &dimTags, const double size) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } _createOcc(); for(std::size_t i = 0; i < dimTags.size(); i++) { int dim = dimTags[i].first, tag = dimTags[i].second; @@ -4040,11 +4308,39 @@ GMSH_API void gmsh::model::occ::setMeshSize(const vectorpair &dimTags, } } -GMSH_API void gmsh::model::occ::synchronize() +GMSH_API void gmsh::model::occ::getMass(const int dim, const int tag, + double &mass) { - if(!_isInitialized()) { - throw -1; + if(!_isInitialized()) { throw -1; } + _createOcc(); + if(!GModel::current()->getOCCInternals()->getMass(dim, tag, mass)){ + throw 1; + } +} + +GMSH_API void gmsh::model::occ::getCenterOfMass(const int dim, const int tag, + double &x, double &y, double &z) +{ + if(!_isInitialized()) { throw -1; } + _createOcc(); + if(!GModel::current()->getOCCInternals()->getCenterOfMass(dim, tag, x, y, z)){ + throw 1; + } +} + +GMSH_API void gmsh::model::occ::getMatrixOfInertia(const int dim, const int tag, + std::vector<double> &m) +{ + if(!_isInitialized()) { throw -1; } + _createOcc(); + if(!GModel::current()->getOCCInternals()->getMatrixOfInertia(dim, tag, m)){ + throw 1; } +} + +GMSH_API void gmsh::model::occ::synchronize() +{ + if(!_isInitialized()) { throw -1; } _createOcc(); GModel::current()->getOCCInternals()->synchronize(GModel::current()); } @@ -4053,9 +4349,7 @@ GMSH_API void gmsh::model::occ::synchronize() GMSH_API int gmsh::view::add(const std::string &name, const int tag) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } #if defined(HAVE_POST) PView *view = new PView(tag); view->getData()->setName(name); @@ -4071,9 +4365,7 @@ GMSH_API int gmsh::view::add(const std::string &name, const int tag) GMSH_API void gmsh::view::remove(const int tag) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } #if defined(HAVE_POST) PView *view = PView::getViewByTag(tag); if(!view) { @@ -4092,9 +4384,7 @@ GMSH_API void gmsh::view::remove(const int tag) GMSH_API int gmsh::view::getIndex(const int tag) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } #if defined(HAVE_POST) PView *view = PView::getViewByTag(tag); if(!view) { @@ -4110,9 +4400,7 @@ GMSH_API int gmsh::view::getIndex(const int tag) GMSH_API void gmsh::view::getTags(std::vector<int> &tags) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } #if defined(HAVE_POST) tags.clear(); for(std::size_t i = 0; i < PView::list.size(); i++) @@ -4129,9 +4417,7 @@ GMSH_API void gmsh::view::addModelData( const std::vector<std::vector<double> > &data, const double time, const int numComponents, const int partition) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } #if defined(HAVE_POST) PView *view = PView::getViewByTag(tag); if(!view) { @@ -4191,9 +4477,7 @@ GMSH_API void gmsh::view::getModelData(const int tag, const int step, std::vector<std::vector<double> > &data, double &time, int &numComponents) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } #if defined(HAVE_POST) PView *view = PView::getViewByTag(tag); if(!view) { @@ -4252,12 +4536,11 @@ GMSH_API void gmsh::view::getModelData(const int tag, const int step, } // for better performance, manual C implementation of gmsh::view::getModelData -GMSH_API void gmshViewGetModelData(const int tag, const int step, char **dataType, - size_t **tags, size_t *tags_n, - double ***data, size_t **data_n, size_t *data_nn, - double *time, - int *numComponents, - int *ierr) +GMSH_API void gmshViewGetModelData(const int tag, const int step, + char **dataType, size_t **tags, + size_t *tags_n, double ***data, + size_t **data_n, size_t *data_nn, + double *time, int *numComponents, int *ierr) { if(!_isInitialized()) { if(ierr) *ierr = -1; @@ -4332,9 +4615,7 @@ GMSH_API void gmsh::view::addListData(const int tag, const int numElements, const std::vector<double> &data) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } #if defined(HAVE_POST) PView *view = PView::getViewByTag(tag); if(!view) { @@ -4372,9 +4653,7 @@ GMSH_API void gmsh::view::getListData(const int tag, std::vector<int> &numElements, std::vector<std::vector<double> > &data) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } #if defined(HAVE_POST) PView *view = PView::getViewByTag(tag); if(!view) { @@ -4405,6 +4684,69 @@ GMSH_API void gmsh::view::getListData(const int tag, #endif } +GMSH_API int gmsh::view::addAlias(const int refTag, const bool copyOptions, + const int tag) +{ + if(!_isInitialized()) { throw -1; } +#if defined(HAVE_POST) + PView *ref = PView::getViewByTag(refTag); + if(!ref){ + Msg::Error("Unknown view with tag %d", refTag); + throw 2; + } + PView *view = new PView(ref, copyOptions, tag); +#if defined(HAVE_FLTK) + if(FlGui::available()) FlGui::instance()->updateViews(true, true); +#endif + return view->getTag(); +#else + Msg::Error("Views require the post-processing module"); + throw -1; +#endif +} + +GMSH_API void gmsh::view::copyOptions(const int refTag, const int tag) +{ + if(!_isInitialized()) { throw -1; } +#if defined(HAVE_POST) + PView *ref = PView::getViewByTag(refTag); + if(!ref){ + Msg::Error("Unknown view with tag %d", refTag); + throw 2; + } + PView *view = PView::getViewByTag(tag); + if(!view){ + Msg::Error("Unknown view with tag %d", tag); + throw 2; + } + view->setOptions(ref->getOptions()); +#if defined(HAVE_FLTK) + if(FlGui::available()) FlGui::instance()->updateViews(true, true); +#endif +#else + Msg::Error("Views require the post-processing module"); + throw -1; +#endif +} + +GMSH_API void gmsh::view::combine(const std::string &what, + const std::string &how, + const bool remove) +{ + if(!_isInitialized()) { throw -1; } +#if defined(HAVE_POST) + bool time = (what == "steps") ? true : false; // "elements" + int ihow = (how == "all") ? 1 : (how == "name") ? 2 : 0; // "visible" + PView::combine(time, ihow, remove); +#if defined(HAVE_FLTK) + if(FlGui::available()) FlGui::instance()->updateViews(true, true); +#endif +#else + Msg::Error("Views require the post-processing module"); + throw -1; +#endif +} + GMSH_API void gmsh::view::probe(const int tag, const double x, const double y, const double z, std::vector<double> &value, const int step, const int numComp, @@ -4413,9 +4755,7 @@ GMSH_API void gmsh::view::probe(const int tag, const double x, const double y, const std::vector<double> &yElemCoord, const std::vector<double> &zElemCoord) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } #if defined(HAVE_POST) PView *view = PView::getViewByTag(tag); if(!view) { @@ -4423,9 +4763,7 @@ GMSH_API void gmsh::view::probe(const int tag, const double x, const double y, throw 2; } PViewData *data = view->getData(); - if(!data) { - throw 2; - } + if(!data) { throw 2; } value.clear(); std::vector<double> val(9 * data->getNumTimeSteps()); bool found = false; @@ -4473,9 +4811,7 @@ GMSH_API void gmsh::view::probe(const int tag, const double x, const double y, GMSH_API void gmsh::view::write(const int tag, const std::string &fileName, const bool append) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } #if defined(HAVE_POST) PView *view = PView::getViewByTag(tag); if(!view) { @@ -4495,9 +4831,7 @@ GMSH_API void gmsh::plugin::setNumber(const std::string &name, const std::string &option, const double value) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } #if defined(HAVE_PLUGINS) try { PluginManager::instance()->setPluginOption(name, option, value); @@ -4515,9 +4849,7 @@ GMSH_API void gmsh::plugin::setString(const std::string &name, const std::string &option, const std::string &value) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } #if defined(HAVE_PLUGINS) try { PluginManager::instance()->setPluginOption(name, option, value); @@ -4533,9 +4865,7 @@ GMSH_API void gmsh::plugin::setString(const std::string &name, GMSH_API void gmsh::plugin::run(const std::string &name) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } #if defined(HAVE_PLUGINS) try { PluginManager::instance()->action(name, "Run", 0); @@ -4562,9 +4892,7 @@ GMSH_API void gmsh::graphics::draw() GMSH_API void gmsh::fltk::initialize() { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } #if defined(HAVE_FLTK) FlGui::instance(_argc, _argv); FlGui::setFinishedProcessingCommandLine(); @@ -4577,9 +4905,7 @@ GMSH_API void gmsh::fltk::initialize() GMSH_API void gmsh::fltk::wait(const double time) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } #if defined(HAVE_FLTK) if(!FlGui::available()) FlGui::instance(_argc, _argv); if(time >= 0) @@ -4594,9 +4920,7 @@ GMSH_API void gmsh::fltk::wait(const double time) GMSH_API void gmsh::fltk::lock() { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } #if defined(HAVE_FLTK) FlGui::lock(); #else @@ -4607,9 +4931,7 @@ GMSH_API void gmsh::fltk::lock() GMSH_API void gmsh::fltk::unlock() { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } #if defined(HAVE_FLTK) FlGui::unlock(); #else @@ -4620,9 +4942,7 @@ GMSH_API void gmsh::fltk::unlock() GMSH_API void gmsh::fltk::update() { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } #if defined(HAVE_FLTK) if(!FlGui::available()) FlGui::instance(_argc, _argv); FlGui::instance()->updateViews(true, true); @@ -4634,9 +4954,7 @@ GMSH_API void gmsh::fltk::update() GMSH_API void gmsh::fltk::awake(const std::string &action) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } #if defined(HAVE_FLTK) FlGui::awake(action); #else @@ -4647,9 +4965,7 @@ GMSH_API void gmsh::fltk::awake(const std::string &action) GMSH_API void gmsh::fltk::run() { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } #if defined(HAVE_FLTK) if(!FlGui::available()) FlGui::instance(_argc, _argv); FlGui::instance()->run(); // this calls draw() once @@ -4662,7 +4978,7 @@ GMSH_API void gmsh::fltk::run() #if defined(HAVE_FLTK) static int selectionCode(char val) { - switch(val){ + switch(val) { case 'q': return 0; // abort case 'l': return 1; // selected case 'r': return 2; // deselected @@ -4675,14 +4991,12 @@ static int selectionCode(char val) GMSH_API int gmsh::fltk::selectEntities(vectorpair &dimTags, const int dim) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } dimTags.clear(); #if defined(HAVE_FLTK) if(!FlGui::available()) FlGui::instance(_argc, _argv); char ret = 0; - switch(dim){ + switch(dim) { case 0: ret = FlGui::instance()->selectEntity(ENT_POINT); break; case 1: ret = FlGui::instance()->selectEntity(ENT_CURVE); break; case 2: ret = FlGui::instance()->selectEntity(ENT_SURFACE); break; @@ -4690,17 +5004,17 @@ GMSH_API int gmsh::fltk::selectEntities(vectorpair &dimTags, const int dim) default: ret = FlGui::instance()->selectEntity(ENT_ALL); break; } for(std::size_t i = 0; i < FlGui::instance()->selectedVertices.size(); i++) - dimTags.push_back - (std::pair<int, int>(0, FlGui::instance()->selectedVertices[i]->tag())); + dimTags.push_back( + std::pair<int, int>(0, FlGui::instance()->selectedVertices[i]->tag())); for(std::size_t i = 0; i < FlGui::instance()->selectedEdges.size(); i++) - dimTags.push_back - (std::pair<int, int>(1, FlGui::instance()->selectedEdges[i]->tag())); + dimTags.push_back( + std::pair<int, int>(1, FlGui::instance()->selectedEdges[i]->tag())); for(std::size_t i = 0; i < FlGui::instance()->selectedFaces.size(); i++) - dimTags.push_back - (std::pair<int, int>(2, FlGui::instance()->selectedFaces[i]->tag())); + dimTags.push_back( + std::pair<int, int>(2, FlGui::instance()->selectedFaces[i]->tag())); for(std::size_t i = 0; i < FlGui::instance()->selectedRegions.size(); i++) - dimTags.push_back - (std::pair<int, int>(1, FlGui::instance()->selectedRegions[i]->tag())); + dimTags.push_back( + std::pair<int, int>(1, FlGui::instance()->selectedRegions[i]->tag())); return selectionCode(ret); #else return 0; @@ -4709,9 +5023,7 @@ GMSH_API int gmsh::fltk::selectEntities(vectorpair &dimTags, const int dim) GMSH_API int gmsh::fltk::selectElements(std::vector<std::size_t> &elementTags) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } elementTags.clear(); #if defined(HAVE_FLTK) if(!FlGui::available()) FlGui::instance(_argc, _argv); @@ -4730,9 +5042,7 @@ GMSH_API int gmsh::fltk::selectElements(std::vector<std::size_t> &elementTags) GMSH_API int gmsh::fltk::selectViews(std::vector<int> &viewTags) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } viewTags.clear(); #if defined(HAVE_FLTK) if(!FlGui::available()) FlGui::instance(_argc, _argv); @@ -4750,11 +5060,9 @@ GMSH_API int gmsh::fltk::selectViews(std::vector<int> &viewTags) GMSH_API void gmsh::onelab::set(const std::string &data, const std::string &format) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } #if defined(HAVE_ONELAB) - if(format == "json"){ + if(format == "json") { if(!::onelab::server::instance()->fromJSON(data)) Msg::Error("Could not parse json data '%s'", data.c_str()); } @@ -4766,34 +5074,31 @@ GMSH_API void gmsh::onelab::set(const std::string &data, #endif } -GMSH_API void gmsh::onelab::get(std::string &data, - const std::string &name, +GMSH_API void gmsh::onelab::get(std::string &data, const std::string &name, const std::string &format) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } #if defined(HAVE_ONELAB) data.clear(); - if(name.empty()){ + if(name.empty()) { if(format == "json") ::onelab::server::instance()->toJSON(data, "Gmsh"); else Msg::Error("Unknown data format"); } - else{ + else { std::vector< ::onelab::number> ps; ::onelab::server::instance()->get(ps, name); - if(ps.size()){ + if(ps.size()) { if(format == "json") data = ps[0].toJSON(); else data = ps[0].toChar(); } - else{ + else { std::vector< ::onelab::string> ps2; ::onelab::server::instance()->get(ps2, name); - if(ps2.size()){ + if(ps2.size()) { if(format == "json") data = ps2[0].toJSON(); else @@ -4810,9 +5115,7 @@ GMSH_API void gmsh::onelab::get(std::string &data, GMSH_API void gmsh::onelab::setNumber(const std::string &name, const std::vector<double> &value) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } #if defined(HAVE_ONELAB) ::onelab::number p(name); std::vector< ::onelab::number> ps; @@ -4829,9 +5132,7 @@ GMSH_API void gmsh::onelab::setNumber(const std::string &name, GMSH_API void gmsh::onelab::getNumber(const std::string &name, std::vector<double> &value) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } #if defined(HAVE_ONELAB) value.clear(); std::vector< ::onelab::number> ps; @@ -4846,9 +5147,7 @@ GMSH_API void gmsh::onelab::getNumber(const std::string &name, GMSH_API void gmsh::onelab::setString(const std::string &name, const std::vector<std::string> &value) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } #if defined(HAVE_ONELAB) ::onelab::string p(name); std::vector< ::onelab::string> ps; @@ -4865,9 +5164,7 @@ GMSH_API void gmsh::onelab::setString(const std::string &name, GMSH_API void gmsh::onelab::getString(const std::string &name, std::vector<std::string> &value) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } #if defined(HAVE_ONELAB) value.clear(); std::vector< ::onelab::string> ps; @@ -4881,9 +5178,7 @@ GMSH_API void gmsh::onelab::getString(const std::string &name, GMSH_API void gmsh::onelab::clear(const std::string &name) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } #if defined(HAVE_ONELAB) ::onelab::server::instance()->clear(name); #else @@ -4895,9 +5190,7 @@ GMSH_API void gmsh::onelab::clear(const std::string &name) GMSH_API void gmsh::onelab::run(const std::string &name, const std::string &command) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } #if defined(HAVE_ONELAB) onelabUtils::runClient(name, command); #endif @@ -4908,9 +5201,7 @@ GMSH_API void gmsh::onelab::run(const std::string &name, GMSH_API void gmsh::logger::write(const std::string &message, const std::string &level) { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } if(level == "error") Msg::Error("%s", message.c_str()); else if(level == "warning") @@ -4924,7 +5215,7 @@ private: std::vector<std::string> _log; public: - apiMsg(){} + apiMsg() {} virtual void operator()(std::string level, std::string message) { _log.push_back(level + ": " + message); @@ -4934,13 +5225,9 @@ public: GMSH_API void gmsh::logger::start() { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } GmshMessage *msg = Msg::GetCallback(); - if(msg) { - Msg::Warning("Logger already started - ignoring"); - } + if(msg) { Msg::Warning("Logger already started - ignoring"); } else { msg = new apiMsg(); Msg::SetCallback(msg); @@ -4949,13 +5236,9 @@ GMSH_API void gmsh::logger::start() GMSH_API void gmsh::logger::get(std::vector<std::string> &log) { - if(!_isInitialized()) { - throw -1; - } - apiMsg *msg = dynamic_cast<apiMsg*>(Msg::GetCallback()); - if(msg) { - msg->get(log); - } + if(!_isInitialized()) { throw -1; } + apiMsg *msg = dynamic_cast<apiMsg *>(Msg::GetCallback()); + if(msg) { msg->get(log); } else { log.clear(); } @@ -4963,9 +5246,7 @@ GMSH_API void gmsh::logger::get(std::vector<std::string> &log) GMSH_API void gmsh::logger::stop() { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } GmshMessage *msg = Msg::GetCallback(); if(msg) { delete msg; @@ -4978,16 +5259,12 @@ GMSH_API void gmsh::logger::stop() GMSH_API double gmsh::logger::time() { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } return TimeOfDay(); } GMSH_API double gmsh::logger::cputime() { - if(!_isInitialized()) { - throw -1; - } + if(!_isInitialized()) { throw -1; } return Cpu(); } diff --git a/Fltk/FlGui.cpp b/Fltk/FlGui.cpp index 47b55f507e383585e565200a858251bd75b160d8..d3e8e81d28acb366c50f7749fec579030d6b98de 100644 --- a/Fltk/FlGui.cpp +++ b/Fltk/FlGui.cpp @@ -446,6 +446,7 @@ FlGui::FlGui(int argc, char **argv) Fl_Mac_App_Menu::about = "About Gmsh"; Fl_Mac_App_Menu::hide = "Hide Gmsh"; Fl_Mac_App_Menu::quit = "Quit Gmsh"; + Fl_Mac_App_Menu::print = ""; // this sometimes crashes #endif // tell fltk we're (potentially) in multi-threaded mode @@ -570,7 +571,7 @@ FlGui::FlGui(int argc, char **argv) } setGraphicTitle(GModel::current()->getFileName()); - // create fullscreen window + // create window that will be used for fullscreen display fullscreen = new openglWindow(100, 100, 100, 100); int mode = FL_RGB | FL_DEPTH | (CTX::instance()->db ? FL_DOUBLE : FL_SINGLE); if(CTX::instance()->antialiasing) mode |= FL_MULTISAMPLE; @@ -580,7 +581,6 @@ FlGui::FlGui(int argc, char **argv) } fullscreen->mode(mode); fullscreen->end(); - fullscreen->fullscreen(); #if !defined(__APPLE__) fullscreen->icon(graph[0]->getWindow()->icon()); #endif @@ -1347,6 +1347,7 @@ void window_cb(Fl_Widget *w, void *data) FlGui::instance()->fullscreen->resize(x, y, w, h); FlGui::instance()->fullscreen->valid(0); FlGui::instance()->fullscreen->show(); + FlGui::instance()->fullscreen->fullscreen(); while(!FlGui::instance()->fullscreen->valid()) FlGui::wait(); FlGui::instance()->fullscreen->getDrawContext()->copyViewAttributes( FlGui::instance()->getCurrentOpenglWindow()->getDrawContext()); @@ -1366,6 +1367,7 @@ void window_cb(Fl_Widget *w, void *data) FlGui::instance()->graph[0]->gl[0]->getDrawContext()->copyViewAttributes( FlGui::instance()->getCurrentOpenglWindow()->getDrawContext()); openglWindow::setLastHandled(FlGui::instance()->graph[0]->gl[0]); + FlGui::instance()->fullscreen->fullscreen_off(); FlGui::instance()->fullscreen->hide(); drawContext::global()->draw(); fullscreen = 0; diff --git a/Fltk/fieldWindow.cpp b/Fltk/fieldWindow.cpp index c1473b34807faa088d553f32669ede4a30d63da6..e9808238ff28e212da5aa68554343c02a26d3468 100644 --- a/Fltk/fieldWindow.cpp +++ b/Fltk/fieldWindow.cpp @@ -169,9 +169,6 @@ fieldWindow::fieldWindow(int deltaFontSize) : _deltaFontSize(deltaFontSize) background_btn = new Fl_Round_Button(x, y + h - BH - WB, w - BB - WB, BH, "Set as background field"); - background_btn->tooltip( - "Only a single field can be set as background field.\n" - "To combine multiple fields use the Min or Max fields."); options_tab->end(); Fl_Group *help_tab = new Fl_Group(x, y, w, h, "Help"); @@ -354,8 +351,19 @@ void fieldWindow::loadFieldOptions() (*input)->clear_changed(); input++; } - background_btn->value(GModel::current()->getFields()->getBackgroundField() == - f->id); + if(dynamic_cast<BoundaryLayerField*>(f)){ + background_btn->value(0); + background_btn->deactivate(); + background_btn->tooltip("Boundary layer fields cannot be assigned in the " + "graphical user interface: edit the file directly."); + } + else{ + background_btn->value(GModel::current()->getFields()->getBackgroundField() == + f->id); + background_btn->activate(); + background_btn->tooltip("Only a single field can be set as background field.\n" + "To combine multiple fields use the Min or Max fields."); + } } void fieldWindow::editField(Field *f) diff --git a/Fltk/graphicWindow.cpp b/Fltk/graphicWindow.cpp index 78dffb7f3b1f33885f8ac32327d697f03b6ed448..d033918807bb3d7ce38e3f6fad2ce5e51477b7ac 100644 --- a/Fltk/graphicWindow.cpp +++ b/Fltk/graphicWindow.cpp @@ -2129,7 +2129,6 @@ static void mesh_smooth_cb(Fl_Widget *w, void *data) drawContext::global()->draw(); } - static void mesh_recombine_cb(Fl_Widget *w, void *data) { RecombineMesh(GModel::current()); @@ -4292,7 +4291,7 @@ static menuItem static_modules[] = { (Fl_Callback *)mesh_degree_cb, (void*)2}, {"0Modules/Mesh/Set order 3", (Fl_Callback *)mesh_degree_cb, (void*)3}, - {"0Modules/Mesh/High order tools", + {"0Modules/Mesh/High-order tools", (Fl_Callback *)highordertools_cb}, {"0Modules/Mesh/Inspect", (Fl_Callback *)mesh_inspect_cb} , diff --git a/Fltk/openglWindow.cpp b/Fltk/openglWindow.cpp index a3bab4bed9252dfc57c463acacff6dba6b53a4cc..fde296a4a28191a55010152e35d5b8f02ec22797 100644 --- a/Fltk/openglWindow.cpp +++ b/Fltk/openglWindow.cpp @@ -85,11 +85,19 @@ openglWindow::openglWindow(int x, int y, int w, int h) if(CTX::instance()->gamepad) Fl::add_timeout(.5, navigator_handler, (void *)this); + +#if defined(NEW_TOOLTIPS) + _tooltip = new tooltipWindow(); + _tooltip->hide(); +#endif } openglWindow::~openglWindow() { delete _ctx; +#if defined(NEW_TOOLTIPS) + delete _tooltip; +#endif if(Nautilus) delete Nautilus; } @@ -871,6 +879,16 @@ char openglWindow::selectEntity(int type, std::vector<GVertex *> &vertices, void openglWindow::drawTooltip(const std::string &text) { +#if defined(NEW_TOOLTIPS) + if(text.empty()){ + _tooltip->hide(); + } + else{ + _tooltip->position(Fl::event_x_root(), Fl::event_y_root()+20); + _tooltip->value(text); + _tooltip->show(); + } +#else static char str[1024]; strncpy(str, text.c_str(), sizeof(str) - 1); str[sizeof(str) - 1] = '\0'; @@ -885,6 +903,7 @@ void openglWindow::drawTooltip(const std::string &text) Fl_Tooltip::delay(d1); Fl_Tooltip::hoverdelay(d2); if(!enabled) Fl_Tooltip::disable(); +#endif } void openglWindow::moveWithGamepad() diff --git a/Fltk/openglWindow.h b/Fltk/openglWindow.h index 0117be906fc92ac86bfad479452b7e0abe2e644c..b54124c9adcc70ba90df731e630c422d21fa0270 100644 --- a/Fltk/openglWindow.h +++ b/Fltk/openglWindow.h @@ -13,6 +13,52 @@ #include "drawContext.h" #include "Navigator.h" +#if defined(NEW_TOOLTIPS) + +#include <FL/Fl_Menu_Window.H> +#include <FL/fl_draw.H> + +class tooltipWindow : public Fl_Menu_Window { + private: + char _text[1024]; + public: + tooltipWindow() : Fl_Menu_Window(1, 1) + { + strcpy(_text, ""); + set_override(); + set_tooltip_window(); + end(); + } + void draw() + { + draw_box(FL_BORDER_BOX, 0, 0, w(), h(), Fl_Color(175)); + fl_color(FL_BLACK); + fl_font(labelfont(), labelsize()); + fl_draw(_text, 3, 3, w() - 6, h() - 6, Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_WRAP)); + } + int handle(int e) + { + if (e == FL_PUSH || e == FL_KEYDOWN) { + hide(); + return 1; + } + return Fl_Menu_Window::handle(e); + } + void value(const std::string &s) + { + strncpy(_text, s.c_str(), 1023); + // recalc size of window + fl_font(labelfont(), labelsize()); + int W = w(), H = h(); + fl_measure(_text, W, H, 0); + W += 8; + size(W, H); + redraw(); + } +}; + +#endif + class GVertex; class GEdge; class GFace; @@ -38,6 +84,9 @@ private: std::vector<GRegion *> ®ions, std::vector<MElement *> &elements, std::vector<SPoint2> &points, std::vector<PView *> &views); +#if defined(NEW_TOOLTIPS) + tooltipWindow *_tooltip; +#endif protected: void draw(); diff --git a/Geo/ACISEdge.cpp b/Geo/ACISEdge.cpp index c1d4f022a95dc9548fb60cc53d3e4a820c38b0c7..0f45218da92a3ee83136af936cef75753e5714b1 100644 --- a/Geo/ACISEdge.cpp +++ b/Geo/ACISEdge.cpp @@ -47,7 +47,7 @@ ACISEdge::ACISEdge(GModel *model, EDGE *edge, int num, GVertex *v1, GVertex *v2) // s0 += _cur->equation().param_period()/2; // s1 += _cur->equation().param_period()/2; } - Msg::Info("ACIS Edge %d is %s goes from %g to %g", tag(), + Msg::Info("ACIS curve %d is %s goes from point %g to point %g", tag(), getTypeString().c_str(), s0, s1); } diff --git a/Geo/CellComplex.cpp b/Geo/CellComplex.cpp index 9b315533ea89d6df26a0e9b7fa7927572b50329c..5546121b936d813255de2fc649bc996c211cbdd9 100644 --- a/Geo/CellComplex.cpp +++ b/Geo/CellComplex.cpp @@ -50,15 +50,15 @@ CellComplex::CellComplex(GModel *model, std::vector<MElement *> &domainElements, _reduced = false; Msg::Debug("Cells in domain:"); - Msg::Debug(" %d volumes, %d faces %d edges, and %d vertices", + Msg::Debug(" %d volumes, %d faces, %d edges, and %d vertices", getNumCells(3, 1), getNumCells(2, 1), getNumCells(1, 1), getNumCells(0, 1)); Msg::Debug("Cells in subdomain:"); - Msg::Debug(" %d volumes, %d faces %d edges, and %d vertices", + Msg::Debug(" %d volumes, %d faces, %d edges, and %d vertices", getNumCells(3, 2), getNumCells(2, 2), getNumCells(1, 2), getNumCells(0, 2)); Msg::Debug("Cells in relative domain:"); - Msg::Debug(" %d volumes, %d faces %d edges, and %d vertices", + Msg::Debug(" %d volumes, %d faces, %d edges, and %d vertices", getNumCells(3, 0), getNumCells(2, 0), getNumCells(1, 0), getNumCells(0, 0)); } @@ -204,7 +204,7 @@ bool CellComplex::_removeCells(std::vector<MElement *> &elements, int domain) } } Msg::Debug("Removed %d volumes, %d faces, %d edges, and %d vertices from the " - "cell complex.", + "cell complex", (int)removed[3].size(), (int)removed[2].size(), (int)removed[1].size(), (int)removed[0].size()); return true; diff --git a/Geo/GEdge.cpp b/Geo/GEdge.cpp index c5b8502ea6be8ebb0f0a47e5a5bf48a526c16691..8c8c0cf5d02da7ff4a995c867b06d7fc4227d8fb 100644 --- a/Geo/GEdge.cpp +++ b/Geo/GEdge.cpp @@ -138,7 +138,7 @@ void GEdge::setMeshMaster(GEdge *ge, const std::vector<double> &tfo) return; } - Msg::Info("Error in transformation from edge %d (%d-%d) to %d (%d-%d)" + Msg::Info("Error in transformation from curve %d (%d-%d) to %d (%d-%d)" "(minimal transformed node distances %g %g, tolerance %g)", ge->tag(), ge->getBeginVertex()->tag(), ge->getEndVertex()->tag(), this->tag(), this->getBeginVertex()->tag(), @@ -602,9 +602,8 @@ bool GEdge::XYZToU(const double X, const double Y, const double Z, double &u, u = errorVsParameter.begin()->second; if(first) { - Msg::Warning("Could not converge parametrisation of (%g,%g,%g) on edge %d, " - "taking parameter with lowest error ", - X, Y, Z, tag()); + Msg::Warning("Could not converge parametrisation of (%g,%g,%g) on curve %d, " + "taking parameter with lowest error", X, Y, Z, tag()); } return false; @@ -694,7 +693,7 @@ void GEdge::addElement(int type, MElement *e) { switch(type) { case TYPE_LIN: addLine(reinterpret_cast<MLine *>(e)); break; - default: Msg::Error("Trying to add unsupported element in edge"); + default: Msg::Error("Trying to add unsupported element in curve %d", tag()); } } @@ -706,7 +705,7 @@ void GEdge::removeElement(int type, MElement *e) std::find(lines.begin(), lines.end(), reinterpret_cast<MLine *>(e)); if(it != lines.end()) lines.erase(it); } break; - default: Msg::Error("Trying to remove unsupported element in edge"); + default: Msg::Error("Trying to remove unsupported element in curve %d", tag()); } } diff --git a/Geo/GEdge.h b/Geo/GEdge.h index 2ffea1ac43cc50e13021d72eb2d472279b562403..e138614f8d3038323e10476aee2cd0e34e91ce70 100644 --- a/Geo/GEdge.h +++ b/Geo/GEdge.h @@ -162,11 +162,11 @@ public: void setTooSmall(bool const b) { _tooSmall = b; } virtual bool isMeshDegenerated() const { - if(_tooSmall) Msg::Debug("degenerated mesh on edge %d: too small", tag()); - if(v0 == v1 && mesh_vertices.size() < 2) - Msg::Debug("degenerated mesh on edge %d: %d mesh vertices", tag(), + if(_tooSmall) Msg::Debug("Degenerated mesh on curve %d: too small", tag()); + if(v0 && v0 == v1 && mesh_vertices.size() < 2) + Msg::Debug("Degenerated mesh on curve %d: %d mesh nodes", tag(), (int)mesh_vertices.size()); - return _tooSmall || (v0 == v1 && mesh_vertices.size() < 2); + return _tooSmall || (v0 && v0 == v1 && mesh_vertices.size() < 2); } // number of types of elements diff --git a/Geo/GEdgeLoop.cpp b/Geo/GEdgeLoop.cpp index 110d2a0ac5989474557780ac03d8b633a26aa658..e4d8cb64c5d14e3a8933d5533080d9711dc8f6c8 100644 --- a/Geo/GEdgeLoop.cpp +++ b/Geo/GEdgeLoop.cpp @@ -57,7 +57,7 @@ GEdgeSigned nextOne(GEdgeSigned *thisOne, std::list<GEdge *> &wire) GVertex *v2 = ge->getEndVertex(); if(v1 == gv) return GEdgeSigned(1, ge); if(v2 == gv) return GEdgeSigned(-1, ge); - Msg::Error("Something wrong in edge loop 1"); + Msg::Error("Something wrong in curve loop 1"); thisOne->print(); } ++it; @@ -74,7 +74,7 @@ GEdgeSigned nextOne(GEdgeSigned *thisOne, std::list<GEdge *> &wire) GVertex *v2 = ge->getEndVertex(); if(v1 == gv) return GEdgeSigned(1, ge); if(v2 == gv) return GEdgeSigned(-1, ge); - Msg::Error("Something wrong in edge loop 2"); + Msg::Error("Something wrong in curve loop 2"); thisOne->print(); } ++it; @@ -112,8 +112,7 @@ static void loopTheLoop(std::list<GEdge *> &wire, std::list<GEdgeSigned> &loop, else ges = nextOne(prevOne, wire); if(ges.getSign() == 0) { // oops - Msg::Warning("Something wrong in edge loop of size=%d, no sign!", - wire.size()); + Msg::Debug("no sign in wire of size=%d: aborting loop construction"); break; } prevOne = ⩾ diff --git a/Geo/GFace.cpp b/Geo/GFace.cpp index 6f5ca16bfbbad5a9fb703d8bbb7c91103d7e61d5..1979896dc7b4863e428505091e54a7b175006272 100644 --- a/Geo/GFace.cpp +++ b/Geo/GFace.cpp @@ -96,7 +96,7 @@ void GFace::delFreeEdge(GEdge *edge) std::vector<int>::iterator itd = l_dirs.begin(); while(ite != l_edges.end()) { if(edge == *ite) { - Msg::Debug("Erasing edge %d from edge list in face %d", edge->tag(), + Msg::Debug("Erasing curve %d from curve list in surface %d", edge->tag(), tag()); l_edges.erase(ite); if(itd != l_dirs.end()) l_dirs.erase(itd); @@ -111,7 +111,7 @@ void GFace::delFreeEdge(GEdge *edge) it != edgeLoops.end(); it++) { for(GEdgeLoop::iter it2 = it->begin(); it2 != it->end(); it2++) { if(edge == it2->ge) { - Msg::Debug("Erasing edge %d from edge loop in face %d", edge->tag(), + Msg::Debug("Erasing curve %d from curve loop in surface %d", edge->tag(), tag()); it->erase(it2); break; @@ -585,7 +585,7 @@ void GFace::computeMeanPlane() } if(colinear) { - Msg::Debug("Adding edge points (%d) to compute mean plane of face %d", + Msg::Debug("Adding curve points (%d) to compute mean plane of surface %d", pts.size(), tag()); std::vector<GEdge *> const &edg = edges(); for(std::vector<GEdge *>::const_iterator ite = edg.begin(); @@ -1675,7 +1675,7 @@ void GFace::setMeshMaster(GFace *master, const std::vector<double> &tfo) if(l_vtxToEdge.size() != m_vtxToEdge.size()) { Msg::Error( "Periodic connection specified between topologically " - "incompatible surfaces %d and %d (that have %d vs %d model edges)", + "incompatible surfaces %d and %d (that have %d vs %d model curves)", master->tag(), tag(), l_vtxToEdge.size(), m_vtxToEdge.size()); return; } @@ -1751,8 +1751,8 @@ void GFace::setMeshMaster(GFace *master, const std::vector<double> &tfo) } if(mv2eIter == m_vtxToEdge.end()) { - Msg::Error("Could not find periodic copy of edge %d-%d " - "(corresponding to vertices %d %d) in face %d", + Msg::Error("Could not find periodic copy of curve %d-%d " + "(corresponding to vertices %d %d) in surface %d", lPair.first->tag(), lPair.second->tag(), mPair.first->tag(), mPair.second->tag(), master->tag()); return; @@ -1761,7 +1761,7 @@ void GFace::setMeshMaster(GFace *master, const std::vector<double> &tfo) if(masterEdge->getMeshMaster() != localEdge) { localEdge->setMeshMaster(masterEdge, tfo); - Msg::Info("Setting edge master %d - %d", localEdge->tag(), + Msg::Info("Setting curve master %d - %d", localEdge->tag(), masterEdge->tag()); } gEdgeCounterparts[localEdge] = std::make_pair(masterEdge, sign); @@ -1861,7 +1861,7 @@ void GFace::setMeshMaster(GFace *master, const std::map<int, int> &edgeCopies) if(adnksd != edgeCopies.end()) source_e = adnksd->second; else { - Msg::Error("Could not find edge counterpart %d in slave surface %d", + Msg::Error("Could not find curve counterpart %d in slave surface %d", (*it)->tag(), master->tag()); return; } diff --git a/Geo/GModel.cpp b/Geo/GModel.cpp index 44621bc780dbc65e81d8126a651048459a3d0d16..8e2cc48ea2b0f9d3ccfd81987632c177ec1e8a9e 100644 --- a/Geo/GModel.cpp +++ b/Geo/GModel.cpp @@ -588,7 +588,7 @@ bool GModel::getBoundaryTags(const std::vector<std::pair<int, int> > &inDimTags, } } else { - Msg::Error("Unknown model edge with tag %d", tag); + Msg::Error("Unknown model curve with tag %d", tag); ret = false; } } @@ -617,7 +617,8 @@ bool GModel::getBoundaryTags(const std::vector<std::pair<int, int> > &inDimTags, } outDimTags.clear(); for(int dim = 0; dim < 3; dim++) { - for(std::set<int, AbsIntLessThan>::iterator it = c[dim].begin(); it != c[dim].end(); it++) + for(std::set<int, AbsIntLessThan>::iterator it = c[dim].begin(); + it != c[dim].end(); it++) outDimTags.push_back(std::pair<int, int>(dim, *it)); } } @@ -1199,10 +1200,36 @@ int GModel::refineMesh(int linear) #endif } +int GModel::recombineMesh() +{ +#if defined(HAVE_MESH) + RecombineMesh(this); + return 1; +#else + Msg::Error("Mesh module not compiled"); + return 0; +#endif +} + +int GModel::smoothMesh() +{ +#if defined(HAVE_MESH) + SmoothMesh(this); + return 1; +#else + Msg::Error("Mesh module not compiled"); + return 0; +#endif +} + int GModel::optimizeMesh(const std::string &how) { #if defined(HAVE_MESH) - if(how == "Netgen") + if(how == "HighOrder") + OptimizeHighOrderMesh(this); + else if(how == "HighOrderElastic") + OptimizeHighOrderMeshElastic(this); + else if(how == "Netgen") OptimizeMeshNetgen(this); else OptimizeMesh(this); @@ -1281,6 +1308,20 @@ std::size_t GModel::getNumMeshParentElements() const return n; } +int GModel::addMEdge(const MEdge &edge) +{ + std::pair<MEdge, int> key(edge, _mapEdgeNum.size()); + std::pair<hashmapMEdge::iterator, bool> it = _mapEdgeNum.insert(key); + return it.first->second; +} + +int GModel::addMFace(const MFace &face) +{ + std::pair<MFace, int> key(face, _mapFaceNum.size()); + std::pair<hashmapMFace::iterator, bool> it = _mapFaceNum.insert(key); + return it.first->second; +} + void GModel::renumberMeshVertices() { destroyMeshCaches(); @@ -1422,13 +1463,23 @@ std::size_t GModel::getNumMeshElements(unsigned c[6]) return 0; } -MElement *GModel::getMeshElementByCoord(SPoint3 &p, int dim, bool strict) +MElement *GModel::getMeshElementByCoord(SPoint3 &p, SPoint3 ¶m, + int dim, bool strict) { if(!_elementOctree) { Msg::Debug("Rebuilding mesh element octree"); _elementOctree = new MElementOctree(this); } - return _elementOctree->find(p.x(), p.y(), p.z(), dim, strict); + MElement *e = _elementOctree->find(p.x(), p.y(), p.z(), dim, strict); + if(e){ + double xyz[3] = {p.x(), p.y(), p.z()}, uvw[3]; + e->xyz2uvw(xyz, uvw); + param.setPosition(uvw[0], uvw[1], uvw[2]); + } + else{ + param.setPosition(0, 0, 0); + } + return e; } std::vector<MElement *> GModel::getMeshElementsByCoord(SPoint3 &p, int dim, @@ -2275,6 +2326,10 @@ static int connectedSurfaces(std::vector<MElement *> &elements, void GModel::alignPeriodicBoundaries() { + // Is this still necessary/useful? + // 1) It's quite horrible + // 2) It's only called when reading MSH2 files + Msg::Debug("Aligning periodic boundaries"); // realigning edges @@ -2290,7 +2345,7 @@ void GModel::alignPeriodicBoundaries() for(std::size_t i = 0; i < src->getNumMeshElements(); i++) { MLine *srcLine = dynamic_cast<MLine *>(src->getMeshElement(i)); if(!srcLine) { - Msg::Error("Master element %d is not an edge ", + Msg::Debug("Master element %d is not a line", src->getMeshElement(i)->getNum()); return; } @@ -2298,14 +2353,14 @@ void GModel::alignPeriodicBoundaries() } // run through slave edge elements - // - check whether we find a counterpart (if not, flag error) + // - check whether we find a counterpart (if not, abort) // - check orientation and reorient if necessary for(std::size_t i = 0; i < tgt->getNumMeshElements(); ++i) { MLine *tgtLine = dynamic_cast<MLine *>(tgt->getMeshElement(i)); if(!tgtLine) { - Msg::Error("Slave element %d is not an edge ", + Msg::Debug("Slave element %d is not a line", tgt->getMeshElement(i)->getNum()); return; } @@ -2318,16 +2373,11 @@ void GModel::alignPeriodicBoundaries() std::map<MVertex *, MVertex *> &v2v = tgt->correspondingVertices; std::map<MVertex *, MVertex *>::iterator srcIter = v2v.find(tgtVtx); if(srcIter == v2v.end() || !srcIter->second) { - // Msg::Info("Cannot find periodic counterpart of vertex %d on edge - // %d" - // ", looking on entity %d of dimension %d", - // tgtVtx->getNum(),tgt->tag(),ge->tag(),ge->dim()); srcIter = geV2v.find(tgtVtx); if(srcIter == geV2v.end() || !srcIter->second) { - Msg::Error( - "Cannot find periodic counterpart of vertex %d on edge %d" - " nor on %d", - tgtVtx->getNum(), tgt->tag(), ge->tag()); + Msg::Debug("Could not find periodic counterpart of node %d on curve %d " + "or on entity %d of dimension %d", + tgtVtx->getNum(), tgt->tag(), ge->tag(), ge->dim()); return; } else @@ -2343,8 +2393,8 @@ void GModel::alignPeriodicBoundaries() srcLines.find(tgtEdge); if(sIter == srcLines.end() || !sIter->second) { - Msg::Error("Can't find periodic counterpart of edge %d-%d on edge %d" - ", connected to edge %d-%d on %d", + Msg::Debug("Could not find periodic counterpart of mesh edge %d-%d on " + "curve %d for mesh edge %d-%d on curve %d", tgtLine->getVertex(0)->getNum(), tgtLine->getVertex(1)->getNum(), tgt->tag(), tgtVtcs[0]->getNum(), tgtVtcs[1]->getNum(), src->tag()); @@ -2399,13 +2449,11 @@ void GModel::alignPeriodicBoundaries() std::map<MVertex *, MVertex *>::iterator vIter = v2v.find(vtx); if(vIter == v2v.end() || !vIter->second) { - Msg::Info("Could not find copy of vertex %d in face %d" - ", looking in entity %d of dimension %d", - vtx->getNum(), tgt->tag(), ge->tag(), ge->dim()); vIter = geV2v.find(vtx); if(vIter == geV2v.end() || !vIter->second) { - Msg::Error("Could not find copy of vertex %d in %d nor in %d", - vtx->getNum(), tgt->tag(), ge->tag()); + Msg::Debug("Could not find periodic counterpart of node %d in " + "surface %d or in entity %d of dimension %d", + vtx->getNum(), tgt->tag(), ge->tag(), ge->dim()); return; } else @@ -2422,8 +2470,8 @@ void GModel::alignPeriodicBoundaries() for(int iVtx = 0; iVtx < nbVtcs; iVtx++) { faceDef << vtcs[iVtx]->getNum() << " "; } - Msg::Error("Cannot find periodic counterpart of face %s in face %d " - "connected to %d", + Msg::Debug("Could not find periodic counterpart of mesh face %s in " + "surface %d connected to surface %d", faceDef.str().c_str(), tgt->tag(), src->tag()); return; } @@ -2439,11 +2487,11 @@ void GModel::alignPeriodicBoundaries() bool swap = false; if(!tgtFace.computeCorrespondence(srcFace, rotation, swap)) { - Msg::Error( - "Non-corresponding face %d-%d-%d (slave) %d-%d-%d (master)", - tgtElmt->getVertex(0)->getNum(), tgtElmt->getVertex(1)->getNum(), - tgtElmt->getVertex(2)->getNum(), srcElmt->getVertex(0)->getNum(), - srcElmt->getVertex(1)->getNum(), srcElmt->getVertex(2)->getNum()); + Msg::Debug("Could not find correspondance between mesh face %d-%d-%d (slave) " + "and %d-%d-%d (master)", + tgtElmt->getVertex(0)->getNum(), tgtElmt->getVertex(1)->getNum(), + tgtElmt->getVertex(2)->getNum(), srcElmt->getVertex(0)->getNum(), + srcElmt->getVertex(1)->getNum(), srcElmt->getVertex(2)->getNum()); return; } diff --git a/Geo/GModel.h b/Geo/GModel.h index 93a696f28c83b915a3633cc08005d329694c810f..9497edd62f9fe0e27158da3905ef7a046af68bbc 100644 --- a/Geo/GModel.h +++ b/Geo/GModel.h @@ -17,6 +17,18 @@ #include "GRegion.h" #include "SPoint3.h" #include "SBoundingBox3d.h" +#include "MFaceHash.h" +#include "MEdgeHash.h" + +// TODO C++11 remove this nasty stuff +#if __cplusplus >= 201103L +#include <unordered_map> +#define hashmapMFace std::unordered_map<MFace, int, Hash_Face, Equal_Face> +#define hashmapMEdge std::unordered_map<MEdge, int, Hash_Edge, Equal_Edge> +#else +#define hashmapMFace std::map<MFace, int, Less_Face> +#define hashmapMEdge std::map<MEdge, int, Less_Edge> +#endif template <class scalar> class simpleFunction; @@ -41,7 +53,8 @@ private: std::set<GFace *, GEntityLessThan> _chainFaces; std::set<GEdge *, GEntityLessThan> _chainEdges; std::set<GVertex *, GEntityLessThan> _chainVertices; - + hashmapMEdge _mapEdgeNum; + hashmapMFace _mapFaceNum; // the maximum vertex and element id number in the mesh std::size_t _maxVertexNum, _maxElementNum; std::size_t _checkPointedMaxVertexNum, _checkPointedMaxElementNum; @@ -226,6 +239,11 @@ public: maxe = _checkPointedMaxElementNum; } + // number the edges + int addMEdge(const MEdge &edge); + //number the faces + int addMFace(const MFace &face); + // renumber mesh vertices and elements in a continuous sequence (this // invalidates the mesh caches) void renumberMeshVertices(); @@ -442,7 +460,8 @@ public: std::size_t getNumMeshElements(unsigned c[6]); // access a mesh element by coordinates (using an octree search) - MElement *getMeshElementByCoord(SPoint3 &p, int dim = -1, bool strict = true); + MElement *getMeshElementByCoord(SPoint3 &p, SPoint3 ¶m, + int dim = -1, bool strict = true); std::vector<MElement *> getMeshElementsByCoord(SPoint3 &p, int dim = -1, bool strict = true); @@ -567,6 +586,12 @@ public: // optimize the mesh int optimizeMesh(const std::string &how); + // smooth the mesh + int smoothMesh(); + + // recombine the mesh + int recombineMesh(); + // fill the vertex arrays, given the current option and data bool fillVertexArrays(); diff --git a/Geo/GModelIO_BDF.cpp b/Geo/GModelIO_BDF.cpp index ab30c063075b6cbefeb9b430e7426cba1d33fcd5..65c45bc7e3794db529a70136bd40d7f64e142075 100644 --- a/Geo/GModelIO_BDF.cpp +++ b/Geo/GModelIO_BDF.cpp @@ -73,9 +73,9 @@ static int readVertexBDF(FILE *fp, char *buffer, int keySize, int *num, case 0: // free field case -1: // free field with continuation for(int i = 0; i < 5; i++) { - tmp[i][16] = '\0'; - strncpy(tmp[i], &buffer[j + 1], 16); - for(int k = 0; k < 16; k++) { + tmp[i][31] = '\0'; + strncpy(tmp[i], &buffer[j + 1], 31); + for(int k = 0; k < 31; k++) { if(tmp[i][k] == ',') tmp[i][k] = '\0'; } j++; @@ -86,7 +86,7 @@ static int readVertexBDF(FILE *fp, char *buffer, int keySize, int *num, if(!fgets(buffer2, sizeof(buffer2), fp)) return 0; j = 0; while(j < (int)strlen(buffer2) && buffer2[j] != ',') j++; - strncpy(tmp[4], &buffer2[j + 1], 16); + strncpy(tmp[4], &buffer2[j + 1], 31); } break; case 1: // small field diff --git a/Geo/GModelIO_GEO.cpp b/Geo/GModelIO_GEO.cpp index 2acdba0fa6930d0433d1490d694ad50b504d3fb2..e4f37494bb3be773830c3828c71276744ea312c5 100644 --- a/Geo/GModelIO_GEO.cpp +++ b/Geo/GModelIO_GEO.cpp @@ -132,6 +132,7 @@ bool GEO_Internals::addVertex(int &tag, double x, double y, return false; } if(tag < 0) tag = getMaxTag(0) + 1; + if(!lc) lc = MAX_LC; Vertex *v = CreateVertex(tag, x, y, surface, lc); Tree_Add(Points, &v); _changed = true; @@ -1289,10 +1290,10 @@ void GEO_Internals::synchronize(GModel *model) SetBoundingBox(); Msg::Debug("GModel imported:"); - Msg::Debug("%d vertices", model->getNumVertices()); - Msg::Debug("%d edges", model->getNumEdges()); - Msg::Debug("%d faces", model->getNumFaces()); - Msg::Debug("%d regions", model->getNumRegions()); + Msg::Debug("%d points", model->getNumVertices()); + Msg::Debug("%d curves", model->getNumEdges()); + Msg::Debug("%d surfaces", model->getNumFaces()); + Msg::Debug("%d volumes", model->getNumRegions()); _changed = false; } @@ -1626,9 +1627,9 @@ int GModel::exportDiscreteGEOInternals() _geo_internals->setMaxTag(3, maxv); Msg::Debug("Geo internal model has:"); - Msg::Debug("%d Vertices", Tree_Nbr(_geo_internals->Points)); - Msg::Debug("%d Edges", Tree_Nbr(_geo_internals->Curves)); - Msg::Debug("%d Faces", Tree_Nbr(_geo_internals->Surfaces)); + Msg::Debug("%d points", Tree_Nbr(_geo_internals->Points)); + Msg::Debug("%d curves", Tree_Nbr(_geo_internals->Curves)); + Msg::Debug("%d surfaces", Tree_Nbr(_geo_internals->Surfaces)); return 1; } diff --git a/Geo/GModelIO_MSH2.cpp b/Geo/GModelIO_MSH2.cpp index be183423e6b0f5647f018ed578a8f35bc73590d8..00757b3c00f4bcc9ec7811e5429e096b615098d6 100644 --- a/Geo/GModelIO_MSH2.cpp +++ b/Geo/GModelIO_MSH2.cpp @@ -29,7 +29,7 @@ // periodic nodes and entities backported from MSH3 format extern void writeMSHPeriodicNodes(FILE *fp, std::vector<GEntity *> &entities, - bool renumber); + bool renumber, bool saveAll); extern void readMSHPeriodicNodes(FILE *fp, GModel *gm); extern void writeMSHEntities(FILE *fp, GModel *gm); @@ -1082,7 +1082,7 @@ int GModel::_writeMSH2(const std::string &name, double version, bool binary, fprintf(fp, "$ENDELM\n"); } - writeMSHPeriodicNodes(fp, entities, renumberVertices); + writeMSHPeriodicNodes(fp, entities, renumberVertices, saveAll); fclose(fp); diff --git a/Geo/GModelIO_MSH3.cpp b/Geo/GModelIO_MSH3.cpp index 193109f145b077325f6f8608d65b53d0fdcde788..770087944a7330605bb5882aab58f62dd8e672b8 100644 --- a/Geo/GModelIO_MSH3.cpp +++ b/Geo/GModelIO_MSH3.cpp @@ -672,18 +672,25 @@ static void writeElementsMSH(FILE *fp, GModel *model, GEntity *ge, } void writeMSHPeriodicNodes(FILE *fp, std::vector<GEntity *> &entities, - bool renumber) // also used in MSH2 + bool renumber, bool saveAll) // also used in MSH2 { int count = 0; - for(std::size_t i = 0; i < entities.size(); i++) - if(entities[i]->getMeshMaster() != entities[i]) count++; + for(std::size_t i = 0; i < entities.size(); i++){ + if(entities[i]->getMeshMaster() != entities[i] && + (saveAll || (entities[i]->physicals.size() && + entities[i]->getMeshMaster()->physicals.size()))){ + count++; + } + } if(!count) return; fprintf(fp, "$Periodic\n"); fprintf(fp, "%d\n", count); for(std::size_t i = 0; i < entities.size(); i++) { GEntity *g_slave = entities[i]; GEntity *g_master = g_slave->getMeshMaster(); - if(g_slave != g_master) { + if(g_slave != g_master && + (saveAll || (entities[i]->physicals.size() && + entities[i]->getMeshMaster()->physicals.size()))){ fprintf(fp, "%d %d %d\n", g_slave->dim(), g_slave->tag(), g_master->tag()); @@ -819,7 +826,7 @@ int GModel::_writeMSH3(const std::string &name, double version, bool binary, fprintf(fp, "$EndElements\n"); // save periodic nodes - writeMSHPeriodicNodes(fp, entities, renumber); + writeMSHPeriodicNodes(fp, entities, renumber, saveAll); fclose(fp); diff --git a/Geo/GModelIO_MSH4.cpp b/Geo/GModelIO_MSH4.cpp index 2fedfc64df5e35811c54650d5dca7a0bb733ab9f..117444a290d8b9c7f82b44ff72b442af1a8062fb 100644 --- a/Geo/GModelIO_MSH4.cpp +++ b/Geo/GModelIO_MSH4.cpp @@ -108,10 +108,11 @@ static bool readMSH4BoundingEntities(GModel *const model, FILE *fp, if(!brep) { Msg::Warning("Entity %d not found in the Brep of entity %d", brepTags[i], entity->tag()); - return false; } - boundingEntities.push_back(brep); - boundingSign.push_back((std::abs(brepTags[i]) == brepTags[i] ? 1 : -1)); + else{ + boundingEntities.push_back(brep); + boundingSign.push_back((std::abs(brepTags[i]) == brepTags[i] ? 1 : -1)); + } } } else { @@ -135,10 +136,11 @@ static bool readMSH4BoundingEntities(GModel *const model, FILE *fp, if(!brep) { Msg::Warning("Entity %d not found in the Brep of entity %d", entityTag, entity->tag()); - return false; } - boundingEntities.push_back(brep); - boundingSign.push_back((std::abs(entityTag) == entityTag ? 1 : -1)); + else{ + boundingEntities.push_back(brep); + boundingSign.push_back((std::abs(entityTag) == entityTag ? 1 : -1)); + } } } diff --git a/Geo/GModelIO_OCC.cpp b/Geo/GModelIO_OCC.cpp index b50c41aa24dd49b4820e76a2f2dfcdcc4fa6a447..2da3012c398b505681840dbb0fd10345a6f10180 100644 --- a/Geo/GModelIO_OCC.cpp +++ b/Geo/GModelIO_OCC.cpp @@ -1189,24 +1189,25 @@ bool OCC_Internals::addBSpline(int &tag, const std::vector<int> &pointTags, const std::vector<double> &knots, const std::vector<int> &multiplicities) { - if(pointTags.size() < 2) { + int np = pointTags.size(); + if(np < 2) { Msg::Error("BSpline curve requires at least 2 control points"); return false; } int d = degree; std::vector<double> w(weights), k(knots); std::vector<int> m(multiplicities); - // degree 3 if not specified: + // degree 3 if not specified... if(d <= 0) d = 3; - // But degree nPts-1 if nPts is 2 or 3: - if(d > static_cast<int>(pointTags.size()) - 1) d = pointTags.size() - 1; + // ... or number of control points - 1 if not enough points + if(d > np - 1) d = np - 1; // automatic default weights if not provided: - if(w.empty()) w.resize(pointTags.size(), 1); + if(w.empty()) w.resize(np, 1); // automatic default knots and multiplicities if not provided: if(k.empty()) { bool periodic = (pointTags.front() == pointTags.back()); if(!periodic) { - int sum_of_all_mult = pointTags.size() + d + 1; + int sum_of_all_mult = np + d + 1; int num_knots = sum_of_all_mult - 2 * d; if(num_knots < 2) { Msg::Error("Not enough control points for building BSpline of " @@ -1220,7 +1221,7 @@ bool OCC_Internals::addBSpline(int &tag, const std::vector<int> &pointTags, m.back() = d + 1; } else { - k.resize(pointTags.size() - 1); + k.resize(np - d + 2); for(std::size_t i = 0; i < k.size(); i++) k[i] = i; m.resize(k.size(), 1); m.front() = d - 1; @@ -2274,8 +2275,13 @@ bool OCC_Internals::_extrude(int mode, if(e) Msg::Warning( "Structured meshes not yet available with OpenCASCADE pipe"); - // TODO - need to pass the profile, too - // dim = getReturnedShapes(c, (BRepFill_Pipe*)&pipe, top, body, lateral); + // Check if + // pipe.FirstShape() gives us "bottom" + // pipe.LastShape() gives us "top" + // pipe.Shape() gives us "body" + // using pipe.Spine(), pipe.{Face,Edge}(spine, c) gives us the lateral + // entities + //dim = getReturnedShapesForPipe(c, pipe, top, body, lateral); } } catch(Standard_Failure &err) { Msg::Error("OpenCASCADE exception %s", err.GetMessageString()); @@ -3328,6 +3334,67 @@ bool OCC_Internals::getVertex(int tag, double &x, double &y, double &z) return false; } +bool OCC_Internals::getMass(int dim, int tag, double &mass) +{ + if(!_isBound(dim, tag)) { + Msg::Error("Unknown OpenCASCADE entity of dimension %d with tag %d", dim, + tag); + return false; + } + TopoDS_Shape shape = _find(dim, tag); + GProp_GProps System; + switch(dim){ + case 1: BRepGProp::LinearProperties(shape, System); break; + case 2: BRepGProp::SurfaceProperties(shape, System); break; + case 3: BRepGProp::VolumeProperties(shape, System); break; + } + mass = System.Mass(); + return true; +} + +bool OCC_Internals::getCenterOfMass(int dim, int tag, double &x, double &y, double &z) +{ + if(!_isBound(dim, tag)) { + Msg::Error("Unknown OpenCASCADE entity of dimension %d with tag %d", dim, + tag); + return false; + } + TopoDS_Shape shape = _find(dim, tag); + GProp_GProps System; + switch(dim){ + case 1: BRepGProp::LinearProperties(shape, System); break; + case 2: BRepGProp::SurfaceProperties(shape, System); break; + case 3: BRepGProp::VolumeProperties(shape, System); break; + } + gp_Pnt c = System.CentreOfMass(); + x = c.X(); + y = c.Y(); + z = c.Z(); + return true; +} + +bool OCC_Internals::getMatrixOfInertia(int dim, int tag, std::vector<double> &mat) +{ + if(!_isBound(dim, tag)) { + Msg::Error("Unknown OpenCASCADE entity of dimension %d with tag %d", dim, + tag); + return false; + } + TopoDS_Shape shape = _find(dim, tag); + GProp_GProps System; + switch(dim){ + case 1: BRepGProp::LinearProperties(shape, System); break; + case 2: BRepGProp::SurfaceProperties(shape, System); break; + case 3: BRepGProp::VolumeProperties(shape, System); break; + } + gp_Mat m = System.MatrixOfInertia(); + mat.clear(); + for(int i = 1; i <= 3; i++) + for(int j = 1; j <= 3; j++) + mat.push_back(m.Value(i, j)); + return true; +} + bool const sortByInvDim(std::pair<int, int> const &lhs, std::pair<int, int> const &rhs) { @@ -3382,10 +3449,11 @@ void OCC_Internals::synchronize(GModel *model) tag = ++vTagMax; Msg::Info("Binding unbound OpenCASCADE point to tag %d", tag); } - double lc = _attributes->getMeshSize(0, vertex); - occv = new OCCVertex(model, tag, vertex, lc); + occv = new OCCVertex(model, tag, vertex); model->add(occv); } + double lc = _attributes->getMeshSize(0, vertex); + occv->setPrescribedMeshSizeAtVertex(lc); std::vector<std::string> labels; _attributes->getLabels(0, vertex, labels); if(labels.size()) model->setElementaryName(0, occv->tag(), labels[0]); diff --git a/Geo/GModelIO_OCC.h b/Geo/GModelIO_OCC.h index 9151079f3d636361ef6cc5b676c3e118f9ba534f..dc7231e8724d33af4d301565efa6485982548147 100644 --- a/Geo/GModelIO_OCC.h +++ b/Geo/GModelIO_OCC.h @@ -340,6 +340,9 @@ public: // queries bool getVertex(int tag, double &x, double &y, double &z); + bool getMass(int dim, int tag, double &mass); + bool getCenterOfMass(int dim, int tag, double &x, double &y, double &z); + bool getMatrixOfInertia(int dim, int tag, std::vector<double> &mat); GVertex *getVertexForOCCShape(GModel *model, const TopoDS_Vertex &toFind); GEdge *getEdgeForOCCShape(GModel *model, const TopoDS_Edge &toFind); GFace *getFaceForOCCShape(GModel *model, const TopoDS_Face &toFind); @@ -668,6 +671,15 @@ public: void setMeshSize(int dim, int tag, double size) {} void synchronize(GModel *model) {} bool getVertex(int tag, double &x, double &y, double &z) { return false; } + bool getMass(int dim, int tag, double &mass) { return false; } + bool getCenterOfMass(int dim, int tag, double &x, double &y, double &z) + { + return false; + } + bool getMatrixOfInertia(int dim, int tag, std::vector<double> &mat) + { + return false; + } bool makeRectangleSTL(double x, double y, double z, double dx, double dy, double roundedRadius, std::vector<SPoint3> &vertices, std::vector<SVector3> &normals, diff --git a/Geo/GModelIO_STL.cpp b/Geo/GModelIO_STL.cpp index f725a27f943f423eefe54f3f82fa31dc5d928197..c8c6af3fc44ef1f803c2c5ed20a65b7281f329bf 100644 --- a/Geo/GModelIO_STL.cpp +++ b/Geo/GModelIO_STL.cpp @@ -5,6 +5,7 @@ #include <stdio.h> #include <string> +#include <algorithm> #include <sstream> #include "GModel.h" #include "OS.h" @@ -16,6 +17,8 @@ #include "StringUtils.h" #include "Context.h" +static bool invalidChar(char c) { return !(c >= 32 && c <= 126); } + int GModel::readSTL(const std::string &name, double tolerance) { FILE *fp = Fopen(name.c_str(), "rb"); @@ -36,6 +39,8 @@ int GModel::readSTL(const std::string &name, double tolerance) return 0; } + //SPoint3 p0(1.9e6, 4e6, 0); + bool binary = strncmp(buffer, "solid", 5) && strncmp(buffer, "SOLID", 5); // ASCII STL @@ -70,6 +75,7 @@ int GModel::readSTL(const std::string &name, double tolerance) double x, y, z; if(sscanf(buffer, "%s %lf %lf %lf", s1, &x, &y, &z) != 4) break; SPoint3 p(x, y, z); + //p -= p0; points.back().push_back(p); bbox += p; } @@ -120,6 +126,7 @@ int GModel::readSTL(const std::string &name, double tolerance) if(swap) SwapBytes((char *)xyz, sizeof(float), 12); for(int j = 0; j < 3; j++) { SPoint3 p(xyz[3 + 3 * j], xyz[3 + 3 * j + 1], xyz[3 + 3 * j + 2]); + //p -= p0; points.back().push_back(p); bbox += p; } @@ -136,8 +143,8 @@ int GModel::readSTL(const std::string &name, double tolerance) names.resize(points.size()); } for(std::size_t i = 0; i < names.size(); i++){ - if(!names[i].empty() && names[i].at(names[i].size() - 1) == '\r') - names[i].resize(names[i].size() - 1); + names[i].erase(remove_if(names[i].begin(), names[i].end(), invalidChar), + names[i].end()); } std::vector<GFace *> faces; @@ -174,7 +181,7 @@ int GModel::readSTL(const std::string &name, double tolerance) pos.insert(vertices); std::set<MFace, Less_Face> unique; - int nbDuplic = 0; + int nbDuplic = 0, nbDegen = 0; for(std::size_t i = 0; i < points.size(); i++) { for(std::size_t j = 0; j < points[i].size(); j += 3) { MVertex *v[3]; @@ -195,11 +202,20 @@ int GModel::readSTL(const std::string &name, double tolerance) } } else{ - faces[i]->triangles.push_back(new MTriangle(v[0], v[1], v[2])); + if(v[0] == v[1] || v[0] == v[2] || v[1] == v[2]){ + Msg::Debug("Skipping degenerated triangle %lu %lu %lu", + v[0]->getNum(), v[1]->getNum(), v[2]->getNum()); + nbDegen++; + } + else{ + faces[i]->triangles.push_back(new MTriangle(v[0], v[1], v[2])); + } } } } - if(nbDuplic) Msg::Warning("%d duplicate triangles in STL file", nbDuplic); + if(nbDuplic || nbDegen) + Msg::Warning("%d duplicate/%d degenerate triangles in STL file", + nbDuplic, nbDegen); _associateEntityWithMeshVertices(); diff --git a/Geo/Geo.cpp b/Geo/Geo.cpp index dbfb9ca4a18e9e8a6ba80966eb65ca59c6434f06..939490c36eb67ccebb37d161a2e839d33123c663 100644 --- a/Geo/Geo.cpp +++ b/Geo/Geo.cpp @@ -527,14 +527,14 @@ Curve *CreateCurve(int Num, int Typ, int Order, List_T *Liste, List_T *Knots, pC->beg = v; } else { - Msg::Error("Unknown control point %d in GEO edge %d", p1, pC->Num); + Msg::Error("Unknown control point %d in GEO curve %d", p1, pC->Num); } if((v = FindPoint(p2))) { Msg::Info("Curve %d first control point %d ", pC->Num, v->Num); pC->end = v; } else { - Msg::Error("Unknown control point %d in GEO edge %d", p2, pC->Num); + Msg::Error("Unknown control point %d in GEO curve %d", p2, pC->Num); } } EndCurve(pC); @@ -3348,14 +3348,14 @@ void SortEdgesInLoop(int num, List_T *edges, bool orient) if((c = FindCurve(j))) { List_Add(temp, &c); if(c->Typ == MSH_SEGM_DISCRETE) { - Msg::Debug("Aborting line loop sort for discrete edge: " + Msg::Debug("Aborting curve loop sort for discrete curve: " "let's hope you know what you're doing ;-)"); List_Delete(temp); return; } } else { - Msg::Debug("Unknown curve %d, aborting line loop sort: " + Msg::Debug("Unknown curve %d, aborting curve loop sort: " "let's hope you know what you're doing ;-)", j); List_Delete(temp); @@ -3385,7 +3385,7 @@ void SortEdgesInLoop(int num, List_T *edges, bool orient) if(c2->end == c0->beg) { if(List_Nbr(temp)) { Msg::Info( - "Starting subloop %d in Line Loop %d (are you sure about this?)", + "Starting subloop %d in Curve Loop %d (are you sure about this?)", ++k, num); c0 = c1 = *(Curve **)List_Pointer(temp, 0); List_Add(edges, &c1->Num); @@ -3396,7 +3396,7 @@ void SortEdgesInLoop(int num, List_T *edges, bool orient) } } if(j++ > nbEdges) { - Msg::Error("Line Loop %d is wrong", num); + Msg::Error("Curve Loop %d is wrong", num); break; } } @@ -3417,7 +3417,7 @@ void SetSurfaceGeneratrices(Surface *s, List_T *loops) EdgeLoop *el; std::vector<int> fromModel; if(!(el = FindEdgeLoop(abs(iLoop)))) { - Msg::Error("Unknown line loop %d in GEO face %d", iLoop, s->Num); + Msg::Error("Unknown curve loop %d in GEO surface %d", iLoop, s->Num); List_Delete(s->Generatrices); s->Generatrices = NULL; return; diff --git a/Geo/GeoInterpolation.cpp b/Geo/GeoInterpolation.cpp index 351e22d29dae0e5de345776e71ea1e4850633314..cc1c45df746bb31728090933534dae8822dc3a4c 100644 --- a/Geo/GeoInterpolation.cpp +++ b/Geo/GeoInterpolation.cpp @@ -295,10 +295,12 @@ static Vertex InterpolateUBS(Curve *Curve, double u, int derivee) else { k = std::min(iCurve + i, NbControlPoints - 1); } - if(k < NbControlPoints) + + if(k >= 0 && k < NbControlPoints){ List_Read(Curve->Control_Points, k, &v[i]); + } else { - Msg::Error("Wrong control point inedx in bspline"); + Msg::Warning("Wrong control point index in bspline"); Vertex V; return V; } diff --git a/Geo/MEdge.h b/Geo/MEdge.h index a3f3145fdecca78059edbca179b72e9e0ab34787..0d9387f2e34642edc7e3acffdfe5f42566b798ac 100644 --- a/Geo/MEdge.h +++ b/Geo/MEdge.h @@ -8,6 +8,7 @@ #include "MVertex.h" #include "SVector3.h" +#include <iostream> // A mesh edge. class MEdge { @@ -118,7 +119,10 @@ inline bool operator!=(const MEdge &e1, const MEdge &e2) } struct Equal_Edge { - bool operator()(const MEdge &e1, const MEdge &e2) const { return (e1 == e2); } + bool operator()(const MEdge &e1, const MEdge &e2) const + { + return (e1 == e2); + } }; struct Less_Edge { diff --git a/Geo/MElement.cpp b/Geo/MElement.cpp index 68708939db0d9ee583e58316c21db00616568f86..0cafeffebbea2309790f42d05862cb0716c18f51 100644 --- a/Geo/MElement.cpp +++ b/Geo/MElement.cpp @@ -26,6 +26,8 @@ #include "Numeric.h" #include "CondNumBasis.h" #include "Context.h" +#include "FuncSpaceData.h" +#include "bezierBasis.h" #if defined(HAVE_MESH) #include "qualityMeasuresJacobian.h" @@ -181,7 +183,7 @@ char MElement::getVisibility() const MEdgeN MElement::getHighOrderEdge(int num, int sign) { const int order = getPolynomialOrder(); - std::vector<MVertex *> vertices((unsigned int)order + 1); + std::vector<MVertex *> vertices(static_cast<std::size_t>(order) + 1); vertices[0] = getVertex(numEdge2numVertex(num, sign > 0 ? 0 : 1)); vertices[1] = getVertex(numEdge2numVertex(num, sign > 0 ? 1 : 0)); const int start = getNumPrimaryVertices() + num * (order - 1); @@ -345,7 +347,7 @@ void MElement::scaledJacRange(double &jmin, double &jmax, GEntity *ge) const const int numJacNodes = jac->getNumJacNodes(); fullMatrix<double> nodesXYZ(jac->getNumMapNodes(), 3); getNodesCoord(nodesXYZ); - fullVector<double> SJi(numJacNodes), Bi(numJacNodes); + fullVector<double> SJi(numJacNodes); jac->getScaledJacobian(nodesXYZ, SJi); if(ge && (ge->dim() == 2) && ge->haveParametrization()) { // If parametrized surface entity provided... @@ -371,9 +373,9 @@ void MElement::scaledJacRange(double &jmin, double &jmax, GEntity *ge) const geoNorm(2) * elNorm(0, 2); if(scal < 0.) SJi.scale(-1.); } - jac->lag2Bez(SJi, Bi); - jmin = *std::min_element(Bi.getDataPtr(), Bi.getDataPtr() + Bi.size()); - jmax = *std::max_element(Bi.getDataPtr(), Bi.getDataPtr() + Bi.size()); + bezierCoeff Bi(jac->getFuncSpaceData(), SJi); + jmin = *std::min_element(Bi.getDataPtr(), Bi.getDataPtr() + Bi.getNumCoeff()); + jmax = *std::max_element(Bi.getDataPtr(), Bi.getDataPtr() + Bi.getNumCoeff()); #endif } @@ -385,7 +387,7 @@ void MElement::idealJacRange(double &jmin, double &jmax, GEntity *ge) const int numJacNodes = jac->getNumJacNodes(); fullMatrix<double> nodesXYZ(jac->getNumMapNodes(), 3); getNodesCoord(nodesXYZ); - fullVector<double> iJi(numJacNodes), Bi(numJacNodes); + fullVector<double> iJi(numJacNodes); jac->getSignedIdealJacobian(nodesXYZ, iJi); const int nEd = getNumEdges(), dim = getDim(); double sumEdLength = 0.; @@ -425,10 +427,9 @@ void MElement::idealJacRange(double &jmin, double &jmax, GEntity *ge) geoNorm(2) * elNorm(0, 2); if(dp < 0.) scale = -scale; } - iJi.scale(scale); - jac->lag2Bez(iJi, Bi); - jmin = *std::min_element(Bi.getDataPtr(), Bi.getDataPtr() + Bi.size()); - jmax = *std::max_element(Bi.getDataPtr(), Bi.getDataPtr() + Bi.size()); + bezierCoeff Bi(jac->getFuncSpaceData(), iJi); + jmin = *std::min_element(Bi.getDataPtr(), Bi.getDataPtr() + Bi.getNumCoeff()); + jmax = *std::max_element(Bi.getDataPtr(), Bi.getDataPtr() + Bi.getNumCoeff()); #endif } @@ -714,11 +715,24 @@ const nodalBasis *MElement::getFunctionSpace(int order, bool serendip) const return type ? BasisFactory::getNodalBasis(type) : NULL; } -const JacobianBasis *MElement::getJacobianFuncSpace(int order) const +const FuncSpaceData MElement::getFuncSpaceData(int order, bool serendip) const { - if(order == -1) return BasisFactory::getJacobianBasis(getTypeForMSH()); - int tag = ElementType::getType(getType(), order); - return BasisFactory::getJacobianBasis(tag); + if(order == -1) return FuncSpaceData(this); + return FuncSpaceData(this, order, serendip); +} + +const JacobianBasis *MElement::getJacobianFuncSpace(int orderElement) const +{ + if(orderElement == -1) return BasisFactory::getJacobianBasis(getTypeForMSH()); + int tag = ElementType::getType(getType(), orderElement); + return tag ? BasisFactory::getJacobianBasis(tag) : NULL; +} + +const FuncSpaceData MElement::getJacobianFuncSpaceData(int orderElement) const +{ + if(orderElement == -1) orderElement = getPolynomialOrder(); + int orderJac = JacobianBasis::jacobianOrder(this->getType(), orderElement); + return FuncSpaceData(this, orderJac, false); } static double _computeDeterminantAndRegularize(const MElement *ele, @@ -1429,8 +1443,9 @@ void MElement::writeMSH2(FILE *fp, double version, bool binary, int num, // tags change from element to element (third-party codes can // still write MSH file optimized for reading speed, by grouping // elements with the same number of tags in blobs) - int blob[60] = {type, 1, numTags, num ? num : (int)_num, - abs(physical), elementary, 1 + numGhosts, _partition}; + int blob[60] = { + type, 1, numTags, num ? num : (int)_num, + abs(physical), elementary, 1 + numGhosts, _partition}; if(ghosts) for(int i = 0; i < numGhosts; i++) blob[8 + i] = -(*ghosts)[i]; if(par) blob[8 + numGhosts] = parentNum; @@ -1660,7 +1675,8 @@ void MElement::writeVTK(FILE *fp, bool binary, bool bigEndian) if(binary) { int verts[60]; verts[0] = n; - for(int i = 0; i < n; i++) verts[i + 1] = (int)getVertexVTK(i)->getIndex() - 1; + for(int i = 0; i < n; i++) + verts[i + 1] = (int)getVertexVTK(i)->getIndex() - 1; // VTK always expects big endian binary data if(!bigEndian) SwapBytes((char *)verts, sizeof(int), n + 1); fwrite(verts, sizeof(int), n + 1, fp); @@ -2416,10 +2432,9 @@ MElement *MElement::copy(std::map<int, MVertex *> &vertexMap, } MElement *MElementFactory::create(int type, std::vector<MVertex *> &v, - std::size_t num, - int part, bool owner, int parent, - MElement *parent_ptr, MElement *d1, - MElement *d2) + std::size_t num, int part, bool owner, + int parent, MElement *parent_ptr, + MElement *d1, MElement *d2) { switch(type) { case MSH_PNT: return new MPoint(v, num, part); diff --git a/Geo/MElement.h b/Geo/MElement.h index c1d0b60be72681733cacb602698e92708c6e2ae3..4f188cce4e6df3d50f6c5a8c26143a3c994593f9 100644 --- a/Geo/MElement.h +++ b/Geo/MElement.h @@ -16,10 +16,10 @@ #include "MVertex.h" #include "MEdge.h" #include "MFace.h" -#include "FuncSpaceData.h" #include "nodalBasis.h" #include "polynomialBasis.h" #include "GaussIntegration.h" +#include "FuncSpaceData.h" class GModel; class JacobianBasis; @@ -57,7 +57,6 @@ protected: public: MElement(std::size_t num = 0, int part = 0); virtual ~MElement() {} - // set/get the tolerance for isInside() test static void setTolerance(const double tol); static double getTolerance(); @@ -114,7 +113,11 @@ public: { Msg::Error("Vertex information not available for this element"); } - + // get the face using the local orientation defined by Solin + virtual MFace getFaceSolin(int numFace) = 0; + // get the global vertex num of a edge using the local orientation defined by + // Solin + virtual int getVertexSolin(int numEdge, int numVertex) = 0; // get the vertex using the I-deas UNV ordering virtual MVertex *getVertexUNV(int num) { return getVertex(num); } @@ -316,9 +319,14 @@ public: // get the function space for the element virtual const nodalBasis *getFunctionSpace(int order = -1, bool serendip = false) const; + virtual const FuncSpaceData getFuncSpaceData(int order = -1, + bool serendip = false) const; // get the function space for the jacobian of the element - virtual const JacobianBasis *getJacobianFuncSpace(int order = -1) const; + virtual const JacobianBasis * + getJacobianFuncSpace(int orderElement = -1) const; + virtual const FuncSpaceData + getJacobianFuncSpaceData(int orderElement = -1) const; // return parametric coordinates (u,v,w) of a vertex virtual void getNode(int num, double &u, double &v, double &w) const; diff --git a/Geo/MElementCut.h b/Geo/MElementCut.h index 90e7b4afac691ae8495fb922428a7ff11c97a0aa..5085151b17b4870d6818860a567eba14c4fb13b9 100644 --- a/Geo/MElementCut.h +++ b/Geo/MElementCut.h @@ -193,6 +193,8 @@ public: { return 1; } + virtual int getVertexSolin(int numEdge, int numVertex){return 0;} + virtual MFace getFaceSolin(int numFace){return getFace(numFace);} }; class MPolygon : public MElement { @@ -357,6 +359,8 @@ public: { return 1; } + virtual int getVertexSolin(int numEdge, int numVertex){return 0;} + virtual MFace getFaceSolin(int numFace){return getFace(numFace);} }; class MLineChild : public MLine { diff --git a/Geo/MElementOctree.cpp b/Geo/MElementOctree.cpp index f1149c360fff3e14a48e496cac463fc2049772f9..ed27c292706caabe0018b2e99610bd63f39283c2 100644 --- a/Geo/MElementOctree.cpp +++ b/Geo/MElementOctree.cpp @@ -11,7 +11,6 @@ #include "fullMatrix.h" #include "bezierBasis.h" #include "BasisFactory.h" -#include "FuncSpaceData.h" void MElementBB(void *a, double *min, double *max) { @@ -35,10 +34,7 @@ void MElementBB(void *a, double *min, double *max) fullMatrix<double> nodesXYZ(e->getNumVertices(), 3); e->getNodesCoord(nodesXYZ); - fullMatrix<double> bezNodes(e->getNumVertices(), 3); - - const bezierBasis *bez = BasisFactory::getBezierBasis(FuncSpaceData(e)); - bez->lag2Bez(nodesXYZ, bezNodes); + bezierCoeff bezNodes(e->getFuncSpaceData(), nodesXYZ); min[0] = max[0] = bezNodes(0, 0); min[1] = max[1] = bezNodes(0, 1); min[2] = max[2] = bezNodes(0, 2); diff --git a/Geo/MFace.cpp b/Geo/MFace.cpp index bbb03bb85ac183cdf75006fc2acb2a1ed3a5e04a..cdd1db8b129278a10bd9483d7b288374f4375f1c 100644 --- a/Geo/MFace.cpp +++ b/Geo/MFace.cpp @@ -70,7 +70,120 @@ MFace::MFace(const std::vector<MVertex *> &v) for(std::size_t i = 0; i < v.size(); i++) _v.push_back(v[i]); sortVertices(_v, _si); } +void MFace::getOrientationFlagForFace(std::vector<int> &faceOrientationFlag) +{ // Reference : "Higher-Order Finite Element Methods"; Pavel Solin, Karel + // Segeth , + // Ivo Dolezel , Chapman and Hall/CRC; Edition : Har/Cdr + // (2003) + if(_v.size() == 3) { // triangular face + if(_v[int(_si[0])]->getNum() == _v[0]->getNum()) { + faceOrientationFlag[0] = 0; + if(_v[int(_si[1])]->getNum() == _v[1]->getNum()) { + faceOrientationFlag[1] = 1; + } + else { + faceOrientationFlag[1] = -1; + } + } + else { + if(_v[1]->getNum() == _v[int(_si[0])]->getNum()) { + faceOrientationFlag[0] = 1; + if(_v[0]->getNum() == _v[int(_si[2])]->getNum()) { + faceOrientationFlag[1] = 1; + } + else { + faceOrientationFlag[1] = -1; + } + } + else { + faceOrientationFlag[0] = 2; + if(_v[1]->getNum() == _v[int(_si[2])]->getNum()) { + faceOrientationFlag[1] = 1; + } + else { + faceOrientationFlag[1] = -1; + } + } + } + } + else { // quadrilateral face + int c = 0; + for(int i = 0; i < 4; i++) { + if(_v[int(_si[0])]->getNum() == unsigned(_v[i]->getNum())) { + c = i; + } + } + int indexopposedVertex = 0; + switch(c) { + case(0): indexopposedVertex = 3; break; + case(1): indexopposedVertex = 2; break; + case(2): indexopposedVertex = 1; break; + case(3): indexopposedVertex = 0; break; + } + int numVertexOpposed = _v[indexopposedVertex]->getNum(); + int axis1A = _v[int(_si[0])]->getNum(); + int axis1B = 0; + if(_v[int(_si[1])]->getNum() == unsigned(numVertexOpposed)) { + axis1B = _v[int(_si[2])]->getNum(); + } + else { + axis1B = _v[int(_si[1])]->getNum(); + } + if(unsigned(axis1A) == _v[0]->getNum()) { + if(unsigned(axis1B) == _v[1]->getNum()) { + faceOrientationFlag[0] = 1; + faceOrientationFlag[1] = 1; + faceOrientationFlag[2] = 1; + } + else { + faceOrientationFlag[0] = 1; + faceOrientationFlag[1] = 1; + faceOrientationFlag[2] = -1; + } + } + else { + if(unsigned(axis1A) == _v[1]->getNum()) { + if(unsigned(axis1B) == _v[0]->getNum()) { + faceOrientationFlag[0] = -1; + faceOrientationFlag[1] = 1; + faceOrientationFlag[2] = 1; + } + else { + faceOrientationFlag[0] = -1; + faceOrientationFlag[1] = 1; + faceOrientationFlag[2] = -1; + } + } + else { + if(unsigned(axis1A) == _v[2]->getNum()) { + if(unsigned(axis1B) == _v[3]->getNum()) { + faceOrientationFlag[0] = 1; + faceOrientationFlag[1] = -1; + faceOrientationFlag[2] = 1; + } + else { + faceOrientationFlag[0] = 1; + faceOrientationFlag[1] = -1; + faceOrientationFlag[2] = -1; + } + } + else { + if(unsigned(axis1B) == _v[2]->getNum()) { + faceOrientationFlag[0] = -1; + faceOrientationFlag[1] = -1; + faceOrientationFlag[2] = 1; + } + else { + faceOrientationFlag[0] = -1; + faceOrientationFlag[1] = -1; + faceOrientationFlag[2] = -1; + } + } + } + } + } +} double MFace::approximateArea() const { SPoint3 p0 = _v[0]->point(), p1 = _v[1]->point(), p2 = _v[2]->point(); @@ -120,7 +233,7 @@ MFaceN::MFaceN(int type, int order, const std::vector<MVertex *> &v) MEdgeN MFaceN::getHighOrderEdge(int num, int sign) const { int nCorner = getNumCorners(); - std::vector<MVertex *> vertices((unsigned int)_order + 1); + std::vector<MVertex *> vertices(static_cast<std::size_t>(_order) + 1); if(sign == 1) { vertices[0] = _v[num]; vertices[1] = _v[(num + 1) % nCorner]; diff --git a/Geo/MFace.h b/Geo/MFace.h index cccccc72b05cadb94ed845c89d6247d239ed2b43..14d296d8bd4fbfc827f49c33c35a1a93a207459f 100644 --- a/Geo/MFace.h +++ b/Geo/MFace.h @@ -33,7 +33,7 @@ public: { return MEdge(getVertex(i), getVertex((i + 1) % getNumVertices())); } - + void getOrientationFlagForFace(std::vector<int> &faceOrientationFlag); bool computeCorrespondence(const MFace &, int &, bool &) const; void getOrderedVertices(std::vector<MVertex *> &verts) const diff --git a/Geo/MFaceHash.h b/Geo/MFaceHash.h index 7355d802bb10c6810237d0536ea7264db18b8401..ad855613473cacc26e333f066b7554c5703c5bc2 100644 --- a/Geo/MFaceHash.h +++ b/Geo/MFaceHash.h @@ -12,7 +12,7 @@ struct Hash_Face : public std::unary_function<MFace, size_t> { size_t operator()(const MFace &f) const { - const MVertex *v[4]; + const MVertex *v[4] = {0, 0, 0, 0}; f.getOrderedVertices(v); return HashFNV1a<sizeof(MVertex * [4])>::eval(v); } diff --git a/Geo/MHexahedron.h b/Geo/MHexahedron.h index 0434fdda4c7404fb8cdf7092207bfec8593e6662..f706da0bc48162614fb7194803d85110d018466a 100644 --- a/Geo/MHexahedron.h +++ b/Geo/MHexahedron.h @@ -210,6 +210,18 @@ public: return e[face][edge]; } virtual int numCommonNodesInDualGraph(const MElement *const other) const; + virtual int getVertexSolin(int numEdge, int numVertex){ + static const int eSolin[12][2] = {{0, 1}, {0, 3}, {0, 4}, {1, 2}, + {1, 5}, {3, 2}, {2, 6}, {3, 7}, + {4, 5}, {4, 7}, {5, 6}, {7, 6}}; + return getVertex(eSolin[numEdge][numVertex])->getNum(); + } + virtual MFace getFaceSolin(int numFace){ + static const int fSolin[6][4] = {{0, 1, 3, 2}, {0, 1, 4, 5}, {0, 3, 4, 7}, + {1, 2, 5, 6}, {3, 2, 7, 6}, {4, 5, 7, 6}}; + return MFace(_v[fSolin[numFace][0]], _v[fSolin[numFace][1]], + _v[fSolin[numFace][2]], _v[fSolin[numFace][3]]); + } }; /* @@ -703,7 +715,7 @@ public: if(_order == 8 && _vs.size() + 8 == 92) return MSH_HEX_92; if(_order == 9 && _vs.size() + 8 == 104) return MSH_HEX_104; - Msg::Error("no tag matches a p%d hexahedron with %d vertices", _order, + Msg::Error("No MSH type found for P%d hexahedron with %d nodes", _order, 8 + _vs.size()); return 0; } diff --git a/Geo/MLine.cpp b/Geo/MLine.cpp index ffb1a5b7e6916aa9933290bdce102e2c9e3780ae..8decfa153f1b3321e07618d7ad1521168094a95d 100644 --- a/Geo/MLine.cpp +++ b/Geo/MLine.cpp @@ -117,8 +117,7 @@ void MLineN::discretize(double tol, std::vector<SPoint3> &dpts, lagNodes(i, 1) = v->y(); lagNodes(i, 2) = v->z(); } - const bezierBasis *bez = BasisFactory::getBezierBasis(TYPE_LIN, order); - bez->matrixLag2Bez.mult(lagNodes, bezNodes); + bezierCoeff bezNodes2(getFuncSpaceData(), lagNodes); std::vector<SPoint3> pts(bezNodes.size1()); pts[0][0] = bezNodes(0, 0); pts[0][1] = bezNodes(0, 1); diff --git a/Geo/MLine.h b/Geo/MLine.h index 798f4235001d34f6591098ed17689987c454dfc8..5010b493eeb6cac4af0d41c20d67777a86147329 100644 --- a/Geo/MLine.h +++ b/Geo/MLine.h @@ -12,6 +12,10 @@ /* * MLine * + * v + * ^ + * | + * | * 0-----+-----1 --> u * */ @@ -109,12 +113,20 @@ public: return ((other->getType() == TYPE_LIN || other->getType() == TYPE_PNT) ? 1 : 2); } + virtual int getVertexSolin(int numEdge, int numVertex){ + return getVertex(numVertex)->getNum(); + } + virtual MFace getFaceSolin(int numFace){return getFace(numFace);} }; /* * MLine3 * - * 0-----2----1 + * v + * ^ + * | + * | + * 0-----2-----1 --> u * */ class MLine3 : public MLine { @@ -187,7 +199,11 @@ public: /* * MLineN * - * 0---2---...-(N-1)-1 + * v + * ^ + * | + * | + * 0--2--...--(N-1)--1 --> u * */ class MLineN : public MLine { @@ -251,7 +267,7 @@ public: case 8: return MSH_LIN_10; case 9: return MSH_LIN_11; default: - Msg::Error("no tag matches a line with %d vertices", 8 + _vs.size()); + Msg::Error("No MSH type found for line with %d nodes", 8 + _vs.size()); return 0; } } diff --git a/Geo/MPoint.h b/Geo/MPoint.h index f8f60d2588c866a81f6c4bbad6dd830991910158..fe5b7145060bafe162fbba9cbbdf7886a9147c5e 100644 --- a/Geo/MPoint.h +++ b/Geo/MPoint.h @@ -90,6 +90,8 @@ public: { return 1; } + virtual int getVertexSolin(int numEdge, int numVertex){return 0;} + virtual MFace getFaceSolin(int numFace){return getFace(numFace);} }; #endif diff --git a/Geo/MPrism.h b/Geo/MPrism.h index c9e016e12467509e319872eed4307ed0a8017cc6..eca0528e8027af93ed2e22f6117feb3d8ad8d0cc 100644 --- a/Geo/MPrism.h +++ b/Geo/MPrism.h @@ -214,6 +214,24 @@ public: return f[face][edge]; } virtual int numCommonNodesInDualGraph(const MElement *const other) const; + virtual int getVertexSolin(int numEdge, int numVertex){ + static const int eSolin[9][2] = {{0, 1}, {0, 2}, {0, 3}, {1, 2}, {1, 4}, + {2, 5}, {3, 4}, {3, 5}, {4, 5}}; + return getVertex(eSolin[numEdge][numVertex])->getNum(); + } + virtual MFace getFaceSolin(int numFace){ + static const int fSolin[5][4] = { + {0, 1, 3, 4}, {0, 2, 3, 5}, {1, 2, 4, 5},{0, 1, 2, -1}, {3, 4, 5, -1}}; + if(numFace > 2){ + return MFace(_v[fSolin[numFace][0]],_v[fSolin[numFace][1]], + _v[fSolin[numFace][2]]); + } + else{ + return MFace(_v[fSolin[numFace][0]], _v[fSolin[numFace][1]], + _v[fSolin[numFace][2]], _v[fSolin[numFace][3]]); + } + + } }; /* @@ -602,7 +620,7 @@ public: if(_vs.size() == 72) return MSH_PRI_78; break; } - Msg::Error("No tag matches a p%d prism with %d vertices", _order, + Msg::Error("No MSH type found for P%d prism with %d nodes", _order, 6 + _vs.size()); return 0; } diff --git a/Geo/MPyramid.h b/Geo/MPyramid.h index 753302da2fde35bf3413a9a8e0619f9fb5bb7b45..32c151b230a2e54c2016dadaed39b948689015ff 100644 --- a/Geo/MPyramid.h +++ b/Geo/MPyramid.h @@ -196,6 +196,8 @@ public: return e[face][edge]; } virtual int numCommonNodesInDualGraph(const MElement *const other) const; + virtual int getVertexSolin(int numEdge, int numVertex){return 0;} + virtual MFace getFaceSolin(int numFace){return getFace(numFace);} }; /* @@ -335,7 +337,7 @@ public: if(_order == 7 && _vs.size() + 5 == 53) return MSH_PYR_53; if(_order == 8 && _vs.size() + 5 == 61) return MSH_PYR_61; if(_order == 9 && _vs.size() + 5 == 69) return MSH_PYR_69; - Msg::Error("no tag matches a p%d pyramid with %d vertices", _order, + Msg::Error("No MSH type found for P%d pyramid with %d nodes", _order, 5 + _vs.size()); return 0; } diff --git a/Geo/MQuadrangle.h b/Geo/MQuadrangle.h index 81ab3d1abaac8d7f69ac78398d62a33c08deb706..506e71bed83adaa0071d5ff0e6fc5c63ed3c6c4e 100644 --- a/Geo/MQuadrangle.h +++ b/Geo/MQuadrangle.h @@ -56,6 +56,7 @@ public: for(int i = 0; i < 4; i++) _v[i] = v[i]; } ~MQuadrangle() {} + virtual double etaShapeMeasure(); virtual double gammaShapeMeasure(); virtual int getDim() const { return 2; } @@ -171,10 +172,17 @@ public: virtual double getOuterRadius(); static int edges_quad(const int edge, const int vert) { - static const int e[4][2] = {{0, 1}, {1, 2}, {2, 3}, {3, 0}}; + static const int e[4][2] = {{0, 1}, {1, 2}, {2, 3}, {3, 0}}; return e[edge][vert]; } virtual int numCommonNodesInDualGraph(const MElement *const other) const; + virtual int getVertexSolin(int numEdge, int numVertex){ + static const int eSolin[4][2] = {{0, 1}, {1, 2}, {3, 2}, {0, 3}}; + return getVertex(eSolin[numEdge][numVertex])->getNum(); + } + virtual MFace getFaceSolin(int numFace){ + return MFace(_v[0], _v[1], _v[3], _v[2]); + } }; /* @@ -228,6 +236,7 @@ public: else _vs[num - 4] = v; } + virtual MVertex *getVertexUNV(int num) { static const int map[8] = {0, 4, 1, 5, 2, 6, 3, 7}; @@ -524,7 +533,7 @@ public: if(_order == 8 && _vs.size() + 4 == 32) return MSH_QUA_32; if(_order == 9 && _vs.size() + 4 == 36) return MSH_QUA_36I; if(_order == 10 && _vs.size() + 4 == 40) return MSH_QUA_40; - Msg::Error("no tag matches a p%d quadrangle with %d vertices", _order, + Msg::Error("No MSH type found for P%d quadrangle with %d nodes", _order, 4 + _vs.size()); return 0; } diff --git a/Geo/MTetrahedron.h b/Geo/MTetrahedron.h index f57ee22efac8f3fa07ba2f2a075d1405fa9e1e4d..a20b1dd2c23a9368978cf8f0ff97c0827c900092 100644 --- a/Geo/MTetrahedron.h +++ b/Geo/MTetrahedron.h @@ -198,6 +198,15 @@ public: return e[face][edge]; } virtual int numCommonNodesInDualGraph(const MElement *const other) const; + virtual int getVertexSolin(int numEdge, int numVertex){ + static const int eSolin[6][2] = {{0, 1}, {1, 2}, {2, 0}, {0, 3}, {2, 3}, {1, 3}}; + return getVertex(eSolin[numEdge][numVertex])->getNum(); + } + virtual MFace getFaceSolin(int numFace){ + static const int fSolin[4][3] = {{0, 1, 2}, {0, 1, 3}, {0, 2, 3}, {1, 2, 3}}; + return MFace(_v[fSolin[numFace][0]], _v[fSolin[numFace][1]], + _v[fSolin[numFace][2]]); + } }; /* @@ -472,7 +481,7 @@ public: if(_order == 8 && _vs.size() + 4 == 46) return MSH_TET_46; if(_order == 9 && _vs.size() + 4 == 52) return MSH_TET_52; if(_order == 10 && _vs.size() + 4 == 58) return MSH_TET_58; - Msg::Error("no tag matches a p%d tetrahedron with %d vertices", _order, + Msg::Error("No MSH type found for P%d tetrahedron with %d nodes", _order, 4 + _vs.size()); return 0; } diff --git a/Geo/MTriangle.h b/Geo/MTriangle.h index cc63fd7a0b5deb75e6013ab80fc8a7547d0df018..31f3b3556aa0256ab338b7947a844776b35cac8a 100644 --- a/Geo/MTriangle.h +++ b/Geo/MTriangle.h @@ -167,6 +167,11 @@ public: return e[edge][vert]; } virtual int numCommonNodesInDualGraph(const MElement *const other) const; + virtual int getVertexSolin(int numEdge, int numVertex){ + static const int eSolin[3][2] = {{0, 1}, {1, 2}, {2, 0}}; + return getVertex(eSolin[numEdge][numVertex])->getNum(); + } + virtual MFace getFaceSolin(int numFace){return getFace(numFace);} }; /* @@ -402,7 +407,7 @@ public: if(_order == 8 && _vs.size() == 21) return MSH_TRI_24; if(_order == 9 && _vs.size() == 24) return MSH_TRI_27; if(_order == 10 && _vs.size() == 27) return MSH_TRI_30; - Msg::Error("no tag matches a p%d triangle with %d vertices", _order, + Msg::Error("No MSH type found for P%d triangle with %d nodes", _order, 3 + _vs.size()); return 0; } diff --git a/Geo/MTrihedron.h b/Geo/MTrihedron.h index 9a95c844c7fb5a65300276d13441229452d0556c..604baa99cf9cd4fd6339dd74f7d16bf49c4cd56f 100644 --- a/Geo/MTrihedron.h +++ b/Geo/MTrihedron.h @@ -180,6 +180,8 @@ public: // order to put an edge between them in the dual graph used during the // partitioning. virtual int numCommonNodesInDualGraph(const MElement *const other) const; + virtual int getVertexSolin(int numEdge, int numVertex){return 0;} + virtual MFace getFaceSolin(int numFace){return getFace(numFace);} }; #endif diff --git a/Geo/OCCAttributes.h b/Geo/OCCAttributes.h index 0e3437d2885c9df22e2e5dfa6f3bf966a31f4da2..fcf54d9ff58481d588c30ac595d438eec6df72fe 100644 --- a/Geo/OCCAttributes.h +++ b/Geo/OCCAttributes.h @@ -241,7 +241,10 @@ public: double z = 0.5 * (zmin + zmax); double bmin[3] = {x - _tol, y - _tol, z - _tol}; double bmax[3] = {x + _tol, y + _tol, z + _tol}; - _rtree[v->getDim()]->Remove(bmin, bmax, v); + std::vector<OCCAttributes *> tmp; + _rtree[v->getDim()]->Search(bmin, bmax, rtree_callback, &tmp); + for(std::size_t i = 0; i < tmp.size(); i++) + _rtree[v->getDim()]->Remove(bmin, bmax, tmp[i]); } double getMeshSize(int dim, TopoDS_Shape shape) { @@ -295,7 +298,7 @@ public: int a = (int)(col[3] * 255); a = (a < 0) ? 0 : (a > 255) ? 255 : a; } - color = CTX::instance()->packColor(r, b, g, a); + color = CTX::instance()->packColor(r, g, b, a); boundary = (col.size() == 5) ? col[4] : 0; return true; } diff --git a/Geo/OCCEdge.cpp b/Geo/OCCEdge.cpp index 7b4a5cf2e518930cddbae4e529424ddbe4184ba1..7f5ad04ee475d3f780ca57f80ef2aa5233e40660 100644 --- a/Geo/OCCEdge.cpp +++ b/Geo/OCCEdge.cpp @@ -137,12 +137,12 @@ SPoint2 OCCEdge::reparamOnFace(const GFace *face, double epar, int dir) const double dy = p1.y() - p2.y(); double dz = p1.z() - p2.z(); if(sqrt(dx * dx + dy * dy + dz * dz) > CTX::instance()->geom.tolerance) { - Msg::Debug("Reparam on face was inaccurate for curve %d on surface %d " + Msg::Debug("Reparam on surface was inaccurate for curve %d on surface %d " "at point %g", tag(), face->tag(), epar); - Msg::Debug("On the face %d local (%g %g) global (%g %g %g)", + Msg::Debug("On the surface %d local (%g %g) global (%g %g %g)", face->tag(), u, v, p2.x(), p2.y(), p2.z()); - Msg::Debug("On the edge %d local (%g) global (%g %g %g)", tag(), epar, + Msg::Debug("On the curve %d local (%g) global (%g %g %g)", tag(), epar, p1.x(), p1.y(), p1.z()); double guess[2] = {u, v}; GPoint pp = face->closestPoint(SPoint3(p1.x(), p1.y(), p1.z()), guess); @@ -155,11 +155,11 @@ SPoint2 OCCEdge::reparamOnFace(const GFace *face, double epar, int dir) const dz = p1.z() - p2.z(); if(sqrt(dx * dx + dy * dy + dz * dz) > CTX::instance()->geom.tolerance) { - Msg::Warning("Closest Point was inaccurate for curve %d on surface %d " + Msg::Warning("Closest point was inaccurate for curve %d on surface %d " "at point %g", tag(), face->tag(), epar); - Msg::Warning("On the face %d local (%g %g) global (%g %g %g)", + Msg::Warning("On the surface %d local (%g %g) global (%g %g %g)", face->tag(), u, v, p2.x(), p2.y(), p2.z()); - Msg::Warning("On the edge %d local (%g) global (%g %g %g)", tag(), epar, + Msg::Warning("On the curve %d local (%g) global (%g %g %g)", tag(), epar, p1.x(), p1.y(), p1.z()); } } @@ -216,7 +216,7 @@ GPoint OCCEdge::point(double par) const return GPoint(pnt.X(), pnt.Y(), pnt.Z(), this, par); } else { - Msg::Warning("OCC Curve %d is neither a 3D curve not a trimmed curve", + Msg::Warning("OCC curve %d is neither a 3D curve not a trimmed curve", tag()); return GPoint(0, 0, 0); } diff --git a/Geo/OCCFace.cpp b/Geo/OCCFace.cpp index 5e1443496926a949dbf9448f5bdd537d51d0cb7d..4a9ca90be66f57ef7683b305f22b57b1654cf2f4 100644 --- a/Geo/OCCFace.cpp +++ b/Geo/OCCFace.cpp @@ -43,7 +43,7 @@ #include <BRepTools.hxx> OCCFace::OCCFace(GModel *m, TopoDS_Face _s, int num) -: GFace(m, num), s(_s),sf(_s, Standard_True), _radius(-1) + : GFace(m, num), s(_s), sf(_s, Standard_True), _radius(-1) { setup(); if(model()->getOCCInternals()) model()->getOCCInternals()->bind(s, num); @@ -69,18 +69,16 @@ void OCCFace::setup() for(exp2.Init(s.Oriented(TopAbs_FORWARD), TopAbs_WIRE); exp2.More(); exp2.Next()) { TopoDS_Wire wire = TopoDS::Wire(exp2.Current()); - Msg::Debug("OCC Face %d - New Wire", tag()); + Msg::Debug("OCC surface %d - new wire", tag()); std::vector<GEdge *> l_wire; for(exp3.Init(wire, TopAbs_EDGE); exp3.More(); exp3.Next()) { TopoDS_Edge edge = TopoDS::Edge(exp3.Current()); GEdge *e = 0; if(model()->getOCCInternals()) e = model()->getOCCInternals()->getEdgeForOCCShape(model(), edge); - if(!e) { - Msg::Error("Unknown edge in face %d", tag()); - } + if(!e) { Msg::Error("Unknown curve in face %d", tag()); } else if(edge.Orientation() == TopAbs_INTERNAL) { - Msg::Debug("Adding embedded edge %d in face %d", e->tag(), tag()); + Msg::Debug("Adding embedded curve %d in surface %d", e->tag(), tag()); embedded_edges.push_back(e); e->addFace(this); OCCEdge *occe = (OCCEdge *)e; @@ -88,7 +86,7 @@ void OCCFace::setup() } else { l_wire.push_back(e); - Msg::Debug("Edge %d (%d --> %d) ori %d", e->tag(), + Msg::Debug("Curve %d (%d --> %d) ori %d", e->tag(), e->getBeginVertex() ? e->getBeginVertex()->tag() : -1, e->getEndVertex() ? e->getEndVertex()->tag() : -1, edge.Orientation()); @@ -124,7 +122,7 @@ void OCCFace::setup() if(_periodic[1]) _period[1] = surface.VPeriod(); ShapeAnalysis::GetFaceUVBounds(s, umin, umax, vmin, vmax); - Msg::Debug("OCC Face %d with %d parameter bounds (%g,%g)(%g,%g)", tag(), + Msg::Debug("OCC surface %d with %d parameter bounds (%g,%g)(%g,%g)", tag(), l_edges.size(), umin, umax, vmin, vmax); // we do that for the projections to converge on the borders of the surface const double du = umax - umin; @@ -141,11 +139,9 @@ void OCCFace::setup() GVertex *v = 0; if(model()->getOCCInternals()) v = model()->getOCCInternals()->getVertexForOCCShape(model(), vertex); - if(!v) { - Msg::Error("Unknown vertex in face %d", tag()); - } + if(!v) { Msg::Error("Unknown point in surface %d", tag()); } else if(vertex.Orientation() == TopAbs_INTERNAL) { - Msg::Debug("Adding embedded vertex %d in face %d", v->tag(), tag()); + Msg::Debug("Adding embedded point %d in surface %d", v->tag(), tag()); embedded_vertices.insert(v); } } @@ -257,14 +253,12 @@ GPoint OCCFace::closestPoint(const SPoint3 &qp, const double initialGuess[2]) const { gp_Pnt pnt(qp.x(), qp.y(), qp.z()); - double a,b,c,d; - ShapeAnalysis::GetFaceUVBounds(s, a,b,c,d); - - // printf("minmax %g %g %g %g\n",umin, umax, vmin, vmax); - GeomAPI_ProjectPointOnSurf proj(pnt, occface, a,b,c,d); + double a, b, c, d; + ShapeAnalysis::GetFaceUVBounds(s, a, b, c, d); + GeomAPI_ProjectPointOnSurf proj(pnt, occface, a, b, c, d); if(!proj.NbPoints()) { - Msg::Debug("OCC Project Point on Surface FAIL"); + Msg::Debug("OCC projection of point on surface failed"); GPoint gp(0, 0); gp.setNoSuccess(); return gp; @@ -273,8 +267,6 @@ GPoint OCCFace::closestPoint(const SPoint3 &qp, double pp[2] = {initialGuess[0], initialGuess[1]}; proj.LowerDistanceParameters(pp[0], pp[1]); - - if((pp[0] < umin || umax < pp[0]) || (pp[1] < vmin || vmax < pp[1])) { Msg::Warning("Point projection is out of face bounds"); GPoint gp(0, 0); @@ -292,7 +284,7 @@ SPoint2 OCCFace::parFromPoint(const SPoint3 &qp, bool onSurface) const gp_Pnt pnt(qp.x(), qp.y(), qp.z()); GeomAPI_ProjectPointOnSurf proj(pnt, occface, umin, umax, vmin, vmax); if(!proj.NbPoints()) { - Msg::Error("OCC Project Point on Surface FAIL"); + Msg::Error("OCC projection of point on surface failed"); return GFace::parFromPoint(qp); } double U, V; @@ -324,13 +316,10 @@ GEntity::GeomType OCCFace::geomType() const double OCCFace::curvatureMax(const SPoint2 ¶m) const { const double eps = 1.e-12; - // BRepAdaptor_Surface sf(s, Standard_True); BRepLProp_SLProps prop(sf, 2, eps); prop.SetParameters(param.x(), param.y()); - if(!prop.IsCurvatureDefined()) { - return eps; - } + if(!prop.IsCurvatureDefined()) { return eps; } return std::max(fabs(prop.MinCurvature()), fabs(prop.MaxCurvature())); } @@ -340,13 +329,10 @@ double OCCFace::curvatures(const SPoint2 ¶m, SVector3 &dirMax, double &curvMin) const { const double eps = 1.e-12; - // BRepAdaptor_Surface sf(s, Standard_True); BRepLProp_SLProps prop(sf, 2, eps); prop.SetParameters(param.x(), param.y()); - if(!prop.IsCurvatureDefined()) { - return -1.; - } + if(!prop.IsCurvatureDefined()) { return -1.; } curvMax = prop.MaxCurvature(); curvMin = prop.MinCurvature(); @@ -404,7 +390,7 @@ bool OCCFace::containsPoint(const SPoint3 &pt) const return std::abs(angle) > 2 * M_PI - 0.5 && std::abs(angle) < 2 * M_PI + 0.5; } else - Msg::Error("Not Done Yet ..."); + Msg::Error("Not done yet..."); return false; } diff --git a/Geo/OCCRegion.cpp b/Geo/OCCRegion.cpp index 6a5677a2fd50ef4553314df1d2d77018d5e96339..809fae0fad4789a79de0610ff85b5e827f1d0b3b 100644 --- a/Geo/OCCRegion.cpp +++ b/Geo/OCCRegion.cpp @@ -43,17 +43,17 @@ void OCCRegion::setup() TopExp_Explorer exp2, exp3; for(exp2.Init(s, TopAbs_SHELL); exp2.More(); exp2.Next()) { const TopoDS_Shape &shell = exp2.Current(); - Msg::Debug("OCC Region %d - New Shell", tag()); + Msg::Debug("OCC volume %d - new shell", tag()); for(exp3.Init(shell, TopAbs_FACE); exp3.More(); exp3.Next()) { TopoDS_Face face = TopoDS::Face(exp3.Current()); GFace *f = 0; if(model()->getOCCInternals()) f = model()->getOCCInternals()->getFaceForOCCShape(model(), face); if(!f) { - Msg::Error("Unknown face in region %d", tag()); + Msg::Error("Unknown surface in volume %d", tag()); } else if(face.Orientation() == TopAbs_INTERNAL) { - Msg::Debug("Adding embedded face %d in region %d", f->tag(), tag()); + Msg::Debug("Adding embedded surface %d in volume %d", f->tag(), tag()); embedded_faces.push_back(f); } else { @@ -69,10 +69,10 @@ void OCCRegion::setup() if(model()->getOCCInternals()) e = model()->getOCCInternals()->getEdgeForOCCShape(model(), edge); if(!e) { - Msg::Error("Unknown edge in region %d", tag()); + Msg::Error("Unknown curve in volume %d", tag()); } else if(edge.Orientation() == TopAbs_INTERNAL) { - Msg::Debug("Adding embedded edge %d in region %d", e->tag(), tag()); + Msg::Debug("Adding embedded curve %d in volume %d", e->tag(), tag()); embedded_edges.push_back(e); // OCCEdge *occe = (OCCEdge*)e; // occe->setTrimmed(this); @@ -85,15 +85,15 @@ void OCCRegion::setup() if(model()->getOCCInternals()) v = model()->getOCCInternals()->getVertexForOCCShape(model(), vertex); if(!v) { - Msg::Error("Unknown vertex in region %d", tag()); + Msg::Error("Unknown point in volume %d", tag()); } else if(vertex.Orientation() == TopAbs_INTERNAL) { - Msg::Debug("Adding embedded vertex %d in region %d", v->tag(), tag()); + Msg::Debug("Adding embedded point %d in volume %d", v->tag(), tag()); embedded_vertices.push_back(v); } } - Msg::Debug("OCC Region %d with %d faces", tag(), l_faces.size()); + Msg::Debug("OCC volume %d with %d surfaces", tag(), l_faces.size()); } SBoundingBox3d OCCRegion::bounds(bool fast) const diff --git a/Geo/discreteVertex.cpp b/Geo/discreteVertex.cpp index 161c707220f999484d7da3b2a1ad6601511f1c8d..f4d142efc0d8ece4c845fa06b93725ada341bc5e 100644 --- a/Geo/discreteVertex.cpp +++ b/Geo/discreteVertex.cpp @@ -12,10 +12,10 @@ #include "Geo.h" discreteVertex::discreteVertex(GModel *m, int num, double x, double y, double z) - : GVertex(m, num), _x(x), _y(y), _z(z) + : GVertex(m, num) { - Vertex *v = CreateVertex(num, x, y, z, 0, 0); - Tree_Add(m->getGEOInternals()->Points, &v); + _v = CreateVertex(num, x, y, z, 0, 0); + Tree_Add(m->getGEOInternals()->Points, &_v); } discreteVertex::~discreteVertex() @@ -27,17 +27,29 @@ GPoint discreteVertex::point() const return GPoint(x(), y(), z(), this); } +void discreteVertex::setPosition(GPoint &p) +{ + _v->Pos.X = p.x(); + _v->Pos.Y = p.y(); + _v->Pos.Z = p.z(); + if(mesh_vertices.size()) { + mesh_vertices[0]->x() = p.x(); + mesh_vertices[0]->y() = p.y(); + mesh_vertices[0]->z() = p.z(); + } +} + double discreteVertex::x() const { - return mesh_vertices.size() ? mesh_vertices[0]->x() : _x; + return mesh_vertices.size() ? mesh_vertices[0]->x() : _v->Pos.X; } double discreteVertex::y() const { - return mesh_vertices.size() ? mesh_vertices[0]->y() : _y; + return mesh_vertices.size() ? mesh_vertices[0]->y() : _v->Pos.Y; } double discreteVertex::z() const { - return mesh_vertices.size() ? mesh_vertices[0]->z() : _z; + return mesh_vertices.size() ? mesh_vertices[0]->z() : _v->Pos.Z; } diff --git a/Geo/discreteVertex.h b/Geo/discreteVertex.h index b75780644504a671f308d95381557f57127553aa..28de2ab13276f77ab86dd5d91e1faf9ec7b61669 100644 --- a/Geo/discreteVertex.h +++ b/Geo/discreteVertex.h @@ -10,9 +10,11 @@ #include "GVertex.h" #include "MVertex.h" +class Vertex; + class discreteVertex : public GVertex { private: - double _x, _y, _z; + Vertex *_v; public: discreteVertex(GModel *m, int num, double x = 0., double y = 0., double z = 0.); @@ -21,6 +23,7 @@ public: virtual double x() const; virtual double y() const; virtual double z() const; + virtual void setPosition(GPoint &p); }; #endif diff --git a/Geo/gmshEdge.cpp b/Geo/gmshEdge.cpp index b51fb8be7be4c3494832a3febfdfb69a69b4faa8..82369660b136c6571e6996384a33f53d7fb3ad15 100644 --- a/Geo/gmshEdge.cpp +++ b/Geo/gmshEdge.cpp @@ -232,7 +232,7 @@ SPoint2 gmshEdge::reparamOnFace(const GFace *face, double epar, int dir) const } return InterpolateCubicSpline(v, t, c->mat, t1, t2, c->geometry, 0); } - default: Msg::Error("Unknown edge type in reparamOnFace"); return SPoint2(); + default: Msg::Error("Unknown curve type in reparamOnFace"); return SPoint2(); } } @@ -274,7 +274,7 @@ SPoint2 gmshEdge::reparamOnFace(const GFace *face, double epar, int dir) const U = 0; } else { - Msg::Info("Reparameterizing edge %d on face %d", c->Num, s->Num); + Msg::Info("Reparameterizing curve %d on surface %d", c->Num, s->Num); return GEdge::reparamOnFace(face, epar, dir); } return SPoint2(U, V); @@ -309,7 +309,7 @@ SPoint2 gmshEdge::reparamOnFace(const GFace *face, double epar, int dir) const V = 1; } else { - Msg::Info("Reparameterizing edge %d on face %d", c->Num, s->Num); + Msg::Info("Reparameterizing curve %d on surface %d", c->Num, s->Num); return GEdge::reparamOnFace(face, epar, dir); } } @@ -344,7 +344,7 @@ SPoint2 gmshEdge::reparamOnFace(const GFace *face, double epar, int dir) const V = hack ? 1 : U; } else { - Msg::Info("Reparameterizing edge %d on face %d", c->Num, s->Num); + Msg::Info("Reparameterizing curve %d on surface %d", c->Num, s->Num); return GEdge::reparamOnFace(face, epar, dir); } } diff --git a/Geo/gmshFace.cpp b/Geo/gmshFace.cpp index eadca6fa4343cc6d3b4b7afd9514f5951ab4e055..f4109c383396917b38c551a80c94fc642eaa6bb2 100644 --- a/Geo/gmshFace.cpp +++ b/Geo/gmshFace.cpp @@ -140,7 +140,7 @@ void gmshFace::resetMeshAttributes() if(gv) meshAttributes.corners.push_back(gv); else - Msg::Error("Unknown vertex %d in transfinite attributes", corn->Num); + Msg::Error("Unknown point %d in transfinite attributes", corn->Num); } } meshAttributes.reverseMesh = s->ReverseMesh; diff --git a/Geo/gmshRegion.cpp b/Geo/gmshRegion.cpp index 77162fe2cd249bc3b9c84b2a318e2f47c8a4ce02..e90ea28ddffe27229881c5ca83d725e6912e30cb 100644 --- a/Geo/gmshRegion.cpp +++ b/Geo/gmshRegion.cpp @@ -63,7 +63,7 @@ void gmshRegion::resetMeshAttributes() if(gv) meshAttributes.corners.push_back(gv); else - Msg::Error("Unknown vertex %d in transfinite attributes", corn->Num); + Msg::Error("Unknown point %d in transfinite attributes", corn->Num); } } } diff --git a/Mesh/BDS.cpp b/Mesh/BDS.cpp index 8c5ac7de56fdade3de3acd379f70601049dbab58..5f6efe6a44105a732c2946d219b1bc8d72ba7d65 100644 --- a/Mesh/BDS.cpp +++ b/Mesh/BDS.cpp @@ -34,7 +34,7 @@ double BDS_Face_Validity(GFace *gf, BDS_Face *f) { BDS_Point *pts[4]; f->getNodes(pts); - if(!pts[0] || !pts[1] || !pts[2]){ + if(!pts[0] || !pts[1] || !pts[2]) { Msg::Error("Null point in face validity"); return 0.; } @@ -98,17 +98,16 @@ void outputScalarField(std::vector<BDS_Face *> &t, const char *iii, int param, if(!(*tit)->deleted) { (*tit)->getNodes(pts); if(!param) { - fprintf(f, - "ST(%22.15E,%22.15E,%22.15E,%22.15E,%22.15E,%22.15E,%22.15E,%" - "22.15E,%22.15E){%g,%g,%g};\n", - pts[0]->X, pts[0]->Y, pts[0]->Z, pts[1]->X, pts[1]->Y, - pts[1]->Z, pts[2]->X, pts[2]->Y, pts[2]->Z, - (double)pts[0]->iD, (double)pts[1]->iD, (double)pts[2]->iD); + fprintf(f, + "ST(%22.15E,%22.15E,%22.15E,%22.15E,%22.15E,%22.15E,%22.15E,%" + "22.15E,%22.15E){%g,%g,%g};\n", + pts[0]->X, pts[0]->Y, pts[0]->Z, pts[1]->X, pts[1]->Y, + pts[1]->Z, pts[2]->X, pts[2]->Y, pts[2]->Z, (double)pts[0]->iD, + (double)pts[1]->iD, (double)pts[2]->iD); } if(param && gf) { if(pts[0]->degenerated + pts[1]->degenerated + pts[2]->degenerated > - 1) { - } + 1) {} else if(pts[0]->degenerated) fprintf(f, "SQ(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g){%g,%g,%g,%g};\n", pts[1]->u, pts[1]->v, 0.0, pts[2]->u, pts[2]->v, 0.0, @@ -132,8 +131,8 @@ void outputScalarField(std::vector<BDS_Face *> &t, const char *iii, int param, "ST(%22.15E,%22.15E,%22.15E,%22.15E,%22.15E,%22.15E,%22.15E,%" "22.15E,%22.15E){%g,%g,%g};\n", pts[0]->u, pts[0]->v, 0.0, pts[1]->u, pts[1]->v, 0.0, - pts[2]->u, pts[2]->v, 0.0, - (double)pts[0]->iD, (double)pts[1]->iD, (double)pts[2]->iD); + pts[2]->u, pts[2]->v, 0.0, (double)pts[0]->iD, + (double)pts[1]->iD, (double)pts[2]->iD); } } } @@ -173,7 +172,7 @@ static double surface_triangle_param(BDS_Point *p1, BDS_Point *p2, BDS_Point *p3 // THIS ASSUMES DEGENERATED EDGES ALONG AXIS U !!! // SEEMS TO BE THE CASE WITH OCC - if(!p1 || !p2 || !p3){ + if(!p1 || !p2 || !p3) { Msg::Error("Null point"); return 0; } @@ -457,21 +456,15 @@ BDS_Face *BDS_Mesh::find_triangle(BDS_Edge *e1, BDS_Edge *e2, BDS_Edge *e3) { for(int i = 0; i < e1->numfaces(); i++) { BDS_Face *t = e1->faces(i); - if(is_equivalent(e1, e2, e3, t->e1, t->e2, t->e3)) { - return t; - } + if(is_equivalent(e1, e2, e3, t->e1, t->e2, t->e3)) { return t; } } for(int i = 0; i < e2->numfaces(); i++) { BDS_Face *t = e2->faces(i); - if(is_equivalent(e1, e2, e3, t->e1, t->e2, t->e3)) { - return t; - } + if(is_equivalent(e1, e2, e3, t->e1, t->e2, t->e3)) { return t; } } for(int i = 0; i < e3->numfaces(); i++) { BDS_Face *t = e3->faces(i); - if(is_equivalent(e1, e2, e3, t->e1, t->e2, t->e3)) { - return t; - } + if(is_equivalent(e1, e2, e3, t->e1, t->e2, t->e3)) { return t; } } return 0; } @@ -498,14 +491,13 @@ BDS_Face *BDS_Mesh::add_triangle(int p1, int p2, int p3) BDS_Edge *e1 = add_edge(p1, p2); BDS_Edge *e2 = add_edge(p2, p3); BDS_Edge *e3 = add_edge(p3, p1); - if(e1 && e2 && e3) - return add_triangle(e1, e2, e3); + if(e1 && e2 && e3) return add_triangle(e1, e2, e3); return 0; } BDS_Face *BDS_Mesh::add_triangle(BDS_Edge *e1, BDS_Edge *e2, BDS_Edge *e3) { - if(e1 && e2 && e3){ + if(e1 && e2 && e3) { BDS_Face *t = new BDS_Face(e1, e2, e3); triangles.push_back(t); return t; @@ -534,14 +526,14 @@ void BDS_Mesh::del_edge(BDS_Edge *e) void BDS_Mesh::del_point(BDS_Point *p) { if(!p) return; - if(points.erase(p)) - delete p; + if(points.erase(p)) delete p; } void BDS_Mesh::add_geom(int p1, int p2) { BDS_GeomEntity *e = new BDS_GeomEntity(p1, p2); - std::pair<std::set<BDS_GeomEntity *, GeomLessThan>::iterator, bool> res = geom.insert(e); + std::pair<std::set<BDS_GeomEntity *, GeomLessThan>::iterator, bool> res = + geom.insert(e); if(!res.second) delete e; } @@ -613,28 +605,30 @@ void recur_tag(BDS_Face *t, BDS_GeomEntity *g) // BDS_Point *pts[4]; // t->getNodes(pts); - // printf("starting with trioangle %d %d %d\n",pts[0]->iD,pts[1]->iD,pts[2]->iD); + // printf("starting with trioangle %d %d + // %d\n",pts[0]->iD,pts[1]->iD,pts[2]->iD); while(!_stack.empty()) { t = _stack.top(); _stack.pop(); if(!t->g) { // t->getNodes(pts); - // printf("now in trioangle %d %d %d\n",pts[0]->iD,pts[1]->iD,pts[2]->iD); + // printf("now in trioangle %d %d + // %d\n",pts[0]->iD,pts[1]->iD,pts[2]->iD); t->g = g; // g->t.push_back(t); if(!t->e1->g && t->e1->numfaces() == 2) { - // printf("going through %d %d\n",t->e1->p1->iD,t->e1->p2->iD); + // printf("going through %d %d\n",t->e1->p1->iD,t->e1->p2->iD); _stack.push(t->e1->otherFace(t)); // recur_tag(t->e1->otherFace(t), g); } if(!t->e2->g && t->e2->numfaces() == 2) { - // printf("going through %d %d\n",t->e2->p1->iD,t->e2->p2->iD); + // printf("going through %d %d\n",t->e2->p1->iD,t->e2->p2->iD); _stack.push(t->e2->otherFace(t)); // recur_tag(t->e2->otherFace(t), g); } if(!t->e3->g && t->e3->numfaces() == 2) { - // printf("going through %d %d\n",t->e3->p1->iD,t->e3->p2->iD); + // printf("going through %d %d\n",t->e3->p1->iD,t->e3->p2->iD); _stack.push(t->e3->otherFace(t)); // recur_tag(t->e3->otherFace(t), g); } @@ -716,8 +710,8 @@ bool BDS_Mesh::split_edge(BDS_Edge *e, BDS_Point *mid) int CHECK1 = -1, CHECK2 = 46; if(p1->iD == CHECK1 && p2->iD == CHECK2) - printf("splitting edge %d %d opp %d %d new %d\n", - p1->iD, p2->iD, op[0]->iD, op[1]->iD,mid->iD); + printf("splitting edge %d %d opp %d %d new %d\n", p1->iD, p2->iD, op[0]->iD, + op[1]->iD, mid->iD); double ori0 = fabs(surface_triangle_param(p2, p1, op[0])) + fabs(surface_triangle_param(p2, p1, op[1])); @@ -865,11 +859,9 @@ bool BDS_SwapEdgeTestQuality::operator()(BDS_Point *_p1, BDS_Point *_p2, double s2 = fabs(surface_triangle_param(_p1, _p2, _q2)); double s3 = fabs(surface_triangle_param(_p1, _q1, _q2)); double s4 = fabs(surface_triangle_param(_p2, _q1, _q2)); - if(fabs(s1 + s2 - s3 - s4) > 1.e-12 * (s3 + s4)) { - return false; - } + if(fabs(s1 + s2 - s3 - s4) > 1.e-12 * (s3 + s4)) { return false; } // THIS WAS CAUSIN' TROUBLES ... - //if(s3 < .02 * (s1 + s2) || s4 < .02 * (s1 + s2)) return false; + // if(s3 < .02 * (s1 + s2) || s4 < .02 * (s1 + s2)) return false; /* if(!testSmallTriangles) { @@ -943,15 +935,15 @@ bool BDS_SwapEdgeTestQuality::operator()(BDS_Point *_p1, BDS_Point *_p2, { // Check if new edge is not on a seam or degenerated BDS_Point *p1 = 0, *p2 = 0; - if (_op1 != _oq1 && _op1 != _oq2 && _op1 != _oq3){ + if(_op1 != _oq1 && _op1 != _oq2 && _op1 != _oq3) { p1 = _op2; p2 = _op3; } - else if (_op2 != _oq1 && _op2 != _oq2 && _op2 != _oq3){ + else if(_op2 != _oq1 && _op2 != _oq2 && _op2 != _oq3) { p1 = _op1; p2 = _op3; } - else if (_op3 != _oq1 && _op3 != _oq2 && _op3 != _oq3){ + else if(_op3 != _oq1 && _op3 != _oq2 && _op3 != _oq3) { p1 = _op1; p2 = _op2; } @@ -959,9 +951,9 @@ bool BDS_SwapEdgeTestQuality::operator()(BDS_Point *_p1, BDS_Point *_p2, Msg::Warning("Unable to detect the new edge in BDS_SwapEdgeTestQuality\n"); } - if (p1 && p2){ - if (p1->degenerated && p2->degenerated) return false; - if (p1->_periodicCounterpart && p2->_periodicCounterpart) return false; + if(p1 && p2) { + if(p1->degenerated && p2->degenerated) return false; + if(p1->_periodicCounterpart && p2->_periodicCounterpart) return false; } if(!testQuality) return true; @@ -997,9 +989,7 @@ bool BDS_SwapEdgeTestNormals::operator()(BDS_Point *_p1, BDS_Point *_p2, double s2 = fabs(surface_triangle_param(_p1, _p2, _q2)); double s3 = fabs(surface_triangle_param(_p1, _q1, _q2)); double s4 = fabs(surface_triangle_param(_p2, _q1, _q2)); - if(fabs(s1 + s2 - s3 - s4) > 1.e-12 * (s3 + s4)) { - return false; - } + if(fabs(s1 + s2 - s3 - s4) > 1.e-12 * (s3 + s4)) { return false; } // if(s3 < .02 * (s1 + s2) || s4 < .02 * (s1 + s2)) return false; return true; } @@ -1047,9 +1037,7 @@ bool BDS_Mesh::swap_edge(BDS_Edge *e, const BDS_SwapEdgeTest &theTest, */ // we test if the edge is deleted - //return false; - - + // return false; BDS_Point *p1 = e->p1; BDS_Point *p2 = e->p2; @@ -1067,7 +1055,7 @@ bool BDS_Mesh::swap_edge(BDS_Edge *e, const BDS_SwapEdgeTest &theTest, BDS_Point *pts1[4]; BDS_Point *pts2[4]; e->computeNeighborhood(pts1, pts2, op); - if (!op[0] || !op[1]) return false; + if(!op[0] || !op[1]) return false; if(p1->iD == CHECK1 && p2->iD == CHECK2) { printf("- e %d %d --> %d %d\n", p1->iD, p2->iD, op[0]->iD, op[1]->iD); @@ -1216,7 +1204,7 @@ bool BDS_Mesh::collapse_edge_parametric(BDS_Edge *e, BDS_Point *p, bool force) if(e->numfaces() == 2) { BDS_Point *oface[2]; e->oppositeof(oface); - if(!oface[0] || !oface[1]){ + if(!oface[0] || !oface[1]) { Msg::Error("Null opposite face"); return false; } @@ -1241,7 +1229,6 @@ bool BDS_Mesh::collapse_edge_parametric(BDS_Edge *e, BDS_Point *p, bool force) oface[1]->edges.size() <= 3) return false; } - // if (p->iD == 17127)printf("b \n"); std::vector<BDS_Face *> t = p->getTriangles(); BDS_Point *o = e->othervertex(p); @@ -1266,27 +1253,24 @@ bool BDS_Mesh::collapse_edge_parametric(BDS_Edge *e, BDS_Point *p, bool force) pt[0][nt] = (pts[0] == p) ? o : pts[0]; pt[1][nt] = (pts[1] == p) ? o : pts[1]; pt[2][nt] = (pts[2] == p) ? o : pts[2]; - if(!pt[0][nt] || !pt[1][nt] || !pt[2][nt]){ + if(!pt[0][nt] || !pt[1][nt] || !pt[2][nt]) { Msg::Error("Null point"); return false; } double snew = std::abs(surface_triangle_param(pt[0][nt], pt[1][nt], pt[2][nt])); - if(!force && snew < .02 * sold) { - return false; - } + if(!force && snew < .02 * sold) { return false; } area_new += snew; ++nt; } ++it; } } - // if (p->iD == 17127)printf("c %d\n",nt); - // if(!force && nt == 2) return false; - // if (p->iD == 17127)printf("d \n"); - if(!force && fabs(area_old - area_new) > 1.e-12 * (area_old + area_new)){ - // printf("%g %g\n",fabs(area_old - area_new),1.e-12 * (area_old + area_new)); + // if(!force && nt == 2) return false; + + if(!force && fabs(area_old - area_new) > 1.e-12 * (area_old + area_new)) { + // printf("%g %g\n", fabs(area_old - area_new), 1.e-12 * (area_old + area_new)); return false; } { @@ -1305,7 +1289,7 @@ bool BDS_Mesh::collapse_edge_parametric(BDS_Edge *e, BDS_Point *p, bool force) (*eit)->p1->config_modified = (*eit)->p2->config_modified = true; ept[0][kk] = ((*eit)->p1 == p) ? (o ? o->iD : -1) : (*eit)->p1->iD; ept[1][kk] = ((*eit)->p2 == p) ? (o ? o->iD : -1) : (*eit)->p2->iD; - if(ept[0][kk] < 0 || ept[1][kk] < 0){ + if(ept[0][kk] < 0 || ept[1][kk] < 0) { Msg::Error("Something wrong in edge collapse!"); return false; } @@ -1337,128 +1321,140 @@ bool BDS_Mesh::collapse_edge_parametric(BDS_Edge *e, BDS_Point *p, bool force) // Tutte's simple smoothing // other implementations are coming -static inline bool validityOfCavity (const BDS_Point *p, const std::vector<BDS_Point *> & nbg){ +static inline bool validityOfCavity(const BDS_Point *p, + const std::vector<BDS_Point *> &nbg) +{ double p_[2] = {p->u, p->v}; double q_[2] = {nbg[0]->degenerated ? nbg[1]->u : nbg[0]->u, nbg[0]->v}; double r_[2] = {nbg[1]->degenerated ? nbg[0]->u : nbg[1]->u, nbg[1]->v}; double sign = robustPredicates::orient2d(p_, q_, r_); - for (size_t i=1 ; i< nbg.size(); ++i){ + for(size_t i = 1; i < nbg.size(); ++i) { BDS_Point *p0 = nbg[i]; - BDS_Point *p1 = nbg[(i+1)%nbg.size()]; + BDS_Point *p1 = nbg[(i + 1) % nbg.size()]; double qq_[2] = {p0->degenerated ? p1->u : p0->u, p0->v}; double rr_[2] = {p1->degenerated ? p0->u : p1->u, p1->v}; double sign_ = robustPredicates::orient2d(p_, qq_, rr_); - if (sign * sign_ <= 0)return false; + if(sign * sign_ <= 0) return false; } return true; } - -static inline bool getOrderedNeighboringVertices (BDS_Point *p, - std::vector<BDS_Point *> & nbg, - std::vector<BDS_Face *> & ts, - int CHECK){ - - if (p->iD == CHECK){ - for (size_t i = 0 ; i < ts.size() ; i++){ +static inline bool getOrderedNeighboringVertices(BDS_Point *p, + std::vector<BDS_Point *> &nbg, + std::vector<BDS_Face *> &ts, + int CHECK) +{ + if(p->iD == CHECK) { + for(size_t i = 0; i < ts.size(); i++) { BDS_Point *pts[4]; - ts[i]->getNodes(pts); - printf("TR %d : %d %d %d\n",i,pts[0]->iD,pts[1]->iD,pts[2]->iD); + ts[i]->getNodes(pts); + // printf("TR %d : %d %d %d\n",i,pts[0]->iD,pts[1]->iD,pts[2]->iD); } } - if (ts.empty())return false; - while (1){ + if(ts.empty()) return false; + while(1) { bool found = false; - for (size_t i = 0 ; i < ts.size() ; i++){ + for(size_t i = 0; i < ts.size(); i++) { BDS_Point *pts[4]; ts[i]->getNodes(pts); BDS_Point *pp[2]; - if (pts[0] == p){pp[0] = pts[1] ; pp[1] = pts[2]; } - else if (pts[1] == p){pp[0] = pts[0] ; pp[1] = pts[2]; } - else {pp[0] = pts[0] ; pp[1] = pts[1]; } - if (nbg.empty()){ - nbg.push_back(pp[0]); - nbg.push_back(pp[1]); - found = true; - break; + if(pts[0] == p) { + pp[0] = pts[1]; + pp[1] = pts[2]; + } + else if(pts[1] == p) { + pp[0] = pts[0]; + pp[1] = pts[2]; + } + else { + pp[0] = pts[0]; + pp[1] = pts[1]; + } + if(nbg.empty()) { + nbg.push_back(pp[0]); + nbg.push_back(pp[1]); + found = true; + break; } else { - BDS_Point *p0 = nbg[nbg.size() - 2]; - BDS_Point *p1 = nbg[nbg.size() - 1]; - if (p1 == pp[0] && p0 != pp[1]){ - nbg.push_back(pp[1]); - found = true; - break; - } - else if (p1 == pp[1] && p0 != pp[0]){ - nbg.push_back(pp[0]); - found = true; - break; - } + BDS_Point *p0 = nbg[nbg.size() - 2]; + BDS_Point *p1 = nbg[nbg.size() - 1]; + if(p1 == pp[0] && p0 != pp[1]) { + nbg.push_back(pp[1]); + found = true; + break; + } + else if(p1 == pp[1] && p0 != pp[0]) { + nbg.push_back(pp[0]); + found = true; + break; + } } } - - if (nbg.size() == ts.size()) break; - if (!found) return false; + + if(nbg.size() == ts.size()) break; + if(!found) return false; } - - if (p->iD == CHECK){ + + if(p->iD == CHECK) { printf("FINALLY : "); - for (size_t i=0;i< nbg.size() ;i++){ - printf("%d ",nbg[i]->iD); - } + for(size_t i = 0; i < nbg.size(); i++) { printf("%d ", nbg[i]->iD); } printf("\n"); } return true; } -static inline double getTutteEnergy (const BDS_Point *p, const std::vector<BDS_Point *> & nbg, double &RATIO) +static inline double getTutteEnergy(const BDS_Point *p, + const std::vector<BDS_Point *> &nbg, + double &RATIO) { double E = 0; - double MAX,MIN; - for (size_t i=0;i<nbg.size();++i){ + double MAX, MIN; + for(size_t i = 0; i < nbg.size(); ++i) { const double dx = p->X - nbg[i]->X; const double dy = p->Y - nbg[i]->Y; const double dz = p->Z - nbg[i]->Z; - const double l2 = dx*dx+dy*dy+dz*dz; - MAX = i ? std::max(MAX,l2) : l2; - MIN = i ? std::min(MIN,l2) : l2; + const double l2 = dx * dx + dy * dy + dz * dz; + MAX = i ? std::max(MAX, l2) : l2; + MIN = i ? std::min(MIN, l2) : l2; E += l2; } - RATIO = MIN/MAX; + RATIO = MIN / MAX; return E; } -static inline void getCentroidUV (const BDS_Point *p, GFace *gf, - const std::vector<SPoint2> & kernel, - const std::vector<double> &lc, - double &U, double &V, double &LC){ +static inline void getCentroidUV(const BDS_Point *p, GFace *gf, + const std::vector<SPoint2> &kernel, + const std::vector<double> &lc, double &U, + double &V, double &LC) +{ U = V = LC = 0.; double factSum = 0; - for (size_t i=0;i<kernel.size();++i){ - GPoint gp = gf->point (kernel[i]); + for(size_t i = 0; i < kernel.size(); ++i) { + GPoint gp = gf->point(kernel[i]); double du = p->u - gp.u(); double dv = p->v - gp.v(); double dx = p->X - gp.x(); double dy = p->Y - gp.y(); double dz = p->Z - gp.z(); - double fact = sqrt((dx*dx+dy*dy+dz*dz)/(du*du+dv*dv)); + double fact = sqrt((dx * dx + dy * dy + dz * dz) / (du * du + dv * dv)); factSum += fact; - U += kernel[i].x()*fact; - V += kernel[i].y()*fact; - LC += lc[i]*fact; + U += kernel[i].x() * fact; + V += kernel[i].y() * fact; + LC += lc[i] * fact; } U /= factSum; V /= factSum; LC /= factSum; } -static inline void getCentroidUV (const std::vector<SPoint2> & kernel, - const std::vector<double> &lc, - double &U, double &V, double &LC){ +static inline void getCentroidUV(const std::vector<SPoint2> &kernel, + const std::vector<double> &lc, double &U, + double &V, double &LC) +{ U = V = LC = 0.; - for (size_t i=0;i<kernel.size();++i){ + for(size_t i = 0; i < kernel.size(); ++i) { U += kernel[i].x(); V += kernel[i].y(); LC += lc[i]; @@ -1468,9 +1464,9 @@ static inline void getCentroidUV (const std::vector<SPoint2> & kernel, LC /= kernel.size(); } - static inline void getIntersection(const SPoint2 &p1, const SPoint2 &p2, - const SPoint2 &q1, const SPoint2 &q2, double x[2]) + const SPoint2 &q1, const SPoint2 &q2, + double x[2]) { double A[2][2]; A[0][0] = p2.x() - p1.x(); @@ -1481,83 +1477,78 @@ static inline void getIntersection(const SPoint2 &p1, const SPoint2 &p2, sys2x2(A, b, x); } - -static inline void computeSomeKindOfKernel (const BDS_Point *p, - const std::vector<BDS_Point *> & nbg, - std::vector<SPoint2> &kernel, - std::vector<double> &lc, - int check){ - - +static inline void computeSomeKindOfKernel(const BDS_Point *p, + const std::vector<BDS_Point *> &nbg, + std::vector<SPoint2> &kernel, + std::vector<double> &lc, int check) +{ FILE *f = NULL; - if (p->iD == check) f = fopen("kernel.pos","w"); - - SPoint2 pp (p->u,p->v); - if (p->iD == check){ - fprintf(f,"View \"kernel\"{\n"); - fprintf(f,"SP(%g,%g,0){2};\n",p->u,p->v); + if(p->iD == check) f = fopen("kernel.pos", "w"); + + SPoint2 pp(p->u, p->v); + if(p->iD == check) { + fprintf(f, "View \"kernel\"{\n"); + fprintf(f, "SP(%g,%g,0){2};\n", p->u, p->v); } - - double ll = p->lc(); + + double ll = p->lc(); kernel.clear(); lc.clear(); - for (size_t i = 0; i<nbg.size();i++){ - if (nbg[i]->degenerated){ - - kernel.push_back(SPoint2 (p->u ,nbg[i]->v)); - kernel.push_back(SPoint2 (nbg[(i+1)%nbg.size()]->u ,nbg[i]->v)); + for(size_t i = 0; i < nbg.size(); i++) { + if(nbg[i]->degenerated) { + kernel.push_back(SPoint2(p->u, nbg[i]->v)); + kernel.push_back(SPoint2(nbg[(i + 1) % nbg.size()]->u, nbg[i]->v)); lc.push_back(nbg[i]->lc()); lc.push_back(nbg[i]->lc()); } - else if (nbg[(i+1)%nbg.size()]->degenerated){ - kernel.push_back(SPoint2 (nbg[i]->u,nbg[i]->v)); - kernel.push_back(SPoint2 (nbg[i]->u,nbg[(i+1)%nbg.size()]->v)); + else if(nbg[(i + 1) % nbg.size()]->degenerated) { + kernel.push_back(SPoint2(nbg[i]->u, nbg[i]->v)); + kernel.push_back(SPoint2(nbg[i]->u, nbg[(i + 1) % nbg.size()]->v)); lc.push_back(nbg[i]->lc()); lc.push_back(nbg[i]->lc()); } - else{ - kernel.push_back(SPoint2 (nbg[i]->u ,nbg[i]->v)); + else { + kernel.push_back(SPoint2(nbg[i]->u, nbg[i]->v)); lc.push_back(nbg[i]->lc()); } } - //return; - if (p->iD == check){ - for (size_t i = 0; i<kernel.size();i++){ - fprintf(f,"SL(%g,%g,0,%g,%g,0){4,4};\n",kernel[i].x(),kernel[i].y(), - kernel[(i+1)%kernel.size()].x(),kernel[(i+1)%kernel.size()].y()); + // return; + if(p->iD == check) { + for(size_t i = 0; i < kernel.size(); i++) { + fprintf(f, "SL(%g,%g,0,%g,%g,0){4,4};\n", kernel[i].x(), kernel[i].y(), + kernel[(i + 1) % kernel.size()].x(), + kernel[(i + 1) % kernel.size()].y()); } } - - bool changed = false; + // bool changed = false; // we should compute the true kernel - for (size_t i = 0; i<kernel.size();i++){ + for(size_t i = 0; i < kernel.size(); i++) { SPoint2 p_now = kernel[i]; double lc_now = lc[i]; - for (size_t j = 0; j<kernel.size();j++){ - if (i!=j && i!= (j+1)%kernel.size()){ - const SPoint2 &p0 = kernel [j]; - const SPoint2 &p1 = kernel [(j+1)%kernel.size()]; - double x[2]; - getIntersection(pp, p_now, p0, p1, x); - if (x[0] > 0 && x[0] < 1.0){ - p_now = (pp * (1.-x[0])) + (p_now * x[0]); - lc_now = ll * (1.-x[0]) + lc_now * x[0]; - changed = true; - } + for(size_t j = 0; j < kernel.size(); j++) { + if(i != j && i != (j + 1) % kernel.size()) { + const SPoint2 &p0 = kernel[j]; + const SPoint2 &p1 = kernel[(j + 1) % kernel.size()]; + double x[2]; + getIntersection(pp, p_now, p0, p1, x); + if(x[0] > 0 && x[0] < 1.0) { + p_now = (pp * (1. - x[0])) + (p_now * x[0]); + lc_now = ll * (1. - x[0]) + lc_now * x[0]; + // changed = true; + } } } kernel[i] = p_now; lc[i] = lc_now; } - - if (p->iD == check){ + if(p->iD == check) { // for (size_t i = 0; i<kernel.size();i++){ // fprintf(f,"SL(%g,%g,0,%g,%g,0){3,3};\n",kernel[i].x(),kernel[i].y(),kernel[(i+1)%nbg.size()].x(),kernel[(i+1)%nbg.size()].y()); // } - fprintf(f,"};\n"); + fprintf(f, "};\n"); fclose(f); } // if (changed)getchar(); @@ -1565,13 +1556,13 @@ static inline void computeSomeKindOfKernel (const BDS_Point *p, /* static inline void getGradientTutteEnergy (const BDS_Point *p, - const std::vector<SPoint2> &kernel, - GFace *gf, - double dEduv[2]){ + const std::vector<SPoint2> &kernel, + GFace *gf, + double dEduv[2]){ // X = X0 + dX/dU (U-U0) // E = \sum_i (X-X_i)^2 = \sum_i (U-U_i)^T G (U-U_i) - // dE/dU = G \sum_i (U-U_i) - + // dE/dU = G \sum_i (U-U_i) + Pair<SVector3, SVector3> d = gf->firstDer(SPoint2 (p->u,p->v)); double G11 = dot (d.left(),d.left()); double G12 = dot (d.left(),d.right()); @@ -1588,27 +1579,30 @@ static inline void getGradientTutteEnergy (const BDS_Point *p, } */ -static GPoint _closestPoint (BDS_Point *p, GFace *gf, const std::vector<SPoint2> &kernel, SPoint3 &target, int N) +static GPoint _closestPoint(BDS_Point *p, GFace *gf, + const std::vector<SPoint2> &kernel, SPoint3 &target, + int N) { double minDist = 1.e22; - SPoint2 p0(p->u,p->v); + SPoint2 p0(p->u, p->v); SPoint2 pMin = p0; - for (size_t i=0;i<kernel.size();++i){ - SPoint2 p1(kernel[i].x(),kernel[i].y()); - SPoint2 p2(kernel[(i+1)%kernel.size()].x(),kernel[(i+1)%kernel.size()].y()); - for (int j=1;j<N;j++){ - for (int k=1;k<N-j;k++){ - double xi = (double)j/(2*N); - double eta = (double)k/(2*N); - SPoint2 p = p0*(1-xi-eta)+p1*xi+p2*eta; - GPoint gp = gf->point(p); - double d = ((target.x()-gp.x())*(target.x()-gp.x())+ - (target.y()-gp.y())*(target.y()-gp.y())+ - (target.z()-gp.z())*(target.z()-gp.z())); - if (d < minDist){ - pMin = p; - minDist = d; - } + for(size_t i = 0; i < kernel.size(); ++i) { + SPoint2 p1(kernel[i].x(), kernel[i].y()); + SPoint2 p2(kernel[(i + 1) % kernel.size()].x(), + kernel[(i + 1) % kernel.size()].y()); + for(int j = 1; j < N; j++) { + for(int k = 1; k < N - j; k++) { + double xi = (double)j / (2 * N); + double eta = (double)k / (2 * N); + SPoint2 p = p0 * (1 - xi - eta) + p1 * xi + p2 * eta; + GPoint gp = gf->point(p); + double d = ((target.x() - gp.x()) * (target.x() - gp.x()) + + (target.y() - gp.y()) * (target.y() - gp.y()) + + (target.z() - gp.z()) * (target.z() - gp.z())); + if(d < minDist) { + pMin = p; + minDist = d; + } } } } @@ -1616,88 +1610,103 @@ static GPoint _closestPoint (BDS_Point *p, GFace *gf, const std::vector<SPoint2> return gf->point(pMin); } -static inline bool minimizeTutteEnergyProj (BDS_Point *p, - double E_unmoved, double RATIO, - const std::vector<BDS_Point *> &nbg, - const std::vector<SPoint2> &kernel, - const std::vector<double> &lc, - GFace *gf, int check){ +static inline bool minimizeTutteEnergyProj(BDS_Point *p, double E_unmoved, + double RATIO, + const std::vector<BDS_Point *> &nbg, + const std::vector<SPoint2> &kernel, + const std::vector<double> &lc, + GFace *gf, int check) +{ SPoint3 x; - double oldX = p->X, oldY=p->Y, oldZ=p->Z, oldU = p->u,oldV = p->v; + double oldX = p->X, oldY = p->Y, oldZ = p->Z, oldU = p->u, oldV = p->v; double sum = 0; - SPoint3 p0 (oldX,oldY,oldZ); - for (size_t i = 0 ; i < nbg.size() ; ++i){ - SPoint3 pi (nbg[i]->X,nbg[i]->Y,nbg[i]->Z); - SPoint3 pip (nbg[(i+1)%nbg.size()]->X,nbg[(i+1)%nbg.size()]->Y,nbg[(i+1)%nbg.size()]->Z); - SVector3 v1 = pi-p0; - SVector3 v2 = pip-p0; - SVector3 pv = crossprod(v1,v2); + SPoint3 p0(oldX, oldY, oldZ); + for(size_t i = 0; i < nbg.size(); ++i) { + SPoint3 pi(nbg[i]->X, nbg[i]->Y, nbg[i]->Z); + SPoint3 pip(nbg[(i + 1) % nbg.size()]->X, nbg[(i + 1) % nbg.size()]->Y, + nbg[(i + 1) % nbg.size()]->Z); + SVector3 v1 = pi - p0; + SVector3 v2 = pip - p0; + SVector3 pv = crossprod(v1, v2); double nrm = pv.norm(); - x += (pi+p0+pip) * (nrm / 3.0); + x += (pi + p0 + pip) * (nrm / 3.0); sum += nrm; } x /= sum; - if (p->iD == check)printf("%12.5E %12.5E %12.5E\n",x.x(),x.y(),x.z()); + if(p->iD == check) printf("%12.5E %12.5E %12.5E\n", x.x(), x.y(), x.z()); GPoint gp; - if (gf->geomType() == GEntity::BSplineSurface || - gf->geomType() == GEntity::BezierSurface || - gf->geomType() == GEntity::Unknown ){ - gp = _closestPoint(p,gf,kernel,x,5); - } - else{ - double U,V,LC; - getCentroidUV (kernel,lc, U,V, LC); + if(gf->geomType() == GEntity::BSplineSurface || + gf->geomType() == GEntity::BezierSurface || + gf->geomType() == GEntity::Unknown) { + gp = _closestPoint(p, gf, kernel, x, 5); + } + else { + double U, V, LC; + getCentroidUV(kernel, lc, U, V, LC); double uv[2] = {U, V}; gp = gf->closestPoint(x, uv); } p->u = gp.u(); p->v = gp.v(); - if (p->iD == check){ - printf("%g %g %d\n",p->u,p->v,validityOfCavity (p, nbg)); + if(p->iD == check) { + printf("%g %g %d\n", p->u, p->v, validityOfCavity(p, nbg)); } - - if (validityOfCavity (p, nbg)){ - p->X = gp.x(); p->Y = gp.y(); p->Z = gp.z(); - double E_moved = getTutteEnergy (p, nbg, RATIO) ; - if (E_moved < E_unmoved){ - return true; - } + + if(validityOfCavity(p, nbg)) { + p->X = gp.x(); + p->Y = gp.y(); + p->Z = gp.z(); + double E_moved = getTutteEnergy(p, nbg, RATIO); + if(E_moved < E_unmoved) { return true; } } - - p->X = oldX; p->Y = oldY; p->Z = oldZ; p->u = oldU; p->v = oldV; + + p->X = oldX; + p->Y = oldY; + p->Z = oldZ; + p->u = oldU; + p->v = oldV; return false; } - -static inline bool minimizeTutteEnergyParam (BDS_Point *p, - double E_unmoved, double RATIO1, - const std::vector<BDS_Point *> &nbg, - const std::vector<SPoint2> &kernel, - const std::vector<double> &lc, - GFace *gf, int check){ - double U, V, LC, oldX = p->X, oldY=p->Y, oldZ=p->Z, oldU = p->u,oldV = p->v; +static inline bool minimizeTutteEnergyParam(BDS_Point *p, double E_unmoved, + double RATIO1, + const std::vector<BDS_Point *> &nbg, + const std::vector<SPoint2> &kernel, + const std::vector<double> &lc, + GFace *gf, int check) +{ + double U, V, LC, oldX = p->X, oldY = p->Y, oldZ = p->Z, oldU = p->u, + oldV = p->v; double RATIO2; - getCentroidUV (p,gf,kernel,lc, U,V, LC); - GPoint gp = gf->point (U,V); - p->X = gp.x(); p->Y = gp.y(); p->Z = gp.z(); - double E_moved = getTutteEnergy (p, nbg, RATIO2); - - if (p->iD == check)printf("%g vs %g\n",E_unmoved ,E_moved); - - if (E_moved < E_unmoved ) { - p->u = U; p->v = V; - if (!validityOfCavity (p, nbg)){ - p->X = oldX; p->Y = oldY; p->Z = oldZ; p->u = oldU; p->v = oldV; + getCentroidUV(p, gf, kernel, lc, U, V, LC); + GPoint gp = gf->point(U, V); + p->X = gp.x(); + p->Y = gp.y(); + p->Z = gp.z(); + double E_moved = getTutteEnergy(p, nbg, RATIO2); + + if(p->iD == check) printf("%g vs %g\n", E_unmoved, E_moved); + + if(E_moved < E_unmoved) { + p->u = U; + p->v = V; + if(!validityOfCavity(p, nbg)) { + p->X = oldX; + p->Y = oldY; + p->Z = oldZ; + p->u = oldU; + p->v = oldV; return false; } p->lc() = LC; return RATIO2 > .25; } - p->X = oldX; p->Y = oldY; p->Z = oldZ; + p->X = oldX; + p->Y = oldY; + p->Z = oldZ; return false; } - bool BDS_Mesh::smooth_point_centroid(BDS_Point *p, GFace *gf, double threshold) { if(p->degenerated) return false; @@ -1708,29 +1717,31 @@ bool BDS_Mesh::smooth_point_centroid(BDS_Point *p, GFace *gf, double threshold) } int CHECK = -1; - + std::vector<BDS_Point *> nbg; std::vector<double> lc; std::vector<SPoint2> kernel; std::vector<BDS_Face *> ts = p->getTriangles(); - if (!getOrderedNeighboringVertices (p, nbg, ts, CHECK))return false; + if(!getOrderedNeighboringVertices(p, nbg, ts, CHECK)) return false; - double RATIO ; - double E_unmoved = getTutteEnergy (p, nbg, RATIO); - if (RATIO > threshold)return false; + double RATIO; + double E_unmoved = getTutteEnergy(p, nbg, RATIO); + if(RATIO > threshold) return false; - computeSomeKindOfKernel (p,nbg,kernel,lc, CHECK); - - if (! minimizeTutteEnergyParam ( p,E_unmoved, RATIO,nbg,kernel,lc,gf, CHECK)){ - if ( ! minimizeTutteEnergyProj (p,E_unmoved, RATIO,nbg,kernel,lc,gf, CHECK)) { + computeSomeKindOfKernel(p, nbg, kernel, lc, CHECK); + + if(!minimizeTutteEnergyParam(p, E_unmoved, RATIO, nbg, kernel, lc, gf, + CHECK)) { + if(!minimizeTutteEnergyProj(p, E_unmoved, RATIO, nbg, kernel, lc, gf, + CHECK)) { // __COUNT3++; return false; } - else{ - p->config_modified = true; - E_unmoved = getTutteEnergy (p, nbg, RATIO); - minimizeTutteEnergyProj (p,E_unmoved, RATIO,nbg,kernel,lc,gf, CHECK); + else { + p->config_modified = true; + E_unmoved = getTutteEnergy(p, nbg, RATIO); + minimizeTutteEnergyProj(p, E_unmoved, RATIO, nbg, kernel, lc, gf, CHECK); // __COUNT2++; } } diff --git a/Mesh/BDS.h b/Mesh/BDS.h index 8a1891971fb9d007dbd21a14b75589ca4c10d462..9d27d9fc53f70fe4355212fba29224fa667760f5 100644 --- a/Mesh/BDS.h +++ b/Mesh/BDS.h @@ -46,7 +46,6 @@ public: } }; - class BDS_Point { // the first size is the one dictated by the Background Mesh the // second one is dictated by characteristic lengths at points and is @@ -99,9 +98,12 @@ public: } BDS_Face *faces(std::size_t const i) const { return _faces[i]; } - double length() const { return std::sqrt((p1->X - p2->X) * (p1->X - p2->X) + - (p1->Y - p2->Y) * (p1->Y - p2->Y) + - (p1->Z - p2->Z) * (p1->Z - p2->Z));} + double length() const + { + return std::sqrt((p1->X - p2->X) * (p1->X - p2->X) + + (p1->Y - p2->Y) * (p1->Y - p2->Y) + + (p1->Z - p2->Z) * (p1->Z - p2->Z)); + } int numfaces() const { return static_cast<int>(_faces.size()); } int numTriangles() const; inline BDS_Point *commonvertex(const BDS_Edge *other) const diff --git a/Mesh/Field.cpp b/Mesh/Field.cpp index cf2b70633c6141dcfe4415756da8459ca84bc148..4834c5223c9edd0da30541b73d8cb557f04d4534 100644 --- a/Mesh/Field.cpp +++ b/Mesh/Field.cpp @@ -1983,8 +1983,7 @@ public: faces_id, "Tags of surfaces in the geometric model (Warning, this feature " "is still experimental. It might (read: will probably) give wrong " - "results " - "for complex surfaces)", + "results for complex surfaces)", &update_needed); _xFieldId = _yFieldId = _zFieldId = -1; options["FieldX"] = new FieldOptionInt( @@ -2078,6 +2077,7 @@ public: _infos.push_back(AttractorInfo(*it, 0, 0, 0)); } } + for(std::list<int>::iterator it = edges_id.begin(); it != edges_id.end(); ++it) { GEdge *e = GModel::current()->getEdgeByTag(*it); @@ -2125,7 +2125,6 @@ public: } count++; } - else { for(int i = 0; i < n_nodes_by_edge; i++) { for(int j = 0; j < n_nodes_by_edge; j++) { @@ -2434,8 +2433,7 @@ public: faces_id, "Tags of surfaces in the geometric model (Warning, this feature " "is still experimental. It might (read: will probably) give wrong " - "results " - "for complex surfaces)", + "results for complex surfaces)", &update_needed); _xFieldId = _yFieldId = _zFieldId = -1; options["FieldX"] = new FieldOptionInt( diff --git a/Mesh/Generator.cpp b/Mesh/Generator.cpp index 77563141d87f5a4f4965f21af625e8dbe9c614bd..c87810a1cd6aeb14b6b0b8e18cc774ed10886638 100644 --- a/Mesh/Generator.cpp +++ b/Mesh/Generator.cpp @@ -120,7 +120,7 @@ public: if(faces.size()) { char name[256]; sprintf(name, "missingFacesOnRegion%d.pos", gr->tag()); - Msg::Error("Region %d : %d mesh faces that should be embedded are " + Msg::Error("Volume %d : %d mesh faces that should be embedded are " "missing in the final mesh", gr->tag(), (int)faces.size()); Msg::Error("Saving the missing faces in file %s", name); @@ -937,11 +937,14 @@ static void Mesh3D(GModel *m) std::for_each(m->firstRegion(), m->lastRegion(), EmbeddedCompatibilityTest()); std::stringstream debugInfo; - debugInfo << "No elements in region "; + debugInfo << "No elements in volume "; bool emptyRegionFound = false; for(GModel::riter it = m->firstRegion(); it != m->lastRegion(); ++it) { - if((*it)->getNumMeshElements() == 0) { - debugInfo << (*it)->tag() << " "; + GRegion *gr = *it; + if(CTX::instance()->mesh.meshOnlyVisible && !gr->getVisibility()) + continue; + if(gr->getNumMeshElements() == 0) { + debugInfo << gr->tag() << " "; emptyRegionFound = true; } } @@ -962,14 +965,13 @@ static void Mesh3D(GModel *m) Msg::StatusBar(true, "Done meshing 3D (%g s)", CTX::instance()->meshTimer[2]); } -void OptimizeMeshNetgen(GModel *m) +void OptimizeMesh(GModel *m) { - Msg::StatusBar(true, "Optimizing 3D mesh with Netgen..."); + Msg::StatusBar(true, "Optimizing 3D mesh..."); double t1 = Cpu(); - std::for_each(m->firstRegion(), m->lastRegion(), optimizeMeshGRegionNetgen()); - - // ensure that all volume Jacobians are positive + std::for_each(m->firstRegion(), m->lastRegion(), optimizeMeshGRegion()); + // Ensure that all volume Jacobians are positive m->setAllVolumesPositive(); if(Msg::GetVerbosity() > 98) @@ -977,16 +979,17 @@ void OptimizeMeshNetgen(GModel *m) CTX::instance()->mesh.changed = ENT_ALL; double t2 = Cpu(); - Msg::StatusBar(true, "Done optimizing 3D mesh with Netgen (%g s)", t2 - t1); + Msg::StatusBar(true, "Done optimizing 3D mesh (%g s)", t2 - t1); } -void OptimizeMesh(GModel *m) +void OptimizeMeshNetgen(GModel *m) { - Msg::StatusBar(true, "Optimizing 3D mesh..."); + Msg::StatusBar(true, "Optimizing 3D mesh with Netgen..."); double t1 = Cpu(); - std::for_each(m->firstRegion(), m->lastRegion(), optimizeMeshGRegion()); - // Ensure that all volume Jacobians are positive + std::for_each(m->firstRegion(), m->lastRegion(), optimizeMeshGRegionNetgen()); + + // ensure that all volume Jacobians are positive m->setAllVolumesPositive(); if(Msg::GetVerbosity() > 98) @@ -994,7 +997,34 @@ void OptimizeMesh(GModel *m) CTX::instance()->mesh.changed = ENT_ALL; double t2 = Cpu(); - Msg::StatusBar(true, "Done optimizing 3D mesh (%g s)", t2 - t1); + Msg::StatusBar(true, "Done optimizing 3D mesh with Netgen (%g s)", t2 - t1); +} + +void OptimizeHighOrderMesh(GModel *m) +{ +#if defined(HAVE_OPTHOM) + OptHomParameters p; + p.nbLayers = CTX::instance()->mesh.hoNLayers; + p.BARRIER_MIN = CTX::instance()->mesh.hoThresholdMin; + p.BARRIER_MAX = CTX::instance()->mesh.hoThresholdMax; + p.itMax = CTX::instance()->mesh.hoIterMax; + p.optPassMax = CTX::instance()->mesh.hoPassMax; + p.dim = GModel::current()->getDim(); + p.optPrimSurfMesh = CTX::instance()->mesh.hoPrimSurfMesh; + p.optCAD = CTX::instance()->mesh.hoDistCAD; + HighOrderMeshOptimizer(GModel::current(), p); +#else + Msg::Error("High-order mesh optimization requires the OPTHOM module"); +#endif +} + +void OptimizeHighOrderMeshElastic(GModel *m) +{ +#if defined(HAVE_OPTHOM) + HighOrderMeshElasticAnalogy(m, false); +#else + Msg::Error("High-order mesh optimization requires the OPTHOM module"); +#endif } void SmoothMesh(GModel *m) @@ -1116,27 +1146,12 @@ void GenerateMesh(GModel *m, int ask) CTX::instance()->mesh.secondOrderIncomplete); // Optimize high order elements - if(CTX::instance()->mesh.hoOptimize) { -#if defined(HAVE_OPTHOM) - if(CTX::instance()->mesh.hoOptimize < 0 || - CTX::instance()->mesh.hoOptimize >= 2) { - HighOrderMeshElasticAnalogy(GModel::current(), false); - } - if(CTX::instance()->mesh.hoOptimize >= 1){ - OptHomParameters p; - p.nbLayers = CTX::instance()->mesh.hoNLayers; - p.BARRIER_MIN = CTX::instance()->mesh.hoThresholdMin; - p.BARRIER_MAX = CTX::instance()->mesh.hoThresholdMax; - p.itMax = CTX::instance()->mesh.hoIterMax; - p.optPassMax = CTX::instance()->mesh.hoPassMax; - p.dim = GModel::current()->getDim(); - p.optPrimSurfMesh = CTX::instance()->mesh.hoPrimSurfMesh; - HighOrderMeshOptimizer(GModel::current(), p); - } -#else - Msg::Error("High-order mesh optimization requires the OPTHOM module"); -#endif - } + if(CTX::instance()->mesh.hoOptimize < 0 || + CTX::instance()->mesh.hoOptimize >= 2) + OptimizeHighOrderMeshElastic(GModel::current()); + + if(CTX::instance()->mesh.hoOptimize >= 1) + OptimizeHighOrderMesh(GModel::current()); if(CTX::instance()->mesh.renumber){ m->renumberMeshVertices(); diff --git a/Mesh/Generator.h b/Mesh/Generator.h index ceb026a422572c7b07c02fe5dff8313cf6789924..0392efd7b78adab7f19b18891ed0a44202afb339 100644 --- a/Mesh/Generator.h +++ b/Mesh/Generator.h @@ -15,6 +15,8 @@ void AdaptMesh(GModel *m); void GenerateMesh(GModel *m, int dimension); void OptimizeMesh(GModel *m); void OptimizeMeshNetgen(GModel *m); +void OptimizeHighOrderMesh(GModel *m); +void OptimizeHighOrderMeshElastic(GModel *m); void SmoothMesh(GModel *m); void RefineMesh(GModel *m, bool linear, bool splitIntoQuads = false, bool splitIntoHexas = false); diff --git a/Mesh/HighOrder.cpp b/Mesh/HighOrder.cpp index 6ba7e2b153c1510449fa610372a9ec7ae8ec1928..8f9eeee482820a4c94e07acbf003c79ca5c073bb 100644 --- a/Mesh/HighOrder.cpp +++ b/Mesh/HighOrder.cpp @@ -286,7 +286,7 @@ static bool getEdgeVerticesOnGeo(GEdge *ge, MVertex *v0, MVertex *v1, } } else - Msg::Error("Cannot reparam a mesh Vertex in high order meshing"); + Msg::Error("Cannot reparametrize a mesh node in high order meshing"); if(!reparamOK) return false; @@ -434,7 +434,7 @@ static void getEdgeVertices(GEdge *ge, MElement *ele, } else if(p.first != p.second) { // Vertices already exist and edge is not a degenerated edge - Msg::Error("Edges from different entities share vertices: create a finer mesh " + Msg::Error("Mesh edges from different entities share nodes: create a finer mesh " "(curve involved: %d)", ge->tag()); } ve.insert(ve.end(), veEdge.begin(), veEdge.end()); @@ -876,7 +876,7 @@ static void getFaceVertices(GRegion *gr, MElement *ele, } else Msg::Error( - "Error in face lookup for recuperation of high order face nodes"); + "Error in face lookup for retrieval of high order face nodes"); vFace.assign(vtcs.begin(), vtcs.end()); } else { // Vertices do not exist, create them by interpolation @@ -1660,7 +1660,7 @@ void SetOrderN(GModel *m, int order, bool linear, bool incomplete, std::vector<MElement *> bad; double worst; checkHighOrderTriangles("Surface mesh", m, bad, worst); - checkHighOrderTetrahedron("Volume Mesh", m, bad, worst); + checkHighOrderTetrahedron("Volume mesh", m, bad, worst); // FIXME : add other element check Msg::StatusBar(true, "Done meshing order %d (%g s)", order, t2 - t1); diff --git a/Mesh/meshGEdge.cpp b/Mesh/meshGEdge.cpp index b1b66a937186569c250da1b00c45ce0604cb4716..f62f8fe7c85e984e9831f32a3e29c886b66e3125 100644 --- a/Mesh/meshGEdge.cpp +++ b/Mesh/meshGEdge.cpp @@ -604,7 +604,8 @@ void meshGEdge::operator()(GEdge *ge) length = 0.0; // special case to avoid infinite loop in integration else length = Integration(ge, t_begin, t_end, F_One(), Points, - 1.e-12 * CTX::instance()->lc); + CTX::instance()->mesh.lcIntegrationPrecision * + CTX::instance()->lc); ge->setLength(length); Points.clear(); diff --git a/Mesh/meshGFace.cpp b/Mesh/meshGFace.cpp index f36683a13bd353049a41b73b56c9dbcfec941300..84409e73780b8df21d4ca84c21c2da9c8d2d8141 100644 --- a/Mesh/meshGFace.cpp +++ b/Mesh/meshGFace.cpp @@ -68,8 +68,7 @@ static void trueBoundary(GFace *gf, std::vector<SPoint2> &bnd, int debug) char name[245]; sprintf(name, "trueBoundary%d.pos", gf->tag()); view_t = Fopen(name, "w"); - if(view_t) - fprintf(view_t, "View \"True Boundary\"{\n"); + if(view_t) fprintf(view_t, "View \"True Boundary\"{\n"); } std::vector<GEdge *> edg = gf->edges(); std::set<GEdge *> edges(edg.begin(), edg.end()); @@ -155,12 +154,12 @@ private: else { v[j] = it->second; v[j]->onWhat()->mesh_vertices.push_back(v[j]); - if(!CTX::instance()->mesh.secondOrderLinear){ + if(!CTX::instance()->mesh.secondOrderLinear) { // re-push middle vertex on the curve (this can of course lead to an // invalid mesh) double u = 0.; - if(v[j]->getParameter(0, u) && v[j]->onWhat()->dim() == 1){ - GEdge *ge = static_cast<GEdge*>(v[j]->onWhat()); + if(v[j]->getParameter(0, u) && v[j]->onWhat()->dim() == 1) { + GEdge *ge = static_cast<GEdge *>(v[j]->onWhat()); GPoint p = ge->point(u); v[j]->x() = p.x(); v[j]->y() = p.y(); @@ -209,12 +208,12 @@ private: else { v[j] = it->second; v[j]->onWhat()->mesh_vertices.push_back(v[j]); - if(!CTX::instance()->mesh.secondOrderLinear){ + if(!CTX::instance()->mesh.secondOrderLinear) { // re-push middle vertex on the curve (this can of course lead to an // invalid mesh) double u = 0.; - if(v[j]->getParameter(0, u) && v[j]->onWhat()->dim() == 1){ - GEdge *ge = static_cast<GEdge*>(v[j]->onWhat()); + if(v[j]->getParameter(0, u) && v[j]->onWhat()->dim() == 1) { + GEdge *ge = static_cast<GEdge *>(v[j]->onWhat()); GPoint p = ge->point(u); v[j]->x() = p.x(); v[j]->y() = p.y(); @@ -255,6 +254,7 @@ private: ++ite; } } + public: // remove one point every two and remember middle points quadMeshRemoveHalfOfOneDMesh(GFace *gf, bool periodic) : _gf(gf) @@ -262,9 +262,8 @@ public: // only do it if a full recombination has to (and can) be done if(!CTX::instance()->mesh.recombineAll && !gf->meshAttributes.recombine) return; - if(CTX::instance()->mesh.algoRecombine < 2) - return; - if(periodic){ + if(CTX::instance()->mesh.algoRecombine < 2) return; + if(periodic) { Msg::Error("Full-quad recombination not ready yet for periodic surfaces"); return; } @@ -755,11 +754,11 @@ static bool recoverEdge(BDS_Mesh *m, GFace *gf, GEdge *ge, e->g = g; else { if(_fatallyFailed) { - Msg::Error( - "Unable to recover the edge %d (%d/%d) on curve %d (on surface %d)", - ge->lines[i]->getNum(), i + 1, ge->lines.size(), ge->tag(), - gf->tag()); - if(Msg::GetVerbosity() == 99){ + Msg::Error("Unable to recover the edge %d (%d/%d) on curve %d (on " + "surface %d)", + ge->lines[i]->getNum(), i + 1, ge->lines.size(), + ge->tag(), gf->tag()); + if(Msg::GetVerbosity() == 99) { outputScalarField(m->triangles, "wrongmesh.pos", 0); outputScalarField(m->triangles, "wrongparam.pos", 1); } @@ -1112,15 +1111,15 @@ BDS2GMSH(BDS_Mesh *m, GFace *gf, static void _deleteUnusedVertices(GFace *gf) { - std::set<MVertex *> allverts; + std::set<MVertex *, MVertexLessThanNum> allverts; for(std::size_t i = 0; i < gf->triangles.size(); i++) { - for(int j = 0; j < 3; j++){ + for(int j = 0; j < 3; j++) { if(gf->triangles[i]->getVertex(j)->onWhat() == gf) allverts.insert(gf->triangles[i]->getVertex(j)); } } for(std::size_t i = 0; i < gf->quadrangles.size(); i++) { - for(int j = 0; j < 4; j++){ + for(int j = 0; j < 4; j++) { if(gf->quadrangles[i]->getVertex(j)->onWhat() == gf) allverts.insert(gf->quadrangles[i]->getVertex(j)); } @@ -1209,6 +1208,10 @@ bool meshGenerator(GFace *gf, int RECUR_ITER, bool repairSelfIntersecting1dMesh, Msg::Error("The 1D mesh seems not to be forming a closed loop (%d boundary " "nodes are considered once)", boundary.size()); + for(std::set<MVertex *, MVertexLessThanNum>::iterator it = boundary.begin(); + it != boundary.end(); it++){ + Msg::Debug("Remaining node %lu", (*it)->getNum()); + } gf->meshStatistics.status = GFace::FAILED; return false; } @@ -1240,7 +1243,8 @@ bool meshGenerator(GFace *gf, int RECUR_ITER, bool repairSelfIntersecting1dMesh, if(all_vertices.size() < 3) { Msg::Warning("Mesh generation of surface %d skipped: only %d nodes on " - "the boundary", gf->tag(), all_vertices.size()); + "the boundary", + gf->tag(), all_vertices.size()); gf->meshStatistics.status = GFace::DONE; return true; } @@ -1282,8 +1286,6 @@ bool meshGenerator(GFace *gf, int RECUR_ITER, bool repairSelfIntersecting1dMesh, count++; } - - bbox.makeCube(); // use a divide & conquer type algorithm to create a triangulation. @@ -1657,6 +1659,11 @@ bool meshGenerator(GFace *gf, int RECUR_ITER, bool repairSelfIntersecting1dMesh, } } + { + int nb_swap; + Msg::Debug("Delaunizing the initial mesh"); + delaunayizeBDS(gf, *m, nb_swap); + } // only delete the mesh data stored in the base GFace class gf->GFace::deleteMesh(); @@ -1680,13 +1687,13 @@ bool meshGenerator(GFace *gf, int RECUR_ITER, bool repairSelfIntersecting1dMesh, std::set<MVertex *> verts; bool infty = false; - if(gf->getMeshingAlgo() == ALGO_2D_FRONTAL_QUAD){ + if(gf->getMeshingAlgo() == ALGO_2D_FRONTAL_QUAD) { infty = true; if(!onlyInitialMesh) buildBackgroundMesh(gf, CTX::instance()->mesh.crossFieldClosestPoint); } else if(gf->getMeshingAlgo() == ALGO_2D_PACK_PRLGRMS || - gf->getMeshingAlgo() == ALGO_2D_PACK_PRLGRMS_CSTR){ + gf->getMeshingAlgo() == ALGO_2D_PACK_PRLGRMS_CSTR) { infty = true; if(!onlyInitialMesh) buildBackgroundMesh(gf, false); } @@ -1697,9 +1704,7 @@ bool meshGenerator(GFace *gf, int RECUR_ITER, bool repairSelfIntersecting1dMesh, // the delaunay algo is based directly on internal gmsh structures BDS mesh is // passed in order not to recompute local coordinates of vertices if(algoDelaunay2D(gf) && !onlyInitialMesh) { - if(gf->getMeshingAlgo() == ALGO_2D_FRONTAL) { - bowyerWatsonFrontal(gf); - } + if(gf->getMeshingAlgo() == ALGO_2D_FRONTAL) { bowyerWatsonFrontal(gf); } else if(gf->getMeshingAlgo() == ALGO_2D_FRONTAL_QUAD) { bowyerWatsonFrontalLayers(gf, true); } @@ -1744,7 +1749,7 @@ bool meshGenerator(GFace *gf, int RECUR_ITER, bool repairSelfIntersecting1dMesh, splitElementsInBoundaryLayerIfNeeded(gf); if((CTX::instance()->mesh.recombineAll || gf->meshAttributes.recombine) && - !onlyInitialMesh && CTX::instance()->mesh.algoRecombine <= 1){ + !onlyInitialMesh && CTX::instance()->mesh.algoRecombine <= 1) { bool blossom = (CTX::instance()->mesh.algoRecombine == 1); int topo = CTX::instance()->mesh.recombineOptimizeTopology; recombineIntoQuads(gf, blossom, topo, true, 0.1); @@ -1756,9 +1761,7 @@ bool meshGenerator(GFace *gf, int RECUR_ITER, bool repairSelfIntersecting1dMesh, gf->meshStatistics.nbTriangle, gf->meshStatistics.nbGoodQuality); - if(CTX::instance()->mesh.algo3d == ALGO_3D_RTREE) { - directions_storage(gf); - } + if(CTX::instance()->mesh.algo3d == ALGO_3D_RTREE) { directions_storage(gf); } // remove unused vertices, generated e.g. during background mesh _deleteUnusedVertices(gf); @@ -1867,9 +1870,7 @@ static bool buildConsecutiveListOfVertices( GEdge *ge = (*it).ge; bool seam = ge->isSeam(gf); mesh1d = meshes[ge]; - if(seam) { - mesh1d_seam = meshes_seam[ge]; - } + if(seam) { mesh1d_seam = meshes_seam[ge]; } mesh1d_reversed.insert(mesh1d_reversed.begin(), mesh1d.rbegin(), mesh1d.rend()); if(seam) @@ -1949,7 +1950,8 @@ static bool buildConsecutiveListOfVertices( // has to be taken with the other parametric coordinates (because it is // only present once in the closure of the domain). for(std::map<BDS_Point *, MVertex *, PointLessThan>::iterator it = - recoverMapLocal.begin(); it != recoverMapLocal.end(); ++it) { + recoverMapLocal.begin(); + it != recoverMapLocal.end(); ++it) { m->del_point(it->first); } return false; @@ -2147,7 +2149,8 @@ static bool meshGeneratorPeriodic(GFace *gf, int RECUR_ITER, if(nbPointsTotal < 3) { Msg::Warning("Mesh generation of surface %d skipped: only %d nodes on " - "the boundary", gf->tag(), nbPointsTotal); + "the boundary", + gf->tag(), nbPointsTotal); gf->meshStatistics.status = GFace::DONE; delete m; return true; @@ -2479,7 +2482,8 @@ static bool meshGeneratorPeriodic(GFace *gf, int RECUR_ITER, if(Msg::GetNumThreads() != 1) { gf->meshStatistics.status = GFace::PENDING; delete m; - Msg::Info("Surface %d has self-intersections in its 1D mesh: serializing this one", + Msg::Info("Surface %d has self-intersections in its 1D mesh: serializing " + "this one", gf->tag()); return true; } @@ -2488,11 +2492,12 @@ static bool meshGeneratorPeriodic(GFace *gf, int RECUR_ITER, std::ostringstream sstream; for(std::set<EdgeToRecover>::iterator itr = edgesNotRecovered.begin(); itr != edgesNotRecovered.end(); ++itr) - sstream << " " << itr->ge->tag() << "(" - << (itr->ge->getBeginVertex() ? - itr->ge->getBeginVertex()->tag() : -1) << "," - << (itr->ge->getEndVertex() ? - itr->ge->getEndVertex()->tag() : -1) << ")"; + sstream + << " " << itr->ge->tag() << "(" + << (itr->ge->getBeginVertex() ? itr->ge->getBeginVertex()->tag() : -1) + << "," + << (itr->ge->getEndVertex() ? itr->ge->getEndVertex()->tag() : -1) + << ")"; Msg::Info(":-( There are %d intersections in the 1D mesh (curves%s)", edgesNotRecovered.size(), sstream.str().c_str()); } @@ -2600,9 +2605,7 @@ static bool meshGeneratorPeriodic(GFace *gf, int RECUR_ITER, std::vector<BDS_Face *>::iterator itt = m->triangles.begin(); while(itt != m->triangles.end()) { BDS_Face *t = *itt; - if(!t->g) { - m->del_face(t); - } + if(!t->g) { m->del_face(t); } ++itt; } } @@ -2641,11 +2644,19 @@ static bool meshGeneratorPeriodic(GFace *gf, int RECUR_ITER, outputScalarField(m->triangles, name, 1, gf); } - // start mesh generation for periodic face - - if(!algoDelaunay2D(gf)) { + if(algoDelaunay2D(gf)){ + // Call this function to untangle elements in Cartesian space + Msg::Debug("Delaunizing the initial mesh"); + int nb_swap; + delaunayizeBDS(gf, *m, nb_swap); + } + else{ modifyInitialMeshToRemoveDegeneracies(gf, *m, &recoverMap); + Msg::Debug("Delaunizing the initial mesh"); + int nb_swap; + delaunayizeBDS(gf, *m, nb_swap); + refineMeshBDS(gf, *m, CTX::instance()->mesh.refineSteps, true, NULL, &recoverMap, &true_boundary); if(debug) { @@ -2758,13 +2769,13 @@ static bool meshGeneratorPeriodic(GFace *gf, int RECUR_ITER, } bool infty = false; - if(gf->getMeshingAlgo() == ALGO_2D_FRONTAL_QUAD){ + if(gf->getMeshingAlgo() == ALGO_2D_FRONTAL_QUAD) { infty = true; buildBackgroundMesh(gf, CTX::instance()->mesh.crossFieldClosestPoint, &equivalence, ¶metricCoordinates); } else if(gf->getMeshingAlgo() == ALGO_2D_PACK_PRLGRMS || - gf->getMeshingAlgo() == ALGO_2D_PACK_PRLGRMS_CSTR){ + gf->getMeshingAlgo() == ALGO_2D_PACK_PRLGRMS_CSTR) { infty = true; buildBackgroundMesh(gf, false, &equivalence, ¶metricCoordinates); } @@ -2813,7 +2824,7 @@ static bool meshGeneratorPeriodic(GFace *gf, int RECUR_ITER, delete m; if((CTX::instance()->mesh.recombineAll || gf->meshAttributes.recombine) && - CTX::instance()->mesh.algoRecombine <= 1){ + CTX::instance()->mesh.algoRecombine <= 1) { bool blossom = (CTX::instance()->mesh.algoRecombine == 1); int topo = CTX::instance()->mesh.recombineOptimizeTopology; recombineIntoQuads(gf, blossom, topo, false, 0.1); // no node repositioning @@ -2834,9 +2845,8 @@ static bool meshGeneratorPeriodic(GFace *gf, int RECUR_ITER, void deMeshGFace::operator()(GFace *gf) { - if(gf->geomType() == GEntity::DiscreteSurface){ - if(!static_cast<discreteFace *>(gf)->haveParametrization()) - return; + if(gf->geomType() == GEntity::DiscreteSurface) { + if(!static_cast<discreteFace *>(gf)->haveParametrization()) return; } gf->deleteMesh(); gf->meshStatistics.status = GFace::PENDING; @@ -2908,7 +2918,8 @@ void meshGFace::operator()(GFace *gf, bool print) return; } else - Msg::Warning("Unknown mesh master surface %d", gf->getMeshMaster()->tag()); + Msg::Warning("Unknown mesh master surface %d", + gf->getMeshMaster()->tag()); } const char *algo = "Unknown"; @@ -2924,9 +2935,7 @@ void meshGFace::operator()(GFace *gf, bool print) algo = (gf->geomType() == GEntity::Plane) ? "Delaunay" : "MeshAdapt"; break; } - if(!algoDelaunay2D(gf)) { - algo = "MeshAdapt"; - } + if(!algoDelaunay2D(gf)) { algo = "MeshAdapt"; } if(print) Msg::Info("Meshing surface %d (%s, %s)", gf->tag(), @@ -2940,7 +2949,7 @@ void meshGFace::operator()(GFace *gf, bool print) } bool periodic = (gf->getNativeType() != GEntity::GmshModel) && - (gf->periodic(0) || gf->periodic(1) || singularEdges); + (gf->periodic(0) || gf->periodic(1) || singularEdges); quadMeshRemoveHalfOfOneDMesh halfmesh(gf, periodic); @@ -3096,7 +3105,7 @@ void orientMeshGFace::operator()(GFace *gf) // ... reverse if needed if(orientNonBL == -1) e->reverse(); } - else{ // If el. in BL ... reverse if needed + else { // If el. in BL ... reverse if needed if(orientBL == -1) e->reverse(); } } diff --git a/Mesh/meshGFaceBDS.cpp b/Mesh/meshGFaceBDS.cpp index 2cc3a1e8c83b36b6b22f184d71087374f7e00867..40d40f858035a12d2adb4d2c686dcb814f65ea70 100644 --- a/Mesh/meshGFaceBDS.cpp +++ b/Mesh/meshGFaceBDS.cpp @@ -60,7 +60,8 @@ static double computeEdgeLinearLength(BDS_Point *p1, BDS_Point *p2) return std::sqrt(dx * dx + dy * dy + dz * dz); } -static inline double computeEdgeLinearLength(BDS_Point *p1, BDS_Point *p2, GFace *f) +static inline double computeEdgeLinearLength(BDS_Point *p1, BDS_Point *p2, + GFace *f) { GPoint GP = f->point(SPoint2(0.5 * (p1->u + p2->u), 0.5 * (p1->v + p2->v))); @@ -169,20 +170,21 @@ static int edgeSwapTest(GFace *gf, BDS_Edge *e) return -1; } -static bool neighboringModified( BDS_Point *p){ - if(p->config_modified)return true; +static bool neighboringModified(BDS_Point *p) +{ + if(p->config_modified) return true; std::vector<BDS_Edge *>::iterator it = p->edges.begin(); std::vector<BDS_Edge *>::iterator ite = p->edges.end(); while(it != ite) { BDS_Point *o = (*it)->othervertex(p); - if (o->config_modified)return true; + if(o->config_modified) return true; ++it; } return false; } -static void swapEdgePass(GFace *gf, BDS_Mesh &m, int &nb_swap, double &t, int FINALIZE = 0, - double orientation = 1.0) +static void swapEdgePass(GFace *gf, BDS_Mesh &m, int &nb_swap, double &t, + int FINALIZE = 0, double orientation = 1.0) { // return; double t1 = Cpu(); @@ -196,14 +198,13 @@ static void swapEdgePass(GFace *gf, BDS_Mesh &m, int &nb_swap, double &t, int FI size_type origSize = m.edges.size(); for(size_type index = 0; index < 2 * origSize && index < m.edges.size(); ++index) { - if (neighboringModified (m.edges.at(index)->p1) || neighboringModified (m.edges.at(index)->p2)){ + if(neighboringModified(m.edges.at(index)->p1) || + neighboringModified(m.edges.at(index)->p2)) { if(!m.edges.at(index)->deleted && m.edges.at(index)->numfaces() == 2) { - int const result = FINALIZE ? 1 : edgeSwapTest(gf, m.edges.at(index)); - if(result >= 0) { - if(m.swap_edge(m.edges.at(index), *qual)) { - ++nb_swap; - } - } + int const result = FINALIZE ? 1 : edgeSwapTest(gf, m.edges.at(index)); + if(result >= 0) { + if(m.swap_edge(m.edges.at(index), *qual)) { ++nb_swap; } + } } } } @@ -281,51 +282,53 @@ static void getDegeneracy(BDS_Mesh &m, std::vector<BDS_Point*> °) deg.clear(); std::set<BDS_Point *, PointLessThan>::iterator itp = m.points.begin(); while(itp != m.points.end()) { - if ((*itp)->degenerated)deg.push_back(*itp); + if((*itp)->degenerated) deg.push_back(*itp); itp++; - } + } } -static void setDegeneracy(std::vector<BDS_Point*> °, bool d){ - for (size_t i=0;i<deg.size();i++)deg[i]->degenerated = d; +static void setDegeneracy(std::vector<BDS_Point *> °, bool d) +{ + for(size_t i = 0; i < deg.size(); i++) deg[i]->degenerated = d; } static int validitiyOfGeodesics(GFace *gf, BDS_Mesh &m) { - std::vector< BDS_Edge *> degenerated; - for (size_t i=0;i< m.edges.size();i++){ + std::vector<BDS_Edge *> degenerated; + for(size_t i = 0; i < m.edges.size(); i++) { BDS_Edge *e = m.edges[i]; - if (!e->deleted && e->p1->degenerated + e->p2->degenerated == 1)degenerated.push_back(e); + if(!e->deleted && e->p1->degenerated + e->p2->degenerated == 1) + degenerated.push_back(e); } - std::vector< BDS_Edge *> toSplit; - for (size_t i=0;i< degenerated.size();i++){ + std::vector<BDS_Edge *> toSplit; + for(size_t i = 0; i < degenerated.size(); i++) { BDS_Edge *ed = degenerated[i]; - double u3[2] = {ed->p1->degenerated ? ed->p2->u : ed->p1->u,ed->p1->v}; - double u4[2] = {ed->p2->degenerated ? ed->p1->u : ed->p2->u,ed->p2->v}; - for (size_t j=0;j< m.edges.size();j++){ + double u3[2] = {ed->p1->degenerated ? ed->p2->u : ed->p1->u, ed->p1->v}; + double u4[2] = {ed->p2->degenerated ? ed->p1->u : ed->p2->u, ed->p2->v}; + for(size_t j = 0; j < m.edges.size(); j++) { BDS_Edge *e = m.edges[j]; - if (e->deleted || e->p1 == ed->p1 || e->p1 == ed->p2 || - e->p2 == ed->p1 || e->p2 == ed->p2 )continue; - if (e->p1->degenerated + e->p2->degenerated == 0){ - double u1[2] = {e->p1->u,e->p1->v}; - double u2[2] = {e->p2->u,e->p2->v}; - double rp1 = robustPredicates::orient2d(u1, u2, u3); - double rp2 = robustPredicates::orient2d(u1, u2, u4); - double rq1 = robustPredicates::orient2d(u3, u4, u1); - double rq2 = robustPredicates::orient2d(u3, u4, u2); - if(rp1*rp2<0 && rq1*rq2<0){ - // printf("%d %d -- %d %d\n",ed->p1->iD,ed->p2->iD,e->p1->iD,e->p2->iD); - toSplit.push_back(ed); - break; - } + if(e->deleted || e->p1 == ed->p1 || e->p1 == ed->p2 || e->p2 == ed->p1 || + e->p2 == ed->p2) + continue; + if(e->p1->degenerated + e->p2->degenerated == 0) { + double u1[2] = {e->p1->u, e->p1->v}; + double u2[2] = {e->p2->u, e->p2->v}; + double rp1 = robustPredicates::orient2d(u1, u2, u3); + double rp2 = robustPredicates::orient2d(u1, u2, u4); + double rq1 = robustPredicates::orient2d(u3, u4, u1); + double rq2 = robustPredicates::orient2d(u3, u4, u2); + if(rp1 * rp2 < 0 && rq1 * rq2 < 0) { + // printf("%d %d -- %d + //%d\n",ed->p1->iD,ed->p2->iD,e->p1->iD,e->p2->iD); + toSplit.push_back(ed); + break; + } } } } return toSplit.size(); } - - static void splitEdgePass(GFace *gf, BDS_Mesh &m, double MAXE_, int &nb_split, std::vector<SPoint2> *true_boundary, double &t) { @@ -373,7 +376,8 @@ static void splitEdgePass(GFace *gf, BDS_Mesh &m, double MAXE_, int &nb_split, for(std::size_t i = 0; i < edges.size(); ++i) { BDS_Edge *e = edges[i].second; BDS_Point *mid = NULL; - if(!e->deleted && (neighboringModified(e->p1) || neighboringModified(e->p2)) ) { + if(!e->deleted && + (neighboringModified(e->p1) || neighboringModified(e->p2))) { double U1 = e->p1->u; double U2 = e->p2->u; if(e->p1->degenerated) U1 = U2; @@ -389,13 +393,6 @@ static void splitEdgePass(GFace *gf, BDS_Mesh &m, double MAXE_, int &nb_split, int N; if(!pointInsideParametricDomain(*true_boundary, pp, out, N)) { inside = false; - // printf("%g %g\n",e->p1->u,e->p1->v); - // printf("%g %g\n",e->p2->u,e->p2->v); - // printf("%d %d %g %g\n",e->p1->iD,e->p2->iD,U1,U2); - // Msg::Info("%g %g outside of parametric domain?", pp.x(), pp.y()); - // FILE *f = fopen("TOTO.pos","a"); - // fprintf(f,"SP(%g,%g,0){%d};\n",pp.x(),pp.y(),N); - // fclose(f); } } if(inside && gpp.succeeded()) { @@ -422,7 +419,7 @@ static void splitEdgePass(GFace *gf, BDS_Mesh &m, double MAXE_, int &nb_split, } } } - t += (Cpu()-t1); + t += (Cpu() - t1); } double getMaxLcWhenCollapsingEdge(GFace *gf, BDS_Mesh &m, BDS_Edge *e, @@ -477,11 +474,12 @@ void collapseEdgePass(GFace *gf, BDS_Mesh &m, double MINE_, int MAXNP, double mink = MINE_; for(std::size_t i = 0; i < edges.size(); i++) { BDS_Edge *e = edges[i].second; - if(!e->deleted && (neighboringModified(e->p1) || neighboringModified(e->p2)) ) { + if(!e->deleted && + (neighboringModified(e->p1) || neighboringModified(e->p2))) { count++; double lone1 = 0.; bool collapseP1Allowed = true; - + double lone2 = 0.; bool collapseP2Allowed = false; if(e->p2->iD > MAXNP) { @@ -504,20 +502,24 @@ void collapseEdgePass(GFace *gf, BDS_Mesh &m, double MINE_, int MAXNP, bool res = false; if(p) { - res = m.collapse_edge_parametric(e, p); - if(!res && collapseP1Allowed && collapseP2Allowed) { - res = m.collapse_edge_parametric(e, p==e->p1 ? e->p2:e->p1 ); - } + res = m.collapse_edge_parametric(e, p); + if(!res && collapseP1Allowed && collapseP2Allowed) { + res = m.collapse_edge_parametric(e, p == e->p1 ? e->p2 : e->p1); + } } - if(res) nb_collaps++; - else if (!e->p1->degenerated || !e->p2->degenerated)mink = std::min(mink,edges[i].first); + if(res) + nb_collaps++; + else if(!e->p1->degenerated || !e->p2->degenerated) + mink = std::min(mink, edges[i].first); } } t += (Cpu() - t1); - // printf("%d/%d collapse edges MIN NON COLLAPSED %g\n",count, nb_collaps,mink); + // printf("%d/%d collapse edges MIN NON COLLAPSED %g\n",count, + // nb_collaps,mink); } -void smoothVertexPass(GFace *gf, BDS_Mesh &m, int &nb_smooth, bool q, double threshold, double &t) +void smoothVertexPass(GFace *gf, BDS_Mesh &m, int &nb_smooth, bool q, + double threshold, double &t) { // FIXME SUPER HACK // return; @@ -526,27 +528,27 @@ void smoothVertexPass(GFace *gf, BDS_Mesh &m, int &nb_smooth, bool q, double thr // __COUNT2=0; // __COUNT3=0; double t1 = Cpu(); - - for (int i=0; i<1;i++){ + for(int i = 0; i < 1; i++) { std::set<BDS_Point *, PointLessThan>::iterator itp = m.points.begin(); while(itp != m.points.end()) { - if (neighboringModified(*itp)){ - // if ((*itp)->iD == 616){ - // outputScalarField(m.triangles, "BEF.pos", 1, gf); - // } - if(m.smooth_point_centroid(*itp, gf, threshold)) nb_smooth++; - // if ((*itp)->iD == 616){ - // outputScalarField(m.triangles, "AFT.pos", 1, gf); - // getchar(); - //} + if(neighboringModified(*itp)) { + // if ((*itp)->iD == 616){ + // outputScalarField(m.triangles, "BEF.pos", 1, gf); + // } + if(m.smooth_point_centroid(*itp, gf, threshold)) nb_smooth++; + // if ((*itp)->iD == 616){ + // outputScalarField(m.triangles, "AFT.pos", 1, gf); + // getchar(); + //} } ++itp; } } - t += (Cpu()-t1); - // printf("%d %d %d smooth \n",__COUNT1, __COUNT2, __COUNT3); + t += (Cpu() - t1); } +/* +>>>>>>> 44f622c69e1a8386f8dd66b63bb5b07c55b00f9f static void CHECK_STRANGE(const char *c, BDS_Mesh &m) { return; @@ -558,7 +560,7 @@ static void CHECK_STRANGE(const char *c, BDS_Mesh &m) double surface_triangle_param(BDS_Point *p1, BDS_Point *p2, BDS_Point *p3); if (pts[0]->degenerated+pts[1]->degenerated+pts[2]->degenerated <= 1){ if (fabs(surface_triangle_param(pts[0],pts[1],pts[2]))<1.e-8){ - strange ++; + strange ++; } } } @@ -569,8 +571,8 @@ static void CHECK_STRANGE(const char *c, BDS_Mesh &m) BDS_Point *pts[4]; m.triangles[i]->getNodes(pts); if (pts[0] == pts[1] || - pts[0] == pts[2] || - pts[1] == pts[2]){ + pts[0] == pts[2] || + pts[1] == pts[2]){ strange ++; } } @@ -588,10 +590,11 @@ static void CHECK_STRANGE(const char *c, BDS_Mesh &m) printf("strange(%s) = %d\n",c,strange); #endif } +*/ -static void computeNodalSizes( - GFace *gf, BDS_Mesh &m, - std::map<BDS_Point *, MVertex *, PointLessThan> *recoverMap) +static void +computeNodalSizes(GFace *gf, BDS_Mesh &m, + std::map<BDS_Point *, MVertex *, PointLessThan> *recoverMap) { std::set<BDS_Point *, PointLessThan>::iterator itp = m.points.begin(); while(itp != m.points.end()) { @@ -690,9 +693,7 @@ void modifyInitialMeshToRemoveDegeneracies( it != recoverMap->end(); ++it) { std::set<MVertex *, MVertexLessThanNum>::iterator it2 = degenerated.find(it->second); - if(it2 != degenerated.end()) { - it->first->degenerated = true; - } + if(it2 != degenerated.end()) { it->first->degenerated = true; } } for(size_t i = 0; i < degenerated_edges.size(); i++) { m.collapse_edge_parametric(degenerated_edges[i], degenerated_edges[i]->p1, @@ -741,19 +742,28 @@ void refineMeshBDS(GFace *gf, BDS_Mesh &m, const int NIT, std::vector<BDS_Edge *>::iterator it = m.edges.begin(); while(it != m.edges.end()) { if(!(*it)->deleted) { - (*it)->p1->config_modified = true; - (*it)->p2->config_modified = true; + (*it)->p1->config_modified = true; + (*it)->p2->config_modified = true; } ++it; } } - std::vector<BDS_Point*> deg; + std::vector<BDS_Point *> deg; getDegeneracy(m, deg); int nbSplit = 1; while(1) { - if (nbSplit) nbSplit = validitiyOfGeodesics(gf, m); + if(nbSplit) nbSplit = validitiyOfGeodesics(gf, m); + + if(nbSplit) { + Msg::Info( + "Splits are now done to allow geodesics close to singular points"); + setDegeneracy(deg, false); + } + else + setDegeneracy(deg, true); + // printf("degeneracy %d\n",nbSplit); if (nbSplit){ Msg::Info ("Splits are now done to allow geodesics close to singular points"); setDegeneracy(deg,false); @@ -775,53 +785,52 @@ void refineMeshBDS(GFace *gf, BDS_Mesh &m, const int NIT, // outputScalarField(m.triangles, "initial.pos", 1, gf); // getchar(); splitEdgePass(gf, m, maxE, nb_split, true_boundary, t_spl); - if (IT == 0){ + if(IT == 0) { // outputScalarField(m.triangles, "split0.pos", 1, gf); splitEdgePass(gf, m, maxE, nb_split, true_boundary, t_spl); } // outputScalarField(m.triangles, "split.pos", 1, gf); - smoothVertexPass(gf, m, nb_smooth, false,.5,t_sm); + smoothVertexPass(gf, m, nb_smooth, false, .5, t_sm); // outputScalarField(m.triangles, "splitsmooth.pos", 1, gf); - - - swapEdgePass(gf, m, nb_swap,t_sw); - smoothVertexPass(gf, m, nb_smooth, false,.5,t_sm); + swapEdgePass(gf, m, nb_swap, t_sw); + smoothVertexPass(gf, m, nb_smooth, false, .5, t_sm); // outputScalarField(m.triangles, "swapsmooth.pos", 1, gf); // outputScalarField(m.triangles, "swapsmoothe.pos", 0, gf); - collapseEdgePass(gf, m, minE, MAXNP, nb_collaps,t_col); + collapseEdgePass(gf, m, minE, MAXNP, nb_collaps, t_col); // outputScalarField(m.triangles, "collapse.pos", 1, gf); - smoothVertexPass(gf, m, nb_smooth, false,.5,t_sm); + smoothVertexPass(gf, m, nb_smooth, false, .5, t_sm); // outputScalarField(m.triangles, "collapsemooth.pos", 1, gf); - swapEdgePass(gf, m, nb_swap,t_sw); + swapEdgePass(gf, m, nb_swap, t_sw); // outputScalarField(m.triangles, "d1.pos", 1, gf); - smoothVertexPass(gf, m, nb_smooth, false,.5,t_sm); + smoothVertexPass(gf, m, nb_smooth, false, .5, t_sm); // outputScalarField(m.triangles, "temp0.pos", 0, gf); // outputScalarField(m.triangles, "temp1.pos", 1, gf); // getchar(); // remove small edges - if (IT == abs(NIT)){ - collapseEdgePass(gf, m, .45, MAXNP, nb_collaps,t_col); - smoothVertexPass(gf, m, nb_smooth, false,.5,t_sm); + if(IT == abs(NIT)) { + collapseEdgePass(gf, m, .45, MAXNP, nb_collaps, t_col); + smoothVertexPass(gf, m, nb_smooth, false, .5, t_sm); } - + // CHECK_STRANGE("smmooth", m); m.cleanup(); double minL = 1.e22, maxL = 0; std::vector<BDS_Edge *>::iterator it = m.edges.begin(); - int LARGE = 0, SMALL=0, TOTAL=0; + int LARGE = 0, SMALL = 0, TOTAL = 0; while(it != m.edges.end()) { if(!(*it)->deleted) { - double lone = 2*(*it)->length() / (NewGetLc((*it)->p1)+NewGetLc((*it)->p2)); - if (lone > maxE)LARGE++; - if (lone < minE)SMALL++; - TOTAL++; + double lone = + 2 * (*it)->length() / (NewGetLc((*it)->p1) + NewGetLc((*it)->p2)); + if(lone > maxE) LARGE++; + if(lone < minE) SMALL++; + TOTAL++; maxL = std::max(maxL, lone); minL = std::min(minL, lone); } @@ -831,10 +840,11 @@ void refineMeshBDS(GFace *gf, BDS_Mesh &m, const int NIT, IT++; - Msg::Debug(" iter %3d minL %8.3f/%8.3f maxL %8.3f/%8.3f -- Small/Large/Total (%6d/%6d/%6d): " + Msg::Debug(" iter %3d minL %8.3f/%8.3f maxL %8.3f/%8.3f -- " + "Small/Large/Total (%6d/%6d/%6d): " "%6d splits, %6d swaps, %6d collapses, %6d moves", - IT, minL, minE, maxL, maxE, SMALL,LARGE, TOTAL,nb_split, nb_swap, nb_collaps, - nb_smooth); + IT, minL, minE, maxL, maxE, SMALL, LARGE, TOTAL, nb_split, + nb_swap, nb_collaps, nb_smooth); // getchar(); if(nb_split == 0 && nb_collaps == 0) break; } @@ -872,7 +882,8 @@ void refineMeshBDS(GFace *gf, BDS_Mesh &m, const int NIT, for(size_t i = 0; i < m.triangles.size(); i++) { BDS_Point *pts[4]; m.triangles[i]->getNodes(pts); - // if (pts[0]->degenerated + pts[1]->degenerated + pts[2]->degenerated < 2){ + // if (pts[0]->degenerated + pts[1]->degenerated + pts[2]->degenerated < + // 2){ double val = orientation * BDS_Face_Validity(gf, m.triangles[i]); if(val <= 0.2) { if(!m.triangles[i]->deleted && val <= 0) invalid++; @@ -888,19 +899,19 @@ void refineMeshBDS(GFace *gf, BDS_Mesh &m, const int NIT, // } } if(++ITER == 10) { - if(invalid && !computeNodalSizeField){ - gf->meshStatistics.status = GFace::FAILED; + if(invalid && !computeNodalSizeField) { + gf->meshStatistics.status = GFace::FAILED; Msg::Warning("Meshing surface %d : %d elements remain invalid", gf->tag(), invalid); - } - break; + } + break; } if(bad != 0) { int nb_swap = 0; - int nb_smooth = 0; - swapEdgePass(gf, m, nb_swap,t_sw, 1, orientation); - smoothVertexPass(gf, m, nb_smooth, true,.5,t_sm); + int nb_smooth = 0; + swapEdgePass(gf, m, nb_swap, t_sw, 1, orientation); + smoothVertexPass(gf, m, nb_smooth, true, .5, t_sm); } else { // Msg::Info("Meshing surface %d : all elements are oriented diff --git a/Mesh/meshGFaceBDS.h b/Mesh/meshGFaceBDS.h index 8935d208d7d07c9a914c2cac667fc0b1a01bd683..447aaff3898cd70c6d654ee18780df60226e84e7 100644 --- a/Mesh/meshGFaceBDS.h +++ b/Mesh/meshGFaceBDS.h @@ -21,7 +21,8 @@ void refineMeshBDS( std::map<BDS_Point *, MVertex *, PointLessThan> *recoverMap = 0, std::vector<SPoint2> *true_boundary = 0); void modifyInitialMeshToRemoveDegeneracies( - GFace *gf, BDS_Mesh &m, - std::map<BDS_Point *, MVertex *, PointLessThan> *recoverMap); + GFace *gf, BDS_Mesh &m, + std::map<BDS_Point *, MVertex *, PointLessThan> *recoverMap); +void delaunayizeBDS(GFace *gf, BDS_Mesh &m, int &nb_swap); #endif diff --git a/Mesh/meshGFaceDelaunayInsertion.cpp b/Mesh/meshGFaceDelaunayInsertion.cpp index 7df85623eecfd9a71b3060b648622c6321fa5e8d..5ac1825e2d4d176afd6cca376df8a6a8bf81f156 100644 --- a/Mesh/meshGFaceDelaunayInsertion.cpp +++ b/Mesh/meshGFaceDelaunayInsertion.cpp @@ -1039,9 +1039,6 @@ void bowyerWatson(GFace *gf, int MAXPNT, return; } - int nbSwaps = edgeSwapPass(gf, AllTris, SWCR_DEL, DATA); - Msg::Debug("Delaunization of the initial mesh done (%d swaps)", nbSwaps); - if(AllTris.empty()) { Msg::Error("No triangles in initial mesh"); return; @@ -1083,7 +1080,6 @@ void bowyerWatson(GFace *gf, int MAXPNT, insertAPoint(gf, AllTris.begin(), center, metric, DATA, AllTris); } } - nbSwaps = edgeSwapPass(gf, AllTris, SWCR_QUAL, DATA); splitElementsInBoundaryLayerIfNeeded(gf); transferDataStructure(gf, AllTris, DATA); } @@ -1303,9 +1299,6 @@ void bowyerWatsonFrontal(GFace *gf, std::map<MVertex *, MVertex *> *equivalence, return; } - // delaunise the initial mesh - edgeSwapPass(gf, AllTris, SWCR_DEL, DATA); - int ITER = 0, active_edge; // compute active triangle std::set<MTri3 *, compareTri3Ptr>::iterator it = AllTris.begin(); @@ -1357,21 +1350,6 @@ void bowyerWatsonFrontal(GFace *gf, std::map<MVertex *, MVertex *> *equivalence, } } - // nbSwaps = edgeSwapPass(gf, AllTris, SWCR_QUAL, DATA); - // char name[245]; - // sprintf(name, "delFrontal_GFace_%d.pos", gf->tag()); - // _printTris(name, AllTris.begin(), AllTris.end(), &DATA); - // sprintf(name, "delFrontal_GFace_NEW_%d.pos", gf->tag()); - // _printTris(name, AllTris.begin(), AllTris.end(), &DATA,NULL,°enerated); - // sprintf(name, "delFrontal_GFace_%d_Real.pos", gf->tag()); - // _printTris(name, AllTris.begin(), AllTris.end(), NULL); - // sprintf(name, "delFrontal_GFace_%d_Real_Curved.pos", gf->tag()); - // _printTris(name, AllTris.begin(), AllTris.end(), &DATA,gf,°enerated); - // sprintf(name,"delFrontal_GFace_%d_Layer_Real%d.pos",gf->tag(),ITERATION); - // _printTris (name, AllTris.begin(), AllTris.end(),NULL); - // sprintf(name,"delFrontal_GFace_%d_Layer_%d_Active.pos",gf->tag(),ITERATION); - // _printTris (name, ActiveTris.begin(), ActiveTris.end(), &DATA); - transferDataStructure(gf, AllTris, DATA); splitElementsInBoundaryLayerIfNeeded(gf); @@ -1525,10 +1503,6 @@ void bowyerWatsonFrontalLayers( return; } - // delaunise the initial mesh - int nbSwaps = edgeSwapPass(gf, AllTris, SWCR_DEL, DATA); - Msg::Debug("Delaunization of the initial mesh done (%d swaps)", nbSwaps); - int ITER = 0, active_edge; // compute active triangle std::set<MTri3 *, compareTri3Ptr>::iterator it = AllTris.begin(); @@ -1659,10 +1633,6 @@ void bowyerWatsonParallelograms( return; } - // delaunise the initial mesh - int nbSwaps = edgeSwapPass(gf, AllTris, SWCR_DEL, DATA); - Msg::Debug("Delaunization of the initial mesh done (%d swaps)", nbSwaps); - // std::sort(packed.begin(), packed.end(), MVertexLessThanLexicographic()); SortHilbert(packed); @@ -1728,10 +1698,6 @@ void bowyerWatsonParallelogramsConstrained( return; } - // delaunise the initial mesh - int nbSwaps = edgeSwapPass(gf, AllTris, SWCR_DEL, DATA); - Msg::Debug("Delaunization of the initial mesh done (%d swaps)", nbSwaps); - std::sort(packed.begin(), packed.end(), MVertexLessThanLexicographic()); MTri3 *oneNewTriangle = 0; diff --git a/Mesh/meshGFaceOptimize.cpp b/Mesh/meshGFaceOptimize.cpp index 7a208c19eb0f0d5f720943fe4e79b55d96733272..2b835a741281568530da843dbcaaf7d5fb531602 100644 --- a/Mesh/meshGFaceOptimize.cpp +++ b/Mesh/meshGFaceOptimize.cpp @@ -351,12 +351,6 @@ void transferDataStructure(GFace *gf, computeEquivalences(gf, data); } -void buildVertexToTriangle(std::vector<MTriangle *> &eles, v2t_cont &adj) -{ - adj.clear(); - buildVertexToElement(eles, adj); -} - template <class T> void buildEdgeToElement(std::vector<T *> &elements, e2t_cont &adj) { @@ -413,8 +407,9 @@ void buildListOfEdgeAngle(e2t_cont adj, std::vector<edge_angle> &edges_detected, std::sort(edges_detected.begin(), edges_detected.end()); } -void parametricCoordinates(MElement *t, GFace *gf, double u[4], double v[4], - MVertex *close = 0) +static void parametricCoordinates(MElement *t, GFace *gf, + double u[4], double v[4], + MVertex *close = 0) { for(std::size_t j = 0; j < t->getNumVertices(); j++) { MVertex *ver = t->getVertex(j); @@ -430,9 +425,15 @@ void parametricCoordinates(MElement *t, GFace *gf, double u[4], double v[4], double surfaceFaceUV(MElement *t, GFace *gf, bool maximal = true) { + const int N = t->getNumVertices(); + if(N > 4){ + Msg::Warning("surfaceFaceUV only for first order elements"); + return 0; + } + double u[4], v[4]; parametricCoordinates(t, gf, u, v); - if(t->getNumVertices() == 3) + if(N == 3) return 0.5 * fabs((u[1] - u[0]) * (v[2] - v[0]) - (u[2] - u[0]) * (v[1] - v[0])); else { @@ -912,7 +913,6 @@ static void _relocate(GFace *gf, MVertex *ver, void getAllBoundaryLayerVertices(GFace *gf, std::set<MVertex *> &vs) { - // return; vs.clear(); BoundaryLayerColumns *_columns = gf->getColumns(); if(!_columns) return; @@ -926,6 +926,13 @@ void getAllBoundaryLayerVertices(GFace *gf, std::set<MVertex *> &vs) void laplaceSmoothing(GFace *gf, int niter, bool infinity_norm) { + if((gf->triangles.size() > 0 && gf->triangles[0]->getPolynomialOrder() > 1) || + (gf->quadrangles.size() > 0 && gf->quadrangles[0]->getPolynomialOrder() > 1)){ + Msg::Error("Surface mesh smoothing only valid for first order mesh (use the high-" + "order optimization tools for high-order meshes)"); + return; + } + if(!niter) return; std::set<MVertex *> vs; getAllBoundaryLayerVertices(gf, vs); @@ -943,204 +950,6 @@ void laplaceSmoothing(GFace *gf, int niter, bool infinity_norm) } } -bool edgeSwapDelProj(MVertex *v1, MVertex *v2, MVertex *v3, MVertex *v4) -{ - MTriangle t1(v1, v2, v3); - MTriangle t2(v2, v1, v4); - - SVector3 n1 = t1.getFace(0).normal(); - SVector3 n2 = t2.getFace(0).normal(); - if(dot(n1, n2) <= 0) { - return true; - } - return false; -} - -bool edgeSwap(std::set<swapquad> &configs, MTri3 *t1, GFace *gf, int iLocalEdge, - std::vector<MTri3 *> &newTris, const swapCriterion &cr, - bidimMeshData &data) -{ - MTri3 *t2 = t1->getNeigh(iLocalEdge); - if(!t2) return false; - - MVertex *v1 = t1->tri()->getVertex(iLocalEdge == 0 ? 2 : iLocalEdge - 1); - MVertex *v2 = t1->tri()->getVertex((iLocalEdge) % 3); - MVertex *v3 = t1->tri()->getVertex((iLocalEdge + 1) % 3); - MVertex *v4 = 0; - - std::set<MEdge, Less_Edge>::iterator it = - data.internalEdges.find(MEdge(v1, v2)); - if(it != data.internalEdges.end()) return false; - - for(int i = 0; i < 3; i++) - if(t2->tri()->getVertex(i) != v1 && t2->tri()->getVertex(i) != v2) - v4 = t2->tri()->getVertex(i); - - if(!v4) { - printf("%lu %lu %lu\n", v1->getNum(), v2->getNum(), v3->getNum()); - printf("%lu %lu %lu\n", t2->tri()->getVertex(0)->getNum(), - t2->tri()->getVertex(1)->getNum(), - t2->tri()->getVertex(2)->getNum()); - } - - swapquad sq(v1, v2, v3, v4); - if(configs.find(sq) != configs.end()) return false; - configs.insert(sq); - - // if (edgeSwapDelProj(v3, v4, v2, v1)) return false; - - MTriangle *t1b = new MTriangle(v2, v3, v4); - MTriangle *t2b = new MTriangle(v4, v3, v1); - - switch(cr) { - case SWCR_QUAL: { - const double triQualityRef = - std::min(qmTriangle::gamma(t1->tri()), qmTriangle::gamma(t2->tri())); - const double triQuality = - std::min(qmTriangle::gamma(t1b), qmTriangle::gamma(t2b)); - if(!edgeSwapDelProj(v1, v2, v3, v4)) { - if(triQuality < triQualityRef) { - delete t1b; - delete t2b; - return false; - } - } - break; - } - case SWCR_DEL: { - int index1 = data.getIndex(v1); - int index2 = data.getIndex(v2); - int index3 = data.getIndex(v3); - int index4 = data.getIndex(v4); - double edgeCenter[2] = { - (data.Us[index1] + data.Us[index2] + data.Us[index3] + data.Us[index4]) * - .25, - (data.Vs[index1] + data.Vs[index2] + data.Vs[index3] + data.Vs[index4]) * - .25}; - double uv4[2] = {data.Us[index4], data.Vs[index4]}; - double metric[3]; - buildMetric(gf, edgeCenter, metric); - if(!inCircumCircleAniso(gf, t1->tri(), uv4, metric, data)) { - delete t1b; - delete t2b; - return false; - } - } break; - default: - Msg::Error("Unknown swapping criterion"); - delete t1b; - delete t2b; - return false; - } - - std::list<MTri3 *> cavity; - for(int i = 0; i < 3; i++) { - if(t1->getNeigh(i) && t1->getNeigh(i) != t2) { - bool found = false; - for(std::list<MTri3 *>::iterator it = cavity.begin(); it != cavity.end(); - it++) { - if(*it == t1->getNeigh(i)) found = true; - } - if(!found) cavity.push_back(t1->getNeigh(i)); - } - } - for(int i = 0; i < 3; i++) { - if(t2->getNeigh(i) && t2->getNeigh(i) != t1) { - bool found = false; - for(std::list<MTri3 *>::iterator it = cavity.begin(); it != cavity.end(); - it++) { - if(*it == t2->getNeigh(i)) found = true; - } - if(!found) cavity.push_back(t2->getNeigh(i)); - } - } - - int i10 = data.getIndex(t1b->getVertex(0)); - int i11 = data.getIndex(t1b->getVertex(1)); - int i12 = data.getIndex(t1b->getVertex(2)); - - int i20 = data.getIndex(t2b->getVertex(0)); - int i21 = data.getIndex(t2b->getVertex(1)); - int i22 = data.getIndex(t2b->getVertex(2)); - - double lc1 = - 0.3333333333 * (data.vSizes[i10] + data.vSizes[i11] + data.vSizes[i12]); - double lcBGM1 = 0.3333333333 * (data.vSizesBGM[i10] + data.vSizesBGM[i11] + - data.vSizesBGM[i12]); - - double lc2 = - 0.3333333333 * (data.vSizes[i20] + data.vSizes[i21] + data.vSizes[i22]); - double lcBGM2 = 0.3333333333 * (data.vSizesBGM[i20] + data.vSizesBGM[i21] + - data.vSizesBGM[i22]); - - MTri3 *t1b3 = - new MTri3(t1b, Extend1dMeshIn2dSurfaces() ? std::min(lc1, lcBGM1) : lcBGM1, - 0, &data, gf); - MTri3 *t2b3 = - new MTri3(t2b, Extend1dMeshIn2dSurfaces() ? std::min(lc2, lcBGM2) : lcBGM2, - 0, &data, gf); - - cavity.push_back(t2b3); - cavity.push_back(t1b3); - t1->setDeleted(true); - t2->setDeleted(true); - connectTriangles(cavity); - newTris.push_back(t2b3); - newTris.push_back(t1b3); - return true; -} - -int edgeSwapPass(GFace *gf, std::set<MTri3 *, compareTri3Ptr> &allTris, - const swapCriterion &cr, bidimMeshData &data) -{ - return 0; - typedef std::set<MTri3 *, compareTri3Ptr> CONTAINER; - - int nbSwapTot = 0; - std::set<swapquad> configs; - - std::set<MTri3 *, compareTri3Ptr> allTris2; - - for(int iter = 0; iter < 10; iter++) { - // printf("coucou1 %d\n",iter); - int nbSwap = 0; - std::vector<MTri3 *> newTris; - CONTAINER::iterator it = allTris.begin(); - while(it != allTris.end()) { - CONTAINER::iterator current = it++; - if(!(*current)->isDeleted()) { - for(int i = 0; i < 3; i++) { - if(edgeSwap(configs, *current, gf, i, newTris, cr, data)) { - // printf("swap\n"); - nbSwap++; - break; - } - } - } - else { - delete(*current)->tri(); - delete *current; - allTris.erase(current); - } - } - // printf("coucou2\n"); - - // allTris = allTris2; - - allTris.insert(newTris.begin(), newTris.end()); - - // for(CONTAINER::iterator it = allTris.begin(); it != allTris.end(); ++it){ - // printf("---> %d %d %d (%d)\n",(*it)->tri()->getVertex(0)->getNum(), - // (*it)->tri()->getVertex(1)->getNum(), - // (*it)->tri()->getVertex(2)->getNum(),(*it)->isDeleted() ); - // } - - nbSwapTot += nbSwap; - if(nbSwap == 0) break; - } - return nbSwapTot; -} - static void _recombineIntoQuads(GFace *gf, bool blossom, bool cubicGraph = 1) { if(gf->triangles.empty()) return; diff --git a/Mesh/meshGFaceOptimize.h b/Mesh/meshGFaceOptimize.h index 306c75e2c589e21390238417dae58cf9f2ea20b7..60a953b52523150af4015607756ceddc4610804b 100644 --- a/Mesh/meshGFaceOptimize.h +++ b/Mesh/meshGFaceOptimize.h @@ -48,7 +48,6 @@ void buildVertexToElement(std::vector<T *> const &elements, v2t_cont &adj) template <class T> void buildEdgeToElement(std::vector<T *> &eles, e2t_cont &adj); -void buildVertexToTriangle(std::vector<MTriangle *> &, v2t_cont &adj); void buildEdgeToTriangle(std::vector<MTriangle *> &, e2t_cont &adj); void buildListOfEdgeAngle(e2t_cont adj, std::vector<edge_angle> &edges_detected, std::vector<edge_angle> &edges_lonly); @@ -56,11 +55,6 @@ void buildEdgeToElements(std::vector<MElement *> &tris, e2t_cont &adj); void laplaceSmoothing(GFace *gf, int niter = 1, bool infinity_norm = false); -enum swapCriterion { SWCR_DEL, SWCR_QUAL, SWCR_SPH }; -enum splitCriterion { SPCR_CLOSE, SPCR_QUAL, SPCR_ALLWAYS }; - -int edgeSwapPass(GFace *gf, std::set<MTri3 *, compareTri3Ptr> &allTris, - const swapCriterion &cr, bidimMeshData &DATA); bool buildMeshGenerationDataStructures( GFace *gf, std::set<MTri3 *, compareTri3Ptr> &AllTris, bidimMeshData &data); void transferDataStructure(GFace *gf, diff --git a/Mesh/meshGRegionBoundaryRecovery.cpp b/Mesh/meshGRegionBoundaryRecovery.cpp index 163c1d481e8d9c707253a15106efa85b8c691517..18e5f84989a6df78584fe0f9b7a76362cb0321c9 100644 --- a/Mesh/meshGRegionBoundaryRecovery.cpp +++ b/Mesh/meshGRegionBoundaryRecovery.cpp @@ -135,7 +135,7 @@ namespace tetgenBR { #if !defined(TETLIBRARY) #define TETLIBRARY #endif -#define printf Msg::Info +#define printf Msg::Auto #include "tetgenBR.h" #include "tetgenBR.cxx" #undef printf @@ -295,7 +295,7 @@ namespace tetgenBR { int t1ver; int idx, k; - Msg::Info("Reconstructing mesh ..."); + Msg::Info("Reconstructing mesh..."); // Allocate an array that maps each vertex to its adjacent tets. ver2tetarray = new tetrahedron[_vertices.size() + in->firstnumber]; @@ -358,7 +358,7 @@ namespace tetgenBR { } else if(ori == 0.0) { if(!b->quiet) { - Msg::Warning("Tet #%d is degenerate", i + in->firstnumber); + Msg::Warning("Tet #%d is degenerated", i + in->firstnumber); } } // Create a new tetrahedron. @@ -499,7 +499,7 @@ namespace tetgenBR { std::vector<GEdge *> const &e_list = _gr->embeddedEdges(); { - Msg::Info("Creating surface mesh..."); + Msg::Info(" - Creating surface mesh"); face newsh; face newseg; point p[4]; @@ -559,7 +559,7 @@ namespace tetgenBR { // Connecting triangles, removing redundant segments. unifysegments(); - Msg::Info("Identifying boundary edges..."); + Msg::Info(" - Identifying boundary edges"); face *shperverlist; int *idx2shlist; @@ -651,7 +651,7 @@ namespace tetgenBR { delete[] shperverlist; delete[] idx2shlist; - Msg::Debug(" %ld (%ld) subfaces (segments).", subfaces->items, + Msg::Debug(" %ld (%ld) subfaces (segments)", subfaces->items, subsegs->items); // The total number of iunput segments. @@ -667,7 +667,7 @@ namespace tetgenBR { // Boundary recovery. clock_t t; - Msg::Info("Boundary Recovery..."); + Msg::Info(" - Recovering boundary"); recoverboundary(t); carveholes(); @@ -885,7 +885,8 @@ namespace tetgenBR { } if(!_extras.empty()) - Msg::Info("Added %d steiner points", _extras.size()); + Msg::Info(" - Added %d Steiner point%s", _extras.size(), + (_extras.size() > 1) ? "s" : ""); if(l_edges.size() > 0) { // There are Steiner points on segments! @@ -906,7 +907,7 @@ namespace tetgenBR { } } assert(ge != NULL); - Msg::Info("Steiner points exist on curve %d", ge->tag()); + Msg::Info(" - Steiner points exist on curve %d", ge->tag()); // Delete the old triangles. for(std::size_t i = 0; i < ge->lines.size(); i++) delete ge->lines[i]; @@ -953,7 +954,7 @@ namespace tetgenBR { } assert(gf != NULL); // Delete the old triangles. - Msg::Info("Steiner points exist on surface %d", gf->tag()); + Msg::Info(" - Steiner points exist on surface %d", gf->tag()); for(std::size_t i = 0; i < gf->triangles.size(); i++) delete gf->triangles[i]; gf->triangles.clear(); @@ -1019,7 +1020,7 @@ namespace tetgenBR { } } // mesh output - Msg::Info("Reconstruct time : %g sec", Cpu() - t_start); + Msg::Info("Done reconstructing mesh (%g s)", Cpu() - t_start); // Put all coordinates back so they are not pertubated anymore (pertubation // done in delaunayTriangulation) diff --git a/Mesh/meshPartition.cpp b/Mesh/meshPartition.cpp index e9dcb0ff18a068fe45f8b14855ad9818249e8a60..205ea92a05192cef1816ebedc85f15db9974f9e1 100644 --- a/Mesh/meshPartition.cpp +++ b/Mesh/meshPartition.cpp @@ -631,54 +631,108 @@ static int MakeGraph(GModel *const model, Graph &graph, int selectDim) static int PartitionGraph(Graph &graph) { #ifdef HAVE_METIS - Msg::Info("Running METIS graph partitioner"); - + std::stringstream opt; try { int metisOptions[METIS_NOPTIONS]; METIS_SetDefaultOptions((idx_t *)metisOptions); + opt << "ptype:"; switch(CTX::instance()->mesh.metisAlgorithm) { case 1: // Recursive metisOptions[METIS_OPTION_PTYPE] = METIS_PTYPE_RB; + opt << "rb"; break; case 2: // K-way metisOptions[METIS_OPTION_PTYPE] = METIS_PTYPE_KWAY; + opt << "kway"; + break; + default: + opt << "default"; break; - default: Msg::Info("Unknown partitioning algorithm"); break; } + opt << ", ufactor:"; + if(CTX::instance()->mesh.metisMaxLoadImbalance >= 0) { + metisOptions[METIS_OPTION_UFACTOR] = + CTX::instance()->mesh.metisMaxLoadImbalance; + opt << CTX::instance()->mesh.metisMaxLoadImbalance; + } + else { + opt << "default"; + } + + opt << ", ctype:"; switch(CTX::instance()->mesh.metisEdgeMatching) { case 1: // Random matching metisOptions[METIS_OPTION_CTYPE] = METIS_CTYPE_RM; + opt << "rm"; break; case 2: // Sorted heavy-edge matching metisOptions[METIS_OPTION_CTYPE] = METIS_CTYPE_SHEM; + opt << "shem"; + break; + default: + opt << "default"; break; - default: Msg::Info("Unknown partitioning edge matching"); break; } + opt << ", rtype:"; switch(CTX::instance()->mesh.metisRefinementAlgorithm) { case 1: // FM-based cut refinement metisOptions[METIS_OPTION_RTYPE] = METIS_RTYPE_FM; + opt << "fm"; break; case 2: // Greedy boundary refinement metisOptions[METIS_OPTION_RTYPE] = METIS_RTYPE_GREEDY; + opt << "greedy"; break; case 3: // Two-sided node FM refinement metisOptions[METIS_OPTION_RTYPE] = METIS_RTYPE_SEP2SIDED; + opt << "sep2sided"; break; case 4: // One-sided node FM refinement metisOptions[METIS_OPTION_RTYPE] = METIS_RTYPE_SEP1SIDED; + opt << "sep1sided"; + break; + default: + opt << "default"; + break; + } + + opt << ", objtype:"; + switch(CTX::instance()->mesh.metisObjective) { + case 1: // Min. cut + metisOptions[METIS_OPTION_OBJTYPE] = METIS_OBJTYPE_CUT; + opt << "cut"; + break; + case 2: // Min. communication volume (slower) + metisOptions[METIS_OPTION_OBJTYPE] = METIS_OBJTYPE_VOL; + opt << "vol"; + break; + default: + opt << "default"; + break; + } + + opt << ", minconn:"; + switch(CTX::instance()->mesh.metisMinConn) { + case 0: + metisOptions[METIS_OPTION_MINCONN] = 0; + opt << 0; + break; + case 1: + metisOptions[METIS_OPTION_MINCONN] = 1; + opt << 1; + break; + default: + opt << "default"; break; - default: Msg::Info("Unknown partitioning refinement algorithm"); break; } + Msg::Info("Running METIS with %s", opt.str().c_str()); + // C numbering metisOptions[METIS_OPTION_NUMBERING] = 0; - // Specifies the type of objective - metisOptions[METIS_OPTION_OBJTYPE] = METIS_OBJTYPE_CUT; - // Forces contiguous partitions. - // metisOptions[METIS_OPTION_CONTIG] = 1; int objval; unsigned int *epart = new unsigned int[graph.ne()]; @@ -1574,7 +1628,7 @@ static partitionFace *assignPartitionBoundary( } else { MTriangleN *element = - new MTriangleN(verts, verts[0]->getPolynomialOrder()); + new MTriangleN(verts, verts.back()->getPolynomialOrder()); ppf->addTriangle(element); } } @@ -1596,7 +1650,7 @@ static partitionFace *assignPartitionBoundary( } else { MQuadrangleN *element = - new MQuadrangleN(verts, verts[0]->getPolynomialOrder()); + new MQuadrangleN(verts, verts.back()->getPolynomialOrder()); ppf->addQuadrangle(element); } } @@ -1844,8 +1898,8 @@ static void CreatePartitionTopology( std::set<GEdge *, GEntityLessThan> edges = model->getEdges(); std::set<GVertex *, GEntityLessThan> vertices = model->getVertices(); - if(meshDim >= 3) { // Create partition faces - Msg::Info(" - Creating partition faces"); + if(meshDim >= 3) { + Msg::Info(" - Creating partition surfaces"); for(unsigned int i = 0; i < model->getNumPartitions(); i++) { for(std::set<MElement *>::iterator it = boundaryElements[i].begin(); @@ -1889,8 +1943,8 @@ static void CreatePartitionTopology( fillElementToEntity(model, elementToEntity, 2); } - if(meshDim >= 2) { // Create partition edges - Msg::Info(" - Creating partition edges"); + if(meshDim >= 2) { + Msg::Info(" - Creating partition curves"); if(meshDim == 2) { for(unsigned int i = 0; i < model->getNumPartitions(); i++) { @@ -1983,8 +2037,8 @@ static void CreatePartitionTopology( fillElementToEntity(model, elementToEntity, 1); } - if(meshDim >= 1) { // Create partition vertices - Msg::Info(" - Creating partition vertices"); + if(meshDim >= 1) { + Msg::Info(" - Creating partition points"); if(meshDim == 1) { for(unsigned int i = 0; i < model->getNumPartitions(); i++) { for(std::set<MElement *>::iterator it = boundaryElements[i].begin(); @@ -2317,8 +2371,8 @@ int PartitionMesh(GModel *const model) totCount += count[j]; } if(totCount > 0) { - Msg::Info(" - Repartition of %d %s(s): %d(min) %d(max) %g(avg)", - totCount, ElementType::nameOfParentType(i).c_str(), + Msg::Info(" - Repartition of %d %s: %d(min) %d(max) %g(avg)", + totCount, ElementType::nameOfParentType(i, totCount > 1).c_str(), minCount, maxCount, totCount / (double)CTX::instance()->mesh.numPartitions); } diff --git a/Mesh/meshRefine.cpp b/Mesh/meshRefine.cpp index 66c102149fd9346ab3a25d7e1a528c50f14709ce..61f08f72ba7b103e4453bf8c89d2aad47e5fab2e 100644 --- a/Mesh/meshRefine.cpp +++ b/Mesh/meshRefine.cpp @@ -195,24 +195,28 @@ static void Subdivide(GRegion *gr, bool splitIntoHexas, std::vector<MTetrahedron *> tetrahedra2; for(std::size_t i = 0; i < gr->tetrahedra.size(); i++) { MTetrahedron *t = gr->tetrahedra[i]; - // FIXME: we should choose the template to maximize the quality + // Use a template that maximizes the quality, which is a modification of + // Algorithm RedRefinement3D in: Bey, Jürgen. "Simplicial grid refinement: + // on Freudenthal's algorithm and the optimal number of congruence + // classes." Numerische Mathematik 85.1 (2000): 1-29. Contributed by Jose + // Paulo Moitinho de Almeida, April 2019. if(t->getNumVertices() == 10) { tetrahedra2.push_back(new MTetrahedron( - t->getVertex(0), t->getVertex(4), t->getVertex(7), t->getVertex(6))); + t->getVertex(0), t->getVertex(4), t->getVertex(6), t->getVertex(7))); tetrahedra2.push_back(new MTetrahedron( - t->getVertex(1), t->getVertex(4), t->getVertex(5), t->getVertex(9))); + t->getVertex(4), t->getVertex(1), t->getVertex(5), t->getVertex(9))); tetrahedra2.push_back(new MTetrahedron( - t->getVertex(2), t->getVertex(5), t->getVertex(6), t->getVertex(8))); + t->getVertex(6), t->getVertex(5), t->getVertex(2), t->getVertex(8))); tetrahedra2.push_back(new MTetrahedron( - t->getVertex(3), t->getVertex(7), t->getVertex(9), t->getVertex(8))); + t->getVertex(7), t->getVertex(9), t->getVertex(8), t->getVertex(3))); tetrahedra2.push_back(new MTetrahedron( - t->getVertex(5), t->getVertex(8), t->getVertex(7), t->getVertex(9))); + t->getVertex(4), t->getVertex(6), t->getVertex(7), t->getVertex(9))); tetrahedra2.push_back(new MTetrahedron( - t->getVertex(5), t->getVertex(7), t->getVertex(4), t->getVertex(9))); + t->getVertex(4), t->getVertex(9), t->getVertex(5), t->getVertex(6))); tetrahedra2.push_back(new MTetrahedron( - t->getVertex(7), t->getVertex(8), t->getVertex(5), t->getVertex(6))); + t->getVertex(6), t->getVertex(7), t->getVertex(9), t->getVertex(8))); tetrahedra2.push_back(new MTetrahedron( - t->getVertex(4), t->getVertex(7), t->getVertex(5), t->getVertex(6))); + t->getVertex(6), t->getVertex(8), t->getVertex(9), t->getVertex(5))); setBLData(t); } delete t; diff --git a/Mesh/qualityMeasuresJacobian.cpp b/Mesh/qualityMeasuresJacobian.cpp index 1646c3af4211a929ed5f0a8beee03cb5ac024b52..2c56d1094317c545700bc46d8705f9a026fa3638 100644 --- a/Mesh/qualityMeasuresJacobian.cpp +++ b/Mesh/qualityMeasuresJacobian.cpp @@ -5,25 +5,23 @@ #include <limits> #include "qualityMeasuresJacobian.h" +#include "FuncSpaceData.h" #include "MElement.h" #include "BasisFactory.h" #include "bezierBasis.h" #include "JacobianBasis.h" #include "Numeric.h" -// For debugging -#include <sstream> -#include <iomanip> -#include "pointsGenerators.h" -#include "OS.h" +// For regression tests: +#include "GModel.h" static const double cTri = 2 / std::sqrt(3); static const double cTet = std::sqrt(2); static const double cPyr = 4 * std::sqrt(2); -static inline void _computeCoeffLengthVectors(const fullMatrix<double> &mat, - fullMatrix<double> &coeff, - int type, int numCoeff = -1) +static void _computeCoeffLengthVectors(const fullMatrix<double> &mat, + fullMatrix<double> &coeff, int type, + int numCoeff = -1) { int sz1 = numCoeff > -1 ? numCoeff : mat.size1(); @@ -102,9 +100,9 @@ static inline void _computeCoeffLengthVectors(const fullMatrix<double> &mat, } } -static inline void computeIGE_(const fullVector<double> &det, - const fullMatrix<double> &v, - fullVector<double> &ige, int type) +static void _computeIGE(const fullVector<double> &det, + const fullMatrix<double> &v, fullVector<double> &ige, + int type) { int sz = std::min(det.size(), v.size1()); ige.resize(sz); @@ -164,11 +162,89 @@ static inline void computeIGE_(const fullVector<double> &det, } } +static void _computeICN(const fullVector<double> &det, + const fullMatrix<double> &grad, fullVector<double> &icn, + int dim) +{ + int sz = std::min(det.size(), grad.size1()); + icn.resize(sz); + + for(int i = 0; i < sz; i++) { + double p = 0; + for(int k = 0; k < grad.size2(); ++k) { + p += pow_int(grad(i, k), 2); + } + if(dim == 2) + icn(i) = 2 * det(i) / p; + else // 3D + icn(i) = 3 * std::pow(det(i), 2 / 3.) / p; + } +} + +static void _getQualityFunctionSpace(MElement *el, FuncSpaceData &fsGrad, + FuncSpaceData &fsDet, + int orderSamplingPoints = 0) +{ + const int type = el->getType(); + + if(orderSamplingPoints < 1) { // For computing bounds + const int order = el->getPolynomialOrder(); + const int jacOrder = order * el->getDim(); + + switch(type) { + case TYPE_TRI: + fsGrad = FuncSpaceData(el, order - 1, false); + fsDet = FuncSpaceData(el, jacOrder - 2, false); + break; + case TYPE_TET: + fsGrad = FuncSpaceData(el, order - 1, false); + fsDet = FuncSpaceData(el, jacOrder - 3, false); + break; + case TYPE_QUA: + case TYPE_HEX: + case TYPE_PRI: + fsGrad = FuncSpaceData(el, order, false); + fsDet = FuncSpaceData(el, jacOrder, false); + break; + case TYPE_PYR: + fsGrad = FuncSpaceData(el, false, order, order - 1, false); + fsDet = FuncSpaceData(el, false, jacOrder, jacOrder - 3, false); + break; + default: + Msg::Error("Quality measure not implemented for type of element %d", + el->getType()); + fsGrad = FuncSpaceData(); + fsDet = FuncSpaceData(); + } + } + else { + const int type = el->getType(); + switch(type) { + case TYPE_TRI: + case TYPE_TET: + case TYPE_QUA: + case TYPE_HEX: + case TYPE_PRI: + fsGrad = FuncSpaceData(el, orderSamplingPoints, false); + fsDet = FuncSpaceData(el, orderSamplingPoints, false); + break; + case TYPE_PYR: + fsGrad = FuncSpaceData(el, true, 1, orderSamplingPoints - 1, false); + fsDet = FuncSpaceData(el, true, 1, orderSamplingPoints - 1, false); + break; + default: + Msg::Error("IGE not implemented for type of element %d", el->getType()); + return; + } + } +} + namespace jacobianBasedQuality { void minMaxJacobianDeterminant(MElement *el, double &min, double &max, - const fullMatrix<double> *normals) + const fullMatrix<double> *normals, bool debug) { + // Get Jacobian basis const JacobianBasis *jfs = el->getJacobianFuncSpace(); if(!jfs) { Msg::Error( @@ -179,214 +255,135 @@ namespace jacobianBasedQuality { return; } + // Sample jacobian determinant fullMatrix<double> nodesXYZ(el->getNumVertices(), 3); - el->getNodesCoord(nodesXYZ); - fullVector<double> coeffLag(jfs->getNumJacNodes()); - fullVector<double> coeffBez(jfs->getNumJacNodes()); + el->getNodesCoord(nodesXYZ); jfs->getSignedJacobian(nodesXYZ, coeffLag, normals); - jfs->lag2Bez(coeffLag, coeffBez); - std::vector<_coefData *> domains; - domains.push_back(new _coefDataJac(coeffBez, jfs->getBezier(), 0)); + // Convert into Bezier coeff + bezierCoeff::usePools(static_cast<std::size_t>(coeffLag.size()), 0); + bezierCoeff *bez = new bezierCoeff(jfs->getFuncSpaceData(), coeffLag, 0); - _subdivideDomains(domains); + // Refine coefficients + std::vector<_coeffData *> domains(1, new _coeffDataJac(bez)); + _subdivideDomains(domains, true, debug); - min = domains[0]->minB(); - max = domains[0]->maxB(); - delete domains[0]; - for(std::size_t i = 1; i < domains.size(); ++i) { + // Get extrema + min = std::numeric_limits<double>::infinity(); + max = -min; + for(std::size_t i = 0; i < domains.size(); ++i) { min = std::min(min, domains[i]->minB()); max = std::max(max, domains[i]->maxB()); + domains[i]->deleteBezierCoeff(); delete domains[i]; } } double minIGEMeasure(MElement *el, bool knownValid, bool reversedOk, - const fullMatrix<double> *normals) + const fullMatrix<double> *normals, bool debug) { - bool isReversed = false; if(!knownValid) { // Computation of the measure should never // be performed to invalid elements (for which the measure is 0). double jmin, jmax; minMaxJacobianDeterminant(el, jmin, jmax, normals); - if(jmax < 0) { - if(!reversedOk) return 0; - isReversed = true; - } - else if(jmin <= 0) - return 0; + if((jmin <= 0 && jmax >= 0) || (jmax < 0 && !reversedOk)) return 0; } - fullMatrix<double> nodesXYZ(el->getNumVertices(), 3); - el->getNodesCoord(nodesXYZ); - - const JacobianBasis *jacBasis; + // Get Jacobian and gradient bases const GradientBasis *gradBasis; - - const int type = el->getType(); - const int order = el->getPolynomialOrder(); - const int jacOrder = order * el->getDim(); - const bool serendipFalse = false; - + const JacobianBasis *jacBasis; + const int tag = el->getTypeForMSH(); FuncSpaceData jacMatSpace, jacDetSpace; + _getQualityFunctionSpace(el, jacMatSpace, jacDetSpace); + gradBasis = BasisFactory::getGradientBasis(tag, jacMatSpace); + jacBasis = BasisFactory::getJacobianBasis(tag, jacDetSpace); - switch(type) { - case TYPE_TRI: - jacMatSpace = FuncSpaceData(el, order - 1, &serendipFalse); - jacDetSpace = FuncSpaceData(el, jacOrder - 2, &serendipFalse); - break; - case TYPE_TET: - jacMatSpace = FuncSpaceData(el, order - 1, &serendipFalse); - jacDetSpace = FuncSpaceData(el, jacOrder - 3, &serendipFalse); - break; - case TYPE_QUA: - case TYPE_HEX: - case TYPE_PRI: - jacMatSpace = FuncSpaceData(el, order, &serendipFalse); - jacDetSpace = FuncSpaceData(el, jacOrder, &serendipFalse); - break; - case TYPE_PYR: - jacMatSpace = FuncSpaceData(el, false, order, order - 1, &serendipFalse); - jacDetSpace = - FuncSpaceData(el, false, jacOrder, jacOrder - 3, &serendipFalse); - break; - default: - Msg::Error("IGE measure not implemented for type of element %d", - el->getType()); - return -1; - } - gradBasis = BasisFactory::getGradientBasis(jacMatSpace); - jacBasis = BasisFactory::getJacobianBasis(jacDetSpace); - - fullVector<double> coeffDetBez; - { - fullVector<double> coeffDetLag(jacBasis->getNumJacNodes()); - jacBasis->getSignedJacobian(nodesXYZ, coeffDetLag, normals); - - coeffDetBez.resize(jacBasis->getNumJacNodes()); - jacBasis->lag2Bez(coeffDetLag, coeffDetBez); - - if(isReversed) coeffDetBez.scale(-1); - } - - fullMatrix<double> coeffMatBez; - { - fullMatrix<double> coeffMatLag(gradBasis->getNumSamplingPoints(), 9); - gradBasis->getAllGradientsFromNodes(nodesXYZ, coeffMatLag); - - coeffMatBez.resize(gradBasis->getNumSamplingPoints(), 9); - gradBasis->lag2Bez(coeffMatLag, coeffMatBez); - if(el->getDim() == 2) coeffMatBez.resize(coeffMatBez.size1(), 6, false); - } + // Sample gradients and jacobian determinant + fullMatrix<double> nodesXYZ(el->getNumVertices(), 3); + fullVector<double> coeffDetLag(jacBasis->getNumJacNodes()); + fullMatrix<double> coeffMatLag(gradBasis->getNumSamplingPoints(), 9); + el->getNodesCoord(nodesXYZ); + jacBasis->getSignedJacobian(nodesXYZ, coeffDetLag, normals); + gradBasis->getAllGradientsFromNodes(nodesXYZ, coeffMatLag); + // NB: If coeffDetLag(0) is negative, then all coefficients are negative + if(coeffDetLag(0) < 0) coeffDetLag.scale(-1); + if(el->getDim() == 2) coeffMatLag.resize(coeffMatLag.size1(), 6, false); - std::vector<_coefData *> domains; - domains.push_back( - new _coefDataIGE(coeffDetBez, coeffMatBez, jacBasis->getBezier(), - gradBasis->getBezier(), 0, el->getType())); + // Convert into Bezier coeff + bezierCoeff::usePools(static_cast<std::size_t>(coeffDetLag.size()), + static_cast<std::size_t>(coeffMatLag.size1()) * + static_cast<std::size_t>(coeffMatLag.size2())); + bezierCoeff *bezDet = new bezierCoeff(jacDetSpace, coeffDetLag, 0); + bezierCoeff *bezMat = new bezierCoeff(jacMatSpace, coeffMatLag, 1); - _subdivideDomains(domains); - // if (domains.size()/7 > 500) {//fordebug - // Msg::Info("S too much subdivision: %d (el %d, type %d, tag %d)", - // domains.size()/7, el->getNum(), el->getType(), - // el->getTypeForMSH()); - // } + // Compute measure and refine + std::vector<_coeffData *> domains; + domains.push_back(new _coeffDataIGE(el->getType(), bezDet, bezMat)); + _subdivideDomains(domains, false, debug); return _getMinAndDeleteDomains(domains); } double minICNMeasure(MElement *el, bool knownValid, bool reversedOk, - const fullMatrix<double> *normals) + const fullMatrix<double> *normals, bool debug) { - bool isReversed = false; if(!knownValid) { // Computation of the measure should never // be performed to invalid elements (for which the measure is 0). double jmin, jmax; minMaxJacobianDeterminant(el, jmin, jmax, normals); - if(jmax < 0) { - if(!reversedOk) return 0; - isReversed = true; - } - else if(jmin <= 0) - return 0; + if((jmin <= 0 && jmax >= 0) || (jmax < 0 && !reversedOk)) return 0; } - fullMatrix<double> nodesXYZ(el->getNumVertices(), 3); - el->getNodesCoord(nodesXYZ); - - const JacobianBasis *jacBasis; + // Get Jacobian and gradient bases const GradientBasis *gradBasis; - - const int type = el->getType(); - const int order = el->getPolynomialOrder(); - const int jacOrder = order * el->getDim(); - const bool serendipFalse = false; - + const JacobianBasis *jacBasis; + const int tag = el->getTypeForMSH(); FuncSpaceData jacMatSpace, jacDetSpace; + _getQualityFunctionSpace(el, jacMatSpace, jacDetSpace); + gradBasis = BasisFactory::getGradientBasis(tag, jacMatSpace); + jacBasis = BasisFactory::getJacobianBasis(tag, jacDetSpace); - switch(type) { - case TYPE_TRI: - jacMatSpace = FuncSpaceData(el, order - 1, &serendipFalse); - jacDetSpace = FuncSpaceData(el, jacOrder - 2, &serendipFalse); - break; - case TYPE_TET: - jacMatSpace = FuncSpaceData(el, order - 1, &serendipFalse); - jacDetSpace = FuncSpaceData(el, jacOrder - 3, &serendipFalse); - break; - case TYPE_QUA: - case TYPE_HEX: - case TYPE_PRI: - jacMatSpace = FuncSpaceData(el, order, &serendipFalse); - jacDetSpace = FuncSpaceData(el, jacOrder, &serendipFalse); - break; - case TYPE_PYR: - jacMatSpace = FuncSpaceData(el, false, order, order - 1, &serendipFalse); - jacDetSpace = - FuncSpaceData(el, false, jacOrder, jacOrder - 3, &serendipFalse); - break; - default: - Msg::Error("ICN not implemented for type of element %d", el->getType()); - return -1; - } - gradBasis = BasisFactory::getGradientBasis(jacMatSpace); - jacBasis = BasisFactory::getJacobianBasis(jacDetSpace); + // Sample gradients and jacobian determinant + fullMatrix<double> nodesXYZ(el->getNumVertices(), 3); + fullVector<double> coeffDetLag(jacBasis->getNumJacNodes()); + fullMatrix<double> coeffMatLag(gradBasis->getNumSamplingPoints(), 9); + el->getNodesCoord(nodesXYZ); + jacBasis->getSignedIdealJacobian(nodesXYZ, coeffDetLag, normals); + gradBasis->getAllIdealGradientsFromNodes(nodesXYZ, coeffMatLag); + // NB: If coeffDetLag(0) is negative, then all coefficients are negative + if(coeffDetLag(0) < 0) coeffDetLag.scale(-1); + if(el->getDim() == 2) coeffMatLag.resize(coeffMatLag.size1(), 6, false); - fullVector<double> coeffDetBez; - { - fullVector<double> coeffDetLag(jacBasis->getNumJacNodes()); - jacBasis->getSignedIdealJacobian(nodesXYZ, coeffDetLag, normals); + // Convert into Bezier coeff + bezierCoeff::usePools(static_cast<std::size_t>(coeffDetLag.size()), + static_cast<std::size_t>(coeffMatLag.size1()) * + static_cast<std::size_t>(coeffMatLag.size2())); + bezierCoeff *bezDet = new bezierCoeff(jacDetSpace, coeffDetLag, 0); + bezierCoeff *bezMat = new bezierCoeff(jacMatSpace, coeffMatLag, 1); - coeffDetBez.resize(jacBasis->getNumJacNodes()); - jacBasis->lag2Bez(coeffDetLag, coeffDetBez); + // Compute measure and refine + std::vector<_coeffData *> domains; + domains.push_back(new _coeffDataICN(el->getDim(), bezDet, bezMat)); + _subdivideDomains(domains, false, debug); - if(isReversed) coeffDetBez.scale(-1); - } + return _getMinAndDeleteDomains(domains); + } - fullMatrix<double> coeffMatBez; - { - fullMatrix<double> coeffMatLag(gradBasis->getNumSamplingPoints(), 9); - gradBasis->getAllIdealGradientsFromNodes(nodesXYZ, coeffMatLag); + void sampleJacobianDeterminant(MElement *el, int deg, double &min, + double &max, const fullMatrix<double> *normals) + { + fullVector<double> jac; + sampleJacobianDeterminant(el, deg, jac, normals); - coeffMatBez.resize(gradBasis->getNumSamplingPoints(), 9); - gradBasis->lag2Bez(coeffMatLag, coeffMatBez); - if(el->getDim() == 2) coeffMatBez.resize(coeffMatBez.size1(), 6, false); + min = std::numeric_limits<double>::infinity(); + max = -min; + for(int i = 0; i < jac.size(); ++i) { + min = std::min(min, jac(i)); + max = std::max(max, jac(i)); } - - std::vector<_coefData *> domains; - domains.push_back(new _coefDataICN(coeffDetBez, coeffMatBez, - jacBasis->getBezier(), - gradBasis->getBezier(), 0)); - - _subdivideDomains(domains); - // if (domains.size()/7 > 500) {//fordebug - // Msg::Info("I too much subdivision: %d (el %d, type %d, tag %d)", - // domains.size()/7, el->getNum(), el->getType(), - // el->getTypeForMSH()); - // } - - return _getMinAndDeleteDomains(domains); } void sampleIGEMeasure(MElement *el, int deg, double &min, double &max) @@ -402,283 +399,155 @@ namespace jacobianBasedQuality { } } - void sampleJacobian(MElement *el, int deg, fullVector<double> &jac, - const fullMatrix<double> *normals) + void sampleICNMeasure(MElement *el, int deg, double &min, double &max) { - FuncSpaceData sampleSpace = FuncSpaceData(el, deg); - const JacobianBasis *jacBasis = BasisFactory::getJacobianBasis(sampleSpace); + fullVector<double> icn; + sampleICNMeasure(el, deg, icn); + + min = std::numeric_limits<double>::infinity(); + max = -min; + for(int i = 0; i < icn.size(); ++i) { + min = std::min(min, icn(i)); + max = std::max(max, icn(i)); + } + } + + void sampleJacobianDeterminant(MElement *el, int deg, fullVector<double> &jac, + const fullMatrix<double> *normals) + { + // Get Jacobian basis + const JacobianBasis *jacBasis; + FuncSpaceData sampleSpace; + if(el->getType() != TYPE_PYR) + sampleSpace = FuncSpaceData(el, deg, false); + else + sampleSpace = FuncSpaceData(TYPE_PYR, true, 1, deg - 1, false); + jacBasis = BasisFactory::getJacobianBasis(el->getTypeForMSH(), sampleSpace); + // Sample jacobian determinant fullMatrix<double> nodesXYZ(el->getNumVertices(), 3); el->getNodesCoord(nodesXYZ); - jac.resize(jacBasis->getNumJacNodes()); jacBasis->getSignedJacobian(nodesXYZ, jac, normals); } void sampleIGEMeasure(MElement *el, int deg, fullVector<double> &ige) { - fullMatrix<double> nodesXYZ(el->getNumVertices(), 3); - el->getNodesCoord(nodesXYZ); - - const bool serendipFalse = false; + // Get Jacobian and gradient bases + const GradientBasis *gradBasis; + const JacobianBasis *jacBasis; + const int tag = el->getTypeForMSH(); FuncSpaceData jacMatSpace, jacDetSpace; + _getQualityFunctionSpace(el, jacMatSpace, jacDetSpace, deg); + gradBasis = BasisFactory::getGradientBasis(tag, jacMatSpace); + jacBasis = BasisFactory::getJacobianBasis(tag, jacDetSpace); - const int type = el->getType(); - switch(type) { - case TYPE_TRI: - case TYPE_TET: - case TYPE_QUA: - case TYPE_HEX: - case TYPE_PRI: - jacMatSpace = FuncSpaceData(el, deg, &serendipFalse); - jacDetSpace = FuncSpaceData(el, deg, &serendipFalse); - break; - case TYPE_PYR: - jacMatSpace = FuncSpaceData(el, true, deg - 1, 1, &serendipFalse); - jacDetSpace = FuncSpaceData(el, true, deg - 1, 1, &serendipFalse); - break; - default: - Msg::Error("IGE not implemented for type of element %d", el->getType()); - return; - } - - const GradientBasis *gradBasis = - BasisFactory::getGradientBasis(jacMatSpace); - const JacobianBasis *jacBasis = BasisFactory::getJacobianBasis(jacDetSpace); - - fullVector<double> coeffDeterminant(jacBasis->getNumJacNodes()); - jacBasis->getSignedJacobian(nodesXYZ, coeffDeterminant); - - fullMatrix<double> coeffMatLag(gradBasis->getNumSamplingPoints(), 9); - gradBasis->getAllGradientsFromNodes(nodesXYZ, coeffMatLag); - if(el->getDim() == 2) coeffMatLag.resize(coeffMatLag.size1(), 6, false); - - fullMatrix<double> v; - _computeCoeffLengthVectors(coeffMatLag, v, type); - - computeIGE_(coeffDeterminant, v, ige, type); - } - - double minSampledICNMeasure(MElement *el, int deg) // fordebug - { + // Sample gradients and jacobian determinant fullMatrix<double> nodesXYZ(el->getNumVertices(), 3); + fullVector<double> determinant(jacBasis->getNumJacNodes()); + fullMatrix<double> gradients(gradBasis->getNumSamplingPoints(), 9); el->getNodesCoord(nodesXYZ); + jacBasis->getSignedJacobian(nodesXYZ, determinant); + gradBasis->getAllGradientsFromNodes(nodesXYZ, gradients); + if(el->getDim() == 2) gradients.resize(gradients.size1(), 6, false); - const JacobianBasis *jacBasis; - const GradientBasis *gradBasis; - + // Compute measure + fullMatrix<double> v; const int type = el->getType(); - // const int order = el->getPolynomialOrder(); - // const int jacOrder = order * el->getDim(); - const bool serendipFalse = false; - - FuncSpaceData jacMatSpace, jacDetSpace; - - switch(type) { - case TYPE_TRI: - case TYPE_TET: - case TYPE_QUA: - case TYPE_HEX: - case TYPE_PRI: - jacMatSpace = FuncSpaceData(el, deg, &serendipFalse); - jacDetSpace = FuncSpaceData(el, deg, &serendipFalse); - break; - case TYPE_PYR: - // jacMatSpace = FuncSpaceData(el, false, order, order-1, - // &serendipFalse); jacDetSpace = FuncSpaceData(el, false, jacOrder, - // jacOrder-3, &serendipFalse); - break; - default: - Msg::Error("ICN not implemented for type of element %d", el->getType()); - return -1; - } - gradBasis = BasisFactory::getGradientBasis(jacMatSpace); - jacBasis = BasisFactory::getJacobianBasis(jacDetSpace); - - fullVector<double> coeffDetLag(jacBasis->getNumJacNodes()); - jacBasis->getSignedIdealJacobian(nodesXYZ, coeffDetLag); - - fullMatrix<double> coeffMatLag(gradBasis->getNumSamplingPoints(), 9); - gradBasis->getAllIdealGradientsFromNodes(nodesXYZ, coeffMatLag); - - double min = std::numeric_limits<double>::infinity(); - for(int i = 0; i < coeffDetLag.size(); ++i) { - double frobNorm = 0; - if(el->getDim() == 2) { - for(int k = 0; k < 6; ++k) - frobNorm += coeffMatLag(i, k) * coeffMatLag(i, k); - min = std::min(min, 2 * coeffDetLag(i) / frobNorm); - } - else if(el->getDim() == 3) { - for(int k = 0; k < 9; ++k) - frobNorm += coeffMatLag(i, k) * coeffMatLag(i, k); - min = std::min(min, 3 * std::pow(coeffDetLag(i), 2 / 3.) / frobNorm); - } - } - - return min; + _computeCoeffLengthVectors(gradients, v, type); + _computeIGE(determinant, v, ige, type); } - double minSampledIGEMeasure(MElement *el, int deg) // fordebug + void sampleICNMeasure(MElement *el, int deg, fullVector<double> &icn) { - fullMatrix<double> nodesXYZ(el->getNumVertices(), 3); - el->getNodesCoord(nodesXYZ); - - const JacobianBasis *jacBasis; + // Get Jacobian and gradient bases const GradientBasis *gradBasis; - - const int type = el->getType(); - // const int order = el->getPolynomialOrder(); - // const int jacOrder = order * el->getDim(); - const bool serendipFalse = false; - + const JacobianBasis *jacBasis; + const int tag = el->getTypeForMSH(); FuncSpaceData jacMatSpace, jacDetSpace; + _getQualityFunctionSpace(el, jacMatSpace, jacDetSpace, deg); + gradBasis = BasisFactory::getGradientBasis(tag, jacMatSpace); + jacBasis = BasisFactory::getJacobianBasis(tag, jacDetSpace); - switch(type) { - case TYPE_TRI: - case TYPE_TET: - case TYPE_QUA: - case TYPE_HEX: - case TYPE_PRI: - jacMatSpace = FuncSpaceData(el, deg, &serendipFalse); - jacDetSpace = FuncSpaceData(el, deg, &serendipFalse); - break; - case TYPE_PYR: - // jacMatSpace = FuncSpaceData(el, false, order, order-1, - // &serendipFalse); jacDetSpace = FuncSpaceData(el, false, jacOrder, - // jacOrder-3, &serendipFalse); - break; - default: - Msg::Error("ICN not implemented for type of element %d", el->getType()); - return -1; - } - gradBasis = BasisFactory::getGradientBasis(jacMatSpace); - jacBasis = BasisFactory::getJacobianBasis(jacDetSpace); - - fullVector<double> coeffDetLag(jacBasis->getNumJacNodes()); - jacBasis->getSignedIdealJacobian(nodesXYZ, coeffDetLag); - - fullMatrix<double> coeffMatLag(gradBasis->getNumSamplingPoints(), 9); - gradBasis->getAllIdealGradientsFromNodes(nodesXYZ, coeffMatLag); - - double min = std::numeric_limits<double>::infinity(); - for(int i = 0; i < coeffDetLag.size(); ++i) { - if(el->getDim() == 2) { - double v[2] = {0, 0}; - for(int k = 0; k < 2; ++k) { - for(int l = k * 3; l < k * 3 + 3; ++l) - v[k] += coeffMatLag(i, l) * coeffMatLag(i, l); - } - min = std::min(min, coeffDetLag(i) / v[0] / v[1]); - } - else if(el->getDim() == 3) { - double v[3] = {0, 0, 0}; - for(int k = 0; k < 3; ++k) { - for(int l = k * 3; l < k * 3 + 3; ++l) - v[k] += coeffMatLag(i, l) * coeffMatLag(i, l); - } - min = std::min(min, coeffDetLag(i) / std::sqrt(v[0] * v[1] * v[2])); - } - } + // Sample gradients and jacobian determinant + fullMatrix<double> nodesXYZ(el->getNumVertices(), 3); + fullVector<double> determinant(jacBasis->getNumJacNodes()); + fullMatrix<double> gradients(gradBasis->getNumSamplingPoints(), 9); + el->getNodesCoord(nodesXYZ); + jacBasis->getSignedIdealJacobian(nodesXYZ, determinant); + gradBasis->getAllIdealGradientsFromNodes(nodesXYZ, gradients); - return min; + // Compute measure + _computeICN(determinant, gradients, icn, el->getDim()); } - // Virtual class _coefData - bool _lessMinB::operator()(_coefData *cd1, _coefData *cd2) const + // Virtual class _coeffData + bool _lessMinB::operator()(_coeffData *cd1, _coeffData *cd2) const { return cd1->minB() > cd2->minB(); } - bool _lessMaxB::operator()(_coefData *cd1, _coefData *cd2) const + bool _lessMaxB::operator()(_coeffData *cd1, _coeffData *cd2) const { return cd1->maxB() < cd2->maxB(); } // Jacobian determinant (for validity of all elements) - _coefDataJac::_coefDataJac(fullVector<double> &v, const bezierBasis *bfs, - int depth) - : _coefData(depth), _coeffs(v.getDataPtr(), v.size()), _bfs(bfs) + _coeffDataJac::_coeffDataJac(const bezierCoeff *coeffs) + : _coeffData(), _coeffs(coeffs) { - if(!v.getOwnData()) { - Msg::Error("Cannot create an instance of _coefDataJac from a " - "fullVector that does not own its data."); - return; - } - // _coeffs reuses the data of v, this avoid to allocate a new array and to - // copy data that are not used outside of this object. - // It remains to swap ownership: - v.setOwnData(false); - const_cast<fullVector<double> &>(_coeffs).setOwnData(true); - - _minL = _maxL = v(0); - int i = 1; - for(; i < bfs->getNumLagCoeff(); i++) { - _minL = std::min(_minL, v(i)); - _maxL = std::max(_maxL, v(i)); + const bezierCoeff &coeff = (*_coeffs); + + _minL = _maxL = coeff.getCornerCoeff(0); + for(int i = 1; i < coeff.getNumCornerCoeff(); i++) { + _minL = std::min(_minL, coeff.getCornerCoeff(i)); + _maxL = std::max(_maxL, coeff.getCornerCoeff(i)); } - _minB = _minL; - _maxB = _maxL; - for(; i < v.size(); i++) { - _minB = std::min(_minB, v(i)); - _maxB = std::max(_maxB, v(i)); + _minB = _maxB = coeff(0); + for(int i = 1; i < coeff.getNumCoeff(); i++) { + _minB = std::min(_minB, coeff(i)); + _maxB = std::max(_maxB, coeff(i)); } } - bool _coefDataJac::boundsOk(double minL, double maxL) const + bool _coeffDataJac::boundsOk(double minL, double maxL) const { double tol = std::max(std::abs(minL), std::abs(maxL)) * 1e-3; - return (minL <= 0 || _minB > 0) && minL - _minB < tol && _maxB - maxL < tol; + return (minL <= 0 || _minB > 0) && (maxL >= 0 || _maxB < 0) && + minL - _minB < tol && _maxB - maxL < tol; + // NB: First condition implies minL and minB both positive or both negative } - void _coefDataJac::getSubCoeff(std::vector<_coefData *> &v) const + void _coeffDataJac::getSubCoeff(std::vector<_coeffData *> &v) const { + std::vector<bezierCoeff *> sub; + _coeffs->subdivide(sub); + v.clear(); - v.reserve(_bfs->getNumDivision()); - fullVector<double> subCoeff; - _bfs->subdivideBezCoeff(_coeffs, subCoeff); - - int sz = _coeffs.size(); - for(int i = 0; i < _bfs->getNumDivision(); i++) { - fullVector<double> coeff(sz); - coeff.copy(subCoeff, i * sz, sz, 0); - _coefDataJac *newData = new _coefDataJac(coeff, _bfs, _depth + 1); - v.push_back(newData); + for(std::size_t i = 0; i < sub.size(); i++) { + v.push_back(new _coeffDataJac(sub[i])); } } + void _coeffDataJac::deleteBezierCoeff() { delete _coeffs; } + // IGE measure (Inverse Gradient Error) - _coefDataIGE::_coefDataIGE(fullVector<double> &det, fullMatrix<double> &mat, - const bezierBasis *bfsDet, - const bezierBasis *bfsMat, int depth, int type) - : _coefData(depth), _coeffsJacDet(det.getDataPtr(), det.size()), - _coeffsJacMat(mat.getDataPtr(), mat.size1(), mat.size2()), - _bfsDet(bfsDet), _bfsMat(bfsMat), _type(type) + _coeffDataIGE::_coeffDataIGE(int type, const bezierCoeff *det, + const bezierCoeff *mat) + : _coeffData(), _coeffDet(det), _coeffMat(mat), _type(type) { - if(!det.getOwnData() || !mat.getOwnData()) { - Msg::Error("Cannot create an instance of _coefDataIGE from a " - "fullVector or a fullMatrix that does not own its data."); - return; - } - // _coeffsJacDet and _coeffsJacMat reuse data, this avoid to allocate new - // arrays and to copy data that are not used outside of this object. - // It remains to swap ownerships: - det.setOwnData(false); - mat.setOwnData(false); - const_cast<fullVector<double> &>(_coeffsJacDet).setOwnData(true); - const_cast<fullMatrix<double> &>(_coeffsJacMat).setOwnData(true); - _computeAtCorner(_minL, _maxL); _minB = 0; if(boundsOk(_minL, _maxL)) return; - else + else { _minB = _computeLowerBound(); + } // computation of _maxB not implemented for now } - bool _coefDataIGE::boundsOk(double minL, double maxL) const + bool _coeffDataIGE::boundsOk(double minL, double maxL) const { static const double tolmin = 1e-3; static const double tolmax = 1e-2; @@ -686,38 +555,35 @@ namespace jacobianBasedQuality { return minL - _minB < tol; } - void _coefDataIGE::getSubCoeff(std::vector<_coefData *> &v) const + void _coeffDataIGE::getSubCoeff(std::vector<_coeffData *> &v) const { + std::vector<bezierCoeff *> subD; + std::vector<bezierCoeff *> subM; + _coeffDet->subdivide(subD); + _coeffMat->subdivide(subM); + v.clear(); - v.reserve(_bfsDet->getNumDivision()); - fullVector<double> subCoeffD; - fullMatrix<double> subCoeffM; - _bfsDet->subdivideBezCoeff(_coeffsJacDet, subCoeffD); - _bfsMat->subdivideBezCoeff(_coeffsJacMat, subCoeffM); - - int szD = _coeffsJacDet.size(); - int szM1 = _coeffsJacMat.size1(); - int szM2 = _coeffsJacMat.size2(); - for(int i = 0; i < _bfsDet->getNumDivision(); i++) { - fullVector<double> coeffD(szD); - fullMatrix<double> coeffM(szM1, szM2); - coeffD.copy(subCoeffD, i * szD, szD, 0); - coeffM.copy(subCoeffM, i * szM1, szM1, 0, szM2, 0, 0); - _coefDataIGE *newData; - newData = - new _coefDataIGE(coeffD, coeffM, _bfsDet, _bfsMat, _depth + 1, _type); - v.push_back(newData); + for(std::size_t i = 0; i < subD.size(); i++) { + v.push_back(new _coeffDataIGE(_type, subD[i], subM[i])); } } - void _coefDataIGE::_computeAtCorner(double &min, double &max) const + void _coeffDataIGE::deleteBezierCoeff() { - fullMatrix<double> v; - _computeCoeffLengthVectors(_coeffsJacMat, v, _type, - _bfsDet->getNumLagCoeff()); + delete _coeffDet; + delete _coeffMat; + } - fullVector<double> ige; - computeIGE_(_coeffsJacDet, v, ige, _type); + void _coeffDataIGE::_computeAtCorner(double &min, double &max) const + { + fullVector<double> det, ige; + fullMatrix<double> mat; + _coeffDet->getCornerCoeffs(det); + _coeffMat->getCornerCoeffs(mat); + + fullMatrix<double> v; + _computeCoeffLengthVectors(mat, v, _type); + _computeIGE(det, v, ige, _type); min = std::numeric_limits<double>::infinity(); max = -min; @@ -727,54 +593,68 @@ namespace jacobianBasedQuality { } } - double _coefDataIGE::_computeLowerBound() const + double _coeffDataIGE::_computeLowerBound() const { - // Speedup: If one coeff _coeffsJacDet is negative, without bounding + fullVector<double> det; + fullMatrix<double> mat; + _coeffDet->setVectorAsProxy(det); + _coeffMat->setMatrixAsProxy(mat); + + // Speedup: If one coeff _coeffDet is negative, without bounding // J^2/(a^2+b^2), we would get with certainty a negative lower bound. - // For now, returning 0. - for(int i = 0; i < _coeffsJacDet.size(); ++i) { - if(_coeffsJacDet(i) < 0) { + // Returning 0. + for(int i = 0; i < det.size(); ++i) { + if(det(i) < 0) { return 0; } } fullMatrix<double> v; - _computeCoeffLengthVectors(_coeffsJacMat, v, _type); + _computeCoeffLengthVectors(mat, v, _type); fullVector<double> prox[6]; for(int i = 0; i < v.size2(); ++i) { prox[i].setAsProxy(v, i); } - bezierBasisRaiser *raiser = _bfsMat->getRaiser(); + const bezierBasisRaiser *raiser = _coeffMat->getBezierBasis()->getRaiser(); fullVector<double> coeffDenominator; double result = 0; switch(_type) { case TYPE_QUA: raiser->computeCoeff(prox[0], prox[1], coeffDenominator); - return _computeBoundRational(_coeffsJacDet, coeffDenominator, true); + return _computeBoundRational(det, coeffDenominator, true); case TYPE_TRI: raiser->computeCoeff(prox[0], prox[1], coeffDenominator); - result += _computeBoundRational(_coeffsJacDet, coeffDenominator, true); + result += _computeBoundRational(det, coeffDenominator, true); raiser->computeCoeff(prox[0], prox[2], coeffDenominator); - result += _computeBoundRational(_coeffsJacDet, coeffDenominator, true); + result += _computeBoundRational(det, coeffDenominator, true); raiser->computeCoeff(prox[1], prox[2], coeffDenominator); - result += _computeBoundRational(_coeffsJacDet, coeffDenominator, true); + result += _computeBoundRational(det, coeffDenominator, true); + // The bound is not sharp, which can lead to a lot of subdivision. This + // can be avoided by bounding the total function instead of bounding each + // rational function and summing the three bounds. This is done for + // TYPE_TET and TYPE_PYR. In order to do that for triangles, it is + // needed to implement raising bezier coefficient from different spaces. + // If computation of sharp bounds is implemented, change also function + // _getMinAndDeleteDomains(..) so that it returns minB instead of some + // combination of minB and minL. return cTri * result / 3; case TYPE_HEX: raiser->computeCoeff(prox[0], prox[1], prox[2], coeffDenominator); - return _computeBoundRational(_coeffsJacDet, coeffDenominator, true); + return _computeBoundRational(det, coeffDenominator, true); case TYPE_PRI: raiser->computeCoeff(prox[0], prox[1], prox[2], coeffDenominator); - result += _computeBoundRational(_coeffsJacDet, coeffDenominator, true); + result += _computeBoundRational(det, coeffDenominator, true); raiser->computeCoeff(prox[0], prox[3], prox[2], coeffDenominator); - result += _computeBoundRational(_coeffsJacDet, coeffDenominator, true); + result += _computeBoundRational(det, coeffDenominator, true); raiser->computeCoeff(prox[1], prox[3], prox[2], coeffDenominator); - result += _computeBoundRational(_coeffsJacDet, coeffDenominator, true); + result += _computeBoundRational(det, coeffDenominator, true); + // Same comment than for TYPE_TRI. return cTri * result / 3; case TYPE_TET: { @@ -802,8 +682,9 @@ namespace jacobianBasedQuality { raiser->computeCoeff(prox[3], prox[4], prox[5], coeffDen2); fullVector<double> &coeffNumerator = tmp; - bezierBasisRaiser *raiserBis = _bfsDet->getRaiser(); - raiserBis->computeCoeff(coeffNum1, _coeffsJacDet, coeffNumerator); + const bezierBasisRaiser *raiserBis = + _coeffDet->getBezierBasis()->getRaiser(); + raiserBis->computeCoeff(coeffNum1, det, coeffNumerator); raiserBis->computeCoeff(coeffDen1, coeffDen2, coeffDenominator); result = _computeBoundRational(coeffNumerator, coeffDenominator, true); @@ -831,8 +712,9 @@ namespace jacobianBasedQuality { raiser->computeCoeff(prox[3], prox[4], prox[5], coeffDen2); fullVector<double> &coeffNumerator = tmp; - bezierBasisRaiser *raiserBis = _bfsDet->getRaiser(); - raiserBis->computeCoeff(coeffNum1, _coeffsJacDet, coeffNumerator); + const bezierBasisRaiser *raiserBis = + _coeffDet->getBezierBasis()->getRaiser(); + raiserBis->computeCoeff(coeffNum1, det, coeffNumerator); raiserBis->computeCoeff(coeffDen1, coeffDen2, coeffDenominator); result = _computeBoundRational(coeffNumerator, coeffDenominator, true); @@ -844,37 +726,22 @@ namespace jacobianBasedQuality { } // ICN measure (Inverse Condition Number) - _coefDataICN::_coefDataICN(fullVector<double> &det, fullMatrix<double> &mat, - const bezierBasis *bfsDet, - const bezierBasis *bfsMat, int depth) - : _coefData(depth), _coeffsJacDet(det.getDataPtr(), det.size()), - _coeffsJacMat(mat.getDataPtr(), mat.size1(), mat.size2()), - _bfsDet(bfsDet), _bfsMat(bfsMat) + _coeffDataICN::_coeffDataICN(int dim, const bezierCoeff *det, + const bezierCoeff *mat) + : _coeffData(), _coeffDet(det), _coeffMat(mat), _dim(dim) { - if(!det.getOwnData() || !mat.getOwnData()) { - Msg::Error("Cannot create an instance of _coefDataIGE from a " - "fullVector or a fullMatrix that does not own its data."); - return; - } - // _coeffsJacDet and _coeffsMetric reuse data, this avoid to allocate new - // arrays and to copy data that are not used outside of this object. - // It remains to swap ownerships: - det.setOwnData(false); - mat.setOwnData(false); - const_cast<fullVector<double> &>(_coeffsJacDet).setOwnData(true); - const_cast<fullMatrix<double> &>(_coeffsJacMat).setOwnData(true); - _computeAtCorner(_minL, _maxL); _minB = 0; if(boundsOk(_minL, _maxL)) return; - else + else { _minB = _computeLowerBound(); + } // _maxB not used for now } - bool _coefDataICN::boundsOk(double minL, double maxL) const + bool _coeffDataICN::boundsOk(double minL, double maxL) const { static const double tolmin = 1e-3; static const double tolmax = 1e-2; @@ -882,111 +749,109 @@ namespace jacobianBasedQuality { return minL - _minB < tol; } - void _coefDataICN::getSubCoeff(std::vector<_coefData *> &v) const + void _coeffDataICN::getSubCoeff(std::vector<_coeffData *> &v) const { + std::vector<bezierCoeff *> subD; + std::vector<bezierCoeff *> subM; + _coeffDet->subdivide(subD); + _coeffMat->subdivide(subM); + v.clear(); - v.reserve(_bfsMat->getNumDivision()); - fullMatrix<double> subCoeffM; - fullVector<double> subCoeffD; - _bfsMat->subdivideBezCoeff(_coeffsJacMat, subCoeffM); - _bfsDet->subdivideBezCoeff(_coeffsJacDet, subCoeffD); - - int szD = _coeffsJacDet.size(); - int szM1 = _coeffsJacMat.size1(); - int szM2 = _coeffsJacMat.size2(); - for(int i = 0; i < _bfsMat->getNumDivision(); i++) { - fullVector<double> coeffD(szD); - fullMatrix<double> coeffM(szM1, szM2); - coeffD.copy(subCoeffD, i * szD, szD, 0); - coeffM.copy(subCoeffM, i * szM1, szM1, 0, szM2, 0, 0); - _coefDataICN *newData = - new _coefDataICN(coeffD, coeffM, _bfsDet, _bfsMat, _depth + 1); - v.push_back(newData); + for(std::size_t i = 0; i < subD.size(); i++) { + v.push_back(new _coeffDataICN(_dim, subD[i], subM[i])); } } - void _coefDataICN::_computeAtCorner(double &min, double &max) const + void _coeffDataICN::deleteBezierCoeff() { + delete _coeffDet; + delete _coeffMat; + } + + void _coeffDataICN::_computeAtCorner(double &min, double &max) const + { + fullVector<double> det, icn; + fullMatrix<double> mat; + _coeffDet->getCornerCoeffs(det); + _coeffMat->getCornerCoeffs(mat); + _computeICN(det, mat, icn, _dim); + min = std::numeric_limits<double>::infinity(); max = -min; - for(int i = 0; i < _bfsMat->getNumLagCoeff(); i++) { - double p = 0; - for(int k = 0; k < _coeffsJacMat.size2(); ++k) { - p += pow_int(_coeffsJacMat(i, k), 2); - } - double qual; - if(_coeffsJacMat.size2() == 6) // if 2D - qual = 2 * _coeffsJacDet(i) / p; - else // 3D - qual = 3 * std::pow(_coeffsJacDet(i), 2 / 3.) / p; - min = std::min(min, qual); - max = std::max(max, qual); + for(int i = 0; i < icn.size(); i++) { + min = std::min(min, icn(i)); + max = std::max(max, icn(i)); } } - double _coefDataICN::_computeLowerBound() const + double _coeffDataICN::_computeLowerBound() const { - // Speedup: If one coeff _coeffsJacDet is negative, we would get + fullVector<double> det; + fullMatrix<double> mat; + _coeffDet->setVectorAsProxy(det); + _coeffMat->setMatrixAsProxy(mat); + + // Speedup: If one coeff _coeffDet is negative, we would get // a negative lower bound. For now, returning 0. - for(int i = 0; i < _coeffsJacDet.size(); ++i) { - if(_coeffsJacDet(i) < 0) { + for(int i = 0; i < det.size(); ++i) { + if(det(i) < 0) { return 0; } } - // 2D element - if(_coeffsJacMat.size2() == 6) { + const bezierBasisRaiser *raiser = _coeffMat->getBezierBasis()->getRaiser(); + if(_dim == 2) { fullVector<double> coeffDenominator; { - bezierBasisRaiser *raiser = _bfsMat->getRaiser(); fullVector<double> prox; - for(int k = 0; k < _coeffsJacMat.size2(); ++k) { - prox.setAsProxy(_coeffsJacMat, k); + for(int k = 0; k < mat.size2(); ++k) { + prox.setAsProxy(mat, k); fullVector<double> tmp; raiser->computeCoeff(prox, prox, tmp); if(k == 0) coeffDenominator.resize(tmp.size()); coeffDenominator.axpy(tmp, 1); } } - return 2 * _computeBoundRational(_coeffsJacDet, coeffDenominator, true); + return 2 * _computeBoundRational(det, coeffDenominator, true); } - // 3D element NEW + // 3D element fullVector<double> coeffDenominator; { // P: coefficients of function that bound from above the Frobenius norm of - // J element of P are automatically set to 0 - fullVector<double> P(_coeffsJacMat.size1()); - for(int i = 0; i < _coeffsJacMat.size1(); ++i) { - for(int k = 0; k < _coeffsJacMat.size2(); ++k) { - P(i) += _coeffsJacMat(i, k) * _coeffsJacMat(i, k); + // J (elements of P are automatically set to 0) + fullVector<double> P(mat.size1()); + for(int i = 0; i < mat.size1(); ++i) { + for(int k = 0; k < mat.size2(); ++k) { + P(i) += mat(i, k) * mat(i, k); } P(i) = std::sqrt(P(i)); } - _bfsMat->getRaiser()->computeCoeff(P, P, P, coeffDenominator); + raiser->computeCoeff(P, P, P, coeffDenominator); } const double boundFraction = - _computeBoundRational(_coeffsJacDet, coeffDenominator, true); + _computeBoundRational(det, coeffDenominator, true); return 3 * std::pow(boundFraction * boundFraction, 1. / 3); } // Miscellaneous template <typename Comp> - void _subdivideDomainsMinOrMax(std::vector<_coefData *> &domains, - double &minL, double &maxL) + void _subdivideDomainsMinOrMax(std::vector<_coeffData *> &domains, + double &minL, double &maxL, bool debug) { - std::vector<_coefData *> subs; + std::vector<_coeffData *> subs; make_heap(domains.begin(), domains.end(), Comp()); int k = 0; const int max_subdivision = 1000; - while(!domains[0]->boundsOk(minL, maxL) && k++ < max_subdivision) { - _coefData *cd = domains[0]; + while(!domains[0]->boundsOk(minL, maxL) && k + 1 < max_subdivision) { + _coeffData *cd = domains[0]; pop_heap(domains.begin(), domains.end(), Comp()); domains.pop_back(); cd->getSubCoeff(subs); + cd->deleteBezierCoeff(); delete cd; for(std::size_t i = 0; i < subs.size(); i++) { @@ -995,14 +860,19 @@ namespace jacobianBasedQuality { domains.push_back(subs[i]); push_heap(domains.begin(), domains.end(), Comp()); } + ++k; } - if(k > max_subdivision) { - Msg::Error("Max subdivision (%d) (size %d)", max_subdivision, + if(debug) { + std::cout << "Number of subdivisions: " << k << std::endl; + } + else if(k == max_subdivision) { + Msg::Error("Max subdivision (%d) (size domains %d)", max_subdivision, domains.size()); } } - void _subdivideDomains(std::vector<_coefData *> &domains) + void _subdivideDomains(std::vector<_coeffData *> &domains, bool alsoMax, + bool debug) { if(domains.empty()) { Msg::Warning("empty vector in Bezier subdivision, nothing to do"); @@ -1015,21 +885,32 @@ namespace jacobianBasedQuality { maxL = std::max(maxL, domains[i]->maxL()); } - _subdivideDomainsMinOrMax<_lessMinB>(domains, minL, maxL); - _subdivideDomainsMinOrMax<_lessMaxB>(domains, minL, maxL); + _subdivideDomainsMinOrMax<_lessMinB>(domains, minL, maxL, debug); + if(alsoMax) + _subdivideDomainsMinOrMax<_lessMaxB>(domains, minL, maxL, debug); } - double _getMinAndDeleteDomains(std::vector<_coefData *> &domains) + double _getMinAndDeleteDomains(std::vector<_coeffData *> &domains) { double minB = domains[0]->minB(); double minL = domains[0]->minL(); + domains[0]->deleteBezierCoeff(); delete domains[0]; for(std::size_t i = 1; i < domains.size(); ++i) { minB = std::min(minB, domains[i]->minB()); minL = std::min(minL, domains[i]->minL()); + domains[i]->deleteBezierCoeff(); delete domains[i]; } double fact = .5 * (minB + minL); + // This is done because, for triangles and prisms, currently, the + // computation of bounds is not sharp. It can happen than the IGE measure + // is very close to 1 everywhere but that the bound is close to 1 only + // after a huge amount of subdivision. In this case, it is better to + // return minL instead of minB. The best solution would be to implement + // sharp bounds for triangles and prisms, see function + // _coeffDataIGE::_computeLowerBound(..). If it is done, change this to + // return minB. return fact * minL + (1 - fact) * minB; } @@ -1089,4 +970,69 @@ namespace jacobianBasedQuality { } } + void testAllMeasuresAllElements() + { + GModel *m = GModel::current(); + std::set<GEntity *, GEntityLessThan> entities; + for(GModel::riter it = m->firstRegion(); it != m->lastRegion(); it++) + entities.insert(*it); + for(GModel::fiter it = m->firstFace(); it != m->lastFace(); it++) + entities.insert(*it); + for(GModel::eiter it = m->firstEdge(); it != m->lastEdge(); it++) + entities.insert(*it); + + std::set<GEntity *, GEntityLessThan>::iterator it; + for(it = entities.begin(); it != entities.end(); ++it) { + unsigned num = (*it)->getNumMeshElements(); + for(unsigned i = 0; i < num; ++i) { + MElement *el = (*it)->getMeshElement(i); + testAllMeasures(el); + } + } + } + + void testAllMeasures(MElement *el, const fullMatrix<double> *normals) + { + static int orderSampling = 50; + static double tol = 1e-5; + double minSampled, maxSampled, minAlgo, maxAlgo; + std::cout << std::endl; + std::cout << "Element #" << el->getNum() << " (type: " << el->getType(); + std::cout << ", " << el->getTypeForMSH() << ")" << std::endl; + + sampleJacobianDeterminant(el, orderSampling, minSampled, maxSampled, + normals); + minMaxJacobianDeterminant(el, minAlgo, maxAlgo, normals, true); + std::cout << "JAC sampled: " << minSampled << " " << maxSampled; + std::cout << " v.s. computed: " << minAlgo << " " << maxAlgo << std::endl; + if(minSampled < minAlgo * (1 - tol) || maxSampled > maxAlgo * (1 + tol)) { + std::cout << "ERROR sampled measure outside the bounds" << std::endl; + return; + } + + if(minAlgo <= 0 && maxAlgo >= 0) { + std::cout << "GOOD (Invalid)" << std::endl; + return; + } + + sampleIGEMeasure(el, orderSampling, minSampled, maxSampled); + minAlgo = minIGEMeasure(el, true, true, normals, true); + std::cout << "IGE sampled: " << minSampled << " " << maxSampled; + std::cout << " v.s. computed: " << minAlgo << " -" << std::endl; + if(minSampled < minAlgo * (1 - tol)) { + std::cout << "ERROR sampled measure smaller than the bound" << std::endl; + return; + } + + sampleICNMeasure(el, orderSampling, minSampled, maxSampled); + minAlgo = minICNMeasure(el, true, true, normals, true); + std::cout << "ICN sampled: " << minSampled << " " << maxSampled; + std::cout << " v.s. computed: " << minAlgo << " -" << std::endl; + if(minSampled < minAlgo * (1 - tol)) { + std::cout << "ERROR sampled measure smaller than the bound" << std::endl; + return; + } + std::cout << "GOOD" << std::endl; + } + } // end namespace jacobianBasedQuality diff --git a/Mesh/qualityMeasuresJacobian.h b/Mesh/qualityMeasuresJacobian.h index 54a2b3c6ac01a694c1c811d9e07e22fa264e6a5f..760974835f5fc2c881f8c96a8daa9350b606257f 100644 --- a/Mesh/qualityMeasuresJacobian.h +++ b/Mesh/qualityMeasuresJacobian.h @@ -9,110 +9,108 @@ #include <vector> #include "fullMatrix.h" -class GradientBasis; -class bezierBasis; +class bezierCoeff; class MElement; namespace jacobianBasedQuality { void minMaxJacobianDeterminant(MElement *el, double &min, double &max, - const fullMatrix<double> *normals = NULL); + const fullMatrix<double> *normals = NULL, + bool debug = false); double minIGEMeasure(MElement *el, bool knownValid = false, bool reversedOk = false, - const fullMatrix<double> *normals = NULL); + const fullMatrix<double> *normals = NULL, + bool debug = false); double minICNMeasure(MElement *el, bool knownValid = false, bool reversedOk = false, - const fullMatrix<double> *normals = NULL); + const fullMatrix<double> *normals = NULL, + bool debug = false); + void sampleJacobianDeterminant(MElement *el, int order, double &min, + double &max, + const fullMatrix<double> *normals = NULL); void sampleIGEMeasure(MElement *el, int order, double &min, double &max); - void sampleJacobian(MElement *el, int order, fullVector<double> &jac, - const fullMatrix<double> *normals = NULL); + void sampleICNMeasure(MElement *el, int order, double &min, double &max); + void sampleJacobianDeterminant(MElement *el, int order, + fullVector<double> &jac, + const fullMatrix<double> *normals = NULL); void sampleIGEMeasure(MElement *el, int order, fullVector<double> &ige); void sampleICNMeasure(MElement *el, int order, fullVector<double> &icn); - double minSampledICNMeasure(MElement *el, int order); // fordebug - double minSampledIGEMeasure(MElement *el, int order); // fordebug - class _coefData { + // For regression tests: + void testAllMeasuresAllElements(); + void testAllMeasures(MElement *el, const fullMatrix<double> *normals = NULL); + + class _coeffData { protected: - double _minL, _maxL; // Extremum of Jac at corners - double _minB, _maxB; // Extremum of bezier coefficients - const int _depth; + double _minL, _maxL; // Extremum of measure at corners + double _minB, _maxB; // Extremum of measure public: - _coefData(int depth) - : _minL(0), _maxL(0), _minB(0), _maxB(0), _depth(depth) - { - } - virtual ~_coefData() {} + _coeffData() : _minL(0), _maxL(0), _minB(0), _maxB(0) {} + virtual ~_coeffData() {} inline double minL() const { return _minL; } inline double maxL() const { return _maxL; } inline double minB() const { return _minB; } inline double maxB() const { return _maxB; } - inline int depth() const { return _depth; } virtual bool boundsOk(double minL, double maxL) const = 0; - virtual void getSubCoeff(std::vector<_coefData *> &) const = 0; - virtual int getNumMeasure() const { return 0; } // fordebug + virtual void getSubCoeff(std::vector<_coeffData *> &) const = 0; + virtual void deleteBezierCoeff() = 0; }; struct _lessMinB { - bool operator()(_coefData *, _coefData *) const; + bool operator()(_coeffData *, _coeffData *) const; }; struct _lessMaxB { - bool operator()(_coefData *, _coefData *) const; + bool operator()(_coeffData *, _coeffData *) const; }; - class _coefDataJac : public _coefData { + class _coeffDataJac : public _coeffData { private: - const fullVector<double> _coeffs; - const bezierBasis *_bfs; + const bezierCoeff *_coeffs; public: - _coefDataJac(fullVector<double> &v, const bezierBasis *bfs, int depth); - ~_coefDataJac() {} + _coeffDataJac(const bezierCoeff *coeffs); + ~_coeffDataJac() {} bool boundsOk(double minL, double maxL) const; - void getSubCoeff(std::vector<_coefData *> &) const; - int getNumMeasure() const { return 1; } // fordebug + void getSubCoeff(std::vector<_coeffData *> &) const; + void deleteBezierCoeff(); }; - class _coefDataIGE : public _coefData { + class _coeffDataIGE : public _coeffData { private: - const fullVector<double> _coeffsJacDet; - const fullMatrix<double> _coeffsJacMat; - const bezierBasis *_bfsDet, *_bfsMat; + const bezierCoeff *_coeffDet; + const bezierCoeff *_coeffMat; const int _type; public: - _coefDataIGE(fullVector<double> &det, fullMatrix<double> &mat, - const bezierBasis *bfsDet, const bezierBasis *bfsMat, - int depth, int type); - ~_coefDataIGE() {} + _coeffDataIGE(int type, const bezierCoeff *det, const bezierCoeff *mat); + ~_coeffDataIGE() {} bool boundsOk(double minL, double maxL) const; - void getSubCoeff(std::vector<_coefData *> &) const; - int getNumMeasure() const { return 2; } // fordebug + void getSubCoeff(std::vector<_coeffData *> &) const; + void deleteBezierCoeff(); private: void _computeAtCorner(double &min, double &max) const; double _computeLowerBound() const; }; - class _coefDataICN : public _coefData { + class _coeffDataICN : public _coeffData { private: - const fullVector<double> _coeffsJacDet; - const fullMatrix<double> _coeffsJacMat; - const bezierBasis *_bfsDet, *_bfsMat; + const bezierCoeff *_coeffDet; + const bezierCoeff *_coeffMat; + const int _dim; public: - _coefDataICN(fullVector<double> &det, fullMatrix<double> &metric, - const bezierBasis *bfsDet, const bezierBasis *bfsMet, - int depth); - ~_coefDataICN() {} + _coeffDataICN(int dim, const bezierCoeff *det, const bezierCoeff *mat); + ~_coeffDataICN() {} bool boundsOk(double minL, double maxL) const; - void getSubCoeff(std::vector<_coefData *> &) const; - int getNumMeasure() const { return 4; } // fordebug + void getSubCoeff(std::vector<_coeffData *> &) const; + void deleteBezierCoeff(); private: void _computeAtCorner(double &min, double &max) const; @@ -123,8 +121,9 @@ namespace jacobianBasedQuality { const fullVector<double> &denominator, bool lower, bool positiveDenom = true); - void _subdivideDomains(std::vector<_coefData *> &domains); - double _getMinAndDeleteDomains(std::vector<_coefData *> &domains); + void _subdivideDomains(std::vector<_coeffData *> &domains, + bool alsoMax = true, bool debug = false); + double _getMinAndDeleteDomains(std::vector<_coeffData *> &domains); } // namespace jacobianBasedQuality diff --git a/Mesh/tetgenBR.cxx b/Mesh/tetgenBR.cxx index fb69ffcee19ab19a8eed1fbc5769a85008e4e211..3e462d0791da3c113275e29896edf22c1e16c4ed 100644 --- a/Mesh/tetgenBR.cxx +++ b/Mesh/tetgenBR.cxx @@ -209,7 +209,7 @@ bool tetgenbehavior::parse_commandline(int argc, char **argv) k++; } workstring[k] = '\0'; - brio_threshold = (int) strtol(workstring, (char **) &workstring, 0); + brio_threshold = (int) strtol(workstring, (char **) NULL, 0); } if ((argv[i][j + 1] == '/') || (argv[i][j + 1] == ',')) { j++; @@ -238,7 +238,7 @@ bool tetgenbehavior::parse_commandline(int argc, char **argv) k++; } workstring[k] = '\0'; - hilbert_limit = (int) strtol(workstring, (char **) &workstring, 0); + hilbert_limit = (int) strtol(workstring, (char **) NULL, 0); } } if ((argv[i][j + 1] == '/') || (argv[i][j + 1] == ',')) { diff --git a/Numeric/BasisFactory.cpp b/Numeric/BasisFactory.cpp index da23d78c72b5eb0d629ea43d27a4840e1923b755..e706c20bf0bade1d5a57497c29a04b55f4888035 100644 --- a/Numeric/BasisFactory.cpp +++ b/Numeric/BasisFactory.cpp @@ -65,14 +65,14 @@ const nodalBasis *BasisFactory::getNodalBasis(int tag) return inserted.first->second; } -const JacobianBasis *BasisFactory::getJacobianBasis(FuncSpaceData fsd) +const JacobianBasis *BasisFactory::getJacobianBasis(int tag, FuncSpaceData fsd) { FuncSpaceData data = fsd.getForNonSerendipitySpace(); std::map<FuncSpaceData, JacobianBasis *>::const_iterator it = js.find(data); if(it != js.end()) return it->second; - JacobianBasis *J = new JacobianBasis(data); + JacobianBasis *J = new JacobianBasis(tag, data); js.insert(std::make_pair(data, J)); return J; } @@ -81,9 +81,10 @@ const JacobianBasis *BasisFactory::getJacobianBasis(int tag, int order) { const int type = ElementType::getParentType(tag); if(type != TYPE_PYR) - return getJacobianBasis(FuncSpaceData(true, tag, order)); + return getJacobianBasis(tag, FuncSpaceData(type, order, false)); else - return getJacobianBasis(FuncSpaceData(true, tag, false, order + 1, order)); + return getJacobianBasis( + tag, FuncSpaceData(type, false, order + 1, order, false)); } const JacobianBasis *BasisFactory::getJacobianBasis(int tag) @@ -91,10 +92,10 @@ const JacobianBasis *BasisFactory::getJacobianBasis(int tag) const int jacOrder = JacobianBasis::jacobianOrder(tag); const int type = ElementType::getParentType(tag); if(type != TYPE_PYR) - return getJacobianBasis(FuncSpaceData(true, tag, jacOrder)); + return getJacobianBasis(tag, FuncSpaceData(type, jacOrder, false)); else return getJacobianBasis( - FuncSpaceData(true, tag, false, jacOrder + 2, jacOrder)); + tag, FuncSpaceData(type, false, jacOrder + 2, jacOrder, false)); } const CondNumBasis *BasisFactory::getCondNumBasis(int tag, int cnOrder) @@ -107,29 +108,32 @@ const CondNumBasis *BasisFactory::getCondNumBasis(int tag, int cnOrder) return M; } -const GradientBasis *BasisFactory::getGradientBasis(FuncSpaceData data) +const GradientBasis *BasisFactory::getGradientBasis(int tag, FuncSpaceData fsd) { + FuncSpaceData data = fsd.getForNonSerendipitySpace(); + std::map<FuncSpaceData, GradientBasis *>::const_iterator it = gs.find(data); if(it != gs.end()) return it->second; - GradientBasis *G = new GradientBasis(data); + GradientBasis *G = new GradientBasis(tag, data); gs.insert(std::make_pair(data, G)); return G; } const GradientBasis *BasisFactory::getGradientBasis(int tag, int order) { - return getGradientBasis(FuncSpaceData(true, tag, order)); + const int type = ElementType::getParentType(tag); + return getGradientBasis(tag, FuncSpaceData(type, order, false)); } const GradientBasis *BasisFactory::getGradientBasis(int tag) { - return getGradientBasis(FuncSpaceData(tag)); + return getGradientBasis(tag, FuncSpaceData(tag)); } const bezierBasis *BasisFactory::getBezierBasis(FuncSpaceData fsd) { - FuncSpaceData data = fsd.getForPrimaryElement(); + FuncSpaceData data = fsd.getForNonSerendipitySpace(); std::map<FuncSpaceData, bezierBasis *>::const_iterator it = bs.find(data); if(it != bs.end()) return it->second; @@ -139,10 +143,9 @@ const bezierBasis *BasisFactory::getBezierBasis(FuncSpaceData fsd) return B; } -const bezierBasis *BasisFactory::getBezierBasis(int parentTag, int order) +const bezierBasis *BasisFactory::getBezierBasis(int parentType, int order) { - int primaryTag = ElementType::getType(parentTag, 1); - return getBezierBasis(FuncSpaceData(true, primaryTag, order)); + return getBezierBasis(FuncSpaceData(parentType, order, false)); } const bezierBasis *BasisFactory::getBezierBasis(int tag) diff --git a/Numeric/BasisFactory.h b/Numeric/BasisFactory.h index 54bf692a847e14ccf39b4e8ce8340ed6f90bd4f3..7a7d8018933b0f129f5b6e392e76e0c50eeb3e63 100644 --- a/Numeric/BasisFactory.h +++ b/Numeric/BasisFactory.h @@ -31,7 +31,7 @@ public: // Jacobian // Warning: bases returned by BasisFactory::getJacobianBasis(int tag) are the // only safe bases for using Bezier on the jacobian determinant! - static const JacobianBasis *getJacobianBasis(FuncSpaceData); + static const JacobianBasis *getJacobianBasis(int tag, FuncSpaceData); static const JacobianBasis *getJacobianBasis(int tag, int order); static const JacobianBasis *getJacobianBasis(int tag); @@ -39,13 +39,13 @@ public: static const CondNumBasis *getCondNumBasis(int tag, int cnOrder = -1); // Gradients - static const GradientBasis *getGradientBasis(FuncSpaceData); + static const GradientBasis *getGradientBasis(int tag, FuncSpaceData); static const GradientBasis *getGradientBasis(int tag, int order); static const GradientBasis *getGradientBasis(int tag); // Bezier static const bezierBasis *getBezierBasis(FuncSpaceData); - static const bezierBasis *getBezierBasis(int parentTag, int order); + static const bezierBasis *getBezierBasis(int parentType, int order); static const bezierBasis *getBezierBasis(int tag); static void clearAll(); diff --git a/Numeric/CMakeLists.txt b/Numeric/CMakeLists.txt index a2908ec346524bad483a938cca3d67bcc34a09ee..e44971763bea82ee6df7656fdb66ad2c1e39bed5 100644 --- a/Numeric/CMakeLists.txt +++ b/Numeric/CMakeLists.txt @@ -39,6 +39,19 @@ set(SRC Iso.cpp approximationError.cpp ConjugateGradients.cpp + OrthogonalPoly.cpp + HierarchicalBasisH1.cpp + HierarchicalBasisH1Quad.cpp + HierarchicalBasisH1Tria.cpp + HierarchicalBasisH1Line.cpp + HierarchicalBasisH1Brick.cpp + HierarchicalBasisH1Tetra.cpp + HierarchicalBasisH1Pri.cpp + HierarchicalBasis.cpp + HierarchicalBasisHcurl.cpp + HierarchicalBasisHcurlQuad.cpp + HierarchicalBasisHcurlBrick.cpp + ) file(GLOB HDR RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.h) diff --git a/Numeric/CondNumBasis.cpp b/Numeric/CondNumBasis.cpp index bb911910e50c85a37edece1fc3a8765a423bea89..251c889da65174e55a56500ec6556dcbc594fcaf 100644 --- a/Numeric/CondNumBasis.cpp +++ b/Numeric/CondNumBasis.cpp @@ -350,12 +350,12 @@ CondNumBasis::CondNumBasis(int tag, int cnOrder) _nPrimMapNodes = 4; return; } - const bool serendip = false; + const int parentType = ElementType::getParentType(tag); FuncSpaceData data = - (ElementType::getParentType(tag) == TYPE_PYR) ? - FuncSpaceData(true, tag, true, 1, _condNumOrder - 1, &serendip) : - FuncSpaceData(true, tag, _condNumOrder, &serendip); + parentType == TYPE_PYR ? + FuncSpaceData(parentType, true, 1, _condNumOrder - 1, false) : + FuncSpaceData(parentType, _condNumOrder, false); fullMatrix<double> lagPoints; // Sampling points gmshGeneratePoints(data, lagPoints); @@ -363,11 +363,10 @@ CondNumBasis::CondNumBasis(int tag, int cnOrder) _nMapNodes = BasisFactory::getNodalBasis(tag)->getNumShapeFunctions(); // Store shape function gradients of mapping at condition number nodes - _gradBasis = BasisFactory::getGradientBasis(data); + _gradBasis = BasisFactory::getGradientBasis(tag, data); // Compute shape function gradients of primary mapping at barycenter, // in order to compute normal to straight element - const int parentType = ElementType::getParentType(tag); const int primMapType = ElementType::getType(parentType, 1, false); const nodalBasis *primMapBasis = BasisFactory::getNodalBasis(primMapType); _nPrimMapNodes = primMapBasis->getNumShapeFunctions(); diff --git a/Numeric/ElementType.cpp b/Numeric/ElementType.cpp index e2357390c109f90b38a5ab7ee298c5de2923080a..0569241a80c1c911f3d71606c1a198df05426715 100644 --- a/Numeric/ElementType.cpp +++ b/Numeric/ElementType.cpp @@ -888,23 +888,22 @@ int ElementType::getPrimaryType(int mshtype) return getType(getParentType(mshtype), 1); } -std::string ElementType::nameOfParentType(int parentType) +std::string ElementType::nameOfParentType(int parentType, bool plural) { switch(parentType) { - case TYPE_PNT: return std::string("point"); break; - case TYPE_LIN: return std::string("line"); break; - case TYPE_TRI: return std::string("triangle"); break; - case TYPE_QUA: return std::string("quadrangle"); break; - case TYPE_TET: return std::string("tetrahedron"); break; - case TYPE_PYR: return std::string("pyramid"); break; - case TYPE_PRI: return std::string("prism"); break; - case TYPE_HEX: return std::string("hexahedron"); break; - case TYPE_POLYG: return std::string("polygon"); break; - case TYPE_POLYH: return std::string("polyhedron"); break; - case TYPE_XFEM: return std::string("xfem"); break; - case TYPE_MINI: return std::string("mini"); break; - case TYPE_TRIH: return std::string("trihedron"); break; + case TYPE_PNT: return plural ? "points" : "point"; + case TYPE_LIN: return plural ? "lines" : "line"; + case TYPE_TRI: return plural ? "triangles" : "triangle"; + case TYPE_QUA: return plural ? "quadrangles" : "quadrangle"; + case TYPE_TET: return plural ? "tetrahedra" : "tetrahedron"; + case TYPE_PYR: return plural ? "pyramids" : "pyramid"; + case TYPE_PRI: return plural ? "prisms" : "prism"; + case TYPE_HEX: return plural ? "hexahedra" : "hexahedron"; + case TYPE_POLYG: return plural ? "polygons" : "polygon"; + case TYPE_POLYH: return plural ? "polyhedra" : "polyhedron"; + case TYPE_XFEM: return "xfem"; + case TYPE_MINI: return "mini"; + case TYPE_TRIH: return plural ? "trihedra" : "trihedron"; + default: return "undefined"; } - - return std::string("undefined"); } diff --git a/Numeric/ElementType.h b/Numeric/ElementType.h index f7f86c299046d5bae449c904b5e7f029bf0e00f4..c90023ddeebf044177c7c53711bd1aa263c6ebc4 100644 --- a/Numeric/ElementType.h +++ b/Numeric/ElementType.h @@ -14,20 +14,20 @@ namespace ElementType { int getOrder(int type); int getDimension(int type); - // Give the number of node corresponding to a msh type 'tag'. + // Give the number of node corresponding to any element MSH type. int getNumVertices(int type); - // Gives > 0 if element tag is in Serendipity Family. - // Gives < 2 if element tag is in 'Normal' Family. - // 1 is for element that is either Serendipity or not ! + // Gives > 0 if element MSH type is in Serendipity Family. + // Gives < 2 if element MSH type is in 'Normal' Family. + // 1 is for element MSH type that is either Serendipity or not ! int getSerendipity(int type); - // Give element tag from type, order & serendip + // Give element MSH type from parent type, order & serendip int getType(int parentType, int order, bool serendip = false); // Give first order element tag int getPrimaryType(int type); - std::string nameOfParentType(int type); + std::string nameOfParentType(int type, bool plural = false); } // namespace ElementType #endif diff --git a/Numeric/FuncSpaceData.cpp b/Numeric/FuncSpaceData.cpp index 509be0ec2bb36bf0411bc3099cff7d025601f3ec..c35e427bd44da113cbc7f6e70d88829a45cbf468 100644 --- a/Numeric/FuncSpaceData.cpp +++ b/Numeric/FuncSpaceData.cpp @@ -6,79 +6,63 @@ #include "FuncSpaceData.h" #include "MElement.h" -FuncSpaceData::FuncSpaceData(const FuncSpaceData &fsd, int order, - const bool *serendip) - : _tag(fsd._tag), _spaceOrder(order), - _serendipity(serendip ? *serendip : fsd._serendipity), _nij(0), - _nk(_spaceOrder), _pyramidalSpace(fsd._pyramidalSpace) +FuncSpaceData::FuncSpaceData(const FuncSpaceData &fsd, int order) + : _parentType(fsd._parentType), _spaceOrder(order), + _serendipity(fsd._serendipity), _nij(0), _nk(_spaceOrder), + _pyramidalSpace(fsd._pyramidalSpace) { } -FuncSpaceData::FuncSpaceData(const FuncSpaceData &fsd, int nij, int nk, - const bool *serendip) - : _tag(fsd._tag), +FuncSpaceData::FuncSpaceData(const FuncSpaceData &fsd, int nij, int nk) + : _parentType(fsd._parentType), _spaceOrder(fsd._pyramidalSpace ? nij + nk : std::max(nij, nk)), - _serendipity(serendip ? *serendip : fsd._serendipity), _nij(nij), _nk(nk), + _serendipity(fsd._serendipity), _nij(nij), _nk(nk), _pyramidalSpace(fsd._pyramidalSpace) { } -FuncSpaceData::FuncSpaceData(const MElement *el, const bool *serendip) - : _tag(el->getTypeForMSH()), _spaceOrder(el->getPolynomialOrder()), - _serendipity(serendip ? *serendip : el->getIsOnlySerendipity()), _nij(0), - _nk(_spaceOrder), _pyramidalSpace(el->getType() == TYPE_PYR) +FuncSpaceData::FuncSpaceData(const MElement *el) + : _parentType(el->getType()), _spaceOrder(el->getPolynomialOrder()), + _serendipity(el->getIsOnlySerendipity()), _nij(0), _nk(_spaceOrder), + _pyramidalSpace(el->getType() == TYPE_PYR) { } -FuncSpaceData::FuncSpaceData(const MElement *el, int order, - const bool *serendip) - : _tag(el->getTypeForMSH()), _spaceOrder(order), - _serendipity(serendip ? *serendip : el->getIsOnlySerendipity()), _nij(0), - _nk(_spaceOrder), _pyramidalSpace(el->getType() == TYPE_PYR) +FuncSpaceData::FuncSpaceData(const MElement *el, int order, bool serendip) + : _parentType(el->getType()), _spaceOrder(order), _serendipity(serendip), + _nij(0), _nk(_spaceOrder), _pyramidalSpace(el->getType() == TYPE_PYR) { } FuncSpaceData::FuncSpaceData(const MElement *el, bool pyr, int nij, int nk, - const bool *serendip) - : _tag(el->getTypeForMSH()), _spaceOrder(pyr ? nij + nk : std::max(nij, nk)), - _serendipity(serendip ? *serendip : el->getIsOnlySerendipity()), _nij(nij), - _nk(nk), _pyramidalSpace(pyr) + bool serendip) + : _parentType(el->getType()), _spaceOrder(pyr ? nij + nk : std::max(nij, nk)), + _serendipity(serendip), _nij(nij), _nk(nk), _pyramidalSpace(pyr) { if(el->getType() != TYPE_PYR) Msg::Error("Creation of pyramidal space data for a non-pyramid element !"); } -FuncSpaceData::FuncSpaceData(int tag, const bool *serendip) - : _tag(tag), _spaceOrder(ElementType::getOrder(tag)), - _serendipity(serendip ? *serendip : ElementType::getSerendipity(_tag) > 1), - _nij(0), _nk(_spaceOrder), +FuncSpaceData::FuncSpaceData(int tag) + : _parentType(ElementType::getParentType(tag)), + _spaceOrder(ElementType::getOrder(tag)), + _serendipity(ElementType::getSerendipity(tag) > 1), _nij(0), + _nk(_spaceOrder), _pyramidalSpace(ElementType::getParentType(tag) == TYPE_PYR) { } -FuncSpaceData::FuncSpaceData(bool isTag, int tagOrType, int order, - const bool *serendip, bool elemIsSerendip) - : _tag(isTag ? tagOrType : - ElementType::getType(tagOrType, order, elemIsSerendip)), - _spaceOrder(order), - _serendipity(serendip ? *serendip : ElementType::getSerendipity(_tag) > 1), - _nij(0), _nk(_spaceOrder), - _pyramidalSpace(isTag ? ElementType::getParentType(tagOrType) == TYPE_PYR : - tagOrType == TYPE_PYR) +FuncSpaceData::FuncSpaceData(int type, int order, bool serendip) + : _parentType(type), _spaceOrder(order), _serendipity(serendip), _nij(0), + _nk(_spaceOrder), _pyramidalSpace(type == TYPE_PYR) { } -FuncSpaceData::FuncSpaceData(bool isTag, int tagOrType, bool pyr, int nij, - int nk, const bool *serendip, bool elemIsSerendip) - : _tag(isTag ? - tagOrType : - ElementType::getType(tagOrType, pyr ? nij + nk : std::max(nij, nk), - elemIsSerendip)), - _spaceOrder(pyr ? nij + nk : std::max(nij, nk)), - _serendipity(serendip ? *serendip : ElementType::getSerendipity(_tag) > 1), - _nij(nij), _nk(nk), _pyramidalSpace(pyr) +FuncSpaceData::FuncSpaceData(int type, bool pyr, int nij, int nk, bool serendip) + : _parentType(type), _spaceOrder(pyr ? nij + nk : std::max(nij, nk)), + _serendipity(serendip), _nij(nij), _nk(nk), _pyramidalSpace(pyr) { - if(ElementType::getParentType(_tag) != TYPE_PYR) + if(_parentType != TYPE_PYR) Msg::Error("Creation of pyramidal space data for a non-pyramid element!"); } @@ -89,7 +73,7 @@ void FuncSpaceData::getOrderForBezier(int order[3], int exponentZ) const order[0] = order[1] = order[2] = -1; return; } - if(elementType() == TYPE_PYR) { + if(getType() == TYPE_PYR) { if(_pyramidalSpace) { order[0] = order[1] = _nij + exponentZ; order[2] = _nk; @@ -103,28 +87,12 @@ void FuncSpaceData::getOrderForBezier(int order[3], int exponentZ) const order[0] = order[1] = order[2] = _spaceOrder; } -FuncSpaceData FuncSpaceData::getForPrimaryElement() const -{ - int type = elementType(); - int primTag = ElementType::getType(type, 1, elementIsOnlySerendipity()); - - if(primTag == _tag) return *this; - - if(type == TYPE_PYR) - return FuncSpaceData(true, primTag, _pyramidalSpace, _nij, _nk, - &_serendipity); - else - return FuncSpaceData(true, primTag, _spaceOrder, &_serendipity); -} - FuncSpaceData FuncSpaceData::getForNonSerendipitySpace() const { if(!_serendipity) return *this; - int type = elementType(); - bool serendip = false; - if(type == TYPE_PYR) - return FuncSpaceData(true, _tag, _pyramidalSpace, _nij, _nk, &serendip); + if(_parentType == TYPE_PYR) + return FuncSpaceData(_parentType, _pyramidalSpace, _nij, _nk, false); else - return FuncSpaceData(true, _tag, _spaceOrder, &serendip); + return FuncSpaceData(_parentType, _spaceOrder, false); } diff --git a/Numeric/FuncSpaceData.h b/Numeric/FuncSpaceData.h index 846c8822e45eed9787e5f3a2012d0b9c55f3dffe..41c7bb10dddc044f27bfda7ed9e0e3672172065b 100644 --- a/Numeric/FuncSpaceData.h +++ b/Numeric/FuncSpaceData.h @@ -17,91 +17,84 @@ class FuncSpaceData { // bezier and metric bases. private: - int _tag, _spaceOrder; + int _parentType, _spaceOrder; bool _serendipity; - // '_tag' determine the type and the order of the element and if it is - // serendipity. - // - // For non-pyramidal elements, the space is the space of the same type element - // at order '_spaceOrder'. It is a serendipity space if '_serendipity' is - // true. - // - // Pyramids + // For pyramids, '_spaceOrder' is not used. + + // Pyramids: int _nij, _nk; bool _pyramidalSpace; - // For pyramids, '_spaceOrder' is not used. // There are two possible spaces in function of '_pyramidalSpace'. - // if '_pyramidalSpace' == true, - // the space is {X^i Y^j Z^k | i,j <= k+'_nij', k <= '_nk'}, (pyramid-like - // space) - // otherwise, - // the space is {X^i Y^j Z^k | i,j <= '_nij', k <= '_nk'}, (hex-like space) + // if '_pyramidalSpace' == true, the space is a pyramid-like space: + // {X^i Y^j Z^k | i,j <= k+'_nij', k <= '_nk'}, + // otherwise, the space is a hex-like space: + // {X^i Y^j Z^k | i,j <= '_nij', k <= '_nk'}, // where X = xi/(1-zeta), Y = eta/(1-zeta) and Z = (1-zeta). public: FuncSpaceData() - : _tag(-1), _spaceOrder(-1), _serendipity(false), _nij(-1), _nk(-1), + : _parentType(-1), _spaceOrder(-1), _serendipity(false), _nij(-1), _nk(-1), _pyramidalSpace(false) { } // Constructors for the function space of a different order - FuncSpaceData(const FuncSpaceData &fsd, int order, - const bool *serendip = NULL); - FuncSpaceData(const FuncSpaceData &fsd, int nij, int nk, - const bool *serendip = NULL); + FuncSpaceData(const FuncSpaceData &fsd, int order); + FuncSpaceData(const FuncSpaceData &fsd, int nij, int nk); // Constructors using MElement* - FuncSpaceData(const MElement *el, const bool *serendip = NULL); - FuncSpaceData(const MElement *el, int order, const bool *serendip = NULL); - FuncSpaceData(const MElement *el, bool pyr, int nij, int nk, - const bool *serendip = NULL); - - // Constructor using element tag - FuncSpaceData(int tag, const bool *serendip = NULL); + FuncSpaceData(const MElement *el); + FuncSpaceData(const MElement *el, int order, bool serendip); + FuncSpaceData(const MElement *el, bool pyr, int nij, int nk, bool serendip); - // constructors using element tag or element type - FuncSpaceData(bool isTag, int tagOrType, int order, - const bool *serendip = NULL, bool elemIsSerendip = false); - FuncSpaceData(bool isTag, int tagOrType, bool pyr, int nij, int nk, - const bool *serendip = NULL, bool elemIsSerendip = false); + // Constructor using element type or (parentType, order, serendip) + FuncSpaceData(int tag); + FuncSpaceData(int type, int order, bool serendip); + FuncSpaceData(int type, bool pyr, int nij, int nk, bool serendip); // Print void print() const { - Msg::Info("FuncSpaceData: tag%d, order%d, nij%d, nk%d, pyr%d, serendip%d", - _tag, _spaceOrder, _nij, _nk, _pyramidalSpace, _serendipity); + Msg::Info("FuncSpaceData: type%d, order%d, nij%d, nk%d, pyr%d, serendip%d", + _parentType, _spaceOrder, _nij, _nk, _pyramidalSpace, + _serendipity); } // Get methods - int elementTag() const { return _tag; } - int elementType() const { return ElementType::getParentType(_tag); } - int elementOrder() const { return ElementType::getOrder(_tag); } - int dimension() const { return ElementType::getDimension(_tag); } - int spaceOrder() const { return _spaceOrder; } - int nij() const { return _nij; } - int nk() const { return _nk; } - bool elementIsOnlySerendipity() const + int getType() const { return _parentType; } + int getDimension() const { - return ElementType::getSerendipity(_tag) > 1; + switch(_parentType) { + case TYPE_PNT: return 0; + case TYPE_LIN: return 1; + case TYPE_TRI: + case TYPE_QUA: return 2; + case TYPE_TET: + case TYPE_PRI: + case TYPE_HEX: + case TYPE_PYR: return 3; + default: return -1; + } } - bool spaceIsSerendipity() const { return _serendipity; } - bool isPyramidalSpace() const { return _pyramidalSpace; } + int getSpaceOrder() const { return _spaceOrder; } + int getNij() const { return _nij; } + int getNk() const { return _nk; } + bool getSerendipity() const { return _serendipity; } + bool getPyramidalSpace() const { return _pyramidalSpace; } void getOrderForBezier(int[3], int exponentZ = -1) const; // Change space - FuncSpaceData getForPrimaryElement() const; FuncSpaceData getForNonSerendipitySpace() const; // inline bool operator<(const FuncSpaceData &other) const { - if(_tag == other._tag) { + if(_parentType == other._parentType) { if(_spaceOrder == other._spaceOrder) { if(_nij == other._nij) { if(_nk == other._nk) { - return _pyramidalSpace == true ? false : other._pyramidalSpace; + return _pyramidalSpace ? false : other._pyramidalSpace; } else return _nk < other._nk; @@ -113,13 +106,13 @@ public: return _spaceOrder < other._spaceOrder; } else - return _tag < other._tag; + return _parentType < other._parentType; } inline bool operator==(const FuncSpaceData &other) const { - return _tag == other._tag && _spaceOrder == other._spaceOrder && - _nij == other._nij && _nk == other._nk && - _pyramidalSpace == other._pyramidalSpace; + return _parentType == other._parentType && + _spaceOrder == other._spaceOrder && _nij == other._nij && + _nk == other._nk && _pyramidalSpace == other._pyramidalSpace; } }; diff --git a/Numeric/HierarchicalBasis.cpp b/Numeric/HierarchicalBasis.cpp new file mode 100644 index 0000000000000000000000000000000000000000..8e7dadf6069c7e7f0ddbc860fd18f0178a8826c9 --- /dev/null +++ b/Numeric/HierarchicalBasis.cpp @@ -0,0 +1,27 @@ +// Gmsh - Copyright (C) 1997-2019 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. +// +// Contributed by Ismail Badia. + +#include "HierarchicalBasis.h" + +HierarchicalBasis::~HierarchicalBasis() {} + +int HierarchicalBasis::getnEdgeFunction() const { return _nEdgeFunction; } + +int HierarchicalBasis::getnTriFaceFunction() const { return _nTriFaceFunction; } +int HierarchicalBasis::getnQuadFaceFunction() const +{ + return _nQuadFaceFunction; +} + +int HierarchicalBasis::getnBubbleFunction() const { return _nBubbleFunction; } + +int HierarchicalBasis::getnVertexFunction() const { return _nVertexFunction; } + +int HierarchicalBasis::getNumTriFace() const { return _nfaceTri; } +int HierarchicalBasis::getNumQuadFace() const { return _nfaceQuad; } + +int HierarchicalBasis::getNumEdge() const { return _nedge; } diff --git a/Numeric/HierarchicalBasis.h b/Numeric/HierarchicalBasis.h new file mode 100644 index 0000000000000000000000000000000000000000..2584d442c2c24faed0b51caa6486ca44461bdc63 --- /dev/null +++ b/Numeric/HierarchicalBasis.h @@ -0,0 +1,73 @@ +// Gmsh - Copyright (C) 1997-2019 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. +// +// Contributed by Ismail Badia. +// Reference : "Higher-Order Finite Element Methods"; Pavel Solin, Karel +// Segeth , +// Ivo Dolezel , Chapman and Hall/CRC; Edition : Har/Cdr (2003). + +#ifndef HIERARCHICAL_BASIS_H +#define HIERARCHICAL_BASIS_H + +#include <vector> +#include "OrthogonalPoly.h" + +class HierarchicalBasis { +protected: + int _nvertex; + int _nedge; + int _nfaceQuad; // number of quadrilateral faces + int _nfaceTri; // number of triangular faces + int _nVertexFunction; + int _nEdgeFunction; + int _nQuadFaceFunction; + int _nTriFaceFunction; + int _nBubbleFunction; + +public: + virtual ~HierarchicalBasis() = 0; + int getnVertexFunction() const; + int getnEdgeFunction() const; + int getnTriFaceFunction() const; + int getnQuadFaceFunction() const; + int getnBubbleFunction() const; + int getNumTriFace() const; + int getNumQuadFace() const; + int getNumEdge() const; + virtual void generateBasis(double const &u, double const &v, double const &w, + std::vector<double> &vertexBasis, + std::vector<double> &edgeBasis, + std::vector<double> &faceBasis, + std::vector<double> &bubbleBasis) = 0; + + virtual void generateBasis( + double const &u, double const &v, double const &w, + std::vector<std::vector<double> > &vertexBasis, + std::vector<std::vector<double> > &edgeBasis, + std::vector<std::vector<double> > &faceBasis, + std::vector<std::vector<double> > &bubbleBasis, + std::string typeFunction) = 0; // typeFunction =GradH1Legendre , + // HcurlLegendre,curlHcurlLegendre + + virtual void orientEdge(int const &flagOrientation, int const &edgeNumber, + std::vector<std::vector<double> > &edgeBasis) = 0; + + virtual void + orientFace(double const &u, double const &v, double const &w, + int const &flag1, int const &flag2, int const &flag3, + int const &faceNumber, + std::vector<std::vector<double> > &faceBasis, + std::string typeFunction) = 0; // typeFunction =GradH1Legendre , + // HcurlLegendre,curlHcurlLegendre + + virtual void orientEdge(int const &flagOrientation, int const &edgeNumber, + std::vector<double> &edgeFunctions) = 0; + virtual void orientFace(double const &u, double const &v, double const &w, + int const &flag1, int const &flag2, int const &flag3, + int const &faceNumber, + std::vector<double> &faceFunctions) = 0; +}; + +#endif diff --git a/Numeric/HierarchicalBasisH1.cpp b/Numeric/HierarchicalBasisH1.cpp new file mode 100644 index 0000000000000000000000000000000000000000..1e459fe8610f5a29467dfe4dcdc0bffbf92b964e --- /dev/null +++ b/Numeric/HierarchicalBasisH1.cpp @@ -0,0 +1,10 @@ +// Gmsh - Copyright (C) 1997-2019 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. +// +// Contributed by Ismail Badia. + +#include "HierarchicalBasisH1.h" + +HierarchicalBasisH1::~HierarchicalBasisH1() {} diff --git a/Numeric/HierarchicalBasisH1.h b/Numeric/HierarchicalBasisH1.h new file mode 100644 index 0000000000000000000000000000000000000000..730d075a249e7b6b0a53bf272b9194f5f8cb2939 --- /dev/null +++ b/Numeric/HierarchicalBasisH1.h @@ -0,0 +1,47 @@ +// Gmsh - Copyright (C) 1997-2019 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. +// +// Contributed by Ismail Badia. +// Reference : "Higher-Order Finite Element Methods"; Pavel Solin, Karel +// Segeth , +// Ivo Dolezel , Chapman and Hall/CRC; Edition : Har/Cdr (2003). + +#ifndef HIERARCHICAL_BASIS_H1_H +#define HIERARCHICAL_BASIS_H1_H +#include "HierarchicalBasis.h" +class HierarchicalBasisH1 : public HierarchicalBasis { +public: + virtual ~HierarchicalBasisH1() = 0; + + virtual void generateBasis(double const &u, double const &v, double const &w, + std::vector<double> &vertexBasis, + std::vector<double> &edgeBasis, + std::vector<double> &faceBasis, + std::vector<double> &bubbleBasis) = 0; + + virtual void generateBasis(double const &u, double const &v, double const &w, + std::vector<std::vector<double> > &vertexBasis, + std::vector<std::vector<double> > &edgeBasis, + std::vector<std::vector<double> > &faceBasis, + std::vector<std::vector<double> > &bubbleBasis, + std::string typeFunction = "GradH1Legendre") = 0; + virtual void orientEdge(int const &flagOrientation, int const &edgeNumber, + std::vector<double> &edgeBasis) = 0; + virtual void orientEdge(int const &flagOrientation, int const &edgeNumber, + std::vector<std::vector<double> > &edgeBasis) = 0; + + virtual void orientFace(double const &u, double const &v, double const &w, + int const &flag1, int const &flag2, int const &flag3, + int const &faceNumber, + std::vector<double> &faceBasis) = 0; + + virtual void orientFace(double const &u, double const &v, double const &w, + int const &flag1, int const &flag2, int const &flag3, + int const &faceNumber, + std::vector<std::vector<double> > &faceBasis, + std::string typeFunction = "GradH1Legendre") = 0; +}; + +#endif diff --git a/Numeric/HierarchicalBasisH1Brick.cpp b/Numeric/HierarchicalBasisH1Brick.cpp new file mode 100644 index 0000000000000000000000000000000000000000..3957bd1d0b65eacdf7f1dc4f42466b5028911c94 --- /dev/null +++ b/Numeric/HierarchicalBasisH1Brick.cpp @@ -0,0 +1,648 @@ +// Gmsh - Copyright (C) 1997-2019 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. +// +// Contributed by Ismail Badia. +// Reference : "Higher-Order Finite Element Methods"; Pavel Solin, Karel +// Segeth , +// Ivo Dolezel , Chapman and Hall/CRC; Edition : Har/Cdr (2003). + +#include "HierarchicalBasisH1Brick.h" + +HierarchicalBasisH1Brick::HierarchicalBasisH1Brick(int order) +{ + _pb1 = order; + _pb2 = order; + _pb3 = order; + for(int i = 0; i < 12; i++) { _pOrderEdge[i] = order; } + for(int j = 0; j < 6; j++) { + _pOrderFace1[j] = order; + _pOrderFace2[j] = order; + } + _nvertex = 8; + _nedge = 12; + _nfaceQuad = 6; + _nfaceTri = 0; + _nVertexFunction = 8; + _nEdgeFunction = 12 * order - 12; + _nQuadFaceFunction = 6 * (order - 1) * (order - 1); + _nTriFaceFunction = 0; + _nBubbleFunction = (order - 1) * (order - 1) * (order - 1); +} + +HierarchicalBasisH1Brick::~HierarchicalBasisH1Brick() {} + +double HierarchicalBasisH1Brick::_affineCoordinate(const int &j, + const double &u, + const double &v, + const double &w) +{ + switch(j) { + case(1): return 0.5 * (1 + u); + case(2): return 0.5 * (1 - u); + case(3): return 0.5 * (1 + v); + case(4): return 0.5 * (1 - v); + case(5): return 0.5 * (1 + w); + case(6): return 0.5 * (1 - w); + default: throw std::string("j must be : 1<=j<=6"); + } +} +inline void HierarchicalBasisH1Brick::_someProduct(double const &u, + double const &v, + double const &w, + std::vector<double> &product, + std::vector<double> &lambda) +{ + lambda[0] = _affineCoordinate(1, u, v, w); + lambda[1] = _affineCoordinate(2, u, v, w); + lambda[2] = _affineCoordinate(3, u, v, w); + lambda[3] = _affineCoordinate(4, u, v, w); + lambda[4] = _affineCoordinate(5, u, v, w); + lambda[5] = _affineCoordinate(6, u, v, w); + product[0] = lambda[3] * lambda[5]; + product[1] = lambda[1] * lambda[5]; + product[2] = lambda[1] * lambda[3]; + product[3] = lambda[0] * lambda[5]; + product[4] = lambda[3] * lambda[0]; + product[5] = lambda[2] * lambda[5]; + product[6] = lambda[2] * lambda[0]; + product[7] = lambda[2] * lambda[1]; + product[8] = lambda[3] * lambda[4]; + product[9] = lambda[4] * lambda[1]; + product[10] = lambda[4] * lambda[0]; + product[11] = lambda[4] * lambda[2]; +} +void HierarchicalBasisH1Brick::generateBasis(double const &u, double const &v, + double const &w, + std::vector<double> &vertexBasis, + std::vector<double> &edgeBasis, + std::vector<double> &faceBasis, + std::vector<double> &bubbleBasis) +{ + std::vector<double> product(12, 0); + std::vector<double> lambda(6, 0); + HierarchicalBasisH1Brick::_someProduct(u, v, w, product, lambda); + // vertex shape functions: + vertexBasis[0] = lambda[1] * product[0]; + vertexBasis[1] = lambda[0] * product[0]; + vertexBasis[2] = lambda[0] * product[5]; + vertexBasis[3] = lambda[1] * product[5]; + vertexBasis[4] = lambda[1] * product[8]; + vertexBasis[5] = lambda[0] * product[8]; + vertexBasis[6] = lambda[0] * product[11]; + vertexBasis[7] = lambda[1] * product[11]; + std::vector<double> lkVectorU(_pb1 - 1); + std::vector<double> lkVectorV(_pb2 - 1); + std::vector<double> lkVectorW(_pb3 - 1); + for(int it = 2; it <= _pb1; it++) { + lkVectorU[it - 2] = OrthogonalPoly::EvalLobatto(it, u); + } + for(int it = 2; it <= _pb2; it++) { + lkVectorV[it - 2] = OrthogonalPoly::EvalLobatto(it, v); + } + for(int it = 2; it <= _pb3; it++) { + lkVectorW[it - 2] = OrthogonalPoly::EvalLobatto(it, w); + } + // edge shape functions: + int indexEdgeBasis = 0; + std::vector<double> *vectorTarget1(0); + for(int iEdge = 0; iEdge < _nedge; iEdge++) { + switch(iEdge) { + case(0): + case(5): + case(8): + case(11): vectorTarget1 = &lkVectorU; break; + case(1): + case(3): + case(9): + case(10): vectorTarget1 = &lkVectorV; break; + case(2): + case(4): + case(6): + case(7): vectorTarget1 = &lkVectorW; break; + } + for(int indexEdgeFunc = 0; indexEdgeFunc < _pOrderEdge[iEdge] - 1; + indexEdgeFunc++) { + edgeBasis[indexEdgeBasis] = + (*vectorTarget1)[indexEdgeFunc] * product[iEdge]; + indexEdgeBasis++; + } + } + // face shape functions: + int indexFaceFunction = 0; + std::vector<double> *vectorTarget2(0); + for(int iFace = 0; iFace < _nfaceQuad; iFace++) { + int indexLambda; + switch(iFace) { + case(0): + indexLambda = 5; + vectorTarget1 = &lkVectorU; + vectorTarget2 = &lkVectorV; + break; + case(1): + indexLambda = 3; + vectorTarget1 = &lkVectorU; + vectorTarget2 = &lkVectorW; + break; + case(2): + indexLambda = 1; + vectorTarget1 = &lkVectorV; + vectorTarget2 = &lkVectorW; + break; + case(3): + indexLambda = 0; + vectorTarget1 = &lkVectorV; + vectorTarget2 = &lkVectorW; + break; + case(4): + indexLambda = 2; + vectorTarget1 = &lkVectorU; + vectorTarget2 = &lkVectorW; + break; + case(5): + indexLambda = 4; + vectorTarget1 = &lkVectorU; + vectorTarget2 = &lkVectorV; + break; + } + for(int index1 = 0; index1 < _pOrderFace1[iFace] - 1; index1++) { + for(int index2 = 0; index2 < _pOrderFace2[iFace] - 1; index2++) { + faceBasis[indexFaceFunction] = lambda[indexLambda] * + (*vectorTarget1)[index1] * + (*vectorTarget2)[index2]; + indexFaceFunction++; + } + } + } + // bubble shape functions: + int indexBubbleBasis = 0; + for(int ipb1 = 0; ipb1 < _pb1 - 1; ipb1++) { + for(int ipb2 = 0; ipb2 < _pb2 - 1; ipb2++) { + for(int ipb3 = 0; ipb3 < _pb3 - 1; ipb3++) { + bubbleBasis[indexBubbleBasis] = + lkVectorU[ipb1] * lkVectorV[ipb2] * lkVectorW[ipb3]; + indexBubbleBasis++; + } + } + } +} + +void HierarchicalBasisH1Brick::_someProductGrad( + double const &u, double const &v, double const &w, + std::vector<double> &product, + std::vector<std::vector<double> > &gradientProduct, + std::vector<double> &lambda, + std::vector<std::vector<double> > &gradientLambda) +{ + lambda[0] = _affineCoordinate(1, u, v, w); + lambda[1] = _affineCoordinate(2, u, v, w); + lambda[2] = _affineCoordinate(3, u, v, w); + lambda[3] = _affineCoordinate(4, u, v, w); + lambda[4] = _affineCoordinate(5, u, v, w); + lambda[5] = _affineCoordinate(6, u, v, w); + gradientLambda[0][0] = 0.5; + gradientLambda[1][0] = -0.5; + gradientLambda[2][1] = 0.5; + gradientLambda[3][1] = -0.5; + gradientLambda[4][2] = 0.5; + gradientLambda[5][2] = -0.5; + product[0] = lambda[3] * lambda[5]; + product[1] = lambda[1] * lambda[5]; + product[2] = lambda[1] * lambda[3]; + product[3] = lambda[0] * lambda[5]; + product[4] = lambda[3] * lambda[0]; + product[5] = lambda[2] * lambda[5]; + product[6] = lambda[2] * lambda[0]; + product[7] = lambda[2] * lambda[1]; + product[8] = lambda[3] * lambda[4]; + product[9] = lambda[4] * lambda[1]; + product[10] = lambda[4] * lambda[0]; + product[11] = lambda[4] * lambda[2]; + gradientProduct[0][1] = -0.5 * lambda[5]; + gradientProduct[0][2] = -0.5 * lambda[3]; + gradientProduct[1][0] = -0.5 * lambda[5]; + gradientProduct[1][2] = -0.5 * lambda[1]; + gradientProduct[2][0] = -0.5 * lambda[3]; + gradientProduct[2][1] = -0.5 * lambda[1]; + gradientProduct[3][0] = 0.5 * lambda[5]; + gradientProduct[3][2] = -0.5 * lambda[0]; + gradientProduct[4][0] = 0.5 * lambda[3]; + gradientProduct[4][1] = -0.5 * lambda[0]; + gradientProduct[5][1] = 0.5 * lambda[5]; + gradientProduct[5][2] = -0.5 * lambda[2]; + gradientProduct[6][0] = 0.5 * lambda[2]; + gradientProduct[6][1] = 0.5 * lambda[0]; + gradientProduct[7][0] = -0.5 * lambda[2]; + gradientProduct[7][1] = 0.5 * lambda[1]; + gradientProduct[8][1] = -0.5 * lambda[4]; + gradientProduct[8][2] = 0.5 * lambda[3]; + gradientProduct[9][0] = -0.5 * lambda[4]; + gradientProduct[9][2] = 0.5 * lambda[1]; + gradientProduct[10][0] = 0.5 * lambda[4]; + gradientProduct[10][2] = 0.5 * lambda[0]; + gradientProduct[11][1] = 0.5 * lambda[4]; + gradientProduct[11][2] = 0.5 * lambda[2]; +} + +void HierarchicalBasisH1Brick::generateGradientBasis( + double const &u, double const &v, double const &w, + std::vector<std::vector<double> > &gradientVertex, + std::vector<std::vector<double> > &gradientEdge, + std::vector<std::vector<double> > &gradientFace, + std::vector<std::vector<double> > &gradientBubble) +{ + std::vector<double> product(12, 0); + std::vector<std::vector<double> > gradientProduct(12, + std::vector<double>(3, 0)); + std::vector<double> lambda(6, 0); + std::vector<std::vector<double> > gradientLambda(6, + std::vector<double>(3, 0)); + HierarchicalBasisH1Brick::_someProductGrad(u, v, w, product, gradientProduct, + lambda, gradientLambda); + // vertex gradient: + for(int it = 0; it < 3; it++) { + gradientVertex[0][it] = + gradientLambda[1][it] * product[0] + gradientProduct[0][it] * lambda[1]; + gradientVertex[1][it] = + gradientLambda[0][it] * product[0] + gradientProduct[0][it] * lambda[0]; + gradientVertex[2][it] = + gradientLambda[0][it] * product[5] + gradientProduct[5][it] * lambda[0]; + gradientVertex[3][it] = + gradientLambda[1][it] * product[5] + gradientProduct[5][it] * lambda[1]; + gradientVertex[4][it] = + gradientLambda[1][it] * product[8] + gradientProduct[8][it] * lambda[1]; + gradientVertex[5][it] = + gradientLambda[0][it] * product[8] + gradientProduct[8][it] * lambda[0]; + gradientVertex[6][it] = + gradientLambda[0][it] * product[11] + gradientProduct[11][it] * lambda[0]; + gradientVertex[7][it] = + gradientLambda[1][it] * product[11] + gradientProduct[11][it] * lambda[1]; + } + std::vector<double> lkVectorU(_pb1 - 1); + std::vector<double> lkVectorV(_pb2 - 1); + std::vector<double> lkVectorW(_pb3 - 1); + std::vector<std::vector<double> > dlkVectorU(_pb1 - 1, + std::vector<double>(3, 0.)); + std::vector<std::vector<double> > dlkVectorV(_pb2 - 1, + std::vector<double>(3, 0.)); + std::vector<std::vector<double> > dlkVectorW(_pb3 - 1, + std::vector<double>(3, 0.)); + for(int it = 2; it <= _pb1; it++) { + lkVectorU[it - 2] = OrthogonalPoly::EvalLobatto(it, u); + dlkVectorU[it - 2][0] = OrthogonalPoly::EvalDLobatto(it, u); + } + for(int it = 2; it <= _pb2; it++) { + lkVectorV[it - 2] = OrthogonalPoly::EvalLobatto(it, v); + dlkVectorV[it - 2][1] = OrthogonalPoly::EvalDLobatto(it, v); + } + for(int it = 2; it <= _pb3; it++) { + lkVectorW[it - 2] = OrthogonalPoly::EvalLobatto(it, w); + dlkVectorW[it - 2][2] = OrthogonalPoly::EvalDLobatto(it, w); + } + // edge gradient: + int indexEdgeBasis = 0; + std::vector<double> *vectorTarget1(0); + std::vector<std::vector<double> > *dvectorTarget1(0); + for(int iEdge = 0; iEdge < _nedge; iEdge++) { + switch(iEdge) { + case(0): + case(5): + case(8): + case(11): + vectorTarget1 = &lkVectorU; + dvectorTarget1 = &dlkVectorU; + break; + case(1): + case(3): + case(9): + case(10): + vectorTarget1 = &lkVectorV; + dvectorTarget1 = &dlkVectorV; + break; + case(2): + case(4): + case(6): + case(7): + vectorTarget1 = &lkVectorW; + dvectorTarget1 = &dlkVectorW; + break; + } + for(int indexEdgeFunc = 0; indexEdgeFunc < _pOrderEdge[iEdge] - 1; + indexEdgeFunc++) { + for(int it = 0; it < 3; it++) { + gradientEdge[indexEdgeBasis][it] = + (*dvectorTarget1)[indexEdgeFunc][it] * product[iEdge] + + (*vectorTarget1)[indexEdgeFunc] * gradientProduct[iEdge][it]; + } + indexEdgeBasis++; + } + } + // face gradient: + int indexFaceFunction = 0; + std::vector<double> *vectorTarget2(0); + std::vector<std::vector<double> > *dvectorTarget2(0); + for(int iFace = 0; iFace < _nfaceQuad; iFace++) { + int indexLambda; + switch(iFace) { + case(0): + indexLambda = 5; + vectorTarget1 = &lkVectorU; + vectorTarget2 = &lkVectorV; + dvectorTarget1 = &dlkVectorU; + dvectorTarget2 = &dlkVectorV; + break; + case(1): + indexLambda = 3; + vectorTarget1 = &lkVectorU; + vectorTarget2 = &lkVectorW; + dvectorTarget1 = &dlkVectorU; + dvectorTarget2 = &dlkVectorW; + break; + case(2): + indexLambda = 1; + vectorTarget1 = &lkVectorV; + vectorTarget2 = &lkVectorW; + dvectorTarget1 = &dlkVectorV; + dvectorTarget2 = &dlkVectorW; + break; + case(3): + indexLambda = 0; + vectorTarget1 = &lkVectorV; + vectorTarget2 = &lkVectorW; + dvectorTarget1 = &dlkVectorV; + dvectorTarget2 = &dlkVectorW; + break; + case(4): + indexLambda = 2; + vectorTarget1 = &lkVectorU; + vectorTarget2 = &lkVectorW; + dvectorTarget1 = &dlkVectorU; + dvectorTarget2 = &dlkVectorW; + break; + case(5): + indexLambda = 4; + vectorTarget1 = &lkVectorU; + vectorTarget2 = &lkVectorV; + dvectorTarget1 = &dlkVectorU; + dvectorTarget2 = &dlkVectorV; + break; + } + for(int index1 = 0; index1 < _pOrderFace1[iFace] - 1; index1++) { + for(int index2 = 0; index2 < _pOrderFace2[iFace] - 1; index2++) { + for(int it = 0; it < 3; it++) { + gradientFace[indexFaceFunction][it] = + gradientLambda[indexLambda][it] * (*vectorTarget1)[index1] * + (*vectorTarget2)[index2] + + lambda[indexLambda] * (*dvectorTarget1)[index1][it] * + (*vectorTarget2)[index2] + + lambda[indexLambda] * (*vectorTarget1)[index1] * + (*dvectorTarget2)[index2][it]; + } + indexFaceFunction++; + } + } + } + // bubble shape functions: + int indexBubbleBasis = 0; + for(int ipb1 = 0; ipb1 < _pb1 - 1; ipb1++) { + for(int ipb2 = 0; ipb2 < _pb2 - 1; ipb2++) { + for(int ipb3 = 0; ipb3 < _pb3 - 1; ipb3++) { + gradientBubble[indexBubbleBasis][0] = + dlkVectorU[ipb1][0] * lkVectorV[ipb2] * lkVectorW[ipb3]; + gradientBubble[indexBubbleBasis][1] = + lkVectorU[ipb1] * dlkVectorV[ipb2][1] * lkVectorW[ipb3]; + gradientBubble[indexBubbleBasis][2] = + lkVectorU[ipb1] * lkVectorV[ipb2] * dlkVectorW[ipb3][2]; + indexBubbleBasis++; + } + } + } +} + +void HierarchicalBasisH1Brick::orientEdge(int const &flagOrientation, + int const &edgeNumber, + std::vector<double> &edgeBasis) +{ + if(flagOrientation == -1) { + int constant1 = 0; + int constant2 = 0; + for(int i = 0; i <= edgeNumber; i++) { constant2 += _pOrderEdge[i] - 1; } + constant2 = constant2 - 1; + constant1 = constant2 - _pOrderEdge[edgeNumber] + 2; + for(int k = constant1; k <= constant2; k++) { + if((k - constant1) % 2 != 0) { edgeBasis[k] = edgeBasis[k] * (-1); } + } + } +} + +void HierarchicalBasisH1Brick::orientEdge( + int const &flagOrientation, int const &edgeNumber, + std::vector<std::vector<double> > &gradientEdge) +{ + if(flagOrientation == -1) { + int constant1 = 0; + int constant2 = 0; + for(int i = 0; i <= edgeNumber; i++) { constant2 += _pOrderEdge[i] - 1; } + constant2 = constant2 - 1; + constant1 = constant2 - _pOrderEdge[edgeNumber] + 2; + for(int k = constant1; k <= constant2; k++) { + if((k - constant1) % 2 != 0) { + gradientEdge[k][0] = gradientEdge[k][0] * (-1); + gradientEdge[k][1] = gradientEdge[k][1] * (-1); + gradientEdge[k][2] = gradientEdge[k][2] * (-1); + } + } + } +} + +void HierarchicalBasisH1Brick::orientFace(double const &u, double const &v, + double const &w, int const &flag1, + int const &flag2, int const &flag3, + int const &faceNumber, + std::vector<double> &faceBasis) +{ + if(!(flag1 == 1 && flag2 == 1 && flag3 == 1)) { + int iterator = 0; + for(int i = 0; i < faceNumber; i++) { + iterator += (_pOrderFace1[i] - 1) * (_pOrderFace2[i] - 1); + } + if(flag3 == 1) { + for(int it1 = 2; it1 <= _pOrderFace1[faceNumber]; it1++) { + for(int it2 = 2; it2 <= _pOrderFace2[faceNumber]; it2++) { + int impactFlag1 = 1; + int impactFlag2 = 1; + if(flag1 == -1 && it1 % 2 != 0) { impactFlag1 = -1; } + if(flag2 == -1 && it2 % 2 != 0) { impactFlag2 = -1; } + faceBasis[iterator] = faceBasis[iterator] * impactFlag1 * impactFlag2; + iterator++; + } + } + } + else { + double lambda = 0; + double var1 = 0; + double var2 = 0; + switch(faceNumber) { + case(0): + lambda = _affineCoordinate(6, u, v, w); + var1 = u; + var2 = v; + break; + case(1): + lambda = _affineCoordinate(4, u, v, w); + var1 = u; + var2 = w; + break; + case(2): + lambda = _affineCoordinate(2, u, v, w); + var1 = v; + var2 = w; + break; + case(3): + lambda = _affineCoordinate(1, u, v, w); + var1 = v; + var2 = w; + break; + case(4): + lambda = _affineCoordinate(3, u, v, w); + var1 = u; + var2 = w; + break; + case(5): + lambda = _affineCoordinate(5, u, v, w); + var1 = u; + var2 = v; + break; + } + std::vector<double> lkVector1(_pOrderFace1[faceNumber] - 1); + std::vector<double> lkVector2(_pOrderFace2[faceNumber] - 1); + for(int it = 2; it <= _pOrderFace1[faceNumber]; it++) { + lkVector1[it - 2] = OrthogonalPoly::EvalLobatto(it, var1); + } + for(int it = 2; it <= _pOrderFace2[faceNumber]; it++) { + lkVector2[it - 2] = OrthogonalPoly::EvalLobatto(it, var2); + } + + for(int it1 = 2; it1 <= _pOrderFace2[faceNumber]; it1++) { + for(int it2 = 2; it2 <= _pOrderFace1[faceNumber]; it2++) { + int impactFlag1 = 1; + int impactFlag2 = 1; + if(flag2 == -1 && it1 % 2 != 0) { impactFlag1 = -1; } + if(flag1 == -1 && it2 % 2 != 0) { impactFlag2 = -1; } + faceBasis[iterator] = lambda * lkVector1[it2 - 2] * + lkVector2[it1 - 2] * impactFlag1 * impactFlag2; + iterator++; + } + } + } + } +} +void HierarchicalBasisH1Brick::orientFace( + double const &u, double const &v, double const &w, int const &flag1, + int const &flag2, int const &flag3, int const &faceNumber, + std::vector<std::vector<double> > &gradientFace, std::string typeFunction) +{ + if(!(flag1 == 1 && flag2 == 1 && flag3 == 1)) { + int iterator = 0; + for(int i = 0; i < faceNumber; i++) { + iterator += (_pOrderFace1[i] - 1) * (_pOrderFace2[i] - 1); + } + if(flag3 == 1) { + for(int it1 = 2; it1 <= _pOrderFace1[faceNumber]; it1++) { + for(int it2 = 2; it2 <= _pOrderFace2[faceNumber]; it2++) { + int impactFlag1 = 1; + int impactFlag2 = 1; + if(flag1 == -1 && it1 % 2 != 0) { impactFlag1 = -1; } + if(flag2 == -1 && it2 % 2 != 0) { impactFlag2 = -1; } + gradientFace[iterator][0] = + gradientFace[iterator][0] * impactFlag1 * impactFlag2; + gradientFace[iterator][1] = + gradientFace[iterator][1] * impactFlag1 * impactFlag2; + gradientFace[iterator][2] = + gradientFace[iterator][2] * impactFlag1 * impactFlag2; + iterator++; + } + } + } + else { + std::vector<double> uvw(3); + uvw[0] = u; + uvw[1] = v; + uvw[2] = w; + double lambda = 0; + int var1 = 0; + int var2 = 0; + std::vector<double> gradientLambda(3, 0); + switch(faceNumber) { + case(0): + lambda = _affineCoordinate(6, u, v, w); + var1 = 0; + var2 = 1; + gradientLambda[2] = -0.5; + break; + case(1): + lambda = _affineCoordinate(4, u, v, w); + var1 = 0; + var2 = 2; + gradientLambda[1] = -0.5; + break; + case(2): + lambda = _affineCoordinate(2, u, v, w); + var1 = 1; + var2 = 2; + gradientLambda[0] = -0.5; + break; + case(3): + lambda = _affineCoordinate(1, u, v, w); + var1 = 1; + var2 = 2; + gradientLambda[0] = 0.5; + break; + case(4): + lambda = _affineCoordinate(3, u, v, w); + var1 = 0; + var2 = 2; + gradientLambda[1] = 0.5; + break; + case(5): + lambda = _affineCoordinate(5, u, v, w); + var1 = 0; + var2 = 1; + gradientLambda[2] = 0.5; + break; + } + std::vector<double> lkVector1(_pOrderFace1[faceNumber] - 1); + std::vector<double> lkVector2(_pOrderFace2[faceNumber] - 1); + std::vector<std::vector<double> > dlkVector1(_pOrderFace1[faceNumber] - 1, + std::vector<double>(3, 0.)); + std::vector<std::vector<double> > dlkVector2(_pOrderFace2[faceNumber] - 1, + std::vector<double>(3, 0.)); + for(int it = 2; it <= _pOrderFace1[faceNumber]; it++) { + lkVector1[it - 2] = OrthogonalPoly::EvalLobatto(it, uvw[var1]); + dlkVector1[it - 2][var1] = OrthogonalPoly::EvalDLobatto(it, uvw[var1]); + } + for(int it = 2; it <= _pOrderFace2[faceNumber]; it++) { + lkVector2[it - 2] = OrthogonalPoly::EvalLobatto(it, uvw[var2]); + dlkVector2[it - 2][var2] = OrthogonalPoly::EvalDLobatto(it, uvw[var2]); + } + for(int it1 = 2; it1 <= _pOrderFace2[faceNumber]; it1++) { + for(int it2 = 2; it2 <= _pOrderFace1[faceNumber]; it2++) { + int impactFlag1 = 1; + int impactFlag2 = 1; + if(flag2 == -1 && it1 % 2 != 0) { impactFlag1 = -1; } + if(flag1 == -1 && it2 % 2 != 0) { impactFlag2 = -1; } + for(int itVector = 0; itVector < 3; itVector++) { + gradientFace[iterator][itVector] = + (gradientLambda[itVector] * lkVector1[it2 - 2] * + lkVector2[it1 - 2] + + lambda * dlkVector1[it2 - 2][itVector] * lkVector2[it1 - 2] + + lambda * lkVector1[it2 - 2] * dlkVector2[it1 - 2][itVector]) * + impactFlag1 * impactFlag2; + } + iterator++; + } + } + } + } +} diff --git a/Numeric/HierarchicalBasisH1Brick.h b/Numeric/HierarchicalBasisH1Brick.h new file mode 100644 index 0000000000000000000000000000000000000000..333667adc4bbd7bc308f9231eb511c82df280846 --- /dev/null +++ b/Numeric/HierarchicalBasisH1Brick.h @@ -0,0 +1,114 @@ +// Gmsh - Copyright (C) 1997-2019 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. +// +// Contributed by Ismail Badia. +// Reference : "Higher-Order Finite Element Methods"; Pavel Solin, Karel +// Segeth , +// Ivo Dolezel , Chapman and Hall/CRC; Edition : Har/Cdr (2003). + +#ifndef HIERARCHICAL_BASIS_H1_BRICK_H +#define HIERARCHICAL_BASIS_H1_BRICK_H + +#include "HierarchicalBasisH1.h" + +/* + * MHexahedron + * + * v + * 3----------2 + * |\ ^ |\ + * | \ | | \ + * | \ | | \ + * | 7------+---6 + * | | +-- |-- | -> u + * 0---+---\--1 | + * \ | \ \ | + * \ | \ \ | + * \| w \| + * 4----------5 + * + * Oriented Edges: + * e0={0, 1}, e1={0, 3}, e2={0, 4}, e3={1, 2}, e4 ={1, 5}, e5={2, 3},e6={2, 6}, + * e7={3, 7},e8={4, 5}, e9= {4, 7}, e10={5, 6}, e11={6, 7} + * + * Oritented Surface: + * s0={0, 1, 3, 2}, s1={0, 1, 4, 5}, s2={0, 3, 4, 7}, + * s3={1, 2, 5, 6}, s4={3,2,7,6}, s5={4, 5, 7, 6} + * Local (directional) orders on mesh faces are not allowed to exceed the mini- + * mum of the (appropriate directional) orders of approximation associated with + * the interior of the adjacent elements. Local orders of approximation on mesh + * edges are limited by the minimum of all (appropriate directional) orders cor- + * responding to faces sharing that edge + */ +class HierarchicalBasisH1Brick : public HierarchicalBasisH1 { +public: + HierarchicalBasisH1Brick(int order); + virtual ~HierarchicalBasisH1Brick(); + // vertexBasis=[v0,...,v12] + // edgeBasis=[phie0_{2},...phie0_{pe0-1},phie1_{2},...phie1_{pe1-1}...] + // faceBasis=[phif0_{2,2},...,phif0_{2,pF0_2},...,phif0_{pF0_1,2},...,phief0_{pF0_1,pF0_2},phif1_{2,2}...}] + // bubbleBasis=[phieb_{2,2,2},...,phieb_{2,,2,pb3},phieb_{2,3,2},...,phieb_{2,3,pe3},...}] + virtual void generateBasis(double const &u, double const &v, double const &w, + std::vector<double> &vertexBasis, + std::vector<double> &edgeBasis, + std::vector<double> &faceBasis, + std::vector<double> &bubbleBasis); + virtual void generateBasis(double const &u, double const &v, double const &w, + std::vector<std::vector<double> > &vertexBasis, + std::vector<std::vector<double> > &edgeBasis, + std::vector<std::vector<double> > &faceBasis, + std::vector<std::vector<double> > &bubbleBasis, + std::string typeFunction = "GradH1Legendre") + { + generateGradientBasis(u, v, w, vertexBasis, edgeBasis, faceBasis, + bubbleBasis); + } + + virtual void orientEdge(int const &flagOrientation, int const &edgeNumber, + std::vector<double> &edgeBasis); + virtual void orientEdge(int const &flagOrientation, int const &edgeNumber, + std::vector<std::vector<double> > &edgeBasis); + + virtual void orientFace(double const &u, double const &v, double const &w, + int const &flag1, int const &flag2, int const &flag3, + int const &faceNumber, + std::vector<double> &faceBasis); + virtual void orientFace(double const &u, double const &v, double const &w, + int const &flag1, int const &flag2, int const &flag3, + int const &faceNumber, + std::vector<std::vector<double> > &faceBasis, + std::string typeFunction = "GradH1Legendre"); + +private: + int _pb1; // bubble function order in direction u + int _pb2; // bubble function order in direction v + int _pb3; // bubble function order in direction w + int _pOrderEdge[12]; // Edge functions order (pOrderEdge[0] matches the order + // of the edge 0) + int _pOrderFace1[6]; // Face functions order in direction u (pOrderFace1[0] + // matches the order of face 0 in direction u) + int _pOrderFace2[6]; // Face functions order in direction v (pOrderFace[0] + // matches the order of face 0 in direction v) + static double + _affineCoordinate(const int &j, const double &u, const double &v, + const double &w); // affine coordinate lambdaj j=1..6 + inline void _someProduct(double const &u, double const &v, double const &w, + std::vector<double> &product, + std::vector<double> &lambda); // compute some product + inline void + _someProductGrad(double const &u, double const &v, double const &w, + std::vector<double> &product, + std::vector<std::vector<double> > &gradientProduct, + std::vector<double> &lambda, + std::vector<std::vector<double> > + &gradientLambda); // compute some product and fill the + // vector gradientVertex + void generateGradientBasis(double const &u, double const &v, double const &w, + std::vector<std::vector<double> > &gradientVertex, + std::vector<std::vector<double> > &gradientEdge, + std::vector<std::vector<double> > &gradientFace, + std::vector<std::vector<double> > &gradientBubble); +}; +#endif diff --git a/Numeric/HierarchicalBasisH1Line.cpp b/Numeric/HierarchicalBasisH1Line.cpp new file mode 100644 index 0000000000000000000000000000000000000000..bb9537dd7b299ffcf84dadb538953a56ee3d42b8 --- /dev/null +++ b/Numeric/HierarchicalBasisH1Line.cpp @@ -0,0 +1,96 @@ +// Gmsh - Copyright (C) 1997-2019 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. +// +// Contributed by Ismail Badia. +// Reference : "Higher-Order Finite Element Methods"; Pavel Solin, Karel +// Segeth , +// Ivo Dolezel , Chapman and Hall/CRC; Edition : Har/Cdr (2003). + +#include "HierarchicalBasisH1Line.h" + +HierarchicalBasisH1Line::HierarchicalBasisH1Line(int pe) +{ + _nvertex = 2; + _nedge = 1; + _nfaceTri = 0; + _nfaceQuad = 0; + _nVertexFunction = 2; + _nEdgeFunction = (pe - 1); + _nQuadFaceFunction = 0; + _nTriFaceFunction = 0; + _nBubbleFunction = 0; + _pe = pe; +} + +HierarchicalBasisH1Line::~HierarchicalBasisH1Line() {} + +double HierarchicalBasisH1Line::_affineCoordinate(int j, double u) +{ + switch(j) { + case(1): return 0.5 * (1 + u); + case(2): return 0.5 * (1 - u); + default: throw std::string("j must be : 1<=j<=2"); + } +} + +void HierarchicalBasisH1Line::generateBasis(double const &u, double const &v, + double const &w, + std::vector<double> &vertexBasis, + std::vector<double> &edgeBasis, + std::vector<double> &faceBasis, + std::vector<double> &bubbleBasis) +{ + double lambda1 = _affineCoordinate(1, u); + double lambda2 = _affineCoordinate(2, u); + double product = lambda1 * lambda2; + double substraction = lambda1 - lambda2; + // vertex shape functions: + vertexBasis[0] = lambda2; + vertexBasis[1] = lambda1; + // edge functions : + for(int k = 2; k <= _pe; k++) { + edgeBasis[k - 2] = + product * OrthogonalPoly::EvalKernelFunction(k - 2, substraction); + } +} + +void HierarchicalBasisH1Line::generateGradientBasis( + double const &u, double const &v, double const &w, + std::vector<std::vector<double> > &gradientVertex, + std::vector<std::vector<double> > &gradientEdge, + std::vector<std::vector<double> > &gradientFace, + std::vector<std::vector<double> > &gradientBubble) +{ + double dlambda1 = 0.5; + double dlambda2 = -0.5; + // vertex gradient functions: + gradientVertex[0][0] = dlambda2; + gradientVertex[1][0] = dlambda1; + for(int k = 2; k <= _pe; k++) { + gradientEdge[k - 2][0] = OrthogonalPoly::EvalDLobatto(k, u); + } +} + +void HierarchicalBasisH1Line::orientEdge(int const &flagOrientation, + int const &edgeNumber, + std::vector<double> &edgeBasis) +{ + if(flagOrientation == -1) { + for(int k = 0; k <= _pe - 2; k++) { + if(k % 2 != 0) { edgeBasis[k] = edgeBasis[k] * (-1); } + } + } +} + +void HierarchicalBasisH1Line::orientEdge( + int const &flagOrientation, int const &edgeNumber, + std::vector<std::vector<double> > &gradientEdge) +{ + if(flagOrientation == -1) { + for(int k = 0; k <= _pe - 2; k++) { + if(k % 2 != 0) { gradientEdge[k][0] = gradientEdge[k][0] * (-1); } + } + } +} diff --git a/Numeric/HierarchicalBasisH1Line.h b/Numeric/HierarchicalBasisH1Line.h new file mode 100644 index 0000000000000000000000000000000000000000..2db7d0a894650ff5c943e30162a5ede122b58a3e --- /dev/null +++ b/Numeric/HierarchicalBasisH1Line.h @@ -0,0 +1,83 @@ +// Gmsh - Copyright (C) 1997-2019 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. +// +// Contributed by Ismail Badia. +// Reference : "Higher-Order Finite Element Methods"; Pavel Solin, Karel +// Segeth , +// Ivo Dolezel , Chapman and Hall/CRC; Edition : Har/Cdr (2003). + +#ifndef HIERARCHICAL_BASIS_H1_LINE_H +#define HIERARCHICAL_BASIS_H1_LINE_H + +#include <algorithm> +#include <vector> + +#include "HierarchicalBasisH1.h" +/* + * + * + * + * | + * 0 | 1 + * --+------+-----+---> u + * + * + * + * + * + * + * + */ +class HierarchicalBasisH1Line : public HierarchicalBasisH1 { +public: + HierarchicalBasisH1Line(int pe); + virtual ~HierarchicalBasisH1Line(); + // vertexBasis=[v0,v1] + // edgeBasis=[phie_{2},...,phie_{pe}] + virtual void generateBasis(double const &u, double const &v, double const &w, + std::vector<double> &vertexBasis, + std::vector<double> &edgeBasis, + std::vector<double> &faceBasis, + std::vector<double> &bubbleBasis); + virtual void generateBasis(double const &u, double const &v, double const &w, + std::vector<std::vector<double> > &vertexBasis, + std::vector<std::vector<double> > &edgeBasis, + std::vector<std::vector<double> > &faceBasis, + std::vector<std::vector<double> > &bubbleBasis, + std::string typeFunction = "GradH1Legendre") + { + generateGradientBasis(u, v, w, vertexBasis, edgeBasis, faceBasis, + bubbleBasis); + } + + virtual void orientEdge(int const &flagOrientation, int const &edgeNumber, + std::vector<double> &edgeBasis); + virtual void orientEdge(int const &flagOrientation, int const &edgeNumber, + std::vector<std::vector<double> > &edgeBasis); + + virtual void orientFace(double const &u, double const &v, double const &w, + int const &flag1, int const &flag2, int const &flag3, + int const &faceNumber, + std::vector<double> &faceBasis){}; + + virtual void orientFace(double const &u, double const &v, double const &w, + int const &flag1, int const &flag2, int const &flag3, + int const &faceNumber, + std::vector<std::vector<double> > &faceBasis, + std::string typeFunction = "GradH1Legendre"){}; + +private: + int _pe; // edge function order in direction u + static double + _affineCoordinate(int j, + double u); // affine coordinate lambdaj j={1,2} + void generateGradientBasis(double const &u, double const &v, double const &w, + std::vector<std::vector<double> > &gradientVertex, + std::vector<std::vector<double> > &gradientEdge, + std::vector<std::vector<double> > &gradientFace, + std::vector<std::vector<double> > &gradientBubble); +}; + +#endif diff --git a/Numeric/HierarchicalBasisH1Pri.cpp b/Numeric/HierarchicalBasisH1Pri.cpp new file mode 100644 index 0000000000000000000000000000000000000000..7346c41cc7c01bc1c4ff08e6b5609c4440c83583 --- /dev/null +++ b/Numeric/HierarchicalBasisH1Pri.cpp @@ -0,0 +1,957 @@ +// Gmsh - Copyright (C) 1997-2019 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. +// +// Contributed by Ismail Badia. +// Reference : "Higher-Order Finite Element Methods"; Pavel Solin, Karel +// Segeth , +// Ivo Dolezel , Chapman and Hall/CRC; Edition : Har/Cdr (2003). +#include "HierarchicalBasisH1Pri.h" +HierarchicalBasisH1Pri::HierarchicalBasisH1Pri(int order) +{ + _nvertex = 6; + _nedge = 9; + if(order < 3) { _nfaceTri = 0; } + else { + _nfaceTri = 2; + } + _nfaceQuad = 3; + _nVertexFunction = 6; + _nEdgeFunction = 9 * order - 9; + _nQuadFaceFunction = 3 * (order - 1) * (order - 1); + _nTriFaceFunction = (order - 2) * (order - 1); + _nBubbleFunction = (order - 1) * (order - 2) * (order - 1) / 2; + _pb1 = order; + _pb2 = order; + for(int i = 0; i < 3; i++) { + _pOrderQuadFace1[i] = order; + _pOrderQuadFace2[i] = order; + } + for(int i = 0; i < 2; i++) { _pOrderTriFace[i] = order; } + for(int i = 0; i < 9; i++) { _pOrderEdge[i] = order; } +} + +HierarchicalBasisH1Pri::~HierarchicalBasisH1Pri() {} + +double HierarchicalBasisH1Pri::_affineCoordinate(const int &j, const double &u, + const double &v, + const double &w) +{ + switch(j) { + case(1): return 0.5 * (1 + v); + case(2): return -0.5 * (u + v); + case(3): return 0.5 * (1 + u); + case(4): return 0.5 * (1 + w); + case(5): return 0.5 * (1 - w); + default: throw std::string("j must be : 1<=j<=5"); + } +} +void HierarchicalBasisH1Pri::generateBasis(double const &u, double const &v, + double const &w, + std::vector<double> &vertexBasis, + std::vector<double> &edgeBasis, + std::vector<double> &faceBasis, + std::vector<double> &bubbleBasis) +{ + //*** + // to map onto the reference domain of gmsh: + double uc = 2 * u - 1; + double vc = 2 * v - 1; + double wc = w; + //***** + double lambda1 = _affineCoordinate(1, uc, vc, wc); + double lambda2 = _affineCoordinate(2, uc, vc, wc); + double lambda3 = _affineCoordinate(3, uc, vc, wc); + double lambda4 = _affineCoordinate(4, uc, vc, wc); + double lambda5 = _affineCoordinate(5, uc, vc, wc); + // vertex shape functions: + vertexBasis[0] = lambda2 * lambda5; + vertexBasis[1] = lambda3 * lambda5; + vertexBasis[2] = lambda1 * lambda5; + vertexBasis[3] = lambda2 * lambda4; + vertexBasis[4] = lambda4 * lambda3; + vertexBasis[5] = lambda1 * lambda4; + // compute the terms to assemble + std::vector<double> product(_nedge); + product[0] = vertexBasis[0] * lambda3; + product[1] = vertexBasis[0] * lambda1; + product[2] = vertexBasis[0] * lambda4; + product[3] = vertexBasis[1] * lambda1; + product[4] = vertexBasis[1] * lambda4; + product[5] = vertexBasis[2] * lambda4; + product[6] = vertexBasis[3] * lambda3; + product[7] = vertexBasis[3] * lambda1; + product[8] = vertexBasis[4] * lambda1; + std::vector<double> substraction(5); + substraction[0] = lambda3 - lambda2; + substraction[1] = lambda1 - lambda2; + substraction[2] = lambda4 - lambda5; + substraction[3] = lambda1 - lambda3; + substraction[4] = lambda2 - lambda1; + std::vector<std::vector<double> > phi(5); + phi[0] = std::vector<double>(std::max( + std::max(std::max(std::max(std::max(_pOrderEdge[0] - 1, _pOrderEdge[6] - 1), + _pOrderQuadFace1[0] - 1), + _pOrderTriFace[0] - 2), + _pOrderTriFace[1] - 2), + _pb1 - 2)); + phi[1] = std::vector<double>(std::max( + std::max(_pOrderEdge[1] - 1, _pOrderEdge[7] - 1), _pOrderQuadFace1[1] - 1)); + phi[2] = std::vector<double>(std::max( + std::max(std::max(std::max(std::max(_pOrderEdge[2] - 1, _pOrderEdge[4] - 1), + _pOrderEdge[5] - 1), + _pOrderQuadFace2[0] - 1), + _pOrderQuadFace2[1] - 1), + _pOrderQuadFace2[2] - 1)); + + phi[3] = std::vector<double>(std::max( + std::max(_pOrderEdge[8] - 1, _pOrderEdge[3] - 1), _pOrderQuadFace1[2] - 1)); + phi[4] = std::vector<double>(std::max( + std::max(std::max(_pOrderTriFace[1] - 2, _pb1 - 2), _pOrderTriFace[0] - 2), + 0)); + for(int i = 0; i < 5; i++) { + for(unsigned int j = 0; j < phi[i].size(); j++) { + phi[i][j] = OrthogonalPoly::EvalKernelFunction(j, substraction[i]); + } + } + // edge shape functions: + int indexEdgeBasis = 0; + for(int iEdge = 0; iEdge < _nedge; iEdge++) { + int numPhi = 0; + switch(iEdge) { + case(0): + case(6): numPhi = 0; break; + case(1): + case(7): numPhi = 1; break; + case(2): + case(4): + case(5): numPhi = 2; break; + case(3): + case(8): numPhi = 3; break; + } + for(int indexEdgeFunc = 0; indexEdgeFunc < _pOrderEdge[iEdge] - 1; + indexEdgeFunc++) { + edgeBasis[indexEdgeBasis] = product[iEdge] * phi[numPhi][indexEdgeFunc]; + + indexEdgeBasis++; + } + } + // face shape functions: + int indexFaceFunction = 0; + for(int iFace = 0; iFace < _nfaceQuad + _nfaceTri; iFace++) { + int indexPhi1 = 0; + int indexPhi2 = 0; + double lambdaProduct = 0; + switch(iFace) { + case(3): + indexPhi1 = 0; + indexPhi2 = 4; + lambdaProduct = product[0] * lambda1; + break; + case(4): + indexPhi1 = 0; + indexPhi2 = 4; + lambdaProduct = product[7] * lambda3; + break; + case(0): + indexPhi1 = 0; + indexPhi2 = 2; + lambdaProduct = product[0] * lambda4; + break; + case(1): + indexPhi1 = 1; + indexPhi2 = 2; + lambdaProduct = product[7] * lambda5; + break; + case(2): + indexPhi1 = 3; + indexPhi2 = 2; + lambdaProduct = product[8] * lambda5; + break; + } + if(iFace < 3) { + for(int n1 = 0; n1 < _pOrderQuadFace1[iFace] - 1; n1++) { + for(int n2 = 0; n2 < _pOrderQuadFace2[iFace] - 1; n2++) { + faceBasis[indexFaceFunction] = + lambdaProduct * phi[indexPhi1][n1] * phi[indexPhi2][n2]; + indexFaceFunction++; + } + } + } + else { + for(int n1 = 0; n1 < _pOrderTriFace[iFace - 3] - 2; n1++) { + for(int n2 = 0; n2 < _pOrderTriFace[iFace - 3] - 2 - n1; n2++) { + faceBasis[indexFaceFunction] = + lambdaProduct * phi[indexPhi1][n1] * phi[indexPhi2][n2]; + indexFaceFunction++; + } + } + } + } + // bubble shape functions: + int indexBubbleBasis = 0; + double lambdaProductBubble = lambda1 * lambda2 * lambda3; + for(int n1 = 0; n1 < _pb1 - 2; n1++) { + for(int n2 = 0; n2 < _pb1 - 2 - n1; n2++) { + for(int n3 = 2; n3 <= _pb2; n3++) { + bubbleBasis[indexBubbleBasis] = lambdaProductBubble * phi[0][n1] * + phi[4][n2] * + OrthogonalPoly::EvalLobatto(n3, w); + indexBubbleBasis++; + } + } + } +} +void HierarchicalBasisH1Pri::generateGradientBasis( + double const &u, double const &v, double const &w, + std::vector<std::vector<double> > &gradientVertex, + std::vector<std::vector<double> > &gradientEdge, + std::vector<std::vector<double> > &gradientFace, + std::vector<std::vector<double> > &gradientBubble) +{ + // to map onto the reference domain of gmsh: + // **** + double uc = 2 * u - 1; + double vc = 2 * v - 1; + double wc = w; + // jacobian=((2,0,0),(0,2,0),(0,0,1)) + //******* + double lambda1 = _affineCoordinate(1, uc, vc, wc); + double lambda2 = _affineCoordinate(2, uc, vc, wc); + double lambda3 = _affineCoordinate(3, uc, vc, wc); + double lambda4 = _affineCoordinate(4, uc, vc, wc); + double lambda5 = _affineCoordinate(5, uc, vc, wc); + // gradient: + std::vector<double> dlambda1(3, 0); + std::vector<double> dlambda2(3, 0); + std::vector<double> dlambda3(3, 0); + std::vector<double> dlambda4(3, 0); + std::vector<double> dlambda5(3, 0); + dlambda1[1] = 1; // * jacob + dlambda2[0] = -1; + dlambda2[1] = -1; + dlambda3[0] = 1; + dlambda4[2] = 0.5; + dlambda5[2] = -0.5; + for(int i = 0; i < 3; i++) { + gradientVertex[0][i] = lambda5 * dlambda2[i] + dlambda5[i] * lambda2; + gradientVertex[1][i] = lambda5 * dlambda3[i] + dlambda5[i] * lambda3; + gradientVertex[2][i] = lambda5 * dlambda1[i] + dlambda5[i] * lambda1; + gradientVertex[3][i] = lambda2 * dlambda4[i] + dlambda2[i] * lambda4; + gradientVertex[4][i] = lambda4 * dlambda3[i] + dlambda4[i] * lambda3; + gradientVertex[5][i] = lambda1 * dlambda4[i] + dlambda1[i] * lambda4; + } + // compute the terms to assemble + std::vector<double> substraction(5); + substraction[0] = lambda3 - lambda2; + substraction[1] = lambda1 - lambda2; + substraction[2] = lambda4 - lambda5; + substraction[3] = lambda1 - lambda3; + substraction[4] = lambda2 - lambda1; + std::vector<std::vector<double> > dsubstraction( + 5, std::vector<double>(3, 0)); // = dsubstraction*jacob + for(int i = 0; i < 3; i++) { + dsubstraction[0][i] = dlambda3[i] - dlambda2[i]; + dsubstraction[1][i] = dlambda1[i] - dlambda2[i]; + dsubstraction[2][i] = dlambda4[i] - dlambda5[i]; + dsubstraction[3][i] = dlambda1[i] - dlambda3[i]; + dsubstraction[4][i] = dlambda2[i] - dlambda1[i]; + } + std::vector<std::vector<double> > phi(5); + std::vector<std::vector<double> > dphi(5); + phi[0] = std::vector<double>(std::max( + std::max(std::max(std::max(std::max(_pOrderEdge[0] - 1, _pOrderEdge[6] - 1), + _pOrderQuadFace1[0] - 1), + _pOrderTriFace[0] - 2), + _pOrderTriFace[1] - 2), + _pb1 - 2)); + phi[1] = std::vector<double>(std::max( + std::max(_pOrderEdge[1] - 1, _pOrderEdge[7] - 1), _pOrderQuadFace1[1] - 1)); + phi[2] = std::vector<double>(std::max( + std::max(std::max(std::max(std::max(_pOrderEdge[2] - 1, _pOrderEdge[4] - 1), + _pOrderEdge[5] - 1), + _pOrderQuadFace2[0] - 1), + _pOrderQuadFace2[1] - 1), + _pOrderQuadFace2[2] - 1)); + + phi[3] = std::vector<double>(std::max( + std::max(_pOrderEdge[8] - 1, _pOrderEdge[3] - 1), _pOrderQuadFace1[2] - 1)); + phi[4] = std::vector<double>(std::max( + std::max(std::max(_pOrderTriFace[1] - 2, _pb1 - 2), _pOrderTriFace[0] - 2), + 0)); + dphi[0] = std::vector<double>(std::max( + std::max(std::max(std::max(std::max(_pOrderEdge[0] - 1, _pOrderEdge[6] - 1), + _pOrderQuadFace1[0] - 1), + _pOrderTriFace[0] - 2), + _pOrderTriFace[1] - 2), + _pb1 - 2)); + dphi[1] = std::vector<double>(std::max( + std::max(_pOrderEdge[1] - 1, _pOrderEdge[7] - 1), _pOrderQuadFace1[1] - 1)); + dphi[2] = std::vector<double>(std::max( + std::max(std::max(std::max(std::max(_pOrderEdge[2] - 1, _pOrderEdge[4] - 1), + _pOrderEdge[5] - 1), + _pOrderQuadFace2[0] - 1), + _pOrderQuadFace2[1] - 1), + _pOrderQuadFace2[2] - 1)); + + dphi[3] = std::vector<double>(std::max( + std::max(_pOrderEdge[8] - 1, _pOrderEdge[3] - 1), _pOrderQuadFace1[2] - 1)); + dphi[4] = std::vector<double>(std::max( + std::max(std::max(_pOrderTriFace[1] - 2, _pb1 - 2), _pOrderTriFace[0] - 2), + 0)); + for(int i = 0; i < 5; i++) { + for(unsigned int j = 0; j < phi[i].size(); j++) { + phi[i][j] = OrthogonalPoly::EvalKernelFunction(j, substraction[i]); + dphi[i][j] = OrthogonalPoly::EvalDKernelFunction(j, substraction[i]); + } + } + std::vector<double> product1(6); + product1[0] = lambda2 * lambda5; + product1[1] = lambda3 * lambda5; + product1[2] = lambda1 * lambda5; + product1[3] = lambda2 * lambda4; + product1[4] = lambda4 * lambda3; + product1[5] = lambda1 * lambda4; + std::vector<double> productEdgeTerm(_nedge); + productEdgeTerm[0] = product1[0] * lambda3; + productEdgeTerm[1] = product1[0] * lambda1; + productEdgeTerm[2] = product1[0] * lambda4; + productEdgeTerm[3] = product1[1] * lambda1; + productEdgeTerm[4] = product1[1] * lambda4; + productEdgeTerm[5] = product1[2] * lambda4; + productEdgeTerm[6] = product1[3] * lambda3; + productEdgeTerm[7] = product1[3] * lambda1; + productEdgeTerm[8] = product1[4] * lambda1; + std::vector<std::vector<double> > dproductEdgeTerm(_nedge, + std::vector<double>(3)); + for(int i = 0; i < 3; i++) { + dproductEdgeTerm[0][i] = + gradientVertex[0][i] * lambda3 + dlambda3[i] * product1[0]; + dproductEdgeTerm[1][i] = + gradientVertex[0][i] * lambda1 + dlambda1[i] * product1[0]; + dproductEdgeTerm[2][i] = + gradientVertex[0][i] * lambda4 + dlambda4[i] * product1[0]; + dproductEdgeTerm[3][i] = + gradientVertex[1][i] * lambda1 + dlambda1[i] * product1[1]; + dproductEdgeTerm[4][i] = + gradientVertex[1][i] * lambda4 + dlambda4[i] * product1[1]; + dproductEdgeTerm[5][i] = + gradientVertex[2][i] * lambda4 + dlambda4[i] * product1[2]; + dproductEdgeTerm[6][i] = + gradientVertex[3][i] * lambda3 + dlambda3[i] * product1[3]; + dproductEdgeTerm[7][i] = + gradientVertex[3][i] * lambda1 + dlambda1[i] * product1[3]; + dproductEdgeTerm[8][i] = + gradientVertex[4][i] * lambda1 + dlambda1[i] * product1[4]; + } + + // edge shape functions: + int indexEdgeBasis = 0; + for(int iEdge = 0; iEdge < _nedge; iEdge++) { + int numPhi = 0; + switch(iEdge) { + case(0): + case(6): numPhi = 0; break; + case(1): + case(7): numPhi = 1; break; + case(2): + case(4): + case(5): numPhi = 2; break; + case(3): + case(8): numPhi = 3; break; + } + + for(int indexEdgeFunc = 0; indexEdgeFunc < _pOrderEdge[iEdge] - 1; + indexEdgeFunc++) { + for(int i = 0; i < 3; i++) { + gradientEdge[indexEdgeBasis][i] = + dproductEdgeTerm[iEdge][i] * phi[numPhi][indexEdgeFunc] + + dsubstraction[numPhi][i] * productEdgeTerm[iEdge] * + dphi[numPhi][indexEdgeFunc]; + } + + indexEdgeBasis++; + } + } + // face shape functions: + int indexFaceFunction = 0; + for(int iFace = 0; iFace < _nfaceQuad + _nfaceTri; iFace++) { + int indexPhi1 = 0; + int indexPhi2 = 0; + double productFaceTerm = 0; + std::vector<double> dproductFaceTerm(3, 0); + switch(iFace) { + case(3): + indexPhi1 = 0; + indexPhi2 = 4; + productFaceTerm = productEdgeTerm[0] * lambda1; + for(int i = 0; i < 3; i++) { + dproductFaceTerm[i] = + dproductEdgeTerm[0][i] * lambda1 + productEdgeTerm[0] * dlambda1[i]; + } + break; + case(4): + indexPhi1 = 0; + indexPhi2 = 4; + productFaceTerm = productEdgeTerm[7] * lambda3; + for(int i = 0; i < 3; i++) { + dproductFaceTerm[i] = + dproductEdgeTerm[7][i] * lambda3 + productEdgeTerm[7] * dlambda3[i]; + } + break; + case(0): + indexPhi1 = 0; + indexPhi2 = 2; + productFaceTerm = productEdgeTerm[0] * lambda4; + for(int i = 0; i < 3; i++) { + dproductFaceTerm[i] = + dproductEdgeTerm[0][i] * lambda4 + productEdgeTerm[0] * dlambda4[i]; + } + break; + case(1): + indexPhi1 = 1; + indexPhi2 = 2; + productFaceTerm = productEdgeTerm[7] * lambda5; + for(int i = 0; i < 3; i++) { + dproductFaceTerm[i] = + dproductEdgeTerm[7][i] * lambda5 + productEdgeTerm[7] * dlambda5[i]; + } + break; + case(2): + indexPhi1 = 3; + indexPhi2 = 2; + productFaceTerm = productEdgeTerm[8] * lambda5; + for(int i = 0; i < 3; i++) { + dproductFaceTerm[i] = + dproductEdgeTerm[8][i] * lambda5 + productEdgeTerm[8] * dlambda5[i]; + } + break; + } + if(iFace < 3) { + for(int n1 = 0; n1 < _pOrderQuadFace1[iFace] - 1; n1++) { + for(int n2 = 0; n2 < _pOrderQuadFace2[iFace] - 1; n2++) { + for(int i = 0; i < 3; i++) { + gradientFace[indexFaceFunction][i] = + dproductFaceTerm[i] * phi[indexPhi1][n1] * phi[indexPhi2][n2] + + productFaceTerm * dsubstraction[indexPhi1][i] * + dphi[indexPhi1][n1] * phi[indexPhi2][n2] + + productFaceTerm * dsubstraction[indexPhi2][i] * + phi[indexPhi1][n1] * dphi[indexPhi2][n2]; + } + indexFaceFunction++; + } + } + } + else { + for(int n1 = 0; n1 < _pOrderTriFace[iFace - 3] - 2; n1++) { + for(int n2 = 0; n2 < _pOrderTriFace[iFace - 3] - 2 - n1; n2++) { + for(int i = 0; i < 3; i++) { + gradientFace[indexFaceFunction][i] = + dproductFaceTerm[i] * phi[indexPhi1][n1] * phi[indexPhi2][n2] + + productFaceTerm * dsubstraction[indexPhi1][i] * + dphi[indexPhi1][n1] * phi[indexPhi2][n2] + + productFaceTerm * dsubstraction[indexPhi2][i] * + phi[indexPhi1][n1] * dphi[indexPhi2][n2]; + } + + indexFaceFunction++; + } + } + } + } + // bubble shape functions: + int indexBubbleBasis = 0; + double lambdaProductBubble = lambda1 * lambda2 * lambda3; + std::vector<double> dlambdaProductBubble(3); + for(int i = 0; i < 3; i++) { + dlambdaProductBubble[i] = dlambda1[i] * lambda2 * lambda3 + + lambda1 * dlambda2[i] * lambda3 + + lambda1 * lambda2 * dlambda3[i]; + } + + for(int n1 = 0; n1 < _pb1 - 2; n1++) { + for(int n2 = 0; n2 < _pb1 - 2 - n1; n2++) { + for(int n3 = 2; n3 <= _pb2; n3++) { + gradientBubble[indexBubbleBasis][0] = + (dlambdaProductBubble[0] * phi[0][n1] * phi[4][n2] + + lambdaProductBubble * dsubstraction[0][0] * dphi[0][n1] * + phi[4][n2] + + lambdaProductBubble * dsubstraction[4][0] * phi[0][n1] * + dphi[4][n2]) * + OrthogonalPoly::EvalLobatto(n3, w); + + gradientBubble[indexBubbleBasis][1] = + (dlambdaProductBubble[1] * phi[0][n1] * phi[4][n2] + + lambdaProductBubble * dsubstraction[0][1] * dphi[0][n1] * + phi[4][n2] + + lambdaProductBubble * dsubstraction[4][1] * phi[0][n1] * + dphi[4][n2]) * + OrthogonalPoly::EvalLobatto(n3, w); + + gradientBubble[indexBubbleBasis][2] = + (dlambdaProductBubble[2] * phi[0][n1] * phi[4][n2] + + lambdaProductBubble * dsubstraction[0][2] * dphi[0][n1] * + phi[4][n2] + + lambdaProductBubble * dsubstraction[4][2] * phi[0][n1] * + dphi[4][n2]) * + OrthogonalPoly::EvalLobatto(n3, w) + + OrthogonalPoly::EvalDLobatto(n3, w) * lambdaProductBubble * + phi[0][n1] * phi[4][n2]; + + indexBubbleBasis++; + } + } + } +} + +void HierarchicalBasisH1Pri::orientEdge(int const &flagOrientation, + int const &edgeNumber, + std::vector<double> &edgeBasis) +{ + if(flagOrientation == -1) { + int constant1 = 0; + int constant2 = 0; + for(int i = 0; i <= edgeNumber; i++) { constant2 += _pOrderEdge[i] - 1; } + constant2 = constant2 - 1; + constant1 = constant2 - _pOrderEdge[edgeNumber] + 2; + for(int k = constant1; k <= constant2; k++) { + if((k - constant1) % 2 != 0) { edgeBasis[k] = edgeBasis[k] * (-1); } + } + } +} +void HierarchicalBasisH1Pri::orientEdge( + int const &flagOrientation, int const &edgeNumber, + std::vector<std::vector<double> > &gradientEdge) +{ + if(flagOrientation == -1) { + int constant1 = 0; + int constant2 = 0; + for(int i = 0; i <= edgeNumber; i++) { constant2 += _pOrderEdge[i] - 1; } + constant2 = constant2 - 1; + constant1 = constant2 - _pOrderEdge[edgeNumber] + 2; + for(int k = constant1; k <= constant2; k++) { + if((k - constant1) % 2 != 0) { + gradientEdge[k][0] = gradientEdge[k][0] * (-1); + gradientEdge[k][1] = gradientEdge[k][1] * (-1); + gradientEdge[k][2] = gradientEdge[k][2] * (-1); + } + } + } +} + +void HierarchicalBasisH1Pri::orientFace(double const &u, double const &v, + double const &w, int const &flag1, + int const &flag2, int const &flag3, + int const &faceNumber, + std::vector<double> &faceBasis) +{ + if(faceNumber < 3) { + if(!(flag1 == 1 && flag2 == 1 && flag3 == 1)) { + int iterator = 0; + for(int i = 0; i < faceNumber; i++) { + iterator += (_pOrderQuadFace1[i] - 1) * (_pOrderQuadFace2[i] - 1); + } + if(flag3 == 1) { + for(int it1 = 2; it1 <= _pOrderQuadFace1[faceNumber]; it1++) { + for(int it2 = 2; it2 <= _pOrderQuadFace2[faceNumber]; it2++) { + int impactFlag1 = 1; + int impactFlag2 = 1; + if(flag1 == -1 && it1 % 2 != 0) { impactFlag1 = -1; } + if(flag2 == -1 && it2 % 2 != 0) { impactFlag2 = -1; } + faceBasis[iterator] = + faceBasis[iterator] * impactFlag1 * impactFlag2; + iterator++; + } + } + } + else { + // to map onto the reference domain of gmsh: + double uc = 2 * u - 1; + double vc = 2 * v - 1; + double wc = w; + //***** + double lambdaProduct = 0; + double var1 = 0; + double var2 = 0; + switch(faceNumber) { + case(0): { + double lambda2 = _affineCoordinate(2, uc, vc, wc); + double lambda3 = _affineCoordinate(3, uc, vc, wc); + double lambda4 = _affineCoordinate(4, uc, vc, wc); + double lambda5 = _affineCoordinate(5, uc, vc, wc); + lambdaProduct = lambda2 * lambda3 * lambda4 * lambda5; + var1 = lambda3 - lambda2; + var2 = lambda4 - lambda5; + + } break; + case(1): { + double lambda1 = _affineCoordinate(1, uc, vc, wc); + double lambda2 = _affineCoordinate(2, uc, vc, wc); + double lambda4 = _affineCoordinate(4, uc, vc, wc); + double lambda5 = _affineCoordinate(5, uc, vc, wc); + lambdaProduct = lambda2 * lambda1 * lambda4 * lambda5; + var1 = lambda1 - lambda2; + var2 = lambda4 - lambda5; + } break; + case(2): { + double lambda1 = _affineCoordinate(1, uc, vc, wc); + double lambda3 = _affineCoordinate(3, uc, vc, wc); + double lambda4 = _affineCoordinate(4, uc, vc, wc); + double lambda5 = _affineCoordinate(5, uc, vc, wc); + lambdaProduct = lambda1 * lambda3 * lambda4 * lambda5; + var1 = lambda1 - lambda3; + var2 = lambda4 - lambda5; + } break; + } + std::vector<double> phi1(_pOrderQuadFace1[faceNumber] - 1); + std::vector<double> phi2(_pOrderQuadFace2[faceNumber] - 1); + for(int it = 0; it <= _pOrderQuadFace1[faceNumber] - 2; it++) { + phi1[it] = OrthogonalPoly::EvalKernelFunction(it, var1); + } + for(int it = 0; it <= _pOrderQuadFace2[faceNumber] - 2; it++) { + phi2[it] = OrthogonalPoly::EvalKernelFunction(it, var2); + } + + for(int it1 = 0; it1 <= _pOrderQuadFace2[faceNumber] - 2; it1++) { + for(int it2 = 0; it2 <= _pOrderQuadFace1[faceNumber] - 2; it2++) { + int impactFlag1 = 1; + int impactFlag2 = 1; + if(flag2 == -1 && it1 % 2 != 0) { impactFlag1 = -1; } + if(flag1 == -1 && it2 % 2 != 0) { impactFlag2 = -1; } + faceBasis[iterator] = + lambdaProduct * phi1[it2] * phi2[it1] * impactFlag1 * impactFlag2; + iterator++; + } + } + } + } + } + else { + int constant = faceNumber - 3; + if(!(flag1 == 0 && flag2 == 1)) { + // to map onto the reference domain of gmsh: + double uc = 2 * u - 1; + double vc = 2 * v - 1; + double wc = w; + //***** + int iterator = (_pOrderQuadFace2[0] - 1) * (_pOrderQuadFace1[0] - 1) + + (_pOrderQuadFace2[1] - 1) * (_pOrderQuadFace1[1] - 1) + + (_pOrderQuadFace2[2] - 1) * (_pOrderQuadFace1[2] - 1); + for(int i = 0; i < constant; i++) { + iterator += int((_pOrderTriFace[i] - 1) * (_pOrderTriFace[i] - 2) / 2); + } + std::vector<double> lambda(3); + double lambdai = 0; + switch(faceNumber) { + case(3): + lambda[0] = _affineCoordinate(2, uc, vc, wc); + lambda[1] = _affineCoordinate(3, uc, vc, wc); + lambda[2] = _affineCoordinate(1, uc, vc, wc); + lambdai = _affineCoordinate(5, uc, vc, wc); + break; + case(4): + lambda[0] = _affineCoordinate(2, uc, vc, wc); + lambda[1] = _affineCoordinate(3, uc, vc, wc); + lambda[2] = _affineCoordinate(1, uc, vc, wc); + lambdai = _affineCoordinate(4, uc, vc, wc); + break; + } + double product = lambda[0] * lambda[1] * lambda[2] * lambdai; + if(flag1 == 1 && flag2 == -1) { + double copy = lambda[0]; + lambda[0] = lambda[1]; + lambda[1] = copy; + } + else if(flag1 == 0 && flag2 == -1) { + double copy = lambda[2]; + lambda[2] = lambda[1]; + lambda[1] = copy; + } + else if(flag1 == 2 && flag2 == -1) { + double copy = lambda[2]; + lambda[2] = lambda[0]; + lambda[0] = copy; + } + else if(flag1 == 1 && flag2 == 1) { + double copy = lambda[0]; + lambda[0] = lambda[1]; + lambda[1] = lambda[2]; + lambda[2] = copy; + } + else if(flag1 == 2 && flag2 == 1) { + double copy = lambda[0]; + lambda[0] = lambda[2]; + lambda[2] = lambda[1]; + lambda[1] = copy; + } + double subs1 = lambda[1] - lambda[0]; + double subs2 = lambda[0] - lambda[2]; + std::vector<double> phiSubs2(_pOrderTriFace[constant] - 2); + for(int it = 0; it < _pOrderTriFace[constant] - 2; it++) { + phiSubs2[it] = OrthogonalPoly::EvalKernelFunction(it, subs2); + } + for(int n1 = 0; n1 < _pOrderTriFace[constant] - 2; n1++) { + double phiSubs1 = OrthogonalPoly::EvalKernelFunction(n1, subs1); + for(int n2 = 0; n2 < _pOrderTriFace[constant] - 2 - n1; n2++) { + faceBasis[iterator] = product * phiSubs1 * phiSubs2[n2]; + iterator++; + } + } + } + } +} + +void HierarchicalBasisH1Pri::orientFace( + double const &u, double const &v, double const &w, int const &flag1, + int const &flag2, int const &flag3, int const &faceNumber, + std::vector<std::vector<double> > &gradientFace, std::string typeFunction) +{ + if(faceNumber < 3) { + if(!(flag1 == 1 && flag2 == 1 && flag3 == 1)) { + int iterator = 0; + for(int i = 0; i < faceNumber; i++) { + iterator += (_pOrderQuadFace1[i] - 1) * (_pOrderQuadFace2[i] - 1); + } + if(flag3 == 1) { + for(int it1 = 2; it1 <= _pOrderQuadFace1[faceNumber]; it1++) { + for(int it2 = 2; it2 <= _pOrderQuadFace2[faceNumber]; it2++) { + int impactFlag1 = 1; + int impactFlag2 = 1; + if(flag1 == -1 && it1 % 2 != 0) { impactFlag1 = -1; } + if(flag2 == -1 && it2 % 2 != 0) { impactFlag2 = -1; } + gradientFace[iterator][0] = + gradientFace[iterator][0] * impactFlag1 * impactFlag2; + gradientFace[iterator][1] = + gradientFace[iterator][1] * impactFlag1 * impactFlag2; + gradientFace[iterator][2] = + gradientFace[iterator][2] * impactFlag1 * impactFlag2; + iterator++; + } + } + } + else { + // to map onto the reference domain of gmsh: + double uc = 2 * u - 1; + double vc = 2 * v - 1; + double wc = w; + //***** + double lambdaProduct = 0; + std::vector<double> dlambdaProduct(3, 0); + double var1 = 0; + std::vector<double> dvar1(3, 0); + double var2 = 0; + std::vector<double> dvar2(3, 0); + switch(faceNumber) { + case(0): { + double lambda2 = _affineCoordinate(2, uc, vc, wc); + double lambda3 = _affineCoordinate(3, uc, vc, wc); + double lambda4 = _affineCoordinate(4, uc, vc, wc); + double lambda5 = _affineCoordinate(5, uc, vc, wc); + double lambda45 = lambda4 * lambda5; + double lambda23 = lambda2 * lambda3; + lambdaProduct = lambda23 * lambda45; + var1 = lambda3 - lambda2; + var2 = lambda4 - lambda5; + dlambdaProduct[0] = -lambda45 * var1; + dlambdaProduct[1] = -lambda45 * lambda3; + dlambdaProduct[2] = -0.5 * lambda23 * var2; + dvar1[0] = 2; + dvar1[1] = 1; + dvar2[2] = 1; + + } break; + case(1): { + double lambda1 = _affineCoordinate(1, uc, vc, wc); + double lambda2 = _affineCoordinate(2, uc, vc, wc); + double lambda4 = _affineCoordinate(4, uc, vc, wc); + double lambda5 = _affineCoordinate(5, uc, vc, wc); + var1 = lambda1 - lambda2; + var2 = lambda4 - lambda5; + double lambda45 = lambda4 * lambda5; + double lambda21 = lambda2 * lambda1; + lambdaProduct = lambda21 * lambda45; + dlambdaProduct[0] = -lambda45 * lambda1; + dlambdaProduct[1] = lambda45 * (lambda2 - lambda1); + dlambdaProduct[2] = -0.5 * lambda21 * var2; + dvar1[0] = 1; + dvar1[1] = 2; + dvar2[2] = 1; + + } break; + case(2): { + double lambda1 = _affineCoordinate(1, uc, vc, wc); + double lambda3 = _affineCoordinate(3, uc, vc, wc); + double lambda4 = _affineCoordinate(4, uc, vc, wc); + double lambda5 = _affineCoordinate(5, uc, vc, wc); + var1 = lambda1 - lambda3; + var2 = lambda4 - lambda5; + double lambda45 = lambda4 * lambda5; + double lambda13 = lambda1 * lambda3; + lambdaProduct = lambda13 * lambda45; + dlambdaProduct[0] = lambda45 * lambda1; + dlambdaProduct[1] = lambda45 * lambda3; + dlambdaProduct[2] = -0.5 * lambda13 * var2; + dvar1[0] = -1; + dvar1[1] = 1; + dvar2[2] = 1; + + } break; + } + std::vector<double> phi1(_pOrderQuadFace1[faceNumber] - 1); + std::vector<double> phi2(_pOrderQuadFace2[faceNumber] - 1); + std::vector<double> dphi1(_pOrderQuadFace1[faceNumber] - 1); + std::vector<double> dphi2(_pOrderQuadFace2[faceNumber] - 1); + for(int it = 0; it <= _pOrderQuadFace1[faceNumber] - 2; it++) { + phi1[it] = OrthogonalPoly::EvalKernelFunction(it, var1); + dphi1[it] = OrthogonalPoly::EvalDKernelFunction(it, var1); + } + for(int it = 0; it <= _pOrderQuadFace2[faceNumber] - 2; it++) { + phi2[it] = OrthogonalPoly::EvalKernelFunction(it, var2); + dphi2[it] = OrthogonalPoly::EvalDKernelFunction(it, var2); + } + + for(int it1 = 0; it1 <= _pOrderQuadFace2[faceNumber] - 2; it1++) { + for(int it2 = 0; it2 <= _pOrderQuadFace1[faceNumber] - 2; it2++) { + int impactFlag1 = 1; + int impactFlag2 = 1; + if(flag2 == -1 && it1 % 2 != 0) { impactFlag1 = -1; } + if(flag1 == -1 && it2 % 2 != 0) { impactFlag2 = -1; } + for(int i = 0; i < 3; i++) { + gradientFace[iterator][i] = + impactFlag1 * impactFlag2 * + (dlambdaProduct[i] * phi1[it2] * phi2[it1] + + lambdaProduct * dvar1[i] * dphi1[it2] * phi2[it1] + + dvar2[i] * lambdaProduct * phi1[it2] * dphi2[it1]); + } + iterator++; + } + } + } + } + } + else { + int constant = faceNumber - 3; + if(!(flag1 == 0 && flag2 == 1)) { + // to map onto the reference domain of gmsh: + double uc = 2 * u - 1; + double vc = 2 * v - 1; + double wc = w; + //***** + int iterator = (_pOrderQuadFace2[0] - 1) * (_pOrderQuadFace1[0] - 1) + + (_pOrderQuadFace2[1] - 1) * (_pOrderQuadFace1[1] - 1) + + (_pOrderQuadFace2[2] - 1) * (_pOrderQuadFace1[2] - 1); + for(int i = 0; i < constant; i++) { + iterator += int((_pOrderTriFace[i] - 1) * (_pOrderTriFace[i] - 2) / 2); + } + std::vector<double> lambda(3); + std::vector<std::vector<double> > dlambda(3, std::vector<double>(3, 0)); + double lambdai = 0; + std::vector<double> dlambdai(3, 0); + switch(faceNumber) { + case(3): + lambda[0] = _affineCoordinate(2, uc, vc, wc); + lambda[1] = _affineCoordinate(3, uc, vc, wc); + lambda[2] = _affineCoordinate(1, uc, vc, wc); + dlambda[0][0] = -1; + dlambda[0][1] = -1; + dlambda[1][0] = 1; + dlambda[2][1] = 1; + lambdai = _affineCoordinate(5, uc, vc, wc); + dlambdai[2] = -0.5; + break; + case(4): + lambda[0] = _affineCoordinate(2, uc, vc, wc); + lambda[1] = _affineCoordinate(3, uc, vc, wc); + lambda[2] = _affineCoordinate(1, uc, vc, wc); + dlambda[0][0] = -1; + dlambda[0][1] = -1; + dlambda[1][0] = 1; + dlambda[2][1] = 1; + lambdai = _affineCoordinate(4, uc, vc, wc); + dlambdai[2] = 0.5; + break; + } + if(flag1 == 1 && flag2 == -1) { + double copy = lambda[0]; + lambda[0] = lambda[1]; + lambda[1] = copy; + std::vector<double> dcopy = dlambda[0]; + dlambda[0] = dlambda[1]; + dlambda[1] = dcopy; + } + else if(flag1 == 0 && flag2 == -1) { + double copy = lambda[2]; + lambda[2] = lambda[1]; + lambda[1] = copy; + std::vector<double> dcopy = dlambda[2]; + dlambda[2] = dlambda[1]; + dlambda[1] = dcopy; + } + else if(flag1 == 2 && flag2 == -1) { + double copy = lambda[2]; + lambda[2] = lambda[0]; + lambda[0] = copy; + std::vector<double> dcopy = dlambda[2]; + dlambda[2] = dlambda[0]; + dlambda[0] = dcopy; + } + else if(flag1 == 1 && flag2 == 1) { + double copy = lambda[0]; + lambda[0] = lambda[1]; + lambda[1] = lambda[2]; + lambda[2] = copy; + std::vector<double> dcopy = dlambda[0]; + dlambda[0] = dlambda[1]; + dlambda[1] = dlambda[2]; + dlambda[2] = dcopy; + } + else if(flag1 == 2 && flag2 == 1) { + double copy = lambda[0]; + lambda[0] = lambda[2]; + lambda[2] = lambda[1]; + lambda[1] = copy; + std::vector<double> dcopy = dlambda[0]; + dlambda[0] = dlambda[2]; + dlambda[2] = dlambda[1]; + dlambda[1] = dcopy; + } + double subs1 = lambda[1] - lambda[0]; + double subs2 = lambda[0] - lambda[2]; + std::vector<double> dsubs1(3, 0); + std::vector<double> dsubs2(3, 0); + for(int i = 0; i < 3; i++) { + dsubs1[i] = dlambda[1][i] - dlambda[0][i]; + dsubs2[i] = dlambda[0][i] - dlambda[2][i]; + } + double product = lambda[0] * lambda[1] * lambda[2] * lambdai; + std::vector<double> dproduct(3, 0); + for(int i = 0; i < 3; i++) { + dproduct[i] = dlambda[0][i] * lambda[1] * lambda[2] * lambdai + + lambda[0] * dlambda[1][i] * lambda[2] * lambdai + + lambda[0] * lambda[1] * dlambda[2][i] * lambdai + + lambda[0] * lambda[1] * lambda[2] * dlambdai[i]; + } + std::vector<double> phiSubs2(_pOrderTriFace[constant] - 2); + std::vector<double> dphiSubs2(_pOrderTriFace[constant] - 2); + for(int it = 0; it < _pOrderTriFace[constant] - 2; it++) { + phiSubs2[it] = OrthogonalPoly::EvalKernelFunction(it, subs2); + dphiSubs2[it] = OrthogonalPoly::EvalDKernelFunction(it, subs2); + } + for(int n1 = 0; n1 < _pOrderTriFace[constant] - 2; n1++) { + double phiSubs1 = OrthogonalPoly::EvalKernelFunction(n1, subs1); + double dphiSubs1 = OrthogonalPoly::EvalDKernelFunction(n1, subs1); + for(int n2 = 0; n2 < _pOrderTriFace[constant] - 2 - n1; n2++) { + for(int i = 0; i < 3; i++) { + gradientFace[iterator][i] = + dproduct[i] * phiSubs1 * phiSubs2[n2] + + product * dphiSubs1 * dsubs1[i] * phiSubs2[n2] + + product * phiSubs1 * dsubs2[i] * dphiSubs2[n2]; + } + + iterator++; + } + } + } + } +} diff --git a/Numeric/HierarchicalBasisH1Pri.h b/Numeric/HierarchicalBasisH1Pri.h new file mode 100644 index 0000000000000000000000000000000000000000..55492c4b61f82c8d4e2fcc2ad496e655fe32568e --- /dev/null +++ b/Numeric/HierarchicalBasisH1Pri.h @@ -0,0 +1,116 @@ +// Gmsh - Copyright (C) 1997-2019 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. +// +// Contributed by Ismail Badia. +// Reference : "Higher-Order Finite Element Methods"; Pavel Solin, Karel +// Segeth , +// Ivo Dolezel , Chapman and Hall/CRC; Edition : Har/Cdr (2003). +#ifndef HIERARCHICAL_BASIS_H1_PRI_H +#define HIERARCHICAL_BASIS_H1_PRI_H +#include <algorithm> +#include "HierarchicalBasisH1.h" + +/** + * MPrism + * + * w + * ^ + * | + * 3 + * ,/|`\ + * ,/ | `\ + * ,/ | `\ + * 4------+------5 + * | | | + * | ,/|`\ | + * | ,/ | `\ | + * |,/ | `\| + * ,| | `\ + * ,/ | 0 | `\ + * u | ,/ `\ | v + * | ,/ `\ | + * |,/ `\| + * 1-------------2 + * + * Oriented Edges: + * e0={0, 1}, e1={0, 2}, e2={0, 3}, e3={1, 2}, e4={1, 4}, + * e5={2, 5}, e6={3, 4}, e7={3, 5}, e8={4, 5} + * + * + * Oriented Surfaces: + * s0={0, 1, 2}, s1={3, 4, 5}, s2={0, 1, 3, 4}, s3={0, 2, 3,5} + * s4={1,2,4,5} + * Local (directional) orders on mesh faces are not allowed to exceed the mini- + * mum of the (appropriate directional) orders of approximation associated with + * the interior of the adjacent elements. Local orders of approximation on mesh + * edges are limited by the minimum of all (appropriate directional) orders cor- + * responding to faces sharing that edge + */ +class HierarchicalBasisH1Pri : public HierarchicalBasisH1 { +public: + HierarchicalBasisH1Pri(int order); + virtual ~HierarchicalBasisH1Pri(); + // vertexBasis=[v0,...,v5] + // edgeBasis=[phie0_{2},...phie0_{pe0-1},phie1_{2},...phie1_{pe1-1}...] + // faceBasis=[\Quad + // Face\phif2_{2,2},...,phif2_{2,pF2_2},...,phif2_{pF2_1,2},...,phief2_{pF2_1,pF2_2},phif3_{2,2}..., + //\TriFace\phif0_{1,1},...,phif0_{1,pF0-2},phif0_{2,1}...,phif0_{2,pF0-3},...,phief0_{pF-2,1},phif1_{1,1}...] + // + // bubbleBasis=[phieb_{1,1,1},...] 1<=n1,n2;n1+n2<=pb1-1; 2<=n3<pb2 + virtual void generateBasis(double const &u, double const &v, double const &w, + std::vector<double> &vertexBasis, + std::vector<double> &edgeBasis, + std::vector<double> &faceBasis, + std::vector<double> &bubbleBasis); + + virtual void generateBasis(double const &u, double const &v, double const &w, + std::vector<std::vector<double> > &vertexBasis, + std::vector<std::vector<double> > &edgeBasis, + std::vector<std::vector<double> > &faceBasis, + std::vector<std::vector<double> > &bubbleBasis, + std::string typeFunction = "GradH1Legendre") + { + generateGradientBasis(u, v, w, vertexBasis, edgeBasis, faceBasis, + bubbleBasis); + } + + virtual void orientEdge(int const &flagOrientation, int const &edgeNumber, + std::vector<double> &edgeBasis); + + virtual void orientEdge(int const &flagOrientation, int const &edgeNumber, + std::vector<std::vector<double> > &edgeBasis); + + virtual void orientFace(double const &u, double const &v, double const &w, + int const &flag1, int const &flag2, int const &flag3, + int const &faceNumber, + std::vector<double> &faceBasis); + virtual void orientFace(double const &u, double const &v, double const &w, + int const &flag1, int const &flag2, int const &flag3, + int const &faceNumber, + std::vector<std::vector<double> > &faceBasis, + std::string typeFunction = "GradH1Legendre"); + +private: + int _pb1; // bubble function order in direction uv + int _pb2; // bubble function order in direction w + int _pOrderEdge[9]; // Edge functions order (pOrderEdge[0] matches the order + // of the edge 0) + int _pOrderQuadFace1[3]; // Quad Face functions order in direction u + // (pOrderFace1[0] matches the order of face 0 in + // direction u) + int _pOrderQuadFace2[3]; // Quad Face functions order in direction v + // (pOrderFace[0] matches the order of face 0 in + // direction v) + int _pOrderTriFace[2]; // Tri Face Functions order + static double + _affineCoordinate(const int &j, const double &u, const double &v, + const double &w); // affine coordinate lambda j=1..5 + void generateGradientBasis(double const &u, double const &v, double const &w, + std::vector<std::vector<double> > &gradientVertex, + std::vector<std::vector<double> > &gradientEdge, + std::vector<std::vector<double> > &gradientFace, + std::vector<std::vector<double> > &gradientBubble); +}; +#endif diff --git a/Numeric/HierarchicalBasisH1Quad.cpp b/Numeric/HierarchicalBasisH1Quad.cpp new file mode 100644 index 0000000000000000000000000000000000000000..f721afaa35a3c717a078e0c003aadb0c8642d412 --- /dev/null +++ b/Numeric/HierarchicalBasisH1Quad.cpp @@ -0,0 +1,541 @@ +// Gmsh - Copyright (C) 1997-2019 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. +// +// Contributed by Ismail Badia. + +#include "HierarchicalBasisH1Quad.h" + +HierarchicalBasisH1Quad::HierarchicalBasisH1Quad(int pf1, int pf2, int pe0, + int pe1, int pe2, int pe3) + +{ + _nvertex = 4; + _nedge = 4; + _nfaceQuad = 1; + _nfaceTri = 0; + _nVertexFunction = 4; + _nEdgeFunction = pe0 + pe1 + pe2 + pe3 - 4; + _nQuadFaceFunction = (pf1 - 1) * (pf2 - 1); + _nTriFaceFunction = 0; + _nBubbleFunction = 0; + _pf1 = pf1; + _pf2 = pf2; + if(pe1 > pf2 || pe3 > pf2) { throw std::string("pe1 and pe3 must be <=pf2"); } + if(pe0 > pf1 || pe2 > pf1) { + throw std::string("pe0 and pe2 must be <=pf1"); + } + _pOrderEdge[0] = pe0; + _pOrderEdge[1] = pe1; + _pOrderEdge[2] = pe2; + _pOrderEdge[3] = pe3; +} +HierarchicalBasisH1Quad::HierarchicalBasisH1Quad(int order) + +{ + _nvertex = 4; + _nedge = 4; + _nfaceQuad = 1; + _nfaceTri = 0; + _nVertexFunction = 4; + _nEdgeFunction = 4 * order - 4; + _nQuadFaceFunction = (order - 1) * (order - 1); + _nTriFaceFunction = 0; + _nBubbleFunction = 0; + _pf1 = order; + _pf2 = order; + _pOrderEdge[0] = order; + _pOrderEdge[1] = order; + _pOrderEdge[2] = order; + _pOrderEdge[3] = order; +} + +HierarchicalBasisH1Quad::~HierarchicalBasisH1Quad() {} + +double HierarchicalBasisH1Quad::_affineCoordinate(int const &j, double const &u, + double const &v) +{ + switch(j) { + case(1): return 0.5 * (1 + u); + case(2): return 0.5 * (1 - u); + case(3): return 0.5 * (1 + v); + case(4): return 0.5 * (1 - v); + default: throw std::string("j must be : 1<=j<=4"); + } +} + +void HierarchicalBasisH1Quad::generateBasis(double const &u, double const &v, + double const &w, + std::vector<double> &vertexBasis, + std::vector<double> &edgeBasis, + std::vector<double> &faceBasis, + std::vector<double> &bubbleBasis) +{ + double lambda1 = _affineCoordinate(1, u, v); + double lambda2 = _affineCoordinate(2, u, v); + double lambda3 = _affineCoordinate(3, u, v); + double lambda4 = _affineCoordinate(4, u, v); + // vertex shape functions: + vertexBasis[0] = lambda2 * lambda4; + vertexBasis[1] = lambda1 * lambda4; + vertexBasis[2] = lambda1 * lambda3; + vertexBasis[3] = lambda2 * lambda3; + // edge 0 & 2 shape functions and a part of face functions (all lk(u)): + int minpe0pe2 = std::min(_pOrderEdge[0], _pOrderEdge[2]); + int const1 = _pOrderEdge[0] + _pOrderEdge[1] - 4; + for(int k = 2; k <= minpe0pe2; k++) { + double lk = OrthogonalPoly::EvalLobatto(k, u); + double phie0 = lambda4 * lk; + double phie2 = lambda3 * lk; + int const2 = k - 2; + edgeBasis[const2] = phie0; + edgeBasis[k + const1] = phie2; + int const3 = _pf2 - 1; + int iterator = 0; + while(iterator < const3) { + int nbr = const2 * const3 + iterator; + faceBasis[nbr] = lk; + iterator++; + } + } + if(_pOrderEdge[0] > minpe0pe2) { + for(int k = minpe0pe2 + 1; k <= _pOrderEdge[0]; k++) { + double lk = OrthogonalPoly::EvalLobatto(k, u); + double phie0 = lambda4 * lk; + int const2 = k - 2; + edgeBasis[const2] = phie0; + int const3 = _pf2 - 1; + int iterator = 0; + while(iterator < const3) { + int nbr = const2 * const3 + iterator; + faceBasis[nbr] = lk; + iterator++; + } + } + } + else { + for(int k = minpe0pe2 + 1; k <= _pOrderEdge[2]; k++) { + double lk = OrthogonalPoly::EvalLobatto(k, u); + double phie2 = lambda3 * lk; + edgeBasis[k + const1] = phie2; + int iterator = 0; + int const3 = _pf2 - 1; + while(iterator < const3) { + int nbr = (k - 2) * const3 + iterator; + faceBasis[nbr] = lk; + iterator++; + } + } + } + int maxpe0pe2 = std::max(_pOrderEdge[0], _pOrderEdge[2]); + for(int k = maxpe0pe2 + 1; k <= _pf1; k++) { + double lk = OrthogonalPoly::EvalLobatto(k, u); + int iterator = 0; + int const3 = _pf2 - 1; + while(iterator < const3) { + int nbr = (k - 2) * const3 + iterator; + faceBasis[nbr] = lk; + iterator++; + } + } + // edge 1 & 3 shape functions and a part of face functions (all lk(v)) : + int minpe1pe3 = std::min(_pOrderEdge[1], _pOrderEdge[3]); + int const3 = _pOrderEdge[0] - 3; + int const4 = _pOrderEdge[0] + _pOrderEdge[1] + _pOrderEdge[2] - 5; + for(int k = 2; k <= minpe1pe3; k++) { + double lk = OrthogonalPoly::EvalLobatto(k, v); + double phie3 = lambda2 * lk; + double phie1 = lambda1 * lk; + edgeBasis[k + const3] = phie1; + edgeBasis[k + const4] = phie3; + int s = k - 2; + int iterator = 1; + while(iterator <= _pf1 - 1) { + faceBasis[s] = faceBasis[s] * lk; + s = s + _pf2 - 1; + iterator++; + } + } + if(_pOrderEdge[1] > minpe1pe3) { + for(int k = minpe1pe3 + 1; k <= _pOrderEdge[1]; k++) { + double lk = OrthogonalPoly::EvalLobatto(k, v); + double phie1 = lambda1 * lk; + edgeBasis[k + const3] = phie1; + int s = k - 2; + int iterator = 1; + while(iterator <= _pf1 - 1) { + faceBasis[s] = faceBasis[s] * lk; + s = s + _pf2 - 1; + iterator++; + } + } + } + else { + for(int k = minpe1pe3 + 1; k <= _pOrderEdge[3]; k++) { + double lk = OrthogonalPoly::EvalLobatto(k, v); + double phie3 = lambda2 * lk; + edgeBasis[k + const4] = phie3; + int s = k - 2; + int iterator = 1; + while(iterator <= _pf1 - 1) { + faceBasis[s] = faceBasis[s] * lk; + s = s + _pf2 - 1; + iterator++; + } + } + } + int maxpe1pe3 = std::max(_pOrderEdge[1], _pOrderEdge[3]); + for(int k = maxpe1pe3 + 1; k <= _pf2; k++) { + double lk = OrthogonalPoly::EvalLobatto(k, v); + int s = k - 2; + int iterator = 1; + while(iterator <= _pf1 - 1) { + faceBasis[s] = faceBasis[s] * lk; + s = s + _pf2 - 1; + iterator++; + } + } +} + +void HierarchicalBasisH1Quad::generateGradientBasis( + double const &u, double const &v, double const &w, + std::vector<std::vector<double> > &gradientVertex, + std::vector<std::vector<double> > &gradientEdge, + std::vector<std::vector<double> > &gradientFace, + std::vector<std::vector<double> > &gradientBubble) +{ + double dlambda1 = 0.5; + double dlambda2 = -0.5; + double dlambda3 = 0.5; + double dlambda4 = -0.5; + double lambda1 = _affineCoordinate(1, u, v); + double lambda2 = _affineCoordinate(2, u, v); + double lambda3 = _affineCoordinate(3, u, v); + double lambda4 = _affineCoordinate(4, u, v); + // vertex gradient functions: + gradientVertex[0][0] = dlambda2 * lambda4; + gradientVertex[0][1] = lambda2 * dlambda4; + gradientVertex[1][0] = dlambda1 * lambda4; + gradientVertex[1][1] = lambda1 * dlambda4; + gradientVertex[2][0] = dlambda1 * lambda3; + gradientVertex[2][1] = lambda1 * dlambda3; + gradientVertex[3][0] = dlambda2 * lambda3; + gradientVertex[3][1] = lambda2 * dlambda3; + // edge 0 & 2 gradient and a part of face gradient ( in the direction u + // ): + int const1 = _pOrderEdge[0] + _pOrderEdge[1] - 4; + int minpe0pe2 = std::min(_pOrderEdge[0], _pOrderEdge[2]); + for(int k = 2; k <= minpe0pe2; k++) { + double lk = OrthogonalPoly::EvalLobatto(k, u); + double dlk = OrthogonalPoly::EvalDLobatto(k, u); + double dphie0U = lambda4 * dlk; + double dphie0V = dlambda4 * lk; + double dphie2U = lambda3 * dlk; + double dphie2V = dlambda3 * lk; + int const2 = k - 2; + int const3 = _pf2 - 1; + gradientEdge[const2][0] = dphie0U; + gradientEdge[const2][1] = dphie0V; + gradientEdge[k + const1][0] = dphie2U; + gradientEdge[k + const1][1] = dphie2V; + int iterator = 0; + while(iterator < const3) { + int nbr = const2 * const3 + iterator; + gradientFace[nbr][0] = dlk; + gradientFace[nbr][1] = lk; + iterator++; + } + } + if(_pOrderEdge[0] > minpe0pe2) { + for(int k = minpe0pe2 + 1; k <= _pOrderEdge[0]; k++) { + double lk = OrthogonalPoly::EvalLobatto(k, u); + double dlk = OrthogonalPoly::EvalDLobatto(k, u); + double dphie0U = lambda4 * dlk; + double dphie0V = dlambda4 * lk; + int const2 = k - 2; + int const3 = _pf2 - 1; + gradientEdge[const2][0] = dphie0U; + gradientEdge[const2][1] = dphie0V; + int iterator = 0; + while(iterator < const3) { + int nbr = const2 * const3 + iterator; + gradientFace[nbr][0] = dlk; + gradientFace[nbr][1] = lk; + iterator++; + } + } + } + else { + for(int k = minpe0pe2 + 1; k <= _pOrderEdge[2]; k++) { + double lk = OrthogonalPoly::EvalLobatto(k, u); + double dlk = OrthogonalPoly::EvalDLobatto(k, u); + double dphie2U = lambda3 * dlk; + double dphie2V = dlambda3 * lk; + gradientEdge[k + const1][0] = dphie2U; + gradientEdge[k + const1][1] = dphie2V; + int const3 = _pf2 - 1; + int iterator = 0; + while(iterator < const3) { + int nbr = (k - 2) * (const3) + iterator; + gradientFace[nbr][0] = dlk; + gradientFace[nbr][1] = lk; + iterator++; + } + } + } + int maxpe0pe2 = std::max(_pOrderEdge[0], _pOrderEdge[2]); + for(int k = maxpe0pe2 + 1; k <= _pf1; k++) { + double lk = OrthogonalPoly::EvalLobatto(k, u); + double dlk = OrthogonalPoly::EvalDLobatto(k, u); + int iterator = 1; + while(iterator < _pf2) { + int nbr = (k - 2) * (_pf2 - 1) + iterator; + gradientFace[nbr][0] = dlk; + gradientFace[nbr][1] = lk; + iterator++; + } + } + + // edge 1 & 3 shape functions and a part of face functions (all lk(v)) : + int minpe1pe3 = std::min(_pOrderEdge[1], _pOrderEdge[3]); + int const3 = _pOrderEdge[0] - 3; + int const4 = _pOrderEdge[0] + _pOrderEdge[1] + _pOrderEdge[2] - 5; + for(int k = 2; k <= minpe1pe3; k++) { + double lk = OrthogonalPoly::EvalLobatto(k, v); + double dlk = OrthogonalPoly::EvalDLobatto(k, v); + double dphie3U = dlambda2 * lk; + double dphie3V = lambda2 * dlk; + double dphie1U = dlambda1 * lk; + double dphie1V = lambda1 * dlk; + gradientEdge[k + const3][0] = dphie1U; + gradientEdge[k + const3][1] = dphie1V; + gradientEdge[k + const4][0] = dphie3U; + gradientEdge[k + const4][1] = dphie3V; + int s = k - 2; + int iterator = 1; + while(iterator <= _pf1 - 1) { + gradientFace[s][0] = gradientFace[s][0] * lk; + gradientFace[s][1] = gradientFace[s][1] * dlk; + s = s + _pf2 - 1; + iterator++; + } + } + if(_pOrderEdge[1] > minpe1pe3) { + for(int k = minpe1pe3 + 1; k <= _pOrderEdge[1]; k++) { + double lk = OrthogonalPoly::EvalLobatto(k, v); + double dlk = OrthogonalPoly::EvalDLobatto(k, v); + double dphie1U = dlambda1 * lk; + double dphie1V = lambda1 * dlk; + gradientEdge[k + const3][0] = dphie1U; + gradientEdge[k + const3][1] = dphie1V; + int s = k - 2; + int iterator = 1; + while(iterator <= _pf1 - 1) { + gradientFace[s][0] = gradientFace[s][0] * lk; + gradientFace[s][1] = gradientFace[s][1] * dlk; + s = s + _pf2 - 1; + iterator++; + } + } + } + else { + for(int k = minpe1pe3 + 1; k <= _pOrderEdge[3]; k++) { + double lk = OrthogonalPoly::EvalLobatto(k, v); + double dlk = OrthogonalPoly::EvalDLobatto(k, v); + double dphie3U = dlambda2 * lk; + double dphie3V = lambda2 * dlk; + gradientEdge[k + const4][0] = dphie3U; + gradientEdge[k + const4][1] = dphie3V; + int s = k - 2; + int iterator = 1; + while(iterator <= _pf1 - 1) { + gradientFace[s][0] = gradientFace[s][0] * lk; + gradientFace[s][1] = gradientFace[s][1] * dlk; + s = s + _pf2 - 1; + iterator++; + } + } + } + int maxpe1pe3 = std::max(_pOrderEdge[1], _pOrderEdge[3]); + for(int k = maxpe1pe3 + 1; k <= _pf2; k++) { + double lk = OrthogonalPoly::EvalLobatto(k, v); + double dlk = OrthogonalPoly::EvalDLobatto(k, v); + int s = k - 2; + int iterator = 1; + while(iterator <= _pf1 - 1) { + gradientFace[s][0] = gradientFace[s][0] * lk; + gradientFace[s][1] = gradientFace[s][1] * dlk; + s = s + _pf2 - 1; + iterator++; + } + } +} + +void HierarchicalBasisH1Quad::orientEdge(int const &flagOrientation, + int const &edgeNumber, + std::vector<double> &edgeBasis) +{ + if(flagOrientation == -1) { + int constant1; + int constant2; + switch(edgeNumber) { + case(0): { + constant1 = 0; + constant2 = _pOrderEdge[0] - 2; + } break; + case(1): { + constant1 = _pOrderEdge[0] - 1; + constant2 = _pOrderEdge[1] + _pOrderEdge[0] - 3; + } break; + case(2): { + constant1 = _pOrderEdge[0] + _pOrderEdge[1] - 2; + constant2 = _pOrderEdge[1] + _pOrderEdge[0] + _pOrderEdge[2] - 4; + } break; + case(3): { + constant1 = _pOrderEdge[0] + _pOrderEdge[1] + _pOrderEdge[2] - 3; + constant2 = + _pOrderEdge[1] + _pOrderEdge[0] + _pOrderEdge[2] + _pOrderEdge[3] - 5; + } break; + default: throw std::string("edgeNumber must be : 0<=edgeNumber<=3"); + } + for(int k = constant1; k <= constant2; k++) { + if((k - constant1) % 2 != 0) { edgeBasis[k] = edgeBasis[k] * (-1); } + } + } +} + +void HierarchicalBasisH1Quad::orientEdge( + int const &flagOrientation, int const &edgeNumber, + std::vector<std::vector<double> > &gradientEdge) +{ + if(flagOrientation == -1) { + int constant1; + int constant2; + switch(edgeNumber) { + case(0): { + constant1 = 0; + constant2 = _pOrderEdge[0] - 2; + } break; + case(1): { + constant1 = _pOrderEdge[0] - 1; + constant2 = _pOrderEdge[1] + _pOrderEdge[0] - 3; + } break; + case(2): { + constant1 = _pOrderEdge[0] + _pOrderEdge[1] - 2; + constant2 = _pOrderEdge[1] + _pOrderEdge[0] + _pOrderEdge[2] - 4; + } break; + case(3): { + constant1 = _pOrderEdge[0] + _pOrderEdge[1] + _pOrderEdge[2] - 3; + constant2 = + _pOrderEdge[1] + _pOrderEdge[0] + _pOrderEdge[2] + _pOrderEdge[3] - 5; + } break; + default: throw std::string("edgeNumber must be : 0<=edgeNumber<=3"); + } + for(int k = constant1; k <= constant2; k++) { + if((k - constant1) % 2 != 0) { + gradientEdge[k][0] = gradientEdge[k][0] * (-1); + gradientEdge[k][1] = gradientEdge[k][1] * (-1); + } + } + } +} + +void HierarchicalBasisH1Quad::orientFace(double const &u, double const &v, + double const &w, int const &flag1, + int const &flag2, int const &flag3, + int const &faceNumber, + std::vector<double> &faceBasis) +{ + if(!(flag1 == 1 && flag2 == 1 && flag3 == 1)) { + int iterator = 0; + if(flag3 == 1) { + for(int it1 = 2; it1 <= _pf1; it1++) { + for(int it2 = 2; it2 <= _pf2; it2++) { + int impactFlag1 = 1; + int impactFlag2 = 1; + if(flag1 == -1 && it1 % 2 != 0) { impactFlag1 = -1; } + if(flag2 == -1 && it2 % 2 != 0) { impactFlag2 = -1; } + faceBasis[iterator] = faceBasis[iterator] * impactFlag1 * impactFlag2; + iterator++; + } + } + } + else { + std::vector<double> lkVector1(_pf2 - 1); + std::vector<double> lkVector2(_pf1 - 1); + for(int it = 2; it <= _pf1; it++) { + lkVector1[it - 2] = OrthogonalPoly::EvalLobatto(it, u); + } + for(int it = 2; it <= _pf2; it++) { + lkVector2[it - 2] = OrthogonalPoly::EvalLobatto(it, v); + } + + for(int it1 = 2; it1 <= _pf2; it1++) { + for(int it2 = 2; it2 <= _pf1; it2++) { + int impactFlag1 = 1; + int impactFlag2 = 1; + if(flag2 == -1 && it1 % 2 != 0) { impactFlag1 = -1; } + if(flag1 == -1 && it2 % 2 != 0) { impactFlag2 = -1; } + faceBasis[iterator] = + lkVector1[it2 - 2] * lkVector2[it1 - 2] * impactFlag1 * impactFlag2; + iterator++; + } + } + } + } +} + +void HierarchicalBasisH1Quad::orientFace( + double const &u, double const &v, double const &w, int const &flag1, + int const &flag2, int const &flag3, int const &faceNumber, + std::vector<std::vector<double> > &gradientFace, std::string typeFunction) +{ + if(!(flag1 == 1 && flag2 == 1 && flag3 == 1)) { + int iterator = 0; + if(flag3 == 1) { + for(int it1 = 2; it1 <= _pf1; it1++) { + for(int it2 = 2; it2 <= _pf2; it2++) { + int impactFlag1 = 1; + int impactFlag2 = 1; + if(flag1 == -1 && it1 % 2 != 0) { impactFlag1 = -1; } + if(flag2 == -1 && it2 % 2 != 0) { impactFlag2 = -1; } + gradientFace[iterator][0] = + gradientFace[iterator][0] * impactFlag1 * impactFlag2; + gradientFace[iterator][1] = + gradientFace[iterator][1] * impactFlag1 * impactFlag2; + + iterator++; + } + } + } + else { + std::vector<double> lkVector1(_pf1 - 1); + std::vector<double> lkVector2(_pf2 - 1); + std::vector<double> dlkVector1(_pf1 - 1); + std::vector<double> dlkVector2(_pf2 - 1); + for(int it = 2; it <= _pf1; it++) { + lkVector1[it - 2] = OrthogonalPoly::EvalLobatto(it, u); + dlkVector1[it - 2] = OrthogonalPoly::EvalDLobatto(it, u); + } + for(int it = 2; it <= _pf2; it++) { + lkVector2[it - 2] = OrthogonalPoly::EvalLobatto(it, v); + dlkVector2[it - 2] = OrthogonalPoly::EvalDLobatto(it, v); + } + for(int it1 = 2; it1 <= _pf2; it1++) { + for(int it2 = 2; it2 <= _pf1; it2++) { + int impactFlag1 = 1; + int impactFlag2 = 1; + if(flag2 == -1 && it1 % 2 != 0) { impactFlag1 = -1; } + if(flag1 == -1 && it2 % 2 != 0) { impactFlag2 = -1; } + + gradientFace[iterator][0] = dlkVector1[it2 - 2] * lkVector2[it1 - 2] * + impactFlag1 * impactFlag2; + gradientFace[iterator][1] = lkVector1[it2 - 2] * dlkVector2[it1 - 2] * + impactFlag1 * impactFlag2; + iterator++; + } + } + } + } +} diff --git a/Numeric/HierarchicalBasisH1Quad.h b/Numeric/HierarchicalBasisH1Quad.h new file mode 100644 index 0000000000000000000000000000000000000000..9b3321ec35cb35d0b7de58dcf77d4488577faa2b --- /dev/null +++ b/Numeric/HierarchicalBasisH1Quad.h @@ -0,0 +1,93 @@ +// Gmsh - Copyright (C) 1997-2019 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. +// +// Contributed by Ismail Badia. +// Reference : "Higher-Order Finite Element Methods"; Pavel Solin, Karel +// Segeth , +// Ivo Dolezel , Chapman and Hall/CRC; Edition : Har/Cdr (2003). + +#ifndef HIERARCHICAL_BASIS_H1_QUAD_H +#define HIERARCHICAL_BASIS_H1_QUAD_H + +#include <algorithm> +#include "HierarchicalBasisH1.h" + +/* + * + * v + * ^ + * |+1 + * ---------->2 + * ^ | ^ + * | | | + * -1| +---- |+1 --> u + * | | + * | | + * 0---------->1 + * -1 + * + * Oriented Edges: + * e0={v0;v1} e1={v1;v2} e2={v3;v2} e3={v0;v3} + * pe3,pe1<=pf2 pe0,pe2<=pf1 + * + */ +class HierarchicalBasisH1Quad : public HierarchicalBasisH1 { +public: + HierarchicalBasisH1Quad(int pf1, int pf2, int pe0, int pe1, int pe2, int pe3); + HierarchicalBasisH1Quad(int order); + virtual ~HierarchicalBasisH1Quad(); + // vertexBasis=[v0,...,v3] + // edgeBasis=[phie0_{2},...phie0_{pe0-1},phie1_{2},...phie1_{pe1-1}...] + // faceBasis=[phief_{2,2},...,phief_{2,pf2},phief_{3,2},...,phief_{3,pf2},...,phief_{pf1,2},...,phief_{pf1,pf2}] + virtual void generateBasis(double const &u, double const &v, double const &w, + std::vector<double> &vertexBasis, + std::vector<double> &edgeBasis, + std::vector<double> &faceBasis, + std::vector<double> &bubbleBasis); + + virtual void generateBasis(double const &u, double const &v, double const &w, + std::vector<std::vector<double> > &vertexBasis, + std::vector<std::vector<double> > &edgeBasis, + std::vector<std::vector<double> > &faceBasis, + std::vector<std::vector<double> > &bubbleBasis, + std::string typeFunction = "GradH1Legendre") + { + generateGradientBasis(u, v, w, vertexBasis, edgeBasis, faceBasis, + bubbleBasis); + } + + virtual void orientEdge(int const &flagOrientation, int const &edgeNumber, + std::vector<double> &edgeBasis); + virtual void orientEdge(int const &flagOrientation, int const &edgeNumber, + std::vector<std::vector<double> > &edgeBasis); + + virtual void orientFace(double const &u, double const &v, double const &w, + int const &flag1, int const &flag2, int const &flag3, + int const &faceNumber, + std::vector<double> &faceBasis); + + virtual void orientFace(double const &u, double const &v, double const &w, + int const &flag1, int const &flag2, int const &flag3, + int const &faceNumber, + std::vector<std::vector<double> > &faceBasis, + std::string typeFunction = "GradH1Legendre"); + +private: + int _pf1; // face function order in direction u + int _pf2; // face function order in direction v + int _pOrderEdge[4]; // Edge functions order (pOrderEdge[0] matches the edge 0 + // order) + static double + _affineCoordinate(int const &j, double const &u, + double const &v); // affine coordinate lambdaj j=1..4 + + void generateGradientBasis(double const &u, double const &v, double const &w, + std::vector<std::vector<double> > &gradientVertex, + std::vector<std::vector<double> > &gradientEdge, + std::vector<std::vector<double> > &gradientFace, + std::vector<std::vector<double> > &gradientBubble); +}; + +#endif diff --git a/Numeric/HierarchicalBasisH1Tetra.cpp b/Numeric/HierarchicalBasisH1Tetra.cpp new file mode 100644 index 0000000000000000000000000000000000000000..bf5f4339a41b55de1a0c8f8d801133abdc3d2c1f --- /dev/null +++ b/Numeric/HierarchicalBasisH1Tetra.cpp @@ -0,0 +1,667 @@ +// Gmsh - Copyright (C) 1997-2019 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. +// +// Contributed by Ismail Badia. +// Reference : "Higher-Order Finite Element Methods"; Pavel Solin, Karel +// Segeth , +// Ivo Dolezel , Chapman and Hall/CRC; Edition : Har/Cdr (2003). + +#include "HierarchicalBasisH1Tetra.h" +HierarchicalBasisH1Tetra::HierarchicalBasisH1Tetra(int order) +{ + _nvertex = 4; + _nedge = 6; + _nfaceTri = 4; + _nfaceQuad = 0; + _nVertexFunction = 4; + _nEdgeFunction = 6 * order - 6; + _nQuadFaceFunction = 0; + _nTriFaceFunction = 2 * (order - 2) * (order - 1); + _nBubbleFunction = (order - 1) * (order - 2) * (order - 3) / 6; + _pb = order; + for(int i = 0; i < 4; i++) { _pOrderFace[i] = order; } + for(int i = 0; i < 6; i++) { _pOrderEdge[i] = order; } +} + +HierarchicalBasisH1Tetra::~HierarchicalBasisH1Tetra() {} + +double HierarchicalBasisH1Tetra::_affineCoordinate(const int &j, + const double &u, + const double &v, + const double &w) +{ + switch(j) { + case(1): return 0.5 * (1 + v); + case(2): return -0.5 * (1 + u + v + w); + case(3): return 0.5 * (1 + u); + case(4): return 0.5 * (1 + w); + default: throw std::string("j must be : 1<=j<=4"); + } +} + +void HierarchicalBasisH1Tetra::generateBasis(double const &u, double const &v, + double const &w, + std::vector<double> &vertexBasis, + std::vector<double> &edgeBasis, + std::vector<double> &faceBasis, + std::vector<double> &bubbleBasis) +{ + //*** + // to map onto the reference domain of gmsh: + double uc = 2 * u - 1; + double vc = 2 * v - 1; + double wc = 2 * w - 1; + //***** + double lambda1 = _affineCoordinate(1, uc, vc, wc); + double lambda2 = _affineCoordinate(2, uc, vc, wc); + double lambda3 = _affineCoordinate(3, uc, vc, wc); + double lambda4 = _affineCoordinate(4, uc, vc, wc); + double prod = lambda1 * lambda2 * lambda3 * lambda4; + // vertex shape functions: + vertexBasis[0] = lambda2; + vertexBasis[1] = lambda3; + vertexBasis[2] = lambda1; + vertexBasis[3] = lambda4; + // compute the terms to assemble + std::vector<double> substraction(_nedge); + substraction[0] = lambda3 - lambda2; + substraction[1] = lambda1 - lambda3; + substraction[2] = lambda1 - lambda2; + substraction[3] = lambda4 - lambda2; + substraction[4] = lambda4 - lambda1; + substraction[5] = lambda4 - lambda3; + std::vector<std::vector<double> > phi(_nedge); + phi[0] = std::vector<double>( + std::max(std::max(std::max(_pOrderEdge[0] - 1, _pOrderFace[0] - 2), + _pOrderFace[1] - 2), + _pb - 3)); + phi[1] = + std::vector<double>(std::max(_pOrderEdge[1] - 1, _pOrderFace[3] - 2)); + phi[2] = std::vector<double>( + std::max(std::max(std::max(_pOrderEdge[2] - 1, _pOrderFace[0] - 2), + _pOrderFace[2] - 2), + _pb - 3)); + phi[3] = std::vector<double>( + std::max(std::max(std::max(_pOrderEdge[3] - 1, _pOrderFace[1] - 2), + _pOrderFace[2] - 2), + _pb - 3)); + phi[4] = std::vector<double>(_pOrderEdge[4] - 1); + phi[5] = + std::vector<double>(std::max(_pOrderEdge[5] - 1, _pOrderFace[3] - 2)); + for(int i = 0; i < _nedge; i++) { + for(unsigned int j = 0; j < phi[i].size(); j++) { + phi[i][j] = OrthogonalPoly::EvalKernelFunction(j, substraction[i]); + } + } + std::vector<double> edgeProduct(_nedge); + edgeProduct[0] = lambda3 * lambda2; + edgeProduct[1] = lambda1 * lambda3; + edgeProduct[2] = lambda2 * lambda1; + edgeProduct[3] = lambda4 * lambda2; + edgeProduct[4] = lambda4 * lambda1; + edgeProduct[5] = lambda4 * lambda3; + std::vector<double> faceProduct(_nfaceTri); + faceProduct[0] = edgeProduct[0] * lambda1; + faceProduct[1] = edgeProduct[0] * lambda4; + faceProduct[2] = edgeProduct[2] * lambda4; + faceProduct[3] = edgeProduct[1] * lambda4; + // edge shape functions: + int indexEdgeBasis = 0; + for(int iEdge = 0; iEdge < _nedge; iEdge++) { + for(int indexEdgeFunc = 0; indexEdgeFunc < _pOrderEdge[iEdge] - 1; + indexEdgeFunc++) { + if(iEdge == 2 && indexEdgeFunc % 2 != 0) { + edgeBasis[indexEdgeBasis] = + (-1) * edgeProduct[iEdge] * phi[iEdge][indexEdgeFunc]; + } + else { + edgeBasis[indexEdgeBasis] = + edgeProduct[iEdge] * phi[iEdge][indexEdgeFunc]; + } + + indexEdgeBasis++; + } + } + // face shape functions: + int indexFaceFunction = 0; + for(int iFace = 0; iFace < _nfaceTri; iFace++) { + int indexVectorTarget1 = 0; + int indexVectorTarget2 = 0; + switch(iFace) { + case(0): + indexVectorTarget1 = 0; + indexVectorTarget2 = 2; + break; + case(1): + indexVectorTarget1 = 0; + indexVectorTarget2 = 3; + break; + case(2): + indexVectorTarget1 = 2; + indexVectorTarget2 = 3; + break; + case(3): + indexVectorTarget1 = 1; + indexVectorTarget2 = 5; + break; + } + for(int n1 = 0; n1 < _pOrderFace[iFace] - 2; n1++) { + for(int n2 = 0; n2 < _pOrderFace[iFace] - 2 - n1; n2++) { + int impact = 1; + if(n2 % 2 != 0) { impact = -1; } + faceBasis[indexFaceFunction] = impact * faceProduct[iFace] * + phi[indexVectorTarget1][n1] * + phi[indexVectorTarget2][n2]; + indexFaceFunction++; + } + } + } + + // bubble shape functions: + int indexBubbleBasis = 0; + for(int n1 = 0; n1 < _pb - 3; n1++) { + for(int n2 = 0; n2 < _pb - 3 - n1; n2++) { + for(int n3 = 0; n3 < _pb - 3 - n2 - n1; n3++) { + bubbleBasis[indexBubbleBasis] = + phi[2][n1] * phi[0][n2] * phi[3][n3] * prod; + indexBubbleBasis++; + } + } + } +} + +void HierarchicalBasisH1Tetra::orientEdge(int const &flagOrientation, + int const &edgeNumber, + std::vector<double> &edgeBasis) +{ + if(flagOrientation == -1) { + int constant1 = 0; + int constant2 = 0; + for(int i = 0; i <= edgeNumber; i++) { constant2 += _pOrderEdge[i] - 1; } + constant2 = constant2 - 1; + constant1 = constant2 - _pOrderEdge[edgeNumber] + 2; + for(int k = constant1; k <= constant2; k++) { + if((k - constant1) % 2 != 0) { edgeBasis[k] = edgeBasis[k] * (-1); } + } + } +} +void HierarchicalBasisH1Tetra::orientEdge( + int const &flagOrientation, int const &edgeNumber, + std::vector<std::vector<double> > &gradientEdge) +{ + if(flagOrientation == -1) { + int constant1 = 0; + int constant2 = 0; + for(int i = 0; i <= edgeNumber; i++) { constant2 += _pOrderEdge[i] - 1; } + constant2 = constant2 - 1; + constant1 = constant2 - _pOrderEdge[edgeNumber] + 2; + for(int k = constant1; k <= constant2; k++) { + if((k - constant1) % 2 != 0) { + gradientEdge[k][0] = gradientEdge[k][0] * (-1); + gradientEdge[k][1] = gradientEdge[k][1] * (-1); + gradientEdge[k][2] = gradientEdge[k][2] * (-1); + } + } + } +} + +void HierarchicalBasisH1Tetra::orientFace(double const &u, double const &v, + double const &w, int const &flag1, + int const &flag2, int const &flag3, + int const &faceNumber, + std::vector<double> &faceBasis) +{ + if(!(flag1 == 0 && flag2 == 1)) { + // to map onto the reference domain of gmsh: + double uc = 2 * u - 1; + double vc = 2 * v - 1; + double wc = 2 * w - 1; + //***** + int iterator = 0; + for(int i = 0; i < faceNumber; i++) { + iterator += int((_pOrderFace[i] - 1) * (_pOrderFace[i] - 2) / 2); + } + std::vector<double> lambda(3); + switch(faceNumber) { + case(0): + lambda[0] = _affineCoordinate(2, uc, vc, wc); + lambda[1] = _affineCoordinate(3, uc, vc, wc); + lambda[2] = _affineCoordinate(1, uc, vc, wc); + break; + case(1): + lambda[0] = _affineCoordinate(2, uc, vc, wc); + lambda[1] = _affineCoordinate(3, uc, vc, wc); + lambda[2] = _affineCoordinate(4, uc, vc, wc); + break; + case(2): + lambda[0] = _affineCoordinate(2, uc, vc, wc); + lambda[1] = _affineCoordinate(1, uc, vc, wc); + lambda[2] = _affineCoordinate(4, uc, vc, wc); + break; + case(3): + lambda[0] = _affineCoordinate(3, uc, vc, wc); + lambda[1] = _affineCoordinate(1, uc, vc, wc); + lambda[2] = _affineCoordinate(4, uc, vc, wc); + break; + } + double product = lambda[0] * lambda[1] * lambda[2]; + if(flag1 == 1 && flag2 == -1) { + double copy = lambda[0]; + lambda[0] = lambda[1]; + lambda[1] = copy; + } + else if(flag1 == 0 && flag2 == -1) { + double copy = lambda[2]; + lambda[2] = lambda[1]; + lambda[1] = copy; + } + else if(flag1 == 2 && flag2 == -1) { + double copy = lambda[2]; + lambda[2] = lambda[0]; + lambda[0] = copy; + } + else if(flag1 == 1 && flag2 == 1) { + double copy = lambda[0]; + lambda[0] = lambda[1]; + lambda[1] = lambda[2]; + lambda[2] = copy; + } + else if(flag1 == 2 && flag2 == 1) { + double copy = lambda[0]; + lambda[0] = lambda[2]; + lambda[2] = lambda[1]; + lambda[1] = copy; + } + double subs1 = lambda[1] - lambda[0]; + double subs2 = lambda[0] - lambda[2]; + std::vector<double> phiSubs2(_pOrderFace[faceNumber] - 2); + for(int it = 0; it < _pOrderFace[faceNumber] - 2; it++) { + phiSubs2[it] = OrthogonalPoly::EvalKernelFunction(it, subs2); + } + for(int n1 = 0; n1 < _pOrderFace[faceNumber] - 2; n1++) { + double phiSubs1 = OrthogonalPoly::EvalKernelFunction(n1, subs1); + for(int n2 = 0; n2 < _pOrderFace[faceNumber] - 2 - n1; n2++) { + faceBasis[iterator] = product * phiSubs1 * phiSubs2[n2]; + iterator++; + } + } + } +} + +void HierarchicalBasisH1Tetra::generateGradientBasis( + double const &u, double const &v, double const &w, + std::vector<std::vector<double> > &gradientVertex, + std::vector<std::vector<double> > &gradientEdge, + std::vector<std::vector<double> > &gradientFace, + std::vector<std::vector<double> > &gradientBubble) +{ + // to map onto the reference domain of gmsh: + // **** + double uc = 2 * u - 1; + double vc = 2 * v - 1; + double wc = 2 * w - 1; + double jacob = 2; // jacobian=((2,0,0),(0,2,0),(0,0,2)) + //**** + double lambda1 = _affineCoordinate(1, uc, vc, wc); + double lambda2 = _affineCoordinate(2, uc, vc, wc); + double lambda3 = _affineCoordinate(3, uc, vc, wc); + double lambda4 = _affineCoordinate(4, uc, vc, wc); + double prod = lambda1 * lambda2 * lambda3 * lambda4; + // gradient: + std::vector<double> dlambda1(3, 0); + std::vector<double> dlambda2(3, -0.5); + std::vector<double> dlambda3(3, 0); + std::vector<double> dlambda4(3, 0); + dlambda1[1] = 0.5; + dlambda3[0] = 0.5; + dlambda4[2] = 0.5; + std::vector<double> dprod(3); // d(lambda1*lambda2*lambda3*lambda4) + dprod[0] = jacob * (lambda1 * dlambda2[0] * lambda3 * lambda4 + + lambda1 * lambda2 * dlambda3[0] * lambda4); + dprod[1] = jacob * (dlambda1[1] * lambda2 * lambda3 * lambda4 + + lambda1 * dlambda2[1] * lambda3 * lambda4); + dprod[2] = jacob * (lambda1 * dlambda2[2] * lambda3 * lambda4 + + lambda1 * lambda2 * lambda3 * dlambda4[2]); + // gradient of vertex functions: + // jacob *dlambda + gradientVertex[0][0] = -1; + gradientVertex[0][1] = -1; + gradientVertex[0][2] = -1; + gradientVertex[1][0] = 1; + gradientVertex[1][1] = 0; + gradientVertex[1][2] = 0; + gradientVertex[2][0] = 0; + gradientVertex[2][1] = 1; + gradientVertex[2][2] = 0; + gradientVertex[3][0] = 0; + gradientVertex[3][1] = 0; + gradientVertex[3][2] = 1; + // compute the terms to assemble + std::vector<double> substraction(_nedge); + substraction[0] = lambda3 - lambda2; + substraction[1] = lambda1 - lambda3; + substraction[2] = lambda1 - lambda2; + substraction[3] = lambda4 - lambda2; + substraction[4] = lambda4 - lambda1; + substraction[5] = lambda4 - lambda3; + std::vector<std::vector<double> > dsubstraction( + _nedge, std::vector<double>(3, 1)); // = dsubstraction*jacob + dsubstraction[0][0] = 2; + dsubstraction[1][0] = -1; + dsubstraction[1][2] = 0; + dsubstraction[2][1] = 2.; + dsubstraction[3][2] = 2.; + dsubstraction[4][0] = 0; + dsubstraction[4][1] = -1; + dsubstraction[5][0] = -1; + dsubstraction[5][1] = 0; + std::vector<std::vector<double> > phi(_nedge); + std::vector<std::vector<double> > dphi(_nedge); + for(int i = 0; i < _nedge; i++) { + int vectorSize = 0; + switch(i) { + case 0: + vectorSize = + std::max(std::max(std::max(_pOrderEdge[0] - 1, _pOrderFace[0] - 2), + _pOrderFace[1] - 2), + _pb - 3); + break; + case 1: + vectorSize = std::max(_pOrderEdge[1] - 1, _pOrderFace[3] - 2); + break; + case 2: + vectorSize = + std::max(std::max(std::max(_pOrderEdge[2] - 1, _pOrderFace[0] - 2), + _pOrderFace[2] - 2), + _pb - 3); + break; + case 3: + vectorSize = + std::max(std::max(std::max(_pOrderEdge[3] - 1, _pOrderFace[1] - 2), + _pOrderFace[2] - 2), + _pb - 3); + break; + case 4: vectorSize = _pOrderEdge[4] - 1; break; + case 5: + vectorSize = std::max(_pOrderEdge[5] - 1, _pOrderFace[3] - 2); + break; + } + phi[i] = std::vector<double>(vectorSize); + dphi[i] = std::vector<double>(vectorSize); + for(unsigned int j = 0; j < phi[i].size(); j++) { + phi[i][j] = OrthogonalPoly::EvalKernelFunction(j, substraction[i]); + dphi[i][j] = OrthogonalPoly::EvalDKernelFunction(j, substraction[i]); + } + } + std::vector<double> edgeProduct(_nedge); + edgeProduct[0] = lambda3 * lambda2; + edgeProduct[1] = lambda1 * lambda3; + edgeProduct[2] = lambda2 * lambda1; + edgeProduct[3] = lambda4 * lambda2; + edgeProduct[4] = lambda4 * lambda1; + edgeProduct[5] = lambda4 * lambda3; + std::vector<std::vector<double> > dEdgeProduct(_nedge, + std::vector<double>(3)); + for(int i = 0; i < 3; i++) { + dEdgeProduct[0][i] = + jacob * (dlambda3[i] * lambda2 + lambda3 * dlambda2[i]); + dEdgeProduct[1][i] = + jacob * (dlambda1[i] * lambda3 + lambda1 * dlambda3[i]); + dEdgeProduct[2][i] = + jacob * (dlambda2[i] * lambda1 + lambda2 * dlambda1[i]); + dEdgeProduct[3][i] = + jacob * (dlambda4[i] * lambda2 + lambda4 * dlambda2[i]); + dEdgeProduct[4][i] = + jacob * (dlambda4[i] * lambda1 + lambda4 * dlambda1[i]); + dEdgeProduct[5][i] = + jacob * (dlambda4[i] * lambda3 + lambda4 * dlambda3[i]); + } + std::vector<double> faceProduct(_nfaceTri); + faceProduct[0] = edgeProduct[0] * lambda1; + faceProduct[1] = edgeProduct[0] * lambda4; + faceProduct[2] = edgeProduct[2] * lambda4; + faceProduct[3] = edgeProduct[1] * lambda4; + std::vector<std::vector<double> > dfaceProduct(_nfaceTri, + std::vector<double>(3)); + for(int i = 0; i < 3; i++) { + dfaceProduct[0][i] = + jacob * (edgeProduct[0] * dlambda1[i]) + dEdgeProduct[0][i] * lambda1; + dfaceProduct[1][i] = + jacob * (edgeProduct[0] * dlambda4[i]) + dEdgeProduct[0][i] * lambda4; + dfaceProduct[2][i] = + jacob * (edgeProduct[2] * dlambda4[i]) + dEdgeProduct[2][i] * lambda4; + dfaceProduct[3][i] = + jacob * (edgeProduct[1] * dlambda4[i]) + dEdgeProduct[1][i] * lambda4; + } + // edge shape functions: + int indexEdgeBasis = 0; + for(int iEdge = 0; iEdge < _nedge; iEdge++) { + for(int indexEdgeFunc = 0; indexEdgeFunc < _pOrderEdge[iEdge] - 1; + indexEdgeFunc++) { + int impact1 = 1; + if(iEdge == 2) { + impact1 = 1; + if(indexEdgeFunc % 2 != 0) { impact1 = -1; } + } + for(int i = 0; i < 3; i++) { + gradientEdge[indexEdgeBasis][i] = + impact1 * (dEdgeProduct[iEdge][i] * phi[iEdge][indexEdgeFunc] + + edgeProduct[iEdge] * dphi[iEdge][indexEdgeFunc] * + dsubstraction[iEdge][i]); + } + indexEdgeBasis++; + } + } + // face shape functions: + int indexFaceFunction = 0; + for(int iFace = 0; iFace < _nfaceTri; iFace++) { + int indexVectorTarget1 = 0; + int indexVectorTarget2 = 0; + switch(iFace) { + case(0): + indexVectorTarget1 = 0; + indexVectorTarget2 = 2; + break; + case(1): + indexVectorTarget1 = 0; + indexVectorTarget2 = 3; + break; + case(2): + indexVectorTarget1 = 2; + indexVectorTarget2 = 3; + break; + case(3): + indexVectorTarget1 = 1; + indexVectorTarget2 = 5; + break; + } + for(int n1 = 0; n1 < _pOrderFace[iFace] - 2; n1++) { + for(int n2 = 0; n2 < _pOrderFace[iFace] - 2 - n1; n2++) { + int impact = 1; + if(n2 % 2 != 0) { impact = -1; } + for(int i = 0; i < 3; i++) { + gradientFace[indexFaceFunction][i] = + impact * (dfaceProduct[iFace][i] * phi[indexVectorTarget1][n1] * + phi[indexVectorTarget2][n2] + + faceProduct[iFace] * dphi[indexVectorTarget1][n1] * + dsubstraction[indexVectorTarget1][i] * + phi[indexVectorTarget2][n2] + + faceProduct[iFace] * phi[indexVectorTarget1][n1] * + dsubstraction[indexVectorTarget2][i] * + dphi[indexVectorTarget2][n2]); + } + indexFaceFunction++; + } + } + } + // bubble shape functions: + int indexBubbleBasis = 0; + for(int n1 = 0; n1 < _pb - 3; n1++) { + for(int n2 = 0; n2 < _pb - 3 - n1; n2++) { + for(int n3 = 0; n3 < _pb - 3 - n2 - n1; n3++) { + for(int i = 0; i < 3; i++) { + gradientBubble[indexBubbleBasis][i] = + phi[2][n1] * phi[0][n2] * phi[3][n3] * dprod[i] + + dsubstraction[2][i] * dphi[2][n1] * phi[0][n2] * phi[3][n3] * prod + + dsubstraction[0][i] * phi[2][n1] * dphi[0][n2] * phi[3][n3] * prod + + dsubstraction[3][i] * phi[2][n1] * phi[0][n2] * dphi[3][n3] * prod; + } + indexBubbleBasis++; + } + } + } +} + +void HierarchicalBasisH1Tetra::orientFace( + double const &u, double const &v, double const &w, int const &flag1, + int const &flag2, int const &flag3, int const &faceNumber, + std::vector<std::vector<double> > &gradientFace, std::string typeFunction) +{ + if(!(flag1 == 0 && flag2 == 1)) { + // to map onto the reference domain of gmsh: + double uc = 2 * u - 1; + double vc = 2 * v - 1; + double wc = 2 * w - 1; + //***** + int iterator = 0; + for(int i = 0; i < faceNumber; i++) { + iterator += int((_pOrderFace[i] - 1) * (_pOrderFace[i] - 2) / 2); + } + std::vector<double> lambda(3); + std::vector<std::vector<double> > dlambda(3, std::vector<double>(3, 0)); + std::vector<double> dProduct(3); // gradient of (lambdaA*lambdaB*lambdaC) + switch(faceNumber) { + case(0): { + lambda[0] = _affineCoordinate(2, uc, vc, wc); + lambda[1] = _affineCoordinate(3, uc, vc, wc); + lambda[2] = _affineCoordinate(1, uc, vc, wc); + dlambda[0][0] = -1; //* jacobian + dlambda[0][1] = -1; //* jacobian + dlambda[0][2] = -1; //* jacobian + dlambda[1][0] = 1; //* jacobian + dlambda[2][1] = 1; //* jacobian + double pl3l1 = lambda[1] * lambda[2]; + dProduct[0] = lambda[2] * lambda[0] - pl3l1; + dProduct[1] = lambda[0] * lambda[1] - pl3l1; + dProduct[2] = -pl3l1; //*jacobian + break; + } + case(1): { + lambda[0] = _affineCoordinate(2, uc, vc, wc); + lambda[1] = _affineCoordinate(3, uc, vc, wc); + lambda[2] = _affineCoordinate(4, uc, vc, wc); + dlambda[0][0] = -1; //* jacobian + dlambda[0][1] = -1; //* jacobian + dlambda[0][2] = -1; //* jacobian + dlambda[1][0] = 1; //* jacobian + dlambda[2][2] = 1; //* jacobian + double pl3l4 = lambda[1] * lambda[2]; + dProduct[0] = lambda[2] * lambda[0] - pl3l4; //*jacobian + dProduct[1] = -pl3l4; + dProduct[2] = lambda[0] * lambda[1] - pl3l4; + break; + } + case(2): { + lambda[0] = _affineCoordinate(2, uc, vc, wc); + lambda[1] = _affineCoordinate(1, uc, vc, wc); + lambda[2] = _affineCoordinate(4, uc, vc, wc); + dlambda[0][0] = -1; //* jacobian + dlambda[0][1] = -1; //* jacobian + dlambda[0][2] = -1; //* jacobian + dlambda[1][1] = 1; //* jacobian + dlambda[2][2] = 1; //* jacobian + double pl1l4 = lambda[1] * lambda[2]; + dProduct[0] = -pl1l4; + dProduct[1] = lambda[0] * lambda[2] - pl1l4; + dProduct[2] = lambda[0] * lambda[1] - pl1l4; //*jacobian + break; + } + case(3): { + lambda[0] = _affineCoordinate(3, uc, vc, wc); + lambda[1] = _affineCoordinate(1, uc, vc, wc); + lambda[2] = _affineCoordinate(4, uc, vc, wc); + dlambda[0][0] = 1; //* jacobian + dlambda[1][1] = 1; //* jacobian + dlambda[2][2] = 1; //* jacobian + dProduct[0] = lambda[1] * lambda[2]; + dProduct[1] = lambda[0] * lambda[2]; + dProduct[2] = lambda[0] * lambda[1]; + break; + } + } + double product = lambda[0] * lambda[1] * lambda[2]; + if(flag1 == 1 && flag2 == -1) { + double copy = lambda[0]; + lambda[0] = lambda[1]; + lambda[1] = copy; + std::vector<double> dcopy = dlambda[0]; + dlambda[0] = dlambda[1]; + dlambda[1] = dcopy; + } + else if(flag1 == 0 && flag2 == -1) { + double copy = lambda[2]; + lambda[2] = lambda[1]; + lambda[1] = copy; + std::vector<double> dcopy = dlambda[2]; + dlambda[2] = dlambda[1]; + dlambda[1] = dcopy; + } + else if(flag1 == 2 && flag2 == -1) { + double copy = lambda[2]; + lambda[2] = lambda[0]; + lambda[0] = copy; + std::vector<double> dcopy = dlambda[2]; + dlambda[2] = dlambda[0]; + dlambda[0] = dcopy; + } + else if(flag1 == 1 && flag2 == 1) { + double copy = lambda[0]; + lambda[0] = lambda[1]; + lambda[1] = lambda[2]; + lambda[2] = copy; + std::vector<double> dcopy = dlambda[0]; + dlambda[0] = dlambda[1]; + dlambda[1] = dlambda[2]; + dlambda[2] = dcopy; + } + else if(flag1 == 2 && flag2 == 1) { + double copy = lambda[0]; + lambda[0] = lambda[2]; + lambda[2] = lambda[1]; + lambda[1] = copy; + std::vector<double> dcopy = dlambda[0]; + dlambda[0] = dlambda[2]; + dlambda[2] = dlambda[1]; + dlambda[1] = dcopy; + } + double subsBA = lambda[1] - lambda[0]; + double subsAC = lambda[0] - lambda[2]; + std::vector<double> dsubsBA(3); + std::vector<double> dsubsAC(3); + for(int i = 0; i < 3; i++) { + dsubsBA[i] = dlambda[1][i] - dlambda[0][i]; + dsubsAC[i] = dlambda[0][i] - dlambda[2][i]; + } + std::vector<double> phiSubsAC(_pOrderFace[faceNumber] - 2); + std::vector<double> dphiSubsAC(_pOrderFace[faceNumber] - 2); + for(int it = 0; it < _pOrderFace[faceNumber] - 2; it++) { + phiSubsAC[it] = OrthogonalPoly::EvalKernelFunction(it, subsAC); + dphiSubsAC[it] = OrthogonalPoly::EvalDKernelFunction(it, subsAC); + } + for(int n1 = 0; n1 < _pOrderFace[faceNumber] - 2; n1++) { + double phiBA = OrthogonalPoly::EvalKernelFunction(n1, subsBA); + double dphiBA = OrthogonalPoly::EvalDKernelFunction(n1, subsBA); + for(int n2 = 0; n2 < _pOrderFace[faceNumber] - 2 - n1; n2++) { + for(int i = 0; i < 3; i++) { + gradientFace[iterator][i] = + dProduct[i] * phiBA * phiSubsAC[n2] + + product * dphiBA * dsubsBA[i] * phiSubsAC[n2] + + product * phiBA * dsubsAC[i] * dphiSubsAC[n2]; + } + iterator++; + } + } + } +} diff --git a/Numeric/HierarchicalBasisH1Tetra.h b/Numeric/HierarchicalBasisH1Tetra.h new file mode 100644 index 0000000000000000000000000000000000000000..6733a630eceb764c1c82fe80eef800c539c8239b --- /dev/null +++ b/Numeric/HierarchicalBasisH1Tetra.h @@ -0,0 +1,109 @@ +// Gmsh - Copyright (C) 1997-2019 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. +// +// Contributed by Ismail Badia. +// Reference : "Higher-Order Finite Element Methods"; Pavel Solin, Karel +// Segeth , +// Ivo Dolezel , Chapman and Hall/CRC; Edition : Har/Cdr (2003). + +#ifndef HIERARCHICAL_BASIS_H1_TETRA_H +#define HIERARCHICAL_BASIS_H1_TETRA_H + +#include <algorithm> +#include "HierarchicalBasisH1.h" + +/* + * MTetrahedron + * + * v + * . + * ,/ + * / + * 2 + * ,/|`\ + * ,/ | `\ + * ,/ '. `\ + * ,/ | `\ + * ,/ | `\ + * 0-----------'.--------1 --> u + * `\. | ,/ + * `\. | ,/ + * `\. '. ,/ + * `\. |/ + * `3 + * `\. + * ` w + * + * + * Oriented Edges: + * e0={0, 1}, e1={1, 2}, e2={2, 0}, e3={0, 3}, e4={2, 3}, e5={1, 3} + * + * + * Oritented Surface: + * s0={0, 1, 2}, s1={0, 1, 3}, s2={0, 2, 3}, s3={1, 2, 3} + * Local (directional) orders on mesh faces are not allowed to exceed the mini- + * mum of the (appropriate directional) orders of approximation associated with + * the interior of the adjacent elements. Local orders of approximation on mesh + * edges are limited by the minimum of all (appropriate directional) orders cor- + * responding to faces sharing that edge + */ +class HierarchicalBasisH1Tetra : public HierarchicalBasisH1 { +public: + HierarchicalBasisH1Tetra(int order); + virtual ~HierarchicalBasisH1Tetra(); + // vertexBasis=[v0,...,v3] + // edgeBasis=[phie0_{2},...phie0_{pe0-1},phie1_{2},...phie1_{pe1-1}...] + // faceBasis=[phif0_{1,1},...,phif0_{1,pF0-2},phif0_{2,1}...,phif0_{2,pF0-3},...,phief0_{pF-2,1},phif1_{1,1}...] + // bubbleBasis=[phieb_{1,1,1},...,phieb_{1,1,pb-3},...] n1+n2+n3<=pb-1 + virtual void generateBasis(double const &u, double const &v, double const &w, + std::vector<double> &vertexBasis, + std::vector<double> &edgeBasis, + std::vector<double> &faceBasis, + std::vector<double> &bubbleBasis); + + virtual void generateBasis(double const &u, double const &v, double const &w, + std::vector<std::vector<double> > &vertexBasis, + std::vector<std::vector<double> > &edgeBasis, + std::vector<std::vector<double> > &faceBasis, + std::vector<std::vector<double> > &bubbleBasis, + std::string typeFunction = "GradH1Legendre") + { + generateGradientBasis(u, v, w, vertexBasis, edgeBasis, faceBasis, + bubbleBasis); + } + + virtual void orientEdge(int const &flagOrientation, int const &edgeNumber, + std::vector<double> &edgeBasis); + + virtual void orientEdge(int const &flagOrientation, int const &edgeNumber, + std::vector<std::vector<double> > &edgeBasis); + + virtual void orientFace(double const &u, double const &v, double const &w, + int const &flag1, int const &flag2, int const &flag3, + int const &faceNumber, + std::vector<double> &faceBasis); + virtual void orientFace(double const &u, double const &v, double const &w, + int const &flag1, int const &flag2, int const &flag3, + int const &faceNumber, + std::vector<std::vector<double> > &faceBasis, + std::string typeFunction = "GradH1Legendre"); + +private: + int _pb; // bubble function order + int _pOrderEdge[6]; // Edge functions order (pOrderEdge[0] matches the order + // of the edge 0) + int _pOrderFace[4]; // Face functions order in direction + static double + _affineCoordinate(const int &j, const double &u, const double &v, + const double &w); // affine coordinate lambdaj j=1..4 + + void generateGradientBasis(double const &u, double const &v, double const &w, + std::vector<std::vector<double> > &gradientVertex, + std::vector<std::vector<double> > &gradientEdge, + std::vector<std::vector<double> > &gradientFace, + std::vector<std::vector<double> > &gradientBubble); +}; + +#endif diff --git a/Numeric/HierarchicalBasisH1Tria.cpp b/Numeric/HierarchicalBasisH1Tria.cpp new file mode 100644 index 0000000000000000000000000000000000000000..c252326f2b1752e5f8b4ba4075429c94e5afcca6 --- /dev/null +++ b/Numeric/HierarchicalBasisH1Tria.cpp @@ -0,0 +1,521 @@ +// Gmsh - Copyright (C) 1997-2019 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. +// +// Contributed by Ismail Badia. +// Reference : "Higher-Order Finite Element Methods"; Pavel Solin, Karel +// Segeth , +// Ivo Dolezel , Chapman and Hall/CRC; Edition : Har/Cdr (2003). + +#include "HierarchicalBasisH1Tria.h" + +HierarchicalBasisH1Tria::HierarchicalBasisH1Tria(int pf, int pe0, int pe1, + int pe2) +{ + _nvertex = 3; + _nedge = 3; + _nfaceTri = 1; + _nfaceQuad = 0; + _nVertexFunction = 3; + _nEdgeFunction = pe0 + pe1 + pe2 - 3; + _nQuadFaceFunction = 0; + _nTriFaceFunction = (pf - 1) * (pf - 2) / 2; + _nBubbleFunction = 0; + _pf = pf; + + if(pe0 > pf || pe2 > pf || pe1 > pf) { + throw std::string("pe0, pe1 and pe2 must be <=pf"); + } + _pOrderEdge[0] = pe0; + _pOrderEdge[1] = pe1; + _pOrderEdge[2] = pe2; +} +HierarchicalBasisH1Tria::HierarchicalBasisH1Tria(int order) +{ + _nvertex = 3; + _nedge = 3; + _nfaceTri = 1; + _nfaceQuad = 0; + _nVertexFunction = 3; + _nEdgeFunction = 3 * order - 3; + _nQuadFaceFunction = 0; + _nTriFaceFunction = (order - 1) * (order - 2) / 2; + _nBubbleFunction = 0; + _pf = order; + _pOrderEdge[0] = order; + _pOrderEdge[1] = order; + _pOrderEdge[2] = order; +} +HierarchicalBasisH1Tria::~HierarchicalBasisH1Tria() {} + +double HierarchicalBasisH1Tria::_affineCoordinate(int const &j, double const &u, + double const &v) +{ + switch(j) { + case(1): return 0.5 * (1 + v); + case(2): return -0.5 * (u + v); + case(3): return 0.5 * (1 + u); + default: throw std::string("j must be : 1<=j<=3"); + } +} + +void HierarchicalBasisH1Tria::generateBasis(double const &u, double const &v, + double const &w, + std::vector<double> &vertexBasis, + std::vector<double> &edgeBasis, + std::vector<double> &faceBasis, + std::vector<double> &bubbleBasis) +{ + //*** + // to map onto the reference domain of gmsh: + double uc = 2 * u - 1; + double vc = 2 * v - 1; + //***** + double lambda1 = _affineCoordinate(1, uc, vc); + double lambda2 = _affineCoordinate(2, uc, vc); + double lambda3 = _affineCoordinate(3, uc, vc); + double product32 = lambda2 * lambda3; + double subtraction32 = lambda3 - lambda2; + double product13 = lambda3 * lambda1; + double subtraction13 = lambda1 - lambda3; + double product21 = lambda2 * lambda1; + double subtraction21 = lambda2 - lambda1; + double product = lambda1 * lambda2 * lambda3; + // vertex shape functions: + vertexBasis[0] = lambda2; + vertexBasis[1] = lambda3; + vertexBasis[2] = lambda1; + // edge 0 shape functions and a part of face functions : + int iterator2 = 0; + for(int k = 0; k <= _pOrderEdge[0] - 2; k++) { + double kernel = OrthogonalPoly::EvalKernelFunction(k, subtraction32); + edgeBasis[k] = product32 * kernel; + int iterator = 0; + while(iterator <= _pf - 3 - k) { + faceBasis[iterator2 + iterator] = product * kernel; + iterator++; + } + iterator2 = iterator2 + _pf - 2 - k; + } + for(int k = _pOrderEdge[0] - 1; k <= _pf - 3; k++) { + double kernel = OrthogonalPoly::EvalKernelFunction(k, subtraction32); + int iterator = 0; + while(iterator <= _pf - 3 - k) { + faceBasis[iterator2 + iterator] = product * kernel; + iterator++; + } + iterator2 = iterator2 + _pf - 2 - k; + } + // edge 1 shape functions : + for(int k = 0; k <= _pOrderEdge[1] - 2; k++) { + edgeBasis[_pOrderEdge[0] + k - 1] = + product13 * OrthogonalPoly::EvalKernelFunction(k, subtraction13); + } + // edge 2 shape functions and a part of face functions : + for(int k = 0; k <= _pOrderEdge[2] - 2; k++) { + double kernel = OrthogonalPoly::EvalKernelFunction(k, subtraction21); + edgeBasis[k + _pOrderEdge[0] + _pOrderEdge[1] - 2] = product21 * kernel; + int iterator2 = k; + int iterator1 = 0; + int iterator3 = _pf - 2; + while(iterator1 <= _pf - 3 - k) { + faceBasis[iterator2] = faceBasis[iterator2] * kernel; + iterator2 = iterator2 + iterator3; + iterator1++; + iterator3--; + } + } + for(int k = _pOrderEdge[2] - 1; k <= _pf - 3; k++) { + double kernel = OrthogonalPoly::EvalKernelFunction(k, subtraction21); + int iterator2 = k; + int iterator1 = 0; + int iterator3 = _pf - 2; + while(iterator1 <= _pf - 3 - k) { + faceBasis[iterator2] = faceBasis[iterator2] * kernel; + iterator2 = iterator2 + iterator3; + iterator1++; + iterator3--; + } + } +} + +void HierarchicalBasisH1Tria::generateGradientBasis( + double const &u, double const &v, double const &w, + std::vector<std::vector<double> > &gradientVertex, + std::vector<std::vector<double> > &gradientEdge, + std::vector<std::vector<double> > &gradientFace, + std::vector<std::vector<double> > &gradientBubble) +{ + // to map onto the reference domain of gmsh: + // **** + double uc = 2 * u - 1; + double vc = 2 * v - 1; + double jacob = 2; // jacobian=((2,0),(0,2)) + //**** + double dlambda1U = 0; + double dlambda1V = 0.5; + double dlambda2U = -0.5; + double dlambda2V = -0.5; + double dlambda3U = 0.5; + double dlambda3V = 0; + double lambda1 = _affineCoordinate(1, uc, vc); + double lambda2 = _affineCoordinate(2, uc, vc); + double lambda3 = _affineCoordinate(3, uc, vc); + double product32 = lambda2 * lambda3; + double subtraction32 = lambda3 - lambda2; + double product13 = lambda3 * lambda1; + double subtraction13 = lambda1 - lambda3; + double product21 = lambda2 * lambda1; + double subtraction21 = lambda2 - lambda1; + double product = lambda1 * lambda2 * lambda3; + // vertex gradient functions: + gradientVertex[0][0] = jacob * dlambda2U; + gradientVertex[0][1] = jacob * dlambda2V; + gradientVertex[1][0] = jacob * dlambda3U; + gradientVertex[1][1] = jacob * dlambda3V; + gradientVertex[2][0] = jacob * dlambda1U; + gradientVertex[2][1] = jacob * dlambda1V; + std::vector<double> tablIntermU(_nTriFaceFunction); + std::vector<double> tablIntermV(_nTriFaceFunction); + // edge 0 gradient and a part of face functions gradient : + int iterator2 = 0; + for(int k = 0; k <= _pOrderEdge[0] - 2; k++) { + double kernel = OrthogonalPoly::EvalKernelFunction(k, subtraction32); + double dKernel = OrthogonalPoly::EvalDKernelFunction(k, subtraction32); + gradientEdge[k][0] = + (gradientVertex[1][0] * lambda2 + gradientVertex[0][0] * lambda3) * + kernel + + product32 * (gradientVertex[1][0] - gradientVertex[0][0]) * dKernel; + gradientEdge[k][1] = + (gradientVertex[1][1] * lambda2 + gradientVertex[0][1] * lambda3) * + kernel + + product32 * (gradientVertex[1][1] - gradientVertex[0][1]) * dKernel; + int iterator = 0; + while(iterator <= _pf - 3 - k) { + gradientFace[iterator2 + iterator][0] = + (gradientVertex[1][0] * product21 + gradientVertex[0][0] * product13 + + gradientVertex[2][0] * product32) * + kernel + + product * (gradientVertex[1][0] - gradientVertex[0][0]) * dKernel; + gradientFace[iterator2 + iterator][1] = + (gradientVertex[1][1] * product21 + gradientVertex[0][1] * product13 + + gradientVertex[2][1] * product32) * + kernel + + product * (gradientVertex[1][1] - gradientVertex[0][1]) * dKernel; + tablIntermU[iterator2 + iterator] = + product * (gradientVertex[0][0] - gradientVertex[2][0]) * kernel; + tablIntermV[iterator2 + iterator] = + product * (gradientVertex[0][1] - gradientVertex[2][1]) * kernel; + iterator++; + } + + iterator2 = iterator2 + _pf - 2 - k; + } + for(int k = _pOrderEdge[0] - 1; k <= _pf - 3; k++) { + double kernel = OrthogonalPoly::EvalKernelFunction(k, subtraction32); + double dKernel = OrthogonalPoly::EvalDKernelFunction(k, subtraction32); + int iterator = 0; + while(iterator <= _pf - 3 - k) { + gradientFace[iterator2 + iterator][0] = + (gradientVertex[1][0] * product21 + gradientVertex[0][0] * product13 + + gradientVertex[2][0] * product32) * + kernel + + product * (gradientVertex[1][0] - gradientVertex[0][0]) * dKernel; + gradientFace[iterator2 + iterator][1] = + (gradientVertex[1][1] * product21 + gradientVertex[0][1] * product13 + + gradientVertex[2][1] * product32) * + kernel + + product * (gradientVertex[1][1] - gradientVertex[0][1]) * dKernel; + tablIntermU[iterator2 + iterator] = + product * (gradientVertex[0][0] - gradientVertex[2][0]) * kernel; + tablIntermV[iterator2 + iterator] = + product * (gradientVertex[0][1] - gradientVertex[2][1]) * kernel; + iterator++; + } + + iterator2 = iterator2 + _pf - 2 - k; + } + // edge 1 shape functions gradient : + for(int k = 0; k <= _pOrderEdge[1] - 2; k++) { + double kernel = OrthogonalPoly::EvalKernelFunction(k, subtraction13); + double dKernel = OrthogonalPoly::EvalDKernelFunction(k, subtraction13); + gradientEdge[_pOrderEdge[0] + k - 1][0] = + (lambda3 * gradientVertex[2][0] + lambda1 * gradientVertex[1][0]) * + kernel + + product13 * (gradientVertex[2][0] - gradientVertex[1][0]) * dKernel; + gradientEdge[_pOrderEdge[0] + k - 1][1] = + (lambda3 * gradientVertex[2][1] + lambda1 * gradientVertex[1][1]) * + kernel + + product13 * (gradientVertex[2][1] - gradientVertex[1][1]) * dKernel; + } + // edge 2 gradient and a part of face functions gradient : + for(int k = 0; k <= _pOrderEdge[2] - 2; k++) { + double kernel = OrthogonalPoly::EvalKernelFunction(k, subtraction21); + double dKernel = OrthogonalPoly::EvalDKernelFunction(k, subtraction21); + gradientEdge[k + _pOrderEdge[0] + _pOrderEdge[1] - 2][0] = + (lambda2 * gradientVertex[2][0] + lambda1 * gradientVertex[0][0]) * + kernel + + product21 * (gradientVertex[0][0] - gradientVertex[2][0]) * dKernel; + gradientEdge[k + _pOrderEdge[0] + _pOrderEdge[1] - 2][1] = + (lambda2 * gradientVertex[2][1] + lambda1 * gradientVertex[0][1]) * + kernel + + product21 * (gradientVertex[0][1] - gradientVertex[2][1]) * dKernel; + int iterator2 = k; + int iterator1 = 0; + int iterator3 = _pf - 2; + while(iterator1 <= _pf - 3 - k) { + gradientFace[iterator2][0] = + gradientFace[iterator2][0] * kernel + tablIntermU[iterator2] * dKernel; + gradientFace[iterator2][1] = + gradientFace[iterator2][1] * kernel + tablIntermV[iterator2] * dKernel; + iterator2 = iterator2 + iterator3; + iterator1++; + iterator3--; + } + } + for(int k = _pOrderEdge[2] - 1; k <= _pf - 3; k++) { + double kernel = OrthogonalPoly::EvalKernelFunction(k, subtraction21); + double dKernel = OrthogonalPoly::EvalDKernelFunction(k, subtraction21); + int iterator2 = k; + int iterator1 = 0; + int iterator3 = _pf - 2; + while(iterator1 <= _pf - 3 - k) { + gradientFace[iterator2][0] = + gradientFace[iterator2][0] * kernel + tablIntermU[iterator2] * dKernel; + gradientFace[iterator2][1] = + gradientFace[iterator2][1] * kernel + tablIntermV[iterator2] * dKernel; + iterator2 = iterator2 + iterator3; + iterator1++; + iterator3--; + } + } +} + +void HierarchicalBasisH1Tria::orientEdge(int const &flagOrientation, + int const &edgeNumber, + std::vector<double> &edgeBasis) +{ + if(flagOrientation == -1) { + int const1; + int const2; + switch(edgeNumber) { + case(0): { + const1 = 0; + const2 = _pOrderEdge[0] - 2; + case(1): { + const1 = _pOrderEdge[0] - 1; + const2 = _pOrderEdge[0] + _pOrderEdge[1] - 3; + + } break; + case(2): { + const1 = _pOrderEdge[0] + _pOrderEdge[1] - 2; + const2 = _pOrderEdge[2] + _pOrderEdge[0] + _pOrderEdge[1] - 4; + + } break; + + default: throw std::string("edgeNumber must be : 0<=edgeNumber<=2"); + } + for(int k = const1; k <= const2; k++) { + if((k - const1) % 2 != 0) { edgeBasis[k] = edgeBasis[k] * (-1); } + } + } + } +} + +void HierarchicalBasisH1Tria::orientEdge( + int const &flagOrientation, int const &edgeNumber, + std::vector<std::vector<double> > &gradientEdge) +{ + if(flagOrientation == -1) { + int const1; + int const2; + switch(edgeNumber) { + case(0): { + const1 = 0; + const2 = _pOrderEdge[0] - 2; + + } break; + case(1): { + const1 = _pOrderEdge[0] - 1; + const2 = _pOrderEdge[0] + _pOrderEdge[1] - 3; + + } break; + case(2): { + const1 = _pOrderEdge[0] + _pOrderEdge[1] - 2; + const2 = _pOrderEdge[2] + _pOrderEdge[0] + _pOrderEdge[1] - 4; + + } break; + + default: throw std::string("edgeNumber must be : 0<=edgeNumber<=2"); + } + for(int k = const1; k <= const2; k++) { + if((k - const1) % 2 != 0) { + gradientEdge[k][0] = gradientEdge[k][0] * (-1); + gradientEdge[k][1] = gradientEdge[k][1] * (-1); + } + } + } +} + +void HierarchicalBasisH1Tria::orientFace(double const &u, double const &v, + double const &w, int const &flag1, + int const &flag2, int const &flag3, + int const &faceNumber, + std::vector<double> &faceBasis) +{ + if(!(flag1 == 0 && flag2 == 1)) { + // to map onto the reference domain of gmsh: + double uc = 2 * u - 1; + double vc = 2 * v - 1; + //***** + int iterator = 0; + std::vector<double> lambda(3); + + lambda[0] = _affineCoordinate(2, uc, vc); + lambda[1] = _affineCoordinate(3, uc, vc); + lambda[2] = _affineCoordinate(1, uc, vc); + + double product = lambda[0] * lambda[1] * lambda[2]; + if(flag1 == 1 && flag2 == -1) { + double copy = lambda[0]; + lambda[0] = lambda[1]; + lambda[1] = copy; + } + else if(flag1 == 0 && flag2 == -1) { + double copy = lambda[2]; + lambda[2] = lambda[1]; + lambda[1] = copy; + } + else if(flag1 == 2 && flag2 == -1) { + double copy = lambda[2]; + lambda[2] = lambda[0]; + lambda[0] = copy; + } + else if(flag1 == 1 && flag2 == 1) { + double copy = lambda[0]; + lambda[0] = lambda[1]; + lambda[1] = lambda[2]; + lambda[2] = copy; + } + else if(flag1 == 2 && flag2 == 1) { + double copy = lambda[0]; + lambda[0] = lambda[2]; + lambda[2] = lambda[1]; + lambda[1] = copy; + } + double subs1 = lambda[1] - lambda[0]; + double subs2 = lambda[0] - lambda[2]; + std::vector<double> phiSubs2(_pf - 2); + for(int it = 0; it < _pf - 2; it++) { + phiSubs2[it] = OrthogonalPoly::EvalKernelFunction(it, subs2); + } + for(int n1 = 0; n1 < _pf - 2; n1++) { + double phiSubs1 = OrthogonalPoly::EvalKernelFunction(n1, subs1); + for(int n2 = 0; n2 < _pf - 2 - n1; n2++) { + faceBasis[iterator] = product * phiSubs1 * phiSubs2[n2]; + iterator++; + } + } + } +} + +void HierarchicalBasisH1Tria::orientFace( + double const &u, double const &v, double const &w, int const &flag1, + int const &flag2, int const &flag3, int const &faceNumber, + std::vector<std::vector<double> > &gradientFace, std::string typeFunction) +{ + if(!(flag1 == 0 && flag2 == 1)) { + // to map onto the reference domain of gmsh: + double uc = 2 * u - 1; + double vc = 2 * v - 1; + //***** + int iterator = 0; + std::vector<double> lambda(3); + std::vector<std::vector<double> > dlambda(3, std::vector<double>(2, 0)); + std::vector<double> dProduct(2); // gradient of (lambdaA*lambdaB*lambdaC) + + lambda[0] = _affineCoordinate(2, uc, vc); + lambda[1] = _affineCoordinate(3, uc, vc); + lambda[2] = _affineCoordinate(1, uc, vc); + dlambda[0][0] = -1; //* jacobian + dlambda[0][1] = -1; //* jacobian + dlambda[1][0] = 1; //* jacobian + dlambda[2][1] = 1; //* jacobian + double pl3l1 = lambda[1] * lambda[2]; + dProduct[0] = lambda[2] * lambda[0] - pl3l1; + dProduct[1] = lambda[0] * lambda[1] - pl3l1; + double product = lambda[0] * lambda[1] * lambda[2]; + if(flag1 == 1 && flag2 == -1) { + double copy = lambda[0]; + lambda[0] = lambda[1]; + lambda[1] = copy; + std::vector<double> dcopy = dlambda[0]; + dlambda[0] = dlambda[1]; + dlambda[1] = dcopy; + } + else if(flag1 == 0 && flag2 == -1) { + double copy = lambda[2]; + lambda[2] = lambda[1]; + lambda[1] = copy; + std::vector<double> dcopy = dlambda[2]; + dlambda[2] = dlambda[1]; + dlambda[1] = dcopy; + } + else if(flag1 == 2 && flag2 == -1) { + double copy = lambda[2]; + lambda[2] = lambda[0]; + lambda[0] = copy; + std::vector<double> dcopy = dlambda[2]; + dlambda[2] = dlambda[0]; + dlambda[0] = dcopy; + } + else if(flag1 == 1 && flag2 == 1) { + double copy = lambda[0]; + lambda[0] = lambda[1]; + lambda[1] = lambda[2]; + lambda[2] = copy; + std::vector<double> dcopy = dlambda[0]; + dlambda[0] = dlambda[1]; + dlambda[1] = dlambda[2]; + dlambda[2] = dcopy; + } + else if(flag1 == 2 && flag2 == 1) { + double copy = lambda[0]; + lambda[0] = lambda[2]; + lambda[2] = lambda[1]; + lambda[1] = copy; + std::vector<double> dcopy = dlambda[0]; + dlambda[0] = dlambda[2]; + dlambda[2] = dlambda[1]; + dlambda[1] = dcopy; + } + double subsBA = lambda[1] - lambda[0]; + double subsAC = lambda[0] - lambda[2]; + std::vector<double> dsubsBA(2); + std::vector<double> dsubsAC(2); + for(int i = 0; i < 2; i++) { + dsubsBA[i] = dlambda[1][i] - dlambda[0][i]; + dsubsAC[i] = dlambda[0][i] - dlambda[2][i]; + } + std::vector<double> phiSubsAC(_pf - 2); + std::vector<double> dphiSubsAC(_pf - 2); + for(int it = 0; it < _pf - 2; it++) { + phiSubsAC[it] = OrthogonalPoly::EvalKernelFunction(it, subsAC); + dphiSubsAC[it] = OrthogonalPoly::EvalDKernelFunction(it, subsAC); + } + for(int n1 = 0; n1 < _pf - 2; n1++) { + double phiBA = OrthogonalPoly::EvalKernelFunction(n1, subsBA); + double dphiBA = OrthogonalPoly::EvalDKernelFunction(n1, subsBA); + for(int n2 = 0; n2 < _pf - 2 - n1; n2++) { + for(int i = 0; i < 2; i++) { + gradientFace[iterator][i] = + dProduct[i] * phiBA * phiSubsAC[n2] + + product * dphiBA * dsubsBA[i] * phiSubsAC[n2] + + product * phiBA * dsubsAC[i] * dphiSubsAC[n2]; + } + iterator++; + } + } + } +} diff --git a/Numeric/HierarchicalBasisH1Tria.h b/Numeric/HierarchicalBasisH1Tria.h new file mode 100644 index 0000000000000000000000000000000000000000..82e102b560f3e213db58a391e9b6cd905b926675 --- /dev/null +++ b/Numeric/HierarchicalBasisH1Tria.h @@ -0,0 +1,93 @@ +// Gmsh - Copyright (C) 1997-2019 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. +// +// Contributed by Ismail Badia. +// Reference : "Higher-Order Finite Element Methods"; Pavel Solin, Karel +// Segeth , +// Ivo Dolezel , Chapman and Hall/CRC; Edition : Har/Cdr (2003). + +#ifndef HIERARCHICAL_BASIS_H1_TRIA_H +#define HIERARCHICAL_BASIS_H1_TRIA_H + +#include <algorithm> +#include "HierarchicalBasisH1.h" + +/* + * MTriangle + * + * v + * ^ + * | + * 2 + * |`\ + * | `\ + * | `\ + * | `\ + * v `\ + * 0---------->1 --> u + * + * + * Oriented Edges: + * e0={v0;v1} e1={v1;v2} e2={v2;v0} + * pe0,pe1,pe2<=pf + * + */ +class HierarchicalBasisH1Tria : public HierarchicalBasisH1 { +public: + HierarchicalBasisH1Tria(int pf, int pe0, int pe1, int pe2); + HierarchicalBasisH1Tria(int order); + virtual ~HierarchicalBasisH1Tria(); + // vertexBasis=[v0,...,v2] + // edgeBasis=[phie0_{2},...phie0_{pe0-1},phie1_{2},...phie1_{pe1-1}...] + // faceBasis=[phief_{1,1},...,phief_{1,pf-2},phief_{2,1},...,phief_{2,pf2-3},phief_{1,1}...] + virtual void generateBasis(double const &u, double const &v, double const &w, + std::vector<double> &vertexBasis, + std::vector<double> &edgeBasis, + std::vector<double> &faceBasis, + std::vector<double> &bubbleBasis); + + virtual void generateBasis(double const &u, double const &v, double const &w, + std::vector<std::vector<double> > &vertexBasis, + std::vector<std::vector<double> > &edgeBasis, + std::vector<std::vector<double> > &faceBasis, + std::vector<std::vector<double> > &bubbleBasis, + std::string typeFunction = "GradH1Legendre") + { + generateGradientBasis(u, v, w, vertexBasis, edgeBasis, faceBasis, + bubbleBasis); + } + + virtual void orientEdge(int const &flagOrientation, int const &edgeNumber, + std::vector<double> &edgeBasis); + virtual void orientEdge(int const &flagOrientation, int const &edgeNumber, + std::vector<std::vector<double> > &edgeBasis); + + virtual void orientFace(double const &u, double const &v, double const &w, + int const &flag1, int const &flag2, int const &flag3, + int const &faceNumber, + std::vector<double> &faceBasis); + + virtual void orientFace(double const &u, double const &v, double const &w, + int const &flag1, int const &flag2, int const &flag3, + int const &faceNumber, + std::vector<std::vector<double> > &faceBasis, + std::string typeFunction = "GradH1Legendre"); + +private: + int _pf; // face function order + int _pOrderEdge[3]; // Edge functions order (pOrderEdge[0] matches the edge 0 + // order) + static double + _affineCoordinate(int const &j, double const &u, + double const &v); // affine coordinate lambdaj j=1..3 + + void generateGradientBasis(double const &u, double const &v, double const &w, + std::vector<std::vector<double> > &gradientVertex, + std::vector<std::vector<double> > &gradientEdge, + std::vector<std::vector<double> > &gradientFace, + std::vector<std::vector<double> > &gradientBubble); +}; + +#endif diff --git a/Numeric/HierarchicalBasisHcurl.cpp b/Numeric/HierarchicalBasisHcurl.cpp new file mode 100644 index 0000000000000000000000000000000000000000..3d5dba27da14c765decb6ad826f2fce8b95f8e5e --- /dev/null +++ b/Numeric/HierarchicalBasisHcurl.cpp @@ -0,0 +1,10 @@ +// Gmsh - Copyright (C) 1997-2019 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. +// +// Contributed by Ismail Badia. + +#include "HierarchicalBasisHcurl.h" + +HierarchicalBasisHcurl::~HierarchicalBasisHcurl() {} diff --git a/Numeric/HierarchicalBasisHcurl.h b/Numeric/HierarchicalBasisHcurl.h new file mode 100644 index 0000000000000000000000000000000000000000..dbe88960d33ad6478377dcd04e100f3e1cb5e12e --- /dev/null +++ b/Numeric/HierarchicalBasisHcurl.h @@ -0,0 +1,48 @@ +// Gmsh - Copyright (C) 1997-2019 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. +// +// Contributed by Ismail Badia. +// Reference : "Higher-Order Finite Element Methods"; Pavel Solin, Karel +// Segeth , +// Ivo Dolezel , Chapman and Hall/CRC; Edition : Har/Cdr (2003). + +#ifndef HIERARCHICAL_BASIS_HCURL_H +#define HIERARCHICAL_BASIS_HCURL_H + +#include "HierarchicalBasis.h" + +class HierarchicalBasisHcurl : public HierarchicalBasis { +public: + virtual ~HierarchicalBasisHcurl() = 0; + virtual void generateBasis(double const &u, double const &v, double const &w, + std::vector<double> &vertexBasis, + std::vector<double> &edgeBasis, + std::vector<double> &faceBasis, + std::vector<double> &bubbleBasis){}; + virtual void + generateBasis(double const &u, double const &v, double const &w, + std::vector<std::vector<double> > &vertexBasis, + std::vector<std::vector<double> > &edgeBasis, + std::vector<std::vector<double> > &faceBasis, + std::vector<std::vector<double> > &bubbleBasis, + std::string typeFunction) = 0; // typeFunction = HcurlLegendre, + // CurlHcurlLegendre + virtual void orientEdge(int const &flagOrientation, int const &edgeNumber, + std::vector<std::vector<double> > &edgeFunctions) = 0; + virtual void orientFace(double const &u, double const &v, double const &w, + int const &flag1, int const &flag2, int const &flag3, + int const &faceNumber, + std::vector<std::vector<double> > &faceFunctions, + std::string typeFunction) = 0; + + virtual void orientEdge(int const &flagOrientation, int const &edgeNumber, + std::vector<double> &edgeFunctions){}; + virtual void orientFace(double const &u, double const &v, double const &w, + int const &flag1, int const &flag2, int const &flag3, + int const &faceNumber, + std::vector<double> &faceFunctions){}; +}; + +#endif diff --git a/Numeric/HierarchicalBasisHcurlBrick.cpp b/Numeric/HierarchicalBasisHcurlBrick.cpp new file mode 100644 index 0000000000000000000000000000000000000000..affbdd116ac2f156d749a11526f9dbd356f0fcad --- /dev/null +++ b/Numeric/HierarchicalBasisHcurlBrick.cpp @@ -0,0 +1,850 @@ +// Gmsh - Copyright (C) 1997-2019 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. +// +// Contributed by Ismail Badia. + +#include "HierarchicalBasisHcurlBrick.h" + +HierarchicalBasisHcurlBrick::HierarchicalBasisHcurlBrick(int order) +{ + _pb1 = order; + _pb2 = order; + _pb3 = order; + for(int i = 0; i < 12; i++) { _pOrderEdge[i] = order; } + for(int j = 0; j < 6; j++) { + _pOrderFace1[j] = order; + _pOrderFace2[j] = order; + } + _nvertex = 8; + _nedge = 12; + _nfaceQuad = 6; + _nfaceTri = 0; + _nVertexFunction = 0; + _nEdgeFunction = 12 * order + 12; + _nQuadFaceFunction = 12 * order * (order + 1); + _nTriFaceFunction = 0; + _nBubbleFunction = 3 * order * order * (order + 1); +} + +HierarchicalBasisHcurlBrick::~HierarchicalBasisHcurlBrick() {} + +double HierarchicalBasisHcurlBrick::_affineCoordinate(const int &j, + const double &u, + const double &v, + const double &w) +{ + switch(j) { + case(1): return 0.5 * (1 + u); + case(2): return 0.5 * (1 - u); + case(3): return 0.5 * (1 + v); + case(4): return 0.5 * (1 - v); + case(5): return 0.5 * (1 + w); + case(6): return 0.5 * (1 - w); + default: throw std::string("j must be : 1<=j<=6"); + } +} + +void HierarchicalBasisHcurlBrick::generateBasis( + double const &u, double const &v, double const &w, + std::vector<std::vector<double> > &edgeBasis, + std::vector<std::vector<double> > &faceBasis, + std::vector<std::vector<double> > &bubbleBasis) +{ + std::vector<std::vector<double> > lobattoVector(3); + lobattoVector[0] = std::vector<double>(_pb1); + lobattoVector[1] = std::vector<double>(_pb2); + lobattoVector[2] = std::vector<double>(_pb3); + for(int it = 2; it <= _pb1 + 1; it++) { + lobattoVector[0][it - 2] = OrthogonalPoly::EvalLobatto(it, u); + } + for(int it = 2; it <= _pb2 + 1; it++) { + lobattoVector[1][it - 2] = OrthogonalPoly::EvalLobatto(it, v); + } + for(int it = 2; it <= _pb3 + 1; it++) { + lobattoVector[2][it - 2] = OrthogonalPoly::EvalLobatto(it, w); + } + + std::vector<std::vector<double> > legendreVector(3); + legendreVector[0] = std::vector<double>(_pb1 + 1); + legendreVector[1] = std::vector<double>(_pb2 + 1); + legendreVector[2] = std::vector<double>(_pb3 + 1); + for(unsigned int k = 0; k < legendreVector[0].size(); k++) { + legendreVector[0][k] = OrthogonalPoly::EvalLegendre(k, u); + } + for(unsigned int k = 0; k < legendreVector[1].size(); k++) { + legendreVector[1][k] = OrthogonalPoly::EvalLegendre(k, v); + } + for(unsigned int k = 0; k < legendreVector[2].size(); k++) { + legendreVector[2][k] = OrthogonalPoly::EvalLegendre(k, w); + } + std::vector<double> lambda(6, 0); + lambda[0] = _affineCoordinate(1, u, v, w); + lambda[1] = _affineCoordinate(2, u, v, w); + lambda[2] = _affineCoordinate(3, u, v, w); + lambda[3] = _affineCoordinate(4, u, v, w); + lambda[4] = _affineCoordinate(5, u, v, w); + lambda[5] = _affineCoordinate(6, u, v, w); + std::vector<double> product(12, 0); + product[0] = lambda[3] * lambda[5]; + product[1] = lambda[1] * lambda[5]; + product[2] = lambda[1] * lambda[3]; + product[3] = lambda[0] * lambda[5]; + product[4] = lambda[3] * lambda[0]; + product[5] = lambda[2] * lambda[5]; + product[6] = lambda[2] * lambda[0]; + product[7] = lambda[2] * lambda[1]; + product[8] = lambda[3] * lambda[4]; + product[9] = lambda[4] * lambda[1]; + product[10] = lambda[4] * lambda[0]; + product[11] = lambda[4] * lambda[2]; + int indexEdgeBasis = 0; + for(int iEdge = 0; iEdge < _nedge; iEdge++) { + int uvw = 0; + std::vector<double> direction(3, 0); + switch(iEdge) { + case(0): + case(5): + case(8): + case(11): + uvw = 0; + direction[0] = 1; + break; + case(1): + case(3): + case(9): + case(10): + uvw = 1; + direction[1] = 1; + break; + case(2): + case(4): + case(6):; + case(7): + uvw = 2; + direction[2] = 1; + break; + } + for(int indexEdgeFunc = 0; indexEdgeFunc < _pOrderEdge[iEdge] + 1; + indexEdgeFunc++) { + for(int j = 0; j < 3; j++) { + edgeBasis[indexEdgeBasis][j] = + direction[j] * legendreVector[uvw][indexEdgeFunc] * product[iEdge]; + } + indexEdgeBasis++; + } + } + // face functions: + int indexFaceFunction = 0; + for(int iFace = 0; iFace < _nfaceQuad; iFace++) { + int indexLambda = 0; + std::vector<double> direction1(3, 0); + std::vector<double> direction2(3, 0); + int uvw1 = 0; + int uvw2 = 0; + switch(iFace) { + case(0): + indexLambda = 5; + uvw1 = 0; + uvw2 = 1; + direction1[0] = 1; + direction2[1] = 1; + break; + case(1): + indexLambda = 3; + uvw1 = 0; + uvw2 = 2; + direction1[0] = 1; + direction2[2] = 1; + break; + case(2): + indexLambda = 1; + uvw1 = 1; + uvw2 = 2; + direction1[1] = 1; + direction2[2] = 1; + break; + case(3): + indexLambda = 0; + uvw1 = 1; + uvw2 = 2; + direction1[1] = 1; + direction2[2] = 1; + break; + case(4): + indexLambda = 2; + uvw1 = 0; + uvw2 = 2; + direction1[0] = 1; + direction2[2] = 1; + break; + case(5): + indexLambda = 4; + uvw1 = 0; + uvw2 = 1; + direction1[0] = 1; + direction2[1] = 1; + break; + } + for(int index1 = 0; index1 < _pOrderFace1[iFace] + 1; index1++) { + for(int index2 = 0; index2 < _pOrderFace2[iFace]; index2++) { + for(int j = 0; j < 3; j++) { + faceBasis[indexFaceFunction][j] = + lambda[indexLambda] * legendreVector[uvw1][index1] * + lobattoVector[uvw2][index2] * direction1[j]; + } + + indexFaceFunction++; + } + } + for(int index1 = 0; index1 < _pOrderFace1[iFace]; index1++) { + for(int index2 = 0; index2 < _pOrderFace2[iFace] + 1; index2++) { + for(int j = 0; j < 3; j++) { + faceBasis[indexFaceFunction][j] = + lambda[indexLambda] * lobattoVector[uvw1][index1] * + legendreVector[uvw2][index2] * direction2[j]; + } + + indexFaceFunction++; + } + } + } + // bubble shape functions: + int indexBubbleBasis = 0; + for(int ipb1 = 0; ipb1 < _pb1 + 1; ipb1++) { + for(int ipb2 = 0; ipb2 < _pb2; ipb2++) { + for(int ipb3 = 0; ipb3 < _pb3; ipb3++) { + bubbleBasis[indexBubbleBasis][0] = legendreVector[0][ipb1] * + lobattoVector[1][ipb2] * + lobattoVector[2][ipb3]; + bubbleBasis[indexBubbleBasis][1] = 0; + bubbleBasis[indexBubbleBasis][2] = 0; + indexBubbleBasis++; + } + } + } + for(int ipb1 = 0; ipb1 < _pb1; ipb1++) { + for(int ipb2 = 0; ipb2 < _pb2 + 1; ipb2++) { + for(int ipb3 = 0; ipb3 < _pb3; ipb3++) { + bubbleBasis[indexBubbleBasis][0] = 0; + bubbleBasis[indexBubbleBasis][1] = lobattoVector[0][ipb1] * + legendreVector[1][ipb2] * + lobattoVector[2][ipb3]; + bubbleBasis[indexBubbleBasis][2] = 0; + indexBubbleBasis++; + } + } + } + for(int ipb1 = 0; ipb1 < _pb1; ipb1++) { + for(int ipb2 = 0; ipb2 < _pb2; ipb2++) { + for(int ipb3 = 0; ipb3 < _pb3 + 1; ipb3++) { + bubbleBasis[indexBubbleBasis][0] = 0; + bubbleBasis[indexBubbleBasis][1] = 0; + bubbleBasis[indexBubbleBasis][2] = lobattoVector[0][ipb1] * + lobattoVector[1][ipb2] * + legendreVector[2][ipb3]; + indexBubbleBasis++; + } + } + } +} + +void HierarchicalBasisHcurlBrick::orientEdge( + int const &flagOrientation, int const &edgeNumber, + std::vector<std::vector<double> > &gradientEdge) +{ + if(flagOrientation == -1) { + int constant1 = 0; + int constant2 = 0; + for(int i = 0; i <= edgeNumber; i++) { constant2 += _pOrderEdge[i] + 1; } + constant2 = constant2 - 1; + constant1 = constant2 - _pOrderEdge[edgeNumber]; + for(int k = constant1; k <= constant2; k++) { + if((k - constant1) % 2 != 0) { + gradientEdge[k][0] = gradientEdge[k][0] * (-1); + gradientEdge[k][1] = gradientEdge[k][1] * (-1); + gradientEdge[k][2] = gradientEdge[k][2] * (-1); + } + } + } +} + +void HierarchicalBasisHcurlBrick::orientFace( + double const &u, double const &v, double const &w, int const &flag1, + int const &flag2, int const &flag3, int const &faceNumber, + std::vector<std::vector<double> > &faceFunctions, std::string typeFunction) +{ + if(!(flag1 == 1 && flag2 == 1 && flag3 == 1)) { + int iterator = 0; + for(int i = 0; i < faceNumber; i++) { + iterator += (_pOrderFace1[i] + 1) * _pOrderFace2[i] + + (_pOrderFace2[i] + 1) * _pOrderFace1[i]; + } + if(flag3 == 1) { + for(int it1 = 0; it1 < _pOrderFace1[faceNumber] + 1; it1++) { + for(int it2 = 0; it2 < _pOrderFace2[faceNumber]; it2++) { + int impactFlag1 = 1; + int impactFlag2 = 1; + if(flag1 == -1 && it1 % 2 != 0) { impactFlag1 = -1; } + if(flag2 == -1 && it2 % 2 != 0) { impactFlag2 = -1; } + faceFunctions[iterator][0] = + faceFunctions[iterator][0] * impactFlag1 * impactFlag2; + faceFunctions[iterator][1] = + faceFunctions[iterator][1] * impactFlag1 * impactFlag2; + faceFunctions[iterator][2] = + faceFunctions[iterator][2] * impactFlag1 * impactFlag2; + iterator++; + } + } + } + else { + if(typeFunction == "HcurlLegendre") { + std::vector<double> uvw(3); + uvw[0] = u; + uvw[1] = v; + uvw[2] = w; + double lambda = 0; + int var1 = 0; + int var2 = 0; + switch(faceNumber) { + case(0): + lambda = _affineCoordinate(6, u, v, w); + var1 = 0; + var2 = 1; + break; + case(1): + lambda = _affineCoordinate(4, u, v, w); + var1 = 0; + var2 = 2; + break; + case(2): + lambda = _affineCoordinate(2, u, v, w); + var1 = 1; + var2 = 2; + break; + case(3): + lambda = _affineCoordinate(1, u, v, w); + var1 = 1; + var2 = 2; + break; + case(4): + lambda = _affineCoordinate(3, u, v, w); + var1 = 0; + var2 = 2; + break; + case(5): + lambda = _affineCoordinate(5, u, v, w); + var1 = 0; + var2 = 1; + break; + } + std::vector<double> lkVector1(_pOrderFace2[faceNumber]); + std::vector<double> lkVector2(_pOrderFace1[faceNumber]); + std::vector<double> legendreVector1(_pOrderFace1[faceNumber] + 1); + std::vector<double> legendreVector2(_pOrderFace2[faceNumber] + 1); + for(int it = 2; it <= _pOrderFace2[faceNumber] + 1; it++) { + lkVector1[it - 2] = OrthogonalPoly::EvalLobatto(it, uvw[var2]); + } + for(int it = 2; it <= _pOrderFace1[faceNumber] + 1; it++) { + lkVector2[it - 2] = OrthogonalPoly::EvalLobatto(it, uvw[var1]); + } + for(int it = 0; it <= _pOrderFace1[faceNumber]; it++) { + legendreVector1[it] = OrthogonalPoly::EvalLegendre(it, uvw[var1]); + } + for(int it = 0; it <= _pOrderFace2[faceNumber]; it++) { + legendreVector2[it] = OrthogonalPoly::EvalLegendre(it, uvw[var2]); + } + std::vector<double> direction1(3, 0); + direction1[var1] = 1; + for(int it1 = 0; it1 < _pOrderFace2[faceNumber]; it1++) { + for(int it2 = 0; it2 < _pOrderFace1[faceNumber] + 1; it2++) { + int impactFlag1 = 1; + int impactFlag2 = 1; + if(flag2 == -1 && it1 % 2 != 0) { impactFlag1 = -1; } + if(flag1 == -1 && it2 % 2 != 0) { impactFlag2 = -1; } + for(int itVector = 0; itVector < 3; itVector++) { + faceFunctions[iterator][itVector] = + lambda * legendreVector1[it2] * lkVector1[it1] * impactFlag1 * + impactFlag2 * direction1[itVector]; + } + iterator++; + } + } + std::vector<double> direction2(3, 0); + direction2[var2] = 1; + for(int it1 = 0; it1 < _pOrderFace2[faceNumber] + 1; it1++) { + for(int it2 = 0; it2 < _pOrderFace1[faceNumber]; it2++) { + int impactFlag1 = 1; + int impactFlag2 = 1; + if(flag2 == -1 && it1 % 2 != 0) { impactFlag1 = -1; } + if(flag1 == -1 && it2 % 2 != 0) { impactFlag2 = -1; } + for(int itVector = 0; itVector < 3; itVector++) { + faceFunctions[iterator][itVector] = + lambda * legendreVector2[it1] * lkVector2[it2] * impactFlag1 * + impactFlag2 * direction2[itVector]; + } + iterator++; + } + } + } + else if(typeFunction == "CurlHcurlLegendre") { + int indexFaceFunction = 0; + for(int iFace = 0; iFace < _nfaceQuad; iFace++) { + std::vector<double> vec1(3, 0); + std::vector<double> vec2(3, 0); + std::vector<double> uvw(3); + uvw[0] = u; + uvw[1] = v; + uvw[2] = w; + int uvw1 = 0; + int uvw2 = 0; + int il1 = 0; + int jl1 = 0; + int il2 = 0; + int jl2 = 0; + switch(iFace) { + case(0): + uvw1 = 0; + uvw2 = 1; + vec1[1] = -0.5; + vec1[2] = -_affineCoordinate(6, u, v, w); + ; + il1 = 2; + jl1 = 1; + vec2[0] = 0.5; + vec2[2] = _affineCoordinate(6, u, v, w); + ; + il2 = 2; + jl2 = 0; + break; + case(1): + uvw1 = 0; + uvw2 = 2; + vec1[1] = _affineCoordinate(4, u, v, w); + ; + vec1[2] = 0.5; + il1 = 1; + jl1 = 2; + vec2[0] = -0.5; + vec2[1] = -_affineCoordinate(4, u, v, w); + ; + il2 = 1; + jl2 = 0; + break; + case(2): + uvw1 = 1; + uvw2 = 2; + vec1[0] = -_affineCoordinate(2, u, v, w); + ; + vec1[2] = -0.5; + il1 = 0; + jl1 = 2; + vec2[0] = -0.5; + vec2[1] = -_affineCoordinate(2, u, v, w); + ; + il2 = 1; + jl2 = 0; + break; + case(3): + uvw1 = 1; + uvw2 = 2; + vec1[0] = -_affineCoordinate(1, u, v, w); + ; + vec1[2] = 0.5; + il1 = 0; + jl1 = 2; + vec2[0] = 0.5; + vec2[1] = -_affineCoordinate(1, u, v, w); + ; + il2 = 1; + jl2 = 0; + break; + case(4): + uvw1 = 0; + uvw2 = 2; + vec1[1] = _affineCoordinate(3, u, v, w); + ; + vec1[2] = -0.5; + il1 = 1; + jl1 = 2; + vec2[0] = 0.5; + vec2[1] = -_affineCoordinate(3, u, v, w); + ; + il2 = 1; + jl2 = 0; + break; + case(5): + uvw1 = 0; + uvw2 = 1; + vec1[1] = 0.5; + vec1[2] = -_affineCoordinate(5, u, v, w); + ; + il1 = 2; + jl1 = 1; + vec2[0] = -0.5; + vec2[2] = _affineCoordinate(5, u, v, w); + ; + il2 = 2; + jl2 = 0; + break; + } + std::vector<double> lkVector1(_pOrderFace2[faceNumber]); + std::vector<double> lkVector2(_pOrderFace1[faceNumber]); + std::vector<double> dlkVector1(_pOrderFace2[faceNumber]); + std::vector<double> dlkVector2(_pOrderFace1[faceNumber]); + std::vector<double> legendreVector1(_pOrderFace1[faceNumber] + 1); + std::vector<double> legendreVector2(_pOrderFace2[faceNumber] + 1); + for(int it = 2; it <= _pOrderFace2[faceNumber] + 1; it++) { + lkVector1[it - 2] = OrthogonalPoly::EvalLobatto(it, uvw[uvw2]); + dlkVector1[it - 2] = OrthogonalPoly::EvalDLobatto(it, uvw[uvw2]); + } + for(int it = 2; it <= _pOrderFace1[faceNumber] + 1; it++) { + lkVector2[it - 2] = OrthogonalPoly::EvalLobatto(it, uvw[uvw1]); + dlkVector2[it - 2] = OrthogonalPoly::EvalDLobatto(it, uvw[uvw1]); + } + for(int it = 0; it <= _pOrderFace1[faceNumber]; it++) { + legendreVector1[it] = OrthogonalPoly::EvalLegendre(it, uvw[uvw1]); + } + for(int it = 0; it <= _pOrderFace2[faceNumber]; it++) { + legendreVector2[it] = OrthogonalPoly::EvalLegendre(it, uvw[uvw2]); + } + for(int it1 = 0; it1 < _pOrderFace2[faceNumber]; it1++) { + for(int it2 = 0; it2 < _pOrderFace1[faceNumber] + 1; it2++) { + int impactFlag1 = 1; + int impactFlag2 = 1; + if(flag2 == -1 && it1 % 2 != 0) { impactFlag1 = -1; } + if(flag1 == -1 && it2 % 2 != 0) { impactFlag2 = -1; } + for(int j = 0; j < 3; j++) { + if(j == jl1) { + faceFunctions[indexFaceFunction][j] = + vec1[j] * legendreVector1[it2] * lkVector1[it1] * + impactFlag1 * impactFlag2; + } + else if(j == il1) { + faceFunctions[indexFaceFunction][j] = + vec1[j] * legendreVector1[it2] * lkVector1[it1] * + impactFlag1 * impactFlag2; + } + else { + faceFunctions[indexFaceFunction][j] = 0; + } + } + indexFaceFunction++; + } + } + for(int it1 = 0; it1 < _pOrderFace2[faceNumber] + 1; it1++) { + for(int it2 = 0; it2 < _pOrderFace1[faceNumber]; it2++) { + int impactFlag1 = 1; + int impactFlag2 = 1; + if(flag2 == -1 && it1 % 2 != 0) { impactFlag1 = -1; } + if(flag1 == -1 && it2 % 2 != 0) { impactFlag2 = -1; } + for(int j = 0; j < 3; j++) { + if(j == jl2) { + faceFunctions[indexFaceFunction][j] = + vec2[j] * lkVector2[it2] * legendreVector2[it1] * + impactFlag1 * impactFlag2; + } + else if(j == il2) { + faceFunctions[indexFaceFunction][j] = + vec2[j] * lkVector2[it2] * legendreVector2[it1] * + impactFlag1 * impactFlag2; + } + else { + faceFunctions[indexFaceFunction][j] = 0; + } + } + indexFaceFunction++; + } + } + } + } + else { + throw std::string("unknown typeFunction"); + } + } + } +} + +void HierarchicalBasisHcurlBrick::generateCurlBasis( + double const &u, double const &v, double const &w, + std::vector<std::vector<double> > &edgeBasis, + std::vector<std::vector<double> > &faceBasis, + std::vector<std::vector<double> > &bubbleBasis) +{ + std::vector<std::vector<double> > lobattoVector(3); + lobattoVector[0] = std::vector<double>(_pb1); + lobattoVector[1] = std::vector<double>(_pb2); + lobattoVector[2] = std::vector<double>(_pb3); + std::vector<std::vector<double> > dlobattoVector(3); + dlobattoVector[0] = std::vector<double>(_pb1); + dlobattoVector[1] = std::vector<double>(_pb2); + dlobattoVector[2] = std::vector<double>(_pb3); + for(int it = 2; it <= _pb1 + 1; it++) { + lobattoVector[0][it - 2] = OrthogonalPoly::EvalLobatto(it, u); + dlobattoVector[0][it - 2] = OrthogonalPoly::EvalDLobatto(it, u); + } + for(int it = 2; it <= _pb2 + 1; it++) { + lobattoVector[1][it - 2] = OrthogonalPoly::EvalLobatto(it, v); + dlobattoVector[1][it - 2] = OrthogonalPoly::EvalDLobatto(it, v); + } + for(int it = 2; it <= _pb3 + 1; it++) { + lobattoVector[2][it - 2] = OrthogonalPoly::EvalLobatto(it, w); + dlobattoVector[2][it - 2] = OrthogonalPoly::EvalDLobatto(it, w); + } + + std::vector<std::vector<double> > legendreVector(3); + legendreVector[0] = std::vector<double>(_pb1 + 1); + legendreVector[1] = std::vector<double>(_pb2 + 1); + legendreVector[2] = std::vector<double>(_pb3 + 1); + for(unsigned int k = 0; k < legendreVector[0].size(); k++) { + legendreVector[0][k] = OrthogonalPoly::EvalLegendre(k, u); + } + for(unsigned int k = 0; k < legendreVector[1].size(); k++) { + legendreVector[1][k] = OrthogonalPoly::EvalLegendre(k, v); + } + for(unsigned int k = 0; k < legendreVector[2].size(); k++) { + legendreVector[2][k] = OrthogonalPoly::EvalLegendre(k, w); + } + std::vector<double> lambda(6, 0); + lambda[0] = _affineCoordinate(1, u, v, w); + lambda[1] = _affineCoordinate(2, u, v, w); + lambda[2] = _affineCoordinate(3, u, v, w); + lambda[3] = _affineCoordinate(4, u, v, w); + lambda[4] = _affineCoordinate(5, u, v, w); + lambda[5] = _affineCoordinate(6, u, v, w); + + std::vector<double> dlambda(6, 0); + + dlambda[0] = 0.5; + dlambda[1] = -0.5; + dlambda[2] = 0.5; + dlambda[3] = -0.5; + dlambda[4] = 0.5; + dlambda[5] = -0.5; + std::vector<std::vector<double> > curlProduct(12, std::vector<double>(3, 0)); + curlProduct[0][1] = lambda[3] * dlambda[5]; + curlProduct[0][2] = -dlambda[3] * lambda[5]; + curlProduct[5][1] = lambda[2] * dlambda[5]; + curlProduct[5][2] = -dlambda[2] * lambda[5]; + curlProduct[8][1] = lambda[3] * dlambda[4]; + curlProduct[8][2] = -dlambda[3] * lambda[4]; + curlProduct[11][1] = lambda[2] * dlambda[4]; + curlProduct[11][2] = -dlambda[2] * lambda[4]; + + curlProduct[1][0] = -lambda[1] * dlambda[5]; + curlProduct[1][2] = dlambda[1] * lambda[5]; + curlProduct[3][0] = -lambda[0] * dlambda[5]; + curlProduct[3][2] = dlambda[0] * lambda[5]; + curlProduct[9][0] = -lambda[1] * dlambda[4]; + curlProduct[9][2] = dlambda[1] * lambda[4]; + curlProduct[10][0] = -lambda[0] * dlambda[4]; + curlProduct[10][2] = dlambda[0] * lambda[4]; + + curlProduct[2][0] = lambda[1] * dlambda[3]; + curlProduct[2][1] = -dlambda[1] * lambda[3]; + curlProduct[4][0] = lambda[0] * dlambda[3]; + curlProduct[4][1] = -dlambda[0] * lambda[3]; + curlProduct[6][0] = lambda[0] * dlambda[2]; + curlProduct[6][1] = -dlambda[0] * lambda[2]; + curlProduct[7][0] = lambda[1] * dlambda[2]; + curlProduct[7][1] = -dlambda[1] * lambda[2]; + + int indexEdgeBasis = 0; + for(int iEdge = 0; iEdge < _nedge; iEdge++) { + int uvw = 0; + switch(iEdge) { + case(0): + case(5): + case(8): + case(11): uvw = 0; break; + case(1): + case(3): + case(9): + case(10): uvw = 1; break; + case(2): + case(4): + case(6):; + case(7): uvw = 2; break; + } + for(int indexEdgeFunc = 0; indexEdgeFunc < _pOrderEdge[iEdge] + 1; + indexEdgeFunc++) { + for(int j = 0; j < 3; j++) { + edgeBasis[indexEdgeBasis][j] = + curlProduct[iEdge][j] * legendreVector[uvw][indexEdgeFunc]; + } + indexEdgeBasis++; + } + } + // face functions: + int indexFaceFunction = 0; + for(int iFace = 0; iFace < _nfaceQuad; iFace++) { + std::vector<double> vec1(3, 0); + std::vector<double> vec2(3, 0); + int uvw1 = 0; + int uvw2 = 0; + int il1 = 0; + int jl1 = 0; + int il2 = 0; + int jl2 = 0; + switch(iFace) { + case(0): + uvw1 = 0; + uvw2 = 1; + vec1[1] = dlambda[5]; + vec1[2] = -lambda[5]; + il1 = 2; + jl1 = 1; + vec2[0] = -dlambda[5]; + vec2[2] = lambda[5]; + il2 = 2; + jl2 = 0; + break; + case(1): + uvw1 = 0; + uvw2 = 2; + vec1[1] = lambda[3]; + vec1[2] = -dlambda[3]; + il1 = 1; + jl1 = 2; + vec2[0] = dlambda[3]; + vec2[1] = -lambda[3]; + il2 = 1; + jl2 = 0; + break; + case(2): + uvw1 = 1; + uvw2 = 2; + vec1[0] = -lambda[1]; + vec1[2] = dlambda[1]; + il1 = 0; + jl1 = 2; + vec2[0] = dlambda[1]; + vec2[1] = -lambda[1]; + il2 = 1; + jl2 = 0; + break; + case(3): + uvw1 = 1; + uvw2 = 2; + vec1[0] = -lambda[0]; + vec1[2] = dlambda[0]; + il1 = 0; + jl1 = 2; + vec2[0] = dlambda[0]; + vec2[1] = -lambda[0]; + il2 = 1; + jl2 = 0; + break; + case(4): + uvw1 = 0; + uvw2 = 2; + vec1[1] = lambda[2]; + vec1[2] = -dlambda[2]; + il1 = 1; + jl1 = 2; + vec2[0] = dlambda[2]; + vec2[1] = -lambda[2]; + il2 = 1; + jl2 = 0; + break; + case(5): + uvw1 = 0; + uvw2 = 1; + vec1[1] = dlambda[4]; + vec1[2] = -lambda[4]; + il1 = 2; + jl1 = 1; + vec2[0] = -dlambda[4]; + vec2[2] = lambda[4]; + il2 = 2; + jl2 = 0; + break; + } + for(int index1 = 0; index1 < _pOrderFace1[iFace] + 1; index1++) { + for(int index2 = 0; index2 < _pOrderFace2[iFace]; index2++) { + for(int j = 0; j < 3; j++) { + if(j == jl1) { + faceBasis[indexFaceFunction][j] = vec1[j] * + legendreVector[uvw1][index1] * + lobattoVector[uvw2][index2]; + } + else if(j == il1) { + faceBasis[indexFaceFunction][j] = vec1[j] * + legendreVector[uvw1][index1] * + dlobattoVector[uvw2][index2]; + } + else { + faceBasis[indexFaceFunction][j] = 0; + } + } + indexFaceFunction++; + } + } + for(int index1 = 0; index1 < _pOrderFace1[iFace]; index1++) { + for(int index2 = 0; index2 < _pOrderFace2[iFace] + 1; index2++) { + for(int j = 0; j < 3; j++) { + if(j == jl2) { + faceBasis[indexFaceFunction][j] = vec2[j] * + lobattoVector[uvw1][index1] * + legendreVector[uvw2][index2]; + } + else if(j == il2) { + faceBasis[indexFaceFunction][j] = vec2[j] * + dlobattoVector[uvw1][index1] * + legendreVector[uvw2][index2]; + } + else { + faceBasis[indexFaceFunction][j] = 0; + } + } + indexFaceFunction++; + } + } + } + // bubble shape functions: + int indexBubbleBasis = 0; + for(int ipb1 = 0; ipb1 < _pb1 + 1; ipb1++) { + for(int ipb2 = 0; ipb2 < _pb2; ipb2++) { + for(int ipb3 = 0; ipb3 < _pb3; ipb3++) { + bubbleBasis[indexBubbleBasis][0] = 0; + bubbleBasis[indexBubbleBasis][1] = legendreVector[0][ipb1] * + lobattoVector[1][ipb2] * + dlobattoVector[2][ipb3]; + bubbleBasis[indexBubbleBasis][2] = -legendreVector[0][ipb1] * + dlobattoVector[1][ipb2] * + lobattoVector[2][ipb3]; + indexBubbleBasis++; + } + } + } + for(int ipb1 = 0; ipb1 < _pb1; ipb1++) { + for(int ipb2 = 0; ipb2 < _pb2 + 1; ipb2++) { + for(int ipb3 = 0; ipb3 < _pb3; ipb3++) { + bubbleBasis[indexBubbleBasis][0] = -lobattoVector[0][ipb1] * + legendreVector[1][ipb2] * + dlobattoVector[2][ipb3]; + bubbleBasis[indexBubbleBasis][1] = 0; + bubbleBasis[indexBubbleBasis][2] = dlobattoVector[0][ipb1] * + legendreVector[1][ipb2] * + lobattoVector[2][ipb3]; + indexBubbleBasis++; + } + } + } + for(int ipb1 = 0; ipb1 < _pb1; ipb1++) { + for(int ipb2 = 0; ipb2 < _pb2; ipb2++) { + for(int ipb3 = 0; ipb3 < _pb3 + 1; ipb3++) { + bubbleBasis[indexBubbleBasis][0] = lobattoVector[0][ipb1] * + dlobattoVector[1][ipb2] * + legendreVector[2][ipb3]; + bubbleBasis[indexBubbleBasis][1] = -dlobattoVector[0][ipb1] * + lobattoVector[1][ipb2] * + legendreVector[2][ipb3]; + bubbleBasis[indexBubbleBasis][2] = 0; + + indexBubbleBasis++; + } + } + } +} diff --git a/Numeric/HierarchicalBasisHcurlBrick.h b/Numeric/HierarchicalBasisHcurlBrick.h new file mode 100644 index 0000000000000000000000000000000000000000..ae2d626b95334f9dbefcad7763313312c2213be3 --- /dev/null +++ b/Numeric/HierarchicalBasisHcurlBrick.h @@ -0,0 +1,103 @@ +// Gmsh - Copyright (C) 1997-2019 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. +// +// Contributed by Ismail Badia. +// Reference : "Higher-Order Finite Element Methods"; Pavel Solin, Karel +// Segeth , +// Ivo Dolezel , Chapman and Hall/CRC; Edition : Har/Cdr (2003). + +#ifndef HIERARCHICAL_BASIS_HCURL_BRICK_H +#define HIERARCHICAL_BASIS_HCURL_BRICK_H + +#include "HierarchicalBasisHcurl.h" + +/* + * MHexahedron + * + * v + * 3----------2 + * |\ ^ |\ + * | \ | | \ + * | \ | | \ + * | 7------+---6 + * | | +-- |-- | -> u + * 0---+---\--1 | + * \ | \ \ | + * \ | \ \ | + * \| w \| + * 4----------5 + * + * Oriented Edges: + * e0={0, 1}, e1={0, 3}, e2={0, 4}, e3={1, 2}, e4 ={1, 5}, e5={2, 3},e6={2, 6}, + * e7={3, 7},e8={4, 5}, e9= {4, 7}, e10={5, 6}, e11={6, 7} + * + * Oritented Surface: + * s0={0, 1, 3, 2}, s1={0, 1, 4, 5}, s2={0, 3, 4, 7}, + * s3={1, 2, 5, 5}, s4={2, 3, 6, 6}, s5={4, 5, 7, 6} + * Local (directional) orders on mesh faces are not allowed to exceed the mini- + * mum of the (appropriate directional) orders of approximation associated with + * the interior of the adjacent elements. Local orders of approximation on mesh + * edges are limited by the minimum of all (appropriate directional) orders cor- + * responding to faces sharing that edge + */ +class HierarchicalBasisHcurlBrick : public HierarchicalBasisHcurl { +public: + HierarchicalBasisHcurlBrick(int order); + virtual ~HierarchicalBasisHcurlBrick(); + + virtual void generateBasis(double const &u, double const &v, double const &w, + std::vector<std::vector<double> > &vertexBasis, + std::vector<std::vector<double> > &edgeBasis, + std::vector<std::vector<double> > &faceBasis, + std::vector<std::vector<double> > &bubbleBasis, + std::string typeFunction) + { + if(typeFunction == "HcurlLegendre") { + generateBasis(u, v, w, edgeBasis, faceBasis, bubbleBasis); + } + else if("CurlHcurlLegendre" == typeFunction) { + generateCurlBasis(u, v, w, edgeBasis, faceBasis, bubbleBasis); + } + else { + throw std::string("unknown typeFunction"); + } + }; + virtual void orientEdge(int const &flagOrientation, int const &edgeNumber, + std::vector<std::vector<double> > &edgeBasis); + virtual void orientFace(double const &u, double const &v, double const &w, + int const &flag1, int const &flag2, int const &flag3, + int const &faceNumber, + std::vector<std::vector<double> > &faceFunctions, + std::string typeFunction); + +private: + int _pb1; // bubble function order in direction u + int _pb2; // bubble function order in direction v + int _pb3; // bubble function order in direction w + int _pOrderEdge[12]; // Edge functions order (pOrderEdge[0] matches the order + // of the edge 0) + int _pOrderFace1[6]; // Face functions order in direction u (pOrderFace1[0] + // matches the order of face 0 in direction u) + int _pOrderFace2[6]; // Face functions order in direction v (pOrderFace[0] + // matches the order of face 0 in direction v) + static double + _affineCoordinate(const int &j, const double &u, const double &v, + const double &w); // affine coordinate lambdaj j=1..6 + + // edgeBasis=[phie0_{0},...phie0_{pe0},phie1_{0},...phie1_{pe1}...] + // faceBasis=[phieFf1{n1,n2} (with 0<=n1<=pf1 , 2<=n2<=pf2+1), phieFf2{n1,n2} + // (with 2<=n1<=pf1+1 , 0<=n2<=pf2) ] bubbleBasis=[phieb1{n1,n2,n3} (with + // 0<=n1<=pb1 , 2<=n2<=pb2+1 , 2<=n3<=pb3+1)...] + virtual void generateBasis(double const &u, double const &v, double const &w, + std::vector<std::vector<double> > &edgeBasis, + std::vector<std::vector<double> > &faceBasis, + std::vector<std::vector<double> > &bubbleBasis); + virtual void + generateCurlBasis(double const &u, double const &v, double const &w, + std::vector<std::vector<double> > &edgeBasis, + std::vector<std::vector<double> > &faceBasis, + std::vector<std::vector<double> > &bubbleBasis); +}; +#endif diff --git a/Numeric/HierarchicalBasisHcurlQuad.cpp b/Numeric/HierarchicalBasisHcurlQuad.cpp new file mode 100644 index 0000000000000000000000000000000000000000..2fde79b13bdec2205c7fded5b6dfa29ab53a99e3 --- /dev/null +++ b/Numeric/HierarchicalBasisHcurlQuad.cpp @@ -0,0 +1,373 @@ +// Gmsh - Copyright (C) 1997-2019 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. +// +// Contributed by Ismail Badia. + +#include "HierarchicalBasisHcurlQuad.h" + +HierarchicalBasisHcurlQuad::HierarchicalBasisHcurlQuad(int order) + +{ + _nvertex = 4; + _nedge = 4; + _nfaceQuad = 1; + _nfaceTri = 0; + _nVertexFunction = 0; + _nEdgeFunction = 4 * order + 4; + _nQuadFaceFunction = 2 * order * (order + 1); + _nTriFaceFunction = 0; + _nBubbleFunction = 0; + _pf1 = order; + _pf2 = order; + _pOrderEdge[0] = order; + _pOrderEdge[1] = order; + _pOrderEdge[2] = order; + _pOrderEdge[3] = order; +} + +HierarchicalBasisHcurlQuad::~HierarchicalBasisHcurlQuad() {} + +double HierarchicalBasisHcurlQuad::_affineCoordinate(int const &j, + double const &u, + double const &v) +{ + switch(j) { + case(1): return 0.5 * (1 + u); + case(2): return 0.5 * (1 - u); + case(3): return 0.5 * (1 + v); + case(4): return 0.5 * (1 - v); + default: throw std::string("j must be : 1<=j<=4"); + } +} + +void HierarchicalBasisHcurlQuad::generateBasis( + double const &u, double const &v, double const &w, + std::vector<std::vector<double> > &edgeBasis, + std::vector<std::vector<double> > &faceBasis, + std::vector<std::vector<double> > &bubbleBasis) +{ + double lambda1 = _affineCoordinate(1, u, v); + double lambda2 = _affineCoordinate(2, u, v); + double lambda3 = _affineCoordinate(3, u, v); + double lambda4 = _affineCoordinate(4, u, v); + std::vector<std::vector<double> > legendreVector(2); + legendreVector[0] = std::vector<double>( + std::max(std::max(_pOrderEdge[0] + 1, _pOrderEdge[2] + 1), _pf1 + 1)); + legendreVector[1] = std::vector<double>( + std::max(std::max(_pOrderEdge[1] + 1, _pOrderEdge[3] + 1), _pf2 + 1)); + for(unsigned int k = 0; k < legendreVector[0].size(); k++) { + legendreVector[0][k] = OrthogonalPoly::EvalLegendre(k, u); + } + for(unsigned int k = 0; k < legendreVector[1].size(); k++) { + legendreVector[1][k] = OrthogonalPoly::EvalLegendre(k, v); + } + int edgeIt = 0; + for(int i = 0; i < _nedge; i++) { + int uv = 0; + double lambda = 0; + std::vector<double> direction(3, 0); + switch(i) { + case(0): + lambda = lambda4; + uv = 0; + direction[0] = 1; + break; + case(1): + lambda = lambda1; + uv = 1; + direction[1] = 1; + break; + case(2): + lambda = lambda3; + uv = 0; + direction[0] = 1; + break; + case(3): + lambda = lambda2; + uv = 1; + direction[1] = 1; + break; + } + for(int iedge = 0; iedge < _pOrderEdge[i] + 1; iedge++) { + for(int j = 0; j < 3; j++) { + edgeBasis[edgeIt][j] = + lambda * legendreVector[uv][iedge] * direction[j]; + } + edgeIt++; + } + } + int faceIt = 0; + for(int n1 = 0; n1 <= _pf1; n1++) { + for(int n2 = 2; n2 <= _pf2 + 1; n2++) { + faceBasis[faceIt][0] = + legendreVector[0][n1] * OrthogonalPoly::EvalLobatto(n2, v); + faceBasis[faceIt][1] = 0; + faceBasis[faceIt][2] = 0; + faceIt++; + } + } + for(int n1 = 2; n1 <= _pf1 + 1; n1++) { + for(int n2 = 0; n2 <= _pf2; n2++) { + faceBasis[faceIt][0] = 0; + faceBasis[faceIt][1] = + legendreVector[1][n2] * OrthogonalPoly::EvalLobatto(n1, u); + faceBasis[faceIt][2] = 0; + faceIt++; + } + } +} + +void HierarchicalBasisHcurlQuad::orientEdge( + int const &flagOrientation, int const &edgeNumber, + std::vector<std::vector<double> > &edgeFunctions) +{ + if(flagOrientation == -1) { + int constant1 = 0; + int constant2 = 0; + switch(edgeNumber) { + case(0): { + constant1 = 0; + constant2 = _pOrderEdge[0]; + } break; + case(1): { + constant1 = _pOrderEdge[0] + 1; + constant2 = _pOrderEdge[1] + _pOrderEdge[0] + 1; + } break; + case(2): { + constant1 = _pOrderEdge[0] + _pOrderEdge[1] + 2; + constant2 = _pOrderEdge[1] + _pOrderEdge[0] + _pOrderEdge[2] + 2; + } break; + case(3): { + constant1 = _pOrderEdge[0] + _pOrderEdge[1] + _pOrderEdge[2] + 3; + constant2 = + _pOrderEdge[1] + _pOrderEdge[0] + _pOrderEdge[2] + _pOrderEdge[3] + 3; + } break; + default: throw std::string("edgeNumber must be : 0<=edgeNumber<=3"); + } + for(int k = constant1; k <= constant2; k++) { + if((k - constant1) % 2 != 0) { + edgeFunctions[k][0] = edgeFunctions[k][0] * (-1); + edgeFunctions[k][1] = edgeFunctions[k][1] * (-1); + edgeFunctions[k][2] = edgeFunctions[k][2] * (-1); + } + } + } +} + +void HierarchicalBasisHcurlQuad::generateCurlBasis( + double const &u, double const &v, double const &w, + std::vector<std::vector<double> > &edgeBasis, + std::vector<std::vector<double> > &faceBasis, + std::vector<std::vector<double> > &bubbleBasis) +{ + double dlambda1 = 0.5; + double dlambda2 = -0.5; + double dlambda3 = 0.5; + double dlambda4 = -0.5; + std::vector<std::vector<double> > legendreVector(2); + legendreVector[0] = std::vector<double>( + std::max(std::max(_pOrderEdge[0] + 1, _pOrderEdge[2] + 1), _pf1 + 1)); + legendreVector[1] = std::vector<double>( + std::max(std::max(_pOrderEdge[1] + 1, _pOrderEdge[3] + 1), _pf2 + 1)); + for(unsigned int k = 0; k < legendreVector[0].size(); k++) { + legendreVector[0][k] = OrthogonalPoly::EvalLegendre(k, u); + } + for(unsigned int k = 0; k < legendreVector[1].size(); k++) { + legendreVector[1][k] = OrthogonalPoly::EvalLegendre(k, v); + } + int edgeIt = 0; + for(int i = 0; i < _nedge; i++) { + int uv = 0; + double dlambda = 0; + std::vector<double> direction(3, 0); + direction[2] = 1; + switch(i) { + case(0): + dlambda = -dlambda4; + uv = 0; + break; + case(1): + dlambda = dlambda1; + uv = 1; + break; + case(2): + dlambda = -dlambda3; + uv = 0; + break; + case(3): + dlambda = dlambda2; + uv = 1; + break; + } + for(int iedge = 0; iedge < _pOrderEdge[i] + 1; iedge++) { + for(int j = 0; j < 3; j++) { + edgeBasis[edgeIt][j] = + dlambda * legendreVector[uv][iedge] * direction[j]; + } + edgeIt++; + } + } + int faceIt = 0; + for(int n1 = 0; n1 <= _pf1; n1++) { + for(int n2 = 2; n2 <= _pf2 + 1; n2++) { + faceBasis[faceIt][0] = 0; + faceBasis[faceIt][1] = 0; + faceBasis[faceIt][2] = + -legendreVector[0][n1] * OrthogonalPoly::EvalDLobatto(n2, v); + faceIt++; + } + } + for(int n1 = 2; n1 <= _pf1 + 1; n1++) { + for(int n2 = 0; n2 <= _pf2; n2++) { + faceBasis[faceIt][0] = 0; + faceBasis[faceIt][1] = 0; + faceBasis[faceIt][2] = + legendreVector[1][n2] * OrthogonalPoly::EvalDLobatto(n1, u); + faceIt++; + } + } +} + +void HierarchicalBasisHcurlQuad::orientFace( + double const &u, double const &v, double const &w, int const &flag1, + int const &flag2, int const &flag3, int const &faceNumber, + std::vector<std::vector<double> > &faceFunctions, std::string typeFunction) +{ + if(!(flag1 == 1 && flag2 == 1 && flag3 == 1)) { + if(typeFunction == "HcurlLegendre") { + if(flag3 == 1) { + int iterator = 0; + for(int it1 = 0; it1 <= _pf1; it1++) { + for(int it2 = 2; it2 <= _pf2 + 1; it2++) { + int impactFlag1 = 1; + int impactFlag2 = 1; + if(flag1 == -1 && it1 % 2 != 0) { impactFlag1 = -1; } + if(flag2 == -1 && it2 % 2 != 0) { impactFlag2 = -1; } + faceFunctions[iterator][0] = + faceFunctions[iterator][0] * impactFlag1 * impactFlag2; + + iterator++; + } + } + for(int it1 = 2; it1 <= _pf1 + 1; it1++) { + for(int it2 = 0; it2 <= _pf2; it2++) { + int impactFlag1 = 1; + int impactFlag2 = 1; + if(flag1 == -1 && it1 % 2 != 0) { impactFlag1 = -1; } + if(flag2 == -1 && it2 % 2 != 0) { impactFlag2 = -1; } + faceFunctions[iterator][1] = + faceFunctions[iterator][0] * impactFlag1 * impactFlag2; + + iterator++; + } + } + } + else { + std::vector<std::vector<double> > legendreVector(2); + legendreVector[0] = std::vector<double>(_pf1 + 1); + legendreVector[1] = std::vector<double>(_pf2 + 1); + for(unsigned int k = 0; k < legendreVector[0].size(); k++) { + legendreVector[0][k] = OrthogonalPoly::EvalLegendre(k, u); + } + for(unsigned int k = 0; k < legendreVector[1].size(); k++) { + legendreVector[1][k] = OrthogonalPoly::EvalLegendre(k, v); + } + int iterator = 0; + for(int it1 = 2; it1 <= _pf2 + 1; it1++) { + for(int it2 = 0; it2 <= _pf1; it2++) { + int impactFlag1 = 1; + int impactFlag2 = 1; + if(flag2 == -1 && it1 % 2 != 0) { impactFlag1 = -1; } + if(flag1 == -1 && it2 % 2 != 0) { impactFlag2 = -1; } + faceFunctions[iterator][0] = legendreVector[0][it2] * + OrthogonalPoly::EvalLobatto(it1, v) * + impactFlag1 * impactFlag2; + iterator++; + } + } + for(int it1 = 0; it1 <= _pf2; it1++) { + for(int it2 = 2; it2 <= _pf1 + 1; it2++) { + int impactFlag1 = 1; + int impactFlag2 = 1; + if(flag2 == -1 && it1 % 2 != 0) { impactFlag1 = -1; } + if(flag1 == -1 && it2 % 2 != 0) { impactFlag2 = -1; } + faceFunctions[iterator][1] = legendreVector[1][it1] * + OrthogonalPoly::EvalLobatto(it2, v) * + impactFlag1 * impactFlag2; + iterator++; + } + } + } + } + else if(typeFunction == "CurlHcurlLegendre") { + if(flag3 == 1) { + int iterator = 0; + for(int it1 = 0; it1 <= _pf1; it1++) { + for(int it2 = 2; it2 <= _pf2 + 1; it2++) { + int impactFlag1 = 1; + int impactFlag2 = 1; + if(flag1 == -1 && it1 % 2 != 0) { impactFlag1 = -1; } + if(flag2 == -1 && it2 % 2 != 0) { impactFlag2 = -1; } + faceFunctions[iterator][2] = + faceFunctions[iterator][2] * impactFlag1 * impactFlag2; + + iterator++; + } + } + for(int it1 = 2; it1 <= _pf1 + 1; it1++) { + for(int it2 = 0; it2 <= _pf2; it2++) { + int impactFlag1 = 1; + int impactFlag2 = 1; + if(flag1 == -1 && it1 % 2 != 0) { impactFlag1 = -1; } + if(flag2 == -1 && it2 % 2 != 0) { impactFlag2 = -1; } + faceFunctions[iterator][1] = + faceFunctions[iterator][2] * impactFlag1 * impactFlag2; + + iterator++; + } + } + } + else { + std::vector<std::vector<double> > legendreVector(2); + legendreVector[0] = std::vector<double>(_pf1 + 1); + legendreVector[1] = std::vector<double>(_pf2 + 1); + for(unsigned int k = 0; k < legendreVector[0].size(); k++) { + legendreVector[0][k] = OrthogonalPoly::EvalLegendre(k, u); + } + for(unsigned int k = 0; k < legendreVector[1].size(); k++) { + legendreVector[1][k] = OrthogonalPoly::EvalLegendre(k, v); + } + int iterator = 0; + for(int it1 = 2; it1 <= _pf2 + 1; it1++) { + for(int it2 = 0; it2 <= _pf1; it2++) { + int impactFlag1 = 1; + int impactFlag2 = 1; + if(flag2 == -1 && it1 % 2 != 0) { impactFlag1 = -1; } + if(flag1 == -1 && it2 % 2 != 0) { impactFlag2 = -1; } + faceFunctions[iterator][2] = -legendreVector[0][it2] * + OrthogonalPoly::EvalDLobatto(it1, v) * + impactFlag1 * impactFlag2; + iterator++; + } + } + for(int it1 = 0; it1 <= _pf2; it1++) { + for(int it2 = 2; it2 <= _pf1 + 1; it2++) { + int impactFlag1 = 1; + int impactFlag2 = 1; + if(flag2 == -1 && it1 % 2 != 0) { impactFlag1 = -1; } + if(flag1 == -1 && it2 % 2 != 0) { impactFlag2 = -1; } + faceFunctions[iterator][2] = legendreVector[1][it1] * + OrthogonalPoly::EvalDLobatto(it2, v) * + impactFlag1 * impactFlag2; + iterator++; + } + } + } + } + else { + throw std::string("unknown typeFunction"); + } + } +} diff --git a/Numeric/HierarchicalBasisHcurlQuad.h b/Numeric/HierarchicalBasisHcurlQuad.h new file mode 100644 index 0000000000000000000000000000000000000000..45f638d336c74e06d3ae7bffa1e9d2b735fdb229 --- /dev/null +++ b/Numeric/HierarchicalBasisHcurlQuad.h @@ -0,0 +1,87 @@ +// Gmsh - Copyright (C) 1997-2019 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. +// +// Contributed by Ismail Badia. +// Reference : "Higher-Order Finite Element Methods"; Pavel Solin, Karel +// Segeth , +// Ivo Dolezel , Chapman and Hall/CRC; Edition : Har/Cdr (2003). + +#ifndef HIERARCHICAL_BASIS_HCURL_QUAD_H +#define HIERARCHICAL_BASIS_HCURL_QUAD_H + +#include <algorithm> +#include "HierarchicalBasisHcurl.h" + +/* + * + * v + * ^ + * |+1 + * 3<----------2 + * | | ^ + * | | | + * -1| +---- |+1 --> u + * | | + * v | + * 0---------->1 + * -1 + * + * Oriented Edges: + * e0={v0;v1} e1={v1;v2} e2={v2;v3} e3={v3;v4} + * pe3,pe1<=pf2 pe0,pe2<=pf1 + * + */ +class HierarchicalBasisHcurlQuad : public HierarchicalBasisHcurl { +public: + HierarchicalBasisHcurlQuad(int order); + virtual ~HierarchicalBasisHcurlQuad(); + virtual void generateBasis(double const &u, double const &v, double const &w, + std::vector<std::vector<double> > &vertexBasis, + std::vector<std::vector<double> > &edgeBasis, + std::vector<std::vector<double> > &faceBasis, + std::vector<std::vector<double> > &bubbleBasis, + std::string typeFunction) + { + if(typeFunction == "HcurlLegendre") { + generateBasis(u, v, w, edgeBasis, faceBasis, bubbleBasis); + } + else if("CurlHcurlLegendre" == typeFunction) { + generateCurlBasis(u, v, w, edgeBasis, faceBasis, bubbleBasis); + } + else { + throw std::string("unknown typeFunction"); + } + }; + virtual void orientEdge(int const &flagOrientation, int const &edgeNumber, + std::vector<std::vector<double> > &edgeBasis); + virtual void orientFace(double const &u, double const &v, double const &w, + int const &flag1, int const &flag2, int const &flag3, + int const &faceNumber, + std::vector<std::vector<double> > &faceFunctions, + std::string typeFunction); + +private: + int _pf1; // face function order in direction u + int _pf2; // face function order in direction v + int _pOrderEdge[4]; // Edge functions order (pOrderEdge[0] matches the edge 0 + // order) + static double + _affineCoordinate(int const &j, double const &u, + double const &v); // affine coordinate lambdaj j=1..4 + // edgeBasis=[phie0_{0},...phie0_{pe0},phie1_{0},...phie1_{pe1}...] + // faceBasis=[phieFf1{n1,n2} (with 0<=n1<=pf1 , 2<=n2<=pf2+1), phieFf2{n1,n2} + // (with 2<=n1<=pf1+1 , 0<=n2<=pf2) ] + virtual void generateBasis(double const &u, double const &v, double const &w, + std::vector<std::vector<double> > &edgeBasis, + std::vector<std::vector<double> > &faceBasis, + std::vector<std::vector<double> > &bubbleBasis); + virtual void + generateCurlBasis(double const &u, double const &v, double const &w, + std::vector<std::vector<double> > &edgeBasis, + std::vector<std::vector<double> > &faceBasis, + std::vector<std::vector<double> > &bubbleBasis); +}; + +#endif diff --git a/Numeric/InnerVertexPlacement.cpp b/Numeric/InnerVertexPlacement.cpp index 8c038396020490e515c4c0639216c92a289555aa..f7c7f1121a577aefd3078875ab6dd2b567983e3c 100644 --- a/Numeric/InnerVertexPlacement.cpp +++ b/Numeric/InnerVertexPlacement.cpp @@ -6,6 +6,7 @@ // Contributed by Amaury Johnen #include "InnerVertexPlacement.h" +#include "GmshDefines.h" #include "pointsGenerators.h" namespace { diff --git a/Numeric/JacobianBasis.cpp b/Numeric/JacobianBasis.cpp index 7703c22f8c54f04c8b8b445e2be28f01ab3ce8da..4fc16833f2de57ffd5fcc6e3d3ca699386fbd690 100644 --- a/Numeric/JacobianBasis.cpp +++ b/Numeric/JacobianBasis.cpp @@ -6,7 +6,6 @@ #include "JacobianBasis.h" #include "pointsGenerators.h" #include "nodalBasis.h" -#include "bezierBasis.h" #include "BasisFactory.h" #include "Numeric.h" #include <cmath> @@ -138,15 +137,23 @@ namespace { } // namespace -GradientBasis::GradientBasis(FuncSpaceData data) : _data(data) +GradientBasis::GradientBasis(int elementTag, FuncSpaceData data) + : _elementTag(elementTag), _data(data) { + // Matrix gradShapeMatX, when multiplied by Lagrange coefficients, + // gives the first derivative with respect to first reference coordinate at + // a certain number of sampling points (for element tag 'data._tag') + // The number of sampling points is determined by 'data._spaceOrder'. + // The ordering of the sampling points is "ordered" (see pointsGenerator.cpp) + // and is thus different from the Gmsh ordering convention. This is for being + // able to convert sampling of jacobian from lagrange to bezier space easily. fullMatrix<double> samplingPoints; - gmshGeneratePoints(data, samplingPoints); + gmshGenerateOrderedPoints(data, samplingPoints); const int numSampPnts = samplingPoints.size1(); // Store shape function gradients of mapping at Jacobian nodes fullMatrix<double> allDPsi; - const nodalBasis *mapBasis = BasisFactory::getNodalBasis(_data.elementTag()); + const nodalBasis *mapBasis = BasisFactory::getNodalBasis(_elementTag); mapBasis->df(samplingPoints, allDPsi); const int numMapNodes = allDPsi.size2(); @@ -164,13 +171,8 @@ GradientBasis::GradientBasis(FuncSpaceData data) : _data(data) gradShapeIdealMatX = gradShapeMatX; gradShapeIdealMatY = gradShapeMatY; gradShapeIdealMatZ = gradShapeMatZ; - mapFromIdealElement(_data.elementType(), gradShapeIdealMatX, - gradShapeIdealMatY, gradShapeIdealMatZ); -} - -const bezierBasis *GradientBasis::getBezier() const -{ - return BasisFactory::getBezierBasis(_data); + mapFromIdealElement(_data.getType(), gradShapeIdealMatX, gradShapeIdealMatY, + gradShapeIdealMatZ); } void GradientBasis::getGradientsFromNodes(const fullMatrix<double> &nodes, @@ -242,24 +244,18 @@ void GradientBasis::mapFromIdealElement(int type, double jac[3][3]) mapFromIdealElement(type, dxyzdX, dxyzdY, dxyzdZ); } -void GradientBasis::lag2Bez(const fullMatrix<double> &lag, - fullMatrix<double> &bez) const -{ - getBezier()->matrixLag2Bez.mult(lag, bez); -} - -JacobianBasis::JacobianBasis(FuncSpaceData data) - : _data(data), _dim(data.dimension()) +JacobianBasis::JacobianBasis(int elementTag, FuncSpaceData data) + : _elementTag(elementTag), _data(data), _dim(data.getDimension()) { - const int parentType = data.elementType(); + const int parentType = data.getType(); const int primJacobianOrder = jacobianOrder(parentType, 1); - fullMatrix<double> lagPoints; // Sampling points - gmshGeneratePoints(data, lagPoints); - numJacNodes = lagPoints.size1(); + fullMatrix<double> samplingPoints; + gmshGeneratePoints(data, samplingPoints); + numJacNodes = samplingPoints.size1(); // Store shape function gradients of mapping at Jacobian nodes - _gradBasis = BasisFactory::getGradientBasis(data); + _gradBasis = BasisFactory::getGradientBasis(elementTag, data); // Compute matrix for lifting from primary Jacobian basis to Jacobian basis int primJacType = ElementType::getType(parentType, primJacobianOrder, false); @@ -267,7 +263,7 @@ JacobianBasis::JacobianBasis(FuncSpaceData data) numPrimJacNodes = primJacBasis->getNumShapeFunctions(); matrixPrimJac2Jac.resize(numJacNodes, numPrimJacNodes); - primJacBasis->f(lagPoints, matrixPrimJac2Jac); + primJacBasis->f(samplingPoints, matrixPrimJac2Jac); // Compute shape function gradients of primary mapping at barycenter, in order // to compute normal to straight element @@ -317,7 +313,7 @@ JacobianBasis::JacobianBasis(FuncSpaceData data) lagPointsFast(numPrimMapNodes, 2) = barycenter[2]; fullMatrix<double> allDPsiFast; - const nodalBasis *mapBasis = BasisFactory::getNodalBasis(data.elementTag()); + const nodalBasis *mapBasis = BasisFactory::getNodalBasis(_elementTag); mapBasis->df(lagPointsFast, allDPsiFast); numMapNodes = mapBasis->getNumShapeFunctions(); @@ -333,11 +329,6 @@ JacobianBasis::JacobianBasis(FuncSpaceData data) } } -const bezierBasis *JacobianBasis::getBezier() const -{ - return BasisFactory::getBezierBasis(_data); -} - // Computes (unit) normals to straight line element at barycenter (with norm of // gradient as return value) double JacobianBasis::getPrimNormals1D(const fullMatrix<double> &nodesXYZ, @@ -813,36 +804,6 @@ void JacobianBasis::getMetricMinAndGradients( } } -void JacobianBasis::lag2Bez(const fullVector<double> &lag, - fullVector<double> &bez) const -{ - getBezier()->matrixLag2Bez.mult(lag, bez); -} - -void JacobianBasis::lag2Bez(const fullMatrix<double> &lag, - fullMatrix<double> &bez) const -{ - getBezier()->matrixLag2Bez.mult(lag, bez); -} - -// Research purpose (to be removed ?) -void JacobianBasis::interpolate(const fullVector<double> &jacobian, - const fullMatrix<double> &uvw, - fullMatrix<double> &result, - bool areBezier) const -{ - fullMatrix<double> bezM(jacobian.size(), 1); - fullVector<double> bez; - bez.setAsProxy(bezM, 0); - - if(areBezier) - bez.setAll(jacobian); - else - lag2Bez(jacobian, bez); - - getBezier()->interpolate(bezM, uvw, result); -} - int JacobianBasis::jacobianOrder(int tag) { const int parentType = ElementType::getParentType(tag); @@ -874,7 +835,7 @@ FuncSpaceData JacobianBasis::jacobianMatrixSpace(int type, int order) { if(type == TYPE_PYR) { Msg::Error("jacobianMatrixSpace not yet implemented for pyramids"); - return FuncSpaceData(false, type, false, 1, 0); + return FuncSpaceData(type, false, 1, 0, false); } int jacOrder = -1; switch(type) { @@ -886,8 +847,8 @@ FuncSpaceData JacobianBasis::jacobianMatrixSpace(int type, int order) case TYPE_PRI: case TYPE_HEX: jacOrder = order; break; default: - Msg::Error("Unknown element type %d, return order 0", type); - return 0; + Msg::Error("Unknown element type %d, return default space", type); + return FuncSpaceData(); } - return FuncSpaceData(true, ElementType::getType(type, order), jacOrder); + return FuncSpaceData(type, jacOrder, false); } diff --git a/Numeric/JacobianBasis.h b/Numeric/JacobianBasis.h index 3ae0494ea83fa61bb795d4c8e62c661e348fb583..2233d44962a08a504dc3d583f7b319ecf93f994d 100644 --- a/Numeric/JacobianBasis.h +++ b/Numeric/JacobianBasis.h @@ -9,21 +9,21 @@ #include "fullMatrix.h" #include "FuncSpaceData.h" -class bezierBasis; - class GradientBasis { public: fullMatrix<double> gradShapeMatX, gradShapeMatY, gradShapeMatZ; fullMatrix<double> gradShapeIdealMatX, gradShapeIdealMatY, gradShapeIdealMatZ; private: + const int _elementTag; const FuncSpaceData _data; public: - GradientBasis(FuncSpaceData); + GradientBasis(int elementTag, FuncSpaceData); + + inline int getPolynomialOrder() const { return _data.getSpaceOrder(); } int getNumSamplingPoints() const { return gradShapeMatX.size1(); } int getNumMapNodes() const { return gradShapeMatX.size2(); } - const bezierBasis *getBezier() const; void getGradientsFromNodes(const fullMatrix<double> &nodes, fullMatrix<double> *dxyzdX, fullMatrix<double> *dxyzdY, @@ -40,15 +40,13 @@ public: fullMatrix<double> &dxyzdY, fullMatrix<double> &dxyzdZ) const { - GradientBasis::mapFromIdealElement(_data.elementType(), dxyzdX, dxyzdY, - dxyzdZ); + GradientBasis::mapFromIdealElement(_data.getType(), dxyzdX, dxyzdY, dxyzdZ); } void mapFromIdealElement(fullVector<double> &dxyzdX, fullVector<double> &dxyzdY, fullVector<double> &dxyzdZ) const { - GradientBasis::mapFromIdealElement(_data.elementType(), dxyzdX, dxyzdY, - dxyzdZ); + GradientBasis::mapFromIdealElement(_data.getType(), dxyzdX, dxyzdY, dxyzdZ); } static void mapFromIdealElement(int type, fullMatrix<double> &gSMatX, fullMatrix<double> &gSMatY, @@ -57,12 +55,12 @@ public: fullVector<double> &gSVecY, fullVector<double> &gSVecZ); static void mapFromIdealElement(int type, double jac[3][3]); - void lag2Bez(const fullMatrix<double> &lag, fullMatrix<double> &bez) const; }; class JacobianBasis { private: const GradientBasis *_gradBasis; + const int _elementTag; const FuncSpaceData _data; const int _dim; fullMatrix<double> gradShapeMatXFast, gradShapeMatYFast, gradShapeMatZFast; @@ -76,16 +74,16 @@ private: int numJacNodesFast; public: - JacobianBasis(FuncSpaceData); + JacobianBasis(int elementTag, FuncSpaceData); // Get methods - inline int getJacOrder() const { return _data.spaceOrder(); } + inline int getJacOrder() const { return _data.getSpaceOrder(); } inline int getNumJacNodes() const { return numJacNodes; } inline int getNumJacNodesFast() const { return numJacNodesFast; } inline int getNumMapNodes() const { return numMapNodes; } inline int getNumPrimJacNodes() const { return numPrimJacNodes; } inline int getNumPrimMapNodes() const { return numPrimMapNodes; } - const bezierBasis *getBezier() const; + inline FuncSpaceData getFuncSpaceData() const { return _data; } // Jacobian evaluation methods double getPrimNormals1D(const fullMatrix<double> &nodesXYZ, @@ -196,18 +194,12 @@ public: normals); } - void lag2Bez(const fullVector<double> &lag, fullVector<double> &bez) const; - void lag2Bez(const fullMatrix<double> &lag, fullMatrix<double> &bez) const; inline void primJac2Jac(const fullVector<double> &primJac, fullVector<double> &jac) const { matrixPrimJac2Jac.mult(primJac, jac); } - // Research purpose (to be removed ?) - void interpolate(const fullVector<double> &jacobian, - const fullMatrix<double> &uvw, fullMatrix<double> &result, - bool areBezier = false) const; static int jacobianOrder(int tag); static int jacobianOrder(int parentType, int order); static FuncSpaceData jacobianMatrixSpace(int type, int order); diff --git a/Numeric/Numeric.cpp b/Numeric/Numeric.cpp index 75a8ca0d911d5547a607645366001522a261a25c..0553bd264d3db22475c70d806bdd8c95b57eab9f 100644 --- a/Numeric/Numeric.cpp +++ b/Numeric/Numeric.cpp @@ -437,9 +437,7 @@ double computeInnerRadiusForQuad(double *x, double *y, int i) // that is the point where the 2 bisectors meet double x_s = (c12 * b23 - c23 * b12) / (a23 * b12 - a12 * b23); double y_s = 0.; - if(b12 != 0) { - y_s = -a12 / b12 * x_s - c12 / b12; - } + if(b12 != 0) { y_s = -a12 / b12 * x_s - c12 / b12; } else { y_s = -a23 / b23 * x_s - c23 / b23; } @@ -510,11 +508,11 @@ double ComputeScalarRep(int numComp, double *val, int tensorRep) return val[0]; else if(numComp == 3) return sqrt(val[0] * val[0] + val[1] * val[1] + val[2] * val[2]); - else if(numComp == 9){ - if(tensorRep == 0){ // Von-Mises + else if(numComp == 9) { + if(tensorRep == 0) { // Von-Mises return ComputeVonMises(val); } - else{ + else { fullMatrix<double> tensor(3, 3); fullVector<double> S(3), imS(3); fullMatrix<double> V(3, 3); @@ -525,10 +523,10 @@ double ComputeScalarRep(int numComp, double *val, int tensorRep) tensor(j, 2) = val[2 + j * 3]; } tensor.eig(S, imS, V, rightV, true); - if(tensorRep == 1){ // max eigenvalue + if(tensorRep == 1) { // max eigenvalue return S(2); } - else{ // min eigenvalue + else { // min eigenvalue return S(0); } } @@ -663,9 +661,7 @@ void invert_singular_matrix3x3(double MM[3][3], double II[3][3]) fullMatrix<double> M(3, 3), V(3, 3); fullVector<double> W(3); for(i = 1; i <= n; i++) { - for(j = 1; j <= n; j++) { - M(i - 1, j - 1) = MM[i - 1][j - 1]; - } + for(j = 1; j <= n; j++) { M(i - 1, j - 1) = MM[i - 1][j - 1]; } } M.svd(V, W); for(i = 1; i <= n; i++) { @@ -697,9 +693,7 @@ bool newton_fd(bool (*func)(fullVector<double> &, fullVector<double> &, void *), for(int iter = 0; iter < MAXIT; iter++) { if(x.norm() > 1.e6) return false; - if(!func(x, f, data)) { - return false; - } + if(!func(x, f, data)) { return false; } bool isZero = false; for(int k = 0; k < N; k++) { @@ -715,12 +709,8 @@ bool newton_fd(bool (*func)(fullVector<double> &, fullVector<double> &, void *), double h = EPS * fabs(x(j)); if(h == 0.) h = EPS; x(j) += h; - if(!func(x, feps, data)) { - return false; - } - for(int i = 0; i < N; i++) { - J(i, j) = (feps(i) - f(i)) / h; - } + if(!func(x, feps, data)) { return false; } + for(int i = 0; i < N; i++) { J(i, j) = (feps(i) - f(i)) / h; } x(j) -= h; } @@ -732,9 +722,7 @@ bool newton_fd(bool (*func)(fullVector<double> &, fullVector<double> &, void *), for(int i = 0; i < N; i++) x(i) -= relax * dx(i); - if(dx.norm() < tolx) { - return true; - } + if(dx.norm() < tolx) { return true; } } return false; } @@ -1022,9 +1010,7 @@ int computeDistanceRatio(const double &y, const double &yp, const double &x, } else { b = (xp * y - x * yp) / (yp - y); - if(yp == 0.0) { - a = -(b + x) / y; - } + if(yp == 0.0) { a = -(b + x) / y; } else { a = -(b + xp) / yp; } @@ -1063,9 +1049,7 @@ int computeDistanceRatio(const double &y, const double &yp, const double &x, } double rho = be * be - 4 * ae * ce; double x1, x2, y1, y2, propdist; - if(rho < 0) { - return 1; - } + if(rho < 0) { return 1; } else { x1 = -(be + sqrt(rho)) / (2.0 * ae); x2 = (-be + sqrt(rho)) / (2.0 * ae); @@ -1095,23 +1079,17 @@ int computeDistanceRatio(const double &y, const double &yp, const double &x, } if(x1 == x2) { propdist = (y1 - y) / (yp - y); - if(propdist < 0.0) { - propdist = (y2 - y) / (yp - y); - } + if(propdist < 0.0) { propdist = (y2 - y) / (yp - y); } } else { if(xp != x) { propdist = (x1 - x) / (xp - x); - if(propdist < 0.0) { - propdist = (x2 - x) / (xp - x); - } + if(propdist < 0.0) { propdist = (x2 - x) / (xp - x); } } else { if(yp != y) { propdist = (y1 - y) / (yp - y); - if(propdist < 0.0) { - propdist = (y2 - y) / (yp - y); - } + if(propdist < 0.0) { propdist = (y2 - y) / (yp - y); } } else { propdist = 0.01; @@ -1317,9 +1295,7 @@ void signedDistancesPointsEllipseLine( changeReferential(direction, p, closePt, p1, p2, &xp, &yp, &otherp, &x, &y, &other); int result = 1; - if(fabs(other - otherp) > 0.01) { - result = 1; - } + if(fabs(other - otherp) > 0.01) { result = 1; } else { if(direction == 1) { result = computeDistanceRatio(y, yp, x, xp, &propdist, maxA, minA); @@ -1605,9 +1581,7 @@ bool catenary(double x0, double x1, double y0, double y1, double ys, int N, return true; } else { - for(int i = 0; i < N; i++) { - yp[i] = y0 + (i + 1) * (y1 - y0) / (N + 1); - } + for(int i = 0; i < N; i++) { yp[i] = y0 + (i + 1) * (y1 - y0) / (N + 1); } return false; } } diff --git a/Numeric/Numeric.h b/Numeric/Numeric.h index 928d2dbc40be19ec89d7b06f615fd2ce9dee2334..4bea46fc67fd2ae454a40e294115951e93317585 100644 --- a/Numeric/Numeric.h +++ b/Numeric/Numeric.h @@ -37,6 +37,8 @@ struct mean_plane { inline double pow_int(const double &a, const int &n) { + if(n < 0) return pow_int(1 / a, -n); + switch(n) { case 0: return 1.0; case 1: return a; @@ -72,7 +74,7 @@ inline double pow_int(const double &a, const int &n) const double a4 = a2 * a2; return a4 * a4 * a2; } - default: return pow_int(a, n - 9) * pow_int(a, 9); + default: return pow_int(a, n - 10) * pow_int(a, 10); } } diff --git a/Numeric/OrthogonalPoly.cpp b/Numeric/OrthogonalPoly.cpp new file mode 100644 index 0000000000000000000000000000000000000000..d52ff02edb75594e19694f610ff6420a58e7ea97 --- /dev/null +++ b/Numeric/OrthogonalPoly.cpp @@ -0,0 +1,391 @@ +#include "OrthogonalPoly.h" + +double OrthogonalPoly::EvalLobatto(int order, double x) + { + + + double L=0; + double xsquare=pow(x,2); + switch(order) { + case(0): + L =0.5*(1-1*x); + return L; + case(1): + L =0.5*(1+x); + return L; + case(2): + L=(-1+pow(x,2)); + L=L*0.5*pow(3./2.,0.5); + return L; + case(3): + L=x*(-1+xsquare); + L=L*0.5*pow(5./2.,0.5); + return L; + case(4): + L=1+xsquare*(-6+5.*xsquare); + L=L*1./8.*pow(7./2.,0.5); + return L; + case(5): + L=x*(3+xsquare*(-10+7.*xsquare)); + L=L*3./8.*pow(2.,-0.5); + return L; + case(6): + L=-1+xsquare*(15+xsquare*(-35+21*xsquare)); + L=L*1./16.*pow(11./2.,0.5); + return L; + case(7): + L=x*(-5+xsquare*(35+xsquare*(-63+33*xsquare))); + L=L*1./16.*pow(13./2.,0.5); + return L; + case(8): + L=5+xsquare*(-140+xsquare*(630+xsquare*(-924+429*xsquare))); + L=L*1./128.*pow(15./2.,0.5); + return L; + case(9): + L=x*(35+xsquare*(-420+xsquare*(1386+xsquare*(-1716+715*xsquare)))); + L=L*1./128.*pow(17./2.,0.5); + return L; + case(10): + L=-7+xsquare*(315+xsquare*(-2310+xsquare*(6006+xsquare*(-6435+2431*xsquare)))); + L=L*1./256.*pow(19./2.,0.5); + return L; + case(11): + L=x*(-63+xsquare*(1155+xsquare*(-6006+xsquare*(12870+xsquare*(-12155+4199*xsquare))))); + L=L*1./256.*pow(21./2.,0.5); + return L; + case(12): + L=21+xsquare*(-1386+xsquare*(15015+xsquare*(-60060+xsquare*(109395+xsquare*(-92378+29393*xsquare))))); + L=L*1./1024.*pow(23./2.,0.5); + return L; + case(13): + L=x*(231+xsquare*(-6006+xsquare*(45045+xsquare*(-145860+xsquare*(230945+xsquare*(-176358+52003*xsquare)))))); + L=L*5./1024.*pow(2.,-0.5); + return L; + case(14): + L=-33+xsquare*(3003+xsquare*(-45045+xsquare*(255255+xsquare*(-692835+xsquare*(969969+xsquare*(-676039+185725*xsquare)))))); + L=L*3./2048.*pow(3./2.,0.5); + return L; + case(15): + L=x*(-429 +xsquare*(15015+xsquare*(-153153+xsquare*(692835+xsquare*(-1616615+xsquare*(2028117+xsquare*(-1300075+334305*xsquare))))))); + L=L*1./2048.*pow(29./2.,0.5); + return L; + + default: + + throw std::string("Lobatto functions are written for orders =< 15"); + + } + + } + +double OrthogonalPoly::EvalDLobatto(int order, double x){ + double dL=0; + double xsquare=pow(x,2); + switch(order) { + case(0): + dL =-0.5; + return dL; + case(1): + dL =0.5; + return dL; + case(2): + dL=2*x; + dL=dL*0.5*pow(3./2.,0.5); + return dL; + case(3): + dL=-1+3*xsquare; + dL=dL*0.5*pow(5./2.,0.5); + return dL; + case(4): + dL=x*(-12+20*xsquare); + dL=dL*1./8.*pow(7./2.,0.5); + return dL; + case(5): + dL=3+xsquare*(-30+35.*xsquare); + dL=dL*3./8.*pow(2.,-0.5); + return dL; + case(6): + dL=x*(30+xsquare*(-140+126*xsquare)); + dL=dL*1./16.*pow(11./2.,0.5); + return dL; + case(7): + dL=-5+xsquare*(105+xsquare*(-315+231*xsquare)); + dL=dL*1./16.*pow(13./2.,0.5); + return dL; + case(8): + dL=x*(-280+xsquare*(2520+xsquare*(-5544+3432*xsquare))); + dL=dL*1./128.*pow(15./2.,0.5); + return dL; + case(9): + dL=35+xsquare*(-1260+xsquare*(6930+xsquare*(-12012+6435*xsquare))); + dL=dL*1./128.*pow(17./2.,0.5); + return dL; + case(10): + dL=x*(630+xsquare*(-9240+xsquare*(36036+xsquare*(-51480+24310 * xsquare)))); + dL=dL*1./256.*pow(19./2.,0.5); + return dL; + case(11): + dL=-63+xsquare*(3465+xsquare*(-30030+xsquare*(90090+xsquare*(-109395+46189*xsquare)))); + dL=dL*1./256.*pow(21./2.,0.5); + return dL; + case(12): + dL=x*(-2772+xsquare*(60060+xsquare*(-360360+xsquare*(875160+xsquare*(-923780+352716*xsquare))))); + dL=dL*1./1024.*pow(23./2.,0.5); + return dL; + case(13): + dL=231+xsquare*(-18018+xsquare*(225225+xsquare*(-1021020+xsquare*(2078505+xsquare*(-1939938+676039*xsquare))))); + dL=dL*5./1024.*pow(2.,-0.5); + return dL; + case(14): + dL=x*(6006+xsquare*(-180180+xsquare*(1531530+xsquare*(-5542680+xsquare*(9699690+xsquare*(-8112468+2600150*xsquare)))))); + dL=dL*3./2048.*pow(3./2.,0.5); + return dL; + case(15): + dL=-429 +xsquare*(45045+xsquare*(-765765+xsquare*(4849845+xsquare*(-14549535+xsquare*(22309287+xsquare*(-16900975+5014575*xsquare)))))); + dL=dL*1./2048.*pow(29./2.,0.5); + return dL; + + default: + + throw std::string("Lobatto functions are written for orders =< 15"); + + } + +} + + + +double OrthogonalPoly::EvalKernelFunction(int order, double x){ + double phi=0; + double xsquare=pow(x,2); + switch(order){ + case(0): + phi=-pow(6,0.5); + return phi; + case(1): + phi=-x*pow(10,0.5); + return phi; + case(2): + phi=1-5*xsquare; + phi=phi*0.5*pow(7./2.,0.5); + return phi; + case(3): + phi=x*(3-7*xsquare); + phi=phi*3./2.*pow(2,-0.5); + return phi; + case(4): + phi=-1+xsquare*(14-21*xsquare); + phi=phi*1./4.*pow(11./2.,0.5); + return phi; + case(5): + phi=x*(-5+xsquare*(30-33*xsquare)); + phi=phi*1./4.*pow(13./2.,0.5); + return phi; + case(6): + phi=5+xsquare*(-135+xsquare*(495-429*xsquare)); + phi=phi*1./32.*pow(15./2.,0.5); + return phi; + case(7): + phi=x*(35+xsquare*(-385+xsquare*(1001-715*xsquare))); + phi=phi*1./32.*pow(17./2.,0.5); + return phi; + case(8): + phi=-7+xsquare*(308+xsquare*(-2002+xsquare*(4004-2431*xsquare))); + phi=phi*1./64.*pow(19./2.,0.5); + return phi; + case(9): + phi=x*(-63+xsquare*(1092+xsquare*(-4914+xsquare*(7956-4199*xsquare)))); + phi=phi*1./64.*pow(21./2.,0.5); + return phi; + case(10): + phi=21+xsquare*(-1365+xsquare*(13650+xsquare*(-46410+xsquare*(62985 -29393*xsquare)))); + phi=phi*1./256.*pow(23./2.,0.5); + return phi; + case(11): + phi=x*(231+xsquare*(-5775+xsquare*(39270+xsquare*(-106590+xsquare*(124355-52003*xsquare))))); + phi=phi*5./256.*pow(2,-0.5); + return phi; + case(12): + phi=-33+xsquare*(2970+xsquare*(-42075+xsquare*(213180+xsquare*(-479655+xsquare*(490314-185725*xsquare))))); + phi=phi*3./512.*pow(3./2.,0.5); + return phi; + case(13): + phi=x*(-429+xsquare*(14586+xsquare*(-138567+xsquare*(554268+xsquare*(-1062347+xsquare*(965770-334305*xsquare)))))); + phi=phi*1./512.*pow(29./2.,0.5); + return phi; + default: + throw std::string("Lobatto functions are written for orders =< 15"); + + } + } + + + +double OrthogonalPoly::EvalDKernelFunction(int order, double x){ + double dphi=0; + double xsquare=pow(x,2); + switch(order){ + case(0): + dphi=0; + return dphi; + case(1): + dphi=-pow(10,0.5); + return dphi; + case(2): + dphi=-10*x;; + dphi=dphi*0.5*pow(7./2.,0.5); + return dphi; + case(3): + dphi=3-21*xsquare; + dphi=dphi*3./2.*pow(2,-0.5); + return dphi; + case(4): + dphi=x*(28-84*xsquare); + dphi=dphi*1./4.*pow(11./2.,0.5); + return dphi; + case(5): + dphi=-5+xsquare*(90-165*xsquare); + dphi=dphi*1./4.*pow(13./2.,0.5); + return dphi; + case(6): + dphi= x*(-270+xsquare*(1980-2574*xsquare)); + dphi=dphi*1./32.*pow(15./2.,0.5); + return dphi; + case(7): + dphi=35+xsquare*(-1155+xsquare*(5005-5005*xsquare)); + dphi=dphi*1./32.*pow(17./2.,0.5); + return dphi; + case(8): + dphi=x*(616+xsquare*(-8008+xsquare*(24024-19448*xsquare))); + dphi=dphi*1./64.*pow(19./2.,0.5); + return dphi; + case(9): + dphi=-63+xsquare*(3276+xsquare*(-24570+xsquare*(55692-37791*xsquare))); + dphi=dphi*1./64.*pow(21./2.,0.5); + return dphi; + case(10): + dphi=x*(-2730+xsquare*(54600+xsquare*(-278460+xsquare*(503880-293930*xsquare)))); + + dphi=dphi*1./256.*pow(23./2.,0.5); + return dphi; + case(11): + dphi=231+xsquare*(-17325+xsquare*(196350+xsquare*(-746130+xsquare*(1119195-572033*xsquare)))); + dphi=dphi*5./256.*pow(2,-0.5); + return dphi; + case(12): + dphi= x*(5940+xsquare*(-168300+xsquare*(1279080+xsquare*(-3837240+xsquare*(4903140-2228700*xsquare))))); + dphi=dphi*3./512.*pow(3./2.,0.5); + return dphi; + case(13): + dphi = -429+xsquare*(43758+xsquare*(-692835+xsquare*(3879876+xsquare*(-9561123+xsquare*(10623470-4345965*xsquare))))); + dphi=dphi*1./512.*pow(29./2.,0.5); + return dphi; + default: + throw std::string("Lobatto functions are written for orders =< 15"); + + } + } + + double OrthogonalPoly::EvalLegendre(int order, double x){ + double L=0; + double xsquare=pow(x,2); + switch(order) { + case(0): + L =1; + return L; + case(1): + L =x; + return L; + case(2): + L=3./2.*xsquare-1./2.; + return L; + case(3): + L=0.5*x*(5*xsquare-3); + return L; + case(4): + L=(3+xsquare*(35*xsquare-30)); + L=1./8.*L; + return L; + case(5): + L=x*(xsquare*(63*xsquare-70)+15); + L=1./8.*L; + return L; + case(6): + L=((231*xsquare-315)*xsquare+105)*xsquare-5; + L=1./16.*L; + return L; + case(7): + L=x*(((429*xsquare-693)*xsquare+315)*xsquare-35); + L=1./16.*L; + return L; + case(8): + L=(((6435*xsquare-12012)*xsquare+6930)*xsquare-1260)*xsquare+35; + L=1./128.*L; + return L; + case(9): + L=((((12155*xsquare-25740)*xsquare+18018)*xsquare-4620)*xsquare+315)*x; + L=1./128.*L; + return L; + case(10): + L=((((46189*xsquare-109395)*xsquare+90090)*xsquare-30030)*xsquare+3465)*xsquare- 63; + L=1./256.*L; + return L; + default: + + throw std::string("Legendre functions are written for orders =< 10"); + + } + + } + + + double OrthogonalPoly::EvalDLegendre(int order, double x){ + double dL=0; + double xsquare=pow(x,2); + switch(order) { + case(0): + dL =0; + return dL; + case(1): + dL =1; + return dL; + case(2): + dL=3*x; + return dL; + case(3): + dL=0.5*(15*xsquare-3); + return dL; + case(4): + dL=x*(140*xsquare-60); + dL=1./8.*dL; + return dL; + case(5): + dL=15+xsquare*(315*xsquare-210); + dL=1./8.*dL; + return dL; + case(6): + dL=x*(210+xsquare*(1386*xsquare-1260)); + dL=1./16.*dL; + return dL; + case(7): + dL=((xsquare*3003-3465)*xsquare+945)*xsquare-35; + dL=1./16.*dL; + return dL; + case(8): + dL=x*(((51480*xsquare-72072)*xsquare+27720)*xsquare-2520); + dL=1./128.*dL; + return dL; + case(9): + dL=315+xsquare*(-13860+xsquare*(90090+xsquare*(-180180+109395*xsquare))); + dL=1./128.*dL; + return dL; + case(10): + dL=x*(6930+xsquare*(-120120+xsquare*(540540+xsquare*(-875160+461890*xsquare)))); + dL=1./256.*dL; + return dL; + default: + + throw std::string("Legendre functions are written for orders =< 10"); + + } + } diff --git a/Numeric/OrthogonalPoly.h b/Numeric/OrthogonalPoly.h new file mode 100644 index 0000000000000000000000000000000000000000..8ef1ee9f21bdb30a2f3e1250c332d494ebc7ba66 --- /dev/null +++ b/Numeric/OrthogonalPoly.h @@ -0,0 +1,26 @@ +#ifndef _ORTHOGONALPOLY_H_ +#define _ORTHOGONALPOLY_H_ + +#include <math.h> +#include <string> +namespace OrthogonalPoly{ + + +//Lobatto Orthogonal Shape Functions in Horner's form + double EvalLobatto(int order, double x); +//derivative of lobatto orthogonal shape funcions in Horner's form + double EvalDLobatto(int order, double x); +//Kernel functions in Horner's form + double EvalKernelFunction(int order, double x); +//derivative of Kernel functions in Horner's form + double EvalDKernelFunction(int order, double x); +//Legendre Functions in Horner's form + double EvalLegendre(int order, double x); +//derivative of Legendre Functions in Horner's form + double EvalDLegendre(int order, double x); + +}; + + + +#endif diff --git a/Numeric/bezierBasis.cpp b/Numeric/bezierBasis.cpp index 95faf96d6b86c3f83d3262b9f6dd738b8aa37265..97c986cb9ccdbf27412d6a8f7d2ad4fc987fe928 100644 --- a/Numeric/bezierBasis.cpp +++ b/Numeric/bezierBasis.cpp @@ -15,276 +15,10 @@ namespace { - // Sub Control Points - std::vector<fullMatrix<double> > generateSubPointsLine(int order) + // Exponents: + void generateExponents(FuncSpaceData data, fullMatrix<double> &exp) { - std::vector<fullMatrix<double> > subPoints(2); - subPoints[0] = gmshGenerateMonomialsLine(order); - subPoints[0].scale(.5 / order); - - subPoints[1].copy(subPoints[0]); - subPoints[1].add(.5); - return subPoints; - } - - std::vector<fullMatrix<double> > generateSubPointsTriangle(int order) - { - std::vector<fullMatrix<double> > subPoints(4); - fullMatrix<double> prox; - subPoints[0] = gmshGenerateMonomialsTriangle(order); - subPoints[0].scale(.5 / order); - - subPoints[1].copy(subPoints[0]); - prox.setAsProxy(subPoints[1], 0, 1); - prox.add(.5); - - subPoints[2].copy(subPoints[0]); - prox.setAsProxy(subPoints[2], 1, 1); - prox.add(.5); - - subPoints[3].copy(subPoints[0]); - subPoints[3].scale(-1.); - subPoints[3].add(.5); - return subPoints; - } - - std::vector<fullMatrix<double> > generateSubPointsQuad(int order) - { - std::vector<fullMatrix<double> > subPoints(4); - fullMatrix<double> prox; - subPoints[0] = gmshGenerateMonomialsQuadrangle(order); - subPoints[0].scale(.5 / order); - - subPoints[1].copy(subPoints[0]); - prox.setAsProxy(subPoints[1], 0, 1); - prox.add(.5); - - subPoints[2].copy(subPoints[0]); - prox.setAsProxy(subPoints[2], 1, 1); - prox.add(.5); - - subPoints[3].copy(subPoints[1]); - prox.setAsProxy(subPoints[3], 1, 1); - prox.add(.5); - return subPoints; - } - - std::vector<fullMatrix<double> > generateSubPointsTetrahedron(int order) - { - std::vector<fullMatrix<double> > subPoints(8); - fullMatrix<double> prox1; - fullMatrix<double> prox2; - subPoints[0] = gmshGenerateMonomialsTetrahedron(order); - subPoints[0].scale(.5 / order); - - subPoints[1].copy(subPoints[0]); - prox1.setAsProxy(subPoints[1], 0, 1); - prox1.add(.5); - - subPoints[2].copy(subPoints[0]); - prox1.setAsProxy(subPoints[2], 1, 1); - prox1.add(.5); - - subPoints[3].copy(subPoints[0]); - prox1.setAsProxy(subPoints[3], 2, 1); - prox1.add(.5); - - // u := .5-u-w - // v := .5-v-w - // w := w - subPoints[4].copy(subPoints[0]); - prox1.setAsProxy(subPoints[4], 0, 2); - prox1.scale(-1.); - prox1.add(.5); - prox1.setAsProxy(subPoints[4], 0, 1); - prox2.setAsProxy(subPoints[4], 2, 1); - prox1.add(prox2, -1.); - prox1.setAsProxy(subPoints[4], 1, 1); - prox1.add(prox2, -1.); - - // u := u - // v := .5-v - // w := w+v - subPoints[5].copy(subPoints[0]); - prox1.setAsProxy(subPoints[5], 2, 1); - prox2.setAsProxy(subPoints[5], 1, 1); - prox1.add(prox2); - prox2.scale(-1.); - prox2.add(.5); - - // u := .5-u - // v := v - // w := w+u - subPoints[6].copy(subPoints[0]); - prox1.setAsProxy(subPoints[6], 2, 1); - prox2.setAsProxy(subPoints[6], 0, 1); - prox1.add(prox2); - prox2.scale(-1.); - prox2.add(.5); - - // u := u+w - // v := v+w - // w := .5-w - subPoints[7].copy(subPoints[0]); - prox1.setAsProxy(subPoints[7], 0, 1); - prox2.setAsProxy(subPoints[7], 2, 1); - prox1.add(prox2); - prox1.setAsProxy(subPoints[7], 1, 1); - prox1.add(prox2); - prox2.scale(-1.); - prox2.add(.5); - - return subPoints; - } - - std::vector<fullMatrix<double> > generateSubPointsPrism(int order) - { - std::vector<fullMatrix<double> > subPoints(8); - fullMatrix<double> prox; - - subPoints[0] = gmshGenerateMonomialsPrism(order); - subPoints[0].scale(.5 / order); - - subPoints[1].copy(subPoints[0]); - prox.setAsProxy(subPoints[1], 0, 1); - prox.add(.5); - - subPoints[2].copy(subPoints[0]); - prox.setAsProxy(subPoints[2], 1, 1); - prox.add(.5); - - subPoints[3].copy(subPoints[0]); - prox.setAsProxy(subPoints[3], 0, 2); - prox.scale(-1.); - prox.add(.5); - - subPoints[4].copy(subPoints[0]); - prox.setAsProxy(subPoints[4], 2, 1); - prox.add(.5); - - subPoints[5].copy(subPoints[1]); - prox.setAsProxy(subPoints[5], 2, 1); - prox.add(.5); - - subPoints[6].copy(subPoints[2]); - prox.setAsProxy(subPoints[6], 2, 1); - prox.add(.5); - - subPoints[7].copy(subPoints[3]); - prox.setAsProxy(subPoints[7], 2, 1); - prox.add(.5); - - return subPoints; - } - - std::vector<fullMatrix<double> > generateSubPointsHex(int order) - { - std::vector<fullMatrix<double> > subPoints(8); - fullMatrix<double> prox; - - subPoints[0] = gmshGenerateMonomialsHexahedron(order); - subPoints[0].scale(.5 / order); - - subPoints[1].copy(subPoints[0]); - prox.setAsProxy(subPoints[1], 0, 1); - prox.add(.5); - - subPoints[2].copy(subPoints[0]); - prox.setAsProxy(subPoints[2], 1, 1); - prox.add(.5); - - subPoints[3].copy(subPoints[1]); - prox.setAsProxy(subPoints[3], 1, 1); - prox.add(.5); - - subPoints[4].copy(subPoints[0]); - prox.setAsProxy(subPoints[4], 2, 1); - prox.add(.5); - - subPoints[5].copy(subPoints[1]); - prox.setAsProxy(subPoints[5], 2, 1); - prox.add(.5); - - subPoints[6].copy(subPoints[2]); - prox.setAsProxy(subPoints[6], 2, 1); - prox.add(.5); - - subPoints[7].copy(subPoints[3]); - prox.setAsProxy(subPoints[7], 2, 1); - prox.add(.5); - - return subPoints; - } - - std::vector<fullMatrix<double> > generateSubPointsPyr(int nij, int nk) - { - if(nk == 0) { - std::vector<fullMatrix<double> > subPoints(4); - fullMatrix<double> prox; - - subPoints[0] = gmshGenerateMonomialsPyramidGeneral(false, nij, nk); - subPoints[0].scale(.5 / nij); - - subPoints[1].copy(subPoints[0]); - prox.setAsProxy(subPoints[1], 0, 1); - prox.add(.5); - - subPoints[2].copy(subPoints[0]); - prox.setAsProxy(subPoints[2], 1, 1); - prox.add(.5); - - subPoints[3].copy(subPoints[1]); - prox.setAsProxy(subPoints[3], 1, 1); - prox.add(.5); - - return subPoints; - } - else { - std::vector<fullMatrix<double> > subPoints(8); - fullMatrix<double> ref, prox; - - subPoints[0] = gmshGenerateMonomialsPyramidGeneral(false, nij, nk); - prox.setAsProxy(subPoints[0], 2, 1); - prox.scale(-1); - prox.add(nk); - subPoints[0].scale(.5 / std::max(nij, nk)); - - subPoints[1].copy(subPoints[0]); - prox.setAsProxy(subPoints[1], 0, 1); - prox.add(.5); - - subPoints[2].copy(subPoints[0]); - prox.setAsProxy(subPoints[2], 1, 1); - prox.add(.5); - - subPoints[3].copy(subPoints[1]); - prox.setAsProxy(subPoints[3], 1, 1); - prox.add(.5); - - subPoints[4].copy(subPoints[0]); - prox.setAsProxy(subPoints[4], 2, 1); - prox.add(.5); - - subPoints[5].copy(subPoints[1]); - prox.setAsProxy(subPoints[5], 2, 1); - prox.add(.5); - - subPoints[6].copy(subPoints[2]); - prox.setAsProxy(subPoints[6], 2, 1); - prox.add(.5); - - subPoints[7].copy(subPoints[3]); - prox.setAsProxy(subPoints[7], 2, 1); - prox.add(.5); - - for(int i = 0; i < 8; ++i) { - prox.setAsProxy(subPoints[i], 2, 1); - prox.scale(-1); - prox.add(1); - } - - return subPoints; - } + gmshGenerateOrderedMonomials(data, exp); } // Matrices generation @@ -350,6 +84,8 @@ namespace { const fullMatrix<double> &point, bool pyr, int nij, int nk) { + // For pyramids, the space is hex-like and thus tensorial. + // 'point' is the list of points on a grid. if(exponent.size1() != point.size1() || exponent.size2() != point.size2() || exponent.size2() != 3) { Msg::Error( @@ -378,64 +114,6 @@ namespace { return bez2Lag; } - fullMatrix<double> - generateSubDivisor(const fullMatrix<double> &exponents, - const std::vector<fullMatrix<double> > &subPoints, - const fullMatrix<double> &lag2Bez, int order, - int dimSimplex) - { - if(exponents.size1() != lag2Bez.size1() || - exponents.size1() != lag2Bez.size2()) { - Msg::Error("Wrong sizes for Bezier Divisor %d %d -- %d %d", - exponents.size1(), lag2Bez.size1(), exponents.size1(), - lag2Bez.size2()); - return fullMatrix<double>(1, 1); - } - - int nbPts = lag2Bez.size1(); - int nbSubPts = nbPts * subPoints.size(); - - fullMatrix<double> intermediate2(nbPts, nbPts); - fullMatrix<double> subDivisor(nbSubPts, nbPts); - - for(std::size_t i = 0; i < subPoints.size(); i++) { - fullMatrix<double> intermediate1 = - generateBez2LagMatrix(exponents, subPoints[i], order, dimSimplex); - lag2Bez.mult(intermediate1, intermediate2); - subDivisor.copy(intermediate2, 0, nbPts, 0, nbPts, i * nbPts, 0); - } - return subDivisor; - } - - fullMatrix<double> - generateSubDivisorPyramid(const fullMatrix<double> &exponents, - const std::vector<fullMatrix<double> > &subPoints, - const fullMatrix<double> &lag2Bez, bool pyr, - int nij, int nk) - { - if(exponents.size1() != lag2Bez.size1() || - exponents.size1() != lag2Bez.size2()) { - Msg::Error("Wrong sizes for Bezier Divisor %d %d -- %d %d", - exponents.size1(), lag2Bez.size1(), exponents.size1(), - lag2Bez.size2()); - return fullMatrix<double>(1, 1); - } - - int nbPts = lag2Bez.size1(); - int nbSubPts = nbPts * subPoints.size(); - - fullMatrix<double> intermediate2(nbPts, nbPts); - fullMatrix<double> subDivisor(nbSubPts, nbPts); - - for(std::size_t i = 0; i < subPoints.size(); i++) { - fullMatrix<double> intermediate1 = - generateBez2LagMatrixPyramid(exponents, subPoints[i], pyr, nij, nk); - lag2Bez.mult(intermediate1, intermediate2); - subDivisor.copy(intermediate2, 0, nbPts, 0, nbPts, i * nbPts, 0); - } - return subDivisor; - } - void double2int(const fullMatrix<double> &matDouble, fullMatrix<int> &matInt) { matInt.resize(matDouble.size1(), matDouble.size2()); @@ -446,262 +124,161 @@ namespace { } } -} // namespace - -bezierBasis::bezierBasis(FuncSpaceData data) : _data(data), _raiser(NULL) -{ - if(_data.elementType() == TYPE_PYR) - _constructPyr(); - else - _construct(); -} - -bezierBasis::~bezierBasis() { delete _raiser; } - -void bezierBasis::f(double u, double v, double w, double *sf) const -{ - const int tag = ElementType::getType(_data.elementType(), _data.spaceOrder()); - const nodalBasis *fs = BasisFactory::getNodalBasis(tag); - double p[1256]; - // TODO Amaury: change (u,v,w) - fs->f(u, v, w, p); - - for(int i = 0; i < matrixBez2Lag.size1(); i++) { - sf[i] = 0.0; - for(int j = 0; j < matrixBez2Lag.size2(); j++) { - sf[i] += matrixBez2Lag(j, i) * p[j]; + template <typename D> + void convertLag2Bez(const fullMatrix<double> &lag, int order, int start, + int inc, const fullVector<D> &x, fullMatrix<double> &bez) + { + // Algorithm to compute Bézier coefficients of f(x), x in [0, 1]. + // f is given by the Lagrange expansion: the coefficients are 'lag' + // and the corresponding Lagrange basis polynomials are constructed with + // nodes 'x'. Those nodes should be in [0, 1] if we aim at expanding the + // "same" function in Bézier interpolation. + // See this paper for the details: + // "Computing the Bézier control points of the Lagrangian interpolant in + // arbitrary dimension" by M. Ainsworth and M. A. Sánchez + const int nColumns = lag.size2(); + fullMatrix<D> f(order + 1, nColumns); + for(int i = start, n = 0; n <= order; i += inc, ++n) { + for(int j = 0; j < nColumns; ++j) { + f(n, j) = lag(i, j); + } } - } -} - -void bezierBasis::generateBezierPoints(fullMatrix<double> &points) const -{ - gmshGenerateMonomials(_data, points); - points.scale(1. / _data.spaceOrder()); - if(_data.elementType() == TYPE_PYR && _data.nk() < _data.spaceOrder()) { - fullMatrix<double> prox; - prox.setAsProxy(points, 2, 1); - prox.add(1 - static_cast<double>(_data.nk()) / _data.spaceOrder()); - } -} - -void bezierBasis::_fePoints2BezPoints(fullMatrix<double> &points) const -{ - fullMatrix<double> tmp; - switch(_data.elementType()) { - case TYPE_TRI: - case TYPE_TET: break; - - case TYPE_LIN: - tmp.setAsProxy(points, 0, 1); - tmp.add(1); - tmp.scale(.5); - break; - - case TYPE_QUA: - tmp.setAsProxy(points, 0, 2); - tmp.add(1); - tmp.scale(.5); - break; - - case TYPE_HEX: - points.add(1); - points.scale(.5); - break; - - case TYPE_PRI: - tmp.setAsProxy(points, 2, 1); - tmp.add(1); - tmp.scale(.5); - break; - - case TYPE_PYR: - for(int i = 0; i < points.size1(); ++i) { - points(i, 2) = 1. - points(i, 2); - points(i, 0) = .5 * (1 + points(i, 0) / points(i, 2)); - points(i, 1) = .5 * (1 + points(i, 1) / points(i, 2)); + fullVector<D> w(order + 1); + w.setAll(0); + w(0) = 1; + fullMatrix<D> c(order + 1, nColumns); + for(int j = 0; j < nColumns; ++j) { + c(0, j) = f(0, j); } - break; - - default: - Msg::Error("_fePoints2BezPoints not implemented for " - "type of element %d", - _data.elementType()); - return; - } -} - -void bezierBasis::interpolate(const fullMatrix<double> &coeffs, - const fullMatrix<double> &uvw, - fullMatrix<double> &result, bool bezCoord) const -{ - if(result.size1() != uvw.size1() || result.size2() != coeffs.size2()) - result.resize(uvw.size1(), coeffs.size2()); - - fullMatrix<double> bezuvw = uvw; - if(!bezCoord) _fePoints2BezPoints(bezuvw); - - const int numCoeff = _exponents.size1(); - const int dim = _exponents.size2(); - int order[3]; - - for(int m = 0; m < uvw.size1(); ++m) { - for(int n = 0; n < coeffs.size2(); ++n) result(m, n) = 0; - for(int i = 0; i < numCoeff; i++) { - _data.getOrderForBezier(order, _exponents(i, dim - 1)); - double dd = 1; - double pointCompl = 1.; - int exponentCompl = order[0]; - for(int k = 0; k < _dimSimplex; k++) { - dd *= nChoosek(exponentCompl, (int)_exponents(i, k)) * - pow(bezuvw(m, k), _exponents(i, k)); - pointCompl -= bezuvw(m, k); - exponentCompl -= (int)_exponents(i, k); + for(int s = 1; s <= order; ++s) { + for(int k = order; k >= s; --k) { + for(int j = 0; j < nColumns; ++j) { + f(k, j) = (f(k, j) - f(k - 1, j)) / (x(k) - x(k - s)); + } } - dd *= pow_int(pointCompl, exponentCompl); - - for(int k = _dimSimplex; k < dim; k++) { - dd *= nChoosek(order[k], (int)_exponents(i, k)) * - pow_int(bezuvw(m, k), _exponents(i, k)) * - pow_int(1. - bezuvw(m, k), order[k] - _exponents(i, k)); + for(int k = s; k >= 1; --k) { + const D kk = static_cast<D>(k); + w(k) = + kk / s * w(k - 1) * (1 - x(s - 1)) - (1 - kk / s) * w(k) * x(s - 1); + for(int j = 0; j < nColumns; ++j) { + c(k, j) = + kk / s * c(k - 1, j) + (1 - kk / s) * c(k, j) + f(s, j) * w(k); + } + } + w(0) = -w(0) * x(s - 1); + for(int j = 0; j < nColumns; ++j) { + c(0, j) = c(0, j) + f(s, j) * w(0); + } + } + for(int i = start, n = 0; n <= order; i += inc, ++n) { + for(int j = 0; j < nColumns; ++j) { + bez(i, j) = static_cast<double>(c(n, j)); } - for(int n = 0; n < coeffs.size2(); ++n) result(m, n) += coeffs(i, n) * dd; } } -} -void bezierBasis::lag2Bez(const fullMatrix<double> &lag, - fullMatrix<double> &bez) const -{ - if(lag.size1() != matrixLag2Bez.size1()) { - Msg::Error("matrix not the right size in lag2Bez function %d vs %d", - lag.size1(), matrixLag2Bez.size1()); - } - if(bez.size1() != lag.size1() || bez.size2() != lag.size2()) { - bez.resize(lag.size1(), lag.size2()); + void convertLag2Bez(const fullMatrix<double> &lag, int order, + const fullVector<double> &x, fullMatrix<double> &bez, + int start = -1, int inc = -1) + { + if(start < 0) start = 0; + if(inc < 1) inc = 1; + convertLag2Bez<double>(lag, order, start, inc, x, bez); } - matrixLag2Bez.mult(lag, bez); -} -void bezierBasis::subdivideBezCoeff(const fullMatrix<double> &coeff, - fullMatrix<double> &subCoeff) const -{ - if(subCoeff.size1() != subDivisor.size1() || - subCoeff.size2() != coeff.size2()) { - subCoeff.resize(subDivisor.size1(), coeff.size2()); - } - subDivisor.mult(coeff, subCoeff); -} +} // namespace -void bezierBasis::subdivideBezCoeff(const fullVector<double> &coeff, - fullVector<double> &subCoeff) const +bezierBasis::bezierBasis(FuncSpaceData data) + : _funcSpaceData(data), _raiser(NULL) { - if(subCoeff.size() != subDivisor.size1()) { - subCoeff.resize(subDivisor.size1()); - } - subDivisor.mult(coeff, subCoeff); + if(_funcSpaceData.getType() == TYPE_PYR) + _constructPyr(); + else + _construct(); } +bezierBasis::~bezierBasis() { delete _raiser; } + void bezierBasis::_construct() { - if(_data.elementType() == TYPE_PYR) { + if(_funcSpaceData.getType() == TYPE_PYR) { Msg::Error("This bezierBasis constructor is not for pyramids!"); return; } - std::vector<fullMatrix<double> > subPoints; - int order = _data.spaceOrder(); + int order = _funcSpaceData.getSpaceOrder(); - switch(_data.elementType()) { + switch(_funcSpaceData.getType()) { case TYPE_PNT: _numLagCoeff = 1; _dimSimplex = 0; - _exponents = gmshGenerateMonomialsLine(0); - subPoints.push_back(gmshGeneratePointsLine(0)); break; case TYPE_LIN: _numLagCoeff = order ? 2 : 1; _dimSimplex = 0; - _exponents = gmshGenerateMonomialsLine(order); - subPoints = generateSubPointsLine(order); break; case TYPE_TRI: _numLagCoeff = order ? 3 : 1; _dimSimplex = 2; - _exponents = gmshGenerateMonomialsTriangle(order); - subPoints = generateSubPointsTriangle(order); break; case TYPE_QUA: _numLagCoeff = order ? 4 : 1; _dimSimplex = 0; - _exponents = gmshGenerateMonomialsQuadrangle(order); - subPoints = generateSubPointsQuad(order); break; case TYPE_TET: _numLagCoeff = order ? 4 : 1; _dimSimplex = 3; - _exponents = gmshGenerateMonomialsTetrahedron(order); - subPoints = generateSubPointsTetrahedron(order); break; case TYPE_PRI: _numLagCoeff = order ? 6 : 1; _dimSimplex = 2; - _exponents = gmshGenerateMonomialsPrism(order); - subPoints = generateSubPointsPrism(order); break; case TYPE_HEX: _numLagCoeff = order ? 8 : 1; _dimSimplex = 0; - _exponents = gmshGenerateMonomialsHexahedron(order); - subPoints = generateSubPointsHex(order); break; default: - Msg::Error("Unknown function space for parentType %d", _data.elementType()); + Msg::Error("Unknown function space for parentType %d", + _funcSpaceData.getType()); return; } - _numDivisions = static_cast<int>(subPoints.size()); - fullMatrix<double> bezierPoints = _exponents; - if(order) bezierPoints.scale(1. / order); + fullMatrix<double> bezSamplingPoints; + gmshGenerateOrderedPoints(_funcSpaceData, bezSamplingPoints, true); + generateExponents(_funcSpaceData, _exponents); + + fullMatrix<double> matBez2Lag = + generateBez2LagMatrix(_exponents, bezSamplingPoints, order, _dimSimplex); + matBez2Lag.invert(matrixLag2Bez); - matrixBez2Lag = - generateBez2LagMatrix(_exponents, bezierPoints, order, _dimSimplex); - matrixBez2Lag.invert(matrixLag2Bez); - subDivisor = generateSubDivisor(_exponents, subPoints, matrixLag2Bez, order, - _dimSimplex); + gmshGenerateOrderedPointsLine(order, ordered1dBezPoints); } void bezierBasis::_constructPyr() { - if(_data.elementType() != TYPE_PYR) { + if(_funcSpaceData.getType() != TYPE_PYR) { Msg::Error("This bezierBasis constructor is for pyramids!"); } - const bool pyr = _data.isPyramidalSpace(); - const int nij = _data.nij(), nk = _data.nk(); + const bool pyr = _funcSpaceData.getPyramidalSpace(); + const int nij = _funcSpaceData.getNij(), nk = _funcSpaceData.getNk(); _numLagCoeff = nk == 0 ? 4 : 8; _dimSimplex = 0; - gmshGenerateMonomials(_data, _exponents); + // Note that the sampling points for the Jacobian determinant of pyramids are + // for z in [0, a] with a < 1. The third coordinate of Bezier points should + // also be in [0, a]. The same for subpoints. fullMatrix<double> bezierPoints; - generateBezierPoints(bezierPoints); - matrixBez2Lag = + gmshGenerateOrderedPoints(_funcSpaceData, bezierPoints, true); + generateExponents(_funcSpaceData, _exponents); + + fullMatrix<double> matBez2Lag = generateBez2LagMatrixPyramid(_exponents, bezierPoints, pyr, nij, nk); - matrixBez2Lag.invert(matrixLag2Bez); - if(pyr) { - _numDivisions = 0; - } - else { - std::vector<fullMatrix<double> > subPoints; - subPoints = generateSubPointsPyr(nij, nk); - _numDivisions = static_cast<int>(subPoints.size()); - subDivisor = generateSubDivisorPyramid(_exponents, subPoints, matrixLag2Bez, - pyr, nij, nk); - } + matBez2Lag.invert(matrixLag2Bez); } -bezierBasisRaiser *bezierBasis::getRaiser() const +const bezierBasisRaiser *bezierBasis::getRaiser() const { if(!_raiser) { const_cast<bezierBasis *>(this)->_raiser = new bezierBasisRaiser(this); @@ -709,24 +286,12 @@ bezierBasisRaiser *bezierBasis::getRaiser() const return _raiser; } -// const bezierBasis* bezierBasisRaiser::getRaisedBezierBasis(int raised) const -//{ -// if(raised != 2 && raised != 3){ -// Msg::Error("Why would you want other than 2 or 3?"); -// return NULL; -// } -// if(_bfs->_data.elementType() != TYPE_PYR) -// return BasisFactory::getBezierBasis( -// FuncSpaceData(_bfs->_data, _bfs->_data.spaceOrder()*raised)); -// else -// return BasisFactory::getBezierBasis( -// FuncSpaceData(_bfs->_data, -// _bfs->_data.nij()*raised, -// _bfs->_data.nk()*raised)); -//} - void bezierBasisRaiser::_fillRaiserData() { + // Let f and g be two function whose Bezier coefficients f_i, g_i are + // given and let F = f*g. The Bézier coefficients of Fcan be computed as + // F_i = sum_(j,k) a_jk f_j * g_k + // This function compute the coefficients a_jk (and similarly for 3 functions) if(_bfs->getType() == TYPE_PYR) { _fillRaiserDataPyr(); return; @@ -747,22 +312,25 @@ void bezierBasisRaiser::_fillRaiserData() // i <= j <= k (and adapt the value to take into account the multiplicity). // Construction of raiser 2 - fullMatrix<int> exp2; - { - fullMatrix<double> expD2; - FuncSpaceData dataRaiser2(_bfs->_data, 2 * order); - gmshGenerateMonomials(dataRaiser2, expD2); - double2int(expD2, exp2); - _raiser2.resize(exp2.size1()); - } std::map<int, int> hashToInd2; - for(int i = 0; i < exp2.size1(); ++i) { - int hash = 0; - for(int l = 0; l < dim; l++) { - hash += exp2(i, l) * pow_int(2 * order + 1, l); + { + fullMatrix<int> exp2; + { + fullMatrix<double> expD2; + FuncSpaceData data(_bfs->_funcSpaceData, 2 * order); + generateExponents(data, expD2); + double2int(expD2, exp2); + _raiser2.resize(exp2.size1()); + } + + for(int i = 0; i < exp2.size1(); ++i) { + int hash = 0; + for(int l = 0; l < dim; l++) { + hash += static_cast<int>(exp2(i, l) * pow_int(2 * order + 1, l)); + } + hashToInd2[hash] = i; } - hashToInd2[hash] = i; } for(int i = 0; i < ncoeff; i++) { @@ -790,29 +358,33 @@ void bezierBasisRaiser::_fillRaiserData() int hash = 0; for(int l = 0; l < dim; l++) { - hash += (exp(i, l) + exp(j, l)) * pow_int(2 * order + 1, l); + hash += + static_cast<int>((exp(i, l) + exp(j, l)) * pow_int(2 * order + 1, l)); } _raiser2[hashToInd2[hash]].push_back(_data(num / den, i, j)); } } // Construction of raiser 3 - fullMatrix<int> exp3; - { - fullMatrix<double> expD3; - FuncSpaceData dataRaiser3(_bfs->_data, 3 * order); - gmshGenerateMonomials(dataRaiser3, expD3); - double2int(expD3, exp3); - _raiser3.resize(exp3.size1()); - } std::map<int, int> hashToInd3; - for(int i = 0; i < exp3.size1(); ++i) { - int hash = 0; - for(int l = 0; l < dim; l++) { - hash += exp3(i, l) * pow_int(3 * order + 1, l); + { + fullMatrix<int> exp3; + { + fullMatrix<double> expD3; + FuncSpaceData data(_bfs->_funcSpaceData, 3 * order); + generateExponents(data, expD3); + double2int(expD3, exp3); + _raiser3.resize(exp3.size1()); + } + + for(int i = 0; i < exp3.size1(); ++i) { + int hash = 0; + for(int l = 0; l < dim; l++) { + hash += static_cast<int>(exp3(i, l) * pow_int(3 * order + 1, l)); + } + hashToInd3[hash] = i; } - hashToInd3[hash] = i; } for(int i = 0; i < ncoeff; i++) { @@ -848,8 +420,8 @@ void bezierBasisRaiser::_fillRaiserData() int hash = 0; for(int l = 0; l < dim; l++) { - hash += - (exp(i, l) + exp(j, l) + exp(k, l)) * pow_int(3 * order + 1, l); + hash += static_cast<int>((exp(i, l) + exp(j, l) + exp(k, l)) * + pow_int(3 * order + 1, l)); } _raiser3[hashToInd3[hash]].push_back(_data(num / den, i, j, k)); } @@ -859,12 +431,16 @@ void bezierBasisRaiser::_fillRaiserData() void bezierBasisRaiser::_fillRaiserDataPyr() { + // Let f and g be two function whose Bezier coefficients f_i, g_i are + // given and let F = f*g. The Bézier coefficients of Fcan be computed as + // F_i = sum_(j,k) a_jk f_j * g_k + // This function compute the coefficients a_jk (and similarly for 3 functions) FuncSpaceData fsdata = _bfs->getFuncSpaceData(); - if(fsdata.elementType() != TYPE_PYR) { + if(fsdata.getType() != TYPE_PYR) { _fillRaiserData(); return; } - if(fsdata.isPyramidalSpace()) { + if(fsdata.getPyramidalSpace()) { Msg::Error("Bezier raiser not implemented for pyramidal space"); return; } @@ -875,30 +451,31 @@ void bezierBasisRaiser::_fillRaiserDataPyr() double2int(expD, exp); } int ncoeff = exp.size1(); - int order[3] = {fsdata.nij(), fsdata.nij(), fsdata.nk()}; - int orderHash = std::max(order[0], order[1]); + int order[3] = {fsdata.getNij(), fsdata.getNij(), fsdata.getNk()}; + int orderHash = std::max(order[0], order[2]); // Speedup: Since the coefficients (num/den) are invariant from a permutation // of the indices (i, j) or (i, j, k), we fill only the raiser data for i <= j // <= k (and adapt the value to take into account the multiplicity). - // Construction of raiser 2 - fullMatrix<int> exp2; + std::map<int, int> hashToInd2; { - fullMatrix<double> expD2; - FuncSpaceData dataRaiser2(_bfs->_data, 2 * order[0], 2 * order[2]); - gmshGenerateMonomials(dataRaiser2, expD2); - double2int(expD2, exp2); - _raiser2.resize(exp2.size1()); - } + fullMatrix<int> exp2; + { + fullMatrix<double> expD2; + FuncSpaceData data(_bfs->_funcSpaceData, 2 * order[0], 2 * order[2]); + generateExponents(data, expD2); + double2int(expD2, exp2); + _raiser2.resize(exp2.size1()); + } - std::map<int, int> hashToInd2; - for(int i = 0; i < exp2.size1(); ++i) { - int hash = 0; - for(int l = 0; l < 3; l++) { - hash += exp2(i, l) * pow_int(2 * orderHash + 1, l); + for(int i = 0; i < exp2.size1(); ++i) { + int hash = 0; + for(int l = 0; l < 3; l++) { + hash += static_cast<int>(exp2(i, l) * pow_int(2 * orderHash + 1, l)); + } + hashToInd2[hash] = i; } - hashToInd2[hash] = i; } for(int i = 0; i < ncoeff; i++) { @@ -914,29 +491,33 @@ void bezierBasisRaiser::_fillRaiserDataPyr() int hash = 0; for(int l = 0; l < 3; l++) { - hash += (exp(i, l) + exp(j, l)) * pow_int(2 * orderHash + 1, l); + hash += static_cast<int>((exp(i, l) + exp(j, l)) * + pow_int(2 * orderHash + 1, l)); } _raiser2[hashToInd2[hash]].push_back(_data(num / den, i, j)); } } // Construction of raiser 3 - fullMatrix<int> exp3; - { - fullMatrix<double> expD3; - FuncSpaceData dataRaiser3(_bfs->_data, 3 * order[0], 3 * order[2]); - gmshGenerateMonomials(dataRaiser3, expD3); - double2int(expD3, exp3); - _raiser3.resize(exp3.size1()); - } std::map<int, int> hashToInd3; - for(int i = 0; i < exp3.size1(); ++i) { - int hash = 0; - for(int l = 0; l < 3; l++) { - hash += exp3(i, l) * pow_int(3 * orderHash + 1, l); + { + fullMatrix<int> exp3; + { + fullMatrix<double> expD3; + FuncSpaceData data(_bfs->_funcSpaceData, 3 * order[0], 3 * order[2]); + generateExponents(data, expD3); + double2int(expD3, exp3); + _raiser3.resize(exp3.size1()); + } + + for(int i = 0; i < exp3.size1(); ++i) { + int hash = 0; + for(int l = 0; l < 3; l++) { + hash += static_cast<int>(exp3(i, l) * pow_int(3 * orderHash + 1, l)); + } + hashToInd3[hash] = i; } - hashToInd3[hash] = i; } for(int i = 0; i < ncoeff; i++) { @@ -957,8 +538,8 @@ void bezierBasisRaiser::_fillRaiserDataPyr() int hash = 0; for(int l = 0; l < 3; l++) { - hash += - (exp(i, l) + exp(j, l) + exp(k, l)) * pow_int(3 * orderHash + 1, l); + hash += static_cast<int>((exp(i, l) + exp(j, l) + exp(k, l)) * + pow_int(3 * orderHash + 1, l)); } _raiser3[hashToInd3[hash]].push_back(_data(num / den, i, j, k)); } @@ -968,14 +549,14 @@ void bezierBasisRaiser::_fillRaiserDataPyr() void bezierBasisRaiser::computeCoeff(const fullVector<double> &coeffA, const fullVector<double> &coeffB, - fullVector<double> &coeffSquare) + fullVector<double> &coeffSquare) const { coeffSquare.resize(_raiser2.size(), true); if(&coeffA == &coeffB) { for(std::size_t ind = 0; ind < _raiser2.size(); ++ind) { for(std::size_t l = 0; l < _raiser2[ind].size(); ++l) { - _data &d = _raiser2[ind][l]; + const _data &d = _raiser2[ind][l]; coeffSquare(ind) += d.val * coeffA(d.i) * coeffB(d.j); } } @@ -983,7 +564,7 @@ void bezierBasisRaiser::computeCoeff(const fullVector<double> &coeffA, else { for(std::size_t ind = 0; ind < _raiser2.size(); ++ind) { for(std::size_t l = 0; l < _raiser2[ind].size(); ++l) { - _data &d = _raiser2[ind][l]; + const _data &d = _raiser2[ind][l]; coeffSquare(ind) += d.val / 2 * (coeffA(d.i) * coeffB(d.j) + coeffA(d.j) * coeffB(d.i)); } @@ -994,14 +575,14 @@ void bezierBasisRaiser::computeCoeff(const fullVector<double> &coeffA, void bezierBasisRaiser::computeCoeff(const fullVector<double> &coeffA, const fullVector<double> &coeffB, const fullVector<double> &coeffC, - fullVector<double> &coeffCubic) + fullVector<double> &coeffCubic) const { coeffCubic.resize(_raiser3.size(), true); if(&coeffA == &coeffB && &coeffB == &coeffC) { for(std::size_t ind = 0; ind < _raiser3.size(); ++ind) { for(std::size_t l = 0; l < _raiser3[ind].size(); ++l) { - _data &d = _raiser3[ind][l]; + const _data &d = _raiser3[ind][l]; coeffCubic(ind) += d.val * coeffA(d.i) * coeffB(d.j) * coeffC(d.k); } } @@ -1009,7 +590,7 @@ void bezierBasisRaiser::computeCoeff(const fullVector<double> &coeffA, else if(&coeffA != &coeffB && &coeffB != &coeffC) { for(std::size_t ind = 0; ind < _raiser3.size(); ++ind) { for(std::size_t l = 0; l < _raiser3[ind].size(); ++l) { - _data &d = _raiser3[ind][l]; + const _data &d = _raiser3[ind][l]; coeffCubic(ind) += d.val / 6 * (coeffA(d.i) * coeffB(d.j) * coeffC(d.k) + coeffA(d.i) * coeffB(d.k) * coeffC(d.j) + @@ -1026,74 +607,945 @@ void bezierBasisRaiser::computeCoeff(const fullVector<double> &coeffA, "or A != B == C"); } -void bezierBasisRaiser::computeCoeff(const fullMatrix<double> &coeffA, - const fullMatrix<double> &coeffB, - fullMatrix<double> &coeffSquare) +bezierCoeffMemoryPool *bezierCoeff::_pool0 = NULL; +bezierCoeffMemoryPool *bezierCoeff::_pool1 = NULL; +fullMatrix<double> bezierCoeff::_sub = fullMatrix<double>(); + +bezierCoeff::bezierCoeff(FuncSpaceData data, const fullMatrix<double> &lagCoeff, + int num) + : _numPool(num), _funcSpaceData(data), + _basis(BasisFactory::getBezierBasis(data)) { - coeffSquare.resize(_raiser2.size(), coeffA.size2(), true); + _r = lagCoeff.size1(); + _c = lagCoeff.size2(); + _own_data = false; + if(num == 0 && _pool0) + _data = _pool0->giveBlock(this); + else if(num == 1 && _pool1) + _data = _pool1->giveBlock(this); + else { + _own_data = true; + _data = new double[_r * _c]; + } - if(&coeffA == &coeffB) { - for(std::size_t ind = 0; ind < _raiser2.size(); ++ind) { - for(std::size_t l = 0; l < _raiser2[ind].size(); ++l) { - _data &d = _raiser2[ind][l]; - for(int ind2 = 0; ind2 < coeffA.size2(); ++ind2) { - coeffSquare(ind, ind2) += - d.val * coeffA(d.i, ind2) * coeffB(d.j, ind2); + _computeCoefficients(lagCoeff.getDataPtr()); +} + +bezierCoeff::bezierCoeff(FuncSpaceData data, const fullVector<double> &lagCoeff, + int num) + : _numPool(num), _funcSpaceData(data), + _basis(BasisFactory::getBezierBasis(data)) +{ + _r = lagCoeff.size(); + _c = 1; + _own_data = false; + if(num == 0 && _pool0) + _data = _pool0->giveBlock(this); + else if(num == 1 && _pool1) + _data = _pool1->giveBlock(this); + else { + _own_data = true; + _data = new double[_r * _c]; + } + + _computeCoefficients(lagCoeff.getDataPtr()); +} + +bezierCoeff::bezierCoeff(const bezierCoeff &other, bool swap) +{ + _numPool = other._numPool; + _funcSpaceData = other._funcSpaceData; + _basis = other._basis; + _r = other._r; + _c = other._c; + if(swap) { + _own_data = other._own_data; + _data = other._data; + const_cast<bezierCoeff &>(other)._own_data = false; + const_cast<bezierCoeff &>(other)._numPool = -1; + } + else { + _own_data = false; + if(_numPool == 0 && _pool0) + _data = _pool0->giveBlock(this); + else if(_numPool == 1 && _pool1) + _data = _pool1->giveBlock(this); + else { + _own_data = true; + _data = new double[_r * _c]; + } + } +} + +bezierCoeff::~bezierCoeff() +{ + if(_own_data) + delete[] _data; + else { + if(_numPool == -1) return; + if(_numPool == 0 && _pool0) + _pool0->releaseBlock(_data, this); + else if(_numPool == 1 && _pool1) + _pool1->releaseBlock(_data, this); + else + Msg::Error("Not supposed to be here. destructor bezierCoeff"); + } +} + +void bezierCoeff::_computeCoefficients(const double *lagCoeffDataConst) +{ + // FIXME: Use Leja order? (if yes, change gmshGenerateOrderedPoints and look + // at commit c84dedaa878f5ad58f68ef098979379ed3b57514) + const int type = _funcSpaceData.getType(); + const int order = _funcSpaceData.getSpaceOrder(); + const int npt = order + 1; + const fullMatrix<double> lag(const_cast<double *>(lagCoeffDataConst), _r, _c); + const fullVector<double> &x = _basis->ordered1dBezPoints; + fullMatrix<double> bez(_data, _r, _c); + + switch(type) { + case TYPE_TRI: + case TYPE_TET: + // Note: For simplices, less significant errors in matrixLag2Bez but + // an algorithm exists (see same paper than algo convertLag2Bez), yet + // it is complex. It may be implemented in the future if it is necessary. + _basis->matrixLag2Bez.mult(lag, bez); + return; + case TYPE_LIN: convertLag2Bez(lag, order, x, bez); return; + case TYPE_QUA: + for(int i = 0; i < npt; ++i) convertLag2Bez(lag, order, x, bez, i, npt); + for(int j = 0; j < npt; ++j) convertLag2Bez(bez, order, x, bez, j * npt, 1); + return; + case TYPE_HEX: + for(int ij = 0; ij < npt * npt; ++ij) { + convertLag2Bez(lag, order, x, bez, ij, npt * npt); + } + for(int i = 0; i < npt; ++i) { + for(int k = 0; k < npt; ++k) { + convertLag2Bez(bez, order, x, bez, i + k * npt * npt, npt); + } + } + for(int jk = 0; jk < npt * npt; ++jk) { + convertLag2Bez(bez, order, x, bez, jk * npt, 1); + } + return; + case TYPE_PYR: { + // Pyramids space is tensorial like the hex + const int nbij = _funcSpaceData.getNij() + 1; + const int nbk = _funcSpaceData.getNk() + 1; + fullVector<double> xij, xk; + gmshGenerateOrderedPointsLine(nbij - 1, xij); + gmshGenerateOrderedPointsLine(nbk - 1, xk); + for(int ij = 0; ij < nbij * nbij; ++ij) { + convertLag2Bez(lag, nbk - 1, xk, bez, ij, nbij * nbij); + } + for(int i = 0; i < nbij; ++i) { + for(int k = 0; k < nbk; ++k) { + convertLag2Bez(bez, nbij - 1, xij, bez, i + k * nbij * nbij, nbij); + } + } + for(int jk = 0; jk < nbij * nbk; ++jk) { + convertLag2Bez(bez, nbij - 1, xij, bez, jk * nbij, 1); + } + return; + } + case TYPE_PRI: { + // Prism space is a mix of triangular space and linear space + double *lagCoeffData = const_cast<double *>(lagCoeffDataConst); + const bezierBasis *fsTri = BasisFactory::getBezierBasis(TYPE_TRI, order); + const int nptTri = (order + 2) * (order + 1) / 2; + fullVector<double> proxLag; + fullVector<double> proxBez; + for(int k = 0; k < npt; ++k) { + for(int c = 0; c < _c; ++c) { + const int inc = c * _r + k * nptTri; + proxLag.setAsProxy(lagCoeffData + inc, nptTri); + proxBez.setAsProxy(_data + inc, nptTri); + fsTri->matrixLag2Bez.mult(proxLag, proxBez); + } + } + for(int ij = 0; ij < nptTri; ++ij) { + convertLag2Bez(bez, order, x, bez, ij, nptTri); + } + return; + } + } +} + +void bezierCoeff::usePools(std::size_t size0, std::size_t size1) +{ + if(size0) { + if(!_pool0) _pool0 = new bezierCoeffMemoryPool(); + _pool0->setSizeBlocks(size0); + } + if(size1) { + if(!_pool1) _pool1 = new bezierCoeffMemoryPool(); + _pool1->setSizeBlocks(size1); + } +} + +void bezierCoeff::releasePools() +{ + delete _pool0; + delete _pool1; + _pool0 = NULL; + _pool1 = NULL; +} + +void bezierCoeff::updateDataPtr(long diff) +{ + if(_own_data) + Msg::Error("I own data, cannot do that"); + else + _data += diff; +} + +int bezierCoeff::getIdxCornerCoeff(int i) const +{ + const int order = _funcSpaceData.getSpaceOrder(); + switch(_funcSpaceData.getType()) { + case TYPE_TRI: + switch(i) { + case 0: return 0; + case 1: return order; + case 2: return _r - 1; + } + case TYPE_QUA: + switch(i) { + case 0: return 0; + case 1: return order; + case 2: return _r - 1; + case 3: return _r - 1 - order; + } + case TYPE_TET: + switch(i) { + case 0: return 0; + case 1: return order; + case 2: return (order + 2) * (order + 1) / 2 - 1; + case 3: return _r - 1; + } + case TYPE_HEX: + switch(i) { + case 0: return 0; + case 1: return order; + case 2: return (order + 1) * (order + 1) - 1; + case 3: return (order + 1) * order; + case 4: return (order + 1) * (order + 1) * order; + case 5: return (order + 1) * (order + 1) * order + order; + case 6: return _r - 1; + case 7: return (order + 2) * (order + 1) * order; + } + case TYPE_PRI: + switch(i) { + case 0: return 0; + case 1: return order; + case 2: return (order + 2) * (order + 1) / 2 - 1; + case 3: return (order + 2) * (order + 1) / 2 * order; + case 4: return (order + 2) * (order + 1) / 2 * order + order; + case 5: return _r - 1; + } + case TYPE_PYR: + if(_funcSpaceData.getPyramidalSpace()) { + switch(i) { + case 0: return 0; + case 1: return order; + case 2: return (order + 1) * (order + 1) - 1; + case 3: return (order + 1) * order; + case 4: return _r - 1; + } + } + else { + const int nij = _funcSpaceData.getNij(); + const int nk = _funcSpaceData.getNk(); + switch(i) { + case 0: return 0; + case 1: return nij; + case 2: return (nij + 1) * (nij + 1) - 1; + case 3: return (nij + 1) * nij; + case 4: return (nij + 1) * (nij + 1) * nk; + case 5: return (nij + 1) * (nij + 1) * nk + nij; + case 6: return _r - 1; + case 7: return (nij + 1) * (nij + 1) * nk + (nij + 1) * nij; + } + } + default: + Msg::Error("type %d not implemented in getIdxCornerCoeff", + _funcSpaceData.getType()); + return 0; + } +} + +void bezierCoeff::getCornerCoeffs(fullVector<double> &v) const +{ + const int n = getNumCornerCoeff(); + v.resize(n); + for(int i = 0; i < n; ++i) { + v(i) = getCornerCoeff(i); + } +} + +void bezierCoeff::getCornerCoeffs(fullMatrix<double> &m) const +{ + const int n = getNumCornerCoeff(); + m.resize(n, _c); + for(int i = 0; i < n; ++i) { + const int k = getIdxCornerCoeff(i); + for(int j = 0; j < _c; ++j) { + m(i, j) = _data[k + _r * j]; + } + } +} + +void bezierCoeff::subdivide(std::vector<bezierCoeff *> &subCoeff) const +{ + if(subCoeff.size()) { + Msg::Warning("expected empty vector of bezierCoeff"); + subCoeff.clear(); + } + + switch(_funcSpaceData.getType()) { + case TYPE_TRI: + for(int i = 0; i < 4; ++i) subCoeff.push_back(new bezierCoeff(*this)); + _subdivideTriangle(*this, 0, subCoeff); + return; + case TYPE_QUA: + for(int i = 0; i < 4; ++i) subCoeff.push_back(new bezierCoeff(*this)); + _subdivideQuadrangle(*this, subCoeff); + return; + case TYPE_TET: + for(int i = 0; i < 8; ++i) subCoeff.push_back(new bezierCoeff(*this)); + _subdivideTetrahedron(*this, subCoeff); + return; + case TYPE_HEX: + for(int i = 0; i < 8; ++i) subCoeff.push_back(new bezierCoeff(*this)); + _subdivideHexahedron(*this, subCoeff); + return; + case TYPE_PRI: + for(int i = 0; i < 8; ++i) subCoeff.push_back(new bezierCoeff(*this)); + _subdividePrism(*this, subCoeff); + return; + case TYPE_PYR: + for(int i = 0; i < 8; ++i) subCoeff.push_back(new bezierCoeff(*this)); + _subdividePyramid(*this, subCoeff); + return; + } +} + +void bezierCoeff::_subdivide(fullMatrix<double> &coeff, int npts, int start) +{ + // One-dimensional De Casteljau algorithm if consecutive data + const int dim = coeff.size2(); + for(int iter = 1; iter < npts; ++iter) { + for(int I = start + iter; I < start + 2 * npts - iter; I += 2) { + for(int K = 0; K < dim; ++K) { + coeff(I, K) = .5 * (coeff(I - 1, K) + coeff(I + 1, K)); + } + } + } +} + +void bezierCoeff::_subdivide(fullMatrix<double> &coeff, int npts, int start, + int inc) +{ + // One-dimensional De Casteljau algorithm if non-consecutive data + const int dim = coeff.size2(); + for(int iter = 1; iter < npts; ++iter) { + for(int i = iter; i < 2 * npts - iter; i += 2) { + int I = start + i * inc; + for(int K = 0; K < dim; ++K) { + coeff(I, K) = .5 * (coeff(I - inc, K) + coeff(I + inc, K)); + } + } + } +} + +void bezierCoeff::_subdivideTriangle(const bezierCoeff &coeff, int start, + std::vector<bezierCoeff *> &vSubCoeff) +{ + const int n = coeff.getPolynomialOrder() + 1; + const int dim = coeff._c; + + bezierCoeff &sub1 = *vSubCoeff[0]; + bezierCoeff &sub2 = *vSubCoeff[1]; + bezierCoeff &sub3 = *vSubCoeff[2]; + bezierCoeff &sub4 = *vSubCoeff[3]; + + // copy into first subdomain + if(&coeff != &sub1) _copy(coeff, start, (n + 1) * n / 2, sub1); + + // Subdivide in u direction + // TODO: consider precompute vector<pair<int, int>> for this + for(int iter = 1; iter < n; ++iter) { + for(int j = 0; j < n - iter; ++j) { + for(int i = n - 1 - j; i >= iter; --i) { + const int I = start + _ij2Index(i, j, n); + const int Im = start + _ij2Index(i - 1, j, n); + for(int K = 0; K < dim; ++K) { + sub1(I, K) = .5 * (sub1(Im, K) + sub1(I, K)); } } } } - else { - for(std::size_t ind = 0; ind < _raiser2.size(); ++ind) { - for(std::size_t l = 0; l < _raiser2[ind].size(); ++l) { - _data &d = _raiser2[ind][l]; - double val = d.val / 2; - for(int ind2 = 0; ind2 < coeffA.size2(); ++ind2) { - coeffSquare(ind, ind2) += - val * (coeffA(d.i, ind2) * coeffB(d.j, ind2) + - coeffA(d.j, ind2) * coeffB(d.i, ind2)); + // Subdivide in v direction + for(int iter = 1; iter < n; ++iter) { + for(int j = n - 1; j >= iter; --j) { + for(int i = 0; i < n - j; ++i) { + const int I = start + _ij2Index(i, j, n); + const int Im = start + _ij2Index(i, j - 1, n); + for(int K = 0; K < dim; ++K) { + sub1(I, K) = .5 * (sub1(Im, K) + sub1(I, K)); + } + } + } + } + + _copy(sub1, start, (n + 1) * n / 2, sub2); + // + // TODO: consider precompute vector<tuple<int, int, int>> for this + for(int iter = 1; iter < n; ++iter) { + for(int j = 0; j < n - iter; ++j) { + for(int i = 0; i < n - iter - j; ++i) { + const int I = start + _ij2Index(i, j, n); + const int Ia = start + _ij2Index(i + 1, j, n); + const int Ib = start + _ij2Index(i, j + 1, n); + for(int K = 0; K < dim; ++K) { + sub2(I, K) = sub2(Ia, K) + sub2(Ib, K) - sub2(I, K); + } + } + } + } + + _copy(sub2, start, (n + 1) * n / 2, sub3); + for(int iter = 1; iter < n; ++iter) { + for(int j = 0; j < n - iter; ++j) { + for(int i = n - 1 - j; i >= iter; --i) { + const int I = start + _ij2Index(i, j, n); + const int Ia = start + _ij2Index(i - 1, j, n); + const int Ib = start + _ij2Index(i - 1, j + 1, n); + for(int K = 0; K < dim; ++K) { + sub3(I, K) = sub3(Ia, K) + sub3(Ib, K) - sub3(I, K); + } + } + } + } + + _copy(sub2, start, (n + 1) * n / 2, sub4); // copy 2, not 3 + for(int iter = 1; iter < n; ++iter) { + for(int j = n - 1; j >= iter; --j) { + for(int i = 0; i < n - j; ++i) { + const int I = start + _ij2Index(i, j, n); + const int Ia = start + _ij2Index(i, j - 1, n); + const int Ib = start + _ij2Index(i + 1, j - 1, n); + for(int K = 0; K < dim; ++K) { + sub4(I, K) = sub4(Ia, K) + sub4(Ib, K) - sub4(I, K); } } } } } -void bezierBasisRaiser::computeCoeff(const fullVector<double> &coeffA, - const fullMatrix<double> &coeffB, - const fullMatrix<double> &coeffC, - fullMatrix<double> &coeffCubic) +void bezierCoeff::_subdivideTet(_SubdivisionTet which, int n, + bezierCoeff &coeff) +{ + // TODO: consider precompute vector<pair<int, int>> for subdiv + // consider precompute vector<pair<int, int, int>> for n_crosse_e + + const int dim = coeff.getNumColumns(); + switch(which) { + case subdivU: + for(int iter = 1; iter < n; ++iter) { + for(int k = 0; k < n - iter; ++k) { + for(int j = 0; j < n - iter - k; ++j) { + for(int i = n - 1 - j - k; i >= iter; --i) { + const int I = _ijk2Index(i, j, k, n); + const int Im = _ijk2Index(i - 1, j, k, n); + for(int K = 0; K < dim; ++K) { + coeff(I, K) = .5 * (coeff(Im, K) + coeff(I, K)); + } + } + } + } + } + return; + case subdivV: + for(int iter = 1; iter < n; ++iter) { + for(int k = 0; k < n - iter; ++k) { + for(int j = n - 1 - k; j >= iter; --j) { + for(int i = 0; i < n - j - k; ++i) { + const int I = _ijk2Index(i, j, k, n); + const int Im = _ijk2Index(i, j - 1, k, n); + for(int K = 0; K < dim; ++K) { + coeff(I, K) = .5 * (coeff(Im, K) + coeff(I, K)); + } + } + } + } + } + return; + case subdivW: + for(int iter = 1; iter < n; ++iter) { + for(int k = n - 1; k >= iter; --k) { + for(int j = 0; j < n - k; ++j) { + for(int i = 0; i < n - j - k; ++i) { + const int I = _ijk2Index(i, j, k, n); + const int Im = _ijk2Index(i, j, k - 1, n); + for(int K = 0; K < dim; ++K) { + coeff(I, K) = .5 * (coeff(Im, K) + coeff(I, K)); + } + } + } + } + } + return; + // TODO: consider precompute vector<tuple<int, int, int>> for this + case node0CrossEdge12: + for(int iter = 1; iter < n; ++iter) { + for(int k = 0; k < n - iter; ++k) { + for(int j = 0; j < n - iter - k; ++j) { + for(int i = 0; i < n - iter - j - k; ++i) { + const int I = _ijk2Index(i, j, k, n); + const int Ia = _ijk2Index(i + 1, j, k, n); + const int Ib = _ijk2Index(i, j + 1, k, n); + for(int K = 0; K < dim; ++K) { + coeff(I, K) = coeff(Ia, K) + coeff(Ib, K) - coeff(I, K); + } + } + } + } + } + return; + case node3CrossEdge12: + for(int iter = 1; iter < n; ++iter) { + for(int k = n - 1; k >= iter; --k) { + for(int j = 0; j < n - k; ++j) { + for(int i = 0; i < n - j - k; ++i) { + const int I = _ijk2Index(i, j, k, n); + const int Ia = _ijk2Index(i + 1, j, k - 1, n); + const int Ib = _ijk2Index(i, j + 1, k - 1, n); + for(int K = 0; K < dim; ++K) { + coeff(I, K) = coeff(Ia, K) + coeff(Ib, K) - coeff(I, K); + } + } + } + } + } + return; + case node1CrossEdge03: + for(int iter = 1; iter < n; ++iter) { + for(int k = 0; k < n - iter; ++k) { + for(int j = 0; j < n - iter - k; ++j) { + for(int i = n - 1 - j - k; i >= iter; --i) { + const int I = _ijk2Index(i, j, k, n); + const int Ia = _ijk2Index(i - 1, j, k, n); + const int Ib = _ijk2Index(i - 1, j, k + 1, n); + for(int K = 0; K < dim; ++K) { + coeff(I, K) = coeff(Ia, K) + coeff(Ib, K) - coeff(I, K); + } + } + } + } + } + return; + case node2CrossEdge03: + for(int iter = 1; iter < n; ++iter) { + for(int k = 0; k < n - iter; ++k) { + for(int j = n - 1 - k; j >= iter; --j) { + for(int i = 0; i < n - j - k; ++i) { + const int I = _ijk2Index(i, j, k, n); + const int Ia = _ijk2Index(i, j - 1, k, n); + const int Ib = _ijk2Index(i, j - 1, k + 1, n); + for(int K = 0; K < dim; ++K) { + coeff(I, K) = coeff(Ia, K) + coeff(Ib, K) - coeff(I, K); + } + } + } + } + } + } +} + +void bezierCoeff::_subdivideTetrahedron(const bezierCoeff &coeff, + std::vector<bezierCoeff *> &vSubCoeff) { - coeffCubic.resize(_raiser3.size(), coeffB.size2(), true); + const int n = coeff.getPolynomialOrder() + 1; + const int N = (n + 2) * (n + 1) * n / 6; + + bezierCoeff &sub1 = *vSubCoeff[0]; + bezierCoeff &sub2 = *vSubCoeff[1]; + bezierCoeff &sub3 = *vSubCoeff[2]; + bezierCoeff &sub4 = *vSubCoeff[3]; + bezierCoeff &sub5 = *vSubCoeff[4]; + bezierCoeff &sub6 = *vSubCoeff[5]; + bezierCoeff &sub7 = *vSubCoeff[6]; + bezierCoeff &sub8 = *vSubCoeff[7]; + + // Corner (0,0,0) + _copy(coeff, 0, N, sub1); + _subdivideTet(subdivU, n, sub1); + _subdivideTet(subdivV, n, sub1); + _subdivideTet(subdivW, n, sub1); + + // Compute 4 middle ones + _copy(sub1, 0, N, sub2); + _subdivideTet(node0CrossEdge12, n, sub2); + + _copy(sub2, 0, N, sub3); + _copy(sub2, 0, N, sub4); + _subdivideTet(node1CrossEdge03, n, sub3); + _subdivideTet(node2CrossEdge03, n, sub4); + + _copy(sub4, 0, N, sub5); + _subdivideTet(node1CrossEdge03, n, sub5); + + // 3 remaining corners + _copy(sub3, 0, N, sub6); + _copy(sub4, 0, N, sub7); + _copy(sub5, 0, N, sub8); + _subdivideTet(node3CrossEdge12, n, sub6); + _subdivideTet(node3CrossEdge12, n, sub7); + _subdivideTet(node0CrossEdge12, n, sub8); + // node 3 cross edge 1-2 +} - if(&coeffB == &coeffC) { - for(std::size_t ind = 0; ind < _raiser3.size(); ++ind) { - for(std::size_t l = 0; l < _raiser3[ind].size(); ++l) { - _data &d = _raiser3[ind][l]; - double val = d.val / 3; - for(int ind2 = 0; ind2 < coeffB.size2(); ++ind2) { - coeffCubic(ind, ind2) += - val * (coeffA(d.i) * coeffB(d.j, ind2) * coeffC(d.k, ind2) + - coeffA(d.j) * coeffB(d.i, ind2) * coeffC(d.k, ind2) + - coeffA(d.k) * coeffB(d.i, ind2) * coeffC(d.j, ind2)); +void bezierCoeff::_subdivideQuadrangle(const bezierCoeff &coeff, + std::vector<bezierCoeff *> &subCoeff) +{ + const int n = coeff.getPolynomialOrder() + 1; + const int N = 2 * n - 1; + const int dim = coeff._c; + _sub.resize(N * N, dim, false); + for(int i = 0; i < n; ++i) { + for(int j = 0; j < n; ++j) { + const int I1 = i + j * n; + const int I2 = (2 * i) + (2 * j) * N; + for(int k = 0; k < dim; ++k) { + _sub(I2, k) = coeff(I1, k); + } + } + } + for(int i = 0; i < N; i += 2) { + _subdivide(_sub, n, i, N); + } + for(int j = 0; j < N; ++j) { + _subdivide(_sub, n, j * N); + } + _copyQuad(_sub, n, 0, 0, *subCoeff[0]); + _copyQuad(_sub, n, n - 1, 0, *subCoeff[1]); + _copyQuad(_sub, n, 0, n - 1, *subCoeff[2]); + _copyQuad(_sub, n, n - 1, n - 1, *subCoeff[3]); + return; +} + +void bezierCoeff::_subdivideHexahedron(const bezierCoeff &coeff, + std::vector<bezierCoeff *> &subCoeff) +{ + const int n = coeff.getPolynomialOrder() + 1; + const int N = 2 * n - 1; + const int dim = coeff._c; + _sub.resize(N * N * N, dim, false); + for(int i = 0; i < n; ++i) { + for(int j = 0; j < n; ++j) { + for(int k = 0; k < n; ++k) { + const int I1 = i + j * n + k * n * n; + const int I2 = (2 * i) + (2 * j) * N + (2 * k) * N * N; + for(int k = 0; k < dim; ++k) { + _sub(I2, k) = coeff(I1, k); } } } } - else { - for(std::size_t ind = 0; ind < _raiser3.size(); ++ind) { - for(std::size_t l = 0; l < _raiser3[ind].size(); ++l) { - _data &d = _raiser3[ind][l]; - double val = d.val / 6; - for(int ind2 = 0; ind2 < coeffB.size2(); ++ind2) { - coeffCubic(ind, ind2) += - val * (coeffA(d.i) * coeffB(d.j, ind2) * coeffC(d.k, ind2) + - coeffA(d.i) * coeffB(d.k, ind2) * coeffC(d.j, ind2) + - coeffA(d.j) * coeffB(d.i, ind2) * coeffC(d.k, ind2) + - coeffA(d.j) * coeffB(d.k, ind2) * coeffC(d.i, ind2) + - coeffA(d.k) * coeffB(d.i, ind2) * coeffC(d.j, ind2) + - coeffA(d.k) * coeffB(d.j, ind2) * coeffC(d.i, ind2)); + for(int i = 0; i < N; i += 2) { + for(int j = 0; j < N; j += 2) { + _subdivide(_sub, n, i + j * N, N * N); + } + } + for(int i = 0; i < N; i += 2) { + for(int k = 0; k < N; ++k) { + _subdivide(_sub, n, i + k * N * N, N); + } + } + for(int j = 0; j < N; ++j) { + for(int k = 0; k < N; ++k) { + _subdivide(_sub, n, j * N + k * N * N); + } + } + _copyHex(_sub, n, 0, 0, 0, *subCoeff[0]); + _copyHex(_sub, n, n - 1, 0, 0, *subCoeff[1]); + _copyHex(_sub, n, 0, n - 1, 0, *subCoeff[2]); + _copyHex(_sub, n, n - 1, n - 1, 0, *subCoeff[3]); + _copyHex(_sub, n, 0, 0, n - 1, *subCoeff[4]); + _copyHex(_sub, n, n - 1, 0, n - 1, *subCoeff[5]); + _copyHex(_sub, n, 0, n - 1, n - 1, *subCoeff[6]); + _copyHex(_sub, n, n - 1, n - 1, n - 1, *subCoeff[7]); + return; +} + +void bezierCoeff::_subdividePrism(const bezierCoeff &coeff, + std::vector<bezierCoeff *> &subCoeff) +{ + const int n = coeff.getPolynomialOrder() + 1; + const int ntri = (n + 1) * n / 2; + const int N = 2 * n - 1; + const int dim = coeff._c; + + // First, use De Casteljau algorithm in 3rd direction (=> 2 subdomains): + _sub.resize(N * ntri, dim, false); + for(int k = 0; k < n; ++k) { + for(int i = 0; i < ntri; ++i) { + const int I1 = i + k * ntri; + const int I2 = i + (2 * k) * ntri; + for(int l = 0; l < dim; ++l) { + _sub(I2, l) = coeff(I1, l); + } + } + } + for(int i = 0; i < ntri; ++i) { + _subdivide(_sub, n, i, ntri); + } + + // Copy first subdomain into subCoeff[0] and second one into subCoeff2[0] + std::vector<bezierCoeff *> subCoeff2; + subCoeff2.push_back(subCoeff[4]); + subCoeff2.push_back(subCoeff[5]); + subCoeff2.push_back(subCoeff[6]); + subCoeff2.push_back(subCoeff[7]); + _copyLine(_sub, n * ntri, 0, *subCoeff[0]); + _copyLine(_sub, n * ntri, (n - 1) * ntri, *subCoeff2[0]); + + // Second, subdivide in the triangular space: + for(int k = 0; k < n; ++k) { + _subdivideTriangle(*subCoeff[0], k * ntri, subCoeff); + _subdivideTriangle(*subCoeff2[0], k * ntri, subCoeff2); + } + return; +} + +void bezierCoeff::_subdividePyramid(const bezierCoeff &coeff, + std::vector<bezierCoeff *> &subCoeff) +{ + const int nij = coeff._funcSpaceData.getNij(); + const int nk = coeff._funcSpaceData.getNk(); + const int Nij = 2 * nij - 1; + const int Nk = 2 * nk - 1; + const int dim = coeff._c; + + _sub.resize(Nij * Nij * Nk, dim, false); + for(int i = 0; i < nij; ++i) { + for(int j = 0; j < nij; ++j) { + for(int k = 0; k < nk; ++k) { + const int I1 = i + j * nij + k * nij * nij; + const int I2 = (2 * i) + (2 * j) * Nij + (2 * k) * Nij * Nij; + for(int k = 0; k < dim; ++k) { + _sub(I2, k) = coeff(I1, k); } } } } + for(int i = 0; i < Nij; i += 2) { + for(int j = 0; j < Nij; j += 2) { + _subdivide(_sub, nk, i + j * Nij, Nij * Nij); + } + } + for(int i = 0; i < Nij; i += 2) { + for(int k = 0; k < Nk; ++k) { + _subdivide(_sub, nij, i + k * Nij * Nij, Nij); + } + } + for(int j = 0; j < Nij; ++j) { + for(int k = 0; k < Nk; ++k) { + _subdivide(_sub, nij, j * Nij + k * Nij * Nij); + } + } + _copyPyr(_sub, nij, nk, 0, 0, 0, *subCoeff[0]); + _copyPyr(_sub, nij, nk, nij - 1, 0, 0, *subCoeff[1]); + _copyPyr(_sub, nij, nk, 0, nij - 1, 0, *subCoeff[2]); + _copyPyr(_sub, nij, nk, nij - 1, nij - 1, 0, *subCoeff[3]); + _copyPyr(_sub, nij, nk, 0, 0, nk - 1, *subCoeff[4]); + _copyPyr(_sub, nij, nk, nij - 1, 0, nk - 1, *subCoeff[5]); + _copyPyr(_sub, nij, nk, 0, nij - 1, nk - 1, *subCoeff[6]); + _copyPyr(_sub, nij, nk, nij - 1, nij - 1, nk - 1, *subCoeff[7]); + return; +} + +void bezierCoeff::_copy(const bezierCoeff &from, int start, int num, + bezierCoeff &to) +{ + const int dim = from._c; + for(int i = start; i < start + num; ++i) { + for(int j = 0; j < dim; ++j) { + to(i, j) = from(i, j); + } + } +} + +void bezierCoeff::_copyLine(const fullMatrix<double> &allSub, int n, int start, + bezierCoeff &sub) +{ + const int dim = allSub.size2(); + for(int i = 0; i < n; ++i) { + for(int K = 0; K < dim; ++K) { + sub(i, K) = allSub(start + i, K); + } + } +} + +void bezierCoeff::_copyQuad(const fullMatrix<double> &allSub, int n, int starti, + int startj, bezierCoeff &sub) +{ + const int dim = allSub.size2(); + const int N = 2 * n - 1; + for(int i = 0; i < n; ++i) { + for(int j = 0; j < n; ++j) { + const int I1 = i + j * n; + const int I2 = (starti + i) + (startj + j) * N; + for(int K = 0; K < dim; ++K) { + sub(I1, K) = allSub(I2, K); + } + } + } +} + +void bezierCoeff::_copyHex(const fullMatrix<double> &allSub, int n, int starti, + int startj, int startk, bezierCoeff &sub) +{ + const int dim = allSub.size2(); + const int N = 2 * n - 1; + for(int i = 0; i < n; ++i) { + for(int j = 0; j < n; ++j) { + for(int k = 0; k < n; ++k) { + const int I1 = i + j * n + k * n * n; + const int I2 = (starti + i) + (startj + j) * N + (startk + k) * N * N; + for(int K = 0; K < dim; ++K) { + sub(I1, K) = allSub(I2, K); + } + } + } + } +} + +void bezierCoeff::_copyPyr(const fullMatrix<double> &allSub, int nij, int nk, + int starti, int startj, int startk, bezierCoeff &sub) +{ + const int dim = allSub.size2(); + const int Nij = 2 * nij - 1; + for(int i = 0; i < nij; ++i) { + for(int j = 0; j < nij; ++j) { + for(int k = 0; k < nk; ++k) { + const int I1 = i + j * nij + k * nij * nij; + const int I2 = + (starti + i) + (startj + j) * Nij + (startk + k) * Nij * Nij; + for(int K = 0; K < dim; ++K) { + sub(I1, K) = allSub(I2, K); + } + } + } + } +} + +bezierCoeffMemoryPool::bezierCoeffMemoryPool() +{ + _sizeBlocks = 0; + _numUsedBlocks = 0; + _currentIndexOfSearch = 0; + _endOfSearch = 0; +} + +void bezierCoeffMemoryPool::setSizeBlocks(std::size_t size) +{ + if(_numUsedBlocks) { + Msg::Error("Cannot change size of blocks if %d blocks are still being " + "used!", + _numUsedBlocks); + return; + } + _currentIndexOfSearch = 0; + _sizeBlocks = size; + _endOfSearch = 0; +} + +double *bezierCoeffMemoryPool::giveBlock(bezierCoeff *bez) +{ + _checkEnoughMemory(); + + if(_numUsedBlocks == _endOfSearch) { + std::size_t idx = _endOfSearch; + if(_bezierCoeff.size() == idx) + _bezierCoeff.push_back(bez); + else if(_bezierCoeff[idx]) { + Msg::Error("this block is being used!?"); + return NULL; + } + else + _bezierCoeff[idx] = bez; + ++_numUsedBlocks; + ++_endOfSearch; + return &_memory.front() + _sizeBlocks * idx; + } + + for(std::size_t i = 0; i < _endOfSearch; ++i) { + std::size_t idx = _currentIndexOfSearch; + ++_currentIndexOfSearch; + if(_currentIndexOfSearch == _endOfSearch) _currentIndexOfSearch = 0; + if(!_bezierCoeff[idx]) { + _bezierCoeff[idx] = bez; + ++_numUsedBlocks; + return &_memory.front() + _sizeBlocks * idx; + } + } + + // We must never be here. If yes, this means that + // _numUsedBlocks < _endOfSearch + // and _bezierCoeff[i] for i < _endOfSearch are all different from + // NULL which should never happens. + Msg::Error("Wrong state of bezierCoeffMemoryPool." + "_bezierCoeff[i] not correct?"); + return NULL; +} + +void bezierCoeffMemoryPool::releaseBlock(double *block, bezierCoeff *bez) +{ + long diff = block - &_memory.front(); + std::size_t idx = diff / _sizeBlocks; + // if (_bezierCoeff[idx] == bez) + // Msg::Info("It's a good guess!"); + // else + // Msg::Info("Did not work :'( "); + _bezierCoeff[idx] = NULL; + if(idx == _endOfSearch - 1) { + do { + --_endOfSearch; + } while(_endOfSearch && !_bezierCoeff[_endOfSearch - 1]); + _bezierCoeff.resize(_endOfSearch); + if(_currentIndexOfSearch >= _endOfSearch) _currentIndexOfSearch = 0; + } + --_numUsedBlocks; +} + +void bezierCoeffMemoryPool::freeMemory() +{ + if(_numUsedBlocks) { + Msg::Error("I cannot free memory if some is still in use!"); + return; + } + // force deallocation: + std::vector<double> dummy; + _memory.swap(dummy); +} + +void bezierCoeffMemoryPool::_checkEnoughMemory() +{ + if(_numUsedBlocks < _memory.size() / _sizeBlocks) return; + + double *pointer = &_memory.front(); + _memory.resize(_memory.size() + _sizeBlocks); + + if(pointer == &_memory.front()) return; + + // If a reallocation has been performed at a different place of the memory, + // then we need to update pointers + + long diff = &_memory.front() - pointer; + for(std::size_t i = 0; i < _bezierCoeff.size(); ++i) { + if(_bezierCoeff[i]) _bezierCoeff[i]->updateDataPtr(diff); + } } diff --git a/Numeric/bezierBasis.h b/Numeric/bezierBasis.h index fe48321c51115c3ebd2bfd9eef841e2c021afb73..1c6527a4b33a31e9229aaa06159fcf948b3bf9cd 100644 --- a/Numeric/bezierBasis.h +++ b/Numeric/bezierBasis.h @@ -6,80 +6,48 @@ #ifndef BEZIER_BASIS_H #define BEZIER_BASIS_H +#include <set> +#include <map> #include <vector> #include "fullMatrix.h" #include "FuncSpaceData.h" +#include "BasisFactory.h" class MElement; class bezierBasisRaiser; +class bezierCoeff; class bezierBasis { private: - // the 'numLagCoeff' first exponents are related to 'real' values + // Number of corner coeff which are 'real' values of the expanded function int _numLagCoeff; - int _numDivisions, _dimSimplex; - const FuncSpaceData _data; + int _dimSimplex; + const FuncSpaceData _funcSpaceData; bezierBasisRaiser *_raiser; + fullMatrix<double> _exponents; + fullMatrix<double> matrixLag2Bez; + fullVector<double> ordered1dBezPoints; friend class bezierBasisRaiser; - fullMatrix<double> _exponents; + friend class bezierCoeff; public: - fullMatrix<double> matrixLag2Bez; - fullMatrix<double> matrixBez2Lag; - fullMatrix<double> subDivisor; - // Constructors bezierBasis(FuncSpaceData data); ~bezierBasis(); // get methods inline int getDim() const { return _exponents.size2(); } - inline int getType() const { return _data.elementType(); } - inline int getOrder() const { return _data.spaceOrder(); } + inline int getType() const { return _funcSpaceData.getType(); } + inline int getOrder() const { return _funcSpaceData.getSpaceOrder(); } inline int getDimSimplex() const { return _dimSimplex; } inline int getNumLagCoeff() const { return _numLagCoeff; } - inline int getNumDivision() const { return _numDivisions; } - inline int getNumSubNodes() const { return subDivisor.size1(); } - inline FuncSpaceData getFuncSpaceData() const { return _data; } - bezierBasisRaiser *getRaiser() const; - - // Evaluate Bezier functions at the point (u, v, w) - void f(double u, double v, double w, double *sf) const; - - // generate Bezier points - void generateBezierPoints(fullMatrix<double> &) const; - - // transform coeff Lagrange into Bezier coeff - void lag2Bez(const fullMatrix<double> &lag, fullMatrix<double> &bez) const; - - // Subdivide Bezier coefficients - void subdivideBezCoeff(const fullMatrix<double> &coeff, - fullMatrix<double> &subCoeff) const; - void subdivideBezCoeff(const fullVector<double> &coeff, - fullVector<double> &subCoeff) const; - - // Interpolation of n functions on N points : - // coeffs(numCoeff, n) and uvw(N, dim) - // => result(N, n) - void interpolate(const fullMatrix<double> &coeffs, - const fullMatrix<double> &uvw, fullMatrix<double> &result, - bool bezCoord = false) const; - void interpolate(const fullVector<double> &coeffs, - const fullMatrix<double> &uvw, fullVector<double> &result, - bool bezCoord = false) const - { - int size = uvw.size1(); - result.resize(size); - fullMatrix<double> c(const_cast<double *>(coeffs.getDataPtr()), size, 1); - fullMatrix<double> r(const_cast<double *>(result.getDataPtr()), size, 1); - interpolate(c, uvw, r, bezCoord); - } + inline FuncSpaceData getFuncSpaceData() const { return _funcSpaceData; } + const bezierBasisRaiser *getRaiser() const; private: void _construct(); void _constructPyr(); - void _fePoints2BezPoints(fullMatrix<double> &) const; }; class bezierBasisRaiser { @@ -110,22 +78,163 @@ public: void computeCoeff(const fullVector<double> &coeffA, const fullVector<double> &coeffB, - fullVector<double> &coeffSquare); - void computeCoeff(const fullMatrix<double> &coeffA, - const fullMatrix<double> &coeffB, - fullMatrix<double> &coeffSquare); + fullVector<double> &coeffSquare) const; void computeCoeff(const fullVector<double> &coeffA, const fullVector<double> &coeffB, const fullVector<double> &coeffC, - fullVector<double> &coeffCubic); - void computeCoeff(const fullVector<double> &coeffA, - const fullMatrix<double> &coeffB, - const fullMatrix<double> &coeffC, - fullMatrix<double> &coeffCubic); + fullVector<double> &coeffCubic) const; private: void _fillRaiserData(); void _fillRaiserDataPyr(); }; +class bezierCoeffMemoryPool { + // This class is to avoid multiple allocation / deallocation during + // the subdivision algorithm. +private: + std::vector<double> _memory; + std::size_t _sizeBlocks; + std::size_t _numUsedBlocks; + std::size_t _currentIndexOfSearch; + std::size_t _endOfSearch; + // if a reallocation is performed, the pointers must be updated, we need to + // know which bezierCoeff have to be updated: + std::vector<bezierCoeff *> _bezierCoeff; + +public: + bezierCoeffMemoryPool(); + ~bezierCoeffMemoryPool() {} + + // before to be used, the size of the blocks has to be specified + void setSizeBlocks(std::size_t size); + + double *giveBlock(bezierCoeff *bez); // gives a block of size _sizeBlocks[num] + void releaseBlock(double *block, bezierCoeff *bez); + void freeMemory(); + +private: + void _checkEnoughMemory(); +}; + +class bezierCoeff { +private: + int _numPool; + FuncSpaceData _funcSpaceData; + const bezierBasis *_basis; + int _r, _c; // size of the matrix + double *_data; // pointer on the first element + bool _own_data; // to know if data should be freed when object is deleted + + static bezierCoeffMemoryPool *_pool0; + static bezierCoeffMemoryPool *_pool1; + static fullMatrix<double> _sub; + // FIXME: not thread safe. We shoud use one pool and one _sub per thread. + // The best would be to give the pool to the constructor. + // (the pools should be created and deleted e.g. by the plugin + // AnalyseCurvedMesh) + +public: + bezierCoeff(){}; + bezierCoeff(const bezierCoeff &other, bool swap = false); + // numOfPool is the number of the pool (0 or 1) that should be used. To use + // this functionality, first call usePools(..) function. + bezierCoeff(FuncSpaceData data, const fullVector<double> &lagCoeff, + int numOfPool = -1); + bezierCoeff(FuncSpaceData data, const fullMatrix<double> &lagCoeff, + int numOfPool = -1); + ~bezierCoeff(); + + static void usePools(std::size_t size0, std::size_t size1); + static void releasePools(); + void updateDataPtr(long diff); + + inline int getPolynomialOrder() const + { + return _funcSpaceData.getSpaceOrder(); + } + inline int getNumCoeff() const { return _r; } + inline int getNumColumns() const { return _c; } + inline int getNumCornerCoeff() const { return _basis->getNumLagCoeff(); } + int getIdxCornerCoeff(int i) const; + inline double getCornerCoeff(int k) const + { + return _data[getIdxCornerCoeff(k)]; + } + inline double getCornerCoeff(int k, int j) const + { + return _data[getIdxCornerCoeff(k) + _r * j]; + } + void getCornerCoeffs(fullVector<double> &) const; + void getCornerCoeffs(fullMatrix<double> &) const; + inline double *getDataPtr() { return _data; } + inline const bezierBasis *getBezierBasis() const { return _basis; } + + inline void setMatrixAsProxy(fullMatrix<double> &m) const + { + m.setAsProxy(_data, _r, _c); + } + inline void setVectorAsProxy(fullVector<double> &v) const + { + v.setAsProxy(_data, _r); + } + + void subdivide(std::vector<bezierCoeff *> &subCoeff) const; + + inline double operator()(int i) const { return _data[i]; } + inline double operator()(int i, int j) const { return _data[i + _r * j]; } + + inline double &operator()(int i) { return _data[i]; } + inline double &operator()(int i, int j) { return _data[i + _r * j]; } + +private: + enum _SubdivisionTet { + subdivU, + subdivV, + subdivW, + node0CrossEdge12, + node3CrossEdge12, + node1CrossEdge03, + node2CrossEdge03 + }; + static void _subdivideTet(_SubdivisionTet which, int n, bezierCoeff &coeff); + + static void _subdivide(fullMatrix<double> &coeff, int npts, int start); + static void _subdivide(fullMatrix<double> &coeff, int npts, int start, + int inc); + static void _subdivideTriangle(const bezierCoeff &coeff, int start, + std::vector<bezierCoeff *> &subCoeff); + static void _subdivideTetrahedron(const bezierCoeff &coeff, + std::vector<bezierCoeff *> &vSubCoeff); + static void _subdivideQuadrangle(const bezierCoeff &coeff, + std::vector<bezierCoeff *> &subCoeff); + static void _subdivideHexahedron(const bezierCoeff &coeff, + std::vector<bezierCoeff *> &subCoeff); + static void _subdividePrism(const bezierCoeff &coeff, + std::vector<bezierCoeff *> &subCoeff); + static void _subdividePyramid(const bezierCoeff &coeff, + std::vector<bezierCoeff *> &subCoeff); + static void _copy(const bezierCoeff &from, int start, int num, + bezierCoeff &to); + static void _copyLine(const fullMatrix<double> &allSub, int n, int starti, + bezierCoeff &sub); + static void _copyQuad(const fullMatrix<double> &allSub, int n, int starti, + int startj, bezierCoeff &sub); + static void _copyHex(const fullMatrix<double> &allSub, int n, int starti, + int startj, int startk, bezierCoeff &sub); + static void _copyPyr(const fullMatrix<double> &allSub, int nij, int nk, + int starti, int startj, int startk, bezierCoeff &sub); + inline static int _ij2Index(int i, int j, int n) + { + return i + j * n - j * (j - 1) / 2; + } + inline static int _ijk2Index(int i, int j, int k, int n) + { + // the whole tet - the top tet + current triangle + return (n + 2) * (n + 1) * n / 6 - (n - k + 2) * (n - k + 1) * (n - k) / 6 + + j * (n - k) - j * (j - 1) / 2 + i; + } + void _computeCoefficients(const double *lagCoeffData); +}; + #endif diff --git a/Numeric/fullMatrix.cpp b/Numeric/fullMatrix.cpp index cd5ee06048795e0b5dc9d47f6c85c9055adb158b..38ab952007f24c6f328673ea30e52e1243cf84fc 100644 --- a/Numeric/fullMatrix.cpp +++ b/Numeric/fullMatrix.cpp @@ -593,7 +593,9 @@ template <> bool fullMatrix<double>::invert(fullMatrix<double> &result) const // inv = transpose of cofactor / Determinant for(int i = 0; i < _r; i++) { - for(int j = 0; j < _c; j++) { result(j, i) = cofactor(i, j) / det; } + for(int j = 0; j < _c; j++) { + result(j, i) = cofactor(i, j) / det; + } } return true; } @@ -643,3 +645,29 @@ void fullMatrix<int>::print(const std::string &name, } printf("};\n"); } + +template <> +void fullVector<double>::print(const std::string name, + const std::string format) const +{ + std::string rformat = (format == "") ? "%12.5E " : format; + printf("double %s[%d]=\n", name.c_str(), size()); + printf("{ "); + for(int I = 0; I < size(); I++) { + printf(rformat.c_str(), (*this)(I)); + } + printf("};\n"); +} + +template <> +void fullVector<int>::print(const std::string name, + const std::string format) const +{ + std::string rformat = (format == "") ? "%12d " : format; + printf("double %s[%d]=\n", name.c_str(), size()); + printf("{ "); + for(int I = 0; I < size(); I++) { + printf(rformat.c_str(), (*this)(I)); + } + printf("};\n"); +} diff --git a/Numeric/fullMatrix.h b/Numeric/fullMatrix.h index 6939828a053f9d3b75c9e91b9ff0466d6a6ca4e8..bda6449335f8e45173e08b46a335af0cdeb371fc 100644 --- a/Numeric/fullMatrix.h +++ b/Numeric/fullMatrix.h @@ -245,6 +245,22 @@ public: _data = original._data + c * _r; } + /** + @param scalar A pointer to an array of scalar; + @param r The number of rows. + + This fullVector becomes a proxy of the array. + + Previous data are lost. + */ + void setAsProxy(scalar *data, int r) + { + if(_own_data && _data) delete[] _data; + _own_data = false; + _r = r; + _data = data; + } + /** @param s A scalar. @@ -351,13 +367,7 @@ public: This string starts by name. */ - void print(const char *name = "") const - { - printf("double %s[%d]=\n", name, size()); - printf("{ "); - for(int I = 0; I < size(); I++) { printf("%12.5E ", (*this)(I)); } - printf("};\n"); - } + void print(const std::string name = "", const std::string format = "") const; /** @param f A pointer to a FILE stream. diff --git a/Numeric/nodalBasis.cpp b/Numeric/nodalBasis.cpp index 73fd92c64f166dbca1f07f9237e7eebb31e8e4e1..837aefeb6e0dadd3004b6bc14b67d9afe1d0a991 100644 --- a/Numeric/nodalBasis.cpp +++ b/Numeric/nodalBasis.cpp @@ -863,24 +863,6 @@ nodalBasis::nodalBasis(int tag) } } -void nodalBasis::getReferenceNodesForBezier(fullMatrix<double> &nodes) const -{ - if(parentType != TYPE_PYR && !serendip) { - nodes = points; - } - else { - const bool serendipSpace = false; - if(parentType != TYPE_PYR) { - FuncSpaceData data(true, type, order, &serendipSpace); - gmshGeneratePoints(data, nodes); - } - else { - FuncSpaceData data(true, type, false, order, order, &serendipSpace); - gmshGeneratePoints(data, nodes); - } - } -} - bool nodalBasis::forwardTransformation(const fullMatrix<double> &nodes, fullMatrix<double> &projection, int elementType) const diff --git a/Numeric/nodalBasis.h b/Numeric/nodalBasis.h index 4dea05ef88e2fbfdce6fa75000e311751711b962..8d8b695fd67b7bef77de306aa47126b275942330 100644 --- a/Numeric/nodalBasis.h +++ b/Numeric/nodalBasis.h @@ -33,15 +33,13 @@ public: bool forwardRenumbering(const fullMatrix<double> &otherPoints, int *renum, int elemenType = -1) const; - void getReferenceNodesForBezier(fullMatrix<double> &nodes) const; - // Basis functions & gradients evaluation virtual void f(double u, double v, double w, double *sf) const = 0; - virtual void f(const fullMatrix<double> &coord, - fullMatrix<double> &sf) const = 0; + virtual void f(const fullMatrix<double> &coord, fullMatrix<double> &sf) const = 0; + virtual void f(double u, double v, double w, int i, double *sf) const = 0; virtual void df(double u, double v, double w, double grads[][3]) const = 0; - virtual void df(const fullMatrix<double> &coord, - fullMatrix<double> &dfm) const = 0; + virtual void df(const fullMatrix<double> &coord, fullMatrix<double> &dfm) const = 0; + virtual void df(double u, double v, double w, int i, double grad[3]) const = 0; virtual void ddf(double u, double v, double w, double grads[][3][3]) const { Msg::Error("ddf not implemented for this basis"); diff --git a/Numeric/orthogonalBasis.cpp b/Numeric/orthogonalBasis.cpp index 862b75efb94b752d8abcb3013e2ceb0d060c74eb..3d090d577ed069792f8a84b6d0e2a141d391b655 100644 --- a/Numeric/orthogonalBasis.cpp +++ b/Numeric/orthogonalBasis.cpp @@ -13,7 +13,7 @@ #include "Numeric.h" orthogonalBasis::orthogonalBasis(const FuncSpaceData &_data) - : _type(_data.elementType()), _order(_data.spaceOrder()) + : _type(_data.getType()), _order(_data.getSpaceOrder()) { } diff --git a/Numeric/pointsGenerators.cpp b/Numeric/pointsGenerators.cpp index 936d628ef24102ed7ea27641453eb031e0a73704..4dcb20efeaac04a0b41654b4526d48e175fba752 100644 --- a/Numeric/pointsGenerators.cpp +++ b/Numeric/pointsGenerators.cpp @@ -11,42 +11,30 @@ #include "MHexahedron.h" #include "MPrism.h" #include "MPyramid.h" +#include "FuncSpaceData.h" // Points Generators void gmshGeneratePoints(FuncSpaceData data, fullMatrix<double> &points) { - switch(data.elementType()) { + const int order = data.getSpaceOrder(); + const bool serendip = data.getSerendipity(); + switch(data.getType()) { case TYPE_PNT: points = gmshGeneratePointsLine(0); return; - case TYPE_LIN: points = gmshGeneratePointsLine(data.spaceOrder()); return; - case TYPE_TRI: - points = - gmshGeneratePointsTriangle(data.spaceOrder(), data.spaceIsSerendipity()); - return; - case TYPE_QUA: - points = gmshGeneratePointsQuadrangle(data.spaceOrder(), - data.spaceIsSerendipity()); - return; + case TYPE_LIN: points = gmshGeneratePointsLine(order); return; + case TYPE_TRI: points = gmshGeneratePointsTriangle(order, serendip); return; + case TYPE_QUA: points = gmshGeneratePointsQuadrangle(order, serendip); return; case TYPE_TET: - points = gmshGeneratePointsTetrahedron(data.spaceOrder(), - data.spaceIsSerendipity()); - return; - case TYPE_PRI: - points = - gmshGeneratePointsPrism(data.spaceOrder(), data.spaceIsSerendipity()); - return; - case TYPE_HEX: - points = gmshGeneratePointsHexahedron(data.spaceOrder(), - data.spaceIsSerendipity()); + points = gmshGeneratePointsTetrahedron(order, serendip); return; + case TYPE_PRI: points = gmshGeneratePointsPrism(order, serendip); return; + case TYPE_HEX: points = gmshGeneratePointsHexahedron(order, serendip); return; case TYPE_PYR: - points = - gmshGeneratePointsPyramidGeneral(data.isPyramidalSpace(), data.nij(), - data.nk(), data.spaceIsSerendipity()); + points = gmshGeneratePointsPyramidGeneral( + data.getPyramidalSpace(), data.getNij(), data.getNk(), serendip); return; default: - Msg::Error("Unknown element type %d (tag %d) for points generation", - data.elementType(), data.elementTag()); + Msg::Error("Unknown element type %d for points generation", data.getType()); return; } } @@ -123,15 +111,24 @@ fullMatrix<double> gmshGeneratePointsPyramid(int order, bool serendip) fullMatrix<double> gmshGeneratePointsPyramidGeneral(bool pyr, int nij, int nk, bool forSerendipPoints) { + // if pyr: + // div = nk + nij + // monomial(i, j, k) -> (-(1-k')+2*i/div, -(1-k')+2*j/div, (nk-k)/div) + // else: + // div = max(nij, nk) + // monomial(i, j, k) -> (-1+2*i/nij)*(1-k'), (-1+2*j/nij)*(1-k'), + // (nk-k)/div) fullMatrix<double> points = gmshGenerateMonomialsPyramidGeneral(pyr, nij, nk, forSerendipPoints); if(points.size1() == 1) return points; const int div = pyr ? nk + nij : std::max(nij, nk); + double scale = 2. / div; for(int i = 0; i < points.size1(); ++i) { points(i, 2) = (nk - points(i, 2)) / div; - const double scale = 1. - points(i, 2); - points(i, 0) = scale * (-1 + points(i, 0) * 2. / div); - points(i, 1) = scale * (-1 + points(i, 1) * 2. / div); + const double duv = 1. - points(i, 2); + if(!pyr) scale = 2. / nij * duv; + points(i, 0) = -duv + points(i, 0) * scale; + points(i, 1) = -duv + points(i, 1) * scale; } return points; } @@ -140,39 +137,33 @@ fullMatrix<double> gmshGeneratePointsPyramidGeneral(bool pyr, int nij, int nk, void gmshGenerateMonomials(FuncSpaceData data, fullMatrix<double> &monomials) { - switch(data.elementType()) { + const int order = data.getSpaceOrder(); + const bool serendip = data.getSerendipity(); + switch(data.getType()) { case TYPE_PNT: monomials = gmshGenerateMonomialsLine(0); return; - case TYPE_LIN: - monomials = gmshGenerateMonomialsLine(data.spaceOrder()); - return; + case TYPE_LIN: monomials = gmshGenerateMonomialsLine(order); return; case TYPE_TRI: - monomials = gmshGenerateMonomialsTriangle(data.spaceOrder(), - data.spaceIsSerendipity()); + monomials = gmshGenerateMonomialsTriangle(order, serendip); return; case TYPE_QUA: - monomials = gmshGenerateMonomialsQuadrangle(data.spaceOrder(), - data.spaceIsSerendipity()); + monomials = gmshGenerateMonomialsQuadrangle(order, serendip); return; case TYPE_TET: - monomials = gmshGenerateMonomialsTetrahedron(data.spaceOrder(), - data.spaceIsSerendipity()); + monomials = gmshGenerateMonomialsTetrahedron(order, serendip); return; case TYPE_PRI: - monomials = - gmshGenerateMonomialsPrism(data.spaceOrder(), data.spaceIsSerendipity()); + monomials = gmshGenerateMonomialsPrism(order, serendip); return; case TYPE_HEX: - monomials = gmshGenerateMonomialsHexahedron(data.spaceOrder(), - data.spaceIsSerendipity()); + monomials = gmshGenerateMonomialsHexahedron(order, serendip); return; case TYPE_PYR: - monomials = - gmshGenerateMonomialsPyramidGeneral(data.isPyramidalSpace(), data.nij(), - data.nk(), data.spaceIsSerendipity()); + monomials = gmshGenerateMonomialsPyramidGeneral( + data.getPyramidalSpace(), data.getNij(), data.getNk(), serendip); return; default: - Msg::Error("Unknown element type %d (tag %d) for monomials generation", - data.elementType(), data.elementTag()); + Msg::Error("Unknown element type %d for monomials generation", + data.getType()); return; } } @@ -853,6 +844,7 @@ fullMatrix<double> gmshGenerateMonomialsPyramid(int order, fullMatrix<double> gmshGenerateMonomialsPyramidSerendipity(int order) { + // WARNING: Is it correct? int nbMonomials = order ? 5 + (order - 1) * 8 : 1; fullMatrix<double> monomials(nbMonomials, 3); @@ -923,56 +915,7 @@ fullMatrix<double> gmshGenerateMonomialsPyramidSerendipity(int order) } } } - monomials.print("monomials"); return monomials; - - // // monomials of plus a bit more - // if(order > 1){ - // int idx = 5; - // for(int i = 2; i <= order; ++i, ++idx){ - // monomials(idx, 0) = 0; - // monomials(idx, 1) = 0; - // monomials(idx, 2) = i; - // } - // for(int i = 2; i <= order; ++i, ++idx){ - // monomials(idx, 0) = 1; - // monomials(idx, 1) = 0; - // monomials(idx, 2) = i; - // } - // for(int i = 2; i <= order; ++i, ++idx){ - // monomials(idx, 0) = 0; - // monomials(idx, 1) = 1; - // monomials(idx, 2) = i; - // } - // for(int i = 2; i <= order; ++i, ++idx){ - // monomials(idx, 0) = 1; - // monomials(idx, 1) = 1; - // monomials(idx, 2) = i; - // } - // for(int i = 2; i <= order; ++i, ++idx){ - // monomials(idx, 0) = i; - // monomials(idx, 1) = 0; - // monomials(idx, 2) = order; - // } - // for(int i = 2; i <= order; ++i, ++idx){ - // monomials(idx, 0) = i; - // monomials(idx, 1) = 1; - // monomials(idx, 2) = order; - // } - // for(int i = 2; i <= order; ++i, ++idx){ - // monomials(idx, 0) = 0; - // monomials(idx, 1) = i; - // monomials(idx, 2) = order; - // } - // for(int i = 2; i <= order; ++i, ++idx){ - // monomials(idx, 0) = 1; - // monomials(idx, 1) = i; - // monomials(idx, 2) = order; - // } - // } - // } - // monomials.print("monomials"); - // return monomials; } fullMatrix<double> gmshGenerateMonomialsPyramidGeneral(bool pyr, int nij, @@ -1088,10 +1031,8 @@ fullMatrix<double> gmshGenerateMonomialsPyramidGeneral(bool pyr, int nij, int i0 = 4 + iedge; int i1 = 4 + (iedge + 1) % 4; - int u0 = - static_cast<int>((monomials(i1, 0) - monomials(i0, 0)) / nijBase); - int u1 = - static_cast<int>((monomials(i1, 1) - monomials(i0, 1)) / nijBase); + int u0 = static_cast<int>((monomials(i1, 0) - monomials(i0, 0)) / nij); + int u1 = static_cast<int>((monomials(i1, 1) - monomials(i0, 1)) / nij); for(int i = 1; i < nij; ++i, ++index) { monomials(index, 0) = monomials(i0, 0) + i * u0; @@ -1124,3 +1065,224 @@ fullMatrix<double> gmshGenerateMonomialsPyramidGeneral(bool pyr, int nij, return monomials; } + +// Ordered points and monomials + +void gmshGenerateOrderedPointsLine(int order, fullVector<double> &points) +{ + points.resize(order + 1); + for(int i = 0; i < order + 1; ++i) { + points(i) = i / static_cast<double>(order); + } + return; +} + +void gmshGenerateOrderedPoints(FuncSpaceData data, fullMatrix<double> &points, + bool bezierSpace) +{ + gmshGenerateOrderedMonomials(data, points); + if(points.size1() == 1) return; + + const int type = data.getType(); + const int order = data.getSpaceOrder(); + const bool pyr = data.getPyramidalSpace(); + + if(bezierSpace) { + if(type != TYPE_PYR) { + points.scale(1. / order); + return; + } + else { + // This is used for creating the matrices bez2lag and lag2bez and we want + // the points of the "unshrinked" pyramid. In other words, we want them + // mapped from the pyramid to the cube. + // if pyr: + // div = nk + nij + // monomial(i, j, k) -> (i/div/(1-k'), j/div/(1-k'), (nk-k)/div) + // else: + // div = max(nij, nk) + // monomial(i, j, k) -> (i/nij, j/nij, (nk-k)/div) + const int nij = data.getNij(); + const int nk = data.getNk(); + const int div = pyr ? nij + nk : std::max(nij, nk); + double scale = 1. / nij; + for(int i = 0; i < points.size1(); ++i) { + points(i, 2) = (nk - points(i, 2)) / div; + if(pyr) scale = 1. / div / (1 - points(i, 2)); + points(i, 0) = points(i, 0) * scale; + points(i, 1) = points(i, 1) * scale; + } + } + return; + } + + switch(type) { + case TYPE_PNT: return; + case TYPE_LIN: + case TYPE_QUA: + case TYPE_HEX: + points.scale(2. / order); + points.add(-1.); + return; + case TYPE_TRI: + case TYPE_TET: points.scale(1. / order); return; + case TYPE_PRI: { + fullMatrix<double> tmp; + tmp.setAsProxy(points, 0, 2); + tmp.scale(1. / order); + tmp.setAsProxy(points, 2, 1); + tmp.scale(2. / order); + tmp.add(-1.); + return; + } + case TYPE_PYR: { + // This is used e.g. for creating sampling points. We want the points to be + // inside the reference pyramids. + // if pyr: + // div = nk + nij + // monomial(i, j, k) -> (-(1-k')+2*i/div, -(1-k')+2*j/div, (nk-k)/div) + // else: + // div = max(nij, nk) + // monomial(i, j, k) -> (-1+2*i/nij)*(1-k'), (-1+2*j/nij)*(1-k'), + // (nk-k)/div) + const int nij = data.getNij(); + const int nk = data.getNk(); + const int div = pyr ? nij + nk : std::max(nij, nk); + double scale = 2. / div; + for(int i = 0; i < points.size1(); ++i) { + points(i, 2) = (nk - points(i, 2)) / div; + const double duv = 1. - points(i, 2); + if(!pyr) scale = 2. / nij * duv; + points(i, 0) = -duv + points(i, 0) * scale; + points(i, 1) = -duv + points(i, 1) * scale; + } + return; + } + default: return; + } +} + +void gmshGenerateOrderedMonomials(FuncSpaceData data, + fullMatrix<double> &monomials) +{ + if(data.getSerendipity()) + Msg::Warning("Ordered monomials for serendipity elements not implemented"); + + int idx, order = data.getSpaceOrder(); + + switch(data.getType()) { + case TYPE_LIN: + monomials.resize(order + 1, 1); + idx = 0; + for(int i = 0; i < order + 1; ++i) { + monomials(idx, 0) = i; + ++idx; + } + return; + case TYPE_TRI: + monomials.resize((order + 1) * (order + 2) / 2, 2); + idx = 0; + for(int j = 0; j < order + 1; ++j) { + for(int i = 0; i < order + 1 - j; ++i) { + monomials(idx, 0) = i; + monomials(idx, 1) = j; + ++idx; + } + } + return; + case TYPE_QUA: + monomials.resize((order + 1) * (order + 1), 2); + idx = 0; + for(int j = 0; j < order + 1; ++j) { + for(int i = 0; i < order + 1; ++i) { + monomials(idx, 0) = i; + monomials(idx, 1) = j; + ++idx; + } + } + return; + case TYPE_TET: + monomials.resize((order + 1) * (order + 2) * (order + 3) / 6, 3); + idx = 0; + for(int k = 0; k < order + 1; ++k) { + for(int j = 0; j < order + 1 - k; ++j) { + for(int i = 0; i < order + 1 - j - k; ++i) { + monomials(idx, 0) = i; + monomials(idx, 1) = j; + monomials(idx, 2) = k; + ++idx; + } + } + } + return; + case TYPE_PRI: + monomials.resize((order + 1) * (order + 1) * (order + 2) / 2, 3); + idx = 0; + for(int k = 0; k < order + 1; ++k) { + for(int j = 0; j < order + 1; ++j) { + for(int i = 0; i < order + 1 - j; ++i) { + monomials(idx, 0) = i; + monomials(idx, 1) = j; + monomials(idx, 2) = k; + ++idx; + } + } + } + return; + case TYPE_HEX: + monomials.resize((order + 1) * (order + 1) * (order + 1), 3); + idx = 0; + for(int k = 0; k < order + 1; ++k) { + for(int j = 0; j < order + 1; ++j) { + for(int i = 0; i < order + 1; ++i) { + monomials(idx, 0) = i; + monomials(idx, 1) = j; + monomials(idx, 2) = k; + ++idx; + } + } + } + return; + case TYPE_PYR: { + const int nij = data.getNij(); + const int nk = data.getNk(); + if(data.getPyramidalSpace()) { + int n = nk + nij; + int numMonomials = (n + 1) * (n + 2) * (2 * n + 3) / 6; + numMonomials -= nij * (nij + 1) * (2 * nij + 1) / 6; + monomials.resize(numMonomials, 3); + idx = 0; + for(int k = nk; k >= 0; --k) { + for(int j = 0; j < k + nij + 1; ++j) { + for(int i = 0; i < k + nij + 1; ++i) { + monomials(idx, 0) = i; + monomials(idx, 1) = j; + monomials(idx, 2) = k; + ++idx; + } + } + } + } + else { + monomials.resize((nij + 1) * (nij + 1) * (nk + 1), 3); + idx = 0; + for(int k = nk; k >= 0; --k) { + for(int j = 0; j < nij + 1; ++j) { + for(int i = 0; i < nij + 1; ++i) { + monomials(idx, 0) = i; + monomials(idx, 1) = j; + monomials(idx, 2) = k; + ++idx; + } + } + } + } + return; + } + default: + Msg::Error("Unknown element type for ordered monomials: %d", + data.getType()); + monomials.resize(1, 1); + return; + } +} diff --git a/Numeric/pointsGenerators.h b/Numeric/pointsGenerators.h index a6c9b385fba7d4bcbdc05179a565f94f91cb558a..8f6f90b82f4b54d93642b11f9f8ef9a515ba5881 100644 --- a/Numeric/pointsGenerators.h +++ b/Numeric/pointsGenerators.h @@ -7,7 +7,8 @@ #define POINTSGENERATORS_H #include "fullMatrix.h" -#include "FuncSpaceData.h" + +class FuncSpaceData; // Functions to generate point distributions on the references elements, for all // orders and functions generating exponents of Pascal monomials in the same @@ -69,4 +70,13 @@ fullMatrix<double> gmshGenerateMonomialsPyramidGeneral(bool pyr, int nij, int nk, bool forSerendipPoints = false); +// Ordered points and monomials + +void gmshGenerateOrderedPointsLine(int order, fullVector<double> &); + +void gmshGenerateOrderedPoints(FuncSpaceData data, fullMatrix<double> &points, + bool bezierSpace = false); + +void gmshGenerateOrderedMonomials(FuncSpaceData, fullMatrix<double> &); + #endif diff --git a/Numeric/polynomialBasis.cpp b/Numeric/polynomialBasis.cpp index eec5010559fb3c9a6bb3ccd7c96260847b79a957..826a0087d2de03715e675cfc2cff42b72a2424e5 100644 --- a/Numeric/polynomialBasis.cpp +++ b/Numeric/polynomialBasis.cpp @@ -149,6 +149,21 @@ void polynomialBasis::f(const fullMatrix<double> &coord, } } +void polynomialBasis::f(double u, double v, double w, int i, double *sf) const +{ + if(i < 0 || i >= coefficients.size1()){ + Msg::Error("Node out of range for polynomial basis"); + return; + } + + double p[1256]; + evaluateMonomials(u, v, w, p); + *sf = 0.0; + for(int j = 0; j < coefficients.size2(); j++) { + *sf += coefficients(i, j) * p[j]; + } +} + void polynomialBasis::df(const fullMatrix<double> &coord, fullMatrix<double> &dfm) const { @@ -222,6 +237,61 @@ void polynomialBasis::df(double u, double v, double w, double grads[][3]) const } } +void polynomialBasis::df(double u, double v, double w, int i, double grad[3]) const +{ + if(i < 0 || i >= coefficients.size1()){ + Msg::Error("Node out of range for polynomial basis gradient"); + return; + } + + switch(monomials.size2()) { + case 1: + grad[0] = 0; + grad[1] = 0; + grad[2] = 0; + for(int j = 0; j < coefficients.size2(); j++) { + if(monomials(j, 0) > 0) + grad[0] += coefficients(i, j) * + pow_int(u, (monomials(j, 0) - 1)) * monomials(j, 0); + } + break; + case 2: + grad[0] = 0; + grad[1] = 0; + grad[2] = 0; + for(int j = 0; j < coefficients.size2(); j++) { + if(monomials(j, 0) > 0) + grad[0] += coefficients(i, j) * + pow_int(u, (monomials(j, 0) - 1)) * monomials(j, 0) * + pow_int(v, monomials(j, 1)); + if(monomials(j, 1) > 0) + grad[1] += coefficients(i, j) * pow_int(u, monomials(j, 0)) * + pow_int(v, (monomials(j, 1) - 1)) * monomials(j, 1); + } + break; + case 3: + grad[0] = 0; + grad[1] = 0; + grad[2] = 0; + for(int j = 0; j < coefficients.size2(); j++) { + if(monomials(j, 0) > 0) + grad[0] += coefficients(i, j) * + pow_int(u, (monomials(j, 0) - 1)) * monomials(j, 0) * + pow_int(v, monomials(j, 1)) * + pow_int(w, monomials(j, 2)); + if(monomials(j, 1) > 0) + grad[1] += coefficients(i, j) * pow_int(u, monomials(j, 0)) * + pow_int(v, (monomials(j, 1) - 1)) * monomials(j, 1) * + pow_int(w, monomials(j, 2)); + if(monomials(j, 2) > 0) + grad[2] += coefficients(i, j) * pow_int(u, monomials(j, 0)) * + pow_int(v, monomials(j, 1)) * + pow_int(w, (monomials(j, 2) - 1)) * monomials(j, 2); + } + break; + } +} + void polynomialBasis::ddf(double u, double v, double w, double hess[][3][3]) const { diff --git a/Numeric/polynomialBasis.h b/Numeric/polynomialBasis.h index 2081dc6ff5878e15c69170c6eaea4214a868ad85..0e60fc0fa021c5996d4cbfce3dcf852a9c8dc2f3 100644 --- a/Numeric/polynomialBasis.h +++ b/Numeric/polynomialBasis.h @@ -31,12 +31,12 @@ public: virtual void f(double u, double v, double w, double *sf) const; virtual void f(const fullMatrix<double> &coord, fullMatrix<double> &sf) const; - virtual void df(const fullMatrix<double> &coord, - fullMatrix<double> &dfm) const; + virtual void f(double u, double v, double w, int i, double *sf) const; + virtual void df(const fullMatrix<double> &coord, fullMatrix<double> &dfm) const; virtual void df(double u, double v, double w, double grads[][3]) const; + virtual void df(double u, double v, double w, int i, double grad[3]) const; virtual void ddf(double u, double v, double w, double hess[][3][3]) const; - virtual void dddf(double u, double v, double w, - double third[][3][3][3]) const; + virtual void dddf(double u, double v, double w, double third[][3][3][3]) const; void evaluateMonomials(double u, double v, double w, double p[]) const; }; diff --git a/Numeric/pyramidalBasis.cpp b/Numeric/pyramidalBasis.cpp index 3b09d4703ec463c8266fdde050360c4620f328fb..94bdd33c7e4277d9a188db9cb25517c75830adc8 100644 --- a/Numeric/pyramidalBasis.cpp +++ b/Numeric/pyramidalBasis.cpp @@ -104,6 +104,27 @@ void pyramidalBasis::f(const fullMatrix<double> &coord, delete[] fval; } +void pyramidalBasis::f(double u, double v, double w, int i, double *val) const +{ + if(!bergot) return; + + if(i < 0 || i >= bergotCoefficients.size1()){ + Msg::Error("Node out of range for pyramidal basis"); + return; + } + + const int N = bergot->size(); + + double *fval = new double[N]; + bergot->f(u, v, w, fval); + + *val = 0.; + for(int j = 0; j < N; j++) + *val += bergotCoefficients(i, j) * fval[j]; + + delete[] fval; +} + void pyramidalBasis::df(double u, double v, double w, double grads[][3]) const { if(!bergot) return; @@ -148,3 +169,29 @@ void pyramidalBasis::df(const fullMatrix<double> &coord, delete[] dfv; } + +void pyramidalBasis::df(double u, double v, double w, int i, double grad[3]) const +{ + if(!bergot) return; + + if(i < 0 || i >= bergotCoefficients.size1()){ + Msg::Error("Node out of range for pyramidal basis gradient"); + return; + } + + const int N = bergot->size(); + + double(*dfval)[3] = new double[N][3]; + bergot->df(u, v, w, dfval); + + grad[0] = 0.; + grad[1] = 0.; + grad[2] = 0.; + for(int j = 0; j < N; j++) { + grad[0] += bergotCoefficients(i, j) * dfval[j][0]; + grad[1] += bergotCoefficients(i, j) * dfval[j][1]; + grad[2] += bergotCoefficients(i, j) * dfval[j][2]; + } + + delete[] dfval; +} diff --git a/Numeric/pyramidalBasis.h b/Numeric/pyramidalBasis.h index 20ec0a22e43ad964f8521492927cb28cc7a31522..6de4d8d1b7689221ad2704b24ed1f83f9240ced8 100644 --- a/Numeric/pyramidalBasis.h +++ b/Numeric/pyramidalBasis.h @@ -25,9 +25,10 @@ public: ~pyramidalBasis(); virtual void f(double u, double v, double w, double *val) const; virtual void f(const fullMatrix<double> &coord, fullMatrix<double> &sf) const; + virtual void f(double u, double v, double w, int i, double *val) const; virtual void df(double u, double v, double w, double grads[][3]) const; - virtual void df(const fullMatrix<double> &coord, - fullMatrix<double> &dfm) const; + virtual void df(const fullMatrix<double> &coord, fullMatrix<double> &dfm) const; + virtual void df(double u, double v, double w, int i, double grad[3]) const; virtual int getNumShapeFunctions() const; }; diff --git a/Parser/Gmsh.l b/Parser/Gmsh.l index c9a5b6e3f85bbc12a1f5268da2ade1edb51ab6c4..a079d8e40bb7027bdee55625199e681a9351a642 100644 --- a/Parser/Gmsh.l +++ b/Parser/Gmsh.l @@ -148,6 +148,7 @@ Call return tCall; Catenary return tCatenary; CatmullRom return tSpline; Ceil return tCeil; +CenterOfMass return tCenterOfMass; Chamfer return tChamfer; Characteristic return tCharacteristic; Circle return tCircle; @@ -249,6 +250,7 @@ LowerCaseIn return tLowerCaseIn; MPI_Rank return tMPI_Rank; MPI_Size return tMPI_Size; Macro return tMacro; +Mass return tMass; Memory return tMemory; MeshAlgorithm return tMeshAlgorithm; Modulo return tModulo; diff --git a/Parser/Gmsh.tab.cpp b/Parser/Gmsh.tab.cpp index 1005cf4f474d04e5c0ab8347323f6ddbf7927f11..a5245ae12544ef400679b59462dde0d28f9e6410 100644 --- a/Parser/Gmsh.tab.cpp +++ b/Parser/Gmsh.tab.cpp @@ -347,166 +347,168 @@ extern int gmsh_yydebug; tCurrentDirectory = 324, tSyncModel = 325, tNewModel = 326, - tOnelabAction = 327, - tOnelabRun = 328, - tCodeName = 329, - tCpu = 330, - tMemory = 331, - tTotalMemory = 332, - tCreateTopology = 333, - tCreateGeometry = 334, - tRenumberMeshNodes = 335, - tRenumberMeshElements = 336, - tDistanceFunction = 337, - tDefineConstant = 338, - tUndefineConstant = 339, - tDefineNumber = 340, - tDefineStruct = 341, - tNameStruct = 342, - tDimNameSpace = 343, - tAppend = 344, - tDefineString = 345, - tSetNumber = 346, - tSetTag = 347, - tSetString = 348, - tPoint = 349, - tCircle = 350, - tEllipse = 351, - tCurve = 352, - tSphere = 353, - tPolarSphere = 354, - tSurface = 355, - tSpline = 356, - tVolume = 357, - tBox = 358, - tCylinder = 359, - tCone = 360, - tTorus = 361, - tEllipsoid = 362, - tQuadric = 363, - tShapeFromFile = 364, - tRectangle = 365, - tDisk = 366, - tWire = 367, - tGeoEntity = 368, - tCharacteristic = 369, - tLength = 370, - tParametric = 371, - tElliptic = 372, - tRefineMesh = 373, - tAdaptMesh = 374, - tRelocateMesh = 375, - tReorientMesh = 376, - tSetFactory = 377, - tThruSections = 378, - tWedge = 379, - tFillet = 380, - tChamfer = 381, - tPlane = 382, - tRuled = 383, - tTransfinite = 384, - tPhysical = 385, - tCompound = 386, - tPeriodic = 387, - tParent = 388, - tUsing = 389, - tPlugin = 390, - tDegenerated = 391, - tRecursive = 392, - tRotate = 393, - tTranslate = 394, - tSymmetry = 395, - tDilate = 396, - tExtrude = 397, - tLevelset = 398, - tAffine = 399, - tBooleanUnion = 400, - tBooleanIntersection = 401, - tBooleanDifference = 402, - tBooleanSection = 403, - tBooleanFragments = 404, - tThickSolid = 405, - tRecombine = 406, - tSmoother = 407, - tSplit = 408, - tDelete = 409, - tCoherence = 410, - tIntersect = 411, - tMeshAlgorithm = 412, - tReverseMesh = 413, - tLayers = 414, - tScaleLast = 415, - tHole = 416, - tAlias = 417, - tAliasWithOptions = 418, - tCopyOptions = 419, - tQuadTriAddVerts = 420, - tQuadTriNoNewVerts = 421, - tRecombLaterals = 422, - tTransfQuadTri = 423, - tText2D = 424, - tText3D = 425, - tInterpolationScheme = 426, - tTime = 427, - tCombine = 428, - tBSpline = 429, - tBezier = 430, - tNurbs = 431, - tNurbsOrder = 432, - tNurbsKnots = 433, - tColor = 434, - tColorTable = 435, - tFor = 436, - tIn = 437, - tEndFor = 438, - tIf = 439, - tElseIf = 440, - tElse = 441, - tEndIf = 442, - tExit = 443, - tAbort = 444, - tField = 445, - tReturn = 446, - tCall = 447, - tSlide = 448, - tMacro = 449, - tShow = 450, - tHide = 451, - tGetValue = 452, - tGetStringValue = 453, - tGetEnv = 454, - tGetString = 455, - tGetNumber = 456, - tUnique = 457, - tHomology = 458, - tCohomology = 459, - tBetti = 460, - tExists = 461, - tFileExists = 462, - tGetForced = 463, - tGetForcedStr = 464, - tGMSH_MAJOR_VERSION = 465, - tGMSH_MINOR_VERSION = 466, - tGMSH_PATCH_VERSION = 467, - tGmshExecutableName = 468, - tSetPartition = 469, - tNameToString = 470, - tStringToName = 471, - tAFFECTPLUS = 472, - tAFFECTMINUS = 473, - tAFFECTTIMES = 474, - tAFFECTDIVIDE = 475, - tOR = 476, - tAND = 477, - tEQUAL = 478, - tNOTEQUAL = 479, - tLESSOREQUAL = 480, - tGREATEROREQUAL = 481, - tLESSLESS = 482, - tGREATERGREATER = 483, - tPLUSPLUS = 484, - tMINUSMINUS = 485, - UNARYPREC = 486 + tMass = 327, + tCenterOfMass = 328, + tOnelabAction = 329, + tOnelabRun = 330, + tCodeName = 331, + tCpu = 332, + tMemory = 333, + tTotalMemory = 334, + tCreateTopology = 335, + tCreateGeometry = 336, + tRenumberMeshNodes = 337, + tRenumberMeshElements = 338, + tDistanceFunction = 339, + tDefineConstant = 340, + tUndefineConstant = 341, + tDefineNumber = 342, + tDefineStruct = 343, + tNameStruct = 344, + tDimNameSpace = 345, + tAppend = 346, + tDefineString = 347, + tSetNumber = 348, + tSetTag = 349, + tSetString = 350, + tPoint = 351, + tCircle = 352, + tEllipse = 353, + tCurve = 354, + tSphere = 355, + tPolarSphere = 356, + tSurface = 357, + tSpline = 358, + tVolume = 359, + tBox = 360, + tCylinder = 361, + tCone = 362, + tTorus = 363, + tEllipsoid = 364, + tQuadric = 365, + tShapeFromFile = 366, + tRectangle = 367, + tDisk = 368, + tWire = 369, + tGeoEntity = 370, + tCharacteristic = 371, + tLength = 372, + tParametric = 373, + tElliptic = 374, + tRefineMesh = 375, + tAdaptMesh = 376, + tRelocateMesh = 377, + tReorientMesh = 378, + tSetFactory = 379, + tThruSections = 380, + tWedge = 381, + tFillet = 382, + tChamfer = 383, + tPlane = 384, + tRuled = 385, + tTransfinite = 386, + tPhysical = 387, + tCompound = 388, + tPeriodic = 389, + tParent = 390, + tUsing = 391, + tPlugin = 392, + tDegenerated = 393, + tRecursive = 394, + tRotate = 395, + tTranslate = 396, + tSymmetry = 397, + tDilate = 398, + tExtrude = 399, + tLevelset = 400, + tAffine = 401, + tBooleanUnion = 402, + tBooleanIntersection = 403, + tBooleanDifference = 404, + tBooleanSection = 405, + tBooleanFragments = 406, + tThickSolid = 407, + tRecombine = 408, + tSmoother = 409, + tSplit = 410, + tDelete = 411, + tCoherence = 412, + tIntersect = 413, + tMeshAlgorithm = 414, + tReverseMesh = 415, + tLayers = 416, + tScaleLast = 417, + tHole = 418, + tAlias = 419, + tAliasWithOptions = 420, + tCopyOptions = 421, + tQuadTriAddVerts = 422, + tQuadTriNoNewVerts = 423, + tRecombLaterals = 424, + tTransfQuadTri = 425, + tText2D = 426, + tText3D = 427, + tInterpolationScheme = 428, + tTime = 429, + tCombine = 430, + tBSpline = 431, + tBezier = 432, + tNurbs = 433, + tNurbsOrder = 434, + tNurbsKnots = 435, + tColor = 436, + tColorTable = 437, + tFor = 438, + tIn = 439, + tEndFor = 440, + tIf = 441, + tElseIf = 442, + tElse = 443, + tEndIf = 444, + tExit = 445, + tAbort = 446, + tField = 447, + tReturn = 448, + tCall = 449, + tSlide = 450, + tMacro = 451, + tShow = 452, + tHide = 453, + tGetValue = 454, + tGetStringValue = 455, + tGetEnv = 456, + tGetString = 457, + tGetNumber = 458, + tUnique = 459, + tHomology = 460, + tCohomology = 461, + tBetti = 462, + tExists = 463, + tFileExists = 464, + tGetForced = 465, + tGetForcedStr = 466, + tGMSH_MAJOR_VERSION = 467, + tGMSH_MINOR_VERSION = 468, + tGMSH_PATCH_VERSION = 469, + tGmshExecutableName = 470, + tSetPartition = 471, + tNameToString = 472, + tStringToName = 473, + tAFFECTPLUS = 474, + tAFFECTMINUS = 475, + tAFFECTTIMES = 476, + tAFFECTDIVIDE = 477, + tOR = 478, + tAND = 479, + tEQUAL = 480, + tNOTEQUAL = 481, + tLESSOREQUAL = 482, + tGREATEROREQUAL = 483, + tLESSLESS = 484, + tGREATERGREATER = 485, + tPLUSPLUS = 486, + tMINUSMINUS = 487, + UNARYPREC = 488 }; #endif @@ -526,7 +528,7 @@ union YYSTYPE List_T *l; struct TwoChar c2; -#line 530 "Gmsh.tab.cpp" /* yacc.c:352 */ +#line 532 "Gmsh.tab.cpp" /* yacc.c:352 */ }; typedef union YYSTYPE YYSTYPE; @@ -774,19 +776,19 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 5 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 16738 +#define YYLAST 16917 /* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 254 +#define YYNTOKENS 256 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 113 /* YYNRULES -- Number of rules. */ -#define YYNRULES 611 +#define YYNRULES 613 /* YYNSTATES -- Number of states. */ -#define YYNSTATES 2180 +#define YYNSTATES 2190 #define YYUNDEFTOK 2 -#define YYMAXUTOK 486 +#define YYMAXUTOK 488 /* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM as returned by yylex, with out-of-bounds checking. */ @@ -800,16 +802,16 @@ static const yytype_uint8 yytranslate[] = 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 239, 2, 251, 2, 236, 238, 2, - 244, 245, 234, 232, 253, 233, 250, 235, 2, 2, + 2, 2, 2, 241, 2, 253, 2, 238, 240, 2, + 246, 247, 236, 234, 255, 235, 252, 237, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 226, 2, 228, 221, 2, 2, 2, 2, 2, 2, + 228, 2, 230, 223, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 246, 2, 247, 243, 2, 2, 2, 2, 2, + 2, 248, 2, 249, 245, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 248, 237, 249, 252, 2, 2, 2, + 2, 2, 2, 250, 239, 251, 254, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -844,8 +846,8 @@ static const yytype_uint8 yytranslate[] = 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, - 215, 216, 217, 218, 219, 220, 222, 223, 224, 225, - 227, 229, 230, 231, 240, 241, 242 + 215, 216, 217, 218, 219, 220, 221, 222, 224, 225, + 226, 227, 229, 231, 232, 233, 242, 243, 244 }; #if YYDEBUG @@ -897,23 +899,23 @@ static const yytype_uint16 yyrline[] = 5072, 5073, 5074, 5075, 5076, 5077, 5078, 5087, 5088, 5089, 5090, 5091, 5092, 5093, 5094, 5095, 5096, 5097, 5102, 5101, 5109, 5111, 5116, 5121, 5125, 5130, 5135, 5139, 5143, 5147, - 5151, 5155, 5159, 5165, 5181, 5186, 5192, 5198, 5217, 5238, - 5271, 5275, 5280, 5284, 5288, 5292, 5297, 5302, 5312, 5322, - 5327, 5338, 5347, 5352, 5357, 5385, 5386, 5392, 5393, 5399, - 5398, 5421, 5423, 5428, 5437, 5439, 5445, 5446, 5451, 5455, - 5459, 5463, 5467, 5474, 5478, 5482, 5486, 5493, 5498, 5505, - 5510, 5514, 5519, 5523, 5531, 5542, 5546, 5550, 5564, 5572, - 5580, 5587, 5597, 5620, 5625, 5631, 5636, 5642, 5653, 5659, - 5665, 5671, 5681, 5691, 5701, 5713, 5717, 5722, 5734, 5738, - 5742, 5746, 5764, 5772, 5780, 5809, 5819, 5835, 5846, 5851, - 5855, 5859, 5871, 5875, 5887, 5904, 5914, 5918, 5933, 5938, - 5945, 5949, 5954, 5968, 5984, 5988, 5992, 5996, 6000, 6008, - 6014, 6023, 6027, 6031, 6039, 6045, 6051, 6055, 6063, 6071, - 6078, 6087, 6091, 6095, 6110, 6124, 6138, 6150, 6166, 6175, - 6184, 6194, 6205, 6213, 6221, 6225, 6244, 6251, 6257, 6264, - 6272, 6271, 6281, 6305, 6307, 6313, 6318, 6320, 6325, 6330, - 6335, 6337, 6341, 6353, 6367, 6371, 6378, 6386, 6394, 6405, - 6407, 6410 + 5151, 5155, 5159, 5165, 5180, 5184, 5190, 5195, 5214, 5234, + 5265, 5269, 5273, 5277, 5281, 5285, 5289, 5294, 5304, 5314, + 5319, 5330, 5339, 5344, 5349, 5377, 5378, 5384, 5385, 5391, + 5390, 5413, 5415, 5420, 5429, 5431, 5437, 5438, 5443, 5447, + 5451, 5455, 5459, 5466, 5470, 5474, 5478, 5485, 5490, 5497, + 5502, 5506, 5511, 5515, 5523, 5534, 5538, 5542, 5556, 5564, + 5572, 5579, 5589, 5612, 5617, 5623, 5628, 5634, 5645, 5651, + 5657, 5663, 5675, 5689, 5699, 5709, 5719, 5731, 5735, 5740, + 5752, 5756, 5760, 5764, 5782, 5790, 5798, 5827, 5837, 5853, + 5864, 5869, 5873, 5877, 5889, 5893, 5905, 5922, 5932, 5936, + 5951, 5956, 5963, 5967, 5972, 5986, 6002, 6006, 6010, 6014, + 6018, 6026, 6032, 6041, 6045, 6049, 6057, 6063, 6069, 6073, + 6081, 6089, 6096, 6105, 6109, 6113, 6128, 6142, 6156, 6168, + 6184, 6193, 6202, 6212, 6223, 6231, 6239, 6243, 6262, 6269, + 6275, 6282, 6290, 6289, 6299, 6323, 6325, 6331, 6336, 6338, + 6343, 6348, 6353, 6355, 6359, 6371, 6385, 6389, 6396, 6404, + 6412, 6423, 6425, 6428 }; #endif @@ -934,8 +936,8 @@ static const char *const yytname[] = "tStrCmp", "tStrChoice", "tUpperCase", "tLowerCase", "tLowerCaseIn", "tTextAttributes", "tBoundingBox", "tDraw", "tSetChanged", "tToday", "tFixRelativePath", "tCurrentDirectory", "tSyncModel", "tNewModel", - "tOnelabAction", "tOnelabRun", "tCodeName", "tCpu", "tMemory", - "tTotalMemory", "tCreateTopology", "tCreateGeometry", + "tMass", "tCenterOfMass", "tOnelabAction", "tOnelabRun", "tCodeName", + "tCpu", "tMemory", "tTotalMemory", "tCreateTopology", "tCreateGeometry", "tRenumberMeshNodes", "tRenumberMeshElements", "tDistanceFunction", "tDefineConstant", "tUndefineConstant", "tDefineNumber", "tDefineStruct", "tNameStruct", "tDimNameSpace", "tAppend", "tDefineString", "tSetNumber", @@ -1028,19 +1030,19 @@ static const yytype_uint16 yytoknum[] = 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, - 475, 63, 476, 477, 478, 479, 60, 480, 62, 481, - 482, 483, 43, 45, 42, 47, 37, 124, 38, 33, - 484, 485, 486, 94, 40, 41, 91, 93, 123, 125, - 46, 35, 126, 44 + 475, 476, 477, 63, 478, 479, 480, 481, 60, 482, + 62, 483, 484, 485, 43, 45, 42, 47, 37, 124, + 38, 33, 486, 487, 488, 94, 40, 41, 91, 93, + 123, 125, 46, 35, 126, 44 }; # endif -#define YYPACT_NINF -1832 +#define YYPACT_NINF -1859 #define yypact_value_is_default(Yystate) \ - (!!((Yystate) == (-1832))) + (!!((Yystate) == (-1859))) -#define YYTABLE_NINF -559 +#define YYTABLE_NINF -561 #define yytable_value_is_error(Yytable_value) \ 0 @@ -1049,224 +1051,225 @@ static const yytype_uint16 yytoknum[] = STATE-NUM. */ static const yytype_int16 yypact[] = { - 12590, 58, 87, 12746, -1832, -1832, -103, 17, 1, -110, - -63, 42, 107, 208, 222, 241, -23, 273, 294, 341, - 375, 178, 204, 18, -39, 400, -39, 109, 219, 229, - 33, 236, 259, 34, 265, 277, 327, 350, 359, 434, - 458, 467, 491, 500, 15, 473, 622, 685, 480, 133, - 648, 509, 6980, 545, 520, 551, 712, -35, 540, 420, - 80, 227, 607, 738, -99, 597, -159, -159, 651, 337, - 388, 689, -1832, -1832, -1832, -1832, -1832, 632, 525, 804, - 843, 19, 52, 848, 853, 143, 950, 953, 954, 6012, - 955, 716, 718, 719, 25, 49, -1832, 720, 721, -1832, - -1832, 960, 961, 715, -1832, 2736, 724, 3335, 16, 27, - -1832, -1832, -1832, 11802, 723, -1832, -1832, -1832, -1832, -1832, - 722, -1832, -1832, -1832, -1832, -1832, -1832, -1832, -1832, -1832, - -1832, -86, -1832, -1832, -1832, -1832, 51, -1832, 965, 731, - 5763, 313, 725, 966, 11802, 12919, 12919, -1832, 11802, -1832, - -1832, -1832, -1832, 12919, -1832, -1832, -1832, -1832, -1832, -1832, - 732, 741, 977, -1832, -1832, 3851, 747, 748, 749, 750, - 18, 11802, 11802, 11802, 754, 11802, 11802, 11802, 755, 11802, - 11802, 11802, 11802, 11802, 11802, 11802, 12919, 11802, 11802, 11802, - 11802, 6012, 757, -1832, 9632, -1832, -1832, -1832, 756, 6012, - 7222, 12919, -1832, -1832, -1832, -1832, -1832, -39, -39, -39, - -39, -39, -39, -39, -39, -39, -39, -39, -39, -39, - -39, -39, -39, -39, -39, -39, -39, -39, -39, -39, - 11, -39, -39, -39, -39, -39, 761, -39, -39, 762, - 420, -1832, -1832, -1832, -39, -39, 35, 825, 826, 827, - 763, 7222, 887, 420, 420, 768, -39, -39, 770, 772, - 773, -1832, -1832, -1832, 11802, 7464, 11802, 11802, 7706, 18, - 837, 36, -1832, -1832, 775, -1832, 4396, -1832, -1832, -1832, - -1832, -1832, 117, 11802, 9632, 9632, 776, 777, 7948, 6012, - 6012, 6012, -1832, -1832, -1832, -1832, -1832, -1832, -1832, -1832, - 778, 8190, 779, 4805, 1027, 7222, 786, 25, 787, 788, - -159, -159, -159, 11802, 11802, 199, -1832, 302, -159, 10524, - 344, 96, 795, 796, 800, 801, 802, 805, 807, 9632, - 11802, 6012, 6012, 6012, 808, 24, 1042, 809, -1832, 1047, - 1050, -1832, 811, 812, 813, -1832, -1832, 814, 6012, 819, - 820, 821, -1832, 11802, 6254, -1832, 1051, 1062, 11802, 11802, - 11802, 186, 11802, 822, -1832, 889, 11802, 11802, 11802, -1832, - -1832, 11802, -1832, -39, -39, -39, 828, 829, 830, -39, - -39, -39, -39, -39, -39, -39, -1832, -39, -1832, -1832, - -1832, -39, -39, 831, 832, -39, 839, -1832, 823, 1089, - 1107, 867, -1832, -1832, 1110, 1111, 1112, 1113, -39, 11802, - 14354, 130, 12919, 9632, 11802, -1832, -1832, 7222, 7222, -1832, - 872, 3851, 420, 1115, -1832, -1832, -1832, -1832, -1832, -1832, - 11802, 11802, 38, 7222, 1117, 691, 877, 1274, 881, 1124, - 75, 883, -1832, 884, 12940, 11802, -1832, 1533, -58, -1832, - 57, 182, 6916, -1832, 238, -1832, 68, -141, -16, 1043, - -1832, 18, 885, 11802, 11802, 11802, 11802, 886, 14870, 14895, - 14920, 11802, 14945, 14970, 14995, 11802, 15020, 15045, 15070, 15095, - 15120, 15145, 15170, 895, 15195, 15220, 15245, 13542, 1135, 11802, - 9632, 4917, -1832, 126, 11802, 1139, 1141, 903, 11802, 11802, - 11802, 11802, 11802, 11802, 11802, 11802, 11802, 11802, 11802, 11802, - 11802, 11802, 11802, 11802, 9632, 11802, 11802, 11802, 11802, 11802, - 11802, 9632, 9632, 901, 11802, 11802, 12919, 11802, 12919, 7222, - 12919, 12919, 12919, 902, 11802, 13, -1832, 10603, 11802, 7222, - 6012, 7222, 12919, 12919, 9632, 18, 3851, 18, 908, 9632, - 908, -1832, 908, 15270, -1832, 334, 904, 95, 1088, -1832, - 1145, 11802, 11802, 11802, 11802, 11802, 11802, 11802, 11802, 11802, - 11802, 11802, 11802, 11802, 11802, 8432, 11802, 11802, 11802, 11802, - 11802, 18, 11802, 11802, 1151, -1832, 696, 15295, 351, 366, - 11802, 11802, 11802, -1832, 1150, 1152, 1152, 914, 11802, 11802, - 1154, 9632, 9632, 14382, 916, 1156, -1832, 915, -1832, -1832, - -161, -1832, -1832, 7158, 7400, -159, -159, 313, 313, -133, - 10524, 10524, 11802, 4466, -105, -1832, 11802, 11802, 11802, 11802, - 11802, 11802, 11802, 11802, 11802, 414, 15320, 1157, 1159, 1160, - 11802, 1164, 11802, -1832, -1832, 11802, 5815, -1832, -1832, 9632, - 9632, 9632, 11802, 1165, 11802, 11802, 11802, 15345, 917, -1832, - -1832, 15370, 15395, 15420, 998, 7642, -1832, 931, 5150, 15445, - 15470, 14465, 12919, 12919, 12919, 12919, 12919, 12919, 12919, 12919, - 12919, 11802, 12919, 12919, 12919, 12919, 10, 3851, 12919, 12919, - 12919, 18, 18, -1832, -1832, 9632, -1832, 932, 10965, -1832, - 933, 11288, 11802, 908, 11802, -1832, 18, 11802, 11802, 1151, - 936, 415, 15495, 11611, 935, 441, 11802, 1178, 938, 7222, - 15520, 14492, 165, 939, 1181, 1184, -1832, -1832, -1832, 9632, - 32, 11802, -1832, -1832, -1832, 18, 11802, 11802, 1151, 945, - -1832, 949, -33, 420, 80, 420, -1832, 946, 13571, -1832, - 141, 9632, 18, 11802, 11802, 1191, 1194, 9632, 11802, 1195, - 12919, 18, 10840, 1191, 1197, -1832, 18, 1198, 12919, 11802, - 952, 959, -1832, 11802, 7884, 8126, 8368, 8610, 3851, 1199, - 1200, 1201, 15545, 1202, 1203, 1204, 15570, 1205, 1206, 1207, - 1209, 1210, 1211, 1212, -1832, 1213, 1214, 1215, -1832, 11802, - 15595, 9632, 975, 9632, 13600, -1832, -1832, 1218, 14438, 14438, - 14438, 14438, 14438, 14438, 14438, 14438, 14438, 14438, 14438, 8847, - 14438, 14438, 14438, 14438, 594, 566, 14438, 14438, 14438, 9084, - 9326, 9568, 4917, 980, 982, 102, 9632, 9900, 10230, 566, - 10471, 566, 974, 983, 984, 271, 9632, 16495, -1832, 566, - 986, 13629, 13658, -1832, -1832, 985, 155, 566, 298, 994, - 336, 447, 1233, -1832, 1191, 566, 999, 997, 5250, 5279, - 874, 1247, 1109, 1109, 374, 374, 374, 374, 374, 374, - 396, 396, 9632, -162, -1832, -162, -162, 908, 908, 908, - 1000, 15620, 14519, 28, 397, 9632, -1832, 1241, 1001, 1003, - 15645, 15670, 15695, 11802, 7222, 1249, 1248, 10287, 13687, 15720, - -1832, 455, 457, 9632, 1005, -1832, 11830, -1832, 11960, 12017, - -159, 11802, 11802, -1832, -1832, 1007, 1009, 10524, 5948, 1125, - 311, -159, 12084, 15745, 13716, 15770, 15795, 15820, 15845, 15870, - 15895, 15920, 1012, 1255, 11802, 1257, -1832, 11802, 15945, -1832, - 14546, 12141, 14573, -1832, 460, 465, 468, 13745, -1832, 14600, - 14627, 10555, -1832, -1832, 1258, 1259, 1260, 1014, 11802, 12208, - 11802, 11802, -1832, -1832, 39, 391, 405, 391, 1023, 1024, - 1018, 566, 566, 1020, 10796, 566, 566, 566, 566, 11802, - 566, 1265, -1832, 1025, 1031, 406, 163, 1030, 470, -1832, - -1832, -1832, -1832, 14438, -162, 12265, 1032, 523, 1033, 1101, - 1277, 1132, 10926, 1038, 1040, 1283, 7222, 13774, -1832, 11802, - 1285, 171, 115, 3851, 11802, 1286, 1289, 26, -1832, 471, - 1250, 1251, 7222, 13803, 31, 1044, 15970, 14654, 118, 11802, - 11802, 1054, 1052, 1057, 1055, 8674, -1832, -1832, -1832, -1832, - 12919, 348, 1045, 15995, 14681, -1832, 1058, -1832, 373, 11119, - -1832, -1832, -1832, 1076, -1832, 1060, -1832, 76, -1832, -1832, - 16495, -1832, 1301, 14438, 11802, 11802, 11802, 11802, 566, -159, - 7222, 7222, 1321, 7222, 7222, 7222, 1323, 7222, 7222, 7222, - 7222, 7222, 7222, 7222, 7222, 7222, 7222, 1621, 1326, 9632, - 4917, -1832, -1832, -1832, -1832, -1832, -1832, -1832, -1832, -1832, - -1832, -1832, -1832, -1832, -1832, 11802, -1832, -1832, -1832, -1832, - -1832, -1832, -1832, -1832, -1832, 11802, 11802, 11802, -1832, -1832, - -1832, 476, 11802, 11802, -1832, 11802, -1832, 7222, 12919, 12919, - -1832, 478, 1097, -1832, -1832, -1832, 1169, 11802, 11802, -1832, - -1832, -1832, 1191, -1832, 1191, 11802, 11802, 1108, -1832, 7222, - -39, -1832, 11802, -1832, 11802, 11802, 481, 1191, 28, 215, - -1832, 11802, 11802, 566, 484, 7222, 9632, 9632, 1347, 1348, - 1349, 550, -1832, -1832, 1351, -1832, 1114, 16495, 1105, -1832, - 1353, 1354, 1356, 487, 1360, -1832, 12332, -1832, -1832, -101, - 11433, 11670, -1832, -1832, 13832, -92, 1256, 1363, 11163, 1121, - 1364, 1127, 37, 41, -36, -1832, -97, -1832, 311, 1365, - 1367, 1381, 1382, 1386, 1387, 1388, 1389, 1390, 313, 7222, - 16495, -1832, 2151, 1153, 1396, -1832, 1398, 1399, 1306, 1400, - -1832, 1402, 1403, 11802, 7222, 7222, 7222, 1406, 12386, -1832, - 5458, 1086, 50, 1407, -1832, 9632, -1832, -1832, -1832, -1832, - 12919, -1832, -1832, 11802, 12919, -1832, -1832, -1832, -1832, 16495, - -1832, 1161, 1163, 12919, -1832, 12919, -1832, 1191, 12919, 1168, - -1832, 1170, -1832, 1191, 11802, 11802, 1173, 420, 1174, 11249, - -1832, 2206, 1176, 7222, -1832, 1179, -1832, 13861, -1832, -1832, - 11802, 1411, 40, 11802, 1419, 1421, 2271, -1832, 1423, 25, - 1425, 1186, 566, -39, -39, 1427, -1832, -1832, 1190, 1192, - 1187, -1832, 1431, -1832, -1832, -1832, -1832, -1832, 1191, -180, - 928, 11802, 14708, 16020, 11802, 8911, 11802, 9632, 1189, 492, - 1433, 173, 1191, -1832, 1193, 11802, 1434, 11802, 1191, 11486, - 9869, 566, 5214, 1208, 1196, -1832, 1436, 16045, 16070, 16095, - 16120, 1438, 104, 1319, 1319, 7222, 1442, 1444, 1445, 7222, - -75, 1447, 1448, 1450, 1451, 1452, 1453, 1455, 1457, 1459, - -1832, 1461, 493, 14438, 14438, 14438, 14438, 566, 12870, 12915, - 12948, 1222, 566, 566, -1832, 1301, 566, 16145, 14438, 1223, - -78, 16495, 14438, -1832, 1463, 566, 12981, 16495, 16495, -1832, - 638, -1832, 1482, -1832, 16170, 14735, -1832, 566, 1481, 498, - 503, 7222, 7222, 7222, 1485, 1486, -1832, 203, 11802, 7222, - 1243, 1246, 1506, 524, -1832, 11802, 11802, 11802, 1266, 1267, - 1268, 1273, -1832, 2389, 7222, -1832, 11802, -1832, 1514, -1832, - 1515, -1832, -1832, 10524, 4, 6496, -1832, 1275, 1278, 1279, - 1280, 1281, 1284, 9148, 1282, 1516, -1832, 9632, -1832, -1832, - -1832, 1287, 11802, -1832, -1832, 14762, 1527, 1528, 1358, -1832, - 11802, 11802, 11802, -1832, 1531, 1532, 1534, 922, 409, 1288, - 3580, 1290, 11802, 29, 566, 1297, 566, 1291, -1832, -1832, - 3851, 649, 11802, 1298, -1832, -1832, 2416, -1832, -1832, 1292, - 1541, -1832, 2957, -1832, 177, 1299, 1544, 2987, -1832, -1832, - -1832, 25, -1832, 506, -1832, 11802, 203, 2074, 2149, -1832, - 1308, 11802, 11802, 7222, 1305, -1832, 453, 1550, 1549, 16195, - 1551, 1233, 16220, 1309, 511, 16245, 517, 1553, 1554, -1832, - -1832, 12919, 1318, 1559, 16270, -1832, 13014, 1320, -1832, 5521, - 16495, -1832, 1558, -39, 7706, -1832, -1832, -1832, -1832, 1301, - -1832, 1560, 1561, 1562, 1563, -1832, -1832, -159, 1564, 1565, - 1567, -1832, -1832, -1832, 1568, -31, 1477, 1571, -1832, -1832, - -1832, -1832, -1832, -1832, -1832, -1832, -1832, 1573, 1331, -1832, - -1832, -1832, -1832, -1832, 11802, 11802, 11802, -1832, -1832, -1832, - 1196, -1832, -1832, -1832, -1832, 11802, 1335, 1328, -1832, -1832, - 11802, 11802, 11802, 566, 28, -1832, -1832, -1832, -1832, 1334, - 1336, 1577, -75, 1579, 11802, -1832, 7222, 16495, 942, 9632, - 9632, 11802, -1832, 10287, 13890, 16295, 6190, 313, 313, 11802, - 11802, -1832, 330, 1333, 16320, -1832, -1832, 13919, -59, -1832, - 1581, 1582, 7222, -159, -159, -159, -159, -159, 6738, 1583, - -1832, -1832, 541, 11802, 3045, 1584, -1832, -1832, 7222, 6432, - 637, 16345, -1832, -1832, -1832, -1832, 9957, -1832, 12919, 11802, - -1832, 12919, 16495, 10199, 3851, 1338, -1832, -1832, -1832, -1832, - 1350, 1339, 11802, 11802, 13948, 11802, 11611, -1832, 11611, 7222, - -1832, -1832, 3851, 11802, 1587, 1592, 26, -1832, 1591, -1832, - 25, 14789, 7222, 12919, 1593, 566, -1832, 1345, 566, 11802, - 13047, 13080, 542, -1832, 11802, 11802, -132, -1832, 1352, -1832, - 1349, 1595, 1596, 1353, 1597, -1832, -1832, 1598, 11802, -1832, - -1832, 11802, 11565, -1832, -1832, 1359, 2149, 543, 4160, 1599, - -1832, -1832, -1832, -1832, -1832, 717, -1832, -1832, -1832, -1832, - 1361, 1362, 1366, -1832, 1603, 7222, 14438, 14438, 13113, 14438, - -1832, 1368, 13146, 16370, 14816, -1832, -1832, 9632, 9632, -1832, - 1606, -1832, 16495, 1610, 1369, -1832, 548, 554, 14410, 3361, - 1613, 1376, -1832, -1832, 11802, 1377, 1379, 13977, 14843, 1619, - 7222, 1622, 1383, 11802, -1832, -1832, 555, -47, -21, -17, - -8, 6, 9390, 154, -1832, 1624, 14006, -1832, -1832, 1458, - -1832, 11802, 11802, -1832, -1832, 9632, 3400, 1626, 1393, 14438, - 566, 16495, -1832, -1832, -1832, -1832, 29, -1832, 3851, -1832, - 14035, 1391, 1394, 1395, 1633, 3547, -1832, 1635, 1640, -1832, - -1832, 1397, 1642, 556, -1832, 1643, 1646, 412, 16495, 11802, - 11802, 1408, 7222, 557, 16495, 16395, -1832, -1832, -1832, -1832, - 16420, 13179, -1832, 1097, 1163, 7222, 566, -1832, 11802, 3851, - 18, 9632, 9632, 11802, 1648, 585, -1832, -1832, 11802, 1328, - -1832, 11802, -1832, -1832, 591, 601, -1832, -1832, 7222, 167, - 522, 9632, -1832, -1832, 313, 6674, -1832, -1832, -1832, 1649, - -1832, 1409, 7222, -1832, 14064, 1651, 9632, -159, -159, -159, - -159, -159, -1832, -1832, 11802, 14093, 14122, 603, -1832, -1832, - -1832, -1832, -1832, -1832, 1415, 1655, 1416, -1832, 1657, -1832, - -1832, 25, -1832, 1487, -1832, -1832, -1832, -1832, -1832, 11802, - 13212, 13245, 7222, -1832, 1660, 11802, 1420, -1832, 11802, 1424, - 1428, -1832, -1832, 4686, -1832, 1426, 604, 628, 14151, -1832, - 1432, 13278, 1429, 13311, -1832, 1435, 634, 1439, -159, 7222, - 1663, 1441, -159, 1666, 636, 1430, -1832, 11802, -1832, 1670, - 1547, 12389, 1443, -1832, 645, 166, 193, 196, 207, 211, - 3950, -1832, -1832, 1676, 1678, -1832, -1832, -1832, 1680, -1832, - 1446, 16495, 11802, 11802, 647, -1832, 16495, 13344, -1832, -1832, - 1097, 3851, 1454, -1832, -1832, -1832, 11802, 11802, -1832, 11802, - 9632, 1684, -159, 127, -1832, -1832, -159, 145, -1832, 1686, - -1832, 14180, -1832, 11802, -1832, 311, -1832, 1687, 9632, 9632, - 9632, 9632, 9390, -1832, -1832, -1832, 11611, -1832, 11802, 16445, - 13377, 44, 11802, 1449, -1832, -1832, 13410, 13443, 13476, 653, - -1832, 235, -1832, 246, -1832, -1832, -1832, 4118, 347, 12456, - -1832, 656, 658, 663, 664, 252, 665, 1456, 666, -1832, - 11802, -1832, 7222, 14209, -1832, 11802, 11802, 11802, -1832, -159, - -159, -1832, -1832, -1832, 311, 1689, 1690, 1691, 1695, 9632, - 1696, 1697, 1702, 1462, 16470, 671, 1703, 14238, 14438, 13509, - 257, 342, 463, -1832, -1832, -1832, -1832, 672, -1832, -1832, - -1832, 12919, -1832, 1464, -1832, 1705, -1832, 11802, 11802, 11802, - -1832, 1708, 674, -1832, 1467, 7222, -1832, 14267, 14296, 14325, - -1832, 1710, 12919, 12919, 677, -1832, 1712, 1715, -1832, -1832, - 682, -1832, 1716, -1832, -1832, 1717, 12919, -1832, -1832, -1832 + 12416, 63, 87, 12574, -1859, -1859, 116, 99, 34, -80, + -66, 48, 140, 150, 181, 214, 1, 249, 260, 271, + 288, 90, 110, 40, 341, 286, 341, 102, 126, 135, + 56, 167, 172, 57, 221, 227, 269, 301, 308, 313, + 324, 348, 361, 381, 202, 270, 404, 616, 384, 385, + 527, 395, 6603, 411, 410, 438, 624, -46, 566, 557, + 567, 405, 472, 655, -59, 507, 276, 276, 515, 408, + 376, 516, -1859, -1859, -1859, -1859, -1859, 503, -1, 671, + 677, 23, 58, 686, 705, 69, 786, 804, 810, 5627, + 817, 593, 599, 608, 24, 59, -1859, 622, 676, -1859, + -1859, 897, 900, 689, -1859, 8424, 694, 6960, 31, 35, + -1859, -1859, -1859, 11473, 715, -1859, -1859, -1859, -1859, -1859, + 695, -1859, -1859, -1859, -1859, -1859, -1859, -1859, -1859, -1859, + -1859, -60, -1859, -1859, -1859, -1859, 47, -1859, 943, 699, + 4719, 322, 716, 959, 11473, 12749, 12749, -1859, 11473, -1859, + -1859, -1859, -1859, 12749, -1859, -1859, -1859, -1859, -1859, -1859, + 713, 723, 961, -1859, -1859, 7204, 725, 726, 727, 729, + 40, 11473, 11473, 11473, 730, 11473, 11473, 11473, 731, 11473, + 11473, 11473, 11473, 11473, 11473, 11473, 12749, 11473, 11473, 11473, + 11473, 5627, 732, -1859, 9277, -1859, -1859, -1859, 742, 5627, + 6847, 12749, -1859, -1859, -1859, -1859, -1859, 341, 341, 341, + 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, + 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, + 486, 341, 341, 341, 341, 341, 733, 341, 341, 734, + 557, 567, 567, -1859, -1859, -1859, 341, 341, 41, 798, + 809, 811, 744, 6847, 875, 557, 557, 756, 341, 341, + 757, 761, 762, -1859, -1859, -1859, 11473, 7091, 11473, 11473, + 7335, 40, 826, 42, -1859, -1859, 764, -1859, 5319, -1859, + -1859, -1859, -1859, -1859, 65, 11473, 9277, 9277, 766, 769, + 7579, 5627, 5627, 5627, -1859, -1859, -1859, -1859, -1859, -1859, + -1859, -1859, 767, 7823, 768, 2169, 1016, 6847, 772, 24, + 773, 774, 276, 276, 276, 11473, 11473, -40, -1859, -16, + 276, 10179, 188, 15, 779, 781, 782, 785, 788, 791, + 792, 9277, 11473, 5627, 5627, 5627, 794, 22, 1026, 796, + -1859, 1039, 1040, -1859, 797, 799, 800, -1859, -1859, 801, + 5627, 806, 808, 813, -1859, 11473, 5871, -1859, 1051, 1052, + 11473, 11473, 11473, 179, 11473, 812, -1859, 879, 11473, 11473, + 11473, -1859, -1859, 11473, -1859, 341, 341, 341, 818, 819, + 820, 341, 341, 341, 341, 341, 341, 341, -1859, 341, + -1859, -1859, -1859, 341, 341, 821, 822, 341, 827, -1859, + 824, 1053, 1068, 828, -1859, -1859, 1071, 1072, 1073, 1074, + 341, 11473, 14531, 117, 12749, 9277, 11473, -1859, -1859, 6847, + 6847, -1859, 835, 7204, 557, 1082, -1859, -1859, -1859, -1859, + -1859, -1859, 11473, 11473, 27, 6847, 1095, 697, 853, 1094, + 854, 1099, 91, 856, -1859, 857, 12873, 11473, -1859, 2064, + -196, -1859, 72, -175, 8725, -1859, -106, -1859, 73, -79, + -74, 1018, -1859, 40, 852, 11473, 11473, 11473, 11473, 855, + 15047, 15072, 15097, 11473, 15122, 15147, 15172, 11473, 15197, 15222, + 15247, 15272, 15297, 15322, 15347, 864, 15372, 15397, 15422, 13661, + 1105, 11473, 9277, 5563, -1859, 196, 11473, 1107, 1125, 885, + 11473, 11473, 11473, 11473, 11473, 11473, 11473, 11473, 11473, 11473, + 11473, 11473, 11473, 11473, 11473, 11473, 9277, 11473, 11473, 11473, + 11473, 11473, 11473, 9277, 9277, 883, 11473, 11473, 12749, 11473, + 12749, 6847, 12749, 12749, 12749, 886, 893, 894, 11473, 33, + -1859, 10260, 11473, 6847, 5627, 6847, 12749, 12749, 9277, 40, + 7204, 40, 901, 9277, 901, -1859, 901, 15447, -1859, 283, + 895, 81, 1081, -1859, 1141, 11473, 11473, 11473, 11473, 11473, + 11473, 11473, 11473, 11473, 11473, 11473, 11473, 11473, 11473, 8067, + 11473, 11473, 11473, 11473, 11473, 40, 11473, 11473, 1146, -1859, + 701, 15472, 393, 490, 11473, 11473, 11473, -1859, 1144, 1150, + 1150, 907, 11473, 11473, 1152, 9277, 9277, 14559, 912, 1154, + -1859, 911, -1859, -1859, -130, -1859, -1859, 8969, 9213, 276, + 276, 322, 322, -107, 10179, 10179, 11473, 4969, -100, -1859, + 11473, 11473, 11473, 11473, 11473, 11473, 11473, 11473, 11473, 492, + 15497, 1155, 1157, 1158, 11473, 1160, 11473, -1859, -1859, 11473, + 11441, -1859, -1859, 9277, 9277, 9277, 11473, 1161, 11473, 11473, + 11473, 15522, 917, -1859, -1859, 15547, 15572, 15597, 988, 9547, + -1859, 920, 5807, 15622, 15647, 14642, 12749, 12749, 12749, 12749, + 12749, 12749, 12749, 12749, 12749, 11473, 12749, 12749, 12749, 12749, + 10, 7204, 12749, 12749, 12749, 40, 40, -1859, -1859, 9277, + -1859, 921, 11598, -1859, 922, 11655, 11473, 901, 11473, -1859, + 40, 11473, 11473, 1146, 925, 493, 15672, 12770, 928, 495, + 11473, 1170, 927, 6847, 15697, 14669, 11, 926, 1172, 1177, + -1859, -1859, -1859, 9277, 157, 11473, -1859, -1859, -1859, 40, + 11473, 11473, 1146, 938, -1859, 939, -29, 557, 567, 557, + -1859, 940, 13690, -1859, 134, 9277, 40, 11473, 11473, 1185, + 1186, 9277, 11473, 1189, 12749, 40, 10499, 1185, 1208, -1859, + 40, 1209, 12749, 11473, 944, 968, -1859, 11473, 9881, 10128, + 10210, 10455, 7204, 1210, 1212, 1213, 15722, 1214, 1215, 1218, + 15747, 1219, 1220, 1221, 1223, 1224, 1225, 1226, -1859, 1228, + 1231, 1233, -1859, 11473, 15772, 9277, 991, 9277, 13719, -1859, + -1859, 1236, 14615, 14615, 14615, 14615, 14615, 14615, 14615, 14615, + 14615, 14615, 14615, 10530, 14615, 14615, 14615, 14615, 1393, 491, + 14615, 14615, 14615, 10782, 10857, 11102, 5563, 996, 997, 103, + 9277, 11184, 11397, 491, 12209, 491, 992, 993, 998, -95, + 9277, 11473, 11473, 16672, -1859, 491, 1003, 13748, 13777, -1859, + -1859, 1000, 95, 491, -31, 1009, 371, 500, 1250, -1859, + 1185, 491, 1013, 1008, 6051, 6295, 890, 1315, 596, 596, + 466, 466, 466, 466, 466, 466, 476, 476, 9277, 332, + -1859, 332, 332, 901, 901, 901, 1012, 15797, 14696, 281, + 574, 9277, -1859, 1259, 1017, 1020, 15822, 15847, 15872, 11473, + 6847, 1264, 1265, 9940, 13806, 15897, -1859, 505, 508, 9277, + 1021, -1859, 11722, -1859, 11779, 11846, 276, 11473, 11473, -1859, + -1859, 1023, 1024, 10179, 7515, 1140, 430, 276, 11903, 15922, + 13835, 15947, 15972, 15997, 16022, 16047, 16072, 16097, 1027, 1272, + 11473, 1275, -1859, 11473, 16122, -1859, 14723, 11970, 14750, -1859, + 517, 520, 523, 13864, -1859, 14777, 14804, 12803, -1859, -1859, + 1277, 1278, 1279, 1030, 11473, 12027, 11473, 11473, -1859, -1859, + 26, 137, 314, 137, 1041, 1042, 1032, 491, 491, 1035, + 12836, 491, 491, 491, 491, 11473, 491, 1282, -1859, 1037, + 1046, 369, 280, 1045, 540, -1859, -1859, -1859, -1859, 14615, + 332, 12094, 1043, 706, 1048, 1112, 1290, 1143, 10587, 1055, + 1054, 1301, 6847, 13893, -1859, 11473, 1302, 206, 17, 7204, + 11473, 1304, 1307, 25, -1859, 545, 1266, 1267, 6847, 13922, + 28, 1063, 16147, 14831, 483, 11473, 11473, 1090, 1087, 1092, + 1091, 8311, -1859, -1859, -1859, -1859, 12749, -70, 1098, 16172, + 14858, -1859, 1100, -1859, -30, 12869, -1859, -1859, -1859, 1101, + -1859, 1109, -1859, 64, -1859, -1859, 16672, -1859, 1340, 14615, + 11473, 11473, 11473, 11473, 491, 276, 6847, 6847, 1344, 6847, + 6847, 6847, 1349, 6847, 6847, 6847, 6847, 6847, 6847, 6847, + 6847, 6847, 6847, 2202, 1351, 9277, 5563, -1859, -1859, -1859, + -1859, -1859, -1859, -1859, -1859, -1859, -1859, -1859, -1859, -1859, + -1859, 11473, -1859, -1859, -1859, -1859, -1859, -1859, -1859, -1859, + -1859, 11473, 11473, 11473, -1859, -1859, -1859, 546, 11473, 11473, + -1859, 11473, -1859, 6847, 12749, 12749, -1859, 548, 13951, 13980, + 1104, -1859, -1859, -1859, 1176, 11473, 11473, -1859, -1859, -1859, + 1185, -1859, 1185, 11473, 11473, 1116, -1859, 6847, 341, -1859, + 11473, -1859, 11473, 11473, 554, 1185, 281, -144, -1859, 11473, + 11473, 491, 555, 6847, 9277, 9277, 1357, 1358, 1359, 4766, + -1859, -1859, 1361, -1859, 1122, 16672, 1118, -1859, 1364, 1368, + 1369, 561, 1373, -1859, 12151, -1859, -1859, -90, 12902, 12935, + -1859, -1859, 14009, -72, 1268, 1374, 10826, 1129, 1378, 1134, + 36, 37, -47, -1859, -11, -1859, 430, 1380, 1379, 1381, + 1382, 1383, 1384, 1387, 1388, 1389, 322, 6847, 16672, -1859, + 2359, 1147, 1392, -1859, 1394, 1396, 1303, 1397, -1859, 1400, + 1401, 11473, 6847, 6847, 6847, 1399, 12968, -1859, 6539, 1804, + 53, 1404, -1859, 9277, -1859, -1859, -1859, -1859, 12749, -1859, + -1859, 11473, 12749, -1859, -1859, -1859, -1859, 16672, -1859, 1156, + 1159, 12749, -1859, 12749, -1859, 1185, 12749, 1163, -1859, 1162, + -1859, 1185, 11473, 11473, 1165, 557, 1166, 10914, -1859, 2453, + 1168, 6847, -1859, 1169, -1859, 14038, -1859, -1859, 11473, 1405, + 30, 11473, 1407, 1413, 2491, -1859, 1414, 24, 1419, 1179, + 491, 341, 341, 1425, -1859, -1859, 1187, 1188, 1182, -1859, + 1429, -1859, -1859, -1859, -1859, -1859, 1185, -167, 3572, 11473, + 14885, 16197, 11473, 8550, 11473, 9277, 1190, 562, 1431, 141, + 1185, -1859, 1191, 11473, 1433, 11473, 1185, 11153, 9516, 491, + 5139, 1195, 1192, -1859, 1434, 16222, 16247, 16272, 16297, 1439, + 88, 1317, 1317, 6847, 1442, 1443, 1444, 6847, -91, 1446, + 1447, 1448, 1450, 1451, 1452, 1453, 1454, 1455, -1859, 1458, + 564, 14615, 14615, 14615, 14615, 491, 13001, 13034, 13067, 1217, + 491, 491, -1859, -1859, -1859, 1340, 491, 16322, 14615, 1222, + -178, 16672, 14615, -1859, 1460, 491, 13100, 16672, 16672, -1859, + 710, -1859, 1463, -1859, 16347, 14912, -1859, 491, 1462, 587, + 589, 6847, 6847, 6847, 1467, 1466, -1859, 222, 11473, 6847, + 1227, 1229, 1468, 606, -1859, 11473, 11473, 11473, 1230, 1232, + 1234, 1235, -1859, 2555, 6847, -1859, 11473, -1859, 1470, -1859, + 1472, -1859, -1859, 10179, -44, 6115, -1859, 1237, 1238, 1239, + 1240, 1255, 1256, 8789, 1249, 1475, -1859, 9277, -1859, -1859, + -1859, 1260, 11473, -1859, -1859, 14939, 1479, 1505, 1293, -1859, + 11473, 11473, 11473, -1859, 1506, 1507, 1509, 691, 470, 1261, + 7271, 1263, 11473, 18, 491, 1274, 491, 1269, -1859, -1859, + 7204, 711, 11473, 1276, -1859, -1859, 3000, -1859, -1859, 1270, + 1513, -1859, 3117, -1859, 215, 1284, 1515, 3199, -1859, -1859, + -1859, 24, -1859, 595, -1859, 11473, 222, 4294, 937, -1859, + 1281, 11473, 11473, 6847, 1280, -1859, 489, 1525, 1531, 16372, + 1532, 1250, 16397, 1288, 597, 16422, 600, 1550, 1551, -1859, + -1859, 12749, 1285, 1555, 16447, -1859, 13133, 1319, -1859, 5383, + 16672, -1859, 1554, 341, 7335, -1859, -1859, -1859, -1859, 1340, + -1859, 1557, 1561, 1562, 1563, -1859, -1859, 276, 1564, 1566, + 1567, -1859, -1859, -1859, 1568, -48, 1476, 1569, -1859, -1859, + -1859, -1859, -1859, -1859, -1859, -1859, -1859, 1572, 1328, -1859, + -1859, -1859, -1859, -1859, 11473, 11473, 11473, -1859, -1859, -1859, + 1192, -1859, -1859, -1859, -1859, 11473, 1333, 1326, -1859, -1859, + 11473, 11473, 11473, 491, 281, -1859, -1859, -1859, -1859, 1332, + 1334, 1577, -91, 1579, 11473, -1859, 6847, 16672, 958, 9277, + 9277, 11473, -1859, 9940, 14067, 16472, 7759, 322, 322, 11473, + 11473, -1859, 170, 1331, 16497, -1859, -1859, 14096, 185, -1859, + 1583, 1584, 6847, 276, 276, 276, 276, 276, 6359, 1585, + -1859, -1859, 602, 11473, 3526, 1586, -1859, -1859, 6847, 8003, + 973, 16522, -1859, -1859, -1859, -1859, 9606, -1859, 12749, 11473, + -1859, 12749, 16672, 9850, 7204, 1338, -1859, -1859, -1859, -1859, + 1347, 1341, 11473, 11473, 14125, 11473, 12770, -1859, 12770, 6847, + -1859, -1859, 7204, 11473, 1589, 1593, 25, -1859, 1594, -1859, + 24, 14966, 6847, 12749, 1595, 491, -1859, 1348, 491, 11473, + 13166, 13199, 605, -1859, 11473, 11473, 251, -1859, 1352, -1859, + 1359, 1599, 1600, 1364, 1601, -1859, -1859, 1602, 11473, -1859, + -1859, 11473, 11234, -1859, -1859, 1365, 937, 610, 5078, 1592, + -1859, -1859, -1859, -1859, -1859, 475, -1859, -1859, -1859, -1859, + 1385, 1386, 1402, -1859, 1629, 6847, 14615, 14615, 13232, 14615, + -1859, 1390, 13265, 16547, 14993, -1859, -1859, 9277, 9277, -1859, + 1633, -1859, 16672, 1638, 1406, -1859, 612, 615, 14587, 3701, + 1644, 1410, -1859, -1859, 11473, 1403, 1411, 14154, 15020, 1645, + 6847, 1648, 1415, 11473, -1859, -1859, 620, 195, 211, 220, + 235, 244, 9033, 257, -1859, 1651, 14183, -1859, -1859, 1484, + -1859, 11473, 11473, -1859, -1859, 9277, 3887, 1658, 1421, 14615, + 491, 16672, -1859, -1859, -1859, -1859, 18, -1859, 7204, -1859, + 14212, 1420, 1427, 1428, 1660, 4473, -1859, 1663, 1666, -1859, + -1859, 1424, 1674, 625, -1859, 1675, 1676, -20, 16672, 11473, + 11473, 1436, 6847, 626, 16672, 16572, -1859, -1859, -1859, -1859, + 16597, 13298, -1859, 1104, 1159, 6847, 491, -1859, 11473, 7204, + 40, 9277, 9277, 11473, 1677, 627, -1859, -1859, 11473, 1326, + -1859, 11473, -1859, -1859, 628, 633, -1859, -1859, 6847, 499, + 582, 9277, -1859, -1859, 322, 8486, -1859, -1859, -1859, 1678, + -1859, 1437, 6847, -1859, 14241, 1681, 9277, 276, 276, 276, + 276, 276, -1859, -1859, 11473, 14270, 14299, 636, -1859, -1859, + -1859, -1859, -1859, -1859, 1445, 1683, 1440, -1859, 1685, -1859, + -1859, 24, -1859, 1511, -1859, -1859, -1859, -1859, -1859, 11473, + 13331, 13364, 6847, -1859, 1688, 11473, 1449, -1859, 11473, 1456, + 1457, -1859, -1859, 2725, -1859, 1459, 638, 639, 14328, -1859, + 1461, 13397, 1465, 13430, -1859, 1464, 641, 1469, 276, 6847, + 1690, 1471, 276, 1691, 644, 1473, -1859, 11473, -1859, 1694, + 1565, 12218, 1478, -1859, 649, 282, 284, 318, 323, 330, + 4646, -1859, -1859, 1696, 1697, -1859, -1859, -1859, 1698, -1859, + 1481, 16672, 11473, 11473, 650, -1859, 16672, 13463, -1859, -1859, + 1104, 7204, 1485, -1859, -1859, -1859, 11473, 11473, -1859, 11473, + 9277, 1700, 276, 101, -1859, -1859, 276, 127, -1859, 1703, + -1859, 14357, -1859, 11473, -1859, 430, -1859, 1704, 9277, 9277, + 9277, 9277, 9033, -1859, -1859, -1859, 12770, -1859, 11473, 16622, + 13496, 49, 11473, 1474, -1859, -1859, 13529, 13562, 13595, 657, + -1859, 333, -1859, 340, -1859, -1859, -1859, 4813, 335, 12275, + -1859, 658, 660, 663, 666, 346, 668, 1482, 669, -1859, + 11473, -1859, 6847, 14386, -1859, 11473, 11473, 11473, -1859, 276, + 276, -1859, -1859, -1859, 430, 1707, 1709, 1711, 1712, 9277, + 1714, 1716, 1720, 1486, 16647, 674, 1728, 14415, 14615, 13628, + 365, 374, 443, -1859, -1859, -1859, -1859, 680, -1859, -1859, + -1859, 12749, -1859, 1488, -1859, 1729, -1859, 11473, 11473, 11473, + -1859, 1735, 681, -1859, 1492, 6847, -1859, 14444, 14473, 14502, + -1859, 1737, 12749, 12749, 683, -1859, 1738, 1739, -1859, -1859, + 688, -1859, 1740, -1859, -1859, 1741, 12749, -1859, -1859, -1859 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. @@ -1274,7 +1277,7 @@ static const yytype_int16 yypact[] = means the default is an error. */ static const yytype_uint16 yydefact[] = { - 0, 0, 0, 2, 3, 1, 609, 0, 0, 0, + 0, 0, 0, 2, 3, 1, 611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 0, 0, 192, 0, 0, 193, 0, 194, 0, 0, 0, 0, @@ -1287,10 +1290,10 @@ static const yytype_uint16 yydefact[] = 291, 0, 0, 0, 285, 0, 0, 0, 0, 0, 373, 374, 375, 0, 0, 5, 6, 7, 8, 10, 0, 11, 24, 12, 13, 14, 15, 23, 22, 21, - 16, 0, 17, 18, 19, 20, 0, 25, 0, 610, + 16, 0, 17, 18, 19, 20, 0, 25, 0, 612, 0, 218, 0, 0, 0, 0, 0, 267, 0, 269, 270, 265, 266, 0, 271, 272, 273, 274, 113, 123, - 609, 486, 481, 70, 71, 0, 0, 0, 0, 0, + 611, 486, 481, 70, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, 0, 203, 204, 205, 0, 0, @@ -1298,184 +1301,185 @@ static const yytype_uint16 yydefact[] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 435, 436, 437, 0, 0, 191, 196, 197, 198, + 0, 0, 0, 435, 436, 437, 0, 0, 191, 196, + 197, 198, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 432, 433, 434, 0, 0, 0, 0, + 0, 0, 0, 0, 523, 524, 0, 525, 499, 380, + 440, 443, 304, 500, 481, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 191, 192, 193, 194, 189, 196, + 197, 198, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 488, 0, + 0, 218, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 611, 0, 0, + 218, 0, 0, 370, 0, 0, 0, 200, 201, 0, + 0, 0, 0, 0, 507, 0, 0, 505, 0, 0, + 0, 0, 0, 611, 0, 0, 546, 0, 0, 0, + 0, 263, 264, 0, 563, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 565, 0, + 589, 567, 568, 0, 0, 0, 0, 0, 0, 566, + 0, 0, 0, 0, 283, 284, 0, 218, 0, 218, + 0, 0, 0, 481, 0, 0, 0, 218, 376, 0, + 0, 76, 0, 63, 0, 0, 64, 65, 66, 67, + 68, 69, 70, 71, 0, 0, 0, 0, 0, 0, + 0, 552, 481, 0, 217, 0, 216, 0, 170, 0, + 0, 552, 553, 0, 0, 601, 0, 602, 553, 111, + 111, 0, 479, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 432, 433, 434, 0, 0, 0, 0, 0, 0, - 0, 0, 521, 522, 0, 523, 499, 380, 440, 443, - 304, 500, 481, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 191, 192, 193, 194, 189, 196, 197, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 488, 0, 0, 218, + 0, 0, 0, 540, 541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 609, 0, 0, 218, 0, - 0, 370, 0, 0, 0, 200, 201, 0, 0, 0, - 0, 0, 507, 0, 0, 505, 0, 0, 0, 0, - 0, 609, 0, 0, 544, 0, 0, 0, 0, 263, - 264, 0, 561, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 563, 0, 587, 565, - 566, 0, 0, 0, 0, 0, 0, 564, 0, 0, - 0, 0, 283, 284, 0, 218, 0, 218, 0, 0, - 0, 481, 0, 0, 0, 218, 376, 0, 0, 76, - 0, 63, 0, 0, 64, 65, 66, 67, 68, 69, - 70, 71, 0, 0, 0, 0, 0, 0, 0, 550, - 481, 0, 217, 0, 216, 0, 170, 0, 0, 550, - 551, 0, 0, 599, 0, 600, 551, 111, 111, 0, - 479, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 70, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 538, 539, 0, 0, 0, 0, 0, 0, 0, + 514, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 383, 0, 382, 508, 384, 0, 501, 0, + 0, 481, 0, 516, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 70, 71, 0, 457, + 0, 0, 0, 0, 0, 0, 0, 305, 0, 338, + 338, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 218, 0, 218, 218, 0, 490, 489, 0, 0, 0, + 0, 218, 218, 0, 0, 0, 0, 301, 0, 218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 70, 71, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 514, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 383, 0, - 382, 508, 384, 0, 501, 0, 0, 481, 0, 516, + 0, 340, 0, 0, 0, 0, 0, 218, 244, 0, + 0, 242, 371, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 348, 262, 0, 0, 0, 0, 0, + 218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 287, 286, 0, + 249, 0, 0, 251, 0, 0, 0, 382, 0, 218, + 0, 0, 0, 0, 0, 0, 0, 326, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 70, 71, 0, 457, 0, 0, 0, 0, - 0, 0, 0, 305, 0, 338, 338, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 218, 0, 218, 218, - 0, 490, 489, 0, 0, 0, 0, 218, 218, 0, - 0, 0, 0, 301, 0, 218, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 340, 0, 0, - 0, 0, 0, 218, 244, 0, 0, 242, 371, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 348, - 262, 0, 0, 0, 0, 0, 218, 0, 0, 0, + 80, 72, 73, 0, 0, 0, 260, 38, 256, 0, + 0, 0, 0, 0, 213, 0, 0, 0, 0, 0, + 219, 0, 0, 171, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, + 0, 0, 0, 484, 0, 0, 482, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 332, 0, + 0, 0, 195, 0, 0, 0, 0, 0, 0, 366, + 367, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 287, 286, 0, 249, 0, 0, 251, - 0, 0, 0, 382, 0, 218, 0, 0, 0, 0, - 0, 0, 0, 326, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 80, 72, 73, 0, - 0, 0, 260, 38, 256, 0, 0, 0, 0, 0, - 213, 0, 0, 0, 0, 0, 219, 0, 0, 171, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 481, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 112, 0, 0, 0, 484, - 0, 0, 482, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 438, 456, 0, 0, 0, 0, 517, + 518, 0, 0, 0, 0, 0, 475, 0, 381, 502, + 0, 0, 0, 0, 510, 0, 400, 399, 397, 398, + 393, 395, 394, 396, 402, 401, 386, 385, 0, 387, + 509, 388, 391, 389, 390, 392, 482, 0, 0, 483, + 460, 0, 526, 0, 0, 0, 0, 0, 0, 0, + 0, 336, 0, 0, 0, 0, 369, 0, 0, 0, + 0, 368, 0, 218, 0, 0, 0, 0, 0, 492, + 491, 0, 0, 0, 0, 0, 0, 0, 295, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 332, 0, 0, 0, 195, 0, - 0, 0, 0, 0, 0, 366, 367, 0, 0, 0, + 0, 0, 355, 0, 0, 243, 0, 0, 0, 237, + 0, 0, 0, 0, 365, 0, 0, 0, 381, 506, + 0, 0, 0, 0, 0, 0, 0, 0, 288, 289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 592, 0, + 0, 0, 477, 0, 0, 248, 252, 250, 254, 0, + 387, 0, 482, 460, 613, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 87, 0, 0, 381, 0, 63, + 0, 0, 0, 0, 79, 0, 63, 64, 0, 0, + 0, 482, 0, 0, 460, 0, 0, 0, 189, 0, + 0, 0, 608, 28, 26, 27, 0, 0, 0, 0, + 0, 483, 556, 29, 0, 0, 257, 603, 604, 0, + 605, 556, 74, 114, 75, 124, 485, 487, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 481, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 438, 456, 0, - 0, 0, 0, 517, 518, 0, 0, 0, 0, 0, - 475, 0, 381, 502, 0, 0, 0, 0, 510, 0, - 400, 399, 397, 398, 393, 395, 394, 396, 402, 401, - 386, 385, 0, 387, 509, 388, 391, 389, 390, 392, - 482, 0, 0, 483, 460, 0, 524, 0, 0, 0, - 0, 0, 0, 0, 0, 336, 0, 0, 0, 0, - 369, 0, 0, 0, 0, 368, 0, 218, 0, 0, - 0, 0, 0, 492, 491, 0, 0, 0, 0, 0, - 0, 0, 295, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 355, 0, 0, 243, - 0, 0, 0, 237, 0, 0, 0, 0, 365, 0, - 0, 0, 381, 506, 0, 0, 0, 0, 0, 0, - 0, 0, 288, 289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 590, 0, 0, 0, 477, 0, 0, 248, - 252, 250, 254, 0, 387, 0, 482, 460, 611, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, - 0, 381, 0, 63, 0, 0, 0, 0, 79, 0, - 63, 64, 0, 0, 0, 482, 0, 0, 460, 0, - 0, 0, 189, 0, 0, 0, 606, 28, 26, 27, - 0, 0, 0, 0, 0, 483, 554, 29, 0, 0, - 257, 601, 602, 0, 603, 554, 74, 114, 75, 124, - 485, 487, 130, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 542, 543, 206, 9, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 426, + 413, 0, 415, 416, 417, 418, 419, 539, 420, 421, + 422, 0, 0, 0, 531, 530, 529, 0, 0, 0, + 536, 0, 472, 0, 0, 0, 474, 0, 0, 0, + 128, 455, 513, 512, 199, 0, 0, 441, 538, 446, + 0, 452, 0, 0, 0, 0, 503, 0, 0, 453, + 0, 515, 0, 0, 0, 0, 445, 444, 467, 70, + 71, 0, 0, 0, 0, 0, 0, 0, 381, 334, + 339, 337, 0, 347, 0, 148, 149, 199, 381, 0, + 0, 0, 0, 238, 0, 253, 255, 0, 0, 0, + 207, 209, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 308, 0, 292, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 218, 0, 341, 354, + 0, 0, 0, 239, 0, 0, 0, 0, 202, 0, + 0, 0, 0, 0, 0, 0, 0, 245, 0, 0, + 0, 0, 579, 0, 586, 575, 576, 577, 0, 591, + 590, 0, 0, 580, 581, 582, 588, 595, 594, 0, + 139, 0, 569, 0, 571, 0, 0, 0, 564, 0, + 247, 0, 0, 0, 0, 0, 0, 0, 327, 0, + 0, 0, 377, 0, 609, 0, 101, 63, 0, 0, + 0, 0, 0, 0, 0, 95, 0, 0, 0, 0, + 0, 0, 0, 0, 561, 48, 0, 0, 0, 61, + 0, 39, 40, 41, 42, 43, 0, 445, 444, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 555, 554, 0, 0, 0, 0, 0, 0, 0, + 135, 0, 131, 132, 0, 0, 0, 0, 0, 0, + 0, 155, 155, 0, 0, 0, 0, 0, 151, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 344, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 540, 541, 206, 9, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 426, 413, 0, 415, 416, 417, 418, - 419, 537, 420, 421, 422, 0, 0, 0, 529, 528, - 527, 0, 0, 0, 534, 0, 472, 0, 0, 0, - 474, 0, 128, 455, 513, 512, 199, 0, 0, 441, - 536, 446, 0, 452, 0, 0, 0, 0, 503, 0, - 0, 453, 0, 515, 0, 0, 0, 0, 445, 444, - 467, 70, 71, 0, 0, 0, 0, 0, 0, 0, - 381, 334, 339, 337, 0, 347, 0, 148, 149, 199, - 381, 0, 0, 0, 0, 238, 0, 253, 255, 0, - 0, 0, 207, 209, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 308, 0, 292, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 218, 0, - 341, 354, 0, 0, 0, 239, 0, 0, 0, 0, - 202, 0, 0, 0, 0, 0, 0, 0, 0, 245, - 0, 0, 0, 0, 577, 0, 584, 573, 574, 575, - 0, 589, 588, 0, 0, 578, 579, 580, 586, 593, - 592, 0, 139, 0, 567, 0, 569, 0, 0, 0, - 562, 0, 247, 0, 0, 0, 0, 0, 0, 0, - 327, 0, 0, 0, 377, 0, 607, 0, 101, 63, - 0, 0, 0, 0, 0, 0, 0, 95, 0, 0, - 0, 0, 0, 0, 0, 0, 559, 48, 0, 0, - 0, 61, 0, 39, 40, 41, 42, 43, 0, 445, - 444, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 553, 552, 0, 0, 0, 0, 0, - 0, 0, 135, 0, 131, 132, 0, 0, 0, 0, - 0, 0, 0, 155, 155, 0, 0, 0, 0, 0, - 151, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 344, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 520, 0, 0, 0, 0, 0, + 0, 0, 520, 521, 522, 0, 0, 0, 0, 0, 475, 476, 0, 448, 0, 0, 0, 511, 403, 504, - 461, 459, 0, 458, 0, 0, 525, 0, 0, 0, + 461, 459, 0, 458, 0, 0, 527, 0, 0, 0, 0, 0, 0, 0, 0, 0, 346, 0, 0, 0, 0, 0, 0, 0, 246, 0, 0, 0, 0, 0, 0, 0, 313, 0, 0, 312, 0, 315, 0, 317, 0, 302, 309, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 356, 0, 241, 240, - 372, 0, 0, 35, 36, 0, 0, 0, 0, 545, + 372, 0, 0, 35, 36, 0, 0, 0, 0, 547, 0, 0, 0, 278, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 477, 478, 571, + 0, 0, 0, 0, 0, 0, 0, 477, 478, 573, 0, 461, 0, 0, 218, 328, 0, 329, 218, 0, - 0, 560, 0, 86, 0, 0, 0, 0, 84, 91, - 93, 0, 548, 0, 99, 0, 0, 0, 0, 81, + 0, 562, 0, 86, 0, 0, 0, 0, 84, 91, + 93, 0, 550, 0, 99, 0, 0, 0, 0, 81, 0, 0, 0, 0, 0, 34, 461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, - 31, 0, 555, 0, 0, 32, 0, 555, 604, 0, + 31, 0, 557, 0, 0, 32, 0, 557, 606, 0, 115, 120, 0, 0, 0, 134, 137, 138, 480, 0, 77, 0, 0, 0, 0, 78, 157, 0, 0, 0, 0, 158, 173, 174, 0, 0, 0, 0, 159, 184, 175, 179, 180, 176, 177, 178, 165, 0, 0, 414, - 423, 424, 425, 530, 0, 0, 0, 470, 471, 473, + 423, 424, 425, 532, 0, 0, 0, 470, 471, 473, 129, 439, 469, 442, 447, 0, 0, 475, 185, 454, - 0, 70, 71, 0, 466, 462, 464, 531, 181, 0, + 0, 70, 71, 0, 466, 462, 464, 533, 181, 0, 0, 0, 151, 0, 0, 345, 0, 150, 0, 0, 0, 0, 261, 0, 0, 0, 0, 218, 218, 0, 0, 314, 499, 0, 0, 316, 318, 0, 0, 296, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 212, 182, 0, 0, 0, 0, 162, 163, 0, 0, - 0, 0, 102, 103, 104, 108, 0, 585, 0, 0, - 583, 0, 594, 0, 0, 140, 141, 591, 568, 570, + 0, 0, 102, 103, 104, 108, 0, 587, 0, 0, + 585, 0, 596, 0, 0, 140, 141, 593, 570, 572, 0, 0, 0, 0, 0, 0, 326, 330, 326, 0, - 378, 85, 63, 0, 0, 0, 0, 83, 0, 546, - 0, 0, 0, 0, 0, 0, 597, 596, 0, 0, + 378, 85, 63, 0, 0, 0, 0, 83, 0, 548, + 0, 0, 0, 0, 0, 0, 599, 598, 0, 0, 0, 0, 0, 497, 0, 0, 466, 258, 462, 259, - 0, 0, 0, 0, 0, 223, 220, 0, 0, 558, - 556, 0, 0, 116, 121, 0, 0, 0, 538, 539, + 0, 0, 0, 0, 0, 223, 220, 0, 0, 560, + 558, 0, 0, 116, 121, 0, 0, 0, 540, 541, 133, 349, 350, 351, 352, 156, 160, 161, 166, 183, 0, 0, 0, 168, 0, 0, 0, 0, 0, 0, - 449, 0, 0, 0, 0, 526, 468, 0, 0, 167, + 449, 0, 0, 0, 0, 528, 468, 0, 0, 167, 0, 186, 335, 0, 0, 187, 0, 0, 0, 0, 0, 0, 496, 495, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 235, 234, 0, 0, 0, 0, 0, 0, 0, 0, 225, 0, 0, 353, 37, 0, - 543, 0, 0, 280, 279, 0, 0, 0, 0, 0, - 0, 143, 144, 147, 146, 145, 0, 572, 0, 608, + 545, 0, 0, 280, 279, 0, 0, 0, 0, 0, + 0, 143, 144, 147, 146, 145, 0, 574, 0, 610, 0, 0, 0, 0, 0, 0, 96, 0, 0, 97, - 549, 0, 0, 0, 88, 0, 0, 0, 44, 0, + 551, 0, 0, 0, 88, 0, 0, 0, 44, 0, 0, 0, 0, 0, 46, 0, 224, 221, 222, 33, - 0, 0, 605, 128, 139, 0, 0, 136, 0, 0, - 0, 0, 0, 0, 0, 0, 532, 533, 0, 475, + 0, 0, 607, 128, 139, 0, 0, 136, 0, 0, + 0, 0, 0, 0, 0, 0, 534, 535, 0, 475, 450, 0, 463, 465, 0, 0, 169, 190, 0, 342, 342, 0, 109, 110, 218, 0, 210, 211, 303, 0, 310, 0, 0, 218, 0, 0, 0, 0, 0, 0, 0, 0, 215, 214, 0, 0, 0, 0, 105, 106, - 576, 582, 581, 142, 0, 0, 0, 331, 0, 92, - 94, 0, 100, 0, 82, 598, 89, 90, 49, 0, - 0, 0, 0, 498, 0, 0, 463, 557, 0, 0, - 0, 118, 595, 0, 125, 0, 0, 0, 0, 172, + 578, 584, 583, 142, 0, 0, 0, 331, 0, 92, + 94, 0, 100, 0, 82, 600, 89, 90, 49, 0, + 0, 0, 0, 498, 0, 0, 463, 559, 0, 0, + 0, 118, 597, 0, 125, 0, 0, 0, 0, 172, 0, 0, 0, 0, 306, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 494, 0, 320, 0, 0, 297, 0, 226, 0, 0, 0, 0, 0, 0, - 0, 542, 281, 0, 0, 364, 218, 379, 0, 547, + 0, 544, 281, 0, 0, 364, 218, 379, 0, 549, 0, 45, 0, 0, 0, 62, 47, 0, 117, 122, 128, 0, 0, 153, 154, 152, 0, 0, 451, 0, 0, 0, 0, 0, 343, 357, 0, 0, 358, 0, @@ -1488,7 +1492,7 @@ static const yytype_uint16 yydefact[] = 0, 319, 298, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 231, 232, 233, 0, 227, 333, - 50, 0, 57, 0, 268, 0, 535, 0, 0, 0, + 50, 0, 57, 0, 268, 0, 537, 0, 0, 0, 300, 0, 0, 51, 0, 0, 276, 0, 0, 0, 228, 0, 0, 0, 0, 519, 0, 0, 54, 52, 0, 55, 0, 359, 360, 0, 0, 60, 58, 56 @@ -1497,35 +1501,35 @@ static const yytype_uint16 yydefact[] = /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -1832, -1832, -1832, -1832, 383, -1832, -1832, -1832, -1832, -343, - -1832, -1832, -1832, -1832, -1832, -1832, -1832, -1832, -1832, -1832, - -1832, -1832, -712, -131, 4557, 3680, -1832, 1270, -1832, -1832, - -1832, -1832, -1832, -1832, -1831, -1832, 352, 174, -152, -1832, - -100, -1832, 113, 384, 1746, -1832, 702, -49, -1832, -1832, - 3, -615, -312, -1832, -1832, -1832, -1832, -1832, -1832, -1832, - -1832, 1747, -1832, -1832, -1832, -1832, -1206, -1210, 1748, -1693, - 1770, -1832, -1832, -1832, 1182, -1832, -136, -1832, -1832, -1832, - -1832, 2404, -1832, -1832, -1395, 278, 1776, -1832, 2, -693, - -1832, -1832, 123, -1832, -1654, 646, -172, 2816, 3071, -306, - 64, -1832, 1801, -71, -1832, -1832, 88, 254, -1642, -129, - 1034, -1832, -3 + -1859, -1859, -1859, -1859, 399, -1859, -1859, -1859, -1859, -329, + -1859, -1859, -1859, -1859, -1859, -1859, -1859, -1859, -1859, -1859, + -1859, -1859, -713, -101, 2253, 3158, -1859, 1291, -1859, -1859, + -1859, -1859, -1859, -1859, -1858, -1859, 345, 173, -140, -1859, + -99, -1859, 113, 386, 1753, -1859, 815, -49, -1859, -1859, + 16, -615, -256, -1859, -1859, -1859, -1859, -1859, -1859, -1859, + -1859, 1756, -1859, -1859, -1859, -1859, -1222, -1212, 1757, -1701, + 1758, -1859, -1859, -1859, 1164, -1859, -158, -1859, -1859, -1859, + -1859, 2562, -1859, -1859, -1401, 258, 1763, -1859, 0, -701, + -1859, -1859, -64, -1859, -1656, 881, -161, 3190, 9, -308, + 43, -1859, 100, -55, -1859, -1859, 68, 229, -1678, -145, + 1004, -1859, -3 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { - -1, 2, 3, 115, 1050, 116, 117, 1034, 1867, 1873, - 1323, 1530, 2020, 2152, 1324, 2123, 2170, 1325, 2154, 1326, - 1327, 1534, 433, 585, 586, 1120, 118, 766, 457, 1883, - 2030, 1884, 458, 1757, 1396, 1353, 1354, 1355, 1494, 1695, - 1696, 1186, 1587, 1578, 746, 597, 270, 271, 348, 199, - 272, 443, 444, 122, 123, 124, 125, 126, 127, 128, - 129, 273, 1218, 2055, 2114, 930, 1214, 1215, 274, 1013, - 275, 133, 1425, 1184, 905, 945, 1990, 134, 135, 136, - 137, 276, 277, 1142, 1157, 1279, 278, 771, 279, 894, - 770, 460, 612, 316, 1732, 355, 356, 281, 555, 363, - 1310, 1523, 453, 449, 1272, 990, 1567, 1725, 1726, 975, - 455, 139, 411 + -1, 2, 3, 115, 1056, 116, 117, 1040, 1877, 1883, + 1331, 1540, 2030, 2162, 1332, 2133, 2180, 1333, 2164, 1334, + 1335, 1544, 435, 589, 590, 1126, 118, 770, 459, 1893, + 2040, 1894, 460, 1767, 1406, 1361, 1362, 1363, 1504, 1705, + 1706, 1194, 1597, 1588, 750, 601, 272, 273, 350, 199, + 274, 445, 446, 122, 123, 124, 125, 126, 127, 128, + 129, 275, 1226, 2065, 2124, 936, 1222, 1223, 276, 1019, + 277, 133, 1435, 1192, 911, 951, 2000, 134, 135, 136, + 137, 278, 279, 1150, 1165, 1287, 280, 775, 281, 900, + 774, 462, 616, 318, 1742, 357, 358, 283, 559, 365, + 1318, 1533, 455, 451, 1280, 996, 1577, 1735, 1736, 981, + 457, 139, 413 }; /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If @@ -1533,1288 +1537,1271 @@ static const yytype_int16 yydefgoto[] = number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_int16 yytable[] = { - 140, 607, 925, 926, 1452, 1616, 121, 623, 1816, 434, - 1024, 301, 1454, 1851, 160, 1852, 1007, 160, 1032, 488, - 162, 404, 160, 335, 454, 161, 646, 495, 641, 361, - 160, 143, 406, 1693, 399, 1317, 403, 174, 178, 1030, - 536, 559, 722, 1447, 1514, 1038, 1252, 1449, 147, 282, - 2101, 1844, 1969, 365, 1484, 306, 340, 416, 341, 1585, - 428, 429, 1056, 1770, 4, 287, 752, 287, -553, 439, - 1065, 615, 616, 311, 312, 578, 579, 761, 339, 160, - 307, 580, 1771, 1350, 735, 313, 282, 5, 288, 314, - 1041, 364, 920, 698, 462, 701, 308, 309, 1207, 615, - 616, 144, 400, 713, 461, 336, 764, 1586, 428, 429, - 1576, 581, 765, 149, 1886, 1208, -558, 594, 595, 596, - 927, 1895, 1299, 1209, 1210, 1211, 581, 615, 616, 1212, - 1213, 615, 616, 2082, 145, 615, 616, 440, 1207, 706, - 615, 616, 450, 450, 442, 141, 342, 1047, 931, 142, - 456, 2084, 1435, 1485, 1486, 1208, 1453, 1439, 414, 637, - 638, 639, 415, 1209, 1210, 1211, 163, 467, 164, 1212, - 1213, 1160, 1023, 615, 616, 1155, 653, 297, 1299, 1550, - 298, 146, 299, 450, 1712, 615, 616, 750, 282, 315, - 317, 282, 320, 300, 1813, 751, 282, 282, 450, 2073, - 1318, 1319, 1320, 1321, 1448, 163, 1926, 164, 1450, 337, - 1299, 615, 616, 1451, 150, 615, 616, 723, 724, 1515, - 1516, 153, 1781, 1694, 615, 616, 114, 195, 151, 114, - 196, 767, 1927, 197, 114, 114, 1928, 765, 615, 616, - 345, 114, 114, 346, 1452, 1929, 198, 152, 282, 1031, - 425, 426, 427, 1659, 1986, 521, 347, 522, 727, 1930, - 728, 989, 282, 190, 405, 282, 557, 338, 428, 429, - 642, 556, 643, 362, 1309, 407, 142, 175, 179, 154, - 1322, 282, 282, 537, 560, 282, 282, 282, 282, 1253, - 148, 114, 2102, 366, 916, 417, 918, 919, 282, 418, - 155, 753, 282, 754, 364, 1987, 1988, 755, 2024, 1300, - 1303, 1989, 762, 932, 754, 428, 429, 441, 763, 736, - 163, 737, 164, -551, 302, 738, 282, 303, 282, 282, - 282, 951, 424, 425, 426, 427, 615, 616, 561, 163, - 626, 164, 428, 429, 627, 282, 582, 156, 583, 1130, - 717, 282, 584, 171, 969, 428, 429, 428, 429, 615, - 616, 582, 1331, 583, 1285, 1302, -554, 584, 853, 1048, - 428, 429, 1049, 2097, 707, 802, 708, 615, 616, 803, - 709, 157, 424, 425, 426, 427, 615, 616, 424, 425, - 426, 427, 321, 1005, 424, 425, 426, 427, 615, 616, - 727, 1048, 728, 845, 1049, 428, 429, 1931, 1148, 450, - 282, 428, 429, 1277, 282, 282, 1278, 428, 429, 2058, - 424, 425, 426, 427, 158, 615, 616, 756, 615, 616, - 282, 615, 616, 610, 611, 757, 664, 739, 142, 615, - 616, 619, 624, 615, 616, 1207, 2059, 617, 2125, 2060, - 159, 65, 66, 67, 68, 428, 429, 71, 772, 1399, - 2061, 1400, 1208, 172, 2062, 1412, 80, 615, 616, 83, - 1209, 1210, 1211, 173, 1410, 859, 1212, 1213, 615, 616, - 176, 1207, 322, 759, 615, 616, 323, 282, 2109, 615, - 616, 760, 324, 325, 166, 326, 327, 167, 1208, 2110, - 168, 2164, 169, 177, 1982, 2119, 1209, 1210, 1211, 180, - 2148, 282, 1212, 1213, 292, 328, 1140, 293, 282, 835, - 294, 181, 295, 450, 760, 450, 282, 450, 450, 456, - 1642, 1643, 849, 44, 615, 616, 282, 282, 282, 450, - 450, 282, 162, 1151, 162, 977, 282, 858, 1152, 860, - 618, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 575, 576, 577, 578, 579, 311, - 312, 182, 282, 580, 615, 616, 615, 616, 890, 1809, - 163, 313, 164, 863, 1497, 319, 1154, 803, 191, 1155, - 1501, 1025, 625, 1341, 183, 2149, 2112, 1207, 282, 282, - 898, 803, 561, 184, 803, 1196, 573, 574, 704, 576, - 577, 578, 579, 1464, 1208, 899, 992, 580, 1346, 803, - 442, 442, 1209, 1210, 1211, 331, 803, 332, 1212, 1213, - 704, 576, 577, 578, 579, 1536, 727, 289, 728, 580, - 290, 1171, 291, 1172, 760, 1832, 282, 282, 282, 1552, - 727, 727, 728, 728, 727, 1557, 728, 1958, 1255, 1275, - 1991, 1992, 803, 942, 1009, 1959, 1989, 803, 803, 456, - 450, 456, 450, 450, 450, 450, 450, 450, 185, 450, - 450, 450, 450, 991, 1424, 450, 450, 450, 162, 997, - 1015, 193, 282, 996, 1016, 1043, 1158, 1735, 280, 1703, - 803, -555, 186, 1006, 1191, 120, 1192, 1078, 803, 1237, - 803, 187, 2150, 803, 1238, 1636, 282, 1239, 803, 1281, - 1312, 803, 192, 803, 803, 1387, 282, 1394, 194, 803, - 1409, 803, 1035, 1417, 803, 188, 1432, 803, 923, 924, - 803, 1548, 1598, 611, 189, 803, 803, 1629, 282, 1052, - 200, 803, 1630, 201, 282, 1719, 803, 456, 1063, 1720, - 1742, 296, 1170, 1067, 803, 450, 1744, 1284, 284, 1285, - 803, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 283, - 1825, 1871, 1887, 580, 803, 1872, 1888, 1909, 282, 285, - 282, 803, 1713, 1910, 1925, 1955, 1964, 803, 1872, 760, - 1965, 727, 286, 728, 1722, 562, 563, 564, 565, 566, - 567, 568, 569, 570, 571, 572, 573, 574, 801, 576, - 577, 578, 579, 282, 1980, 305, 1188, 580, 1872, 727, - 1984, 728, 436, 282, 803, 310, 496, 436, 436, 2088, - 1985, 304, 2013, 2033, 803, 436, 803, 803, 562, 563, - 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, - 574, 704, 576, 577, 578, 579, 330, 2034, 1452, 282, - 580, 803, 1621, 2041, 1622, 2049, 1833, 1872, 436, 803, - 1301, 1304, 282, 1702, 2057, 1703, 2071, 280, 803, 318, - 1872, 282, 2108, 436, 333, 2115, 803, 2116, 2132, 803, - 282, 803, 2117, 2118, 2120, 2122, 803, 803, 803, 1965, - 2143, 2151, 1452, 2161, 1872, 803, 2172, 2162, 1685, 1686, - 1872, 2175, 160, 372, 593, 2176, 727, 329, 728, 729, - 334, 727, 533, 728, 895, 343, 1794, 600, 1795, 615, - 616, 605, 1305, 344, 349, 540, 541, 350, 351, 357, - 358, 371, 359, 360, 367, 368, 369, 370, 401, 412, - 413, 419, 446, 445, 373, 374, 375, 376, 377, 378, - 379, 380, 381, 420, 142, 459, 461, 382, 383, 384, - 385, 463, 464, 465, 466, 386, 387, 388, 471, 475, - 389, 489, 390, 1522, 494, 529, 532, -192, -193, -194, - 539, 538, 542, 282, 545, 391, 546, 547, 392, 558, - 590, 591, 292, 415, 1311, 293, 598, 601, 294, 282, - 295, 604, 1805, 1806, 606, 608, 609, 1411, 1413, 628, - 629, 44, 282, 1199, 630, 631, 632, 450, 644, 633, - 1205, 634, 640, 647, 1216, 645, 648, 659, 422, 649, - 650, 651, 652, 714, 715, 654, 655, 656, 660, 692, - 666, 667, 675, 676, 677, 688, 689, 282, 282, 725, - 282, 282, 282, 691, 282, 282, 282, 282, 282, 282, - 282, 282, 282, 282, 1482, 693, 282, 564, 565, 566, - 567, 568, 569, 570, 571, 572, 573, 574, 704, 576, - 577, 578, 579, 694, 436, 695, 696, 580, 699, 697, - 716, 700, 719, 726, 718, 731, 393, 394, 395, 733, - 734, 141, 769, 740, 282, 450, 450, 396, 773, 778, - 794, 397, 799, 398, 114, 805, 747, 806, 807, 836, - 846, 580, 866, 867, 864, 893, 282, 903, 907, 904, - 910, 914, 915, 917, 944, 946, 963, 947, 428, 429, - 949, 958, 282, 282, 282, 842, -552, 967, 1537, 970, - 1014, 999, 1001, 1008, 1018, 593, 1019, 854, 1027, 1026, - 1028, 1039, 1706, 1040, 1045, 1055, 1708, 1071, 1411, 1413, - 1057, 1060, 1362, 1066, 1068, 1072, 1079, 1080, 1081, 1083, - 1084, 1085, 1087, 1088, 1089, 1718, 1090, 1091, 1092, 1093, - 1094, 1095, 1096, 1099, 1103, 1128, 282, 1137, 436, 1129, - 436, 442, 436, 436, 436, 1144, 1138, 1139, 1147, 1153, - 1159, 282, 282, 282, 436, 436, 1163, 1162, 1175, 1176, - 1167, 1177, 282, 1183, 1185, 1194, 1202, 450, 1203, 1206, - 1228, 450, 1229, 1231, 1247, 1244, 1245, 1246, 1258, 1259, - 450, 1260, 450, 1263, 1271, 450, 1274, 1280, 1273, 1561, - 732, 1566, 1283, 1287, 1288, 1286, 1289, 1292, 1293, 1294, - 282, 1298, 1307, 1308, 1328, 1342, 1313, 1314, 1334, 1995, - 1335, 1336, 1345, 1337, 1349, 1352, 364, 562, 563, 564, - 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, - 704, 576, 577, 578, 579, 747, 1348, 450, 1365, 580, - 1369, 1483, 282, 1381, 282, 567, 568, 569, 570, 571, - 572, 573, 574, 704, 576, 577, 578, 579, 747, 282, - 1395, -195, 580, 1403, 1421, 1422, 1423, 1426, 1428, 1427, - 1429, 1430, 282, 1431, 1433, 1020, 282, 1441, 1440, 1444, - 1445, 1446, 1455, 1456, 436, 436, 436, 436, 436, 436, - 436, 436, 436, 1714, 436, 436, 436, 436, 1457, 1458, - 436, 436, 436, 1459, 1460, 1461, 1462, 1463, 1727, 1727, - 747, 1467, 1468, 747, 1469, 1470, 1471, 1472, 1473, 1474, - 1479, 1487, 1492, 1499, 1860, 747, 1493, 1513, 282, 282, - 282, 1502, 1504, 1500, 1508, 1518, 282, 1519, 1510, 1701, - 1521, 1524, 1525, 1529, 1531, 1533, 1532, 1535, 1547, 1549, - 1555, 282, 1570, 1553, 1575, 1042, 1577, 1044, 1581, 1569, - 1582, 1583, 282, 1588, 1589, 1568, 1590, 1591, 1592, 1593, - 282, 1594, 436, 1595, 282, 1596, 1597, 1607, 1614, 1618, - 436, 565, 566, 567, 568, 569, 570, 571, 572, 573, - 574, 704, 576, 577, 578, 579, 1624, 1628, 1754, 1634, - 580, 1639, 1635, 1786, 1640, 562, 563, 564, 565, 566, - 567, 568, 569, 570, 571, 572, 573, 574, 704, 576, - 577, 578, 579, 1641, 1647, 1648, 1649, 580, 364, 1650, - 1655, 1656, 1671, 1662, 456, 456, 1663, 1664, 1665, 1666, - 282, 1670, 1667, 1676, 1677, 1673, 1678, 1682, 1683, 749, - 1684, 1688, 1698, 1691, 1278, 1709, 1705, 1710, 450, 1715, - 1182, 1716, 1729, 1734, 1736, 1737, 282, 1739, 1741, 1745, - 1746, 282, 1748, 1749, 1752, 1755, 1761, 1762, 1763, 1764, - 1766, 1767, 1800, 1768, 1769, 1772, 1658, 1773, 1774, 1775, - 1780, 1155, 1787, 1789, 1788, 1791, 1810, 1814, 1815, 1824, - 1828, 1846, 1848, 1856, 1863, 1847, 1857, 1859, 760, 1864, - -556, 1876, 1877, 1878, 1879, 1786, 1890, 1885, 1894, 1891, - 1892, 2001, 1906, 1900, 1893, 1837, 1907, 1908, 747, 1913, - 747, 747, 1842, 1845, 1914, 1920, 1916, 1380, 1917, 1922, - 1932, 1923, 1939, 282, 747, 1934, 282, 282, 1940, 1949, - 1946, 1854, 1951, 1947, 1948, 2018, 1952, 1953, 1954, 1956, - 442, 442, 1957, 747, 1979, 1998, 1962, 2003, 1999, 282, - 2014, 2015, 1295, 2017, 2016, 282, 2025, 2019, -557, 2045, - 2032, 747, 2048, 2028, 2038, 282, 2052, 2029, 1315, 2050, - 2036, 2053, 2064, 2040, 2065, 450, 2067, 2042, 450, 2046, - 2080, 2056, 2085, 2090, 2068, 2133, 2134, 2135, 2104, 2075, - 1765, 2136, 2138, 2139, 2066, 2121, 282, 747, 2140, 2144, - 2141, 2156, 2155, 1311, 2160, 2163, 2168, 364, 2173, 282, - 456, 2174, 2177, 2178, 1551, 2098, 1363, 1364, 768, 1366, - 1367, 1368, 1970, 1370, 1371, 1372, 1373, 1374, 1375, 1376, - 1377, 1378, 1379, 1760, 2089, 1790, 1943, 1610, 1579, 119, - 130, 131, 436, 456, 562, 563, 564, 565, 566, 567, - 568, 569, 570, 571, 572, 573, 574, 704, 576, 577, - 578, 579, 282, 132, 1993, 1700, 580, 1944, 906, 138, - 1858, 1843, 1728, 1391, 282, 282, 1817, 1818, 1819, 1820, - 1821, 1823, 0, 0, 1062, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1404, 0, 282, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1974, 282, - 0, 1418, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 282, 0, 0, 0, 0, 0, 0, 0, - 436, 436, 562, 563, 564, 565, 566, 567, 568, 569, - 570, 571, 572, 573, 574, 704, 576, 577, 578, 579, - 0, 0, 0, 0, 580, 0, 0, 0, 0, 282, - 0, 0, 0, 0, 0, 1465, 0, 0, 0, 0, - 0, 0, 282, 0, 0, 0, 0, 1975, 282, 282, - 1476, 1477, 1478, 0, 0, 0, 0, 0, 747, 0, - 0, 0, 0, 0, 0, 282, 0, 0, 282, 0, - 0, 0, 0, 0, 0, 0, 0, 442, 0, 282, - 0, 0, 0, 282, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1509, - 0, 438, 0, 0, 0, 0, 448, 451, 364, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 282, - 2074, 0, 436, 0, 0, 0, 436, 0, 0, 0, - 0, 0, 0, 0, 0, 436, 0, 436, 0, 0, - 436, 0, 0, 0, 0, 0, 282, 483, 0, 1503, - 0, 0, 0, 0, 0, 0, 0, 0, 1565, 0, - 0, 0, 497, 0, 0, 0, 0, 0, 0, 0, - 0, 1580, 0, 0, 0, 1584, 0, 0, 0, 0, + 140, 611, 317, 319, 1464, 322, 931, 932, 456, 1626, + 1462, 303, 1013, 1030, 160, 1861, 1826, 1862, 1029, 121, + 162, 1038, 1703, 161, 1307, 1854, 645, 337, 363, 160, + 490, 726, 1325, 1260, 1524, 1979, 406, 160, 497, 436, + 408, 1044, 1457, 1459, 160, 1595, 540, 563, 1780, 284, + 401, 754, 405, 418, 147, 2111, 289, 1494, 1062, 755, + 174, 178, 342, 367, 343, 627, 1071, 1781, 163, 4, + 164, 1358, 760, 289, 585, 430, 431, 1163, 341, 290, + 761, 756, 765, -555, 650, 441, 284, 5, 1896, 1215, + 463, 366, 1215, 1596, 1586, 160, 1047, 308, 430, 431, + 739, 333, 402, 334, 619, 620, 1216, 2092, 1422, 1216, + 464, 338, 585, 143, 1217, 1218, 1219, 1217, 1218, 1219, + 1220, 1221, 309, 1220, 1221, 926, 710, 619, 620, 1905, + 598, 599, 600, 2094, 619, 620, 144, 442, 310, 311, + 1053, 763, 452, 452, 619, 620, 149, 1560, 933, 764, + 458, 702, 1146, 705, 344, 937, 150, 444, 1495, 1496, + 764, 717, 619, 620, 1036, 1445, 145, 469, 347, 1168, + 768, 348, 641, 642, 643, 771, 769, 1349, 565, 1449, + 146, 769, 2083, 452, 349, 807, 416, 151, 284, 657, + 417, 284, 536, 537, 619, 620, 284, 284, 452, 1326, + 1327, 1328, 1329, 495, 1461, 1458, 1460, 1669, 727, 728, + 621, 1525, 1526, 1307, 1704, 339, 1159, 1354, 619, 620, + 152, 1160, 1722, 619, 620, 807, 1791, 1968, 114, 1307, + 426, 427, 428, 429, 622, 1969, 426, 427, 428, 429, + 440, 114, 114, 114, 1463, 450, 453, 153, 614, 615, + 284, 114, 1462, 430, 431, 154, 623, 628, 114, 430, + 431, 630, 1996, 995, 284, 631, 155, 284, 561, 1310, + 646, 560, 647, 340, 364, 1317, 142, 156, 1261, 1330, + 731, 407, 732, 284, 284, 409, 485, 284, 284, 284, + 284, 541, 564, 419, 157, 592, 593, 420, 148, 2112, + 284, 499, 175, 179, 284, 368, 366, 430, 431, 114, + 163, 586, 164, 587, 1308, 1311, 2034, 588, 757, 766, + 758, 758, 619, 620, 759, 767, 443, 163, 284, 164, + 284, 284, 284, 430, 431, 619, 620, 740, 158, 741, + 639, -553, 731, 742, 732, 430, 431, 284, 171, 586, + 1156, 587, 1136, 284, 922, 588, 924, 925, 159, 430, + 431, 619, 620, 711, 1054, 712, 141, 1055, 721, 713, + 142, 1054, 172, 938, 1055, 2107, 1037, 427, 428, 429, + 323, 173, 166, 859, 731, 167, 732, 191, 168, 849, + 169, 957, 764, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, + 583, 452, 284, 176, 975, 584, 284, 284, 177, 619, + 620, 1819, 619, 620, 715, 426, 427, 428, 429, 619, + 620, 668, 284, 142, 426, 427, 428, 429, 629, 743, + 1823, 426, 427, 428, 429, 619, 620, 806, 430, 431, + 1936, 807, 190, 1011, 619, 620, 2135, 430, 431, 1409, + 776, 1410, 65, 66, 67, 68, 1937, 180, 71, 619, + 620, 1215, 324, 181, 1420, 1938, 325, 80, 619, 620, + 83, 195, 326, 327, 196, 328, 329, 197, 1216, 284, + 1939, 619, 620, 430, 431, 865, 1217, 1218, 1219, 1940, + 198, -560, 1220, 1221, 304, 330, 192, 305, 1992, 2174, + 313, 314, 1941, 284, 714, 182, 619, 620, 619, 620, + 284, 839, 315, 430, 431, 452, 316, 452, 284, 452, + 452, 458, 1285, 983, 869, 1286, 855, 2068, 807, 2069, + 284, 284, 284, 452, 452, 284, 162, 183, 162, 864, + 284, 866, 619, 620, 184, 929, 930, 619, 620, 185, + 615, 731, 867, 732, 619, 620, 1215, 619, 620, 1263, + 186, 582, 583, 2070, 619, 620, 284, 584, 2071, 1215, + 619, 620, 896, 1216, 1507, 2072, 2122, 163, 2119, 164, + 1511, 1217, 1218, 1219, 187, 2120, 1216, 1220, 1221, 619, + 620, 2129, 284, 284, 1217, 1218, 1219, 188, 619, 620, + 1220, 1221, 1652, 1653, 917, 918, 731, 163, 732, 164, + 2158, 1474, 193, 1162, 1283, 1031, 1163, 189, 843, 2159, + 845, 200, 847, 848, 194, 1546, 998, 444, 444, 1997, + 1998, 201, 313, 314, 904, 1999, 861, 862, 807, 1562, + 284, 284, 284, 294, 315, 1567, 295, 285, 321, 296, + 286, 297, 960, 961, 962, 291, 299, 1204, 292, 300, + 293, 301, 44, 458, 452, 458, 452, 452, 452, 452, + 452, 452, 302, 452, 452, 452, 452, 997, 287, 452, + 452, 452, 162, 1003, 2160, 1002, 284, 1695, 1696, 1049, + 577, 578, 708, 580, 581, 582, 583, 1012, 1004, 619, + 620, 584, 708, 580, 581, 582, 583, 731, 306, 732, + 284, 584, 2001, 2002, 1646, 807, 288, 1084, 1999, 1339, + 284, 1293, 523, -556, 524, 1745, 1041, 1713, 731, -557, + 732, 905, 1035, 948, 1015, 807, 1021, 807, 807, 332, + 1022, 1166, 284, 1058, 307, 807, 1199, 312, 284, 1200, + 807, 458, 1069, 807, 1057, 320, 331, 1073, 1245, 452, + 1064, 1246, 807, 335, 1247, 807, 336, 982, 807, 984, + 985, 986, 987, 988, 989, 345, 991, 992, 993, 994, + 351, 1289, 999, 1000, 1001, 807, 1320, 1395, 1178, 1402, + 807, 807, 284, 807, 284, 1419, 1427, 346, 352, 807, + 807, 1723, 1442, 1558, 353, 1608, 807, 807, 120, 807, + 1179, 359, 1180, 1732, 571, 572, 573, 574, 575, 576, + 577, 578, 708, 580, 581, 582, 583, 284, 1639, 360, + 1640, 584, 807, 2098, 807, 361, 1729, 284, 1752, 1137, + 1730, 1754, 807, 1835, 362, 807, 1881, 807, 1196, 1147, + 1882, 1897, 1207, 1919, 1067, 1898, 1920, 807, 369, 1213, + 807, 1935, 1075, 1224, 298, 1882, 1965, 1974, 1990, 1994, + 764, 1975, 1882, 807, 1995, 284, 1462, 2023, 807, 2043, + 2044, 807, 2051, 807, 807, 2059, 1882, 1174, 284, 807, + 2067, 2081, 2142, 371, 807, 1882, 372, 284, 2118, 2125, + 1182, 2126, 807, 807, 2127, 807, 284, 2128, 807, 2130, + 2132, 807, 370, 807, 1975, 2153, 1309, 1312, 1201, 1882, + 1462, 2161, 2171, 282, 2182, 807, 2172, 373, 1882, 2185, + 403, 160, 374, 2186, 731, 415, 732, 733, 731, 421, + 732, 901, 1292, 422, 1293, 438, 1631, 1712, 1632, 1713, + 438, 438, 1804, 414, 1805, 448, 447, 142, 438, 461, + 463, 465, 466, 467, 1313, 468, 473, 477, 491, 531, + 534, 1842, -192, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 496, -193, 542, -194, 384, 385, 386, 387, + 543, 438, 546, 549, 388, 389, 390, 550, 551, 1532, + 562, 391, 594, 392, 417, 595, 438, 602, 605, 284, + 608, 1370, 610, 612, 613, 632, 393, 633, 634, 394, + 1319, 635, 648, 294, 636, 284, 295, 637, 638, 296, + 644, 297, 1815, 1816, 649, 651, 652, 653, 284, 654, + 655, 656, 44, 452, 658, 535, 659, 663, 664, 697, + 1347, 660, 670, 671, 679, 680, 681, 692, 693, 424, + 544, 545, 696, 695, 698, 1421, 1423, 700, 699, 703, + 701, 498, 704, 284, 284, 720, 284, 284, 284, 723, + 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, + 736, 730, 284, 735, 737, 738, 141, 777, 744, 773, + 782, 798, 803, 809, 1390, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 708, 580, 581, 582, + 583, 810, 811, 840, 282, 584, 850, 395, 396, 397, + 284, 452, 452, 851, 852, 872, 584, 870, 398, 873, + 899, 909, 399, 913, 400, 114, 1348, 910, 916, 920, + 921, 923, 950, 952, 284, 953, 955, 964, 969, 973, + 976, 597, 1005, 1007, 1014, 1020, 1024, 1025, 1032, 1033, + 284, 284, 284, 1034, 604, 1046, 1045, 1733, 609, 1061, + 1051, 1077, 1063, 1429, 1430, 1066, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, 577, 578, 708, + 580, 581, 582, 583, 1072, 1074, 1078, 1085, 584, 1086, + 1087, 1089, 1090, 1728, 1843, 1091, 1093, 1094, 1095, 438, + 1096, 1097, 1098, 1099, 284, 1100, 1421, 1423, 1101, 722, + 1102, 1105, 1109, 1134, 1400, 1401, 1135, 1143, 1144, 284, + 284, 284, 444, 1145, 1152, 1155, 1161, 1167, 1716, 1171, + 284, 751, 1718, 1170, 1175, 452, 1183, 1184, 1191, 452, + 1185, 1193, 1498, 1202, 1210, 1211, 1214, 1236, 452, 1237, + 452, 1239, 1255, 452, 1252, 1253, 1254, 1268, 1266, 1267, + 1271, 1279, 1281, 1282, 1288, 1291, 1295, 1296, 284, 1297, + 718, 719, 1294, 1571, 1301, 1576, 1300, 1302, 1306, 2005, + 1315, 1316, 1321, 1322, 366, 1336, 729, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, + 708, 580, 581, 582, 583, 452, 1342, 1343, 1344, 584, + 284, 1345, 284, 438, 1360, 438, 1353, 438, 438, 438, + 1350, 1373, 1554, 1356, 1556, 1357, 1377, 284, 1389, 1405, + -195, 438, 438, 1413, 1431, 1432, 1433, 1436, 1499, 1437, + 284, 1439, 1501, 1438, 284, 1440, 1441, 1443, 1451, 1454, + 1456, 1505, 1450, 1506, 1455, 1466, 1508, 1465, 1467, 1468, + 1469, 1470, 1737, 1737, 1471, 1472, 1473, 1477, 1478, 1668, + 1479, 565, 1480, 1489, 1482, 1481, 1483, 1484, 1497, 1502, + 1509, 1523, 846, 1528, 1503, 1512, 1514, 1510, 1518, 1529, + 1520, 1531, 1870, 1724, 597, 1534, 860, 1535, 284, 284, + 284, 1539, 1543, 1541, 1542, 1545, 284, 1559, 1548, 1565, + 1580, 1557, 751, 1563, 1578, 1585, 1587, 1579, 1591, 1592, + 1593, 284, 1598, 1599, 1600, 1711, 1601, 1602, 1603, 1604, + 1605, 1606, 284, 1607, 1617, 751, 1628, 1634, 1638, 1624, + 284, 1644, 1645, 1688, 284, 1651, 1665, 1649, 1666, 1650, + 1657, 1681, 1658, 1660, 1659, 1686, 1682, 1672, 1673, 1674, + 1675, 438, 438, 438, 438, 438, 438, 438, 438, 438, + 1680, 438, 438, 438, 438, 1676, 1677, 438, 438, 438, + 1683, 1687, 1692, 1693, 1764, 1694, 1698, 751, 1701, 1720, + 751, 1708, 1726, 1775, 1286, 1719, 1715, 1739, 366, 1746, + 1744, 1758, 751, 1796, 458, 458, 1725, 1747, 1749, 1751, + 284, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 708, 580, 581, 582, 583, 1755, 1756, 452, 1759, + 584, 1765, 1048, 1771, 1050, 1762, 284, 1772, 1773, 1774, + 1776, 284, 1777, 1778, 1779, 1783, 1782, 1784, 1785, 438, + 1790, 1163, 1797, 1799, 1798, 1801, 1820, 438, 1873, 1824, + 1825, 1834, 1838, 1856, 1857, 1866, 1858, 1867, 1810, 1900, + 1869, 1874, -558, 764, 1026, 1886, 1887, 1888, 1889, 1827, + 1828, 1829, 1830, 1831, 1833, 1895, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, 577, 578, 805, + 580, 581, 582, 583, 1904, 1901, 1902, 1910, 584, 1916, + 731, 1847, 732, 284, 1917, 1796, 284, 284, 1852, 1855, + 1923, 1930, 1903, 2028, 1926, 1932, 1918, 1942, 1806, 1807, + 1924, 1757, 1927, 1944, 1949, 1933, 1959, 1864, 1950, 284, + 1961, 1956, 1962, 444, 444, 284, 1963, 2011, 1957, 1958, + 1964, 1966, 1967, 1989, 2008, 284, 1972, 2013, 2009, 2025, + 2026, 2027, 2024, 2029, 2035, 452, 2055, 2058, 452, -559, + 2062, 2063, 2074, 2075, 2077, 2042, 2090, 2038, 2039, 2095, + 2100, 2046, 2048, 2143, 2050, 2144, 284, 2145, 2146, 2052, + 2148, 2056, 2149, 1319, 2060, 2114, 2150, 366, 2066, 284, + 458, 2078, 2085, 2131, 2154, 2166, 2151, 751, 2165, 751, + 751, 2170, 2173, 2178, 2183, 2184, 2187, 2188, 1561, 2108, + 1620, 772, 1770, 751, 1980, 1800, 119, 1953, 1589, 130, + 131, 132, 2003, 458, 912, 1710, 138, 1738, 1068, 1868, + 2076, 1853, 751, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 284, 0, 0, 0, 0, 0, 0, 0, + 751, 1190, 0, 0, 284, 284, 0, 0, 1848, 0, + 0, 1850, 0, 1954, 0, 0, 1914, 1915, 0, 0, + 2099, 0, 1492, 0, 0, 0, 0, 284, 0, 0, + 0, 0, 0, 0, 0, 0, 751, 0, 0, 284, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 436, 0, 0, 0, 0, 282, 0, 0, + 0, 0, 284, 0, 1984, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1947, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2005, 2006, 2007, 2008, 2009, 282, 282, 282, 282, 282, - 0, 0, 0, 0, 0, 0, 0, 1631, 1632, 1633, - 0, 0, 0, 0, 0, 1638, 0, 0, 160, 372, + 0, 438, 0, 2015, 2016, 2017, 2018, 2019, 0, 284, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1653, 0, 0, 0, 0, 0, 0, 0, 0, 282, - 0, 1661, 0, 0, 0, 0, 0, 0, 0, 1669, - 0, 2043, 0, 0, 0, 2047, 282, 0, 0, 0, - 373, 374, 375, 376, 377, 378, 379, 380, 381, 0, - 0, 0, 0, 382, 383, 384, 385, 0, 450, 0, - 0, 386, 387, 388, 0, 0, 389, 0, 390, 0, - 0, 0, 282, 160, 372, 0, 0, 1466, 0, 450, - 450, 391, 0, 0, 392, 2081, 0, 0, 292, 2083, - 0, 293, 0, 450, 294, 0, 295, 0, 0, 1733, - 0, 0, 0, 0, 0, 2095, 0, 44, 0, 0, - 0, 0, 0, 0, 0, 373, 374, 375, 376, 377, - 378, 379, 380, 381, 422, 1753, 0, 0, 382, 383, - 384, 385, 1507, 710, 0, 0, 386, 387, 388, 0, - 0, 389, 0, 390, 0, 0, 0, 0, 0, 436, - 436, 0, 2130, 2131, 0, 0, 391, 0, 0, 392, - 0, 0, 0, 292, 0, 0, 293, 0, 0, 294, - 0, 295, 0, 436, 0, 0, 0, 0, 0, 0, - 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 393, 394, 395, 0, 0, 1520, 0, 422, - 0, 0, 1793, 396, 0, 0, 0, 397, 0, 398, - 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1733, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 727, - 0, 728, 1723, 0, 1829, 0, 0, 839, 0, 841, - 0, 843, 844, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 855, 856, 0, 0, 393, 394, 395, - 0, 0, 0, 0, 0, 1853, 0, 0, 396, 0, - 0, 0, 397, 0, 398, 114, 0, 0, 1862, 0, - 0, 0, 562, 563, 564, 565, 566, 567, 568, 569, - 570, 571, 572, 573, 574, 704, 576, 577, 578, 579, - 436, 0, 0, 436, 580, 1651, 0, 1723, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 747, 0, - 747, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1733, 1707, 0, 0, 436, 0, 562, 563, 564, - 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, - 704, 576, 577, 578, 579, 0, 0, 0, 0, 580, - 0, 0, 0, 0, 0, 0, 1921, 0, 436, 0, + 0, 0, 284, 0, 0, 0, 0, 1985, 284, 284, + 0, 0, 0, 1303, 0, 0, 0, 0, 0, 0, + 1986, 1987, 0, 0, 0, 284, 0, 0, 284, 1323, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, + 2004, 0, 0, 284, 2053, 0, 0, 0, 2057, 0, + 444, 0, 0, 0, 0, 2014, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 366, 438, + 438, 0, 0, 0, 0, 0, 0, 1371, 1372, 284, + 1374, 1375, 1376, 0, 1378, 1379, 1380, 1381, 1382, 1383, + 1384, 1385, 1386, 1387, 0, 0, 2084, 0, 2091, 0, + 0, 0, 2093, 0, 0, 0, 284, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2105, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 751, + 0, 0, 0, 0, 1399, 0, 0, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, + 708, 580, 581, 582, 583, 0, 0, 284, 1414, 584, + 0, 1493, 0, 0, 0, 2140, 2141, 0, 0, 2089, + 0, 0, 0, 0, 1428, 284, 284, 284, 284, 284, + 753, 0, 0, 0, 0, 0, 0, 2101, 2102, 2103, + 2104, 2106, 0, 438, 0, 0, 0, 438, 0, 0, + 0, 0, 0, 0, 0, 0, 438, 0, 438, 0, + 0, 438, 0, 0, 0, 0, 0, 0, 0, 284, + 1513, 0, 0, 0, 0, 0, 0, 0, 1475, 0, + 0, 0, 0, 0, 0, 0, 284, 0, 0, 0, + 0, 0, 0, 1486, 1487, 1488, 0, 0, 2147, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 452, 0, + 0, 0, 0, 438, 0, 0, 0, 0, 0, 0, + 0, 0, 284, 0, 0, 0, 0, 0, 0, 452, + 452, 0, 202, 160, 0, 0, 0, 0, 0, 203, + 204, 205, 1519, 452, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 410, 224, 225, 226, 227, 228, 229, 1388, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 976, 0, 978, 979, 980, 981, - 982, 983, 0, 985, 986, 987, 988, 0, 0, 993, - 994, 995, 562, 563, 564, 565, 566, 567, 568, 569, - 570, 571, 572, 573, 574, 704, 576, 577, 578, 579, - 0, 0, 0, 0, 580, 0, 0, 410, 1963, 0, + 0, 0, 0, 0, 235, 236, 237, 238, 0, 0, + 0, 0, 239, 0, 0, 0, 0, 0, 0, 0, + 0, 1575, 0, 0, 0, 0, 243, 244, 245, 0, + 0, 2163, 0, 0, 1590, 0, 246, 23, 1594, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1971, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 437, 0, 0, 0, 447, 0, - 0, 0, 452, 0, 1733, 0, 0, 0, 0, 0, - 0, 1061, 0, 0, 0, 0, 0, 0, 2000, 1069, - 0, 0, 0, 0, 0, 468, 469, 470, 0, 472, - 473, 474, 0, 476, 477, 478, 479, 480, 481, 482, - 0, 484, 485, 486, 487, 0, 0, 0, 491, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1733, 0, - 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, - 572, 573, 574, 704, 576, 577, 578, 579, 0, 0, - 0, 0, 580, 0, 0, 2044, 0, 562, 563, 564, - 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, - 704, 576, 577, 578, 579, 0, 0, 0, 0, 580, - 0, 0, 0, 0, 0, 0, 0, 0, 548, 550, - 552, 553, 491, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 587, 491, 491, + 0, 0, 2179, 2181, 0, 0, 0, 165, 0, 170, + 0, 0, 0, 0, 0, 0, 2189, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, + 708, 580, 581, 582, 583, 0, 0, 0, 0, 584, + 0, 0, 1641, 1642, 1643, 0, 0, 0, 0, 0, + 1648, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1663, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1671, 0, 0, 0, + 0, 0, 438, 438, 1679, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1476, 0, 0, 257, 0, + 0, 0, 258, 0, 0, 0, 438, 260, 261, 262, + 0, 263, 264, 265, 0, 0, 0, 114, 0, 0, + 0, 0, 0, 437, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 266, 411, 0, 0, 0, 0, 0, + 268, 0, 0, 0, 0, 355, 0, 0, 0, 606, + 0, 0, 271, 0, 1743, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 708, 580, + 581, 582, 583, 0, 0, 0, 0, 584, 0, 0, + 1763, 0, 0, 0, 0, 0, 0, 0, 0, 1517, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 525, 526, 527, 528, 529, 530, 0, + 532, 533, 0, 0, 0, 0, 0, 1530, 0, 538, + 539, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 547, 548, 438, 0, 0, 438, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1803, 0, 0, + 0, 751, 0, 751, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 438, 0, + 0, 0, 0, 1743, 0, 0, 0, 0, 0, 0, + 0, 1661, 0, 0, 0, 0, 0, 0, 0, 1839, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 747, 0, 0, 0, 603, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 613, 614, 0, - 0, 0, 0, 614, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 491, 636, 0, 0, 0, 0, 0, - 160, 372, 0, 0, 0, 0, 0, 0, 1733, 0, - 0, 0, 0, 0, 0, 0, 0, 657, 491, 0, - 0, 0, 661, 662, 663, 0, 665, 0, 747, 0, - 668, 669, 670, 0, 0, 671, 0, 0, 0, 0, - 0, 0, 373, 374, 375, 376, 377, 378, 379, 380, - 381, 747, 0, 0, 0, 382, 383, 384, 385, 0, - 0, 1733, 0, 386, 387, 388, 0, 0, 389, 0, - 390, 0, 0, 703, 0, 0, 0, 491, 712, 0, - 0, 0, 0, 391, 0, 0, 392, 0, 0, 0, - 0, 0, 0, 0, 720, 721, 0, 0, 0, 0, - 0, 0, 0, 436, 0, 0, 0, 0, 0, 748, - 0, 1340, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 436, 436, 0, 774, 775, 776, - 777, 0, 0, 0, 0, 782, 0, 0, 436, 786, + 0, 438, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, 577, 578, 708, 580, 581, 582, 583, + 1863, 0, 0, 0, 584, 0, 0, 0, 0, 0, + 0, 0, 0, 1872, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 676, 677, + 678, 0, 0, 0, 682, 683, 684, 685, 686, 687, + 688, 0, 689, 0, 0, 0, 690, 691, 0, 0, + 694, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 706, 0, 0, 1743, 0, 0, 0, + 0, 0, 0, 0, 0, 412, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, 577, 578, 708, + 580, 581, 582, 583, 0, 0, 0, 0, 584, 0, + 0, 1931, 439, 0, 0, 0, 449, 0, 0, 0, + 454, 0, 0, 0, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 708, 580, 581, + 582, 583, 2041, 470, 471, 472, 584, 474, 475, 476, + 0, 478, 479, 480, 481, 482, 483, 484, 0, 486, + 487, 488, 489, 0, 0, 0, 493, 0, 0, 0, + 0, 0, 0, 1973, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1981, 0, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 708, 580, 581, 582, 583, 0, 0, 0, 1743, + 584, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2010, 871, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 751, 0, 552, 554, + 556, 557, 493, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 591, 493, 493, + 0, 0, 0, 1743, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 607, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 617, 618, 0, + 2054, 0, 0, 618, 0, 0, 0, 0, 0, 0, + 0, 751, 0, 493, 640, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 800, 550, 0, 0, 0, 804, 0, - 0, 0, 808, 809, 810, 811, 812, 813, 814, 815, - 816, 817, 818, 819, 820, 821, 822, 823, 824, 826, - 827, 828, 829, 830, 831, 832, 832, 0, 837, 838, - 0, 840, 0, 0, 393, 394, 395, 0, 847, 1392, - 1393, 851, 852, 0, 0, 396, 0, 0, 832, 397, - 0, 398, 114, 491, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1711, 0, 868, 869, 870, 871, 872, - 873, 874, 875, 876, 877, 878, 879, 880, 881, 883, - 885, 886, 887, 888, 889, 0, 891, 892, 0, 0, - 0, 0, 0, 1717, 900, 901, 902, 0, 0, 0, - 0, 0, 908, 909, 0, 491, 491, 0, 0, 0, - 492, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 548, 703, 928, 0, 0, 0, - 933, 934, 935, 936, 937, 938, 939, 940, 941, 0, - 0, 0, 0, 0, 948, 0, 950, 0, 0, 952, - 0, 1827, 0, 491, 491, 491, 957, 0, 959, 960, - 961, 1489, 0, 0, 0, 1491, 0, 0, 0, 0, - 0, 0, 0, 0, 1495, 0, 1496, 0, 0, 1498, - 0, 551, 0, 0, 492, 984, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 491, - 492, 492, 0, 0, 0, 0, 1003, 0, 1004, 0, - 0, 891, 892, 0, 0, 0, 0, 0, 0, 0, - 1017, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1538, 0, 491, 0, 1033, 0, 0, 0, 0, - 1036, 1037, 0, 0, 0, 492, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 491, 0, 1053, 1054, 0, - 0, 491, 1059, 0, 0, 0, 1053, 0, 0, 0, - 492, 0, 0, 1070, 0, 0, 0, 1073, 562, 563, - 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, - 574, 704, 576, 577, 578, 579, 0, 0, 0, 0, - 580, 0, 0, 1097, 0, 883, 0, 1100, 562, 563, - 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, - 574, 704, 576, 577, 578, 579, 0, 0, 0, 492, - 580, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 491, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 491, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 493, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 704, - 576, 577, 578, 579, 0, 0, 491, 0, 580, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 491, - 0, 0, 0, 0, 0, 0, 551, 1181, 0, 0, - 0, 1187, 0, 0, 0, 0, 0, 491, 0, 0, - 0, 0, 0, 0, 0, 1200, 1201, 0, 0, 0, - 825, 1204, 0, 0, 0, 0, 0, 833, 834, 402, - 372, 0, 0, 0, 0, 0, 0, 0, 1230, 0, - 0, 1232, 1747, 0, 0, 588, 589, 0, 0, 0, - 857, 0, 0, 0, 0, 492, 0, 1912, 0, 0, - 0, 0, 1248, 0, 1250, 1251, 0, 0, 0, 0, - 0, 373, 374, 375, 376, 377, 378, 379, 380, 381, - 0, 884, 0, 1269, 382, 383, 384, 385, 0, 0, - 635, 0, 386, 387, 388, 0, 1938, 389, 0, 390, - 0, 0, 0, 0, 0, 0, 1291, 492, 492, 0, - 0, 0, 391, 1297, 0, 392, 0, 0, 1306, 0, + 0, 0, 0, 0, 751, 0, 0, 661, 493, 0, + 0, 0, 665, 666, 667, 0, 669, 0, 0, 0, + 672, 673, 674, 0, 0, 675, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 708, 580, 581, 582, 583, 438, 0, 0, 0, + 584, 0, 0, 707, 0, 0, 0, 493, 716, 0, + 0, 0, 0, 0, 0, 0, 0, 438, 438, 0, + 0, 0, 0, 1743, 724, 725, 0, 0, 0, 0, + 0, 438, 0, 0, 0, 0, 1717, 0, 0, 752, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1332, 1333, 0, 0, 0, 0, 491, + 0, 0, 0, 0, 0, 0, 0, 778, 779, 780, + 781, 0, 0, 0, 0, 786, 0, 0, 0, 790, + 0, 0, 0, 0, 0, 0, 1743, 0, 0, 0, + 0, 0, 0, 804, 554, 0, 0, 0, 808, 0, + 0, 0, 812, 813, 814, 815, 816, 817, 818, 819, + 820, 821, 822, 823, 824, 825, 826, 827, 828, 830, + 831, 832, 833, 834, 835, 836, 836, 0, 841, 842, + 0, 844, 0, 0, 0, 0, 0, 0, 0, 0, + 853, 0, 0, 857, 858, 0, 0, 0, 0, 0, + 836, 0, 0, 0, 0, 493, 0, 0, 0, 1164, + 0, 0, 0, 1721, 0, 0, 0, 874, 875, 876, + 877, 878, 879, 880, 881, 882, 883, 884, 885, 886, + 887, 889, 891, 892, 893, 894, 895, 0, 897, 898, + 0, 0, 0, 1181, 0, 0, 906, 907, 908, 0, + 0, 0, 0, 0, 914, 915, 0, 493, 493, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 492, 492, 492, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1357, 1358, - 1359, 1360, 0, 0, 711, 0, 0, 0, 0, 1838, - 0, 0, 1840, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 491, 0, 0, 0, 0, 0, 0, - 0, 492, 0, 0, 0, 0, 0, 0, 0, 1383, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1384, - 1385, 1386, 0, 393, 394, 395, 1388, 1389, 0, 1390, - 0, 0, 0, 0, 396, 492, 0, 0, 397, 0, - 398, 1397, 1398, 1950, 0, 0, 0, 0, 0, 1401, - 1402, 0, 0, 0, 0, 0, 1406, 492, 1407, 1408, - 0, 0, 0, 492, 0, 1414, 1415, 0, 0, 0, - 491, 491, 562, 563, 564, 565, 566, 567, 568, 569, - 570, 571, 572, 573, 574, 704, 576, 577, 578, 579, - 0, 0, 0, 0, 580, 0, 0, 0, 0, 0, - 0, 0, 1443, 0, 0, 0, 0, 884, 0, 1101, - 861, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 0, 0, 1475, 0, 0, - 0, 0, 492, 0, 0, 0, 0, 0, 0, 491, - 0, 0, 492, 0, 0, 0, 0, 1490, 0, 0, - 0, 0, 911, 912, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1414, 1415, - 0, 0, 0, 1506, 0, 0, 0, 0, 492, 0, - 0, 0, 0, 0, 1512, 0, 0, 1517, 0, 0, - 0, 492, 0, 0, 0, 0, 0, 0, 0, 0, - 954, 955, 956, 0, 0, 0, 0, 0, 0, 492, - 0, 0, 0, 0, 0, 1539, 0, 0, 1542, 491, - 1545, 491, 0, 0, 0, 0, 0, 0, 0, 1554, - 0, 1556, 0, 1554, 1560, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 998, 0, 562, 563, - 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, - 574, 704, 576, 577, 578, 579, 0, 0, 0, 0, - 580, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1029, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 1051, 580, 0, 727, 0, 728, 1058, 0, - 0, 0, 1637, 1689, 0, 0, 0, 0, 0, 1644, - 1645, 1646, 0, 0, 0, 0, 0, 0, 1652, 0, - 1654, 0, 0, 0, 0, 0, 372, 1657, 0, 0, - 0, 492, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 491, 0, 0, 0, 0, 1674, 0, 0, 0, - 0, 0, 0, 0, 1679, 1680, 1681, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1692, 373, 374, 375, - 376, 377, 378, 379, 380, 381, 1704, 1131, 0, 0, - 382, 383, 384, 385, 0, 492, 0, 1141, 386, 387, - 388, 0, 0, 389, 0, 390, 0, 0, 0, 1721, - 0, 0, 0, 0, 0, 1730, 1731, 0, 391, 0, - 0, 392, 2153, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1166, 0, 0, 2063, 0, 0, 0, - 0, 0, 0, 2169, 2171, 0, 1174, 0, 1758, 0, - 0, 0, 0, 0, 0, 0, 0, 2179, 0, 0, - 0, 0, 0, 0, 1193, 0, 0, 0, 0, 0, - 0, 0, 492, 492, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1776, 1777, - 1778, 0, 0, 0, 0, 0, 0, 0, 0, 1779, - 0, 0, 0, 0, 1782, 1783, 1784, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1792, 0, - 0, 0, 0, 491, 491, 1798, 0, 1799, 0, 393, - 394, 395, 0, 1807, 1808, 0, 0, 0, 0, 0, - 396, 0, 0, 0, 397, 0, 398, 0, 0, 0, - 0, 492, 491, 0, 0, 0, 0, 1826, 0, 0, + 0, 0, 0, 0, 0, 0, 552, 707, 934, 0, + 0, 0, 939, 940, 941, 942, 943, 944, 945, 946, + 947, 0, 0, 0, 0, 1727, 954, 0, 956, 0, + 0, 958, 0, 0, 0, 493, 493, 493, 963, 0, + 965, 966, 967, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 708, 580, 581, 582, + 583, 0, 0, 0, 0, 584, 0, 990, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1836, 0, 0, 1839, 0, 0, 0, 1841, 0, 0, - 0, 0, 0, 0, 0, 0, 1783, 1784, 0, 1850, - 0, 0, 0, 0, 0, 730, 1339, 1855, 0, 0, - 0, 0, 0, 0, 2111, 0, 0, 0, 0, 0, - 0, 0, 0, 1868, 0, 0, 0, 0, 1874, 1875, + 0, 493, 0, 0, 0, 0, 0, 0, 1009, 0, + 1010, 0, 0, 897, 898, 0, 0, 0, 0, 0, + 0, 0, 1023, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 493, 0, 1039, 0, 0, + 0, 0, 1042, 1043, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 493, 0, 1059, + 1060, 0, 0, 493, 1065, 0, 1359, 0, 1059, 0, + 0, 0, 0, 0, 0, 1076, 0, 0, 0, 1079, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 0, 1103, 0, 889, 0, 1106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 492, 1880, 492, 0, 1881, 1880, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1889, 561, 0, - 1382, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 491, 491, 580, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1915, 0, - 0, 0, 0, 0, 0, 848, 0, 1924, 0, 0, - 0, 0, 0, 0, 0, 0, 550, 0, 0, 0, - 0, 0, 0, 0, 0, 1935, 1936, 0, 0, 491, - 0, 0, 0, 0, 0, 0, 0, 1419, 1420, 0, + 0, 0, 0, 0, 494, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 896, 0, 0, 0, - 0, 0, 0, 1960, 1961, 0, 0, 0, 0, 0, - 0, 0, 0, 492, 0, 0, 0, 0, 0, 0, - 0, 0, 1973, 0, 0, 491, 491, 1978, 0, 0, - 0, 0, 1981, 0, 0, 1983, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 491, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1488, 0, 0, 0, - 491, 0, 0, 0, 0, 0, 0, 0, 2010, 562, - 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, - 573, 574, 704, 576, 577, 578, 579, 0, 0, 0, - 0, 580, 0, 2021, 0, 0, 0, 0, 0, 2026, - 0, 0, 2027, 0, 0, 0, 0, 0, 0, 0, - 1759, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 801, 576, 577, 578, 579, 0, - 0, 2051, 0, 580, 561, 0, 1544, 0, 1546, 0, + 0, 0, 493, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 493, 1148, 1149, 0, 0, 0, 0, 0, + 0, 1415, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, 577, 578, 708, 580, 581, 582, 583, + 0, 0, 0, 0, 584, 0, 0, 0, 0, 0, + 493, 0, 0, 0, 0, 0, 0, 555, 0, 0, + 494, 0, 0, 493, 0, 0, 0, 0, 0, 0, + 0, 1189, 0, 0, 0, 1195, 494, 494, 0, 0, + 0, 493, 0, 0, 0, 0, 0, 0, 0, 1208, + 1209, 0, 0, 0, 0, 1212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2069, 2070, 0, 0, + 0, 0, 1238, 0, 0, 1240, 0, 0, 0, 0, + 0, 494, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1837, 0, 0, 0, 1256, 0, 1258, 1259, + 0, 0, 0, 0, 0, 0, 494, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1277, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2076, 2077, 0, 2078, 491, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 492, 492, 2087, 0, 0, - 0, 0, 491, 491, 491, 491, 491, 0, 0, 0, - 0, 0, 1874, 0, 0, 0, 2103, 0, 0, 7, - 8, 0, 0, 0, 492, 0, 0, 0, 1104, 1105, - 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 0, - 1116, 1117, 1118, 1119, 2124, 1121, 1122, 1123, 1124, 2127, - 2128, 2129, 0, 0, 0, 0, 0, 0, 0, 1134, - 0, 1136, 0, 491, 0, 0, 0, 0, 0, 1143, - 0, 0, 0, 0, 0, 0, 1149, 1150, 1672, 0, - 0, 0, 0, 0, 0, 1161, 0, 0, 0, 0, - 0, 2157, 2158, 2159, 0, 0, 0, 0, 0, 0, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 0, 0, 0, 41, 42, 43, 44, - 0, 165, 46, 170, 0, 0, 0, 0, 0, 741, - 53, 0, 0, 56, 742, 0, 743, 744, 0, 745, - 0, 0, 0, 492, 492, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 77, 562, 563, 564, - 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, - 575, 576, 577, 578, 579, 0, 0, 0, 551, 580, - 91, 92, 93, 0, 0, 0, 0, 0, 0, 0, - 0, 492, 0, 0, 0, 1254, 1256, 1257, 0, 0, - 0, 1261, 1262, 0, 0, 1265, 1266, 1267, 1268, 0, - 1270, 0, 0, 0, 0, 1276, 0, 0, 0, 0, + 0, 0, 0, 0, 1537, 1538, 160, 374, 0, 0, + 1299, 0, 0, 0, 0, 0, 0, 1305, 0, 0, + 0, 0, 1314, 0, 0, 734, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 494, 0, 1340, 1341, 0, + 0, 0, 0, 493, 0, 0, 0, 0, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 0, 0, 0, + 0, 384, 385, 386, 387, 0, 0, 0, 0, 388, + 389, 390, 1365, 1366, 1367, 1368, 391, 0, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2031, 0, 0, 0, 435, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 492, 492, 0, - 1796, 1797, 0, 0, 0, 929, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 492, 0, 0, + 0, 393, 0, 1625, 394, 0, 0, 493, 294, 0, + 0, 295, 0, 1633, 296, 0, 297, 0, 0, 0, + 0, 0, 555, 1391, 0, 0, 0, 44, 0, 0, + 0, 0, 0, 1392, 1393, 1394, 0, 854, 0, 0, + 1396, 1397, 0, 1398, 424, 0, 829, 1922, 0, 0, + 0, 0, 0, 837, 838, 0, 0, 1407, 1408, 0, + 0, 0, 0, 0, 0, 1411, 1412, 0, 0, 0, + 0, 0, 1416, 0, 1417, 1418, 0, 0, 863, 0, + 0, 1424, 1425, 494, 0, 0, 493, 493, 902, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 708, 580, 581, 582, 583, 0, 0, 890, + 0, 584, 395, 396, 397, 0, 0, 0, 1453, 0, + 0, 0, 0, 398, 0, 0, 0, 399, 0, 400, + 114, 0, 0, 0, 0, 494, 494, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 492, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1356, 0, 0, 0, 0, 1361, 0, - 0, 0, 0, 0, 498, 499, 500, 501, 502, 503, - 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, - 514, 515, 516, 517, 518, 519, 520, 523, 524, 525, - 526, 527, 528, 0, 530, 531, 0, 0, 0, 0, - 0, 534, 535, 0, 0, 0, 0, 0, 202, 160, - 0, 0, 0, 543, 544, 203, 204, 205, 0, 0, - 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 408, 224, 225, - 226, 227, 228, 229, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1416, 0, 0, 492, 0, 1904, 1905, - 235, 236, 237, 238, 0, 0, 0, 0, 239, 0, - 0, 0, 0, 0, 492, 492, 492, 492, 492, 0, - 241, 242, 243, 0, 0, 0, 0, 0, 0, 0, - 244, 23, 0, 245, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1937, 562, 563, 564, - 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, - 704, 576, 577, 578, 579, 561, 0, 0, 0, 580, - 672, 673, 674, 0, 0, 492, 678, 679, 680, 681, - 682, 683, 684, 0, 685, 0, 0, 0, 686, 687, - 0, 0, 690, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1976, 1977, 0, 702, 0, 0, 0, 0, + 0, 0, 0, 1485, 430, 431, 0, 0, 0, 0, + 0, 0, -554, 0, 1547, 493, 1766, 0, 0, 0, + 0, 0, 0, 1500, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 494, 494, 494, 0, 0, 0, 0, + 0, 0, 0, 0, 1424, 1425, 0, 0, 0, 1516, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1994, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1526, 0, 0, 0, 0, 2004, 0, 0, - 0, 0, 255, 0, 0, 0, 256, 0, 0, 0, - 0, 258, 259, 260, 0, 261, 262, 263, 0, 0, - 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1562, 0, 0, 0, 0, 0, 264, 409, 0, - 0, 0, 0, 0, 266, 0, 0, 0, 0, 353, - 0, 0, 0, 602, 0, 0, 269, 0, 0, 0, - 0, 0, 0, 1599, 1600, 1601, 1602, 1603, 0, 0, - 0, 0, 1608, 1609, 0, 0, 1611, 0, 1613, 0, - 0, 0, 1617, 0, 0, 1619, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1627, 0, 0, + 1522, 0, 0, 1527, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 494, + 0, 0, 0, 1948, 0, 0, 0, 0, 0, 0, + 0, 1549, 0, 0, 1552, 493, 1555, 493, 0, 0, + 0, 0, 0, 0, 0, 1564, 0, 1566, 0, 1564, + 1570, 0, 0, 494, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 708, 580, 581, + 582, 583, 0, 0, 0, 494, 584, 0, 0, 0, + 0, 494, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2079, 0, 0, 865, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2091, - 2092, 2093, 2094, 2096, 0, 0, 0, 0, 562, 563, - 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, - 574, 801, 576, 577, 578, 579, 0, 0, 971, 0, - 580, 0, 0, 0, 0, 0, 0, 0, 1687, 0, - 1690, 0, 0, 0, 1697, 0, 1699, 0, 0, 0, + 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, + 1120, 0, 1122, 1123, 1124, 1125, 0, 1127, 1128, 1129, + 1130, 0, 0, 0, 0, 890, 0, 1107, 0, 0, + 1647, 1140, 0, 1142, 0, 0, 0, 1654, 1655, 1656, + 0, 0, 0, 1151, 0, 0, 1662, 0, 1664, 0, + 1157, 1158, 0, 0, 0, 1667, 0, 0, 0, 1169, + 494, 0, 0, 0, 0, 0, 0, 0, 0, 493, + 494, 0, 0, 0, 1684, 0, 0, 0, 0, 0, + 0, 0, 1689, 1690, 1691, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1702, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1714, 0, 0, 0, 494, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2137, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1724, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 202, 6, 372, - 0, 0, 0, 0, 203, 204, 205, 0, 0, 206, - 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, 231, 232, 233, 234, 1164, 0, - 1563, 374, 375, 376, 377, 378, 379, 380, 381, 235, - 236, 237, 238, 382, 383, 384, 385, 239, 240, 0, - 0, 386, 387, 388, 0, 0, 389, 1165, 390, 241, - 242, 243, 0, 0, 0, 0, 0, 0, 0, 244, - 23, 391, 245, 1785, 392, 0, 0, 0, 246, 0, - 0, 247, 0, 0, 248, 0, 249, 0, 0, 0, - 0, 0, 0, 40, 0, 0, 0, 250, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 251, 0, 54, - 55, 0, 252, 0, 253, 0, 0, 254, 0, 0, - 0, 0, 65, 66, 67, 68, 69, 0, 71, 72, - 73, 74, 75, 76, 0, 0, 0, 80, 0, 0, - 83, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1865, 0, 0, 1866, 0, - 0, 255, 393, 394, 395, 256, 257, 1156, 0, 0, - 258, 259, 260, 396, 261, 262, 263, 397, 0, 398, - 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 264, 265, 0, 0, - 0, 1173, 0, 266, 0, 0, 1896, 1897, 353, 1899, - 0, 0, 1564, 0, 0, 269, 1481, 0, 0, 0, - 0, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 0, 0, 0, 0, 0, - 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, - 572, 573, 574, 704, 576, 577, 578, 579, 0, 1941, - 1942, 0, 580, 0, 202, 6, 372, 0, 0, 0, - 0, 203, 204, 205, 0, 0, 206, 207, 208, 209, - 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 0, 1972, 373, 374, 375, - 376, 377, 378, 379, 380, 381, 235, 236, 237, 238, - 382, 383, 384, 385, 239, 240, 0, 0, 386, 387, - 388, 0, 0, 389, 0, 390, 241, 242, 243, 0, - 0, 0, 0, 0, 0, 0, 244, 23, 391, 245, - 0, 392, 0, 0, 0, 246, 0, 0, 247, 0, - 0, 248, 0, 249, 1351, 0, 0, 0, 0, 0, - 40, 0, 0, 0, 250, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 251, 0, 54, 55, 0, 252, - 0, 253, 0, 0, 254, 0, 0, 0, 0, 65, - 66, 67, 68, 69, 0, 71, 72, 73, 74, 75, - 76, 0, 0, 0, 80, 0, 0, 83, 0, 562, - 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, - 573, 574, 704, 576, 577, 578, 579, 0, 0, 0, - 0, 580, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1405, 255, 393, - 394, 395, 256, 257, 0, 0, 0, 258, 259, 260, - 396, 261, 262, 263, 397, 0, 398, 114, 0, 0, + 0, 494, 0, 0, 0, 0, 0, 1731, 0, 0, + 0, 0, 0, 1740, 1741, 0, 0, 0, 0, 494, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 0, 0, 1768, 0, 0, 1262, + 1264, 1265, 0, 0, 0, 1269, 1270, 0, 0, 1273, + 1274, 1275, 1276, 0, 1278, 0, 0, 0, 0, 1284, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 264, 265, 0, 0, 0, 0, 0, - 266, 0, 0, 0, 0, 353, 202, 160, 372, 268, - 421, 0, 269, 203, 204, 205, 0, 0, 206, 207, - 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 408, 224, 225, 226, 227, - 228, 229, 0, 0, 0, 0, 0, 0, 2146, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 235, 236, - 237, 238, 382, 383, 384, 385, 239, 0, 7, 8, - 386, 387, 388, 0, 0, 389, 0, 390, 241, 242, - 243, 0, 0, 0, 0, 0, 0, 0, 244, 23, - 391, 245, 0, 392, 0, 0, 0, 292, 0, 0, - 293, 0, 0, 294, 0, 295, 0, 0, 0, 0, - 1527, 1528, 0, 0, 0, 0, 44, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1786, 1787, 1788, 0, + 0, 0, 0, 0, 0, 0, 0, 1789, 0, 0, + 0, 0, 1792, 1793, 1794, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1802, 0, 0, 0, + 0, 493, 493, 1808, 0, 1809, 0, 0, 0, 0, + 0, 1817, 1818, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1364, 0, 0, + 493, 494, 1369, 0, 0, 1836, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1846, 0, + 0, 1849, 0, 0, 0, 1851, 0, 0, 0, 0, + 0, 0, 0, 0, 1793, 1794, 0, 1860, 0, 0, + 0, 0, 0, 0, 0, 1865, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 494, 0, 0, 160, 374, + 0, 1878, 0, 0, 0, 0, 1884, 1885, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 422, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 0, 0, 0, 41, 42, 43, 44, 0, - 0, 46, 0, 0, 0, 0, 0, 0, 741, 53, - 0, 0, 56, 742, 0, 743, 744, 0, 745, 0, - 0, 0, 0, 423, 0, 0, 0, 1615, 0, 0, - 255, 393, 394, 395, 256, 77, 0, 1623, 0, 258, - 259, 260, 396, 261, 262, 263, 397, 0, 398, 114, - 424, 425, 426, 427, 0, 0, 0, 0, 0, 91, - 92, 93, 0, 0, 0, 264, 409, 0, 0, 0, - 0, 0, 266, 428, 429, 0, 0, 430, 0, 431, - 0, 0, 0, 432, 269, 202, 6, 352, 0, 0, - 0, 0, 203, 204, 205, 0, 0, 206, 207, 208, - 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, - 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, 234, 0, 0, 0, 0, - 0, 0, 0, 0, 953, 0, 0, 235, 236, 237, - 238, 0, 0, 0, 0, 239, 240, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 241, 242, 243, - 0, 0, 0, 0, 0, 0, 0, 244, 23, 0, - 245, 0, 0, 0, 0, 0, 246, 0, 0, 247, - 0, 0, 248, 0, 249, 0, 0, 0, 0, 0, - 1756, 40, 0, 0, 0, 250, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 251, 0, 54, 55, 0, - 252, 0, 253, 0, 0, 254, 0, 0, 0, 0, - 65, 66, 67, 68, 69, 0, 71, 72, 73, 74, - 75, 76, 0, 0, 0, 80, 0, 0, 83, 562, - 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, - 573, 574, 704, 576, 577, 578, 579, 0, 0, 0, - 0, 580, 0, 962, 0, 0, 0, 0, 0, 0, - 0, 921, 0, 0, 0, 0, 0, 0, 0, 255, - 0, 0, 0, 256, 257, 0, 0, 0, 258, 259, - 260, 0, 261, 262, 263, 0, 0, 0, 114, 0, + 1890, 0, 0, 1891, 1890, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1426, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 0, + 0, 0, 0, 384, 385, 386, 387, 0, 0, 493, + 493, 388, 389, 390, 0, 0, 0, 0, 391, 0, + 392, 0, 0, 0, 494, 494, 1925, 0, 0, 0, + 0, 0, 0, 393, 0, 1934, 394, 0, 0, 0, + 294, 0, 0, 295, 554, 0, 296, 0, 297, 0, + 0, 0, 0, 1945, 1946, 0, 0, 493, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 264, 265, 0, 0, 0, 0, - 0, 266, 0, 0, 0, 0, 353, 202, 6, 0, - 354, 0, 658, 269, 203, 204, 205, 0, 0, 206, - 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, 231, 232, 233, 234, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 235, - 236, 237, 238, 0, 0, 0, 0, 239, 240, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, - 242, 243, 0, 0, 0, 0, 0, 0, 0, 244, - 23, 0, 245, 0, 0, 0, 0, 0, 246, 0, - 0, 247, 0, 0, 248, 0, 249, 0, 0, 0, - 0, 0, 0, 40, 0, 0, 0, 250, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 251, 0, 54, - 55, 0, 252, 0, 253, 0, 0, 254, 0, 0, - 0, 0, 65, 66, 67, 68, 69, 0, 71, 72, - 73, 74, 75, 76, 0, 0, 0, 80, 0, 0, - 83, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 0, 0, 0, 0, 1803, - 0, 0, 0, 1804, 0, 0, 0, 0, 0, 0, - 0, 255, 0, 0, 0, 256, 257, 0, 0, 0, - 258, 259, 260, 0, 261, 262, 263, 0, 0, 0, - 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 264, 490, 0, 0, - 0, 0, 0, 266, 0, 0, 0, 0, 353, 202, - 6, 1660, 0, 554, 0, 269, 203, 204, 205, 0, - 0, 206, 207, 208, 209, 210, 211, 212, 213, 214, - 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 0, 0, 0, 0, 0, 0, 424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 235, 236, 237, 238, 0, 0, 0, 0, 239, - 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 241, 242, 243, 0, 0, 0, 0, 0, 0, - 0, 244, 23, 0, 245, 0, 0, 0, 0, 0, - 246, 0, 0, 247, 0, 0, 248, 0, 249, 0, - 0, 0, 0, 0, 0, 40, 0, 0, 0, 250, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 251, - 0, 54, 55, 0, 252, 0, 253, 0, 0, 254, - 0, 0, 0, 0, 65, 66, 67, 68, 69, 0, - 71, 72, 73, 74, 75, 76, 0, 0, 0, 80, - 0, 0, 83, 562, 563, 564, 565, 566, 567, 568, - 569, 570, 571, 572, 573, 574, 704, 576, 577, 578, - 579, 0, 0, 0, 0, 580, 0, 0, 0, 0, - 0, 1830, 0, 0, 0, 1831, 0, 0, 0, 0, - 0, 0, 0, 255, 0, 0, 0, 256, 257, 0, - 0, 0, 258, 259, 260, 0, 261, 262, 263, 0, - 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 264, 265, - 0, 0, 0, 0, 0, 266, 0, 0, 0, 0, - 353, 202, 6, 0, 268, 0, 0, 269, 203, 204, - 205, 0, 0, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, 234, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 235, 236, 237, 238, 0, 0, 0, - 0, 239, 240, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 241, 242, 243, 0, 0, 0, 0, - 0, 0, 0, 244, 23, 0, 245, 0, 0, 0, - 0, 0, 246, 0, 0, 247, 0, 0, 248, 0, - 249, 0, 0, 0, 0, 0, 0, 40, 0, 0, - 0, 250, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 251, 0, 54, 55, 0, 252, 0, 253, 0, - 0, 254, 0, 0, 0, 0, 65, 66, 67, 68, - 69, 0, 71, 72, 73, 74, 75, 76, 0, 0, - 0, 80, 0, 0, 83, 562, 563, 564, 565, 566, - 567, 568, 569, 570, 571, 572, 573, 574, 704, 576, - 577, 578, 579, 0, 0, 0, 0, 580, 0, 0, - 0, 0, 0, 1996, 0, 0, 0, 1997, 0, 0, - 0, 0, 0, 0, 0, 255, 0, 0, 0, 256, - 257, 0, 0, 0, 258, 259, 260, 0, 261, 262, - 263, 0, 0, 0, 114, 0, 0, 0, 0, 0, + 0, 1970, 1971, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 494, 0, 0, 0, 0, 0, 0, + 1983, 0, 0, 493, 493, 1988, 0, 0, 0, 0, + 1991, 0, 0, 1993, 0, 0, 0, 0, 1536, 1960, + 0, 0, 0, 493, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 395, 396, 397, 0, 493, 0, + 0, 0, 0, 0, 0, 398, 2020, 0, 0, 399, + 0, 400, 114, 0, 0, 0, 0, 1572, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 620, 1822, 0, 0, 0, 0, 0, 266, 0, 0, - 0, 0, 622, 202, 6, 0, 314, 554, 0, 269, - 203, 204, 205, 0, 0, 206, 207, 208, 209, 210, - 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 235, 236, 237, 238, 0, - 0, 0, 0, 239, 240, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 241, 242, 243, 0, 0, - 0, 0, 0, 0, 0, 244, 23, 0, 245, 0, - 0, 0, 0, 0, 246, 0, 0, 247, 0, 0, - 248, 0, 249, 0, 0, 0, 0, 0, 0, 40, - 0, 0, 0, 250, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 251, 0, 54, 55, 0, 252, 0, - 253, 0, 0, 254, 0, 0, 0, 0, 65, 66, - 67, 68, 69, 0, 71, 72, 73, 74, 75, 76, - 0, 0, 0, 80, 0, 0, 83, 562, 563, 564, - 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, - 704, 576, 577, 578, 579, 0, 0, 0, 0, 580, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 758, - 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, - 0, 256, 257, 0, 0, 0, 258, 259, 260, 0, - 261, 262, 263, 0, 0, 0, 114, 0, 0, 0, + 0, 2031, 0, 494, 0, 494, 0, 2036, 0, 0, + 2037, 731, 0, 732, 1733, 0, 0, 0, 0, 1609, + 1610, 1611, 1612, 1613, 0, 0, 0, 0, 1618, 1619, + 0, 0, 0, 0, 1621, 0, 1623, 0, 0, 2061, + 1627, 0, 0, 1629, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1637, 0, 0, 0, 0, + 0, 0, 0, 0, 2079, 2080, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2086, 2087, + 0, 2088, 493, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2097, 0, 0, 0, 0, + 493, 493, 493, 493, 493, 0, 0, 0, 0, 0, + 1884, 0, 0, 0, 2113, 0, 0, 0, 0, 0, + 0, 0, 2073, 0, 0, 0, 1697, 0, 1700, 0, + 0, 0, 1707, 0, 1709, 0, 0, 494, 0, 0, + 0, 0, 2134, 0, 0, 0, 0, 2137, 2138, 2139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 264, 265, 0, 0, 0, 0, 0, 266, - 0, 0, 0, 0, 267, 202, 6, 0, 268, 0, - 0, 269, 203, 204, 205, 0, 0, 206, 207, 208, - 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, - 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, 234, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 235, 236, 237, - 238, 0, 0, 0, 0, 239, 240, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 241, 242, 243, - 0, 0, 0, 0, 0, 0, 0, 244, 23, 0, - 245, 0, 0, 0, 0, 0, 246, 0, 0, 247, - 0, 0, 248, 0, 249, 0, 0, 0, 0, 0, - 0, 40, 0, 0, 0, 250, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 251, 0, 54, 55, 0, - 252, 0, 253, 0, 0, 254, 0, 0, 0, 0, - 65, 66, 67, 68, 69, 0, 71, 72, 73, 74, - 75, 76, 0, 0, 0, 80, 0, 0, 83, 562, - 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, - 573, 574, 704, 576, 577, 578, 579, 0, 0, 0, - 0, 580, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 921, 0, 0, 0, 0, 0, 0, 0, 255, - 0, 0, 0, 256, 257, 0, 0, 0, 258, 259, - 260, 0, 261, 262, 263, 0, 0, 0, 114, 0, + 0, 493, 0, 0, 0, 1734, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, 577, 578, 708, + 580, 581, 582, 583, 0, 0, 0, 0, 584, 2167, + 2168, 2169, 202, 160, 374, 0, 423, 0, 0, 203, + 204, 205, 0, 0, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 410, 224, 225, 226, 227, 228, 229, 0, 0, + 0, 0, 0, 0, 1769, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 235, 236, 237, 238, 384, 385, + 386, 387, 239, 0, 0, 0, 388, 389, 390, 0, + 0, 1795, 0, 391, 0, 392, 243, 244, 245, 0, + 0, 0, 0, 0, 0, 0, 246, 23, 393, 247, + 0, 394, 0, 0, 0, 294, 0, 0, 295, 2121, + 0, 296, 0, 297, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 44, 0, 0, 0, 0, 494, + 494, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 424, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 494, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 708, 580, 581, 582, 583, 0, 0, 0, + 0, 584, 0, 1875, 0, 0, 1876, 0, 0, 0, + 0, 0, 1434, 0, 0, 0, 0, 0, 0, 0, + 0, 425, 0, 0, 0, 0, 0, 0, 257, 395, + 396, 397, 258, 0, 0, 0, 0, 260, 261, 262, + 398, 263, 264, 265, 399, 0, 400, 114, 426, 427, + 428, 429, 0, 0, 1906, 1907, 0, 1909, 0, 0, + 0, 0, 0, 266, 411, 0, 0, 0, 0, 0, + 268, 430, 431, 0, 0, 432, 0, 433, 0, 0, + 0, 434, 271, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 7, 8, 0, 0, 0, 494, 494, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 708, 580, 581, 582, 583, 1951, 1952, 0, + 0, 584, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 555, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 494, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, 577, 578, 708, + 580, 581, 582, 583, 1982, 0, 0, 0, 584, 0, + 0, 0, 0, 0, 0, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 0, 0, + 0, 41, 42, 43, 44, 1899, 565, 46, 0, 0, + 0, 494, 494, 0, 745, 53, 0, 0, 56, 746, + 0, 747, 748, 0, 749, 0, 0, 0, 0, 0, + 0, 494, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 77, 0, 0, 0, 0, 494, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 264, 265, 0, 0, 0, 0, - 0, 266, 0, 0, 0, 0, 353, 202, 6, 0, - 268, 0, 0, 269, 203, 204, 205, 0, 0, 206, - 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, 231, 232, 233, 234, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 235, - 236, 237, 238, 0, 0, 0, 0, 239, 240, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, - 242, 243, 0, 0, 0, 0, 0, 0, 0, 244, - 23, 0, 245, 0, 0, 0, 0, 0, 246, 0, - 0, 247, 0, 0, 248, 0, 249, 0, 0, 0, - 0, 0, 0, 40, 0, 0, 0, 250, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 251, 0, 54, - 55, 0, 252, 0, 253, 0, 0, 254, 0, 0, - 0, 0, 65, 66, 67, 68, 69, 0, 71, 72, - 73, 74, 75, 76, 0, 0, 0, 80, 0, 0, - 83, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 922, 0, 0, 0, 0, 0, 0, - 0, 255, 0, 0, 0, 256, 257, 0, 0, 0, - 258, 259, 260, 0, 261, 262, 263, 0, 0, 0, - 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 264, 490, 0, 0, - 0, 0, 0, 266, 0, 0, 0, 0, 353, 202, - 6, 0, 549, 0, 0, 269, 203, 204, 205, 0, - 0, 206, 207, 208, 209, 210, 211, 212, 213, 214, - 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 0, 0, 202, 6, 374, 91, 92, 93, 0, 203, + 204, 205, 0, 0, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 0, 0, 1573, 376, 377, 378, 379, + 380, 381, 382, 383, 235, 236, 237, 238, 384, 385, + 386, 387, 239, 240, 0, 0, 388, 389, 390, 0, + 0, 241, 242, 391, 0, 392, 243, 244, 245, 0, + 935, 0, 0, 0, 0, 0, 246, 23, 393, 247, + 0, 394, 0, 0, 0, 248, 0, 0, 249, 0, + 494, 250, 0, 251, 0, 0, 0, 0, 0, 0, + 40, 0, 0, 0, 252, 0, 0, 0, 494, 494, + 494, 494, 494, 0, 253, 0, 54, 55, 0, 254, + 0, 255, 0, 0, 256, 0, 0, 0, 0, 65, + 66, 67, 68, 69, 0, 71, 72, 73, 74, 75, + 76, 0, 0, 0, 80, 0, 2156, 83, 0, 0, + 0, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, 577, 578, 805, 580, 581, 582, 583, 494, + 0, 0, 0, 584, 0, 0, 0, 565, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 257, 395, + 396, 397, 258, 259, 0, 0, 0, 260, 261, 262, + 398, 263, 264, 265, 399, 0, 400, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 235, 236, 237, 238, 0, 0, 0, 0, 239, - 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 241, 242, 243, 0, 0, 0, 0, 0, 0, - 0, 244, 23, 0, 245, 0, 0, 0, 0, 0, - 246, 0, 0, 247, 0, 0, 248, 0, 249, 0, - 0, 0, 0, 0, 0, 40, 0, 0, 0, 250, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 251, - 0, 54, 55, 0, 252, 0, 253, 0, 0, 254, - 0, 0, 0, 0, 65, 66, 67, 68, 69, 0, - 71, 72, 73, 74, 75, 76, 0, 0, 0, 80, - 0, 0, 83, 562, 563, 564, 565, 566, 567, 568, - 569, 570, 571, 572, 573, 574, 704, 576, 577, 578, - 579, 0, 0, 0, 0, 580, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 968, 0, 0, 0, 0, - 0, 0, 0, 255, 0, 0, 0, 256, 257, 0, - 0, 0, 258, 259, 260, 0, 261, 262, 263, 0, - 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 264, 490, - 0, 0, 0, 0, 0, 266, 0, 0, 0, 0, - 353, 202, 6, 0, 0, 554, 0, 269, 203, 204, - 205, 0, 0, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, 234, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 235, 236, 237, 238, 0, 0, 0, - 0, 239, 240, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 241, 242, 243, 0, 0, 0, 0, - 0, 0, 0, 244, 23, 0, 245, 0, 0, 0, - 0, 0, 246, 0, 0, 247, 0, 0, 248, 0, - 249, 0, 0, 0, 0, 0, 0, 40, 0, 0, - 0, 250, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 251, 0, 54, 55, 0, 252, 0, 253, 0, - 0, 254, 0, 0, 0, 0, 65, 66, 67, 68, - 69, 0, 71, 72, 73, 74, 75, 76, 0, 0, - 0, 80, 0, 0, 83, 562, 563, 564, 565, 566, - 567, 568, 569, 570, 571, 572, 573, 574, 704, 576, - 577, 578, 579, 0, 0, 0, 0, 580, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1074, 0, 0, - 0, 0, 0, 0, 0, 255, 0, 0, 0, 256, - 257, 0, 0, 0, 258, 259, 260, 0, 261, 262, - 263, 0, 0, 0, 114, 0, 0, 0, 0, 0, + 0, 0, 0, 266, 267, 0, 0, 0, 0, 0, + 268, 0, 0, 0, 0, 355, 202, 6, 374, 1574, + 0, 0, 271, 203, 204, 205, 0, 0, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 0, 0, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 235, 236, + 237, 238, 384, 385, 386, 387, 239, 240, 0, 0, + 388, 389, 390, 0, 0, 241, 242, 391, 0, 392, + 243, 244, 245, 0, 0, 0, 0, 0, 0, 0, + 246, 23, 393, 247, 0, 394, 0, 0, 0, 248, + 0, 0, 249, 0, 0, 250, 0, 251, 0, 0, + 0, 0, 0, 0, 40, 0, 0, 0, 252, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 253, 0, + 54, 55, 0, 254, 0, 255, 0, 0, 256, 0, + 0, 0, 0, 65, 66, 67, 68, 69, 0, 71, + 72, 73, 74, 75, 76, 0, 0, 0, 80, 0, + 0, 83, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, + 0, 0, 0, 0, 584, 0, 0, 0, 0, 0, + 0, 565, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 257, 395, 396, 397, 258, 259, 0, 0, + 0, 260, 261, 262, 398, 263, 264, 265, 399, 0, + 400, 114, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 266, 267, 0, + 0, 0, 0, 0, 268, 0, 0, 0, 0, 355, + 202, 6, 354, 270, 0, 0, 271, 203, 204, 205, + 0, 0, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 235, 236, 237, 238, 0, 0, 0, 0, + 239, 240, 0, 0, 0, 0, 0, 0, 0, 241, + 242, 0, 0, 0, 243, 244, 245, 0, 0, 0, + 0, 0, 0, 0, 246, 23, 0, 247, 0, 0, + 0, 0, 0, 248, 0, 0, 249, 0, 0, 250, + 0, 251, 0, 0, 0, 0, 0, 0, 40, 0, + 0, 0, 252, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 253, 0, 54, 55, 0, 254, 0, 255, + 0, 0, 256, 0, 0, 0, 0, 65, 66, 67, + 68, 69, 0, 71, 72, 73, 74, 75, 76, 0, + 0, 0, 80, 0, 0, 83, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, 577, 578, 805, + 580, 581, 582, 583, 0, 0, 0, 0, 584, 0, + 0, 0, 0, 0, 0, 977, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, + 258, 259, 0, 0, 0, 260, 261, 262, 0, 263, + 264, 265, 0, 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 264, 265, 0, 0, 0, 0, 0, 266, 0, 0, - 0, 0, 592, 202, 6, 0, 268, 0, 0, 269, - 203, 204, 205, 0, 0, 206, 207, 208, 209, 210, - 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 235, 236, 237, 238, 0, - 0, 0, 0, 239, 240, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 241, 242, 243, 0, 0, - 0, 0, 0, 0, 0, 244, 23, 0, 245, 0, - 0, 0, 0, 0, 246, 0, 0, 247, 0, 0, - 248, 0, 249, 0, 0, 0, 0, 0, 0, 40, - 0, 0, 0, 250, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 251, 0, 54, 55, 0, 252, 0, - 253, 0, 0, 254, 0, 0, 0, 0, 65, 66, - 67, 68, 69, 0, 71, 72, 73, 74, 75, 76, - 0, 0, 0, 80, 0, 0, 83, 562, 563, 564, - 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, - 704, 576, 577, 578, 579, 0, 0, 0, 0, 580, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1075, - 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, - 0, 256, 257, 0, 0, 0, 258, 259, 260, 0, - 261, 262, 263, 0, 0, 0, 114, 0, 0, 0, + 0, 266, 267, 0, 0, 0, 0, 0, 268, 0, + 0, 0, 0, 355, 202, 6, 0, 356, 0, 662, + 271, 203, 204, 205, 0, 0, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 235, 236, 237, 238, + 0, 0, 0, 0, 239, 240, 0, 0, 0, 0, + 0, 0, 0, 241, 242, 0, 0, 0, 243, 244, + 245, 0, 0, 0, 0, 0, 0, 0, 246, 23, + 0, 247, 0, 0, 0, 0, 0, 248, 0, 0, + 249, 0, 0, 250, 0, 251, 0, 0, 0, 0, + 0, 0, 40, 0, 0, 0, 252, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 253, 0, 54, 55, + 0, 254, 0, 255, 0, 0, 256, 0, 0, 0, + 0, 65, 66, 67, 68, 69, 0, 71, 72, 73, + 74, 75, 76, 0, 0, 0, 80, 0, 0, 83, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 0, 0, 0, 0, 0, 1172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 264, 265, 0, 0, 0, 0, 0, 266, - 0, 0, 0, 0, 599, 202, 6, 0, 268, 0, - 0, 269, 203, 204, 205, 0, 0, 206, 207, 208, - 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, - 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, 234, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 235, 236, 237, - 238, 0, 0, 0, 0, 239, 240, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 241, 242, 243, - 0, 0, 0, 0, 0, 0, 0, 244, 23, 0, - 245, 0, 0, 0, 0, 0, 246, 0, 0, 247, - 0, 0, 248, 0, 249, 0, 0, 0, 0, 0, - 0, 40, 0, 0, 0, 250, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 251, 0, 54, 55, 0, - 252, 0, 253, 0, 0, 254, 0, 0, 0, 0, - 65, 66, 67, 68, 69, 0, 71, 72, 73, 74, - 75, 76, 0, 0, 0, 80, 0, 0, 83, 562, - 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, - 573, 574, 704, 576, 577, 578, 579, 0, 0, 0, - 0, 580, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1076, 0, 0, 0, 0, 0, 0, 0, 255, - 0, 0, 0, 256, 257, 0, 0, 0, 258, 259, - 260, 0, 261, 262, 263, 0, 0, 0, 114, 0, + 257, 0, 0, 0, 258, 259, 0, 0, 0, 260, + 261, 262, 0, 263, 264, 265, 0, 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 264, 490, 0, 0, 0, 0, - 0, 266, 0, 0, 0, 0, 353, 202, 6, 0, - 882, 0, 1338, 269, 203, 204, 205, 0, 0, 206, - 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, 231, 232, 233, 234, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 235, - 236, 237, 238, 0, 0, 0, 0, 239, 240, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, - 242, 243, 0, 0, 0, 0, 0, 0, 0, 244, - 23, 0, 245, 0, 0, 0, 0, 0, 246, 0, - 0, 247, 0, 0, 248, 0, 249, 0, 0, 0, - 0, 0, 0, 40, 0, 0, 0, 250, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 251, 0, 54, - 55, 0, 252, 0, 253, 0, 0, 254, 0, 0, - 0, 0, 65, 66, 67, 68, 69, 0, 71, 72, - 73, 74, 75, 76, 0, 0, 0, 80, 0, 0, - 83, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1077, 0, 0, 0, 0, 0, 0, - 0, 255, 0, 0, 0, 256, 257, 0, 0, 0, - 258, 259, 260, 0, 261, 262, 263, 0, 0, 0, - 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 264, 490, 0, 0, - 0, 0, 0, 266, 202, 6, 0, 0, 353, 1543, - 0, 203, 204, 205, 0, 269, 206, 207, 208, 209, + 0, 0, 0, 0, 0, 266, 492, 0, 0, 0, + 0, 0, 268, 0, 0, 0, 0, 355, 202, 6, + 1670, 0, 558, 0, 271, 203, 204, 205, 0, 0, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 235, 236, 237, 238, 0, 0, 0, 0, 239, 240, + 0, 0, 0, 0, 0, 0, 0, 241, 242, 0, + 0, 0, 243, 244, 245, 0, 0, 0, 0, 0, + 0, 0, 246, 23, 0, 247, 0, 0, 0, 0, + 0, 248, 0, 0, 249, 0, 0, 250, 0, 251, + 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, + 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 253, 0, 54, 55, 0, 254, 0, 255, 0, 0, + 256, 0, 0, 0, 0, 65, 66, 67, 68, 69, + 0, 71, 72, 73, 74, 75, 76, 0, 0, 0, + 80, 0, 0, 83, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 708, 580, 581, + 582, 583, 0, 0, 0, 0, 584, 0, 0, 0, + 0, 0, 0, 1173, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 257, 0, 0, 0, 258, 259, + 0, 0, 0, 260, 261, 262, 0, 263, 264, 265, + 0, 0, 0, 114, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 266, + 267, 0, 0, 0, 0, 0, 268, 0, 0, 0, + 0, 355, 202, 6, 0, 270, 0, 0, 271, 203, + 204, 205, 0, 0, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 235, 236, 237, 238, 0, 0, + 0, 0, 239, 240, 0, 0, 0, 0, 0, 0, + 0, 241, 242, 0, 0, 0, 243, 244, 245, 0, + 0, 0, 0, 0, 0, 0, 246, 23, 0, 247, + 0, 0, 0, 0, 0, 248, 0, 0, 249, 0, + 0, 250, 0, 251, 0, 0, 0, 0, 0, 0, + 40, 0, 0, 0, 252, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 253, 0, 54, 55, 0, 254, + 0, 255, 0, 0, 256, 0, 0, 0, 0, 65, + 66, 67, 68, 69, 0, 71, 72, 73, 74, 75, + 76, 0, 0, 0, 80, 0, 0, 83, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 708, 580, 581, 582, 583, 0, 0, 0, 0, + 584, 0, 0, 0, 0, 0, 0, 1491, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 257, 0, + 0, 0, 258, 259, 0, 0, 0, 260, 261, 262, + 0, 263, 264, 265, 0, 0, 0, 114, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 624, 1832, 0, 0, 0, 0, 0, + 268, 0, 0, 0, 0, 626, 202, 6, 0, 316, + 558, 0, 271, 203, 204, 205, 0, 0, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 235, 236, + 237, 238, 0, 0, 0, 0, 239, 240, 0, 0, + 0, 0, 0, 0, 0, 241, 242, 0, 0, 0, + 243, 244, 245, 0, 0, 0, 0, 0, 0, 0, + 246, 23, 0, 247, 0, 0, 0, 0, 0, 248, + 0, 0, 249, 0, 0, 250, 0, 251, 0, 0, + 0, 0, 0, 0, 40, 0, 0, 0, 252, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 253, 0, + 54, 55, 0, 254, 0, 255, 0, 0, 256, 0, + 0, 0, 0, 65, 66, 67, 68, 69, 0, 71, + 72, 73, 74, 75, 76, 0, 0, 0, 80, 0, + 0, 83, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, 577, 578, 708, 580, 581, 582, 583, + 0, 0, 0, 0, 584, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 257, 0, 0, 0, 258, 259, 0, 0, + 0, 260, 261, 262, 0, 263, 264, 265, 0, 0, + 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 266, 267, 0, + 0, 0, 0, 0, 268, 0, 0, 0, 0, 269, + 202, 6, 0, 270, 0, 0, 271, 203, 204, 205, + 0, 0, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 235, 236, 237, 238, 0, 0, 0, 0, + 239, 240, 0, 0, 0, 0, 0, 0, 0, 241, + 242, 0, 0, 0, 243, 244, 245, 0, 0, 0, + 0, 0, 0, 0, 246, 23, 0, 247, 0, 0, + 0, 0, 0, 248, 0, 0, 249, 0, 0, 250, + 0, 251, 0, 0, 0, 0, 0, 0, 40, 0, + 0, 0, 252, 0, 404, 374, 0, 0, 0, 0, + 0, 0, 253, 0, 54, 55, 0, 254, 0, 255, + 0, 0, 256, 0, 0, 0, 0, 65, 66, 67, + 68, 69, 0, 71, 72, 73, 74, 75, 76, 0, + 0, 0, 80, 0, 0, 83, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 0, 0, 0, 0, 384, + 385, 386, 387, 0, 0, 0, 0, 388, 389, 390, + 0, 0, 0, 0, 391, 0, 392, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 257, 0, 0, 393, + 258, 259, 394, 0, 0, 260, 261, 262, 0, 263, + 264, 265, 0, 0, 0, 114, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 266, 267, 0, 0, 0, 0, 0, 268, 0, + 0, 0, 0, 355, 202, 6, 0, 270, 0, 0, + 271, 203, 204, 205, 0, 0, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 235, 236, 237, 238, 0, 0, 0, 0, 239, 240, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 241, 242, 243, 0, - 0, 0, 0, 0, 0, 0, 244, 23, 0, 245, - 0, 0, 0, 0, 0, 246, 0, 0, 247, 0, - 0, 248, 0, 249, 0, 0, 0, 0, 0, 0, - 40, 0, 0, 0, 250, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 251, 0, 54, 55, 0, 252, - 0, 253, 0, 0, 254, 0, 0, 0, 0, 65, + 395, 396, 397, 241, 242, 0, 0, 0, 243, 244, + 245, 398, 0, 0, 0, 399, 0, 400, 246, 23, + 0, 247, 0, 0, 0, 0, 0, 248, 0, 0, + 249, 0, 0, 250, 0, 251, 0, 0, 0, 0, + 0, 0, 40, 0, 0, 0, 252, 0, 0, 374, + 0, 0, 0, 0, 0, 0, 253, 0, 54, 55, + 0, 254, 0, 255, 0, 0, 256, 0, 0, 0, + 0, 65, 66, 67, 68, 69, 0, 71, 72, 73, + 74, 75, 76, 0, 0, 0, 80, 0, 0, 83, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 0, + 0, 0, 0, 384, 385, 386, 387, 0, 0, 0, + 0, 388, 389, 390, 0, 0, 0, 0, 391, 0, + 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 257, 0, 0, 393, 258, 259, 394, 0, 0, 260, + 261, 262, 0, 263, 264, 265, 0, 0, 0, 114, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 266, 492, 0, 0, 0, + 0, 0, 268, 0, 0, 0, 0, 355, 202, 6, + 0, 553, 0, 0, 271, 203, 204, 205, 0, 0, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 235, 236, 237, 238, 0, 0, 0, 0, 239, 240, + 0, 0, 0, 0, 395, 396, 397, 241, 242, 0, + 0, 0, 243, 244, 245, 398, 0, 0, 0, 399, + 0, 400, 246, 23, 0, 247, 0, 0, 0, 0, + 0, 248, 0, 0, 249, 0, 0, 250, 0, 251, + 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, + 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 253, 0, 54, 55, 0, 254, 0, 255, 0, 0, + 256, 0, 0, 0, 0, 65, 66, 67, 68, 69, + 0, 71, 72, 73, 74, 75, 76, 0, 0, 0, + 80, 0, 0, 83, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 708, 580, 581, + 582, 583, 0, 0, 0, 0, 584, 0, 731, 0, + 732, 0, 0, 0, 0, 0, 1699, 0, 0, 0, + 0, 0, 0, 0, 257, 0, 0, 0, 258, 259, + 0, 0, 0, 260, 261, 262, 0, 263, 264, 265, + 0, 0, 0, 114, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 266, + 492, 0, 0, 0, 0, 0, 268, 0, 0, 0, + 0, 355, 202, 6, 0, 0, 558, 0, 271, 203, + 204, 205, 0, 0, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 235, 236, 237, 238, 0, 0, + 0, 0, 239, 240, 0, 0, 0, 0, 0, 0, + 0, 241, 242, 0, 0, 0, 243, 244, 245, 0, + 0, 0, 0, 0, 0, 0, 246, 23, 0, 247, + 0, 0, 0, 0, 0, 248, 0, 0, 249, 0, + 0, 250, 0, 251, 0, 0, 0, 0, 0, 0, + 40, 0, 0, 0, 252, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 253, 0, 54, 55, 0, 254, + 0, 255, 0, 0, 256, 0, 0, 0, 0, 65, 66, 67, 68, 69, 0, 71, 72, 73, 74, 75, - 76, 0, 0, 0, 80, 0, 0, 83, 562, 563, - 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, - 574, 704, 576, 577, 578, 579, 0, 0, 0, 0, - 580, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1115, 0, 0, 0, 0, 0, 0, 0, 255, 0, - 0, 0, 256, 257, 0, 0, 0, 258, 259, 260, - 0, 261, 262, 263, 0, 0, 0, 114, 0, 0, + 76, 0, 0, 0, 80, 0, 0, 83, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 708, 580, 581, 582, 583, 0, 0, 0, 0, + 584, 0, 968, 0, 0, 0, 0, 0, 0, 0, + 927, 0, 0, 0, 0, 0, 0, 0, 257, 0, + 0, 0, 258, 259, 0, 0, 0, 260, 261, 262, + 0, 263, 264, 265, 0, 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 264, 490, 0, 0, 0, 0, 0, - 266, 202, 6, 0, 0, 353, 0, 0, 203, 204, - 205, 0, 269, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, 234, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 235, 236, 237, 238, 0, 0, 0, - 0, 239, 240, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 241, 242, 243, 0, 0, 0, 0, - 0, 0, 0, 244, 23, 0, 245, 0, 0, 0, - 0, 0, 246, 0, 0, 247, 0, 0, 248, 0, - 249, 0, 0, 0, 0, 0, 0, 40, 0, 0, - 0, 250, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 251, 0, 54, 55, 0, 252, 0, 253, 0, - 0, 254, 0, 0, 0, 0, 65, 66, 67, 68, - 69, 0, 71, 72, 73, 74, 75, 76, 0, 0, - 0, 80, 0, 0, 83, 562, 563, 564, 565, 566, - 567, 568, 569, 570, 571, 572, 573, 574, 704, 576, - 577, 578, 579, 0, 0, 0, 0, 580, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1125, 0, 0, - 0, 0, 0, 0, 0, 255, 0, 0, 0, 256, - 257, 0, 0, 0, 258, 259, 260, 0, 261, 262, - 263, 0, 0, 0, 114, 0, 0, 0, 0, 0, + 0, 0, 0, 266, 267, 0, 0, 0, 0, 0, + 268, 0, 0, 0, 0, 596, 202, 6, 0, 270, + 0, 0, 271, 203, 204, 205, 0, 0, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 235, 236, + 237, 238, 0, 0, 0, 0, 239, 240, 0, 0, + 0, 0, 0, 0, 0, 241, 242, 0, 0, 0, + 243, 244, 245, 0, 0, 0, 0, 0, 0, 0, + 246, 23, 0, 247, 0, 0, 0, 0, 0, 248, + 0, 0, 249, 0, 0, 250, 0, 251, 0, 0, + 0, 0, 0, 0, 40, 0, 0, 0, 252, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 253, 0, + 54, 55, 0, 254, 0, 255, 0, 0, 256, 0, + 0, 0, 0, 65, 66, 67, 68, 69, 0, 71, + 72, 73, 74, 75, 76, 0, 0, 0, 80, 0, + 0, 83, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, 577, 578, 708, 580, 581, 582, 583, + 0, 0, 0, 0, 584, 0, 0, 0, 0, 0, + 1813, 0, 0, 0, 1814, 0, 0, 0, 0, 0, + 0, 0, 257, 0, 0, 0, 258, 259, 0, 0, + 0, 260, 261, 262, 0, 263, 264, 265, 0, 0, + 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 266, 267, 0, + 0, 0, 0, 0, 268, 0, 0, 0, 0, 603, + 202, 6, 0, 270, 0, 0, 271, 203, 204, 205, + 0, 0, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 235, 236, 237, 238, 0, 0, 0, 0, + 239, 240, 0, 0, 0, 0, 0, 0, 0, 241, + 242, 0, 0, 0, 243, 244, 245, 0, 0, 0, + 0, 0, 0, 0, 246, 23, 0, 247, 0, 0, + 0, 0, 0, 248, 0, 0, 249, 0, 0, 250, + 0, 251, 0, 0, 0, 0, 0, 0, 40, 0, + 0, 0, 252, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 253, 0, 54, 55, 0, 254, 0, 255, + 0, 0, 256, 0, 0, 0, 0, 65, 66, 67, + 68, 69, 0, 71, 72, 73, 74, 75, 76, 0, + 0, 0, 80, 0, 0, 83, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, 577, 578, 708, + 580, 581, 582, 583, 0, 0, 0, 0, 584, 0, + 0, 0, 0, 0, 1840, 0, 0, 0, 1841, 0, + 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, + 258, 259, 0, 0, 0, 260, 261, 262, 0, 263, + 264, 265, 0, 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 264, 265, 0, 0, 0, 0, 0, 266, 0, 0, - 0, 0, 353, 202, 6, 0, 1668, 0, 0, 269, - 203, 204, 205, 0, 0, 206, 207, 208, 209, 210, + 0, 266, 492, 0, 0, 0, 0, 0, 268, 0, + 0, 0, 0, 355, 202, 6, 0, 888, 0, 1346, + 271, 203, 204, 205, 0, 0, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 235, 236, 237, 238, + 0, 0, 0, 0, 239, 240, 0, 0, 0, 0, + 0, 0, 0, 241, 242, 0, 0, 0, 243, 244, + 245, 0, 0, 0, 0, 0, 0, 0, 246, 23, + 0, 247, 0, 0, 0, 0, 0, 248, 0, 0, + 249, 0, 0, 250, 0, 251, 0, 0, 0, 0, + 0, 0, 40, 0, 0, 0, 252, 0, 160, 374, + 0, 0, 0, 0, 0, 0, 253, 0, 54, 55, + 0, 254, 0, 255, 0, 0, 256, 0, 0, 0, + 0, 65, 66, 67, 68, 69, 0, 71, 72, 73, + 74, 75, 76, 0, 0, 0, 80, 0, 0, 83, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 0, + 0, 0, 0, 384, 385, 386, 387, 0, 0, 0, + 0, 388, 389, 390, 0, 0, 0, 0, 391, 0, + 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 257, 0, 0, 393, 258, 259, 394, 0, 0, 260, + 261, 262, 0, 263, 264, 265, 0, 0, 0, 114, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 266, 492, 0, 0, 0, + 0, 0, 268, 202, 6, 0, 0, 355, 1553, 0, + 203, 204, 205, 0, 271, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 235, 236, 237, 238, 0, 0, 0, 0, 239, 240, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 241, 242, 243, 0, 0, - 0, 0, 0, 0, 0, 244, 23, 0, 245, 0, - 0, 0, 0, 0, 246, 0, 0, 247, 0, 0, - 248, 0, 249, 0, 0, 0, 0, 0, 0, 40, - 0, 0, 0, 250, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 251, 0, 54, 55, 0, 252, 0, - 253, 0, 0, 254, 0, 0, 0, 0, 65, 66, - 67, 68, 69, 0, 71, 72, 73, 74, 75, 76, - 0, 0, 0, 80, 0, 0, 83, 562, 563, 564, - 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, - 704, 576, 577, 578, 579, 0, 0, 0, 0, 580, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1126, - 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, - 0, 256, 257, 0, 0, 0, 258, 259, 260, 0, - 261, 262, 263, 0, 0, 0, 114, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 620, 1822, 0, 0, 0, 0, 0, 266, - 0, 0, 0, 0, 622, 202, 6, 0, 314, 0, - 0, 269, 203, 204, 205, 0, 0, 206, 207, 208, - 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, - 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, 234, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 235, 236, 237, - 238, 0, 0, 0, 0, 239, 240, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 241, 242, 243, - 0, 0, 0, 0, 0, 0, 0, 244, 23, 0, - 245, 0, 0, 0, 0, 0, 246, 0, 0, 247, - 0, 0, 248, 0, 249, 0, 0, 0, 0, 0, - 0, 40, 0, 0, 0, 250, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 251, 0, 54, 55, 0, - 252, 0, 253, 0, 0, 254, 0, 0, 0, 0, + 0, 0, 241, 242, 395, 396, 397, 243, 244, 245, + 0, 0, 0, 0, 0, 398, 0, 246, 23, 399, + 247, 400, 114, 0, 0, 0, 248, 0, 0, 249, + 0, 0, 250, 0, 251, 0, 0, 0, 0, 0, + 0, 40, 0, 0, 0, 252, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 253, 0, 54, 55, 0, + 254, 0, 255, 0, 0, 256, 0, 0, 0, 0, 65, 66, 67, 68, 69, 0, 71, 72, 73, 74, - 75, 76, 0, 0, 0, 80, 0, 0, 83, 562, - 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, - 573, 574, 704, 576, 577, 578, 579, 0, 0, 0, - 0, 580, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1127, 0, 0, 0, 0, 0, 0, 0, 255, - 0, 0, 0, 256, 257, 0, 0, 0, 258, 259, - 260, 0, 261, 262, 263, 0, 0, 0, 114, 0, + 75, 76, 0, 0, 0, 80, 0, 0, 83, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 708, 580, 581, 582, 583, 0, 0, 0, + 0, 584, 0, 0, 0, 0, 0, 2006, 0, 0, + 0, 2007, 0, 0, 0, 0, 0, 0, 0, 257, + 0, 0, 0, 258, 259, 0, 0, 0, 260, 261, + 262, 0, 263, 264, 265, 0, 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 264, 490, 0, 0, 0, 0, - 0, 266, 202, 160, 372, 0, 353, 0, 0, 203, - 204, 205, 0, 269, 206, 207, 208, 209, 210, 211, + 0, 0, 0, 0, 266, 492, 0, 0, 0, 0, + 0, 268, 202, 6, 0, 0, 355, 0, 0, 203, + 204, 205, 0, 271, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, - 222, 408, 224, 225, 226, 227, 228, 229, 0, 0, - 0, 0, 0, 0, 0, 373, 374, 375, 376, 377, - 378, 379, 380, 381, 235, 236, 237, 238, 382, 383, - 384, 385, 239, 0, 0, 0, 386, 387, 388, 0, - 0, 389, 0, 390, 241, 242, 243, 0, 0, 0, - 0, 0, 0, 0, 244, 23, 391, 245, 0, 392, - 202, 160, 372, 0, 0, 0, 0, 203, 204, 205, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 235, 236, 237, 238, 0, 0, + 0, 0, 239, 240, 0, 0, 0, 0, 0, 0, + 0, 241, 242, 0, 0, 0, 243, 244, 245, 0, + 0, 0, 0, 0, 0, 0, 246, 23, 0, 247, + 0, 0, 0, 0, 0, 248, 0, 0, 249, 0, + 0, 250, 0, 251, 0, 0, 0, 0, 0, 0, + 40, 0, 0, 0, 252, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 253, 0, 54, 55, 0, 254, + 0, 255, 0, 0, 256, 0, 0, 0, 0, 65, + 66, 67, 68, 69, 0, 71, 72, 73, 74, 75, + 76, 0, 0, 0, 80, 0, 0, 83, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 708, 580, 581, 582, 583, 0, 0, 0, 0, + 584, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 762, 0, 0, 0, 0, 0, 0, 0, 257, 0, + 0, 0, 258, 259, 0, 0, 0, 260, 261, 262, + 0, 263, 264, 265, 0, 0, 0, 114, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 266, 267, 0, 0, 0, 0, 0, + 268, 0, 0, 0, 0, 355, 202, 6, 0, 1678, + 0, 0, 271, 203, 204, 205, 0, 0, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 235, 236, + 237, 238, 0, 0, 0, 0, 239, 240, 0, 0, + 0, 0, 0, 0, 0, 241, 242, 0, 0, 0, + 243, 244, 245, 0, 0, 0, 0, 0, 0, 0, + 246, 23, 0, 247, 0, 0, 0, 0, 0, 248, + 0, 0, 249, 0, 0, 250, 0, 251, 0, 0, + 0, 0, 0, 0, 40, 0, 0, 0, 252, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 253, 0, + 54, 55, 0, 254, 0, 255, 0, 0, 256, 0, + 0, 0, 0, 65, 66, 67, 68, 69, 0, 71, + 72, 73, 74, 75, 76, 0, 0, 0, 80, 0, + 0, 83, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, 577, 578, 708, 580, 581, 582, 583, + 0, 0, 0, 0, 584, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 927, 0, 0, 0, 0, 0, + 0, 0, 257, 0, 0, 0, 258, 259, 0, 0, + 0, 260, 261, 262, 0, 263, 264, 265, 0, 0, + 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 624, 1832, 0, + 0, 0, 0, 0, 268, 0, 0, 0, 0, 626, + 202, 6, 0, 316, 0, 0, 271, 203, 204, 205, 0, 0, 206, 207, 208, 209, 210, 211, 212, 213, - 214, 215, 216, 217, 218, 219, 220, 221, 222, 408, - 224, 225, 226, 227, 228, 229, 0, 0, 0, 0, - 0, 0, 0, 373, 374, 375, 376, 377, 378, 379, - 380, 381, 235, 236, 237, 238, 382, 383, 384, 385, - 239, 0, 0, 0, 386, 387, 388, 0, 0, 389, - 0, 390, 241, 242, 243, 0, 0, 0, 0, 0, - 0, 0, 244, 23, 391, 245, 0, 392, 0, 0, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 235, 236, 237, 238, 0, 0, 0, 0, + 239, 240, 0, 0, 0, 0, 0, 0, 0, 241, + 242, 0, 0, 0, 243, 244, 245, 0, 0, 0, + 0, 0, 0, 0, 246, 23, 0, 247, 0, 0, + 0, 0, 0, 248, 0, 0, 249, 0, 0, 250, + 0, 251, 0, 0, 0, 0, 0, 0, 40, 0, + 0, 0, 252, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 253, 0, 54, 55, 0, 254, 0, 255, + 0, 0, 256, 0, 0, 0, 0, 65, 66, 67, + 68, 69, 0, 71, 72, 73, 74, 75, 76, 0, + 0, 0, 80, 0, 0, 83, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, 577, 578, 708, + 580, 581, 582, 583, 0, 0, 0, 0, 584, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 928, 0, + 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, + 258, 259, 0, 0, 0, 260, 261, 262, 0, 263, + 264, 265, 0, 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 255, 393, 394, 395, - 256, 0, 0, 0, 0, 258, 259, 260, 396, 261, - 262, 263, 397, 0, 398, 114, 0, 0, 0, 0, + 0, 266, 492, 0, 0, 0, 0, 0, 268, 202, + 160, 374, 0, 355, 0, 0, 203, 204, 205, 0, + 271, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 217, 218, 219, 220, 221, 222, 410, 224, + 225, 226, 227, 228, 229, 0, 0, 0, 0, 0, + 0, 0, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 235, 236, 237, 238, 384, 385, 386, 387, 239, + 0, 0, 0, 388, 389, 390, 0, 0, 0, 0, + 391, 0, 392, 243, 244, 245, 0, 0, 0, 0, + 0, 0, 0, 246, 23, 393, 247, 0, 394, 202, + 160, 374, 0, 0, 0, 0, 203, 204, 205, 0, + 0, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 217, 218, 219, 220, 221, 222, 410, 224, + 225, 226, 227, 228, 229, 0, 0, 0, 0, 0, + 0, 0, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 235, 236, 237, 238, 384, 385, 386, 387, 239, + 0, 0, 0, 388, 389, 390, 0, 0, 0, 0, + 391, 0, 392, 243, 244, 245, 0, 0, 0, 0, + 0, 0, 0, 246, 23, 393, 247, 0, 394, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 264, 409, 0, 0, 0, 0, 0, 266, 0, - 0, 0, 0, 353, 0, 0, 0, 1559, 0, 0, - 269, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1132, 255, 393, 394, 395, 256, 0, - 0, 0, 0, 258, 259, 260, 396, 261, 262, 263, - 397, 0, 398, 114, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 264, - 409, 0, 0, 0, 0, 0, 266, 0, 0, 0, - 0, 353, 202, 160, 372, 1835, 0, 0, 269, 203, - 204, 205, 0, 0, 206, 207, 208, 209, 210, 211, - 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, - 222, 408, 224, 225, 226, 227, 228, 229, 0, 0, - 0, 0, 0, 0, 0, 1563, 374, 375, 376, 377, - 378, 379, 380, 381, 235, 236, 237, 238, 382, 383, - 384, 385, 239, 0, 0, 0, 386, 387, 388, 0, - 0, 389, 0, 390, 241, 242, 243, 0, 0, 0, - 0, 0, 0, 0, 244, 23, 391, 245, 0, 392, - 202, 160, 372, 0, 0, 0, 0, 203, 204, 205, - 0, 0, 206, 207, 208, 209, 210, 211, 212, 213, - 214, 215, 216, 217, 218, 219, 220, 221, 222, 408, - 224, 225, 226, 227, 228, 229, 0, 0, 0, 0, - 0, 0, 0, 373, 374, 375, 376, 377, 378, 379, - 380, 381, 235, 236, 237, 238, 382, 383, 384, 385, - 239, 0, 0, 0, 386, 387, 388, 0, 0, 389, - 0, 390, 241, 242, 243, 0, 0, 0, 0, 0, - 0, 0, 244, 23, 391, 245, 0, 392, 0, 0, + 0, 0, 0, 0, 0, 257, 395, 396, 397, 258, + 0, 0, 0, 0, 260, 261, 262, 398, 263, 264, + 265, 399, 0, 400, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 255, 393, 394, 395, - 256, 0, 0, 0, 0, 258, 259, 260, 396, 261, - 262, 263, 397, 0, 398, 114, 0, 0, 0, 0, + 266, 411, 0, 0, 0, 0, 0, 268, 0, 0, + 0, 0, 355, 0, 0, 0, 1569, 0, 0, 271, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 974, 0, 0, 257, 395, 396, 397, 258, + 0, 0, 0, 0, 260, 261, 262, 398, 263, 264, + 265, 399, 0, 400, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 264, 409, 0, 0, 0, 0, 0, 266, 0, - 0, 0, 0, 353, 0, 0, 0, 1723, 0, 0, - 269, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1133, 255, 393, 394, 395, 256, 0, - 0, 0, 0, 258, 259, 260, 396, 261, 262, 263, - 397, 0, 398, 114, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 264, - 409, 0, 0, 0, 0, 0, 266, 202, 160, 0, - 0, 353, 0, 0, 203, 204, 205, 0, 269, 206, - 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 408, 224, 225, 226, - 227, 228, 229, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 235, - 236, 237, 238, 0, 0, 0, 0, 239, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, - 242, 243, 0, 0, 0, 0, 202, 160, 0, 244, - 23, 850, 245, 203, 204, 205, 0, 0, 206, 207, - 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 408, 224, 225, 226, 227, - 228, 229, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 235, 236, - 237, 238, 0, 0, 0, 0, 239, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 241, 242, - 243, 0, 0, 0, 0, 0, 0, 0, 244, 23, - 0, 245, 562, 563, 564, 565, 566, 567, 568, 569, - 570, 571, 572, 573, 574, 704, 576, 577, 578, 579, - 0, 0, 0, 0, 580, 0, 0, 0, 0, 0, - 0, 255, 0, 0, 1135, 256, 0, 0, 0, 0, - 258, 259, 260, 0, 261, 262, 263, 0, 0, 0, - 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 620, 621, 0, 0, - 0, 0, 0, 266, 0, 0, 0, 0, 622, 0, - 0, 0, 314, 0, 0, 269, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 704, - 576, 577, 578, 579, 0, 0, 0, 0, 580, 0, - 255, 0, 0, 0, 256, 0, 0, 0, 1243, 258, - 259, 260, 0, 261, 262, 263, 0, 0, 0, 114, + 266, 411, 0, 0, 0, 0, 0, 268, 0, 0, + 0, 0, 355, 202, 160, 374, 1845, 0, 0, 271, + 203, 204, 205, 0, 0, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 410, 224, 225, 226, 227, 228, 229, 0, + 0, 0, 0, 0, 0, 0, 1573, 376, 377, 378, + 379, 380, 381, 382, 383, 235, 236, 237, 238, 384, + 385, 386, 387, 239, 0, 0, 0, 388, 389, 390, + 0, 0, 0, 0, 391, 0, 392, 243, 244, 245, + 0, 0, 0, 0, 0, 0, 0, 246, 23, 393, + 247, 0, 394, 202, 160, 374, 0, 0, 0, 0, + 203, 204, 205, 0, 0, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 410, 224, 225, 226, 227, 228, 229, 0, + 0, 0, 0, 0, 0, 0, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 235, 236, 237, 238, 384, + 385, 386, 387, 239, 0, 0, 0, 388, 389, 390, + 0, 0, 0, 0, 391, 0, 392, 243, 244, 245, + 0, 0, 0, 0, 0, 0, 0, 246, 23, 393, + 247, 0, 394, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 257, + 395, 396, 397, 258, 0, 0, 0, 0, 260, 261, + 262, 398, 263, 264, 265, 399, 0, 400, 114, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 266, 411, 0, 0, 0, 0, + 0, 268, 0, 0, 0, 0, 355, 0, 0, 0, + 1733, 0, 0, 271, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 708, 580, 581, + 582, 583, 0, 0, 0, 0, 584, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1080, 0, 0, 257, + 395, 396, 397, 258, 0, 0, 0, 0, 260, 261, + 262, 398, 263, 264, 265, 399, 0, 400, 114, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 266, 411, 0, 0, 0, 0, + 0, 268, 202, 160, 0, 0, 355, 0, 0, 203, + 204, 205, 0, 271, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 410, 224, 225, 226, 227, 228, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 264, 409, 0, 0, 0, - 0, 0, 266, 202, 160, 0, 0, 353, 0, 0, - 203, 204, 205, 0, 269, 206, 207, 208, 209, 210, + 0, 0, 0, 0, 235, 236, 237, 238, 0, 0, + 0, 0, 239, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 243, 244, 245, 0, + 0, 0, 0, 202, 160, 0, 246, 23, 856, 247, + 203, 204, 205, 0, 0, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, - 221, 222, 408, 224, 225, 226, 227, 228, 229, 0, + 221, 222, 410, 224, 225, 226, 227, 228, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 235, 236, 237, 238, 0, 0, 0, 0, 239, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 241, 242, 243, 0, 0, - 0, 0, 0, 0, 0, 244, 23, 0, 245, 202, - 160, 0, 1290, 0, 0, 0, 203, 204, 205, 0, - 0, 206, 207, 208, 209, 210, 211, 212, 213, 214, - 215, 216, 217, 218, 219, 220, 221, 222, 408, 224, - 225, 226, 227, 228, 229, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, - 0, 235, 236, 237, 238, 0, 0, 0, 0, 239, + 0, 0, 0, 0, 0, 0, 0, 243, 244, 245, + 0, 0, 0, 0, 0, 0, 0, 246, 23, 0, + 247, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, 577, 578, 708, 580, 581, 582, 583, 0, + 0, 0, 0, 584, 0, 0, 0, 0, 257, 0, + 0, 0, 258, 1081, 0, 0, 0, 260, 261, 262, + 0, 263, 264, 265, 0, 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 241, 242, 243, 0, 0, 0, 0, 0, 0, - 0, 244, 23, 0, 245, 0, 0, 562, 563, 564, - 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, - 704, 576, 577, 578, 579, 0, 0, 255, 0, 580, - 0, 256, 0, 0, 0, 0, 258, 259, 260, 1264, - 261, 262, 263, 0, 0, 0, 114, 0, 0, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 264, 409, 0, 41, 42, 43, 44, 266, - 0, 46, 0, 0, 353, 1064, 0, 0, 741, 53, - 0, 269, 56, 742, 0, 743, 744, 0, 745, 0, + 0, 0, 0, 624, 625, 0, 0, 0, 0, 0, + 268, 0, 0, 0, 0, 626, 0, 0, 0, 316, + 0, 0, 271, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 708, 580, 581, 582, + 583, 0, 0, 0, 0, 584, 0, 0, 0, 257, + 0, 0, 0, 258, 0, 1082, 0, 0, 260, 261, + 262, 0, 263, 264, 265, 0, 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 77, 0, 0, 0, 0, - 0, 0, 0, 255, 0, 0, 0, 256, 0, 0, - 0, 0, 258, 259, 260, 0, 261, 262, 263, 91, - 92, 93, 114, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 264, 409, - 0, 0, 0, 0, 0, 266, 202, 160, 0, 1442, - 353, 0, 0, 203, 204, 205, 0, 269, 206, 207, - 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 408, 224, 225, 226, 227, - 228, 229, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1000, 0, 0, 0, 235, 236, - 237, 238, 0, 0, 0, 0, 239, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 241, 242, - 243, 0, 0, 0, 0, 0, 0, 0, 244, 23, - 0, 245, 202, 160, 0, 1505, 0, 0, 0, 203, - 204, 205, 0, 0, 206, 207, 208, 209, 210, 211, + 0, 0, 0, 0, 266, 411, 0, 0, 0, 0, + 0, 268, 202, 160, 0, 0, 355, 0, 0, 203, + 204, 205, 0, 271, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, - 222, 408, 224, 225, 226, 227, 228, 229, 0, 0, + 222, 410, 224, 225, 226, 227, 228, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 7, 8, 0, 235, 236, 237, 238, 0, 0, + 0, 0, 0, 0, 235, 236, 237, 238, 0, 0, 0, 0, 239, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 241, 242, 243, 0, 0, 0, - 0, 0, 0, 0, 244, 23, 0, 245, 0, 0, - 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, - 572, 573, 574, 704, 576, 577, 578, 579, 0, 0, - 255, 0, 580, 0, 256, 0, 0, 0, 0, 258, - 259, 260, 1347, 261, 262, 263, 0, 0, 0, 114, - 0, 0, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 264, 409, 0, 41, 42, - 43, 44, 266, 0, 46, 0, 0, 353, 0, 0, - 0, 741, 53, 0, 269, 56, 742, 0, 743, 744, - 0, 745, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 77, 0, - 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, - 256, 0, 0, 0, 0, 258, 259, 260, 0, 261, - 262, 263, 91, 92, 93, 114, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 243, 244, 245, 0, + 0, 0, 0, 0, 0, 0, 246, 23, 0, 247, + 202, 160, 0, 1298, 0, 0, 0, 203, 204, 205, + 0, 0, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 410, + 224, 225, 226, 227, 228, 229, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 235, 236, 237, 238, 0, 0, 0, 0, + 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 243, 244, 245, 0, 0, 0, + 0, 0, 0, 0, 246, 23, 0, 247, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 708, 580, 581, 582, 583, 0, 0, 257, 0, + 584, 0, 258, 0, 0, 0, 0, 260, 261, 262, + 1083, 263, 264, 265, 0, 0, 0, 114, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 266, 411, 0, 0, 0, 0, 0, + 268, 0, 0, 0, 0, 355, 1070, 0, 0, 0, + 0, 0, 271, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 708, 580, 581, 582, + 583, 0, 0, 0, 0, 584, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1121, 257, 0, 0, 0, + 258, 0, 0, 0, 0, 260, 261, 262, 0, 263, + 264, 265, 0, 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 264, 409, 0, 0, 0, 0, 0, 266, 202, - 160, 0, 0, 353, 0, 0, 203, 204, 205, 0, - 269, 206, 207, 208, 209, 210, 211, 212, 213, 214, - 215, 216, 217, 218, 219, 220, 221, 222, 408, 224, + 0, 266, 411, 0, 0, 0, 0, 0, 268, 202, + 160, 0, 1452, 355, 0, 0, 203, 204, 205, 0, + 271, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 217, 218, 219, 220, 221, 222, 410, 224, 225, 226, 227, 228, 229, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1002, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 235, 236, 237, 238, 0, 0, 0, 0, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 241, 242, 243, 0, 0, 0, 0, 202, 160, - 0, 244, 23, 0, 245, 203, 204, 205, 0, 0, - 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 408, 224, 225, - 226, 227, 228, 229, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 243, 244, 245, 0, 0, 0, 0, + 0, 0, 0, 246, 23, 0, 247, 202, 160, 0, + 1515, 0, 0, 0, 203, 204, 205, 0, 0, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 410, 224, 225, 226, + 227, 228, 229, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 235, + 236, 237, 238, 0, 0, 0, 0, 239, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 243, 244, 245, 0, 0, 0, 0, 0, 0, + 0, 246, 23, 0, 247, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 708, 580, + 581, 582, 583, 0, 0, 257, 0, 584, 0, 258, + 0, 0, 0, 0, 260, 261, 262, 1131, 263, 264, + 265, 0, 0, 0, 114, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 266, 411, 0, 0, 0, 0, 0, 268, 0, 0, + 0, 0, 355, 0, 0, 0, 0, 0, 0, 271, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1132, 257, 0, 0, 0, 258, 0, 0, + 0, 0, 260, 261, 262, 0, 263, 264, 265, 0, + 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 266, 411, + 0, 0, 0, 0, 0, 268, 202, 160, 0, 0, + 355, 0, 0, 203, 204, 205, 0, 271, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 410, 224, 225, 226, 227, + 228, 229, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 235, 236, + 237, 238, 0, 0, 0, 0, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 235, 236, 237, 238, 7, 8, 0, 0, 239, 0, + 243, 244, 245, 0, 0, 0, 0, 202, 160, 0, + 246, 23, 0, 247, 203, 204, 205, 0, 0, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 410, 224, 225, 226, + 227, 228, 229, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 235, + 236, 237, 238, 0, 0, 0, 0, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 241, 242, 243, 0, 0, 0, 0, 0, 0, 0, - 244, 23, 0, 245, 562, 563, 564, 565, 566, 567, - 568, 569, 570, 571, 572, 573, 574, 704, 576, 577, - 578, 579, 0, 0, 0, 0, 580, 0, 0, 0, - 0, 0, 0, 255, 0, 0, 1436, 256, 0, 0, - 0, 0, 258, 259, 260, 0, 261, 262, 263, 0, - 0, 0, 114, 0, 0, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 264, 409, - 0, 41, 42, 43, 44, 266, 0, 46, 0, 0, - 353, 1558, 0, 0, 741, 53, 0, 269, 56, 742, - 0, 743, 744, 0, 745, 0, 0, 0, 1011, 0, + 0, 243, 244, 245, 0, 0, 0, 0, 0, 0, + 0, 246, 23, 0, 247, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 708, 580, + 581, 582, 583, 0, 0, 0, 0, 584, 0, 0, + 0, 0, 257, 0, 0, 0, 258, 1133, 0, 0, + 0, 260, 261, 262, 0, 263, 264, 265, 0, 0, + 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 266, 411, 0, + 0, 0, 0, 0, 268, 0, 0, 0, 0, 355, + 1568, 0, 0, 0, 0, 0, 271, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, + 708, 580, 581, 582, 583, 0, 0, 0, 0, 584, + 0, 0, 0, 257, 0, 0, 0, 258, 0, 1138, + 0, 0, 260, 261, 262, 0, 263, 264, 265, 0, + 0, 0, 114, 0, 7, 8, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 266, 411, + 0, 0, 0, 0, 0, 268, 202, 160, 0, 0, + 355, 1892, 0, 203, 204, 205, 0, 271, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 410, 224, 225, 226, 227, + 228, 229, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 235, 236, + 237, 238, 0, 0, 0, 0, 239, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 243, 244, 245, 41, 42, 43, 44, 0, 0, 46, + 246, 23, 0, 247, 0, 0, 745, 53, 0, 0, + 56, 746, 0, 747, 748, 0, 749, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 77, 255, 0, 0, 1012, 256, 0, 0, 0, - 0, 258, 259, 260, 0, 261, 262, 263, 0, 0, - 0, 114, 0, 0, 0, 91, 92, 93, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 264, 409, 0, - 0, 0, 0, 0, 266, 202, 160, 0, 0, 353, - 1882, 0, 203, 204, 205, 0, 269, 206, 207, 208, - 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, - 219, 220, 221, 222, 408, 224, 225, 226, 227, 228, - 229, 0, 0, 7, 8, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 235, 236, 237, - 238, 0, 0, 0, 0, 239, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 241, 242, 243, - 0, 0, 0, 0, 0, 0, 0, 244, 23, 0, - 245, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1437, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 0, 0, 0, - 41, 42, 43, 44, 0, 0, 46, 0, 0, 0, - 0, 0, 0, 741, 53, 0, 0, 56, 742, 0, - 743, 744, 0, 745, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 7, 8, 0, 0, 0, 0, 0, - 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, - 0, 0, 0, 256, 91, 92, 93, 0, 258, 259, - 260, 0, 261, 262, 263, 0, 0, 0, 114, 0, + 0, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 8, 0, 0, 264, 409, 0, 0, 0, 0, - 0, 266, 0, 0, 0, 0, 353, 0, 0, 0, - 0, 0, 0, 269, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 0, 0, 0, - 41, 42, 43, 44, 0, 0, 46, 0, 0, 1195, - 0, 0, 0, 741, 53, 0, 0, 56, 742, 0, - 743, 744, 0, 745, 0, 0, 0, 7, 8, 0, + 0, 7, 8, 0, 0, 0, 0, 91, 92, 93, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1139, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, + 0, 0, 257, 0, 0, 0, 258, 0, 0, 0, + 0, 260, 261, 262, 0, 263, 264, 265, 0, 0, + 0, 114, 959, 0, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 266, 411, 0, + 41, 42, 43, 44, 268, 0, 46, 0, 0, 355, + 0, 0, 0, 745, 53, 0, 271, 56, 746, 0, + 747, 748, 0, 749, 0, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 0, 0, 0, 41, 42, 43, 44, 0, 0, 46, 91, 92, 93, 0, 0, 0, - 741, 53, 0, 0, 56, 742, 0, 743, 744, 0, - 745, 0, 0, 0, 7, 8, 0, 0, 0, 0, + 745, 53, 0, 0, 56, 746, 0, 747, 748, 0, + 749, 0, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 91, 92, 93, 41, 42, 43, 44, 0, 0, - 46, 0, 0, 0, 0, 0, 0, 741, 53, 1197, - 0, 56, 742, 0, 743, 744, 0, 745, 0, 0, - 0, 7, 8, 0, 0, 0, 0, 0, 0, 0, + 46, 0, 0, 0, 0, 0, 0, 745, 53, 1006, + 0, 56, 746, 0, 747, 748, 0, 749, 0, 7, + 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 0, 0, 0, 41, 42, 43, 44, 0, 0, 46, 91, 92, - 93, 0, 0, 0, 741, 53, 1198, 0, 56, 742, - 0, 743, 744, 0, 745, 0, 0, 0, 7, 8, + 93, 0, 0, 0, 745, 53, 1008, 0, 56, 746, + 0, 747, 748, 0, 749, 0, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 91, 92, 93, 41, 42, 43, 44, 0, 0, 46, 0, 0, 0, 0, 0, - 0, 741, 53, 1217, 0, 56, 742, 0, 743, 744, - 0, 745, 0, 0, 0, 7, 8, 0, 0, 0, + 0, 745, 53, 1203, 0, 56, 746, 0, 747, 748, + 0, 749, 0, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 0, 0, 0, 41, 42, 43, 44, 0, - 0, 46, 91, 92, 93, 0, 0, 0, 741, 53, - 1235, 0, 56, 742, 0, 743, 744, 0, 745, 0, - 0, 0, 7, 8, 0, 0, 0, 0, 0, 0, + 0, 46, 91, 92, 93, 0, 0, 0, 745, 53, + 1205, 0, 56, 746, 0, 747, 748, 0, 749, 0, + 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 91, 92, 93, 41, 42, 43, 44, 0, 0, 46, 0, - 0, 0, 0, 0, 0, 741, 53, 1249, 0, 56, - 742, 0, 743, 744, 0, 745, 0, 0, 0, 7, - 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 745, 53, 1206, 0, 56, + 746, 0, 747, 748, 0, 749, 0, 7, 8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 0, 0, 0, 41, 42, 43, 44, 0, 0, 46, 91, 92, 93, 0, - 0, 0, 741, 53, 1282, 0, 56, 742, 0, 743, - 744, 0, 745, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 745, 53, 1225, 0, 56, 746, 0, 747, + 748, 0, 749, 0, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 91, 92, 93, 41, 42, 43, 44, - 0, 0, 46, 0, 0, 0, 0, 0, 0, 741, - 53, 1434, 0, 56, 742, 0, 743, 744, 0, 745, - -4, 1, 0, 0, -4, 0, 0, 0, 0, 0, - 0, 0, 0, -4, -4, 0, 77, 562, 563, 564, - 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, - 704, 576, 577, 578, 579, 0, 0, 0, 0, 580, - 91, 92, 93, 0, -4, -4, 0, 0, 2054, 1480, + 0, 0, 46, 0, 0, 0, 0, 0, 0, 745, + 53, 1243, 0, 56, 746, 0, 747, 748, 0, 749, + 0, 7, 8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 77, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 0, 0, 0, 41, 42, 43, 44, 0, 0, 46, + 91, 92, 93, 0, 0, 0, 745, 53, 1257, 0, + 56, 746, 0, 747, 748, 0, 749, 0, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -4, -4, -4, 0, 0, 0, - -4, -4, 0, -4, 0, 0, 0, 0, -4, -4, - -4, -4, 0, -4, -4, 0, -4, 0, 0, 0, - 0, -4, -4, -4, -4, -4, -4, -4, -4, -4, - -4, -4, -4, -4, -4, -4, -4, 0, 0, -4, - -4, -4, -4, -4, -4, 2113, -4, 0, -4, -4, + 0, 0, 0, 77, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 91, 92, 93, + 41, 42, 43, 44, 0, 0, 46, 0, 0, 0, + 0, 0, 0, 745, 53, 1290, 0, 56, 746, 0, + 747, 748, 0, 749, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 77, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 0, 0, 0, 41, 42, 43, + 44, 0, 0, 46, 91, 92, 93, 0, 0, 0, + 745, 53, 1444, 0, 56, 746, 0, 747, 748, 0, + 749, 0, 0, 0, 0, 0, -4, 1, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 77, 0, -4, + -4, 0, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, 577, 578, 708, 580, 581, 582, 583, + 0, 91, 92, 93, 584, 0, 0, 0, 0, 0, + -4, -4, 0, 0, 1141, 0, 0, 0, 0, 2064, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -4, -4, -4, 0, 0, 0, -4, -4, 0, 0, + 0, -4, 0, 0, 0, 0, -4, -4, -4, -4, + 0, -4, -4, 0, -4, 0, 0, 0, 0, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, - -4, -4, -4, 0, 0, -4, -4, -4, -4, -4, + -4, -4, -4, -4, -4, 0, 2123, -4, -4, -4, + -4, -4, -4, 0, -4, 0, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, - -4, -4, -4, -4, -4, -4, -4, -4, -4, 0, - 6, 0, -4, -4, -4, 0, 0, 0, -4, 7, - 8, 0, 0, -4, -4, -4, -4, 0, 0, -4, - 0, -4, 0, -4, -4, -4, -4, -4, -4, -4, - -4, -4, -4, -4, -4, -4, -4, 0, 0, 0, - 9, 10, 0, -4, -4, -4, 0, 0, 0, 0, - 0, 0, 0, 0, -4, 0, -4, 0, 0, 0, - 11, 12, 13, 0, 0, 0, 14, 15, 0, 16, + -4, 0, 0, -4, -4, -4, -4, -4, -4, -4, + -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, + -4, -4, -4, -4, -4, -4, -4, 0, 6, 0, + -4, -4, -4, 0, 0, 0, -4, 7, 8, 0, + 0, -4, -4, -4, -4, 0, 0, -4, 0, -4, + 0, -4, -4, -4, -4, -4, -4, -4, -4, -4, + -4, -4, -4, -4, -4, 0, 0, 0, 9, 10, + 0, -4, -4, -4, 0, 0, 0, 0, 0, 0, + 0, 0, -4, 0, -4, 0, 0, 0, 11, 12, + 13, 0, 0, 0, 14, 15, 0, 0, 0, 16, 0, 0, 0, 0, 17, 18, 19, 20, 0, 21, 22, 0, 23, 0, 0, 0, 0, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, @@ -2825,2357 +2812,2411 @@ static const yytype_int16 yytable[] = 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 0, 0, 0, 86, 87, 88, 0, 0, 0, 89, 0, 0, 0, 0, 90, - 91, 92, 93, 160, 372, 94, 0, 95, 0, 96, + 91, 92, 93, 160, 374, 94, 0, 95, 0, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 0, 0, 0, 0, 0, 0, 110, 111, 112, 0, 7, 8, 0, 0, 0, 0, 0, - 113, 0, 114, 0, 0, 373, 374, 375, 376, 377, - 378, 379, 380, 381, 0, 0, 0, 0, 382, 383, - 384, 385, 0, 0, 0, 0, 386, 387, 388, 0, - 0, 389, 0, 390, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 391, 0, 0, 392, - 0, 0, 0, 292, 0, 0, 293, 0, 0, 294, - 0, 295, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 44, 0, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 0, 0, 422, - 41, 42, 43, 44, 0, 0, 46, 0, 0, 0, - 0, 0, 0, 741, 53, 0, 0, 56, 742, 0, - 743, 744, 0, 745, 0, 0, 0, 0, 0, 0, + 113, 0, 114, 0, 0, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 0, 0, 0, 0, 384, 385, + 386, 387, 0, 0, 0, 0, 388, 389, 390, 0, + 0, 0, 0, 391, 0, 392, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 393, 0, + 0, 394, 0, 0, 0, 294, 0, 0, 295, 0, + 0, 296, 0, 297, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 44, 0, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 0, + 0, 424, 41, 42, 43, 44, 7, 8, 46, 0, + 0, 0, 0, 0, 0, 745, 53, 0, 0, 56, + 746, 0, 747, 748, 0, 749, 0, 0, 0, 1017, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 77, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 91, 92, 93, 393, 394, 395, - 0, 0, 0, 1604, 0, 0, 0, 0, 396, 0, - 0, 0, 397, 0, 398, 114, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 704, - 576, 577, 578, 579, 0, 0, 0, 0, 580, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1605, 562, - 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, - 573, 574, 704, 576, 577, 578, 579, 0, 0, 0, - 0, 580, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1606, 562, 563, 564, 565, 566, 567, 568, 569, - 570, 571, 572, 573, 574, 704, 576, 577, 578, 579, - 0, 0, 0, 0, 580, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1620, 562, 563, 564, 565, 566, - 567, 568, 569, 570, 571, 572, 573, 574, 704, 576, - 577, 578, 579, 0, 0, 0, 0, 580, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1751, 562, 563, - 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, - 574, 704, 576, 577, 578, 579, 0, 0, 0, 0, - 580, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1869, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1870, 562, 563, 564, 565, 566, 567, - 568, 569, 570, 571, 572, 573, 574, 704, 576, 577, - 578, 579, 0, 0, 0, 0, 580, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1898, 562, 563, 564, - 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, - 704, 576, 577, 578, 579, 0, 0, 0, 0, 580, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1901, - 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, - 572, 573, 574, 704, 576, 577, 578, 579, 0, 0, - 0, 0, 580, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1968, 562, 563, 564, 565, 566, 567, 568, - 569, 570, 571, 572, 573, 574, 704, 576, 577, 578, - 579, 0, 0, 0, 0, 580, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2022, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 704, - 576, 577, 578, 579, 0, 0, 0, 0, 580, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2023, 562, - 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, - 573, 574, 704, 576, 577, 578, 579, 0, 0, 0, - 0, 580, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2037, 562, 563, 564, 565, 566, 567, 568, 569, - 570, 571, 572, 573, 574, 704, 576, 577, 578, 579, - 0, 0, 0, 0, 580, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2039, 562, 563, 564, 565, 566, - 567, 568, 569, 570, 571, 572, 573, 574, 704, 576, - 577, 578, 579, 0, 0, 0, 0, 580, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2072, 562, 563, - 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, - 574, 704, 576, 577, 578, 579, 0, 0, 0, 0, - 580, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2100, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2105, 562, 563, 564, 565, 566, 567, - 568, 569, 570, 571, 572, 573, 574, 704, 576, 577, - 578, 579, 0, 0, 0, 0, 580, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2106, 562, 563, 564, - 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, - 704, 576, 577, 578, 579, 0, 0, 0, 0, 580, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2107, - 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, - 572, 573, 574, 704, 576, 577, 578, 579, 0, 0, - 0, 0, 580, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2147, 562, 563, 564, 565, 566, 567, 568, - 569, 570, 571, 572, 573, 574, 704, 576, 577, 578, - 579, 0, 0, 0, 0, 580, 0, 0, 0, 0, - 0, 798, 562, 563, 564, 565, 566, 567, 568, 569, - 570, 571, 572, 573, 574, 704, 576, 577, 578, 579, - 0, 0, 0, 0, 580, 0, 0, 0, 0, 0, - 1046, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 0, 0, 0, 0, 1102, - 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, - 572, 573, 574, 704, 576, 577, 578, 579, 0, 0, - 0, 0, 580, 0, 0, 0, 0, 0, 1145, 562, - 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, - 573, 574, 704, 576, 577, 578, 579, 0, 0, 0, - 0, 580, 0, 0, 0, 0, 0, 1146, 562, 563, - 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, - 574, 704, 576, 577, 578, 579, 0, 0, 0, 0, - 580, 0, 0, 0, 0, 0, 1189, 562, 563, 564, - 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, - 704, 576, 577, 578, 579, 0, 0, 0, 0, 580, - 0, 0, 0, 0, 0, 1220, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 704, - 576, 577, 578, 579, 0, 0, 0, 0, 580, 0, - 0, 0, 0, 0, 1240, 562, 563, 564, 565, 566, - 567, 568, 569, 570, 571, 572, 573, 574, 704, 576, - 577, 578, 579, 0, 0, 0, 0, 580, 0, 0, - 0, 0, 0, 1296, 562, 563, 564, 565, 566, 567, - 568, 569, 570, 571, 572, 573, 574, 704, 576, 577, - 578, 579, 0, 0, 0, 0, 580, 0, 0, 0, - 0, 0, 1316, 562, 563, 564, 565, 566, 567, 568, - 569, 570, 571, 572, 573, 574, 704, 576, 577, 578, - 579, 0, 0, 0, 0, 580, 0, 0, 0, 0, - 0, 1438, 562, 563, 564, 565, 566, 567, 568, 569, - 570, 571, 572, 573, 574, 704, 576, 577, 578, 579, - 0, 0, 0, 0, 580, 0, 0, 0, 0, 0, - 1511, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 0, 0, 0, 0, 1801, - 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, - 572, 573, 574, 704, 576, 577, 578, 579, 0, 0, - 0, 0, 580, 0, 0, 0, 0, 0, 1812, 562, - 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, - 573, 574, 704, 576, 577, 578, 579, 0, 0, 0, - 0, 580, 0, 0, 0, 0, 0, 1849, 562, 563, - 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, - 574, 704, 576, 577, 578, 579, 0, 0, 0, 0, - 580, 0, 0, 0, 0, 0, 1918, 562, 563, 564, - 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, - 704, 576, 577, 578, 579, 0, 0, 0, 0, 580, - 0, 0, 0, 0, 0, 1933, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 704, - 576, 577, 578, 579, 0, 0, 0, 0, 580, 0, - 0, 0, 0, 0, 1945, 562, 563, 564, 565, 566, - 567, 568, 569, 570, 571, 572, 573, 574, 704, 576, - 577, 578, 579, 0, 0, 0, 0, 580, 0, 0, - 0, 0, 0, 2002, 562, 563, 564, 565, 566, 567, - 568, 569, 570, 571, 572, 573, 574, 704, 576, 577, - 578, 579, 0, 0, 0, 0, 580, 0, 0, 0, - 0, 0, 2011, 562, 563, 564, 565, 566, 567, 568, - 569, 570, 571, 572, 573, 574, 704, 576, 577, 578, - 579, 0, 0, 0, 0, 580, 0, 0, 0, 0, - 0, 2012, 562, 563, 564, 565, 566, 567, 568, 569, - 570, 571, 572, 573, 574, 704, 576, 577, 578, 579, - 0, 0, 0, 0, 580, 0, 0, 0, 0, 0, - 2035, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 0, 0, 0, 0, 2086, - 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, - 572, 573, 574, 704, 576, 577, 578, 579, 0, 0, - 0, 0, 580, 0, 0, 0, 0, 0, 2126, 562, - 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, - 573, 574, 704, 576, 577, 578, 579, 0, 0, 0, - 0, 580, 0, 0, 0, 0, 0, 2145, 562, 563, - 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, - 574, 704, 576, 577, 578, 579, 0, 0, 0, 0, - 580, 0, 0, 0, 0, 0, 2165, 562, 563, 564, - 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, - 704, 576, 577, 578, 579, 0, 0, 0, 0, 580, - 0, 0, 0, 0, 0, 2166, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 704, - 576, 577, 578, 579, 0, 0, 0, 0, 580, 0, - 0, 0, 0, 0, 2167, 562, 563, 564, 565, 566, - 567, 568, 569, 570, 571, 572, 573, 574, 704, 576, - 577, 578, 579, 0, 0, 0, 0, 580, 0, 0, - 0, 0, 705, 562, 563, 564, 565, 566, 567, 568, - 569, 570, 571, 572, 573, 574, 704, 576, 577, 578, - 579, 0, 0, 0, 0, 580, 0, 0, 0, 0, - 913, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 0, 0, 0, 1911, 562, - 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, - 573, 574, 704, 576, 577, 578, 579, 0, 0, 0, - 0, 580, 0, 727, 0, 728, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 704, - 576, 577, 578, 579, 0, 0, 0, 0, 580, 0, - 0, 0, 974, 562, 563, 564, 565, 566, 567, 568, - 569, 570, 571, 572, 573, 574, 704, 576, 577, 578, - 579, 0, 0, 0, 0, 580, 0, 0, 0, 1022, - 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, - 572, 573, 574, 704, 576, 577, 578, 579, 0, 0, - 0, 0, 580, 0, 0, 0, 1169, 562, 563, 564, - 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, - 704, 576, 577, 578, 579, 0, 0, 0, 0, 580, - 0, 0, 0, 1234, 562, 563, 564, 565, 566, 567, - 568, 569, 570, 571, 572, 573, 574, 704, 576, 577, - 578, 579, 0, 0, 0, 0, 580, 0, 0, 0, - 1236, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 0, 0, 1241, 562, 563, - 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, - 574, 704, 576, 577, 578, 579, 0, 0, 0, 0, - 580, 0, 0, 0, 1242, 562, 563, 564, 565, 566, - 567, 568, 569, 570, 571, 572, 573, 574, 704, 576, - 577, 578, 579, 0, 0, 0, 0, 580, 0, 0, - 0, 1330, 562, 563, 564, 565, 566, 567, 568, 569, - 570, 571, 572, 573, 574, 704, 576, 577, 578, 579, - 0, 0, 0, 0, 580, 0, 0, 0, 1344, 562, - 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, - 573, 574, 704, 576, 577, 578, 579, 0, 0, 0, - 0, 580, 0, 0, 0, 1540, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 704, - 576, 577, 578, 579, 0, 0, 0, 0, 580, 0, - 0, 0, 1626, 562, 563, 564, 565, 566, 567, 568, - 569, 570, 571, 572, 573, 574, 704, 576, 577, 578, - 579, 0, 0, 0, 0, 580, 0, 0, 0, 1675, - 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, - 572, 573, 574, 704, 576, 577, 578, 579, 0, 0, - 0, 0, 580, 0, 0, 0, 1861, 562, 563, 564, - 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, - 704, 576, 577, 578, 579, 0, 0, 0, 0, 580, - 0, 0, 0, 1903, 562, 563, 564, 565, 566, 567, - 568, 569, 570, 571, 572, 573, 574, 704, 576, 577, - 578, 579, 0, 0, 0, 0, 580, 0, 0, 0, - 1919, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 779, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 704, - 576, 577, 578, 579, 0, 0, 0, 0, 580, 0, - 780, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 781, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 704, - 576, 577, 578, 579, 0, 0, 0, 0, 580, 0, - 783, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 784, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 704, - 576, 577, 578, 579, 0, 0, 0, 0, 580, 0, - 785, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 787, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 704, - 576, 577, 578, 579, 0, 0, 0, 0, 580, 0, - 788, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 789, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 704, - 576, 577, 578, 579, 0, 0, 0, 0, 580, 0, - 790, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 791, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 704, - 576, 577, 578, 579, 0, 0, 0, 0, 580, 0, - 792, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 793, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 704, - 576, 577, 578, 579, 0, 0, 0, 0, 580, 0, - 795, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 796, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 704, - 576, 577, 578, 579, 0, 0, 0, 0, 580, 0, - 797, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 862, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 704, - 576, 577, 578, 579, 0, 0, 0, 0, 580, 0, - 897, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 943, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 704, - 576, 577, 578, 579, 0, 0, 0, 0, 580, 0, - 962, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 964, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 704, - 576, 577, 578, 579, 0, 0, 0, 0, 580, 0, - 965, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 966, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 704, - 576, 577, 578, 579, 0, 0, 0, 0, 580, 0, - 972, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 973, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 704, - 576, 577, 578, 579, 0, 0, 0, 0, 580, 0, - 1010, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 1021, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 704, - 576, 577, 578, 579, 0, 0, 0, 0, 580, 0, - 1082, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 1086, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 704, - 576, 577, 578, 579, 0, 0, 0, 0, 580, 0, - 1098, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 1168, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 704, - 576, 577, 578, 579, 0, 0, 0, 0, 580, 0, - 1178, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 1179, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 704, - 576, 577, 578, 579, 0, 0, 0, 0, 580, 0, - 1180, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 1190, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 704, - 576, 577, 578, 579, 0, 0, 0, 0, 580, 0, - 1219, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 1221, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 704, - 576, 577, 578, 579, 0, 0, 0, 0, 580, 0, - 1222, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 1223, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 704, - 576, 577, 578, 579, 0, 0, 0, 0, 580, 0, - 1224, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 1225, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 704, - 576, 577, 578, 579, 0, 0, 0, 0, 580, 0, - 1226, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 1227, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 704, - 576, 577, 578, 579, 0, 0, 0, 0, 580, 0, - 1233, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 1329, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 704, - 576, 577, 578, 579, 0, 0, 0, 0, 580, 0, - 1343, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 1541, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 704, - 576, 577, 578, 579, 0, 0, 0, 0, 580, 0, - 1571, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 1572, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 704, - 576, 577, 578, 579, 0, 0, 0, 0, 580, 0, - 1573, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 1574, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 704, - 576, 577, 578, 579, 0, 0, 0, 0, 580, 0, - 1612, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 1625, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 704, - 576, 577, 578, 579, 0, 0, 0, 0, 580, 0, - 1738, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 1740, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 704, - 576, 577, 578, 579, 0, 0, 0, 0, 580, 0, - 1743, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 1750, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 704, - 576, 577, 578, 579, 0, 0, 0, 0, 580, 0, - 1802, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 1811, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 704, - 576, 577, 578, 579, 0, 0, 0, 0, 580, 0, - 1834, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 1902, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 704, - 576, 577, 578, 579, 0, 0, 0, 0, 580, 0, - 1966, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 1967, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 704, - 576, 577, 578, 579, 0, 0, 0, 0, 580, 0, - 2099, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 704, 576, 577, 578, 579, 0, - 0, 0, 0, 580, 0, 2142, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 704, - 576, 577, 578, 579, 0, 0, 0, 0, 580 + 0, 0, 77, 0, 0, 0, 1018, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 91, 92, 93, 395, + 396, 397, 0, 0, 0, 0, 0, 0, 0, 0, + 398, 0, 0, 0, 399, 0, 400, 114, 0, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 0, 0, 0, 41, 42, 43, 44, 0, + 0, 46, 0, 0, 0, 0, 0, 0, 745, 53, + 0, 0, 56, 746, 0, 747, 748, 0, 749, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 77, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, 577, 578, 708, + 580, 581, 582, 583, 0, 0, 0, 0, 584, 91, + 92, 93, 0, 0, 0, 0, 0, 0, 1251, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 708, 580, 581, 582, 583, 0, 0, 0, + 0, 584, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1272, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, 577, 578, 708, 580, 581, 582, 583, + 0, 0, 0, 0, 584, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1355, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 708, 580, + 581, 582, 583, 0, 0, 0, 0, 584, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1446, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 708, 580, 581, 582, 583, 0, 0, 0, 0, + 584, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1447, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, 577, 578, 708, 580, 581, 582, 583, 0, + 0, 0, 0, 584, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1490, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 708, 580, 581, + 582, 583, 0, 0, 0, 0, 584, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1614, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, + 708, 580, 581, 582, 583, 0, 0, 0, 0, 584, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1615, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1616, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 708, 580, 581, 582, + 583, 0, 0, 0, 0, 584, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1630, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, 577, 578, 708, + 580, 581, 582, 583, 0, 0, 0, 0, 584, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1761, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 708, 580, 581, 582, 583, 0, 0, 0, + 0, 584, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1879, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, 577, 578, 708, 580, 581, 582, 583, + 0, 0, 0, 0, 584, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1880, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 708, 580, + 581, 582, 583, 0, 0, 0, 0, 584, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1908, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 708, 580, 581, 582, 583, 0, 0, 0, 0, + 584, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1911, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, 577, 578, 708, 580, 581, 582, 583, 0, + 0, 0, 0, 584, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1978, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 708, 580, 581, + 582, 583, 0, 0, 0, 0, 584, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2032, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, + 708, 580, 581, 582, 583, 0, 0, 0, 0, 584, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2033, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2047, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 708, 580, 581, 582, + 583, 0, 0, 0, 0, 584, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2049, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, 577, 578, 708, + 580, 581, 582, 583, 0, 0, 0, 0, 584, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2082, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 708, 580, 581, 582, 583, 0, 0, 0, + 0, 584, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2110, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, 577, 578, 708, 580, 581, 582, 583, + 0, 0, 0, 0, 584, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2115, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 708, 580, + 581, 582, 583, 0, 0, 0, 0, 584, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2116, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 708, 580, 581, 582, 583, 0, 0, 0, 0, + 584, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2117, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, 577, 578, 708, 580, 581, 582, 583, 0, + 0, 0, 0, 584, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2157, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 708, 580, 581, + 582, 583, 0, 0, 0, 0, 584, 0, 0, 0, + 0, 0, 802, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 708, 580, 581, 582, + 583, 0, 0, 0, 0, 584, 0, 0, 0, 0, + 0, 1052, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, 577, 578, 708, 580, 581, 582, 583, + 0, 0, 0, 0, 584, 0, 0, 0, 0, 0, + 1108, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, 577, 578, 708, 580, 581, 582, 583, 0, + 0, 0, 0, 584, 0, 0, 0, 0, 0, 1153, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 0, 0, 0, 0, 1154, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 708, 580, 581, 582, 583, 0, 0, 0, + 0, 584, 0, 0, 0, 0, 0, 1197, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 708, 580, 581, 582, 583, 0, 0, 0, 0, + 584, 0, 0, 0, 0, 0, 1228, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, + 708, 580, 581, 582, 583, 0, 0, 0, 0, 584, + 0, 0, 0, 0, 0, 1248, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, 577, 578, 708, + 580, 581, 582, 583, 0, 0, 0, 0, 584, 0, + 0, 0, 0, 0, 1304, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 708, 580, + 581, 582, 583, 0, 0, 0, 0, 584, 0, 0, + 0, 0, 0, 1324, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 708, 580, 581, + 582, 583, 0, 0, 0, 0, 584, 0, 0, 0, + 0, 0, 1403, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 708, 580, 581, 582, + 583, 0, 0, 0, 0, 584, 0, 0, 0, 0, + 0, 1404, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, 577, 578, 708, 580, 581, 582, 583, + 0, 0, 0, 0, 584, 0, 0, 0, 0, 0, + 1448, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, 577, 578, 708, 580, 581, 582, 583, 0, + 0, 0, 0, 584, 0, 0, 0, 0, 0, 1521, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 0, 0, 0, 0, 1811, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 708, 580, 581, 582, 583, 0, 0, 0, + 0, 584, 0, 0, 0, 0, 0, 1822, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 708, 580, 581, 582, 583, 0, 0, 0, 0, + 584, 0, 0, 0, 0, 0, 1859, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, + 708, 580, 581, 582, 583, 0, 0, 0, 0, 584, + 0, 0, 0, 0, 0, 1928, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, 577, 578, 708, + 580, 581, 582, 583, 0, 0, 0, 0, 584, 0, + 0, 0, 0, 0, 1943, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 708, 580, + 581, 582, 583, 0, 0, 0, 0, 584, 0, 0, + 0, 0, 0, 1955, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 708, 580, 581, + 582, 583, 0, 0, 0, 0, 584, 0, 0, 0, + 0, 0, 2012, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 708, 580, 581, 582, + 583, 0, 0, 0, 0, 584, 0, 0, 0, 0, + 0, 2021, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, 577, 578, 708, 580, 581, 582, 583, + 0, 0, 0, 0, 584, 0, 0, 0, 0, 0, + 2022, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, 577, 578, 708, 580, 581, 582, 583, 0, + 0, 0, 0, 584, 0, 0, 0, 0, 0, 2045, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 0, 0, 0, 0, 2096, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 708, 580, 581, 582, 583, 0, 0, 0, + 0, 584, 0, 0, 0, 0, 0, 2136, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 708, 580, 581, 582, 583, 0, 0, 0, 0, + 584, 0, 0, 0, 0, 0, 2155, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, + 708, 580, 581, 582, 583, 0, 0, 0, 0, 584, + 0, 0, 0, 0, 0, 2175, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, 577, 578, 708, + 580, 581, 582, 583, 0, 0, 0, 0, 584, 0, + 0, 0, 0, 0, 2176, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 708, 580, + 581, 582, 583, 0, 0, 0, 0, 584, 0, 0, + 0, 0, 0, 2177, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 708, 580, 581, + 582, 583, 0, 0, 0, 0, 584, 0, 0, 0, + 0, 709, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, 577, 578, 708, 580, 581, 582, 583, + 0, 0, 0, 0, 584, 0, 0, 0, 0, 919, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 0, 0, 0, 1921, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 708, 580, 581, 582, 583, 0, 0, 0, 0, + 584, 0, 731, 0, 732, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 708, 580, + 581, 582, 583, 0, 0, 0, 0, 584, 0, 0, + 0, 980, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, 577, 578, 708, 580, 581, 582, 583, + 0, 0, 0, 0, 584, 0, 0, 0, 1028, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 708, 580, 581, 582, 583, 0, 0, 0, + 0, 584, 0, 0, 0, 1177, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, 577, 578, 708, + 580, 581, 582, 583, 0, 0, 0, 0, 584, 0, + 0, 0, 1242, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 708, 580, 581, 582, + 583, 0, 0, 0, 0, 584, 0, 0, 0, 1244, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 0, 0, 1249, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, + 708, 580, 581, 582, 583, 0, 0, 0, 0, 584, + 0, 0, 0, 1250, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 708, 580, 581, + 582, 583, 0, 0, 0, 0, 584, 0, 0, 0, + 1338, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, 577, 578, 708, 580, 581, 582, 583, 0, + 0, 0, 0, 584, 0, 0, 0, 1352, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 708, 580, 581, 582, 583, 0, 0, 0, 0, + 584, 0, 0, 0, 1550, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 708, 580, + 581, 582, 583, 0, 0, 0, 0, 584, 0, 0, + 0, 1636, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, 577, 578, 708, 580, 581, 582, 583, + 0, 0, 0, 0, 584, 0, 0, 0, 1685, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 708, 580, 581, 582, 583, 0, 0, 0, + 0, 584, 0, 0, 0, 1871, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, 577, 578, 708, + 580, 581, 582, 583, 0, 0, 0, 0, 584, 0, + 0, 0, 1913, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 708, 580, 581, 582, + 583, 0, 0, 0, 0, 584, 0, 0, 0, 1929, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 783, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 708, 580, + 581, 582, 583, 0, 0, 0, 0, 584, 0, 784, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 785, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 708, 580, + 581, 582, 583, 0, 0, 0, 0, 584, 0, 787, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 788, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 708, 580, + 581, 582, 583, 0, 0, 0, 0, 584, 0, 789, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 791, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 708, 580, + 581, 582, 583, 0, 0, 0, 0, 584, 0, 792, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 793, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 708, 580, + 581, 582, 583, 0, 0, 0, 0, 584, 0, 794, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 795, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 708, 580, + 581, 582, 583, 0, 0, 0, 0, 584, 0, 796, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 797, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 708, 580, + 581, 582, 583, 0, 0, 0, 0, 584, 0, 799, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 800, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 708, 580, + 581, 582, 583, 0, 0, 0, 0, 584, 0, 801, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 868, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 708, 580, + 581, 582, 583, 0, 0, 0, 0, 584, 0, 903, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 949, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 708, 580, + 581, 582, 583, 0, 0, 0, 0, 584, 0, 968, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 970, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 708, 580, + 581, 582, 583, 0, 0, 0, 0, 584, 0, 971, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 972, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 708, 580, + 581, 582, 583, 0, 0, 0, 0, 584, 0, 978, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 979, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 708, 580, + 581, 582, 583, 0, 0, 0, 0, 584, 0, 1016, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 1027, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 708, 580, + 581, 582, 583, 0, 0, 0, 0, 584, 0, 1088, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 1092, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 708, 580, + 581, 582, 583, 0, 0, 0, 0, 584, 0, 1104, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 1176, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 708, 580, + 581, 582, 583, 0, 0, 0, 0, 584, 0, 1186, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 1187, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 708, 580, + 581, 582, 583, 0, 0, 0, 0, 584, 0, 1188, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 1198, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 708, 580, + 581, 582, 583, 0, 0, 0, 0, 584, 0, 1227, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 1229, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 708, 580, + 581, 582, 583, 0, 0, 0, 0, 584, 0, 1230, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 1231, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 708, 580, + 581, 582, 583, 0, 0, 0, 0, 584, 0, 1232, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 1233, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 708, 580, + 581, 582, 583, 0, 0, 0, 0, 584, 0, 1234, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 1235, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 708, 580, + 581, 582, 583, 0, 0, 0, 0, 584, 0, 1241, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 1337, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 708, 580, + 581, 582, 583, 0, 0, 0, 0, 584, 0, 1351, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 1551, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 708, 580, + 581, 582, 583, 0, 0, 0, 0, 584, 0, 1581, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 1582, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 708, 580, + 581, 582, 583, 0, 0, 0, 0, 584, 0, 1583, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 1584, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 708, 580, + 581, 582, 583, 0, 0, 0, 0, 584, 0, 1622, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 1635, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 708, 580, + 581, 582, 583, 0, 0, 0, 0, 584, 0, 1748, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 1750, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 708, 580, + 581, 582, 583, 0, 0, 0, 0, 584, 0, 1753, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 1760, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 708, 580, + 581, 582, 583, 0, 0, 0, 0, 584, 0, 1812, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 1821, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 708, 580, + 581, 582, 583, 0, 0, 0, 0, 584, 0, 1844, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 1912, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 708, 580, + 581, 582, 583, 0, 0, 0, 0, 584, 0, 1976, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 1977, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 708, 580, + 581, 582, 583, 0, 0, 0, 0, 584, 0, 2109, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 708, 580, 581, 582, 583, 0, 0, + 0, 0, 584, 0, 2152, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 708, 580, + 581, 582, 583, 0, 0, 0, 0, 584 }; static const yytype_int16 yycheck[] = { - 3, 307, 617, 618, 1214, 1400, 3, 319, 1662, 140, - 722, 60, 1218, 1706, 4, 1708, 709, 4, 730, 191, - 23, 5, 4, 4, 153, 23, 338, 199, 4, 4, - 4, 14, 5, 4, 105, 4, 107, 4, 4, 7, - 5, 5, 4, 6, 4, 738, 7, 6, 6, 52, - 6, 1693, 1883, 4, 4, 154, 4, 6, 6, 134, - 240, 241, 755, 94, 6, 100, 9, 100, 248, 140, - 763, 232, 233, 232, 233, 237, 238, 9, 81, 4, - 179, 243, 113, 7, 9, 244, 89, 0, 123, 248, - 123, 94, 253, 405, 165, 407, 195, 196, 134, 232, - 233, 100, 105, 415, 9, 86, 247, 182, 240, 241, - 6, 9, 253, 6, 1756, 151, 248, 289, 290, 291, - 253, 1775, 7, 159, 160, 161, 9, 232, 233, 165, - 166, 232, 233, 6, 244, 232, 233, 140, 134, 9, - 232, 233, 145, 146, 141, 248, 94, 6, 253, 252, - 153, 6, 253, 103, 104, 151, 253, 249, 244, 331, - 332, 333, 248, 159, 160, 161, 244, 170, 246, 165, - 166, 864, 7, 232, 233, 253, 348, 97, 7, 6, - 100, 244, 102, 186, 7, 232, 233, 245, 191, 66, - 67, 194, 69, 113, 253, 253, 199, 200, 201, 2030, - 169, 170, 171, 172, 167, 244, 253, 246, 167, 190, - 7, 232, 233, 249, 6, 232, 233, 179, 180, 179, - 180, 244, 1617, 194, 232, 233, 216, 94, 6, 216, - 97, 247, 253, 100, 216, 216, 253, 253, 232, 233, - 97, 216, 216, 100, 1454, 253, 113, 6, 251, 217, - 218, 219, 220, 249, 1908, 244, 113, 246, 245, 253, - 247, 251, 265, 248, 248, 268, 269, 248, 240, 241, - 246, 269, 248, 248, 248, 248, 252, 244, 244, 6, - 249, 284, 285, 248, 248, 288, 289, 290, 291, 250, - 248, 216, 248, 244, 606, 244, 608, 609, 301, 248, - 6, 244, 305, 246, 307, 138, 139, 250, 1962, 1021, - 1022, 144, 244, 625, 246, 240, 241, 4, 250, 244, - 244, 246, 246, 248, 97, 250, 329, 100, 331, 332, - 333, 643, 217, 218, 219, 220, 232, 233, 8, 244, - 244, 246, 240, 241, 248, 348, 244, 6, 246, 247, - 421, 354, 250, 244, 666, 240, 241, 240, 241, 232, - 233, 244, 244, 246, 246, 250, 248, 250, 540, 228, - 240, 241, 231, 2066, 244, 249, 246, 232, 233, 253, - 250, 6, 217, 218, 219, 220, 232, 233, 217, 218, - 219, 220, 4, 705, 217, 218, 219, 220, 232, 233, - 245, 228, 247, 532, 231, 240, 241, 253, 253, 412, - 413, 240, 241, 250, 417, 418, 253, 240, 241, 253, - 217, 218, 219, 220, 246, 232, 233, 245, 232, 233, - 433, 232, 233, 310, 311, 253, 250, 440, 252, 232, - 233, 318, 319, 232, 233, 134, 253, 248, 2102, 253, - 246, 138, 139, 140, 141, 240, 241, 144, 461, 1152, - 253, 1154, 151, 244, 253, 250, 153, 232, 233, 156, - 159, 160, 161, 244, 1167, 546, 165, 166, 232, 233, - 244, 134, 94, 245, 232, 233, 98, 490, 253, 232, - 233, 253, 104, 105, 94, 107, 108, 97, 151, 253, - 100, 2155, 102, 244, 1899, 253, 159, 160, 161, 244, - 253, 514, 165, 166, 94, 127, 245, 97, 521, 522, - 100, 244, 102, 526, 253, 528, 529, 530, 531, 532, - 6, 7, 535, 113, 232, 233, 539, 540, 541, 542, - 543, 544, 545, 245, 547, 674, 549, 545, 250, 547, - 248, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 232, - 233, 244, 575, 243, 232, 233, 232, 233, 581, 249, - 244, 244, 246, 249, 1277, 248, 250, 253, 115, 253, - 1283, 722, 248, 245, 244, 253, 249, 134, 601, 602, - 249, 253, 8, 244, 253, 917, 232, 233, 234, 235, - 236, 237, 238, 1228, 151, 249, 687, 243, 245, 253, - 617, 618, 159, 160, 161, 100, 253, 102, 165, 166, - 234, 235, 236, 237, 238, 1328, 245, 97, 247, 243, - 100, 244, 102, 246, 253, 8, 649, 650, 651, 1342, - 245, 245, 247, 247, 245, 1348, 247, 245, 253, 253, - 138, 139, 253, 249, 249, 253, 144, 253, 253, 672, - 673, 674, 675, 676, 677, 678, 679, 680, 244, 682, - 683, 684, 685, 686, 134, 688, 689, 690, 691, 692, - 249, 6, 695, 691, 253, 744, 249, 244, 52, 246, - 253, 248, 244, 706, 249, 3, 249, 778, 253, 249, - 253, 244, 249, 253, 249, 1427, 719, 249, 253, 249, - 249, 253, 100, 253, 253, 249, 729, 249, 248, 253, - 249, 253, 735, 249, 253, 244, 249, 253, 615, 616, - 253, 249, 249, 620, 244, 253, 253, 249, 751, 752, - 102, 253, 249, 244, 757, 249, 253, 760, 761, 253, - 249, 59, 893, 766, 253, 768, 249, 244, 248, 246, - 253, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 244, - 249, 249, 249, 243, 253, 253, 253, 249, 801, 248, - 803, 253, 1514, 249, 249, 249, 249, 253, 253, 253, - 253, 245, 100, 247, 1526, 221, 222, 223, 224, 225, + 3, 309, 66, 67, 1226, 69, 621, 622, 153, 1410, + 1222, 60, 713, 726, 4, 1716, 1672, 1718, 7, 3, + 23, 734, 4, 23, 7, 1703, 4, 4, 4, 4, + 191, 4, 4, 7, 4, 1893, 5, 4, 199, 140, + 5, 742, 6, 6, 4, 136, 5, 5, 96, 52, + 105, 247, 107, 6, 6, 6, 102, 4, 759, 255, + 4, 4, 4, 4, 6, 321, 767, 115, 246, 6, + 248, 7, 247, 102, 9, 242, 243, 255, 81, 125, + 255, 9, 9, 250, 340, 140, 89, 0, 1766, 136, + 9, 94, 136, 184, 6, 4, 125, 156, 242, 243, + 9, 102, 105, 104, 234, 235, 153, 6, 252, 153, + 165, 88, 9, 14, 161, 162, 163, 161, 162, 163, + 167, 168, 181, 167, 168, 255, 9, 234, 235, 1785, + 291, 292, 293, 6, 234, 235, 102, 140, 197, 198, + 6, 247, 145, 146, 234, 235, 6, 6, 255, 255, + 153, 407, 247, 409, 96, 255, 6, 141, 105, 106, + 255, 417, 234, 235, 7, 255, 246, 170, 99, 870, + 249, 102, 333, 334, 335, 249, 255, 247, 8, 251, + 246, 255, 2040, 186, 115, 255, 246, 6, 191, 350, + 250, 194, 241, 242, 234, 235, 199, 200, 201, 171, + 172, 173, 174, 194, 251, 169, 169, 251, 181, 182, + 250, 181, 182, 7, 196, 192, 247, 247, 234, 235, + 6, 252, 7, 234, 235, 255, 1627, 247, 218, 7, + 219, 220, 221, 222, 250, 255, 219, 220, 221, 222, + 140, 218, 218, 218, 255, 145, 146, 246, 312, 313, + 253, 218, 1464, 242, 243, 6, 320, 321, 218, 242, + 243, 246, 1918, 253, 267, 250, 6, 270, 271, 252, + 248, 271, 250, 250, 250, 250, 254, 6, 252, 251, + 247, 250, 249, 286, 287, 250, 186, 290, 291, 292, + 293, 250, 250, 246, 6, 286, 287, 250, 250, 250, + 303, 201, 246, 246, 307, 246, 309, 242, 243, 218, + 246, 246, 248, 248, 1027, 1028, 1972, 252, 246, 246, + 248, 248, 234, 235, 252, 252, 4, 246, 331, 248, + 333, 334, 335, 242, 243, 234, 235, 246, 248, 248, + 331, 250, 247, 252, 249, 242, 243, 350, 246, 246, + 255, 248, 249, 356, 610, 252, 612, 613, 248, 242, + 243, 234, 235, 246, 230, 248, 250, 233, 423, 252, + 254, 230, 246, 629, 233, 2076, 219, 220, 221, 222, + 4, 246, 96, 544, 247, 99, 249, 117, 102, 534, + 104, 647, 255, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 414, 415, 246, 670, 245, 419, 420, 246, 234, + 235, 251, 234, 235, 415, 219, 220, 221, 222, 234, + 235, 252, 435, 254, 219, 220, 221, 222, 250, 442, + 255, 219, 220, 221, 222, 234, 235, 251, 242, 243, + 255, 255, 250, 709, 234, 235, 2112, 242, 243, 1160, + 463, 1162, 140, 141, 142, 143, 255, 246, 146, 234, + 235, 136, 96, 246, 1175, 255, 100, 155, 234, 235, + 158, 96, 106, 107, 99, 109, 110, 102, 153, 492, + 255, 234, 235, 242, 243, 550, 161, 162, 163, 255, + 115, 250, 167, 168, 99, 129, 102, 102, 1909, 2165, + 234, 235, 255, 516, 414, 246, 234, 235, 234, 235, + 523, 524, 246, 242, 243, 528, 250, 530, 531, 532, + 533, 534, 252, 678, 251, 255, 539, 255, 255, 255, + 543, 544, 545, 546, 547, 548, 549, 246, 551, 549, + 553, 551, 234, 235, 246, 619, 620, 234, 235, 246, + 624, 247, 553, 249, 234, 235, 136, 234, 235, 255, + 246, 239, 240, 255, 234, 235, 579, 245, 255, 136, + 234, 235, 585, 153, 1285, 255, 251, 246, 255, 248, + 1291, 161, 162, 163, 246, 255, 153, 167, 168, 234, + 235, 255, 605, 606, 161, 162, 163, 246, 234, 235, + 167, 168, 6, 7, 605, 606, 247, 246, 249, 248, + 255, 1236, 6, 252, 255, 726, 255, 246, 528, 255, + 530, 104, 532, 533, 250, 1336, 691, 621, 622, 140, + 141, 246, 234, 235, 251, 146, 546, 547, 255, 1350, + 653, 654, 655, 96, 246, 1356, 99, 246, 250, 102, + 250, 104, 653, 654, 655, 99, 99, 923, 102, 102, + 104, 104, 115, 676, 677, 678, 679, 680, 681, 682, + 683, 684, 115, 686, 687, 688, 689, 690, 250, 692, + 693, 694, 695, 696, 251, 695, 699, 6, 7, 748, + 234, 235, 236, 237, 238, 239, 240, 710, 699, 234, + 235, 245, 236, 237, 238, 239, 240, 247, 246, 249, + 723, 245, 140, 141, 1437, 255, 102, 782, 146, 246, + 733, 248, 246, 250, 248, 246, 739, 248, 247, 250, + 249, 251, 733, 251, 251, 255, 251, 255, 255, 246, + 255, 251, 755, 756, 99, 255, 251, 250, 761, 251, + 255, 764, 765, 255, 755, 250, 250, 770, 251, 772, + 761, 251, 255, 102, 251, 255, 99, 677, 255, 679, + 680, 681, 682, 683, 684, 99, 686, 687, 688, 689, + 4, 251, 692, 693, 694, 255, 251, 251, 899, 251, + 255, 255, 805, 255, 807, 251, 251, 102, 4, 255, + 255, 1524, 251, 251, 4, 251, 255, 255, 3, 255, + 246, 4, 248, 1536, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 840, 251, 246, + 251, 245, 255, 2065, 255, 246, 251, 850, 251, 840, + 255, 251, 255, 251, 246, 255, 251, 255, 913, 850, + 255, 251, 926, 251, 764, 255, 251, 255, 246, 933, + 255, 251, 772, 937, 59, 255, 251, 251, 251, 251, + 255, 255, 255, 255, 251, 888, 2098, 251, 255, 251, + 251, 255, 251, 255, 255, 251, 255, 888, 901, 255, + 251, 251, 2124, 6, 255, 255, 6, 910, 251, 251, + 901, 251, 255, 255, 251, 255, 919, 251, 255, 251, + 251, 255, 246, 255, 255, 251, 1027, 1028, 919, 255, + 2142, 251, 251, 52, 251, 255, 255, 248, 255, 251, + 246, 4, 5, 255, 247, 250, 249, 250, 247, 6, + 249, 250, 246, 254, 248, 140, 246, 246, 248, 248, + 145, 146, 4, 248, 6, 6, 250, 254, 153, 246, + 9, 246, 246, 246, 1029, 246, 246, 246, 246, 246, + 246, 8, 184, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 250, 184, 250, 184, 59, 60, 61, 62, + 125, 186, 246, 246, 67, 68, 69, 246, 246, 1317, + 184, 74, 246, 76, 250, 246, 201, 250, 250, 1022, + 4, 1085, 250, 250, 250, 246, 89, 246, 246, 92, + 1033, 246, 6, 96, 246, 1038, 99, 246, 246, 102, + 246, 104, 1657, 1658, 248, 6, 6, 250, 1051, 250, + 250, 250, 115, 1056, 248, 240, 248, 6, 6, 6, + 1051, 248, 250, 184, 246, 246, 246, 246, 246, 132, + 255, 256, 248, 246, 6, 1176, 1177, 6, 250, 6, + 8, 200, 8, 1086, 1087, 250, 1089, 1090, 1091, 7, + 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, + 6, 6, 1105, 250, 250, 6, 250, 255, 251, 91, + 255, 247, 7, 6, 1105, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 6, 247, 250, 253, 245, 250, 200, 201, 202, + 1143, 1144, 1145, 250, 250, 64, 245, 252, 211, 8, + 4, 7, 215, 246, 217, 218, 1056, 7, 6, 247, + 6, 250, 7, 6, 1167, 7, 6, 6, 251, 181, + 250, 290, 251, 251, 249, 247, 6, 250, 252, 7, + 1183, 1184, 1185, 6, 303, 246, 248, 250, 307, 4, + 250, 247, 6, 1184, 1185, 6, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 6, 6, 248, 7, 245, 7, + 7, 7, 7, 1531, 251, 7, 7, 7, 7, 414, + 7, 7, 7, 7, 1237, 7, 1337, 1338, 7, 424, + 7, 250, 6, 247, 1144, 1145, 249, 255, 255, 1252, + 1253, 1254, 1236, 255, 251, 255, 247, 7, 1514, 251, + 1263, 446, 1518, 250, 252, 1268, 7, 250, 4, 1272, + 250, 6, 1263, 252, 251, 251, 136, 250, 1281, 7, + 1283, 6, 252, 1286, 7, 7, 7, 255, 247, 247, + 255, 9, 255, 247, 249, 252, 184, 7, 1301, 156, + 419, 420, 254, 1358, 250, 1360, 251, 6, 6, 1924, + 6, 4, 46, 46, 1317, 252, 435, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, - 236, 237, 238, 836, 249, 97, 907, 243, 253, 245, - 249, 247, 140, 846, 253, 248, 200, 145, 146, 2055, - 249, 244, 249, 249, 253, 153, 253, 253, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, 234, 235, 236, 237, 238, 244, 249, 2088, 882, - 243, 253, 244, 249, 246, 249, 249, 253, 186, 253, - 1021, 1022, 895, 244, 249, 246, 249, 251, 253, 248, - 253, 904, 249, 201, 100, 249, 253, 249, 2114, 253, - 913, 253, 249, 249, 249, 249, 253, 253, 253, 253, - 249, 249, 2132, 249, 253, 253, 249, 253, 6, 7, - 253, 249, 4, 5, 288, 253, 245, 248, 247, 248, - 97, 245, 240, 247, 248, 97, 4, 301, 6, 232, - 233, 305, 1023, 100, 4, 253, 254, 4, 4, 4, - 244, 246, 244, 244, 244, 244, 6, 6, 244, 246, - 248, 6, 6, 248, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 252, 252, 244, 9, 59, 60, 61, - 62, 244, 244, 244, 244, 67, 68, 69, 244, 244, - 72, 244, 74, 1309, 248, 244, 244, 182, 182, 182, - 123, 248, 244, 1016, 244, 87, 244, 244, 90, 182, - 244, 244, 94, 248, 1027, 97, 248, 248, 100, 1032, - 102, 4, 1647, 1648, 248, 248, 248, 1168, 1169, 244, - 244, 113, 1045, 920, 244, 244, 244, 1050, 6, 244, - 927, 244, 244, 6, 931, 246, 6, 6, 130, 248, - 248, 248, 248, 417, 418, 246, 246, 246, 6, 246, - 248, 182, 244, 244, 244, 244, 244, 1080, 1081, 433, - 1083, 1084, 1085, 244, 1087, 1088, 1089, 1090, 1091, 1092, - 1093, 1094, 1095, 1096, 8, 6, 1099, 223, 224, 225, + 236, 237, 238, 239, 240, 1338, 246, 250, 246, 245, + 1343, 250, 1345, 528, 4, 530, 246, 532, 533, 534, + 252, 7, 1343, 252, 1345, 246, 7, 1360, 7, 255, + 184, 546, 547, 247, 7, 7, 7, 6, 1268, 247, + 1373, 7, 1272, 255, 1377, 7, 7, 4, 4, 250, + 246, 1281, 114, 1283, 6, 6, 1286, 7, 7, 7, + 7, 7, 1537, 1538, 7, 7, 7, 250, 6, 1463, + 6, 8, 6, 4, 7, 102, 6, 6, 4, 253, + 247, 6, 531, 6, 255, 250, 250, 255, 250, 6, + 251, 7, 1730, 1524, 543, 6, 545, 248, 1431, 1432, + 1433, 6, 250, 246, 246, 6, 1439, 6, 1338, 6, + 6, 251, 627, 252, 249, 6, 129, 255, 6, 6, + 6, 1454, 6, 6, 6, 1510, 6, 6, 6, 6, + 6, 6, 1465, 5, 247, 650, 6, 4, 6, 247, + 1473, 4, 6, 180, 1477, 7, 6, 250, 6, 250, + 250, 6, 250, 248, 250, 6, 1477, 250, 250, 250, + 250, 676, 677, 678, 679, 680, 681, 682, 683, 684, + 251, 686, 687, 688, 689, 250, 250, 692, 693, 694, + 250, 6, 6, 6, 1569, 6, 255, 702, 255, 6, + 705, 247, 7, 1587, 255, 255, 250, 246, 1531, 4, + 250, 246, 717, 1634, 1537, 1538, 252, 6, 6, 251, + 1543, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 6, 6, 1561, 4, + 245, 7, 747, 6, 749, 246, 1569, 6, 6, 6, + 6, 1574, 6, 6, 6, 6, 100, 5, 250, 764, + 247, 255, 250, 6, 250, 6, 255, 772, 1733, 6, + 6, 6, 6, 255, 247, 6, 255, 4, 1653, 7, + 6, 6, 250, 255, 723, 6, 6, 6, 6, 1673, + 1674, 1675, 1676, 1677, 1678, 250, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 5, 250, 250, 247, 245, 6, + 247, 1696, 249, 1646, 6, 1746, 1649, 1650, 1703, 1704, + 6, 6, 250, 1961, 251, 7, 250, 6, 1649, 1650, + 250, 1561, 251, 179, 6, 250, 6, 1722, 247, 1672, + 7, 251, 6, 1657, 1658, 1678, 252, 1933, 251, 251, + 6, 6, 6, 6, 6, 1688, 250, 6, 251, 6, + 250, 6, 247, 182, 6, 1698, 6, 6, 1701, 250, + 6, 136, 6, 6, 6, 246, 6, 251, 251, 6, + 6, 250, 247, 6, 250, 6, 1719, 6, 6, 250, + 6, 250, 6, 1726, 251, 251, 6, 1730, 250, 1732, + 1733, 250, 247, 251, 6, 6, 250, 922, 250, 924, + 925, 6, 250, 6, 6, 6, 6, 6, 1349, 2078, + 1405, 460, 1579, 938, 1894, 1642, 3, 1856, 1372, 3, + 3, 3, 1920, 1766, 600, 1507, 3, 1538, 764, 1726, + 2026, 1703, 957, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 1785, -1, -1, -1, -1, -1, -1, -1, + 975, 910, -1, -1, 1797, 1798, -1, -1, 1698, -1, + -1, 1701, -1, 1858, -1, -1, 1797, 1798, -1, -1, + 2066, -1, 8, -1, -1, -1, -1, 1820, -1, -1, + -1, -1, -1, -1, -1, -1, 1011, -1, -1, 1832, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 1845, -1, 1899, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 1845, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 1056, -1, 1937, 1938, 1939, 1940, 1941, -1, 1882, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 1895, -1, -1, -1, -1, 1900, 1901, 1902, + -1, -1, -1, 1022, -1, -1, -1, -1, -1, -1, + 1901, 1902, -1, -1, -1, 1918, -1, -1, 1921, 1038, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 1932, + 1921, -1, -1, 1936, 1998, -1, -1, -1, 2002, -1, + 1924, -1, -1, -1, -1, 1936, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 1961, 1144, + 1145, -1, -1, -1, -1, -1, -1, 1086, 1087, 1972, + 1089, 1090, 1091, -1, 1093, 1094, 1095, 1096, 1097, 1098, + 1099, 1100, 1101, 1102, -1, -1, 2041, -1, 2052, -1, + -1, -1, 2056, -1, -1, -1, 1999, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 2072, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 1204, + -1, -1, -1, -1, 1143, -1, -1, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, - 236, 237, 238, 6, 412, 248, 6, 243, 6, 8, - 248, 8, 7, 6, 422, 248, 198, 199, 200, 248, - 6, 248, 89, 249, 1137, 1138, 1139, 209, 253, 253, - 245, 213, 7, 215, 216, 6, 444, 6, 245, 248, - 248, 243, 64, 8, 250, 4, 1159, 7, 244, 7, - 6, 245, 6, 248, 7, 6, 249, 7, 240, 241, - 6, 6, 1175, 1176, 1177, 529, 248, 179, 250, 248, - 245, 249, 249, 247, 6, 539, 248, 541, 7, 250, - 6, 246, 1504, 244, 248, 4, 1508, 245, 1329, 1330, - 6, 6, 1079, 6, 6, 246, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 1521, 7, 7, 7, 7, - 7, 7, 7, 248, 6, 245, 1229, 253, 526, 247, - 528, 1228, 530, 531, 532, 249, 253, 253, 253, 245, - 7, 1244, 1245, 1246, 542, 543, 249, 248, 7, 248, - 250, 248, 1255, 4, 6, 250, 249, 1260, 249, 134, - 248, 1264, 7, 6, 250, 7, 7, 7, 245, 245, - 1273, 253, 1275, 253, 9, 1278, 245, 247, 253, 1350, - 6, 1352, 250, 182, 7, 252, 154, 249, 248, 6, - 1293, 6, 6, 4, 250, 250, 46, 46, 244, 1914, - 248, 244, 244, 248, 244, 4, 1309, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - 234, 235, 236, 237, 238, 623, 250, 1330, 7, 243, - 7, 245, 1335, 7, 1337, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236, 237, 238, 646, 1352, - 253, 182, 243, 245, 7, 7, 7, 6, 253, 245, - 7, 7, 1365, 7, 4, 719, 1369, 4, 112, 248, - 6, 244, 7, 6, 672, 673, 674, 675, 676, 677, - 678, 679, 680, 1514, 682, 683, 684, 685, 7, 7, - 688, 689, 690, 7, 7, 7, 7, 7, 1527, 1528, - 698, 248, 6, 701, 6, 6, 100, 7, 6, 6, - 4, 4, 251, 245, 1720, 713, 253, 6, 1421, 1422, - 1423, 248, 248, 253, 248, 6, 1429, 6, 249, 1500, - 7, 6, 246, 6, 244, 248, 244, 6, 249, 6, - 6, 1444, 6, 250, 6, 743, 127, 745, 6, 253, - 6, 6, 1455, 6, 6, 247, 6, 6, 6, 6, - 1463, 6, 760, 6, 1467, 6, 5, 245, 245, 6, - 768, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, 234, 235, 236, 237, 238, 4, 6, 1559, 4, - 243, 248, 6, 1624, 248, 221, 222, 223, 224, 225, + 236, 237, 238, 239, 240, -1, -1, 2050, 1167, 245, + -1, 247, -1, -1, -1, 2119, 2120, -1, -1, 2050, + -1, -1, -1, -1, 1183, 2068, 2069, 2070, 2071, 2072, + 6, -1, -1, -1, -1, -1, -1, 2068, 2069, 2070, + 2071, 2072, -1, 1268, -1, -1, -1, 1272, -1, -1, + -1, -1, -1, -1, -1, -1, 1281, -1, 1283, -1, + -1, 1286, -1, -1, -1, -1, -1, -1, -1, 2112, + 1295, -1, -1, -1, -1, -1, -1, -1, 1237, -1, + -1, -1, -1, -1, -1, -1, 2129, -1, -1, -1, + -1, -1, -1, 1252, 1253, 1254, -1, -1, 2129, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 2151, -1, + -1, -1, -1, 1338, -1, -1, -1, -1, -1, -1, + -1, -1, 2165, -1, -1, -1, -1, -1, -1, 2172, + 2173, -1, 3, 4, -1, -1, -1, -1, -1, 10, + 11, 12, 1301, 2186, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 6, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 55, 56, 57, 58, -1, -1, + -1, -1, 63, -1, -1, -1, -1, -1, -1, -1, + -1, 1360, -1, -1, -1, -1, 77, 78, 79, -1, + -1, 2151, -1, -1, 1373, -1, 87, 88, 1377, 90, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 2172, 2173, -1, -1, -1, 24, -1, 26, + -1, -1, -1, -1, -1, -1, 2186, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, - 236, 237, 238, 7, 248, 248, 248, 243, 1521, 246, - 6, 6, 6, 248, 1527, 1528, 248, 248, 248, 248, - 1533, 249, 248, 6, 6, 248, 178, 6, 6, 6, - 6, 253, 245, 253, 253, 253, 248, 6, 1551, 250, - 904, 7, 244, 248, 4, 6, 1559, 6, 249, 6, - 6, 1564, 244, 4, 244, 7, 6, 6, 6, 6, - 6, 6, 1643, 6, 6, 98, 1453, 6, 5, 248, - 245, 253, 248, 6, 248, 6, 253, 6, 6, 6, - 6, 253, 253, 6, 1723, 245, 4, 6, 253, 6, - 248, 6, 6, 6, 6, 1736, 7, 248, 5, 248, - 248, 1923, 6, 245, 248, 1686, 6, 248, 916, 6, - 918, 919, 1693, 1694, 248, 6, 249, 6, 249, 7, - 6, 248, 6, 1636, 932, 177, 1639, 1640, 245, 6, - 249, 1712, 7, 249, 249, 1951, 6, 250, 6, 6, - 1647, 1648, 6, 951, 6, 6, 248, 6, 249, 1662, - 245, 6, 1016, 6, 248, 1668, 6, 180, 248, 6, - 244, 969, 6, 249, 245, 1678, 6, 249, 1032, 249, - 248, 134, 6, 248, 6, 1688, 6, 248, 1691, 248, - 6, 248, 6, 6, 248, 6, 6, 6, 249, 245, - 1577, 6, 6, 6, 2016, 249, 1709, 1005, 6, 6, - 248, 6, 248, 1716, 6, 248, 6, 1720, 6, 1722, - 1723, 6, 6, 6, 1341, 2068, 1080, 1081, 458, 1083, - 1084, 1085, 1884, 1087, 1088, 1089, 1090, 1091, 1092, 1093, - 1094, 1095, 1096, 1569, 2056, 1632, 1846, 1395, 1364, 3, - 3, 3, 1050, 1756, 221, 222, 223, 224, 225, 226, + 236, 237, 238, 239, 240, -1, -1, -1, -1, 245, + -1, -1, 1431, 1432, 1433, -1, -1, -1, -1, -1, + 1439, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 1454, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 1465, -1, -1, -1, + -1, -1, 1537, 1538, 1473, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 6, -1, -1, 199, -1, + -1, -1, 203, -1, -1, -1, 1561, 208, 209, 210, + -1, 212, 213, 214, -1, -1, -1, 218, -1, -1, + -1, -1, -1, 140, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 234, 235, -1, -1, -1, -1, -1, + 241, -1, -1, -1, -1, 246, -1, -1, -1, 250, + -1, -1, 253, -1, 1543, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, -1, -1, -1, -1, 245, -1, -1, + 1569, -1, -1, -1, -1, -1, -1, -1, -1, 6, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, -1, + 237, 238, -1, -1, -1, -1, -1, 6, -1, 246, + 247, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 258, 259, 1698, -1, -1, 1701, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 1646, -1, -1, + -1, 1716, -1, 1718, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 1733, -1, + -1, -1, -1, 1672, -1, -1, -1, -1, -1, -1, + -1, 6, -1, -1, -1, -1, -1, -1, -1, 1688, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 1766, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 1719, -1, -1, -1, 245, -1, -1, -1, -1, -1, + -1, -1, -1, 1732, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 375, 376, + 377, -1, -1, -1, 381, 382, 383, 384, 385, 386, + 387, -1, 389, -1, -1, -1, 393, 394, -1, -1, + 397, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 410, -1, -1, 1785, -1, -1, -1, + -1, -1, -1, -1, -1, 113, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, 1775, 3, 1910, 1497, 243, 1848, 596, 3, - 1716, 1693, 1528, 1137, 1787, 1788, 1663, 1664, 1665, 1666, - 1667, 1668, -1, -1, 760, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 1159, -1, 1810, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 1889, 1822, - -1, 1175, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 1835, -1, -1, -1, -1, -1, -1, -1, - 1138, 1139, 221, 222, 223, 224, 225, 226, 227, 228, + 237, 238, 239, 240, -1, -1, -1, -1, 245, -1, + -1, 1820, 140, -1, -1, -1, 144, -1, -1, -1, + 148, -1, -1, -1, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, - -1, -1, -1, -1, 243, -1, -1, -1, -1, 1872, - -1, -1, -1, -1, -1, 1229, -1, -1, -1, -1, - -1, -1, 1885, -1, -1, -1, -1, 1890, 1891, 1892, - 1244, 1245, 1246, -1, -1, -1, -1, -1, 1196, -1, - -1, -1, -1, -1, -1, 1908, -1, -1, 1911, -1, - -1, -1, -1, -1, -1, -1, -1, 1914, -1, 1922, - -1, -1, -1, 1926, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 1293, - -1, 140, -1, -1, -1, -1, 145, 146, 1951, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 1962, - 2031, -1, 1260, -1, -1, -1, 1264, -1, -1, -1, - -1, -1, -1, -1, -1, 1273, -1, 1275, -1, -1, - 1278, -1, -1, -1, -1, -1, 1989, 186, -1, 1287, - -1, -1, -1, -1, -1, -1, -1, -1, 1352, -1, - -1, -1, 201, -1, -1, -1, -1, -1, -1, -1, - -1, 1365, -1, -1, -1, 1369, -1, -1, -1, -1, + 239, 240, 7, 171, 172, 173, 245, 175, 176, 177, + -1, 179, 180, 181, 182, 183, 184, 185, -1, 187, + 188, 189, 190, -1, -1, -1, 194, -1, -1, -1, + -1, -1, -1, 1882, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 1895, -1, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, -1, -1, -1, 1918, + 245, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 1932, 561, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 2011, -1, 266, 267, + 268, 269, 270, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 285, 286, 287, + -1, -1, -1, 1972, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 305, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 315, 316, -1, + 1999, -1, -1, 321, -1, -1, -1, -1, -1, -1, + -1, 2076, -1, 331, 332, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 1330, -1, -1, -1, -1, 2040, -1, -1, + -1, -1, -1, -1, 2099, -1, -1, 355, 356, -1, + -1, -1, 360, 361, 362, -1, 364, -1, -1, -1, + 368, 369, 370, -1, -1, 373, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 2151, -1, -1, -1, + 245, -1, -1, 411, -1, -1, -1, 415, 416, -1, + -1, -1, -1, -1, -1, -1, -1, 2172, 2173, -1, + -1, -1, -1, 2112, 432, 433, -1, -1, -1, -1, + -1, 2186, -1, -1, -1, -1, 6, -1, -1, 447, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 1927, 1928, 1929, 1930, 1931, 2058, 2059, 2060, 2061, 2062, - -1, -1, -1, -1, -1, -1, -1, 1421, 1422, 1423, - -1, -1, -1, -1, -1, 1429, -1, -1, 4, 5, + -1, -1, -1, -1, -1, -1, -1, 465, 466, 467, + 468, -1, -1, -1, -1, 473, -1, -1, -1, 477, + -1, -1, -1, -1, -1, -1, 2165, -1, -1, -1, + -1, -1, -1, 491, 492, -1, -1, -1, 496, -1, + -1, -1, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, -1, 526, 527, + -1, 529, -1, -1, -1, -1, -1, -1, -1, -1, + 538, -1, -1, 541, 542, -1, -1, -1, -1, -1, + 548, -1, -1, -1, -1, 553, -1, -1, -1, 866, + -1, -1, -1, 6, -1, -1, -1, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, -1, 586, 587, + -1, -1, -1, 900, -1, -1, 594, 595, 596, -1, + -1, -1, -1, -1, 602, 603, -1, 605, 606, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 1444, -1, -1, -1, -1, -1, -1, -1, -1, 2102, - -1, 1455, -1, -1, -1, -1, -1, -1, -1, 1463, - -1, 1988, -1, -1, -1, 1992, 2119, -1, -1, -1, - 46, 47, 48, 49, 50, 51, 52, 53, 54, -1, - -1, -1, -1, 59, 60, 61, 62, -1, 2141, -1, - -1, 67, 68, 69, -1, -1, 72, -1, 74, -1, - -1, -1, 2155, 4, 5, -1, -1, 6, -1, 2162, - 2163, 87, -1, -1, 90, 2042, -1, -1, 94, 2046, - -1, 97, -1, 2176, 100, -1, 102, -1, -1, 1533, - -1, -1, -1, -1, -1, 2062, -1, 113, -1, -1, - -1, -1, -1, -1, -1, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 130, 1559, -1, -1, 59, 60, - 61, 62, 6, 412, -1, -1, 67, 68, 69, -1, - -1, 72, -1, 74, -1, -1, -1, -1, -1, 1527, - 1528, -1, 2109, 2110, -1, -1, 87, -1, -1, 90, - -1, -1, -1, 94, -1, -1, 97, -1, -1, 100, - -1, 102, -1, 1551, -1, -1, -1, -1, -1, -1, - -1, -1, 113, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 198, 199, 200, -1, -1, 6, -1, 130, - -1, -1, 1636, 209, -1, -1, -1, 213, -1, 215, - 216, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 1662, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 245, - -1, 247, 248, -1, 1678, -1, -1, 526, -1, 528, - -1, 530, 531, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 542, 543, -1, -1, 198, 199, 200, - -1, -1, -1, -1, -1, 1709, -1, -1, 209, -1, - -1, -1, 213, -1, 215, 216, -1, -1, 1722, -1, - -1, -1, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, - 1688, -1, -1, 1691, 243, 6, -1, 248, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 1706, -1, - 1708, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 1775, 6, -1, -1, 1723, -1, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - 234, 235, 236, 237, 238, -1, -1, -1, -1, 243, - -1, -1, -1, -1, -1, -1, 1810, -1, 1756, -1, + -1, -1, -1, -1, -1, -1, 624, 625, 626, -1, + -1, -1, 630, 631, 632, 633, 634, 635, 636, 637, + 638, -1, -1, -1, -1, 6, 644, -1, 646, -1, + -1, 649, -1, -1, -1, 653, 654, 655, 656, -1, + 658, 659, 660, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, -1, -1, -1, -1, 245, -1, 685, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 673, -1, 675, 676, 677, 678, - 679, 680, -1, 682, 683, 684, 685, -1, -1, 688, - 689, 690, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, - -1, -1, -1, -1, 243, -1, -1, 113, 1872, -1, + -1, 699, -1, -1, -1, -1, -1, -1, 706, -1, + 708, -1, -1, 711, 712, -1, -1, -1, -1, -1, + -1, -1, 720, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 733, -1, 735, -1, -1, + -1, -1, 740, 741, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 755, -1, 757, + 758, -1, -1, 761, 762, -1, 1073, -1, 766, -1, + -1, -1, -1, -1, -1, 773, -1, -1, -1, 777, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, -1, 803, -1, 805, -1, 807, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 1885, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 140, -1, -1, -1, 144, -1, - -1, -1, 148, -1, 1908, -1, -1, -1, -1, -1, - -1, 760, -1, -1, -1, -1, -1, -1, 1922, 768, - -1, -1, -1, -1, -1, 171, 172, 173, -1, 175, - 176, 177, -1, 179, 180, 181, 182, 183, 184, 185, - -1, 187, 188, 189, 190, -1, -1, -1, 194, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 1962, -1, - 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236, 237, 238, -1, -1, - -1, -1, 243, -1, -1, 1989, -1, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - 234, 235, 236, 237, 238, -1, -1, -1, -1, 243, - -1, -1, -1, -1, -1, -1, -1, -1, 264, 265, - 266, 267, 268, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 283, 284, 285, + -1, -1, -1, -1, 194, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 2001, -1, -1, -1, 303, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 313, 314, -1, - -1, -1, -1, 319, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 329, 330, -1, -1, -1, -1, -1, - 4, 5, -1, -1, -1, -1, -1, -1, 2102, -1, - -1, -1, -1, -1, -1, -1, -1, 353, 354, -1, - -1, -1, 358, 359, 360, -1, 362, -1, 2066, -1, - 366, 367, 368, -1, -1, 371, -1, -1, -1, -1, - -1, -1, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 2089, -1, -1, -1, 59, 60, 61, 62, -1, - -1, 2155, -1, 67, 68, 69, -1, -1, 72, -1, - 74, -1, -1, 409, -1, -1, -1, 413, 414, -1, - -1, -1, -1, 87, -1, -1, 90, -1, -1, -1, - -1, -1, -1, -1, 430, 431, -1, -1, -1, -1, - -1, -1, -1, 2141, -1, -1, -1, -1, -1, 445, - -1, 1050, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 2162, 2163, -1, 463, 464, 465, - 466, -1, -1, -1, -1, 471, -1, -1, 2176, 475, + -1, -1, 840, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 850, 851, 852, -1, -1, -1, -1, -1, + -1, 1168, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + -1, -1, -1, -1, 245, -1, -1, -1, -1, -1, + 888, -1, -1, -1, -1, -1, -1, 267, -1, -1, + 270, -1, -1, 901, -1, -1, -1, -1, -1, -1, + -1, 909, -1, -1, -1, 913, 286, 287, -1, -1, + -1, 919, -1, -1, -1, -1, -1, -1, -1, 927, + 928, -1, -1, -1, -1, 933, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 489, 490, -1, -1, -1, 494, -1, - -1, -1, 498, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, - 516, 517, 518, 519, 520, 521, 522, -1, 524, 525, - -1, 527, -1, -1, 198, 199, 200, -1, 534, 1138, - 1139, 537, 538, -1, -1, 209, -1, -1, 544, 213, - -1, 215, 216, 549, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 6, -1, 561, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, - 576, 577, 578, 579, 580, -1, 582, 583, -1, -1, - -1, -1, -1, 6, 590, 591, 592, -1, -1, -1, - -1, -1, 598, 599, -1, 601, 602, -1, -1, -1, - 194, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 620, 621, 622, -1, -1, -1, - 626, 627, 628, 629, 630, 631, 632, 633, 634, -1, - -1, -1, -1, -1, 640, -1, 642, -1, -1, 645, - -1, 6, -1, 649, 650, 651, 652, -1, 654, 655, - 656, 1260, -1, -1, -1, 1264, -1, -1, -1, -1, - -1, -1, -1, -1, 1273, -1, 1275, -1, -1, 1278, - -1, 265, -1, -1, 268, 681, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 695, - 284, 285, -1, -1, -1, -1, 702, -1, 704, -1, - -1, 707, 708, -1, -1, -1, -1, -1, -1, -1, - 716, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 1330, -1, 729, -1, 731, -1, -1, -1, -1, - 736, 737, -1, -1, -1, 329, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 751, -1, 753, 754, -1, - -1, 757, 758, -1, -1, -1, 762, -1, -1, -1, - 354, -1, -1, 769, -1, -1, -1, 773, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, 234, 235, 236, 237, 238, -1, -1, -1, -1, - 243, -1, -1, 799, -1, 801, -1, 803, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, 234, 235, 236, 237, 238, -1, -1, -1, 413, - 243, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 836, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 846, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 194, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, -1, -1, 882, -1, 243, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 895, - -1, -1, -1, -1, -1, -1, 490, 903, -1, -1, - -1, 907, -1, -1, -1, -1, -1, 913, -1, -1, - -1, -1, -1, -1, -1, 921, 922, -1, -1, -1, - 514, 927, -1, -1, -1, -1, -1, 521, 522, 4, - 5, -1, -1, -1, -1, -1, -1, -1, 944, -1, - -1, 947, 1551, -1, -1, 284, 285, -1, -1, -1, - 544, -1, -1, -1, -1, 549, -1, 6, -1, -1, - -1, -1, 968, -1, 970, 971, -1, -1, -1, -1, - -1, 46, 47, 48, 49, 50, 51, 52, 53, 54, - -1, 575, -1, 989, 59, 60, 61, 62, -1, -1, - 329, -1, 67, 68, 69, -1, 6, 72, -1, 74, - -1, -1, -1, -1, -1, -1, 1012, 601, 602, -1, - -1, -1, 87, 1019, -1, 90, -1, -1, 1024, -1, + -1, -1, 950, -1, -1, 953, -1, -1, -1, -1, + -1, 331, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 6, -1, -1, -1, 974, -1, 976, 977, + -1, -1, -1, -1, -1, -1, 356, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 995, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 1039, 1040, -1, -1, -1, -1, 1045, + -1, -1, -1, -1, 1321, 1322, 4, 5, -1, -1, + 1018, -1, -1, -1, -1, -1, -1, 1025, -1, -1, + -1, -1, 1030, -1, -1, 437, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 415, -1, 1045, 1046, -1, + -1, -1, -1, 1051, -1, -1, -1, -1, 46, 47, + 48, 49, 50, 51, 52, 53, 54, -1, -1, -1, + -1, 59, 60, 61, 62, -1, -1, -1, -1, 67, + 68, 69, 1080, 1081, 1082, 1083, 74, -1, 76, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 89, -1, 1410, 92, -1, -1, 1105, 96, -1, + -1, 99, -1, 1420, 102, -1, 104, -1, -1, -1, + -1, -1, 492, 1121, -1, -1, -1, 115, -1, -1, + -1, -1, -1, 1131, 1132, 1133, -1, 539, -1, -1, + 1138, 1139, -1, 1141, 132, -1, 516, 6, -1, -1, + -1, -1, -1, 523, 524, -1, -1, 1155, 1156, -1, + -1, -1, -1, -1, -1, 1163, 1164, -1, -1, -1, + -1, -1, 1170, -1, 1172, 1173, -1, -1, 548, -1, + -1, 1179, 1180, 553, -1, -1, 1184, 1185, 590, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, -1, -1, 579, + -1, 245, 200, 201, 202, -1, -1, -1, 1216, -1, + -1, -1, -1, 211, -1, -1, -1, 215, -1, 217, + 218, -1, -1, -1, -1, 605, 606, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 649, 650, 651, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 1074, 1075, - 1076, 1077, -1, -1, 413, -1, -1, -1, -1, 1688, - -1, -1, 1691, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 1099, -1, -1, -1, -1, -1, -1, - -1, 695, -1, -1, -1, -1, -1, -1, -1, 1115, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 1125, - 1126, 1127, -1, 198, 199, 200, 1132, 1133, -1, 1135, - -1, -1, -1, -1, 209, 729, -1, -1, 213, -1, - 215, 1147, 1148, 6, -1, -1, -1, -1, -1, 1155, - 1156, -1, -1, -1, -1, -1, 1162, 751, 1164, 1165, - -1, -1, -1, 757, -1, 1171, 1172, -1, -1, -1, - 1176, 1177, 221, 222, 223, 224, 225, 226, 227, 228, + -1, -1, -1, 1251, 242, 243, -1, -1, -1, -1, + -1, -1, 250, -1, 252, 1263, 1573, -1, -1, -1, + -1, -1, -1, 1271, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 653, 654, 655, -1, -1, -1, -1, + -1, -1, -1, -1, 1292, 1293, -1, -1, -1, 1297, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 1308, -1, -1, 1311, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 699, + -1, -1, -1, 6, -1, -1, -1, -1, -1, -1, + -1, 1339, -1, -1, 1342, 1343, 1344, 1345, -1, -1, + -1, -1, -1, -1, -1, 1353, -1, 1355, -1, 1357, + 1358, -1, -1, 733, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, - -1, -1, -1, -1, 243, -1, -1, -1, -1, -1, - -1, -1, 1208, -1, -1, -1, -1, 801, -1, 803, - 549, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, -1, -1, 1243, -1, -1, - -1, -1, 836, -1, -1, -1, -1, -1, -1, 1255, - -1, -1, 846, -1, -1, -1, -1, 1263, -1, -1, - -1, -1, 601, 602, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 1284, 1285, - -1, -1, -1, 1289, -1, -1, -1, -1, 882, -1, - -1, -1, -1, -1, 1300, -1, -1, 1303, -1, -1, - -1, 895, -1, -1, -1, -1, -1, -1, -1, -1, - 649, 650, 651, -1, -1, -1, -1, -1, -1, 913, - -1, -1, -1, -1, -1, 1331, -1, -1, 1334, 1335, - 1336, 1337, -1, -1, -1, -1, -1, -1, -1, 1345, - -1, 1347, -1, 1349, 1350, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 695, -1, 221, 222, + 239, 240, -1, -1, -1, 755, 245, -1, -1, -1, + -1, 761, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, + 822, -1, 824, 825, 826, 827, -1, 829, 830, 831, + 832, -1, -1, -1, -1, 805, -1, 807, -1, -1, + 1438, 843, -1, 845, -1, -1, -1, 1445, 1446, 1447, + -1, -1, -1, 855, -1, -1, 1454, -1, 1456, -1, + 862, 863, -1, -1, -1, 1463, -1, -1, -1, 871, + 840, -1, -1, -1, -1, -1, -1, -1, -1, 1477, + 850, -1, -1, -1, 1482, -1, -1, -1, -1, -1, + -1, -1, 1490, 1491, 1492, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 1502, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 1512, -1, -1, -1, 888, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 901, -1, -1, -1, -1, -1, 1535, -1, -1, + -1, -1, -1, 1541, 1542, -1, -1, -1, -1, 919, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, 234, 235, 236, 237, 238, -1, -1, -1, -1, - 243, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 729, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, 751, 243, -1, 245, -1, 247, 757, -1, - -1, -1, 1428, 253, -1, -1, -1, -1, -1, 1435, - 1436, 1437, -1, -1, -1, -1, -1, -1, 1444, -1, - 1446, -1, -1, -1, -1, -1, 5, 1453, -1, -1, - -1, 1045, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 1467, -1, -1, -1, -1, 1472, -1, -1, -1, - -1, -1, -1, -1, 1480, 1481, 1482, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 1492, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 1502, 836, -1, -1, - 59, 60, 61, 62, -1, 1099, -1, 846, 67, 68, - 69, -1, -1, 72, -1, 74, -1, -1, -1, 1525, - -1, -1, -1, -1, -1, 1531, 1532, -1, 87, -1, - -1, 90, 2141, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 882, -1, -1, 6, -1, -1, -1, - -1, -1, -1, 2162, 2163, -1, 895, -1, 1564, -1, - -1, -1, -1, -1, -1, -1, -1, 2176, -1, -1, - -1, -1, -1, -1, 913, -1, -1, -1, -1, -1, - -1, -1, 1176, 1177, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 1604, 1605, - 1606, -1, -1, -1, -1, -1, -1, -1, -1, 1615, - -1, -1, -1, -1, 1620, 1621, 1622, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 1634, -1, - -1, -1, -1, 1639, 1640, 1641, -1, 1643, -1, 198, - 199, 200, -1, 1649, 1650, -1, -1, -1, -1, -1, - 209, -1, -1, -1, 213, -1, 215, -1, -1, -1, - -1, 1255, 1668, -1, -1, -1, -1, 1673, -1, -1, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, -1, -1, 1574, -1, -1, 981, + 982, 983, -1, -1, -1, 987, 988, -1, -1, 991, + 992, 993, 994, -1, 996, -1, -1, -1, -1, 1001, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 1686, -1, -1, 1689, -1, -1, -1, 1693, -1, -1, - -1, -1, -1, -1, -1, -1, 1702, 1703, -1, 1705, - -1, -1, -1, -1, -1, 435, 1045, 1713, -1, -1, - -1, -1, -1, -1, 6, -1, -1, -1, -1, -1, - -1, -1, -1, 1729, -1, -1, -1, -1, 1734, 1735, + -1, -1, -1, -1, -1, -1, 1614, 1615, 1616, -1, + -1, -1, -1, -1, -1, -1, -1, 1625, -1, -1, + -1, -1, 1630, 1631, 1632, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 1644, -1, -1, -1, + -1, 1649, 1650, 1651, -1, 1653, -1, -1, -1, -1, + -1, 1659, 1660, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 1079, -1, -1, + 1678, 1051, 1084, -1, -1, 1683, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 1696, -1, + -1, 1699, -1, -1, -1, 1703, -1, -1, -1, -1, + -1, -1, -1, -1, 1712, 1713, -1, 1715, -1, -1, + -1, -1, -1, -1, -1, 1723, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 1105, -1, -1, 4, 5, + -1, 1739, -1, -1, -1, -1, 1744, 1745, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 1335, 1748, 1337, -1, 1751, 1752, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 7, 8, -1, - 1099, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, 1787, 1788, 243, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 1804, -1, - -1, -1, -1, -1, -1, 535, -1, 1813, -1, -1, - -1, -1, -1, -1, -1, -1, 1822, -1, -1, -1, - -1, -1, -1, -1, -1, 1831, 1832, -1, -1, 1835, - -1, -1, -1, -1, -1, -1, -1, 1176, 1177, -1, + 1758, -1, -1, 1761, 1762, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 1181, + 46, 47, 48, 49, 50, 51, 52, 53, 54, -1, + -1, -1, -1, 59, 60, 61, 62, -1, -1, 1797, + 1798, 67, 68, 69, -1, -1, -1, -1, 74, -1, + 76, -1, -1, -1, 1184, 1185, 1814, -1, -1, -1, + -1, -1, -1, 89, -1, 1823, 92, -1, -1, -1, + 96, -1, -1, 99, 1832, -1, 102, -1, 104, -1, + -1, -1, -1, 1841, 1842, -1, -1, 1845, -1, 115, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 586, -1, -1, -1, - -1, -1, -1, 1869, 1870, -1, -1, -1, -1, -1, - -1, -1, -1, 1467, -1, -1, -1, -1, -1, -1, - -1, -1, 1888, -1, -1, 1891, 1892, 1893, -1, -1, - -1, -1, 1898, -1, -1, 1901, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 1911, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 1255, -1, -1, -1, - 1926, -1, -1, -1, -1, -1, -1, -1, 1934, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, - 232, 233, 234, 235, 236, 237, 238, -1, -1, -1, - -1, 243, -1, 1959, -1, -1, -1, -1, -1, 1965, - -1, -1, 1968, -1, -1, -1, -1, -1, -1, -1, - 1564, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, 1997, -1, 243, 8, -1, 1335, -1, 1337, -1, + -1, -1, -1, -1, -1, -1, 132, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 2022, 2023, -1, -1, + -1, 1879, 1880, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 1263, -1, -1, -1, -1, -1, -1, + 1898, -1, -1, 1901, 1902, 1903, -1, -1, -1, -1, + 1908, -1, -1, 1911, -1, -1, -1, -1, 1320, 6, + -1, -1, -1, 1921, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 200, 201, 202, -1, 1936, -1, + -1, -1, -1, -1, -1, 211, 1944, -1, -1, 215, + -1, 217, 218, -1, -1, -1, -1, 1359, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 2036, 2037, -1, 2039, 2040, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 1639, 1640, 2053, -1, -1, - -1, -1, 2058, 2059, 2060, 2061, 2062, -1, -1, -1, - -1, -1, 2068, -1, -1, -1, 2072, -1, -1, 13, - 14, -1, -1, -1, 1668, -1, -1, -1, 808, 809, - 810, 811, 812, 813, 814, 815, 816, 817, 818, -1, - 820, 821, 822, 823, 2100, 825, 826, 827, 828, 2105, - 2106, 2107, -1, -1, -1, -1, -1, -1, -1, 839, - -1, 841, -1, 2119, -1, -1, -1, -1, -1, 849, - -1, -1, -1, -1, -1, -1, 856, 857, 1467, -1, - -1, -1, -1, -1, -1, 865, -1, -1, -1, -1, - -1, 2147, 2148, 2149, -1, -1, -1, -1, -1, -1, - 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, -1, -1, -1, 110, 111, 112, 113, - -1, 24, 116, 26, -1, -1, -1, -1, -1, 123, - 124, -1, -1, 127, 128, -1, 130, 131, -1, 133, - -1, -1, -1, 1787, 1788, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 150, 221, 222, 223, + -1, 1969, -1, 1343, -1, 1345, -1, 1975, -1, -1, + 1978, 247, -1, 249, 250, -1, -1, -1, -1, 1391, + 1392, 1393, 1394, 1395, -1, -1, -1, -1, 1400, 1401, + -1, -1, -1, -1, 1406, -1, 1408, -1, -1, 2007, + 1412, -1, -1, 1415, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 1427, -1, -1, -1, -1, + -1, -1, -1, -1, 2032, 2033, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 2046, 2047, + -1, 2049, 2050, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 2063, -1, -1, -1, -1, + 2068, 2069, 2070, 2071, 2072, -1, -1, -1, -1, -1, + 2078, -1, -1, -1, 2082, -1, -1, -1, -1, -1, + -1, -1, 6, -1, -1, -1, 1498, -1, 1500, -1, + -1, -1, 1504, -1, 1506, -1, -1, 1477, -1, -1, + -1, -1, 2110, -1, -1, -1, -1, 2115, 2116, 2117, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 2129, -1, -1, -1, 1537, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, -1, -1, -1, -1, 245, 2157, + 2158, 2159, 3, 4, 5, -1, 7, -1, -1, 10, + 11, 12, -1, -1, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, -1, -1, + -1, -1, -1, -1, 1574, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, -1, -1, -1, 67, 68, 69, -1, + -1, 1633, -1, 74, -1, 76, 77, 78, 79, -1, + -1, -1, -1, -1, -1, -1, 87, 88, 89, 90, + -1, 92, -1, -1, -1, 96, -1, -1, 99, 6, + -1, 102, -1, 104, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 115, -1, -1, -1, -1, 1649, + 1650, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 132, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 1678, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - 234, 235, 236, 237, 238, -1, -1, -1, 1822, 243, - 174, 175, 176, -1, -1, -1, -1, -1, -1, -1, - -1, 1835, -1, -1, -1, 975, 976, 977, -1, -1, - -1, 981, 982, -1, -1, 985, 986, 987, 988, -1, - 990, -1, -1, -1, -1, 995, -1, -1, -1, -1, + 234, 235, 236, 237, 238, 239, 240, -1, -1, -1, + -1, 245, -1, 1735, -1, -1, 1738, -1, -1, -1, + -1, -1, 136, -1, -1, -1, -1, -1, -1, -1, + -1, 192, -1, -1, -1, -1, -1, -1, 199, 200, + 201, 202, 203, -1, -1, -1, -1, 208, 209, 210, + 211, 212, 213, 214, 215, -1, 217, 218, 219, 220, + 221, 222, -1, -1, 1786, 1787, -1, 1789, -1, -1, + -1, -1, -1, 234, 235, -1, -1, -1, -1, -1, + 241, 242, 243, -1, -1, 246, -1, 248, -1, -1, + -1, 252, 253, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 13, 14, -1, -1, -1, 1797, 1798, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 1849, 1850, -1, + -1, 245, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 1832, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 1845, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 1896, -1, -1, -1, 245, -1, + -1, -1, -1, -1, -1, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, -1, -1, + -1, 112, 113, 114, 115, 7, 8, 118, -1, -1, + -1, 1901, 1902, -1, 125, 126, -1, -1, 129, 130, + -1, 132, 133, -1, 135, -1, -1, -1, -1, -1, + -1, 1921, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 152, -1, -1, -1, -1, 1936, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 7, -1, -1, -1, 140, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 1891, 1892, -1, - 1639, 1640, -1, -1, -1, 249, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 1911, -1, -1, + -1, -1, 3, 4, 5, 176, 177, 178, -1, 10, + 11, 12, -1, -1, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, -1, -1, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, -1, -1, 67, 68, 69, -1, + -1, 72, 73, 74, -1, 76, 77, 78, 79, -1, + 251, -1, -1, -1, -1, -1, 87, 88, 89, 90, + -1, 92, -1, -1, -1, 96, -1, -1, 99, -1, + 2050, 102, -1, 104, -1, -1, -1, -1, -1, -1, + 111, -1, -1, -1, 115, -1, -1, -1, 2068, 2069, + 2070, 2071, 2072, -1, 125, -1, 127, 128, -1, 130, + -1, 132, -1, -1, 135, -1, -1, -1, -1, 140, + 141, 142, 143, 144, -1, 146, 147, 148, 149, 150, + 151, -1, -1, -1, 155, -1, 2138, 158, -1, -1, + -1, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 2129, + -1, -1, -1, 245, -1, -1, -1, 8, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 199, 200, + 201, 202, 203, 204, -1, -1, -1, 208, 209, 210, + 211, 212, 213, 214, 215, -1, 217, 218, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 234, 235, -1, -1, -1, -1, -1, + 241, -1, -1, -1, -1, 246, 3, 4, 5, 250, + -1, -1, 253, 10, 11, 12, -1, -1, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, -1, -1, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, -1, -1, + 67, 68, 69, -1, -1, 72, 73, 74, -1, 76, + 77, 78, 79, -1, -1, -1, -1, -1, -1, -1, + 87, 88, 89, 90, -1, 92, -1, -1, -1, 96, + -1, -1, 99, -1, -1, 102, -1, 104, -1, -1, + -1, -1, -1, -1, 111, -1, -1, -1, 115, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 125, -1, + 127, 128, -1, 130, -1, 132, -1, -1, 135, -1, + -1, -1, -1, 140, 141, 142, 143, 144, -1, 146, + 147, 148, 149, 150, 151, -1, -1, -1, 155, -1, + -1, 158, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + -1, -1, -1, -1, 245, -1, -1, -1, -1, -1, + -1, 8, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 199, 200, 201, 202, 203, 204, -1, -1, + -1, 208, 209, 210, 211, 212, 213, 214, 215, -1, + 217, 218, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 234, 235, -1, + -1, -1, -1, -1, 241, -1, -1, -1, -1, 246, + 3, 4, 5, 250, -1, -1, 253, 10, 11, 12, + -1, -1, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 55, 56, 57, 58, -1, -1, -1, -1, + 63, 64, -1, -1, -1, -1, -1, -1, -1, 72, + 73, -1, -1, -1, 77, 78, 79, -1, -1, -1, + -1, -1, -1, -1, 87, 88, -1, 90, -1, -1, + -1, -1, -1, 96, -1, -1, 99, -1, -1, 102, + -1, 104, -1, -1, -1, -1, -1, -1, 111, -1, + -1, -1, 115, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 125, -1, 127, 128, -1, 130, -1, 132, + -1, -1, 135, -1, -1, -1, -1, 140, 141, 142, + 143, 144, -1, 146, 147, 148, 149, 150, 151, -1, + -1, -1, 155, -1, -1, 158, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, -1, -1, -1, -1, 245, -1, + -1, -1, -1, -1, -1, 8, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 199, -1, -1, -1, + 203, 204, -1, -1, -1, 208, 209, 210, -1, 212, + 213, 214, -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 1926, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 1073, -1, -1, -1, -1, 1078, -1, - -1, -1, -1, -1, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + -1, 234, 235, -1, -1, -1, -1, -1, 241, -1, + -1, -1, -1, 246, 3, 4, -1, 250, -1, 8, + 253, 10, 11, 12, -1, -1, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 55, 56, 57, 58, + -1, -1, -1, -1, 63, 64, -1, -1, -1, -1, + -1, -1, -1, 72, 73, -1, -1, -1, 77, 78, + 79, -1, -1, -1, -1, -1, -1, -1, 87, 88, + -1, 90, -1, -1, -1, -1, -1, 96, -1, -1, + 99, -1, -1, 102, -1, 104, -1, -1, -1, -1, + -1, -1, 111, -1, -1, -1, 115, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 125, -1, 127, 128, + -1, 130, -1, 132, -1, -1, 135, -1, -1, -1, + -1, 140, 141, 142, 143, 144, -1, 146, 147, 148, + 149, 150, 151, -1, -1, -1, 155, -1, -1, 158, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, 234, 235, -1, 237, 238, -1, -1, -1, -1, - -1, 244, 245, -1, -1, -1, -1, -1, 3, 4, - -1, -1, -1, 256, 257, 10, 11, 12, -1, -1, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, -1, -1, -1, -1, -1, 8, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 199, -1, -1, -1, 203, 204, -1, -1, -1, 208, + 209, 210, -1, 212, 213, 214, -1, -1, -1, 218, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 234, 235, -1, -1, -1, + -1, -1, 241, -1, -1, -1, -1, 246, 3, 4, + 5, -1, 251, -1, 253, 10, 11, 12, -1, -1, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 1173, -1, -1, 2040, -1, 1787, 1788, - 55, 56, 57, 58, -1, -1, -1, -1, 63, -1, - -1, -1, -1, -1, 2058, 2059, 2060, 2061, 2062, -1, - 75, 76, 77, -1, -1, -1, -1, -1, -1, -1, - 85, 86, -1, 88, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 1835, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - 234, 235, 236, 237, 238, 8, -1, -1, -1, 243, - 373, 374, 375, -1, -1, 2119, 379, 380, 381, 382, - 383, 384, 385, -1, 387, -1, -1, -1, 391, 392, - -1, -1, 395, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 1891, 1892, -1, 408, -1, -1, -1, -1, + 35, 36, 37, 38, 39, 40, 41, 42, 43, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 55, 56, 57, 58, -1, -1, -1, -1, 63, 64, + -1, -1, -1, -1, -1, -1, -1, 72, 73, -1, + -1, -1, 77, 78, 79, -1, -1, -1, -1, -1, + -1, -1, 87, 88, -1, 90, -1, -1, -1, -1, + -1, 96, -1, -1, 99, -1, -1, 102, -1, 104, + -1, -1, -1, -1, -1, -1, 111, -1, -1, -1, + 115, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 125, -1, 127, 128, -1, 130, -1, 132, -1, -1, + 135, -1, -1, -1, -1, 140, 141, 142, 143, 144, + -1, 146, 147, 148, 149, 150, 151, -1, -1, -1, + 155, -1, -1, 158, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, -1, -1, -1, -1, 245, -1, -1, -1, + -1, -1, -1, 8, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 199, -1, -1, -1, 203, 204, + -1, -1, -1, 208, 209, 210, -1, 212, 213, 214, + -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 234, + 235, -1, -1, -1, -1, -1, 241, -1, -1, -1, + -1, 246, 3, 4, -1, 250, -1, -1, 253, 10, + 11, 12, -1, -1, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 55, 56, 57, 58, -1, -1, + -1, -1, 63, 64, -1, -1, -1, -1, -1, -1, + -1, 72, 73, -1, -1, -1, 77, 78, 79, -1, + -1, -1, -1, -1, -1, -1, 87, 88, -1, 90, + -1, -1, -1, -1, -1, 96, -1, -1, 99, -1, + -1, 102, -1, 104, -1, -1, -1, -1, -1, -1, + 111, -1, -1, -1, 115, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 125, -1, 127, 128, -1, 130, + -1, 132, -1, -1, 135, -1, -1, -1, -1, 140, + 141, 142, 143, 144, -1, 146, 147, 148, 149, 150, + 151, -1, -1, -1, 155, -1, -1, 158, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, -1, -1, -1, -1, + 245, -1, -1, -1, -1, -1, -1, 8, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 199, -1, + -1, -1, 203, 204, -1, -1, -1, 208, 209, 210, + -1, 212, 213, 214, -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 1911, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 1312, -1, -1, -1, -1, 1926, -1, -1, - -1, -1, 197, -1, -1, -1, 201, -1, -1, -1, - -1, 206, 207, 208, -1, 210, 211, 212, -1, -1, - -1, 216, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 1351, -1, -1, -1, -1, -1, 232, 233, -1, - -1, -1, -1, -1, 239, -1, -1, -1, -1, 244, - -1, -1, -1, 248, -1, -1, 251, -1, -1, -1, - -1, -1, -1, 1383, 1384, 1385, 1386, 1387, -1, -1, - -1, -1, 1392, 1393, -1, -1, 1396, -1, 1398, -1, - -1, -1, 1402, -1, -1, 1405, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 1417, -1, -1, + -1, -1, -1, 234, 235, -1, -1, -1, -1, -1, + 241, -1, -1, -1, -1, 246, 3, 4, -1, 250, + 251, -1, 253, 10, 11, 12, -1, -1, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 55, 56, + 57, 58, -1, -1, -1, -1, 63, 64, -1, -1, + -1, -1, -1, -1, -1, 72, 73, -1, -1, -1, + 77, 78, 79, -1, -1, -1, -1, -1, -1, -1, + 87, 88, -1, 90, -1, -1, -1, -1, -1, 96, + -1, -1, 99, -1, -1, 102, -1, 104, -1, -1, + -1, -1, -1, -1, 111, -1, -1, -1, 115, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 125, -1, + 127, 128, -1, 130, -1, 132, -1, -1, 135, -1, + -1, -1, -1, 140, 141, 142, 143, 144, -1, 146, + 147, 148, 149, 150, 151, -1, -1, -1, 155, -1, + -1, 158, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + -1, -1, -1, -1, 245, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 2040, -1, -1, 557, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 2058, - 2059, 2060, 2061, 2062, -1, -1, -1, -1, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, 234, 235, 236, 237, 238, -1, -1, 8, -1, - 243, -1, -1, -1, -1, -1, -1, -1, 1488, -1, - 1490, -1, -1, -1, 1494, -1, 1496, -1, -1, -1, + -1, -1, 199, -1, -1, -1, 203, 204, -1, -1, + -1, 208, 209, 210, -1, 212, 213, 214, -1, -1, + -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 234, 235, -1, + -1, -1, -1, -1, 241, -1, -1, -1, -1, 246, + 3, 4, -1, 250, -1, -1, 253, 10, 11, 12, + -1, -1, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 55, 56, 57, 58, -1, -1, -1, -1, + 63, 64, -1, -1, -1, -1, -1, -1, -1, 72, + 73, -1, -1, -1, 77, 78, 79, -1, -1, -1, + -1, -1, -1, -1, 87, 88, -1, 90, -1, -1, + -1, -1, -1, 96, -1, -1, 99, -1, -1, 102, + -1, 104, -1, -1, -1, -1, -1, -1, 111, -1, + -1, -1, 115, -1, 4, 5, -1, -1, -1, -1, + -1, -1, 125, -1, 127, 128, -1, 130, -1, 132, + -1, -1, 135, -1, -1, -1, -1, 140, 141, 142, + 143, 144, -1, 146, 147, 148, 149, 150, 151, -1, + -1, -1, 155, -1, -1, 158, 46, 47, 48, 49, + 50, 51, 52, 53, 54, -1, -1, -1, -1, 59, + 60, 61, 62, -1, -1, -1, -1, 67, 68, 69, + -1, -1, -1, -1, 74, -1, 76, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 199, -1, -1, 89, + 203, 204, 92, -1, -1, 208, 209, 210, -1, 212, + 213, 214, -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 2119, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 1527, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 3, 4, 5, - -1, -1, -1, -1, 10, 11, 12, -1, -1, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 8, -1, - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, -1, - -1, 67, 68, 69, -1, -1, 72, 8, 74, 75, - 76, 77, -1, -1, -1, -1, -1, -1, -1, 85, - 86, 87, 88, 1623, 90, -1, -1, -1, 94, -1, - -1, 97, -1, -1, 100, -1, 102, -1, -1, -1, - -1, -1, -1, 109, -1, -1, -1, 113, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 123, -1, 125, - 126, -1, 128, -1, 130, -1, -1, 133, -1, -1, - -1, -1, 138, 139, 140, 141, 142, -1, 144, 145, - 146, 147, 148, 149, -1, -1, -1, 153, -1, -1, - 156, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 1725, -1, -1, 1728, -1, - -1, 197, 198, 199, 200, 201, 202, 860, -1, -1, - 206, 207, 208, 209, 210, 211, 212, 213, -1, 215, - 216, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 232, 233, -1, -1, - -1, 894, -1, 239, -1, -1, 1776, 1777, 244, 1779, - -1, -1, 248, -1, -1, 251, 8, -1, -1, -1, - -1, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, -1, -1, -1, -1, -1, - 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236, 237, 238, -1, 1839, - 1840, -1, 243, -1, 3, 4, 5, -1, -1, -1, - -1, 10, 11, 12, -1, -1, 15, 16, 17, 18, + -1, 234, 235, -1, -1, -1, -1, -1, 241, -1, + -1, -1, -1, 246, 3, 4, -1, 250, -1, -1, + 253, 10, 11, 12, -1, -1, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, -1, 1886, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, - 69, -1, -1, 72, -1, 74, 75, 76, 77, -1, - -1, -1, -1, -1, -1, -1, 85, 86, 87, 88, - -1, 90, -1, -1, -1, 94, -1, -1, 97, -1, - -1, 100, -1, 102, 1067, -1, -1, -1, -1, -1, - 109, -1, -1, -1, 113, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 123, -1, 125, 126, -1, 128, - -1, 130, -1, -1, 133, -1, -1, -1, -1, 138, - 139, 140, 141, 142, -1, 144, 145, 146, 147, 148, - 149, -1, -1, -1, 153, -1, -1, 156, -1, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, - 232, 233, 234, 235, 236, 237, 238, -1, -1, -1, - -1, 243, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 1160, 197, 198, - 199, 200, 201, 202, -1, -1, -1, 206, 207, 208, - 209, 210, 211, 212, 213, -1, 215, 216, -1, -1, + 39, 40, 41, 42, 43, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 55, 56, 57, 58, + -1, -1, -1, -1, 63, 64, -1, -1, -1, -1, + 200, 201, 202, 72, 73, -1, -1, -1, 77, 78, + 79, 211, -1, -1, -1, 215, -1, 217, 87, 88, + -1, 90, -1, -1, -1, -1, -1, 96, -1, -1, + 99, -1, -1, 102, -1, 104, -1, -1, -1, -1, + -1, -1, 111, -1, -1, -1, 115, -1, -1, 5, + -1, -1, -1, -1, -1, -1, 125, -1, 127, 128, + -1, 130, -1, 132, -1, -1, 135, -1, -1, -1, + -1, 140, 141, 142, 143, 144, -1, 146, 147, 148, + 149, 150, 151, -1, -1, -1, 155, -1, -1, 158, + 46, 47, 48, 49, 50, 51, 52, 53, 54, -1, + -1, -1, -1, 59, 60, 61, 62, -1, -1, -1, + -1, 67, 68, 69, -1, -1, -1, -1, 74, -1, + 76, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 199, -1, -1, 89, 203, 204, 92, -1, -1, 208, + 209, 210, -1, 212, 213, 214, -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 232, 233, -1, -1, -1, -1, -1, - 239, -1, -1, -1, -1, 244, 3, 4, 5, 248, - 7, -1, 251, 10, 11, 12, -1, -1, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, -1, -1, -1, -1, -1, -1, 2128, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, -1, 13, 14, - 67, 68, 69, -1, -1, 72, -1, 74, 75, 76, - 77, -1, -1, -1, -1, -1, -1, -1, 85, 86, - 87, 88, -1, 90, -1, -1, -1, 94, -1, -1, - 97, -1, -1, 100, -1, 102, -1, -1, -1, -1, - 1313, 1314, -1, -1, -1, -1, 113, -1, -1, -1, + -1, -1, -1, -1, -1, 234, 235, -1, -1, -1, + -1, -1, 241, -1, -1, -1, -1, 246, 3, 4, + -1, 250, -1, -1, 253, 10, 11, 12, -1, -1, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 130, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, -1, -1, -1, 110, 111, 112, 113, -1, - -1, 116, -1, -1, -1, -1, -1, -1, 123, 124, - -1, -1, 127, 128, -1, 130, 131, -1, 133, -1, - -1, -1, -1, 190, -1, -1, -1, 1400, -1, -1, - 197, 198, 199, 200, 201, 150, -1, 1410, -1, 206, - 207, 208, 209, 210, 211, 212, 213, -1, 215, 216, - 217, 218, 219, 220, -1, -1, -1, -1, -1, 174, - 175, 176, -1, -1, -1, 232, 233, -1, -1, -1, - -1, -1, 239, 240, 241, -1, -1, 244, -1, 246, - -1, -1, -1, 250, 251, 3, 4, 5, -1, -1, - -1, -1, 10, 11, 12, -1, -1, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, -1, -1, -1, -1, - -1, -1, -1, -1, 249, -1, -1, 55, 56, 57, - 58, -1, -1, -1, -1, 63, 64, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 75, 76, 77, - -1, -1, -1, -1, -1, -1, -1, 85, 86, -1, - 88, -1, -1, -1, -1, -1, 94, -1, -1, 97, - -1, -1, 100, -1, 102, -1, -1, -1, -1, -1, - 1563, 109, -1, -1, -1, 113, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 123, -1, 125, 126, -1, - 128, -1, 130, -1, -1, 133, -1, -1, -1, -1, - 138, 139, 140, 141, 142, -1, 144, 145, 146, 147, - 148, 149, -1, -1, -1, 153, -1, -1, 156, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, - 232, 233, 234, 235, 236, 237, 238, -1, -1, -1, - -1, 243, -1, 245, -1, -1, -1, -1, -1, -1, - -1, 253, -1, -1, -1, -1, -1, -1, -1, 197, - -1, -1, -1, 201, 202, -1, -1, -1, 206, 207, - 208, -1, 210, 211, 212, -1, -1, -1, 216, -1, + 55, 56, 57, 58, -1, -1, -1, -1, 63, 64, + -1, -1, -1, -1, 200, 201, 202, 72, 73, -1, + -1, -1, 77, 78, 79, 211, -1, -1, -1, 215, + -1, 217, 87, 88, -1, 90, -1, -1, -1, -1, + -1, 96, -1, -1, 99, -1, -1, 102, -1, 104, + -1, -1, -1, -1, -1, -1, 111, -1, -1, -1, + 115, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 125, -1, 127, 128, -1, 130, -1, 132, -1, -1, + 135, -1, -1, -1, -1, 140, 141, 142, 143, 144, + -1, 146, 147, 148, 149, 150, 151, -1, -1, -1, + 155, -1, -1, 158, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, -1, -1, -1, -1, 245, -1, 247, -1, + 249, -1, -1, -1, -1, -1, 255, -1, -1, -1, + -1, -1, -1, -1, 199, -1, -1, -1, 203, 204, + -1, -1, -1, 208, 209, 210, -1, 212, 213, 214, + -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 234, + 235, -1, -1, -1, -1, -1, 241, -1, -1, -1, + -1, 246, 3, 4, -1, -1, 251, -1, 253, 10, + 11, 12, -1, -1, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 55, 56, 57, 58, -1, -1, + -1, -1, 63, 64, -1, -1, -1, -1, -1, -1, + -1, 72, 73, -1, -1, -1, 77, 78, 79, -1, + -1, -1, -1, -1, -1, -1, 87, 88, -1, 90, + -1, -1, -1, -1, -1, 96, -1, -1, 99, -1, + -1, 102, -1, 104, -1, -1, -1, -1, -1, -1, + 111, -1, -1, -1, 115, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 125, -1, 127, 128, -1, 130, + -1, 132, -1, -1, 135, -1, -1, -1, -1, 140, + 141, 142, 143, 144, -1, 146, 147, 148, 149, 150, + 151, -1, -1, -1, 155, -1, -1, 158, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, -1, -1, -1, -1, + 245, -1, 247, -1, -1, -1, -1, -1, -1, -1, + 255, -1, -1, -1, -1, -1, -1, -1, 199, -1, + -1, -1, 203, 204, -1, -1, -1, 208, 209, 210, + -1, 212, 213, 214, -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 232, 233, -1, -1, -1, -1, - -1, 239, -1, -1, -1, -1, 244, 3, 4, -1, - 248, -1, 8, 251, 10, 11, 12, -1, -1, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 55, - 56, 57, 58, -1, -1, -1, -1, 63, 64, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 75, - 76, 77, -1, -1, -1, -1, -1, -1, -1, 85, - 86, -1, 88, -1, -1, -1, -1, -1, 94, -1, - -1, 97, -1, -1, 100, -1, 102, -1, -1, -1, - -1, -1, -1, 109, -1, -1, -1, 113, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 123, -1, 125, - 126, -1, 128, -1, 130, -1, -1, 133, -1, -1, - -1, -1, 138, 139, 140, 141, 142, -1, 144, 145, - 146, 147, 148, 149, -1, -1, -1, 153, -1, -1, - 156, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, -1, -1, -1, -1, 249, - -1, -1, -1, 253, -1, -1, -1, -1, -1, -1, - -1, 197, -1, -1, -1, 201, 202, -1, -1, -1, - 206, 207, 208, -1, 210, 211, 212, -1, -1, -1, - 216, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 232, 233, -1, -1, - -1, -1, -1, 239, -1, -1, -1, -1, 244, 3, - 4, 5, -1, 249, -1, 251, 10, 11, 12, -1, - -1, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + -1, -1, -1, 234, 235, -1, -1, -1, -1, -1, + 241, -1, -1, -1, -1, 246, 3, 4, -1, 250, + -1, -1, 253, 10, 11, 12, -1, -1, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 55, 56, + 57, 58, -1, -1, -1, -1, 63, 64, -1, -1, + -1, -1, -1, -1, -1, 72, 73, -1, -1, -1, + 77, 78, 79, -1, -1, -1, -1, -1, -1, -1, + 87, 88, -1, 90, -1, -1, -1, -1, -1, 96, + -1, -1, 99, -1, -1, 102, -1, 104, -1, -1, + -1, -1, -1, -1, 111, -1, -1, -1, 115, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 125, -1, + 127, 128, -1, 130, -1, 132, -1, -1, 135, -1, + -1, -1, -1, 140, 141, 142, 143, 144, -1, 146, + 147, 148, 149, 150, 151, -1, -1, -1, 155, -1, + -1, 158, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + -1, -1, -1, -1, 245, -1, -1, -1, -1, -1, + 251, -1, -1, -1, 255, -1, -1, -1, -1, -1, + -1, -1, 199, -1, -1, -1, 203, 204, -1, -1, + -1, 208, 209, 210, -1, 212, 213, 214, -1, -1, + -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 234, 235, -1, + -1, -1, -1, -1, 241, -1, -1, -1, -1, 246, + 3, 4, -1, 250, -1, -1, 253, 10, 11, 12, + -1, -1, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 55, 56, 57, 58, -1, -1, -1, -1, + 63, 64, -1, -1, -1, -1, -1, -1, -1, 72, + 73, -1, -1, -1, 77, 78, 79, -1, -1, -1, + -1, -1, -1, -1, 87, 88, -1, 90, -1, -1, + -1, -1, -1, 96, -1, -1, 99, -1, -1, 102, + -1, 104, -1, -1, -1, -1, -1, -1, 111, -1, + -1, -1, 115, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 125, -1, 127, 128, -1, 130, -1, 132, + -1, -1, 135, -1, -1, -1, -1, 140, 141, 142, + 143, 144, -1, 146, 147, 148, 149, 150, 151, -1, + -1, -1, 155, -1, -1, 158, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, -1, -1, -1, -1, 245, -1, + -1, -1, -1, -1, 251, -1, -1, -1, 255, -1, + -1, -1, -1, -1, -1, -1, 199, -1, -1, -1, + 203, 204, -1, -1, -1, 208, 209, 210, -1, 212, + 213, 214, -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 55, 56, 57, 58, -1, -1, -1, -1, 63, - 64, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 75, 76, 77, -1, -1, -1, -1, -1, -1, - -1, 85, 86, -1, 88, -1, -1, -1, -1, -1, - 94, -1, -1, 97, -1, -1, 100, -1, 102, -1, - -1, -1, -1, -1, -1, 109, -1, -1, -1, 113, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 123, - -1, 125, 126, -1, 128, -1, 130, -1, -1, 133, - -1, -1, -1, -1, 138, 139, 140, 141, 142, -1, - 144, 145, 146, 147, 148, 149, -1, -1, -1, 153, - -1, -1, 156, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, - 238, -1, -1, -1, -1, 243, -1, -1, -1, -1, - -1, 249, -1, -1, -1, 253, -1, -1, -1, -1, - -1, -1, -1, 197, -1, -1, -1, 201, 202, -1, - -1, -1, 206, 207, 208, -1, 210, 211, 212, -1, - -1, -1, 216, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 232, 233, - -1, -1, -1, -1, -1, 239, -1, -1, -1, -1, - 244, 3, 4, -1, 248, -1, -1, 251, 10, 11, - 12, -1, -1, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 55, 56, 57, 58, -1, -1, -1, - -1, 63, 64, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 75, 76, 77, -1, -1, -1, -1, - -1, -1, -1, 85, 86, -1, 88, -1, -1, -1, - -1, -1, 94, -1, -1, 97, -1, -1, 100, -1, - 102, -1, -1, -1, -1, -1, -1, 109, -1, -1, - -1, 113, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 123, -1, 125, 126, -1, 128, -1, 130, -1, - -1, 133, -1, -1, -1, -1, 138, 139, 140, 141, - 142, -1, 144, 145, 146, 147, 148, 149, -1, -1, - -1, 153, -1, -1, 156, 221, 222, 223, 224, 225, - 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, - 236, 237, 238, -1, -1, -1, -1, 243, -1, -1, - -1, -1, -1, 249, -1, -1, -1, 253, -1, -1, - -1, -1, -1, -1, -1, 197, -1, -1, -1, 201, - 202, -1, -1, -1, 206, 207, 208, -1, 210, 211, - 212, -1, -1, -1, 216, -1, -1, -1, -1, -1, + -1, 234, 235, -1, -1, -1, -1, -1, 241, -1, + -1, -1, -1, 246, 3, 4, -1, 250, -1, 8, + 253, 10, 11, 12, -1, -1, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 55, 56, 57, 58, + -1, -1, -1, -1, 63, 64, -1, -1, -1, -1, + -1, -1, -1, 72, 73, -1, -1, -1, 77, 78, + 79, -1, -1, -1, -1, -1, -1, -1, 87, 88, + -1, 90, -1, -1, -1, -1, -1, 96, -1, -1, + 99, -1, -1, 102, -1, 104, -1, -1, -1, -1, + -1, -1, 111, -1, -1, -1, 115, -1, 4, 5, + -1, -1, -1, -1, -1, -1, 125, -1, 127, 128, + -1, 130, -1, 132, -1, -1, 135, -1, -1, -1, + -1, 140, 141, 142, 143, 144, -1, 146, 147, 148, + 149, 150, 151, -1, -1, -1, 155, -1, -1, 158, + 46, 47, 48, 49, 50, 51, 52, 53, 54, -1, + -1, -1, -1, 59, 60, 61, 62, -1, -1, -1, + -1, 67, 68, 69, -1, -1, -1, -1, 74, -1, + 76, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 199, -1, -1, 89, 203, 204, 92, -1, -1, 208, + 209, 210, -1, 212, 213, 214, -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 232, 233, -1, -1, -1, -1, -1, 239, -1, -1, - -1, -1, 244, 3, 4, -1, 248, 249, -1, 251, - 10, 11, 12, -1, -1, 15, 16, 17, 18, 19, + -1, -1, -1, -1, -1, 234, 235, -1, -1, -1, + -1, -1, 241, 3, 4, -1, -1, 246, 8, -1, + 10, 11, 12, -1, 253, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 55, 56, 57, 58, -1, -1, -1, -1, 63, 64, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 75, 76, 77, -1, -1, - -1, -1, -1, -1, -1, 85, 86, -1, 88, -1, - -1, -1, -1, -1, 94, -1, -1, 97, -1, -1, - 100, -1, 102, -1, -1, -1, -1, -1, -1, 109, - -1, -1, -1, 113, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 123, -1, 125, 126, -1, 128, -1, - 130, -1, -1, 133, -1, -1, -1, -1, 138, 139, - 140, 141, 142, -1, 144, 145, 146, 147, 148, 149, - -1, -1, -1, 153, -1, -1, 156, 221, 222, 223, + -1, -1, 72, 73, 200, 201, 202, 77, 78, 79, + -1, -1, -1, -1, -1, 211, -1, 87, 88, 215, + 90, 217, 218, -1, -1, -1, 96, -1, -1, 99, + -1, -1, 102, -1, 104, -1, -1, -1, -1, -1, + -1, 111, -1, -1, -1, 115, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 125, -1, 127, 128, -1, + 130, -1, 132, -1, -1, 135, -1, -1, -1, -1, + 140, 141, 142, 143, 144, -1, 146, 147, 148, 149, + 150, 151, -1, -1, -1, 155, -1, -1, 158, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - 234, 235, 236, 237, 238, -1, -1, -1, -1, 243, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 253, - -1, -1, -1, -1, -1, -1, -1, 197, -1, -1, - -1, 201, 202, -1, -1, -1, 206, 207, 208, -1, - 210, 211, 212, -1, -1, -1, 216, -1, -1, -1, + 234, 235, 236, 237, 238, 239, 240, -1, -1, -1, + -1, 245, -1, -1, -1, -1, -1, 251, -1, -1, + -1, 255, -1, -1, -1, -1, -1, -1, -1, 199, + -1, -1, -1, 203, 204, -1, -1, -1, 208, 209, + 210, -1, 212, 213, 214, -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 232, 233, -1, -1, -1, -1, -1, 239, - -1, -1, -1, -1, 244, 3, 4, -1, 248, -1, - -1, 251, 10, 11, 12, -1, -1, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 55, 56, 57, - 58, -1, -1, -1, -1, 63, 64, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 75, 76, 77, - -1, -1, -1, -1, -1, -1, -1, 85, 86, -1, - 88, -1, -1, -1, -1, -1, 94, -1, -1, 97, - -1, -1, 100, -1, 102, -1, -1, -1, -1, -1, - -1, 109, -1, -1, -1, 113, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 123, -1, 125, 126, -1, - 128, -1, 130, -1, -1, 133, -1, -1, -1, -1, - 138, 139, 140, 141, 142, -1, 144, 145, 146, 147, - 148, 149, -1, -1, -1, 153, -1, -1, 156, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, - 232, 233, 234, 235, 236, 237, 238, -1, -1, -1, - -1, 243, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 253, -1, -1, -1, -1, -1, -1, -1, 197, - -1, -1, -1, 201, 202, -1, -1, -1, 206, 207, - 208, -1, 210, 211, 212, -1, -1, -1, 216, -1, + -1, -1, -1, -1, 234, 235, -1, -1, -1, -1, + -1, 241, 3, 4, -1, -1, 246, -1, -1, 10, + 11, 12, -1, 253, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 55, 56, 57, 58, -1, -1, + -1, -1, 63, 64, -1, -1, -1, -1, -1, -1, + -1, 72, 73, -1, -1, -1, 77, 78, 79, -1, + -1, -1, -1, -1, -1, -1, 87, 88, -1, 90, + -1, -1, -1, -1, -1, 96, -1, -1, 99, -1, + -1, 102, -1, 104, -1, -1, -1, -1, -1, -1, + 111, -1, -1, -1, 115, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 125, -1, 127, 128, -1, 130, + -1, 132, -1, -1, 135, -1, -1, -1, -1, 140, + 141, 142, 143, 144, -1, 146, 147, 148, 149, 150, + 151, -1, -1, -1, 155, -1, -1, 158, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, -1, -1, -1, -1, + 245, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 255, -1, -1, -1, -1, -1, -1, -1, 199, -1, + -1, -1, 203, 204, -1, -1, -1, 208, 209, 210, + -1, 212, 213, 214, -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 232, 233, -1, -1, -1, -1, - -1, 239, -1, -1, -1, -1, 244, 3, 4, -1, - 248, -1, -1, 251, 10, 11, 12, -1, -1, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 55, - 56, 57, 58, -1, -1, -1, -1, 63, 64, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 75, - 76, 77, -1, -1, -1, -1, -1, -1, -1, 85, - 86, -1, 88, -1, -1, -1, -1, -1, 94, -1, - -1, 97, -1, -1, 100, -1, 102, -1, -1, -1, - -1, -1, -1, 109, -1, -1, -1, 113, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 123, -1, 125, - 126, -1, 128, -1, 130, -1, -1, 133, -1, -1, - -1, -1, 138, 139, 140, 141, 142, -1, 144, 145, - 146, 147, 148, 149, -1, -1, -1, 153, -1, -1, - 156, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 253, -1, -1, -1, -1, -1, -1, - -1, 197, -1, -1, -1, 201, 202, -1, -1, -1, - 206, 207, 208, -1, 210, 211, 212, -1, -1, -1, - 216, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 232, 233, -1, -1, - -1, -1, -1, 239, -1, -1, -1, -1, 244, 3, - 4, -1, 248, -1, -1, 251, 10, 11, 12, -1, + -1, -1, -1, 234, 235, -1, -1, -1, -1, -1, + 241, -1, -1, -1, -1, 246, 3, 4, -1, 250, + -1, -1, 253, 10, 11, 12, -1, -1, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 55, 56, + 57, 58, -1, -1, -1, -1, 63, 64, -1, -1, + -1, -1, -1, -1, -1, 72, 73, -1, -1, -1, + 77, 78, 79, -1, -1, -1, -1, -1, -1, -1, + 87, 88, -1, 90, -1, -1, -1, -1, -1, 96, + -1, -1, 99, -1, -1, 102, -1, 104, -1, -1, + -1, -1, -1, -1, 111, -1, -1, -1, 115, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 125, -1, + 127, 128, -1, 130, -1, 132, -1, -1, 135, -1, + -1, -1, -1, 140, 141, 142, 143, 144, -1, 146, + 147, 148, 149, 150, 151, -1, -1, -1, 155, -1, + -1, 158, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + -1, -1, -1, -1, 245, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 255, -1, -1, -1, -1, -1, + -1, -1, 199, -1, -1, -1, 203, 204, -1, -1, + -1, 208, 209, 210, -1, 212, 213, 214, -1, -1, + -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 234, 235, -1, + -1, -1, -1, -1, 241, -1, -1, -1, -1, 246, + 3, 4, -1, 250, -1, -1, 253, 10, 11, 12, + -1, -1, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 55, 56, 57, 58, -1, -1, -1, -1, + 63, 64, -1, -1, -1, -1, -1, -1, -1, 72, + 73, -1, -1, -1, 77, 78, 79, -1, -1, -1, + -1, -1, -1, -1, 87, 88, -1, 90, -1, -1, + -1, -1, -1, 96, -1, -1, 99, -1, -1, 102, + -1, 104, -1, -1, -1, -1, -1, -1, 111, -1, + -1, -1, 115, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 125, -1, 127, 128, -1, 130, -1, 132, + -1, -1, 135, -1, -1, -1, -1, 140, 141, 142, + 143, 144, -1, 146, 147, 148, 149, 150, 151, -1, + -1, -1, 155, -1, -1, 158, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, -1, -1, -1, -1, 245, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 255, -1, + -1, -1, -1, -1, -1, -1, 199, -1, -1, -1, + 203, 204, -1, -1, -1, 208, 209, 210, -1, 212, + 213, 214, -1, -1, -1, 218, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 234, 235, -1, -1, -1, -1, -1, 241, 3, + 4, 5, -1, 246, -1, -1, 10, 11, 12, -1, + 253, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, -1, -1, -1, -1, -1, + -1, -1, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + -1, -1, -1, 67, 68, 69, -1, -1, -1, -1, + 74, -1, 76, 77, 78, 79, -1, -1, -1, -1, + -1, -1, -1, 87, 88, 89, 90, -1, 92, 3, + 4, 5, -1, -1, -1, -1, 10, 11, 12, -1, -1, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 55, 56, 57, 58, -1, -1, -1, -1, 63, - 64, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 75, 76, 77, -1, -1, -1, -1, -1, -1, - -1, 85, 86, -1, 88, -1, -1, -1, -1, -1, - 94, -1, -1, 97, -1, -1, 100, -1, 102, -1, - -1, -1, -1, -1, -1, 109, -1, -1, -1, 113, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 123, - -1, 125, 126, -1, 128, -1, 130, -1, -1, 133, - -1, -1, -1, -1, 138, 139, 140, 141, 142, -1, - 144, 145, 146, 147, 148, 149, -1, -1, -1, 153, - -1, -1, 156, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, - 238, -1, -1, -1, -1, 243, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 253, -1, -1, -1, -1, - -1, -1, -1, 197, -1, -1, -1, 201, 202, -1, - -1, -1, 206, 207, 208, -1, 210, 211, 212, -1, - -1, -1, 216, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 232, 233, - -1, -1, -1, -1, -1, 239, -1, -1, -1, -1, - 244, 3, 4, -1, -1, 249, -1, 251, 10, 11, - 12, -1, -1, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 55, 56, 57, 58, -1, -1, -1, - -1, 63, 64, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 75, 76, 77, -1, -1, -1, -1, - -1, -1, -1, 85, 86, -1, 88, -1, -1, -1, - -1, -1, 94, -1, -1, 97, -1, -1, 100, -1, - 102, -1, -1, -1, -1, -1, -1, 109, -1, -1, - -1, 113, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 123, -1, 125, 126, -1, 128, -1, 130, -1, - -1, 133, -1, -1, -1, -1, 138, 139, 140, 141, - 142, -1, 144, 145, 146, 147, 148, 149, -1, -1, - -1, 153, -1, -1, 156, 221, 222, 223, 224, 225, - 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, - 236, 237, 238, -1, -1, -1, -1, 243, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 253, -1, -1, - -1, -1, -1, -1, -1, 197, -1, -1, -1, 201, - 202, -1, -1, -1, 206, 207, 208, -1, 210, 211, - 212, -1, -1, -1, 216, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 232, 233, -1, -1, -1, -1, -1, 239, -1, -1, - -1, -1, 244, 3, 4, -1, 248, -1, -1, 251, - 10, 11, 12, -1, -1, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 55, 56, 57, 58, -1, - -1, -1, -1, 63, 64, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 75, 76, 77, -1, -1, - -1, -1, -1, -1, -1, 85, 86, -1, 88, -1, - -1, -1, -1, -1, 94, -1, -1, 97, -1, -1, - 100, -1, 102, -1, -1, -1, -1, -1, -1, 109, - -1, -1, -1, 113, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 123, -1, 125, 126, -1, 128, -1, - 130, -1, -1, 133, -1, -1, -1, -1, 138, 139, - 140, 141, 142, -1, 144, 145, 146, 147, 148, 149, - -1, -1, -1, 153, -1, -1, 156, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - 234, 235, 236, 237, 238, -1, -1, -1, -1, 243, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 253, - -1, -1, -1, -1, -1, -1, -1, 197, -1, -1, - -1, 201, 202, -1, -1, -1, 206, 207, 208, -1, - 210, 211, 212, -1, -1, -1, 216, -1, -1, -1, + 34, 35, 36, 37, 38, -1, -1, -1, -1, -1, + -1, -1, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + -1, -1, -1, 67, 68, 69, -1, -1, -1, -1, + 74, -1, 76, 77, 78, 79, -1, -1, -1, -1, + -1, -1, -1, 87, 88, 89, 90, -1, 92, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 232, 233, -1, -1, -1, -1, -1, 239, - -1, -1, -1, -1, 244, 3, 4, -1, 248, -1, - -1, 251, 10, 11, 12, -1, -1, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 55, 56, 57, - 58, -1, -1, -1, -1, 63, 64, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 75, 76, 77, - -1, -1, -1, -1, -1, -1, -1, 85, 86, -1, - 88, -1, -1, -1, -1, -1, 94, -1, -1, 97, - -1, -1, 100, -1, 102, -1, -1, -1, -1, -1, - -1, 109, -1, -1, -1, 113, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 123, -1, 125, 126, -1, - 128, -1, 130, -1, -1, 133, -1, -1, -1, -1, - 138, 139, 140, 141, 142, -1, 144, 145, 146, 147, - 148, 149, -1, -1, -1, 153, -1, -1, 156, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, - 232, 233, 234, 235, 236, 237, 238, -1, -1, -1, - -1, 243, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 253, -1, -1, -1, -1, -1, -1, -1, 197, - -1, -1, -1, 201, 202, -1, -1, -1, 206, 207, - 208, -1, 210, 211, 212, -1, -1, -1, 216, -1, + -1, -1, -1, -1, -1, 199, 200, 201, 202, 203, + -1, -1, -1, -1, 208, 209, 210, 211, 212, 213, + 214, 215, -1, 217, 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 232, 233, -1, -1, -1, -1, - -1, 239, -1, -1, -1, -1, 244, 3, 4, -1, - 248, -1, 8, 251, 10, 11, 12, -1, -1, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 55, - 56, 57, 58, -1, -1, -1, -1, 63, 64, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 75, - 76, 77, -1, -1, -1, -1, -1, -1, -1, 85, - 86, -1, 88, -1, -1, -1, -1, -1, 94, -1, - -1, 97, -1, -1, 100, -1, 102, -1, -1, -1, - -1, -1, -1, 109, -1, -1, -1, 113, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 123, -1, 125, - 126, -1, 128, -1, 130, -1, -1, 133, -1, -1, - -1, -1, 138, 139, 140, 141, 142, -1, 144, 145, - 146, 147, 148, 149, -1, -1, -1, 153, -1, -1, - 156, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 253, -1, -1, -1, -1, -1, -1, - -1, 197, -1, -1, -1, 201, 202, -1, -1, -1, - 206, 207, 208, -1, 210, 211, 212, -1, -1, -1, - 216, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 232, 233, -1, -1, - -1, -1, -1, 239, 3, 4, -1, -1, 244, 8, - -1, 10, 11, 12, -1, 251, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 55, 56, 57, 58, - -1, -1, -1, -1, 63, 64, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 75, 76, 77, -1, - -1, -1, -1, -1, -1, -1, 85, 86, -1, 88, - -1, -1, -1, -1, -1, 94, -1, -1, 97, -1, - -1, 100, -1, 102, -1, -1, -1, -1, -1, -1, - 109, -1, -1, -1, 113, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 123, -1, 125, 126, -1, 128, - -1, 130, -1, -1, 133, -1, -1, -1, -1, 138, - 139, 140, 141, 142, -1, 144, 145, 146, 147, 148, - 149, -1, -1, -1, 153, -1, -1, 156, 221, 222, + 234, 235, -1, -1, -1, -1, -1, 241, -1, -1, + -1, -1, 246, -1, -1, -1, 250, -1, -1, 253, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, 234, 235, 236, 237, 238, -1, -1, -1, -1, - 243, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 253, -1, -1, -1, -1, -1, -1, -1, 197, -1, - -1, -1, 201, 202, -1, -1, -1, 206, 207, 208, - -1, 210, 211, 212, -1, -1, -1, 216, -1, -1, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 255, -1, -1, 199, 200, 201, 202, 203, + -1, -1, -1, -1, 208, 209, 210, 211, 212, 213, + 214, 215, -1, 217, 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 232, 233, -1, -1, -1, -1, -1, - 239, 3, 4, -1, -1, 244, -1, -1, 10, 11, - 12, -1, 251, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 55, 56, 57, 58, -1, -1, -1, - -1, 63, 64, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 75, 76, 77, -1, -1, -1, -1, - -1, -1, -1, 85, 86, -1, 88, -1, -1, -1, - -1, -1, 94, -1, -1, 97, -1, -1, 100, -1, - 102, -1, -1, -1, -1, -1, -1, 109, -1, -1, - -1, 113, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 123, -1, 125, 126, -1, 128, -1, 130, -1, - -1, 133, -1, -1, -1, -1, 138, 139, 140, 141, - 142, -1, 144, 145, 146, 147, 148, 149, -1, -1, - -1, 153, -1, -1, 156, 221, 222, 223, 224, 225, - 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, - 236, 237, 238, -1, -1, -1, -1, 243, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 253, -1, -1, - -1, -1, -1, -1, -1, 197, -1, -1, -1, 201, - 202, -1, -1, -1, 206, 207, 208, -1, 210, 211, - 212, -1, -1, -1, 216, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 232, 233, -1, -1, -1, -1, -1, 239, -1, -1, - -1, -1, 244, 3, 4, -1, 248, -1, -1, 251, + 234, 235, -1, -1, -1, -1, -1, 241, -1, -1, + -1, -1, 246, 3, 4, 5, 250, -1, -1, 253, 10, 11, 12, -1, -1, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 55, 56, 57, 58, -1, - -1, -1, -1, 63, 64, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 75, 76, 77, -1, -1, - -1, -1, -1, -1, -1, 85, 86, -1, 88, -1, - -1, -1, -1, -1, 94, -1, -1, 97, -1, -1, - 100, -1, 102, -1, -1, -1, -1, -1, -1, 109, - -1, -1, -1, 113, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 123, -1, 125, 126, -1, 128, -1, - 130, -1, -1, 133, -1, -1, -1, -1, 138, 139, - 140, 141, 142, -1, 144, 145, 146, 147, 148, 149, - -1, -1, -1, 153, -1, -1, 156, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - 234, 235, 236, 237, 238, -1, -1, -1, -1, 243, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 253, - -1, -1, -1, -1, -1, -1, -1, 197, -1, -1, - -1, 201, 202, -1, -1, -1, 206, 207, 208, -1, - 210, 211, 212, -1, -1, -1, 216, -1, -1, -1, + 30, 31, 32, 33, 34, 35, 36, 37, 38, -1, + -1, -1, -1, -1, -1, -1, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, -1, -1, -1, 67, 68, 69, + -1, -1, -1, -1, 74, -1, 76, 77, 78, 79, + -1, -1, -1, -1, -1, -1, -1, 87, 88, 89, + 90, -1, 92, 3, 4, 5, -1, -1, -1, -1, + 10, 11, 12, -1, -1, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, -1, + -1, -1, -1, -1, -1, -1, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, -1, -1, -1, 67, 68, 69, + -1, -1, -1, -1, 74, -1, 76, 77, 78, 79, + -1, -1, -1, -1, -1, -1, -1, 87, 88, 89, + 90, -1, 92, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 199, + 200, 201, 202, 203, -1, -1, -1, -1, 208, 209, + 210, 211, 212, 213, 214, 215, -1, 217, 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 232, 233, -1, -1, -1, -1, -1, 239, - -1, -1, -1, -1, 244, 3, 4, -1, 248, -1, - -1, 251, 10, 11, 12, -1, -1, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 55, 56, 57, - 58, -1, -1, -1, -1, 63, 64, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 75, 76, 77, - -1, -1, -1, -1, -1, -1, -1, 85, 86, -1, - 88, -1, -1, -1, -1, -1, 94, -1, -1, 97, - -1, -1, 100, -1, 102, -1, -1, -1, -1, -1, - -1, 109, -1, -1, -1, 113, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 123, -1, 125, 126, -1, - 128, -1, 130, -1, -1, 133, -1, -1, -1, -1, - 138, 139, 140, 141, 142, -1, 144, 145, 146, 147, - 148, 149, -1, -1, -1, 153, -1, -1, 156, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, - 232, 233, 234, 235, 236, 237, 238, -1, -1, -1, - -1, 243, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 253, -1, -1, -1, -1, -1, -1, -1, 197, - -1, -1, -1, 201, 202, -1, -1, -1, 206, 207, - 208, -1, 210, 211, 212, -1, -1, -1, 216, -1, + -1, -1, -1, -1, 234, 235, -1, -1, -1, -1, + -1, 241, -1, -1, -1, -1, 246, -1, -1, -1, + 250, -1, -1, 253, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, -1, -1, -1, -1, 245, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 255, -1, -1, 199, + 200, 201, 202, 203, -1, -1, -1, -1, 208, 209, + 210, 211, 212, 213, 214, 215, -1, 217, 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 232, 233, -1, -1, -1, -1, - -1, 239, 3, 4, 5, -1, 244, -1, -1, 10, - 11, 12, -1, 251, 15, 16, 17, 18, 19, 20, + -1, -1, -1, -1, 234, 235, -1, -1, -1, -1, + -1, 241, 3, 4, -1, -1, 246, -1, -1, 10, + 11, 12, -1, 253, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, -1, -1, - -1, -1, -1, -1, -1, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, -1, -1, -1, 67, 68, 69, -1, - -1, 72, -1, 74, 75, 76, 77, -1, -1, -1, - -1, -1, -1, -1, 85, 86, 87, 88, -1, 90, - 3, 4, 5, -1, -1, -1, -1, 10, 11, 12, - -1, -1, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, -1, -1, -1, -1, - -1, -1, -1, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, -1, -1, -1, 67, 68, 69, -1, -1, 72, - -1, 74, 75, 76, 77, -1, -1, -1, -1, -1, - -1, -1, 85, 86, 87, 88, -1, 90, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 197, 198, 199, 200, - 201, -1, -1, -1, -1, 206, 207, 208, 209, 210, - 211, 212, 213, -1, 215, 216, -1, -1, -1, -1, + -1, -1, -1, -1, 55, 56, 57, 58, -1, -1, + -1, -1, 63, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 77, 78, 79, -1, + -1, -1, -1, 3, 4, -1, 87, 88, 8, 90, + 10, 11, 12, -1, -1, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 55, 56, 57, 58, -1, + -1, -1, -1, 63, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 77, 78, 79, + -1, -1, -1, -1, -1, -1, -1, 87, 88, -1, + 90, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, -1, + -1, -1, -1, 245, -1, -1, -1, -1, 199, -1, + -1, -1, 203, 255, -1, -1, -1, 208, 209, 210, + -1, 212, 213, 214, -1, -1, -1, 218, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 234, 235, -1, -1, -1, -1, -1, + 241, -1, -1, -1, -1, 246, -1, -1, -1, 250, + -1, -1, 253, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, -1, -1, -1, -1, 245, -1, -1, -1, 199, + -1, -1, -1, 203, -1, 255, -1, -1, 208, 209, + 210, -1, 212, 213, 214, -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 232, 233, -1, -1, -1, -1, -1, 239, -1, - -1, -1, -1, 244, -1, -1, -1, 248, -1, -1, - 251, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 253, 197, 198, 199, 200, 201, -1, - -1, -1, -1, 206, 207, 208, 209, 210, 211, 212, - 213, -1, 215, 216, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 232, - 233, -1, -1, -1, -1, -1, 239, -1, -1, -1, - -1, 244, 3, 4, 5, 248, -1, -1, 251, 10, - 11, 12, -1, -1, 15, 16, 17, 18, 19, 20, + -1, -1, -1, -1, 234, 235, -1, -1, -1, -1, + -1, 241, 3, 4, -1, -1, 246, -1, -1, 10, + 11, 12, -1, 253, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, -1, -1, - -1, -1, -1, -1, -1, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, -1, -1, -1, 67, 68, 69, -1, - -1, 72, -1, 74, 75, 76, 77, -1, -1, -1, - -1, -1, -1, -1, 85, 86, 87, 88, -1, 90, - 3, 4, 5, -1, -1, -1, -1, 10, 11, 12, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 55, 56, 57, 58, -1, -1, + -1, -1, 63, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 77, 78, 79, -1, + -1, -1, -1, -1, -1, -1, 87, 88, -1, 90, + 3, 4, -1, 6, -1, -1, -1, 10, 11, 12, -1, -1, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, -1, -1, -1, -1, - -1, -1, -1, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, -1, -1, -1, 67, 68, 69, -1, -1, 72, - -1, 74, 75, 76, 77, -1, -1, -1, -1, -1, - -1, -1, 85, 86, 87, 88, -1, 90, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 197, 198, 199, 200, - 201, -1, -1, -1, -1, 206, 207, 208, 209, 210, - 211, 212, 213, -1, 215, 216, -1, -1, -1, -1, + -1, -1, 55, 56, 57, 58, -1, -1, -1, -1, + 63, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 77, 78, 79, -1, -1, -1, + -1, -1, -1, -1, 87, 88, -1, 90, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, -1, -1, 199, -1, + 245, -1, 203, -1, -1, -1, -1, 208, 209, 210, + 255, 212, 213, 214, -1, -1, -1, 218, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 234, 235, -1, -1, -1, -1, -1, + 241, -1, -1, -1, -1, 246, 247, -1, -1, -1, + -1, -1, 253, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, -1, -1, -1, -1, 245, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 255, 199, -1, -1, -1, + 203, -1, -1, -1, -1, 208, 209, 210, -1, 212, + 213, 214, -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 232, 233, -1, -1, -1, -1, -1, 239, -1, - -1, -1, -1, 244, -1, -1, -1, 248, -1, -1, - 251, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 253, 197, 198, 199, 200, 201, -1, - -1, -1, -1, 206, 207, 208, 209, 210, 211, 212, - 213, -1, 215, 216, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 232, - 233, -1, -1, -1, -1, -1, 239, 3, 4, -1, - -1, 244, -1, -1, 10, 11, 12, -1, 251, 15, + -1, 234, 235, -1, -1, -1, -1, -1, 241, 3, + 4, -1, 6, 246, -1, -1, 10, 11, 12, -1, + 253, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 55, 56, 57, 58, -1, -1, -1, -1, 63, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 77, 78, 79, -1, -1, -1, -1, + -1, -1, -1, 87, 88, -1, 90, 3, 4, -1, + 6, -1, -1, -1, 10, 11, 12, -1, -1, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 55, 56, 57, 58, -1, -1, -1, -1, 63, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 75, - 76, 77, -1, -1, -1, -1, 3, 4, -1, 85, - 86, 8, 88, 10, 11, 12, -1, -1, 15, 16, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 77, 78, 79, -1, -1, -1, -1, -1, -1, + -1, 87, 88, -1, 90, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, -1, -1, 199, -1, 245, -1, 203, + -1, -1, -1, -1, 208, 209, 210, 255, 212, 213, + 214, -1, -1, -1, 218, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 234, 235, -1, -1, -1, -1, -1, 241, -1, -1, + -1, -1, 246, -1, -1, -1, -1, -1, -1, 253, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 255, 199, -1, -1, -1, 203, -1, -1, + -1, -1, 208, 209, 210, -1, 212, 213, 214, -1, + -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 234, 235, + -1, -1, -1, -1, -1, 241, 3, 4, -1, -1, + 246, -1, -1, 10, 11, 12, -1, 253, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 55, 56, 57, 58, -1, -1, -1, -1, 63, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 75, 76, - 77, -1, -1, -1, -1, -1, -1, -1, 85, 86, - -1, 88, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, - -1, -1, -1, -1, 243, -1, -1, -1, -1, -1, - -1, 197, -1, -1, 253, 201, -1, -1, -1, -1, - 206, 207, 208, -1, 210, 211, 212, -1, -1, -1, - 216, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 232, 233, -1, -1, - -1, -1, -1, 239, -1, -1, -1, -1, 244, -1, - -1, -1, 248, -1, -1, 251, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, -1, -1, -1, -1, 243, -1, - 197, -1, -1, -1, 201, -1, -1, -1, 253, 206, - 207, 208, -1, 210, 211, 212, -1, -1, -1, 216, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 232, 233, -1, -1, -1, - -1, -1, 239, 3, 4, -1, -1, 244, -1, -1, - 10, 11, 12, -1, 251, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 55, 56, 57, 58, -1, - -1, -1, -1, 63, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 75, 76, 77, -1, -1, - -1, -1, -1, -1, -1, 85, 86, -1, 88, 3, - 4, -1, 6, -1, -1, -1, 10, 11, 12, -1, - -1, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 13, 14, - -1, 55, 56, 57, 58, -1, -1, -1, -1, 63, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 75, 76, 77, -1, -1, -1, -1, -1, -1, - -1, 85, 86, -1, 88, -1, -1, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - 234, 235, 236, 237, 238, -1, -1, 197, -1, 243, - -1, 201, -1, -1, -1, -1, 206, 207, 208, 253, - 210, 211, 212, -1, -1, -1, 216, -1, -1, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 232, 233, -1, 110, 111, 112, 113, 239, - -1, 116, -1, -1, 244, 245, -1, -1, 123, 124, - -1, 251, 127, 128, -1, 130, 131, -1, 133, -1, + 77, 78, 79, -1, -1, -1, -1, 3, 4, -1, + 87, 88, -1, 90, 10, 11, 12, -1, -1, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 55, + 56, 57, 58, -1, -1, -1, -1, 63, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 150, -1, -1, -1, -1, - -1, -1, -1, 197, -1, -1, -1, 201, -1, -1, - -1, -1, 206, 207, 208, -1, 210, 211, 212, 174, - 175, 176, 216, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 232, 233, - -1, -1, -1, -1, -1, 239, 3, 4, -1, 6, - 244, -1, -1, 10, 11, 12, -1, 251, 15, 16, + -1, 77, 78, 79, -1, -1, -1, -1, -1, -1, + -1, 87, 88, -1, 90, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, -1, -1, -1, -1, 245, -1, -1, + -1, -1, 199, -1, -1, -1, 203, 255, -1, -1, + -1, 208, 209, 210, -1, 212, 213, 214, -1, -1, + -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 234, 235, -1, + -1, -1, -1, -1, 241, -1, -1, -1, -1, 246, + 247, -1, -1, -1, -1, -1, 253, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, -1, -1, -1, -1, 245, + -1, -1, -1, 199, -1, -1, -1, 203, -1, 255, + -1, -1, 208, 209, 210, -1, 212, 213, 214, -1, + -1, -1, 218, -1, 13, 14, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 234, 235, + -1, -1, -1, -1, -1, 241, 3, 4, -1, -1, + 246, 247, -1, 10, 11, 12, -1, 253, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 249, -1, -1, -1, 55, 56, - 57, 58, -1, -1, -1, -1, 63, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 75, 76, - 77, -1, -1, -1, -1, -1, -1, -1, 85, 86, - -1, 88, 3, 4, -1, 6, -1, -1, -1, 10, - 11, 12, -1, -1, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 38, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 13, 14, -1, 55, 56, 57, 58, -1, -1, - -1, -1, 63, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 75, 76, 77, -1, -1, -1, - -1, -1, -1, -1, 85, 86, -1, 88, -1, -1, - 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236, 237, 238, -1, -1, - 197, -1, 243, -1, 201, -1, -1, -1, -1, 206, - 207, 208, 253, 210, 211, 212, -1, -1, -1, 216, - -1, -1, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 232, 233, -1, 110, 111, - 112, 113, 239, -1, 116, -1, -1, 244, -1, -1, - -1, 123, 124, -1, 251, 127, 128, -1, 130, 131, - -1, 133, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 150, -1, - -1, -1, -1, -1, -1, -1, 197, -1, -1, -1, - 201, -1, -1, -1, -1, 206, 207, 208, -1, 210, - 211, 212, 174, 175, 176, 216, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 232, 233, -1, -1, -1, -1, -1, 239, 3, - 4, -1, -1, 244, -1, -1, 10, 11, 12, -1, - 251, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 249, -1, -1, - -1, 55, 56, 57, 58, -1, -1, -1, -1, 63, + -1, -1, -1, -1, -1, -1, -1, -1, 55, 56, + 57, 58, -1, -1, -1, -1, 63, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 77, 78, 79, 112, 113, 114, 115, -1, -1, 118, + 87, 88, -1, 90, -1, -1, 125, 126, -1, -1, + 129, 130, -1, 132, 133, -1, 135, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 75, 76, 77, -1, -1, -1, -1, 3, 4, - -1, 85, 86, -1, 88, 10, 11, 12, -1, -1, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 152, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 55, 56, 57, 58, 13, 14, -1, -1, 63, -1, + -1, 13, 14, -1, -1, -1, -1, 176, 177, 178, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 255, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 13, 14, + -1, -1, 199, -1, -1, -1, 203, -1, -1, -1, + -1, 208, 209, 210, -1, 212, 213, 214, -1, -1, + -1, 218, 251, -1, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 234, 235, -1, + 112, 113, 114, 115, 241, -1, 118, -1, -1, 246, + -1, -1, -1, 125, 126, -1, 253, 129, 130, -1, + 132, 133, -1, 135, -1, 13, 14, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 75, 76, 77, -1, -1, -1, -1, -1, -1, -1, - 85, 86, -1, 88, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, -1, -1, -1, -1, 243, -1, -1, -1, - -1, -1, -1, 197, -1, -1, 253, 201, -1, -1, - -1, -1, 206, 207, 208, -1, 210, 211, 212, -1, - -1, -1, 216, -1, -1, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 232, 233, - -1, 110, 111, 112, 113, 239, -1, 116, -1, -1, - 244, 245, -1, -1, 123, 124, -1, 251, 127, 128, - -1, 130, 131, -1, 133, -1, -1, -1, 137, -1, + 152, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, -1, -1, -1, 112, 113, 114, + 115, -1, -1, 118, 176, 177, 178, -1, -1, -1, + 125, 126, -1, -1, 129, 130, -1, 132, 133, -1, + 135, -1, 13, 14, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 152, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 176, 177, 178, 112, 113, 114, 115, -1, -1, + 118, -1, -1, -1, -1, -1, -1, 125, 126, 251, + -1, 129, 130, -1, 132, 133, -1, 135, -1, 13, + 14, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 152, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, -1, -1, + -1, 112, 113, 114, 115, -1, -1, 118, 176, 177, + 178, -1, -1, -1, 125, 126, 251, -1, 129, 130, + -1, 132, 133, -1, 135, -1, 13, 14, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 150, 197, -1, -1, 154, 201, -1, -1, -1, - -1, 206, 207, 208, -1, 210, 211, 212, -1, -1, - -1, 216, -1, -1, -1, 174, 175, 176, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 232, 233, -1, - -1, -1, -1, -1, 239, 3, 4, -1, -1, 244, - 245, -1, 10, 11, 12, -1, 251, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, -1, -1, 13, 14, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 55, 56, 57, - 58, -1, -1, -1, -1, 63, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 75, 76, 77, - -1, -1, -1, -1, -1, -1, -1, 85, 86, -1, - 88, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 253, 94, 95, 96, 97, 98, 99, - 100, 101, 102, 103, 104, 105, 106, -1, -1, -1, - 110, 111, 112, 113, -1, -1, 116, -1, -1, -1, - -1, -1, -1, 123, 124, -1, -1, 127, 128, -1, - 130, 131, -1, 133, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 13, 14, -1, -1, -1, -1, -1, - 150, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 197, - -1, -1, -1, 201, 174, 175, 176, -1, 206, 207, - 208, -1, 210, 211, 212, -1, -1, -1, 216, -1, + -1, 152, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 176, 177, 178, 112, 113, + 114, 115, -1, -1, 118, -1, -1, -1, -1, -1, + -1, 125, 126, 251, -1, 129, 130, -1, 132, 133, + -1, 135, -1, 13, 14, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 152, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, -1, -1, -1, 112, 113, 114, 115, -1, + -1, 118, 176, 177, 178, -1, -1, -1, 125, 126, + 251, -1, 129, 130, -1, 132, 133, -1, 135, -1, + 13, 14, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 152, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 176, + 177, 178, 112, 113, 114, 115, -1, -1, 118, -1, + -1, -1, -1, -1, -1, 125, 126, 251, -1, 129, + 130, -1, 132, 133, -1, 135, -1, 13, 14, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 13, 14, -1, -1, 232, 233, -1, -1, -1, -1, - -1, 239, -1, -1, -1, -1, 244, -1, -1, -1, - -1, -1, -1, 251, 94, 95, 96, 97, 98, 99, - 100, 101, 102, 103, 104, 105, 106, -1, -1, -1, - 110, 111, 112, 113, -1, -1, 116, -1, -1, 249, - -1, -1, -1, 123, 124, -1, -1, 127, 128, -1, - 130, 131, -1, 133, -1, -1, -1, 13, 14, -1, + -1, -1, 152, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, -1, -1, -1, 112, + 113, 114, 115, -1, -1, 118, 176, 177, 178, -1, + -1, -1, 125, 126, 251, -1, 129, 130, -1, 132, + 133, -1, 135, -1, 13, 14, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 152, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 150, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, -1, -1, -1, 110, 111, 112, - 113, -1, -1, 116, 174, 175, 176, -1, -1, -1, - 123, 124, -1, -1, 127, 128, -1, 130, 131, -1, - 133, -1, -1, -1, 13, 14, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 150, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, - 106, 174, 175, 176, 110, 111, 112, 113, -1, -1, - 116, -1, -1, -1, -1, -1, -1, 123, 124, 249, - -1, 127, 128, -1, 130, 131, -1, 133, -1, -1, + 106, 107, 108, 176, 177, 178, 112, 113, 114, 115, + -1, -1, 118, -1, -1, -1, -1, -1, -1, 125, + 126, 251, -1, 129, 130, -1, 132, 133, -1, 135, -1, 13, 14, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 150, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, -1, -1, - -1, 110, 111, 112, 113, -1, -1, 116, 174, 175, - 176, -1, -1, -1, 123, 124, 249, -1, 127, 128, - -1, 130, 131, -1, 133, -1, -1, -1, 13, 14, + -1, -1, -1, -1, -1, -1, 152, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + -1, -1, -1, 112, 113, 114, 115, -1, -1, 118, + 176, 177, 178, -1, -1, -1, 125, 126, 251, -1, + 129, 130, -1, 132, 133, -1, 135, -1, 13, 14, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 150, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 174, 175, 176, 110, 111, - 112, 113, -1, -1, 116, -1, -1, -1, -1, -1, - -1, 123, 124, 249, -1, 127, 128, -1, 130, 131, - -1, 133, -1, -1, -1, 13, 14, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 150, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, -1, -1, -1, 110, 111, 112, 113, -1, - -1, 116, 174, 175, 176, -1, -1, -1, 123, 124, - 249, -1, 127, 128, -1, 130, 131, -1, 133, -1, - -1, -1, 13, 14, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 150, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 174, - 175, 176, 110, 111, 112, 113, -1, -1, 116, -1, - -1, -1, -1, -1, -1, 123, 124, 249, -1, 127, - 128, -1, 130, 131, -1, 133, -1, -1, -1, 13, - 14, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 150, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, -1, -1, -1, 110, - 111, 112, 113, -1, -1, 116, 174, 175, 176, -1, - -1, -1, 123, 124, 249, -1, 127, 128, -1, 130, - 131, -1, 133, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 150, + -1, -1, -1, 152, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 176, 177, 178, + 112, 113, 114, 115, -1, -1, 118, -1, -1, -1, + -1, -1, -1, 125, 126, 251, -1, 129, 130, -1, + 132, 133, -1, 135, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 174, 175, 176, 110, 111, 112, 113, - -1, -1, 116, -1, -1, -1, -1, -1, -1, 123, - 124, 249, -1, 127, 128, -1, 130, 131, -1, 133, - 0, 1, -1, -1, 4, -1, -1, -1, -1, -1, - -1, -1, -1, 13, 14, -1, 150, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - 234, 235, 236, 237, 238, -1, -1, -1, -1, 243, - 174, 175, 176, -1, 44, 45, -1, -1, 249, 253, + 152, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, -1, -1, -1, 112, 113, 114, + 115, -1, -1, 118, 176, 177, 178, -1, -1, -1, + 125, 126, 251, -1, 129, 130, -1, 132, 133, -1, + 135, -1, -1, -1, -1, -1, 0, 1, -1, -1, + 4, -1, -1, -1, -1, -1, -1, 152, -1, 13, + 14, -1, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + -1, 176, 177, 178, 245, -1, -1, -1, -1, -1, + 44, 45, -1, -1, 255, -1, -1, -1, -1, 251, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 64, 65, 66, -1, -1, -1, - 70, 71, -1, 73, -1, -1, -1, -1, 78, 79, - 80, 81, -1, 83, 84, -1, 86, -1, -1, -1, - -1, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 101, 102, 103, 104, 105, 106, -1, -1, 109, - 110, 111, 112, 113, 114, 249, 116, -1, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, -1, -1, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, -1, - 4, -1, 162, 163, 164, -1, -1, -1, 168, 13, - 14, -1, -1, 173, 174, 175, 176, -1, -1, 179, - -1, 181, -1, 183, 184, 185, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, -1, -1, -1, - 44, 45, -1, 203, 204, 205, -1, -1, -1, -1, - -1, -1, -1, -1, 214, -1, 216, -1, -1, -1, - 64, 65, 66, -1, -1, -1, 70, 71, -1, 73, - -1, -1, -1, -1, 78, 79, 80, 81, -1, 83, - 84, -1, 86, -1, -1, -1, -1, 91, 92, 93, + 64, 65, 66, -1, -1, -1, 70, 71, -1, -1, + -1, 75, -1, -1, -1, -1, 80, 81, 82, 83, + -1, 85, 86, -1, 88, -1, -1, -1, -1, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, -1, -1, 109, 110, 111, 112, 113, - 114, -1, 116, -1, 118, 119, 120, 121, 122, 123, - 124, 125, 126, 127, 128, 129, 130, 131, 132, -1, - -1, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 104, 105, 106, 107, 108, -1, 251, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, -1, -1, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, -1, -1, -1, 162, 163, - 164, -1, -1, -1, 168, -1, -1, -1, -1, 173, - 174, 175, 176, 4, 5, 179, -1, 181, -1, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 196, -1, -1, -1, -1, -1, -1, 203, - 204, 205, -1, 13, 14, -1, -1, -1, -1, -1, - 214, -1, 216, -1, -1, 46, 47, 48, 49, 50, + 154, 155, 156, 157, 158, 159, 160, -1, 4, -1, + 164, 165, 166, -1, -1, -1, 170, 13, 14, -1, + -1, 175, 176, 177, 178, -1, -1, 181, -1, 183, + -1, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, -1, -1, -1, 44, 45, + -1, 205, 206, 207, -1, -1, -1, -1, -1, -1, + -1, -1, 216, -1, 218, -1, -1, -1, 64, 65, + 66, -1, -1, -1, 70, 71, -1, -1, -1, 75, + -1, -1, -1, -1, 80, 81, 82, 83, -1, 85, + 86, -1, 88, -1, -1, -1, -1, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, -1, -1, 111, 112, 113, 114, 115, + 116, -1, 118, -1, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, -1, + -1, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, -1, -1, -1, 164, 165, + 166, -1, -1, -1, 170, -1, -1, -1, -1, 175, + 176, 177, 178, 4, 5, 181, -1, 183, -1, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, + 196, 197, 198, -1, -1, -1, -1, -1, -1, 205, + 206, 207, -1, 13, 14, -1, -1, -1, -1, -1, + 216, -1, 218, -1, -1, 46, 47, 48, 49, 50, 51, 52, 53, 54, -1, -1, -1, -1, 59, 60, 61, 62, -1, -1, -1, -1, 67, 68, 69, -1, - -1, 72, -1, 74, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 87, -1, -1, 90, - -1, -1, -1, 94, -1, -1, 97, -1, -1, 100, - -1, 102, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 113, -1, 94, 95, 96, 97, 98, 99, - 100, 101, 102, 103, 104, 105, 106, -1, -1, 130, - 110, 111, 112, 113, -1, -1, 116, -1, -1, -1, - -1, -1, -1, 123, 124, -1, -1, 127, 128, -1, - 130, 131, -1, 133, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 74, -1, 76, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 89, -1, + -1, 92, -1, -1, -1, 96, -1, -1, 99, -1, + -1, 102, -1, 104, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 115, -1, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, -1, + -1, 132, 112, 113, 114, 115, 13, 14, 118, -1, + -1, -1, -1, -1, -1, 125, 126, -1, -1, 129, + 130, -1, 132, 133, -1, 135, -1, -1, -1, 139, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 150, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, 174, 175, 176, 198, 199, 200, - -1, -1, -1, 253, -1, -1, -1, -1, 209, -1, - -1, -1, 213, -1, 215, 216, 221, 222, 223, 224, + -1, -1, 152, -1, -1, -1, 156, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 176, 177, 178, 200, + 201, 202, -1, -1, -1, -1, -1, -1, -1, -1, + 211, -1, -1, -1, 215, -1, 217, 218, -1, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, -1, -1, -1, 112, 113, 114, 115, -1, + -1, 118, -1, -1, -1, -1, -1, -1, 125, 126, + -1, -1, 129, 130, -1, 132, 133, -1, 135, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 152, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, -1, -1, -1, -1, 245, 176, + 177, 178, -1, -1, -1, -1, -1, -1, 255, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, -1, -1, -1, + -1, 245, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 255, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + -1, -1, -1, -1, 245, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 255, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, -1, -1, -1, -1, 245, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 255, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, -1, -1, -1, -1, 243, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 253, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, - 232, 233, 234, 235, 236, 237, 238, -1, -1, -1, - -1, 243, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 253, 221, 222, 223, 224, 225, 226, 227, 228, + 235, 236, 237, 238, 239, 240, -1, -1, -1, -1, + 245, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 255, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, -1, + -1, -1, -1, 245, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 255, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, - -1, -1, -1, -1, 243, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 253, 221, 222, 223, 224, 225, + 239, 240, -1, -1, -1, -1, 245, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 255, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, - 236, 237, 238, -1, -1, -1, -1, 243, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 253, 221, 222, + 236, 237, 238, 239, 240, -1, -1, -1, -1, 245, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 255, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, 234, 235, 236, 237, 238, -1, -1, -1, -1, - 243, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 253, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 253, 221, 222, 223, 224, 225, 226, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 255, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, -1, -1, -1, -1, 245, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 255, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, -1, -1, -1, -1, 243, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 253, 221, 222, 223, + 237, 238, 239, 240, -1, -1, -1, -1, 245, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 255, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - 234, 235, 236, 237, 238, -1, -1, -1, -1, 243, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 253, - 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236, 237, 238, -1, -1, - -1, -1, 243, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 253, 221, 222, 223, 224, 225, 226, 227, + 234, 235, 236, 237, 238, 239, 240, -1, -1, -1, + -1, 245, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 255, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + -1, -1, -1, -1, 245, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 255, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, - 238, -1, -1, -1, -1, 243, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 253, 221, 222, 223, 224, + 238, 239, 240, -1, -1, -1, -1, 245, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 255, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, -1, -1, -1, -1, 243, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 253, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, - 232, 233, 234, 235, 236, 237, 238, -1, -1, -1, - -1, 243, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 253, 221, 222, 223, 224, 225, 226, 227, 228, + 235, 236, 237, 238, 239, 240, -1, -1, -1, -1, + 245, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 255, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, -1, + -1, -1, -1, 245, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 255, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, - -1, -1, -1, -1, 243, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 253, 221, 222, 223, 224, 225, + 239, 240, -1, -1, -1, -1, 245, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 255, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, - 236, 237, 238, -1, -1, -1, -1, 243, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 253, 221, 222, + 236, 237, 238, 239, 240, -1, -1, -1, -1, 245, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 255, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, 234, 235, 236, 237, 238, -1, -1, -1, -1, - 243, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 253, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 253, 221, 222, 223, 224, 225, 226, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 255, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, -1, -1, -1, -1, 245, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 255, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, -1, -1, -1, -1, 243, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 253, 221, 222, 223, + 237, 238, 239, 240, -1, -1, -1, -1, 245, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 255, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - 234, 235, 236, 237, 238, -1, -1, -1, -1, 243, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 253, - 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236, 237, 238, -1, -1, - -1, -1, 243, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 253, 221, 222, 223, 224, 225, 226, 227, + 234, 235, 236, 237, 238, 239, 240, -1, -1, -1, + -1, 245, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 255, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + -1, -1, -1, -1, 245, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 255, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, - 238, -1, -1, -1, -1, 243, -1, -1, -1, -1, - -1, 249, 221, 222, 223, 224, 225, 226, 227, 228, + 238, 239, 240, -1, -1, -1, -1, 245, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 255, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, -1, -1, -1, -1, + 245, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 255, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, -1, + -1, -1, -1, 245, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 255, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, - -1, -1, -1, -1, 243, -1, -1, -1, -1, -1, - 249, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, -1, -1, -1, -1, 249, - 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236, 237, 238, -1, -1, - -1, -1, 243, -1, -1, -1, -1, -1, 249, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, - 232, 233, 234, 235, 236, 237, 238, -1, -1, -1, - -1, 243, -1, -1, -1, -1, -1, 249, 221, 222, + 239, 240, -1, -1, -1, -1, 245, -1, -1, -1, + -1, -1, 251, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, -1, -1, -1, -1, 245, -1, -1, -1, -1, + -1, 251, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + -1, -1, -1, -1, 245, -1, -1, -1, -1, -1, + 251, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, -1, + -1, -1, -1, 245, -1, -1, -1, -1, -1, 251, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, 234, 235, 236, 237, 238, -1, -1, -1, -1, - 243, -1, -1, -1, -1, -1, 249, 221, 222, 223, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, -1, -1, -1, -1, 251, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - 234, 235, 236, 237, 238, -1, -1, -1, -1, 243, - -1, -1, -1, -1, -1, 249, 221, 222, 223, 224, + 234, 235, 236, 237, 238, 239, 240, -1, -1, -1, + -1, 245, -1, -1, -1, -1, -1, 251, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, -1, -1, -1, -1, 243, -1, - -1, -1, -1, -1, 249, 221, 222, 223, 224, 225, + 235, 236, 237, 238, 239, 240, -1, -1, -1, -1, + 245, -1, -1, -1, -1, -1, 251, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, - 236, 237, 238, -1, -1, -1, -1, 243, -1, -1, - -1, -1, -1, 249, 221, 222, 223, 224, 225, 226, + 236, 237, 238, 239, 240, -1, -1, -1, -1, 245, + -1, -1, -1, -1, -1, 251, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, -1, -1, -1, -1, 243, -1, -1, -1, - -1, -1, 249, 221, 222, 223, 224, 225, 226, 227, + 237, 238, 239, 240, -1, -1, -1, -1, 245, -1, + -1, -1, -1, -1, 251, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, - 238, -1, -1, -1, -1, 243, -1, -1, -1, -1, - -1, 249, 221, 222, 223, 224, 225, 226, 227, 228, + 238, 239, 240, -1, -1, -1, -1, 245, -1, -1, + -1, -1, -1, 251, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, - -1, -1, -1, -1, 243, -1, -1, -1, -1, -1, - 249, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, -1, -1, -1, -1, 249, - 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236, 237, 238, -1, -1, - -1, -1, 243, -1, -1, -1, -1, -1, 249, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, - 232, 233, 234, 235, 236, 237, 238, -1, -1, -1, - -1, 243, -1, -1, -1, -1, -1, 249, 221, 222, + 239, 240, -1, -1, -1, -1, 245, -1, -1, -1, + -1, -1, 251, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, -1, -1, -1, -1, 245, -1, -1, -1, -1, + -1, 251, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + -1, -1, -1, -1, 245, -1, -1, -1, -1, -1, + 251, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, -1, + -1, -1, -1, 245, -1, -1, -1, -1, -1, 251, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, 234, 235, 236, 237, 238, -1, -1, -1, -1, - 243, -1, -1, -1, -1, -1, 249, 221, 222, 223, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, -1, -1, -1, -1, 251, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - 234, 235, 236, 237, 238, -1, -1, -1, -1, 243, - -1, -1, -1, -1, -1, 249, 221, 222, 223, 224, + 234, 235, 236, 237, 238, 239, 240, -1, -1, -1, + -1, 245, -1, -1, -1, -1, -1, 251, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, -1, -1, -1, -1, 243, -1, - -1, -1, -1, -1, 249, 221, 222, 223, 224, 225, + 235, 236, 237, 238, 239, 240, -1, -1, -1, -1, + 245, -1, -1, -1, -1, -1, 251, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, - 236, 237, 238, -1, -1, -1, -1, 243, -1, -1, - -1, -1, -1, 249, 221, 222, 223, 224, 225, 226, + 236, 237, 238, 239, 240, -1, -1, -1, -1, 245, + -1, -1, -1, -1, -1, 251, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, -1, -1, -1, -1, 243, -1, -1, -1, - -1, -1, 249, 221, 222, 223, 224, 225, 226, 227, + 237, 238, 239, 240, -1, -1, -1, -1, 245, -1, + -1, -1, -1, -1, 251, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, - 238, -1, -1, -1, -1, 243, -1, -1, -1, -1, - -1, 249, 221, 222, 223, 224, 225, 226, 227, 228, + 238, 239, 240, -1, -1, -1, -1, 245, -1, -1, + -1, -1, -1, 251, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, - -1, -1, -1, -1, 243, -1, -1, -1, -1, -1, - 249, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, -1, -1, -1, -1, 249, - 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236, 237, 238, -1, -1, - -1, -1, 243, -1, -1, -1, -1, -1, 249, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, - 232, 233, 234, 235, 236, 237, 238, -1, -1, -1, - -1, 243, -1, -1, -1, -1, -1, 249, 221, 222, + 239, 240, -1, -1, -1, -1, 245, -1, -1, -1, + -1, -1, 251, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, -1, -1, -1, -1, 245, -1, -1, -1, -1, + -1, 251, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + -1, -1, -1, -1, 245, -1, -1, -1, -1, -1, + 251, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, -1, + -1, -1, -1, 245, -1, -1, -1, -1, -1, 251, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, 234, 235, 236, 237, 238, -1, -1, -1, -1, - 243, -1, -1, -1, -1, -1, 249, 221, 222, 223, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, -1, -1, -1, -1, 251, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - 234, 235, 236, 237, 238, -1, -1, -1, -1, 243, - -1, -1, -1, -1, -1, 249, 221, 222, 223, 224, + 234, 235, 236, 237, 238, 239, 240, -1, -1, -1, + -1, 245, -1, -1, -1, -1, -1, 251, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, -1, -1, -1, -1, 243, -1, - -1, -1, -1, -1, 249, 221, 222, 223, 224, 225, + 235, 236, 237, 238, 239, 240, -1, -1, -1, -1, + 245, -1, -1, -1, -1, -1, 251, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, - 236, 237, 238, -1, -1, -1, -1, 243, -1, -1, - -1, -1, 248, 221, 222, 223, 224, 225, 226, 227, + 236, 237, 238, 239, 240, -1, -1, -1, -1, 245, + -1, -1, -1, -1, -1, 251, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, -1, -1, -1, -1, 245, -1, + -1, -1, -1, -1, 251, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, - 238, -1, -1, -1, -1, 243, -1, -1, -1, -1, - 248, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, -1, -1, -1, 248, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, - 232, 233, 234, 235, 236, 237, 238, -1, -1, -1, - -1, 243, -1, 245, -1, 247, 221, 222, 223, 224, + 238, 239, 240, -1, -1, -1, -1, 245, -1, -1, + -1, -1, -1, 251, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, -1, -1, -1, -1, 245, -1, -1, -1, + -1, 250, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + -1, -1, -1, -1, 245, -1, -1, -1, -1, 250, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, -1, -1, -1, 250, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, -1, -1, -1, -1, 243, -1, - -1, -1, 247, 221, 222, 223, 224, 225, 226, 227, + 235, 236, 237, 238, 239, 240, -1, -1, -1, -1, + 245, -1, 247, -1, 249, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, - 238, -1, -1, -1, -1, 243, -1, -1, -1, 247, - 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236, 237, 238, -1, -1, - -1, -1, 243, -1, -1, -1, 247, 221, 222, 223, + 238, 239, 240, -1, -1, -1, -1, 245, -1, -1, + -1, 249, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + -1, -1, -1, -1, 245, -1, -1, -1, 249, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - 234, 235, 236, 237, 238, -1, -1, -1, -1, 243, - -1, -1, -1, 247, 221, 222, 223, 224, 225, 226, + 234, 235, 236, 237, 238, 239, 240, -1, -1, -1, + -1, 245, -1, -1, -1, 249, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, -1, -1, -1, -1, 243, -1, -1, -1, - 247, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, -1, -1, 247, 221, 222, + 237, 238, 239, 240, -1, -1, -1, -1, 245, -1, + -1, -1, 249, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, -1, -1, -1, -1, 245, -1, -1, -1, 249, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, 234, 235, 236, 237, 238, -1, -1, -1, -1, - 243, -1, -1, -1, 247, 221, 222, 223, 224, 225, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, -1, -1, 249, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, - 236, 237, 238, -1, -1, -1, -1, 243, -1, -1, - -1, 247, 221, 222, 223, 224, 225, 226, 227, 228, + 236, 237, 238, 239, 240, -1, -1, -1, -1, 245, + -1, -1, -1, 249, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, - -1, -1, -1, -1, 243, -1, -1, -1, 247, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, - 232, 233, 234, 235, 236, 237, 238, -1, -1, -1, - -1, 243, -1, -1, -1, 247, 221, 222, 223, 224, + 239, 240, -1, -1, -1, -1, 245, -1, -1, -1, + 249, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, -1, + -1, -1, -1, 245, -1, -1, -1, 249, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, -1, -1, -1, -1, 243, -1, - -1, -1, 247, 221, 222, 223, 224, 225, 226, 227, + 235, 236, 237, 238, 239, 240, -1, -1, -1, -1, + 245, -1, -1, -1, 249, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, - 238, -1, -1, -1, -1, 243, -1, -1, -1, 247, - 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236, 237, 238, -1, -1, - -1, -1, 243, -1, -1, -1, 247, 221, 222, 223, + 238, 239, 240, -1, -1, -1, -1, 245, -1, -1, + -1, 249, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + -1, -1, -1, -1, 245, -1, -1, -1, 249, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - 234, 235, 236, 237, 238, -1, -1, -1, -1, 243, - -1, -1, -1, 247, 221, 222, 223, 224, 225, 226, + 234, 235, 236, 237, 238, 239, 240, -1, -1, -1, + -1, 245, -1, -1, -1, 249, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, -1, -1, -1, -1, 243, -1, -1, -1, - 247, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, 245, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, -1, -1, -1, -1, 243, -1, - 245, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, 245, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, -1, -1, -1, -1, 243, -1, - 245, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, 245, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, -1, -1, -1, -1, 243, -1, - 245, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, 245, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, -1, -1, -1, -1, 243, -1, - 245, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, 245, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, -1, -1, -1, -1, 243, -1, - 245, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, 245, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, -1, -1, -1, -1, 243, -1, - 245, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, 245, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, -1, -1, -1, -1, 243, -1, - 245, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, 245, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, -1, -1, -1, -1, 243, -1, - 245, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, 245, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, -1, -1, -1, -1, 243, -1, - 245, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, 245, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, -1, -1, -1, -1, 243, -1, - 245, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, 245, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, -1, -1, -1, -1, 243, -1, - 245, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, 245, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, -1, -1, -1, -1, 243, -1, - 245, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, 245, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, -1, -1, -1, -1, 243, -1, - 245, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, 245, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, -1, -1, -1, -1, 243, -1, - 245, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, 245, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, -1, -1, -1, -1, 243, -1, - 245, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, 245, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, -1, -1, -1, -1, 243, -1, - 245, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, 245, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, -1, -1, -1, -1, 243, -1, - 245, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, 245, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, -1, -1, -1, -1, 243, -1, - 245, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, 245, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, -1, -1, -1, -1, 243, -1, - 245, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, 245, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, -1, -1, -1, -1, 243, -1, - 245, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, 245, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, -1, -1, -1, -1, 243, -1, - 245, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, 245, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, -1, -1, -1, -1, 243, -1, - 245, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, 245, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, -1, -1, -1, -1, 243, -1, - 245, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, 245, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, -1, -1, -1, -1, 243, -1, - 245, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, 245, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, -1, -1, -1, -1, 243, -1, - 245, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, 245, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, -1, -1, -1, -1, 243, -1, - 245, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, 245, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, -1, -1, -1, -1, 243, -1, - 245, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, 245, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, -1, -1, -1, -1, 243, -1, - 245, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, 245, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, -1, -1, -1, -1, 243, -1, - 245, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, 245, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, -1, -1, -1, -1, 243, -1, - 245, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, 245, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, -1, -1, -1, -1, 243, -1, - 245, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, 245, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, -1, -1, -1, -1, 243, -1, - 245, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, -1, - -1, -1, -1, 243, -1, 245, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, -1, -1, -1, -1, 243 + 237, 238, 239, 240, -1, -1, -1, -1, 245, -1, + -1, -1, 249, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, -1, -1, -1, -1, 245, -1, -1, -1, 249, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, 247, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, -1, -1, -1, -1, 245, -1, 247, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, 247, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, -1, -1, -1, -1, 245, -1, 247, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, 247, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, -1, -1, -1, -1, 245, -1, 247, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, 247, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, -1, -1, -1, -1, 245, -1, 247, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, 247, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, -1, -1, -1, -1, 245, -1, 247, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, 247, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, -1, -1, -1, -1, 245, -1, 247, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, 247, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, -1, -1, -1, -1, 245, -1, 247, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, 247, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, -1, -1, -1, -1, 245, -1, 247, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, 247, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, -1, -1, -1, -1, 245, -1, 247, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, 247, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, -1, -1, -1, -1, 245, -1, 247, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, 247, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, -1, -1, -1, -1, 245, -1, 247, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, 247, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, -1, -1, -1, -1, 245, -1, 247, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, 247, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, -1, -1, -1, -1, 245, -1, 247, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, 247, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, -1, -1, -1, -1, 245, -1, 247, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, 247, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, -1, -1, -1, -1, 245, -1, 247, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, 247, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, -1, -1, -1, -1, 245, -1, 247, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, 247, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, -1, -1, -1, -1, 245, -1, 247, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, 247, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, -1, -1, -1, -1, 245, -1, 247, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, 247, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, -1, -1, -1, -1, 245, -1, 247, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, 247, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, -1, -1, -1, -1, 245, -1, 247, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, 247, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, -1, -1, -1, -1, 245, -1, 247, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, 247, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, -1, -1, -1, -1, 245, -1, 247, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, 247, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, -1, -1, -1, -1, 245, -1, 247, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, 247, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, -1, -1, -1, -1, 245, -1, 247, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, 247, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, -1, -1, -1, -1, 245, -1, 247, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, 247, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, -1, -1, -1, -1, 245, -1, 247, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, 247, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, -1, -1, -1, -1, 245, -1, 247, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, 247, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, -1, -1, -1, -1, 245, -1, 247, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, 247, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, -1, -1, -1, -1, 245, -1, 247, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, 247, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, -1, -1, -1, -1, 245, -1, 247, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, 247, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, -1, -1, -1, -1, 245, -1, 247, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, 247, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, -1, -1, -1, -1, 245, -1, 247, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, -1, -1, + -1, -1, 245, -1, 247, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, -1, -1, -1, -1, 245 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint16 yystos[] = { - 0, 1, 255, 256, 6, 0, 4, 13, 14, 44, - 45, 64, 65, 66, 70, 71, 73, 78, 79, 80, - 81, 83, 84, 86, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 109, 110, 111, 112, 113, 114, 116, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 135, 136, 137, 138, 139, 140, 141, 142, - 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 162, 163, 164, 168, - 173, 174, 175, 176, 179, 181, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, - 203, 204, 205, 214, 216, 257, 259, 260, 280, 298, - 300, 304, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 322, 324, 325, 331, 332, 333, 334, 340, 365, - 366, 248, 252, 14, 100, 244, 244, 6, 248, 6, - 6, 6, 6, 244, 6, 6, 6, 6, 246, 246, - 4, 342, 366, 244, 246, 278, 94, 97, 100, 102, - 278, 244, 244, 244, 4, 244, 244, 244, 4, 244, - 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, - 248, 115, 100, 6, 248, 94, 97, 100, 113, 303, - 102, 244, 3, 10, 11, 12, 15, 16, 17, 18, + 0, 1, 257, 258, 6, 0, 4, 13, 14, 44, + 45, 64, 65, 66, 70, 71, 75, 80, 81, 82, + 83, 85, 86, 88, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 111, 112, 113, 114, 115, 116, 118, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 164, 165, 166, 170, + 175, 176, 177, 178, 181, 183, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 205, 206, 207, 216, 218, 259, 261, 262, 282, 300, + 302, 306, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 324, 326, 327, 333, 334, 335, 336, 342, 367, + 368, 250, 254, 14, 102, 246, 246, 6, 250, 6, + 6, 6, 6, 246, 6, 6, 6, 6, 248, 248, + 4, 344, 368, 246, 248, 280, 96, 99, 102, 104, + 280, 246, 246, 246, 4, 246, 246, 246, 4, 246, + 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, + 250, 117, 102, 6, 250, 96, 99, 102, 115, 305, + 104, 246, 3, 10, 11, 12, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 55, 56, 57, 58, 63, - 64, 75, 76, 77, 85, 88, 94, 97, 100, 102, - 113, 123, 128, 130, 133, 197, 201, 202, 206, 207, - 208, 210, 211, 212, 232, 233, 239, 244, 248, 251, - 300, 301, 304, 315, 322, 324, 335, 336, 340, 342, - 349, 351, 366, 244, 248, 248, 100, 100, 123, 97, - 100, 102, 94, 97, 100, 102, 300, 97, 100, 102, - 113, 301, 97, 100, 244, 97, 154, 179, 195, 196, - 248, 232, 233, 244, 248, 346, 347, 346, 248, 248, - 346, 4, 94, 98, 104, 105, 107, 108, 127, 248, - 244, 100, 102, 100, 97, 4, 86, 190, 248, 366, - 4, 6, 94, 97, 100, 97, 100, 113, 302, 4, - 4, 4, 5, 244, 248, 349, 350, 4, 244, 244, - 244, 4, 248, 353, 366, 4, 244, 244, 244, 6, - 6, 246, 5, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 59, 60, 61, 62, 67, 68, 69, 72, - 74, 87, 90, 198, 199, 200, 209, 213, 215, 357, - 366, 244, 4, 357, 5, 248, 5, 248, 32, 233, - 335, 366, 246, 248, 244, 248, 6, 244, 248, 6, - 252, 7, 130, 190, 217, 218, 219, 220, 240, 241, - 244, 246, 250, 276, 277, 278, 300, 335, 356, 357, - 366, 4, 304, 305, 306, 248, 6, 335, 356, 357, - 366, 356, 335, 356, 363, 364, 366, 282, 286, 244, - 345, 9, 357, 244, 244, 244, 244, 366, 335, 335, - 335, 244, 335, 335, 335, 244, 335, 335, 335, 335, - 335, 335, 335, 356, 335, 335, 335, 335, 350, 244, - 233, 335, 351, 352, 248, 350, 349, 356, 278, 278, - 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, - 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, - 278, 244, 246, 278, 278, 278, 278, 278, 278, 244, - 278, 278, 244, 300, 278, 278, 5, 248, 248, 123, - 300, 300, 244, 278, 278, 244, 244, 244, 335, 248, - 335, 351, 335, 335, 249, 352, 342, 366, 182, 5, - 248, 8, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, - 243, 9, 244, 246, 250, 277, 278, 335, 352, 352, - 244, 244, 244, 349, 350, 350, 350, 299, 248, 244, - 349, 248, 248, 335, 4, 349, 248, 353, 248, 248, - 346, 346, 346, 335, 335, 232, 233, 248, 248, 346, - 232, 233, 244, 306, 346, 248, 244, 248, 244, 244, - 244, 244, 244, 244, 244, 352, 335, 350, 350, 350, - 244, 4, 246, 248, 6, 246, 306, 6, 6, 248, - 248, 248, 248, 350, 246, 246, 246, 335, 8, 6, - 6, 335, 335, 335, 250, 335, 248, 182, 335, 335, - 335, 335, 278, 278, 278, 244, 244, 244, 278, 278, - 278, 278, 278, 278, 278, 278, 278, 278, 244, 244, - 278, 244, 246, 6, 6, 248, 6, 8, 306, 6, - 8, 306, 278, 335, 234, 248, 9, 244, 246, 250, - 356, 352, 335, 306, 349, 349, 248, 357, 300, 7, - 335, 335, 4, 179, 180, 349, 6, 245, 247, 248, - 279, 248, 6, 248, 6, 9, 244, 246, 250, 366, - 249, 123, 128, 130, 131, 133, 298, 300, 335, 6, - 245, 253, 9, 244, 246, 250, 245, 253, 253, 245, - 253, 9, 244, 250, 247, 253, 281, 247, 281, 89, - 344, 341, 366, 253, 335, 335, 335, 335, 253, 245, - 245, 245, 335, 245, 245, 245, 335, 245, 245, 245, - 245, 245, 245, 245, 245, 245, 245, 245, 249, 7, - 335, 234, 249, 253, 335, 6, 6, 245, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 351, 335, 335, 335, 335, - 335, 335, 335, 351, 351, 366, 248, 335, 335, 356, - 335, 356, 349, 356, 356, 363, 248, 335, 279, 366, - 8, 335, 335, 350, 349, 356, 356, 351, 342, 357, - 342, 352, 245, 249, 250, 278, 64, 8, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 248, 335, 351, 335, 335, 335, 335, 335, - 366, 335, 335, 4, 343, 248, 279, 245, 249, 249, - 335, 335, 335, 7, 7, 328, 328, 244, 335, 335, - 6, 352, 352, 248, 245, 6, 306, 248, 306, 306, - 253, 253, 253, 346, 346, 305, 305, 253, 335, 249, - 319, 253, 306, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 249, 245, 7, 329, 6, 7, 335, 6, - 335, 306, 335, 249, 352, 352, 352, 335, 6, 335, - 335, 335, 245, 249, 245, 245, 245, 179, 253, 306, - 248, 8, 245, 245, 247, 363, 356, 363, 356, 356, - 356, 356, 356, 356, 335, 356, 356, 356, 356, 251, - 359, 366, 357, 356, 356, 356, 342, 366, 352, 249, - 249, 249, 249, 335, 335, 306, 366, 343, 247, 249, - 245, 137, 154, 323, 245, 249, 253, 335, 6, 248, - 349, 245, 247, 7, 276, 277, 250, 7, 6, 352, - 7, 217, 276, 335, 261, 366, 335, 335, 343, 246, - 244, 123, 300, 301, 300, 248, 249, 6, 228, 231, - 258, 352, 366, 335, 335, 4, 343, 6, 352, 335, - 6, 356, 364, 366, 245, 343, 6, 366, 6, 356, - 335, 245, 246, 335, 253, 253, 253, 253, 357, 7, - 7, 7, 245, 7, 7, 7, 245, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 335, 245, 248, - 335, 351, 249, 6, 279, 279, 279, 279, 279, 279, - 279, 279, 279, 279, 279, 253, 279, 279, 279, 279, - 279, 279, 279, 279, 279, 253, 253, 253, 245, 247, - 247, 352, 253, 253, 279, 253, 279, 253, 253, 253, - 245, 352, 337, 279, 249, 249, 249, 253, 253, 279, - 279, 245, 250, 245, 250, 253, 278, 338, 249, 7, - 343, 279, 248, 249, 8, 8, 352, 250, 245, 247, - 277, 244, 246, 278, 352, 7, 248, 248, 245, 245, - 245, 335, 349, 4, 327, 6, 295, 335, 357, 249, - 245, 249, 249, 352, 250, 249, 306, 249, 249, 346, - 335, 335, 249, 249, 335, 346, 134, 134, 151, 159, - 160, 161, 165, 166, 320, 321, 346, 249, 316, 245, - 249, 245, 245, 245, 245, 245, 245, 245, 248, 7, - 335, 6, 335, 245, 247, 249, 247, 249, 249, 249, - 249, 247, 247, 253, 7, 7, 7, 250, 335, 249, - 335, 335, 7, 250, 279, 253, 279, 279, 245, 245, - 253, 279, 279, 253, 253, 279, 279, 279, 279, 335, - 279, 9, 358, 253, 245, 253, 279, 250, 253, 339, - 247, 249, 249, 250, 244, 246, 252, 182, 7, 154, - 6, 335, 249, 248, 6, 349, 249, 335, 6, 7, - 276, 277, 250, 276, 277, 357, 335, 6, 4, 248, - 354, 366, 249, 46, 46, 349, 249, 4, 169, 170, - 171, 172, 249, 264, 268, 271, 273, 274, 250, 245, - 247, 244, 335, 335, 244, 248, 244, 248, 8, 352, - 356, 245, 250, 245, 247, 244, 245, 253, 250, 244, - 7, 278, 4, 289, 290, 291, 279, 335, 335, 335, - 335, 279, 346, 349, 349, 7, 349, 349, 349, 7, - 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 6, 7, 352, 335, 335, 335, 335, 249, 335, 335, - 335, 349, 356, 356, 249, 253, 288, 335, 335, 343, - 343, 335, 335, 245, 349, 278, 335, 335, 335, 249, - 343, 277, 250, 277, 335, 335, 279, 249, 349, 352, - 352, 7, 7, 7, 134, 326, 6, 245, 253, 7, - 7, 7, 249, 4, 249, 253, 253, 253, 249, 249, - 112, 4, 6, 335, 248, 6, 244, 6, 167, 6, - 167, 249, 321, 253, 320, 7, 6, 7, 7, 7, - 7, 7, 7, 7, 305, 349, 6, 248, 6, 6, - 6, 100, 7, 6, 6, 335, 349, 349, 349, 4, - 253, 8, 8, 245, 4, 103, 104, 4, 352, 356, - 335, 356, 251, 253, 292, 356, 356, 343, 356, 245, - 253, 343, 248, 300, 248, 6, 335, 6, 248, 349, - 249, 249, 335, 6, 4, 179, 180, 335, 6, 6, - 6, 7, 353, 355, 6, 246, 279, 278, 278, 6, - 265, 244, 244, 248, 275, 6, 343, 250, 356, 335, - 247, 245, 335, 8, 352, 335, 352, 249, 249, 6, - 6, 258, 343, 250, 335, 6, 335, 343, 245, 248, - 335, 357, 279, 46, 248, 349, 357, 360, 247, 253, - 6, 245, 245, 245, 245, 6, 6, 127, 297, 297, - 349, 6, 6, 6, 349, 134, 182, 296, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 5, 249, 279, - 279, 279, 279, 279, 253, 253, 253, 245, 279, 279, - 290, 279, 245, 279, 245, 278, 338, 279, 6, 279, - 253, 244, 246, 278, 4, 245, 247, 279, 6, 249, - 249, 349, 349, 349, 4, 6, 276, 335, 349, 248, - 248, 7, 6, 7, 335, 335, 335, 248, 248, 248, - 246, 6, 335, 349, 335, 6, 6, 335, 346, 249, - 5, 349, 248, 248, 248, 248, 248, 248, 248, 349, - 249, 6, 352, 248, 335, 247, 6, 6, 178, 335, - 335, 335, 6, 6, 6, 6, 7, 279, 253, 253, - 279, 253, 335, 4, 194, 293, 294, 279, 245, 279, - 339, 357, 244, 246, 335, 248, 306, 6, 306, 253, - 6, 6, 7, 276, 277, 250, 7, 6, 353, 249, - 253, 335, 276, 248, 279, 361, 362, 363, 361, 244, - 335, 335, 348, 349, 248, 244, 4, 6, 245, 6, - 245, 249, 249, 245, 249, 6, 6, 356, 244, 4, - 245, 253, 244, 349, 357, 7, 278, 287, 335, 351, - 291, 6, 6, 6, 6, 346, 6, 6, 6, 6, - 94, 113, 98, 6, 5, 248, 335, 335, 335, 335, - 245, 338, 335, 335, 335, 279, 277, 248, 248, 6, - 296, 6, 335, 349, 4, 6, 352, 352, 335, 335, - 357, 249, 245, 249, 253, 305, 305, 335, 335, 249, - 253, 245, 249, 253, 6, 6, 348, 346, 346, 346, - 346, 346, 233, 346, 6, 249, 335, 6, 6, 349, - 249, 253, 8, 249, 245, 248, 335, 357, 356, 335, - 356, 335, 357, 360, 362, 357, 253, 245, 253, 249, - 335, 323, 323, 349, 357, 335, 6, 4, 354, 6, - 353, 247, 349, 363, 6, 279, 279, 262, 335, 253, - 253, 249, 253, 263, 335, 335, 6, 6, 6, 6, - 335, 335, 245, 283, 285, 248, 362, 249, 253, 7, - 7, 248, 248, 248, 5, 348, 279, 279, 253, 279, - 245, 253, 245, 247, 352, 352, 6, 6, 248, 249, - 249, 248, 6, 6, 248, 335, 249, 249, 249, 247, - 6, 349, 7, 248, 335, 249, 253, 253, 253, 253, - 253, 253, 6, 249, 177, 335, 335, 352, 6, 6, - 245, 279, 279, 294, 357, 249, 249, 249, 249, 6, - 6, 7, 6, 250, 6, 249, 6, 6, 245, 253, - 335, 335, 248, 349, 249, 253, 245, 245, 253, 288, - 292, 349, 279, 335, 357, 366, 352, 352, 335, 6, - 249, 335, 338, 335, 249, 249, 348, 138, 139, 144, - 330, 138, 139, 330, 352, 305, 249, 253, 6, 249, - 349, 306, 249, 6, 352, 346, 346, 346, 346, 346, - 335, 249, 249, 249, 245, 6, 248, 6, 353, 180, - 266, 335, 253, 253, 348, 6, 335, 335, 249, 249, - 284, 7, 244, 249, 249, 249, 248, 253, 245, 253, - 248, 249, 248, 346, 349, 6, 248, 346, 6, 249, - 249, 335, 6, 134, 249, 317, 248, 249, 253, 253, - 253, 253, 253, 6, 6, 6, 306, 6, 248, 335, - 335, 249, 253, 288, 357, 245, 335, 335, 335, 352, - 6, 346, 6, 346, 6, 6, 249, 335, 320, 306, - 6, 352, 352, 352, 352, 346, 352, 323, 263, 245, - 253, 6, 248, 335, 249, 253, 253, 253, 249, 253, - 253, 6, 249, 249, 318, 249, 249, 249, 249, 253, - 249, 249, 249, 269, 335, 348, 249, 335, 335, 335, - 346, 346, 320, 6, 6, 6, 6, 352, 6, 6, - 6, 248, 245, 249, 6, 249, 279, 253, 253, 253, - 249, 249, 267, 356, 272, 248, 6, 335, 335, 335, - 6, 249, 253, 248, 348, 249, 249, 249, 6, 356, - 270, 356, 249, 6, 6, 249, 253, 6, 6, 356 + 64, 72, 73, 77, 78, 79, 87, 90, 96, 99, + 102, 104, 115, 125, 130, 132, 135, 199, 203, 204, + 208, 209, 210, 212, 213, 214, 234, 235, 241, 246, + 250, 253, 302, 303, 306, 317, 324, 326, 337, 338, + 342, 344, 351, 353, 368, 246, 250, 250, 102, 102, + 125, 99, 102, 104, 96, 99, 102, 104, 302, 99, + 102, 104, 115, 303, 99, 102, 246, 99, 156, 181, + 197, 198, 250, 234, 235, 246, 250, 348, 349, 348, + 250, 250, 348, 4, 96, 100, 106, 107, 109, 110, + 129, 250, 246, 102, 104, 102, 99, 4, 88, 192, + 250, 368, 4, 6, 96, 99, 102, 99, 102, 115, + 304, 4, 4, 4, 5, 246, 250, 351, 352, 4, + 246, 246, 246, 4, 250, 355, 368, 4, 246, 246, + 246, 6, 6, 248, 5, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 59, 60, 61, 62, 67, 68, + 69, 74, 76, 89, 92, 200, 201, 202, 211, 215, + 217, 359, 368, 246, 4, 359, 5, 250, 5, 250, + 32, 235, 337, 368, 248, 250, 246, 250, 6, 246, + 250, 6, 254, 7, 132, 192, 219, 220, 221, 222, + 242, 243, 246, 248, 252, 278, 279, 280, 302, 337, + 358, 359, 368, 4, 306, 307, 308, 250, 6, 337, + 358, 359, 368, 358, 337, 358, 365, 366, 368, 284, + 288, 246, 347, 9, 359, 246, 246, 246, 246, 368, + 337, 337, 337, 246, 337, 337, 337, 246, 337, 337, + 337, 337, 337, 337, 337, 358, 337, 337, 337, 337, + 352, 246, 235, 337, 353, 354, 250, 352, 351, 358, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, + 280, 280, 280, 246, 248, 280, 280, 280, 280, 280, + 280, 246, 280, 280, 246, 302, 303, 303, 280, 280, + 5, 250, 250, 125, 302, 302, 246, 280, 280, 246, + 246, 246, 337, 250, 337, 353, 337, 337, 251, 354, + 344, 368, 184, 5, 250, 8, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 245, 9, 246, 248, 252, 279, + 280, 337, 354, 354, 246, 246, 246, 351, 352, 352, + 352, 301, 250, 246, 351, 250, 250, 337, 4, 351, + 250, 355, 250, 250, 348, 348, 348, 337, 337, 234, + 235, 250, 250, 348, 234, 235, 246, 308, 348, 250, + 246, 250, 246, 246, 246, 246, 246, 246, 246, 354, + 337, 352, 352, 352, 246, 4, 248, 250, 6, 248, + 308, 6, 6, 250, 250, 250, 250, 352, 248, 248, + 248, 337, 8, 6, 6, 337, 337, 337, 252, 337, + 250, 184, 337, 337, 337, 337, 280, 280, 280, 246, + 246, 246, 280, 280, 280, 280, 280, 280, 280, 280, + 280, 280, 246, 246, 280, 246, 248, 6, 6, 250, + 6, 8, 308, 6, 8, 308, 280, 337, 236, 250, + 9, 246, 248, 252, 358, 354, 337, 308, 351, 351, + 250, 359, 302, 7, 337, 337, 4, 181, 182, 351, + 6, 247, 249, 250, 281, 250, 6, 250, 6, 9, + 246, 248, 252, 368, 251, 125, 130, 132, 133, 135, + 300, 302, 337, 6, 247, 255, 9, 246, 248, 252, + 247, 255, 255, 247, 255, 9, 246, 252, 249, 255, + 283, 249, 283, 91, 346, 343, 368, 255, 337, 337, + 337, 337, 255, 247, 247, 247, 337, 247, 247, 247, + 337, 247, 247, 247, 247, 247, 247, 247, 247, 247, + 247, 247, 251, 7, 337, 236, 251, 255, 337, 6, + 6, 247, 337, 337, 337, 337, 337, 337, 337, 337, + 337, 337, 337, 337, 337, 337, 337, 337, 337, 353, + 337, 337, 337, 337, 337, 337, 337, 353, 353, 368, + 250, 337, 337, 358, 337, 358, 351, 358, 358, 365, + 250, 250, 250, 337, 281, 368, 8, 337, 337, 352, + 351, 358, 358, 353, 344, 359, 344, 354, 247, 251, + 252, 280, 64, 8, 337, 337, 337, 337, 337, 337, + 337, 337, 337, 337, 337, 337, 337, 337, 250, 337, + 353, 337, 337, 337, 337, 337, 368, 337, 337, 4, + 345, 250, 281, 247, 251, 251, 337, 337, 337, 7, + 7, 330, 330, 246, 337, 337, 6, 354, 354, 250, + 247, 6, 308, 250, 308, 308, 255, 255, 255, 348, + 348, 307, 307, 255, 337, 251, 321, 255, 308, 337, + 337, 337, 337, 337, 337, 337, 337, 337, 251, 247, + 7, 331, 6, 7, 337, 6, 337, 308, 337, 251, + 354, 354, 354, 337, 6, 337, 337, 337, 247, 251, + 247, 247, 247, 181, 255, 308, 250, 8, 247, 247, + 249, 365, 358, 365, 358, 358, 358, 358, 358, 358, + 337, 358, 358, 358, 358, 253, 361, 368, 359, 358, + 358, 358, 344, 368, 354, 251, 251, 251, 251, 337, + 337, 308, 368, 345, 249, 251, 247, 139, 156, 325, + 247, 251, 255, 337, 6, 250, 351, 247, 249, 7, + 278, 279, 252, 7, 6, 354, 7, 219, 278, 337, + 263, 368, 337, 337, 345, 248, 246, 125, 302, 303, + 302, 250, 251, 6, 230, 233, 260, 354, 368, 337, + 337, 4, 345, 6, 354, 337, 6, 358, 366, 368, + 247, 345, 6, 368, 6, 358, 337, 247, 248, 337, + 255, 255, 255, 255, 359, 7, 7, 7, 247, 7, + 7, 7, 247, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 337, 247, 250, 337, 353, 251, 6, + 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, + 281, 255, 281, 281, 281, 281, 281, 281, 281, 281, + 281, 255, 255, 255, 247, 249, 249, 354, 255, 255, + 281, 255, 281, 255, 255, 255, 247, 354, 337, 337, + 339, 281, 251, 251, 251, 255, 255, 281, 281, 247, + 252, 247, 252, 255, 280, 340, 251, 7, 345, 281, + 250, 251, 8, 8, 354, 252, 247, 249, 279, 246, + 248, 280, 354, 7, 250, 250, 247, 247, 247, 337, + 351, 4, 329, 6, 297, 337, 359, 251, 247, 251, + 251, 354, 252, 251, 308, 251, 251, 348, 337, 337, + 251, 251, 337, 348, 136, 136, 153, 161, 162, 163, + 167, 168, 322, 323, 348, 251, 318, 247, 251, 247, + 247, 247, 247, 247, 247, 247, 250, 7, 337, 6, + 337, 247, 249, 251, 249, 251, 251, 251, 251, 249, + 249, 255, 7, 7, 7, 252, 337, 251, 337, 337, + 7, 252, 281, 255, 281, 281, 247, 247, 255, 281, + 281, 255, 255, 281, 281, 281, 281, 337, 281, 9, + 360, 255, 247, 255, 281, 252, 255, 341, 249, 251, + 251, 252, 246, 248, 254, 184, 7, 156, 6, 337, + 251, 250, 6, 351, 251, 337, 6, 7, 278, 279, + 252, 278, 279, 359, 337, 6, 4, 250, 356, 368, + 251, 46, 46, 351, 251, 4, 171, 172, 173, 174, + 251, 266, 270, 273, 275, 276, 252, 247, 249, 246, + 337, 337, 246, 250, 246, 250, 8, 354, 358, 247, + 252, 247, 249, 246, 247, 255, 252, 246, 7, 280, + 4, 291, 292, 293, 281, 337, 337, 337, 337, 281, + 348, 351, 351, 7, 351, 351, 351, 7, 351, 351, + 351, 351, 351, 351, 351, 351, 351, 351, 6, 7, + 354, 337, 337, 337, 337, 251, 337, 337, 337, 351, + 358, 358, 251, 251, 251, 255, 290, 337, 337, 345, + 345, 337, 337, 247, 351, 280, 337, 337, 337, 251, + 345, 279, 252, 279, 337, 337, 281, 251, 351, 354, + 354, 7, 7, 7, 136, 328, 6, 247, 255, 7, + 7, 7, 251, 4, 251, 255, 255, 255, 251, 251, + 114, 4, 6, 337, 250, 6, 246, 6, 169, 6, + 169, 251, 323, 255, 322, 7, 6, 7, 7, 7, + 7, 7, 7, 7, 307, 351, 6, 250, 6, 6, + 6, 102, 7, 6, 6, 337, 351, 351, 351, 4, + 255, 8, 8, 247, 4, 105, 106, 4, 354, 358, + 337, 358, 253, 255, 294, 358, 358, 345, 358, 247, + 255, 345, 250, 302, 250, 6, 337, 6, 250, 351, + 251, 251, 337, 6, 4, 181, 182, 337, 6, 6, + 6, 7, 355, 357, 6, 248, 281, 280, 280, 6, + 267, 246, 246, 250, 277, 6, 345, 252, 358, 337, + 249, 247, 337, 8, 354, 337, 354, 251, 251, 6, + 6, 260, 345, 252, 337, 6, 337, 345, 247, 250, + 337, 359, 281, 46, 250, 351, 359, 362, 249, 255, + 6, 247, 247, 247, 247, 6, 6, 129, 299, 299, + 351, 6, 6, 6, 351, 136, 184, 298, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 5, 251, 281, + 281, 281, 281, 281, 255, 255, 255, 247, 281, 281, + 292, 281, 247, 281, 247, 280, 340, 281, 6, 281, + 255, 246, 248, 280, 4, 247, 249, 281, 6, 251, + 251, 351, 351, 351, 4, 6, 278, 337, 351, 250, + 250, 7, 6, 7, 337, 337, 337, 250, 250, 250, + 248, 6, 337, 351, 337, 6, 6, 337, 348, 251, + 5, 351, 250, 250, 250, 250, 250, 250, 250, 351, + 251, 6, 354, 250, 337, 249, 6, 6, 180, 337, + 337, 337, 6, 6, 6, 6, 7, 281, 255, 255, + 281, 255, 337, 4, 196, 295, 296, 281, 247, 281, + 341, 359, 246, 248, 337, 250, 308, 6, 308, 255, + 6, 6, 7, 278, 279, 252, 7, 6, 355, 251, + 255, 337, 278, 250, 281, 363, 364, 365, 363, 246, + 337, 337, 350, 351, 250, 246, 4, 6, 247, 6, + 247, 251, 251, 247, 251, 6, 6, 358, 246, 4, + 247, 255, 246, 351, 359, 7, 280, 289, 337, 353, + 293, 6, 6, 6, 6, 348, 6, 6, 6, 6, + 96, 115, 100, 6, 5, 250, 337, 337, 337, 337, + 247, 340, 337, 337, 337, 281, 279, 250, 250, 6, + 298, 6, 337, 351, 4, 6, 354, 354, 337, 337, + 359, 251, 247, 251, 255, 307, 307, 337, 337, 251, + 255, 247, 251, 255, 6, 6, 350, 348, 348, 348, + 348, 348, 235, 348, 6, 251, 337, 6, 6, 351, + 251, 255, 8, 251, 247, 250, 337, 359, 358, 337, + 358, 337, 359, 362, 364, 359, 255, 247, 255, 251, + 337, 325, 325, 351, 359, 337, 6, 4, 356, 6, + 355, 249, 351, 365, 6, 281, 281, 264, 337, 255, + 255, 251, 255, 265, 337, 337, 6, 6, 6, 6, + 337, 337, 247, 285, 287, 250, 364, 251, 255, 7, + 7, 250, 250, 250, 5, 350, 281, 281, 255, 281, + 247, 255, 247, 249, 354, 354, 6, 6, 250, 251, + 251, 250, 6, 6, 250, 337, 251, 251, 251, 249, + 6, 351, 7, 250, 337, 251, 255, 255, 255, 255, + 255, 255, 6, 251, 179, 337, 337, 354, 6, 6, + 247, 281, 281, 296, 359, 251, 251, 251, 251, 6, + 6, 7, 6, 252, 6, 251, 6, 6, 247, 255, + 337, 337, 250, 351, 251, 255, 247, 247, 255, 290, + 294, 351, 281, 337, 359, 368, 354, 354, 337, 6, + 251, 337, 340, 337, 251, 251, 350, 140, 141, 146, + 332, 140, 141, 332, 354, 307, 251, 255, 6, 251, + 351, 308, 251, 6, 354, 348, 348, 348, 348, 348, + 337, 251, 251, 251, 247, 6, 250, 6, 355, 182, + 268, 337, 255, 255, 350, 6, 337, 337, 251, 251, + 286, 7, 246, 251, 251, 251, 250, 255, 247, 255, + 250, 251, 250, 348, 351, 6, 250, 348, 6, 251, + 251, 337, 6, 136, 251, 319, 250, 251, 255, 255, + 255, 255, 255, 6, 6, 6, 308, 6, 250, 337, + 337, 251, 255, 290, 359, 247, 337, 337, 337, 354, + 6, 348, 6, 348, 6, 6, 251, 337, 322, 308, + 6, 354, 354, 354, 354, 348, 354, 325, 265, 247, + 255, 6, 250, 337, 251, 255, 255, 255, 251, 255, + 255, 6, 251, 251, 320, 251, 251, 251, 251, 255, + 251, 251, 251, 271, 337, 350, 251, 337, 337, 337, + 348, 348, 322, 6, 6, 6, 6, 354, 6, 6, + 6, 250, 247, 251, 6, 251, 281, 255, 255, 255, + 251, 251, 269, 358, 274, 250, 6, 337, 337, 337, + 6, 251, 255, 250, 350, 251, 251, 251, 6, 358, + 272, 358, 251, 6, 6, 251, 255, 6, 6, 358 }; /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint16 yyr1[] = { - 0, 254, 255, 255, 256, 256, 257, 257, 257, 257, - 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, - 257, 257, 257, 257, 257, 257, 258, 258, 259, 259, - 259, 259, 259, 259, 260, 260, 260, 260, 261, 261, - 261, 261, 261, 261, 262, 262, 263, 263, 265, 266, - 264, 267, 267, 269, 268, 270, 270, 272, 271, 273, - 273, 275, 274, 276, 276, 276, 276, 276, 277, 277, - 278, 278, 279, 279, 280, 280, 280, 280, 280, 280, - 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, - 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, - 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, - 280, 281, 281, 282, 282, 282, 283, 282, 284, 282, - 282, 285, 282, 286, 286, 287, 287, 287, 288, 288, - 289, 289, 290, 290, 291, 291, 291, 291, 291, 292, - 292, 293, 293, 294, 294, 294, 294, 294, 295, 295, - 295, 296, 296, 296, 296, 297, 297, 298, 298, 298, - 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, - 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, - 298, 298, 298, 298, 298, 298, 298, 298, 298, 299, - 298, 300, 300, 300, 300, 300, 301, 301, 301, 301, - 302, 302, 302, 303, 303, 303, 303, 304, 304, 304, - 304, 304, 304, 304, 304, 304, 305, 305, 306, 306, - 306, 306, 306, 306, 306, 307, 307, 307, 307, 307, - 307, 307, 307, 307, 307, 307, 307, 308, 308, 308, - 308, 308, 308, 308, 308, 309, 309, 310, 311, 311, - 311, 311, 311, 311, 311, 311, 312, 312, 312, 312, - 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, - 312, 312, 312, 312, 312, 312, 312, 313, 314, 314, + 0, 256, 257, 257, 258, 258, 259, 259, 259, 259, + 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, + 259, 259, 259, 259, 259, 259, 260, 260, 261, 261, + 261, 261, 261, 261, 262, 262, 262, 262, 263, 263, + 263, 263, 263, 263, 264, 264, 265, 265, 267, 268, + 266, 269, 269, 271, 270, 272, 272, 274, 273, 275, + 275, 277, 276, 278, 278, 278, 278, 278, 279, 279, + 280, 280, 281, 281, 282, 282, 282, 282, 282, 282, + 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, + 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, + 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, + 282, 283, 283, 284, 284, 284, 285, 284, 286, 284, + 284, 287, 284, 288, 288, 289, 289, 289, 290, 290, + 291, 291, 292, 292, 293, 293, 293, 293, 293, 294, + 294, 295, 295, 296, 296, 296, 296, 296, 297, 297, + 297, 298, 298, 298, 298, 299, 299, 300, 300, 300, + 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, + 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, + 300, 300, 300, 300, 300, 300, 300, 300, 300, 301, + 300, 302, 302, 302, 302, 302, 303, 303, 303, 303, + 304, 304, 304, 305, 305, 305, 305, 306, 306, 306, + 306, 306, 306, 306, 306, 306, 307, 307, 308, 308, + 308, 308, 308, 308, 308, 309, 309, 309, 309, 309, + 309, 309, 309, 309, 309, 309, 309, 310, 310, 310, + 310, 310, 310, 310, 310, 311, 311, 312, 313, 313, + 313, 313, 313, 313, 313, 313, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, - 314, 314, 315, 315, 315, 316, 315, 317, 315, 318, - 315, 319, 315, 315, 315, 315, 315, 315, 320, 320, - 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, - 321, 322, 322, 322, 322, 322, 323, 323, 323, 323, - 323, 324, 324, 325, 326, 326, 327, 327, 328, 328, - 329, 329, 330, 330, 331, 331, 331, 331, 331, 331, - 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, - 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, - 332, 332, 332, 333, 333, 333, 334, 334, 334, 334, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 336, 336, 336, - 336, 336, 336, 336, 336, 336, 336, 336, 337, 336, - 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, - 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, - 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, - 336, 336, 336, 336, 336, 338, 338, 339, 339, 341, - 340, 342, 342, 343, 344, 344, 345, 345, 346, 346, - 346, 346, 346, 347, 347, 347, 347, 348, 348, 349, - 349, 349, 349, 349, 349, 350, 350, 350, 351, 351, - 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, - 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, - 351, 351, 351, 351, 351, 351, 351, 351, 352, 352, - 352, 352, 353, 353, 353, 353, 354, 354, 355, 355, - 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, - 356, 357, 357, 357, 357, 357, 357, 357, 357, 357, - 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, - 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, - 358, 357, 357, 359, 359, 360, 361, 361, 362, 363, - 363, 363, 363, 364, 364, 364, 365, 365, 365, 366, - 366, 366 + 314, 314, 314, 314, 314, 314, 314, 315, 316, 316, + 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, + 316, 316, 317, 317, 317, 318, 317, 319, 317, 320, + 317, 321, 317, 317, 317, 317, 317, 317, 322, 322, + 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, + 323, 324, 324, 324, 324, 324, 325, 325, 325, 325, + 325, 326, 326, 327, 328, 328, 329, 329, 330, 330, + 331, 331, 332, 332, 333, 333, 333, 333, 333, 333, + 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, + 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, + 334, 334, 334, 335, 335, 335, 336, 336, 336, 336, + 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, + 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, + 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, + 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, + 337, 337, 337, 337, 337, 337, 337, 338, 338, 338, + 338, 338, 338, 338, 338, 338, 338, 338, 339, 338, + 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, + 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, + 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, + 338, 338, 338, 338, 338, 340, 340, 341, 341, 343, + 342, 344, 344, 345, 346, 346, 347, 347, 348, 348, + 348, 348, 348, 349, 349, 349, 349, 350, 350, 351, + 351, 351, 351, 351, 351, 352, 352, 352, 353, 353, + 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, + 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, + 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, + 354, 354, 354, 354, 355, 355, 355, 355, 356, 356, + 357, 357, 358, 358, 358, 358, 358, 358, 358, 358, + 358, 358, 358, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 360, 359, 359, 361, 361, 362, 363, 363, + 364, 365, 365, 365, 365, 366, 366, 366, 367, 367, + 367, 368, 368, 368 }; /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ @@ -5233,16 +5274,16 @@ static const yytype_uint8 yyr2[] = 2, 3, 3, 11, 9, 7, 7, 1, 3, 1, 1, 2, 3, 4, 5, 1, 3, 1, 2, 3, 3, 5, 4, 4, 2, 4, 2, 3, 3, 16, - 5, 1, 1, 1, 3, 5, 7, 4, 4, 4, - 6, 6, 8, 8, 4, 14, 4, 4, 1, 1, - 3, 3, 9, 7, 1, 5, 3, 6, 1, 3, - 1, 1, 4, 4, 3, 5, 6, 8, 6, 4, - 5, 1, 4, 1, 1, 1, 1, 4, 6, 4, - 6, 5, 7, 4, 4, 4, 8, 4, 4, 4, - 4, 8, 8, 6, 4, 6, 4, 1, 4, 4, - 0, 6, 4, 2, 4, 4, 1, 1, 3, 1, - 1, 3, 3, 3, 5, 7, 5, 5, 8, 1, - 1, 4 + 5, 5, 5, 1, 1, 1, 3, 5, 7, 4, + 4, 4, 6, 6, 8, 8, 4, 14, 4, 4, + 1, 1, 3, 3, 9, 7, 1, 5, 3, 6, + 1, 3, 1, 1, 4, 4, 3, 5, 6, 8, + 6, 4, 5, 1, 4, 1, 1, 1, 1, 4, + 6, 4, 6, 5, 7, 4, 4, 4, 8, 4, + 4, 4, 4, 8, 8, 6, 4, 6, 4, 1, + 4, 4, 0, 6, 4, 2, 4, 4, 1, 1, + 3, 1, 1, 3, 3, 3, 5, 7, 5, 5, + 8, 1, 1, 4 }; @@ -5930,25 +5971,25 @@ yyreduce: case 3: #line 270 "Gmsh.y" /* yacc.c:1652 */ { yyerrok; return 1; } -#line 5934 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 5975 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 6: #line 281 "Gmsh.y" /* yacc.c:1652 */ { return 1; } -#line 5940 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 5981 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 7: #line 282 "Gmsh.y" /* yacc.c:1652 */ { return 1; } -#line 5946 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 5987 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 8: #line 283 "Gmsh.y" /* yacc.c:1652 */ { return 1; } -#line 5952 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 5993 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 9: @@ -5971,103 +6012,103 @@ yyreduce: } Free((yyvsp[-2].c)); } -#line 5975 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6016 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 10: #line 303 "Gmsh.y" /* yacc.c:1652 */ { return 1; } -#line 5981 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6022 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 11: #line 304 "Gmsh.y" /* yacc.c:1652 */ { List_Delete((yyvsp[0].l)); return 1; } -#line 5987 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6028 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 12: #line 305 "Gmsh.y" /* yacc.c:1652 */ { return 1; } -#line 5993 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6034 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 13: #line 306 "Gmsh.y" /* yacc.c:1652 */ { return 1; } -#line 5999 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6040 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 14: #line 307 "Gmsh.y" /* yacc.c:1652 */ { return 1; } -#line 6005 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6046 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 15: #line 308 "Gmsh.y" /* yacc.c:1652 */ { return 1; } -#line 6011 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6052 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 16: #line 309 "Gmsh.y" /* yacc.c:1652 */ { List_Delete((yyvsp[0].l)); return 1; } -#line 6017 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6058 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 17: #line 310 "Gmsh.y" /* yacc.c:1652 */ { List_Delete((yyvsp[0].l)); return 1; } -#line 6023 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6064 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 18: #line 311 "Gmsh.y" /* yacc.c:1652 */ { return 1; } -#line 6029 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6070 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 19: #line 312 "Gmsh.y" /* yacc.c:1652 */ { return 1; } -#line 6035 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6076 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 20: #line 313 "Gmsh.y" /* yacc.c:1652 */ { return 1; } -#line 6041 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6082 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 21: #line 314 "Gmsh.y" /* yacc.c:1652 */ { return 1; } -#line 6047 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6088 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 22: #line 315 "Gmsh.y" /* yacc.c:1652 */ { return 1; } -#line 6053 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6094 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 23: #line 316 "Gmsh.y" /* yacc.c:1652 */ { return 1; } -#line 6059 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6100 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 24: #line 317 "Gmsh.y" /* yacc.c:1652 */ { return 1; } -#line 6065 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6106 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 25: #line 318 "Gmsh.y" /* yacc.c:1652 */ { return 1; } -#line 6071 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6112 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 26: @@ -6075,7 +6116,7 @@ yyreduce: { (yyval.c) = (char*)"w"; } -#line 6079 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6120 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 27: @@ -6083,7 +6124,7 @@ yyreduce: { (yyval.c) = (char*)"a"; } -#line 6087 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6128 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 28: @@ -6092,7 +6133,7 @@ yyreduce: Msg::Direct((yyvsp[-2].c)); Free((yyvsp[-2].c)); } -#line 6096 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6137 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 29: @@ -6101,7 +6142,7 @@ yyreduce: Msg::Error((yyvsp[-2].c)); Free((yyvsp[-2].c)); } -#line 6105 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6146 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 30: @@ -6119,7 +6160,7 @@ yyreduce: Free((yyvsp[-4].c)); Free((yyvsp[-1].c)); } -#line 6123 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6164 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 31: @@ -6136,7 +6177,7 @@ yyreduce: Free((yyvsp[-4].c)); List_Delete((yyvsp[-2].l)); } -#line 6140 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6181 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 32: @@ -6153,7 +6194,7 @@ yyreduce: Free((yyvsp[-4].c)); List_Delete((yyvsp[-2].l)); } -#line 6157 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6198 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 33: @@ -6180,7 +6221,7 @@ yyreduce: Free((yyvsp[-1].c)); List_Delete((yyvsp[-4].l)); } -#line 6184 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6225 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 34: @@ -6198,7 +6239,7 @@ yyreduce: #endif Free((yyvsp[-5].c)); Free((yyvsp[-4].c)); } -#line 6202 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6243 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 35: @@ -6215,7 +6256,7 @@ yyreduce: #endif Free((yyvsp[-4].c)); } -#line 6219 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6260 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 36: @@ -6232,7 +6273,7 @@ yyreduce: #endif Free((yyvsp[-4].c)); } -#line 6236 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6277 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 37: @@ -6251,7 +6292,7 @@ yyreduce: #endif Free((yyvsp[-6].c)); } -#line 6255 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6296 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 38: @@ -6261,31 +6302,31 @@ yyreduce: ViewData = new PViewDataList(); #endif } -#line 6265 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6306 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 44: #line 484 "Gmsh.y" /* yacc.c:1652 */ { ViewCoord.push_back((yyvsp[0].d)); } -#line 6271 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6312 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 45: #line 486 "Gmsh.y" /* yacc.c:1652 */ { ViewCoord.push_back((yyvsp[0].d)); } -#line 6277 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6318 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 46: #line 491 "Gmsh.y" /* yacc.c:1652 */ { if(ViewValueList) ViewValueList->push_back((yyvsp[0].d)); } -#line 6283 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6324 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 47: #line 493 "Gmsh.y" /* yacc.c:1652 */ { if(ViewValueList) ViewValueList->push_back((yyvsp[0].d)); } -#line 6289 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6330 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 48: @@ -6393,7 +6434,7 @@ yyreduce: ViewCoord.clear(); Free((yyvsp[0].c)); } -#line 6397 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6438 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 49: @@ -6407,7 +6448,7 @@ yyreduce: } #endif } -#line 6411 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6452 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 50: @@ -6417,7 +6458,7 @@ yyreduce: if(ViewValueList) (*ViewNumList)++; #endif } -#line 6421 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6462 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 51: @@ -6428,7 +6469,7 @@ yyreduce: #endif Free((yyvsp[0].c)); } -#line 6432 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6473 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 52: @@ -6439,7 +6480,7 @@ yyreduce: #endif Free((yyvsp[0].c)); } -#line 6443 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6484 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 53: @@ -6452,7 +6493,7 @@ yyreduce: ViewData->T2D.push_back(ViewData->T2C.size()); #endif } -#line 6456 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6497 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 54: @@ -6462,7 +6503,7 @@ yyreduce: ViewData->NbT2++; #endif } -#line 6466 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6507 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 55: @@ -6473,7 +6514,7 @@ yyreduce: #endif Free((yyvsp[0].c)); } -#line 6477 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6518 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 56: @@ -6484,7 +6525,7 @@ yyreduce: #endif Free((yyvsp[0].c)); } -#line 6488 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6529 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 57: @@ -6496,7 +6537,7 @@ yyreduce: ViewData->T3D.push_back(ViewData->T3C.size()); #endif } -#line 6500 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6541 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 58: @@ -6506,7 +6547,7 @@ yyreduce: ViewData->NbT3++; #endif } -#line 6510 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6551 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 59: @@ -6526,7 +6567,7 @@ yyreduce: ListOfListOfDouble2Matrix((yyvsp[-2].l))); #endif } -#line 6530 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6571 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 60: @@ -6546,7 +6587,7 @@ yyreduce: ListOfListOfDouble2Matrix((yyvsp[-2].l))); #endif } -#line 6550 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6591 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 61: @@ -6556,80 +6597,80 @@ yyreduce: ViewValueList = &ViewData->Time; #endif } -#line 6560 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6601 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 62: #line 735 "Gmsh.y" /* yacc.c:1652 */ { } -#line 6567 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6608 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 63: #line 742 "Gmsh.y" /* yacc.c:1652 */ { (yyval.i) = 0; } -#line 6573 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6614 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 64: #line 743 "Gmsh.y" /* yacc.c:1652 */ { (yyval.i) = 1; } -#line 6579 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6620 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 65: #line 744 "Gmsh.y" /* yacc.c:1652 */ { (yyval.i) = 2; } -#line 6585 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6626 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 66: #line 745 "Gmsh.y" /* yacc.c:1652 */ { (yyval.i) = 3; } -#line 6591 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6632 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 67: #line 746 "Gmsh.y" /* yacc.c:1652 */ { (yyval.i) = 4; } -#line 6597 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6638 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 68: #line 750 "Gmsh.y" /* yacc.c:1652 */ { (yyval.i) = 1; } -#line 6603 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6644 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 69: #line 751 "Gmsh.y" /* yacc.c:1652 */ { (yyval.i) = -1; } -#line 6609 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6650 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 70: #line 757 "Gmsh.y" /* yacc.c:1652 */ { (yyval.c) = (char*)"("; } -#line 6615 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6656 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 71: #line 757 "Gmsh.y" /* yacc.c:1652 */ { (yyval.c) = (char*)"["; } -#line 6621 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6662 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 72: #line 758 "Gmsh.y" /* yacc.c:1652 */ { (yyval.c) = (char*)")"; } -#line 6627 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6668 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 73: #line 758 "Gmsh.y" /* yacc.c:1652 */ { (yyval.c) = (char*)"]"; } -#line 6633 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6674 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 77: @@ -6638,7 +6679,7 @@ yyreduce: Msg::SetOnelabNumber((yyvsp[-4].c), (yyvsp[-2].d)); Free((yyvsp[-4].c)); } -#line 6642 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6683 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 78: @@ -6648,7 +6689,7 @@ yyreduce: Free((yyvsp[-4].c)); Free((yyvsp[-2].c)); } -#line 6652 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6693 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 79: @@ -6714,7 +6755,7 @@ yyreduce: Free((yyvsp[-3].c)); List_Delete((yyvsp[-1].l)); } -#line 6718 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6759 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 80: @@ -6733,7 +6774,7 @@ yyreduce: } Free((yyvsp[-2].c)); } -#line 6737 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6778 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 81: @@ -6766,7 +6807,7 @@ yyreduce: Free((yyvsp[-5].c)); List_Delete((yyvsp[-1].l)); } -#line 6770 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6811 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 82: @@ -6777,7 +6818,7 @@ yyreduce: List_Delete((yyvsp[-5].l)); List_Delete((yyvsp[-1].l)); } -#line 6781 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6822 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 83: @@ -6786,7 +6827,7 @@ yyreduce: assignVariable((yyvsp[-6].c), (int)(yyvsp[-4].d), (yyvsp[-2].i), (yyvsp[-1].d)); Free((yyvsp[-6].c)); } -#line 6790 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6831 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 84: @@ -6795,7 +6836,7 @@ yyreduce: incrementVariable((yyvsp[-5].c), (int)(yyvsp[-3].d), (yyvsp[-1].i)); Free((yyvsp[-5].c)); } -#line 6799 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6840 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 85: @@ -6804,7 +6845,7 @@ yyreduce: assignVariable((yyvsp[-6].c), (int)(yyvsp[-4].d), (yyvsp[-2].i), (yyvsp[-1].d)); Free((yyvsp[-6].c)); } -#line 6808 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6849 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 86: @@ -6813,7 +6854,7 @@ yyreduce: incrementVariable((yyvsp[-5].c), (yyvsp[-3].d), (yyvsp[-1].i)); Free((yyvsp[-5].c)); } -#line 6817 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6858 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 87: @@ -6823,7 +6864,7 @@ yyreduce: Free((yyvsp[-3].c)); Free((yyvsp[-1].c)); } -#line 6827 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6868 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 88: @@ -6832,7 +6873,7 @@ yyreduce: gmsh_yystringsymbols[(yyvsp[-7].c)] = std::vector<std::string>(); Free((yyvsp[-7].c)); } -#line 6836 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6877 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 89: @@ -6848,7 +6889,7 @@ yyreduce: Free((yyvsp[-8].c)); List_Delete((yyvsp[-2].l)); } -#line 6852 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6893 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 90: @@ -6866,7 +6907,7 @@ yyreduce: Free((yyvsp[-8].c)); List_Delete((yyvsp[-2].l)); } -#line 6870 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6911 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 91: @@ -6876,7 +6917,7 @@ yyreduce: StringOption(GMSH_SET|GMSH_GUI, (yyvsp[-5].c), 0, (yyvsp[-3].c), tmp); Free((yyvsp[-5].c)); Free((yyvsp[-3].c)); Free((yyvsp[-1].c)); } -#line 6880 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6921 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 92: @@ -6886,7 +6927,7 @@ yyreduce: StringOption(GMSH_SET|GMSH_GUI, (yyvsp[-8].c), (int)(yyvsp[-6].d), (yyvsp[-3].c), tmp); Free((yyvsp[-8].c)); Free((yyvsp[-3].c)); Free((yyvsp[-1].c)); } -#line 6890 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6931 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 93: @@ -6908,7 +6949,7 @@ yyreduce: } Free((yyvsp[-5].c)); Free((yyvsp[-3].c)); } -#line 6912 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6953 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 94: @@ -6930,7 +6971,7 @@ yyreduce: } Free((yyvsp[-8].c)); Free((yyvsp[-3].c)); } -#line 6934 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6975 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 95: @@ -6943,7 +6984,7 @@ yyreduce: } Free((yyvsp[-4].c)); Free((yyvsp[-2].c)); } -#line 6947 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 6988 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 96: @@ -6956,7 +6997,7 @@ yyreduce: } Free((yyvsp[-7].c)); Free((yyvsp[-2].c)); } -#line 6960 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7001 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 97: @@ -6965,7 +7006,7 @@ yyreduce: ColorOption(GMSH_SET|GMSH_GUI, (yyvsp[-7].c), 0, (yyvsp[-3].c), (yyvsp[-1].u)); Free((yyvsp[-7].c)); Free((yyvsp[-3].c)); } -#line 6969 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7010 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 98: @@ -6974,7 +7015,7 @@ yyreduce: ColorOption(GMSH_SET|GMSH_GUI, (yyvsp[-10].c), (int)(yyvsp[-8].d), (yyvsp[-3].c), (yyvsp[-1].u)); Free((yyvsp[-10].c)); Free((yyvsp[-3].c)); } -#line 6978 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7019 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 99: @@ -6998,7 +7039,7 @@ yyreduce: Free((yyvsp[-5].c)); List_Delete((yyvsp[-1].l)); } -#line 7002 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7043 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 100: @@ -7022,7 +7063,7 @@ yyreduce: Free((yyvsp[-8].c)); List_Delete((yyvsp[-1].l)); } -#line 7026 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7067 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 101: @@ -7046,7 +7087,7 @@ yyreduce: Free((yyvsp[-4].c)); List_Delete((yyvsp[-1].l)); } -#line 7050 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7091 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 102: @@ -7058,7 +7099,7 @@ yyreduce: #endif Free((yyvsp[-1].c)); } -#line 7062 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7103 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 103: @@ -7069,7 +7110,7 @@ yyreduce: yymsg(0, "Cannot create field %i of type '%s'", (int)(yyvsp[-4].d), "Box"); #endif } -#line 7073 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7114 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 104: @@ -7080,7 +7121,7 @@ yyreduce: yymsg(0, "Cannot create field %i of type '%s'", (int)(yyvsp[-4].d), "Cylinder"); #endif } -#line 7084 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7125 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 105: @@ -7106,7 +7147,7 @@ yyreduce: #endif Free((yyvsp[-3].c)); } -#line 7110 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7151 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 106: @@ -7133,7 +7174,7 @@ yyreduce: Free((yyvsp[-3].c)); Free((yyvsp[-1].c)); } -#line 7137 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7178 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 107: @@ -7175,7 +7216,7 @@ yyreduce: Free((yyvsp[-5].c)); List_Delete((yyvsp[-2].l)); } -#line 7179 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7220 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 108: @@ -7197,7 +7238,7 @@ yyreduce: #endif Free((yyvsp[-1].c)); } -#line 7201 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7242 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 109: @@ -7213,7 +7254,7 @@ yyreduce: #endif Free((yyvsp[-6].c)); Free((yyvsp[-3].c)); } -#line 7217 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7258 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 110: @@ -7229,7 +7270,7 @@ yyreduce: #endif Free((yyvsp[-6].c)); Free((yyvsp[-3].c)); Free((yyvsp[-1].c)); } -#line 7233 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7274 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 114: @@ -7242,7 +7283,7 @@ yyreduce: } Free((yyvsp[0].c)); } -#line 7246 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7287 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 115: @@ -7255,13 +7296,13 @@ yyreduce: } Free((yyvsp[-2].c)); } -#line 7259 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7300 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 116: #line 1286 "Gmsh.y" /* yacc.c:1652 */ { init_options(); } -#line 7265 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7306 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 117: @@ -7283,13 +7324,13 @@ yyreduce: Free((yyvsp[-6].c)); List_Delete((yyvsp[-3].l)); } -#line 7287 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7328 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 118: #line 1306 "Gmsh.y" /* yacc.c:1652 */ { init_options(); } -#line 7293 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7334 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 119: @@ -7309,7 +7350,7 @@ yyreduce: Free((yyvsp[-8].c)); List_Delete((yyvsp[-3].l)); } -#line 7313 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7354 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 120: @@ -7322,13 +7363,13 @@ yyreduce: Free((yyvsp[-2].c)); Free((yyvsp[0].c)); } -#line 7326 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7367 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 121: #line 1333 "Gmsh.y" /* yacc.c:1652 */ { init_options(); } -#line 7332 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7373 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 122: @@ -7342,7 +7383,7 @@ yyreduce: Free((yyvsp[-6].c)); Free((yyvsp[-3].c)); } -#line 7346 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7387 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 124: @@ -7352,7 +7393,7 @@ yyreduce: Msg::UndefineOnelabParameter(name); Free((yyvsp[0].c)); } -#line 7356 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7397 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 125: @@ -7362,7 +7403,7 @@ yyreduce: doubleXstring v = {(yyvsp[-2].d), (yyvsp[0].c)}; List_Add((yyval.l), &v); } -#line 7366 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7407 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 126: @@ -7371,7 +7412,7 @@ yyreduce: doubleXstring v = {(yyvsp[-2].d), (yyvsp[0].c)}; List_Add((yyval.l), &v); } -#line 7375 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7416 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 127: @@ -7400,7 +7441,7 @@ yyreduce: List_Delete((yyvsp[-4].l)); Free((yyvsp[-2].c)); } -#line 7404 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7445 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 134: @@ -7416,7 +7457,7 @@ yyreduce: Free((yyvsp[-1].c)); List_Delete((yyvsp[0].l)); } -#line 7420 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7461 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 135: @@ -7433,7 +7474,7 @@ yyreduce: floatOptions[key].push_back(v); Free((yyvsp[0].c)); } -#line 7437 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7478 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 136: @@ -7451,7 +7492,7 @@ yyreduce: Free(((doubleXstring*)List_Pointer((yyvsp[-1].l), i))->s); List_Delete((yyvsp[-1].l)); } -#line 7455 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7496 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 137: @@ -7463,7 +7504,7 @@ yyreduce: Free((yyvsp[-1].c)); Free((yyvsp[0].c)); } -#line 7467 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7508 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 138: @@ -7478,7 +7519,7 @@ yyreduce: Free((yyvsp[-1].c)); List_Delete((yyvsp[0].l)); } -#line 7482 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7523 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 143: @@ -7489,7 +7530,7 @@ yyreduce: floatOptions[key].push_back(val); Free((yyvsp[-1].c)); } -#line 7493 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7534 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 144: @@ -7501,7 +7542,7 @@ yyreduce: Free((yyvsp[-1].c)); Free((yyvsp[0].c)); } -#line 7505 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7546 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 145: @@ -7512,7 +7553,7 @@ yyreduce: charOptions[key].push_back(val); Free((yyvsp[0].c)); } -#line 7516 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7557 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 146: @@ -7529,7 +7570,7 @@ yyreduce: Free((yyvsp[-1].c)); List_Delete((yyvsp[0].l)); } -#line 7533 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7574 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 147: @@ -7546,7 +7587,7 @@ yyreduce: Free((yyvsp[-1].c)); List_Delete((yyvsp[0].l)); } -#line 7550 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7591 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 148: @@ -7554,7 +7595,7 @@ yyreduce: { (yyval.i) = (int)(yyvsp[0].d); } -#line 7558 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7599 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 149: @@ -7565,7 +7606,7 @@ yyreduce: (yyval.i) = GModel::current()->setPhysicalName(std::string((yyvsp[0].c)), dim_entity, t + 1); Free((yyvsp[0].c)); } -#line 7569 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7610 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 150: @@ -7574,7 +7615,7 @@ yyreduce: (yyval.i) = GModel::current()->setPhysicalName(std::string((yyvsp[-2].c)), dim_entity, (yyvsp[0].d)); Free((yyvsp[-2].c)); } -#line 7578 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7619 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 151: @@ -7582,7 +7623,7 @@ yyreduce: { (yyval.l) = 0; } -#line 7586 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7627 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 152: @@ -7592,7 +7633,7 @@ yyreduce: double p = (yyvsp[-1].d); List_Add((yyval.l), &p); } -#line 7596 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7637 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 153: @@ -7600,7 +7641,7 @@ yyreduce: { (yyval.l) = (yyvsp[-1].l); } -#line 7604 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7645 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 154: @@ -7613,7 +7654,7 @@ yyreduce: List_Add((yyval.l), List_Pointer((yyvsp[-1].l), i)); List_Delete((yyvsp[-1].l)); } -#line 7617 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7658 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 155: @@ -7621,7 +7662,7 @@ yyreduce: { for(int i = 0; i < 4; i++) (yyval.v)[i] = 0.; } -#line 7625 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7666 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 156: @@ -7629,7 +7670,7 @@ yyreduce: { for(int i = 0; i < 4; i++) (yyval.v)[i] = (yyvsp[0].v)[i]; } -#line 7633 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7674 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 157: @@ -7656,7 +7697,7 @@ yyreduce: (yyval.s).Type = MSH_POINT; (yyval.s).Num = num; } -#line 7660 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7701 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 158: @@ -7676,7 +7717,7 @@ yyreduce: (yyval.s).Type = MSH_SEGM_LINE; (yyval.s).Num = num; } -#line 7680 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7721 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 159: @@ -7696,7 +7737,7 @@ yyreduce: (yyval.s).Type = MSH_SEGM_SPLN; (yyval.s).Num = num; } -#line 7700 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7741 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 160: @@ -7737,7 +7778,7 @@ yyreduce: (yyval.s).Type = MSH_SEGM_CIRC; (yyval.s).Num = num; } -#line 7741 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7782 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 161: @@ -7781,7 +7822,7 @@ yyreduce: (yyval.s).Type = MSH_SEGM_ELLI; (yyval.s).Num = num; } -#line 7785 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7826 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 162: @@ -7801,7 +7842,7 @@ yyreduce: (yyval.s).Type = MSH_SEGM_BSPLN; (yyval.s).Num = num; } -#line 7805 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7846 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 163: @@ -7821,7 +7862,7 @@ yyreduce: (yyval.s).Type = MSH_SEGM_BEZIER; (yyval.s).Num = num; } -#line 7825 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7866 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 164: @@ -7856,7 +7897,7 @@ yyreduce: (yyval.s).Type = MSH_SEGM_NURBS; (yyval.s).Num = num; } -#line 7860 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7901 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 165: @@ -7876,7 +7917,7 @@ yyreduce: (yyval.s).Type = MSH_SEGM_LOOP; (yyval.s).Num = num; } -#line 7880 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7921 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 166: @@ -7897,7 +7938,7 @@ yyreduce: (yyval.s).Type = MSH_SEGM_LOOP; (yyval.s).Num = num; } -#line 7901 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7942 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 167: @@ -7917,7 +7958,7 @@ yyreduce: (yyval.s).Type = MSH_SURF_PLAN; (yyval.s).Num = num; } -#line 7921 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 7962 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 168: @@ -7971,7 +8012,7 @@ yyreduce: (yyval.s).Type = MSH_SURF_REGL; (yyval.s).Num = num; } -#line 7975 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8016 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 169: @@ -7993,7 +8034,7 @@ yyreduce: (yyval.s).Type = MSH_SURF_REGL; (yyval.s).Num = num; } -#line 7997 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8038 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 170: @@ -8003,7 +8044,7 @@ yyreduce: (yyval.s).Type = 0; (yyval.s).Num = 0; } -#line 8007 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8048 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 171: @@ -8013,7 +8054,7 @@ yyreduce: (yyval.s).Type = 0; (yyval.s).Num = 0; } -#line 8017 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8058 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 172: @@ -8024,7 +8065,7 @@ yyreduce: (yyval.s).Type = 0; (yyval.s).Num = num; } -#line 8028 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8069 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 173: @@ -8059,7 +8100,7 @@ yyreduce: List_Delete((yyvsp[-1].l)); (yyval.s).Num = num; } -#line 8063 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8104 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 174: @@ -8078,7 +8119,7 @@ yyreduce: (yyval.s).Type = 0; (yyval.s).Num = num; } -#line 8082 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8123 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 175: @@ -8104,7 +8145,7 @@ yyreduce: (yyval.s).Type = MSH_VOLUME; (yyval.s).Num = num; } -#line 8108 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8149 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 176: @@ -8131,7 +8172,7 @@ yyreduce: (yyval.s).Type = MSH_VOLUME; (yyval.s).Num = num; } -#line 8135 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8176 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 177: @@ -8158,7 +8199,7 @@ yyreduce: (yyval.s).Type = MSH_SURF_PLAN; (yyval.s).Num = num; } -#line 8162 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8203 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 178: @@ -8185,7 +8226,7 @@ yyreduce: (yyval.s).Type = MSH_SURF_PLAN; (yyval.s).Num = num; } -#line 8189 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8230 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 179: @@ -8213,7 +8254,7 @@ yyreduce: (yyval.s).Type = MSH_VOLUME; (yyval.s).Num = num; } -#line 8217 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8258 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 180: @@ -8241,7 +8282,7 @@ yyreduce: (yyval.s).Type = MSH_VOLUME; (yyval.s).Num = num; } -#line 8245 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8286 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 181: @@ -8269,7 +8310,7 @@ yyreduce: (yyval.s).Type = MSH_VOLUME; (yyval.s).Num = num; } -#line 8273 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8314 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 182: @@ -8299,7 +8340,7 @@ yyreduce: if(!r) yymsg(0, "Could not add thick solid"); List_Delete((yyvsp[-1].l)); } -#line 8303 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8344 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 183: @@ -8320,7 +8361,7 @@ yyreduce: (yyval.s).Type = MSH_SURF_LOOP; (yyval.s).Num = num; } -#line 8324 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8365 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 184: @@ -8340,7 +8381,7 @@ yyreduce: (yyval.s).Type = MSH_VOLUME; (yyval.s).Num = num; } -#line 8344 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8385 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 185: @@ -8362,7 +8403,7 @@ yyreduce: (yyval.s).Type = MSH_VOLUME; (yyval.s).Num = num; } -#line 8366 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8407 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 186: @@ -8384,7 +8425,7 @@ yyreduce: (yyval.s).Type = MSH_VOLUME; (yyval.s).Num = num; } -#line 8388 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8429 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 187: @@ -8395,7 +8436,7 @@ yyreduce: (yyval.s).Type = 0; (yyval.s).Num = 0; } -#line 8399 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8440 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 188: @@ -8406,7 +8447,7 @@ yyreduce: (yyval.s).Type = 0; (yyval.s).Num = 0; } -#line 8410 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8451 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 189: @@ -8414,7 +8455,7 @@ yyreduce: { dim_entity = (yyvsp[0].i); } -#line 8418 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8459 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 190: @@ -8441,31 +8482,31 @@ yyreduce: } (yyval.s).Num = num; } -#line 8445 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8486 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 191: #line 2278 "Gmsh.y" /* yacc.c:1652 */ { (yyval.i) = 0; } -#line 8451 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8492 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 192: #line 2280 "Gmsh.y" /* yacc.c:1652 */ { (yyval.i) = 1; } -#line 8457 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8498 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 193: #line 2282 "Gmsh.y" /* yacc.c:1652 */ { (yyval.i) = 2; } -#line 8463 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8504 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 194: #line 2284 "Gmsh.y" /* yacc.c:1652 */ { (yyval.i) = 3; } -#line 8469 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8510 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 195: @@ -8474,25 +8515,25 @@ yyreduce: (yyval.i) = (int)(yyvsp[-1].d); if ((yyval.i)<0 || (yyval.i)>3) yymsg(0, "GeoEntity dim out of range [0,3]"); } -#line 8478 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8519 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 196: #line 2294 "Gmsh.y" /* yacc.c:1652 */ { (yyval.i) = 1; } -#line 8484 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8525 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 197: #line 2296 "Gmsh.y" /* yacc.c:1652 */ { (yyval.i) = 2; } -#line 8490 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8531 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 198: #line 2298 "Gmsh.y" /* yacc.c:1652 */ { (yyval.i) = 3; } -#line 8496 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8537 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 199: @@ -8501,19 +8542,19 @@ yyreduce: (yyval.i) = (int)(yyvsp[-1].d); if ((yyval.i)<1 || (yyval.i)>3) yymsg(0, "GeoEntity dim out of range [1,3]"); } -#line 8505 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8546 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 200: #line 2308 "Gmsh.y" /* yacc.c:1652 */ { (yyval.i) = 1; } -#line 8511 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8552 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 201: #line 2310 "Gmsh.y" /* yacc.c:1652 */ { (yyval.i) = 2; } -#line 8517 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8558 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 202: @@ -8522,25 +8563,25 @@ yyreduce: (yyval.i) = (int)(yyvsp[-1].d); if ((yyval.i)<1 || (yyval.i)>2) yymsg(0, "GeoEntity dim out of range [1,2]"); } -#line 8526 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8567 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 203: #line 2320 "Gmsh.y" /* yacc.c:1652 */ { (yyval.i) = 0; } -#line 8532 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8573 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 204: #line 2322 "Gmsh.y" /* yacc.c:1652 */ { (yyval.i) = 1; } -#line 8538 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8579 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 205: #line 2324 "Gmsh.y" /* yacc.c:1652 */ { (yyval.i) = 2; } -#line 8544 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8585 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 206: @@ -8549,7 +8590,7 @@ yyreduce: (yyval.i) = (int)(yyvsp[-1].d); if ((yyval.i)<0 || (yyval.i)>2) yymsg(0, "GeoEntity dim out of range [0,2]"); } -#line 8553 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8594 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 207: @@ -8569,7 +8610,7 @@ yyreduce: if(!r) yymsg(0, "Could not translate shapes"); (yyval.l) = (yyvsp[-1].l); } -#line 8573 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8614 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 208: @@ -8589,7 +8630,7 @@ yyreduce: if(!r) yymsg(0, "Could not rotate shapes"); (yyval.l) = (yyvsp[-1].l); } -#line 8593 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8634 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 209: @@ -8609,7 +8650,7 @@ yyreduce: if(!r) yymsg(0, "Could not apply symmetry transform"); (yyval.l) = (yyvsp[-1].l); } -#line 8613 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8654 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 210: @@ -8629,7 +8670,7 @@ yyreduce: if(!r) yymsg(0, "Could not dilate shapes"); (yyval.l) = (yyvsp[-1].l); } -#line 8633 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8674 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 211: @@ -8649,7 +8690,7 @@ yyreduce: if(!r) yymsg(0, "Could not dilate shapes"); (yyval.l) = (yyvsp[-1].l); } -#line 8653 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8694 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 212: @@ -8670,7 +8711,7 @@ yyreduce: List_Delete((yyvsp[-4].l)); (yyval.l) = (yyvsp[-1].l); } -#line 8674 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8715 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 213: @@ -8711,7 +8752,7 @@ yyreduce: VectorOfPairs2ListOfShapes(outDimTags, (yyval.l)); Free((yyvsp[-3].c)); } -#line 8715 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8756 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 214: @@ -8736,7 +8777,7 @@ yyreduce: if(!r) yymsg(0, "Could not intersect line"); List_Delete((yyvsp[-5].l)); } -#line 8740 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8781 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 215: @@ -8761,19 +8802,19 @@ yyreduce: if(!r) yymsg(0, "Could not split line"); List_Delete((yyvsp[-2].l)); } -#line 8765 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8806 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 216: #line 2515 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = (yyvsp[0].l); } -#line 8771 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8812 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 217: #line 2516 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = (yyvsp[0].l); } -#line 8777 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8818 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 218: @@ -8781,7 +8822,7 @@ yyreduce: { (yyval.l) = List_Create(3, 3, sizeof(Shape)); } -#line 8785 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8826 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 219: @@ -8789,7 +8830,7 @@ yyreduce: { List_Add((yyval.l), &(yyvsp[0].s)); } -#line 8793 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8834 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 220: @@ -8810,7 +8851,7 @@ yyreduce: } List_Delete((yyvsp[-2].l)); } -#line 8814 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8855 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 221: @@ -8834,7 +8875,7 @@ yyreduce: List_Delete(tmp); List_Delete((yyvsp[-2].l)); } -#line 8838 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8879 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 222: @@ -8858,7 +8899,7 @@ yyreduce: List_Delete(tmp); List_Delete((yyvsp[-2].l)); } -#line 8862 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8903 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 223: @@ -8881,7 +8922,7 @@ yyreduce: } List_Delete(tmp); } -#line 8885 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8926 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 224: @@ -8907,7 +8948,7 @@ yyreduce: List_Delete(tmp); List_Delete(tmp2); } -#line 8911 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8952 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 225: @@ -8930,7 +8971,7 @@ yyreduce: yymsg(0, "Wrong number of arguments for levelset definition"); List_Delete((yyvsp[-1].l)); } -#line 8934 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 8975 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 226: @@ -8955,7 +8996,7 @@ yyreduce: List_Delete(*(List_T**)List_Pointer((yyvsp[-2].l), i)); List_Delete((yyvsp[-2].l)); } -#line 8959 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9000 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 227: @@ -8973,7 +9014,7 @@ yyreduce: } List_Delete((yyvsp[-2].l)); } -#line 8977 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9018 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 228: @@ -8992,7 +9033,7 @@ yyreduce: } List_Delete((yyvsp[-2].l)); } -#line 8996 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9037 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 229: @@ -9014,7 +9055,7 @@ yyreduce: yymsg(0, "Wrong number of arguments for levelset definition"); List_Delete((yyvsp[-2].l)); } -#line 9018 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9059 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 230: @@ -9068,7 +9109,7 @@ yyreduce: yymsg(0, "Wrong number of arguments for levelset definition"); List_Delete((yyvsp[-2].l)); } -#line 9072 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9113 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 231: @@ -9092,7 +9133,7 @@ yyreduce: yymsg(0, "Wrong number of arguments for levelset definition"); List_Delete((yyvsp[-2].l)); } -#line 9096 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9137 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 232: @@ -9117,7 +9158,7 @@ yyreduce: yymsg(0, "Wrong number of arguments for levelset definition"); List_Delete((yyvsp[-2].l)); } -#line 9121 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9162 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 233: @@ -9143,7 +9184,7 @@ yyreduce: yymsg(0, "Wrong number of arguments for levelset definition"); List_Delete((yyvsp[-2].l)); } -#line 9147 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9188 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 234: @@ -9252,7 +9293,7 @@ yyreduce: Free((yyvsp[-6].c)); List_Delete((yyvsp[-1].l)); } -#line 9256 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9297 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 235: @@ -9272,7 +9313,7 @@ yyreduce: yymsg(0, "Unknown levelset '%s'", (yyvsp[-6].c)); Free((yyvsp[-6].c)); Free((yyvsp[-1].c)); } -#line 9276 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9317 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 236: @@ -9306,7 +9347,7 @@ yyreduce: yymsg(0, "Unknown levelset '%s'", (yyvsp[-4].c)); Free((yyvsp[-4].c)); } -#line 9310 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9351 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 237: @@ -9332,7 +9373,7 @@ yyreduce: } List_Delete((yyvsp[-1].l)); } -#line 9336 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9377 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 238: @@ -9358,7 +9399,7 @@ yyreduce: } List_Delete((yyvsp[-1].l)); } -#line 9362 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9403 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 239: @@ -9374,7 +9415,7 @@ yyreduce: List_Delete((yyvsp[-1].l)); Free((yyvsp[-3].c)); } -#line 9378 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9419 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 240: @@ -9384,7 +9425,7 @@ yyreduce: GModel::current()->getFields()->deleteField((int)(yyvsp[-2].d)); #endif } -#line 9388 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9429 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 241: @@ -9403,7 +9444,7 @@ yyreduce: #endif Free((yyvsp[-4].c)); } -#line 9407 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9448 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 242: @@ -9435,7 +9476,7 @@ yyreduce: } Free((yyvsp[-1].c)); } -#line 9439 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9480 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 243: @@ -9451,7 +9492,7 @@ yyreduce: #endif Free((yyvsp[-2].c)); Free((yyvsp[-1].c)); } -#line 9455 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9496 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 244: @@ -9459,7 +9500,7 @@ yyreduce: { gmsh_yynamespaces.clear(); } -#line 9463 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9504 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 245: @@ -9470,7 +9511,7 @@ yyreduce: setColor(dimTags, (yyvsp[-3].u), false); List_Delete((yyvsp[-1].l)); } -#line 9474 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9515 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 246: @@ -9481,7 +9522,7 @@ yyreduce: setColor(dimTags, (yyvsp[-3].u), true); List_Delete((yyvsp[-1].l)); } -#line 9485 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9526 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 247: @@ -9500,7 +9541,7 @@ yyreduce: } List_Delete((yyvsp[-1].l)); } -#line 9504 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9545 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 248: @@ -9508,7 +9549,7 @@ yyreduce: { setVisibility(-1, 1, false); } -#line 9512 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9553 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 249: @@ -9517,7 +9558,7 @@ yyreduce: setVisibility(-1, 1, false); Free((yyvsp[-1].c)); } -#line 9521 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9562 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 250: @@ -9525,7 +9566,7 @@ yyreduce: { setVisibility(-1, 0, false); } -#line 9529 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9570 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 251: @@ -9534,7 +9575,7 @@ yyreduce: setVisibility(-1, 0, false); Free((yyvsp[-1].c)); } -#line 9538 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9579 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 252: @@ -9545,7 +9586,7 @@ yyreduce: setVisibility(dimTags, 1, false); List_Delete((yyvsp[-1].l)); } -#line 9549 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9590 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 253: @@ -9556,7 +9597,7 @@ yyreduce: setVisibility(dimTags, 1, true); List_Delete((yyvsp[-1].l)); } -#line 9560 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9601 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 254: @@ -9567,7 +9608,7 @@ yyreduce: setVisibility(dimTags, 0, false); List_Delete((yyvsp[-1].l)); } -#line 9571 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9612 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 255: @@ -9578,7 +9619,7 @@ yyreduce: setVisibility(dimTags, 0, true); List_Delete((yyvsp[-1].l)); } -#line 9582 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9623 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 256: @@ -9655,7 +9696,7 @@ yyreduce: } Free((yyvsp[-2].c)); Free((yyvsp[-1].c)); } -#line 9659 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9700 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 257: @@ -9677,7 +9718,7 @@ yyreduce: } List_Delete((yyvsp[-2].l)); } -#line 9681 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9722 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 258: @@ -9706,7 +9747,7 @@ yyreduce: #endif Free((yyvsp[-6].c)); Free((yyvsp[-5].c)); Free((yyvsp[-1].c)); } -#line 9710 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9751 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 259: @@ -9725,7 +9766,7 @@ yyreduce: #endif Free((yyvsp[-6].c)); Free((yyvsp[-5].c)); Free((yyvsp[-4].c)); } -#line 9729 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9770 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 260: @@ -9762,7 +9803,7 @@ yyreduce: yymsg(0, "Unknown command '%s'", (yyvsp[-2].c)); Free((yyvsp[-2].c)); } -#line 9766 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9807 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 261: @@ -9778,7 +9819,7 @@ yyreduce: #endif Free((yyvsp[-4].c)); Free((yyvsp[-1].c)); } -#line 9782 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9823 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 262: @@ -9806,7 +9847,7 @@ yyreduce: #endif Free((yyvsp[-1].c)); } -#line 9810 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9851 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 263: @@ -9814,7 +9855,7 @@ yyreduce: { Msg::Exit(0); } -#line 9818 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9859 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 264: @@ -9823,7 +9864,7 @@ yyreduce: gmsh_yyerrorstate = 999; // this will be checked when yyparse returns YYABORT; } -#line 9827 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9868 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 265: @@ -9834,7 +9875,7 @@ yyreduce: GModel::current()->getOCCInternals()->synchronize(GModel::current()); GModel::current()->getGEOInternals()->synchronize(GModel::current()); } -#line 9838 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9879 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 266: @@ -9843,7 +9884,7 @@ yyreduce: new GModel(); GModel::current(GModel::list.size() - 1); } -#line 9847 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9888 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 267: @@ -9857,7 +9898,7 @@ yyreduce: GModel::current()->getGEOInternals()->synchronize(GModel::current()); SetBoundingBox(); } -#line 9861 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9902 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 268: @@ -9866,7 +9907,7 @@ yyreduce: CTX::instance()->forcedBBox = 1; SetBoundingBox((yyvsp[-12].d), (yyvsp[-10].d), (yyvsp[-8].d), (yyvsp[-6].d), (yyvsp[-4].d), (yyvsp[-2].d)); } -#line 9870 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9911 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 269: @@ -9876,7 +9917,7 @@ yyreduce: drawContext::global()->draw(); #endif } -#line 9880 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9921 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 270: @@ -9888,7 +9929,7 @@ yyreduce: PView::list[index]->setChanged(true); #endif } -#line 9892 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9933 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 271: @@ -9896,7 +9937,7 @@ yyreduce: { GModel::current()->createTopologyFromMesh(); } -#line 9900 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9941 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 272: @@ -9904,7 +9945,7 @@ yyreduce: { GModel::current()->createGeometryOfDiscreteEntities(); } -#line 9908 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9949 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 273: @@ -9912,7 +9953,7 @@ yyreduce: { GModel::current()->renumberMeshVertices(); } -#line 9916 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9957 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 274: @@ -9920,7 +9961,7 @@ yyreduce: { GModel::current()->renumberMeshElements(); } -#line 9924 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9965 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 275: @@ -9933,7 +9974,7 @@ yyreduce: GModel::current()->getGEOInternals()->synchronize(GModel::current()); GModel::current()->refineMesh(CTX::instance()->mesh.secondOrderLinear); } -#line 9937 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 9978 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 276: @@ -9995,7 +10036,7 @@ yyreduce: List_Delete((yyvsp[-7].l)); CTX::instance()->lock = lock; } -#line 9999 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10040 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 277: @@ -10011,7 +10052,7 @@ yyreduce: gmshPopplerWrapper::instance()->setMacroForPages(is, (yyvsp[-4].c), (yyvsp[-2].c) ); #endif } -#line 10015 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10056 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 278: @@ -10032,7 +10073,7 @@ yyreduce: ImbricatedLoop = MAX_RECUR_LOOPS - 1; } } -#line 10036 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10077 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 279: @@ -10053,7 +10094,7 @@ yyreduce: ImbricatedLoop = MAX_RECUR_LOOPS - 1; } } -#line 10057 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10098 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 280: @@ -10079,7 +10120,7 @@ yyreduce: } Free((yyvsp[-6].c)); } -#line 10083 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10124 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 281: @@ -10105,7 +10146,7 @@ yyreduce: } Free((yyvsp[-8].c)); } -#line 10109 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10150 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 282: @@ -10144,7 +10185,7 @@ yyreduce: ImbricatedLoop--; } } -#line 10148 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10189 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 283: @@ -10156,7 +10197,7 @@ yyreduce: skip(NULL, "Return"); Free((yyvsp[0].c)); } -#line 10160 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10201 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 284: @@ -10168,7 +10209,7 @@ yyreduce: skip(NULL, "Return"); Free((yyvsp[0].c)); } -#line 10172 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10213 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 285: @@ -10178,7 +10219,7 @@ yyreduce: (&gmsh_yyin, gmsh_yyname, gmsh_yylineno)) yymsg(0, "Error while exiting function"); } -#line 10182 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10223 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 286: @@ -10189,7 +10230,7 @@ yyreduce: yymsg(0, "Unknown function '%s'", (yyvsp[-1].c)); Free((yyvsp[-1].c)); } -#line 10193 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10234 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 287: @@ -10200,7 +10241,7 @@ yyreduce: yymsg(0, "Unknown function '%s'", (yyvsp[-1].c)); Free((yyvsp[-1].c)); } -#line 10204 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10245 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 288: @@ -10224,7 +10265,7 @@ yyreduce: if(!type_until2) ImbricatedTest--; // EndIf reached } } -#line 10228 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10269 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 289: @@ -10254,7 +10295,7 @@ yyreduce: yymsg(0, "Orphan ElseIf"); } } -#line 10258 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10299 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 290: @@ -10270,7 +10311,7 @@ yyreduce: yymsg(0, "Orphan Else"); } } -#line 10274 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10315 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 291: @@ -10280,7 +10321,7 @@ yyreduce: if(ImbricatedTest < 0) yymsg(1, "Orphan EndIf"); } -#line 10284 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10325 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 292: @@ -10302,7 +10343,7 @@ yyreduce: List_Reset((yyval.l)); VectorOfPairs2ListOfShapes(outDimTags, (yyval.l)); } -#line 10306 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10347 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 293: @@ -10324,7 +10365,7 @@ yyreduce: List_Reset((yyval.l)); VectorOfPairs2ListOfShapes(outDimTags, (yyval.l)); } -#line 10328 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10369 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 294: @@ -10346,7 +10387,7 @@ yyreduce: List_Reset((yyval.l)); VectorOfPairs2ListOfShapes(outDimTags, (yyval.l)); } -#line 10350 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10391 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 295: @@ -10356,7 +10397,7 @@ yyreduce: extr.mesh.QuadToTri = NO_QUADTRI; extr.mesh.ScaleLast = false; } -#line 10360 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10401 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 296: @@ -10378,7 +10419,7 @@ yyreduce: List_Reset((yyval.l)); VectorOfPairs2ListOfShapes(outDimTags, (yyval.l)); } -#line 10382 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10423 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 297: @@ -10388,7 +10429,7 @@ yyreduce: extr.mesh.QuadToTri = NO_QUADTRI; extr.mesh.ScaleLast = false; } -#line 10392 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10433 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 298: @@ -10412,7 +10453,7 @@ yyreduce: List_Reset((yyval.l)); VectorOfPairs2ListOfShapes(outDimTags, (yyval.l)); } -#line 10416 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10457 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 299: @@ -10422,7 +10463,7 @@ yyreduce: extr.mesh.QuadToTri = NO_QUADTRI; extr.mesh.ScaleLast = false; } -#line 10426 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10467 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 300: @@ -10444,7 +10485,7 @@ yyreduce: List_Reset((yyval.l)); VectorOfPairs2ListOfShapes(outDimTags, (yyval.l)); } -#line 10448 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10489 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 301: @@ -10454,7 +10495,7 @@ yyreduce: extr.mesh.QuadToTri = NO_QUADTRI; extr.mesh.ScaleLast = false; } -#line 10458 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10499 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 302: @@ -10475,7 +10516,7 @@ yyreduce: List_Reset((yyval.l)); VectorOfPairs2ListOfShapes(outDimTags, (yyval.l)); } -#line 10479 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10520 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 303: @@ -10495,7 +10536,7 @@ yyreduce: List_Reset((yyval.l)); VectorOfPairs2ListOfShapes(outDimTags, (yyval.l)); } -#line 10499 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10540 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 304: @@ -10516,7 +10557,7 @@ yyreduce: if(!r) yymsg(0, "Could not add thrusections"); List_Delete((yyvsp[0].l)); } -#line 10520 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10561 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 305: @@ -10537,7 +10578,7 @@ yyreduce: if(!r) yymsg(0, "Could not add ruled thrusections"); List_Delete((yyvsp[0].l)); } -#line 10541 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10582 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 306: @@ -10563,7 +10604,7 @@ yyreduce: List_Delete((yyvsp[-4].l)); List_Delete((yyvsp[-1].l)); } -#line 10567 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10608 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 307: @@ -10591,21 +10632,21 @@ yyreduce: List_Delete((yyvsp[-4].l)); List_Delete((yyvsp[-1].l)); } -#line 10595 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10636 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 308: #line 4035 "Gmsh.y" /* yacc.c:1652 */ { } -#line 10602 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10643 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 309: #line 4038 "Gmsh.y" /* yacc.c:1652 */ { } -#line 10609 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10650 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 310: @@ -10621,7 +10662,7 @@ yyreduce: extr.mesh.hLayer.push_back(1.); } } -#line 10625 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10666 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 311: @@ -10645,7 +10686,7 @@ yyreduce: List_Delete((yyvsp[-4].l)); List_Delete((yyvsp[-2].l)); } -#line 10649 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10690 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 312: @@ -10653,7 +10694,7 @@ yyreduce: { extr.mesh.ScaleLast = true; } -#line 10657 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10698 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 313: @@ -10661,7 +10702,7 @@ yyreduce: { extr.mesh.Recombine = true; } -#line 10665 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10706 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 314: @@ -10669,7 +10710,7 @@ yyreduce: { extr.mesh.Recombine = (yyvsp[-1].d) ? true : false; } -#line 10673 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10714 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 315: @@ -10677,7 +10718,7 @@ yyreduce: { extr.mesh.QuadToTri = QUADTRI_ADDVERTS_1; } -#line 10681 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10722 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 316: @@ -10685,7 +10726,7 @@ yyreduce: { extr.mesh.QuadToTri = QUADTRI_ADDVERTS_1_RECOMB; } -#line 10689 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10730 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 317: @@ -10693,7 +10734,7 @@ yyreduce: { extr.mesh.QuadToTri = QUADTRI_NOVERTS_1; } -#line 10697 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10738 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 318: @@ -10701,7 +10742,7 @@ yyreduce: { extr.mesh.QuadToTri = QUADTRI_NOVERTS_1_RECOMB; } -#line 10705 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10746 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 319: @@ -10714,7 +10755,7 @@ yyreduce: extr.mesh.Holes[num].second = tags; List_Delete((yyvsp[-3].l)); } -#line 10718 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10759 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 320: @@ -10726,67 +10767,67 @@ yyreduce: extr.mesh.ViewIndex = (yyvsp[-2].d); Free((yyvsp[-4].c)); } -#line 10730 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10771 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 321: #line 4125 "Gmsh.y" /* yacc.c:1652 */ { (yyval.i) = OCC_Internals::Union; } -#line 10736 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10777 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 322: #line 4126 "Gmsh.y" /* yacc.c:1652 */ { (yyval.i) = OCC_Internals::Intersection; } -#line 10742 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10783 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 323: #line 4127 "Gmsh.y" /* yacc.c:1652 */ { (yyval.i) = OCC_Internals::Difference; } -#line 10748 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10789 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 324: #line 4128 "Gmsh.y" /* yacc.c:1652 */ { (yyval.i) = OCC_Internals::Section; } -#line 10754 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10795 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 325: #line 4129 "Gmsh.y" /* yacc.c:1652 */ { (yyval.i) = OCC_Internals::Fragments; } -#line 10760 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10801 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 326: #line 4133 "Gmsh.y" /* yacc.c:1652 */ { (yyval.i) = 0; } -#line 10766 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10807 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 327: #line 4134 "Gmsh.y" /* yacc.c:1652 */ { (yyval.i) = 1; } -#line 10772 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10813 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 328: #line 4135 "Gmsh.y" /* yacc.c:1652 */ { (yyval.i) = 2; } -#line 10778 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10819 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 329: #line 4136 "Gmsh.y" /* yacc.c:1652 */ { (yyval.i) = (yyvsp[-1].d) ? 1 : 0; } -#line 10784 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10825 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 330: #line 4137 "Gmsh.y" /* yacc.c:1652 */ { (yyval.i) = (yyvsp[-1].d) ? 2 : 0; } -#line 10790 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10831 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 331: @@ -10813,7 +10854,7 @@ yyreduce: List_Delete((yyvsp[-6].l)); List_Delete((yyvsp[-2].l)); } -#line 10817 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10858 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 332: @@ -10833,7 +10874,7 @@ yyreduce: if(!r) yymsg(0, "Could import shape"); Free((yyvsp[-1].c)); } -#line 10837 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10878 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 333: @@ -10855,7 +10896,7 @@ yyreduce: List_Delete((yyvsp[-7].l)); List_Delete((yyvsp[-3].l)); } -#line 10859 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10900 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 334: @@ -10863,7 +10904,7 @@ yyreduce: { (yyval.v)[0] = (yyval.v)[1] = 1.; } -#line 10867 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10908 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 335: @@ -10880,7 +10921,7 @@ yyreduce: (yyval.v)[1] = (yyvsp[0].d); Free((yyvsp[-1].c)); } -#line 10884 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10925 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 336: @@ -10888,7 +10929,7 @@ yyreduce: { (yyval.i) = -1; // left } -#line 10892 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10933 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 337: @@ -10906,7 +10947,7 @@ yyreduce: (yyval.i) = 2; Free((yyvsp[0].c)); } -#line 10910 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10951 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 338: @@ -10914,7 +10955,7 @@ yyreduce: { (yyval.l) = List_Create(1, 1, sizeof(double)); } -#line 10918 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10959 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 339: @@ -10922,7 +10963,7 @@ yyreduce: { (yyval.l) = (yyvsp[0].l); } -#line 10926 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10967 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 340: @@ -10930,7 +10971,7 @@ yyreduce: { (yyval.i) = 45; } -#line 10934 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10975 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 341: @@ -10938,7 +10979,7 @@ yyreduce: { (yyval.i) = (int)(yyvsp[0].d); } -#line 10942 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10983 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 342: @@ -10946,7 +10987,7 @@ yyreduce: { (yyval.l) = List_Create(1, 1, sizeof(double)); } -#line 10950 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10991 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 343: @@ -10954,7 +10995,7 @@ yyreduce: { (yyval.l) = (yyvsp[0].l); } -#line 10958 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 10999 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 344: @@ -10980,7 +11021,7 @@ yyreduce: } List_Delete(tmp); } -#line 10984 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11025 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 345: @@ -11025,7 +11066,7 @@ yyreduce: List_Delete((yyvsp[-4].l)); } } -#line 11029 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11070 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 346: @@ -11073,7 +11114,7 @@ yyreduce: } List_Delete((yyvsp[-2].l)); } -#line 11077 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11118 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 347: @@ -11116,7 +11157,7 @@ yyreduce: } List_Delete((yyvsp[-1].l)); } -#line 11120 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11161 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 348: @@ -11145,7 +11186,7 @@ yyreduce: List_Delete((yyvsp[-1].l)); } } -#line 11149 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11190 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 349: @@ -11161,7 +11202,7 @@ yyreduce: yymsg(0, "Unknown Model Vertex %d",tag); } } -#line 11165 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11206 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 350: @@ -11177,7 +11218,7 @@ yyreduce: yymsg(0, "Unknown Model Edge %d",tag); } } -#line 11181 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11222 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 351: @@ -11193,7 +11234,7 @@ yyreduce: yymsg(0, "Unknown Model Face %d",tag); } } -#line 11197 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11238 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 352: @@ -11209,7 +11250,7 @@ yyreduce: yymsg(0, "Unknown Model Region %d",tag); } } -#line 11213 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11254 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 353: @@ -11222,7 +11263,7 @@ yyreduce: } List_Delete((yyvsp[-4].l)); } -#line 11226 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11267 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 354: @@ -11256,7 +11297,7 @@ yyreduce: List_Delete((yyvsp[-2].l)); } } -#line 11260 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11301 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 355: @@ -11286,7 +11327,7 @@ yyreduce: List_Delete((yyvsp[-1].l)); } } -#line 11290 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11331 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 356: @@ -11316,7 +11357,7 @@ yyreduce: List_Delete((yyvsp[-3].l)); } } -#line 11320 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11361 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 357: @@ -11351,7 +11392,7 @@ yyreduce: List_Delete((yyvsp[-7].l)); List_Delete((yyvsp[-3].l)); } -#line 11355 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11396 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 358: @@ -11381,7 +11422,7 @@ yyreduce: List_Delete((yyvsp[-7].l)); List_Delete((yyvsp[-3].l)); } -#line 11385 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11426 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 359: @@ -11410,7 +11451,7 @@ yyreduce: List_Delete((yyvsp[-14].l)); List_Delete((yyvsp[-10].l)); } -#line 11414 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11455 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 360: @@ -11439,7 +11480,7 @@ yyreduce: List_Delete((yyvsp[-14].l)); List_Delete((yyvsp[-10].l)); } -#line 11443 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11484 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 361: @@ -11468,7 +11509,7 @@ yyreduce: List_Delete((yyvsp[-8].l)); List_Delete((yyvsp[-4].l)); } -#line 11472 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11513 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 362: @@ -11497,7 +11538,7 @@ yyreduce: List_Delete((yyvsp[-8].l)); List_Delete((yyvsp[-4].l)); } -#line 11501 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11542 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 363: @@ -11522,7 +11563,7 @@ yyreduce: List_Delete((yyvsp[-7].l)); List_Delete((yyvsp[-2].l)); } -#line 11526 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11567 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 364: @@ -11537,7 +11578,7 @@ yyreduce: } List_Delete((yyvsp[-7].l)); } -#line 11541 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11582 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 365: @@ -11589,7 +11630,7 @@ yyreduce: List_Delete((yyvsp[-1].l)); } } -#line 11593 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11634 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 366: @@ -11647,7 +11688,7 @@ yyreduce: List_Delete((yyvsp[-1].l)); } } -#line 11651 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11692 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 367: @@ -11666,7 +11707,7 @@ yyreduce: } List_Delete((yyvsp[-1].l)); } -#line 11670 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11711 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 368: @@ -11682,7 +11723,7 @@ yyreduce: } List_Delete((yyvsp[-1].l)); } -#line 11686 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11727 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 369: @@ -11692,7 +11733,7 @@ yyreduce: GModel::current()->getGEOInternals()->setCompoundMesh((yyvsp[-2].i), tags); List_Delete((yyvsp[-1].l)); } -#line 11696 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11737 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 370: @@ -11703,7 +11744,7 @@ yyreduce: else GModel::current()->getGEOInternals()->removeAllDuplicates(); } -#line 11707 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11748 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 371: @@ -11722,7 +11763,7 @@ yyreduce: yymsg(0, "Unknown coherence command"); Free((yyvsp[-1].c)); } -#line 11726 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11767 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 372: @@ -11735,25 +11776,25 @@ yyreduce: GModel::current()->getGEOInternals()->mergeVertices(tags); List_Delete((yyvsp[-2].l)); } -#line 11739 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11780 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 373: #line 4956 "Gmsh.y" /* yacc.c:1652 */ { (yyval.c) = (char*)"Homology"; } -#line 11745 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11786 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 374: #line 4957 "Gmsh.y" /* yacc.c:1652 */ { (yyval.c) = (char*)"Cohomology"; } -#line 11751 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11792 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 375: #line 4958 "Gmsh.y" /* yacc.c:1652 */ { (yyval.c) = (char*)"Betti"; } -#line 11757 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11798 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 376: @@ -11763,7 +11804,7 @@ yyreduce: for(int i = 0; i < 4; i++) dim.push_back(i); GModel::current()->addHomologyRequest((yyvsp[-1].c), domain, subdomain, dim); } -#line 11767 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11808 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 377: @@ -11779,7 +11820,7 @@ yyreduce: GModel::current()->addHomologyRequest((yyvsp[-4].c), domain, subdomain, dim); List_Delete((yyvsp[-2].l)); } -#line 11783 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11824 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 378: @@ -11801,7 +11842,7 @@ yyreduce: List_Delete((yyvsp[-4].l)); List_Delete((yyvsp[-2].l)); } -#line 11805 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11846 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 379: @@ -11828,55 +11869,55 @@ yyreduce: List_Delete((yyvsp[-2].l)); List_Delete((yyvsp[-7].l)); } -#line 11832 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11873 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 380: #line 5026 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = (yyvsp[0].d); } -#line 11838 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11879 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 381: #line 5027 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = (yyvsp[-1].d); } -#line 11844 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11885 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 382: #line 5028 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = -(yyvsp[0].d); } -#line 11850 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11891 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 383: #line 5029 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = (yyvsp[0].d); } -#line 11856 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11897 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 384: #line 5030 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = !(yyvsp[0].d); } -#line 11862 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11903 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 385: #line 5031 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = (yyvsp[-2].d) - (yyvsp[0].d); } -#line 11868 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11909 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 386: #line 5032 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = (yyvsp[-2].d) + (yyvsp[0].d); } -#line 11874 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11915 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 387: #line 5033 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = (yyvsp[-2].d) * (yyvsp[0].d); } -#line 11880 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11921 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 388: @@ -11887,307 +11928,307 @@ yyreduce: else (yyval.d) = (yyvsp[-2].d) / (yyvsp[0].d); } -#line 11891 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11932 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 389: #line 5041 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = (int)(yyvsp[-2].d) | (int)(yyvsp[0].d); } -#line 11897 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11938 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 390: #line 5042 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = (int)(yyvsp[-2].d) & (int)(yyvsp[0].d); } -#line 11903 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11944 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 391: #line 5043 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = (int)(yyvsp[-2].d) % (int)(yyvsp[0].d); } -#line 11909 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11950 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 392: #line 5044 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = pow((yyvsp[-2].d), (yyvsp[0].d)); } -#line 11915 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11956 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 393: #line 5045 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = (yyvsp[-2].d) < (yyvsp[0].d); } -#line 11921 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11962 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 394: #line 5046 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = (yyvsp[-2].d) > (yyvsp[0].d); } -#line 11927 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11968 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 395: #line 5047 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = (yyvsp[-2].d) <= (yyvsp[0].d); } -#line 11933 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11974 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 396: #line 5048 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = (yyvsp[-2].d) >= (yyvsp[0].d); } -#line 11939 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11980 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 397: #line 5049 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = (yyvsp[-2].d) == (yyvsp[0].d); } -#line 11945 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11986 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 398: #line 5050 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = (yyvsp[-2].d) != (yyvsp[0].d); } -#line 11951 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11992 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 399: #line 5051 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = (yyvsp[-2].d) && (yyvsp[0].d); } -#line 11957 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 11998 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 400: #line 5052 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = (yyvsp[-2].d) || (yyvsp[0].d); } -#line 11963 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12004 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 401: #line 5053 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = ((int)(yyvsp[-2].d) >> (int)(yyvsp[0].d)); } -#line 11969 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12010 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 402: #line 5054 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = ((int)(yyvsp[-2].d) << (int)(yyvsp[0].d)); } -#line 11975 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12016 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 403: #line 5055 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = (yyvsp[-4].d) ? (yyvsp[-2].d) : (yyvsp[0].d); } -#line 11981 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12022 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 404: #line 5056 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = exp((yyvsp[-1].d)); } -#line 11987 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12028 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 405: #line 5057 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = log((yyvsp[-1].d)); } -#line 11993 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12034 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 406: #line 5058 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = log10((yyvsp[-1].d)); } -#line 11999 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12040 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 407: #line 5059 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = sqrt((yyvsp[-1].d)); } -#line 12005 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12046 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 408: #line 5060 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = sin((yyvsp[-1].d)); } -#line 12011 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12052 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 409: #line 5061 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = asin((yyvsp[-1].d)); } -#line 12017 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12058 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 410: #line 5062 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = cos((yyvsp[-1].d)); } -#line 12023 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12064 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 411: #line 5063 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = acos((yyvsp[-1].d)); } -#line 12029 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12070 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 412: #line 5064 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = tan((yyvsp[-1].d)); } -#line 12035 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12076 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 413: #line 5065 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = atan((yyvsp[-1].d)); } -#line 12041 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12082 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 414: #line 5066 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = atan2((yyvsp[-3].d), (yyvsp[-1].d));} -#line 12047 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12088 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 415: #line 5067 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = sinh((yyvsp[-1].d)); } -#line 12053 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12094 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 416: #line 5068 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = cosh((yyvsp[-1].d)); } -#line 12059 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12100 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 417: #line 5069 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = tanh((yyvsp[-1].d)); } -#line 12065 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12106 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 418: #line 5070 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = fabs((yyvsp[-1].d)); } -#line 12071 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12112 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 419: #line 5071 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = std::abs((yyvsp[-1].d)); } -#line 12077 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12118 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 420: #line 5072 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = floor((yyvsp[-1].d)); } -#line 12083 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12124 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 421: #line 5073 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = ceil((yyvsp[-1].d)); } -#line 12089 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12130 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 422: #line 5074 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = floor((yyvsp[-1].d) + 0.5); } -#line 12095 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12136 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 423: #line 5075 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = fmod((yyvsp[-3].d), (yyvsp[-1].d)); } -#line 12101 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12142 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 424: #line 5076 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = fmod((yyvsp[-3].d), (yyvsp[-1].d)); } -#line 12107 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12148 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 425: #line 5077 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = sqrt((yyvsp[-3].d) * (yyvsp[-3].d) + (yyvsp[-1].d) * (yyvsp[-1].d)); } -#line 12113 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12154 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 426: #line 5078 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = (yyvsp[-1].d) * (double)rand() / (double)RAND_MAX; } -#line 12119 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12160 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 427: #line 5087 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = (yyvsp[0].d); } -#line 12125 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12166 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 428: #line 5088 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = 3.141592653589793; } -#line 12131 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12172 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 429: #line 5089 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = (double)ImbricatedTest; } -#line 12137 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12178 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 430: #line 5090 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = Msg::GetCommRank(); } -#line 12143 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12184 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 431: #line 5091 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = Msg::GetCommSize(); } -#line 12149 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12190 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 432: #line 5092 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = GetGmshMajorVersion(); } -#line 12155 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12196 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 433: #line 5093 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = GetGmshMinorVersion(); } -#line 12161 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12202 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 434: #line 5094 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = GetGmshPatchVersion(); } -#line 12167 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12208 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 435: #line 5095 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = Cpu(); } -#line 12173 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12214 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 436: #line 5096 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = GetMemoryUsage()/1024./1024.; } -#line 12179 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12220 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 437: #line 5097 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = TotalRam(); } -#line 12185 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12226 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 438: #line 5102 "Gmsh.y" /* yacc.c:1652 */ { init_options(); } -#line 12191 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12232 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 439: @@ -12197,13 +12238,13 @@ yyreduce: Msg::ExchangeOnelabParameter("", val, floatOptions, charOptions); (yyval.d) = val[0]; } -#line 12201 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12242 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 440: #line 5110 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = (yyvsp[0].d); } -#line 12207 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12248 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 441: @@ -12212,7 +12253,7 @@ yyreduce: (yyval.d) = Msg::GetOnelabNumber((yyvsp[-1].c)); Free((yyvsp[-1].c)); } -#line 12216 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12257 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 442: @@ -12221,7 +12262,7 @@ yyreduce: (yyval.d) = Msg::GetOnelabNumber((yyvsp[-3].c), (yyvsp[-1].d)); Free((yyvsp[-3].c)); } -#line 12225 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12266 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 443: @@ -12229,7 +12270,7 @@ yyreduce: { (yyval.d) = treat_Struct_FullName_Float((yyvsp[0].c2).char1, (yyvsp[0].c2).char2); } -#line 12233 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12274 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 444: @@ -12237,7 +12278,7 @@ yyreduce: { (yyval.d) = treat_Struct_FullName_Float(NULL, (yyvsp[-3].c), 2, (int)(yyvsp[-1].d)); } -#line 12241 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12282 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 445: @@ -12245,7 +12286,7 @@ yyreduce: { (yyval.d) = treat_Struct_FullName_Float(NULL, (yyvsp[-3].c), 2, (int)(yyvsp[-1].d)); } -#line 12249 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12290 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 446: @@ -12253,7 +12294,7 @@ yyreduce: { (yyval.d) = treat_Struct_FullName_Float((yyvsp[-1].c2).char1, (yyvsp[-1].c2).char2, 1, 0, 0., 1); } -#line 12257 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12298 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 447: @@ -12261,7 +12302,7 @@ yyreduce: { (yyval.d) = treat_Struct_FullName_dot_tSTRING_Float((yyvsp[-3].c2).char1, (yyvsp[-3].c2).char2, (yyvsp[-1].c), 0, 0., 1); } -#line 12265 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12306 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 448: @@ -12269,7 +12310,7 @@ yyreduce: { (yyval.d) = treat_Struct_FullName_Float((yyvsp[-2].c2).char1, (yyvsp[-2].c2).char2, 1, 0, (yyvsp[-1].d), 2); } -#line 12273 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12314 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 449: @@ -12277,7 +12318,7 @@ yyreduce: { (yyval.d) = treat_Struct_FullName_dot_tSTRING_Float((yyvsp[-4].c2).char1, (yyvsp[-4].c2).char2, (yyvsp[-2].c), 0, (yyvsp[-1].d), 2); } -#line 12281 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12322 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 450: @@ -12285,7 +12326,7 @@ yyreduce: { (yyval.d) = treat_Struct_FullName_Float((yyvsp[-5].c2).char1, (yyvsp[-5].c2).char2, 2, (int)(yyvsp[-3].d), (yyvsp[-1].d), 2); } -#line 12289 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12330 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 451: @@ -12293,7 +12334,7 @@ yyreduce: { (yyval.d) = treat_Struct_FullName_dot_tSTRING_Float((yyvsp[-7].c2).char1, (yyvsp[-7].c2).char2, (yyvsp[-5].c), (int)(yyvsp[-3].d), (yyvsp[-1].d), 2); } -#line 12297 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12338 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 452: @@ -12303,7 +12344,7 @@ yyreduce: (yyval.d) = !StatFile(tmp); Free((yyvsp[-1].c)); } -#line 12307 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12348 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 453: @@ -12322,38 +12363,38 @@ yyreduce: } Free((yyvsp[-2].c)); } -#line 12326 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12367 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 454: -#line 5182 "Gmsh.y" /* yacc.c:1652 */ +#line 5181 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = treat_Struct_FullName_dot_tSTRING_Float_getDim((yyvsp[-4].c2).char1, (yyvsp[-4].c2).char2, (yyvsp[-2].c)); } -#line 12334 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12375 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 455: -#line 5187 "Gmsh.y" /* yacc.c:1652 */ +#line 5185 "Gmsh.y" /* yacc.c:1652 */ { std::string struct_namespace((yyvsp[-1].c)); (yyval.d) = (double)gmsh_yynamespaces[struct_namespace].size(); Free((yyvsp[-1].c)); } -#line 12344 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12385 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 456: -#line 5193 "Gmsh.y" /* yacc.c:1652 */ +#line 5191 "Gmsh.y" /* yacc.c:1652 */ { std::string struct_namespace(std::string("")); (yyval.d) = (double)gmsh_yynamespaces[struct_namespace].size(); } -#line 12353 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12394 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 457: -#line 5199 "Gmsh.y" /* yacc.c:1652 */ +#line 5196 "Gmsh.y" /* yacc.c:1652 */ { if(!gmsh_yysymbols.count((yyvsp[-1].c))){ yymsg(0, "Unknown variable '%s'", (yyvsp[-1].c)); @@ -12372,11 +12413,11 @@ yyreduce: } Free((yyvsp[-1].c)); } -#line 12376 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12417 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 458: -#line 5218 "Gmsh.y" /* yacc.c:1652 */ +#line 5215 "Gmsh.y" /* yacc.c:1652 */ { int index = (int)(yyvsp[-2].d); if(!gmsh_yysymbols.count((yyvsp[-4].c))){ @@ -12396,11 +12437,11 @@ yyreduce: } Free((yyvsp[-4].c)); } -#line 12400 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12441 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 459: -#line 5239 "Gmsh.y" /* yacc.c:1652 */ +#line 5235 "Gmsh.y" /* yacc.c:1652 */ { int index = (int)(yyvsp[-2].d); if(!gmsh_yysymbols.count((yyvsp[-4].c))){ @@ -12420,68 +12461,68 @@ yyreduce: } Free((yyvsp[-4].c)); } -#line 12424 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12465 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 460: -#line 5272 "Gmsh.y" /* yacc.c:1652 */ +#line 5266 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = treat_Struct_FullName_dot_tSTRING_Float(NULL, (yyvsp[-2].c), (yyvsp[0].c)); } -#line 12432 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12473 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 461: -#line 5276 "Gmsh.y" /* yacc.c:1652 */ +#line 5270 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = treat_Struct_FullName_dot_tSTRING_Float((yyvsp[-4].c), (yyvsp[-2].c), (yyvsp[0].c)); } -#line 12440 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12481 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 462: -#line 5281 "Gmsh.y" /* yacc.c:1652 */ +#line 5274 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = treat_Struct_FullName_dot_tSTRING_Float(NULL, (yyvsp[-5].c), (yyvsp[-3].c), (int)(yyvsp[-1].d)); } -#line 12448 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12489 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 463: -#line 5285 "Gmsh.y" /* yacc.c:1652 */ +#line 5278 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = treat_Struct_FullName_dot_tSTRING_Float((yyvsp[-7].c), (yyvsp[-5].c), (yyvsp[-3].c), (int)(yyvsp[-1].d)); } -#line 12456 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12497 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 464: -#line 5289 "Gmsh.y" /* yacc.c:1652 */ +#line 5282 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = treat_Struct_FullName_dot_tSTRING_Float(NULL, (yyvsp[-5].c), (yyvsp[-3].c), (int)(yyvsp[-1].d)); } -#line 12464 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12505 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 465: -#line 5293 "Gmsh.y" /* yacc.c:1652 */ +#line 5286 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = treat_Struct_FullName_dot_tSTRING_Float((yyvsp[-7].c), (yyvsp[-5].c), (yyvsp[-3].c), (int)(yyvsp[-1].d)); } -#line 12472 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12513 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 466: -#line 5298 "Gmsh.y" /* yacc.c:1652 */ +#line 5290 "Gmsh.y" /* yacc.c:1652 */ { NumberOption(GMSH_GET, (yyvsp[-5].c), (int)(yyvsp[-3].d), (yyvsp[0].c), (yyval.d)); Free((yyvsp[-5].c)); Free((yyvsp[0].c)); } -#line 12481 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12522 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 467: -#line 5303 "Gmsh.y" /* yacc.c:1652 */ +#line 5295 "Gmsh.y" /* yacc.c:1652 */ { double d = 0.; if(NumberOption(GMSH_GET, (yyvsp[-3].c), 0, (yyvsp[-1].c), d)){ @@ -12491,11 +12532,11 @@ yyreduce: } Free((yyvsp[-3].c)); Free((yyvsp[-1].c)); } -#line 12495 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12536 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 468: -#line 5313 "Gmsh.y" /* yacc.c:1652 */ +#line 5305 "Gmsh.y" /* yacc.c:1652 */ { double d = 0.; if(NumberOption(GMSH_GET, (yyvsp[-6].c), (int)(yyvsp[-4].d), (yyvsp[-1].c), d)){ @@ -12505,20 +12546,20 @@ yyreduce: } Free((yyvsp[-6].c)); Free((yyvsp[-1].c)); } -#line 12509 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12550 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 469: -#line 5323 "Gmsh.y" /* yacc.c:1652 */ +#line 5315 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = Msg::GetValue((yyvsp[-3].c), (yyvsp[-1].d)); Free((yyvsp[-3].c)); } -#line 12518 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12559 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 470: -#line 5328 "Gmsh.y" /* yacc.c:1652 */ +#line 5320 "Gmsh.y" /* yacc.c:1652 */ { int matches = 0; for(int i = 0; i < List_Nbr((yyvsp[-3].l)); i++){ @@ -12529,11 +12570,11 @@ yyreduce: (yyval.d) = matches; Free((yyvsp[-3].l)); Free((yyvsp[-1].l)); } -#line 12533 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12574 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 471: -#line 5339 "Gmsh.y" /* yacc.c:1652 */ +#line 5331 "Gmsh.y" /* yacc.c:1652 */ { std::string s((yyvsp[-3].c)), substr((yyvsp[-1].c)); if(s.find(substr) != std::string::npos) @@ -12542,29 +12583,29 @@ yyreduce: (yyval.d) = 0.; Free((yyvsp[-3].c)); Free((yyvsp[-1].c)); } -#line 12546 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12587 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 472: -#line 5348 "Gmsh.y" /* yacc.c:1652 */ +#line 5340 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = strlen((yyvsp[-1].c)); Free((yyvsp[-1].c)); } -#line 12555 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12596 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 473: -#line 5353 "Gmsh.y" /* yacc.c:1652 */ +#line 5345 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = strcmp((yyvsp[-3].c), (yyvsp[-1].c)); Free((yyvsp[-3].c)); Free((yyvsp[-1].c)); } -#line 12564 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12605 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 474: -#line 5358 "Gmsh.y" /* yacc.c:1652 */ +#line 5350 "Gmsh.y" /* yacc.c:1652 */ { int align = 0, font = 0, fontsize = CTX::instance()->glFontSize; if(List_Nbr((yyvsp[-1].l)) % 2){ @@ -12588,46 +12629,46 @@ yyreduce: List_Delete((yyvsp[-1].l)); (yyval.d) = (double)((align<<16)|(font<<8)|(fontsize)); } -#line 12592 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12633 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 475: -#line 5385 "Gmsh.y" /* yacc.c:1652 */ +#line 5377 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = 0.; } -#line 12598 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12639 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 476: -#line 5387 "Gmsh.y" /* yacc.c:1652 */ +#line 5379 "Gmsh.y" /* yacc.c:1652 */ { (yyval.d) = (yyvsp[0].d);} -#line 12604 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12645 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 477: -#line 5392 "Gmsh.y" /* yacc.c:1652 */ +#line 5384 "Gmsh.y" /* yacc.c:1652 */ { (yyval.c) = NULL; } -#line 12610 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12651 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 478: -#line 5394 "Gmsh.y" /* yacc.c:1652 */ +#line 5386 "Gmsh.y" /* yacc.c:1652 */ { (yyval.c) = (yyvsp[0].c);} -#line 12616 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12657 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 479: -#line 5399 "Gmsh.y" /* yacc.c:1652 */ +#line 5391 "Gmsh.y" /* yacc.c:1652 */ { std::string struct_namespace((yyvsp[-1].c2).char1? (yyvsp[-1].c2).char1 : std::string("")), struct_name((yyvsp[-1].c2).char2); init_options (gmsh_yynamespaces.getMember_ValMax(struct_namespace, struct_name)); } -#line 12627 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12668 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 480: -#line 5406 "Gmsh.y" /* yacc.c:1652 */ +#line 5398 "Gmsh.y" /* yacc.c:1652 */ { std::string struct_namespace((yyvsp[-5].c2).char1? (yyvsp[-5].c2).char1 : std::string("")), struct_name((yyvsp[-5].c2).char2); @@ -12640,176 +12681,176 @@ yyreduce: struct_namespace.c_str(), struct_name.c_str()); (yyval.d) = (double)tag_out; } -#line 12644 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12685 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 481: -#line 5422 "Gmsh.y" /* yacc.c:1652 */ +#line 5414 "Gmsh.y" /* yacc.c:1652 */ { (yyval.c2).char1 = NULL; (yyval.c2).char2 = (yyvsp[0].c); } -#line 12650 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12691 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 482: -#line 5424 "Gmsh.y" /* yacc.c:1652 */ +#line 5416 "Gmsh.y" /* yacc.c:1652 */ { (yyval.c2).char1 = (yyvsp[-2].c); (yyval.c2).char2 = (yyvsp[0].c); } -#line 12656 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12697 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 483: -#line 5429 "Gmsh.y" /* yacc.c:1652 */ +#line 5421 "Gmsh.y" /* yacc.c:1652 */ { (yyval.c) = (yyvsp[0].c); flag_tSTRING_alloc = 1; } -#line 12662 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12703 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 484: -#line 5438 "Gmsh.y" /* yacc.c:1652 */ +#line 5430 "Gmsh.y" /* yacc.c:1652 */ { (yyval.i) = 99; } -#line 12668 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12709 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 485: -#line 5440 "Gmsh.y" /* yacc.c:1652 */ +#line 5432 "Gmsh.y" /* yacc.c:1652 */ { (yyval.i) = (int)(yyvsp[0].d); } -#line 12674 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12715 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 486: -#line 5445 "Gmsh.y" /* yacc.c:1652 */ +#line 5437 "Gmsh.y" /* yacc.c:1652 */ { (yyval.i) = 0; } -#line 12680 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12721 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 487: -#line 5447 "Gmsh.y" /* yacc.c:1652 */ +#line 5439 "Gmsh.y" /* yacc.c:1652 */ { (yyval.i) = (yyvsp[-1].i); } -#line 12686 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12727 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 488: -#line 5452 "Gmsh.y" /* yacc.c:1652 */ +#line 5444 "Gmsh.y" /* yacc.c:1652 */ { memcpy((yyval.v), (yyvsp[0].v), 5*sizeof(double)); } -#line 12694 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12735 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 489: -#line 5456 "Gmsh.y" /* yacc.c:1652 */ +#line 5448 "Gmsh.y" /* yacc.c:1652 */ { for(int i = 0; i < 5; i++) (yyval.v)[i] = -(yyvsp[0].v)[i]; } -#line 12702 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12743 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 490: -#line 5460 "Gmsh.y" /* yacc.c:1652 */ +#line 5452 "Gmsh.y" /* yacc.c:1652 */ { for(int i = 0; i < 5; i++) (yyval.v)[i] = (yyvsp[0].v)[i]; } -#line 12710 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12751 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 491: -#line 5464 "Gmsh.y" /* yacc.c:1652 */ +#line 5456 "Gmsh.y" /* yacc.c:1652 */ { for(int i = 0; i < 5; i++) (yyval.v)[i] = (yyvsp[-2].v)[i] - (yyvsp[0].v)[i]; } -#line 12718 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12759 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 492: -#line 5468 "Gmsh.y" /* yacc.c:1652 */ +#line 5460 "Gmsh.y" /* yacc.c:1652 */ { for(int i = 0; i < 5; i++) (yyval.v)[i] = (yyvsp[-2].v)[i] + (yyvsp[0].v)[i]; } -#line 12726 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12767 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 493: -#line 5475 "Gmsh.y" /* yacc.c:1652 */ +#line 5467 "Gmsh.y" /* yacc.c:1652 */ { (yyval.v)[0] = (yyvsp[-9].d); (yyval.v)[1] = (yyvsp[-7].d); (yyval.v)[2] = (yyvsp[-5].d); (yyval.v)[3] = (yyvsp[-3].d); (yyval.v)[4] = (yyvsp[-1].d); } -#line 12734 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12775 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 494: -#line 5479 "Gmsh.y" /* yacc.c:1652 */ +#line 5471 "Gmsh.y" /* yacc.c:1652 */ { (yyval.v)[0] = (yyvsp[-7].d); (yyval.v)[1] = (yyvsp[-5].d); (yyval.v)[2] = (yyvsp[-3].d); (yyval.v)[3] = (yyvsp[-1].d); (yyval.v)[4] = 1.0; } -#line 12742 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12783 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 495: -#line 5483 "Gmsh.y" /* yacc.c:1652 */ +#line 5475 "Gmsh.y" /* yacc.c:1652 */ { (yyval.v)[0] = (yyvsp[-5].d); (yyval.v)[1] = (yyvsp[-3].d); (yyval.v)[2] = (yyvsp[-1].d); (yyval.v)[3] = 0.0; (yyval.v)[4] = 1.0; } -#line 12750 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12791 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 496: -#line 5487 "Gmsh.y" /* yacc.c:1652 */ +#line 5479 "Gmsh.y" /* yacc.c:1652 */ { (yyval.v)[0] = (yyvsp[-5].d); (yyval.v)[1] = (yyvsp[-3].d); (yyval.v)[2] = (yyvsp[-1].d); (yyval.v)[3] = 0.0; (yyval.v)[4] = 1.0; } -#line 12758 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12799 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 497: -#line 5494 "Gmsh.y" /* yacc.c:1652 */ +#line 5486 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = List_Create(2, 1, sizeof(List_T*)); List_Add((yyval.l), &((yyvsp[0].l))); } -#line 12767 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12808 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 498: -#line 5499 "Gmsh.y" /* yacc.c:1652 */ +#line 5491 "Gmsh.y" /* yacc.c:1652 */ { List_Add((yyval.l), &((yyvsp[0].l))); } -#line 12775 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12816 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 499: -#line 5506 "Gmsh.y" /* yacc.c:1652 */ +#line 5498 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = List_Create(2, 1, sizeof(double)); List_Add((yyval.l), &((yyvsp[0].d))); } -#line 12784 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12825 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 500: -#line 5511 "Gmsh.y" /* yacc.c:1652 */ +#line 5503 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = (yyvsp[0].l); } -#line 12792 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12833 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 501: -#line 5515 "Gmsh.y" /* yacc.c:1652 */ +#line 5507 "Gmsh.y" /* yacc.c:1652 */ { // creates an empty list (yyval.l) = List_Create(2, 1, sizeof(double)); } -#line 12801 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12842 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 502: -#line 5520 "Gmsh.y" /* yacc.c:1652 */ +#line 5512 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = (yyvsp[-1].l); } -#line 12809 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12850 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 503: -#line 5524 "Gmsh.y" /* yacc.c:1652 */ +#line 5516 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = (yyvsp[-1].l); for(int i = 0; i < List_Nbr((yyval.l)); i++){ @@ -12817,11 +12858,11 @@ yyreduce: (*pd) = - (*pd); } } -#line 12821 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12862 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 504: -#line 5532 "Gmsh.y" /* yacc.c:1652 */ +#line 5524 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = (yyvsp[-1].l); for(int i = 0; i < List_Nbr((yyval.l)); i++){ @@ -12829,27 +12870,27 @@ yyreduce: (*pd) *= (yyvsp[-4].d); } } -#line 12833 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12874 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 505: -#line 5543 "Gmsh.y" /* yacc.c:1652 */ +#line 5535 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = (yyvsp[0].l); } -#line 12841 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12882 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 506: -#line 5547 "Gmsh.y" /* yacc.c:1652 */ +#line 5539 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = 0; } -#line 12849 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12890 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 507: -#line 5551 "Gmsh.y" /* yacc.c:1652 */ +#line 5543 "Gmsh.y" /* yacc.c:1652 */ { if(!strcmp((yyvsp[0].c), "*") || !strcmp((yyvsp[0].c), "all")){ (yyval.l) = 0; @@ -12860,11 +12901,11 @@ yyreduce: } Free((yyvsp[0].c)); } -#line 12864 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12905 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 508: -#line 5565 "Gmsh.y" /* yacc.c:1652 */ +#line 5557 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = (yyvsp[0].l); for(int i = 0; i < List_Nbr((yyval.l)); i++){ @@ -12872,11 +12913,11 @@ yyreduce: (*pd) = - (*pd); } } -#line 12876 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12917 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 509: -#line 5573 "Gmsh.y" /* yacc.c:1652 */ +#line 5565 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = (yyvsp[0].l); for(int i = 0; i < List_Nbr((yyval.l)); i++){ @@ -12884,22 +12925,22 @@ yyreduce: (*pd) *= (yyvsp[-2].d); } } -#line 12888 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12929 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 510: -#line 5581 "Gmsh.y" /* yacc.c:1652 */ +#line 5573 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = List_Create(2, 1, sizeof(double)); for(double d = (yyvsp[-2].d); ((yyvsp[-2].d) < (yyvsp[0].d)) ? (d <= (yyvsp[0].d)) : (d >= (yyvsp[0].d)); ((yyvsp[-2].d) < (yyvsp[0].d)) ? (d += 1.) : (d -= 1.)) List_Add((yyval.l), &d); } -#line 12899 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12940 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 511: -#line 5588 "Gmsh.y" /* yacc.c:1652 */ +#line 5580 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = List_Create(2, 1, sizeof(double)); if(!(yyvsp[0].d)){ //|| ($1 < $3 && $5 < 0) || ($1 > $3 && $5 > 0) @@ -12909,11 +12950,11 @@ yyreduce: for(double d = (yyvsp[-4].d); ((yyvsp[0].d) > 0) ? (d <= (yyvsp[-2].d)) : (d >= (yyvsp[-2].d)); d += (yyvsp[0].d)) List_Add((yyval.l), &d); } -#line 12913 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12954 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 512: -#line 5598 "Gmsh.y" /* yacc.c:1652 */ +#line 5590 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = List_Create(3, 1, sizeof(double)); int tag = (int)(yyvsp[-1].d); @@ -12936,49 +12977,49 @@ yyreduce: List_Add((yyval.l), &y); List_Add((yyval.l), &z); } -#line 12940 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12981 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 513: -#line 5621 "Gmsh.y" /* yacc.c:1652 */ +#line 5613 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = List_Create(10, 10, sizeof(double)); getAllElementaryTags(0, (yyval.l)); } -#line 12949 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 12990 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 514: -#line 5626 "Gmsh.y" /* yacc.c:1652 */ +#line 5618 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = List_Create(10, 10, sizeof(double)); getAllElementaryTags(0, (yyval.l)); Free((yyvsp[0].c)); } -#line 12959 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13000 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 515: -#line 5632 "Gmsh.y" /* yacc.c:1652 */ +#line 5624 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = List_Create(10, 10, sizeof(double)); getAllElementaryTags((yyvsp[-3].i), (yyval.l)); } -#line 12968 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13009 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 516: -#line 5637 "Gmsh.y" /* yacc.c:1652 */ +#line 5629 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = List_Create(10, 10, sizeof(double)); getAllElementaryTags((yyvsp[-1].i), (yyval.l)); Free((yyvsp[0].c)); } -#line 12978 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13019 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 517: -#line 5643 "Gmsh.y" /* yacc.c:1652 */ +#line 5635 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = List_Create(10, 10, sizeof(double)); if(!(yyvsp[0].l)){ @@ -12989,40 +13030,74 @@ yyreduce: List_Delete((yyvsp[0].l)); } } -#line 12993 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13034 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 518: -#line 5654 "Gmsh.y" /* yacc.c:1652 */ +#line 5646 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = List_Create(10, 10, sizeof(double)); getParentTags((yyvsp[-1].i), (yyvsp[0].l), (yyval.l)); List_Delete((yyvsp[0].l)); } -#line 13003 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13044 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 519: -#line 5661 "Gmsh.y" /* yacc.c:1652 */ +#line 5653 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = List_Create(10, 10, sizeof(double)); getElementaryTagsInBoundingBox((yyvsp[-15].i), (yyvsp[-11].d), (yyvsp[-9].d), (yyvsp[-7].d), (yyvsp[-5].d), (yyvsp[-3].d), (yyvsp[-1].d), (yyval.l)); } -#line 13012 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13053 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 520: -#line 5666 "Gmsh.y" /* yacc.c:1652 */ +#line 5658 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = List_Create(10, 10, sizeof(double)); getBoundingBox((yyvsp[-3].i), (yyvsp[-1].l), (yyval.l)); List_Delete((yyvsp[-1].l)); } -#line 13022 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13063 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; case 521: -#line 5672 "Gmsh.y" /* yacc.c:1652 */ +#line 5664 "Gmsh.y" /* yacc.c:1652 */ + { + (yyval.l) = List_Create(1, 1, sizeof(double)); + double m = 0; + if(gmsh_yyfactory == "OpenCASCADE" && GModel::current()->getOCCInternals()){ + GModel::current()->getOCCInternals()->getMass((yyvsp[-3].i), (int)(yyvsp[-1].d), m); + } + else{ + yymsg(0, "Mass only available with OpenCASCADE geometry kernel"); + } + List_Add((yyval.l), &m); + } +#line 13079 "Gmsh.tab.cpp" /* yacc.c:1652 */ + break; + + case 522: +#line 5676 "Gmsh.y" /* yacc.c:1652 */ + { + (yyval.l) = List_Create(3, 1, sizeof(double)); + double x = 0., y = 0., z = 0.; + if(gmsh_yyfactory == "OpenCASCADE" && GModel::current()->getOCCInternals()){ + GModel::current()->getOCCInternals()->getCenterOfMass((yyvsp[-3].i), (int)(yyvsp[-1].d), x, y, z); + } + else{ + yymsg(0, "CenterOfMass only available with OpenCASCADE geometry kernel"); + } + List_Add((yyval.l), &x); + List_Add((yyval.l), &y); + List_Add((yyval.l), &z); + } +#line 13097 "Gmsh.tab.cpp" /* yacc.c:1652 */ + break; + + case 523: +#line 5690 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = List_Create(List_Nbr((yyvsp[0].l)), 1, sizeof(double)); for(int i = 0; i < List_Nbr((yyvsp[0].l)); i++){ @@ -13032,11 +13107,11 @@ yyreduce: } List_Delete((yyvsp[0].l)); } -#line 13036 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13111 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 522: -#line 5682 "Gmsh.y" /* yacc.c:1652 */ + case 524: +#line 5700 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = List_Create(List_Nbr((yyvsp[0].l)), 1, sizeof(double)); for(int i = 0; i < List_Nbr((yyvsp[0].l)); i++){ @@ -13046,11 +13121,11 @@ yyreduce: } List_Delete((yyvsp[0].l)); } -#line 13050 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13125 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 523: -#line 5692 "Gmsh.y" /* yacc.c:1652 */ + case 525: +#line 5710 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = List_Create(List_Nbr((yyvsp[0].l)), 1, sizeof(double)); for(int i = 0; i < List_Nbr((yyvsp[0].l)); i++){ @@ -13060,11 +13135,11 @@ yyreduce: } List_Delete((yyvsp[0].l)); } -#line 13064 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13139 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 524: -#line 5702 "Gmsh.y" /* yacc.c:1652 */ + case 526: +#line 5720 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = List_Create(20, 20, sizeof(double)); if(!gmsh_yysymbols.count((yyvsp[-2].c))) @@ -13076,27 +13151,27 @@ yyreduce: } Free((yyvsp[-2].c)); } -#line 13080 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13155 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 525: -#line 5714 "Gmsh.y" /* yacc.c:1652 */ + case 527: +#line 5732 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = treat_Struct_FullName_dot_tSTRING_ListOfFloat(NULL, (yyvsp[-4].c), (yyvsp[-2].c)); } -#line 13088 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13163 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 526: -#line 5718 "Gmsh.y" /* yacc.c:1652 */ + case 528: +#line 5736 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = treat_Struct_FullName_dot_tSTRING_ListOfFloat((yyvsp[-6].c), (yyvsp[-4].c), (yyvsp[-2].c)); } -#line 13096 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13171 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 527: -#line 5723 "Gmsh.y" /* yacc.c:1652 */ + case 529: +#line 5741 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = List_Create(2, 1, sizeof(double)); if(!gmsh_yysymbols.count((yyvsp[-1].c))) @@ -13108,35 +13183,35 @@ yyreduce: } Free((yyvsp[-1].c)); } -#line 13112 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13187 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 528: -#line 5735 "Gmsh.y" /* yacc.c:1652 */ + case 530: +#line 5753 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = (yyvsp[-1].l); } -#line 13120 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13195 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 529: -#line 5739 "Gmsh.y" /* yacc.c:1652 */ + case 531: +#line 5757 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = (yyvsp[-1].l); } -#line 13128 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13203 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 530: -#line 5743 "Gmsh.y" /* yacc.c:1652 */ + case 532: +#line 5761 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = (yyvsp[-2].l); } -#line 13136 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13211 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 531: -#line 5747 "Gmsh.y" /* yacc.c:1652 */ + case 533: +#line 5765 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = List_Create(2, 1, sizeof(double)); if(!gmsh_yysymbols.count((yyvsp[-5].c))) @@ -13154,11 +13229,11 @@ yyreduce: Free((yyvsp[-5].c)); List_Delete((yyvsp[-2].l)); } -#line 13158 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13233 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 532: -#line 5765 "Gmsh.y" /* yacc.c:1652 */ + case 534: +#line 5783 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = List_Create(20,20,sizeof(double)); for(int i = 0; i < (int)(yyvsp[-1].d); i++) { @@ -13166,11 +13241,11 @@ yyreduce: List_Add((yyval.l), &d); } } -#line 13170 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13245 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 533: -#line 5773 "Gmsh.y" /* yacc.c:1652 */ + case 535: +#line 5791 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = List_Create(20,20,sizeof(double)); for(int i = 0; i < (int)(yyvsp[-1].d); i++) { @@ -13178,11 +13253,11 @@ yyreduce: List_Add((yyval.l), &d); } } -#line 13182 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13257 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 534: -#line 5781 "Gmsh.y" /* yacc.c:1652 */ + case 536: +#line 5799 "Gmsh.y" /* yacc.c:1652 */ { Msg::Barrier(); FILE *File; @@ -13211,11 +13286,11 @@ yyreduce: } Free((yyvsp[-1].c)); } -#line 13215 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13290 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 535: -#line 5810 "Gmsh.y" /* yacc.c:1652 */ + case 537: +#line 5828 "Gmsh.y" /* yacc.c:1652 */ { double x0 = (yyvsp[-11].d), x1 = (yyvsp[-9].d), y0 = (yyvsp[-7].d), y1 = (yyvsp[-5].d), ys = (yyvsp[-3].d); int N = (int)(yyvsp[-1].d); @@ -13225,11 +13300,11 @@ yyreduce: (yyval.l) = List_Create(N,10,sizeof(double)); for(int i = 0; i < N; i++) List_Add((yyval.l), &y[i]); } -#line 13229 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13304 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 536: -#line 5820 "Gmsh.y" /* yacc.c:1652 */ + case 538: +#line 5838 "Gmsh.y" /* yacc.c:1652 */ { std::vector<double> tmp; for(int i = 0; i < List_Nbr((yyvsp[-1].l)); i++){ @@ -13245,11 +13320,11 @@ yyreduce: List_Add((yyval.l), &tmp[i]); } } -#line 13249 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13324 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 537: -#line 5836 "Gmsh.y" /* yacc.c:1652 */ + case 539: +#line 5854 "Gmsh.y" /* yacc.c:1652 */ { for(int i = 0; i < List_Nbr((yyvsp[-1].l)); i++){ double *d = (double*)List_Pointer((yyvsp[-1].l), i); @@ -13257,36 +13332,36 @@ yyreduce: } (yyval.l) = (yyvsp[-1].l); } -#line 13261 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13336 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 538: -#line 5847 "Gmsh.y" /* yacc.c:1652 */ + case 540: +#line 5865 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = List_Create(2, 1, sizeof(double)); List_Add((yyval.l), &((yyvsp[0].d))); } -#line 13270 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13345 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 539: -#line 5852 "Gmsh.y" /* yacc.c:1652 */ + case 541: +#line 5870 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = (yyvsp[0].l); } -#line 13278 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13353 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 540: -#line 5856 "Gmsh.y" /* yacc.c:1652 */ + case 542: +#line 5874 "Gmsh.y" /* yacc.c:1652 */ { List_Add((yyval.l), &((yyvsp[0].d))); } -#line 13286 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13361 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 541: -#line 5860 "Gmsh.y" /* yacc.c:1652 */ + case 543: +#line 5878 "Gmsh.y" /* yacc.c:1652 */ { for(int i = 0; i < List_Nbr((yyvsp[0].l)); i++){ double d; @@ -13295,27 +13370,27 @@ yyreduce: } List_Delete((yyvsp[0].l)); } -#line 13299 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13374 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 542: -#line 5872 "Gmsh.y" /* yacc.c:1652 */ + case 544: +#line 5890 "Gmsh.y" /* yacc.c:1652 */ { (yyval.u) = CTX::instance()->packColor((int)(yyvsp[-7].d), (int)(yyvsp[-5].d), (int)(yyvsp[-3].d), (int)(yyvsp[-1].d)); } -#line 13307 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13382 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 543: -#line 5876 "Gmsh.y" /* yacc.c:1652 */ + case 545: +#line 5894 "Gmsh.y" /* yacc.c:1652 */ { (yyval.u) = CTX::instance()->packColor((int)(yyvsp[-5].d), (int)(yyvsp[-3].d), (int)(yyvsp[-1].d), 255); } -#line 13315 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13390 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 544: -#line 5888 "Gmsh.y" /* yacc.c:1652 */ + case 546: +#line 5906 "Gmsh.y" /* yacc.c:1652 */ { int flag = 0; if(gmsh_yystringsymbols.count((yyvsp[0].c))){ @@ -13332,30 +13407,30 @@ yyreduce: if(flag) yymsg(0, "Unknown color '%s'", (yyvsp[0].c)); Free((yyvsp[0].c)); } -#line 13336 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13411 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 545: -#line 5905 "Gmsh.y" /* yacc.c:1652 */ + case 547: +#line 5923 "Gmsh.y" /* yacc.c:1652 */ { unsigned int val = 0; ColorOption(GMSH_GET, (yyvsp[-4].c), 0, (yyvsp[0].c), val); (yyval.u) = val; Free((yyvsp[-4].c)); Free((yyvsp[0].c)); } -#line 13347 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13422 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 546: -#line 5915 "Gmsh.y" /* yacc.c:1652 */ + case 548: +#line 5933 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = (yyvsp[-1].l); } -#line 13355 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13430 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 547: -#line 5919 "Gmsh.y" /* yacc.c:1652 */ + case 549: +#line 5937 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = List_Create(256, 10, sizeof(unsigned int)); GmshColorTable *ct = GetColorTable((int)(yyvsp[-3].d)); @@ -13367,45 +13442,45 @@ yyreduce: } Free((yyvsp[-5].c)); } -#line 13371 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13446 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 548: -#line 5934 "Gmsh.y" /* yacc.c:1652 */ + case 550: +#line 5952 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = List_Create(256, 10, sizeof(unsigned int)); List_Add((yyval.l), &((yyvsp[0].u))); } -#line 13380 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13455 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 549: -#line 5939 "Gmsh.y" /* yacc.c:1652 */ + case 551: +#line 5957 "Gmsh.y" /* yacc.c:1652 */ { List_Add((yyval.l), &((yyvsp[0].u))); } -#line 13388 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13463 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 550: -#line 5946 "Gmsh.y" /* yacc.c:1652 */ + case 552: +#line 5964 "Gmsh.y" /* yacc.c:1652 */ { (yyval.c) = (yyvsp[0].c); } -#line 13396 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13471 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 551: -#line 5950 "Gmsh.y" /* yacc.c:1652 */ + case 553: +#line 5968 "Gmsh.y" /* yacc.c:1652 */ { // No need to extend to Struct_FullName (a Tag is not a String) (yyval.c) = treat_Struct_FullName_String(NULL, (yyvsp[0].c)); } -#line 13405 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13480 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 552: -#line 5955 "Gmsh.y" /* yacc.c:1652 */ + case 554: +#line 5973 "Gmsh.y" /* yacc.c:1652 */ { std::string val; int j = (int)(yyvsp[-1].d); @@ -13419,11 +13494,11 @@ yyreduce: strcpy((yyval.c), val.c_str()); Free((yyvsp[-3].c)); } -#line 13423 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13498 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 553: -#line 5969 "Gmsh.y" /* yacc.c:1652 */ + case 555: +#line 5987 "Gmsh.y" /* yacc.c:1652 */ { std::string val; int j = (int)(yyvsp[-1].d); @@ -13437,43 +13512,43 @@ yyreduce: strcpy((yyval.c), val.c_str()); Free((yyvsp[-3].c)); } -#line 13441 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13516 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 554: -#line 5985 "Gmsh.y" /* yacc.c:1652 */ + case 556: +#line 6003 "Gmsh.y" /* yacc.c:1652 */ { (yyval.c) = treat_Struct_FullName_dot_tSTRING_String(NULL, (yyvsp[-2].c), (yyvsp[0].c)); } -#line 13449 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13524 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 555: -#line 5989 "Gmsh.y" /* yacc.c:1652 */ + case 557: +#line 6007 "Gmsh.y" /* yacc.c:1652 */ { (yyval.c) = treat_Struct_FullName_dot_tSTRING_String((yyvsp[-4].c), (yyvsp[-2].c), (yyvsp[0].c)); } -#line 13457 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13532 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 556: -#line 5993 "Gmsh.y" /* yacc.c:1652 */ + case 558: +#line 6011 "Gmsh.y" /* yacc.c:1652 */ { (yyval.c) = treat_Struct_FullName_dot_tSTRING_String(NULL, (yyvsp[-5].c), (yyvsp[-3].c), (int)(yyvsp[-1].d)); } -#line 13465 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13540 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 557: -#line 5997 "Gmsh.y" /* yacc.c:1652 */ + case 559: +#line 6015 "Gmsh.y" /* yacc.c:1652 */ { (yyval.c) = treat_Struct_FullName_dot_tSTRING_String((yyvsp[-7].c), (yyvsp[-5].c), (yyvsp[-3].c), (int)(yyvsp[-1].d)); } -#line 13473 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13548 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 558: -#line 6001 "Gmsh.y" /* yacc.c:1652 */ + case 560: +#line 6019 "Gmsh.y" /* yacc.c:1652 */ { std::string out; StringOption(GMSH_GET, (yyvsp[-5].c), (int)(yyvsp[-3].d), (yyvsp[0].c), out); @@ -13481,47 +13556,47 @@ yyreduce: strcpy((yyval.c), out.c_str()); Free((yyvsp[-5].c)); Free((yyvsp[0].c)); } -#line 13485 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13560 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 559: -#line 6009 "Gmsh.y" /* yacc.c:1652 */ + case 561: +#line 6027 "Gmsh.y" /* yacc.c:1652 */ { std::string name = GModel::current()->getElementaryName((yyvsp[-3].i), (int)(yyvsp[-1].d)); (yyval.c) = (char*)Malloc((name.size() + 1) * sizeof(char)); strcpy((yyval.c), name.c_str()); } -#line 13495 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13570 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 560: -#line 6015 "Gmsh.y" /* yacc.c:1652 */ + case 562: +#line 6033 "Gmsh.y" /* yacc.c:1652 */ { std::string name = GModel::current()->getPhysicalName((yyvsp[-3].i), (int)(yyvsp[-1].d)); (yyval.c) = (char*)Malloc((name.size() + 1) * sizeof(char)); strcpy((yyval.c), name.c_str()); } -#line 13505 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13580 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 561: -#line 6024 "Gmsh.y" /* yacc.c:1652 */ + case 563: +#line 6042 "Gmsh.y" /* yacc.c:1652 */ { (yyval.c) = (yyvsp[0].c); } -#line 13513 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13588 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 562: -#line 6028 "Gmsh.y" /* yacc.c:1652 */ + case 564: +#line 6046 "Gmsh.y" /* yacc.c:1652 */ { (yyval.c) = (yyvsp[-1].c); } -#line 13521 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13596 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 563: -#line 6032 "Gmsh.y" /* yacc.c:1652 */ + case 565: +#line 6050 "Gmsh.y" /* yacc.c:1652 */ { (yyval.c) = (char *)Malloc(32 * sizeof(char)); time_t now; @@ -13529,39 +13604,39 @@ yyreduce: strcpy((yyval.c), ctime(&now)); (yyval.c)[strlen((yyval.c)) - 1] = '\0'; } -#line 13533 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13608 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 564: -#line 6040 "Gmsh.y" /* yacc.c:1652 */ + case 566: +#line 6058 "Gmsh.y" /* yacc.c:1652 */ { std::string exe = Msg::GetExecutableName(); (yyval.c) = (char *)Malloc(exe.size() + 1); strcpy((yyval.c), exe.c_str()); } -#line 13543 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13618 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 565: -#line 6046 "Gmsh.y" /* yacc.c:1652 */ + case 567: +#line 6064 "Gmsh.y" /* yacc.c:1652 */ { std::string action = Msg::GetOnelabAction(); (yyval.c) = (char *)Malloc(action.size() + 1); strcpy((yyval.c), action.c_str()); } -#line 13553 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13628 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 566: -#line 6052 "Gmsh.y" /* yacc.c:1652 */ + case 568: +#line 6070 "Gmsh.y" /* yacc.c:1652 */ { (yyval.c) = strsave((char*)"Gmsh"); } -#line 13561 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13636 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 567: -#line 6056 "Gmsh.y" /* yacc.c:1652 */ + case 569: +#line 6074 "Gmsh.y" /* yacc.c:1652 */ { const char *env = GetEnvironmentVar((yyvsp[-1].c)); if(!env) env = ""; @@ -13569,11 +13644,11 @@ yyreduce: strcpy((yyval.c), env); Free((yyvsp[-1].c)); } -#line 13573 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13648 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 568: -#line 6064 "Gmsh.y" /* yacc.c:1652 */ + case 570: +#line 6082 "Gmsh.y" /* yacc.c:1652 */ { std::string s = Msg::GetString((yyvsp[-3].c), (yyvsp[-1].c)); (yyval.c) = (char *)Malloc((s.size() + 1) * sizeof(char)); @@ -13581,22 +13656,22 @@ yyreduce: Free((yyvsp[-3].c)); Free((yyvsp[-1].c)); } -#line 13585 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13660 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 569: -#line 6072 "Gmsh.y" /* yacc.c:1652 */ + case 571: +#line 6090 "Gmsh.y" /* yacc.c:1652 */ { std::string s = Msg::GetOnelabString((yyvsp[-1].c)); (yyval.c) = (char *)Malloc((s.size() + 1) * sizeof(char)); strcpy((yyval.c), s.c_str()); Free((yyvsp[-1].c)); } -#line 13596 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13671 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 570: -#line 6079 "Gmsh.y" /* yacc.c:1652 */ + case 572: +#line 6097 "Gmsh.y" /* yacc.c:1652 */ { std::string s = Msg::GetOnelabString((yyvsp[-3].c), (yyvsp[-1].c)); (yyval.c) = (char *)Malloc((s.size() + 1) * sizeof(char)); @@ -13604,27 +13679,27 @@ yyreduce: Free((yyvsp[-3].c)); Free((yyvsp[-1].c)); } -#line 13608 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13683 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 571: -#line 6088 "Gmsh.y" /* yacc.c:1652 */ + case 573: +#line 6106 "Gmsh.y" /* yacc.c:1652 */ { (yyval.c) = treat_Struct_FullName_String(NULL, (yyvsp[-2].c2).char2, 1, 0, (yyvsp[-1].c), 2); } -#line 13616 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13691 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 572: -#line 6092 "Gmsh.y" /* yacc.c:1652 */ + case 574: +#line 6110 "Gmsh.y" /* yacc.c:1652 */ { (yyval.c) = treat_Struct_FullName_dot_tSTRING_String((yyvsp[-4].c2).char1, (yyvsp[-4].c2).char2, (yyvsp[-2].c), 0, (yyvsp[-1].c), 2); } -#line 13624 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13699 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 573: -#line 6096 "Gmsh.y" /* yacc.c:1652 */ + case 575: +#line 6114 "Gmsh.y" /* yacc.c:1652 */ { int size = 1; for(int i = 0; i < List_Nbr((yyvsp[-1].l)); i++) @@ -13639,11 +13714,11 @@ yyreduce: } List_Delete((yyvsp[-1].l)); } -#line 13643 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13718 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 574: -#line 6111 "Gmsh.y" /* yacc.c:1652 */ + case 576: +#line 6129 "Gmsh.y" /* yacc.c:1652 */ { (yyval.c) = (char *)Malloc((strlen((yyvsp[-1].c)) + 1) * sizeof(char)); int i; @@ -13657,11 +13732,11 @@ yyreduce: if(i <= 0) strcpy((yyval.c), (yyvsp[-1].c)); Free((yyvsp[-1].c)); } -#line 13661 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13736 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 575: -#line 6125 "Gmsh.y" /* yacc.c:1652 */ + case 577: +#line 6143 "Gmsh.y" /* yacc.c:1652 */ { (yyval.c) = (char *)Malloc((strlen((yyvsp[-1].c)) + 1) * sizeof(char)); int i; @@ -13675,11 +13750,11 @@ yyreduce: strcpy((yyval.c), &(yyvsp[-1].c)[i+1]); Free((yyvsp[-1].c)); } -#line 13679 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13754 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 576: -#line 6139 "Gmsh.y" /* yacc.c:1652 */ + case 578: +#line 6157 "Gmsh.y" /* yacc.c:1652 */ { std::string input = (yyvsp[-5].c); std::string substr_old = (yyvsp[-3].c); @@ -13691,11 +13766,11 @@ yyreduce: Free((yyvsp[-3].c)); Free((yyvsp[-1].c)); } -#line 13695 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13770 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 577: -#line 6151 "Gmsh.y" /* yacc.c:1652 */ + case 579: +#line 6169 "Gmsh.y" /* yacc.c:1652 */ { int size = 1; for(int i = 0; i < List_Nbr((yyvsp[-1].l)); i++) @@ -13711,11 +13786,11 @@ yyreduce: } List_Delete((yyvsp[-1].l)); } -#line 13715 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13790 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 578: -#line 6167 "Gmsh.y" /* yacc.c:1652 */ + case 580: +#line 6185 "Gmsh.y" /* yacc.c:1652 */ { int i = 0; while ((yyvsp[-1].c)[i]) { @@ -13724,11 +13799,11 @@ yyreduce: } (yyval.c) = (yyvsp[-1].c); } -#line 13728 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13803 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 579: -#line 6176 "Gmsh.y" /* yacc.c:1652 */ + case 581: +#line 6194 "Gmsh.y" /* yacc.c:1652 */ { int i = 0; while ((yyvsp[-1].c)[i]) { @@ -13737,11 +13812,11 @@ yyreduce: } (yyval.c) = (yyvsp[-1].c); } -#line 13741 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13816 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 580: -#line 6185 "Gmsh.y" /* yacc.c:1652 */ + case 582: +#line 6203 "Gmsh.y" /* yacc.c:1652 */ { int i = 0; while ((yyvsp[-1].c)[i]) { @@ -13751,11 +13826,11 @@ yyreduce: } (yyval.c) = (yyvsp[-1].c); } -#line 13755 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13830 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 581: -#line 6195 "Gmsh.y" /* yacc.c:1652 */ + case 583: +#line 6213 "Gmsh.y" /* yacc.c:1652 */ { if((yyvsp[-5].d)){ (yyval.c) = (yyvsp[-3].c); @@ -13766,11 +13841,11 @@ yyreduce: Free((yyvsp[-3].c)); } } -#line 13770 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13845 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 582: -#line 6206 "Gmsh.y" /* yacc.c:1652 */ + case 584: +#line 6224 "Gmsh.y" /* yacc.c:1652 */ { std::string in = (yyvsp[-5].c); std::string out = in.substr((int)(yyvsp[-3].d), (int)(yyvsp[-1].d)); @@ -13778,11 +13853,11 @@ yyreduce: strcpy((yyval.c), out.c_str()); Free((yyvsp[-5].c)); } -#line 13782 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13857 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 583: -#line 6214 "Gmsh.y" /* yacc.c:1652 */ + case 585: +#line 6232 "Gmsh.y" /* yacc.c:1652 */ { std::string in = (yyvsp[-3].c); std::string out = in.substr((int)(yyvsp[-1].d), std::string::npos); @@ -13790,19 +13865,19 @@ yyreduce: strcpy((yyval.c), out.c_str()); Free((yyvsp[-3].c)); } -#line 13794 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13869 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 584: -#line 6222 "Gmsh.y" /* yacc.c:1652 */ + case 586: +#line 6240 "Gmsh.y" /* yacc.c:1652 */ { (yyval.c) = (yyvsp[-1].c); } -#line 13802 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13877 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 585: -#line 6226 "Gmsh.y" /* yacc.c:1652 */ + case 587: +#line 6244 "Gmsh.y" /* yacc.c:1652 */ { char tmpstring[5000]; int i = printListOfDouble((yyvsp[-3].c), (yyvsp[-1].l), tmpstring); @@ -13821,60 +13896,60 @@ yyreduce: } List_Delete((yyvsp[-1].l)); } -#line 13825 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13900 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 586: -#line 6245 "Gmsh.y" /* yacc.c:1652 */ + case 588: +#line 6263 "Gmsh.y" /* yacc.c:1652 */ { std::string tmp = FixRelativePath(gmsh_yyname, (yyvsp[-1].c)); (yyval.c) = (char*)Malloc((tmp.size() + 1) * sizeof(char)); strcpy((yyval.c), tmp.c_str()); Free((yyvsp[-1].c)); } -#line 13836 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13911 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 587: -#line 6252 "Gmsh.y" /* yacc.c:1652 */ + case 589: +#line 6270 "Gmsh.y" /* yacc.c:1652 */ { std::string tmp = SplitFileName(GetAbsolutePath(gmsh_yyname))[0]; (yyval.c) = (char*)Malloc((tmp.size() + 1) * sizeof(char)); strcpy((yyval.c), tmp.c_str()); } -#line 13846 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13921 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 588: -#line 6258 "Gmsh.y" /* yacc.c:1652 */ + case 590: +#line 6276 "Gmsh.y" /* yacc.c:1652 */ { std::string tmp = SplitFileName((yyvsp[-1].c))[0]; (yyval.c) = (char*)Malloc((tmp.size() + 1) * sizeof(char)); strcpy((yyval.c), tmp.c_str()); Free((yyvsp[-1].c)); } -#line 13857 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13932 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 589: -#line 6265 "Gmsh.y" /* yacc.c:1652 */ + case 591: +#line 6283 "Gmsh.y" /* yacc.c:1652 */ { std::string tmp = GetAbsolutePath((yyvsp[-1].c)); (yyval.c) = (char*)Malloc((tmp.size() + 1) * sizeof(char)); strcpy((yyval.c), tmp.c_str()); Free((yyvsp[-1].c)); } -#line 13868 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13943 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 590: -#line 6272 "Gmsh.y" /* yacc.c:1652 */ + case 592: +#line 6290 "Gmsh.y" /* yacc.c:1652 */ { init_options(); } -#line 13874 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13949 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 591: -#line 6274 "Gmsh.y" /* yacc.c:1652 */ + case 593: +#line 6292 "Gmsh.y" /* yacc.c:1652 */ { std::string val((yyvsp[-3].c)); Msg::ExchangeOnelabParameter("", val, floatOptions, charOptions); @@ -13882,11 +13957,11 @@ yyreduce: strcpy((yyval.c), val.c_str()); Free((yyvsp[-3].c)); } -#line 13886 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13961 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 592: -#line 6282 "Gmsh.y" /* yacc.c:1652 */ + case 594: +#line 6300 "Gmsh.y" /* yacc.c:1652 */ { std::string out; const std::string * key_struct = NULL; @@ -13907,70 +13982,70 @@ yyreduce: (yyval.c) = (char*)Malloc((out.size() + 1) * sizeof(char)); strcpy((yyval.c), out.c_str()); } -#line 13911 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13986 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 593: -#line 6306 "Gmsh.y" /* yacc.c:1652 */ + case 595: +#line 6324 "Gmsh.y" /* yacc.c:1652 */ { struct_namespace = std::string(""); (yyval.d) = (yyvsp[0].d); } -#line 13917 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13992 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 594: -#line 6308 "Gmsh.y" /* yacc.c:1652 */ + case 596: +#line 6326 "Gmsh.y" /* yacc.c:1652 */ { struct_namespace = (yyvsp[-3].c); Free((yyvsp[-3].c)); (yyval.d) = (yyvsp[0].d); } -#line 13923 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 13998 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 595: -#line 6314 "Gmsh.y" /* yacc.c:1652 */ + case 597: +#line 6332 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = (yyvsp[-1].l); } -#line 13929 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 14004 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 596: -#line 6319 "Gmsh.y" /* yacc.c:1652 */ + case 598: +#line 6337 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = (yyvsp[0].l); } -#line 13935 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 14010 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 597: -#line 6321 "Gmsh.y" /* yacc.c:1652 */ + case 599: +#line 6339 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = (yyvsp[0].l); } -#line 13941 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 14016 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 598: -#line 6326 "Gmsh.y" /* yacc.c:1652 */ + case 600: +#line 6344 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = (yyvsp[-1].l); } -#line 13947 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 14022 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 599: -#line 6331 "Gmsh.y" /* yacc.c:1652 */ + case 601: +#line 6349 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = List_Create(20,20,sizeof(char*)); List_Add((yyval.l), &((yyvsp[0].c))); } -#line 13956 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 14031 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 600: -#line 6336 "Gmsh.y" /* yacc.c:1652 */ + case 602: +#line 6354 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = (yyvsp[0].l); } -#line 13962 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 14037 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 601: -#line 6338 "Gmsh.y" /* yacc.c:1652 */ + case 603: +#line 6356 "Gmsh.y" /* yacc.c:1652 */ { List_Add((yyval.l), &((yyvsp[0].c))); } -#line 13970 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 14045 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 602: -#line 6342 "Gmsh.y" /* yacc.c:1652 */ + case 604: +#line 6360 "Gmsh.y" /* yacc.c:1652 */ { for(int i = 0; i < List_Nbr((yyvsp[0].l)); i++){ char* c; @@ -13979,11 +14054,11 @@ yyreduce: } List_Delete((yyvsp[0].l)); } -#line 13983 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 14058 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 603: -#line 6354 "Gmsh.y" /* yacc.c:1652 */ + case 605: +#line 6372 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = List_Create(20, 20, sizeof(char *)); if(!gmsh_yystringsymbols.count((yyvsp[-2].c))) @@ -13997,27 +14072,27 @@ yyreduce: } Free((yyvsp[-2].c)); } -#line 14001 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 14076 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 604: -#line 6368 "Gmsh.y" /* yacc.c:1652 */ + case 606: +#line 6386 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = treat_Struct_FullName_dot_tSTRING_ListOfString(NULL, (yyvsp[-4].c), (yyvsp[-2].c)); } -#line 14009 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 14084 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 605: -#line 6372 "Gmsh.y" /* yacc.c:1652 */ + case 607: +#line 6390 "Gmsh.y" /* yacc.c:1652 */ { (yyval.l) = treat_Struct_FullName_dot_tSTRING_ListOfString((yyvsp[-6].c), (yyvsp[-4].c), (yyvsp[-2].c)); } -#line 14017 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 14092 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 606: -#line 6379 "Gmsh.y" /* yacc.c:1652 */ + case 608: +#line 6397 "Gmsh.y" /* yacc.c:1652 */ { char tmpstr[256]; sprintf(tmpstr, "_%d", (int)(yyvsp[-1].d)); @@ -14025,11 +14100,11 @@ yyreduce: strcpy((yyval.c), (yyvsp[-4].c)); strcat((yyval.c), tmpstr); Free((yyvsp[-4].c)); } -#line 14029 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 14104 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 607: -#line 6387 "Gmsh.y" /* yacc.c:1652 */ + case 609: +#line 6405 "Gmsh.y" /* yacc.c:1652 */ { char tmpstr[256]; sprintf(tmpstr, "_%d", (int)(yyvsp[-1].d)); @@ -14037,11 +14112,11 @@ yyreduce: strcpy((yyval.c), (yyvsp[-4].c)) ; strcat((yyval.c), tmpstr) ; Free((yyvsp[-4].c)); } -#line 14041 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 14116 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 608: -#line 6395 "Gmsh.y" /* yacc.c:1652 */ + case 610: +#line 6413 "Gmsh.y" /* yacc.c:1652 */ { char tmpstr[256]; sprintf(tmpstr, "_%d", (int)(yyvsp[-1].d)); @@ -14049,29 +14124,29 @@ yyreduce: strcpy((yyval.c), (yyvsp[-5].c)); strcat((yyval.c), tmpstr); Free((yyvsp[-5].c)); } -#line 14053 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 14128 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 609: -#line 6406 "Gmsh.y" /* yacc.c:1652 */ + case 611: +#line 6424 "Gmsh.y" /* yacc.c:1652 */ { (yyval.c) = (yyvsp[0].c); } -#line 14059 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 14134 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 610: -#line 6408 "Gmsh.y" /* yacc.c:1652 */ + case 612: +#line 6426 "Gmsh.y" /* yacc.c:1652 */ { (yyval.c) = (yyvsp[0].c); } -#line 14065 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 14140 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; - case 611: -#line 6411 "Gmsh.y" /* yacc.c:1652 */ + case 613: +#line 6429 "Gmsh.y" /* yacc.c:1652 */ { (yyval.c) = (yyvsp[-1].c); } -#line 14071 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 14146 "Gmsh.tab.cpp" /* yacc.c:1652 */ break; -#line 14075 "Gmsh.tab.cpp" /* yacc.c:1652 */ +#line 14150 "Gmsh.tab.cpp" /* yacc.c:1652 */ default: break; } /* User semantic actions sometimes alter yychar, and that requires @@ -14302,7 +14377,7 @@ yyreturn: #endif return yyresult; } -#line 6414 "Gmsh.y" /* yacc.c:1918 */ +#line 6432 "Gmsh.y" /* yacc.c:1918 */ void assignVariable(const std::string &name, int index, int assignType, diff --git a/Parser/Gmsh.tab.hpp b/Parser/Gmsh.tab.hpp index dd60813593a912c10887eaa15828151212ebefc1..ed0b210f09d230e2e1c0676eaf550e9d5393cae4 100644 --- a/Parser/Gmsh.tab.hpp +++ b/Parser/Gmsh.tab.hpp @@ -118,166 +118,168 @@ extern int gmsh_yydebug; tCurrentDirectory = 324, tSyncModel = 325, tNewModel = 326, - tOnelabAction = 327, - tOnelabRun = 328, - tCodeName = 329, - tCpu = 330, - tMemory = 331, - tTotalMemory = 332, - tCreateTopology = 333, - tCreateGeometry = 334, - tRenumberMeshNodes = 335, - tRenumberMeshElements = 336, - tDistanceFunction = 337, - tDefineConstant = 338, - tUndefineConstant = 339, - tDefineNumber = 340, - tDefineStruct = 341, - tNameStruct = 342, - tDimNameSpace = 343, - tAppend = 344, - tDefineString = 345, - tSetNumber = 346, - tSetTag = 347, - tSetString = 348, - tPoint = 349, - tCircle = 350, - tEllipse = 351, - tCurve = 352, - tSphere = 353, - tPolarSphere = 354, - tSurface = 355, - tSpline = 356, - tVolume = 357, - tBox = 358, - tCylinder = 359, - tCone = 360, - tTorus = 361, - tEllipsoid = 362, - tQuadric = 363, - tShapeFromFile = 364, - tRectangle = 365, - tDisk = 366, - tWire = 367, - tGeoEntity = 368, - tCharacteristic = 369, - tLength = 370, - tParametric = 371, - tElliptic = 372, - tRefineMesh = 373, - tAdaptMesh = 374, - tRelocateMesh = 375, - tReorientMesh = 376, - tSetFactory = 377, - tThruSections = 378, - tWedge = 379, - tFillet = 380, - tChamfer = 381, - tPlane = 382, - tRuled = 383, - tTransfinite = 384, - tPhysical = 385, - tCompound = 386, - tPeriodic = 387, - tParent = 388, - tUsing = 389, - tPlugin = 390, - tDegenerated = 391, - tRecursive = 392, - tRotate = 393, - tTranslate = 394, - tSymmetry = 395, - tDilate = 396, - tExtrude = 397, - tLevelset = 398, - tAffine = 399, - tBooleanUnion = 400, - tBooleanIntersection = 401, - tBooleanDifference = 402, - tBooleanSection = 403, - tBooleanFragments = 404, - tThickSolid = 405, - tRecombine = 406, - tSmoother = 407, - tSplit = 408, - tDelete = 409, - tCoherence = 410, - tIntersect = 411, - tMeshAlgorithm = 412, - tReverseMesh = 413, - tLayers = 414, - tScaleLast = 415, - tHole = 416, - tAlias = 417, - tAliasWithOptions = 418, - tCopyOptions = 419, - tQuadTriAddVerts = 420, - tQuadTriNoNewVerts = 421, - tRecombLaterals = 422, - tTransfQuadTri = 423, - tText2D = 424, - tText3D = 425, - tInterpolationScheme = 426, - tTime = 427, - tCombine = 428, - tBSpline = 429, - tBezier = 430, - tNurbs = 431, - tNurbsOrder = 432, - tNurbsKnots = 433, - tColor = 434, - tColorTable = 435, - tFor = 436, - tIn = 437, - tEndFor = 438, - tIf = 439, - tElseIf = 440, - tElse = 441, - tEndIf = 442, - tExit = 443, - tAbort = 444, - tField = 445, - tReturn = 446, - tCall = 447, - tSlide = 448, - tMacro = 449, - tShow = 450, - tHide = 451, - tGetValue = 452, - tGetStringValue = 453, - tGetEnv = 454, - tGetString = 455, - tGetNumber = 456, - tUnique = 457, - tHomology = 458, - tCohomology = 459, - tBetti = 460, - tExists = 461, - tFileExists = 462, - tGetForced = 463, - tGetForcedStr = 464, - tGMSH_MAJOR_VERSION = 465, - tGMSH_MINOR_VERSION = 466, - tGMSH_PATCH_VERSION = 467, - tGmshExecutableName = 468, - tSetPartition = 469, - tNameToString = 470, - tStringToName = 471, - tAFFECTPLUS = 472, - tAFFECTMINUS = 473, - tAFFECTTIMES = 474, - tAFFECTDIVIDE = 475, - tOR = 476, - tAND = 477, - tEQUAL = 478, - tNOTEQUAL = 479, - tLESSOREQUAL = 480, - tGREATEROREQUAL = 481, - tLESSLESS = 482, - tGREATERGREATER = 483, - tPLUSPLUS = 484, - tMINUSMINUS = 485, - UNARYPREC = 486 + tMass = 327, + tCenterOfMass = 328, + tOnelabAction = 329, + tOnelabRun = 330, + tCodeName = 331, + tCpu = 332, + tMemory = 333, + tTotalMemory = 334, + tCreateTopology = 335, + tCreateGeometry = 336, + tRenumberMeshNodes = 337, + tRenumberMeshElements = 338, + tDistanceFunction = 339, + tDefineConstant = 340, + tUndefineConstant = 341, + tDefineNumber = 342, + tDefineStruct = 343, + tNameStruct = 344, + tDimNameSpace = 345, + tAppend = 346, + tDefineString = 347, + tSetNumber = 348, + tSetTag = 349, + tSetString = 350, + tPoint = 351, + tCircle = 352, + tEllipse = 353, + tCurve = 354, + tSphere = 355, + tPolarSphere = 356, + tSurface = 357, + tSpline = 358, + tVolume = 359, + tBox = 360, + tCylinder = 361, + tCone = 362, + tTorus = 363, + tEllipsoid = 364, + tQuadric = 365, + tShapeFromFile = 366, + tRectangle = 367, + tDisk = 368, + tWire = 369, + tGeoEntity = 370, + tCharacteristic = 371, + tLength = 372, + tParametric = 373, + tElliptic = 374, + tRefineMesh = 375, + tAdaptMesh = 376, + tRelocateMesh = 377, + tReorientMesh = 378, + tSetFactory = 379, + tThruSections = 380, + tWedge = 381, + tFillet = 382, + tChamfer = 383, + tPlane = 384, + tRuled = 385, + tTransfinite = 386, + tPhysical = 387, + tCompound = 388, + tPeriodic = 389, + tParent = 390, + tUsing = 391, + tPlugin = 392, + tDegenerated = 393, + tRecursive = 394, + tRotate = 395, + tTranslate = 396, + tSymmetry = 397, + tDilate = 398, + tExtrude = 399, + tLevelset = 400, + tAffine = 401, + tBooleanUnion = 402, + tBooleanIntersection = 403, + tBooleanDifference = 404, + tBooleanSection = 405, + tBooleanFragments = 406, + tThickSolid = 407, + tRecombine = 408, + tSmoother = 409, + tSplit = 410, + tDelete = 411, + tCoherence = 412, + tIntersect = 413, + tMeshAlgorithm = 414, + tReverseMesh = 415, + tLayers = 416, + tScaleLast = 417, + tHole = 418, + tAlias = 419, + tAliasWithOptions = 420, + tCopyOptions = 421, + tQuadTriAddVerts = 422, + tQuadTriNoNewVerts = 423, + tRecombLaterals = 424, + tTransfQuadTri = 425, + tText2D = 426, + tText3D = 427, + tInterpolationScheme = 428, + tTime = 429, + tCombine = 430, + tBSpline = 431, + tBezier = 432, + tNurbs = 433, + tNurbsOrder = 434, + tNurbsKnots = 435, + tColor = 436, + tColorTable = 437, + tFor = 438, + tIn = 439, + tEndFor = 440, + tIf = 441, + tElseIf = 442, + tElse = 443, + tEndIf = 444, + tExit = 445, + tAbort = 446, + tField = 447, + tReturn = 448, + tCall = 449, + tSlide = 450, + tMacro = 451, + tShow = 452, + tHide = 453, + tGetValue = 454, + tGetStringValue = 455, + tGetEnv = 456, + tGetString = 457, + tGetNumber = 458, + tUnique = 459, + tHomology = 460, + tCohomology = 461, + tBetti = 462, + tExists = 463, + tFileExists = 464, + tGetForced = 465, + tGetForcedStr = 466, + tGMSH_MAJOR_VERSION = 467, + tGMSH_MINOR_VERSION = 468, + tGMSH_PATCH_VERSION = 469, + tGmshExecutableName = 470, + tSetPartition = 471, + tNameToString = 472, + tStringToName = 473, + tAFFECTPLUS = 474, + tAFFECTMINUS = 475, + tAFFECTTIMES = 476, + tAFFECTDIVIDE = 477, + tOR = 478, + tAND = 479, + tEQUAL = 480, + tNOTEQUAL = 481, + tLESSOREQUAL = 482, + tGREATEROREQUAL = 483, + tLESSLESS = 484, + tGREATERGREATER = 485, + tPLUSPLUS = 486, + tMINUSMINUS = 487, + UNARYPREC = 488 }; #endif @@ -297,7 +299,7 @@ union YYSTYPE List_T *l; struct TwoChar c2; -#line 301 "Gmsh.tab.hpp" /* yacc.c:1921 */ +#line 303 "Gmsh.tab.hpp" /* yacc.c:1921 */ }; typedef union YYSTYPE YYSTYPE; diff --git a/Parser/Gmsh.y b/Parser/Gmsh.y index bc7cebe928f6c232840d2d30c66ef8e3c382a9cc..d72e02bfbcadb8a33c39b24326a611a05e7924e3 100644 --- a/Parser/Gmsh.y +++ b/Parser/Gmsh.y @@ -187,7 +187,7 @@ struct doubleXstring{ %token tFind tStrFind tStrCmp tStrChoice tUpperCase tLowerCase tLowerCaseIn %token tTextAttributes %token tBoundingBox tDraw tSetChanged tToday tFixRelativePath tCurrentDirectory -%token tSyncModel tNewModel +%token tSyncModel tNewModel tMass tCenterOfMass %token tOnelabAction tOnelabRun tCodeName %token tCpu tMemory tTotalMemory %token tCreateTopology tCreateGeometry tRenumberMeshNodes tRenumberMeshElements @@ -5177,12 +5177,10 @@ FExpr_Single : } Free($2); } - | '#' Struct_FullName '.' tSTRING_Member LP RP { $$ = treat_Struct_FullName_dot_tSTRING_Float_getDim($2.char1, $2.char2, $4); } - | tDimNameSpace LP String__Index RP { std::string struct_namespace($3); @@ -5194,7 +5192,6 @@ FExpr_Single : std::string struct_namespace(std::string("")); $$ = (double)gmsh_yynamespaces[struct_namespace].size(); } - | String__Index NumericIncrement { if(!gmsh_yysymbols.count($1)){ @@ -5234,7 +5231,6 @@ FExpr_Single : } Free($1); } - | String__Index '(' FExpr ')' NumericIncrement { int index = (int)$3; @@ -5255,7 +5251,6 @@ FExpr_Single : } Free($1); } - // Option Strings /* not any more ... | tSTRING '.' tSTRING @@ -5264,7 +5259,6 @@ FExpr_Single : Free($1); Free($3); } */ - //+++ ... extention to structures // PD: TO FIX (to avoid shift/reduce conflict) // | Struct_FullName '.' tSTRING_Member @@ -5276,7 +5270,6 @@ FExpr_Single : { $$ = treat_Struct_FullName_dot_tSTRING_Float($1, $3, $5); } - | String__Index '.' tSTRING_Member '(' FExpr ')' { $$ = treat_Struct_FullName_dot_tSTRING_Float(NULL, $1, $3, (int)$5); @@ -5293,7 +5286,6 @@ FExpr_Single : { $$ = treat_Struct_FullName_dot_tSTRING_Float($1, $3, $5, (int)$7); } - | String__Index '[' FExpr ']' '.' tSTRING { NumberOption(GMSH_GET, $1, (int)$3, $6, $$); @@ -5668,6 +5660,32 @@ FExpr_Multi : getBoundingBox($2, $4, $$); List_Delete($4); } + | tMass GeoEntity123 '{' FExpr '}' + { + $$ = List_Create(1, 1, sizeof(double)); + double m = 0; + if(gmsh_yyfactory == "OpenCASCADE" && GModel::current()->getOCCInternals()){ + GModel::current()->getOCCInternals()->getMass($2, (int)$4, m); + } + else{ + yymsg(0, "Mass only available with OpenCASCADE geometry kernel"); + } + List_Add($$, &m); + } + | tCenterOfMass GeoEntity123 '{' FExpr '}' + { + $$ = List_Create(3, 1, sizeof(double)); + double x = 0., y = 0., z = 0.; + if(gmsh_yyfactory == "OpenCASCADE" && GModel::current()->getOCCInternals()){ + GModel::current()->getOCCInternals()->getCenterOfMass($2, (int)$4, x, y, z); + } + else{ + yymsg(0, "CenterOfMass only available with OpenCASCADE geometry kernel"); + } + List_Add($$, &x); + List_Add($$, &y); + List_Add($$, &z); + } | Transform { $$ = List_Create(List_Nbr($1), 1, sizeof(double)); diff --git a/Parser/Gmsh.yy.cpp b/Parser/Gmsh.yy.cpp index 35da2631817eeefcea241f60ca55593e4ee49524..252846becac7942cda630e3409ad14ca4b79dd9e 100644 --- a/Parser/Gmsh.yy.cpp +++ b/Parser/Gmsh.yy.cpp @@ -611,8 +611,8 @@ static void yynoreturn yy_fatal_error ( const char* msg ); (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; -#define YY_NUM_RULES 263 -#define YY_END_OF_BUFFER 264 +#define YY_NUM_RULES 265 +#define YY_END_OF_BUFFER 266 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info @@ -620,156 +620,157 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static const flex_int16_t yy_accept[1345] = +static const flex_int16_t yy_accept[1357] = { 0, - 0, 0, 264, 262, 1, 1, 262, 5, 262, 6, - 262, 262, 262, 262, 262, 257, 21, 2, 262, 16, - 262, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 262, 29, 25, 19, 26, - 17, 27, 18, 0, 259, 3, 4, 20, 258, 257, - 0, 23, 33, 30, 28, 31, 32, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 142, 143, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 176, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 235, 236, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 24, 22, 0, - 258, 0, 0, 260, 261, 35, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 53, 261, 261, 261, 261, 261, 261, 261, 261, 261, - - 261, 261, 261, 82, 84, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 113, 261, 261, 261, 261, 261, 261, 261, - 261, 123, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 153, - 261, 261, 261, 261, 261, 261, 164, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 201, 261, 261, 261, 261, 211, 261, 261, - 261, 261, 261, 261, 220, 261, 261, 261, 261, 238, - - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 0, 259, 0, 0, - 258, 261, 261, 37, 261, 261, 261, 261, 261, 261, - 261, 47, 48, 261, 261, 261, 261, 261, 261, 65, - 261, 261, 68, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 79, 261, 261, 83, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 99, 100, 261, 105, - 261, 261, 261, 261, 261, 112, 261, 115, 261, 261, - 261, 119, 261, 261, 122, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 137, 138, 261, 261, 261, 261, - - 261, 261, 261, 261, 261, 150, 151, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 185, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 210, 212, 261, 261, 261, 261, 261, 219, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 237, 239, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 256, 10, 15, 9, - 8, 261, 12, 14, 0, 258, 34, 261, 261, 261, - - 40, 261, 261, 261, 261, 49, 261, 51, 261, 54, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 75, 261, 261, 261, 261, 261, 261, 89, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 108, 109, - 261, 261, 261, 116, 261, 261, 261, 121, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 140, 261, - 261, 145, 261, 261, 261, 261, 261, 154, 261, 261, - 261, 261, 160, 261, 261, 261, 261, 261, 261, 168, - 261, 171, 261, 261, 261, 261, 177, 261, 179, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - - 261, 261, 261, 199, 200, 261, 261, 261, 261, 261, - 261, 261, 261, 213, 261, 261, 261, 217, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 244, 245, 261, 261, - 261, 261, 261, 253, 261, 255, 11, 261, 13, 261, - 261, 39, 261, 43, 42, 44, 45, 261, 52, 261, - 261, 261, 261, 261, 261, 71, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 95, - 96, 261, 261, 261, 261, 106, 107, 261, 111, 261, - 261, 118, 261, 261, 261, 261, 261, 129, 261, 261, - - 261, 261, 261, 261, 261, 261, 146, 147, 261, 261, - 261, 261, 261, 261, 261, 161, 261, 163, 261, 261, - 261, 261, 261, 173, 261, 261, 178, 261, 181, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 195, 261, - 198, 261, 261, 261, 261, 261, 261, 205, 261, 261, - 215, 216, 261, 221, 261, 223, 261, 225, 261, 261, - 261, 229, 261, 231, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 251, 261, 254, 7, 261, - 261, 261, 46, 50, 261, 261, 261, 261, 69, 261, - 261, 261, 261, 261, 77, 261, 261, 261, 261, 261, - - 261, 261, 261, 261, 261, 261, 261, 98, 101, 261, - 261, 261, 261, 114, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 182, 261, 261, - 261, 261, 261, 261, 261, 261, 197, 261, 261, 261, - 261, 261, 261, 261, 261, 218, 261, 224, 261, 261, - 261, 261, 232, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 66, 261, 261, 72, 261, - - 261, 261, 78, 261, 261, 261, 261, 261, 90, 261, - 261, 261, 261, 261, 102, 261, 104, 261, 261, 261, - 124, 261, 261, 261, 261, 261, 261, 261, 135, 261, - 139, 261, 261, 148, 149, 261, 155, 261, 158, 159, - 261, 261, 261, 167, 261, 261, 261, 174, 175, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 214, 261, - 261, 261, 261, 261, 233, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 38, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - - 73, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 103, 110, 261, 261, 261, 261, 261, - 128, 130, 132, 133, 261, 261, 144, 261, 156, 261, - 261, 261, 261, 170, 261, 261, 261, 261, 261, 187, - 188, 189, 261, 261, 261, 261, 261, 261, 261, 261, - 206, 261, 208, 261, 222, 226, 261, 261, 261, 234, - 240, 261, 261, 261, 261, 261, 261, 249, 261, 252, - 261, 261, 261, 261, 57, 261, 261, 261, 261, 261, - 261, 261, 67, 261, 74, 76, 261, 261, 261, 261, - 87, 261, 261, 261, 261, 261, 117, 261, 261, 261, - - 261, 261, 261, 261, 261, 261, 261, 261, 165, 261, - 261, 172, 261, 261, 261, 261, 190, 261, 261, 261, - 261, 261, 203, 204, 261, 261, 261, 228, 261, 261, - 242, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 60, 261, 261, 261, 64, 261, 80, 81, - 261, 261, 261, 261, 261, 261, 94, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 157, 261, 261, - 261, 180, 261, 261, 261, 261, 261, 261, 196, 261, - 261, 261, 227, 261, 261, 261, 246, 261, 248, 261, - 36, 261, 261, 261, 261, 261, 261, 261, 63, 261, - - 261, 261, 261, 261, 92, 93, 97, 261, 261, 261, - 261, 131, 261, 261, 261, 152, 261, 166, 169, 261, - 261, 261, 191, 261, 192, 261, 207, 261, 230, 261, - 243, 261, 261, 261, 261, 56, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 162, 261, 261, 261, 261, 261, 261, 209, - 261, 247, 261, 261, 261, 261, 261, 261, 62, 70, - 85, 86, 261, 91, 261, 261, 261, 261, 134, 261, - 261, 261, 261, 186, 261, 261, 202, 241, 261, 261, - 261, 261, 261, 261, 261, 120, 261, 261, 261, 261, - - 261, 183, 261, 261, 261, 261, 41, 55, 261, 59, - 261, 88, 261, 261, 261, 261, 261, 261, 261, 261, - 250, 58, 261, 261, 261, 261, 261, 261, 184, 261, - 193, 261, 125, 126, 127, 136, 261, 261, 61, 261, - 261, 141, 194, 0 + 0, 0, 266, 264, 1, 1, 264, 5, 264, 6, + 264, 264, 264, 264, 264, 259, 21, 2, 264, 16, + 264, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 264, 29, 25, 19, 26, + 17, 27, 18, 0, 261, 3, 4, 20, 260, 259, + 0, 23, 33, 30, 28, 31, 32, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 143, 144, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 178, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 237, 238, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 24, 22, 0, + 260, 0, 0, 262, 263, 35, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 53, 263, 263, 263, 263, 263, 263, 263, 263, 263, + + 263, 263, 263, 263, 83, 85, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 114, 263, 263, 263, 263, 263, 263, + 263, 263, 124, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 154, 263, 263, 263, 263, 263, 263, 263, 166, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 203, 263, 263, 263, 263, 213, + 263, 263, 263, 263, 263, 263, 222, 263, 263, 263, + + 263, 240, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 0, 261, + 0, 0, 260, 263, 263, 37, 263, 263, 263, 263, + 263, 263, 263, 47, 48, 263, 263, 263, 263, 263, + 263, 65, 263, 263, 68, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 80, 263, 263, 84, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 100, + 101, 263, 106, 263, 263, 263, 263, 263, 113, 263, + 116, 263, 263, 263, 120, 263, 263, 123, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 138, 139, 263, + + 263, 263, 263, 263, 263, 263, 263, 263, 151, 152, + 263, 263, 263, 263, 263, 162, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 187, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 212, 214, 263, 263, 263, + 263, 263, 221, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 239, 241, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 258, 10, 15, 9, 8, 263, 12, 14, 0, 260, + + 34, 263, 263, 263, 40, 263, 263, 263, 263, 49, + 263, 51, 263, 54, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 76, 263, 263, 263, 263, + 263, 263, 90, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 109, 110, 263, 263, 263, 117, 263, + 263, 263, 122, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 141, 263, 263, 146, 263, 263, 263, + 263, 263, 155, 263, 263, 263, 263, 161, 263, 263, + 263, 263, 263, 263, 170, 263, 173, 263, 263, 263, + 263, 179, 263, 181, 263, 263, 263, 263, 263, 263, + + 263, 263, 263, 263, 263, 263, 263, 263, 201, 202, + 263, 263, 263, 263, 263, 263, 263, 263, 215, 263, + 263, 263, 219, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 246, 247, 263, 263, 263, 263, 263, 255, 263, + 257, 11, 263, 13, 263, 263, 39, 263, 43, 42, + 44, 45, 263, 52, 263, 263, 263, 263, 263, 263, + 263, 72, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 96, 97, 263, 263, 263, + 263, 107, 108, 263, 112, 263, 263, 119, 263, 263, + + 263, 263, 263, 130, 263, 263, 263, 263, 263, 263, + 263, 263, 147, 148, 263, 263, 263, 263, 263, 263, + 263, 163, 263, 165, 263, 263, 263, 263, 263, 175, + 263, 263, 180, 263, 183, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 197, 263, 200, 263, 263, 263, + 263, 263, 263, 207, 263, 263, 217, 218, 263, 223, + 263, 225, 263, 227, 263, 263, 263, 231, 263, 233, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 253, 263, 256, 7, 263, 263, 263, 46, 50, + 263, 263, 263, 263, 263, 70, 263, 263, 263, 263, + + 263, 78, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 99, 102, 263, 263, 263, 263, + 115, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 184, 263, 263, 263, 263, 263, + 263, 263, 263, 199, 263, 263, 263, 263, 263, 263, + 263, 263, 220, 263, 226, 263, 263, 263, 263, 234, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + + 263, 263, 66, 263, 263, 263, 73, 263, 263, 263, + 79, 263, 263, 263, 263, 263, 91, 263, 263, 263, + 263, 263, 103, 263, 105, 263, 263, 263, 125, 263, + 263, 263, 263, 263, 263, 263, 136, 263, 140, 263, + 263, 149, 150, 263, 156, 263, 159, 160, 263, 263, + 263, 169, 263, 263, 263, 176, 177, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 216, 263, 263, 263, + 263, 263, 235, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 38, 263, 263, 263, 263, + + 263, 263, 263, 263, 263, 263, 263, 263, 263, 74, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 104, 111, 263, 263, 263, 263, 263, 129, + 131, 133, 134, 263, 263, 145, 263, 157, 263, 263, + 263, 263, 172, 263, 263, 263, 263, 263, 189, 190, + 191, 263, 263, 263, 263, 263, 263, 263, 263, 208, + 263, 210, 263, 224, 228, 263, 263, 263, 236, 242, + 263, 263, 263, 263, 263, 263, 251, 263, 254, 263, + 263, 263, 263, 57, 263, 263, 263, 263, 263, 263, + 263, 67, 263, 263, 75, 77, 263, 263, 263, 263, + + 88, 263, 263, 263, 263, 263, 118, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 167, 263, + 263, 174, 263, 263, 263, 263, 192, 263, 263, 263, + 263, 263, 205, 206, 263, 263, 263, 230, 263, 263, + 244, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 60, 263, 263, 263, 64, 263, 263, 81, + 82, 263, 263, 263, 263, 263, 263, 95, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 158, 263, + 263, 263, 182, 263, 263, 263, 263, 263, 263, 198, + 263, 263, 263, 229, 263, 263, 263, 248, 263, 250, + + 263, 36, 263, 263, 263, 263, 263, 263, 263, 63, + 69, 263, 263, 263, 263, 263, 93, 94, 98, 263, + 263, 263, 263, 132, 263, 263, 263, 153, 263, 168, + 171, 263, 263, 263, 193, 263, 194, 263, 209, 263, + 232, 263, 245, 263, 263, 263, 263, 56, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 164, 263, 263, 263, 263, 263, + 263, 211, 263, 249, 263, 263, 263, 263, 263, 263, + 62, 71, 86, 87, 263, 92, 263, 263, 263, 263, + 135, 263, 263, 263, 263, 188, 263, 263, 204, 243, + + 263, 263, 263, 263, 263, 263, 263, 121, 263, 263, + 263, 263, 263, 185, 263, 263, 263, 263, 41, 55, + 263, 59, 263, 89, 263, 263, 263, 263, 263, 263, + 263, 263, 252, 58, 263, 263, 263, 263, 263, 263, + 186, 263, 195, 263, 126, 127, 128, 137, 263, 263, + 61, 263, 263, 142, 196, 0 } ; static const YY_CHAR yy_ec[256] = @@ -816,311 +817,313 @@ static const YY_CHAR yy_meta[74] = 2, 2, 1 } ; -static const flex_int16_t yy_base[1346] = +static const flex_int16_t yy_base[1358] = { 0, - 0, 0, 1474, 1475, 1475, 1475, 1452, 1475, 1466, 1475, - 1450, 65, 66, 64, 76, 78, 1452, 1475, 62, 1448, + 0, 0, 1486, 1487, 1487, 1487, 1464, 1487, 1478, 1487, + 1462, 65, 66, 64, 76, 78, 1464, 1487, 62, 1460, 77, 51, 62, 70, 55, 69, 87, 103, 86, 108, - 0, 1408, 104, 111, 125, 46, 123, 1400, 122, 178, - 151, 126, 1405, 56, 1413, 1391, 1475, 1475, 1475, 1475, - 1475, 1475, 1475, 1452, 194, 1475, 1475, 1475, 237, 244, - 209, 1475, 1475, 1475, 1475, 1475, 1475, 0, 63, 1401, - 1413, 1407, 1403, 1396, 1407, 1400, 1407, 1392, 24, 1392, - 134, 92, 1396, 1403, 1386, 214, 1382, 1396, 1383, 1388, - 144, 219, 1397, 111, 1393, 1379, 1392, 134, 1392, 210, - - 1379, 1378, 1374, 1377, 1395, 119, 1370, 1383, 155, 1371, - 1390, 0, 1365, 1369, 1358, 167, 178, 151, 1397, 1377, - 183, 1375, 1384, 1365, 1354, 1358, 1369, 1369, 1355, 1354, - 1346, 0, 199, 95, 1360, 1367, 1354, 232, 150, 1355, - 1376, 1363, 1344, 233, 1349, 1352, 1346, 233, 1342, 1341, - 1340, 172, 0, 0, 1368, 1342, 234, 231, 250, 1353, - 251, 1338, 1343, 1340, 1346, 1332, 1326, 1475, 1475, 296, - 304, 313, 319, 324, 1330, 1332, 1327, 1329, 1334, 1341, - 1336, 283, 1327, 1326, 1327, 1318, 1327, 1332, 1323, 1320, - 0, 1321, 204, 1320, 283, 1327, 1324, 291, 1314, 295, - - 1322, 1309, 1301, 1316, 0, 1322, 281, 1313, 1312, 1315, - 1314, 1317, 1328, 1327, 1305, 1292, 1304, 1307, 320, 1297, - 1299, 288, 0, 1292, 1290, 1296, 303, 1302, 1312, 1290, - 1299, 0, 1299, 1318, 1320, 331, 1291, 1293, 1292, 1282, - 1281, 1314, 1288, 1273, 1286, 1283, 1284, 319, 1269, 332, - 1282, 1286, 1268, 1270, 1275, 1262, 0, 1276, 1292, 1277, - 1267, 1272, 314, 1267, 1257, 1261, 1266, 1259, 1270, 1257, - 1265, 1264, 302, 1258, 1252, 1245, 1247, 1243, 1257, 1260, - 1247, 1254, 0, 1247, 349, 1242, 1234, 1247, 1250, 1239, - 1247, 1242, 1241, 1230, 354, 1242, 1235, 1243, 1265, 1236, - - 1224, 1223, 1238, 1220, 1238, 1218, 1236, 1223, 1230, 1218, - 1228, 1219, 1211, 1223, 1224, 343, 399, 409, 418, 423, - 428, 1209, 1216, 0, 1207, 1212, 1206, 1210, 1208, 1212, - 1219, 0, 1251, 1209, 1208, 1211, 1205, 1209, 1209, 0, - 1199, 1191, 0, 1204, 1208, 1197, 1218, 1189, 1193, 1187, - 1194, 1188, 0, 1197, 1210, 0, 1180, 1193, 1192, 1183, - 1182, 1181, 1174, 1173, 1190, 1189, 0, 0, 1174, 1204, - 1173, 1180, 1168, 1175, 1164, 0, 1162, 0, 1177, 1200, - 1174, 0, 1173, 1160, 0, 1157, 1175, 1161, 1160, 1158, - 1151, 1151, 1168, 1188, 0, 0, 1156, 1147, 1172, 1147, - - 1145, 1145, 1142, 1149, 1144, 0, 1177, 1191, 1141, 1138, - 324, 1140, 1136, 1176, 1140, 339, 1136, 1131, 1147, 1130, - 1134, 1132, 1130, 1134, 1137, 1132, 1121, 1122, 1119, 334, - 0, 1125, 1135, 1118, 1121, 1130, 1120, 1122, 1113, 1112, - 1109, 1123, 1122, 1120, 1116, 1122, 1102, 1120, 1101, 1118, - 1113, 0, 0, 1112, 1097, 1098, 318, 1101, 0, 398, - 1104, 1107, 1094, 1105, 1089, 1095, 1104, 1105, 1100, 1116, - 0, 0, 1116, 1126, 1091, 1106, 1075, 1080, 1086, 1078, - 1089, 1074, 1076, 1085, 1079, 1085, 0, 0, 0, 1078, - 0, 1083, 1076, 0, 434, 445, 0, 1066, 1097, 1079, - - 1085, 1078, 1063, 1067, 1066, 0, 1065, 0, 1060, 0, - 1075, 1066, 1073, 1062, 1067, 1068, 1065, 1068, 1063, 1053, - 1071, 1052, 1044, 1054, 1047, 1056, 1047, 0, 1055, 1053, - 1052, 1051, 1050, 1042, 1041, 337, 1046, 1034, 0, 0, - 1046, 1031, 1044, 0, 1024, 1027, 1034, 0, 1035, 348, - 1024, 1021, 1024, 1028, 1022, 1027, 1014, 1022, 0, 1044, - 1016, 0, 1015, 1024, 1013, 1029, 1012, 0, 1027, 1049, - 1025, 1016, 0, 1000, 1012, 1008, 1002, 1006, 1015, 0, - 1016, 0, 1012, 997, 1011, 1011, 0, 1000, 0, 1018, - 1005, 993, 1000, 1006, 994, 988, 1000, 1003, 1001, 997, - - 988, 982, 994, 0, 0, 1011, 996, 993, 983, 977, - 976, 985, 1010, 0, 982, 984, 983, 0, 968, 967, - 971, 969, 970, 969, 976, 394, 978, 972, 959, 974, - 957, 961, 969, 954, 978, 966, 0, 0, 982, 346, - 960, 963, 989, 0, 961, 0, 0, 958, 0, 945, - 958, 0, 953, 0, 0, 0, 993, 955, 0, 946, - 945, 940, 945, 938, 935, 0, 941, 939, 940, 949, - 944, 935, 934, 927, 377, 926, 939, 429, 926, 0, - 0, 937, 936, 411, 931, 0, 0, 930, 0, 933, - 928, 0, 935, 921, 366, 958, 924, 0, 929, 929, - - 921, 909, 33, 67, 127, 142, 0, 0, 177, 189, - 206, 236, 255, 255, 278, 0, 316, 0, 345, 376, - 366, 441, 354, 0, 373, 382, 0, 393, 0, 410, - 418, 435, 417, 417, 439, 409, 424, 417, 0, 426, - 0, 431, 420, 416, 434, 418, 429, 0, 422, 435, - 0, 0, 435, 0, 433, 0, 439, 0, 439, 446, - 437, 0, 454, 0, 445, 434, 448, 432, 435, 441, - 453, 452, 466, 458, 447, 0, 460, 0, 0, 457, - 445, 445, 0, 0, 487, 460, 445, 477, 0, 467, - 468, 471, 462, 475, 0, 474, 478, 471, 479, 471, - - 507, 470, 474, 469, 471, 490, 498, 0, 0, 475, - 485, 492, 495, 0, 479, 479, 486, 515, 512, 507, - 484, 499, 500, 493, 502, 505, 485, 523, 508, 493, - 508, 502, 510, 498, 507, 513, 505, 500, 502, 511, - 520, 504, 508, 523, 516, 520, 553, 0, 529, 518, - 521, 512, 529, 530, 519, 518, 550, 521, 533, 527, - 538, 535, 532, 532, 530, 0, 545, 0, 540, 531, - 550, 538, 0, 529, 550, 551, 540, 547, 540, 548, - 541, 549, 544, 559, 547, 576, 560, 561, 556, 562, - 555, 560, 569, 564, 601, 0, 565, 563, 0, 576, - - 575, 572, 0, 565, 571, 572, 572, 579, 0, 576, - 578, 574, 573, 578, 0, 590, 0, 582, 577, 588, - 0, 608, 609, 622, 577, 598, 586, 597, 0, 585, - 0, 630, 588, 0, 0, 627, 0, 604, 0, 0, - 593, 608, 595, 0, 594, 601, 606, 0, 0, 611, - 613, 604, 600, 615, 616, 617, 605, 636, 637, 638, - 622, 609, 624, 613, 614, 613, 626, 622, 0, 630, - 613, 628, 635, 650, 0, 629, 630, 633, 634, 635, - 631, 645, 638, 643, 671, 645, 650, 0, 662, 645, - 635, 649, 655, 640, 640, 657, 652, 648, 651, 655, - - 0, 641, 661, 662, 655, 657, 656, 654, 654, 671, - 665, 670, 675, 0, 0, 659, 657, 686, 687, 698, - 0, 688, 0, 686, 665, 690, 0, 677, 703, 679, - 670, 681, 682, 0, 689, 676, 690, 706, 691, 0, - 0, 0, 689, 693, 694, 695, 683, 715, 699, 680, - 0, 696, 0, 725, 0, 0, 686, 703, 708, 0, - 0, 708, 707, 698, 696, 710, 696, 0, 702, 0, - 698, 703, 715, 709, 0, 716, 716, 719, 720, 707, - 713, 705, 0, 711, 0, 0, 712, 713, 727, 722, - 729, 716, 731, 724, 734, 736, 0, 735, 741, 742, - - 743, 725, 744, 745, 763, 737, 736, 731, 0, 738, - 738, 0, 748, 757, 750, 739, 0, 739, 740, 741, - 752, 760, 0, 0, 748, 754, 759, 0, 753, 746, - 0, 754, 744, 774, 765, 758, 764, 754, 757, 761, - 771, 765, 0, 762, 771, 768, 0, 763, 0, 0, - 764, 770, 782, 785, 770, 781, 0, 784, 799, 794, - 795, 797, 778, 785, 795, 808, 794, 0, 792, 794, - 789, 0, 798, 782, 804, 798, 799, 800, 0, 785, - 797, 800, 0, 807, 794, 796, 0, 798, 0, 798, - 0, 808, 813, 806, 803, 816, 804, 809, 0, 815, - - 808, 819, 808, 815, 0, 0, 0, 828, 850, 851, - 852, 0, 813, 823, 846, 0, 824, 0, 0, 820, - 841, 828, 0, 860, 0, 836, 0, 837, 0, 838, - 0, 835, 826, 832, 834, 0, 843, 837, 846, 839, - 850, 830, 831, 842, 838, 839, 866, 867, 868, 858, - 859, 865, 0, 847, 862, 850, 858, 856, 854, 0, - 854, 0, 872, 861, 872, 863, 858, 875, 0, 0, - 0, 0, 862, 0, 872, 887, 888, 889, 0, 895, - 891, 868, 870, 0, 883, 885, 0, 0, 877, 873, - 887, 890, 876, 876, 872, 0, 913, 914, 915, 899, - - 923, 0, 883, 891, 899, 886, 0, 0, 901, 0, - 898, 0, 918, 919, 920, 899, 929, 895, 909, 897, - 0, 0, 902, 928, 929, 930, 915, 941, 0, 909, - 0, 910, 0, 0, 0, 0, 936, 906, 0, 946, - 909, 0, 0, 1475, 973 + 0, 1420, 104, 111, 125, 46, 123, 1412, 122, 178, + 151, 126, 1417, 56, 1425, 1403, 1487, 1487, 1487, 1487, + 1487, 1487, 1487, 1464, 194, 1487, 1487, 1487, 237, 244, + 209, 1487, 1487, 1487, 1487, 1487, 1487, 0, 63, 1413, + 1425, 1419, 1415, 1408, 1419, 1412, 1419, 1404, 24, 1404, + 134, 92, 120, 1416, 1399, 214, 1395, 1409, 1396, 1401, + 144, 219, 1410, 155, 1406, 1392, 1405, 134, 1405, 210, + + 1392, 1391, 1387, 1390, 1408, 103, 1383, 1396, 158, 1384, + 1403, 0, 1378, 1382, 1371, 167, 178, 160, 1410, 182, + 183, 1389, 1398, 1379, 1368, 1372, 1383, 1383, 1369, 1368, + 1360, 0, 215, 95, 1374, 1381, 1368, 237, 200, 1369, + 1390, 1377, 1358, 233, 1363, 1366, 1360, 244, 1356, 1355, + 1354, 226, 0, 0, 1382, 1356, 223, 175, 240, 1367, + 256, 1352, 1357, 1354, 1360, 1346, 1340, 1487, 1487, 300, + 305, 314, 320, 325, 1344, 1346, 1341, 1343, 1348, 1355, + 1350, 318, 1341, 1340, 1341, 1332, 1341, 1346, 1337, 1334, + 0, 1335, 292, 1334, 1325, 286, 1340, 1337, 133, 1327, + + 299, 1335, 1322, 1314, 1329, 0, 1335, 285, 1326, 1325, + 1328, 1327, 1330, 1341, 1340, 1318, 1305, 1317, 1320, 324, + 1310, 1312, 235, 0, 1305, 1303, 1309, 304, 1315, 1325, + 1303, 1312, 0, 1312, 1331, 1333, 336, 1304, 1306, 1305, + 1295, 1294, 1327, 1301, 1286, 1299, 1296, 1297, 306, 1282, + 332, 1295, 1299, 1281, 1279, 1282, 1287, 1274, 0, 1288, + 1304, 1289, 1279, 1284, 317, 1279, 1269, 1273, 1278, 1271, + 1282, 1269, 1277, 1276, 309, 1270, 1264, 1257, 1259, 1255, + 1269, 1272, 1259, 1266, 0, 1259, 343, 1254, 1246, 1259, + 1262, 1251, 1259, 1254, 1253, 1242, 358, 1254, 1247, 1255, + + 1277, 1248, 1236, 1235, 1250, 1232, 1250, 1230, 1248, 1235, + 1242, 1230, 1240, 1231, 1223, 1235, 1236, 344, 374, 402, + 413, 418, 423, 1221, 1228, 0, 1219, 1224, 1218, 1222, + 1220, 1224, 1231, 0, 1263, 1221, 1220, 1223, 1217, 1221, + 1221, 0, 1211, 1203, 0, 1217, 1215, 1219, 1208, 1229, + 1200, 1204, 1198, 1205, 1199, 0, 1208, 1221, 0, 1191, + 1204, 1203, 1194, 1193, 1192, 1185, 1184, 1201, 1200, 0, + 0, 1185, 1215, 1184, 1191, 1179, 1186, 1175, 0, 1173, + 0, 1188, 1211, 1185, 0, 1184, 1171, 0, 1168, 1186, + 1172, 1171, 1169, 1162, 1162, 1179, 1199, 0, 0, 1167, + + 1158, 1183, 1158, 1156, 1156, 1153, 1160, 1155, 0, 1188, + 1202, 1152, 1149, 285, 1151, 0, 1147, 1187, 1151, 325, + 1147, 1142, 1158, 1141, 1145, 1143, 1141, 1145, 1148, 1143, + 1132, 1133, 1130, 378, 0, 1136, 1146, 1129, 1132, 1141, + 1131, 1133, 1124, 1123, 1120, 1134, 1133, 1131, 1127, 1133, + 1113, 1131, 1112, 1129, 1124, 0, 0, 1123, 1108, 1109, + 335, 1112, 0, 345, 1115, 1118, 1105, 1116, 1100, 1106, + 1115, 1116, 1111, 1127, 0, 0, 1127, 1137, 1102, 1117, + 1086, 1091, 1097, 1089, 1100, 1085, 1087, 1096, 1090, 1096, + 0, 0, 0, 1089, 0, 1094, 1087, 0, 432, 437, + + 0, 1077, 1108, 1090, 1096, 1089, 1074, 1078, 1077, 0, + 1076, 0, 1071, 0, 1086, 1077, 1084, 1073, 1066, 1077, + 1078, 1075, 1078, 1073, 1063, 1081, 1062, 1054, 1064, 1057, + 1066, 1057, 0, 1065, 1063, 1062, 1061, 1060, 1052, 1051, + 345, 1056, 1044, 0, 0, 1056, 1041, 1054, 0, 1034, + 1037, 1044, 0, 1045, 386, 1034, 1031, 1034, 1038, 1032, + 1037, 1024, 1032, 0, 1054, 1026, 0, 1025, 1034, 1023, + 1039, 1022, 0, 1037, 1059, 1035, 1026, 0, 1010, 1022, + 1018, 1012, 1016, 1025, 0, 1026, 0, 1022, 1007, 1021, + 1021, 0, 1010, 0, 1028, 1015, 1003, 1010, 1016, 1004, + + 998, 1010, 1013, 1011, 1007, 998, 992, 1004, 0, 0, + 1021, 1006, 1003, 993, 987, 986, 995, 1020, 0, 992, + 994, 993, 0, 978, 977, 981, 979, 980, 979, 986, + 316, 988, 982, 969, 984, 967, 971, 979, 964, 988, + 976, 0, 0, 992, 402, 970, 973, 999, 0, 971, + 0, 0, 968, 0, 955, 968, 0, 963, 0, 0, + 0, 1003, 965, 0, 956, 955, 950, 955, 975, 947, + 944, 0, 950, 948, 949, 958, 953, 944, 943, 936, + 414, 935, 948, 432, 935, 0, 0, 946, 945, 406, + 940, 0, 0, 939, 0, 942, 937, 0, 944, 930, + + 382, 967, 933, 0, 938, 36, 65, 138, 204, 238, + 274, 302, 0, 0, 330, 353, 346, 391, 411, 401, + 391, 0, 410, 0, 401, 425, 417, 447, 405, 0, + 416, 426, 0, 413, 0, 420, 427, 444, 425, 424, + 446, 416, 431, 424, 0, 433, 0, 438, 428, 423, + 441, 425, 436, 0, 429, 442, 0, 0, 442, 0, + 440, 0, 446, 0, 445, 451, 443, 0, 461, 0, + 452, 441, 455, 439, 442, 448, 460, 459, 473, 465, + 454, 0, 467, 0, 0, 464, 452, 452, 0, 0, + 494, 467, 452, 484, 473, 0, 475, 476, 480, 470, + + 483, 0, 482, 486, 482, 487, 479, 515, 478, 482, + 477, 479, 498, 506, 0, 0, 483, 493, 500, 503, + 0, 487, 487, 494, 523, 520, 515, 492, 507, 508, + 501, 510, 513, 493, 531, 516, 501, 516, 510, 518, + 506, 515, 521, 513, 508, 510, 519, 528, 512, 516, + 531, 524, 528, 561, 0, 537, 526, 529, 520, 537, + 538, 527, 526, 558, 529, 541, 535, 546, 543, 540, + 540, 538, 0, 553, 0, 548, 539, 558, 546, 0, + 537, 558, 559, 548, 555, 548, 556, 549, 557, 552, + 567, 555, 584, 568, 569, 564, 570, 563, 568, 577, + + 572, 609, 0, 573, 600, 572, 0, 585, 584, 581, + 0, 574, 580, 581, 581, 588, 0, 585, 587, 583, + 582, 587, 0, 599, 0, 591, 586, 597, 0, 617, + 618, 631, 586, 607, 595, 606, 0, 594, 0, 639, + 597, 0, 0, 636, 0, 613, 0, 0, 602, 617, + 604, 0, 603, 610, 615, 0, 0, 620, 622, 613, + 609, 624, 625, 626, 614, 645, 646, 647, 631, 618, + 633, 622, 623, 622, 635, 631, 0, 639, 622, 637, + 644, 659, 0, 638, 639, 642, 643, 644, 640, 654, + 647, 652, 680, 654, 659, 0, 671, 654, 644, 658, + + 664, 649, 649, 666, 661, 657, 660, 672, 665, 0, + 651, 671, 672, 665, 667, 666, 664, 664, 681, 675, + 680, 685, 0, 0, 669, 667, 696, 697, 708, 0, + 698, 0, 696, 675, 700, 0, 687, 713, 689, 680, + 691, 692, 0, 699, 686, 700, 716, 701, 0, 0, + 0, 699, 703, 704, 705, 693, 725, 709, 690, 0, + 706, 0, 735, 0, 0, 696, 713, 718, 0, 0, + 718, 717, 708, 706, 720, 706, 0, 712, 0, 708, + 713, 725, 719, 0, 726, 726, 729, 730, 717, 723, + 715, 0, 721, 722, 0, 0, 723, 724, 738, 733, + + 740, 727, 742, 735, 745, 747, 0, 746, 752, 753, + 754, 736, 755, 756, 774, 748, 747, 742, 0, 749, + 749, 0, 759, 768, 761, 750, 0, 750, 751, 752, + 763, 771, 0, 0, 759, 765, 770, 0, 764, 757, + 0, 765, 755, 785, 776, 769, 775, 765, 768, 772, + 782, 776, 0, 773, 782, 779, 0, 775, 775, 0, + 0, 776, 782, 794, 797, 782, 793, 0, 796, 811, + 806, 808, 809, 790, 797, 807, 820, 806, 0, 804, + 806, 801, 0, 810, 794, 816, 810, 811, 812, 0, + 797, 809, 812, 0, 819, 806, 808, 0, 810, 0, + + 810, 0, 820, 825, 818, 815, 828, 816, 821, 0, + 0, 827, 820, 831, 820, 827, 0, 0, 0, 840, + 862, 863, 864, 0, 825, 835, 858, 0, 836, 0, + 0, 832, 853, 840, 0, 872, 0, 848, 0, 849, + 0, 850, 0, 847, 838, 844, 846, 0, 855, 849, + 858, 851, 862, 842, 843, 854, 850, 851, 878, 879, + 880, 870, 871, 877, 0, 859, 874, 862, 870, 868, + 866, 0, 866, 0, 884, 873, 884, 875, 870, 887, + 0, 0, 0, 0, 874, 0, 884, 899, 900, 901, + 0, 907, 903, 880, 882, 0, 895, 897, 0, 0, + + 889, 885, 899, 902, 888, 888, 884, 0, 925, 926, + 927, 911, 935, 0, 895, 903, 911, 898, 0, 0, + 913, 0, 910, 0, 930, 931, 932, 911, 941, 907, + 921, 909, 0, 0, 914, 940, 941, 942, 927, 953, + 0, 921, 0, 922, 0, 0, 0, 0, 948, 918, + 0, 958, 921, 0, 0, 1487, 985 } ; -static const flex_int16_t yy_def[1346] = +static const flex_int16_t yy_def[1358] = { 0, - 1344, 1, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1344, 1344, 1344, 1344, - 1344, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1344, 1344, 1345, 1345, 1345, 1345, - - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, - 1345, 1345, 1345, 0, 1344 + 1356, 1, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, + 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, + 1356, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1356, 1356, 1356, 1356, 1356, + 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, + 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1356, 1356, 1356, + 1356, 1356, 1356, 1356, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1356, 1356, + 1356, 1356, 1356, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1356, 1356, + + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, + 1357, 1357, 1357, 1357, 1357, 0, 1356 } ; -static const flex_int16_t yy_nxt[1549] = +static const flex_int16_t yy_nxt[1561] = { 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 17, 18, 19, @@ -1130,68 +1133,68 @@ static const flex_int16_t yy_nxt[1549] = 31, 31, 31, 31, 31, 31, 31, 31, 31, 45, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 46, 50, 54, 52, 55, 55, 55, 55, - 55, 63, 64, 56, 826, 51, 53, 57, 59, 186, + 55, 63, 64, 56, 830, 51, 53, 57, 59, 186, 60, 60, 60, 60, 60, 187, 58, 66, 67, 69, 70, 71, 78, 72, 61, 127, 91, 165, 73, 128, 92, 166, 74, 79, 75, 76, 77, 82, 93, 80, - 827, 83, 81, 175, 84, 85, 94, 176, 95, 61, + 831, 83, 81, 175, 84, 85, 94, 176, 95, 61, 86, 87, 96, 88, 99, 97, 89, 105, 98, 123, 90, 108, 100, 111, 101, 102, 109, 103, 119, 192, - 268, 115, 269, 104, 106, 116, 110, 193, 120, 117, - 112, 107, 121, 828, 118, 153, 154, 113, 217, 137, - 129, 122, 124, 138, 130, 218, 125, 131, 132, 235, - 133, 155, 139, 134, 236, 161, 135, 162, 140, 222, - 163, 126, 141, 829, 189, 223, 209, 210, 156, 224, - - 190, 211, 157, 191, 250, 158, 55, 55, 55, 55, - 55, 159, 239, 240, 160, 280, 281, 173, 173, 251, - 170, 174, 174, 174, 174, 174, 246, 142, 830, 143, - 297, 298, 144, 145, 247, 146, 147, 248, 831, 148, - 149, 254, 249, 150, 151, 170, 266, 255, 152, 171, - 171, 171, 171, 171, 59, 341, 60, 60, 60, 60, - 60, 226, 342, 172, 197, 267, 832, 227, 198, 228, - 61, 199, 200, 201, 202, 203, 212, 213, 204, 229, - 286, 273, 214, 215, 274, 833, 303, 291, 172, 275, - 292, 276, 277, 287, 304, 61, 293, 278, 301, 279, - - 305, 309, 834, 302, 317, 317, 310, 329, 318, 318, - 318, 318, 318, 306, 835, 307, 171, 171, 171, 171, - 171, 320, 320, 330, 331, 321, 321, 321, 321, 321, - 319, 174, 174, 174, 174, 174, 174, 174, 174, 174, - 174, 344, 348, 351, 358, 408, 345, 371, 359, 836, - 372, 349, 375, 376, 380, 319, 352, 389, 390, 405, - 381, 421, 432, 571, 572, 422, 391, 433, 434, 837, - 406, 392, 409, 445, 393, 592, 446, 617, 460, 577, - 578, 461, 695, 618, 447, 696, 448, 462, 818, 449, - 450, 463, 488, 464, 465, 489, 819, 593, 773, 592, - - 490, 684, 685, 774, 491, 799, 492, 493, 838, 466, - 494, 318, 318, 318, 318, 318, 839, 840, 800, 843, - 467, 318, 318, 318, 318, 318, 495, 495, 844, 845, - 496, 496, 496, 496, 496, 321, 321, 321, 321, 321, - 321, 321, 321, 321, 321, 620, 496, 496, 496, 496, - 496, 760, 621, 803, 846, 761, 622, 496, 496, 496, - 496, 496, 809, 841, 804, 847, 810, 848, 849, 805, - 851, 811, 852, 853, 854, 855, 856, 857, 858, 859, - 842, 860, 861, 862, 863, 864, 865, 866, 867, 868, - 850, 869, 849, 870, 871, 872, 873, 874, 875, 876, - - 877, 878, 879, 880, 881, 883, 884, 885, 886, 887, - 888, 889, 890, 895, 891, 896, 897, 892, 898, 899, - 900, 882, 901, 902, 903, 904, 905, 893, 881, 894, - 906, 907, 908, 909, 910, 911, 912, 913, 914, 915, + 270, 115, 271, 104, 106, 116, 110, 193, 120, 117, + 112, 107, 121, 236, 118, 153, 154, 113, 237, 137, + 129, 122, 124, 138, 130, 194, 125, 131, 132, 195, + 133, 155, 139, 134, 351, 161, 135, 162, 140, 223, + 163, 126, 141, 352, 189, 224, 210, 211, 156, 225, + + 190, 212, 157, 191, 832, 158, 55, 55, 55, 55, + 55, 159, 218, 251, 160, 240, 241, 173, 173, 219, + 170, 174, 174, 174, 174, 174, 247, 142, 252, 143, + 305, 254, 144, 145, 248, 146, 147, 249, 306, 148, + 149, 256, 250, 150, 151, 170, 255, 257, 152, 171, + 171, 171, 171, 171, 59, 833, 60, 60, 60, 60, + 60, 227, 268, 172, 198, 282, 283, 228, 199, 229, + 61, 200, 201, 202, 203, 204, 213, 214, 205, 230, + 288, 269, 215, 216, 299, 300, 275, 303, 172, 276, + 307, 834, 304, 289, 277, 61, 278, 279, 293, 378, + + 379, 294, 280, 308, 281, 309, 311, 295, 319, 319, + 835, 312, 320, 320, 320, 320, 320, 171, 171, 171, + 171, 171, 322, 322, 576, 577, 323, 323, 323, 323, + 323, 321, 174, 174, 174, 174, 174, 174, 174, 174, + 174, 174, 331, 343, 347, 411, 408, 354, 361, 348, + 344, 374, 362, 836, 375, 383, 321, 409, 332, 333, + 355, 384, 392, 393, 425, 582, 583, 449, 426, 436, + 450, 394, 412, 766, 437, 438, 395, 767, 451, 396, + 452, 837, 464, 453, 454, 465, 320, 320, 320, 320, + 320, 466, 625, 492, 622, 467, 493, 468, 469, 626, + + 623, 494, 838, 627, 825, 495, 839, 496, 497, 690, + 691, 498, 826, 470, 320, 320, 320, 320, 320, 597, + 701, 499, 499, 702, 471, 500, 500, 500, 500, 500, + 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, + 840, 598, 806, 597, 500, 500, 500, 500, 500, 500, + 500, 500, 500, 500, 779, 807, 810, 816, 841, 780, + 842, 817, 843, 844, 845, 846, 818, 811, 847, 848, + 850, 851, 812, 852, 853, 854, 855, 856, 858, 859, + 860, 861, 862, 863, 864, 865, 849, 866, 867, 868, + 869, 870, 871, 872, 873, 874, 875, 876, 877, 857, + + 878, 856, 879, 880, 881, 882, 883, 884, 885, 886, + 887, 888, 890, 891, 892, 893, 894, 895, 896, 897, + 902, 898, 903, 904, 899, 905, 906, 907, 889, 908, + 909, 910, 911, 912, 900, 888, 901, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 930, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, - 946, 947, 948, 949, 950, 951, 953, 954, 955, 956, - 957, 958, 959, 960, 961, 962, 963, 964, 952, 965, - 966, 967, 968, 969, 970, 971, 972, 973, 974, 975, - - 951, 976, 977, 978, 979, 980, 981, 982, 983, 984, - 985, 986, 952, 987, 988, 989, 990, 992, 993, 995, - 996, 994, 991, 997, 998, 999, 1000, 1001, 1002, 1003, - 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, + 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, + 956, 957, 958, 959, 961, 962, 963, 964, 965, 966, + 967, 968, 969, 970, 971, 972, 960, 973, 974, 975, + + 976, 977, 978, 979, 980, 981, 982, 983, 959, 984, + 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, + 960, 995, 996, 997, 998, 1000, 1001, 1003, 1004, 1002, + 999, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, @@ -1199,102 +1202,103 @@ static const flex_int16_t yy_nxt[1549] = 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, - 1075, 1076, 1077, 1074, 1078, 1079, 1080, 1081, 1082, 1083, - 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, + 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1084, + 1085, 1086, 1083, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, - 1134, 1135, 1136, 1137, 1138, 1115, 1139, 1140, 1141, 1142, - 1143, 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151, 1152, + 1134, 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, + 1144, 1145, 1146, 1147, 1148, 1125, 1149, 1150, 1151, 1152, 1153, 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163, 1164, 1165, 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, - 1193, 1194, 1195, 1196, 1173, 1197, 1198, 1199, 1200, 1201, - 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1188, - 1211, 1212, 1213, 1214, 1215, 1216, 1217, 1218, 1219, 1220, - 1221, 1222, 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, + 1193, 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1202, + 1203, 1204, 1205, 1206, 1207, 1184, 1208, 1209, 1210, 1211, + 1212, 1213, 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, + 1199, 1222, 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245, 1246, 1247, 1248, 1249, 1250, - 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1259, 1260, 1261, - 1262, 1263, 1264, 1265, 1266, 1258, 1267, 1268, 1269, 1270, + 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 1259, 1260, + 1261, 1262, 1263, 1264, 1265, 1266, 1267, 1268, 1269, 1271, - 1271, 1272, 1273, 1274, 1275, 1276, 1277, 1278, 1255, 1279, - 1280, 1281, 1282, 1283, 1284, 1285, 1286, 1287, 1288, 1289, - 1290, 1291, 1292, 1293, 1294, 1295, 1296, 1297, 1298, 1299, + 1272, 1273, 1274, 1275, 1276, 1277, 1278, 1270, 1279, 1280, + 1281, 1282, 1283, 1284, 1285, 1286, 1287, 1288, 1289, 1290, + 1267, 1291, 1292, 1293, 1294, 1295, 1296, 1297, 1298, 1299, 1300, 1301, 1302, 1303, 1304, 1305, 1306, 1307, 1308, 1309, 1310, 1311, 1312, 1313, 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1321, 1322, 1323, 1324, 1325, 1326, 1327, 1328, 1329, 1330, 1331, 1332, 1333, 1334, 1335, 1336, 1337, 1338, 1339, - 1340, 1341, 1342, 1343, 68, 825, 824, 823, 822, 821, - 820, 817, 816, 815, 814, 813, 812, 808, 807, 806, - 802, 801, 798, 797, 796, 795, 794, 793, 792, 791, - - 790, 789, 788, 787, 786, 785, 784, 783, 782, 781, - 780, 779, 778, 777, 776, 775, 772, 771, 770, 769, - 768, 767, 766, 765, 764, 763, 762, 759, 758, 757, - 756, 755, 754, 753, 752, 751, 750, 749, 748, 747, - 746, 745, 744, 743, 742, 741, 740, 739, 738, 737, - 736, 735, 734, 733, 732, 731, 730, 729, 728, 727, - 726, 725, 724, 723, 722, 721, 720, 719, 718, 717, - 716, 715, 714, 713, 712, 711, 710, 709, 708, 707, - 706, 705, 704, 703, 702, 701, 700, 699, 698, 697, - 694, 693, 692, 691, 690, 689, 688, 687, 686, 683, - - 682, 681, 680, 679, 678, 677, 676, 675, 674, 673, - 672, 671, 670, 669, 668, 667, 666, 665, 664, 663, - 662, 661, 660, 659, 658, 657, 656, 655, 654, 653, - 652, 651, 650, 649, 648, 647, 646, 645, 644, 643, - 642, 641, 640, 639, 638, 637, 636, 635, 634, 633, - 632, 631, 630, 629, 628, 627, 626, 625, 624, 623, - 619, 616, 615, 614, 613, 612, 611, 610, 609, 608, - 607, 606, 605, 604, 603, 602, 601, 600, 599, 598, - 597, 596, 595, 594, 591, 590, 589, 588, 587, 586, - 585, 584, 583, 582, 581, 580, 579, 576, 575, 574, - - 573, 570, 569, 568, 567, 566, 565, 564, 563, 562, - 561, 560, 559, 558, 557, 556, 555, 554, 553, 552, - 551, 550, 549, 548, 547, 546, 545, 544, 543, 542, - 541, 540, 539, 538, 537, 536, 535, 534, 533, 532, - 531, 530, 529, 528, 527, 526, 525, 524, 523, 522, - 521, 520, 519, 518, 517, 516, 515, 514, 513, 512, - 511, 510, 509, 508, 507, 506, 505, 504, 503, 502, - 501, 500, 499, 498, 497, 487, 486, 485, 484, 483, - 482, 481, 480, 479, 478, 477, 476, 475, 474, 473, - 472, 471, 470, 469, 468, 459, 458, 457, 456, 455, - - 454, 453, 452, 451, 444, 443, 442, 441, 440, 439, - 438, 437, 436, 435, 431, 430, 429, 428, 427, 426, - 425, 424, 423, 420, 419, 418, 417, 416, 415, 414, - 413, 412, 411, 410, 407, 404, 403, 402, 401, 400, - 399, 398, 397, 396, 395, 394, 388, 387, 386, 385, - 384, 383, 382, 379, 378, 377, 374, 373, 370, 369, - 368, 367, 366, 365, 364, 363, 362, 361, 360, 357, - 356, 355, 354, 353, 350, 347, 346, 343, 340, 339, - 338, 337, 336, 335, 334, 333, 332, 328, 327, 326, - 325, 324, 323, 322, 316, 315, 314, 313, 312, 311, - - 308, 300, 299, 296, 295, 294, 290, 289, 288, 285, - 284, 283, 282, 272, 271, 270, 265, 264, 263, 262, - 261, 260, 259, 258, 257, 256, 253, 252, 245, 244, - 243, 242, 241, 238, 237, 234, 233, 232, 231, 230, - 225, 221, 220, 219, 216, 208, 207, 206, 205, 196, - 195, 194, 188, 185, 184, 183, 182, 181, 180, 179, - 178, 177, 169, 168, 167, 164, 136, 114, 65, 62, - 49, 48, 47, 1344, 3, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - - 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344 + 1340, 1341, 1342, 1343, 1344, 1345, 1346, 1347, 1348, 1349, + 1350, 1351, 1352, 1353, 1354, 1355, 68, 829, 828, 827, + 824, 823, 822, 821, 820, 819, 815, 814, 813, 809, + + 808, 805, 804, 803, 802, 801, 800, 799, 798, 797, + 796, 795, 794, 793, 792, 791, 790, 789, 788, 787, + 786, 785, 784, 783, 782, 781, 778, 777, 776, 775, + 774, 773, 772, 771, 770, 769, 768, 765, 764, 763, + 762, 761, 760, 759, 758, 757, 756, 755, 754, 753, + 752, 751, 750, 749, 748, 747, 746, 745, 744, 743, + 742, 741, 740, 739, 738, 737, 736, 735, 734, 733, + 732, 731, 730, 729, 728, 727, 726, 725, 724, 723, + 722, 721, 720, 719, 718, 717, 716, 715, 714, 713, + 712, 711, 710, 709, 708, 707, 706, 705, 704, 703, + + 700, 699, 698, 697, 696, 695, 694, 693, 692, 689, + 688, 687, 686, 685, 684, 683, 682, 681, 680, 679, + 678, 677, 676, 675, 674, 673, 672, 671, 670, 669, + 668, 667, 666, 665, 664, 663, 662, 661, 660, 659, + 658, 657, 656, 655, 654, 653, 652, 651, 650, 649, + 648, 647, 646, 645, 644, 643, 642, 641, 640, 639, + 638, 637, 636, 635, 634, 633, 632, 631, 630, 629, + 628, 624, 621, 620, 619, 618, 617, 616, 615, 614, + 613, 612, 611, 610, 609, 608, 607, 606, 605, 604, + 603, 602, 601, 600, 599, 596, 595, 594, 593, 592, + + 591, 590, 589, 588, 587, 586, 585, 584, 581, 580, + 579, 578, 575, 574, 573, 572, 571, 570, 569, 568, + 567, 566, 565, 564, 563, 562, 561, 560, 559, 558, + 557, 556, 555, 554, 553, 552, 551, 550, 549, 548, + 547, 546, 545, 544, 543, 542, 541, 540, 539, 538, + 537, 536, 535, 534, 533, 532, 531, 530, 529, 528, + 527, 526, 525, 524, 523, 522, 521, 520, 519, 518, + 517, 516, 515, 514, 513, 512, 511, 510, 509, 508, + 507, 506, 505, 504, 503, 502, 501, 491, 490, 489, + 488, 487, 486, 485, 484, 483, 482, 481, 480, 479, + + 478, 477, 476, 475, 474, 473, 472, 463, 462, 461, + 460, 459, 458, 457, 456, 455, 448, 447, 446, 445, + 444, 443, 442, 441, 440, 439, 435, 434, 433, 432, + 431, 430, 429, 428, 427, 424, 423, 422, 421, 420, + 419, 418, 417, 416, 415, 414, 413, 410, 407, 406, + 405, 404, 403, 402, 401, 400, 399, 398, 397, 391, + 390, 389, 388, 387, 386, 385, 382, 381, 380, 377, + 376, 373, 372, 371, 370, 369, 368, 367, 366, 365, + 364, 363, 360, 359, 358, 357, 356, 353, 350, 349, + 346, 345, 342, 341, 340, 339, 338, 337, 336, 335, + + 334, 330, 329, 328, 327, 326, 325, 324, 318, 317, + 316, 315, 314, 313, 310, 302, 301, 298, 297, 296, + 292, 291, 290, 287, 286, 285, 284, 274, 273, 272, + 267, 266, 265, 264, 263, 262, 261, 260, 259, 258, + 253, 246, 245, 244, 243, 242, 239, 238, 235, 234, + 233, 232, 231, 226, 222, 221, 220, 217, 209, 208, + 207, 206, 197, 196, 188, 185, 184, 183, 182, 181, + 180, 179, 178, 177, 169, 168, 167, 164, 136, 114, + 65, 62, 49, 48, 47, 1356, 3, 1356, 1356, 1356, + 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, + + 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, + 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, + 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, + 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, + 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, + 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356 } ; -static const flex_int16_t yy_chk[1549] = +static const flex_int16_t yy_chk[1561] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -1304,168 +1308,169 @@ static const flex_int16_t yy_chk[1549] = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 14, 13, 14, 14, 14, 14, - 14, 19, 19, 15, 703, 12, 13, 15, 16, 79, + 14, 19, 19, 15, 706, 12, 13, 15, 16, 79, 16, 16, 16, 16, 16, 79, 15, 21, 21, 22, 22, 22, 23, 22, 16, 36, 25, 44, 22, 36, 25, 44, 22, 23, 22, 22, 22, 24, 25, 23, - 704, 24, 23, 69, 24, 24, 26, 69, 26, 16, + 707, 24, 23, 69, 24, 24, 26, 69, 26, 16, 24, 24, 26, 24, 27, 26, 24, 28, 26, 35, 24, 29, 27, 30, 27, 27, 29, 27, 34, 82, 134, 33, 134, 27, 28, 33, 29, 82, 34, 33, - 30, 28, 34, 705, 33, 41, 41, 30, 94, 39, - 37, 34, 35, 39, 37, 94, 35, 37, 37, 106, - 37, 41, 39, 37, 106, 42, 37, 42, 39, 98, - 42, 35, 40, 706, 81, 98, 91, 91, 41, 98, - - 81, 91, 41, 81, 118, 41, 55, 55, 55, 55, - 55, 41, 109, 109, 41, 139, 139, 61, 61, 118, - 55, 61, 61, 61, 61, 61, 116, 40, 709, 40, - 152, 152, 40, 40, 116, 40, 40, 117, 710, 40, - 40, 121, 117, 40, 40, 55, 133, 121, 40, 59, - 59, 59, 59, 59, 60, 193, 60, 60, 60, 60, - 60, 100, 193, 59, 86, 133, 711, 100, 86, 100, + 30, 28, 34, 106, 33, 41, 41, 30, 106, 39, + 37, 34, 35, 39, 37, 83, 35, 37, 37, 83, + 37, 41, 39, 37, 199, 42, 37, 42, 39, 98, + 42, 35, 40, 199, 81, 98, 91, 91, 41, 98, + + 81, 91, 41, 81, 708, 41, 55, 55, 55, 55, + 55, 41, 94, 118, 41, 109, 109, 61, 61, 94, + 55, 61, 61, 61, 61, 61, 116, 40, 118, 40, + 158, 120, 40, 40, 116, 40, 40, 117, 158, 40, + 40, 121, 117, 40, 40, 55, 120, 121, 40, 59, + 59, 59, 59, 59, 60, 709, 60, 60, 60, 60, + 60, 100, 133, 59, 86, 139, 139, 100, 86, 100, 60, 86, 86, 86, 86, 86, 92, 92, 86, 100, - 144, 138, 92, 92, 138, 712, 158, 148, 59, 138, - 148, 138, 138, 144, 158, 60, 148, 138, 157, 138, - - 159, 161, 713, 157, 170, 170, 161, 182, 170, 170, - 170, 170, 170, 159, 714, 159, 171, 171, 171, 171, - 171, 172, 172, 182, 182, 172, 172, 172, 172, 172, - 171, 173, 173, 173, 173, 173, 174, 174, 174, 174, - 174, 195, 198, 200, 207, 250, 195, 219, 207, 715, - 219, 198, 222, 222, 227, 171, 200, 236, 236, 248, - 227, 263, 273, 411, 411, 263, 236, 273, 273, 717, - 248, 236, 250, 285, 236, 430, 285, 457, 295, 416, - 416, 295, 550, 457, 285, 550, 285, 295, 695, 285, - 285, 295, 316, 295, 295, 316, 695, 430, 640, 430, - - 316, 536, 536, 640, 316, 675, 316, 316, 719, 295, - 316, 317, 317, 317, 317, 317, 720, 721, 675, 723, - 295, 318, 318, 318, 318, 318, 319, 319, 725, 726, - 319, 319, 319, 319, 319, 320, 320, 320, 320, 320, - 321, 321, 321, 321, 321, 460, 495, 495, 495, 495, - 495, 626, 460, 678, 728, 626, 460, 496, 496, 496, - 496, 496, 684, 722, 678, 730, 684, 731, 732, 678, - 733, 684, 734, 735, 736, 737, 738, 740, 742, 743, - 722, 744, 745, 746, 747, 749, 750, 753, 755, 757, - 732, 759, 732, 760, 761, 763, 765, 766, 767, 768, - - 769, 770, 771, 772, 773, 774, 775, 777, 780, 781, - 782, 785, 785, 786, 785, 787, 788, 785, 790, 791, - 792, 773, 793, 794, 796, 797, 798, 785, 773, 785, - 799, 800, 801, 802, 803, 804, 805, 806, 807, 810, - 811, 812, 813, 815, 816, 817, 818, 819, 820, 821, - 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, - 832, 833, 834, 835, 836, 837, 838, 839, 840, 841, - 842, 843, 844, 845, 846, 847, 849, 850, 851, 852, - 853, 854, 855, 856, 857, 858, 859, 860, 847, 861, - 862, 863, 864, 865, 867, 869, 870, 871, 872, 874, - - 847, 875, 876, 877, 878, 879, 880, 881, 882, 883, - 884, 885, 847, 886, 887, 888, 889, 890, 891, 892, - 893, 891, 889, 894, 895, 897, 898, 900, 901, 902, - 904, 905, 906, 907, 908, 910, 911, 912, 913, 914, - 916, 918, 919, 920, 922, 923, 924, 925, 926, 927, - 928, 930, 932, 933, 936, 938, 941, 942, 943, 945, - 946, 947, 950, 951, 952, 953, 954, 955, 956, 957, - 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, - 968, 970, 971, 972, 973, 974, 976, 977, 978, 979, - 980, 981, 982, 983, 984, 985, 986, 987, 989, 990, - - 991, 992, 993, 990, 994, 995, 996, 997, 998, 999, - 1000, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, - 1011, 1012, 1013, 1016, 1017, 1018, 1019, 1020, 1022, 1024, - 1025, 1026, 1028, 1029, 1030, 1031, 1032, 1033, 1035, 1036, - 1037, 1038, 1039, 1043, 1044, 1045, 1046, 1047, 1048, 1049, - 1050, 1052, 1054, 1057, 1058, 1059, 1062, 1063, 1064, 1065, - 1066, 1067, 1069, 1071, 1072, 1038, 1073, 1074, 1076, 1077, - 1078, 1079, 1080, 1081, 1082, 1084, 1087, 1088, 1089, 1090, - 1091, 1092, 1093, 1094, 1095, 1096, 1098, 1099, 1100, 1101, - 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1110, 1111, 1113, - - 1114, 1115, 1116, 1118, 1119, 1120, 1121, 1122, 1125, 1126, - 1127, 1129, 1130, 1132, 1133, 1134, 1135, 1136, 1137, 1138, - 1139, 1140, 1141, 1142, 1114, 1144, 1145, 1146, 1148, 1151, - 1152, 1153, 1154, 1155, 1156, 1158, 1159, 1160, 1161, 1134, - 1162, 1163, 1164, 1165, 1166, 1167, 1169, 1170, 1171, 1173, - 1174, 1175, 1176, 1177, 1178, 1180, 1181, 1182, 1184, 1185, - 1186, 1188, 1190, 1192, 1193, 1194, 1195, 1196, 1197, 1198, - 1200, 1201, 1202, 1203, 1204, 1208, 1209, 1210, 1211, 1213, - 1214, 1215, 1217, 1220, 1221, 1222, 1224, 1226, 1228, 1230, - 1232, 1233, 1234, 1235, 1237, 1224, 1238, 1239, 1240, 1241, - - 1242, 1243, 1244, 1245, 1246, 1247, 1248, 1249, 1221, 1250, - 1251, 1252, 1254, 1255, 1256, 1257, 1258, 1259, 1261, 1263, - 1264, 1265, 1266, 1267, 1268, 1273, 1275, 1276, 1277, 1278, - 1280, 1281, 1282, 1283, 1285, 1286, 1289, 1290, 1291, 1292, - 1293, 1294, 1295, 1297, 1298, 1299, 1300, 1301, 1303, 1304, - 1305, 1306, 1309, 1311, 1313, 1314, 1315, 1316, 1317, 1318, - 1319, 1320, 1323, 1324, 1325, 1326, 1327, 1328, 1330, 1332, - 1337, 1338, 1340, 1341, 1345, 702, 701, 700, 699, 697, - 696, 694, 693, 691, 690, 688, 685, 683, 682, 679, - 677, 676, 674, 673, 672, 671, 670, 669, 668, 667, - - 665, 664, 663, 662, 661, 660, 658, 657, 653, 651, - 650, 648, 645, 643, 642, 641, 639, 636, 635, 634, - 633, 632, 631, 630, 629, 628, 627, 625, 624, 623, - 622, 621, 620, 619, 617, 616, 615, 613, 612, 611, - 610, 609, 608, 607, 606, 603, 602, 601, 600, 599, - 598, 597, 596, 595, 594, 593, 592, 591, 590, 588, - 586, 585, 584, 583, 581, 579, 578, 577, 576, 575, - 574, 572, 571, 570, 569, 567, 566, 565, 564, 563, - 561, 560, 558, 557, 556, 555, 554, 553, 552, 551, - 549, 547, 546, 545, 543, 542, 541, 538, 537, 535, - - 534, 533, 532, 531, 530, 529, 527, 526, 525, 524, - 523, 522, 521, 520, 519, 518, 517, 516, 515, 514, - 513, 512, 511, 509, 507, 505, 504, 503, 502, 501, - 500, 499, 498, 493, 492, 490, 486, 485, 484, 483, - 482, 481, 480, 479, 478, 477, 476, 475, 474, 473, - 470, 469, 468, 467, 466, 465, 464, 463, 462, 461, - 458, 456, 455, 454, 451, 450, 449, 448, 447, 446, - 445, 444, 443, 442, 441, 440, 439, 438, 437, 436, - 435, 434, 433, 432, 429, 428, 427, 426, 425, 424, - 423, 422, 421, 420, 419, 418, 417, 415, 414, 413, - - 412, 410, 409, 408, 407, 405, 404, 403, 402, 401, - 400, 399, 398, 397, 394, 393, 392, 391, 390, 389, - 388, 387, 386, 384, 383, 381, 380, 379, 377, 375, - 374, 373, 372, 371, 370, 369, 366, 365, 364, 363, - 362, 361, 360, 359, 358, 357, 355, 354, 352, 351, - 350, 349, 348, 347, 346, 345, 344, 342, 341, 339, - 338, 337, 336, 335, 334, 333, 331, 330, 329, 328, - 327, 326, 325, 323, 322, 315, 314, 313, 312, 311, - 310, 309, 308, 307, 306, 305, 304, 303, 302, 301, - 300, 299, 298, 297, 296, 294, 293, 292, 291, 290, - - 289, 288, 287, 286, 284, 282, 281, 280, 279, 278, - 277, 276, 275, 274, 272, 271, 270, 269, 268, 267, - 266, 265, 264, 262, 261, 260, 259, 258, 256, 255, - 254, 253, 252, 251, 249, 247, 246, 245, 244, 243, - 242, 241, 240, 239, 238, 237, 235, 234, 233, 231, - 230, 229, 228, 226, 225, 224, 221, 220, 218, 217, - 216, 215, 214, 213, 212, 211, 210, 209, 208, 206, - 204, 203, 202, 201, 199, 197, 196, 194, 192, 190, - 189, 188, 187, 186, 185, 184, 183, 181, 180, 179, - 178, 177, 176, 175, 167, 166, 165, 164, 163, 162, - - 160, 156, 155, 151, 150, 149, 147, 146, 145, 143, - 142, 141, 140, 137, 136, 135, 131, 130, 129, 128, - 127, 126, 125, 124, 123, 122, 120, 119, 115, 114, - 113, 111, 110, 108, 107, 105, 104, 103, 102, 101, - 99, 97, 96, 95, 93, 90, 89, 88, 87, 85, - 84, 83, 80, 78, 77, 76, 75, 74, 73, 72, - 71, 70, 54, 46, 45, 43, 38, 32, 20, 17, - 11, 9, 7, 3, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - - 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344 + 144, 133, 92, 92, 152, 152, 138, 157, 59, 138, + 159, 710, 157, 144, 138, 60, 138, 138, 148, 223, + + 223, 148, 138, 159, 138, 159, 161, 148, 170, 170, + 711, 161, 170, 170, 170, 170, 170, 171, 171, 171, + 171, 171, 172, 172, 414, 414, 172, 172, 172, 172, + 172, 171, 173, 173, 173, 173, 173, 174, 174, 174, + 174, 174, 182, 193, 196, 251, 249, 201, 208, 196, + 193, 220, 208, 712, 220, 228, 171, 249, 182, 182, + 201, 228, 237, 237, 265, 420, 420, 287, 265, 275, + 287, 237, 251, 631, 275, 275, 237, 631, 287, 237, + 287, 715, 297, 287, 287, 297, 319, 319, 319, 319, + 319, 297, 464, 318, 461, 297, 318, 297, 297, 464, + + 461, 318, 716, 464, 701, 318, 717, 318, 318, 541, + 541, 318, 701, 297, 320, 320, 320, 320, 320, 434, + 555, 321, 321, 555, 297, 321, 321, 321, 321, 321, + 322, 322, 322, 322, 322, 323, 323, 323, 323, 323, + 718, 434, 681, 434, 499, 499, 499, 499, 499, 500, + 500, 500, 500, 500, 645, 681, 684, 690, 719, 645, + 720, 690, 721, 723, 725, 726, 690, 684, 727, 728, + 729, 731, 684, 732, 734, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 746, 748, 728, 749, 750, 751, + 752, 753, 755, 756, 759, 761, 763, 765, 766, 738, + + 767, 738, 769, 771, 772, 773, 774, 775, 776, 777, + 778, 779, 780, 781, 783, 786, 787, 788, 791, 791, + 792, 791, 793, 794, 791, 795, 797, 798, 779, 799, + 800, 801, 803, 804, 791, 779, 791, 805, 806, 807, + 808, 809, 810, 811, 812, 813, 814, 817, 818, 819, + 820, 822, 823, 824, 825, 826, 827, 828, 829, 830, + 831, 832, 833, 834, 835, 836, 837, 838, 839, 840, + 841, 842, 843, 844, 845, 846, 847, 848, 849, 850, + 851, 852, 853, 854, 856, 857, 858, 859, 860, 861, + 862, 863, 864, 865, 866, 867, 854, 868, 869, 870, + + 871, 872, 874, 876, 877, 878, 879, 881, 854, 882, + 883, 884, 885, 886, 887, 888, 889, 890, 891, 892, + 854, 893, 894, 895, 896, 897, 898, 899, 900, 898, + 896, 901, 902, 904, 905, 906, 908, 909, 910, 912, + 913, 914, 915, 916, 918, 919, 920, 921, 922, 924, + 926, 927, 928, 930, 931, 932, 933, 934, 935, 936, + 938, 940, 941, 944, 946, 949, 950, 951, 953, 954, + 955, 958, 959, 960, 961, 962, 963, 964, 965, 966, + 967, 968, 969, 970, 971, 972, 973, 974, 975, 976, + 978, 979, 980, 981, 982, 984, 985, 986, 987, 988, + + 989, 990, 991, 992, 993, 994, 995, 997, 998, 999, + 1000, 1001, 998, 1002, 1003, 1004, 1005, 1006, 1007, 1008, + 1009, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, + 1020, 1021, 1022, 1025, 1026, 1027, 1028, 1029, 1031, 1033, + 1034, 1035, 1037, 1038, 1039, 1040, 1041, 1042, 1044, 1045, + 1046, 1047, 1048, 1052, 1053, 1054, 1055, 1056, 1057, 1058, + 1059, 1061, 1063, 1066, 1067, 1068, 1071, 1072, 1073, 1074, + 1075, 1076, 1078, 1080, 1081, 1047, 1082, 1083, 1085, 1086, + 1087, 1088, 1089, 1090, 1091, 1093, 1094, 1097, 1098, 1099, + 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1108, 1109, 1110, + + 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1120, 1121, + 1123, 1124, 1125, 1126, 1128, 1129, 1130, 1131, 1132, 1135, + 1136, 1137, 1139, 1140, 1142, 1143, 1144, 1145, 1146, 1147, + 1148, 1149, 1150, 1151, 1152, 1124, 1154, 1155, 1156, 1158, + 1159, 1162, 1163, 1164, 1165, 1166, 1167, 1169, 1170, 1171, + 1144, 1172, 1173, 1174, 1175, 1176, 1177, 1178, 1180, 1181, + 1182, 1184, 1185, 1186, 1187, 1188, 1189, 1191, 1192, 1193, + 1195, 1196, 1197, 1199, 1201, 1203, 1204, 1205, 1206, 1207, + 1208, 1209, 1212, 1213, 1214, 1215, 1216, 1220, 1221, 1222, + 1223, 1225, 1226, 1227, 1229, 1232, 1233, 1234, 1236, 1238, + + 1240, 1242, 1244, 1245, 1246, 1247, 1249, 1236, 1250, 1251, + 1252, 1253, 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, + 1233, 1262, 1263, 1264, 1266, 1267, 1268, 1269, 1270, 1271, + 1273, 1275, 1276, 1277, 1278, 1279, 1280, 1285, 1287, 1288, + 1289, 1290, 1292, 1293, 1294, 1295, 1297, 1298, 1301, 1302, + 1303, 1304, 1305, 1306, 1307, 1309, 1310, 1311, 1312, 1313, + 1315, 1316, 1317, 1318, 1321, 1323, 1325, 1326, 1327, 1328, + 1329, 1330, 1331, 1332, 1335, 1336, 1337, 1338, 1339, 1340, + 1342, 1344, 1349, 1350, 1352, 1353, 1357, 705, 703, 702, + 700, 699, 697, 696, 694, 691, 689, 688, 685, 683, + + 682, 680, 679, 678, 677, 676, 675, 674, 673, 671, + 670, 669, 668, 667, 666, 665, 663, 662, 658, 656, + 655, 653, 650, 648, 647, 646, 644, 641, 640, 639, + 638, 637, 636, 635, 634, 633, 632, 630, 629, 628, + 627, 626, 625, 624, 622, 621, 620, 618, 617, 616, + 615, 614, 613, 612, 611, 608, 607, 606, 605, 604, + 603, 602, 601, 600, 599, 598, 597, 596, 595, 593, + 591, 590, 589, 588, 586, 584, 583, 582, 581, 580, + 579, 577, 576, 575, 574, 572, 571, 570, 569, 568, + 566, 565, 563, 562, 561, 560, 559, 558, 557, 556, + + 554, 552, 551, 550, 548, 547, 546, 543, 542, 540, + 539, 538, 537, 536, 535, 534, 532, 531, 530, 529, + 528, 527, 526, 525, 524, 523, 522, 521, 520, 519, + 518, 517, 516, 515, 513, 511, 509, 508, 507, 506, + 505, 504, 503, 502, 497, 496, 494, 490, 489, 488, + 487, 486, 485, 484, 483, 482, 481, 480, 479, 478, + 477, 474, 473, 472, 471, 470, 469, 468, 467, 466, + 465, 462, 460, 459, 458, 455, 454, 453, 452, 451, + 450, 449, 448, 447, 446, 445, 444, 443, 442, 441, + 440, 439, 438, 437, 436, 433, 432, 431, 430, 429, + + 428, 427, 426, 425, 424, 423, 422, 421, 419, 418, + 417, 415, 413, 412, 411, 410, 408, 407, 406, 405, + 404, 403, 402, 401, 400, 397, 396, 395, 394, 393, + 392, 391, 390, 389, 387, 386, 384, 383, 382, 380, + 378, 377, 376, 375, 374, 373, 372, 369, 368, 367, + 366, 365, 364, 363, 362, 361, 360, 358, 357, 355, + 354, 353, 352, 351, 350, 349, 348, 347, 346, 344, + 343, 341, 340, 339, 338, 337, 336, 335, 333, 332, + 331, 330, 329, 328, 327, 325, 324, 317, 316, 315, + 314, 313, 312, 311, 310, 309, 308, 307, 306, 305, + + 304, 303, 302, 301, 300, 299, 298, 296, 295, 294, + 293, 292, 291, 290, 289, 288, 286, 284, 283, 282, + 281, 280, 279, 278, 277, 276, 274, 273, 272, 271, + 270, 269, 268, 267, 266, 264, 263, 262, 261, 260, + 258, 257, 256, 255, 254, 253, 252, 250, 248, 247, + 246, 245, 244, 243, 242, 241, 240, 239, 238, 236, + 235, 234, 232, 231, 230, 229, 227, 226, 225, 222, + 221, 219, 218, 217, 216, 215, 214, 213, 212, 211, + 210, 209, 207, 205, 204, 203, 202, 200, 198, 197, + 195, 194, 192, 190, 189, 188, 187, 186, 185, 184, + + 183, 181, 180, 179, 178, 177, 176, 175, 167, 166, + 165, 164, 163, 162, 160, 156, 155, 151, 150, 149, + 147, 146, 145, 143, 142, 141, 140, 137, 136, 135, + 131, 130, 129, 128, 127, 126, 125, 124, 123, 122, + 119, 115, 114, 113, 111, 110, 108, 107, 105, 104, + 103, 102, 101, 99, 97, 96, 95, 93, 90, 89, + 88, 87, 85, 84, 80, 78, 77, 76, 75, 74, + 73, 72, 71, 70, 54, 46, 45, 43, 38, 32, + 20, 17, 11, 9, 7, 3, 1356, 1356, 1356, 1356, + 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, + + 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, + 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, + 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, + 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, + 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, + 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356 } ; static yy_state_type yy_last_accepting_state; @@ -1551,8 +1556,8 @@ void skipline(void); // versions of flex/bison #define register -#line 1554 "Gmsh.yy.cpp" -#line 1555 "Gmsh.yy.cpp" +#line 1559 "Gmsh.yy.cpp" +#line 1560 "Gmsh.yy.cpp" #define INITIAL 0 @@ -1772,7 +1777,7 @@ YY_DECL #line 78 "Gmsh.l" -#line 1775 "Gmsh.yy.cpp" +#line 1780 "Gmsh.yy.cpp" while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { @@ -1799,13 +1804,13 @@ yy_match: while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1345 ) + if ( yy_current_state >= 1357 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; ++yy_cp; } - while ( yy_base[yy_current_state] != 1475 ); + while ( yy_base[yy_current_state] != 1487 ); yy_find_action: yy_act = yy_accept[yy_current_state]; @@ -2173,97 +2178,97 @@ return tCeil; case 69: YY_RULE_SETUP #line 151 "Gmsh.l" -return tChamfer; +return tCenterOfMass; YY_BREAK case 70: YY_RULE_SETUP #line 152 "Gmsh.l" -return tCharacteristic; +return tChamfer; YY_BREAK case 71: YY_RULE_SETUP #line 153 "Gmsh.l" -return tCircle; +return tCharacteristic; YY_BREAK case 72: YY_RULE_SETUP #line 154 "Gmsh.l" -return tCodeName; +return tCircle; YY_BREAK case 73: YY_RULE_SETUP #line 155 "Gmsh.l" -return tCoherence; +return tCodeName; YY_BREAK case 74: YY_RULE_SETUP #line 156 "Gmsh.l" -return tCohomology; +return tCoherence; YY_BREAK case 75: YY_RULE_SETUP #line 157 "Gmsh.l" -return tColor; +return tCohomology; YY_BREAK case 76: YY_RULE_SETUP #line 158 "Gmsh.l" -return tColorTable; +return tColor; YY_BREAK case 77: YY_RULE_SETUP #line 159 "Gmsh.l" -return tCombine; +return tColorTable; YY_BREAK case 78: YY_RULE_SETUP #line 160 "Gmsh.l" -return tCompound; +return tCombine; YY_BREAK case 79: YY_RULE_SETUP #line 161 "Gmsh.l" -return tCone; +return tCompound; YY_BREAK case 80: YY_RULE_SETUP #line 162 "Gmsh.l" -return tCoordinates; +return tCone; YY_BREAK case 81: YY_RULE_SETUP #line 163 "Gmsh.l" -return tCopyOptions; +return tCoordinates; YY_BREAK case 82: YY_RULE_SETUP #line 164 "Gmsh.l" -return tCos; +return tCopyOptions; YY_BREAK case 83: YY_RULE_SETUP #line 165 "Gmsh.l" -return tCosh; +return tCos; YY_BREAK case 84: YY_RULE_SETUP #line 166 "Gmsh.l" -return tCpu; +return tCosh; YY_BREAK case 85: YY_RULE_SETUP #line 167 "Gmsh.l" -return tCreateGeometry; +return tCpu; YY_BREAK case 86: YY_RULE_SETUP #line 168 "Gmsh.l" -return tCreateTopology; +return tCreateGeometry; YY_BREAK case 87: YY_RULE_SETUP #line 169 "Gmsh.l" -return tCurrentDirectory; +return tCreateTopology; YY_BREAK case 88: YY_RULE_SETUP @@ -2273,67 +2278,67 @@ return tCurrentDirectory; case 89: YY_RULE_SETUP #line 171 "Gmsh.l" -return tCurve; +return tCurrentDirectory; YY_BREAK case 90: YY_RULE_SETUP #line 172 "Gmsh.l" -return tCylinder; +return tCurve; YY_BREAK case 91: YY_RULE_SETUP -#line 174 "Gmsh.l" -return tDefineConstant; +#line 173 "Gmsh.l" +return tCylinder; YY_BREAK case 92: YY_RULE_SETUP #line 175 "Gmsh.l" -return tDefineNumber; +return tDefineConstant; YY_BREAK case 93: YY_RULE_SETUP #line 176 "Gmsh.l" -return tDefineString; +return tDefineNumber; YY_BREAK case 94: YY_RULE_SETUP #line 177 "Gmsh.l" -return tDegenerated; +return tDefineString; YY_BREAK case 95: YY_RULE_SETUP #line 178 "Gmsh.l" -return tDelete; +return tDegenerated; YY_BREAK case 96: YY_RULE_SETUP #line 179 "Gmsh.l" -return tDilate; +return tDelete; YY_BREAK case 97: YY_RULE_SETUP #line 180 "Gmsh.l" -return tDimNameSpace; +return tDilate; YY_BREAK case 98: YY_RULE_SETUP #line 181 "Gmsh.l" -return tDirName; +return tDimNameSpace; YY_BREAK case 99: YY_RULE_SETUP #line 182 "Gmsh.l" -return tDisk; +return tDirName; YY_BREAK case 100: YY_RULE_SETUP #line 183 "Gmsh.l" -return tDraw; +return tDisk; YY_BREAK case 101: YY_RULE_SETUP -#line 185 "Gmsh.l" -return tEllipse; +#line 184 "Gmsh.l" +return tDraw; YY_BREAK case 102: YY_RULE_SETUP @@ -2343,317 +2348,317 @@ return tEllipse; case 103: YY_RULE_SETUP #line 187 "Gmsh.l" -return tEllipsoid; +return tEllipse; YY_BREAK case 104: YY_RULE_SETUP #line 188 "Gmsh.l" -return tElliptic; +return tEllipsoid; YY_BREAK case 105: YY_RULE_SETUP #line 189 "Gmsh.l" -return tElse; +return tElliptic; YY_BREAK case 106: YY_RULE_SETUP #line 190 "Gmsh.l" -return tElseIf; +return tElse; YY_BREAK case 107: YY_RULE_SETUP #line 191 "Gmsh.l" -return tEndFor; +return tElseIf; YY_BREAK case 108: YY_RULE_SETUP #line 192 "Gmsh.l" -return tEndIf; +return tEndFor; YY_BREAK case 109: YY_RULE_SETUP #line 193 "Gmsh.l" -return tError; +return tEndIf; YY_BREAK case 110: YY_RULE_SETUP #line 194 "Gmsh.l" -return tEuclidian; +return tError; YY_BREAK case 111: YY_RULE_SETUP #line 195 "Gmsh.l" -return tExists; +return tEuclidian; YY_BREAK case 112: YY_RULE_SETUP #line 196 "Gmsh.l" -return tExit; +return tExists; YY_BREAK case 113: YY_RULE_SETUP #line 197 "Gmsh.l" -return tExp; +return tExit; YY_BREAK case 114: YY_RULE_SETUP #line 198 "Gmsh.l" -return tExtrude; +return tExp; YY_BREAK case 115: YY_RULE_SETUP -#line 200 "Gmsh.l" -return tFabs; +#line 199 "Gmsh.l" +return tExtrude; YY_BREAK case 116: YY_RULE_SETUP #line 201 "Gmsh.l" -return tField; +return tFabs; YY_BREAK case 117: YY_RULE_SETUP #line 202 "Gmsh.l" -return tFileExists; +return tField; YY_BREAK case 118: YY_RULE_SETUP #line 203 "Gmsh.l" -return tFillet; +return tFileExists; YY_BREAK case 119: YY_RULE_SETUP #line 204 "Gmsh.l" -return tFind; +return tFillet; YY_BREAK case 120: YY_RULE_SETUP #line 205 "Gmsh.l" -return tFixRelativePath; +return tFind; YY_BREAK case 121: YY_RULE_SETUP #line 206 "Gmsh.l" -return tFloor; +return tFixRelativePath; YY_BREAK case 122: YY_RULE_SETUP #line 207 "Gmsh.l" -return tFmod; +return tFloor; YY_BREAK case 123: YY_RULE_SETUP #line 208 "Gmsh.l" -return tFor; +return tFmod; YY_BREAK case 124: YY_RULE_SETUP #line 209 "Gmsh.l" -return tMacro; +return tFor; YY_BREAK case 125: YY_RULE_SETUP -#line 211 "Gmsh.l" -return tGMSH_MAJOR_VERSION; +#line 210 "Gmsh.l" +return tMacro; YY_BREAK case 126: YY_RULE_SETUP #line 212 "Gmsh.l" -return tGMSH_MINOR_VERSION; +return tGMSH_MAJOR_VERSION; YY_BREAK case 127: YY_RULE_SETUP #line 213 "Gmsh.l" -return tGMSH_PATCH_VERSION; +return tGMSH_MINOR_VERSION; YY_BREAK case 128: YY_RULE_SETUP #line 214 "Gmsh.l" -return tGeoEntity; +return tGMSH_PATCH_VERSION; YY_BREAK case 129: YY_RULE_SETUP #line 215 "Gmsh.l" -return tGetEnv; +return tGeoEntity; YY_BREAK case 130: YY_RULE_SETUP #line 216 "Gmsh.l" -return tGetForced; +return tGetEnv; YY_BREAK case 131: YY_RULE_SETUP #line 217 "Gmsh.l" -return tGetForcedStr; +return tGetForced; YY_BREAK case 132: YY_RULE_SETUP #line 218 "Gmsh.l" -return tGetNumber; +return tGetForcedStr; YY_BREAK case 133: YY_RULE_SETUP #line 219 "Gmsh.l" -return tGetString; +return tGetNumber; YY_BREAK case 134: YY_RULE_SETUP #line 220 "Gmsh.l" -return tGetStringValue; +return tGetString; YY_BREAK case 135: YY_RULE_SETUP #line 221 "Gmsh.l" -return tGetValue; +return tGetStringValue; YY_BREAK case 136: YY_RULE_SETUP #line 222 "Gmsh.l" -return tGmshExecutableName; +return tGetValue; YY_BREAK case 137: YY_RULE_SETUP -#line 224 "Gmsh.l" -return tHide; +#line 223 "Gmsh.l" +return tGmshExecutableName; YY_BREAK case 138: YY_RULE_SETUP #line 225 "Gmsh.l" -return tHole; +return tHide; YY_BREAK case 139: YY_RULE_SETUP #line 226 "Gmsh.l" -return tHomology; +return tHole; YY_BREAK case 140: YY_RULE_SETUP #line 227 "Gmsh.l" -return tHypot; +return tHomology; YY_BREAK case 141: YY_RULE_SETUP -#line 229 "Gmsh.l" -return tInterpolationScheme; +#line 228 "Gmsh.l" +return tHypot; YY_BREAK case 142: YY_RULE_SETUP #line 230 "Gmsh.l" -return tIf; +return tInterpolationScheme; YY_BREAK case 143: YY_RULE_SETUP #line 231 "Gmsh.l" -return tIn; +return tIf; YY_BREAK case 144: YY_RULE_SETUP #line 232 "Gmsh.l" -return tIntersect; +return tIn; YY_BREAK case 145: YY_RULE_SETUP -#line 234 "Gmsh.l" -return tNurbsKnots; +#line 233 "Gmsh.l" +return tIntersect; YY_BREAK case 146: YY_RULE_SETUP -#line 236 "Gmsh.l" -return tLayers; +#line 235 "Gmsh.l" +return tNurbsKnots; YY_BREAK case 147: YY_RULE_SETUP #line 237 "Gmsh.l" -return tLength; +return tLayers; YY_BREAK case 148: YY_RULE_SETUP #line 238 "Gmsh.l" -return tLevelset; +return tLength; YY_BREAK case 149: YY_RULE_SETUP #line 239 "Gmsh.l" -return tLinSpace; +return tLevelset; YY_BREAK case 150: YY_RULE_SETUP #line 240 "Gmsh.l" -return tCurve; +return tLinSpace; YY_BREAK case 151: YY_RULE_SETUP #line 241 "Gmsh.l" -return tList; +return tCurve; YY_BREAK case 152: YY_RULE_SETUP #line 242 "Gmsh.l" -return tListFromFile; +return tList; YY_BREAK case 153: YY_RULE_SETUP #line 243 "Gmsh.l" -return tLog; +return tListFromFile; YY_BREAK case 154: YY_RULE_SETUP #line 244 "Gmsh.l" -return tLog10; +return tLog; YY_BREAK case 155: YY_RULE_SETUP #line 245 "Gmsh.l" -return tLogSpace; +return tLog10; YY_BREAK case 156: YY_RULE_SETUP #line 246 "Gmsh.l" -return tLowerCase; +return tLogSpace; YY_BREAK case 157: YY_RULE_SETUP #line 247 "Gmsh.l" -return tLowerCaseIn; +return tLowerCase; YY_BREAK case 158: YY_RULE_SETUP -#line 249 "Gmsh.l" -return tMPI_Rank; +#line 248 "Gmsh.l" +return tLowerCaseIn; YY_BREAK case 159: YY_RULE_SETUP #line 250 "Gmsh.l" -return tMPI_Size; +return tMPI_Rank; YY_BREAK case 160: YY_RULE_SETUP #line 251 "Gmsh.l" -return tMacro; +return tMPI_Size; YY_BREAK case 161: YY_RULE_SETUP #line 252 "Gmsh.l" -return tMemory; +return tMacro; YY_BREAK case 162: YY_RULE_SETUP #line 253 "Gmsh.l" -return tMeshAlgorithm; +return tMass; YY_BREAK case 163: YY_RULE_SETUP #line 254 "Gmsh.l" -return tModulo; +return tMemory; YY_BREAK case 164: YY_RULE_SETUP -#line 256 "Gmsh.l" -return tNameToString; +#line 255 "Gmsh.l" +return tMeshAlgorithm; YY_BREAK case 165: YY_RULE_SETUP -#line 257 "Gmsh.l" -return tNameStruct; +#line 256 "Gmsh.l" +return tModulo; YY_BREAK case 166: YY_RULE_SETUP @@ -2663,480 +2668,490 @@ return tNameToString; case 167: YY_RULE_SETUP #line 259 "Gmsh.l" -return tNewModel; +return tNameStruct; YY_BREAK case 168: YY_RULE_SETUP #line 260 "Gmsh.l" -return tNurbs; +return tNameToString; YY_BREAK case 169: YY_RULE_SETUP -#line 262 "Gmsh.l" -return tOnelabAction; +#line 261 "Gmsh.l" +return tNewModel; YY_BREAK case 170: YY_RULE_SETUP -#line 263 "Gmsh.l" -return tOnelabRun; +#line 262 "Gmsh.l" +return tNurbs; YY_BREAK case 171: YY_RULE_SETUP #line 264 "Gmsh.l" -return tNurbsOrder; +return tOnelabAction; YY_BREAK case 172: YY_RULE_SETUP -#line 266 "Gmsh.l" -return tParametric; +#line 265 "Gmsh.l" +return tOnelabRun; YY_BREAK case 173: YY_RULE_SETUP -#line 267 "Gmsh.l" -return tParent; +#line 266 "Gmsh.l" +return tNurbsOrder; YY_BREAK case 174: YY_RULE_SETUP #line 268 "Gmsh.l" -return tPeriodic; +return tParametric; YY_BREAK case 175: YY_RULE_SETUP #line 269 "Gmsh.l" -return tPhysical; +return tParent; YY_BREAK case 176: YY_RULE_SETUP #line 270 "Gmsh.l" -return tPi; +return tPeriodic; YY_BREAK case 177: YY_RULE_SETUP #line 271 "Gmsh.l" -return tPlane; +return tPhysical; YY_BREAK case 178: YY_RULE_SETUP #line 272 "Gmsh.l" -return tPlugin; +return tPi; YY_BREAK case 179: YY_RULE_SETUP #line 273 "Gmsh.l" -return tPoint; +return tPlane; YY_BREAK case 180: YY_RULE_SETUP #line 274 "Gmsh.l" -return tPolarSphere; +return tPlugin; YY_BREAK case 181: YY_RULE_SETUP #line 275 "Gmsh.l" -return tPrintf; +return tPoint; YY_BREAK case 182: YY_RULE_SETUP -#line 277 "Gmsh.l" -return tQuadric; +#line 276 "Gmsh.l" +return tPolarSphere; YY_BREAK case 183: YY_RULE_SETUP -#line 278 "Gmsh.l" -return tQuadTriAddVerts; +#line 277 "Gmsh.l" +return tPrintf; YY_BREAK case 184: YY_RULE_SETUP #line 279 "Gmsh.l" -return tQuadTriNoNewVerts; +return tQuadric; YY_BREAK case 185: YY_RULE_SETUP -#line 281 "Gmsh.l" -return tRand; +#line 280 "Gmsh.l" +return tQuadTriAddVerts; YY_BREAK case 186: YY_RULE_SETUP -#line 282 "Gmsh.l" -return tRecombLaterals; +#line 281 "Gmsh.l" +return tQuadTriNoNewVerts; YY_BREAK case 187: YY_RULE_SETUP #line 283 "Gmsh.l" -return tRecombine; +return tRand; YY_BREAK case 188: YY_RULE_SETUP #line 284 "Gmsh.l" -return tRectangle; +return tRecombLaterals; YY_BREAK case 189: YY_RULE_SETUP #line 285 "Gmsh.l" -return tRecursive; +return tRecombine; YY_BREAK case 190: YY_RULE_SETUP #line 286 "Gmsh.l" -return tRefineMesh; +return tRectangle; YY_BREAK case 191: YY_RULE_SETUP #line 287 "Gmsh.l" -return tRelocateMesh; +return tRecursive; YY_BREAK case 192: YY_RULE_SETUP #line 288 "Gmsh.l" -return tReorientMesh; +return tRefineMesh; YY_BREAK case 193: YY_RULE_SETUP #line 289 "Gmsh.l" -return tRenumberMeshNodes; +return tRelocateMesh; YY_BREAK case 194: YY_RULE_SETUP #line 290 "Gmsh.l" -return tRenumberMeshElements; +return tReorientMesh; YY_BREAK case 195: YY_RULE_SETUP #line 291 "Gmsh.l" -return tReturn; +return tRenumberMeshNodes; YY_BREAK case 196: YY_RULE_SETUP #line 292 "Gmsh.l" -return tReverseMesh; +return tRenumberMeshElements; YY_BREAK case 197: YY_RULE_SETUP #line 293 "Gmsh.l" -return tReverseMesh; +return tReturn; YY_BREAK case 198: YY_RULE_SETUP #line 294 "Gmsh.l" -return tRotate; +return tReverseMesh; YY_BREAK case 199: YY_RULE_SETUP #line 295 "Gmsh.l" -return tRound; +return tReverseMesh; YY_BREAK case 200: YY_RULE_SETUP #line 296 "Gmsh.l" -return tRuled; +return tRotate; YY_BREAK case 201: YY_RULE_SETUP -#line 298 "Gmsh.l" -return tStringToName; +#line 297 "Gmsh.l" +return tRound; YY_BREAK case 202: YY_RULE_SETUP -#line 299 "Gmsh.l" -return tScaleLast; +#line 298 "Gmsh.l" +return tRuled; YY_BREAK case 203: YY_RULE_SETUP #line 300 "Gmsh.l" -return tSetChanged; +return tStringToName; YY_BREAK case 204: YY_RULE_SETUP #line 301 "Gmsh.l" -return tSetFactory; +return tScaleLast; YY_BREAK case 205: YY_RULE_SETUP #line 302 "Gmsh.l" -return tSetTag; +return tSetChanged; YY_BREAK case 206: YY_RULE_SETUP #line 303 "Gmsh.l" -return tSetNumber; +return tSetFactory; YY_BREAK case 207: YY_RULE_SETUP #line 304 "Gmsh.l" -return tSetPartition; +return tSetTag; YY_BREAK case 208: YY_RULE_SETUP #line 305 "Gmsh.l" -return tSetString; +return tSetNumber; YY_BREAK case 209: YY_RULE_SETUP #line 306 "Gmsh.l" -return tShapeFromFile; +return tSetPartition; YY_BREAK case 210: YY_RULE_SETUP #line 307 "Gmsh.l" -return tShow; +return tSetString; YY_BREAK case 211: YY_RULE_SETUP #line 308 "Gmsh.l" -return tSin; +return tShapeFromFile; YY_BREAK case 212: YY_RULE_SETUP #line 309 "Gmsh.l" -return tSinh; +return tShow; YY_BREAK case 213: YY_RULE_SETUP #line 310 "Gmsh.l" -return tSlide; +return tSin; YY_BREAK case 214: YY_RULE_SETUP #line 311 "Gmsh.l" -return tSmoother; +return tSinh; YY_BREAK case 215: YY_RULE_SETUP #line 312 "Gmsh.l" -return tSphere; +return tSlide; YY_BREAK case 216: YY_RULE_SETUP #line 313 "Gmsh.l" -return tSpline; +return tSmoother; YY_BREAK case 217: YY_RULE_SETUP #line 314 "Gmsh.l" -return tSplit; +return tSphere; YY_BREAK case 218: YY_RULE_SETUP #line 315 "Gmsh.l" -return tSprintf; +return tSpline; YY_BREAK case 219: YY_RULE_SETUP #line 316 "Gmsh.l" -return tSqrt; +return tSplit; YY_BREAK case 220: YY_RULE_SETUP #line 317 "Gmsh.l" -return tStr; +return tSprintf; YY_BREAK case 221: YY_RULE_SETUP #line 318 "Gmsh.l" -return tStrCat; +return tSqrt; YY_BREAK case 222: YY_RULE_SETUP #line 319 "Gmsh.l" -return tStrChoice; +return tStr; YY_BREAK case 223: YY_RULE_SETUP #line 320 "Gmsh.l" -return tStrCmp; +return tStrCat; YY_BREAK case 224: YY_RULE_SETUP #line 321 "Gmsh.l" -return tStrFind; +return tStrChoice; YY_BREAK case 225: YY_RULE_SETUP #line 322 "Gmsh.l" -return tStrLen; +return tStrCmp; YY_BREAK case 226: YY_RULE_SETUP #line 323 "Gmsh.l" -return tStrPrefix; +return tStrFind; YY_BREAK case 227: YY_RULE_SETUP #line 324 "Gmsh.l" -return tStrRelative; +return tStrLen; YY_BREAK case 228: YY_RULE_SETUP #line 325 "Gmsh.l" -return tStrReplace; +return tStrPrefix; YY_BREAK case 229: YY_RULE_SETUP #line 326 "Gmsh.l" -return tStrSub; +return tStrRelative; YY_BREAK case 230: YY_RULE_SETUP #line 327 "Gmsh.l" -return tStringToName; +return tStrReplace; YY_BREAK case 231: YY_RULE_SETUP #line 328 "Gmsh.l" -return tDefineStruct; +return tStrSub; YY_BREAK case 232: YY_RULE_SETUP #line 329 "Gmsh.l" -return tSurface; +return tStringToName; YY_BREAK case 233: YY_RULE_SETUP #line 330 "Gmsh.l" -return tSymmetry; +return tDefineStruct; YY_BREAK case 234: YY_RULE_SETUP #line 331 "Gmsh.l" -return tSyncModel; +return tSurface; YY_BREAK case 235: YY_RULE_SETUP -#line 333 "Gmsh.l" -return tText2D; +#line 332 "Gmsh.l" +return tSymmetry; YY_BREAK case 236: YY_RULE_SETUP -#line 334 "Gmsh.l" -return tText3D; +#line 333 "Gmsh.l" +return tSyncModel; YY_BREAK case 237: YY_RULE_SETUP #line 335 "Gmsh.l" -return tTime; +return tText2D; YY_BREAK case 238: YY_RULE_SETUP #line 336 "Gmsh.l" -return tTan; +return tText3D; YY_BREAK case 239: YY_RULE_SETUP #line 337 "Gmsh.l" -return tTanh; +return tTime; YY_BREAK case 240: YY_RULE_SETUP #line 338 "Gmsh.l" -return tTestLevel; +return tTan; YY_BREAK case 241: YY_RULE_SETUP #line 339 "Gmsh.l" -return tTextAttributes; +return tTanh; YY_BREAK case 242: YY_RULE_SETUP #line 340 "Gmsh.l" -return tThickSolid; +return tTestLevel; YY_BREAK case 243: YY_RULE_SETUP #line 341 "Gmsh.l" -return tThruSections; +return tTextAttributes; YY_BREAK case 244: YY_RULE_SETUP #line 342 "Gmsh.l" -return tToday; +return tThickSolid; YY_BREAK case 245: YY_RULE_SETUP #line 343 "Gmsh.l" -return tTorus; +return tThruSections; YY_BREAK case 246: YY_RULE_SETUP #line 344 "Gmsh.l" -return tTotalMemory; +return tToday; YY_BREAK case 247: YY_RULE_SETUP #line 345 "Gmsh.l" -return tTransfQuadTri; +return tTorus; YY_BREAK case 248: YY_RULE_SETUP #line 346 "Gmsh.l" -return tTransfinite; +return tTotalMemory; YY_BREAK case 249: YY_RULE_SETUP #line 347 "Gmsh.l" -return tTranslate; +return tTransfQuadTri; YY_BREAK case 250: YY_RULE_SETUP -#line 349 "Gmsh.l" -return tUndefineConstant; +#line 348 "Gmsh.l" +return tTransfinite; YY_BREAK case 251: YY_RULE_SETUP -#line 350 "Gmsh.l" -return tUnique; +#line 349 "Gmsh.l" +return tTranslate; YY_BREAK case 252: YY_RULE_SETUP #line 351 "Gmsh.l" -return tUpperCase; +return tUndefineConstant; YY_BREAK case 253: YY_RULE_SETUP #line 352 "Gmsh.l" -return tUsing; +return tUnique; YY_BREAK case 254: YY_RULE_SETUP -#line 354 "Gmsh.l" -return tVolume; +#line 353 "Gmsh.l" +return tUpperCase; YY_BREAK case 255: YY_RULE_SETUP -#line 356 "Gmsh.l" -return tWedge; +#line 354 "Gmsh.l" +return tUsing; YY_BREAK case 256: YY_RULE_SETUP -#line 357 "Gmsh.l" -return tWire; +#line 356 "Gmsh.l" +return tVolume; YY_BREAK case 257: -#line 360 "Gmsh.l" +YY_RULE_SETUP +#line 358 "Gmsh.l" +return tWedge; + YY_BREAK case 258: -#line 361 "Gmsh.l" +YY_RULE_SETUP +#line 359 "Gmsh.l" +return tWire; + YY_BREAK case 259: #line 362 "Gmsh.l" case 260: +#line 363 "Gmsh.l" +case 261: +#line 364 "Gmsh.l" +case 262: YY_RULE_SETUP -#line 362 "Gmsh.l" +#line 364 "Gmsh.l" { gmsh_yylval.d = atof((char *)yytext); return tDOUBLE; } YY_BREAK -case 261: +case 263: YY_RULE_SETUP -#line 364 "Gmsh.l" +#line 366 "Gmsh.l" { gmsh_yylval.c = strsave((char*)yytext); return tSTRING; } YY_BREAK -case 262: +case 264: YY_RULE_SETUP -#line 366 "Gmsh.l" +#line 368 "Gmsh.l" return yytext[0]; YY_BREAK -case 263: +case 265: YY_RULE_SETUP -#line 368 "Gmsh.l" +#line 370 "Gmsh.l" ECHO; YY_BREAK -#line 3139 "Gmsh.yy.cpp" +#line 3154 "Gmsh.yy.cpp" case YY_STATE_EOF(INITIAL): yyterminate(); @@ -3433,7 +3448,7 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1345 ) + if ( yy_current_state >= 1357 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; @@ -3461,11 +3476,11 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1345 ) + if ( yy_current_state >= 1357 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - yy_is_jam = (yy_current_state == 1344); + yy_is_jam = (yy_current_state == 1356); return yy_is_jam ? 0 : yy_current_state; } @@ -4141,7 +4156,7 @@ void yyfree (void * ptr ) #define YYTABLES_NAME "yytables" -#line 368 "Gmsh.l" +#line 370 "Gmsh.l" #undef gmsh_yywrap diff --git a/Plugin/AnalyseCurvedMesh.cpp b/Plugin/AnalyseCurvedMesh.cpp index a476e5661a984c892b684bd17f36a941bddd9d60..d215892903baf943eced449a140038c5411c1e82 100644 --- a/Plugin/AnalyseCurvedMesh.cpp +++ b/Plugin/AnalyseCurvedMesh.cpp @@ -8,23 +8,22 @@ #if defined(HAVE_MESH) #include "AnalyseCurvedMesh.h" +#include "qualityMeasuresJacobian.h" #include "OS.h" #include "Context.h" -#if defined(HAVE_OPENGL) -#include "drawContext.h" -#endif #include "PView.h" #include "GModel.h" #include "MElement.h" +#include "bezierBasis.h" #include <sstream> #include <fstream> -#include "qualityMeasuresJacobian.h" +#if defined(HAVE_OPENGL) +#include "drawContext.h" +#endif #if defined(HAVE_VISUDEV) #include "BasisFactory.h" #endif -class bezierBasis; - StringXNumber CurvedMeshOptions_Number[] = { {GMSH_FULLRC, "JacobianDeterminant", NULL, 0}, {GMSH_FULLRC, "IGEMeasure", NULL, 0}, @@ -92,10 +91,9 @@ std::string GMSH_AnalyseCurvedMeshPlugin::getHelp() const "- ICNMeasure = {0, 1}\n" "\n" "- HidingThreshold = [0, 1]: Hides all element for which min(mu) is " - "strictly greater than the threshold, where mu is the ICN if ICN " - "measure == 1, " - "otherwise mu is the IGE it IGE measure == 1, " - "otherwise mu is the Jacobian determinant.\n" + "strictly greater than the threshold, where mu is ICN if" + "ICNMeasure == 1, otherwise it is IGE if IGEMeasure == 1. " + "If ICNMeasure == IGEMeasure == 0, nothing happens. " "If threshold == 0, hides all elements except invalid.\n" "\n" "- DrawPView = {0, 1}: Creates a PView of min(J)/max(J), min(IGE) " @@ -195,7 +193,7 @@ PView *GMSH_AnalyseCurvedMeshPlugin::execute(PView *v) #endif // Create PView - if(drawPView) + if(drawPView) { for(int dim = 1; dim <= 3; ++dim) { if((askedDim == 4 && dim > 1) || dim == askedDim) { if(!_pviewJac[dim - 1] && computeJac) { @@ -248,8 +246,9 @@ PView *GMSH_AnalyseCurvedMeshPlugin::execute(PView *v) } } } + } - // Hide elements + // Hide elements #if defined(HAVE_OPENGL) _hideWithThreshold(askedDim, computeICN ? 2 : computeIGE ? 1 : computeJac ? 0 : -1); @@ -278,8 +277,7 @@ void GMSH_AnalyseCurvedMeshPlugin::_computeMinMaxJandValidity(int dim) for(GModel::eiter it = _m->firstEdge(); it != _m->lastEdge(); it++) entities.insert(*it); break; - default: - return; + default: return; } int cntInverted = 0; @@ -382,6 +380,7 @@ void GMSH_AnalyseCurvedMeshPlugin::_computeMinMaxJandValidity(int dim) Msg::Warning("%d elements are completely inverted", cntInverted); } _computedJac[dim - 1] = true; + bezierCoeff::releasePools(); } void GMSH_AnalyseCurvedMeshPlugin::_computeMinIGE(int dim) @@ -393,7 +392,7 @@ void GMSH_AnalyseCurvedMeshPlugin::_computeMinIGE(int dim) for(std::size_t i = 0; i < _data.size(); ++i) { MElement *const el = _data[i].element(); if(el->getDim() != dim) continue; - if(_data[i].minJ() <= 0 && _data[i].maxJ() > 0) { + if(_data[i].minJ() <= 0 && _data[i].maxJ() >= 0) { _data[i].setMinS(0); } else { @@ -414,7 +413,7 @@ void GMSH_AnalyseCurvedMeshPlugin::_computeMinICN(int dim) for(std::size_t i = 0; i < _data.size(); ++i) { MElement *const el = _data[i].element(); if(el->getDim() != dim) continue; - if(_data[i].minJ() <= 0 && _data[i].maxJ() > 0) { + if(_data[i].minJ() <= 0 && _data[i].maxJ() >= 0) { _data[i].setMinI(0); } else { @@ -430,7 +429,7 @@ int GMSH_AnalyseCurvedMeshPlugin::_hideWithThreshold(int askedDim, int whichMeasure) { // only hide for quality measures - if(_threshold > 1 || whichMeasure == 0) return 0; + if(_threshold > 1 || whichMeasure < 1) return 0; int nHidden = 0; @@ -567,7 +566,8 @@ void GMSH_AnalyseCurvedMeshPlugin::_computePointwiseQuantities( } if(_pwJac) { - jacobianBasedQuality::sampleJacobian(el, _viewOrder, tmpVector, normals); + jacobianBasedQuality::sampleJacobianDeterminant(el, _viewOrder, tmpVector, + normals); std::vector<double> &vec = _dataPViewJac[num]; for(int j = 0; j < tmpVector.size(); ++j) vec.push_back(tmpVector(j)); } diff --git a/Post/OctreePost.cpp b/Post/OctreePost.cpp index 8d6239c8597a9dea83812499df2f94d6bea5a8d7..1761dfa4db0f393cda8659c58e9dfbb10527de7c 100644 --- a/Post/OctreePost.cpp +++ b/Post/OctreePost.cpp @@ -449,7 +449,8 @@ static MElement *getElement(double P[3], GModel *m, int qn, double *qx, if(elements.size()) return elements[0]; } else { - return m->getMeshElementByCoord(pt); + SPoint3 uvw; + return m->getMeshElementByCoord(pt, uvw); } return 0; } diff --git a/Post/PView.cpp b/Post/PView.cpp index 6f25bec732e3beea24efbdc9a96c677f1f681abe..31aa1a207b3a3fbca2cd237fd2941b860a9997f4 100644 --- a/Post/PView.cpp +++ b/Post/PView.cpp @@ -68,9 +68,9 @@ PView::PView(PViewData *data, int tag) _options->targetError); } -PView::PView(PView *ref, bool copyOptions) +PView::PView(PView *ref, bool copyOptions, int tag) { - _init(); + _init(tag); if(ref->getAliasOf() >= 0) { // alias of an alias PView *orig = getViewByTag(ref->getAliasOf()); diff --git a/Post/PView.h b/Post/PView.h index a61bd3c03b20d2f6cba107f37f18d232796494c2..66b1cb6deac1e4dc920417aa9c99fd0dbd3c50bc 100644 --- a/Post/PView.h +++ b/Post/PView.h @@ -48,7 +48,7 @@ public: // construct a new view using the given data PView(PViewData *data, int tag = -1); // construct a new view, alias of the view "ref" - PView(PView *ref, bool copyOptions = true); + PView(PView *ref, bool copyOptions = true, int tag = -1); // construct a new list-based view from a simple 2D point dataset PView(const std::string &xname, const std::string &yname, std::vector<double> &x, std::vector<double> &y); @@ -131,6 +131,7 @@ public: static bool readMSH(const std::string &fileName, int fileIndex = -1, int partitionToRead = -1); static bool readMED(const std::string &fileName, int fileIndex = -1); + static bool readPCH(const std::string &fileName, int fileIndex = -1); static bool writeX3D(const std::string &fileName); // IO write routine bool write(const std::string &fileName, int format, bool append = false); diff --git a/Post/PViewDataGModel.h b/Post/PViewDataGModel.h index 26d4dfea06123d47a1a2c82b9112eaf9509f127d..b8de8ab5f3f0086c2c2590b0d67f054a2ee7184a 100644 --- a/Post/PViewDataGModel.h +++ b/Post/PViewDataGModel.h @@ -276,6 +276,8 @@ public: bool forceElementData = false); bool readMED(const std::string &fileName, int fileIndex); bool writeMED(const std::string &fileName); + bool readPCH(const std::string &fileName, int fileIndex); + void importLists(int N[24], std::vector<double> *V[24]); stepData<double> *getStepData(int step) { diff --git a/Post/PViewDataGModelIO.cpp b/Post/PViewDataGModelIO.cpp index 9a0550e81d6af1a456680786998a345b348f8a41..7b3170b813447398dd148d11f5d2d4d980a25dfe 100644 --- a/Post/PViewDataGModelIO.cpp +++ b/Post/PViewDataGModelIO.cpp @@ -1033,6 +1033,18 @@ bool PViewDataGModel::writeMED(const std::string &fileName) #endif +bool PViewDataGModel::readPCH(const std::string &fileName, int fileIndex) +{ + Msg::Info("Placeholder for reading punch file '%s'", + fileName.c_str()); + + std::map<int, std::vector<double> > data; + for(int i = 1; i < 200; i++) + data[i].push_back(1.234); + addData(GModel::current(), data, 0, 0.0, 1, 1); + + return true; +} void PViewDataGModel::sendToServer(const std::string &name) { diff --git a/Post/PViewIO.cpp b/Post/PViewIO.cpp index 942f6cb0df078b4fb60f465cd0c0960660d05602..bd5c4ff4272ae799ec74208b47c851f9e1453de4 100644 --- a/Post/PViewIO.cpp +++ b/Post/PViewIO.cpp @@ -360,6 +360,18 @@ bool PView::readMED(const std::string &fileName, int fileIndex) #endif +bool PView::readPCH(const std::string &fileName, int fileIndex) +{ + PViewDataGModel::DataType type = PViewDataGModel::NodeData; + // PViewDataGModel::ElementData; + // PViewDataGModel::ElementNodeData; + PViewDataGModel *d = new PViewDataGModel(type); + d->setFileName(fileName); + d->readPCH(fileName, fileIndex); + new PView(d); + return true; +} + bool PView::write(const std::string &fileName, int format, bool append) { Msg::StatusBar(true, "Writing '%s'...", fileName.c_str()); diff --git a/README.txt b/README.txt index ac4e27e707f3d3f1c06dc802137758f960ba7717..5d1255dc87747c5f6721e993c6cccc2671ead17e 100644 --- a/README.txt +++ b/README.txt @@ -26,17 +26,33 @@ Build Gmsh from the command line mkdir build -* Run cmake from within the build directory, pointing to Gmsh's source - directory: +* To build the monolithic Gmsh app with the default build options, run cmake + from within the build directory, pointing to Gmsh's source directory, then run + "make" cd build cmake .. + make + + Optionally running + + make install + + will install the Gmsh app in the standard system location (controlled by + CMAKE_INSTALL_PREFIX - see below). -* To build and install Gmsh then simply type +* To build the Gmsh app dynamically linked to the shared Gmsh library, which can + then also be used by external codes through the C++, C, Python and Julia Gmsh + API, run + cd build + cmake -DENABLE_BUILD_DYNAMIC=1 .. make make install + This will install the Gmsh app and the shared Gmsh library, as well as the C++ + and C include files and the Python and Julia modules. + * To change build options you can use "ccmake" instead of "cmake", e.g.: ccmake .. @@ -58,27 +74,6 @@ Build Gmsh from the command line to build a version of Gmsh without the FLTK graphical interface. The list of all available configuration options is given in the reference manual. -* You can keep multiple builds with different build options at the same - time. For example, you could configure a debug graphical build in a "bin" - subdirectory with - - cd bin - cmake -DCMAKE_BUILD_TYPE=Debug .. - make - make install - - and configure a fairly minimal static library (with only the geometry and - post-processing modules and the parser) in a "lib" subdirectory with - - cd lib - cmake -DDEFAULT=0 -DENABLE_BUILD_LIB=1 -DENABLE_POST=1 -DENABLE_PARSER=1 .. - make lib - make install/fast - - (Note that "make install/fast" allows you to install only the target that you - just built, i.e. "lib", and will not trigger the recompilation of the default - target "gmsh".) - * To see a detailed compilation log use make VERBOSE=1 diff --git a/Solver/STensor33.cpp b/Solver/STensor33.cpp index 760dbd8389a3b9624b2ae16267d7854ed1c04582..a062bed9070d0dae33d170deb6a6f0643d3c7a31 100644 --- a/Solver/STensor33.cpp +++ b/Solver/STensor33.cpp @@ -11,8 +11,8 @@ void STensor33::print(const char *s) const { - char format[512]; - const char l[256] = "%12.5E %12.5E %12.5E \n"; + char format[2048]; + const char l[128] = "%12.5E %12.5E %12.5E \n"; sprintf(format, " tensor3 %s : \n %s %s %s \n %s %s %s \n %s %s %s \n", s, l, l, l, l, l, l, l, l, l); printf(format, s, _val[0], _val[1], _val[2], _val[3], _val[4], _val[5], diff --git a/Solver/STensor43.cpp b/Solver/STensor43.cpp index 8fd9df6913d4bc4fd82d8e515c755995bedf952e..e3632e4f43def5edcf26667270cee66214cac527 100644 --- a/Solver/STensor43.cpp +++ b/Solver/STensor43.cpp @@ -11,8 +11,8 @@ void STensor43::print(const char *s) const { - char format[2048]; - const char l[256] = + char format[8192]; + const char l[128] = "%12.5E %12.5E %12.5E %12.5E %12.5E %12.5E %12.5E %12.5E %12.5E \n"; sprintf(format, " tensor4 %s : \n %s %s %s \n %s %s %s \n %s %s %s \n", s, l, l, l, l, l, l, l, l, l); diff --git a/api/GenApi.py b/api/GenApi.py index 8a19b18458a0a3e2f8995d245953195c999154c9..b58d074a6095a70af8ecde5adf83adfddbb1dcd5 100644 --- a/api/GenApi.py +++ b/api/GenApi.py @@ -77,7 +77,7 @@ def ivoidstar(name, value=None, python_value=None, julia_value=None): a = arg(name, value, python_value, julia_value, "const void *", "const void *", False) a.python_arg = "c_void_p(" + name + ")" - a.julia_ctype = "Ptr{Nothing}" + a.julia_ctype = "Ptr{Cvoid}" return a def ivectorint(name, value=None, python_value=None, julia_value=None): @@ -140,7 +140,7 @@ def ivectordouble(name, value=None, python_value=None, julia_value=None): a.python_pre = api_name + ", " + api_name_n + " = _ivectordouble(" + name + ")" a.python_arg = api_name + ", " + api_name_n a.julia_ctype = "Ptr{Cdouble}, Csize_t" - a.julia_arg = name + ", length(" + name + ")" + a.julia_arg = "convert(Vector{Cdouble}, " + name + "), length(" + name + ")" return a def ivectorstring(name, value=None, python_value=None, julia_value=None): @@ -686,11 +686,10 @@ class Module: self.submodules = [] def add(self, name, doc, rtype, *args): - self.fs.append((rtype, name, args, doc, '')) + self.fs.append((rtype, name, args, doc, [])) - # a raw C implementation of the function is available - def add_rawc(self, name, doc, rtype, *args): - self.fs.append((rtype, name, args, doc, 'rawc')) + def add_special(self, name, doc, special, rtype, *args): + self.fs.append((rtype, name, args, doc, special)) def add_module(self, name, doc): module = Module(name, doc) @@ -948,6 +947,8 @@ from math import pi {5}_API_VERSION_MAJOR = {3} {5}_API_VERSION_MINOR = {4} +__version__ = {5}_API_VERSION + signal.signal(signal.SIGINT, signal.SIG_DFL) libdir = os.path.dirname(os.path.realpath(__file__)) if platform.system() == "Windows": @@ -1120,6 +1121,8 @@ julia_header = """# {0} # types. See `demos/api' for examples. """ +def capi(s): return s[:1].upper() + s[1:] + class API: def __init__(self, version_major, version_minor, namespace="gmsh", code="Gmsh", @@ -1141,7 +1144,8 @@ class API: def write_cpp(self): def write_module(module, indent): - f.write(indent + "namespace " + module.name + " { // " + module.doc + "\n\n") + f.write(indent + "namespace " + module.name + " { // " + + capi(module.doc) + "\n\n") indent += " " for rtype, name, args, doc, special in module.fs: f.write(indent + "// " + ("\n" + indent + "// ").join( @@ -1169,7 +1173,8 @@ class API: c_namespace += module.name[0].upper() + module.name[1:] else: c_namespace = module.name - fcwrap.write(indent + "namespace " + module.name + " { // " + module.doc + "\n\n") + fcwrap.write(indent + "namespace " + module.name + " { // " + + capi(module.doc) + "\n\n") indent += " " for rtype, name, args, doc, special in module.fs: # *c.h @@ -1180,7 +1185,7 @@ class API: + (",\n" + ' ' * len(fnameapi)).join( list((a.c for a in args + (oint("ierr"), )))) + ");\n") - if special != 'rawc': + if "rawc" not in special: # *c.cpp fc.write(ns.upper() + "_API " + (rtype.rc_type if rtype else "void")) fc.write(" " + fname + "(" + @@ -1263,6 +1268,7 @@ class API: return a.name + (("=" + a.python_value) if a.python_value else "") def write_function(f, fun, modulepath, indent): (rtype, name, args, doc, special) = fun + if "onlycc++" in special: return iargs = list(a for a in args if not a.out) oargs = list(a for a in args if a.out) f.write("\n") @@ -1313,7 +1319,8 @@ class API: f.write("\n\n" + indent + "class " + module.name + ":\n") indentm = indent + " " f.write(indentm + '"""\n') - f.write(indentm + ("\n" + indentm).join(textwrap.wrap(module.doc, 75)) + "\n") + f.write(indentm + ("\n" + indentm).join + (textwrap.wrap(capi(module.doc), 75)) + "\n") f.write(indentm + '"""\n') write_module(f, module, modulepath, indentm) with open(ns + ".py", "w") as f: @@ -1328,6 +1335,7 @@ class API: return a.name + ((" = " + a.julia_value) if a.julia_value else "") def write_function(f, fun, c_mpath, jl_mpath): (rtype, name, args, doc, special) = fun + if "onlycc++" in special: return iargs = list(a for a in args if not a.out) oargs = list(a for a in args if a.out) f.write('\n"""\n ') @@ -1350,7 +1358,7 @@ class API: c_name = c_mpath + name[0].upper() + name[1:] f.write("ccall((:" + c_name + ", " + ("" if c_mpath == ns else ns + ".") + "lib), " + - ("Nothing" if rtype is None else rtype.rjulia_type) + ",\n" + + ("Cvoid" if rtype is None else rtype.rjulia_type) + ",\n" + " " * 10 + "(" + ", ".join( (tuple(a.julia_ctype for a in args) + ("Ptr{Cint}",))) + ("," if not len(args) else "") + "),\n" + @@ -1371,7 +1379,7 @@ class API: def write_module(f, m, c_mpath, jl_mpath, level): f.write('\n"""\n ') f.write("module " + jl_mpath + m.name + "\n\n") - f.write("\n".join(textwrap.wrap(m.doc, 80)) + "\n") + f.write("\n".join(textwrap.wrap(capi(m.doc), 80)) + "\n") f.write('"""\n') f.write("module " + m.name + "\n\n") if level == 1: @@ -1407,9 +1415,9 @@ class API: write_module(f, module, "", "", 1) def write_texi(self): - def write_module(module, parent): - full = parent + "/" + module.name - f.write("@heading Module @code{" + full + "}\n"); + def write_module(module, path, node, node_next, node_prev): + f.write("@node " + node + ", " + node_next + ", " + node_prev + ", Gmsh API\n"); + f.write("@section Namespace @code{" + path + "}: " + module.doc + "\n\n"); f.write("@ftable @code\n"); for rtype, name, args, doc, special in module.fs: f.write("@item " + name + "\n"); @@ -1428,9 +1436,24 @@ class API: (rtype.rtexi_type if rtype else "-") + "\n") f.write("@end table\n\n"); f.write("@end ftable\n\n"); - for m in module.submodules: - write_module(m, full) with open("api.texi", "w") as f: f.write("@c This file was generated by api/gen.py: do not edit manually!\n\n") + def flatten_module(flat, module, path): + p = path + ("/" if len(path) else "") + module.name + flat.append((module, p)) + for m in module.submodules: + flatten_module(flat, m, p) + def node_name(n): + return "Namespace " + n[1] + flat = [] for m in self.modules: - write_module(m, "") + flatten_module(flat, m, "") + N = len(flat) + f.write("@menu\n") + for i in range(N): + f.write("* " + node_name(flat[i]) + "::\n") + f.write("@end menu\n\n") + for i in range(N): + write_module(flat[i][0], flat[i][1], node_name(flat[i]), + "" if i == N - 1 else node_name(flat[i+1]), + "" if i == 0 else node_name(flat[i-1])) diff --git a/api/api.texi b/api/api.texi new file mode 100644 index 0000000000000000000000000000000000000000..583ced66f48110e98b29fb1ee924f5f32f9896a9 --- /dev/null +++ b/api/api.texi @@ -0,0 +1,3550 @@ +@c This file was generated by api/gen.py: do not edit manually! + +@menu +* Namespace gmsh:: +* Namespace gmsh/option:: +* Namespace gmsh/model:: +* Namespace gmsh/model/mesh:: +* Namespace gmsh/model/mesh/field:: +* Namespace gmsh/model/geo:: +* Namespace gmsh/model/geo/mesh:: +* Namespace gmsh/model/occ:: +* Namespace gmsh/view:: +* Namespace gmsh/plugin:: +* Namespace gmsh/graphics:: +* Namespace gmsh/fltk:: +* Namespace gmsh/onelab:: +* Namespace gmsh/logger:: +@end menu + +@node Namespace gmsh, Namespace gmsh/option, , Gmsh API +@section Namespace @code{gmsh}: top-level functions + +@ftable @code +@item initialize +Initialize Gmsh. This must be called before any call to the other functions in +the API. If @code{argc} and @code{argv} (or just @code{argv} in Python or Julia) +are provided, they will be handled in the same way as the command line arguments +in the Gmsh app. If @code{readConfigFiles} is set, read system Gmsh +configuration files (gmshrc and gmsh-options). + +@table @asis +@item Input: +@code{argv}, @code{readConfigFiles} +@item Output: +- +@item Return: +- +@end table + +@item finalize +Finalize Gmsh. This must be called when you are done using the Gmsh API. + +@table @asis +@item Input: +- +@item Output: +- +@item Return: +- +@end table + +@item open +Open a file. Equivalent to the @code{File->Open} menu in the Gmsh app. Handling +of the file depends on its extension and/or its contents: opening a file with +model data will create a new model. + +@table @asis +@item Input: +@code{fileName} +@item Output: +- +@item Return: +- +@end table + +@item merge +Merge a file. Equivalent to the @code{File->Merge} menu in the Gmsh app. +Handling of the file depends on its extension and/or its contents. Merging a +file with model data will add the data to the current model. + +@table @asis +@item Input: +@code{fileName} +@item Output: +- +@item Return: +- +@end table + +@item write +Write a file. The export format is determined by the file extension. + +@table @asis +@item Input: +@code{fileName} +@item Output: +- +@item Return: +- +@end table + +@item clear +Clear all loaded models and post-processing data, and add a new empty model. + +@table @asis +@item Input: +- +@item Output: +- +@item Return: +- +@end table + +@end ftable + +@node Namespace gmsh/option, Namespace gmsh/model, Namespace gmsh, Gmsh API +@section Namespace @code{gmsh/option}: option handling functions + +@ftable @code +@item setNumber +Set a numerical option to @code{value}. @code{name} is of the form +"category.option" or "category[num].option". Available categories and options +are listed in the Gmsh reference manual. + +@table @asis +@item Input: +@code{name}, @code{value} +@item Output: +- +@item Return: +- +@end table + +@item getNumber +Get the @code{value} of a numerical option. @code{name} is of the form +"category.option" or "category[num].option". Available categories and options +are listed in the Gmsh reference manual. + +@table @asis +@item Input: +@code{name} +@item Output: +@code{value} +@item Return: +- +@end table + +@item setString +Set a string option to @code{value}. @code{name} is of the form +"category.option" or "category[num].option". Available categories and options +are listed in the Gmsh reference manual. + +@table @asis +@item Input: +@code{name}, @code{value} +@item Output: +- +@item Return: +- +@end table + +@item getString +Get the @code{value} of a string option. @code{name} is of the form +"category.option" or "category[num].option". Available categories and options +are listed in the Gmsh reference manual. + +@table @asis +@item Input: +@code{name} +@item Output: +@code{value} +@item Return: +- +@end table + +@item setColor +Set a color option to the RGBA value (@code{r}, @code{g}, @code{b}, @code{a}), +where where @code{r}, @code{g}, @code{b} and @code{a} should be integers between +0 and 255. @code{name} is of the form "category.option" or +"category[num].option". Available categories and options are listed in the Gmsh +reference manual, with the "Color." middle string removed. + +@table @asis +@item Input: +@code{name}, @code{r}, @code{g}, @code{b}, @code{a} +@item Output: +- +@item Return: +- +@end table + +@item getColor +Get the @code{r}, @code{g}, @code{b}, @code{a} value of a color option. +@code{name} is of the form "category.option" or "category[num].option". +Available categories and options are listed in the Gmsh reference manual, with +the "Color." middle string removed. + +@table @asis +@item Input: +@code{name} +@item Output: +@code{r}, @code{g}, @code{b}, @code{a} +@item Return: +- +@end table + +@end ftable + +@node Namespace gmsh/model, Namespace gmsh/model/mesh, Namespace gmsh/option, Gmsh API +@section Namespace @code{gmsh/model}: model functions + +@ftable @code +@item add +Add a new model, with name @code{name}, and set it as the current model. + +@table @asis +@item Input: +@code{name} +@item Output: +- +@item Return: +- +@end table + +@item remove +Remove the current model. + +@table @asis +@item Input: +- +@item Output: +- +@item Return: +- +@end table + +@item list +List the names of all models. + +@table @asis +@item Input: +- +@item Output: +@code{names} +@item Return: +- +@end table + +@item setCurrent +Set the current model to the model with name @code{name}. If several models have +the same name, select the one that was added first. + +@table @asis +@item Input: +@code{name} +@item Output: +- +@item Return: +- +@end table + +@item getEntities +Get all the entities in the current model. If @code{dim} is >= 0, return only +the entities of the specified dimension (e.g. points if @code{dim} == 0). The +entities are returned as a vector of (dim, tag) integer pairs. + +@table @asis +@item Input: +@code{dim} +@item Output: +@code{dimTags} +@item Return: +- +@end table + +@item setEntityName +Set the name of the entity of dimension @code{dim} and tag @code{tag}. + +@table @asis +@item Input: +@code{dim}, @code{tag}, @code{name} +@item Output: +- +@item Return: +- +@end table + +@item getEntityName +Get the name of the entity of dimension @code{dim} and tag @code{tag}. + +@table @asis +@item Input: +@code{dim}, @code{tag} +@item Output: +@code{name} +@item Return: +- +@end table + +@item getPhysicalGroups +Get all the physical groups in the current model. If @code{dim} is >= 0, return +only the entities of the specified dimension (e.g. physical points if @code{dim} +== 0). The entities are returned as a vector of (dim, tag) integer pairs. + +@table @asis +@item Input: +@code{dim} +@item Output: +@code{dimTags} +@item Return: +- +@end table + +@item getEntitiesForPhysicalGroup +Get the tags of the model entities making up the physical group of dimension +@code{dim} and tag @code{tag}. + +@table @asis +@item Input: +@code{dim}, @code{tag} +@item Output: +@code{tags} +@item Return: +- +@end table + +@item getPhysicalGroupsForEntity +Get the tags of the physical groups (if any) to which the model entity of +dimension @code{dim} and tag @code{tag} belongs. + +@table @asis +@item Input: +@code{dim}, @code{tag} +@item Output: +@code{physicalTags} +@item Return: +- +@end table + +@item addPhysicalGroup +Add a physical group of dimension @code{dim}, grouping the model entities with +tags @code{tags}. Return the tag of the physical group, equal to @code{tag} if +@code{tag} is positive, or a new tag if @code{tag} < 0. + +@table @asis +@item Input: +@code{dim}, @code{tags}, @code{tag} +@item Output: +- +@item Return: +integer value +@end table + +@item setPhysicalName +Set the name of the physical group of dimension @code{dim} and tag @code{tag}. + +@table @asis +@item Input: +@code{dim}, @code{tag}, @code{name} +@item Output: +- +@item Return: +- +@end table + +@item getPhysicalName +Get the name of the physical group of dimension @code{dim} and tag @code{tag}. + +@table @asis +@item Input: +@code{dim}, @code{tag} +@item Output: +@code{name} +@item Return: +- +@end table + +@item getBoundary +Get the boundary of the model entities @code{dimTags}. Return in +@code{outDimTags} the boundary of the individual entities (if @code{combined} is +false) or the boundary of the combined geometrical shape formed by all input +entities (if @code{combined} is true). Return tags multiplied by the sign of the +boundary entity if @code{oriented} is true. Apply the boundary operator +recursively down to dimension 0 (i.e. to points) if @code{recursive} is true. + +@table @asis +@item Input: +@code{dimTags}, @code{combined}, @code{oriented}, @code{recursive} +@item Output: +@code{outDimTags} +@item Return: +- +@end table + +@item getEntitiesInBoundingBox +Get the model entities in the bounding box defined by the two points +(@code{xmin}, @code{ymin}, @code{zmin}) and (@code{xmax}, @code{ymax}, +@code{zmax}). If @code{dim} is >= 0, return only the entities of the specified +dimension (e.g. points if @code{dim} == 0). + +@table @asis +@item Input: +@code{xmin}, @code{ymin}, @code{zmin}, @code{xmax}, @code{ymax}, @code{zmax}, @code{dim} +@item Output: +@code{tags} +@item Return: +- +@end table + +@item getBoundingBox +Get the bounding box (@code{xmin}, @code{ymin}, @code{zmin}), (@code{xmax}, +@code{ymax}, @code{zmax}) of the model entity of dimension @code{dim} and tag +@code{tag}. If @code{dim} and @code{tag} are negative, get the bounding box of +the whole model. + +@table @asis +@item Input: +@code{dim}, @code{tag} +@item Output: +@code{xmin}, @code{ymin}, @code{zmin}, @code{xmax}, @code{ymax}, @code{zmax} +@item Return: +- +@end table + +@item getDimension +Get the geometrical dimension of the current model. + +@table @asis +@item Input: +- +@item Output: +- +@item Return: +integer value +@end table + +@item addDiscreteEntity +Add a discrete model entity (defined by a mesh) of dimension @code{dim} in the +current model. Return the tag of the new discrete entity, equal to @code{tag} if +@code{tag} is positive, or a new tag if @code{tag} < 0. @code{boundary} +specifies the tags of the entities on the boundary of the discrete entity, if +any. Specifying @code{boundary} allows Gmsh to construct the topology of the +overall model. + +@table @asis +@item Input: +@code{dim}, @code{tag}, @code{boundary} +@item Output: +- +@item Return: +integer value +@end table + +@item removeEntities +Remove the entities @code{dimTags} of the current model. If @code{recursive} is +true, remove all the entities on their boundaries, down to dimension 0. + +@table @asis +@item Input: +@code{dimTags}, @code{recursive} +@item Output: +- +@item Return: +- +@end table + +@item removeEntityName +Remove the entity name @code{name} from the current model. + +@table @asis +@item Input: +@code{name} +@item Output: +- +@item Return: +- +@end table + +@item removePhysicalGroups +Remove the physical groups @code{dimTags} of the current model. If +@code{dimTags} is empty, remove all groups. + +@table @asis +@item Input: +@code{dimTags} +@item Output: +- +@item Return: +- +@end table + +@item removePhysicalName +Remove the physical name @code{name} from the current model. + +@table @asis +@item Input: +@code{name} +@item Output: +- +@item Return: +- +@end table + +@item getType +Get the type of the entity of dimension @code{dim} and tag @code{tag}. + +@table @asis +@item Input: +@code{dim}, @code{tag} +@item Output: +@code{entityType} +@item Return: +- +@end table + +@item getParent +In a partitioned model, get the parent of the entity of dimension @code{dim} and +tag @code{tag}, i.e. from which the entity is a part of, if any. +@code{parentDim} and @code{parentTag} are set to -1 if the entity has no parent. + +@table @asis +@item Input: +@code{dim}, @code{tag} +@item Output: +@code{parentDim}, @code{parentTag} +@item Return: +- +@end table + +@item getPartitions +In a partitioned model, return the tags of the partition(s) to which the entity +belongs. + +@table @asis +@item Input: +@code{dim}, @code{tag} +@item Output: +@code{partitions} +@item Return: +- +@end table + +@item getValue +Evaluate the parametrization of the entity of dimension @code{dim} and tag +@code{tag} at the parametric coordinates @code{parametricCoord}. Only valid for +@code{dim} equal to 0 (with empty @code{parametricCoord}), 1 (with +@code{parametricCoord} containing parametric coordinates on the curve) or 2 +(with @code{parametricCoord} containing pairs of u, v parametric coordinates on +the surface, concatenated: [p1u, p1v, p2u, ...]). Return triplets of x, y, z +coordinates in @code{points}, concatenated: [p1x, p1y, p1z, p2x, ...]. + +@table @asis +@item Input: +@code{dim}, @code{tag}, @code{parametricCoord} +@item Output: +@code{points} +@item Return: +- +@end table + +@item getDerivative +Evaluate the derivative of the parametrization of the entity of dimension +@code{dim} and tag @code{tag} at the parametric coordinates +@code{parametricCoord}. Only valid for @code{dim} equal to 1 (with +@code{parametricCoord} containing parametric coordinates on the curve) or 2 +(with @code{parametricCoord} containing pairs of u, v parametric coordinates on +the surface, concatenated: [p1u, p1v, p2u, ...]). For @code{dim} equal to 1 +return the x, y, z components of the derivative with respect to u [d1ux, d1uy, +d1uz, d2ux, ...]; for @code{dim} equal to 2 return the x, y, z components of the +derivate with respect to u and v: [d1ux, d1uy, d1uz, d1vx, d1vy, d1vz, d2ux, +...]. + +@table @asis +@item Input: +@code{dim}, @code{tag}, @code{parametricCoord} +@item Output: +@code{derivatives} +@item Return: +- +@end table + +@item getCurvature +Evaluate the (maximum) curvature of the entity of dimension @code{dim} and tag +@code{tag} at the parametric coordinates @code{parametricCoord}. Only valid for +@code{dim} equal to 1 (with @code{parametricCoord} containing parametric +coordinates on the curve) or 2 (with @code{parametricCoord} containing pairs of +u, v parametric coordinates on the surface, concatenated: [p1u, p1v, p2u, ...]). + +@table @asis +@item Input: +@code{dim}, @code{tag}, @code{parametricCoord} +@item Output: +@code{curvatures} +@item Return: +- +@end table + +@item getPrincipalCurvatures +Evaluate the principal curvatures of the surface with tag @code{tag} at the +parametric coordinates @code{parametricCoord}, as well as their respective +directions. @code{parametricCoord} are given by pair of u and v coordinates, +concatenated: [p1u, p1v, p2u, ...]. + +@table @asis +@item Input: +@code{tag}, @code{parametricCoord} +@item Output: +@code{curvatureMax}, @code{curvatureMin}, @code{directionMax}, @code{directionMin} +@item Return: +- +@end table + +@item getNormal +Get the normal to the surface with tag @code{tag} at the parametric coordinates +@code{parametricCoord}. @code{parametricCoord} are given by pairs of u and v +coordinates, concatenated: [p1u, p1v, p2u, ...]. @code{normals} are returned as +triplets of x, y, z components, concatenated: [n1x, n1y, n1z, n2x, ...]. + +@table @asis +@item Input: +@code{tag}, @code{parametricCoord} +@item Output: +@code{normals} +@item Return: +- +@end table + +@item setVisibility +Set the visibility of the model entities @code{dimTags} to @code{value}. Apply +the visibility setting recursively if @code{recursive} is true. + +@table @asis +@item Input: +@code{dimTags}, @code{value}, @code{recursive} +@item Output: +- +@item Return: +- +@end table + +@item getVisibility +Get the visibility of the model entity of dimension @code{dim} and tag +@code{tag}. + +@table @asis +@item Input: +@code{dim}, @code{tag} +@item Output: +@code{value} +@item Return: +- +@end table + +@item setColor +Set the color of the model entities @code{dimTags} to the RGBA value (@code{r}, +@code{g}, @code{b}, @code{a}), where @code{r}, @code{g}, @code{b} and @code{a} +should be integers between 0 and 255. Apply the color setting recursively if +@code{recursive} is true. + +@table @asis +@item Input: +@code{dimTags}, @code{r}, @code{g}, @code{b}, @code{a}, @code{recursive} +@item Output: +- +@item Return: +- +@end table + +@item getColor +Get the color of the model entity of dimension @code{dim} and tag @code{tag}. + +@table @asis +@item Input: +@code{dim}, @code{tag} +@item Output: +@code{r}, @code{g}, @code{b}, @code{a} +@item Return: +- +@end table + +@item setCoordinates +Set the @code{x}, @code{y}, @code{z} coordinates of a geometrical point. + +@table @asis +@item Input: +@code{tag}, @code{x}, @code{y}, @code{z} +@item Output: +- +@item Return: +- +@end table + +@end ftable + +@node Namespace gmsh/model/mesh, Namespace gmsh/model/mesh/field, Namespace gmsh/model, Gmsh API +@section Namespace @code{gmsh/model/mesh}: mesh functions + +@ftable @code +@item generate +Generate a mesh of the current model, up to dimension @code{dim} (0, 1, 2 or 3). + +@table @asis +@item Input: +@code{dim} +@item Output: +- +@item Return: +- +@end table + +@item partition +Partition the mesh of the current model into @code{numPart} partitions. + +@table @asis +@item Input: +@code{numPart} +@item Output: +- +@item Return: +- +@end table + +@item unpartition +Unpartition the mesh of the current model. + +@table @asis +@item Input: +- +@item Output: +- +@item Return: +- +@end table + +@item optimize +Optimize the mesh of the current model using @code{method} (empty for default +tetrahedral mesh optimizer, "Netgen" for Netgen optimizer, "HighOrder" for +direct high-order mesh optimizer, "HighOrderElastic" for high-order elastic +smoother). + +@table @asis +@item Input: +@code{method} +@item Output: +- +@item Return: +- +@end table + +@item recombine +Recombine the mesh of the current model. + +@table @asis +@item Input: +- +@item Output: +- +@item Return: +- +@end table + +@item refine +Refine the mesh of the current model by uniformly splitting the elements. + +@table @asis +@item Input: +- +@item Output: +- +@item Return: +- +@end table + +@item smooth +Smooth the mesh of the current model. + +@table @asis +@item Input: +- +@item Output: +- +@item Return: +- +@end table + +@item setOrder +Set the order of the elements in the mesh of the current model to @code{order}. + +@table @asis +@item Input: +@code{order} +@item Output: +- +@item Return: +- +@end table + +@item getLastEntityError +Get the last entities (if any) where a meshing error occurred. Currently only +populated by the new 3D meshing algorithms. + +@table @asis +@item Input: +- +@item Output: +@code{dimTags} +@item Return: +- +@end table + +@item getLastNodeError +Get the last nodes (if any) where a meshing error occurred. Currently only +populated by the new 3D meshing algorithms. + +@table @asis +@item Input: +- +@item Output: +@code{nodeTags} +@item Return: +- +@end table + +@item getNodes +Get the nodes classified on the entity of dimension @code{dim} and tag +@code{tag}. If @code{tag} < 0, get the nodes for all entities of dimension +@code{dim}. If @code{dim} and @code{tag} are negative, get all the nodes in the +mesh. @code{nodeTags} contains the node tags (their unique, strictly positive +identification numbers). @code{coord} is a vector of length 3 times the length +of @code{nodeTags} that contains the x, y, z coordinates of the nodes, +concatenated: [n1x, n1y, n1z, n2x, ...]. If @code{dim} >= 0 and +@code{returnParamtricCoord} is set, @code{parametricCoord} contains the +parametric coordinates ([u1, u2, ...] or [u1, v1, u2, ...]) of the nodes, if +available. The length of @code{parametricCoord} can be 0 or @code{dim} times the +length of @code{nodeTags}. If @code{includeBoundary} is set, also return the +nodes classified on the boundary of the entity (which will be reparametrized on +the entity if @code{dim} >= 0 in order to compute their parametric coordinates). + +@table @asis +@item Input: +@code{dim}, @code{tag}, @code{includeBoundary}, @code{returnParametricCoord} +@item Output: +@code{nodeTags}, @code{coord}, @code{parametricCoord} +@item Return: +- +@end table + +@item getNode +Get the coordinates and the parametric coordinates (if any) of the node with tag +@code{tag}. This is a sometimes useful but inefficient way of accessing nodes, +as it relies on a cache stored in the model. For large meshes all the nodes in +the model should be numbered in a continuous sequence of tags from 1 to N to +maintain reasonable performance (in this case the internal cache is based on a +vector; otherwise it uses a map). + +@table @asis +@item Input: +@code{nodeTag} +@item Output: +@code{coord}, @code{parametricCoord} +@item Return: +- +@end table + +@item rebuildNodeCache +Rebuild the node cache. + +@table @asis +@item Input: +@code{onlyIfNecessary} +@item Output: +- +@item Return: +- +@end table + +@item getNodesForPhysicalGroup +Get the nodes from all the elements belonging to the physical group of dimension +@code{dim} and tag @code{tag}. @code{nodeTags} contains the node tags; +@code{coord} is a vector of length 3 times the length of @code{nodeTags} that +contains the x, y, z coordinates of the nodes, concatenated: [n1x, n1y, n1z, +n2x, ...]. + +@table @asis +@item Input: +@code{dim}, @code{tag} +@item Output: +@code{nodeTags}, @code{coord} +@item Return: +- +@end table + +@item setNodes +Set the nodes classified on the model entity of dimension @code{dim} and tag +@code{tag}. @code{nodeTags} contains the node tags (their unique, strictly +positive identification numbers). @code{coord} is a vector of length 3 times the +length of @code{nodeTags} that contains the x, y, z coordinates of the nodes, +concatenated: [n1x, n1y, n1z, n2x, ...]. The optional @code{parametricCoord} +vector contains the parametric coordinates of the nodes, if any. The length of +@code{parametricCoord} can be 0 or @code{dim} times the length of +@code{nodeTags}. If the @code{nodeTags} vector is empty, new tags are +automatically assigned to the nodes. + +@table @asis +@item Input: +@code{dim}, @code{tag}, @code{nodeTags}, @code{coord}, @code{parametricCoord} +@item Output: +- +@item Return: +- +@end table + +@item reclassifyNodes +Reclassify all nodes on their associated model entity, based on the elements. +Can be used when importing nodes in bulk (e.g. by associating them all to a +single volume), to reclassify them correctly on model surfaces, curves, etc. +after the elements have been set. + +@table @asis +@item Input: +- +@item Output: +- +@item Return: +- +@end table + +@item relocateNodes +Relocate the nodes classified on the entity of dimension @code{dim} and tag +@code{tag} using their parametric coordinates. If @code{tag} < 0, relocate the +nodes for all entities of dimension @code{dim}. If @code{dim} and @code{tag} are +negative, relocate all the nodes in the mesh. + +@table @asis +@item Input: +@code{dim}, @code{tag} +@item Output: +- +@item Return: +- +@end table + +@item getElements +Get the elements classified on the entity of dimension @code{dim} and tag +@code{tag}. If @code{tag} < 0, get the elements for all entities of dimension +@code{dim}. If @code{dim} and @code{tag} are negative, get all the elements in +the mesh. @code{elementTypes} contains the MSH types of the elements (e.g. +@code{2} for 3-node triangles: see @code{getElementProperties} to obtain the +properties for a given element type). @code{elementTags} is a vector of the same +length as @code{elementTypes}; each entry is a vector containing the tags +(unique, strictly positive identifiers) of the elements of the corresponding +type. @code{nodeTags} is also a vector of the same length as +@code{elementTypes}; each entry is a vector of length equal to the number of +elements of the given type times the number N of nodes for this type of element, +that contains the node tags of all the elements of the given type, concatenated: +[e1n1, e1n2, ..., e1nN, e2n1, ...]. + +@table @asis +@item Input: +@code{dim}, @code{tag} +@item Output: +@code{elementTypes}, @code{elementTags}, @code{nodeTags} +@item Return: +- +@end table + +@item getElement +Get the type and node tags of the element with tag @code{tag}. This is a +sometimes useful but inefficient way of accessing elements, as it relies on a +cache stored in the model. For large meshes all the elements in the model should +be numbered in a continuous sequence of tags from 1 to N to maintain reasonable +performance (in this case the internal cache is based on a vector; otherwise it +uses a map). + +@table @asis +@item Input: +@code{elementTag} +@item Output: +@code{elementType}, @code{nodeTags} +@item Return: +- +@end table + +@item getElementByCoordinates +Search the mesh for an element located at coordinates (@code{x}, @code{y}, +@code{z}). This is a sometimes useful but inefficient way of accessing elements, +as it relies on a search in a spatial octree. If an element is found, return its +tag, type and node tags, as well as the local coordinates (@code{u}, @code{v}, +@code{w}) within the element corresponding to search location. If @code{dim} is +>= 0, only search for elements of the given dimension. If @code{strict} is not +set, use a tolerance to find elements near the search location. + +@table @asis +@item Input: +@code{x}, @code{y}, @code{z}, @code{dim}, @code{strict} +@item Output: +@code{elementTag}, @code{elementType}, @code{nodeTags}, @code{u}, @code{v}, @code{w} +@item Return: +- +@end table + +@item getElementTypes +Get the types of elements in the entity of dimension @code{dim} and tag +@code{tag}. If @code{tag} < 0, get the types for all entities of dimension +@code{dim}. If @code{dim} and @code{tag} are negative, get all the types in the +mesh. + +@table @asis +@item Input: +@code{dim}, @code{tag} +@item Output: +@code{elementTypes} +@item Return: +- +@end table + +@item getElementType +Return an element type given its family name @code{familyName} ("point", "line", +"triangle", "quadrangle", "tetrahedron", "pyramid", "prism", "hexahedron") and +polynomial order @code{order}. If @code{serendip} is true, return the +corresponding serendip element type (element without interior nodes). + +@table @asis +@item Input: +@code{familyName}, @code{order}, @code{serendip} +@item Output: +- +@item Return: +integer value +@end table + +@item getElementProperties +Get the properties of an element of type @code{elementType}: its name +(@code{elementName}), dimension (@code{dim}), order (@code{order}), number of +nodes (@code{numNodes}) and parametric node coordinates (@code{parametricCoord} +vector, of length @code{dim} times @code{numNodes}). + +@table @asis +@item Input: +@code{elementType} +@item Output: +@code{elementName}, @code{dim}, @code{order}, @code{numNodes}, @code{parametricCoord} +@item Return: +- +@end table + +@item getElementsByType +Get the elements of type @code{elementType} classified on the entity of tag +@code{tag}. If @code{tag} < 0, get the elements for all entities. +@code{elementTags} is a vector containing the tags (unique, strictly positive +identifiers) of the elements of the corresponding type. @code{nodeTags} is a +vector of length equal to the number of elements of the given type times the +number N of nodes for this type of element, that contains the node tags of all +the elements of the given type, concatenated: [e1n1, e1n2, ..., e1nN, e2n1, +...]. If @code{numTasks} > 1, only compute and return the part of the data +indexed by @code{task}. + +@table @asis +@item Input: +@code{elementType}, @code{tag}, @code{task}, @code{numTasks} +@item Output: +@code{elementTags}, @code{nodeTags} +@item Return: +- +@end table + +@item preallocateElementsByType +Preallocate data before calling @code{getElementsByType} with @code{numTasks} > +1. For C and C++ only. + +@table @asis +@item Input: +@code{elementType}, @code{elementTag}, @code{nodeTag}, @code{tag} +@item Output: +@code{elementTags}, @code{nodeTags} +@item Return: +- +@end table + +@item setElements +Set the elements of the entity of dimension @code{dim} and tag @code{tag}. +@code{types} contains the MSH types of the elements (e.g. @code{2} for 3-node +triangles: see the Gmsh reference manual). @code{elementTags} is a vector of the +same length as @code{types}; each entry is a vector containing the tags (unique, +strictly positive identifiers) of the elements of the corresponding type. +@code{nodeTags} is also a vector of the same length as @code{types}; each entry +is a vector of length equal to the number of elements of the given type times +the number N of nodes per element, that contains the node tags of all the +elements of the given type, concatenated: [e1n1, e1n2, ..., e1nN, e2n1, ...]. + +@table @asis +@item Input: +@code{dim}, @code{tag}, @code{elementTypes}, @code{elementTags}, @code{nodeTags} +@item Output: +- +@item Return: +- +@end table + +@item setElementsByType +Set the elements of type @code{elementType} in the entity of tag @code{tag}. +@code{elementTags} contains the tags (unique, strictly positive identifiers) of +the elements of the corresponding type. @code{nodeTags} is a vector of length +equal to the number of elements times the number N of nodes per element, that +contains the node tags of all the elements, concatenated: [e1n1, e1n2, ..., +e1nN, e2n1, ...]. If the @code{elementTag} vector is empty, new tags are +automatically assigned to the elements. + +@table @asis +@item Input: +@code{tag}, @code{elementType}, @code{elementTags}, @code{nodeTags} +@item Output: +- +@item Return: +- +@end table + +@item getIntegrationPoints +Get the numerical quadrature information for the given element type +@code{elementType} and integration rule @code{integrationType} (e.g. "Gauss4" +for a Gauss quadrature suited for integrating 4th order polynomials). +@code{integrationPoints} contains the u, v, w coordinates of the G integration +points in the reference element: [g1u, g1v, g1w, ..., gGu, gGv, gGw]. +@code{integrationWeigths} contains the associated weights: [g1q, ..., gGq]. + +@table @asis +@item Input: +@code{elementType}, @code{integrationType} +@item Output: +@code{integrationPoints}, @code{integrationWeights} +@item Return: +- +@end table + +@item getJacobians +Get the Jacobians of all the elements of type @code{elementType} classified on +the entity of tag @code{tag}, at the G integration points +@code{integrationPoints} given as concatenated triplets of coordinates in the +reference element [g1u, g1v, g1w, ..., gGu, gGv, gGw]. Data is returned by +element, with elements in the same order as in @code{getElements} and +@code{getElementsByType}. @code{jacobians} contains for each element the 9 +entries of the 3x3 Jacobian matrix at each integration point, by row: [e1g1Jxu, +e1g1Jxv, e1g1Jxw, e1g1Jyu, ..., e1g1Jzw, e1g2Jxu, ..., e1gGJzw, e2g1Jxu, ...], +with Jxu=dx/du, Jxv=dx/dv, etc. @code{determinants} contains for each element +the determinant of the Jacobian matrix at each integration point: [e1g1, e1g2, +... e1gG, e2g1, ...]. @code{points} contains for each element the x, y, z +coordinates of the integration points. If @code{tag} < 0, get the Jacobian data +for all entities. If @code{numTasks} > 1, only compute and return the part of +the data indexed by @code{task}. + +@table @asis +@item Input: +@code{elementType}, @code{integrationPoints}, @code{tag}, @code{task}, @code{numTasks} +@item Output: +@code{jacobians}, @code{determinants}, @code{points} +@item Return: +- +@end table + +@item preallocateJacobians +Preallocate data before calling @code{getJacobians} with @code{numTasks} > 1. +For C and C++ only. + +@table @asis +@item Input: +@code{elementType}, @code{numIntegrationPoints}, @code{jacobian}, @code{determinant}, @code{point}, @code{tag} +@item Output: +@code{jacobians}, @code{determinants}, @code{points} +@item Return: +- +@end table + +@item getBasisFunctions +Get the basis functions of the element of type @code{elementType} at the +integration points @code{integrationPoints} (given as concatenated triplets of +coordinates in the reference element [g1u, g1v, g1w, ..., gGu, gGv, gGw]), for +the function space @code{functionSpaceType} (e.g. "Lagrange" or "GradLagrange" +for Lagrange basis functions or their gradient, in the u, v, w coordinates of +the reference element). @code{numComponents} returns the number C of components +of a basis function. @code{basisFunctions} returns the value of the N basis +functions at the integration points, i.e. [g1f1, g1f2, ..., g1fN, g2f1, ...] +when C == 1 or [g1f1u, g1f1v, g1f1w, g1f2u, ..., g1fNw, g2f1u, ...] when C == 3. + +@table @asis +@item Input: +@code{elementType}, @code{integrationPoints}, @code{functionSpaceType} +@item Output: +@code{numComponents}, @code{basisFunctions} +@item Return: +- +@end table + +@item getBasisFunctionsForElements +Get the element-dependent basis functions of the elements of type +@code{elementType} in the entity of tag @code{tag}at the integration points +@code{integrationPoints} (given as concatenated triplets of coordinates in the +reference element [g1u, g1v, g1w, ..., gGu, gGv, gGw]), for the function space +@code{functionSpaceType} (e.g. "H1Legendre3" or "GradH1Legendre3" for 3rd order +hierarchical H1 Legendre functions or their gradient, in the u, v, w coordinates +of the reference elements). @code{numComponents} returns the number C of +components of a basis function. @code{numBasisFunctions} returns the number N of +basis functions per element. @code{basisFunctions} returns the value of the +basis functions at the integration points for each element: [e1g1f1,..., e1g1fN, +e1g2f1,..., e2g1f1, ...] when C == 1 or [e1g1f1u, e1g1f1v,..., e1g1fNw, +e1g2f1u,..., e2g1f1u, ...]. Warning: this is an experimental feature and will +probably change in a future release. + +@table @asis +@item Input: +@code{elementType}, @code{integrationPoints}, @code{functionSpaceType}, @code{tag} +@item Output: +@code{numComponents}, @code{numFunctionsPerElements}, @code{basisFunctions} +@item Return: +- +@end table + +@item getKeysForElements +Generate the @code{keys} for the elements of type @code{elementType} in the +entity of tag @code{tag}, for the @code{functionSpaceType} function space. Each +key uniquely identifies a basis function in the function space. If +@code{returnCoord} is set, the @code{coord} vector contains the x, y, z +coordinates locating basis functions for sorting purposes. Warning: this is an +experimental feature and will probably change in a future release. + +@table @asis +@item Input: +@code{elementType}, @code{functionSpaceType}, @code{tag}, @code{returnCoord} +@item Output: +@code{keys}, @code{coord} +@item Return: +- +@end table + +@item getInformationForElements +Get information about the @code{keys}. Warning: this is an experimental feature +and will probably change in a future release. + +@table @asis +@item Input: +@code{keys}, @code{order}, @code{elementType} +@item Output: +@code{info} +@item Return: +- +@end table + +@item precomputeBasisFunctions +Precomputes the basis functions corresponding to @code{elementType}. + +@table @asis +@item Input: +@code{elementType} +@item Output: +- +@item Return: +- +@end table + +@item getBarycenters +Get the barycenters of all elements of type @code{elementType} classified on the +entity of tag @code{tag}. If @code{primary} is set, only the primary nodes of +the elements are taken into account for the barycenter calculation. If +@code{fast} is set, the function returns the sum of the primary node coordinates +(without normalizing by the number of nodes). If @code{tag} < 0, get the +barycenters for all entities. If @code{numTasks} > 1, only compute and return +the part of the data indexed by @code{task}. + +@table @asis +@item Input: +@code{elementType}, @code{tag}, @code{fast}, @code{primary}, @code{task}, @code{numTasks} +@item Output: +@code{barycenters} +@item Return: +- +@end table + +@item preallocateBarycenters +Preallocate data before calling @code{getBarycenters} with @code{numTasks} > 1. +For C and C++ only. + +@table @asis +@item Input: +@code{elementType}, @code{tag} +@item Output: +@code{barycenters} +@item Return: +- +@end table + +@item getElementEdgeNodes +Get the nodes on the edges of all elements of type @code{elementType} classified +on the entity of tag @code{tag}. @code{nodeTags} contains the node tags of the +edges for all the elements: [e1a1n1, e1a1n2, e1a2n1, ...]. Data is returned by +element, with elements in the same order as in @code{getElements} and +@code{getElementsByType}. If @code{primary} is set, only the primary (begin/end) +nodes of the edges are returned. If @code{tag} < 0, get the edge nodes for all +entities. If @code{numTasks} > 1, only compute and return the part of the data +indexed by @code{task}. + +@table @asis +@item Input: +@code{elementType}, @code{tag}, @code{primary}, @code{task}, @code{numTasks} +@item Output: +@code{nodeTags} +@item Return: +- +@end table + +@item getElementFaceNodes +Get the nodes on the faces of type @code{faceType} (3 for triangular faces, 4 +for quadrangular faces) of all elements of type @code{elementType} classified on +the entity of tag @code{tag}. @code{nodeTags} contains the node tags of the +faces for all elements: [e1f1n1, ..., e1f1nFaceType, e1f2n1, ...]. Data is +returned by element, with elements in the same order as in @code{getElements} +and @code{getElementsByType}. If @code{primary} is set, only the primary +(corner) nodes of the faces are returned. If @code{tag} < 0, get the face nodes +for all entities. If @code{numTasks} > 1, only compute and return the part of +the data indexed by @code{task}. + +@table @asis +@item Input: +@code{elementType}, @code{faceType}, @code{tag}, @code{primary}, @code{task}, @code{numTasks} +@item Output: +@code{nodeTags} +@item Return: +- +@end table + +@item getGhostElements +Get the ghost elements @code{elementTags} and their associated @code{partitions} +stored in the ghost entity of dimension @code{dim} and tag @code{tag}. + +@table @asis +@item Input: +@code{dim}, @code{tag} +@item Output: +@code{elementTags}, @code{partitions} +@item Return: +- +@end table + +@item setSize +Set a mesh size constraint on the model entities @code{dimTags}. Currently only +entities of dimension 0 (points) are handled. + +@table @asis +@item Input: +@code{dimTags}, @code{size} +@item Output: +- +@item Return: +- +@end table + +@item setTransfiniteCurve +Set a transfinite meshing constraint on the curve @code{tag}, with +@code{numNodes} nodes distributed according to @code{meshType} and @code{coef}. +Currently supported types are "Progression" (geometrical progression with power +@code{coef}) and "Bump" (refinement toward both extremities of the curve). + +@table @asis +@item Input: +@code{tag}, @code{numNodes}, @code{meshType}, @code{coef} +@item Output: +- +@item Return: +- +@end table + +@item setTransfiniteSurface +Set a transfinite meshing constraint on the surface @code{tag}. +@code{arrangement} describes the arrangement of the triangles when the surface +is not flagged as recombined: currently supported values are "Left", "Right", +"AlternateLeft" and "AlternateRight". @code{cornerTags} can be used to specify +the (3 or 4) corners of the transfinite interpolation explicitly; specifying the +corners explicitly is mandatory if the surface has more that 3 or 4 points on +its boundary. + +@table @asis +@item Input: +@code{tag}, @code{arrangement}, @code{cornerTags} +@item Output: +- +@item Return: +- +@end table + +@item setTransfiniteVolume +Set a transfinite meshing constraint on the surface @code{tag}. +@code{cornerTags} can be used to specify the (6 or 8) corners of the transfinite +interpolation explicitly. + +@table @asis +@item Input: +@code{tag}, @code{cornerTags} +@item Output: +- +@item Return: +- +@end table + +@item setRecombine +Set a recombination meshing constraint on the model entity of dimension +@code{dim} and tag @code{tag}. Currently only entities of dimension 2 (to +recombine triangles into quadrangles) are supported. + +@table @asis +@item Input: +@code{dim}, @code{tag} +@item Output: +- +@item Return: +- +@end table + +@item setSmoothing +Set a smoothing meshing constraint on the model entity of dimension @code{dim} +and tag @code{tag}. @code{val} iterations of a Laplace smoother are applied. + +@table @asis +@item Input: +@code{dim}, @code{tag}, @code{val} +@item Output: +- +@item Return: +- +@end table + +@item setReverse +Set a reverse meshing constraint on the model entity of dimension @code{dim} and +tag @code{tag}. If @code{val} is true, the mesh orientation will be reversed +with respect to the natural mesh orientation (i.e. the orientation consistent +with the orientation of the geometry). If @code{val} is false, the mesh is left +as-is. + +@table @asis +@item Input: +@code{dim}, @code{tag}, @code{val} +@item Output: +- +@item Return: +- +@end table + +@item setOutwardOrientation +Set meshing constraints on the bounding surfaces of the volume of tag @code{tag} +so that all surfaces are oriented with outward pointing normals. Currently only +available with the OpenCASCADE kernel, as it relies on the STL triangulation. + +@table @asis +@item Input: +@code{tag} +@item Output: +- +@item Return: +- +@end table + +@item embed +Embed the model entities of dimension @code{dim} and tags @code{tags} in the +(inDim, inTag) model entity. @code{inDim} must be strictly greater than +@code{dim}. + +@table @asis +@item Input: +@code{dim}, @code{tags}, @code{inDim}, @code{inTag} +@item Output: +- +@item Return: +- +@end table + +@item removeEmbedded +Remove embedded entities in the model entities @code{dimTags}. if @code{dim} is +>= 0, only remove embedded entities of the given dimension (e.g. embedded points +if @code{dim} == 0). + +@table @asis +@item Input: +@code{dimTags}, @code{dim} +@item Output: +- +@item Return: +- +@end table + +@item reorderElements +Reorder the elements of type @code{elementType} classified on the entity of tag +@code{tag} according to @code{ordering}. + +@table @asis +@item Input: +@code{elementType}, @code{tag}, @code{ordering} +@item Output: +- +@item Return: +- +@end table + +@item renumberNodes +Renumber the node tags in a continuous sequence. + +@table @asis +@item Input: +- +@item Output: +- +@item Return: +- +@end table + +@item renumberElements +Renumber the element tags in a continuous sequence. + +@table @asis +@item Input: +- +@item Output: +- +@item Return: +- +@end table + +@item setPeriodic +Set the meshes of the entities of dimension @code{dim} and tag @code{tags} as +periodic copies of the meshes of entities @code{tagsMaster}, using the affine +transformation specified in @code{affineTransformation} (16 entries of a 4x4 +matrix, by row). Currently only available for @code{dim} == 1 and @code{dim} == +2. + +@table @asis +@item Input: +@code{dim}, @code{tags}, @code{tagsMaster}, @code{affineTransform} +@item Output: +- +@item Return: +- +@end table + +@item getPeriodicNodes +Get the master entity @code{tagMaster}, the node tags @code{nodeTags} and their +corresponding master node tags @code{nodeTagsMaster}, and the affine transform +@code{affineTransform} for the entity of dimension @code{dim} and tag +@code{tag}. + +@table @asis +@item Input: +@code{dim}, @code{tag} +@item Output: +@code{tagMaster}, @code{nodeTags}, @code{nodeTagsMaster}, @code{affineTransform} +@item Return: +- +@end table + +@item removeDuplicateNodes +Remove duplicate nodes in the mesh of the current model. + +@table @asis +@item Input: +- +@item Output: +- +@item Return: +- +@end table + +@item splitQuadrangles +Split (into two triangles) all quadrangles in surface @code{tag} whose quality +is lower than @code{quality}. If @code{tag} < 0, split quadrangles in all +surfaces. + +@table @asis +@item Input: +@code{quality}, @code{tag} +@item Output: +- +@item Return: +- +@end table + +@item classifySurfaces +Classify ("color") the surface mesh based on the angle threshold @code{angle} +(in radians), and create discrete curves accordingly. If @code{boundary} is set, +also create discrete curves on the boundary if the surface is open. Warning: +this is an experimental feature. + +@table @asis +@item Input: +@code{angle}, @code{boundary} +@item Output: +- +@item Return: +- +@end table + +@item createTopology +Create a boundary representation from the mesh if the model does not have one +(e.g. when imported from mesh file formats with no BRep representation of the +underlying model). Warning: this is an experimental feature. + +@table @asis +@item Input: +- +@item Output: +- +@item Return: +- +@end table + +@item createGeometry +Create a parametrization for curves and surfaces that do not have one (i.e. +discrete curves and surfaces represented solely by meshes, without an underlying +CAD description). @code{createGeometry} automatically calls +@code{createTopology}. Warning: this is an experimental feature. + +@table @asis +@item Input: +- +@item Output: +- +@item Return: +- +@end table + +@item computeHomology +Compute a basis representation for homology spaces after a mesh has been +generated. The computation domain is given in a list of physical group tags +@code{domainTags}; if empty, the whole mesh is the domain. The computation +subdomain for relative homology computation is given in a list of physical group +tags @code{subdomainTags}; if empty, absolute homology is computed. The +dimensions homology bases to be computed are given in the list @code{dim}; if +empty, all bases are computed. Resulting basis representation chains are stored +as physical groups in the mesh. + +@table @asis +@item Input: +@code{domainTags}, @code{subdomainTags}, @code{dims} +@item Output: +- +@item Return: +- +@end table + +@item computeCohomology +Compute a basis representation for cohomology spaces after a mesh has been +generated. The computation domain is given in a list of physical group tags +@code{domainTags}; if empty, the whole mesh is the domain. The computation +subdomain for relative cohomology computation is given in a list of physical +group tags @code{subdomainTags}; if empty, absolute cohomology is computed. The +dimensions homology bases to be computed are given in the list @code{dim}; if +empty, all bases are computed. Resulting basis representation cochains are +stored as physical groups in the mesh. + +@table @asis +@item Input: +@code{domainTags}, @code{subdomainTags}, @code{dims} +@item Output: +- +@item Return: +- +@end table + +@end ftable + +@node Namespace gmsh/model/mesh/field, Namespace gmsh/model/geo, Namespace gmsh/model/mesh, Gmsh API +@section Namespace @code{gmsh/model/mesh/field}: mesh size field functions + +@ftable @code +@item add +Add a new mesh size field of type @code{fieldType}. If @code{tag} is positive, +assign the tag explicitly; otherwise a new tag is assigned automatically. Return +the field tag. + +@table @asis +@item Input: +@code{fieldType}, @code{tag} +@item Output: +- +@item Return: +integer value +@end table + +@item remove +Remove the field with tag @code{tag}. + +@table @asis +@item Input: +@code{tag} +@item Output: +- +@item Return: +- +@end table + +@item setNumber +Set the numerical option @code{option} to value @code{value} for field +@code{tag}. + +@table @asis +@item Input: +@code{tag}, @code{option}, @code{value} +@item Output: +- +@item Return: +- +@end table + +@item setString +Set the string option @code{option} to value @code{value} for field @code{tag}. + +@table @asis +@item Input: +@code{tag}, @code{option}, @code{value} +@item Output: +- +@item Return: +- +@end table + +@item setNumbers +Set the numerical list option @code{option} to value @code{value} for field +@code{tag}. + +@table @asis +@item Input: +@code{tag}, @code{option}, @code{value} +@item Output: +- +@item Return: +- +@end table + +@item setAsBackgroundMesh +Set the field @code{tag} as the background mesh size field. + +@table @asis +@item Input: +@code{tag} +@item Output: +- +@item Return: +- +@end table + +@item setAsBoundaryLayer +Set the field @code{tag} as a boundary layer size field. + +@table @asis +@item Input: +@code{tag} +@item Output: +- +@item Return: +- +@end table + +@end ftable + +@node Namespace gmsh/model/geo, Namespace gmsh/model/geo/mesh, Namespace gmsh/model/mesh/field, Gmsh API +@section Namespace @code{gmsh/model/geo}: built-in CAD kernel functions + +@ftable @code +@item addPoint +Add a geometrical point in the built-in CAD representation, at coordinates +(@code{x}, @code{y}, @code{z}). If @code{meshSize} is > 0, add a meshing +constraint at that point. If @code{tag} is positive, set the tag explicitly; +otherwise a new tag is selected automatically. Return the tag of the point. +(Note that the point will be added in the current model only after +@code{synchronize} is called. This behavior holds for all the entities added in +the geo module.) + +@table @asis +@item Input: +@code{x}, @code{y}, @code{z}, @code{meshSize}, @code{tag} +@item Output: +- +@item Return: +integer value +@end table + +@item addLine +Add a straight line segment between the two points with tags @code{startTag} and +@code{endTag}. If @code{tag} is positive, set the tag explicitly; otherwise a +new tag is selected automatically. Return the tag of the line. + +@table @asis +@item Input: +@code{startTag}, @code{endTag}, @code{tag} +@item Output: +- +@item Return: +integer value +@end table + +@item addCircleArc +Add a circle arc (strictly smaller than Pi) between the two points with tags +@code{startTag} and @code{endTag}, with center @code{centertag}. If @code{tag} +is positive, set the tag explicitly; otherwise a new tag is selected +automatically. If (@code{nx}, @code{ny}, @code{nz}) != (0,0,0), explicitly set +the plane of the circle arc. Return the tag of the circle arc. + +@table @asis +@item Input: +@code{startTag}, @code{centerTag}, @code{endTag}, @code{tag}, @code{nx}, @code{ny}, @code{nz} +@item Output: +- +@item Return: +integer value +@end table + +@item addEllipseArc +Add an ellipse arc (strictly smaller than Pi) between the two points +@code{startTag} and @code{endTag}, with center @code{centertag} and major axis +point @code{majorTag}. If @code{tag} is positive, set the tag explicitly; +otherwise a new tag is selected automatically. If (@code{nx}, @code{ny}, +@code{nz}) != (0,0,0), explicitly set the plane of the circle arc. Return the +tag of the ellipse arc. + +@table @asis +@item Input: +@code{startTag}, @code{centerTag}, @code{majorTag}, @code{endTag}, @code{tag}, @code{nx}, @code{ny}, @code{nz} +@item Output: +- +@item Return: +integer value +@end table + +@item addSpline +Add a spline (Catmull-Rom) curve going through the points @code{pointTags}. If +@code{tag} is positive, set the tag explicitly; otherwise a new tag is selected +automatically. Create a periodic curve if the first and last points are the +same. Return the tag of the spline curve. + +@table @asis +@item Input: +@code{pointTags}, @code{tag} +@item Output: +- +@item Return: +integer value +@end table + +@item addBSpline +Add a cubic b-spline curve with @code{pointTags} control points. If @code{tag} +is positive, set the tag explicitly; otherwise a new tag is selected +automatically. Creates a periodic curve if the first and last points are the +same. Return the tag of the b-spline curve. + +@table @asis +@item Input: +@code{pointTags}, @code{tag} +@item Output: +- +@item Return: +integer value +@end table + +@item addBezier +Add a Bezier curve with @code{pointTags} control points. If @code{tag} is +positive, set the tag explicitly; otherwise a new tag is selected automatically. +Return the tag of the Bezier curve. + +@table @asis +@item Input: +@code{pointTags}, @code{tag} +@item Output: +- +@item Return: +integer value +@end table + +@item addCurveLoop +Add a curve loop (a closed wire) formed by the curves @code{curveTags}. +@code{curveTags} should contain (signed) tags of model enties of dimension 1 +forming a closed loop: a negative tag signifies that the underlying curve is +considered with reversed orientation. If @code{tag} is positive, set the tag +explicitly; otherwise a new tag is selected automatically. Return the tag of the +curve loop. + +@table @asis +@item Input: +@code{curveTags}, @code{tag} +@item Output: +- +@item Return: +integer value +@end table + +@item addPlaneSurface +Add a plane surface defined by one or more curve loops @code{wireTags}. The +first curve loop defines the exterior contour; additional curve loop define +holes. If @code{tag} is positive, set the tag explicitly; otherwise a new tag is +selected automatically. Return the tag of the surface. + +@table @asis +@item Input: +@code{wireTags}, @code{tag} +@item Output: +- +@item Return: +integer value +@end table + +@item addSurfaceFilling +Add a surface filling the curve loops in @code{wireTags}. Currently only a +single curve loop is supported; this curve loop should be composed by 3 or 4 +curves only. If @code{tag} is positive, set the tag explicitly; otherwise a new +tag is selected automatically. Return the tag of the surface. + +@table @asis +@item Input: +@code{wireTags}, @code{tag}, @code{sphereCenterTag} +@item Output: +- +@item Return: +integer value +@end table + +@item addSurfaceLoop +Add a surface loop (a closed shell) formed by @code{surfaceTags}. If @code{tag} +is positive, set the tag explicitly; otherwise a new tag is selected +automatically. Return the tag of the shell. + +@table @asis +@item Input: +@code{surfaceTags}, @code{tag} +@item Output: +- +@item Return: +integer value +@end table + +@item addVolume +Add a volume (a region) defined by one or more shells @code{shellTags}. The +first surface loop defines the exterior boundary; additional surface loop define +holes. If @code{tag} is positive, set the tag explicitly; otherwise a new tag is +selected automatically. Return the tag of the volume. + +@table @asis +@item Input: +@code{shellTags}, @code{tag} +@item Output: +- +@item Return: +integer value +@end table + +@item extrude +Extrude the model entities @code{dimTags} by translation along (@code{dx}, +@code{dy}, @code{dz}). Return extruded entities in @code{outDimTags}. If +@code{numElements} is not empty, also extrude the mesh: the entries in +@code{numElements} give the number of elements in each layer. If @code{height} +is not empty, it provides the (cumulative) height of the different layers, +normalized to 1. If @code{dx} == @code{dy} == @code{dz} == 0, the entities are +extruded along their normal. + +@table @asis +@item Input: +@code{dimTags}, @code{dx}, @code{dy}, @code{dz}, @code{numElements}, @code{heights}, @code{recombine} +@item Output: +@code{outDimTags} +@item Return: +- +@end table + +@item revolve +Extrude the model entities @code{dimTags} by rotation of @code{angle} radians +around the axis of revolution defined by the point (@code{x}, @code{y}, +@code{z}) and the direction (@code{ax}, @code{ay}, @code{az}). Return extruded +entities in @code{outDimTags}. If @code{numElements} is not empty, also extrude +the mesh: the entries in @code{numElements} give the number of elements in each +layer. If @code{height} is not empty, it provides the (cumulative) height of the +different layers, normalized to 1. + +@table @asis +@item Input: +@code{dimTags}, @code{x}, @code{y}, @code{z}, @code{ax}, @code{ay}, @code{az}, @code{angle}, @code{numElements}, @code{heights}, @code{recombine} +@item Output: +@code{outDimTags} +@item Return: +- +@end table + +@item twist +Extrude the model entities @code{dimTags} by a combined translation and rotation +of @code{angle} radians, along (@code{dx}, @code{dy}, @code{dz}) and around the +axis of revolution defined by the point (@code{x}, @code{y}, @code{z}) and the +direction (@code{ax}, @code{ay}, @code{az}). Return extruded entities in +@code{outDimTags}. If @code{numElements} is not empty, also extrude the mesh: +the entries in @code{numElements} give the number of elements in each layer. If +@code{height} is not empty, it provides the (cumulative) height of the different +layers, normalized to 1. + +@table @asis +@item Input: +@code{dimTags}, @code{x}, @code{y}, @code{z}, @code{dx}, @code{dy}, @code{dz}, @code{ax}, @code{ay}, @code{az}, @code{angle}, @code{numElements}, @code{heights}, @code{recombine} +@item Output: +@code{outDimTags} +@item Return: +- +@end table + +@item translate +Translate the model entities @code{dimTags} along (@code{dx}, @code{dy}, +@code{dz}). + +@table @asis +@item Input: +@code{dimTags}, @code{dx}, @code{dy}, @code{dz} +@item Output: +- +@item Return: +- +@end table + +@item rotate +Rotate the model entities @code{dimTags} of @code{angle} radians around the axis +of revolution defined by the point (@code{x}, @code{y}, @code{z}) and the +direction (@code{ax}, @code{ay}, @code{az}). + +@table @asis +@item Input: +@code{dimTags}, @code{x}, @code{y}, @code{z}, @code{ax}, @code{ay}, @code{az}, @code{angle} +@item Output: +- +@item Return: +- +@end table + +@item dilate +Scale the model entities @code{dimTag} by factors @code{a}, @code{b} and +@code{c} along the three coordinate axes; use (@code{x}, @code{y}, @code{z}) as +the center of the homothetic transformation. + +@table @asis +@item Input: +@code{dimTags}, @code{x}, @code{y}, @code{z}, @code{a}, @code{b}, @code{c} +@item Output: +- +@item Return: +- +@end table + +@item symmetrize +Apply a symmetry transformation to the model entities @code{dimTag}, with +respect to the plane of equation @code{a} * x + @code{b} * y + @code{c} * z + +@code{d} = 0. + +@table @asis +@item Input: +@code{dimTags}, @code{a}, @code{b}, @code{c}, @code{d} +@item Output: +- +@item Return: +- +@end table + +@item copy +Copy the entities @code{dimTags}; the new entities are returned in +@code{outDimTags}. + +@table @asis +@item Input: +@code{dimTags} +@item Output: +@code{outDimTags} +@item Return: +- +@end table + +@item remove +Remove the entities @code{dimTags}. If @code{recursive} is true, remove all the +entities on their boundaries, down to dimension 0. + +@table @asis +@item Input: +@code{dimTags}, @code{recursive} +@item Output: +- +@item Return: +- +@end table + +@item removeAllDuplicates +Remove all duplicate entities (different entities at the same geometrical +location). + +@table @asis +@item Input: +- +@item Output: +- +@item Return: +- +@end table + +@item synchronize +Synchronize the built-in CAD representation with the current Gmsh model. This +can be called at any time, but since it involves a non trivial amount of +processing, the number of synchronization points should normally be minimized. + +@table @asis +@item Input: +- +@item Output: +- +@item Return: +- +@end table + +@end ftable + +@node Namespace gmsh/model/geo/mesh, Namespace gmsh/model/occ, Namespace gmsh/model/geo, Gmsh API +@section Namespace @code{gmsh/model/geo/mesh}: built-in CAD kernel meshing constraints + +@ftable @code +@item setSize +Set a mesh size constraint on the model entities @code{dimTags}. Currently only +entities of dimension 0 (points) are handled. + +@table @asis +@item Input: +@code{dimTags}, @code{size} +@item Output: +- +@item Return: +- +@end table + +@item setTransfiniteCurve +Set a transfinite meshing constraint on the curve @code{tag}, with +@code{numNodes} nodes distributed according to @code{meshType} and @code{coef}. +Currently supported types are "Progression" (geometrical progression with power +@code{coef}) and "Bump" (refinement toward both extremities of the curve). + +@table @asis +@item Input: +@code{tag}, @code{nPoints}, @code{meshType}, @code{coef} +@item Output: +- +@item Return: +- +@end table + +@item setTransfiniteSurface +Set a transfinite meshing constraint on the surface @code{tag}. +@code{arrangement} describes the arrangement of the triangles when the surface +is not flagged as recombined: currently supported values are "Left", "Right", +"AlternateLeft" and "AlternateRight". @code{cornerTags} can be used to specify +the (3 or 4) corners of the transfinite interpolation explicitly; specifying the +corners explicitly is mandatory if the surface has more that 3 or 4 points on +its boundary. + +@table @asis +@item Input: +@code{tag}, @code{arrangement}, @code{cornerTags} +@item Output: +- +@item Return: +- +@end table + +@item setTransfiniteVolume +Set a transfinite meshing constraint on the surface @code{tag}. +@code{cornerTags} can be used to specify the (6 or 8) corners of the transfinite +interpolation explicitly. + +@table @asis +@item Input: +@code{tag}, @code{cornerTags} +@item Output: +- +@item Return: +- +@end table + +@item setRecombine +Set a recombination meshing constraint on the model entity of dimension +@code{dim} and tag @code{tag}. Currently only entities of dimension 2 (to +recombine triangles into quadrangles) are supported. + +@table @asis +@item Input: +@code{dim}, @code{tag}, @code{angle} +@item Output: +- +@item Return: +- +@end table + +@item setSmoothing +Set a smoothing meshing constraint on the model entity of dimension @code{dim} +and tag @code{tag}. @code{val} iterations of a Laplace smoother are applied. + +@table @asis +@item Input: +@code{dim}, @code{tag}, @code{val} +@item Output: +- +@item Return: +- +@end table + +@item setReverse +Set a reverse meshing constraint on the model entity of dimension @code{dim} and +tag @code{tag}. If @code{val} is true, the mesh orientation will be reversed +with respect to the natural mesh orientation (i.e. the orientation consistent +with the orientation of the geometry). If @code{val} is false, the mesh is left +as-is. + +@table @asis +@item Input: +@code{dim}, @code{tag}, @code{val} +@item Output: +- +@item Return: +- +@end table + +@end ftable + +@node Namespace gmsh/model/occ, Namespace gmsh/view, Namespace gmsh/model/geo/mesh, Gmsh API +@section Namespace @code{gmsh/model/occ}: OpenCASCADE CAD kernel functions + +@ftable @code +@item addPoint +Add a geometrical point in the OpenCASCADE CAD representation, at coordinates +(@code{x}, @code{y}, @code{z}). If @code{meshSize} is > 0, add a meshing +constraint at that point. If @code{tag} is positive, set the tag explicitly; +otherwise a new tag is selected automatically. Return the tag of the point. +(Note that the point will be added in the current model only after +@code{synchronize} is called. This behavior holds for all the entities added in +the occ module.) + +@table @asis +@item Input: +@code{x}, @code{y}, @code{z}, @code{meshSize}, @code{tag} +@item Output: +- +@item Return: +integer value +@end table + +@item addLine +Add a straight line segment between the two points with tags @code{startTag} and +@code{endTag}. If @code{tag} is positive, set the tag explicitly; otherwise a +new tag is selected automatically. Return the tag of the line. + +@table @asis +@item Input: +@code{startTag}, @code{endTag}, @code{tag} +@item Output: +- +@item Return: +integer value +@end table + +@item addCircleArc +Add a circle arc between the two points with tags @code{startTag} and +@code{endTag}, with center @code{centerTag}. If @code{tag} is positive, set the +tag explicitly; otherwise a new tag is selected automatically. Return the tag of +the circle arc. + +@table @asis +@item Input: +@code{startTag}, @code{centerTag}, @code{endTag}, @code{tag} +@item Output: +- +@item Return: +integer value +@end table + +@item addCircle +Add a circle of center (@code{x}, @code{y}, @code{z}) and radius @code{r}. If +@code{tag} is positive, set the tag explicitly; otherwise a new tag is selected +automatically. If @code{angle1} and @code{angle2} are specified, create a circle +arc between the two angles. Return the tag of the circle. + +@table @asis +@item Input: +@code{x}, @code{y}, @code{z}, @code{r}, @code{tag}, @code{angle1}, @code{angle2} +@item Output: +- +@item Return: +integer value +@end table + +@item addEllipseArc +Add an ellipse arc between the two points with tags @code{startTag} and +@code{endTag}, with center @code{centerTag}. If @code{tag} is positive, set the +tag explicitly; otherwise a new tag is selected automatically. Return the tag of +the ellipse arc. + +@table @asis +@item Input: +@code{startTag}, @code{centerTag}, @code{endTag}, @code{tag} +@item Output: +- +@item Return: +integer value +@end table + +@item addEllipse +Add an ellipse of center (@code{x}, @code{y}, @code{z}) and radii @code{r1} and +@code{r2} along the x- and y-axes respectively. If @code{tag} is positive, set +the tag explicitly; otherwise a new tag is selected automatically. If +@code{angle1} and @code{angle2} are specified, create an ellipse arc between the +two angles. Return the tag of the ellipse. + +@table @asis +@item Input: +@code{x}, @code{y}, @code{z}, @code{r1}, @code{r2}, @code{tag}, @code{angle1}, @code{angle2} +@item Output: +- +@item Return: +integer value +@end table + +@item addSpline +Add a spline (C2 b-spline) curve going through the points @code{pointTags}. If +@code{tag} is positive, set the tag explicitly; otherwise a new tag is selected +automatically. Create a periodic curve if the first and last points are the +same. Return the tag of the spline curve. + +@table @asis +@item Input: +@code{pointTags}, @code{tag} +@item Output: +- +@item Return: +integer value +@end table + +@item addBSpline +Add a b-spline curve of degree @code{degree} with @code{pointTags} control +points. If @code{weights}, @code{knots} or @code{multiplicities} are not +provided, default parameters are computed automatically. If @code{tag} is +positive, set the tag explicitly; otherwise a new tag is selected automatically. +Create a periodic curve if the first and last points are the same. Return the +tag of the b-spline curve. + +@table @asis +@item Input: +@code{pointTags}, @code{tag}, @code{degree}, @code{weights}, @code{knots}, @code{multiplicities} +@item Output: +- +@item Return: +integer value +@end table + +@item addBezier +Add a Bezier curve with @code{pointTags} control points. If @code{tag} is +positive, set the tag explicitly; otherwise a new tag is selected automatically. +Return the tag of the Bezier curve. + +@table @asis +@item Input: +@code{pointTags}, @code{tag} +@item Output: +- +@item Return: +integer value +@end table + +@item addWire +Add a wire (open or closed) formed by the curves @code{curveTags}. +@code{curveTags} should contain (signed) tags: a negative tag signifies that the +underlying curve is considered with reversed orientation. If @code{tag} is +positive, set the tag explicitly; otherwise a new tag is selected automatically. +Return the tag of the wire. + +@table @asis +@item Input: +@code{curveTags}, @code{tag}, @code{checkClosed} +@item Output: +- +@item Return: +integer value +@end table + +@item addCurveLoop +Add a curve loop (a closed wire) formed by the curves @code{curveTags}. +@code{curveTags} should contain tags of curves forming a closed loop. If +@code{tag} is positive, set the tag explicitly; otherwise a new tag is selected +automatically. Return the tag of the curve loop. + +@table @asis +@item Input: +@code{curveTags}, @code{tag} +@item Output: +- +@item Return: +integer value +@end table + +@item addRectangle +Add a rectangle with lower left corner at (@code{x}, @code{y}, @code{z}) and +upper right corner at (@code{x} + @code{dx}, @code{y} + @code{dy}, @code{z}). If +@code{tag} is positive, set the tag explicitly; otherwise a new tag is selected +automatically. Round the corners if @code{roundedRadius} is nonzero. Return the +tag of the rectangle. + +@table @asis +@item Input: +@code{x}, @code{y}, @code{z}, @code{dx}, @code{dy}, @code{tag}, @code{roundedRadius} +@item Output: +- +@item Return: +integer value +@end table + +@item addDisk +Add a disk with center (@code{xc}, @code{yc}, @code{zc}) and radius @code{rx} +along the x-axis and @code{ry} along the y-axis. If @code{tag} is positive, set +the tag explicitly; otherwise a new tag is selected automatically. Return the +tag of the disk. + +@table @asis +@item Input: +@code{xc}, @code{yc}, @code{zc}, @code{rx}, @code{ry}, @code{tag} +@item Output: +- +@item Return: +integer value +@end table + +@item addPlaneSurface +Add a plane surface defined by one or more curve loops (or closed wires) +@code{wireTags}. The first curve loop defines the exterior contour; additional +curve loop define holes. If @code{tag} is positive, set the tag explicitly; +otherwise a new tag is selected automatically. Return the tag of the surface. + +@table @asis +@item Input: +@code{wireTags}, @code{tag} +@item Output: +- +@item Return: +integer value +@end table + +@item addSurfaceFilling +Add a surface filling the curve loops in @code{wireTags}. If @code{tag} is +positive, set the tag explicitly; otherwise a new tag is selected automatically. +Return the tag of the surface. If @code{pointTags} are provided, force the +surface to pass through the given points. + +@table @asis +@item Input: +@code{wireTag}, @code{tag}, @code{pointTags} +@item Output: +- +@item Return: +integer value +@end table + +@item addSurfaceLoop +Add a surface loop (a closed shell) formed by @code{surfaceTags}. If @code{tag} +is positive, set the tag explicitly; otherwise a new tag is selected +automatically. Return the tag of the surface loop. + +@table @asis +@item Input: +@code{surfaceTags}, @code{tag} +@item Output: +- +@item Return: +integer value +@end table + +@item addVolume +Add a volume (a region) defined by one or more surface loops @code{shellTags}. +The first surface loop defines the exterior boundary; additional surface loop +define holes. If @code{tag} is positive, set the tag explicitly; otherwise a new +tag is selected automatically. Return the tag of the volume. + +@table @asis +@item Input: +@code{shellTags}, @code{tag} +@item Output: +- +@item Return: +integer value +@end table + +@item addSphere +Add a sphere of center (@code{xc}, @code{yc}, @code{zc}) and radius @code{r}. +The optional @code{angle1} and @code{angle2} arguments define the polar angle +opening (from -Pi/2 to Pi/2). The optional @code{angle3} argument defines the +azimuthal opening (from 0 to 2*Pi). If @code{tag} is positive, set the tag +explicitly; otherwise a new tag is selected automatically. Return the tag of the +sphere. + +@table @asis +@item Input: +@code{xc}, @code{yc}, @code{zc}, @code{radius}, @code{tag}, @code{angle1}, @code{angle2}, @code{angle3} +@item Output: +- +@item Return: +integer value +@end table + +@item addBox +Add a parallelepipedic box defined by a point (@code{x}, @code{y}, @code{z}) and +the extents along the x-, y- and z-axes. If @code{tag} is positive, set the tag +explicitly; otherwise a new tag is selected automatically. Return the tag of the +box. + +@table @asis +@item Input: +@code{x}, @code{y}, @code{z}, @code{dx}, @code{dy}, @code{dz}, @code{tag} +@item Output: +- +@item Return: +integer value +@end table + +@item addCylinder +Add a cylinder, defined by the center (@code{x}, @code{y}, @code{z}) of its +first circular face, the 3 components (@code{dx}, @code{dy}, @code{dz}) of the +vector defining its axis and its radius @code{r}. The optional @code{angle} +argument defines the angular opening (from 0 to 2*Pi). If @code{tag} is +positive, set the tag explicitly; otherwise a new tag is selected automatically. +Return the tag of the cylinder. + +@table @asis +@item Input: +@code{x}, @code{y}, @code{z}, @code{dx}, @code{dy}, @code{dz}, @code{r}, @code{tag}, @code{angle} +@item Output: +- +@item Return: +integer value +@end table + +@item addCone +Add a cone, defined by the center (@code{x}, @code{y}, @code{z}) of its first +circular face, the 3 components of the vector (@code{dx}, @code{dy}, @code{dz}) +defining its axis and the two radii @code{r1} and @code{r2} of the faces (these +radii can be zero). If @code{tag} is positive, set the tag explicitly; otherwise +a new tag is selected automatically. @code{angle} defines the optional angular +opening (from 0 to 2*Pi). Return the tag of the cone. + +@table @asis +@item Input: +@code{x}, @code{y}, @code{z}, @code{dx}, @code{dy}, @code{dz}, @code{r1}, @code{r2}, @code{tag}, @code{angle} +@item Output: +- +@item Return: +integer value +@end table + +@item addWedge +Add a right angular wedge, defined by the right-angle point (@code{x}, @code{y}, +@code{z}) and the 3 extends along the x-, y- and z-axes (@code{dx}, @code{dy}, +@code{dz}). If @code{tag} is positive, set the tag explicitly; otherwise a new +tag is selected automatically. The optional argument @code{ltx} defines the top +extent along the x-axis. Return the tag of the wedge. + +@table @asis +@item Input: +@code{x}, @code{y}, @code{z}, @code{dx}, @code{dy}, @code{dz}, @code{tag}, @code{ltx} +@item Output: +- +@item Return: +integer value +@end table + +@item addTorus +Add a torus, defined by its center (@code{x}, @code{y}, @code{z}) and its 2 +radii @code{r} and @code{r2}. If @code{tag} is positive, set the tag explicitly; +otherwise a new tag is selected automatically. The optional argument +@code{angle} defines the angular opening (from 0 to 2*Pi). Return the tag of the +wedge. + +@table @asis +@item Input: +@code{x}, @code{y}, @code{z}, @code{r1}, @code{r2}, @code{tag}, @code{angle} +@item Output: +- +@item Return: +integer value +@end table + +@item addThruSections +Add a volume (if the optional argument @code{makeSolid} is set) or surfaces +defined through the open or closed wires @code{wireTags}. If @code{tag} is +positive, set the tag explicitly; otherwise a new tag is selected automatically. +The new entities are returned in @code{outDimTags}. If the optional argument +@code{makeRuled} is set, the surfaces created on the boundary are forced to be +ruled surfaces. + +@table @asis +@item Input: +@code{wireTags}, @code{tag}, @code{makeSolid}, @code{makeRuled} +@item Output: +@code{outDimTags} +@item Return: +- +@end table + +@item addThickSolid +Add a hollowed volume built from an initial volume @code{volumeTag} and a set of +faces from this volume @code{excludeSurfaceTags}, which are to be removed. The +remaining faces of the volume become the walls of the hollowed solid, with +thickness @code{offset}. If @code{tag} is positive, set the tag explicitly; +otherwise a new tag is selected automatically. + +@table @asis +@item Input: +@code{volumeTag}, @code{excludeSurfaceTags}, @code{offset}, @code{tag} +@item Output: +@code{outDimTags} +@item Return: +- +@end table + +@item extrude +Extrude the model entities @code{dimTags} by translation along (@code{dx}, +@code{dy}, @code{dz}). Return extruded entities in @code{outDimTags}. If +@code{numElements} is not empty, also extrude the mesh: the entries in +@code{numElements} give the number of elements in each layer. If @code{height} +is not empty, it provides the (cumulative) height of the different layers, +normalized to 1. + +@table @asis +@item Input: +@code{dimTags}, @code{dx}, @code{dy}, @code{dz}, @code{numElements}, @code{heights}, @code{recombine} +@item Output: +@code{outDimTags} +@item Return: +- +@end table + +@item revolve +Extrude the model entities @code{dimTags} by rotation of @code{angle} radians +around the axis of revolution defined by the point (@code{x}, @code{y}, +@code{z}) and the direction (@code{ax}, @code{ay}, @code{az}). Return extruded +entities in @code{outDimTags}. If @code{numElements} is not empty, also extrude +the mesh: the entries in @code{numElements} give the number of elements in each +layer. If @code{height} is not empty, it provides the (cumulative) height of the +different layers, normalized to 1. + +@table @asis +@item Input: +@code{dimTags}, @code{x}, @code{y}, @code{z}, @code{ax}, @code{ay}, @code{az}, @code{angle}, @code{numElements}, @code{heights}, @code{recombine} +@item Output: +@code{outDimTags} +@item Return: +- +@end table + +@item addPipe +Add a pipe by extruding the entities @code{dimTags} along the wire +@code{wireTag}. Return the pipe in @code{outDimTags}. + +@table @asis +@item Input: +@code{dimTags}, @code{wireTag} +@item Output: +@code{outDimTags} +@item Return: +- +@end table + +@item fillet +Fillet the volumes @code{volumeTags} on the curves @code{curveTags} with radii +@code{radii}. The @code{radii} vector can either contain a single radius, as +many radii as @code{curveTags}, or twice as many as @code{curveTags} (in which +case different radii are provided for the begin and end points of the curves). +Return the filleted entities in @code{outDimTags}. Remove the original volume if +@code{removeVolume} is set. + +@table @asis +@item Input: +@code{volumeTags}, @code{curveTags}, @code{radii}, @code{removeVolume} +@item Output: +@code{outDimTags} +@item Return: +- +@end table + +@item chamfer +Chamfer the volumes @code{volumeTags} on the curves @code{curveTags} with +distances @code{distances} measured on surfaces @code{surfaceTags}. The +@code{distances} vector can either contain a single distance, as many distances +as @code{curveTags} and @code{surfaceTags}, or twice as many as @code{curveTags} +and @code{surfaceTags} (in which case the first in each pair is measured on the +corresponding surface in @code{surfaceTags}, the other on the other adjacent +surface). Return the chamfered entities in @code{outDimTags}. Remove the +original volume if @code{removeVolume} is set. + +@table @asis +@item Input: +@code{volumeTags}, @code{curveTags}, @code{surfaceTags}, @code{distances}, @code{removeVolume} +@item Output: +@code{outDimTags} +@item Return: +- +@end table + +@item fuse +Compute the boolean union (the fusion) of the entities @code{objectDimTags} and +@code{toolDimTags}. Return the resulting entities in @code{outDimTags}. If +@code{tag} is positive, try to set the tag explicitly (only valid if the boolean +operation results in a single entity). Remove the object if @code{removeObject} +is set. Remove the tool if @code{removeTool} is set. + +@table @asis +@item Input: +@code{objectDimTags}, @code{toolDimTags}, @code{tag}, @code{removeObject}, @code{removeTool} +@item Output: +@code{outDimTags}, @code{outDimTagsMap} +@item Return: +- +@end table + +@item intersect +Compute the boolean intersection (the common parts) of the entities +@code{objectDimTags} and @code{toolDimTags}. Return the resulting entities in +@code{outDimTags}. If @code{tag} is positive, try to set the tag explicitly +(only valid if the boolean operation results in a single entity). Remove the +object if @code{removeObject} is set. Remove the tool if @code{removeTool} is +set. + +@table @asis +@item Input: +@code{objectDimTags}, @code{toolDimTags}, @code{tag}, @code{removeObject}, @code{removeTool} +@item Output: +@code{outDimTags}, @code{outDimTagsMap} +@item Return: +- +@end table + +@item cut +Compute the boolean difference between the entities @code{objectDimTags} and +@code{toolDimTags}. Return the resulting entities in @code{outDimTags}. If +@code{tag} is positive, try to set the tag explicitly (only valid if the boolean +operation results in a single entity). Remove the object if @code{removeObject} +is set. Remove the tool if @code{removeTool} is set. + +@table @asis +@item Input: +@code{objectDimTags}, @code{toolDimTags}, @code{tag}, @code{removeObject}, @code{removeTool} +@item Output: +@code{outDimTags}, @code{outDimTagsMap} +@item Return: +- +@end table + +@item fragment +Compute the boolean fragments (general fuse) of the entities +@code{objectDimTags} and @code{toolDimTags}. Return the resulting entities in +@code{outDimTags}. If @code{tag} is positive, try to set the tag explicitly +(only valid if the boolean operation results in a single entity). Remove the +object if @code{removeObject} is set. Remove the tool if @code{removeTool} is +set. + +@table @asis +@item Input: +@code{objectDimTags}, @code{toolDimTags}, @code{tag}, @code{removeObject}, @code{removeTool} +@item Output: +@code{outDimTags}, @code{outDimTagsMap} +@item Return: +- +@end table + +@item translate +Translate the model entities @code{dimTags} along (@code{dx}, @code{dy}, +@code{dz}). + +@table @asis +@item Input: +@code{dimTags}, @code{dx}, @code{dy}, @code{dz} +@item Output: +- +@item Return: +- +@end table + +@item rotate +Rotate the model entities @code{dimTags} of @code{angle} radians around the axis +of revolution defined by the point (@code{x}, @code{y}, @code{z}) and the +direction (@code{ax}, @code{ay}, @code{az}). + +@table @asis +@item Input: +@code{dimTags}, @code{x}, @code{y}, @code{z}, @code{ax}, @code{ay}, @code{az}, @code{angle} +@item Output: +- +@item Return: +- +@end table + +@item dilate +Scale the model entities @code{dimTag} by factors @code{a}, @code{b} and +@code{c} along the three coordinate axes; use (@code{x}, @code{y}, @code{z}) as +the center of the homothetic transformation. + +@table @asis +@item Input: +@code{dimTags}, @code{x}, @code{y}, @code{z}, @code{a}, @code{b}, @code{c} +@item Output: +- +@item Return: +- +@end table + +@item symmetrize +Apply a symmetry transformation to the model entities @code{dimTag}, with +respect to the plane of equation @code{a} * x + @code{b} * y + @code{c} * z + +@code{d} = 0. + +@table @asis +@item Input: +@code{dimTags}, @code{a}, @code{b}, @code{c}, @code{d} +@item Output: +- +@item Return: +- +@end table + +@item affineTransform +Apply a general affine transformation matrix @code{a} (16 entries of a 4x4 +matrix, by row; only the 12 first can be provided for convenience) to the model +entities @code{dimTag}. + +@table @asis +@item Input: +@code{dimTags}, @code{a} +@item Output: +- +@item Return: +- +@end table + +@item copy +Copy the entities @code{dimTags}; the new entities are returned in +@code{outDimTags}. + +@table @asis +@item Input: +@code{dimTags} +@item Output: +@code{outDimTags} +@item Return: +- +@end table + +@item remove +Remove the entities @code{dimTags}. If @code{recursive} is true, remove all the +entities on their boundaries, down to dimension 0. + +@table @asis +@item Input: +@code{dimTags}, @code{recursive} +@item Output: +- +@item Return: +- +@end table + +@item removeAllDuplicates +Remove all duplicate entities (different entities at the same geometrical +location) after intersecting (using boolean fragments) all highest dimensional +entities. + +@table @asis +@item Input: +- +@item Output: +- +@item Return: +- +@end table + +@item importShapes +Import BREP, STEP or IGES shapes from the file @code{fileName}. The imported +entities are returned in @code{outDimTags}. If the optional argument +@code{highestDimOnly} is set, only import the highest dimensional entities in +the file. The optional argument @code{format} can be used to force the format of +the file (currently "brep", "step" or "iges"). + +@table @asis +@item Input: +@code{fileName}, @code{highestDimOnly}, @code{format} +@item Output: +@code{outDimTags} +@item Return: +- +@end table + +@item importShapesNativePointer +Imports an OpenCASCADE @code{shape} by providing a pointer to a native +OpenCASCADE @code{TopoDS_Shape} object (passed as a pointer to void). The +imported entities are returned in @code{outDimTags}. If the optional argument +@code{highestDimOnly} is set, only import the highest dimensional entities in +@code{shape}. For C and C++ only. Warning: this function is unsafe, as providing +an invalid pointer will lead to undefined behavior. + +@table @asis +@item Input: +@code{shape}, @code{highestDimOnly} +@item Output: +@code{outDimTags} +@item Return: +- +@end table + +@item setMeshSize +Set a mesh size constraint on the model entities @code{dimTags}. Currently only +entities of dimension 0 (points) are handled. + +@table @asis +@item Input: +@code{dimTags}, @code{size} +@item Output: +- +@item Return: +- +@end table + +@item getMass +Get the mass of the model entity of dimension @code{dim} and tag @code{tag}. + +@table @asis +@item Input: +@code{dim}, @code{tag} +@item Output: +@code{mass} +@item Return: +- +@end table + +@item getCenterOfMass +Get the center of mass of the model entity of dimension @code{dim} and tag +@code{tag}. + +@table @asis +@item Input: +@code{dim}, @code{tag} +@item Output: +@code{x}, @code{y}, @code{z} +@item Return: +- +@end table + +@item getMatrixOfInertia +Get the matrix of inertia (by row) of the model entity of dimension @code{dim} +and tag @code{tag}. + +@table @asis +@item Input: +@code{dim}, @code{tag} +@item Output: +@code{mat} +@item Return: +- +@end table + +@item synchronize +Synchronize the OpenCASCADE CAD representation with the current Gmsh model. This +can be called at any time, but since it involves a non trivial amount of +processing, the number of synchronization points should normally be minimized. + +@table @asis +@item Input: +- +@item Output: +- +@item Return: +- +@end table + +@end ftable + +@node Namespace gmsh/view, Namespace gmsh/plugin, Namespace gmsh/model/occ, Gmsh API +@section Namespace @code{gmsh/view}: post-processing view functions + +@ftable @code +@item add +Add a new post-processing view, with name @code{name}. If @code{tag} is positive +use it (and remove the view with that tag if it already exists), otherwise +associate a new tag. Return the view tag. + +@table @asis +@item Input: +@code{name}, @code{tag} +@item Output: +- +@item Return: +integer value +@end table + +@item remove +Remove the view with tag @code{tag}. + +@table @asis +@item Input: +@code{tag} +@item Output: +- +@item Return: +- +@end table + +@item getIndex +Get the index of the view with tag @code{tag} in the list of currently loaded +views. This dynamic index (it can change when views are removed) is used to +access view options. + +@table @asis +@item Input: +@code{tag} +@item Output: +- +@item Return: +integer value +@end table + +@item getTags +Get the tags of all views. + +@table @asis +@item Input: +- +@item Output: +@code{tags} +@item Return: +- +@end table + +@item addModelData +Add model-based post-processing data to the view with tag @code{tag}. +@code{modelName} identifies the model the data is attached to. @code{dataType} +specifies the type of data, currently either "NodeData", "ElementData" or +"ElementNodeData". @code{step} specifies the identifier (>= 0) of the data in a +sequence. @code{tags} gives the tags of the nodes or elements in the mesh to +which the data is associated. @code{data} is a vector of the same length as +@code{tags}: each entry is the vector of double precision numbers representing +the data associated with the corresponding tag. The optional @code{time} +argument associate a time value with the data. @code{numComponents} gives the +number of data components (1 for scalar data, 3 for vector data, etc.) per +entity; if negative, it is automatically inferred (when possible) from the input +data. @code{partition} allows to specify data in several sub-sets. + +@table @asis +@item Input: +@code{tag}, @code{step}, @code{modelName}, @code{dataType}, @code{tags}, @code{data}, @code{time}, @code{numComponents}, @code{partition} +@item Output: +- +@item Return: +- +@end table + +@item getModelData +Get model-based post-processing data from the view with tag @code{tag} at step +@code{step}. Return the @code{data} associated to the nodes or the elements with +tags @code{tags}, as well as the @code{dataType} and the number of components +@code{numComponents}. + +@table @asis +@item Input: +@code{tag}, @code{step} +@item Output: +@code{dataType}, @code{tags}, @code{data}, @code{time}, @code{numComponents} +@item Return: +- +@end table + +@item addListData +Add list-based post-processing data to the view with tag @code{tag}. +@code{dataType} identifies the data: "SP" for scalar points, "VP", for vector +points, etc. @code{numEle} gives the number of elements in the data. @code{data} +contains the data for the @code{numEle} elements. + +@table @asis +@item Input: +@code{tag}, @code{dataType}, @code{numEle}, @code{data} +@item Output: +- +@item Return: +- +@end table + +@item getListData +Get list-based post-processing data from the view with tag @code{tag}. Return +the types @code{dataTypes}, the number of elements @code{numElements} for each +data type and the @code{data} for each data type. + +@table @asis +@item Input: +@code{tag} +@item Output: +@code{dataType}, @code{numElements}, @code{data} +@item Return: +- +@end table + +@item addAlias +Add a post-processing view as an @code{alias} of the reference view with tag +@code{refTag}. If @code{copyOptions} is set, copy the options of the reference +view. If @code{tag} is positive use it (and remove the view with that tag if it +already exists), otherwise associate a new tag. Return the view tag. + +@table @asis +@item Input: +@code{refTag}, @code{copyOptions}, @code{tag} +@item Output: +- +@item Return: +integer value +@end table + +@item copyOptions +Copy the options from the view with tag @code{refTag} to the view with tag +@code{tag}. + +@table @asis +@item Input: +@code{refTag}, @code{tag} +@item Output: +- +@item Return: +- +@end table + +@item combine +Combine elements (if @code{what} == "elements") or steps (if @code{what} == +"steps") of all views (@code{how} == "all"), all visible views (@code{how} == +"visible") or all views having the same name (@code{how} == "name"). Remove +original views if @code{remove} is set. + +@table @asis +@item Input: +@code{what}, @code{how}, @code{remove} +@item Output: +- +@item Return: +- +@end table + +@item probe +Probe the view @code{tag} for its @code{value} at point (@code{x}, @code{y}, +@code{z}). Return only the value at step @code{step} is @code{step} is positive. +Return only values with @code{numComp} if @code{numComp} is positive. Return the +gradient of the @code{value} if @code{gradient} is set. Probes with a +geometrical tolerance (in the reference unit cube) of @code{tolerance} if +@code{tolerance} is not zero. Return the result from the element described by +its coordinates if @code{xElementCoord}, @code{yElementCoord} and +@code{zElementCoord} are provided. + +@table @asis +@item Input: +@code{tag}, @code{x}, @code{y}, @code{z}, @code{step}, @code{numComp}, @code{gradient}, @code{tolerance}, @code{xElemCoord}, @code{yElemCoord}, @code{zElemCoord} +@item Output: +@code{value} +@item Return: +- +@end table + +@item write +Write the view to a file @code{fileName}. The export format is determined by the +file extension. Append to the file if @code{append} is set. + +@table @asis +@item Input: +@code{tag}, @code{fileName}, @code{append} +@item Output: +- +@item Return: +- +@end table + +@end ftable + +@node Namespace gmsh/plugin, Namespace gmsh/graphics, Namespace gmsh/view, Gmsh API +@section Namespace @code{gmsh/plugin}: plugin functions + +@ftable @code +@item setNumber +Set the numerical option @code{option} to the value @code{value} for plugin +@code{name}. + +@table @asis +@item Input: +@code{name}, @code{option}, @code{value} +@item Output: +- +@item Return: +- +@end table + +@item setString +Set the string option @code{option} to the value @code{value} for plugin +@code{name}. + +@table @asis +@item Input: +@code{name}, @code{option}, @code{value} +@item Output: +- +@item Return: +- +@end table + +@item run +Run the plugin @code{name}. + +@table @asis +@item Input: +@code{name} +@item Output: +- +@item Return: +- +@end table + +@end ftable + +@node Namespace gmsh/graphics, Namespace gmsh/fltk, Namespace gmsh/plugin, Gmsh API +@section Namespace @code{gmsh/graphics}: graphics functions + +@ftable @code +@item draw +Draw all the OpenGL scenes. + +@table @asis +@item Input: +- +@item Output: +- +@item Return: +- +@end table + +@end ftable + +@node Namespace gmsh/fltk, Namespace gmsh/onelab, Namespace gmsh/graphics, Gmsh API +@section Namespace @code{gmsh/fltk}: FLTK graphical user interface functions + +@ftable @code +@item initialize +Create the FLTK graphical user interface. Can only be called in the main thread. + +@table @asis +@item Input: +- +@item Output: +- +@item Return: +- +@end table + +@item wait +Wait at most @code{time} seconds for user interface events and return. If +@code{time} < 0, wait indefinitely. First automatically create the user +interface if it has not yet been initialized. Can only be called in the main +thread. + +@table @asis +@item Input: +@code{time} +@item Output: +- +@item Return: +- +@end table + +@item update +Update the user interface (potentially creating new widgets and windows). First +automatically create the user interface if it has not yet been initialized. Can +only be called in the main thread: use @code{awake("update")} to trigger an +update of the user interface from another thread. + +@table @asis +@item Input: +- +@item Output: +- +@item Return: +- +@end table + +@item awake +Awake the main user interface thread and process pending events, and optionally +perform an action (currently the only @code{action} allowed is "update"). + +@table @asis +@item Input: +@code{action} +@item Output: +- +@item Return: +- +@end table + +@item lock +Block the current thread until it can safely modify the user interface. + +@table @asis +@item Input: +- +@item Output: +- +@item Return: +- +@end table + +@item unlock +Release the lock that was set using lock. + +@table @asis +@item Input: +- +@item Output: +- +@item Return: +- +@end table + +@item run +Run the event loop of the graphical user interface, i.e. repeatedly calls +@code{wait()}. First automatically create the user interface if it has not yet +been initialized. Can only be called in the main thread. + +@table @asis +@item Input: +- +@item Output: +- +@item Return: +- +@end table + +@item selectEntities +Select entities in the user interface. If @code{dim} is >= 0, return only the +entities of the specified dimension (e.g. points if @code{dim} == 0). + +@table @asis +@item Input: +@code{dim} +@item Output: +@code{dimTags} +@item Return: +integer value +@end table + +@item selectElements +Select elements in the user interface. + +@table @asis +@item Input: +- +@item Output: +@code{elementTags} +@item Return: +integer value +@end table + +@item selectViews +Select views in the user interface. + +@table @asis +@item Input: +- +@item Output: +@code{viewTags} +@item Return: +integer value +@end table + +@end ftable + +@node Namespace gmsh/onelab, Namespace gmsh/logger, Namespace gmsh/fltk, Gmsh API +@section Namespace @code{gmsh/onelab}: ONELAB server functions + +@ftable @code +@item set +Set one or more parameters in the ONELAB database, encoded in @code{format}. + +@table @asis +@item Input: +@code{data}, @code{format} +@item Output: +- +@item Return: +- +@end table + +@item get +Get all the parameters (or a single one if @code{name} is specified) from the +ONELAB database, encoded in @code{format}. + +@table @asis +@item Input: +@code{name}, @code{format} +@item Output: +@code{data} +@item Return: +- +@end table + +@item setNumber +Set the value of the number parameter @code{name} in the ONELAB database. Create +the parameter if it does not exist; update the value if the parameter exists. + +@table @asis +@item Input: +@code{name}, @code{value} +@item Output: +- +@item Return: +- +@end table + +@item setString +Set the value of the string parameter @code{name} in the ONELAB database. Create +the parameter if it does not exist; update the value if the parameter exists. + +@table @asis +@item Input: +@code{name}, @code{value} +@item Output: +- +@item Return: +- +@end table + +@item getNumber +Get the value of the number parameter @code{name} from the ONELAB database. +Return an empty vector if the parameter does not exist. + +@table @asis +@item Input: +@code{name} +@item Output: +@code{value} +@item Return: +- +@end table + +@item getString +Get the value of the string parameter @code{name} from the ONELAB database. +Return an empty vector if the parameter does not exist. + +@table @asis +@item Input: +@code{name} +@item Output: +@code{value} +@item Return: +- +@end table + +@item clear +Clear the ONELAB database, or remove a single parameter if @code{name} is given. + +@table @asis +@item Input: +@code{name} +@item Output: +- +@item Return: +- +@end table + +@item run +Run a ONELAB client. If @code{name} is provided, create a new ONELAB client with +name @code{name} and executes @code{command}. If not, try to run a client that +might be linked to the processed input files. + +@table @asis +@item Input: +@code{name}, @code{command} +@item Output: +- +@item Return: +- +@end table + +@end ftable + +@node Namespace gmsh/logger, , Namespace gmsh/onelab, Gmsh API +@section Namespace @code{gmsh/logger}: information logging functions + +@ftable @code +@item write +Write a @code{message}. @code{level} can be "info", "warning" or "error". + +@table @asis +@item Input: +@code{message}, @code{level} +@item Output: +- +@item Return: +- +@end table + +@item start +Start logging messages. + +@table @asis +@item Input: +- +@item Output: +- +@item Return: +- +@end table + +@item get +Get logged messages. + +@table @asis +@item Input: +- +@item Output: +@code{log} +@item Return: +- +@end table + +@item stop +Stop logging messages. + +@table @asis +@item Input: +- +@item Output: +- +@item Return: +- +@end table + +@item time +Return wall clock time. + +@table @asis +@item Input: +- +@item Output: +- +@item Return: +floating point value +@end table + +@item cputime +Return CPU time. + +@table @asis +@item Input: +- +@item Output: +- +@item Return: +floating point value +@end table + +@end ftable + diff --git a/api/gen.py b/api/gen.py index 3ef802e0af2f6c121ecaf88fea69e8beebea628c..2c84ca902f6e39179b05a4e69afa43f68658b736 100644 --- a/api/gen.py +++ b/api/gen.py @@ -40,7 +40,7 @@ api = API(version_major, version_minor) ################################################################################ -gmsh = api.add_module('gmsh','Top-level functions') +gmsh = api.add_module('gmsh','top-level functions') doc = '''Initialize Gmsh. This must be called before any call to the other functions in the API. If `argc' and `argv' (or just `argv' in Python or Julia) are provided, they will be handled in the same way as the command line arguments in the Gmsh app. If `readConfigFiles' is set, read system Gmsh configuration files (gmshrc and gmsh-options).''' gmsh.add('initialize',doc,None,argcargv(),ibool('readConfigFiles','true','True')) @@ -48,10 +48,10 @@ gmsh.add('initialize',doc,None,argcargv(),ibool('readConfigFiles','true','True') doc = '''Finalize Gmsh. This must be called when you are done using the Gmsh API.''' gmsh.add('finalize',doc,None) -doc = '''Open a file. Equivalent to the `File->Open' menu in the Gmsh app. Handling of the file depends on its extension and/or its contents.''' +doc = '''Open a file. Equivalent to the `File->Open' menu in the Gmsh app. Handling of the file depends on its extension and/or its contents: opening a file with model data will create a new model.''' gmsh.add('open',doc,None,istring('fileName')) -doc = '''Merge a file. Equivalent to the `File->Merge' menu in the Gmsh app. Handling of the file depends on its extension and/or its contents.''' +doc = '''Merge a file. Equivalent to the `File->Merge' menu in the Gmsh app. Handling of the file depends on its extension and/or its contents. Merging a file with model data will add the data to the current model.''' gmsh.add('merge',doc,None,istring('fileName')) doc = '''Write a file. The export format is determined by the file extension.''' @@ -62,7 +62,7 @@ gmsh.add('clear',doc,None) ################################################################################ -option = gmsh.add_module('option','Global option handling functions') +option = gmsh.add_module('option','option handling functions') doc = '''Set a numerical option to `value'. `name' is of the form "category.option" or "category[num].option". Available categories and options are listed in the Gmsh reference manual.''' option.add('setNumber',doc,None,istring('name'),idouble('value')) @@ -76,9 +76,15 @@ option.add('setString',doc,None,istring('name'),istring('value')) doc = '''Get the `value' of a string option. `name' is of the form "category.option" or "category[num].option". Available categories and options are listed in the Gmsh reference manual.''' option.add('getString',doc,None,istring('name'),ostring('value')) +doc = '''Set a color option to the RGBA value (`r', `g', `b', `a'), where where `r', `g', `b' and `a' should be integers between 0 and 255. `name' is of the form "category.option" or "category[num].option". Available categories and options are listed in the Gmsh reference manual, with the "Color." middle string removed.''' +option.add('setColor',doc,None,istring('name'),iint('r'),iint('g'),iint('b'),iint('a','0')) + +doc = '''Get the `r', `g', `b', `a' value of a color option. `name' is of the form "category.option" or "category[num].option". Available categories and options are listed in the Gmsh reference manual, with the "Color." middle string removed.''' +option.add('getColor',doc,None,istring('name'),oint('r'),oint('g'),oint('b'),oint('a')) + ################################################################################ -model = gmsh.add_module('model','Per-model functions') +model = gmsh.add_module('model','model functions') doc = '''Add a new model, with name `name', and set it as the current model.''' model.add('add',doc,None,istring('name')) @@ -92,7 +98,7 @@ model.add('list',doc,None,ovectorstring('names')) doc = '''Set the current model to the model with name `name'. If several models have the same name, select the one that was added first.''' model.add('setCurrent',doc,None,istring('name')) -doc = '''Get all the (elementary) geometrical entities in the current model. If `dim' is >= 0, return only the entities of the specified dimension (e.g. points if `dim' == 0). The entities are returned as a vector of (dim, tag) integer pairs.''' +doc = '''Get all the entities in the current model. If `dim' is >= 0, return only the entities of the specified dimension (e.g. points if `dim' == 0). The entities are returned as a vector of (dim, tag) integer pairs.''' model.add('getEntities',doc,None,ovectorpair('dimTags'),iint('dim','-1')) doc = '''Set the name of the entity of dimension `dim' and tag `tag'.''' @@ -104,13 +110,13 @@ model.add('getEntityName',doc,None,iint('dim'),iint('tag'),ostring('name')) doc = '''Get all the physical groups in the current model. If `dim' is >= 0, return only the entities of the specified dimension (e.g. physical points if `dim' == 0). The entities are returned as a vector of (dim, tag) integer pairs.''' model.add('getPhysicalGroups',doc,None,ovectorpair('dimTags'),iint('dim','-1')) -doc = '''Get the tags of the geometrical entities making up the physical group of dimension `dim' and tag `tag'.''' +doc = '''Get the tags of the model entities making up the physical group of dimension `dim' and tag `tag'.''' model.add('getEntitiesForPhysicalGroup',doc,None,iint('dim'),iint('tag'),ovectorint('tags')) -doc = '''Get the tags of the physical groups (if any) to which the geometrical entity of dimension `dim' and tag `tag' belongs.''' +doc = '''Get the tags of the physical groups (if any) to which the model entity of dimension `dim' and tag `tag' belongs.''' model.add('getPhysicalGroupsForEntity',doc,None,iint('dim'),iint('tag'),ovectorint('physicalTags')) -doc = '''Add a physical group of dimension `dim', grouping the elementary entities with tags `tags'. Return the tag of the physical group, equal to `tag' if `tag' is positive, or a new tag if `tag' < 0.''' +doc = '''Add a physical group of dimension `dim', grouping the model entities with tags `tags'. Return the tag of the physical group, equal to `tag' if `tag' is positive, or a new tag if `tag' < 0.''' model.add('addPhysicalGroup',doc,oint,iint('dim'),ivectorint('tags'),iint('tag','-1')) doc = '''Set the name of the physical group of dimension `dim' and tag `tag'.''' @@ -119,19 +125,19 @@ model.add('setPhysicalName',doc,None,iint('dim'),iint('tag'),istring('name')) doc = '''Get the name of the physical group of dimension `dim' and tag `tag'.''' model.add('getPhysicalName',doc,None,iint('dim'),iint('tag'),ostring('name')) -doc = '''Get the boundary of the geometrical entities `dimTags'. Return in `outDimTags' the boundary of the individual entities (if `combined' is false) or the boundary of the combined geometrical shape formed by all input entities (if `combined' is true). Return tags multiplied by the sign of the boundary entity if `oriented' is true. Apply the boundary operator recursively down to dimension 0 (i.e. to points) if `recursive' is true.''' +doc = '''Get the boundary of the model entities `dimTags'. Return in `outDimTags' the boundary of the individual entities (if `combined' is false) or the boundary of the combined geometrical shape formed by all input entities (if `combined' is true). Return tags multiplied by the sign of the boundary entity if `oriented' is true. Apply the boundary operator recursively down to dimension 0 (i.e. to points) if `recursive' is true.''' model.add('getBoundary',doc,None,ivectorpair('dimTags'),ovectorpair('outDimTags'),ibool('combined','true','True'),ibool('oriented','true','True'),ibool('recursive','false','False')) -doc = '''Get the (elementary) geometrical entities in the bounding box defined by the two points (`xmin', `ymin', `zmin') and (`xmax', `ymax', `zmax'). If `dim' is >= 0, return only the entities of the specified dimension (e.g. points if `dim' == 0).''' +doc = '''Get the model entities in the bounding box defined by the two points (`xmin', `ymin', `zmin') and (`xmax', `ymax', `zmax'). If `dim' is >= 0, return only the entities of the specified dimension (e.g. points if `dim' == 0).''' model.add('getEntitiesInBoundingBox',doc,None,idouble('xmin'),idouble('ymin'),idouble('zmin'),idouble('xmax'),idouble('ymax'),idouble('zmax'),ovectorpair('tags'),iint('dim','-1')) -doc = '''Get the bounding box (`xmin', `ymin', `zmin'), (`xmax', `ymax', `zmax') of the geometrical entity of dimension `dim' and tag `tag'.''' +doc = '''Get the bounding box (`xmin', `ymin', `zmin'), (`xmax', `ymax', `zmax') of the model entity of dimension `dim' and tag `tag'. If `dim' and `tag' are negative, get the bounding box of the whole model.''' model.add('getBoundingBox',doc,None,iint('dim'),iint('tag'),odouble('xmin'),odouble('ymin'),odouble('zmin'),odouble('xmax'),odouble('ymax'),odouble('zmax')) doc = '''Get the geometrical dimension of the current model.''' model.add('getDimension',doc,oint) -doc = '''Add a discrete geometrical entity (defined by a mesh) of dimension `dim' in the current model. Return the tag of the new discrete entity, equal to `tag' if `tag' is positive, or a new tag if `tag' < 0. `boundary' specifies the tags of the entities on the boundary of the discrete entity, if any. Specyfing `boundary' allows Gmsh to construct the topology of the overall model.''' +doc = '''Add a discrete model entity (defined by a mesh) of dimension `dim' in the current model. Return the tag of the new discrete entity, equal to `tag' if `tag' is positive, or a new tag if `tag' < 0. `boundary' specifies the tags of the entities on the boundary of the discrete entity, if any. Specifying `boundary' allows Gmsh to construct the topology of the overall model.''' model.add('addDiscreteEntity',doc,oint,iint('dim'),iint('tag','-1'),ivectorint('boundary','std::vector<int>()',"[]","[]")) doc = '''Remove the entities `dimTags' of the current model. If `recursive' is true, remove all the entities on their boundaries, down to dimension 0.''' @@ -170,21 +176,24 @@ model.add('getPrincipalCurvatures',doc,None,iint('tag'),ivectordouble('parametri doc = '''Get the normal to the surface with tag `tag' at the parametric coordinates `parametricCoord'. `parametricCoord' are given by pairs of u and v coordinates, concatenated: [p1u, p1v, p2u, ...]. `normals' are returned as triplets of x, y, z components, concatenated: [n1x, n1y, n1z, n2x, ...].''' model.add('getNormal',doc,None,iint('tag'),ivectordouble('parametricCoord'),ovectordouble('normals')) -doc = '''Set the visibility of the geometrical entities `dimTags' to `value'. Apply the visibility setting recursively if `recursive' is true.''' +doc = '''Set the visibility of the model entities `dimTags' to `value'. Apply the visibility setting recursively if `recursive' is true.''' model.add('setVisibility',doc,None,ivectorpair('dimTags'),iint('value'),ibool('recursive','false','False')) -doc = '''Get the visibility of the geometrical entity of dimension `dim' and tag `tag'.''' +doc = '''Get the visibility of the model entity of dimension `dim' and tag `tag'.''' model.add('getVisibility',doc,None,iint('dim'),iint('tag'),oint('value')) -doc = '''Set the color of the geometrical entities `dimTags' to the RGBA value (`r', `g', `b', `a'), where `r', `g', `b' and `a' should be integers between 0 and 255. Apply the color setting recursively if `recursive' is true.''' +doc = '''Set the color of the model entities `dimTags' to the RGBA value (`r', `g', `b', `a'), where `r', `g', `b' and `a' should be integers between 0 and 255. Apply the color setting recursively if `recursive' is true.''' model.add('setColor',doc,None,ivectorpair('dimTags'),iint('r'),iint('g'),iint('b'),iint('a','0'),ibool('recursive','false','False')) -doc = '''Get the color of the geometrical entity of dimension `dim' and tag `tag'.''' +doc = '''Get the color of the model entity of dimension `dim' and tag `tag'.''' model.add('getColor',doc,None,iint('dim'),iint('tag'),oint('r'),oint('g'),oint('b'),oint('a')) +doc = '''Set the `x', `y', `z' coordinates of a geometrical point.''' +model.add('setCoordinates',doc,None,iint('tag'),idouble('x'),idouble('y'),idouble('z')) + ################################################################################ -mesh = model.add_module('mesh','Per-model meshing functions') +mesh = model.add_module('mesh','mesh functions') doc = '''Generate a mesh of the current model, up to dimension `dim' (0, 1, 2 or 3).''' mesh.add('generate',doc,None,iint('dim', '3')) @@ -195,9 +204,18 @@ mesh.add('partition',doc,None,iint('numPart')) doc = '''Unpartition the mesh of the current model.''' mesh.add('unpartition',doc,None) +doc = '''Optimize the mesh of the current model using `method' (empty for default tetrahedral mesh optimizer, "Netgen" for Netgen optimizer, "HighOrder" for direct high-order mesh optimizer, "HighOrderElastic" for high-order elastic smoother).''' +mesh.add('optimize',doc,None,istring('method','')) + +doc = '''Recombine the mesh of the current model.''' +mesh.add('recombine',doc,None) + doc = '''Refine the mesh of the current model by uniformly splitting the elements.''' mesh.add('refine',doc,None) +doc = '''Smooth the mesh of the current model.''' +mesh.add('smooth',doc,None) + doc = '''Set the order of the elements in the mesh of the current model to `order'.''' mesh.add('setOrder',doc,None,iint('order')) @@ -207,10 +225,10 @@ mesh.add('getLastEntityError',doc,None,ovectorpair('dimTags')) doc = '''Get the last nodes (if any) where a meshing error occurred. Currently only populated by the new 3D meshing algorithms.''' mesh.add('getLastNodeError',doc,None,ovectorsize('nodeTags')) -doc = '''Get the nodes classified on the entity of dimension `dim' and tag `tag'. If `tag' < 0, get the nodes for all entities of dimension `dim'. If `dim' and `tag' are negative, get all the nodes in the mesh. `nodeTags' contains the node tags (their unique, strictly positive identification numbers). `coord' is a vector of length 3 times the length of `nodeTags' that contains the x, y, z coordinates of the nodes, concatenated: [n1x, n1y, n1z, n2x, ...]. If `dim' >= 0, `parametricCoord' contains the parametric coordinates ([u1, u2, ...] or [u1, v1, u2, ...]) of the nodes, if available. The length of `parametricCoord' can be 0 or `dim' times the length of `nodeTags'. If `includeBoundary' is set, also return the nodes classified on the boundary of the entity (wich will be reparametrized on the entity if `dim' >= 0 in order to compute their parametric coordinates).''' -mesh.add('getNodes',doc,None,ovectorsize('nodeTags'),ovectordouble('coord'),ovectordouble('parametricCoord'),iint('dim', '-1'),iint('tag', '-1'),ibool('includeBoundary','false','False')) +doc = '''Get the nodes classified on the entity of dimension `dim' and tag `tag'. If `tag' < 0, get the nodes for all entities of dimension `dim'. If `dim' and `tag' are negative, get all the nodes in the mesh. `nodeTags' contains the node tags (their unique, strictly positive identification numbers). `coord' is a vector of length 3 times the length of `nodeTags' that contains the x, y, z coordinates of the nodes, concatenated: [n1x, n1y, n1z, n2x, ...]. If `dim' >= 0 and `returnParamtricCoord' is set, `parametricCoord' contains the parametric coordinates ([u1, u2, ...] or [u1, v1, u2, ...]) of the nodes, if available. The length of `parametricCoord' can be 0 or `dim' times the length of `nodeTags'. If `includeBoundary' is set, also return the nodes classified on the boundary of the entity (which will be reparametrized on the entity if `dim' >= 0 in order to compute their parametric coordinates).''' +mesh.add('getNodes',doc,None,ovectorsize('nodeTags'),ovectordouble('coord'),ovectordouble('parametricCoord'),iint('dim', '-1'),iint('tag', '-1'),ibool('includeBoundary','false','False'),ibool('returnParametricCoord','true','True')) -doc = '''Get the coordinates and the parametric coordinates (if any) of the node with tag `tag'. This is a sometimes useful but inefficient way of accessing nodes, as it relies on a cache stored in the model. For large meshes all the nodes in the model should be numbered in a continuous sequence of tags from 1 to N to maintain reasonnable performance (in this case the internal cache is based on a vector; otherwise it uses a map).''' +doc = '''Get the coordinates and the parametric coordinates (if any) of the node with tag `tag'. This is a sometimes useful but inefficient way of accessing nodes, as it relies on a cache stored in the model. For large meshes all the nodes in the model should be numbered in a continuous sequence of tags from 1 to N to maintain reasonable performance (in this case the internal cache is based on a vector; otherwise it uses a map).''' mesh.add('getNode',doc,None,isize('nodeTag'),ovectordouble('coord'),ovectordouble('parametricCoord')) doc = '''Rebuild the node cache.''' @@ -219,10 +237,10 @@ mesh.add('rebuildNodeCache',doc,None,ibool('onlyIfNecessary', 'true', 'True')) doc = '''Get the nodes from all the elements belonging to the physical group of dimension `dim' and tag `tag'. `nodeTags' contains the node tags; `coord' is a vector of length 3 times the length of `nodeTags' that contains the x, y, z coordinates of the nodes, concatenated: [n1x, n1y, n1z, n2x, ...].''' mesh.add('getNodesForPhysicalGroup',doc,None,iint('dim'),iint('tag'),ovectorsize('nodeTags'),ovectordouble('coord')) -doc = '''Set the nodes classified on the geometrical entity of dimension `dim' and tag `tag'. `nodeTags' contains the node tags (their unique, strictly positive identification numbers). `coord' is a vector of length 3 times the length of `nodeTags' that contains the x, y, z coordinates of the nodes, concatenated: [n1x, n1y, n1z, n2x, ...]. The optional `parametricCoord' vector contains the parametric coordinates of the nodes, if any. The length of `parametricCoord' can be 0 or `dim' times the length of `nodeTags'. If the `nodeTags' vector is empty, new tags are automatically assigned to the nodes.''' +doc = '''Set the nodes classified on the model entity of dimension `dim' and tag `tag'. `nodeTags' contains the node tags (their unique, strictly positive identification numbers). `coord' is a vector of length 3 times the length of `nodeTags' that contains the x, y, z coordinates of the nodes, concatenated: [n1x, n1y, n1z, n2x, ...]. The optional `parametricCoord' vector contains the parametric coordinates of the nodes, if any. The length of `parametricCoord' can be 0 or `dim' times the length of `nodeTags'. If the `nodeTags' vector is empty, new tags are automatically assigned to the nodes.''' mesh.add('setNodes',doc,None,iint('dim'),iint('tag'),ivectorsize('nodeTags'),ivectordouble('coord'),ivectordouble('parametricCoord','std::vector<double>()',"[]","[]")) -doc = '''Reclassify all nodes on their associated geometrical entity, based on the elements. Can be used when importing nodes in bulk (e.g. by associating them all to a single volume), to reclassify them correctly on model surfaces, curves, etc. after the elements have been set.''' +doc = '''Reclassify all nodes on their associated model entity, based on the elements. Can be used when importing nodes in bulk (e.g. by associating them all to a single volume), to reclassify them correctly on model surfaces, curves, etc. after the elements have been set.''' mesh.add('reclassifyNodes',doc,None) doc = '''Relocate the nodes classified on the entity of dimension `dim' and tag `tag' using their parametric coordinates. If `tag' < 0, relocate the nodes for all entities of dimension `dim'. If `dim' and `tag' are negative, relocate all the nodes in the mesh.''' @@ -231,11 +249,11 @@ mesh.add('relocateNodes',doc,None,iint('dim', '-1'),iint('tag', '-1')) doc = '''Get the elements classified on the entity of dimension `dim' and tag `tag'. If `tag' < 0, get the elements for all entities of dimension `dim'. If `dim' and `tag' are negative, get all the elements in the mesh. `elementTypes' contains the MSH types of the elements (e.g. `2' for 3-node triangles: see `getElementProperties' to obtain the properties for a given element type). `elementTags' is a vector of the same length as `elementTypes'; each entry is a vector containing the tags (unique, strictly positive identifiers) of the elements of the corresponding type. `nodeTags' is also a vector of the same length as `elementTypes'; each entry is a vector of length equal to the number of elements of the given type times the number N of nodes for this type of element, that contains the node tags of all the elements of the given type, concatenated: [e1n1, e1n2, ..., e1nN, e2n1, ...].''' mesh.add('getElements',doc,None,ovectorint('elementTypes'),ovectorvectorsize('elementTags'),ovectorvectorsize('nodeTags'),iint('dim', '-1'),iint('tag', '-1')) -doc = '''Get the type and node tags of the element with tag `tag'. This is a sometimes useful but inefficient way of accessing elements, as it relies on a cache stored in the model. For large meshes all the elements in the model should be numbered in a continuous sequence of tags from 1 to N to maintain reasonnable performance (in this case the internal cache is based on a vector; otherwise it uses a map).''' +doc = '''Get the type and node tags of the element with tag `tag'. This is a sometimes useful but inefficient way of accessing elements, as it relies on a cache stored in the model. For large meshes all the elements in the model should be numbered in a continuous sequence of tags from 1 to N to maintain reasonable performance (in this case the internal cache is based on a vector; otherwise it uses a map).''' mesh.add('getElement',doc,None,isize('elementTag'),oint('elementType'),ovectorsize('nodeTags')) -doc = '''Get the tag, type and node tags of the element located at coordinates (`x', `y', `z'). This is a sometimes useful but inefficient way of accessing elements, as it relies on a search in a spatial octree.''' -mesh.add('getElementByCoordinates',doc,None,idouble('x'),idouble('y'),idouble('z'),osize('elementTag'),oint('elementType'),ovectorsize('nodeTags')) +doc = '''Search the mesh for an element located at coordinates (`x', `y', `z'). This is a sometimes useful but inefficient way of accessing elements, as it relies on a search in a spatial octree. If an element is found, return its tag, type and node tags, as well as the local coordinates (`u', `v', `w') within the element corresponding to search location. If `dim' is >= 0, only search for elements of the given dimension. If `strict' is not set, use a tolerance to find elements near the search location.''' +mesh.add('getElementByCoordinates',doc,None,idouble('x'),idouble('y'),idouble('z'),osize('elementTag'),oint('elementType'),ovectorsize('nodeTags'),odouble('u'),odouble('v'),odouble('w'),iint('dim', '-1'),ibool('strict','false','False')) doc = '''Get the types of elements in the entity of dimension `dim' and tag `tag'. If `tag' < 0, get the types for all entities of dimension `dim'. If `dim' and `tag' are negative, get all the types in the mesh.''' mesh.add('getElementTypes',doc,None,ovectorint('elementTypes'),iint('dim', '-1'),iint('tag', '-1')) @@ -246,11 +264,11 @@ mesh.add('getElementType',doc,oint,istring('familyName'),iint('order'),ibool('se doc = '''Get the properties of an element of type `elementType': its name (`elementName'), dimension (`dim'), order (`order'), number of nodes (`numNodes') and parametric node coordinates (`parametricCoord' vector, of length `dim' times `numNodes').''' mesh.add('getElementProperties',doc,None,iint('elementType'),ostring('elementName'),oint('dim'),oint('order'),oint('numNodes'),ovectordouble('parametricCoord')) -doc = '''Get the elements of type `elementType' classified on the entity of of tag `tag'. If `tag' < 0, get the elements for all entities. `elementTags' is a vector containing the tags (unique, strictly positive identifiers) of the elements of the corresponding type. `nodeTags' is a vector of length equal to the number of elements of the given type times the number N of nodes for this type of element, that contains the node tags of all the elements of the given type, concatenated: [e1n1, e1n2, ..., e1nN, e2n1, ...]. If `numTasks' > 1, only compute and return the part of the data indexed by `task'.''' +doc = '''Get the elements of type `elementType' classified on the entity of tag `tag'. If `tag' < 0, get the elements for all entities. `elementTags' is a vector containing the tags (unique, strictly positive identifiers) of the elements of the corresponding type. `nodeTags' is a vector of length equal to the number of elements of the given type times the number N of nodes for this type of element, that contains the node tags of all the elements of the given type, concatenated: [e1n1, e1n2, ..., e1nN, e2n1, ...]. If `numTasks' > 1, only compute and return the part of the data indexed by `task'.''' mesh.add('getElementsByType',doc,None,iint('elementType'),ovectorsize('elementTags'),ovectorsize('nodeTags'),iint('tag', '-1'),isize('task', '0'),isize('numTasks', '1')) -doc = '''Preallocate the data for `getElementsByType'. This is necessary only if `getElementsByType' is called with `numTasks' > 1.''' -mesh.add('preallocateElementsByType',doc,None,iint('elementType'),ibool('elementTag'),ibool('nodeTag'),ovectorsize('elementTags'),ovectorsize('nodeTags'),iint('tag', '-1')) +doc = '''Preallocate data before calling `getElementsByType' with `numTasks' > 1. For C and C++ only.''' +mesh.add_special('preallocateElementsByType',doc,['onlycc++'],None,iint('elementType'),ibool('elementTag'),ibool('nodeTag'),ovectorsize('elementTags'),ovectorsize('nodeTags'),iint('tag', '-1')) doc = '''Set the elements of the entity of dimension `dim' and tag `tag'. `types' contains the MSH types of the elements (e.g. `2' for 3-node triangles: see the Gmsh reference manual). `elementTags' is a vector of the same length as `types'; each entry is a vector containing the tags (unique, strictly positive identifiers) of the elements of the corresponding type. `nodeTags' is also a vector of the same length as `types'; each entry is a vector of length equal to the number of elements of the given type times the number N of nodes per element, that contains the node tags of all the elements of the given type, concatenated: [e1n1, e1n2, ..., e1nN, e2n1, ...].''' mesh.add('setElements',doc,None,iint('dim'),iint('tag'),ivectorint('elementTypes'),ivectorvectorsize('elementTags'),ivectorvectorsize('nodeTags')) @@ -258,34 +276,46 @@ mesh.add('setElements',doc,None,iint('dim'),iint('tag'),ivectorint('elementTypes doc = '''Set the elements of type `elementType' in the entity of tag `tag'. `elementTags' contains the tags (unique, strictly positive identifiers) of the elements of the corresponding type. `nodeTags' is a vector of length equal to the number of elements times the number N of nodes per element, that contains the node tags of all the elements, concatenated: [e1n1, e1n2, ..., e1nN, e2n1, ...]. If the `elementTag' vector is empty, new tags are automatically assigned to the elements.''' mesh.add('setElementsByType',doc,None,iint('tag'),iint('elementType'),ivectorsize('elementTags'),ivectorsize('nodeTags')) -doc = '''Get the Jacobians of all the elements of type `elementType' classified on the entity of dimension `dim' and tag `tag', at the G integration points required by the `integrationType' integration rule (e.g. \"Gauss4\" for a Gauss quadrature suited for integrating 4th order polynomials). Data is returned by element, with elements in the same order as in `getElements' and `getElementsByType'. `jacobians' contains for each element the 9 entries of the 3x3 Jacobian matrix at each integration point, by row: [e1g1Jxu, e1g1Jxv, e1g1Jxw, e1g1Jyu, ..., e1g1Jzw, e1g2Jxu, ..., e1gGJzw, e2g1Jxu, ...], with Jxu=dx/du, Jxv=dx/dv, etc. `determinants' contains for each element the determinant of the Jacobian matrix at each integration point: [e1g1, e1g2, ... e1gG, e2g1, ...]. `points' contains for each element the x, y, z coordinates of the integration points. If `tag' < 0, get the Jacobian data for all entities. If `numTasks' > 1, only compute and return the part of the data indexed by `task'.''' -mesh.add('getJacobians',doc,None,iint('elementType'),istring('integrationType'),ovectordouble('jacobians'),ovectordouble('determinants'),ovectordouble('points'),iint('tag', '-1'),isize('task', '0'),isize('numTasks', '1')) +doc = '''Get the numerical quadrature information for the given element type `elementType' and integration rule `integrationType' (e.g. "Gauss4" for a Gauss quadrature suited for integrating 4th order polynomials). `integrationPoints' contains the u, v, w coordinates of the G integration points in the reference element: [g1u, g1v, g1w, ..., gGu, gGv, gGw]. `integrationWeigths' contains the associated weights: [g1q, ..., gGq].''' +mesh.add('getIntegrationPoints',doc,None,iint('elementType'),istring('integrationType'),ovectordouble('integrationPoints'),ovectordouble('integrationWeights')) + +doc = '''Get the Jacobians of all the elements of type `elementType' classified on the entity of tag `tag', at the G integration points `integrationPoints' given as concatenated triplets of coordinates in the reference element [g1u, g1v, g1w, ..., gGu, gGv, gGw]. Data is returned by element, with elements in the same order as in `getElements' and `getElementsByType'. `jacobians' contains for each element the 9 entries of the 3x3 Jacobian matrix at each integration point, by row: [e1g1Jxu, e1g1Jxv, e1g1Jxw, e1g1Jyu, ..., e1g1Jzw, e1g2Jxu, ..., e1gGJzw, e2g1Jxu, ...], with Jxu=dx/du, Jxv=dx/dv, etc. `determinants' contains for each element the determinant of the Jacobian matrix at each integration point: [e1g1, e1g2, ... e1gG, e2g1, ...]. `points' contains for each element the x, y, z coordinates of the integration points. If `tag' < 0, get the Jacobian data for all entities. If `numTasks' > 1, only compute and return the part of the data indexed by `task'.''' +mesh.add('getJacobians',doc,None,iint('elementType'),ivectordouble('integrationPoints'),ovectordouble('jacobians'),ovectordouble('determinants'),ovectordouble('points'),iint('tag', '-1'),isize('task', '0'),isize('numTasks', '1')) + +doc = '''Preallocate data before calling `getJacobians' with `numTasks' > 1. For C and C++ only.''' +mesh.add_special('preallocateJacobians',doc,['onlycc++'],None,iint('elementType'),iint('numIntegrationPoints'),ibool('jacobian'),ibool('determinant'),ibool('point'),ovectordouble('jacobians'),ovectordouble('determinants'),ovectordouble('points'),iint('tag', '-1')) + +doc = '''Get the basis functions of the element of type `elementType' at the integration points `integrationPoints' (given as concatenated triplets of coordinates in the reference element [g1u, g1v, g1w, ..., gGu, gGv, gGw]), for the function space `functionSpaceType' (e.g. "Lagrange" or "GradLagrange" for Lagrange basis functions or their gradient, in the u, v, w coordinates of the reference element). `numComponents' returns the number C of components of a basis function. `basisFunctions' returns the value of the N basis functions at the integration points, i.e. [g1f1, g1f2, ..., g1fN, g2f1, ...] when C == 1 or [g1f1u, g1f1v, g1f1w, g1f2u, ..., g1fNw, g2f1u, ...] when C == 3.''' +mesh.add('getBasisFunctions',doc,None,iint('elementType'),ivectordouble('integrationPoints'),istring('functionSpaceType'),oint('numComponents'),ovectordouble('basisFunctions')) -doc = '''Preallocate the data required by `getJacobians'. This is necessary only if `getJacobians' is called with `numTasks' > 1.''' -mesh.add('preallocateJacobians',doc,None,iint('elementType'),istring('integrationType'),ibool('jacobian'),ibool('determinant'),ibool('point'),ovectordouble('jacobians'),ovectordouble('determinants'),ovectordouble('points'),iint('tag', '-1')) +doc = '''Get the element-dependent basis functions of the elements of type `elementType' in the entity of tag `tag'at the integration points `integrationPoints' (given as concatenated triplets of coordinates in the reference element [g1u, g1v, g1w, ..., gGu, gGv, gGw]), for the function space `functionSpaceType' (e.g. "H1Legendre3" or "GradH1Legendre3" for 3rd order hierarchical H1 Legendre functions or their gradient, in the u, v, w coordinates of the reference elements). `numComponents' returns the number C of components of a basis function. `numBasisFunctions' returns the number N of basis functions per element. `basisFunctions' returns the value of the basis functions at the integration points for each element: [e1g1f1,..., e1g1fN, e1g2f1,..., e2g1f1, ...] when C == 1 or [e1g1f1u, e1g1f1v,..., e1g1fNw, e1g2f1u,..., e2g1f1u, ...]. Warning: this is an experimental feature and will probably change in a future release.''' +mesh.add('getBasisFunctionsForElements',doc,None,iint('elementType'),ivectordouble('integrationPoints'),istring('functionSpaceType'),oint('numComponents'),oint('numFunctionsPerElements'),ovectordouble('basisFunctions'),iint('tag','-1')) -doc = '''Get the basis functions of the element of type `elementType' for the given `integrationType' integration rule (e.g. \"Gauss4\" for a Gauss quadrature suited for integrating 4th order polynomials) and `functionSpaceType' function space (e.g. \"Lagrange\" or \"GradLagrange\" for Lagrange basis functions or their gradient, in the u, v, w coordinates of the reference element). `integrationPoints' contains the u, v, w coordinates of the integration points in the reference element as well as the associated weight q, concatenated: [g1u, g1v, g1w, g1q, g2u, ...]. `numComponents' returns the number C of components of a basis function. `basisFunctions' contains the evaluation of the basis functions at the integration points: [g1f1, ..., g1fC, g2f1, ...].''' -mesh.add('getBasisFunctions',doc,None,iint('elementType'),istring('integrationType'),istring('functionSpaceType'),ovectordouble('integrationPoints'),oint('numComponents'),ovectordouble('basisFunctions')) +doc = '''Generate the `keys' for the elements of type `elementType' in the entity of tag `tag', for the `functionSpaceType' function space. Each key uniquely identifies a basis function in the function space. If `returnCoord' is set, the `coord' vector contains the x, y, z coordinates locating basis functions for sorting purposes. Warning: this is an experimental feature and will probably change in a future release.''' +mesh.add('getKeysForElements',doc,None,iint('elementType'),istring('functionSpaceType'),ovectorpair('keys'),ovectordouble('coord'),iint('tag', '-1'),ibool('returnCoord','true', 'True')) -doc = '''Precomputes the basis functions corresponding to `elementType'.''' +doc = '''Get information about the `keys'. Warning: this is an experimental feature and will probably change in a future release.''' +mesh.add('getInformationForElements',doc,None,ivectorpair('keys'),ovectorpair('info'),iint('order'),iint('elementType')) + +doc = '''Precomputes the basis functions corresponding to `elementType'. ''' mesh.add('precomputeBasisFunctions',doc,None,iint('elementType')) doc = '''Get the barycenters of all elements of type `elementType' classified on the entity of tag `tag'. If `primary' is set, only the primary nodes of the elements are taken into account for the barycenter calculation. If `fast' is set, the function returns the sum of the primary node coordinates (without normalizing by the number of nodes). If `tag' < 0, get the barycenters for all entities. If `numTasks' > 1, only compute and return the part of the data indexed by `task'.''' mesh.add('getBarycenters',doc,None,iint('elementType'),iint('tag'),ibool('fast'),ibool('primary'),ovectordouble('barycenters'),isize('task', '0'),isize('numTasks', '1')) -doc = '''Preallocate the data required by `getBarycenters'. This is necessary only if `getBarycenters' is called with `numTasks' > 1.''' -mesh.add('preallocateBarycenters',doc,None,iint('elementType'),ovectordouble('barycenters'),iint('tag', '-1')) +doc = '''Preallocate data before calling `getBarycenters' with `numTasks' > 1. For C and C++ only.''' +mesh.add_special('preallocateBarycenters',doc,['onlycc++'],None,iint('elementType'),ovectordouble('barycenters'),iint('tag', '-1')) -doc = '''Get the nodes on the edges of all elements of type `elementType' classified on the entity of tag `tag'. `nodeTags' contains the node tags. If `primary' is set, only the primary (begin/end) nodes of the edges are returned. If `tag' < 0, get the edge nodes for all entities. If `numTasks' > 1, only compute and return the part of the data indexed by `task'.''' +doc = '''Get the nodes on the edges of all elements of type `elementType' classified on the entity of tag `tag'. `nodeTags' contains the node tags of the edges for all the elements: [e1a1n1, e1a1n2, e1a2n1, ...]. Data is returned by element, with elements in the same order as in `getElements' and `getElementsByType'. If `primary' is set, only the primary (begin/end) nodes of the edges are returned. If `tag' < 0, get the edge nodes for all entities. If `numTasks' > 1, only compute and return the part of the data indexed by `task'.''' mesh.add('getElementEdgeNodes',doc,None,iint('elementType'),ovectorsize('nodeTags'),iint('tag','-1'),ibool('primary','false','False'),isize('task', '0'),isize('numTasks', '1')) -doc = '''Get the nodes on the faces of type `faceType' (3 for triangular faces, 4 for quadrangular faces) of all elements of type `elementType' classified on the entity of tag `tag'. `nodeTags' contains the node tags. If `primary' is set, only the primary (corner) nodes of the faces are returned. If `tag' < 0, get the face nodes for all entities. If `numTasks' > 1, only compute and return the part of the data indexed by `task'.''' +doc = '''Get the nodes on the faces of type `faceType' (3 for triangular faces, 4 for quadrangular faces) of all elements of type `elementType' classified on the entity of tag `tag'. `nodeTags' contains the node tags of the faces for all elements: [e1f1n1, ..., e1f1nFaceType, e1f2n1, ...]. Data is returned by element, with elements in the same order as in `getElements' and `getElementsByType'. If `primary' is set, only the primary (corner) nodes of the faces are returned. If `tag' < 0, get the face nodes for all entities. If `numTasks' > 1, only compute and return the part of the data indexed by `task'.''' mesh.add('getElementFaceNodes',doc,None,iint('elementType'),iint('faceType'),ovectorsize('nodeTags'),iint('tag','-1'),ibool('primary','false','False'),isize('task', '0'),isize('numTasks', '1')) doc = '''Get the ghost elements `elementTags' and their associated `partitions' stored in the ghost entity of dimension `dim' and tag `tag'.''' mesh.add('getGhostElements',doc,None,iint('dim'),iint('tag'),ovectorsize('elementTags'),ovectorint('partitions')) -doc = '''Set a mesh size constraint on the geometrical entities `dimTags'. Currently only entities of dimension 0 (points) are handled.''' +doc = '''Set a mesh size constraint on the model entities `dimTags'. Currently only entities of dimension 0 (points) are handled.''' mesh.add('setSize',doc,None,ivectorpair('dimTags'),idouble('size')) doc = '''Set a transfinite meshing constraint on the curve `tag', with `numNodes' nodes distributed according to `meshType' and `coef'. Currently supported types are "Progression" (geometrical progression with power `coef') and "Bump" (refinement toward both extremities of the curve).''' @@ -297,22 +327,22 @@ mesh.add('setTransfiniteSurface',doc,None,iint('tag'),istring('arrangement','"Le doc = '''Set a transfinite meshing constraint on the surface `tag'. `cornerTags' can be used to specify the (6 or 8) corners of the transfinite interpolation explicitly.''' mesh.add('setTransfiniteVolume',doc,None,iint('tag'),ivectorint('cornerTags','std::vector<int>()',"[]","[]")) -doc = '''Set a recombination meshing constraint on the geometrical entity of dimension `dim' and tag `tag'. Currently only entities of dimension 2 (to recombine triangles into quadrangles) are supported.''' +doc = '''Set a recombination meshing constraint on the model entity of dimension `dim' and tag `tag'. Currently only entities of dimension 2 (to recombine triangles into quadrangles) are supported.''' mesh.add('setRecombine',doc,None,iint('dim'),iint('tag')) -doc = '''Set a smoothing meshing constraint on the geometrical entity of dimension `dim' and tag `tag'. `val' iterations of a Laplace smoother are applied.''' +doc = '''Set a smoothing meshing constraint on the model entity of dimension `dim' and tag `tag'. `val' iterations of a Laplace smoother are applied.''' mesh.add('setSmoothing',doc,None,iint('dim'),iint('tag'),iint('val')) -doc = '''Set a reverse meshing constraint on the geometrical entity of dimension `dim' and tag `tag'. If `val' is true, the mesh orientation will be reversed with respect to the natural mesh orientation (i.e. the orientation consistent with the orientation of the geometrical entity). If `val' is false, the mesh is left as-is.''' +doc = '''Set a reverse meshing constraint on the model entity of dimension `dim' and tag `tag'. If `val' is true, the mesh orientation will be reversed with respect to the natural mesh orientation (i.e. the orientation consistent with the orientation of the geometry). If `val' is false, the mesh is left as-is.''' mesh.add('setReverse',doc,None,iint('dim'),iint('tag'),ibool('val','true','True')) doc = '''Set meshing constraints on the bounding surfaces of the volume of tag `tag' so that all surfaces are oriented with outward pointing normals. Currently only available with the OpenCASCADE kernel, as it relies on the STL triangulation.''' mesh.add('setOutwardOrientation',doc,None,iint('tag')) -doc = '''Embed the geometrical entities of dimension `dim' and tags `tags' in the (inDim, inTag) geometrical entity. `inDim' must be strictly greater than `dim'.''' +doc = '''Embed the model entities of dimension `dim' and tags `tags' in the (inDim, inTag) model entity. `inDim' must be strictly greater than `dim'.''' mesh.add('embed',doc,None,iint('dim'),ivectorint('tags'),iint('inDim'),iint('inTag')) -doc = '''Remove embedded entities in the geometrical entities `dimTags'. if `dim' is >= 0, only remove embedded entities of the given dimension (e.g. embedded points if `dim' == 0).''' +doc = '''Remove embedded entities in the model entities `dimTags'. if `dim' is >= 0, only remove embedded entities of the given dimension (e.g. embedded points if `dim' == 0).''' mesh.add('removeEmbedded',doc,None,ivectorpair('dimTags'),iint('dim', '-1')) doc = '''Reorder the elements of type `elementType' classified on the entity of tag `tag' according to `ordering'.''' @@ -353,9 +383,9 @@ mesh.add('computeCohomology',doc,None,ivectorint('domainTags','std::vector<int>( ################################################################################ -field = mesh.add_module('field','Per-model mesh size field functions') +field = mesh.add_module('field','mesh size field functions') -doc = '''Add a new mesh size field of type `fieldType'. If `tag' is positive, assign the tag explcitly; otherwise a new tag is assigned automatically. Return the field tag.''' +doc = '''Add a new mesh size field of type `fieldType'. If `tag' is positive, assign the tag explicitly; otherwise a new tag is assigned automatically. Return the field tag.''' field.add('add',doc,oint,istring('fieldType'),iint('tag','-1')) doc = '''Remove the field with tag `tag'.''' @@ -378,18 +408,18 @@ field.add('setAsBoundaryLayer',doc,None,iint('tag')) ################################################################################ -geo = model.add_module('geo','Internal per-model GEO CAD kernel functions') +geo = model.add_module('geo','built-in CAD kernel functions') -doc = '''Add a geometrical point in the internal GEO CAD representation, at coordinates (`x', `y', `z'). If `meshSize' is > 0, add a meshing constraint at that point. If `tag' is positive, set the tag explicitly; otherwise a new tag is selected automatically. Return the tag of the point. (Note that the point will be added in the current model only after `synchronize' is called. This behavior holds for all the entities added in the geo module.)''' +doc = '''Add a geometrical point in the built-in CAD representation, at coordinates (`x', `y', `z'). If `meshSize' is > 0, add a meshing constraint at that point. If `tag' is positive, set the tag explicitly; otherwise a new tag is selected automatically. Return the tag of the point. (Note that the point will be added in the current model only after `synchronize' is called. This behavior holds for all the entities added in the geo module.)''' geo.add('addPoint',doc,oint,idouble('x'),idouble('y'),idouble('z'),idouble('meshSize','0.'),iint('tag','-1')) doc = '''Add a straight line segment between the two points with tags `startTag' and `endTag'. If `tag' is positive, set the tag explicitly; otherwise a new tag is selected automatically. Return the tag of the line.''' geo.add('addLine',doc,oint,iint('startTag'),iint('endTag'),iint('tag','-1')) -doc = '''Add a circle arc (stricly smaller than Pi) between the two points with tags `startTag' and `endTag', with center `centertag'. If `tag' is positive, set the tag explicitly; otherwise a new tag is selected automatically. If (`nx', `ny', `nz') != (0,0,0), explicitely set the plane of the circle arc. Return the tag of the circle arc.''' +doc = '''Add a circle arc (strictly smaller than Pi) between the two points with tags `startTag' and `endTag', with center `centertag'. If `tag' is positive, set the tag explicitly; otherwise a new tag is selected automatically. If (`nx', `ny', `nz') != (0,0,0), explicitly set the plane of the circle arc. Return the tag of the circle arc.''' geo.add('addCircleArc',doc,oint,iint('startTag'),iint('centerTag'),iint('endTag'),iint('tag','-1'),idouble('nx','0.'),idouble('ny','0.'),idouble('nz','0.')) -doc = '''Add an ellipse arc (stricly smaller than Pi) between the two points `startTag' and `endTag', with center `centertag' and major axis point `majorTag'. If `tag' is positive, set the tag explicitly; otherwise a new tag is selected automatically. If (`nx', `ny', `nz') != (0,0,0), explicitely set the plane of the circle arc. Return the tag of the ellipse arc.''' +doc = '''Add an ellipse arc (strictly smaller than Pi) between the two points `startTag' and `endTag', with center `centertag' and major axis point `majorTag'. If `tag' is positive, set the tag explicitly; otherwise a new tag is selected automatically. If (`nx', `ny', `nz') != (0,0,0), explicitly set the plane of the circle arc. Return the tag of the ellipse arc.''' geo.add('addEllipseArc',doc,oint,iint('startTag'),iint('centerTag'),iint('majorTag'),iint('endTag'),iint('tag','-1'),idouble('nx','0.'),idouble('ny','0.'),idouble('nz','0.')) doc = '''Add a spline (Catmull-Rom) curve going through the points `pointTags'. If `tag' is positive, set the tag explicitly; otherwise a new tag is selected automatically. Create a periodic curve if the first and last points are the same. Return the tag of the spline curve.''' @@ -401,7 +431,7 @@ geo.add('addBSpline',doc,oint,ivectorint('pointTags'),iint('tag','-1')) doc = '''Add a Bezier curve with `pointTags' control points. If `tag' is positive, set the tag explicitly; otherwise a new tag is selected automatically. Return the tag of the Bezier curve.''' geo.add('addBezier',doc,oint,ivectorint('pointTags'),iint('tag','-1')) -doc = '''Add a curve loop (a closed wire) formed by the curves `curveTags'. `curveTags' should contain (signed) tags of geometrical enties of dimension 1 forming a closed loop: a negative tag signifies that the underlying curve is considered with reversed orientation. If `tag' is positive, set the tag explicitly; otherwise a new tag is selected automatically. Return the tag of the curve loop.''' +doc = '''Add a curve loop (a closed wire) formed by the curves `curveTags'. `curveTags' should contain (signed) tags of model enties of dimension 1 forming a closed loop: a negative tag signifies that the underlying curve is considered with reversed orientation. If `tag' is positive, set the tag explicitly; otherwise a new tag is selected automatically. Return the tag of the curve loop.''' geo.add('addCurveLoop',doc,oint,ivectorint('curveTags'),iint('tag','-1')) doc = '''Add a plane surface defined by one or more curve loops `wireTags'. The first curve loop defines the exterior contour; additional curve loop define holes. If `tag' is positive, set the tag explicitly; otherwise a new tag is selected automatically. Return the tag of the surface.''' @@ -416,25 +446,25 @@ geo.add('addSurfaceLoop',doc,oint,ivectorint('surfaceTags'),iint('tag','-1')) doc = '''Add a volume (a region) defined by one or more shells `shellTags'. The first surface loop defines the exterior boundary; additional surface loop define holes. If `tag' is positive, set the tag explicitly; otherwise a new tag is selected automatically. Return the tag of the volume.''' geo.add('addVolume',doc,oint,ivectorint('shellTags'),iint('tag','-1')) -doc = '''Extrude the geometrical entities `dimTags' by translation along (`dx', `dy', `dz'). Return extruded entities in `outDimTags'. If `numElements' is not empty, also extrude the mesh: the entries in `numElements' give the number of elements in each layer. If `height' is not empty, it provides the (cummulative) height of the different layers, normalized to 1.''' +doc = '''Extrude the model entities `dimTags' by translation along (`dx', `dy', `dz'). Return extruded entities in `outDimTags'. If `numElements' is not empty, also extrude the mesh: the entries in `numElements' give the number of elements in each layer. If `height' is not empty, it provides the (cumulative) height of the different layers, normalized to 1. If `dx' == `dy' == `dz' == 0, the entities are extruded along their normal.''' geo.add('extrude',doc,None,ivectorpair('dimTags'),idouble('dx'),idouble('dy'),idouble('dz'),ovectorpair('outDimTags'),ivectorint('numElements','std::vector<int>()',"[]","[]"),ivectordouble('heights','std::vector<double>()',"[]","[]"),ibool('recombine','false','False')) -doc = '''Extrude the geometrical entities `dimTags' by rotation of `angle' radians around the axis of revolution defined by the point (`x', `y', `z') and the direction (`ax', `ay', `az'). Return extruded entities in `outDimTags'. If `numElements' is not empty, also extrude the mesh: the entries in `numElements' give the number of elements in each layer. If `height' is not empty, it provides the (cummulative) height of the different layers, normalized to 1.''' +doc = '''Extrude the model entities `dimTags' by rotation of `angle' radians around the axis of revolution defined by the point (`x', `y', `z') and the direction (`ax', `ay', `az'). Return extruded entities in `outDimTags'. If `numElements' is not empty, also extrude the mesh: the entries in `numElements' give the number of elements in each layer. If `height' is not empty, it provides the (cumulative) height of the different layers, normalized to 1.''' geo.add('revolve',doc,None,ivectorpair('dimTags'),idouble('x'),idouble('y'),idouble('z'),idouble('ax'),idouble('ay'),idouble('az'),idouble('angle'),ovectorpair('outDimTags'),ivectorint('numElements','std::vector<int>()',"[]","[]"),ivectordouble('heights','std::vector<double>()',"[]","[]"),ibool('recombine','false','False')) -doc = '''Extrude the geometrical entities `dimTags' by a combined translation and rotation of `angle' radians, along (`dx', `dy', `dz') and around the axis of revolution defined by the point (`x', `y', `z') and the direction (`ax', `ay', `az'). Return extruded entities in `outDimTags'. If `numElements' is not empty, also extrude the mesh: the entries in `numElements' give the number of elements in each layer. If `height' is not empty, it provides the (cummulative) height of the different layers, normalized to 1.''' +doc = '''Extrude the model entities `dimTags' by a combined translation and rotation of `angle' radians, along (`dx', `dy', `dz') and around the axis of revolution defined by the point (`x', `y', `z') and the direction (`ax', `ay', `az'). Return extruded entities in `outDimTags'. If `numElements' is not empty, also extrude the mesh: the entries in `numElements' give the number of elements in each layer. If `height' is not empty, it provides the (cumulative) height of the different layers, normalized to 1.''' geo.add('twist',doc,None,ivectorpair('dimTags'),idouble('x'),idouble('y'),idouble('z'),idouble('dx'),idouble('dy'),idouble('dz'),idouble('ax'),idouble('ay'),idouble('az'),idouble('angle'),ovectorpair('outDimTags'),ivectorint('numElements','std::vector<int>()',"[]","[]"),ivectordouble('heights','std::vector<double>()',"[]","[]"),ibool('recombine','false','False')) -doc = '''Translate the geometrical entities `dimTags' along (`dx', `dy', `dz').''' +doc = '''Translate the model entities `dimTags' along (`dx', `dy', `dz').''' geo.add('translate',doc,None,ivectorpair('dimTags'),idouble('dx'),idouble('dy'),idouble('dz')) -doc = '''Rotate the geometrical entities `dimTags' of `angle' radians around the axis of revolution defined by the point (`x', `y', `z') and the direction (`ax', `ay', `az').''' +doc = '''Rotate the model entities `dimTags' of `angle' radians around the axis of revolution defined by the point (`x', `y', `z') and the direction (`ax', `ay', `az').''' geo.add('rotate',doc,None,ivectorpair('dimTags'),idouble('x'),idouble('y'),idouble('z'),idouble('ax'),idouble('ay'),idouble('az'),idouble('angle')) -doc = '''Scale the geometrical entities `dimTag' by factors `a', `b' and `c' along the three coordinate axes; use (`x', `y', `z') as the center of the homothetic transformation.''' +doc = '''Scale the model entities `dimTag' by factors `a', `b' and `c' along the three coordinate axes; use (`x', `y', `z') as the center of the homothetic transformation.''' geo.add('dilate',doc,None,ivectorpair('dimTags'),idouble('x'),idouble('y'),idouble('z'),idouble('a'),idouble('b'),idouble('c')) -doc = '''Apply a symmetry transformation to the geometrical entities `dimTag', with respect to the plane of equation `a' * x + `b' * y + `c' * z + `d' = 0.''' +doc = '''Apply a symmetry transformation to the model entities `dimTag', with respect to the plane of equation `a' * x + `b' * y + `c' * z + `d' = 0.''' geo.add('symmetrize',doc,None,ivectorpair('dimTags'),idouble('a'),idouble('b'),idouble('c'),idouble('d')) doc = '''Copy the entities `dimTags'; the new entities are returned in `outDimTags'.''' @@ -446,17 +476,17 @@ geo.add('remove',doc,None,ivectorpair('dimTags'),ibool('recursive','false','Fals doc = '''Remove all duplicate entities (different entities at the same geometrical location).''' geo.add('removeAllDuplicates',doc,None) -doc = '''Synchronize the internal GEO CAD representation with the current Gmsh model. This can be called at any time, but since it involves a non trivial amount of processing, the number of synchronization points should normally be minimized.''' +doc = '''Synchronize the built-in CAD representation with the current Gmsh model. This can be called at any time, but since it involves a non trivial amount of processing, the number of synchronization points should normally be minimized.''' geo.add('synchronize',doc,None) ################################################################################ -mesh = geo.add_module('mesh','GEO-specific meshing constraints') +mesh = geo.add_module('mesh','built-in CAD kernel meshing constraints') -doc = '''Set a mesh size constraint on the geometrical entities `dimTags'. Currently only entities of dimension 0 (points) are handled.''' +doc = '''Set a mesh size constraint on the model entities `dimTags'. Currently only entities of dimension 0 (points) are handled.''' mesh.add('setSize',doc,None,ivectorpair('dimTags'),idouble('size')) -doc = '''Set a transfinite meshing constraint on the curve `tag', with `numNodes' nodes distributed according to `meshType' and `coef'. Currently supported types are "Progression" (geometrical progression with power `coef') and "Bump" (refinement toward both extreminties of the curve).''' +doc = '''Set a transfinite meshing constraint on the curve `tag', with `numNodes' nodes distributed according to `meshType' and `coef'. Currently supported types are "Progression" (geometrical progression with power `coef') and "Bump" (refinement toward both extremities of the curve).''' mesh.add('setTransfiniteCurve',doc,None,iint('tag'),iint('nPoints'),istring('meshType','"Progression"'),idouble('coef','1.')) doc = '''Set a transfinite meshing constraint on the surface `tag'. `arrangement' describes the arrangement of the triangles when the surface is not flagged as recombined: currently supported values are "Left", "Right", "AlternateLeft" and "AlternateRight". `cornerTags' can be used to specify the (3 or 4) corners of the transfinite interpolation explicitly; specifying the corners explicitly is mandatory if the surface has more that 3 or 4 points on its boundary.''' @@ -465,20 +495,20 @@ mesh.add('setTransfiniteSurface',doc,None,iint('tag'),istring('arrangement','"Le doc = '''Set a transfinite meshing constraint on the surface `tag'. `cornerTags' can be used to specify the (6 or 8) corners of the transfinite interpolation explicitly.''' mesh.add('setTransfiniteVolume',doc,None,iint('tag'),ivectorint('cornerTags','std::vector<int>()',"[]","[]")) -doc = '''Set a recombination meshing constraint on the geometrical entity of dimension `dim' and tag `tag'. Currently only entities of dimension 2 (to recombine triangles into quadrangles) are supported.''' +doc = '''Set a recombination meshing constraint on the model entity of dimension `dim' and tag `tag'. Currently only entities of dimension 2 (to recombine triangles into quadrangles) are supported.''' mesh.add('setRecombine',doc,None,iint('dim'),iint('tag'),idouble('angle','45.')) -doc = '''Set a smoothing meshing constraint on the geometrical entity of dimension `dim' and tag `tag'. `val' iterations of a Laplace smoother are applied.''' +doc = '''Set a smoothing meshing constraint on the model entity of dimension `dim' and tag `tag'. `val' iterations of a Laplace smoother are applied.''' mesh.add('setSmoothing',doc,None,iint('dim'),iint('tag'),iint('val')) -doc = '''Set a reverse meshing constraint on the geometrical entity of dimension `dim' and tag `tag'. If `val' is true, the mesh orientation will be reversed with respect to the natural mesh orientation (i.e. the orientation consistent with the orientation of the geometrical entity). If `val' is false, the mesh is left as-is.''' +doc = '''Set a reverse meshing constraint on the model entity of dimension `dim' and tag `tag'. If `val' is true, the mesh orientation will be reversed with respect to the natural mesh orientation (i.e. the orientation consistent with the orientation of the geometry). If `val' is false, the mesh is left as-is.''' mesh.add('setReverse',doc,None,iint('dim'),iint('tag'),ibool('val','true','True')) ################################################################################ -occ = model.add_module('occ','Internal per-model OpenCASCADE CAD kernel functions') +occ = model.add_module('occ','OpenCASCADE CAD kernel functions') -doc = '''Add a geometrical point in the internal OpenCASCADE CAD representation, at coordinates (`x', `y', `z'). If `meshSize' is > 0, add a meshing constraint at that point. If `tag' is positive, set the tag explicitly; otherwise a new tag is selected automatically. Return the tag of the point. (Note that the point will be added in the current model only after `synchronize' is called. This behavior holds for all the entities added in the occ module.)''' +doc = '''Add a geometrical point in the OpenCASCADE CAD representation, at coordinates (`x', `y', `z'). If `meshSize' is > 0, add a meshing constraint at that point. If `tag' is positive, set the tag explicitly; otherwise a new tag is selected automatically. Return the tag of the point. (Note that the point will be added in the current model only after `synchronize' is called. This behavior holds for all the entities added in the occ module.)''' occ.add('addPoint',doc,oint,idouble('x'),idouble('y'),idouble('z'),idouble('meshSize','0.'),iint('tag','-1')) doc = '''Add a straight line segment between the two points with tags `startTag' and `endTag'. If `tag' is positive, set the tag explicitly; otherwise a new tag is selected automatically. Return the tag of the line.''' @@ -553,10 +583,10 @@ occ.add('addThruSections',doc,None,ivectorint('wireTags'),ovectorpair('outDimTag doc = '''Add a hollowed volume built from an initial volume `volumeTag' and a set of faces from this volume `excludeSurfaceTags', which are to be removed. The remaining faces of the volume become the walls of the hollowed solid, with thickness `offset'. If `tag' is positive, set the tag explicitly; otherwise a new tag is selected automatically.''' occ.add('addThickSolid',doc,None,iint('volumeTag'),ivectorint('excludeSurfaceTags'),idouble('offset'),ovectorpair('outDimTags'),iint('tag','-1')) -doc = '''Extrude the geometrical entities `dimTags' by translation along (`dx', `dy', `dz'). Return extruded entities in `outDimTags'. If `numElements' is not empty, also extrude the mesh: the entries in `numElements' give the number of elements in each layer. If `height' is not empty, it provides the (cummulative) height of the different layers, normalized to 1.''' +doc = '''Extrude the model entities `dimTags' by translation along (`dx', `dy', `dz'). Return extruded entities in `outDimTags'. If `numElements' is not empty, also extrude the mesh: the entries in `numElements' give the number of elements in each layer. If `height' is not empty, it provides the (cumulative) height of the different layers, normalized to 1.''' occ.add('extrude',doc,None,ivectorpair('dimTags'),idouble('dx'),idouble('dy'),idouble('dz'),ovectorpair('outDimTags'),ivectorint('numElements','std::vector<int>()',"[]","[]"),ivectordouble('heights','std::vector<double>()',"[]","[]"),ibool('recombine','false','False')) -doc = '''Extrude the geometrical entities `dimTags' by rotation of `angle' radians around the axis of revolution defined by the point (`x', `y', `z') and the direction (`ax', `ay', `az'). Return extruded entities in `outDimTags'. If `numElements' is not empty, also extrude the mesh: the entries in `numElements' give the number of elements in each layer. If `height' is not empty, it provides the (cummulative) height of the different layers, normalized to 1.''' +doc = '''Extrude the model entities `dimTags' by rotation of `angle' radians around the axis of revolution defined by the point (`x', `y', `z') and the direction (`ax', `ay', `az'). Return extruded entities in `outDimTags'. If `numElements' is not empty, also extrude the mesh: the entries in `numElements' give the number of elements in each layer. If `height' is not empty, it provides the (cumulative) height of the different layers, normalized to 1.''' occ.add('revolve',doc,None,ivectorpair('dimTags'),idouble('x'),idouble('y'),idouble('z'),idouble('ax'),idouble('ay'),idouble('az'),idouble('angle'),ovectorpair('outDimTags'),ivectorint('numElements','std::vector<int>()',"[]","[]"),ivectordouble('heights','std::vector<double>()',"[]","[]"),ibool('recombine','false','False')) doc = '''Add a pipe by extruding the entities `dimTags' along the wire `wireTag'. Return the pipe in `outDimTags'.''' @@ -568,31 +598,31 @@ occ.add('fillet',doc,None,ivectorint('volumeTags'),ivectorint('curveTags'),ivect doc = '''Chamfer the volumes `volumeTags' on the curves `curveTags' with distances `distances' measured on surfaces `surfaceTags'. The `distances' vector can either contain a single distance, as many distances as `curveTags' and `surfaceTags', or twice as many as `curveTags' and `surfaceTags' (in which case the first in each pair is measured on the corresponding surface in `surfaceTags', the other on the other adjacent surface). Return the chamfered entities in `outDimTags'. Remove the original volume if `removeVolume' is set.''' occ.add('chamfer',doc,None,ivectorint('volumeTags'),ivectorint('curveTags'),ivectorint('surfaceTags'),ivectordouble('distances'),ovectorpair('outDimTags'),ibool('removeVolume','true','True')) -doc = '''Compute the boolean union (the fusion) of the entities `objectDimTags' and `toolDimTags'. Return the resulting entities in `outDimTags'. If `tag' is positive, try to set the tag explicitly (ony valid if the boolean operation results in a single entity). Remove the object if `removeObject' is set. Remove the tool if `removeTool' is set.''' +doc = '''Compute the boolean union (the fusion) of the entities `objectDimTags' and `toolDimTags'. Return the resulting entities in `outDimTags'. If `tag' is positive, try to set the tag explicitly (only valid if the boolean operation results in a single entity). Remove the object if `removeObject' is set. Remove the tool if `removeTool' is set.''' occ.add('fuse',doc,None,ivectorpair('objectDimTags'),ivectorpair('toolDimTags'),ovectorpair('outDimTags'),ovectorvectorpair('outDimTagsMap'),iint('tag','-1'),ibool('removeObject','true','True'),ibool('removeTool','true','True')) -doc = '''Compute the boolean intersection (the common parts) of the entities `objectDimTags' and `toolDimTags'. Return the resulting entities in `outDimTags'. If `tag' is positive, try to set the tag explicitly (ony valid if the boolean operation results in a single entity). Remove the object if `removeObject' is set. Remove the tool if `removeTool' is set.''' +doc = '''Compute the boolean intersection (the common parts) of the entities `objectDimTags' and `toolDimTags'. Return the resulting entities in `outDimTags'. If `tag' is positive, try to set the tag explicitly (only valid if the boolean operation results in a single entity). Remove the object if `removeObject' is set. Remove the tool if `removeTool' is set.''' occ.add('intersect',doc,None,ivectorpair('objectDimTags'),ivectorpair('toolDimTags'),ovectorpair('outDimTags'),ovectorvectorpair('outDimTagsMap'),iint('tag','-1'),ibool('removeObject','true','True'),ibool('removeTool','true','True')) -doc = '''Compute the boolean difference between the entities `objectDimTags' and `toolDimTags'. Return the resulting entities in `outDimTags'. If `tag' is positive, try to set the tag explicitly (ony valid if the boolean operation results in a single entity). Remove the object if `removeObject' is set. Remove the tool if `removeTool' is set.''' +doc = '''Compute the boolean difference between the entities `objectDimTags' and `toolDimTags'. Return the resulting entities in `outDimTags'. If `tag' is positive, try to set the tag explicitly (only valid if the boolean operation results in a single entity). Remove the object if `removeObject' is set. Remove the tool if `removeTool' is set.''' occ.add('cut',doc,None,ivectorpair('objectDimTags'),ivectorpair('toolDimTags'),ovectorpair('outDimTags'),ovectorvectorpair('outDimTagsMap'),iint('tag','-1'),ibool('removeObject','true','True'),ibool('removeTool','true','True')) -doc = '''Compute the boolean fragments (general fuse) of the entities `objectDimTags' and `toolDimTags'. Return the resulting entities in `outDimTags'. If `tag' is positive, try to set the tag explicitly (ony valid if the boolean operation results in a single entity). Remove the object if `removeObject' is set. Remove the tool if `removeTool' is set.''' +doc = '''Compute the boolean fragments (general fuse) of the entities `objectDimTags' and `toolDimTags'. Return the resulting entities in `outDimTags'. If `tag' is positive, try to set the tag explicitly (only valid if the boolean operation results in a single entity). Remove the object if `removeObject' is set. Remove the tool if `removeTool' is set.''' occ.add('fragment',doc,None,ivectorpair('objectDimTags'),ivectorpair('toolDimTags'),ovectorpair('outDimTags'),ovectorvectorpair('outDimTagsMap'),iint('tag','-1'),ibool('removeObject','true','True'),ibool('removeTool','true','True')) -doc = '''Translate the geometrical entities `dimTags' along (`dx', `dy', `dz').''' +doc = '''Translate the model entities `dimTags' along (`dx', `dy', `dz').''' occ.add('translate',doc,None,ivectorpair('dimTags'),idouble('dx'),idouble('dy'),idouble('dz')) -doc = '''Rotate the geometrical entities `dimTags' of `angle' radians around the axis of revolution defined by the point (`x', `y', `z') and the direction (`ax', `ay', `az').''' +doc = '''Rotate the model entities `dimTags' of `angle' radians around the axis of revolution defined by the point (`x', `y', `z') and the direction (`ax', `ay', `az').''' occ.add('rotate',doc,None,ivectorpair('dimTags'),idouble('x'),idouble('y'),idouble('z'),idouble('ax'),idouble('ay'),idouble('az'),idouble('angle')) -doc = '''Scale the geometrical entities `dimTag' by factors `a', `b' and `c' along the three coordinate axes; use (`x', `y', `z') as the center of the homothetic transformation.''' +doc = '''Scale the model entities `dimTag' by factors `a', `b' and `c' along the three coordinate axes; use (`x', `y', `z') as the center of the homothetic transformation.''' occ.add('dilate',doc,None,ivectorpair('dimTags'),idouble('x'),idouble('y'),idouble('z'),idouble('a'),idouble('b'),idouble('c')) -doc = '''Apply a symmetry transformation to the geometrical entities `dimTag', with respect to the plane of equation `a' * x + `b' * y + `c' * z + `d' = 0.''' +doc = '''Apply a symmetry transformation to the model entities `dimTag', with respect to the plane of equation `a' * x + `b' * y + `c' * z + `d' = 0.''' occ.add('symmetrize',doc,None,ivectorpair('dimTags'),idouble('a'),idouble('b'),idouble('c'),idouble('d')) -doc = '''Apply a general affine transformation matrix `a' (16 entries of a 4x4 matrix, by row; only the 12 first can be provided for convenience) to the geometrical entities `dimTag'.''' +doc = '''Apply a general affine transformation matrix `a' (16 entries of a 4x4 matrix, by row; only the 12 first can be provided for convenience) to the model entities `dimTag'.''' occ.add('affineTransform',doc,None,ivectorpair('dimTags'),ivectordouble('a')) doc = '''Copy the entities `dimTags'; the new entities are returned in `outDimTags'.''' @@ -607,18 +637,27 @@ occ.add('removeAllDuplicates',doc,None) doc = '''Import BREP, STEP or IGES shapes from the file `fileName'. The imported entities are returned in `outDimTags'. If the optional argument `highestDimOnly' is set, only import the highest dimensional entities in the file. The optional argument `format' can be used to force the format of the file (currently "brep", "step" or "iges").''' occ.add('importShapes',doc,None,istring('fileName'),ovectorpair('outDimTags'),ibool('highestDimOnly','true','True'),istring('format','""')) -doc = '''Imports an OpenCASCADE `shape' by providing a pointer to a native OpenCASCADE `TopoDS_Shape' object (passed as a pointer to void). The imported entities are returned in `outDimTags'. If the optional argument `highestDimOnly' is set, only import the highest dimensional entities in `shape'. Warning: this function is unsafe, as providing an invalid pointer will lead to undefined behavior.''' -occ.add('importShapesNativePointer',doc,None,ivoidstar('shape'),ovectorpair('outDimTags'),ibool('highestDimOnly','true','True')) +doc = '''Imports an OpenCASCADE `shape' by providing a pointer to a native OpenCASCADE `TopoDS_Shape' object (passed as a pointer to void). The imported entities are returned in `outDimTags'. If the optional argument `highestDimOnly' is set, only import the highest dimensional entities in `shape'. For C and C++ only. Warning: this function is unsafe, as providing an invalid pointer will lead to undefined behavior.''' +occ.add_special('importShapesNativePointer',doc,['onlycc++'],None,ivoidstar('shape'),ovectorpair('outDimTags'),ibool('highestDimOnly','true','True')) -doc = '''Set a mesh size constraint on the geometrical entities `dimTags'. Currently only entities of dimension 0 (points) are handled.''' +doc = '''Set a mesh size constraint on the model entities `dimTags'. Currently only entities of dimension 0 (points) are handled.''' occ.add('setMeshSize',doc,None,ivectorpair('dimTags'),idouble('size')) -doc = '''Synchronize the internal OpenCASCADE CAD representation with the current Gmsh model. This can be called at any time, but since it involves a non trivial amount of processing, the number of synchronization points should normally be minimized.''' +doc = '''Get the mass of the model entity of dimension `dim' and tag `tag'.''' +occ.add('getMass',doc,None,iint('dim'),iint('tag'),odouble('mass')) + +doc = '''Get the center of mass of the model entity of dimension `dim' and tag `tag'.''' +occ.add('getCenterOfMass',doc,None,iint('dim'),iint('tag'),odouble('x'),odouble('y'),odouble('z')) + +doc = '''Get the matrix of inertia (by row) of the model entity of dimension `dim' and tag `tag'.''' +occ.add('getMatrixOfInertia',doc,None,iint('dim'),iint('tag'),ovectordouble('mat')) + +doc = '''Synchronize the OpenCASCADE CAD representation with the current Gmsh model. This can be called at any time, but since it involves a non trivial amount of processing, the number of synchronization points should normally be minimized.''' occ.add('synchronize',doc,None) ################################################################################ -view = gmsh.add_module('view','Post-processing view functions') +view = gmsh.add_module('view','post-processing view functions') doc = '''Add a new post-processing view, with name `name'. If `tag' is positive use it (and remove the view with that tag if it already exists), otherwise associate a new tag. Return the view tag.''' view.add('add',doc,oint,istring('name'),iint('tag','-1')) @@ -636,7 +675,7 @@ doc = '''Add model-based post-processing data to the view with tag `tag'. `model view.add('addModelData',doc,None,iint('tag'),iint('step'),istring('modelName'),istring('dataType'),ivectorsize('tags'),ivectorvectordouble('data'),idouble('time','0.'),iint('numComponents','-1'),iint('partition','0')) doc = '''Get model-based post-processing data from the view with tag `tag' at step `step'. Return the `data' associated to the nodes or the elements with tags `tags', as well as the `dataType' and the number of components `numComponents'.''' -view.add_rawc('getModelData',doc,None,iint('tag'),iint('step'),ostring('dataType'),ovectorsize('tags'),ovectorvectordouble('data'),odouble('time'),oint('numComponents')) +view.add_special('getModelData',doc,['rawc'],None,iint('tag'),iint('step'),ostring('dataType'),ovectorsize('tags'),ovectorvectordouble('data'),odouble('time'),oint('numComponents')) doc = '''Add list-based post-processing data to the view with tag `tag'. `dataType' identifies the data: "SP" for scalar points, "VP", for vector points, etc. `numEle' gives the number of elements in the data. `data' contains the data for the `numEle' elements.''' view.add('addListData',doc,None,iint('tag'),istring('dataType'),iint('numEle'),ivectordouble('data')) @@ -644,6 +683,15 @@ view.add('addListData',doc,None,iint('tag'),istring('dataType'),iint('numEle'),i doc = '''Get list-based post-processing data from the view with tag `tag'. Return the types `dataTypes', the number of elements `numElements' for each data type and the `data' for each data type.''' view.add('getListData',doc,None,iint('tag'),ovectorstring('dataType'),ovectorint('numElements'),ovectorvectordouble('data')) +doc = '''Add a post-processing view as an `alias' of the reference view with tag `refTag'. If `copyOptions' is set, copy the options of the reference view. If `tag' is positive use it (and remove the view with that tag if it already exists), otherwise associate a new tag. Return the view tag.''' +view.add('addAlias',doc,oint,iint('refTag'),ibool('copyOptions','false','False'),iint('tag','-1')) + +doc = '''Copy the options from the view with tag `refTag' to the view with tag `tag'.''' +view.add('copyOptions',doc,None,iint('refTag'),iint('tag')) + +doc = '''Combine elements (if `what' == "elements") or steps (if `what' == "steps") of all views (`how' == "all"), all visible views (`how' == "visible") or all views having the same name (`how' == "name"). Remove original views if `remove' is set.''' +view.add('combine',doc,None,istring('what'),istring('how'),ibool('remove','false','False')) + doc = '''Probe the view `tag' for its `value' at point (`x', `y', `z'). Return only the value at step `step' is `step' is positive. Return only values with `numComp' if `numComp' is positive. Return the gradient of the `value' if `gradient' is set. Probes with a geometrical tolerance (in the reference unit cube) of `tolerance' if `tolerance' is not zero. Return the result from the element described by its coordinates if `xElementCoord', `yElementCoord' and `zElementCoord' are provided.''' view.add('probe',doc,None,iint('tag'),idouble('x'),idouble('y'),idouble('z'),ovectordouble('value'),iint('step','-1'),iint('numComp','-1'),ibool('gradient','false','False'),idouble('tolerance','0.'),ivectordouble('xElemCoord','std::vector<double>()',"[]","[]"),ivectordouble('yElemCoord','std::vector<double>()',"[]","[]"),ivectordouble('zElemCoord','std::vector<double>()',"[]","[]")) @@ -652,7 +700,7 @@ view.add('write',doc,None,iint('tag'),istring('fileName'),ibool('append','false' ################################################################################ -plugin = gmsh.add_module('plugin','Plugin functions') +plugin = gmsh.add_module('plugin','plugin functions') doc = '''Set the numerical option `option' to the value `value' for plugin `name'.''' plugin.add('setNumber',doc,None,istring('name'),istring('option'),idouble('value')) @@ -665,16 +713,16 @@ plugin.add('run',doc,None,istring('name')) ################################################################################ -graphics = gmsh.add_module('graphics','Graphics functions') +graphics = gmsh.add_module('graphics','graphics functions') doc = '''Draw all the OpenGL scenes.''' graphics.add('draw',doc,None) ################################################################################ -fltk = gmsh.add_module('fltk','Fltk graphical user interface functions') +fltk = gmsh.add_module('fltk','FLTK graphical user interface functions') -doc = '''Create the Fltk graphical user interface. Can only be called in the main thread.''' +doc = '''Create the FLTK graphical user interface. Can only be called in the main thread.''' fltk.add('initialize',doc,None) doc = '''Wait at most `time' seconds for user interface events and return. If `time' < 0, wait indefinitely. First automatically create the user interface if it has not yet been initialized. Can only be called in the main thread.''' @@ -734,7 +782,7 @@ onelab.add('run',doc,None,istring('name', '""'),istring('command', '""')) ################################################################################ -logger = gmsh.add_module('logger','Message logger functions') +logger = gmsh.add_module('logger','information logging functions') doc = '''Write a `message'. `level' can be "info", "warning" or "error".''' logger.add('write',doc,None,istring('message'),istring('level','"info"')) diff --git a/api/gmsh.h b/api/gmsh.h index ada02d9f41a6168510e3c3f4b350e54d67a2ba1d..a96985c4d0ff62d8177d5e8eb092f1b48b5b34a7 100644 --- a/api/gmsh.h +++ b/api/gmsh.h @@ -6,7 +6,7 @@ #ifndef GMSH_H #define GMSH_H -// This file defines the Gmsh C++ API (v4.2). +// This file defines the Gmsh C++ API (v4.4). // // Do not edit it directly: it is automatically generated by `api/gen.py'. // @@ -22,9 +22,9 @@ #include <string> #include <utility> -#define GMSH_API_VERSION "4.2" +#define GMSH_API_VERSION "4.4" #define GMSH_API_VERSION_MAJOR 4 -#define GMSH_API_VERSION_MINOR 2 +#define GMSH_API_VERSION_MINOR 4 #if defined(GMSH_DLL) #if defined(GMSH_DLL_EXPORT) @@ -61,11 +61,13 @@ namespace gmsh { // Top-level functions GMSH_API void finalize(); // Open a file. Equivalent to the `File->Open' menu in the Gmsh app. Handling of - // the file depends on its extension and/or its contents. + // the file depends on its extension and/or its contents: opening a file with + // model data will create a new model. GMSH_API void open(const std::string & fileName); // Merge a file. Equivalent to the `File->Merge' menu in the Gmsh app. Handling - // of the file depends on its extension and/or its contents. + // of the file depends on its extension and/or its contents. Merging a file with + // model data will add the data to the current model. GMSH_API void merge(const std::string & fileName); // Write a file. The export format is determined by the file extension. @@ -74,7 +76,7 @@ namespace gmsh { // Top-level functions // Clear all loaded models and post-processing data, and add a new empty model. GMSH_API void clear(); - namespace option { // Global option handling functions + namespace option { // Option handling functions // Set a numerical option to `value'. `name' is of the form "category.option" // or "category[num].option". Available categories and options are listed in @@ -100,9 +102,30 @@ namespace gmsh { // Top-level functions GMSH_API void getString(const std::string & name, std::string & value); + // Set a color option to the RGBA value (`r', `g', `b', `a'), where where `r', + // `g', `b' and `a' should be integers between 0 and 255. `name' is of the form + // "category.option" or "category[num].option". Available categories and + // options are listed in the Gmsh reference manual, with the "Color." middle + // string removed. + GMSH_API void setColor(const std::string & name, + const int r, + const int g, + const int b, + const int a = 0); + + // Get the `r', `g', `b', `a' value of a color option. `name' is of the form + // "category.option" or "category[num].option". Available categories and + // options are listed in the Gmsh reference manual, with the "Color." middle + // string removed. + GMSH_API void getColor(const std::string & name, + int & r, + int & g, + int & b, + int & a); + } // namespace option - namespace model { // Per-model functions + namespace model { // Model functions // Add a new model, with name `name', and set it as the current model. GMSH_API void add(const std::string & name); @@ -117,10 +140,9 @@ namespace gmsh { // Top-level functions // the same name, select the one that was added first. GMSH_API void setCurrent(const std::string & name); - // Get all the (elementary) geometrical entities in the current model. If `dim' - // is >= 0, return only the entities of the specified dimension (e.g. points if - // `dim' == 0). The entities are returned as a vector of (dim, tag) integer - // pairs. + // Get all the entities in the current model. If `dim' is >= 0, return only the + // entities of the specified dimension (e.g. points if `dim' == 0). The + // entities are returned as a vector of (dim, tag) integer pairs. GMSH_API void getEntities(gmsh::vectorpair & dimTags, const int dim = -1); @@ -140,21 +162,21 @@ namespace gmsh { // Top-level functions GMSH_API void getPhysicalGroups(gmsh::vectorpair & dimTags, const int dim = -1); - // Get the tags of the geometrical entities making up the physical group of - // dimension `dim' and tag `tag'. + // Get the tags of the model entities making up the physical group of dimension + // `dim' and tag `tag'. GMSH_API void getEntitiesForPhysicalGroup(const int dim, const int tag, std::vector<int> & tags); - // Get the tags of the physical groups (if any) to which the geometrical entity - // of dimension `dim' and tag `tag' belongs. + // Get the tags of the physical groups (if any) to which the model entity of + // dimension `dim' and tag `tag' belongs. GMSH_API void getPhysicalGroupsForEntity(const int dim, const int tag, std::vector<int> & physicalTags); - // Add a physical group of dimension `dim', grouping the elementary entities - // with tags `tags'. Return the tag of the physical group, equal to `tag' if - // `tag' is positive, or a new tag if `tag' < 0. + // Add a physical group of dimension `dim', grouping the model entities with + // tags `tags'. Return the tag of the physical group, equal to `tag' if `tag' + // is positive, or a new tag if `tag' < 0. GMSH_API int addPhysicalGroup(const int dim, const std::vector<int> & tags, const int tag = -1); @@ -169,22 +191,22 @@ namespace gmsh { // Top-level functions const int tag, std::string & name); - // Get the boundary of the geometrical entities `dimTags'. Return in - // `outDimTags' the boundary of the individual entities (if `combined' is - // false) or the boundary of the combined geometrical shape formed by all input - // entities (if `combined' is true). Return tags multiplied by the sign of the - // boundary entity if `oriented' is true. Apply the boundary operator - // recursively down to dimension 0 (i.e. to points) if `recursive' is true. + // Get the boundary of the model entities `dimTags'. Return in `outDimTags' the + // boundary of the individual entities (if `combined' is false) or the boundary + // of the combined geometrical shape formed by all input entities (if + // `combined' is true). Return tags multiplied by the sign of the boundary + // entity if `oriented' is true. Apply the boundary operator recursively down + // to dimension 0 (i.e. to points) if `recursive' is true. GMSH_API void getBoundary(const gmsh::vectorpair & dimTags, gmsh::vectorpair & outDimTags, const bool combined = true, const bool oriented = true, const bool recursive = false); - // Get the (elementary) geometrical entities in the bounding box defined by the - // two points (`xmin', `ymin', `zmin') and (`xmax', `ymax', `zmax'). If `dim' - // is >= 0, return only the entities of the specified dimension (e.g. points if - // `dim' == 0). + // Get the model entities in the bounding box defined by the two points + // (`xmin', `ymin', `zmin') and (`xmax', `ymax', `zmax'). If `dim' is >= 0, + // return only the entities of the specified dimension (e.g. points if `dim' == + // 0). GMSH_API void getEntitiesInBoundingBox(const double xmin, const double ymin, const double zmin, @@ -195,7 +217,8 @@ namespace gmsh { // Top-level functions const int dim = -1); // Get the bounding box (`xmin', `ymin', `zmin'), (`xmax', `ymax', `zmax') of - // the geometrical entity of dimension `dim' and tag `tag'. + // the model entity of dimension `dim' and tag `tag'. If `dim' and `tag' are + // negative, get the bounding box of the whole model. GMSH_API void getBoundingBox(const int dim, const int tag, double & xmin, @@ -208,12 +231,11 @@ namespace gmsh { // Top-level functions // Get the geometrical dimension of the current model. GMSH_API int getDimension(); - // Add a discrete geometrical entity (defined by a mesh) of dimension `dim' in - // the current model. Return the tag of the new discrete entity, equal to `tag' - // if `tag' is positive, or a new tag if `tag' < 0. `boundary' specifies the - // tags of the entities on the boundary of the discrete entity, if any. - // Specyfing `boundary' allows Gmsh to construct the topology of the overall - // model. + // Add a discrete model entity (defined by a mesh) of dimension `dim' in the + // current model. Return the tag of the new discrete entity, equal to `tag' if + // `tag' is positive, or a new tag if `tag' < 0. `boundary' specifies the tags + // of the entities on the boundary of the discrete entity, if any. Specifying + // `boundary' allows Gmsh to construct the topology of the overall model. GMSH_API int addDiscreteEntity(const int dim, const int tag = -1, const std::vector<int> & boundary = std::vector<int>()); @@ -307,21 +329,20 @@ namespace gmsh { // Top-level functions const std::vector<double> & parametricCoord, std::vector<double> & normals); - // Set the visibility of the geometrical entities `dimTags' to `value'. Apply - // the visibility setting recursively if `recursive' is true. + // Set the visibility of the model entities `dimTags' to `value'. Apply the + // visibility setting recursively if `recursive' is true. GMSH_API void setVisibility(const gmsh::vectorpair & dimTags, const int value, const bool recursive = false); - // Get the visibility of the geometrical entity of dimension `dim' and tag - // `tag'. + // Get the visibility of the model entity of dimension `dim' and tag `tag'. GMSH_API void getVisibility(const int dim, const int tag, int & value); - // Set the color of the geometrical entities `dimTags' to the RGBA value (`r', - // `g', `b', `a'), where `r', `g', `b' and `a' should be integers between 0 and - // 255. Apply the color setting recursively if `recursive' is true. + // Set the color of the model entities `dimTags' to the RGBA value (`r', `g', + // `b', `a'), where `r', `g', `b' and `a' should be integers between 0 and 255. + // Apply the color setting recursively if `recursive' is true. GMSH_API void setColor(const gmsh::vectorpair & dimTags, const int r, const int g, @@ -329,7 +350,7 @@ namespace gmsh { // Top-level functions const int a = 0, const bool recursive = false); - // Get the color of the geometrical entity of dimension `dim' and tag `tag'. + // Get the color of the model entity of dimension `dim' and tag `tag'. GMSH_API void getColor(const int dim, const int tag, int & r, @@ -337,7 +358,13 @@ namespace gmsh { // Top-level functions int & b, int & a); - namespace mesh { // Per-model meshing functions + // Set the `x', `y', `z' coordinates of a geometrical point. + GMSH_API void setCoordinates(const int tag, + const double x, + const double y, + const double z); + + namespace mesh { // Mesh functions // Generate a mesh of the current model, up to dimension `dim' (0, 1, 2 or // 3). @@ -349,9 +376,21 @@ namespace gmsh { // Top-level functions // Unpartition the mesh of the current model. GMSH_API void unpartition(); + // Optimize the mesh of the current model using `method' (empty for default + // tetrahedral mesh optimizer, "Netgen" for Netgen optimizer, "HighOrder" for + // direct high-order mesh optimizer, "HighOrderElastic" for high-order + // elastic smoother). + GMSH_API void optimize(const std::string & method); + + // Recombine the mesh of the current model. + GMSH_API void recombine(); + // Refine the mesh of the current model by uniformly splitting the elements. GMSH_API void refine(); + // Smooth the mesh of the current model. + GMSH_API void smooth(); + // Set the order of the elements in the mesh of the current model to `order'. GMSH_API void setOrder(const int order); @@ -369,25 +408,26 @@ namespace gmsh { // Top-level functions // the node tags (their unique, strictly positive identification numbers). // `coord' is a vector of length 3 times the length of `nodeTags' that // contains the x, y, z coordinates of the nodes, concatenated: [n1x, n1y, - // n1z, n2x, ...]. If `dim' >= 0, `parametricCoord' contains the parametric - // coordinates ([u1, u2, ...] or [u1, v1, u2, ...]) of the nodes, if - // available. The length of `parametricCoord' can be 0 or `dim' times the - // length of `nodeTags'. If `includeBoundary' is set, also return the nodes - // classified on the boundary of the entity (wich will be reparametrized on - // the entity if `dim' >= 0 in order to compute their parametric - // coordinates). + // n1z, n2x, ...]. If `dim' >= 0 and `returnParamtricCoord' is set, + // `parametricCoord' contains the parametric coordinates ([u1, u2, ...] or + // [u1, v1, u2, ...]) of the nodes, if available. The length of + // `parametricCoord' can be 0 or `dim' times the length of `nodeTags'. If + // `includeBoundary' is set, also return the nodes classified on the boundary + // of the entity (which will be reparametrized on the entity if `dim' >= 0 in + // order to compute their parametric coordinates). GMSH_API void getNodes(std::vector<std::size_t> & nodeTags, std::vector<double> & coord, std::vector<double> & parametricCoord, const int dim = -1, const int tag = -1, - const bool includeBoundary = false); + const bool includeBoundary = false, + const bool returnParametricCoord = true); // Get the coordinates and the parametric coordinates (if any) of the node // with tag `tag'. This is a sometimes useful but inefficient way of // accessing nodes, as it relies on a cache stored in the model. For large // meshes all the nodes in the model should be numbered in a continuous - // sequence of tags from 1 to N to maintain reasonnable performance (in this + // sequence of tags from 1 to N to maintain reasonable performance (in this // case the internal cache is based on a vector; otherwise it uses a map). GMSH_API void getNode(const std::size_t nodeTag, std::vector<double> & coord, @@ -405,22 +445,22 @@ namespace gmsh { // Top-level functions std::vector<std::size_t> & nodeTags, std::vector<double> & coord); - // Set the nodes classified on the geometrical entity of dimension `dim' and - // tag `tag'. `nodeTags' contains the node tags (their unique, strictly - // positive identification numbers). `coord' is a vector of length 3 times - // the length of `nodeTags' that contains the x, y, z coordinates of the - // nodes, concatenated: [n1x, n1y, n1z, n2x, ...]. The optional - // `parametricCoord' vector contains the parametric coordinates of the nodes, - // if any. The length of `parametricCoord' can be 0 or `dim' times the length - // of `nodeTags'. If the `nodeTags' vector is empty, new tags are - // automatically assigned to the nodes. + // Set the nodes classified on the model entity of dimension `dim' and tag + // `tag'. `nodeTags' contains the node tags (their unique, strictly positive + // identification numbers). `coord' is a vector of length 3 times the length + // of `nodeTags' that contains the x, y, z coordinates of the nodes, + // concatenated: [n1x, n1y, n1z, n2x, ...]. The optional `parametricCoord' + // vector contains the parametric coordinates of the nodes, if any. The + // length of `parametricCoord' can be 0 or `dim' times the length of + // `nodeTags'. If the `nodeTags' vector is empty, new tags are automatically + // assigned to the nodes. GMSH_API void setNodes(const int dim, const int tag, const std::vector<std::size_t> & nodeTags, const std::vector<double> & coord, const std::vector<double> & parametricCoord = std::vector<double>()); - // Reclassify all nodes on their associated geometrical entity, based on the + // Reclassify all nodes on their associated model entity, based on the // elements. Can be used when importing nodes in bulk (e.g. by associating // them all to a single volume), to reclassify them correctly on model // surfaces, curves, etc. after the elements have been set. @@ -456,21 +496,30 @@ namespace gmsh { // Top-level functions // sometimes useful but inefficient way of accessing elements, as it relies // on a cache stored in the model. For large meshes all the elements in the // model should be numbered in a continuous sequence of tags from 1 to N to - // maintain reasonnable performance (in this case the internal cache is based + // maintain reasonable performance (in this case the internal cache is based // on a vector; otherwise it uses a map). GMSH_API void getElement(const std::size_t elementTag, int & elementType, std::vector<std::size_t> & nodeTags); - // Get the tag, type and node tags of the element located at coordinates - // (`x', `y', `z'). This is a sometimes useful but inefficient way of - // accessing elements, as it relies on a search in a spatial octree. + // Search the mesh for an element located at coordinates (`x', `y', `z'). + // This is a sometimes useful but inefficient way of accessing elements, as + // it relies on a search in a spatial octree. If an element is found, return + // its tag, type and node tags, as well as the local coordinates (`u', `v', + // `w') within the element corresponding to search location. If `dim' is >= + // 0, only search for elements of the given dimension. If `strict' is not + // set, use a tolerance to find elements near the search location. GMSH_API void getElementByCoordinates(const double x, const double y, const double z, std::size_t & elementTag, int & elementType, - std::vector<std::size_t> & nodeTags); + std::vector<std::size_t> & nodeTags, + double & u, + double & v, + double & w, + const int dim = -1, + const bool strict = false); // Get the types of elements in the entity of dimension `dim' and tag `tag'. // If `tag' < 0, get the types for all entities of dimension `dim'. If `dim' @@ -498,7 +547,7 @@ namespace gmsh { // Top-level functions int & numNodes, std::vector<double> & parametricCoord); - // Get the elements of type `elementType' classified on the entity of of tag + // Get the elements of type `elementType' classified on the entity of tag // `tag'. If `tag' < 0, get the elements for all entities. `elementTags' is a // vector containing the tags (unique, strictly positive identifiers) of the // elements of the corresponding type. `nodeTags' is a vector of length equal @@ -514,8 +563,8 @@ namespace gmsh { // Top-level functions const std::size_t task = 0, const std::size_t numTasks = 1); - // Preallocate the data for `getElementsByType'. This is necessary only if - // `getElementsByType' is called with `numTasks' > 1. + // Preallocate data before calling `getElementsByType' with `numTasks' > 1. + // For C and C++ only. GMSH_API void preallocateElementsByType(const int elementType, const bool elementTag, const bool nodeTag, @@ -551,22 +600,33 @@ namespace gmsh { // Top-level functions const std::vector<std::size_t> & elementTags, const std::vector<std::size_t> & nodeTags); + // Get the numerical quadrature information for the given element type + // `elementType' and integration rule `integrationType' (e.g. "Gauss4" for a + // Gauss quadrature suited for integrating 4th order polynomials). + // `integrationPoints' contains the u, v, w coordinates of the G integration + // points in the reference element: [g1u, g1v, g1w, ..., gGu, gGv, gGw]. + // `integrationWeigths' contains the associated weights: [g1q, ..., gGq]. + GMSH_API void getIntegrationPoints(const int elementType, + const std::string & integrationType, + std::vector<double> & integrationPoints, + std::vector<double> & integrationWeights); + // Get the Jacobians of all the elements of type `elementType' classified on - // the entity of dimension `dim' and tag `tag', at the G integration points - // required by the `integrationType' integration rule (e.g. "Gauss4" for a - // Gauss quadrature suited for integrating 4th order polynomials). Data is - // returned by element, with elements in the same order as in `getElements' - // and `getElementsByType'. `jacobians' contains for each element the 9 - // entries of the 3x3 Jacobian matrix at each integration point, by row: - // [e1g1Jxu, e1g1Jxv, e1g1Jxw, e1g1Jyu, ..., e1g1Jzw, e1g2Jxu, ..., e1gGJzw, - // e2g1Jxu, ...], with Jxu=dx/du, Jxv=dx/dv, etc. `determinants' contains for - // each element the determinant of the Jacobian matrix at each integration - // point: [e1g1, e1g2, ... e1gG, e2g1, ...]. `points' contains for each - // element the x, y, z coordinates of the integration points. If `tag' < 0, - // get the Jacobian data for all entities. If `numTasks' > 1, only compute - // and return the part of the data indexed by `task'. + // the entity of tag `tag', at the G integration points `integrationPoints' + // given as concatenated triplets of coordinates in the reference element + // [g1u, g1v, g1w, ..., gGu, gGv, gGw]. Data is returned by element, with + // elements in the same order as in `getElements' and `getElementsByType'. + // `jacobians' contains for each element the 9 entries of the 3x3 Jacobian + // matrix at each integration point, by row: [e1g1Jxu, e1g1Jxv, e1g1Jxw, + // e1g1Jyu, ..., e1g1Jzw, e1g2Jxu, ..., e1gGJzw, e2g1Jxu, ...], with + // Jxu=dx/du, Jxv=dx/dv, etc. `determinants' contains for each element the + // determinant of the Jacobian matrix at each integration point: [e1g1, e1g2, + // ... e1gG, e2g1, ...]. `points' contains for each element the x, y, z + // coordinates of the integration points. If `tag' < 0, get the Jacobian data + // for all entities. If `numTasks' > 1, only compute and return the part of + // the data indexed by `task'. GMSH_API void getJacobians(const int elementType, - const std::string & integrationType, + const std::vector<double> & integrationPoints, std::vector<double> & jacobians, std::vector<double> & determinants, std::vector<double> & points, @@ -574,10 +634,10 @@ namespace gmsh { // Top-level functions const std::size_t task = 0, const std::size_t numTasks = 1); - // Preallocate the data required by `getJacobians'. This is necessary only if - // `getJacobians' is called with `numTasks' > 1. + // Preallocate data before calling `getJacobians' with `numTasks' > 1. For C + // and C++ only. GMSH_API void preallocateJacobians(const int elementType, - const std::string & integrationType, + const int numIntegrationPoints, const bool jacobian, const bool determinant, const bool point, @@ -586,24 +646,63 @@ namespace gmsh { // Top-level functions std::vector<double> & points, const int tag = -1); - // Get the basis functions of the element of type `elementType' for the given - // `integrationType' integration rule (e.g. "Gauss4" for a Gauss quadrature - // suited for integrating 4th order polynomials) and `functionSpaceType' - // function space (e.g. "Lagrange" or "GradLagrange" for Lagrange basis - // functions or their gradient, in the u, v, w coordinates of the reference - // element). `integrationPoints' contains the u, v, w coordinates of the - // integration points in the reference element as well as the associated - // weight q, concatenated: [g1u, g1v, g1w, g1q, g2u, ...]. `numComponents' - // returns the number C of components of a basis function. `basisFunctions' - // contains the evaluation of the basis functions at the integration points: - // [g1f1, ..., g1fC, g2f1, ...]. + // Get the basis functions of the element of type `elementType' at the + // integration points `integrationPoints' (given as concatenated triplets of + // coordinates in the reference element [g1u, g1v, g1w, ..., gGu, gGv, gGw]), + // for the function space `functionSpaceType' (e.g. "Lagrange" or + // "GradLagrange" for Lagrange basis functions or their gradient, in the u, + // v, w coordinates of the reference element). `numComponents' returns the + // number C of components of a basis function. `basisFunctions' returns the + // value of the N basis functions at the integration points, i.e. [g1f1, + // g1f2, ..., g1fN, g2f1, ...] when C == 1 or [g1f1u, g1f1v, g1f1w, g1f2u, + // ..., g1fNw, g2f1u, ...] when C == 3. GMSH_API void getBasisFunctions(const int elementType, - const std::string & integrationType, + const std::vector<double> & integrationPoints, const std::string & functionSpaceType, - std::vector<double> & integrationPoints, int & numComponents, std::vector<double> & basisFunctions); + // Get the element-dependent basis functions of the elements of type + // `elementType' in the entity of tag `tag'at the integration points + // `integrationPoints' (given as concatenated triplets of coordinates in the + // reference element [g1u, g1v, g1w, ..., gGu, gGv, gGw]), for the function + // space `functionSpaceType' (e.g. "H1Legendre3" or "GradH1Legendre3" for 3rd + // order hierarchical H1 Legendre functions or their gradient, in the u, v, w + // coordinates of the reference elements). `numComponents' returns the number + // C of components of a basis function. `numBasisFunctions' returns the + // number N of basis functions per element. `basisFunctions' returns the + // value of the basis functions at the integration points for each element: + // [e1g1f1,..., e1g1fN, e1g2f1,..., e2g1f1, ...] when C == 1 or [e1g1f1u, + // e1g1f1v,..., e1g1fNw, e1g2f1u,..., e2g1f1u, ...]. Warning: this is an + // experimental feature and will probably change in a future release. + GMSH_API void getBasisFunctionsForElements(const int elementType, + const std::vector<double> & integrationPoints, + const std::string & functionSpaceType, + int & numComponents, + int & numFunctionsPerElements, + std::vector<double> & basisFunctions, + const int tag = -1); + + // Generate the `keys' for the elements of type `elementType' in the entity + // of tag `tag', for the `functionSpaceType' function space. Each key + // uniquely identifies a basis function in the function space. If + // `returnCoord' is set, the `coord' vector contains the x, y, z coordinates + // locating basis functions for sorting purposes. Warning: this is an + // experimental feature and will probably change in a future release. + GMSH_API void getKeysForElements(const int elementType, + const std::string & functionSpaceType, + gmsh::vectorpair & keys, + std::vector<double> & coord, + const int tag = -1, + const bool returnCoord = true); + + // Get information about the `keys'. Warning: this is an experimental feature + // and will probably change in a future release. + GMSH_API void getInformationForElements(const gmsh::vectorpair & keys, + gmsh::vectorpair & info, + const int order, + const int elementType); + // Precomputes the basis functions corresponding to `elementType'. GMSH_API void precomputeBasisFunctions(const int elementType); @@ -622,17 +721,20 @@ namespace gmsh { // Top-level functions const std::size_t task = 0, const std::size_t numTasks = 1); - // Preallocate the data required by `getBarycenters'. This is necessary only - // if `getBarycenters' is called with `numTasks' > 1. + // Preallocate data before calling `getBarycenters' with `numTasks' > 1. For + // C and C++ only. GMSH_API void preallocateBarycenters(const int elementType, std::vector<double> & barycenters, const int tag = -1); // Get the nodes on the edges of all elements of type `elementType' - // classified on the entity of tag `tag'. `nodeTags' contains the node tags. - // If `primary' is set, only the primary (begin/end) nodes of the edges are - // returned. If `tag' < 0, get the edge nodes for all entities. If `numTasks' - // > 1, only compute and return the part of the data indexed by `task'. + // classified on the entity of tag `tag'. `nodeTags' contains the node tags + // of the edges for all the elements: [e1a1n1, e1a1n2, e1a2n1, ...]. Data is + // returned by element, with elements in the same order as in `getElements' + // and `getElementsByType'. If `primary' is set, only the primary (begin/end) + // nodes of the edges are returned. If `tag' < 0, get the edge nodes for all + // entities. If `numTasks' > 1, only compute and return the part of the data + // indexed by `task'. GMSH_API void getElementEdgeNodes(const int elementType, std::vector<std::size_t> & nodeTags, const int tag = -1, @@ -642,10 +744,13 @@ namespace gmsh { // Top-level functions // Get the nodes on the faces of type `faceType' (3 for triangular faces, 4 // for quadrangular faces) of all elements of type `elementType' classified - // on the entity of tag `tag'. `nodeTags' contains the node tags. If - // `primary' is set, only the primary (corner) nodes of the faces are - // returned. If `tag' < 0, get the face nodes for all entities. If `numTasks' - // > 1, only compute and return the part of the data indexed by `task'. + // on the entity of tag `tag'. `nodeTags' contains the node tags of the faces + // for all elements: [e1f1n1, ..., e1f1nFaceType, e1f2n1, ...]. Data is + // returned by element, with elements in the same order as in `getElements' + // and `getElementsByType'. If `primary' is set, only the primary (corner) + // nodes of the faces are returned. If `tag' < 0, get the face nodes for all + // entities. If `numTasks' > 1, only compute and return the part of the data + // indexed by `task'. GMSH_API void getElementFaceNodes(const int elementType, const int faceType, std::vector<std::size_t> & nodeTags, @@ -661,8 +766,8 @@ namespace gmsh { // Top-level functions std::vector<std::size_t> & elementTags, std::vector<int> & partitions); - // Set a mesh size constraint on the geometrical entities `dimTags'. - // Currently only entities of dimension 0 (points) are handled. + // Set a mesh size constraint on the model entities `dimTags'. Currently only + // entities of dimension 0 (points) are handled. GMSH_API void setSize(const gmsh::vectorpair & dimTags, const double size); @@ -692,23 +797,23 @@ namespace gmsh { // Top-level functions GMSH_API void setTransfiniteVolume(const int tag, const std::vector<int> & cornerTags = std::vector<int>()); - // Set a recombination meshing constraint on the geometrical entity of - // dimension `dim' and tag `tag'. Currently only entities of dimension 2 (to - // recombine triangles into quadrangles) are supported. + // Set a recombination meshing constraint on the model entity of dimension + // `dim' and tag `tag'. Currently only entities of dimension 2 (to recombine + // triangles into quadrangles) are supported. GMSH_API void setRecombine(const int dim, const int tag); - // Set a smoothing meshing constraint on the geometrical entity of dimension - // `dim' and tag `tag'. `val' iterations of a Laplace smoother are applied. + // Set a smoothing meshing constraint on the model entity of dimension `dim' + // and tag `tag'. `val' iterations of a Laplace smoother are applied. GMSH_API void setSmoothing(const int dim, const int tag, const int val); - // Set a reverse meshing constraint on the geometrical entity of dimension - // `dim' and tag `tag'. If `val' is true, the mesh orientation will be - // reversed with respect to the natural mesh orientation (i.e. the - // orientation consistent with the orientation of the geometrical entity). If - // `val' is false, the mesh is left as-is. + // Set a reverse meshing constraint on the model entity of dimension `dim' + // and tag `tag'. If `val' is true, the mesh orientation will be reversed + // with respect to the natural mesh orientation (i.e. the orientation + // consistent with the orientation of the geometry). If `val' is false, the + // mesh is left as-is. GMSH_API void setReverse(const int dim, const int tag, const bool val = true); @@ -719,17 +824,16 @@ namespace gmsh { // Top-level functions // STL triangulation. GMSH_API void setOutwardOrientation(const int tag); - // Embed the geometrical entities of dimension `dim' and tags `tags' in the - // (inDim, inTag) geometrical entity. `inDim' must be strictly greater than - // `dim'. + // Embed the model entities of dimension `dim' and tags `tags' in the (inDim, + // inTag) model entity. `inDim' must be strictly greater than `dim'. GMSH_API void embed(const int dim, const std::vector<int> & tags, const int inDim, const int inTag); - // Remove embedded entities in the geometrical entities `dimTags'. if `dim' - // is >= 0, only remove embedded entities of the given dimension (e.g. - // embedded points if `dim' == 0). + // Remove embedded entities in the model entities `dimTags'. if `dim' is >= + // 0, only remove embedded entities of the given dimension (e.g. embedded + // points if `dim' == 0). GMSH_API void removeEmbedded(const gmsh::vectorpair & dimTags, const int dim = -1); @@ -814,11 +918,11 @@ namespace gmsh { // Top-level functions const std::vector<int> & subdomainTags = std::vector<int>(), const std::vector<int> & dims = std::vector<int>()); - namespace field { // Per-model mesh size field functions + namespace field { // Mesh size field functions // Add a new mesh size field of type `fieldType'. If `tag' is positive, - // assign the tag explcitly; otherwise a new tag is assigned automatically. - // Return the field tag. + // assign the tag explicitly; otherwise a new tag is assigned + // automatically. Return the field tag. GMSH_API int add(const std::string & fieldType, const int tag = -1); @@ -850,15 +954,14 @@ namespace gmsh { // Top-level functions } // namespace mesh - namespace geo { // Internal per-model GEO CAD kernel functions + namespace geo { // Built-in CAD kernel functions - // Add a geometrical point in the internal GEO CAD representation, at - // coordinates (`x', `y', `z'). If `meshSize' is > 0, add a meshing - // constraint at that point. If `tag' is positive, set the tag explicitly; - // otherwise a new tag is selected automatically. Return the tag of the - // point. (Note that the point will be added in the current model only after - // `synchronize' is called. This behavior holds for all the entities added in - // the geo module.) + // Add a geometrical point in the built-in CAD representation, at coordinates + // (`x', `y', `z'). If `meshSize' is > 0, add a meshing constraint at that + // point. If `tag' is positive, set the tag explicitly; otherwise a new tag + // is selected automatically. Return the tag of the point. (Note that the + // point will be added in the current model only after `synchronize' is + // called. This behavior holds for all the entities added in the geo module.) GMSH_API int addPoint(const double x, const double y, const double z, @@ -872,10 +975,10 @@ namespace gmsh { // Top-level functions const int endTag, const int tag = -1); - // Add a circle arc (stricly smaller than Pi) between the two points with + // Add a circle arc (strictly smaller than Pi) between the two points with // tags `startTag' and `endTag', with center `centertag'. If `tag' is // positive, set the tag explicitly; otherwise a new tag is selected - // automatically. If (`nx', `ny', `nz') != (0,0,0), explicitely set the plane + // automatically. If (`nx', `ny', `nz') != (0,0,0), explicitly set the plane // of the circle arc. Return the tag of the circle arc. GMSH_API int addCircleArc(const int startTag, const int centerTag, @@ -885,11 +988,11 @@ namespace gmsh { // Top-level functions const double ny = 0., const double nz = 0.); - // Add an ellipse arc (stricly smaller than Pi) between the two points + // Add an ellipse arc (strictly smaller than Pi) between the two points // `startTag' and `endTag', with center `centertag' and major axis point // `majorTag'. If `tag' is positive, set the tag explicitly; otherwise a new // tag is selected automatically. If (`nx', `ny', `nz') != (0,0,0), - // explicitely set the plane of the circle arc. Return the tag of the ellipse + // explicitly set the plane of the circle arc. Return the tag of the ellipse // arc. GMSH_API int addEllipseArc(const int startTag, const int centerTag, @@ -921,11 +1024,11 @@ namespace gmsh { // Top-level functions const int tag = -1); // Add a curve loop (a closed wire) formed by the curves `curveTags'. - // `curveTags' should contain (signed) tags of geometrical enties of - // dimension 1 forming a closed loop: a negative tag signifies that the - // underlying curve is considered with reversed orientation. If `tag' is - // positive, set the tag explicitly; otherwise a new tag is selected - // automatically. Return the tag of the curve loop. + // `curveTags' should contain (signed) tags of model enties of dimension 1 + // forming a closed loop: a negative tag signifies that the underlying curve + // is considered with reversed orientation. If `tag' is positive, set the tag + // explicitly; otherwise a new tag is selected automatically. Return the tag + // of the curve loop. GMSH_API int addCurveLoop(const std::vector<int> & curveTags, const int tag = -1); @@ -957,11 +1060,12 @@ namespace gmsh { // Top-level functions GMSH_API int addVolume(const std::vector<int> & shellTags, const int tag = -1); - // Extrude the geometrical entities `dimTags' by translation along (`dx', - // `dy', `dz'). Return extruded entities in `outDimTags'. If `numElements' is - // not empty, also extrude the mesh: the entries in `numElements' give the - // number of elements in each layer. If `height' is not empty, it provides - // the (cummulative) height of the different layers, normalized to 1. + // Extrude the model entities `dimTags' by translation along (`dx', `dy', + // `dz'). Return extruded entities in `outDimTags'. If `numElements' is not + // empty, also extrude the mesh: the entries in `numElements' give the number + // of elements in each layer. If `height' is not empty, it provides the + // (cumulative) height of the different layers, normalized to 1. If `dx' == + // `dy' == `dz' == 0, the entities are extruded along their normal. GMSH_API void extrude(const gmsh::vectorpair & dimTags, const double dx, const double dy, @@ -971,12 +1075,12 @@ namespace gmsh { // Top-level functions const std::vector<double> & heights = std::vector<double>(), const bool recombine = false); - // Extrude the geometrical entities `dimTags' by rotation of `angle' radians - // around the axis of revolution defined by the point (`x', `y', `z') and the + // Extrude the model entities `dimTags' by rotation of `angle' radians around + // the axis of revolution defined by the point (`x', `y', `z') and the // direction (`ax', `ay', `az'). Return extruded entities in `outDimTags'. If // `numElements' is not empty, also extrude the mesh: the entries in // `numElements' give the number of elements in each layer. If `height' is - // not empty, it provides the (cummulative) height of the different layers, + // not empty, it provides the (cumulative) height of the different layers, // normalized to 1. GMSH_API void revolve(const gmsh::vectorpair & dimTags, const double x, @@ -991,13 +1095,13 @@ namespace gmsh { // Top-level functions const std::vector<double> & heights = std::vector<double>(), const bool recombine = false); - // Extrude the geometrical entities `dimTags' by a combined translation and + // Extrude the model entities `dimTags' by a combined translation and // rotation of `angle' radians, along (`dx', `dy', `dz') and around the axis // of revolution defined by the point (`x', `y', `z') and the direction // (`ax', `ay', `az'). Return extruded entities in `outDimTags'. If // `numElements' is not empty, also extrude the mesh: the entries in // `numElements' give the number of elements in each layer. If `height' is - // not empty, it provides the (cummulative) height of the different layers, + // not empty, it provides the (cumulative) height of the different layers, // normalized to 1. GMSH_API void twist(const gmsh::vectorpair & dimTags, const double x, @@ -1015,15 +1119,15 @@ namespace gmsh { // Top-level functions const std::vector<double> & heights = std::vector<double>(), const bool recombine = false); - // Translate the geometrical entities `dimTags' along (`dx', `dy', `dz'). + // Translate the model entities `dimTags' along (`dx', `dy', `dz'). GMSH_API void translate(const gmsh::vectorpair & dimTags, const double dx, const double dy, const double dz); - // Rotate the geometrical entities `dimTags' of `angle' radians around the - // axis of revolution defined by the point (`x', `y', `z') and the direction - // (`ax', `ay', `az'). + // Rotate the model entities `dimTags' of `angle' radians around the axis of + // revolution defined by the point (`x', `y', `z') and the direction (`ax', + // `ay', `az'). GMSH_API void rotate(const gmsh::vectorpair & dimTags, const double x, const double y, @@ -1033,9 +1137,9 @@ namespace gmsh { // Top-level functions const double az, const double angle); - // Scale the geometrical entities `dimTag' by factors `a', `b' and `c' along - // the three coordinate axes; use (`x', `y', `z') as the center of the - // homothetic transformation. + // Scale the model entities `dimTag' by factors `a', `b' and `c' along the + // three coordinate axes; use (`x', `y', `z') as the center of the homothetic + // transformation. GMSH_API void dilate(const gmsh::vectorpair & dimTags, const double x, const double y, @@ -1044,7 +1148,7 @@ namespace gmsh { // Top-level functions const double b, const double c); - // Apply a symmetry transformation to the geometrical entities `dimTag', with + // Apply a symmetry transformation to the model entities `dimTag', with // respect to the plane of equation `a' * x + `b' * y + `c' * z + `d' = 0. GMSH_API void symmetrize(const gmsh::vectorpair & dimTags, const double a, @@ -1066,23 +1170,23 @@ namespace gmsh { // Top-level functions // location). GMSH_API void removeAllDuplicates(); - // Synchronize the internal GEO CAD representation with the current Gmsh - // model. This can be called at any time, but since it involves a non trivial - // amount of processing, the number of synchronization points should normally - // be minimized. + // Synchronize the built-in CAD representation with the current Gmsh model. + // This can be called at any time, but since it involves a non trivial amount + // of processing, the number of synchronization points should normally be + // minimized. GMSH_API void synchronize(); - namespace mesh { // GEO-specific meshing constraints + namespace mesh { // Built-in CAD kernel meshing constraints - // Set a mesh size constraint on the geometrical entities `dimTags'. - // Currently only entities of dimension 0 (points) are handled. + // Set a mesh size constraint on the model entities `dimTags'. Currently + // only entities of dimension 0 (points) are handled. GMSH_API void setSize(const gmsh::vectorpair & dimTags, const double size); // Set a transfinite meshing constraint on the curve `tag', with `numNodes' // nodes distributed according to `meshType' and `coef'. Currently // supported types are "Progression" (geometrical progression with power - // `coef') and "Bump" (refinement toward both extreminties of the curve). + // `coef') and "Bump" (refinement toward both extremities of the curve). GMSH_API void setTransfiniteCurve(const int tag, const int nPoints, const std::string & meshType = "Progression", @@ -1105,25 +1209,24 @@ namespace gmsh { // Top-level functions GMSH_API void setTransfiniteVolume(const int tag, const std::vector<int> & cornerTags = std::vector<int>()); - // Set a recombination meshing constraint on the geometrical entity of - // dimension `dim' and tag `tag'. Currently only entities of dimension 2 - // (to recombine triangles into quadrangles) are supported. + // Set a recombination meshing constraint on the model entity of dimension + // `dim' and tag `tag'. Currently only entities of dimension 2 (to + // recombine triangles into quadrangles) are supported. GMSH_API void setRecombine(const int dim, const int tag, const double angle = 45.); - // Set a smoothing meshing constraint on the geometrical entity of - // dimension `dim' and tag `tag'. `val' iterations of a Laplace smoother - // are applied. + // Set a smoothing meshing constraint on the model entity of dimension + // `dim' and tag `tag'. `val' iterations of a Laplace smoother are applied. GMSH_API void setSmoothing(const int dim, const int tag, const int val); - // Set a reverse meshing constraint on the geometrical entity of dimension - // `dim' and tag `tag'. If `val' is true, the mesh orientation will be - // reversed with respect to the natural mesh orientation (i.e. the - // orientation consistent with the orientation of the geometrical entity). - // If `val' is false, the mesh is left as-is. + // Set a reverse meshing constraint on the model entity of dimension `dim' + // and tag `tag'. If `val' is true, the mesh orientation will be reversed + // with respect to the natural mesh orientation (i.e. the orientation + // consistent with the orientation of the geometry). If `val' is false, the + // mesh is left as-is. GMSH_API void setReverse(const int dim, const int tag, const bool val = true); @@ -1132,9 +1235,9 @@ namespace gmsh { // Top-level functions } // namespace geo - namespace occ { // Internal per-model OpenCASCADE CAD kernel functions + namespace occ { // OpenCASCADE CAD kernel functions - // Add a geometrical point in the internal OpenCASCADE CAD representation, at + // Add a geometrical point in the OpenCASCADE CAD representation, at // coordinates (`x', `y', `z'). If `meshSize' is > 0, add a meshing // constraint at that point. If `tag' is positive, set the tag explicitly; // otherwise a new tag is selected automatically. Return the tag of the @@ -1399,11 +1502,11 @@ namespace gmsh { // Top-level functions gmsh::vectorpair & outDimTags, const int tag = -1); - // Extrude the geometrical entities `dimTags' by translation along (`dx', - // `dy', `dz'). Return extruded entities in `outDimTags'. If `numElements' is - // not empty, also extrude the mesh: the entries in `numElements' give the - // number of elements in each layer. If `height' is not empty, it provides - // the (cummulative) height of the different layers, normalized to 1. + // Extrude the model entities `dimTags' by translation along (`dx', `dy', + // `dz'). Return extruded entities in `outDimTags'. If `numElements' is not + // empty, also extrude the mesh: the entries in `numElements' give the number + // of elements in each layer. If `height' is not empty, it provides the + // (cumulative) height of the different layers, normalized to 1. GMSH_API void extrude(const gmsh::vectorpair & dimTags, const double dx, const double dy, @@ -1413,12 +1516,12 @@ namespace gmsh { // Top-level functions const std::vector<double> & heights = std::vector<double>(), const bool recombine = false); - // Extrude the geometrical entities `dimTags' by rotation of `angle' radians - // around the axis of revolution defined by the point (`x', `y', `z') and the + // Extrude the model entities `dimTags' by rotation of `angle' radians around + // the axis of revolution defined by the point (`x', `y', `z') and the // direction (`ax', `ay', `az'). Return extruded entities in `outDimTags'. If // `numElements' is not empty, also extrude the mesh: the entries in // `numElements' give the number of elements in each layer. If `height' is - // not empty, it provides the (cummulative) height of the different layers, + // not empty, it provides the (cumulative) height of the different layers, // normalized to 1. GMSH_API void revolve(const gmsh::vectorpair & dimTags, const double x, @@ -1468,7 +1571,7 @@ namespace gmsh { // Top-level functions // Compute the boolean union (the fusion) of the entities `objectDimTags' and // `toolDimTags'. Return the resulting entities in `outDimTags'. If `tag' is - // positive, try to set the tag explicitly (ony valid if the boolean + // positive, try to set the tag explicitly (only valid if the boolean // operation results in a single entity). Remove the object if `removeObject' // is set. Remove the tool if `removeTool' is set. GMSH_API void fuse(const gmsh::vectorpair & objectDimTags, @@ -1481,7 +1584,7 @@ namespace gmsh { // Top-level functions // Compute the boolean intersection (the common parts) of the entities // `objectDimTags' and `toolDimTags'. Return the resulting entities in - // `outDimTags'. If `tag' is positive, try to set the tag explicitly (ony + // `outDimTags'. If `tag' is positive, try to set the tag explicitly (only // valid if the boolean operation results in a single entity). Remove the // object if `removeObject' is set. Remove the tool if `removeTool' is set. GMSH_API void intersect(const gmsh::vectorpair & objectDimTags, @@ -1494,7 +1597,7 @@ namespace gmsh { // Top-level functions // Compute the boolean difference between the entities `objectDimTags' and // `toolDimTags'. Return the resulting entities in `outDimTags'. If `tag' is - // positive, try to set the tag explicitly (ony valid if the boolean + // positive, try to set the tag explicitly (only valid if the boolean // operation results in a single entity). Remove the object if `removeObject' // is set. Remove the tool if `removeTool' is set. GMSH_API void cut(const gmsh::vectorpair & objectDimTags, @@ -1507,7 +1610,7 @@ namespace gmsh { // Top-level functions // Compute the boolean fragments (general fuse) of the entities // `objectDimTags' and `toolDimTags'. Return the resulting entities in - // `outDimTags'. If `tag' is positive, try to set the tag explicitly (ony + // `outDimTags'. If `tag' is positive, try to set the tag explicitly (only // valid if the boolean operation results in a single entity). Remove the // object if `removeObject' is set. Remove the tool if `removeTool' is set. GMSH_API void fragment(const gmsh::vectorpair & objectDimTags, @@ -1518,15 +1621,15 @@ namespace gmsh { // Top-level functions const bool removeObject = true, const bool removeTool = true); - // Translate the geometrical entities `dimTags' along (`dx', `dy', `dz'). + // Translate the model entities `dimTags' along (`dx', `dy', `dz'). GMSH_API void translate(const gmsh::vectorpair & dimTags, const double dx, const double dy, const double dz); - // Rotate the geometrical entities `dimTags' of `angle' radians around the - // axis of revolution defined by the point (`x', `y', `z') and the direction - // (`ax', `ay', `az'). + // Rotate the model entities `dimTags' of `angle' radians around the axis of + // revolution defined by the point (`x', `y', `z') and the direction (`ax', + // `ay', `az'). GMSH_API void rotate(const gmsh::vectorpair & dimTags, const double x, const double y, @@ -1536,9 +1639,9 @@ namespace gmsh { // Top-level functions const double az, const double angle); - // Scale the geometrical entities `dimTag' by factors `a', `b' and `c' along - // the three coordinate axes; use (`x', `y', `z') as the center of the - // homothetic transformation. + // Scale the model entities `dimTag' by factors `a', `b' and `c' along the + // three coordinate axes; use (`x', `y', `z') as the center of the homothetic + // transformation. GMSH_API void dilate(const gmsh::vectorpair & dimTags, const double x, const double y, @@ -1547,7 +1650,7 @@ namespace gmsh { // Top-level functions const double b, const double c); - // Apply a symmetry transformation to the geometrical entities `dimTag', with + // Apply a symmetry transformation to the model entities `dimTag', with // respect to the plane of equation `a' * x + `b' * y + `c' * z + `d' = 0. GMSH_API void symmetrize(const gmsh::vectorpair & dimTags, const double a, @@ -1557,7 +1660,7 @@ namespace gmsh { // Top-level functions // Apply a general affine transformation matrix `a' (16 entries of a 4x4 // matrix, by row; only the 12 first can be provided for convenience) to the - // geometrical entities `dimTag'. + // model entities `dimTag'. GMSH_API void affineTransform(const gmsh::vectorpair & dimTags, const std::vector<double> & a); @@ -1590,21 +1693,40 @@ namespace gmsh { // Top-level functions // OpenCASCADE `TopoDS_Shape' object (passed as a pointer to void). The // imported entities are returned in `outDimTags'. If the optional argument // `highestDimOnly' is set, only import the highest dimensional entities in - // `shape'. Warning: this function is unsafe, as providing an invalid pointer - // will lead to undefined behavior. + // `shape'. For C and C++ only. Warning: this function is unsafe, as + // providing an invalid pointer will lead to undefined behavior. GMSH_API void importShapesNativePointer(const void * shape, gmsh::vectorpair & outDimTags, const bool highestDimOnly = true); - // Set a mesh size constraint on the geometrical entities `dimTags'. - // Currently only entities of dimension 0 (points) are handled. + // Set a mesh size constraint on the model entities `dimTags'. Currently only + // entities of dimension 0 (points) are handled. GMSH_API void setMeshSize(const gmsh::vectorpair & dimTags, const double size); - // Synchronize the internal OpenCASCADE CAD representation with the current - // Gmsh model. This can be called at any time, but since it involves a non - // trivial amount of processing, the number of synchronization points should - // normally be minimized. + // Get the mass of the model entity of dimension `dim' and tag `tag'. + GMSH_API void getMass(const int dim, + const int tag, + double & mass); + + // Get the center of mass of the model entity of dimension `dim' and tag + // `tag'. + GMSH_API void getCenterOfMass(const int dim, + const int tag, + double & x, + double & y, + double & z); + + // Get the matrix of inertia (by row) of the model entity of dimension `dim' + // and tag `tag'. + GMSH_API void getMatrixOfInertia(const int dim, + const int tag, + std::vector<double> & mat); + + // Synchronize the OpenCASCADE CAD representation with the current Gmsh + // model. This can be called at any time, but since it involves a non trivial + // amount of processing, the number of synchronization points should normally + // be minimized. GMSH_API void synchronize(); } // namespace occ @@ -1681,6 +1803,26 @@ namespace gmsh { // Top-level functions std::vector<int> & numElements, std::vector<std::vector<double> > & data); + // Add a post-processing view as an `alias' of the reference view with tag + // `refTag'. If `copyOptions' is set, copy the options of the reference view. + // If `tag' is positive use it (and remove the view with that tag if it already + // exists), otherwise associate a new tag. Return the view tag. + GMSH_API int addAlias(const int refTag, + const bool copyOptions = false, + const int tag = -1); + + // Copy the options from the view with tag `refTag' to the view with tag `tag'. + GMSH_API void copyOptions(const int refTag, + const int tag); + + // Combine elements (if `what' == "elements") or steps (if `what' == "steps") + // of all views (`how' == "all"), all visible views (`how' == "visible") or all + // views having the same name (`how' == "name"). Remove original views if + // `remove' is set. + GMSH_API void combine(const std::string & what, + const std::string & how, + const bool remove = false); + // Probe the view `tag' for its `value' at point (`x', `y', `z'). Return only // the value at step `step' is `step' is positive. Return only values with // `numComp' if `numComp' is positive. Return the gradient of the `value' if @@ -1733,9 +1875,9 @@ namespace gmsh { // Top-level functions } // namespace graphics - namespace fltk { // Fltk graphical user interface functions + namespace fltk { // FLTK graphical user interface functions - // Create the Fltk graphical user interface. Can only be called in the main + // Create the FLTK graphical user interface. Can only be called in the main // thread. GMSH_API void initialize(); @@ -1824,7 +1966,7 @@ namespace gmsh { // Top-level functions } // namespace onelab - namespace logger { // Message logger functions + namespace logger { // Information logging functions // Write a `message'. `level' can be "info", "warning" or "error". GMSH_API void write(const std::string & message, diff --git a/api/gmsh.h_cwrap b/api/gmsh.h_cwrap index dc88ce55dd25c38de88d83e7e0bde6d7b704c8d6..4804b93564404b3572753615f08b3d3fdac4241b 100644 --- a/api/gmsh.h_cwrap +++ b/api/gmsh.h_cwrap @@ -6,7 +6,7 @@ #ifndef GMSH_H #define GMSH_H -// This file redefines the Gmsh C++ API in terms of the C API (v4.2). +// This file redefines the Gmsh C++ API in terms of the C API (v4.4). // // This is provided as a convenience for users of the binary Gmsh SDK whose C++ // compiler ABI is not compatible with the ABI of the C++ compiler used to create @@ -113,7 +113,8 @@ namespace gmsh { // Top-level functions } // Open a file. Equivalent to the `File->Open' menu in the Gmsh app. Handling of - // the file depends on its extension and/or its contents. + // the file depends on its extension and/or its contents: opening a file with + // model data will create a new model. inline void open(const std::string & fileName) { int ierr = 0; @@ -122,7 +123,8 @@ namespace gmsh { // Top-level functions } // Merge a file. Equivalent to the `File->Merge' menu in the Gmsh app. Handling - // of the file depends on its extension and/or its contents. + // of the file depends on its extension and/or its contents. Merging a file with + // model data will add the data to the current model. inline void merge(const std::string & fileName) { int ierr = 0; @@ -146,7 +148,7 @@ namespace gmsh { // Top-level functions if(ierr) throw ierr; } - namespace option { // Global option handling functions + namespace option { // Option handling functions // Set a numerical option to `value'. `name' is of the form "category.option" // or "category[num].option". Available categories and options are listed in @@ -194,9 +196,40 @@ namespace gmsh { // Top-level functions value = std::string(api_value_); gmshFree(api_value_); } + // Set a color option to the RGBA value (`r', `g', `b', `a'), where where `r', + // `g', `b' and `a' should be integers between 0 and 255. `name' is of the form + // "category.option" or "category[num].option". Available categories and + // options are listed in the Gmsh reference manual, with the "Color." middle + // string removed. + inline void setColor(const std::string & name, + const int r, + const int g, + const int b, + const int a = 0) + { + int ierr = 0; + gmshOptionSetColor(name.c_str(), r, g, b, a, &ierr); + if(ierr) throw ierr; + } + + // Get the `r', `g', `b', `a' value of a color option. `name' is of the form + // "category.option" or "category[num].option". Available categories and + // options are listed in the Gmsh reference manual, with the "Color." middle + // string removed. + inline void getColor(const std::string & name, + int & r, + int & g, + int & b, + int & a) + { + int ierr = 0; + gmshOptionGetColor(name.c_str(), &r, &g, &b, &a, &ierr); + if(ierr) throw ierr; + } + } // namespace option - namespace model { // Per-model functions + namespace model { // Model functions // Add a new model, with name `name', and set it as the current model. inline void add(const std::string & name) @@ -233,10 +266,9 @@ namespace gmsh { // Top-level functions if(ierr) throw ierr; } - // Get all the (elementary) geometrical entities in the current model. If `dim' - // is >= 0, return only the entities of the specified dimension (e.g. points if - // `dim' == 0). The entities are returned as a vector of (dim, tag) integer - // pairs. + // Get all the entities in the current model. If `dim' is >= 0, return only the + // entities of the specified dimension (e.g. points if `dim' == 0). The + // entities are returned as a vector of (dim, tag) integer pairs. inline void getEntities(gmsh::vectorpair & dimTags, const int dim = -1) { @@ -282,8 +314,8 @@ namespace gmsh { // Top-level functions dimTags.resize(api_dimTags_n_ / 2); for(size_t i = 0; i < api_dimTags_n_ / 2; ++i){ dimTags[i].first = api_dimTags_[i * 2 + 0]; dimTags[i].second = api_dimTags_[i * 2 + 1]; } gmshFree(api_dimTags_); } - // Get the tags of the geometrical entities making up the physical group of - // dimension `dim' and tag `tag'. + // Get the tags of the model entities making up the physical group of dimension + // `dim' and tag `tag'. inline void getEntitiesForPhysicalGroup(const int dim, const int tag, std::vector<int> & tags) @@ -295,8 +327,8 @@ namespace gmsh { // Top-level functions tags.assign(api_tags_, api_tags_ + api_tags_n_); gmshFree(api_tags_); } - // Get the tags of the physical groups (if any) to which the geometrical entity - // of dimension `dim' and tag `tag' belongs. + // Get the tags of the physical groups (if any) to which the model entity of + // dimension `dim' and tag `tag' belongs. inline void getPhysicalGroupsForEntity(const int dim, const int tag, std::vector<int> & physicalTags) @@ -308,9 +340,9 @@ namespace gmsh { // Top-level functions physicalTags.assign(api_physicalTags_, api_physicalTags_ + api_physicalTags_n_); gmshFree(api_physicalTags_); } - // Add a physical group of dimension `dim', grouping the elementary entities - // with tags `tags'. Return the tag of the physical group, equal to `tag' if - // `tag' is positive, or a new tag if `tag' < 0. + // Add a physical group of dimension `dim', grouping the model entities with + // tags `tags'. Return the tag of the physical group, equal to `tag' if `tag' + // is positive, or a new tag if `tag' < 0. inline int addPhysicalGroup(const int dim, const std::vector<int> & tags, const int tag = -1) @@ -345,12 +377,12 @@ namespace gmsh { // Top-level functions name = std::string(api_name_); gmshFree(api_name_); } - // Get the boundary of the geometrical entities `dimTags'. Return in - // `outDimTags' the boundary of the individual entities (if `combined' is - // false) or the boundary of the combined geometrical shape formed by all input - // entities (if `combined' is true). Return tags multiplied by the sign of the - // boundary entity if `oriented' is true. Apply the boundary operator - // recursively down to dimension 0 (i.e. to points) if `recursive' is true. + // Get the boundary of the model entities `dimTags'. Return in `outDimTags' the + // boundary of the individual entities (if `combined' is false) or the boundary + // of the combined geometrical shape formed by all input entities (if + // `combined' is true). Return tags multiplied by the sign of the boundary + // entity if `oriented' is true. Apply the boundary operator recursively down + // to dimension 0 (i.e. to points) if `recursive' is true. inline void getBoundary(const gmsh::vectorpair & dimTags, gmsh::vectorpair & outDimTags, const bool combined = true, @@ -366,10 +398,10 @@ namespace gmsh { // Top-level functions outDimTags.resize(api_outDimTags_n_ / 2); for(size_t i = 0; i < api_outDimTags_n_ / 2; ++i){ outDimTags[i].first = api_outDimTags_[i * 2 + 0]; outDimTags[i].second = api_outDimTags_[i * 2 + 1]; } gmshFree(api_outDimTags_); } - // Get the (elementary) geometrical entities in the bounding box defined by the - // two points (`xmin', `ymin', `zmin') and (`xmax', `ymax', `zmax'). If `dim' - // is >= 0, return only the entities of the specified dimension (e.g. points if - // `dim' == 0). + // Get the model entities in the bounding box defined by the two points + // (`xmin', `ymin', `zmin') and (`xmax', `ymax', `zmax'). If `dim' is >= 0, + // return only the entities of the specified dimension (e.g. points if `dim' == + // 0). inline void getEntitiesInBoundingBox(const double xmin, const double ymin, const double zmin, @@ -387,7 +419,8 @@ namespace gmsh { // Top-level functions } // Get the bounding box (`xmin', `ymin', `zmin'), (`xmax', `ymax', `zmax') of - // the geometrical entity of dimension `dim' and tag `tag'. + // the model entity of dimension `dim' and tag `tag'. If `dim' and `tag' are + // negative, get the bounding box of the whole model. inline void getBoundingBox(const int dim, const int tag, double & xmin, @@ -411,12 +444,11 @@ namespace gmsh { // Top-level functions return result_api_; } - // Add a discrete geometrical entity (defined by a mesh) of dimension `dim' in - // the current model. Return the tag of the new discrete entity, equal to `tag' - // if `tag' is positive, or a new tag if `tag' < 0. `boundary' specifies the - // tags of the entities on the boundary of the discrete entity, if any. - // Specyfing `boundary' allows Gmsh to construct the topology of the overall - // model. + // Add a discrete model entity (defined by a mesh) of dimension `dim' in the + // current model. Return the tag of the new discrete entity, equal to `tag' if + // `tag' is positive, or a new tag if `tag' < 0. `boundary' specifies the tags + // of the entities on the boundary of the discrete entity, if any. Specifying + // `boundary' allows Gmsh to construct the topology of the overall model. inline int addDiscreteEntity(const int dim, const int tag = -1, const std::vector<int> & boundary = std::vector<int>()) @@ -612,8 +644,8 @@ namespace gmsh { // Top-level functions normals.assign(api_normals_, api_normals_ + api_normals_n_); gmshFree(api_normals_); } - // Set the visibility of the geometrical entities `dimTags' to `value'. Apply - // the visibility setting recursively if `recursive' is true. + // Set the visibility of the model entities `dimTags' to `value'. Apply the + // visibility setting recursively if `recursive' is true. inline void setVisibility(const gmsh::vectorpair & dimTags, const int value, const bool recursive = false) @@ -625,8 +657,7 @@ namespace gmsh { // Top-level functions gmshFree(api_dimTags_); } - // Get the visibility of the geometrical entity of dimension `dim' and tag - // `tag'. + // Get the visibility of the model entity of dimension `dim' and tag `tag'. inline void getVisibility(const int dim, const int tag, int & value) @@ -636,9 +667,9 @@ namespace gmsh { // Top-level functions if(ierr) throw ierr; } - // Set the color of the geometrical entities `dimTags' to the RGBA value (`r', - // `g', `b', `a'), where `r', `g', `b' and `a' should be integers between 0 and - // 255. Apply the color setting recursively if `recursive' is true. + // Set the color of the model entities `dimTags' to the RGBA value (`r', `g', + // `b', `a'), where `r', `g', `b' and `a' should be integers between 0 and 255. + // Apply the color setting recursively if `recursive' is true. inline void setColor(const gmsh::vectorpair & dimTags, const int r, const int g, @@ -653,7 +684,7 @@ namespace gmsh { // Top-level functions gmshFree(api_dimTags_); } - // Get the color of the geometrical entity of dimension `dim' and tag `tag'. + // Get the color of the model entity of dimension `dim' and tag `tag'. inline void getColor(const int dim, const int tag, int & r, @@ -666,7 +697,18 @@ namespace gmsh { // Top-level functions if(ierr) throw ierr; } - namespace mesh { // Per-model meshing functions + // Set the `x', `y', `z' coordinates of a geometrical point. + inline void setCoordinates(const int tag, + const double x, + const double y, + const double z) + { + int ierr = 0; + gmshModelSetCoordinates(tag, x, y, z, &ierr); + if(ierr) throw ierr; + } + + namespace mesh { // Mesh functions // Generate a mesh of the current model, up to dimension `dim' (0, 1, 2 or // 3). @@ -693,6 +735,25 @@ namespace gmsh { // Top-level functions if(ierr) throw ierr; } + // Optimize the mesh of the current model using `method' (empty for default + // tetrahedral mesh optimizer, "Netgen" for Netgen optimizer, "HighOrder" for + // direct high-order mesh optimizer, "HighOrderElastic" for high-order + // elastic smoother). + inline void optimize(const std::string & method) + { + int ierr = 0; + gmshModelMeshOptimize(method.c_str(), &ierr); + if(ierr) throw ierr; + } + + // Recombine the mesh of the current model. + inline void recombine() + { + int ierr = 0; + gmshModelMeshRecombine(&ierr); + if(ierr) throw ierr; + } + // Refine the mesh of the current model by uniformly splitting the elements. inline void refine() { @@ -701,6 +762,14 @@ namespace gmsh { // Top-level functions if(ierr) throw ierr; } + // Smooth the mesh of the current model. + inline void smooth() + { + int ierr = 0; + gmshModelMeshSmooth(&ierr); + if(ierr) throw ierr; + } + // Set the order of the elements in the mesh of the current model to `order'. inline void setOrder(const int order) { @@ -737,25 +806,26 @@ namespace gmsh { // Top-level functions // the node tags (their unique, strictly positive identification numbers). // `coord' is a vector of length 3 times the length of `nodeTags' that // contains the x, y, z coordinates of the nodes, concatenated: [n1x, n1y, - // n1z, n2x, ...]. If `dim' >= 0, `parametricCoord' contains the parametric - // coordinates ([u1, u2, ...] or [u1, v1, u2, ...]) of the nodes, if - // available. The length of `parametricCoord' can be 0 or `dim' times the - // length of `nodeTags'. If `includeBoundary' is set, also return the nodes - // classified on the boundary of the entity (wich will be reparametrized on - // the entity if `dim' >= 0 in order to compute their parametric - // coordinates). + // n1z, n2x, ...]. If `dim' >= 0 and `returnParamtricCoord' is set, + // `parametricCoord' contains the parametric coordinates ([u1, u2, ...] or + // [u1, v1, u2, ...]) of the nodes, if available. The length of + // `parametricCoord' can be 0 or `dim' times the length of `nodeTags'. If + // `includeBoundary' is set, also return the nodes classified on the boundary + // of the entity (which will be reparametrized on the entity if `dim' >= 0 in + // order to compute their parametric coordinates). inline void getNodes(std::vector<std::size_t> & nodeTags, std::vector<double> & coord, std::vector<double> & parametricCoord, const int dim = -1, const int tag = -1, - const bool includeBoundary = false) + const bool includeBoundary = false, + const bool returnParametricCoord = true) { int ierr = 0; size_t *api_nodeTags_; size_t api_nodeTags_n_; double *api_coord_; size_t api_coord_n_; double *api_parametricCoord_; size_t api_parametricCoord_n_; - gmshModelMeshGetNodes(&api_nodeTags_, &api_nodeTags_n_, &api_coord_, &api_coord_n_, &api_parametricCoord_, &api_parametricCoord_n_, dim, tag, (int)includeBoundary, &ierr); + gmshModelMeshGetNodes(&api_nodeTags_, &api_nodeTags_n_, &api_coord_, &api_coord_n_, &api_parametricCoord_, &api_parametricCoord_n_, dim, tag, (int)includeBoundary, (int)returnParametricCoord, &ierr); if(ierr) throw ierr; nodeTags.assign(api_nodeTags_, api_nodeTags_ + api_nodeTags_n_); gmshFree(api_nodeTags_); coord.assign(api_coord_, api_coord_ + api_coord_n_); gmshFree(api_coord_); @@ -766,7 +836,7 @@ namespace gmsh { // Top-level functions // with tag `tag'. This is a sometimes useful but inefficient way of // accessing nodes, as it relies on a cache stored in the model. For large // meshes all the nodes in the model should be numbered in a continuous - // sequence of tags from 1 to N to maintain reasonnable performance (in this + // sequence of tags from 1 to N to maintain reasonable performance (in this // case the internal cache is based on a vector; otherwise it uses a map). inline void getNode(const std::size_t nodeTag, std::vector<double> & coord, @@ -807,15 +877,15 @@ namespace gmsh { // Top-level functions coord.assign(api_coord_, api_coord_ + api_coord_n_); gmshFree(api_coord_); } - // Set the nodes classified on the geometrical entity of dimension `dim' and - // tag `tag'. `nodeTags' contains the node tags (their unique, strictly - // positive identification numbers). `coord' is a vector of length 3 times - // the length of `nodeTags' that contains the x, y, z coordinates of the - // nodes, concatenated: [n1x, n1y, n1z, n2x, ...]. The optional - // `parametricCoord' vector contains the parametric coordinates of the nodes, - // if any. The length of `parametricCoord' can be 0 or `dim' times the length - // of `nodeTags'. If the `nodeTags' vector is empty, new tags are - // automatically assigned to the nodes. + // Set the nodes classified on the model entity of dimension `dim' and tag + // `tag'. `nodeTags' contains the node tags (their unique, strictly positive + // identification numbers). `coord' is a vector of length 3 times the length + // of `nodeTags' that contains the x, y, z coordinates of the nodes, + // concatenated: [n1x, n1y, n1z, n2x, ...]. The optional `parametricCoord' + // vector contains the parametric coordinates of the nodes, if any. The + // length of `parametricCoord' can be 0 or `dim' times the length of + // `nodeTags'. If the `nodeTags' vector is empty, new tags are automatically + // assigned to the nodes. inline void setNodes(const int dim, const int tag, const std::vector<std::size_t> & nodeTags, @@ -833,7 +903,7 @@ namespace gmsh { // Top-level functions gmshFree(api_parametricCoord_); } - // Reclassify all nodes on their associated geometrical entity, based on the + // Reclassify all nodes on their associated model entity, based on the // elements. Can be used when importing nodes in bulk (e.g. by associating // them all to a single volume), to reclassify them correctly on model // surfaces, curves, etc. after the elements have been set. @@ -890,7 +960,7 @@ namespace gmsh { // Top-level functions // sometimes useful but inefficient way of accessing elements, as it relies // on a cache stored in the model. For large meshes all the elements in the // model should be numbered in a continuous sequence of tags from 1 to N to - // maintain reasonnable performance (in this case the internal cache is based + // maintain reasonable performance (in this case the internal cache is based // on a vector; otherwise it uses a map). inline void getElement(const std::size_t elementTag, int & elementType, @@ -903,19 +973,28 @@ namespace gmsh { // Top-level functions nodeTags.assign(api_nodeTags_, api_nodeTags_ + api_nodeTags_n_); gmshFree(api_nodeTags_); } - // Get the tag, type and node tags of the element located at coordinates - // (`x', `y', `z'). This is a sometimes useful but inefficient way of - // accessing elements, as it relies on a search in a spatial octree. + // Search the mesh for an element located at coordinates (`x', `y', `z'). + // This is a sometimes useful but inefficient way of accessing elements, as + // it relies on a search in a spatial octree. If an element is found, return + // its tag, type and node tags, as well as the local coordinates (`u', `v', + // `w') within the element corresponding to search location. If `dim' is >= + // 0, only search for elements of the given dimension. If `strict' is not + // set, use a tolerance to find elements near the search location. inline void getElementByCoordinates(const double x, const double y, const double z, std::size_t & elementTag, int & elementType, - std::vector<std::size_t> & nodeTags) + std::vector<std::size_t> & nodeTags, + double & u, + double & v, + double & w, + const int dim = -1, + const bool strict = false) { int ierr = 0; size_t *api_nodeTags_; size_t api_nodeTags_n_; - gmshModelMeshGetElementByCoordinates(x, y, z, &elementTag, &elementType, &api_nodeTags_, &api_nodeTags_n_, &ierr); + gmshModelMeshGetElementByCoordinates(x, y, z, &elementTag, &elementType, &api_nodeTags_, &api_nodeTags_n_, &u, &v, &w, dim, (int)strict, &ierr); if(ierr) throw ierr; nodeTags.assign(api_nodeTags_, api_nodeTags_ + api_nodeTags_n_); gmshFree(api_nodeTags_); } @@ -968,7 +1047,7 @@ namespace gmsh { // Top-level functions parametricCoord.assign(api_parametricCoord_, api_parametricCoord_ + api_parametricCoord_n_); gmshFree(api_parametricCoord_); } - // Get the elements of type `elementType' classified on the entity of of tag + // Get the elements of type `elementType' classified on the entity of tag // `tag'. If `tag' < 0, get the elements for all entities. `elementTags' is a // vector containing the tags (unique, strictly positive identifiers) of the // elements of the corresponding type. `nodeTags' is a vector of length equal @@ -993,8 +1072,8 @@ namespace gmsh { // Top-level functions nodeTags.assign(api_nodeTags_, api_nodeTags_ + api_nodeTags_n_); gmshFree(api_nodeTags_); } - // Preallocate the data for `getElementsByType'. This is necessary only if - // `getElementsByType' is called with `numTasks' > 1. + // Preallocate data before calling `getElementsByType' with `numTasks' > 1. + // For C and C++ only. inline void preallocateElementsByType(const int elementType, const bool elementTag, const bool nodeTag, @@ -1059,22 +1138,42 @@ namespace gmsh { // Top-level functions gmshFree(api_nodeTags_); } + // Get the numerical quadrature information for the given element type + // `elementType' and integration rule `integrationType' (e.g. "Gauss4" for a + // Gauss quadrature suited for integrating 4th order polynomials). + // `integrationPoints' contains the u, v, w coordinates of the G integration + // points in the reference element: [g1u, g1v, g1w, ..., gGu, gGv, gGw]. + // `integrationWeigths' contains the associated weights: [g1q, ..., gGq]. + inline void getIntegrationPoints(const int elementType, + const std::string & integrationType, + std::vector<double> & integrationPoints, + std::vector<double> & integrationWeights) + { + int ierr = 0; + double *api_integrationPoints_; size_t api_integrationPoints_n_; + double *api_integrationWeights_; size_t api_integrationWeights_n_; + gmshModelMeshGetIntegrationPoints(elementType, integrationType.c_str(), &api_integrationPoints_, &api_integrationPoints_n_, &api_integrationWeights_, &api_integrationWeights_n_, &ierr); + if(ierr) throw ierr; + integrationPoints.assign(api_integrationPoints_, api_integrationPoints_ + api_integrationPoints_n_); gmshFree(api_integrationPoints_); + integrationWeights.assign(api_integrationWeights_, api_integrationWeights_ + api_integrationWeights_n_); gmshFree(api_integrationWeights_); + } + // Get the Jacobians of all the elements of type `elementType' classified on - // the entity of dimension `dim' and tag `tag', at the G integration points - // required by the `integrationType' integration rule (e.g. "Gauss4" for a - // Gauss quadrature suited for integrating 4th order polynomials). Data is - // returned by element, with elements in the same order as in `getElements' - // and `getElementsByType'. `jacobians' contains for each element the 9 - // entries of the 3x3 Jacobian matrix at each integration point, by row: - // [e1g1Jxu, e1g1Jxv, e1g1Jxw, e1g1Jyu, ..., e1g1Jzw, e1g2Jxu, ..., e1gGJzw, - // e2g1Jxu, ...], with Jxu=dx/du, Jxv=dx/dv, etc. `determinants' contains for - // each element the determinant of the Jacobian matrix at each integration - // point: [e1g1, e1g2, ... e1gG, e2g1, ...]. `points' contains for each - // element the x, y, z coordinates of the integration points. If `tag' < 0, - // get the Jacobian data for all entities. If `numTasks' > 1, only compute - // and return the part of the data indexed by `task'. + // the entity of tag `tag', at the G integration points `integrationPoints' + // given as concatenated triplets of coordinates in the reference element + // [g1u, g1v, g1w, ..., gGu, gGv, gGw]. Data is returned by element, with + // elements in the same order as in `getElements' and `getElementsByType'. + // `jacobians' contains for each element the 9 entries of the 3x3 Jacobian + // matrix at each integration point, by row: [e1g1Jxu, e1g1Jxv, e1g1Jxw, + // e1g1Jyu, ..., e1g1Jzw, e1g2Jxu, ..., e1gGJzw, e2g1Jxu, ...], with + // Jxu=dx/du, Jxv=dx/dv, etc. `determinants' contains for each element the + // determinant of the Jacobian matrix at each integration point: [e1g1, e1g2, + // ... e1gG, e2g1, ...]. `points' contains for each element the x, y, z + // coordinates of the integration points. If `tag' < 0, get the Jacobian data + // for all entities. If `numTasks' > 1, only compute and return the part of + // the data indexed by `task'. inline void getJacobians(const int elementType, - const std::string & integrationType, + const std::vector<double> & integrationPoints, std::vector<double> & jacobians, std::vector<double> & determinants, std::vector<double> & points, @@ -1083,20 +1182,22 @@ namespace gmsh { // Top-level functions const std::size_t numTasks = 1) { int ierr = 0; + double *api_integrationPoints_; size_t api_integrationPoints_n_; vector2ptr(integrationPoints, &api_integrationPoints_, &api_integrationPoints_n_); double *api_jacobians_; size_t api_jacobians_n_; double *api_determinants_; size_t api_determinants_n_; double *api_points_; size_t api_points_n_; - gmshModelMeshGetJacobians(elementType, integrationType.c_str(), &api_jacobians_, &api_jacobians_n_, &api_determinants_, &api_determinants_n_, &api_points_, &api_points_n_, tag, task, numTasks, &ierr); + gmshModelMeshGetJacobians(elementType, api_integrationPoints_, api_integrationPoints_n_, &api_jacobians_, &api_jacobians_n_, &api_determinants_, &api_determinants_n_, &api_points_, &api_points_n_, tag, task, numTasks, &ierr); if(ierr) throw ierr; + gmshFree(api_integrationPoints_); jacobians.assign(api_jacobians_, api_jacobians_ + api_jacobians_n_); gmshFree(api_jacobians_); determinants.assign(api_determinants_, api_determinants_ + api_determinants_n_); gmshFree(api_determinants_); points.assign(api_points_, api_points_ + api_points_n_); gmshFree(api_points_); } - // Preallocate the data required by `getJacobians'. This is necessary only if - // `getJacobians' is called with `numTasks' > 1. + // Preallocate data before calling `getJacobians' with `numTasks' > 1. For C + // and C++ only. inline void preallocateJacobians(const int elementType, - const std::string & integrationType, + const int numIntegrationPoints, const bool jacobian, const bool determinant, const bool point, @@ -1109,40 +1210,106 @@ namespace gmsh { // Top-level functions double *api_jacobians_; size_t api_jacobians_n_; double *api_determinants_; size_t api_determinants_n_; double *api_points_; size_t api_points_n_; - gmshModelMeshPreallocateJacobians(elementType, integrationType.c_str(), (int)jacobian, (int)determinant, (int)point, &api_jacobians_, &api_jacobians_n_, &api_determinants_, &api_determinants_n_, &api_points_, &api_points_n_, tag, &ierr); + gmshModelMeshPreallocateJacobians(elementType, numIntegrationPoints, (int)jacobian, (int)determinant, (int)point, &api_jacobians_, &api_jacobians_n_, &api_determinants_, &api_determinants_n_, &api_points_, &api_points_n_, tag, &ierr); if(ierr) throw ierr; jacobians.assign(api_jacobians_, api_jacobians_ + api_jacobians_n_); gmshFree(api_jacobians_); determinants.assign(api_determinants_, api_determinants_ + api_determinants_n_); gmshFree(api_determinants_); points.assign(api_points_, api_points_ + api_points_n_); gmshFree(api_points_); } - // Get the basis functions of the element of type `elementType' for the given - // `integrationType' integration rule (e.g. "Gauss4" for a Gauss quadrature - // suited for integrating 4th order polynomials) and `functionSpaceType' - // function space (e.g. "Lagrange" or "GradLagrange" for Lagrange basis - // functions or their gradient, in the u, v, w coordinates of the reference - // element). `integrationPoints' contains the u, v, w coordinates of the - // integration points in the reference element as well as the associated - // weight q, concatenated: [g1u, g1v, g1w, g1q, g2u, ...]. `numComponents' - // returns the number C of components of a basis function. `basisFunctions' - // contains the evaluation of the basis functions at the integration points: - // [g1f1, ..., g1fC, g2f1, ...]. + // Get the basis functions of the element of type `elementType' at the + // integration points `integrationPoints' (given as concatenated triplets of + // coordinates in the reference element [g1u, g1v, g1w, ..., gGu, gGv, gGw]), + // for the function space `functionSpaceType' (e.g. "Lagrange" or + // "GradLagrange" for Lagrange basis functions or their gradient, in the u, + // v, w coordinates of the reference element). `numComponents' returns the + // number C of components of a basis function. `basisFunctions' returns the + // value of the N basis functions at the integration points, i.e. [g1f1, + // g1f2, ..., g1fN, g2f1, ...] when C == 1 or [g1f1u, g1f1v, g1f1w, g1f2u, + // ..., g1fNw, g2f1u, ...] when C == 3. inline void getBasisFunctions(const int elementType, - const std::string & integrationType, + const std::vector<double> & integrationPoints, const std::string & functionSpaceType, - std::vector<double> & integrationPoints, int & numComponents, std::vector<double> & basisFunctions) { int ierr = 0; - double *api_integrationPoints_; size_t api_integrationPoints_n_; + double *api_integrationPoints_; size_t api_integrationPoints_n_; vector2ptr(integrationPoints, &api_integrationPoints_, &api_integrationPoints_n_); double *api_basisFunctions_; size_t api_basisFunctions_n_; - gmshModelMeshGetBasisFunctions(elementType, integrationType.c_str(), functionSpaceType.c_str(), &api_integrationPoints_, &api_integrationPoints_n_, &numComponents, &api_basisFunctions_, &api_basisFunctions_n_, &ierr); + gmshModelMeshGetBasisFunctions(elementType, api_integrationPoints_, api_integrationPoints_n_, functionSpaceType.c_str(), &numComponents, &api_basisFunctions_, &api_basisFunctions_n_, &ierr); if(ierr) throw ierr; - integrationPoints.assign(api_integrationPoints_, api_integrationPoints_ + api_integrationPoints_n_); gmshFree(api_integrationPoints_); + gmshFree(api_integrationPoints_); + basisFunctions.assign(api_basisFunctions_, api_basisFunctions_ + api_basisFunctions_n_); gmshFree(api_basisFunctions_); + } + + // Get the element-dependent basis functions of the elements of type + // `elementType' in the entity of tag `tag'at the integration points + // `integrationPoints' (given as concatenated triplets of coordinates in the + // reference element [g1u, g1v, g1w, ..., gGu, gGv, gGw]), for the function + // space `functionSpaceType' (e.g. "H1Legendre3" or "GradH1Legendre3" for 3rd + // order hierarchical H1 Legendre functions or their gradient, in the u, v, w + // coordinates of the reference elements). `numComponents' returns the number + // C of components of a basis function. `numBasisFunctions' returns the + // number N of basis functions per element. `basisFunctions' returns the + // value of the basis functions at the integration points for each element: + // [e1g1f1,..., e1g1fN, e1g2f1,..., e2g1f1, ...] when C == 1 or [e1g1f1u, + // e1g1f1v,..., e1g1fNw, e1g2f1u,..., e2g1f1u, ...]. Warning: this is an + // experimental feature and will probably change in a future release. + inline void getBasisFunctionsForElements(const int elementType, + const std::vector<double> & integrationPoints, + const std::string & functionSpaceType, + int & numComponents, + int & numFunctionsPerElements, + std::vector<double> & basisFunctions, + const int tag = -1) + { + int ierr = 0; + double *api_integrationPoints_; size_t api_integrationPoints_n_; vector2ptr(integrationPoints, &api_integrationPoints_, &api_integrationPoints_n_); + double *api_basisFunctions_; size_t api_basisFunctions_n_; + gmshModelMeshGetBasisFunctionsForElements(elementType, api_integrationPoints_, api_integrationPoints_n_, functionSpaceType.c_str(), &numComponents, &numFunctionsPerElements, &api_basisFunctions_, &api_basisFunctions_n_, tag, &ierr); + if(ierr) throw ierr; + gmshFree(api_integrationPoints_); basisFunctions.assign(api_basisFunctions_, api_basisFunctions_ + api_basisFunctions_n_); gmshFree(api_basisFunctions_); } + // Generate the `keys' for the elements of type `elementType' in the entity + // of tag `tag', for the `functionSpaceType' function space. Each key + // uniquely identifies a basis function in the function space. If + // `returnCoord' is set, the `coord' vector contains the x, y, z coordinates + // locating basis functions for sorting purposes. Warning: this is an + // experimental feature and will probably change in a future release. + inline void getKeysForElements(const int elementType, + const std::string & functionSpaceType, + gmsh::vectorpair & keys, + std::vector<double> & coord, + const int tag = -1, + const bool returnCoord = true) + { + int ierr = 0; + int *api_keys_; size_t api_keys_n_; + double *api_coord_; size_t api_coord_n_; + gmshModelMeshGetKeysForElements(elementType, functionSpaceType.c_str(), &api_keys_, &api_keys_n_, &api_coord_, &api_coord_n_, tag, (int)returnCoord, &ierr); + if(ierr) throw ierr; + keys.resize(api_keys_n_ / 2); for(size_t i = 0; i < api_keys_n_ / 2; ++i){ keys[i].first = api_keys_[i * 2 + 0]; keys[i].second = api_keys_[i * 2 + 1]; } gmshFree(api_keys_); + coord.assign(api_coord_, api_coord_ + api_coord_n_); gmshFree(api_coord_); + } + + // Get information about the `keys'. Warning: this is an experimental feature + // and will probably change in a future release. + inline void getInformationForElements(const gmsh::vectorpair & keys, + gmsh::vectorpair & info, + const int order, + const int elementType) + { + int ierr = 0; + int *api_keys_; size_t api_keys_n_; vectorpair2intptr(keys, &api_keys_, &api_keys_n_); + int *api_info_; size_t api_info_n_; + gmshModelMeshGetInformationForElements(api_keys_, api_keys_n_, &api_info_, &api_info_n_, order, elementType, &ierr); + if(ierr) throw ierr; + gmshFree(api_keys_); + info.resize(api_info_n_ / 2); for(size_t i = 0; i < api_info_n_ / 2; ++i){ info[i].first = api_info_[i * 2 + 0]; info[i].second = api_info_[i * 2 + 1]; } gmshFree(api_info_); + } + // Precomputes the basis functions corresponding to `elementType'. inline void precomputeBasisFunctions(const int elementType) { @@ -1173,8 +1340,8 @@ namespace gmsh { // Top-level functions barycenters.assign(api_barycenters_, api_barycenters_ + api_barycenters_n_); gmshFree(api_barycenters_); } - // Preallocate the data required by `getBarycenters'. This is necessary only - // if `getBarycenters' is called with `numTasks' > 1. + // Preallocate data before calling `getBarycenters' with `numTasks' > 1. For + // C and C++ only. inline void preallocateBarycenters(const int elementType, std::vector<double> & barycenters, const int tag = -1) @@ -1187,10 +1354,13 @@ namespace gmsh { // Top-level functions } // Get the nodes on the edges of all elements of type `elementType' - // classified on the entity of tag `tag'. `nodeTags' contains the node tags. - // If `primary' is set, only the primary (begin/end) nodes of the edges are - // returned. If `tag' < 0, get the edge nodes for all entities. If `numTasks' - // > 1, only compute and return the part of the data indexed by `task'. + // classified on the entity of tag `tag'. `nodeTags' contains the node tags + // of the edges for all the elements: [e1a1n1, e1a1n2, e1a2n1, ...]. Data is + // returned by element, with elements in the same order as in `getElements' + // and `getElementsByType'. If `primary' is set, only the primary (begin/end) + // nodes of the edges are returned. If `tag' < 0, get the edge nodes for all + // entities. If `numTasks' > 1, only compute and return the part of the data + // indexed by `task'. inline void getElementEdgeNodes(const int elementType, std::vector<std::size_t> & nodeTags, const int tag = -1, @@ -1207,10 +1377,13 @@ namespace gmsh { // Top-level functions // Get the nodes on the faces of type `faceType' (3 for triangular faces, 4 // for quadrangular faces) of all elements of type `elementType' classified - // on the entity of tag `tag'. `nodeTags' contains the node tags. If - // `primary' is set, only the primary (corner) nodes of the faces are - // returned. If `tag' < 0, get the face nodes for all entities. If `numTasks' - // > 1, only compute and return the part of the data indexed by `task'. + // on the entity of tag `tag'. `nodeTags' contains the node tags of the faces + // for all elements: [e1f1n1, ..., e1f1nFaceType, e1f2n1, ...]. Data is + // returned by element, with elements in the same order as in `getElements' + // and `getElementsByType'. If `primary' is set, only the primary (corner) + // nodes of the faces are returned. If `tag' < 0, get the face nodes for all + // entities. If `numTasks' > 1, only compute and return the part of the data + // indexed by `task'. inline void getElementFaceNodes(const int elementType, const int faceType, std::vector<std::size_t> & nodeTags, @@ -1242,8 +1415,8 @@ namespace gmsh { // Top-level functions partitions.assign(api_partitions_, api_partitions_ + api_partitions_n_); gmshFree(api_partitions_); } - // Set a mesh size constraint on the geometrical entities `dimTags'. - // Currently only entities of dimension 0 (points) are handled. + // Set a mesh size constraint on the model entities `dimTags'. Currently only + // entities of dimension 0 (points) are handled. inline void setSize(const gmsh::vectorpair & dimTags, const double size) { @@ -1299,9 +1472,9 @@ namespace gmsh { // Top-level functions gmshFree(api_cornerTags_); } - // Set a recombination meshing constraint on the geometrical entity of - // dimension `dim' and tag `tag'. Currently only entities of dimension 2 (to - // recombine triangles into quadrangles) are supported. + // Set a recombination meshing constraint on the model entity of dimension + // `dim' and tag `tag'. Currently only entities of dimension 2 (to recombine + // triangles into quadrangles) are supported. inline void setRecombine(const int dim, const int tag) { @@ -1310,8 +1483,8 @@ namespace gmsh { // Top-level functions if(ierr) throw ierr; } - // Set a smoothing meshing constraint on the geometrical entity of dimension - // `dim' and tag `tag'. `val' iterations of a Laplace smoother are applied. + // Set a smoothing meshing constraint on the model entity of dimension `dim' + // and tag `tag'. `val' iterations of a Laplace smoother are applied. inline void setSmoothing(const int dim, const int tag, const int val) @@ -1321,11 +1494,11 @@ namespace gmsh { // Top-level functions if(ierr) throw ierr; } - // Set a reverse meshing constraint on the geometrical entity of dimension - // `dim' and tag `tag'. If `val' is true, the mesh orientation will be - // reversed with respect to the natural mesh orientation (i.e. the - // orientation consistent with the orientation of the geometrical entity). If - // `val' is false, the mesh is left as-is. + // Set a reverse meshing constraint on the model entity of dimension `dim' + // and tag `tag'. If `val' is true, the mesh orientation will be reversed + // with respect to the natural mesh orientation (i.e. the orientation + // consistent with the orientation of the geometry). If `val' is false, the + // mesh is left as-is. inline void setReverse(const int dim, const int tag, const bool val = true) @@ -1346,9 +1519,8 @@ namespace gmsh { // Top-level functions if(ierr) throw ierr; } - // Embed the geometrical entities of dimension `dim' and tags `tags' in the - // (inDim, inTag) geometrical entity. `inDim' must be strictly greater than - // `dim'. + // Embed the model entities of dimension `dim' and tags `tags' in the (inDim, + // inTag) model entity. `inDim' must be strictly greater than `dim'. inline void embed(const int dim, const std::vector<int> & tags, const int inDim, @@ -1361,9 +1533,9 @@ namespace gmsh { // Top-level functions gmshFree(api_tags_); } - // Remove embedded entities in the geometrical entities `dimTags'. if `dim' - // is >= 0, only remove embedded entities of the given dimension (e.g. - // embedded points if `dim' == 0). + // Remove embedded entities in the model entities `dimTags'. if `dim' is >= + // 0, only remove embedded entities of the given dimension (e.g. embedded + // points if `dim' == 0). inline void removeEmbedded(const gmsh::vectorpair & dimTags, const int dim = -1) { @@ -1541,11 +1713,11 @@ namespace gmsh { // Top-level functions gmshFree(api_dims_); } - namespace field { // Per-model mesh size field functions + namespace field { // Mesh size field functions // Add a new mesh size field of type `fieldType'. If `tag' is positive, - // assign the tag explcitly; otherwise a new tag is assigned automatically. - // Return the field tag. + // assign the tag explicitly; otherwise a new tag is assigned + // automatically. Return the field tag. inline int add(const std::string & fieldType, const int tag = -1) { @@ -1615,15 +1787,14 @@ namespace gmsh { // Top-level functions } // namespace mesh - namespace geo { // Internal per-model GEO CAD kernel functions + namespace geo { // Built-in CAD kernel functions - // Add a geometrical point in the internal GEO CAD representation, at - // coordinates (`x', `y', `z'). If `meshSize' is > 0, add a meshing - // constraint at that point. If `tag' is positive, set the tag explicitly; - // otherwise a new tag is selected automatically. Return the tag of the - // point. (Note that the point will be added in the current model only after - // `synchronize' is called. This behavior holds for all the entities added in - // the geo module.) + // Add a geometrical point in the built-in CAD representation, at coordinates + // (`x', `y', `z'). If `meshSize' is > 0, add a meshing constraint at that + // point. If `tag' is positive, set the tag explicitly; otherwise a new tag + // is selected automatically. Return the tag of the point. (Note that the + // point will be added in the current model only after `synchronize' is + // called. This behavior holds for all the entities added in the geo module.) inline int addPoint(const double x, const double y, const double z, @@ -1649,10 +1820,10 @@ namespace gmsh { // Top-level functions return result_api_; } - // Add a circle arc (stricly smaller than Pi) between the two points with + // Add a circle arc (strictly smaller than Pi) between the two points with // tags `startTag' and `endTag', with center `centertag'. If `tag' is // positive, set the tag explicitly; otherwise a new tag is selected - // automatically. If (`nx', `ny', `nz') != (0,0,0), explicitely set the plane + // automatically. If (`nx', `ny', `nz') != (0,0,0), explicitly set the plane // of the circle arc. Return the tag of the circle arc. inline int addCircleArc(const int startTag, const int centerTag, @@ -1668,11 +1839,11 @@ namespace gmsh { // Top-level functions return result_api_; } - // Add an ellipse arc (stricly smaller than Pi) between the two points + // Add an ellipse arc (strictly smaller than Pi) between the two points // `startTag' and `endTag', with center `centertag' and major axis point // `majorTag'. If `tag' is positive, set the tag explicitly; otherwise a new // tag is selected automatically. If (`nx', `ny', `nz') != (0,0,0), - // explicitely set the plane of the circle arc. Return the tag of the ellipse + // explicitly set the plane of the circle arc. Return the tag of the ellipse // arc. inline int addEllipseArc(const int startTag, const int centerTag, @@ -1734,11 +1905,11 @@ namespace gmsh { // Top-level functions } // Add a curve loop (a closed wire) formed by the curves `curveTags'. - // `curveTags' should contain (signed) tags of geometrical enties of - // dimension 1 forming a closed loop: a negative tag signifies that the - // underlying curve is considered with reversed orientation. If `tag' is - // positive, set the tag explicitly; otherwise a new tag is selected - // automatically. Return the tag of the curve loop. + // `curveTags' should contain (signed) tags of model enties of dimension 1 + // forming a closed loop: a negative tag signifies that the underlying curve + // is considered with reversed orientation. If `tag' is positive, set the tag + // explicitly; otherwise a new tag is selected automatically. Return the tag + // of the curve loop. inline int addCurveLoop(const std::vector<int> & curveTags, const int tag = -1) { @@ -1810,11 +1981,12 @@ namespace gmsh { // Top-level functions return result_api_; } - // Extrude the geometrical entities `dimTags' by translation along (`dx', - // `dy', `dz'). Return extruded entities in `outDimTags'. If `numElements' is - // not empty, also extrude the mesh: the entries in `numElements' give the - // number of elements in each layer. If `height' is not empty, it provides - // the (cummulative) height of the different layers, normalized to 1. + // Extrude the model entities `dimTags' by translation along (`dx', `dy', + // `dz'). Return extruded entities in `outDimTags'. If `numElements' is not + // empty, also extrude the mesh: the entries in `numElements' give the number + // of elements in each layer. If `height' is not empty, it provides the + // (cumulative) height of the different layers, normalized to 1. If `dx' == + // `dy' == `dz' == 0, the entities are extruded along their normal. inline void extrude(const gmsh::vectorpair & dimTags, const double dx, const double dy, @@ -1837,12 +2009,12 @@ namespace gmsh { // Top-level functions gmshFree(api_heights_); } - // Extrude the geometrical entities `dimTags' by rotation of `angle' radians - // around the axis of revolution defined by the point (`x', `y', `z') and the + // Extrude the model entities `dimTags' by rotation of `angle' radians around + // the axis of revolution defined by the point (`x', `y', `z') and the // direction (`ax', `ay', `az'). Return extruded entities in `outDimTags'. If // `numElements' is not empty, also extrude the mesh: the entries in // `numElements' give the number of elements in each layer. If `height' is - // not empty, it provides the (cummulative) height of the different layers, + // not empty, it provides the (cumulative) height of the different layers, // normalized to 1. inline void revolve(const gmsh::vectorpair & dimTags, const double x, @@ -1870,13 +2042,13 @@ namespace gmsh { // Top-level functions gmshFree(api_heights_); } - // Extrude the geometrical entities `dimTags' by a combined translation and + // Extrude the model entities `dimTags' by a combined translation and // rotation of `angle' radians, along (`dx', `dy', `dz') and around the axis // of revolution defined by the point (`x', `y', `z') and the direction // (`ax', `ay', `az'). Return extruded entities in `outDimTags'. If // `numElements' is not empty, also extrude the mesh: the entries in // `numElements' give the number of elements in each layer. If `height' is - // not empty, it provides the (cummulative) height of the different layers, + // not empty, it provides the (cumulative) height of the different layers, // normalized to 1. inline void twist(const gmsh::vectorpair & dimTags, const double x, @@ -1907,7 +2079,7 @@ namespace gmsh { // Top-level functions gmshFree(api_heights_); } - // Translate the geometrical entities `dimTags' along (`dx', `dy', `dz'). + // Translate the model entities `dimTags' along (`dx', `dy', `dz'). inline void translate(const gmsh::vectorpair & dimTags, const double dx, const double dy, @@ -1920,9 +2092,9 @@ namespace gmsh { // Top-level functions gmshFree(api_dimTags_); } - // Rotate the geometrical entities `dimTags' of `angle' radians around the - // axis of revolution defined by the point (`x', `y', `z') and the direction - // (`ax', `ay', `az'). + // Rotate the model entities `dimTags' of `angle' radians around the axis of + // revolution defined by the point (`x', `y', `z') and the direction (`ax', + // `ay', `az'). inline void rotate(const gmsh::vectorpair & dimTags, const double x, const double y, @@ -1939,9 +2111,9 @@ namespace gmsh { // Top-level functions gmshFree(api_dimTags_); } - // Scale the geometrical entities `dimTag' by factors `a', `b' and `c' along - // the three coordinate axes; use (`x', `y', `z') as the center of the - // homothetic transformation. + // Scale the model entities `dimTag' by factors `a', `b' and `c' along the + // three coordinate axes; use (`x', `y', `z') as the center of the homothetic + // transformation. inline void dilate(const gmsh::vectorpair & dimTags, const double x, const double y, @@ -1957,7 +2129,7 @@ namespace gmsh { // Top-level functions gmshFree(api_dimTags_); } - // Apply a symmetry transformation to the geometrical entities `dimTag', with + // Apply a symmetry transformation to the model entities `dimTag', with // respect to the plane of equation `a' * x + `b' * y + `c' * z + `d' = 0. inline void symmetrize(const gmsh::vectorpair & dimTags, const double a, @@ -2007,10 +2179,10 @@ namespace gmsh { // Top-level functions if(ierr) throw ierr; } - // Synchronize the internal GEO CAD representation with the current Gmsh - // model. This can be called at any time, but since it involves a non trivial - // amount of processing, the number of synchronization points should normally - // be minimized. + // Synchronize the built-in CAD representation with the current Gmsh model. + // This can be called at any time, but since it involves a non trivial amount + // of processing, the number of synchronization points should normally be + // minimized. inline void synchronize() { int ierr = 0; @@ -2018,10 +2190,10 @@ namespace gmsh { // Top-level functions if(ierr) throw ierr; } - namespace mesh { // GEO-specific meshing constraints + namespace mesh { // Built-in CAD kernel meshing constraints - // Set a mesh size constraint on the geometrical entities `dimTags'. - // Currently only entities of dimension 0 (points) are handled. + // Set a mesh size constraint on the model entities `dimTags'. Currently + // only entities of dimension 0 (points) are handled. inline void setSize(const gmsh::vectorpair & dimTags, const double size) { @@ -2035,7 +2207,7 @@ namespace gmsh { // Top-level functions // Set a transfinite meshing constraint on the curve `tag', with `numNodes' // nodes distributed according to `meshType' and `coef'. Currently // supported types are "Progression" (geometrical progression with power - // `coef') and "Bump" (refinement toward both extreminties of the curve). + // `coef') and "Bump" (refinement toward both extremities of the curve). inline void setTransfiniteCurve(const int tag, const int nPoints, const std::string & meshType = "Progression", @@ -2077,9 +2249,9 @@ namespace gmsh { // Top-level functions gmshFree(api_cornerTags_); } - // Set a recombination meshing constraint on the geometrical entity of - // dimension `dim' and tag `tag'. Currently only entities of dimension 2 - // (to recombine triangles into quadrangles) are supported. + // Set a recombination meshing constraint on the model entity of dimension + // `dim' and tag `tag'. Currently only entities of dimension 2 (to + // recombine triangles into quadrangles) are supported. inline void setRecombine(const int dim, const int tag, const double angle = 45.) @@ -2089,9 +2261,8 @@ namespace gmsh { // Top-level functions if(ierr) throw ierr; } - // Set a smoothing meshing constraint on the geometrical entity of - // dimension `dim' and tag `tag'. `val' iterations of a Laplace smoother - // are applied. + // Set a smoothing meshing constraint on the model entity of dimension + // `dim' and tag `tag'. `val' iterations of a Laplace smoother are applied. inline void setSmoothing(const int dim, const int tag, const int val) @@ -2101,11 +2272,11 @@ namespace gmsh { // Top-level functions if(ierr) throw ierr; } - // Set a reverse meshing constraint on the geometrical entity of dimension - // `dim' and tag `tag'. If `val' is true, the mesh orientation will be - // reversed with respect to the natural mesh orientation (i.e. the - // orientation consistent with the orientation of the geometrical entity). - // If `val' is false, the mesh is left as-is. + // Set a reverse meshing constraint on the model entity of dimension `dim' + // and tag `tag'. If `val' is true, the mesh orientation will be reversed + // with respect to the natural mesh orientation (i.e. the orientation + // consistent with the orientation of the geometry). If `val' is false, the + // mesh is left as-is. inline void setReverse(const int dim, const int tag, const bool val = true) @@ -2119,9 +2290,9 @@ namespace gmsh { // Top-level functions } // namespace geo - namespace occ { // Internal per-model OpenCASCADE CAD kernel functions + namespace occ { // OpenCASCADE CAD kernel functions - // Add a geometrical point in the internal OpenCASCADE CAD representation, at + // Add a geometrical point in the OpenCASCADE CAD representation, at // coordinates (`x', `y', `z'). If `meshSize' is > 0, add a meshing // constraint at that point. If `tag' is positive, set the tag explicitly; // otherwise a new tag is selected automatically. Return the tag of the @@ -2566,11 +2737,11 @@ namespace gmsh { // Top-level functions outDimTags.resize(api_outDimTags_n_ / 2); for(size_t i = 0; i < api_outDimTags_n_ / 2; ++i){ outDimTags[i].first = api_outDimTags_[i * 2 + 0]; outDimTags[i].second = api_outDimTags_[i * 2 + 1]; } gmshFree(api_outDimTags_); } - // Extrude the geometrical entities `dimTags' by translation along (`dx', - // `dy', `dz'). Return extruded entities in `outDimTags'. If `numElements' is - // not empty, also extrude the mesh: the entries in `numElements' give the - // number of elements in each layer. If `height' is not empty, it provides - // the (cummulative) height of the different layers, normalized to 1. + // Extrude the model entities `dimTags' by translation along (`dx', `dy', + // `dz'). Return extruded entities in `outDimTags'. If `numElements' is not + // empty, also extrude the mesh: the entries in `numElements' give the number + // of elements in each layer. If `height' is not empty, it provides the + // (cumulative) height of the different layers, normalized to 1. inline void extrude(const gmsh::vectorpair & dimTags, const double dx, const double dy, @@ -2593,12 +2764,12 @@ namespace gmsh { // Top-level functions gmshFree(api_heights_); } - // Extrude the geometrical entities `dimTags' by rotation of `angle' radians - // around the axis of revolution defined by the point (`x', `y', `z') and the + // Extrude the model entities `dimTags' by rotation of `angle' radians around + // the axis of revolution defined by the point (`x', `y', `z') and the // direction (`ax', `ay', `az'). Return extruded entities in `outDimTags'. If // `numElements' is not empty, also extrude the mesh: the entries in // `numElements' give the number of elements in each layer. If `height' is - // not empty, it provides the (cummulative) height of the different layers, + // not empty, it provides the (cumulative) height of the different layers, // normalized to 1. inline void revolve(const gmsh::vectorpair & dimTags, const double x, @@ -2698,7 +2869,7 @@ namespace gmsh { // Top-level functions // Compute the boolean union (the fusion) of the entities `objectDimTags' and // `toolDimTags'. Return the resulting entities in `outDimTags'. If `tag' is - // positive, try to set the tag explicitly (ony valid if the boolean + // positive, try to set the tag explicitly (only valid if the boolean // operation results in a single entity). Remove the object if `removeObject' // is set. Remove the tool if `removeTool' is set. inline void fuse(const gmsh::vectorpair & objectDimTags, @@ -2724,7 +2895,7 @@ namespace gmsh { // Top-level functions // Compute the boolean intersection (the common parts) of the entities // `objectDimTags' and `toolDimTags'. Return the resulting entities in - // `outDimTags'. If `tag' is positive, try to set the tag explicitly (ony + // `outDimTags'. If `tag' is positive, try to set the tag explicitly (only // valid if the boolean operation results in a single entity). Remove the // object if `removeObject' is set. Remove the tool if `removeTool' is set. inline void intersect(const gmsh::vectorpair & objectDimTags, @@ -2750,7 +2921,7 @@ namespace gmsh { // Top-level functions // Compute the boolean difference between the entities `objectDimTags' and // `toolDimTags'. Return the resulting entities in `outDimTags'. If `tag' is - // positive, try to set the tag explicitly (ony valid if the boolean + // positive, try to set the tag explicitly (only valid if the boolean // operation results in a single entity). Remove the object if `removeObject' // is set. Remove the tool if `removeTool' is set. inline void cut(const gmsh::vectorpair & objectDimTags, @@ -2776,7 +2947,7 @@ namespace gmsh { // Top-level functions // Compute the boolean fragments (general fuse) of the entities // `objectDimTags' and `toolDimTags'. Return the resulting entities in - // `outDimTags'. If `tag' is positive, try to set the tag explicitly (ony + // `outDimTags'. If `tag' is positive, try to set the tag explicitly (only // valid if the boolean operation results in a single entity). Remove the // object if `removeObject' is set. Remove the tool if `removeTool' is set. inline void fragment(const gmsh::vectorpair & objectDimTags, @@ -2800,7 +2971,7 @@ namespace gmsh { // Top-level functions outDimTagsMap.resize(api_outDimTagsMap_nn_); for(size_t i = 0; i < api_outDimTagsMap_nn_; ++i){ outDimTagsMap[i].resize(api_outDimTagsMap_n_[i] / 2); for(size_t j = 0; j < api_outDimTagsMap_n_[i] / 2; ++j){ outDimTagsMap[i][j].first = api_outDimTagsMap_[i][j * 2 + 0]; outDimTagsMap[i][j].second = api_outDimTagsMap_[i][j * 2 + 1]; } gmshFree(api_outDimTagsMap_[i]); } gmshFree(api_outDimTagsMap_); gmshFree(api_outDimTagsMap_n_); } - // Translate the geometrical entities `dimTags' along (`dx', `dy', `dz'). + // Translate the model entities `dimTags' along (`dx', `dy', `dz'). inline void translate(const gmsh::vectorpair & dimTags, const double dx, const double dy, @@ -2813,9 +2984,9 @@ namespace gmsh { // Top-level functions gmshFree(api_dimTags_); } - // Rotate the geometrical entities `dimTags' of `angle' radians around the - // axis of revolution defined by the point (`x', `y', `z') and the direction - // (`ax', `ay', `az'). + // Rotate the model entities `dimTags' of `angle' radians around the axis of + // revolution defined by the point (`x', `y', `z') and the direction (`ax', + // `ay', `az'). inline void rotate(const gmsh::vectorpair & dimTags, const double x, const double y, @@ -2832,9 +3003,9 @@ namespace gmsh { // Top-level functions gmshFree(api_dimTags_); } - // Scale the geometrical entities `dimTag' by factors `a', `b' and `c' along - // the three coordinate axes; use (`x', `y', `z') as the center of the - // homothetic transformation. + // Scale the model entities `dimTag' by factors `a', `b' and `c' along the + // three coordinate axes; use (`x', `y', `z') as the center of the homothetic + // transformation. inline void dilate(const gmsh::vectorpair & dimTags, const double x, const double y, @@ -2850,7 +3021,7 @@ namespace gmsh { // Top-level functions gmshFree(api_dimTags_); } - // Apply a symmetry transformation to the geometrical entities `dimTag', with + // Apply a symmetry transformation to the model entities `dimTag', with // respect to the plane of equation `a' * x + `b' * y + `c' * z + `d' = 0. inline void symmetrize(const gmsh::vectorpair & dimTags, const double a, @@ -2867,7 +3038,7 @@ namespace gmsh { // Top-level functions // Apply a general affine transformation matrix `a' (16 entries of a 4x4 // matrix, by row; only the 12 first can be provided for convenience) to the - // geometrical entities `dimTag'. + // model entities `dimTag'. inline void affineTransform(const gmsh::vectorpair & dimTags, const std::vector<double> & a) { @@ -2937,8 +3108,8 @@ namespace gmsh { // Top-level functions // OpenCASCADE `TopoDS_Shape' object (passed as a pointer to void). The // imported entities are returned in `outDimTags'. If the optional argument // `highestDimOnly' is set, only import the highest dimensional entities in - // `shape'. Warning: this function is unsafe, as providing an invalid pointer - // will lead to undefined behavior. + // `shape'. For C and C++ only. Warning: this function is unsafe, as + // providing an invalid pointer will lead to undefined behavior. inline void importShapesNativePointer(const void * shape, gmsh::vectorpair & outDimTags, const bool highestDimOnly = true) @@ -2950,8 +3121,8 @@ namespace gmsh { // Top-level functions outDimTags.resize(api_outDimTags_n_ / 2); for(size_t i = 0; i < api_outDimTags_n_ / 2; ++i){ outDimTags[i].first = api_outDimTags_[i * 2 + 0]; outDimTags[i].second = api_outDimTags_[i * 2 + 1]; } gmshFree(api_outDimTags_); } - // Set a mesh size constraint on the geometrical entities `dimTags'. - // Currently only entities of dimension 0 (points) are handled. + // Set a mesh size constraint on the model entities `dimTags'. Currently only + // entities of dimension 0 (points) are handled. inline void setMeshSize(const gmsh::vectorpair & dimTags, const double size) { @@ -2962,10 +3133,46 @@ namespace gmsh { // Top-level functions gmshFree(api_dimTags_); } - // Synchronize the internal OpenCASCADE CAD representation with the current - // Gmsh model. This can be called at any time, but since it involves a non - // trivial amount of processing, the number of synchronization points should - // normally be minimized. + // Get the mass of the model entity of dimension `dim' and tag `tag'. + inline void getMass(const int dim, + const int tag, + double & mass) + { + int ierr = 0; + gmshModelOccGetMass(dim, tag, &mass, &ierr); + if(ierr) throw ierr; + } + + // Get the center of mass of the model entity of dimension `dim' and tag + // `tag'. + inline void getCenterOfMass(const int dim, + const int tag, + double & x, + double & y, + double & z) + { + int ierr = 0; + gmshModelOccGetCenterOfMass(dim, tag, &x, &y, &z, &ierr); + if(ierr) throw ierr; + } + + // Get the matrix of inertia (by row) of the model entity of dimension `dim' + // and tag `tag'. + inline void getMatrixOfInertia(const int dim, + const int tag, + std::vector<double> & mat) + { + int ierr = 0; + double *api_mat_; size_t api_mat_n_; + gmshModelOccGetMatrixOfInertia(dim, tag, &api_mat_, &api_mat_n_, &ierr); + if(ierr) throw ierr; + mat.assign(api_mat_, api_mat_ + api_mat_n_); gmshFree(api_mat_); + } + + // Synchronize the OpenCASCADE CAD representation with the current Gmsh + // model. This can be called at any time, but since it involves a non trivial + // amount of processing, the number of synchronization points should normally + // be minimized. inline void synchronize() { int ierr = 0; @@ -3109,6 +3316,42 @@ namespace gmsh { // Top-level functions data.resize(api_data_nn_); for(size_t i = 0; i < api_data_nn_; ++i){ data[i].assign(api_data_[i], api_data_[i] + api_data_n_[i]); gmshFree(api_data_[i]); } gmshFree(api_data_); gmshFree(api_data_n_); } + // Add a post-processing view as an `alias' of the reference view with tag + // `refTag'. If `copyOptions' is set, copy the options of the reference view. + // If `tag' is positive use it (and remove the view with that tag if it already + // exists), otherwise associate a new tag. Return the view tag. + inline int addAlias(const int refTag, + const bool copyOptions = false, + const int tag = -1) + { + int ierr = 0; + int result_api_ = gmshViewAddAlias(refTag, (int)copyOptions, tag, &ierr); + if(ierr) throw ierr; + return result_api_; + } + + // Copy the options from the view with tag `refTag' to the view with tag `tag'. + inline void copyOptions(const int refTag, + const int tag) + { + int ierr = 0; + gmshViewCopyOptions(refTag, tag, &ierr); + if(ierr) throw ierr; + } + + // Combine elements (if `what' == "elements") or steps (if `what' == "steps") + // of all views (`how' == "all"), all visible views (`how' == "visible") or all + // views having the same name (`how' == "name"). Remove original views if + // `remove' is set. + inline void combine(const std::string & what, + const std::string & how, + const bool remove = false) + { + int ierr = 0; + gmshViewCombine(what.c_str(), how.c_str(), (int)remove, &ierr); + if(ierr) throw ierr; + } + // Probe the view `tag' for its `value' at point (`x', `y', `z'). Return only // the value at step `step' is `step' is positive. Return only values with // `numComp' if `numComp' is positive. Return the gradient of the `value' if @@ -3199,9 +3442,9 @@ namespace gmsh { // Top-level functions } // namespace graphics - namespace fltk { // Fltk graphical user interface functions + namespace fltk { // FLTK graphical user interface functions - // Create the Fltk graphical user interface. Can only be called in the main + // Create the FLTK graphical user interface. Can only be called in the main // thread. inline void initialize() { @@ -3399,7 +3642,7 @@ namespace gmsh { // Top-level functions } // namespace onelab - namespace logger { // Message logger functions + namespace logger { // Information logging functions // Write a `message'. `level' can be "info", "warning" or "error". inline void write(const std::string & message, diff --git a/api/gmsh.jl b/api/gmsh.jl index 390e729a89d9a7b8d1a181170054d5a41f251599..5472fa687683b8fb3ddc8c587477f7200f4c8b13 100644 --- a/api/gmsh.jl +++ b/api/gmsh.jl @@ -3,7 +3,7 @@ # See the LICENSE.txt file for license information. Please report all # issues on https://gitlab.onelab.info/gmsh/gmsh/issues. -# This file defines the Gmsh Julia API (v4.2). +# This file defines the Gmsh Julia API (v4.4). # # Do not edit it directly: it is automatically generated by `api/gen.py'. # @@ -17,11 +17,11 @@ Top-level functions """ module gmsh -const GMSH_API_VERSION = "4.2" +const GMSH_API_VERSION = "4.4" const GMSH_API_VERSION_MAJOR = 4 -const GMSH_API_VERSION_MINOR = 2 +const GMSH_API_VERSION_MINOR = 4 const libdir = dirname(@__FILE__) -const libname = Sys.iswindows() ? "gmsh-4.2" : "libgmsh" +const libname = Sys.iswindows() ? "gmsh-4.4" : "libgmsh" import Libdl const lib = Libdl.find_library([libname], [libdir]) @@ -36,7 +36,7 @@ and gmsh-options). """ function initialize(argv = Vector{String}(), readConfigFiles = true) ierr = Ref{Cint}() - ccall((:gmshInitialize, lib), Nothing, + ccall((:gmshInitialize, lib), Cvoid, (Cint, Ptr{Ptr{Cchar}}, Cint, Ptr{Cint}), length(argv), argv, readConfigFiles, ierr) ierr[] != 0 && error("gmshInitialize returned non-zero error code: $(ierr[])") @@ -50,7 +50,7 @@ Finalize Gmsh. This must be called when you are done using the Gmsh API. """ function finalize() ierr = Ref{Cint}() - ccall((:gmshFinalize, lib), Nothing, + ccall((:gmshFinalize, lib), Cvoid, (Ptr{Cint},), ierr) ierr[] != 0 && error("gmshFinalize returned non-zero error code: $(ierr[])") @@ -61,11 +61,12 @@ end gmsh.open(fileName) Open a file. Equivalent to the `File->Open` menu in the Gmsh app. Handling of -the file depends on its extension and/or its contents. +the file depends on its extension and/or its contents: opening a file with model +data will create a new model. """ function open(fileName) ierr = Ref{Cint}() - ccall((:gmshOpen, lib), Nothing, + ccall((:gmshOpen, lib), Cvoid, (Ptr{Cchar}, Ptr{Cint}), fileName, ierr) ierr[] != 0 && error("gmshOpen returned non-zero error code: $(ierr[])") @@ -76,11 +77,12 @@ end gmsh.merge(fileName) Merge a file. Equivalent to the `File->Merge` menu in the Gmsh app. Handling of -the file depends on its extension and/or its contents. +the file depends on its extension and/or its contents. Merging a file with model +data will add the data to the current model. """ function merge(fileName) ierr = Ref{Cint}() - ccall((:gmshMerge, lib), Nothing, + ccall((:gmshMerge, lib), Cvoid, (Ptr{Cchar}, Ptr{Cint}), fileName, ierr) ierr[] != 0 && error("gmshMerge returned non-zero error code: $(ierr[])") @@ -94,7 +96,7 @@ Write a file. The export format is determined by the file extension. """ function write(fileName) ierr = Ref{Cint}() - ccall((:gmshWrite, lib), Nothing, + ccall((:gmshWrite, lib), Cvoid, (Ptr{Cchar}, Ptr{Cint}), fileName, ierr) ierr[] != 0 && error("gmshWrite returned non-zero error code: $(ierr[])") @@ -108,7 +110,7 @@ Clear all loaded models and post-processing data, and add a new empty model. """ function clear() ierr = Ref{Cint}() - ccall((:gmshClear, lib), Nothing, + ccall((:gmshClear, lib), Cvoid, (Ptr{Cint},), ierr) ierr[] != 0 && error("gmshClear returned non-zero error code: $(ierr[])") @@ -118,7 +120,7 @@ end """ module gmsh.option -Global option handling functions +Option handling functions """ module option @@ -133,7 +135,7 @@ reference manual. """ function setNumber(name, value) ierr = Ref{Cint}() - ccall((:gmshOptionSetNumber, gmsh.lib), Nothing, + ccall((:gmshOptionSetNumber, gmsh.lib), Cvoid, (Ptr{Cchar}, Cdouble, Ptr{Cint}), name, value, ierr) ierr[] != 0 && error("gmshOptionSetNumber returned non-zero error code: $(ierr[])") @@ -152,7 +154,7 @@ Return `value`. function getNumber(name) api_value_ = Ref{Cdouble}() ierr = Ref{Cint}() - ccall((:gmshOptionGetNumber, gmsh.lib), Nothing, + ccall((:gmshOptionGetNumber, gmsh.lib), Cvoid, (Ptr{Cchar}, Ptr{Cdouble}, Ptr{Cint}), name, api_value_, ierr) ierr[] != 0 && error("gmshOptionGetNumber returned non-zero error code: $(ierr[])") @@ -168,7 +170,7 @@ reference manual. """ function setString(name, value) ierr = Ref{Cint}() - ccall((:gmshOptionSetString, gmsh.lib), Nothing, + ccall((:gmshOptionSetString, gmsh.lib), Cvoid, (Ptr{Cchar}, Ptr{Cchar}, Ptr{Cint}), name, value, ierr) ierr[] != 0 && error("gmshOptionSetString returned non-zero error code: $(ierr[])") @@ -187,7 +189,7 @@ Return `value`. function getString(name) api_value_ = Ref{Ptr{Cchar}}() ierr = Ref{Cint}() - ccall((:gmshOptionGetString, gmsh.lib), Nothing, + ccall((:gmshOptionGetString, gmsh.lib), Cvoid, (Ptr{Cchar}, Ptr{Ptr{Cchar}}, Ptr{Cint}), name, api_value_, ierr) ierr[] != 0 && error("gmshOptionGetString returned non-zero error code: $(ierr[])") @@ -195,12 +197,53 @@ function getString(name) return value end +""" + gmsh.option.setColor(name, r, g, b, a = 0) + +Set a color option to the RGBA value (`r`, `g`, `b`, `a`), where where `r`, `g`, +`b` and `a` should be integers between 0 and 255. `name` is of the form +"category.option" or "category[num].option". Available categories and options +are listed in the Gmsh reference manual, with the "Color." middle string +removed. +""" +function setColor(name, r, g, b, a = 0) + ierr = Ref{Cint}() + ccall((:gmshOptionSetColor, gmsh.lib), Cvoid, + (Ptr{Cchar}, Cint, Cint, Cint, Cint, Ptr{Cint}), + name, r, g, b, a, ierr) + ierr[] != 0 && error("gmshOptionSetColor returned non-zero error code: $(ierr[])") + return nothing +end + +""" + gmsh.option.getColor(name) + +Get the `r`, `g`, `b`, `a` value of a color option. `name` is of the form +"category.option" or "category[num].option". Available categories and options +are listed in the Gmsh reference manual, with the "Color." middle string +removed. + +Return `r`, `g`, `b`, `a`. +""" +function getColor(name) + api_r_ = Ref{Cint}() + api_g_ = Ref{Cint}() + api_b_ = Ref{Cint}() + api_a_ = Ref{Cint}() + ierr = Ref{Cint}() + ccall((:gmshOptionGetColor, gmsh.lib), Cvoid, + (Ptr{Cchar}, Ptr{Cint}, Ptr{Cint}, Ptr{Cint}, Ptr{Cint}, Ptr{Cint}), + name, api_r_, api_g_, api_b_, api_a_, ierr) + ierr[] != 0 && error("gmshOptionGetColor returned non-zero error code: $(ierr[])") + return api_r_[], api_g_[], api_b_[], api_a_[] +end + end # end of module option """ module gmsh.model -Per-model functions +Model functions """ module model @@ -213,7 +256,7 @@ Add a new model, with name `name`, and set it as the current model. """ function add(name) ierr = Ref{Cint}() - ccall((:gmshModelAdd, gmsh.lib), Nothing, + ccall((:gmshModelAdd, gmsh.lib), Cvoid, (Ptr{Cchar}, Ptr{Cint}), name, ierr) ierr[] != 0 && error("gmshModelAdd returned non-zero error code: $(ierr[])") @@ -227,7 +270,7 @@ Remove the current model. """ function remove() ierr = Ref{Cint}() - ccall((:gmshModelRemove, gmsh.lib), Nothing, + ccall((:gmshModelRemove, gmsh.lib), Cvoid, (Ptr{Cint},), ierr) ierr[] != 0 && error("gmshModelRemove returned non-zero error code: $(ierr[])") @@ -245,7 +288,7 @@ function list() api_names_ = Ref{Ptr{Ptr{Cchar}}}() api_names_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelList, gmsh.lib), Nothing, + ccall((:gmshModelList, gmsh.lib), Cvoid, (Ptr{Ptr{Ptr{Cchar}}}, Ptr{Csize_t}, Ptr{Cint}), api_names_, api_names_n_, ierr) ierr[] != 0 && error("gmshModelList returned non-zero error code: $(ierr[])") @@ -262,7 +305,7 @@ same name, select the one that was added first. """ function setCurrent(name) ierr = Ref{Cint}() - ccall((:gmshModelSetCurrent, gmsh.lib), Nothing, + ccall((:gmshModelSetCurrent, gmsh.lib), Cvoid, (Ptr{Cchar}, Ptr{Cint}), name, ierr) ierr[] != 0 && error("gmshModelSetCurrent returned non-zero error code: $(ierr[])") @@ -272,9 +315,9 @@ end """ gmsh.model.getEntities(dim = -1) -Get all the (elementary) geometrical entities in the current model. If `dim` is ->= 0, return only the entities of the specified dimension (e.g. points if `dim` -== 0). The entities are returned as a vector of (dim, tag) integer pairs. +Get all the entities in the current model. If `dim` is >= 0, return only the +entities of the specified dimension (e.g. points if `dim` == 0). The entities +are returned as a vector of (dim, tag) integer pairs. Return `dimTags`. """ @@ -282,7 +325,7 @@ function getEntities(dim = -1) api_dimTags_ = Ref{Ptr{Cint}}() api_dimTags_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelGetEntities, gmsh.lib), Nothing, + ccall((:gmshModelGetEntities, gmsh.lib), Cvoid, (Ptr{Ptr{Cint}}, Ptr{Csize_t}, Cint, Ptr{Cint}), api_dimTags_, api_dimTags_n_, dim, ierr) ierr[] != 0 && error("gmshModelGetEntities returned non-zero error code: $(ierr[])") @@ -298,7 +341,7 @@ Set the name of the entity of dimension `dim` and tag `tag`. """ function setEntityName(dim, tag, name) ierr = Ref{Cint}() - ccall((:gmshModelSetEntityName, gmsh.lib), Nothing, + ccall((:gmshModelSetEntityName, gmsh.lib), Cvoid, (Cint, Cint, Ptr{Cchar}, Ptr{Cint}), dim, tag, name, ierr) ierr[] != 0 && error("gmshModelSetEntityName returned non-zero error code: $(ierr[])") @@ -315,7 +358,7 @@ Return `name`. function getEntityName(dim, tag) api_name_ = Ref{Ptr{Cchar}}() ierr = Ref{Cint}() - ccall((:gmshModelGetEntityName, gmsh.lib), Nothing, + ccall((:gmshModelGetEntityName, gmsh.lib), Cvoid, (Cint, Cint, Ptr{Ptr{Cchar}}, Ptr{Cint}), dim, tag, api_name_, ierr) ierr[] != 0 && error("gmshModelGetEntityName returned non-zero error code: $(ierr[])") @@ -336,7 +379,7 @@ function getPhysicalGroups(dim = -1) api_dimTags_ = Ref{Ptr{Cint}}() api_dimTags_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelGetPhysicalGroups, gmsh.lib), Nothing, + ccall((:gmshModelGetPhysicalGroups, gmsh.lib), Cvoid, (Ptr{Ptr{Cint}}, Ptr{Csize_t}, Cint, Ptr{Cint}), api_dimTags_, api_dimTags_n_, dim, ierr) ierr[] != 0 && error("gmshModelGetPhysicalGroups returned non-zero error code: $(ierr[])") @@ -348,8 +391,8 @@ end """ gmsh.model.getEntitiesForPhysicalGroup(dim, tag) -Get the tags of the geometrical entities making up the physical group of -dimension `dim` and tag `tag`. +Get the tags of the model entities making up the physical group of dimension +`dim` and tag `tag`. Return `tags`. """ @@ -357,7 +400,7 @@ function getEntitiesForPhysicalGroup(dim, tag) api_tags_ = Ref{Ptr{Cint}}() api_tags_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelGetEntitiesForPhysicalGroup, gmsh.lib), Nothing, + ccall((:gmshModelGetEntitiesForPhysicalGroup, gmsh.lib), Cvoid, (Cint, Cint, Ptr{Ptr{Cint}}, Ptr{Csize_t}, Ptr{Cint}), dim, tag, api_tags_, api_tags_n_, ierr) ierr[] != 0 && error("gmshModelGetEntitiesForPhysicalGroup returned non-zero error code: $(ierr[])") @@ -368,7 +411,7 @@ end """ gmsh.model.getPhysicalGroupsForEntity(dim, tag) -Get the tags of the physical groups (if any) to which the geometrical entity of +Get the tags of the physical groups (if any) to which the model entity of dimension `dim` and tag `tag` belongs. Return `physicalTags`. @@ -377,7 +420,7 @@ function getPhysicalGroupsForEntity(dim, tag) api_physicalTags_ = Ref{Ptr{Cint}}() api_physicalTags_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelGetPhysicalGroupsForEntity, gmsh.lib), Nothing, + ccall((:gmshModelGetPhysicalGroupsForEntity, gmsh.lib), Cvoid, (Cint, Cint, Ptr{Ptr{Cint}}, Ptr{Csize_t}, Ptr{Cint}), dim, tag, api_physicalTags_, api_physicalTags_n_, ierr) ierr[] != 0 && error("gmshModelGetPhysicalGroupsForEntity returned non-zero error code: $(ierr[])") @@ -388,8 +431,8 @@ end """ gmsh.model.addPhysicalGroup(dim, tags, tag = -1) -Add a physical group of dimension `dim`, grouping the elementary entities with -tags `tags`. Return the tag of the physical group, equal to `tag` if `tag` is +Add a physical group of dimension `dim`, grouping the model entities with tags +`tags`. Return the tag of the physical group, equal to `tag` if `tag` is positive, or a new tag if `tag` < 0. Return an integer value. @@ -410,7 +453,7 @@ Set the name of the physical group of dimension `dim` and tag `tag`. """ function setPhysicalName(dim, tag, name) ierr = Ref{Cint}() - ccall((:gmshModelSetPhysicalName, gmsh.lib), Nothing, + ccall((:gmshModelSetPhysicalName, gmsh.lib), Cvoid, (Cint, Cint, Ptr{Cchar}, Ptr{Cint}), dim, tag, name, ierr) ierr[] != 0 && error("gmshModelSetPhysicalName returned non-zero error code: $(ierr[])") @@ -427,7 +470,7 @@ Return `name`. function getPhysicalName(dim, tag) api_name_ = Ref{Ptr{Cchar}}() ierr = Ref{Cint}() - ccall((:gmshModelGetPhysicalName, gmsh.lib), Nothing, + ccall((:gmshModelGetPhysicalName, gmsh.lib), Cvoid, (Cint, Cint, Ptr{Ptr{Cchar}}, Ptr{Cint}), dim, tag, api_name_, ierr) ierr[] != 0 && error("gmshModelGetPhysicalName returned non-zero error code: $(ierr[])") @@ -438,9 +481,9 @@ end """ gmsh.model.getBoundary(dimTags, combined = true, oriented = true, recursive = false) -Get the boundary of the geometrical entities `dimTags`. Return in `outDimTags` -the boundary of the individual entities (if `combined` is false) or the boundary -of the combined geometrical shape formed by all input entities (if `combined` is +Get the boundary of the model entities `dimTags`. Return in `outDimTags` the +boundary of the individual entities (if `combined` is false) or the boundary of +the combined geometrical shape formed by all input entities (if `combined` is true). Return tags multiplied by the sign of the boundary entity if `oriented` is true. Apply the boundary operator recursively down to dimension 0 (i.e. to points) if `recursive` is true. @@ -451,7 +494,7 @@ function getBoundary(dimTags, combined = true, oriented = true, recursive = fals api_outDimTags_ = Ref{Ptr{Cint}}() api_outDimTags_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelGetBoundary, gmsh.lib), Nothing, + ccall((:gmshModelGetBoundary, gmsh.lib), Cvoid, (Ptr{Cint}, Csize_t, Ptr{Ptr{Cint}}, Ptr{Csize_t}, Cint, Cint, Cint, Ptr{Cint}), convert(Vector{Cint}, collect(Cint, Iterators.flatten(dimTags))), 2 * length(dimTags), api_outDimTags_, api_outDimTags_n_, combined, oriented, recursive, ierr) ierr[] != 0 && error("gmshModelGetBoundary returned non-zero error code: $(ierr[])") @@ -463,9 +506,9 @@ end """ gmsh.model.getEntitiesInBoundingBox(xmin, ymin, zmin, xmax, ymax, zmax, dim = -1) -Get the (elementary) geometrical entities in the bounding box defined by the two -points (`xmin`, `ymin`, `zmin`) and (`xmax`, `ymax`, `zmax`). If `dim` is >= 0, -return only the entities of the specified dimension (e.g. points if `dim` == 0). +Get the model entities in the bounding box defined by the two points (`xmin`, +`ymin`, `zmin`) and (`xmax`, `ymax`, `zmax`). If `dim` is >= 0, return only the +entities of the specified dimension (e.g. points if `dim` == 0). Return `tags`. """ @@ -473,7 +516,7 @@ function getEntitiesInBoundingBox(xmin, ymin, zmin, xmax, ymax, zmax, dim = -1) api_tags_ = Ref{Ptr{Cint}}() api_tags_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelGetEntitiesInBoundingBox, gmsh.lib), Nothing, + ccall((:gmshModelGetEntitiesInBoundingBox, gmsh.lib), Cvoid, (Cdouble, Cdouble, Cdouble, Cdouble, Cdouble, Cdouble, Ptr{Ptr{Cint}}, Ptr{Csize_t}, Cint, Ptr{Cint}), xmin, ymin, zmin, xmax, ymax, zmax, api_tags_, api_tags_n_, dim, ierr) ierr[] != 0 && error("gmshModelGetEntitiesInBoundingBox returned non-zero error code: $(ierr[])") @@ -486,7 +529,8 @@ end gmsh.model.getBoundingBox(dim, tag) Get the bounding box (`xmin`, `ymin`, `zmin`), (`xmax`, `ymax`, `zmax`) of the -geometrical entity of dimension `dim` and tag `tag`. +model entity of dimension `dim` and tag `tag`. If `dim` and `tag` are negative, +get the bounding box of the whole model. Return `xmin`, `ymin`, `zmin`, `xmax`, `ymax`, `zmax`. """ @@ -498,7 +542,7 @@ function getBoundingBox(dim, tag) api_ymax_ = Ref{Cdouble}() api_zmax_ = Ref{Cdouble}() ierr = Ref{Cint}() - ccall((:gmshModelGetBoundingBox, gmsh.lib), Nothing, + ccall((:gmshModelGetBoundingBox, gmsh.lib), Cvoid, (Cint, Cint, Ptr{Cdouble}, Ptr{Cdouble}, Ptr{Cdouble}, Ptr{Cdouble}, Ptr{Cdouble}, Ptr{Cdouble}, Ptr{Cint}), dim, tag, api_xmin_, api_ymin_, api_zmin_, api_xmax_, api_ymax_, api_zmax_, ierr) ierr[] != 0 && error("gmshModelGetBoundingBox returned non-zero error code: $(ierr[])") @@ -524,10 +568,10 @@ end """ gmsh.model.addDiscreteEntity(dim, tag = -1, boundary = Cint[]) -Add a discrete geometrical entity (defined by a mesh) of dimension `dim` in the +Add a discrete model entity (defined by a mesh) of dimension `dim` in the current model. Return the tag of the new discrete entity, equal to `tag` if `tag` is positive, or a new tag if `tag` < 0. `boundary` specifies the tags of -the entities on the boundary of the discrete entity, if any. Specyfing +the entities on the boundary of the discrete entity, if any. Specifying `boundary` allows Gmsh to construct the topology of the overall model. Return an integer value. @@ -549,7 +593,7 @@ remove all the entities on their boundaries, down to dimension 0. """ function removeEntities(dimTags, recursive = false) ierr = Ref{Cint}() - ccall((:gmshModelRemoveEntities, gmsh.lib), Nothing, + ccall((:gmshModelRemoveEntities, gmsh.lib), Cvoid, (Ptr{Cint}, Csize_t, Cint, Ptr{Cint}), convert(Vector{Cint}, collect(Cint, Iterators.flatten(dimTags))), 2 * length(dimTags), recursive, ierr) ierr[] != 0 && error("gmshModelRemoveEntities returned non-zero error code: $(ierr[])") @@ -563,7 +607,7 @@ Remove the entity name `name` from the current model. """ function removeEntityName(name) ierr = Ref{Cint}() - ccall((:gmshModelRemoveEntityName, gmsh.lib), Nothing, + ccall((:gmshModelRemoveEntityName, gmsh.lib), Cvoid, (Ptr{Cchar}, Ptr{Cint}), name, ierr) ierr[] != 0 && error("gmshModelRemoveEntityName returned non-zero error code: $(ierr[])") @@ -578,7 +622,7 @@ empty, remove all groups. """ function removePhysicalGroups(dimTags = Tuple{Cint,Cint}[]) ierr = Ref{Cint}() - ccall((:gmshModelRemovePhysicalGroups, gmsh.lib), Nothing, + ccall((:gmshModelRemovePhysicalGroups, gmsh.lib), Cvoid, (Ptr{Cint}, Csize_t, Ptr{Cint}), convert(Vector{Cint}, collect(Cint, Iterators.flatten(dimTags))), 2 * length(dimTags), ierr) ierr[] != 0 && error("gmshModelRemovePhysicalGroups returned non-zero error code: $(ierr[])") @@ -592,7 +636,7 @@ Remove the physical name `name` from the current model. """ function removePhysicalName(name) ierr = Ref{Cint}() - ccall((:gmshModelRemovePhysicalName, gmsh.lib), Nothing, + ccall((:gmshModelRemovePhysicalName, gmsh.lib), Cvoid, (Ptr{Cchar}, Ptr{Cint}), name, ierr) ierr[] != 0 && error("gmshModelRemovePhysicalName returned non-zero error code: $(ierr[])") @@ -609,7 +653,7 @@ Return `entityType`. function getType(dim, tag) api_entityType_ = Ref{Ptr{Cchar}}() ierr = Ref{Cint}() - ccall((:gmshModelGetType, gmsh.lib), Nothing, + ccall((:gmshModelGetType, gmsh.lib), Cvoid, (Cint, Cint, Ptr{Ptr{Cchar}}, Ptr{Cint}), dim, tag, api_entityType_, ierr) ierr[] != 0 && error("gmshModelGetType returned non-zero error code: $(ierr[])") @@ -630,7 +674,7 @@ function getParent(dim, tag) api_parentDim_ = Ref{Cint}() api_parentTag_ = Ref{Cint}() ierr = Ref{Cint}() - ccall((:gmshModelGetParent, gmsh.lib), Nothing, + ccall((:gmshModelGetParent, gmsh.lib), Cvoid, (Cint, Cint, Ptr{Cint}, Ptr{Cint}, Ptr{Cint}), dim, tag, api_parentDim_, api_parentTag_, ierr) ierr[] != 0 && error("gmshModelGetParent returned non-zero error code: $(ierr[])") @@ -649,7 +693,7 @@ function getPartitions(dim, tag) api_partitions_ = Ref{Ptr{Cint}}() api_partitions_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelGetPartitions, gmsh.lib), Nothing, + ccall((:gmshModelGetPartitions, gmsh.lib), Cvoid, (Cint, Cint, Ptr{Ptr{Cint}}, Ptr{Csize_t}, Ptr{Cint}), dim, tag, api_partitions_, api_partitions_n_, ierr) ierr[] != 0 && error("gmshModelGetPartitions returned non-zero error code: $(ierr[])") @@ -674,9 +718,9 @@ function getValue(dim, tag, parametricCoord) api_points_ = Ref{Ptr{Cdouble}}() api_points_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelGetValue, gmsh.lib), Nothing, + ccall((:gmshModelGetValue, gmsh.lib), Cvoid, (Cint, Cint, Ptr{Cdouble}, Csize_t, Ptr{Ptr{Cdouble}}, Ptr{Csize_t}, Ptr{Cint}), - dim, tag, parametricCoord, length(parametricCoord), api_points_, api_points_n_, ierr) + dim, tag, convert(Vector{Cdouble}, parametricCoord), length(parametricCoord), api_points_, api_points_n_, ierr) ierr[] != 0 && error("gmshModelGetValue returned non-zero error code: $(ierr[])") points = unsafe_wrap(Array, api_points_[], api_points_n_[], own=true) return points @@ -701,9 +745,9 @@ function getDerivative(dim, tag, parametricCoord) api_derivatives_ = Ref{Ptr{Cdouble}}() api_derivatives_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelGetDerivative, gmsh.lib), Nothing, + ccall((:gmshModelGetDerivative, gmsh.lib), Cvoid, (Cint, Cint, Ptr{Cdouble}, Csize_t, Ptr{Ptr{Cdouble}}, Ptr{Csize_t}, Ptr{Cint}), - dim, tag, parametricCoord, length(parametricCoord), api_derivatives_, api_derivatives_n_, ierr) + dim, tag, convert(Vector{Cdouble}, parametricCoord), length(parametricCoord), api_derivatives_, api_derivatives_n_, ierr) ierr[] != 0 && error("gmshModelGetDerivative returned non-zero error code: $(ierr[])") derivatives = unsafe_wrap(Array, api_derivatives_[], api_derivatives_n_[], own=true) return derivatives @@ -724,9 +768,9 @@ function getCurvature(dim, tag, parametricCoord) api_curvatures_ = Ref{Ptr{Cdouble}}() api_curvatures_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelGetCurvature, gmsh.lib), Nothing, + ccall((:gmshModelGetCurvature, gmsh.lib), Cvoid, (Cint, Cint, Ptr{Cdouble}, Csize_t, Ptr{Ptr{Cdouble}}, Ptr{Csize_t}, Ptr{Cint}), - dim, tag, parametricCoord, length(parametricCoord), api_curvatures_, api_curvatures_n_, ierr) + dim, tag, convert(Vector{Cdouble}, parametricCoord), length(parametricCoord), api_curvatures_, api_curvatures_n_, ierr) ierr[] != 0 && error("gmshModelGetCurvature returned non-zero error code: $(ierr[])") curvatures = unsafe_wrap(Array, api_curvatures_[], api_curvatures_n_[], own=true) return curvatures @@ -752,9 +796,9 @@ function getPrincipalCurvatures(tag, parametricCoord) api_directionMin_ = Ref{Ptr{Cdouble}}() api_directionMin_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelGetPrincipalCurvatures, gmsh.lib), Nothing, + ccall((:gmshModelGetPrincipalCurvatures, gmsh.lib), Cvoid, (Cint, Ptr{Cdouble}, Csize_t, Ptr{Ptr{Cdouble}}, Ptr{Csize_t}, Ptr{Ptr{Cdouble}}, Ptr{Csize_t}, Ptr{Ptr{Cdouble}}, Ptr{Csize_t}, Ptr{Ptr{Cdouble}}, Ptr{Csize_t}, Ptr{Cint}), - tag, parametricCoord, length(parametricCoord), api_curvatureMax_, api_curvatureMax_n_, api_curvatureMin_, api_curvatureMin_n_, api_directionMax_, api_directionMax_n_, api_directionMin_, api_directionMin_n_, ierr) + tag, convert(Vector{Cdouble}, parametricCoord), length(parametricCoord), api_curvatureMax_, api_curvatureMax_n_, api_curvatureMin_, api_curvatureMin_n_, api_directionMax_, api_directionMax_n_, api_directionMin_, api_directionMin_n_, ierr) ierr[] != 0 && error("gmshModelGetPrincipalCurvatures returned non-zero error code: $(ierr[])") curvatureMax = unsafe_wrap(Array, api_curvatureMax_[], api_curvatureMax_n_[], own=true) curvatureMin = unsafe_wrap(Array, api_curvatureMin_[], api_curvatureMin_n_[], own=true) @@ -777,9 +821,9 @@ function getNormal(tag, parametricCoord) api_normals_ = Ref{Ptr{Cdouble}}() api_normals_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelGetNormal, gmsh.lib), Nothing, + ccall((:gmshModelGetNormal, gmsh.lib), Cvoid, (Cint, Ptr{Cdouble}, Csize_t, Ptr{Ptr{Cdouble}}, Ptr{Csize_t}, Ptr{Cint}), - tag, parametricCoord, length(parametricCoord), api_normals_, api_normals_n_, ierr) + tag, convert(Vector{Cdouble}, parametricCoord), length(parametricCoord), api_normals_, api_normals_n_, ierr) ierr[] != 0 && error("gmshModelGetNormal returned non-zero error code: $(ierr[])") normals = unsafe_wrap(Array, api_normals_[], api_normals_n_[], own=true) return normals @@ -788,12 +832,12 @@ end """ gmsh.model.setVisibility(dimTags, value, recursive = false) -Set the visibility of the geometrical entities `dimTags` to `value`. Apply the +Set the visibility of the model entities `dimTags` to `value`. Apply the visibility setting recursively if `recursive` is true. """ function setVisibility(dimTags, value, recursive = false) ierr = Ref{Cint}() - ccall((:gmshModelSetVisibility, gmsh.lib), Nothing, + ccall((:gmshModelSetVisibility, gmsh.lib), Cvoid, (Ptr{Cint}, Csize_t, Cint, Cint, Ptr{Cint}), convert(Vector{Cint}, collect(Cint, Iterators.flatten(dimTags))), 2 * length(dimTags), value, recursive, ierr) ierr[] != 0 && error("gmshModelSetVisibility returned non-zero error code: $(ierr[])") @@ -803,14 +847,14 @@ end """ gmsh.model.getVisibility(dim, tag) -Get the visibility of the geometrical entity of dimension `dim` and tag `tag`. +Get the visibility of the model entity of dimension `dim` and tag `tag`. Return `value`. """ function getVisibility(dim, tag) api_value_ = Ref{Cint}() ierr = Ref{Cint}() - ccall((:gmshModelGetVisibility, gmsh.lib), Nothing, + ccall((:gmshModelGetVisibility, gmsh.lib), Cvoid, (Cint, Cint, Ptr{Cint}, Ptr{Cint}), dim, tag, api_value_, ierr) ierr[] != 0 && error("gmshModelGetVisibility returned non-zero error code: $(ierr[])") @@ -820,13 +864,13 @@ end """ gmsh.model.setColor(dimTags, r, g, b, a = 0, recursive = false) -Set the color of the geometrical entities `dimTags` to the RGBA value (`r`, `g`, -`b`, `a`), where `r`, `g`, `b` and `a` should be integers between 0 and 255. -Apply the color setting recursively if `recursive` is true. +Set the color of the model entities `dimTags` to the RGBA value (`r`, `g`, `b`, +`a`), where `r`, `g`, `b` and `a` should be integers between 0 and 255. Apply +the color setting recursively if `recursive` is true. """ function setColor(dimTags, r, g, b, a = 0, recursive = false) ierr = Ref{Cint}() - ccall((:gmshModelSetColor, gmsh.lib), Nothing, + ccall((:gmshModelSetColor, gmsh.lib), Cvoid, (Ptr{Cint}, Csize_t, Cint, Cint, Cint, Cint, Cint, Ptr{Cint}), convert(Vector{Cint}, collect(Cint, Iterators.flatten(dimTags))), 2 * length(dimTags), r, g, b, a, recursive, ierr) ierr[] != 0 && error("gmshModelSetColor returned non-zero error code: $(ierr[])") @@ -836,7 +880,7 @@ end """ gmsh.model.getColor(dim, tag) -Get the color of the geometrical entity of dimension `dim` and tag `tag`. +Get the color of the model entity of dimension `dim` and tag `tag`. Return `r`, `g`, `b`, `a`. """ @@ -846,17 +890,31 @@ function getColor(dim, tag) api_b_ = Ref{Cint}() api_a_ = Ref{Cint}() ierr = Ref{Cint}() - ccall((:gmshModelGetColor, gmsh.lib), Nothing, + ccall((:gmshModelGetColor, gmsh.lib), Cvoid, (Cint, Cint, Ptr{Cint}, Ptr{Cint}, Ptr{Cint}, Ptr{Cint}, Ptr{Cint}), dim, tag, api_r_, api_g_, api_b_, api_a_, ierr) ierr[] != 0 && error("gmshModelGetColor returned non-zero error code: $(ierr[])") return api_r_[], api_g_[], api_b_[], api_a_[] end +""" + gmsh.model.setCoordinates(tag, x, y, z) + +Set the `x`, `y`, `z` coordinates of a geometrical point. +""" +function setCoordinates(tag, x, y, z) + ierr = Ref{Cint}() + ccall((:gmshModelSetCoordinates, gmsh.lib), Cvoid, + (Cint, Cdouble, Cdouble, Cdouble, Ptr{Cint}), + tag, x, y, z, ierr) + ierr[] != 0 && error("gmshModelSetCoordinates returned non-zero error code: $(ierr[])") + return nothing +end + """ module gmsh.model.mesh -Per-model meshing functions +Mesh functions """ module mesh @@ -869,7 +927,7 @@ Generate a mesh of the current model, up to dimension `dim` (0, 1, 2 or 3). """ function generate(dim = 3) ierr = Ref{Cint}() - ccall((:gmshModelMeshGenerate, gmsh.lib), Nothing, + ccall((:gmshModelMeshGenerate, gmsh.lib), Cvoid, (Cint, Ptr{Cint}), dim, ierr) ierr[] != 0 && error("gmshModelMeshGenerate returned non-zero error code: $(ierr[])") @@ -883,7 +941,7 @@ Partition the mesh of the current model into `numPart` partitions. """ function partition(numPart) ierr = Ref{Cint}() - ccall((:gmshModelMeshPartition, gmsh.lib), Nothing, + ccall((:gmshModelMeshPartition, gmsh.lib), Cvoid, (Cint, Ptr{Cint}), numPart, ierr) ierr[] != 0 && error("gmshModelMeshPartition returned non-zero error code: $(ierr[])") @@ -897,13 +955,44 @@ Unpartition the mesh of the current model. """ function unpartition() ierr = Ref{Cint}() - ccall((:gmshModelMeshUnpartition, gmsh.lib), Nothing, + ccall((:gmshModelMeshUnpartition, gmsh.lib), Cvoid, (Ptr{Cint},), ierr) ierr[] != 0 && error("gmshModelMeshUnpartition returned non-zero error code: $(ierr[])") return nothing end +""" + gmsh.model.mesh.optimize(method) + +Optimize the mesh of the current model using `method` (empty for default +tetrahedral mesh optimizer, "Netgen" for Netgen optimizer, "HighOrder" for +direct high-order mesh optimizer, "HighOrderElastic" for high-order elastic +smoother). +""" +function optimize(method) + ierr = Ref{Cint}() + ccall((:gmshModelMeshOptimize, gmsh.lib), Cvoid, + (Ptr{Cchar}, Ptr{Cint}), + method, ierr) + ierr[] != 0 && error("gmshModelMeshOptimize returned non-zero error code: $(ierr[])") + return nothing +end + +""" + gmsh.model.mesh.recombine() + +Recombine the mesh of the current model. +""" +function recombine() + ierr = Ref{Cint}() + ccall((:gmshModelMeshRecombine, gmsh.lib), Cvoid, + (Ptr{Cint},), + ierr) + ierr[] != 0 && error("gmshModelMeshRecombine returned non-zero error code: $(ierr[])") + return nothing +end + """ gmsh.model.mesh.refine() @@ -911,13 +1000,27 @@ Refine the mesh of the current model by uniformly splitting the elements. """ function refine() ierr = Ref{Cint}() - ccall((:gmshModelMeshRefine, gmsh.lib), Nothing, + ccall((:gmshModelMeshRefine, gmsh.lib), Cvoid, (Ptr{Cint},), ierr) ierr[] != 0 && error("gmshModelMeshRefine returned non-zero error code: $(ierr[])") return nothing end +""" + gmsh.model.mesh.smooth() + +Smooth the mesh of the current model. +""" +function smooth() + ierr = Ref{Cint}() + ccall((:gmshModelMeshSmooth, gmsh.lib), Cvoid, + (Ptr{Cint},), + ierr) + ierr[] != 0 && error("gmshModelMeshSmooth returned non-zero error code: $(ierr[])") + return nothing +end + """ gmsh.model.mesh.setOrder(order) @@ -925,7 +1028,7 @@ Set the order of the elements in the mesh of the current model to `order`. """ function setOrder(order) ierr = Ref{Cint}() - ccall((:gmshModelMeshSetOrder, gmsh.lib), Nothing, + ccall((:gmshModelMeshSetOrder, gmsh.lib), Cvoid, (Cint, Ptr{Cint}), order, ierr) ierr[] != 0 && error("gmshModelMeshSetOrder returned non-zero error code: $(ierr[])") @@ -944,7 +1047,7 @@ function getLastEntityError() api_dimTags_ = Ref{Ptr{Cint}}() api_dimTags_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelMeshGetLastEntityError, gmsh.lib), Nothing, + ccall((:gmshModelMeshGetLastEntityError, gmsh.lib), Cvoid, (Ptr{Ptr{Cint}}, Ptr{Csize_t}, Ptr{Cint}), api_dimTags_, api_dimTags_n_, ierr) ierr[] != 0 && error("gmshModelMeshGetLastEntityError returned non-zero error code: $(ierr[])") @@ -965,7 +1068,7 @@ function getLastNodeError() api_nodeTags_ = Ref{Ptr{Csize_t}}() api_nodeTags_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelMeshGetLastNodeError, gmsh.lib), Nothing, + ccall((:gmshModelMeshGetLastNodeError, gmsh.lib), Cvoid, (Ptr{Ptr{Csize_t}}, Ptr{Csize_t}, Ptr{Cint}), api_nodeTags_, api_nodeTags_n_, ierr) ierr[] != 0 && error("gmshModelMeshGetLastNodeError returned non-zero error code: $(ierr[])") @@ -974,24 +1077,24 @@ function getLastNodeError() end """ - gmsh.model.mesh.getNodes(dim = -1, tag = -1, includeBoundary = false) + gmsh.model.mesh.getNodes(dim = -1, tag = -1, includeBoundary = false, returnParametricCoord = true) Get the nodes classified on the entity of dimension `dim` and tag `tag`. If `tag` < 0, get the nodes for all entities of dimension `dim`. If `dim` and `tag` are negative, get all the nodes in the mesh. `nodeTags` contains the node tags (their unique, strictly positive identification numbers). `coord` is a vector of length 3 times the length of `nodeTags` that contains the x, y, z coordinates of -the nodes, concatenated: [n1x, n1y, n1z, n2x, ...]. If `dim` >= 0, -`parametricCoord` contains the parametric coordinates ([u1, u2, ...] or [u1, v1, -u2, ...]) of the nodes, if available. The length of `parametricCoord` can be 0 -or `dim` times the length of `nodeTags`. If `includeBoundary` is set, also -return the nodes classified on the boundary of the entity (wich will be -reparametrized on the entity if `dim` >= 0 in order to compute their parametric -coordinates). +the nodes, concatenated: [n1x, n1y, n1z, n2x, ...]. If `dim` >= 0 and +`returnParamtricCoord` is set, `parametricCoord` contains the parametric +coordinates ([u1, u2, ...] or [u1, v1, u2, ...]) of the nodes, if available. The +length of `parametricCoord` can be 0 or `dim` times the length of `nodeTags`. If +`includeBoundary` is set, also return the nodes classified on the boundary of +the entity (which will be reparametrized on the entity if `dim` >= 0 in order to +compute their parametric coordinates). Return `nodeTags`, `coord`, `parametricCoord`. """ -function getNodes(dim = -1, tag = -1, includeBoundary = false) +function getNodes(dim = -1, tag = -1, includeBoundary = false, returnParametricCoord = true) api_nodeTags_ = Ref{Ptr{Csize_t}}() api_nodeTags_n_ = Ref{Csize_t}() api_coord_ = Ref{Ptr{Cdouble}}() @@ -999,9 +1102,9 @@ function getNodes(dim = -1, tag = -1, includeBoundary = false) api_parametricCoord_ = Ref{Ptr{Cdouble}}() api_parametricCoord_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelMeshGetNodes, gmsh.lib), Nothing, - (Ptr{Ptr{Csize_t}}, Ptr{Csize_t}, Ptr{Ptr{Cdouble}}, Ptr{Csize_t}, Ptr{Ptr{Cdouble}}, Ptr{Csize_t}, Cint, Cint, Cint, Ptr{Cint}), - api_nodeTags_, api_nodeTags_n_, api_coord_, api_coord_n_, api_parametricCoord_, api_parametricCoord_n_, dim, tag, includeBoundary, ierr) + ccall((:gmshModelMeshGetNodes, gmsh.lib), Cvoid, + (Ptr{Ptr{Csize_t}}, Ptr{Csize_t}, Ptr{Ptr{Cdouble}}, Ptr{Csize_t}, Ptr{Ptr{Cdouble}}, Ptr{Csize_t}, Cint, Cint, Cint, Cint, Ptr{Cint}), + api_nodeTags_, api_nodeTags_n_, api_coord_, api_coord_n_, api_parametricCoord_, api_parametricCoord_n_, dim, tag, includeBoundary, returnParametricCoord, ierr) ierr[] != 0 && error("gmshModelMeshGetNodes returned non-zero error code: $(ierr[])") nodeTags = unsafe_wrap(Array, api_nodeTags_[], api_nodeTags_n_[], own=true) coord = unsafe_wrap(Array, api_coord_[], api_coord_n_[], own=true) @@ -1016,7 +1119,7 @@ Get the coordinates and the parametric coordinates (if any) of the node with tag `tag`. This is a sometimes useful but inefficient way of accessing nodes, as it relies on a cache stored in the model. For large meshes all the nodes in the model should be numbered in a continuous sequence of tags from 1 to N to -maintain reasonnable performance (in this case the internal cache is based on a +maintain reasonable performance (in this case the internal cache is based on a vector; otherwise it uses a map). Return `coord`, `parametricCoord`. @@ -1027,7 +1130,7 @@ function getNode(nodeTag) api_parametricCoord_ = Ref{Ptr{Cdouble}}() api_parametricCoord_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelMeshGetNode, gmsh.lib), Nothing, + ccall((:gmshModelMeshGetNode, gmsh.lib), Cvoid, (Csize_t, Ptr{Ptr{Cdouble}}, Ptr{Csize_t}, Ptr{Ptr{Cdouble}}, Ptr{Csize_t}, Ptr{Cint}), nodeTag, api_coord_, api_coord_n_, api_parametricCoord_, api_parametricCoord_n_, ierr) ierr[] != 0 && error("gmshModelMeshGetNode returned non-zero error code: $(ierr[])") @@ -1043,7 +1146,7 @@ Rebuild the node cache. """ function rebuildNodeCache(onlyIfNecessary = true) ierr = Ref{Cint}() - ccall((:gmshModelMeshRebuildNodeCache, gmsh.lib), Nothing, + ccall((:gmshModelMeshRebuildNodeCache, gmsh.lib), Cvoid, (Cint, Ptr{Cint}), onlyIfNecessary, ierr) ierr[] != 0 && error("gmshModelMeshRebuildNodeCache returned non-zero error code: $(ierr[])") @@ -1066,7 +1169,7 @@ function getNodesForPhysicalGroup(dim, tag) api_coord_ = Ref{Ptr{Cdouble}}() api_coord_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelMeshGetNodesForPhysicalGroup, gmsh.lib), Nothing, + ccall((:gmshModelMeshGetNodesForPhysicalGroup, gmsh.lib), Cvoid, (Cint, Cint, Ptr{Ptr{Csize_t}}, Ptr{Csize_t}, Ptr{Ptr{Cdouble}}, Ptr{Csize_t}, Ptr{Cint}), dim, tag, api_nodeTags_, api_nodeTags_n_, api_coord_, api_coord_n_, ierr) ierr[] != 0 && error("gmshModelMeshGetNodesForPhysicalGroup returned non-zero error code: $(ierr[])") @@ -1078,8 +1181,8 @@ end """ gmsh.model.mesh.setNodes(dim, tag, nodeTags, coord, parametricCoord = Cdouble[]) -Set the nodes classified on the geometrical entity of dimension `dim` and tag -`tag`. `nodeTags` contains the node tags (their unique, strictly positive +Set the nodes classified on the model entity of dimension `dim` and tag `tag`. +`nodeTags` contains the node tags (their unique, strictly positive identification numbers). `coord` is a vector of length 3 times the length of `nodeTags` that contains the x, y, z coordinates of the nodes, concatenated: [n1x, n1y, n1z, n2x, ...]. The optional `parametricCoord` vector contains the @@ -1089,9 +1192,9 @@ new tags are automatically assigned to the nodes. """ function setNodes(dim, tag, nodeTags, coord, parametricCoord = Cdouble[]) ierr = Ref{Cint}() - ccall((:gmshModelMeshSetNodes, gmsh.lib), Nothing, + ccall((:gmshModelMeshSetNodes, gmsh.lib), Cvoid, (Cint, Cint, Ptr{Csize_t}, Csize_t, Ptr{Cdouble}, Csize_t, Ptr{Cdouble}, Csize_t, Ptr{Cint}), - dim, tag, convert(Vector{Csize_t}, nodeTags), length(nodeTags), coord, length(coord), parametricCoord, length(parametricCoord), ierr) + dim, tag, convert(Vector{Csize_t}, nodeTags), length(nodeTags), convert(Vector{Cdouble}, coord), length(coord), convert(Vector{Cdouble}, parametricCoord), length(parametricCoord), ierr) ierr[] != 0 && error("gmshModelMeshSetNodes returned non-zero error code: $(ierr[])") return nothing end @@ -1099,14 +1202,14 @@ end """ gmsh.model.mesh.reclassifyNodes() -Reclassify all nodes on their associated geometrical entity, based on the -elements. Can be used when importing nodes in bulk (e.g. by associating them all -to a single volume), to reclassify them correctly on model surfaces, curves, -etc. after the elements have been set. +Reclassify all nodes on their associated model entity, based on the elements. +Can be used when importing nodes in bulk (e.g. by associating them all to a +single volume), to reclassify them correctly on model surfaces, curves, etc. +after the elements have been set. """ function reclassifyNodes() ierr = Ref{Cint}() - ccall((:gmshModelMeshReclassifyNodes, gmsh.lib), Nothing, + ccall((:gmshModelMeshReclassifyNodes, gmsh.lib), Cvoid, (Ptr{Cint},), ierr) ierr[] != 0 && error("gmshModelMeshReclassifyNodes returned non-zero error code: $(ierr[])") @@ -1123,7 +1226,7 @@ nodes in the mesh. """ function relocateNodes(dim = -1, tag = -1) ierr = Ref{Cint}() - ccall((:gmshModelMeshRelocateNodes, gmsh.lib), Nothing, + ccall((:gmshModelMeshRelocateNodes, gmsh.lib), Cvoid, (Cint, Cint, Ptr{Cint}), dim, tag, ierr) ierr[] != 0 && error("gmshModelMeshRelocateNodes returned non-zero error code: $(ierr[])") @@ -1158,7 +1261,7 @@ function getElements(dim = -1, tag = -1) api_nodeTags_n_ = Ref{Ptr{Csize_t}}() api_nodeTags_nn_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelMeshGetElements, gmsh.lib), Nothing, + ccall((:gmshModelMeshGetElements, gmsh.lib), Cvoid, (Ptr{Ptr{Cint}}, Ptr{Csize_t}, Ptr{Ptr{Ptr{Csize_t}}}, Ptr{Ptr{Csize_t}}, Ptr{Csize_t}, Ptr{Ptr{Ptr{Csize_t}}}, Ptr{Ptr{Csize_t}}, Ptr{Csize_t}, Cint, Cint, Ptr{Cint}), api_elementTypes_, api_elementTypes_n_, api_elementTags_, api_elementTags_n_, api_elementTags_nn_, api_nodeTags_, api_nodeTags_n_, api_nodeTags_nn_, dim, tag, ierr) ierr[] != 0 && error("gmshModelMeshGetElements returned non-zero error code: $(ierr[])") @@ -1178,7 +1281,7 @@ end Get the type and node tags of the element with tag `tag`. This is a sometimes useful but inefficient way of accessing elements, as it relies on a cache stored in the model. For large meshes all the elements in the model should be numbered -in a continuous sequence of tags from 1 to N to maintain reasonnable performance +in a continuous sequence of tags from 1 to N to maintain reasonable performance (in this case the internal cache is based on a vector; otherwise it uses a map). Return `elementType`, `nodeTags`. @@ -1188,7 +1291,7 @@ function getElement(elementTag) api_nodeTags_ = Ref{Ptr{Csize_t}}() api_nodeTags_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelMeshGetElement, gmsh.lib), Nothing, + ccall((:gmshModelMeshGetElement, gmsh.lib), Cvoid, (Csize_t, Ptr{Cint}, Ptr{Ptr{Csize_t}}, Ptr{Csize_t}, Ptr{Cint}), elementTag, api_elementType_, api_nodeTags_, api_nodeTags_n_, ierr) ierr[] != 0 && error("gmshModelMeshGetElement returned non-zero error code: $(ierr[])") @@ -1197,26 +1300,33 @@ function getElement(elementTag) end """ - gmsh.model.mesh.getElementByCoordinates(x, y, z) + gmsh.model.mesh.getElementByCoordinates(x, y, z, dim = -1, strict = false) -Get the tag, type and node tags of the element located at coordinates (`x`, `y`, -`z`). This is a sometimes useful but inefficient way of accessing elements, as -it relies on a search in a spatial octree. +Search the mesh for an element located at coordinates (`x`, `y`, `z`). This is a +sometimes useful but inefficient way of accessing elements, as it relies on a +search in a spatial octree. If an element is found, return its tag, type and +node tags, as well as the local coordinates (`u`, `v`, `w`) within the element +corresponding to search location. If `dim` is >= 0, only search for elements of +the given dimension. If `strict` is not set, use a tolerance to find elements +near the search location. -Return `elementTag`, `elementType`, `nodeTags`. +Return `elementTag`, `elementType`, `nodeTags`, `u`, `v`, `w`. """ -function getElementByCoordinates(x, y, z) +function getElementByCoordinates(x, y, z, dim = -1, strict = false) api_elementTag_ = Ref{Csize_t}() api_elementType_ = Ref{Cint}() api_nodeTags_ = Ref{Ptr{Csize_t}}() api_nodeTags_n_ = Ref{Csize_t}() + api_u_ = Ref{Cdouble}() + api_v_ = Ref{Cdouble}() + api_w_ = Ref{Cdouble}() ierr = Ref{Cint}() - ccall((:gmshModelMeshGetElementByCoordinates, gmsh.lib), Nothing, - (Cdouble, Cdouble, Cdouble, Ptr{Csize_t}, Ptr{Cint}, Ptr{Ptr{Csize_t}}, Ptr{Csize_t}, Ptr{Cint}), - x, y, z, api_elementTag_, api_elementType_, api_nodeTags_, api_nodeTags_n_, ierr) + ccall((:gmshModelMeshGetElementByCoordinates, gmsh.lib), Cvoid, + (Cdouble, Cdouble, Cdouble, Ptr{Csize_t}, Ptr{Cint}, Ptr{Ptr{Csize_t}}, Ptr{Csize_t}, Ptr{Cdouble}, Ptr{Cdouble}, Ptr{Cdouble}, Cint, Cint, Ptr{Cint}), + x, y, z, api_elementTag_, api_elementType_, api_nodeTags_, api_nodeTags_n_, api_u_, api_v_, api_w_, dim, strict, ierr) ierr[] != 0 && error("gmshModelMeshGetElementByCoordinates returned non-zero error code: $(ierr[])") nodeTags = unsafe_wrap(Array, api_nodeTags_[], api_nodeTags_n_[], own=true) - return api_elementTag_[], api_elementType_[], nodeTags + return api_elementTag_[], api_elementType_[], nodeTags, api_u_[], api_v_[], api_w_[] end """ @@ -1232,7 +1342,7 @@ function getElementTypes(dim = -1, tag = -1) api_elementTypes_ = Ref{Ptr{Cint}}() api_elementTypes_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelMeshGetElementTypes, gmsh.lib), Nothing, + ccall((:gmshModelMeshGetElementTypes, gmsh.lib), Cvoid, (Ptr{Ptr{Cint}}, Ptr{Csize_t}, Cint, Cint, Ptr{Cint}), api_elementTypes_, api_elementTypes_n_, dim, tag, ierr) ierr[] != 0 && error("gmshModelMeshGetElementTypes returned non-zero error code: $(ierr[])") @@ -1277,7 +1387,7 @@ function getElementProperties(elementType) api_parametricCoord_ = Ref{Ptr{Cdouble}}() api_parametricCoord_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelMeshGetElementProperties, gmsh.lib), Nothing, + ccall((:gmshModelMeshGetElementProperties, gmsh.lib), Cvoid, (Cint, Ptr{Ptr{Cchar}}, Ptr{Cint}, Ptr{Cint}, Ptr{Cint}, Ptr{Ptr{Cdouble}}, Ptr{Csize_t}, Ptr{Cint}), elementType, api_elementName_, api_dim_, api_order_, api_numNodes_, api_parametricCoord_, api_parametricCoord_n_, ierr) ierr[] != 0 && error("gmshModelMeshGetElementProperties returned non-zero error code: $(ierr[])") @@ -1289,8 +1399,8 @@ end """ gmsh.model.mesh.getElementsByType(elementType, tag = -1, task = 0, numTasks = 1) -Get the elements of type `elementType` classified on the entity of of tag `tag`. -If `tag` < 0, get the elements for all entities. `elementTags` is a vector +Get the elements of type `elementType` classified on the entity of tag `tag`. If +`tag` < 0, get the elements for all entities. `elementTags` is a vector containing the tags (unique, strictly positive identifiers) of the elements of the corresponding type. `nodeTags` is a vector of length equal to the number of elements of the given type times the number N of nodes for this type of element, @@ -1306,7 +1416,7 @@ function getElementsByType(elementType, tag = -1, task = 0, numTasks = 1) api_nodeTags_ = Ref{Ptr{Csize_t}}() api_nodeTags_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelMeshGetElementsByType, gmsh.lib), Nothing, + ccall((:gmshModelMeshGetElementsByType, gmsh.lib), Cvoid, (Cint, Ptr{Ptr{Csize_t}}, Ptr{Csize_t}, Ptr{Ptr{Csize_t}}, Ptr{Csize_t}, Cint, Csize_t, Csize_t, Ptr{Cint}), elementType, api_elementTags_, api_elementTags_n_, api_nodeTags_, api_nodeTags_n_, tag, task, numTasks, ierr) ierr[] != 0 && error("gmshModelMeshGetElementsByType returned non-zero error code: $(ierr[])") @@ -1315,29 +1425,6 @@ function getElementsByType(elementType, tag = -1, task = 0, numTasks = 1) return elementTags, nodeTags end -""" - gmsh.model.mesh.preallocateElementsByType(elementType, elementTag, nodeTag, tag = -1) - -Preallocate the data for `getElementsByType`. This is necessary only if -`getElementsByType` is called with `numTasks` > 1. - -Return `elementTags`, `nodeTags`. -""" -function preallocateElementsByType(elementType, elementTag, nodeTag, tag = -1) - api_elementTags_ = Ref{Ptr{Csize_t}}() - api_elementTags_n_ = Ref{Csize_t}() - api_nodeTags_ = Ref{Ptr{Csize_t}}() - api_nodeTags_n_ = Ref{Csize_t}() - ierr = Ref{Cint}() - ccall((:gmshModelMeshPreallocateElementsByType, gmsh.lib), Nothing, - (Cint, Cint, Cint, Ptr{Ptr{Csize_t}}, Ptr{Csize_t}, Ptr{Ptr{Csize_t}}, Ptr{Csize_t}, Cint, Ptr{Cint}), - elementType, elementTag, nodeTag, api_elementTags_, api_elementTags_n_, api_nodeTags_, api_nodeTags_n_, tag, ierr) - ierr[] != 0 && error("gmshModelMeshPreallocateElementsByType returned non-zero error code: $(ierr[])") - elementTags = unsafe_wrap(Array, api_elementTags_[], api_elementTags_n_[], own=true) - nodeTags = unsafe_wrap(Array, api_nodeTags_[], api_nodeTags_n_[], own=true) - return elementTags, nodeTags -end - """ gmsh.model.mesh.setElements(dim, tag, elementTypes, elementTags, nodeTags) @@ -1355,7 +1442,7 @@ function setElements(dim, tag, elementTypes, elementTags, nodeTags) api_elementTags_n_ = [ length(elementTags[i]) for i in 1:length(elementTags) ] api_nodeTags_n_ = [ length(nodeTags[i]) for i in 1:length(nodeTags) ] ierr = Ref{Cint}() - ccall((:gmshModelMeshSetElements, gmsh.lib), Nothing, + ccall((:gmshModelMeshSetElements, gmsh.lib), Cvoid, (Cint, Cint, Ptr{Cint}, Csize_t, Ptr{Ptr{Csize_t}}, Ptr{Csize_t}, Csize_t, Ptr{Ptr{Csize_t}}, Ptr{Csize_t}, Csize_t, Ptr{Cint}), dim, tag, convert(Vector{Cint}, elementTypes), length(elementTypes), convert(Vector{Vector{Csize_t}},elementTags), api_elementTags_n_, length(elementTags), convert(Vector{Vector{Csize_t}},nodeTags), api_nodeTags_n_, length(nodeTags), ierr) ierr[] != 0 && error("gmshModelMeshSetElements returned non-zero error code: $(ierr[])") @@ -1375,7 +1462,7 @@ elements. """ function setElementsByType(tag, elementType, elementTags, nodeTags) ierr = Ref{Cint}() - ccall((:gmshModelMeshSetElementsByType, gmsh.lib), Nothing, + ccall((:gmshModelMeshSetElementsByType, gmsh.lib), Cvoid, (Cint, Cint, Ptr{Csize_t}, Csize_t, Ptr{Csize_t}, Csize_t, Ptr{Cint}), tag, elementType, convert(Vector{Csize_t}, elementTags), length(elementTags), convert(Vector{Csize_t}, nodeTags), length(nodeTags), ierr) ierr[] != 0 && error("gmshModelMeshSetElementsByType returned non-zero error code: $(ierr[])") @@ -1383,25 +1470,52 @@ function setElementsByType(tag, elementType, elementTags, nodeTags) end """ - gmsh.model.mesh.getJacobians(elementType, integrationType, tag = -1, task = 0, numTasks = 1) + gmsh.model.mesh.getIntegrationPoints(elementType, integrationType) + +Get the numerical quadrature information for the given element type +`elementType` and integration rule `integrationType` (e.g. "Gauss4" for a Gauss +quadrature suited for integrating 4th order polynomials). `integrationPoints` +contains the u, v, w coordinates of the G integration points in the reference +element: [g1u, g1v, g1w, ..., gGu, gGv, gGw]. `integrationWeigths` contains the +associated weights: [g1q, ..., gGq]. + +Return `integrationPoints`, `integrationWeights`. +""" +function getIntegrationPoints(elementType, integrationType) + api_integrationPoints_ = Ref{Ptr{Cdouble}}() + api_integrationPoints_n_ = Ref{Csize_t}() + api_integrationWeights_ = Ref{Ptr{Cdouble}}() + api_integrationWeights_n_ = Ref{Csize_t}() + ierr = Ref{Cint}() + ccall((:gmshModelMeshGetIntegrationPoints, gmsh.lib), Cvoid, + (Cint, Ptr{Cchar}, Ptr{Ptr{Cdouble}}, Ptr{Csize_t}, Ptr{Ptr{Cdouble}}, Ptr{Csize_t}, Ptr{Cint}), + elementType, integrationType, api_integrationPoints_, api_integrationPoints_n_, api_integrationWeights_, api_integrationWeights_n_, ierr) + ierr[] != 0 && error("gmshModelMeshGetIntegrationPoints returned non-zero error code: $(ierr[])") + integrationPoints = unsafe_wrap(Array, api_integrationPoints_[], api_integrationPoints_n_[], own=true) + integrationWeights = unsafe_wrap(Array, api_integrationWeights_[], api_integrationWeights_n_[], own=true) + return integrationPoints, integrationWeights +end + +""" + gmsh.model.mesh.getJacobians(elementType, integrationPoints, tag = -1, task = 0, numTasks = 1) Get the Jacobians of all the elements of type `elementType` classified on the -entity of dimension `dim` and tag `tag`, at the G integration points required by -the `integrationType` integration rule (e.g. "Gauss4" for a Gauss quadrature -suited for integrating 4th order polynomials). Data is returned by element, with -elements in the same order as in `getElements` and `getElementsByType`. -`jacobians` contains for each element the 9 entries of the 3x3 Jacobian matrix -at each integration point, by row: [e1g1Jxu, e1g1Jxv, e1g1Jxw, e1g1Jyu, ..., -e1g1Jzw, e1g2Jxu, ..., e1gGJzw, e2g1Jxu, ...], with Jxu=dx/du, Jxv=dx/dv, etc. -`determinants` contains for each element the determinant of the Jacobian matrix -at each integration point: [e1g1, e1g2, ... e1gG, e2g1, ...]. `points` contains -for each element the x, y, z coordinates of the integration points. If `tag` < -0, get the Jacobian data for all entities. If `numTasks` > 1, only compute and -return the part of the data indexed by `task`. +entity of tag `tag`, at the G integration points `integrationPoints` given as +concatenated triplets of coordinates in the reference element [g1u, g1v, g1w, +..., gGu, gGv, gGw]. Data is returned by element, with elements in the same +order as in `getElements` and `getElementsByType`. `jacobians` contains for each +element the 9 entries of the 3x3 Jacobian matrix at each integration point, by +row: [e1g1Jxu, e1g1Jxv, e1g1Jxw, e1g1Jyu, ..., e1g1Jzw, e1g2Jxu, ..., e1gGJzw, +e2g1Jxu, ...], with Jxu=dx/du, Jxv=dx/dv, etc. `determinants` contains for each +element the determinant of the Jacobian matrix at each integration point: [e1g1, +e1g2, ... e1gG, e2g1, ...]. `points` contains for each element the x, y, z +coordinates of the integration points. If `tag` < 0, get the Jacobian data for +all entities. If `numTasks` > 1, only compute and return the part of the data +indexed by `task`. Return `jacobians`, `determinants`, `points`. """ -function getJacobians(elementType, integrationType, tag = -1, task = 0, numTasks = 1) +function getJacobians(elementType, integrationPoints, tag = -1, task = 0, numTasks = 1) api_jacobians_ = Ref{Ptr{Cdouble}}() api_jacobians_n_ = Ref{Csize_t}() api_determinants_ = Ref{Ptr{Cdouble}}() @@ -1409,9 +1523,9 @@ function getJacobians(elementType, integrationType, tag = -1, task = 0, numTasks api_points_ = Ref{Ptr{Cdouble}}() api_points_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelMeshGetJacobians, gmsh.lib), Nothing, - (Cint, Ptr{Cchar}, Ptr{Ptr{Cdouble}}, Ptr{Csize_t}, Ptr{Ptr{Cdouble}}, Ptr{Csize_t}, Ptr{Ptr{Cdouble}}, Ptr{Csize_t}, Cint, Csize_t, Csize_t, Ptr{Cint}), - elementType, integrationType, api_jacobians_, api_jacobians_n_, api_determinants_, api_determinants_n_, api_points_, api_points_n_, tag, task, numTasks, ierr) + ccall((:gmshModelMeshGetJacobians, gmsh.lib), Cvoid, + (Cint, Ptr{Cdouble}, Csize_t, Ptr{Ptr{Cdouble}}, Ptr{Csize_t}, Ptr{Ptr{Cdouble}}, Ptr{Csize_t}, Ptr{Ptr{Cdouble}}, Ptr{Csize_t}, Cint, Csize_t, Csize_t, Ptr{Cint}), + elementType, convert(Vector{Cdouble}, integrationPoints), length(integrationPoints), api_jacobians_, api_jacobians_n_, api_determinants_, api_determinants_n_, api_points_, api_points_n_, tag, task, numTasks, ierr) ierr[] != 0 && error("gmshModelMeshGetJacobians returned non-zero error code: $(ierr[])") jacobians = unsafe_wrap(Array, api_jacobians_[], api_jacobians_n_[], own=true) determinants = unsafe_wrap(Array, api_determinants_[], api_determinants_n_[], own=true) @@ -1420,61 +1534,113 @@ function getJacobians(elementType, integrationType, tag = -1, task = 0, numTasks end """ - gmsh.model.mesh.preallocateJacobians(elementType, integrationType, jacobian, determinant, point, tag = -1) + gmsh.model.mesh.getBasisFunctions(elementType, integrationPoints, functionSpaceType) -Preallocate the data required by `getJacobians`. This is necessary only if -`getJacobians` is called with `numTasks` > 1. +Get the basis functions of the element of type `elementType` at the integration +points `integrationPoints` (given as concatenated triplets of coordinates in the +reference element [g1u, g1v, g1w, ..., gGu, gGv, gGw]), for the function space +`functionSpaceType` (e.g. "Lagrange" or "GradLagrange" for Lagrange basis +functions or their gradient, in the u, v, w coordinates of the reference +element). `numComponents` returns the number C of components of a basis +function. `basisFunctions` returns the value of the N basis functions at the +integration points, i.e. [g1f1, g1f2, ..., g1fN, g2f1, ...] when C == 1 or +[g1f1u, g1f1v, g1f1w, g1f2u, ..., g1fNw, g2f1u, ...] when C == 3. -Return `jacobians`, `determinants`, `points`. +Return `numComponents`, `basisFunctions`. """ -function preallocateJacobians(elementType, integrationType, jacobian, determinant, point, tag = -1) - api_jacobians_ = Ref{Ptr{Cdouble}}() - api_jacobians_n_ = Ref{Csize_t}() - api_determinants_ = Ref{Ptr{Cdouble}}() - api_determinants_n_ = Ref{Csize_t}() - api_points_ = Ref{Ptr{Cdouble}}() - api_points_n_ = Ref{Csize_t}() +function getBasisFunctions(elementType, integrationPoints, functionSpaceType) + api_numComponents_ = Ref{Cint}() + api_basisFunctions_ = Ref{Ptr{Cdouble}}() + api_basisFunctions_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelMeshPreallocateJacobians, gmsh.lib), Nothing, - (Cint, Ptr{Cchar}, Cint, Cint, Cint, Ptr{Ptr{Cdouble}}, Ptr{Csize_t}, Ptr{Ptr{Cdouble}}, Ptr{Csize_t}, Ptr{Ptr{Cdouble}}, Ptr{Csize_t}, Cint, Ptr{Cint}), - elementType, integrationType, jacobian, determinant, point, api_jacobians_, api_jacobians_n_, api_determinants_, api_determinants_n_, api_points_, api_points_n_, tag, ierr) - ierr[] != 0 && error("gmshModelMeshPreallocateJacobians returned non-zero error code: $(ierr[])") - jacobians = unsafe_wrap(Array, api_jacobians_[], api_jacobians_n_[], own=true) - determinants = unsafe_wrap(Array, api_determinants_[], api_determinants_n_[], own=true) - points = unsafe_wrap(Array, api_points_[], api_points_n_[], own=true) - return jacobians, determinants, points + ccall((:gmshModelMeshGetBasisFunctions, gmsh.lib), Cvoid, + (Cint, Ptr{Cdouble}, Csize_t, Ptr{Cchar}, Ptr{Cint}, Ptr{Ptr{Cdouble}}, Ptr{Csize_t}, Ptr{Cint}), + elementType, convert(Vector{Cdouble}, integrationPoints), length(integrationPoints), functionSpaceType, api_numComponents_, api_basisFunctions_, api_basisFunctions_n_, ierr) + ierr[] != 0 && error("gmshModelMeshGetBasisFunctions returned non-zero error code: $(ierr[])") + basisFunctions = unsafe_wrap(Array, api_basisFunctions_[], api_basisFunctions_n_[], own=true) + return api_numComponents_[], basisFunctions end """ - gmsh.model.mesh.getBasisFunctions(elementType, integrationType, functionSpaceType) + gmsh.model.mesh.getBasisFunctionsForElements(elementType, integrationPoints, functionSpaceType, tag = -1) -Get the basis functions of the element of type `elementType` for the given -`integrationType` integration rule (e.g. "Gauss4" for a Gauss quadrature suited -for integrating 4th order polynomials) and `functionSpaceType` function space -(e.g. "Lagrange" or "GradLagrange" for Lagrange basis functions or their -gradient, in the u, v, w coordinates of the reference element). -`integrationPoints` contains the u, v, w coordinates of the integration points -in the reference element as well as the associated weight q, concatenated: [g1u, -g1v, g1w, g1q, g2u, ...]. `numComponents` returns the number C of components of -a basis function. `basisFunctions` contains the evaluation of the basis -functions at the integration points: [g1f1, ..., g1fC, g2f1, ...]. +Get the element-dependent basis functions of the elements of type `elementType` +in the entity of tag `tag`at the integration points `integrationPoints` (given +as concatenated triplets of coordinates in the reference element [g1u, g1v, g1w, +..., gGu, gGv, gGw]), for the function space `functionSpaceType` (e.g. +"H1Legendre3" or "GradH1Legendre3" for 3rd order hierarchical H1 Legendre +functions or their gradient, in the u, v, w coordinates of the reference +elements). `numComponents` returns the number C of components of a basis +function. `numBasisFunctions` returns the number N of basis functions per +element. `basisFunctions` returns the value of the basis functions at the +integration points for each element: [e1g1f1,..., e1g1fN, e1g2f1,..., e2g1f1, +...] when C == 1 or [e1g1f1u, e1g1f1v,..., e1g1fNw, e1g2f1u,..., e2g1f1u, ...]. +Warning: this is an experimental feature and will probably change in a future +release. -Return `integrationPoints`, `numComponents`, `basisFunctions`. +Return `numComponents`, `numFunctionsPerElements`, `basisFunctions`. """ -function getBasisFunctions(elementType, integrationType, functionSpaceType) - api_integrationPoints_ = Ref{Ptr{Cdouble}}() - api_integrationPoints_n_ = Ref{Csize_t}() +function getBasisFunctionsForElements(elementType, integrationPoints, functionSpaceType, tag = -1) api_numComponents_ = Ref{Cint}() + api_numFunctionsPerElements_ = Ref{Cint}() api_basisFunctions_ = Ref{Ptr{Cdouble}}() api_basisFunctions_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelMeshGetBasisFunctions, gmsh.lib), Nothing, - (Cint, Ptr{Cchar}, Ptr{Cchar}, Ptr{Ptr{Cdouble}}, Ptr{Csize_t}, Ptr{Cint}, Ptr{Ptr{Cdouble}}, Ptr{Csize_t}, Ptr{Cint}), - elementType, integrationType, functionSpaceType, api_integrationPoints_, api_integrationPoints_n_, api_numComponents_, api_basisFunctions_, api_basisFunctions_n_, ierr) - ierr[] != 0 && error("gmshModelMeshGetBasisFunctions returned non-zero error code: $(ierr[])") - integrationPoints = unsafe_wrap(Array, api_integrationPoints_[], api_integrationPoints_n_[], own=true) + ccall((:gmshModelMeshGetBasisFunctionsForElements, gmsh.lib), Cvoid, + (Cint, Ptr{Cdouble}, Csize_t, Ptr{Cchar}, Ptr{Cint}, Ptr{Cint}, Ptr{Ptr{Cdouble}}, Ptr{Csize_t}, Cint, Ptr{Cint}), + elementType, convert(Vector{Cdouble}, integrationPoints), length(integrationPoints), functionSpaceType, api_numComponents_, api_numFunctionsPerElements_, api_basisFunctions_, api_basisFunctions_n_, tag, ierr) + ierr[] != 0 && error("gmshModelMeshGetBasisFunctionsForElements returned non-zero error code: $(ierr[])") basisFunctions = unsafe_wrap(Array, api_basisFunctions_[], api_basisFunctions_n_[], own=true) - return integrationPoints, api_numComponents_[], basisFunctions + return api_numComponents_[], api_numFunctionsPerElements_[], basisFunctions +end + +""" + gmsh.model.mesh.getKeysForElements(elementType, functionSpaceType, tag = -1, returnCoord = true) + +Generate the `keys` for the elements of type `elementType` in the entity of tag +`tag`, for the `functionSpaceType` function space. Each key uniquely identifies +a basis function in the function space. If `returnCoord` is set, the `coord` +vector contains the x, y, z coordinates locating basis functions for sorting +purposes. Warning: this is an experimental feature and will probably change in a +future release. + +Return `keys`, `coord`. +""" +function getKeysForElements(elementType, functionSpaceType, tag = -1, returnCoord = true) + api_keys_ = Ref{Ptr{Cint}}() + api_keys_n_ = Ref{Csize_t}() + api_coord_ = Ref{Ptr{Cdouble}}() + api_coord_n_ = Ref{Csize_t}() + ierr = Ref{Cint}() + ccall((:gmshModelMeshGetKeysForElements, gmsh.lib), Cvoid, + (Cint, Ptr{Cchar}, Ptr{Ptr{Cint}}, Ptr{Csize_t}, Ptr{Ptr{Cdouble}}, Ptr{Csize_t}, Cint, Cint, Ptr{Cint}), + elementType, functionSpaceType, api_keys_, api_keys_n_, api_coord_, api_coord_n_, tag, returnCoord, ierr) + ierr[] != 0 && error("gmshModelMeshGetKeysForElements returned non-zero error code: $(ierr[])") + tmp_api_keys_ = unsafe_wrap(Array, api_keys_[], api_keys_n_[], own=true) + keys = [ (tmp_api_keys_[i], tmp_api_keys_[i+1]) for i in 1:2:length(tmp_api_keys_) ] + coord = unsafe_wrap(Array, api_coord_[], api_coord_n_[], own=true) + return keys, coord +end + +""" + gmsh.model.mesh.getInformationForElements(keys, order, elementType) + +Get information about the `keys`. Warning: this is an experimental feature and +will probably change in a future release. + +Return `info`. +""" +function getInformationForElements(keys, order, elementType) + api_info_ = Ref{Ptr{Cint}}() + api_info_n_ = Ref{Csize_t}() + ierr = Ref{Cint}() + ccall((:gmshModelMeshGetInformationForElements, gmsh.lib), Cvoid, + (Ptr{Cint}, Csize_t, Ptr{Ptr{Cint}}, Ptr{Csize_t}, Cint, Cint, Ptr{Cint}), + convert(Vector{Cint}, collect(Cint, Iterators.flatten(keys))), 2 * length(keys), api_info_, api_info_n_, order, elementType, ierr) + ierr[] != 0 && error("gmshModelMeshGetInformationForElements returned non-zero error code: $(ierr[])") + tmp_api_info_ = unsafe_wrap(Array, api_info_[], api_info_n_[], own=true) + info = [ (tmp_api_info_[i], tmp_api_info_[i+1]) for i in 1:2:length(tmp_api_info_) ] + return info end """ @@ -1484,7 +1650,7 @@ Precomputes the basis functions corresponding to `elementType`. """ function precomputeBasisFunctions(elementType) ierr = Ref{Cint}() - ccall((:gmshModelMeshPrecomputeBasisFunctions, gmsh.lib), Nothing, + ccall((:gmshModelMeshPrecomputeBasisFunctions, gmsh.lib), Cvoid, (Cint, Ptr{Cint}), elementType, ierr) ierr[] != 0 && error("gmshModelMeshPrecomputeBasisFunctions returned non-zero error code: $(ierr[])") @@ -1507,7 +1673,7 @@ function getBarycenters(elementType, tag, fast, primary, task = 0, numTasks = 1) api_barycenters_ = Ref{Ptr{Cdouble}}() api_barycenters_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelMeshGetBarycenters, gmsh.lib), Nothing, + ccall((:gmshModelMeshGetBarycenters, gmsh.lib), Cvoid, (Cint, Cint, Cint, Cint, Ptr{Ptr{Cdouble}}, Ptr{Csize_t}, Csize_t, Csize_t, Ptr{Cint}), elementType, tag, fast, primary, api_barycenters_, api_barycenters_n_, task, numTasks, ierr) ierr[] != 0 && error("gmshModelMeshGetBarycenters returned non-zero error code: $(ierr[])") @@ -1515,34 +1681,16 @@ function getBarycenters(elementType, tag, fast, primary, task = 0, numTasks = 1) return barycenters end -""" - gmsh.model.mesh.preallocateBarycenters(elementType, tag = -1) - -Preallocate the data required by `getBarycenters`. This is necessary only if -`getBarycenters` is called with `numTasks` > 1. - -Return `barycenters`. -""" -function preallocateBarycenters(elementType, tag = -1) - api_barycenters_ = Ref{Ptr{Cdouble}}() - api_barycenters_n_ = Ref{Csize_t}() - ierr = Ref{Cint}() - ccall((:gmshModelMeshPreallocateBarycenters, gmsh.lib), Nothing, - (Cint, Ptr{Ptr{Cdouble}}, Ptr{Csize_t}, Cint, Ptr{Cint}), - elementType, api_barycenters_, api_barycenters_n_, tag, ierr) - ierr[] != 0 && error("gmshModelMeshPreallocateBarycenters returned non-zero error code: $(ierr[])") - barycenters = unsafe_wrap(Array, api_barycenters_[], api_barycenters_n_[], own=true) - return barycenters -end - """ gmsh.model.mesh.getElementEdgeNodes(elementType, tag = -1, primary = false, task = 0, numTasks = 1) Get the nodes on the edges of all elements of type `elementType` classified on -the entity of tag `tag`. `nodeTags` contains the node tags. If `primary` is set, -only the primary (begin/end) nodes of the edges are returned. If `tag` < 0, get -the edge nodes for all entities. If `numTasks` > 1, only compute and return the -part of the data indexed by `task`. +the entity of tag `tag`. `nodeTags` contains the node tags of the edges for all +the elements: [e1a1n1, e1a1n2, e1a2n1, ...]. Data is returned by element, with +elements in the same order as in `getElements` and `getElementsByType`. If +`primary` is set, only the primary (begin/end) nodes of the edges are returned. +If `tag` < 0, get the edge nodes for all entities. If `numTasks` > 1, only +compute and return the part of the data indexed by `task`. Return `nodeTags`. """ @@ -1550,7 +1698,7 @@ function getElementEdgeNodes(elementType, tag = -1, primary = false, task = 0, n api_nodeTags_ = Ref{Ptr{Csize_t}}() api_nodeTags_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelMeshGetElementEdgeNodes, gmsh.lib), Nothing, + ccall((:gmshModelMeshGetElementEdgeNodes, gmsh.lib), Cvoid, (Cint, Ptr{Ptr{Csize_t}}, Ptr{Csize_t}, Cint, Cint, Csize_t, Csize_t, Ptr{Cint}), elementType, api_nodeTags_, api_nodeTags_n_, tag, primary, task, numTasks, ierr) ierr[] != 0 && error("gmshModelMeshGetElementEdgeNodes returned non-zero error code: $(ierr[])") @@ -1563,10 +1711,12 @@ end Get the nodes on the faces of type `faceType` (3 for triangular faces, 4 for quadrangular faces) of all elements of type `elementType` classified on the -entity of tag `tag`. `nodeTags` contains the node tags. If `primary` is set, -only the primary (corner) nodes of the faces are returned. If `tag` < 0, get the -face nodes for all entities. If `numTasks` > 1, only compute and return the part -of the data indexed by `task`. +entity of tag `tag`. `nodeTags` contains the node tags of the faces for all +elements: [e1f1n1, ..., e1f1nFaceType, e1f2n1, ...]. Data is returned by +element, with elements in the same order as in `getElements` and +`getElementsByType`. If `primary` is set, only the primary (corner) nodes of the +faces are returned. If `tag` < 0, get the face nodes for all entities. If +`numTasks` > 1, only compute and return the part of the data indexed by `task`. Return `nodeTags`. """ @@ -1574,7 +1724,7 @@ function getElementFaceNodes(elementType, faceType, tag = -1, primary = false, t api_nodeTags_ = Ref{Ptr{Csize_t}}() api_nodeTags_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelMeshGetElementFaceNodes, gmsh.lib), Nothing, + ccall((:gmshModelMeshGetElementFaceNodes, gmsh.lib), Cvoid, (Cint, Cint, Ptr{Ptr{Csize_t}}, Ptr{Csize_t}, Cint, Cint, Csize_t, Csize_t, Ptr{Cint}), elementType, faceType, api_nodeTags_, api_nodeTags_n_, tag, primary, task, numTasks, ierr) ierr[] != 0 && error("gmshModelMeshGetElementFaceNodes returned non-zero error code: $(ierr[])") @@ -1596,7 +1746,7 @@ function getGhostElements(dim, tag) api_partitions_ = Ref{Ptr{Cint}}() api_partitions_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelMeshGetGhostElements, gmsh.lib), Nothing, + ccall((:gmshModelMeshGetGhostElements, gmsh.lib), Cvoid, (Cint, Cint, Ptr{Ptr{Csize_t}}, Ptr{Csize_t}, Ptr{Ptr{Cint}}, Ptr{Csize_t}, Ptr{Cint}), dim, tag, api_elementTags_, api_elementTags_n_, api_partitions_, api_partitions_n_, ierr) ierr[] != 0 && error("gmshModelMeshGetGhostElements returned non-zero error code: $(ierr[])") @@ -1608,12 +1758,12 @@ end """ gmsh.model.mesh.setSize(dimTags, size) -Set a mesh size constraint on the geometrical entities `dimTags`. Currently only +Set a mesh size constraint on the model entities `dimTags`. Currently only entities of dimension 0 (points) are handled. """ function setSize(dimTags, size) ierr = Ref{Cint}() - ccall((:gmshModelMeshSetSize, gmsh.lib), Nothing, + ccall((:gmshModelMeshSetSize, gmsh.lib), Cvoid, (Ptr{Cint}, Csize_t, Cdouble, Ptr{Cint}), convert(Vector{Cint}, collect(Cint, Iterators.flatten(dimTags))), 2 * length(dimTags), size, ierr) ierr[] != 0 && error("gmshModelMeshSetSize returned non-zero error code: $(ierr[])") @@ -1630,7 +1780,7 @@ toward both extremities of the curve). """ function setTransfiniteCurve(tag, numNodes, meshType = "Progression", coef = 1.) ierr = Ref{Cint}() - ccall((:gmshModelMeshSetTransfiniteCurve, gmsh.lib), Nothing, + ccall((:gmshModelMeshSetTransfiniteCurve, gmsh.lib), Cvoid, (Cint, Cint, Ptr{Cchar}, Cdouble, Ptr{Cint}), tag, numNodes, meshType, coef, ierr) ierr[] != 0 && error("gmshModelMeshSetTransfiniteCurve returned non-zero error code: $(ierr[])") @@ -1649,7 +1799,7 @@ mandatory if the surface has more that 3 or 4 points on its boundary. """ function setTransfiniteSurface(tag, arrangement = "Left", cornerTags = Cint[]) ierr = Ref{Cint}() - ccall((:gmshModelMeshSetTransfiniteSurface, gmsh.lib), Nothing, + ccall((:gmshModelMeshSetTransfiniteSurface, gmsh.lib), Cvoid, (Cint, Ptr{Cchar}, Ptr{Cint}, Csize_t, Ptr{Cint}), tag, arrangement, convert(Vector{Cint}, cornerTags), length(cornerTags), ierr) ierr[] != 0 && error("gmshModelMeshSetTransfiniteSurface returned non-zero error code: $(ierr[])") @@ -1665,7 +1815,7 @@ explicitly. """ function setTransfiniteVolume(tag, cornerTags = Cint[]) ierr = Ref{Cint}() - ccall((:gmshModelMeshSetTransfiniteVolume, gmsh.lib), Nothing, + ccall((:gmshModelMeshSetTransfiniteVolume, gmsh.lib), Cvoid, (Cint, Ptr{Cint}, Csize_t, Ptr{Cint}), tag, convert(Vector{Cint}, cornerTags), length(cornerTags), ierr) ierr[] != 0 && error("gmshModelMeshSetTransfiniteVolume returned non-zero error code: $(ierr[])") @@ -1675,13 +1825,13 @@ end """ gmsh.model.mesh.setRecombine(dim, tag) -Set a recombination meshing constraint on the geometrical entity of dimension -`dim` and tag `tag`. Currently only entities of dimension 2 (to recombine -triangles into quadrangles) are supported. +Set a recombination meshing constraint on the model entity of dimension `dim` +and tag `tag`. Currently only entities of dimension 2 (to recombine triangles +into quadrangles) are supported. """ function setRecombine(dim, tag) ierr = Ref{Cint}() - ccall((:gmshModelMeshSetRecombine, gmsh.lib), Nothing, + ccall((:gmshModelMeshSetRecombine, gmsh.lib), Cvoid, (Cint, Cint, Ptr{Cint}), dim, tag, ierr) ierr[] != 0 && error("gmshModelMeshSetRecombine returned non-zero error code: $(ierr[])") @@ -1691,12 +1841,12 @@ end """ gmsh.model.mesh.setSmoothing(dim, tag, val) -Set a smoothing meshing constraint on the geometrical entity of dimension `dim` -and tag `tag`. `val` iterations of a Laplace smoother are applied. +Set a smoothing meshing constraint on the model entity of dimension `dim` and +tag `tag`. `val` iterations of a Laplace smoother are applied. """ function setSmoothing(dim, tag, val) ierr = Ref{Cint}() - ccall((:gmshModelMeshSetSmoothing, gmsh.lib), Nothing, + ccall((:gmshModelMeshSetSmoothing, gmsh.lib), Cvoid, (Cint, Cint, Cint, Ptr{Cint}), dim, tag, val, ierr) ierr[] != 0 && error("gmshModelMeshSetSmoothing returned non-zero error code: $(ierr[])") @@ -1706,15 +1856,14 @@ end """ gmsh.model.mesh.setReverse(dim, tag, val = true) -Set a reverse meshing constraint on the geometrical entity of dimension `dim` -and tag `tag`. If `val` is true, the mesh orientation will be reversed with -respect to the natural mesh orientation (i.e. the orientation consistent with -the orientation of the geometrical entity). If `val` is false, the mesh is left -as-is. +Set a reverse meshing constraint on the model entity of dimension `dim` and tag +`tag`. If `val` is true, the mesh orientation will be reversed with respect to +the natural mesh orientation (i.e. the orientation consistent with the +orientation of the geometry). If `val` is false, the mesh is left as-is. """ function setReverse(dim, tag, val = true) ierr = Ref{Cint}() - ccall((:gmshModelMeshSetReverse, gmsh.lib), Nothing, + ccall((:gmshModelMeshSetReverse, gmsh.lib), Cvoid, (Cint, Cint, Cint, Ptr{Cint}), dim, tag, val, ierr) ierr[] != 0 && error("gmshModelMeshSetReverse returned non-zero error code: $(ierr[])") @@ -1730,7 +1879,7 @@ available with the OpenCASCADE kernel, as it relies on the STL triangulation. """ function setOutwardOrientation(tag) ierr = Ref{Cint}() - ccall((:gmshModelMeshSetOutwardOrientation, gmsh.lib), Nothing, + ccall((:gmshModelMeshSetOutwardOrientation, gmsh.lib), Cvoid, (Cint, Ptr{Cint}), tag, ierr) ierr[] != 0 && error("gmshModelMeshSetOutwardOrientation returned non-zero error code: $(ierr[])") @@ -1740,12 +1889,12 @@ end """ gmsh.model.mesh.embed(dim, tags, inDim, inTag) -Embed the geometrical entities of dimension `dim` and tags `tags` in the (inDim, -inTag) geometrical entity. `inDim` must be strictly greater than `dim`. +Embed the model entities of dimension `dim` and tags `tags` in the (inDim, +inTag) model entity. `inDim` must be strictly greater than `dim`. """ function embed(dim, tags, inDim, inTag) ierr = Ref{Cint}() - ccall((:gmshModelMeshEmbed, gmsh.lib), Nothing, + ccall((:gmshModelMeshEmbed, gmsh.lib), Cvoid, (Cint, Ptr{Cint}, Csize_t, Cint, Cint, Ptr{Cint}), dim, convert(Vector{Cint}, tags), length(tags), inDim, inTag, ierr) ierr[] != 0 && error("gmshModelMeshEmbed returned non-zero error code: $(ierr[])") @@ -1755,13 +1904,13 @@ end """ gmsh.model.mesh.removeEmbedded(dimTags, dim = -1) -Remove embedded entities in the geometrical entities `dimTags`. if `dim` is >= -0, only remove embedded entities of the given dimension (e.g. embedded points if -`dim` == 0). +Remove embedded entities in the model entities `dimTags`. if `dim` is >= 0, only +remove embedded entities of the given dimension (e.g. embedded points if `dim` +== 0). """ function removeEmbedded(dimTags, dim = -1) ierr = Ref{Cint}() - ccall((:gmshModelMeshRemoveEmbedded, gmsh.lib), Nothing, + ccall((:gmshModelMeshRemoveEmbedded, gmsh.lib), Cvoid, (Ptr{Cint}, Csize_t, Cint, Ptr{Cint}), convert(Vector{Cint}, collect(Cint, Iterators.flatten(dimTags))), 2 * length(dimTags), dim, ierr) ierr[] != 0 && error("gmshModelMeshRemoveEmbedded returned non-zero error code: $(ierr[])") @@ -1776,7 +1925,7 @@ according to `ordering`. """ function reorderElements(elementType, tag, ordering) ierr = Ref{Cint}() - ccall((:gmshModelMeshReorderElements, gmsh.lib), Nothing, + ccall((:gmshModelMeshReorderElements, gmsh.lib), Cvoid, (Cint, Cint, Ptr{Csize_t}, Csize_t, Ptr{Cint}), elementType, tag, convert(Vector{Csize_t}, ordering), length(ordering), ierr) ierr[] != 0 && error("gmshModelMeshReorderElements returned non-zero error code: $(ierr[])") @@ -1790,7 +1939,7 @@ Renumber the node tags in a continuous sequence. """ function renumberNodes() ierr = Ref{Cint}() - ccall((:gmshModelMeshRenumberNodes, gmsh.lib), Nothing, + ccall((:gmshModelMeshRenumberNodes, gmsh.lib), Cvoid, (Ptr{Cint},), ierr) ierr[] != 0 && error("gmshModelMeshRenumberNodes returned non-zero error code: $(ierr[])") @@ -1804,7 +1953,7 @@ Renumber the element tags in a continuous sequence. """ function renumberElements() ierr = Ref{Cint}() - ccall((:gmshModelMeshRenumberElements, gmsh.lib), Nothing, + ccall((:gmshModelMeshRenumberElements, gmsh.lib), Cvoid, (Ptr{Cint},), ierr) ierr[] != 0 && error("gmshModelMeshRenumberElements returned non-zero error code: $(ierr[])") @@ -1821,9 +1970,9 @@ Currently only available for `dim` == 1 and `dim` == 2. """ function setPeriodic(dim, tags, tagsMaster, affineTransform) ierr = Ref{Cint}() - ccall((:gmshModelMeshSetPeriodic, gmsh.lib), Nothing, + ccall((:gmshModelMeshSetPeriodic, gmsh.lib), Cvoid, (Cint, Ptr{Cint}, Csize_t, Ptr{Cint}, Csize_t, Ptr{Cdouble}, Csize_t, Ptr{Cint}), - dim, convert(Vector{Cint}, tags), length(tags), convert(Vector{Cint}, tagsMaster), length(tagsMaster), affineTransform, length(affineTransform), ierr) + dim, convert(Vector{Cint}, tags), length(tags), convert(Vector{Cint}, tagsMaster), length(tagsMaster), convert(Vector{Cdouble}, affineTransform), length(affineTransform), ierr) ierr[] != 0 && error("gmshModelMeshSetPeriodic returned non-zero error code: $(ierr[])") return nothing end @@ -1846,7 +1995,7 @@ function getPeriodicNodes(dim, tag) api_affineTransform_ = Ref{Ptr{Cdouble}}() api_affineTransform_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelMeshGetPeriodicNodes, gmsh.lib), Nothing, + ccall((:gmshModelMeshGetPeriodicNodes, gmsh.lib), Cvoid, (Cint, Cint, Ptr{Cint}, Ptr{Ptr{Csize_t}}, Ptr{Csize_t}, Ptr{Ptr{Csize_t}}, Ptr{Csize_t}, Ptr{Ptr{Cdouble}}, Ptr{Csize_t}, Ptr{Cint}), dim, tag, api_tagMaster_, api_nodeTags_, api_nodeTags_n_, api_nodeTagsMaster_, api_nodeTagsMaster_n_, api_affineTransform_, api_affineTransform_n_, ierr) ierr[] != 0 && error("gmshModelMeshGetPeriodicNodes returned non-zero error code: $(ierr[])") @@ -1863,7 +2012,7 @@ Remove duplicate nodes in the mesh of the current model. """ function removeDuplicateNodes() ierr = Ref{Cint}() - ccall((:gmshModelMeshRemoveDuplicateNodes, gmsh.lib), Nothing, + ccall((:gmshModelMeshRemoveDuplicateNodes, gmsh.lib), Cvoid, (Ptr{Cint},), ierr) ierr[] != 0 && error("gmshModelMeshRemoveDuplicateNodes returned non-zero error code: $(ierr[])") @@ -1878,7 +2027,7 @@ lower than `quality`. If `tag` < 0, split quadrangles in all surfaces. """ function splitQuadrangles(quality = 1., tag = -1) ierr = Ref{Cint}() - ccall((:gmshModelMeshSplitQuadrangles, gmsh.lib), Nothing, + ccall((:gmshModelMeshSplitQuadrangles, gmsh.lib), Cvoid, (Cdouble, Cint, Ptr{Cint}), quality, tag, ierr) ierr[] != 0 && error("gmshModelMeshSplitQuadrangles returned non-zero error code: $(ierr[])") @@ -1895,7 +2044,7 @@ an experimental feature. """ function classifySurfaces(angle, boundary = true) ierr = Ref{Cint}() - ccall((:gmshModelMeshClassifySurfaces, gmsh.lib), Nothing, + ccall((:gmshModelMeshClassifySurfaces, gmsh.lib), Cvoid, (Cdouble, Cint, Ptr{Cint}), angle, boundary, ierr) ierr[] != 0 && error("gmshModelMeshClassifySurfaces returned non-zero error code: $(ierr[])") @@ -1911,7 +2060,7 @@ underlying model). Warning: this is an experimental feature. """ function createTopology() ierr = Ref{Cint}() - ccall((:gmshModelMeshCreateTopology, gmsh.lib), Nothing, + ccall((:gmshModelMeshCreateTopology, gmsh.lib), Cvoid, (Ptr{Cint},), ierr) ierr[] != 0 && error("gmshModelMeshCreateTopology returned non-zero error code: $(ierr[])") @@ -1928,7 +2077,7 @@ Warning: this is an experimental feature. """ function createGeometry() ierr = Ref{Cint}() - ccall((:gmshModelMeshCreateGeometry, gmsh.lib), Nothing, + ccall((:gmshModelMeshCreateGeometry, gmsh.lib), Cvoid, (Ptr{Cint},), ierr) ierr[] != 0 && error("gmshModelMeshCreateGeometry returned non-zero error code: $(ierr[])") @@ -1949,7 +2098,7 @@ groups in the mesh. """ function computeHomology(domainTags = Cint[], subdomainTags = Cint[], dims = Cint[]) ierr = Ref{Cint}() - ccall((:gmshModelMeshComputeHomology, gmsh.lib), Nothing, + ccall((:gmshModelMeshComputeHomology, gmsh.lib), Cvoid, (Ptr{Cint}, Csize_t, Ptr{Cint}, Csize_t, Ptr{Cint}, Csize_t, Ptr{Cint}), convert(Vector{Cint}, domainTags), length(domainTags), convert(Vector{Cint}, subdomainTags), length(subdomainTags), convert(Vector{Cint}, dims), length(dims), ierr) ierr[] != 0 && error("gmshModelMeshComputeHomology returned non-zero error code: $(ierr[])") @@ -1970,7 +2119,7 @@ groups in the mesh. """ function computeCohomology(domainTags = Cint[], subdomainTags = Cint[], dims = Cint[]) ierr = Ref{Cint}() - ccall((:gmshModelMeshComputeCohomology, gmsh.lib), Nothing, + ccall((:gmshModelMeshComputeCohomology, gmsh.lib), Cvoid, (Ptr{Cint}, Csize_t, Ptr{Cint}, Csize_t, Ptr{Cint}, Csize_t, Ptr{Cint}), convert(Vector{Cint}, domainTags), length(domainTags), convert(Vector{Cint}, subdomainTags), length(subdomainTags), convert(Vector{Cint}, dims), length(dims), ierr) ierr[] != 0 && error("gmshModelMeshComputeCohomology returned non-zero error code: $(ierr[])") @@ -1980,7 +2129,7 @@ end """ module gmsh.model.mesh.field -Per-model mesh size field functions +Mesh size field functions """ module field @@ -1990,7 +2139,7 @@ import ....gmsh gmsh.model.mesh.field.add(fieldType, tag = -1) Add a new mesh size field of type `fieldType`. If `tag` is positive, assign the -tag explcitly; otherwise a new tag is assigned automatically. Return the field +tag explicitly; otherwise a new tag is assigned automatically. Return the field tag. Return an integer value. @@ -2011,7 +2160,7 @@ Remove the field with tag `tag`. """ function remove(tag) ierr = Ref{Cint}() - ccall((:gmshModelMeshFieldRemove, gmsh.lib), Nothing, + ccall((:gmshModelMeshFieldRemove, gmsh.lib), Cvoid, (Cint, Ptr{Cint}), tag, ierr) ierr[] != 0 && error("gmshModelMeshFieldRemove returned non-zero error code: $(ierr[])") @@ -2025,7 +2174,7 @@ Set the numerical option `option` to value `value` for field `tag`. """ function setNumber(tag, option, value) ierr = Ref{Cint}() - ccall((:gmshModelMeshFieldSetNumber, gmsh.lib), Nothing, + ccall((:gmshModelMeshFieldSetNumber, gmsh.lib), Cvoid, (Cint, Ptr{Cchar}, Cdouble, Ptr{Cint}), tag, option, value, ierr) ierr[] != 0 && error("gmshModelMeshFieldSetNumber returned non-zero error code: $(ierr[])") @@ -2039,7 +2188,7 @@ Set the string option `option` to value `value` for field `tag`. """ function setString(tag, option, value) ierr = Ref{Cint}() - ccall((:gmshModelMeshFieldSetString, gmsh.lib), Nothing, + ccall((:gmshModelMeshFieldSetString, gmsh.lib), Cvoid, (Cint, Ptr{Cchar}, Ptr{Cchar}, Ptr{Cint}), tag, option, value, ierr) ierr[] != 0 && error("gmshModelMeshFieldSetString returned non-zero error code: $(ierr[])") @@ -2053,9 +2202,9 @@ Set the numerical list option `option` to value `value` for field `tag`. """ function setNumbers(tag, option, value) ierr = Ref{Cint}() - ccall((:gmshModelMeshFieldSetNumbers, gmsh.lib), Nothing, + ccall((:gmshModelMeshFieldSetNumbers, gmsh.lib), Cvoid, (Cint, Ptr{Cchar}, Ptr{Cdouble}, Csize_t, Ptr{Cint}), - tag, option, value, length(value), ierr) + tag, option, convert(Vector{Cdouble}, value), length(value), ierr) ierr[] != 0 && error("gmshModelMeshFieldSetNumbers returned non-zero error code: $(ierr[])") return nothing end @@ -2067,7 +2216,7 @@ Set the field `tag` as the background mesh size field. """ function setAsBackgroundMesh(tag) ierr = Ref{Cint}() - ccall((:gmshModelMeshFieldSetAsBackgroundMesh, gmsh.lib), Nothing, + ccall((:gmshModelMeshFieldSetAsBackgroundMesh, gmsh.lib), Cvoid, (Cint, Ptr{Cint}), tag, ierr) ierr[] != 0 && error("gmshModelMeshFieldSetAsBackgroundMesh returned non-zero error code: $(ierr[])") @@ -2081,7 +2230,7 @@ Set the field `tag` as a boundary layer size field. """ function setAsBoundaryLayer(tag) ierr = Ref{Cint}() - ccall((:gmshModelMeshFieldSetAsBoundaryLayer, gmsh.lib), Nothing, + ccall((:gmshModelMeshFieldSetAsBoundaryLayer, gmsh.lib), Cvoid, (Cint, Ptr{Cint}), tag, ierr) ierr[] != 0 && error("gmshModelMeshFieldSetAsBoundaryLayer returned non-zero error code: $(ierr[])") @@ -2095,7 +2244,7 @@ end # end of module mesh """ module gmsh.model.geo -Internal per-model GEO CAD kernel functions +Built-in CAD kernel functions """ module geo @@ -2104,9 +2253,9 @@ import ...gmsh """ gmsh.model.geo.addPoint(x, y, z, meshSize = 0., tag = -1) -Add a geometrical point in the internal GEO CAD representation, at coordinates -(`x`, `y`, `z`). If `meshSize` is > 0, add a meshing constraint at that point. -If `tag` is positive, set the tag explicitly; otherwise a new tag is selected +Add a geometrical point in the built-in CAD representation, at coordinates (`x`, +`y`, `z`). If `meshSize` is > 0, add a meshing constraint at that point. If +`tag` is positive, set the tag explicitly; otherwise a new tag is selected automatically. Return the tag of the point. (Note that the point will be added in the current model only after `synchronize` is called. This behavior holds for all the entities added in the geo module.) @@ -2143,10 +2292,10 @@ end """ gmsh.model.geo.addCircleArc(startTag, centerTag, endTag, tag = -1, nx = 0., ny = 0., nz = 0.) -Add a circle arc (stricly smaller than Pi) between the two points with tags +Add a circle arc (strictly smaller than Pi) between the two points with tags `startTag` and `endTag`, with center `centertag`. If `tag` is positive, set the tag explicitly; otherwise a new tag is selected automatically. If (`nx`, `ny`, -`nz`) != (0,0,0), explicitely set the plane of the circle arc. Return the tag of +`nz`) != (0,0,0), explicitly set the plane of the circle arc. Return the tag of the circle arc. Return an integer value. @@ -2163,11 +2312,11 @@ end """ gmsh.model.geo.addEllipseArc(startTag, centerTag, majorTag, endTag, tag = -1, nx = 0., ny = 0., nz = 0.) -Add an ellipse arc (stricly smaller than Pi) between the two points `startTag` +Add an ellipse arc (strictly smaller than Pi) between the two points `startTag` and `endTag`, with center `centertag` and major axis point `majorTag`. If `tag` is positive, set the tag explicitly; otherwise a new tag is selected -automatically. If (`nx`, `ny`, `nz`) != (0,0,0), explicitely set the plane of -the circle arc. Return the tag of the ellipse arc. +automatically. If (`nx`, `ny`, `nz`) != (0,0,0), explicitly set the plane of the +circle arc. Return the tag of the ellipse arc. Return an integer value. """ @@ -2240,10 +2389,10 @@ end gmsh.model.geo.addCurveLoop(curveTags, tag = -1) Add a curve loop (a closed wire) formed by the curves `curveTags`. `curveTags` -should contain (signed) tags of geometrical enties of dimension 1 forming a -closed loop: a negative tag signifies that the underlying curve is considered -with reversed orientation. If `tag` is positive, set the tag explicitly; -otherwise a new tag is selected automatically. Return the tag of the curve loop. +should contain (signed) tags of model enties of dimension 1 forming a closed +loop: a negative tag signifies that the underlying curve is considered with +reversed orientation. If `tag` is positive, set the tag explicitly; otherwise a +new tag is selected automatically. Return the tag of the curve loop. Return an integer value. """ @@ -2334,11 +2483,12 @@ end """ gmsh.model.geo.extrude(dimTags, dx, dy, dz, numElements = Cint[], heights = Cdouble[], recombine = false) -Extrude the geometrical entities `dimTags` by translation along (`dx`, `dy`, -`dz`). Return extruded entities in `outDimTags`. If `numElements` is not empty, -also extrude the mesh: the entries in `numElements` give the number of elements -in each layer. If `height` is not empty, it provides the (cummulative) height of -the different layers, normalized to 1. +Extrude the model entities `dimTags` by translation along (`dx`, `dy`, `dz`). +Return extruded entities in `outDimTags`. If `numElements` is not empty, also +extrude the mesh: the entries in `numElements` give the number of elements in +each layer. If `height` is not empty, it provides the (cumulative) height of the +different layers, normalized to 1. If `dx` == `dy` == `dz` == 0, the entities +are extruded along their normal. Return `outDimTags`. """ @@ -2346,9 +2496,9 @@ function extrude(dimTags, dx, dy, dz, numElements = Cint[], heights = Cdouble[], api_outDimTags_ = Ref{Ptr{Cint}}() api_outDimTags_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelGeoExtrude, gmsh.lib), Nothing, + ccall((:gmshModelGeoExtrude, gmsh.lib), Cvoid, (Ptr{Cint}, Csize_t, Cdouble, Cdouble, Cdouble, Ptr{Ptr{Cint}}, Ptr{Csize_t}, Ptr{Cint}, Csize_t, Ptr{Cdouble}, Csize_t, Cint, Ptr{Cint}), - convert(Vector{Cint}, collect(Cint, Iterators.flatten(dimTags))), 2 * length(dimTags), dx, dy, dz, api_outDimTags_, api_outDimTags_n_, convert(Vector{Cint}, numElements), length(numElements), heights, length(heights), recombine, ierr) + convert(Vector{Cint}, collect(Cint, Iterators.flatten(dimTags))), 2 * length(dimTags), dx, dy, dz, api_outDimTags_, api_outDimTags_n_, convert(Vector{Cint}, numElements), length(numElements), convert(Vector{Cdouble}, heights), length(heights), recombine, ierr) ierr[] != 0 && error("gmshModelGeoExtrude returned non-zero error code: $(ierr[])") tmp_api_outDimTags_ = unsafe_wrap(Array, api_outDimTags_[], api_outDimTags_n_[], own=true) outDimTags = [ (tmp_api_outDimTags_[i], tmp_api_outDimTags_[i+1]) for i in 1:2:length(tmp_api_outDimTags_) ] @@ -2358,12 +2508,12 @@ end """ gmsh.model.geo.revolve(dimTags, x, y, z, ax, ay, az, angle, numElements = Cint[], heights = Cdouble[], recombine = false) -Extrude the geometrical entities `dimTags` by rotation of `angle` radians around -the axis of revolution defined by the point (`x`, `y`, `z`) and the direction -(`ax`, `ay`, `az`). Return extruded entities in `outDimTags`. If `numElements` -is not empty, also extrude the mesh: the entries in `numElements` give the -number of elements in each layer. If `height` is not empty, it provides the -(cummulative) height of the different layers, normalized to 1. +Extrude the model entities `dimTags` by rotation of `angle` radians around the +axis of revolution defined by the point (`x`, `y`, `z`) and the direction (`ax`, +`ay`, `az`). Return extruded entities in `outDimTags`. If `numElements` is not +empty, also extrude the mesh: the entries in `numElements` give the number of +elements in each layer. If `height` is not empty, it provides the (cumulative) +height of the different layers, normalized to 1. Return `outDimTags`. """ @@ -2371,9 +2521,9 @@ function revolve(dimTags, x, y, z, ax, ay, az, angle, numElements = Cint[], heig api_outDimTags_ = Ref{Ptr{Cint}}() api_outDimTags_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelGeoRevolve, gmsh.lib), Nothing, + ccall((:gmshModelGeoRevolve, gmsh.lib), Cvoid, (Ptr{Cint}, Csize_t, Cdouble, Cdouble, Cdouble, Cdouble, Cdouble, Cdouble, Cdouble, Ptr{Ptr{Cint}}, Ptr{Csize_t}, Ptr{Cint}, Csize_t, Ptr{Cdouble}, Csize_t, Cint, Ptr{Cint}), - convert(Vector{Cint}, collect(Cint, Iterators.flatten(dimTags))), 2 * length(dimTags), x, y, z, ax, ay, az, angle, api_outDimTags_, api_outDimTags_n_, convert(Vector{Cint}, numElements), length(numElements), heights, length(heights), recombine, ierr) + convert(Vector{Cint}, collect(Cint, Iterators.flatten(dimTags))), 2 * length(dimTags), x, y, z, ax, ay, az, angle, api_outDimTags_, api_outDimTags_n_, convert(Vector{Cint}, numElements), length(numElements), convert(Vector{Cdouble}, heights), length(heights), recombine, ierr) ierr[] != 0 && error("gmshModelGeoRevolve returned non-zero error code: $(ierr[])") tmp_api_outDimTags_ = unsafe_wrap(Array, api_outDimTags_[], api_outDimTags_n_[], own=true) outDimTags = [ (tmp_api_outDimTags_[i], tmp_api_outDimTags_[i+1]) for i in 1:2:length(tmp_api_outDimTags_) ] @@ -2383,13 +2533,13 @@ end """ gmsh.model.geo.twist(dimTags, x, y, z, dx, dy, dz, ax, ay, az, angle, numElements = Cint[], heights = Cdouble[], recombine = false) -Extrude the geometrical entities `dimTags` by a combined translation and -rotation of `angle` radians, along (`dx`, `dy`, `dz`) and around the axis of -revolution defined by the point (`x`, `y`, `z`) and the direction (`ax`, `ay`, -`az`). Return extruded entities in `outDimTags`. If `numElements` is not empty, -also extrude the mesh: the entries in `numElements` give the number of elements -in each layer. If `height` is not empty, it provides the (cummulative) height of -the different layers, normalized to 1. +Extrude the model entities `dimTags` by a combined translation and rotation of +`angle` radians, along (`dx`, `dy`, `dz`) and around the axis of revolution +defined by the point (`x`, `y`, `z`) and the direction (`ax`, `ay`, `az`). +Return extruded entities in `outDimTags`. If `numElements` is not empty, also +extrude the mesh: the entries in `numElements` give the number of elements in +each layer. If `height` is not empty, it provides the (cumulative) height of the +different layers, normalized to 1. Return `outDimTags`. """ @@ -2397,9 +2547,9 @@ function twist(dimTags, x, y, z, dx, dy, dz, ax, ay, az, angle, numElements = Ci api_outDimTags_ = Ref{Ptr{Cint}}() api_outDimTags_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelGeoTwist, gmsh.lib), Nothing, + ccall((:gmshModelGeoTwist, gmsh.lib), Cvoid, (Ptr{Cint}, Csize_t, Cdouble, Cdouble, Cdouble, Cdouble, Cdouble, Cdouble, Cdouble, Cdouble, Cdouble, Cdouble, Ptr{Ptr{Cint}}, Ptr{Csize_t}, Ptr{Cint}, Csize_t, Ptr{Cdouble}, Csize_t, Cint, Ptr{Cint}), - convert(Vector{Cint}, collect(Cint, Iterators.flatten(dimTags))), 2 * length(dimTags), x, y, z, dx, dy, dz, ax, ay, az, angle, api_outDimTags_, api_outDimTags_n_, convert(Vector{Cint}, numElements), length(numElements), heights, length(heights), recombine, ierr) + convert(Vector{Cint}, collect(Cint, Iterators.flatten(dimTags))), 2 * length(dimTags), x, y, z, dx, dy, dz, ax, ay, az, angle, api_outDimTags_, api_outDimTags_n_, convert(Vector{Cint}, numElements), length(numElements), convert(Vector{Cdouble}, heights), length(heights), recombine, ierr) ierr[] != 0 && error("gmshModelGeoTwist returned non-zero error code: $(ierr[])") tmp_api_outDimTags_ = unsafe_wrap(Array, api_outDimTags_[], api_outDimTags_n_[], own=true) outDimTags = [ (tmp_api_outDimTags_[i], tmp_api_outDimTags_[i+1]) for i in 1:2:length(tmp_api_outDimTags_) ] @@ -2409,11 +2559,11 @@ end """ gmsh.model.geo.translate(dimTags, dx, dy, dz) -Translate the geometrical entities `dimTags` along (`dx`, `dy`, `dz`). +Translate the model entities `dimTags` along (`dx`, `dy`, `dz`). """ function translate(dimTags, dx, dy, dz) ierr = Ref{Cint}() - ccall((:gmshModelGeoTranslate, gmsh.lib), Nothing, + ccall((:gmshModelGeoTranslate, gmsh.lib), Cvoid, (Ptr{Cint}, Csize_t, Cdouble, Cdouble, Cdouble, Ptr{Cint}), convert(Vector{Cint}, collect(Cint, Iterators.flatten(dimTags))), 2 * length(dimTags), dx, dy, dz, ierr) ierr[] != 0 && error("gmshModelGeoTranslate returned non-zero error code: $(ierr[])") @@ -2423,13 +2573,13 @@ end """ gmsh.model.geo.rotate(dimTags, x, y, z, ax, ay, az, angle) -Rotate the geometrical entities `dimTags` of `angle` radians around the axis of +Rotate the model entities `dimTags` of `angle` radians around the axis of revolution defined by the point (`x`, `y`, `z`) and the direction (`ax`, `ay`, `az`). """ function rotate(dimTags, x, y, z, ax, ay, az, angle) ierr = Ref{Cint}() - ccall((:gmshModelGeoRotate, gmsh.lib), Nothing, + ccall((:gmshModelGeoRotate, gmsh.lib), Cvoid, (Ptr{Cint}, Csize_t, Cdouble, Cdouble, Cdouble, Cdouble, Cdouble, Cdouble, Cdouble, Ptr{Cint}), convert(Vector{Cint}, collect(Cint, Iterators.flatten(dimTags))), 2 * length(dimTags), x, y, z, ax, ay, az, angle, ierr) ierr[] != 0 && error("gmshModelGeoRotate returned non-zero error code: $(ierr[])") @@ -2439,13 +2589,13 @@ end """ gmsh.model.geo.dilate(dimTags, x, y, z, a, b, c) -Scale the geometrical entities `dimTag` by factors `a`, `b` and `c` along the -three coordinate axes; use (`x`, `y`, `z`) as the center of the homothetic +Scale the model entities `dimTag` by factors `a`, `b` and `c` along the three +coordinate axes; use (`x`, `y`, `z`) as the center of the homothetic transformation. """ function dilate(dimTags, x, y, z, a, b, c) ierr = Ref{Cint}() - ccall((:gmshModelGeoDilate, gmsh.lib), Nothing, + ccall((:gmshModelGeoDilate, gmsh.lib), Cvoid, (Ptr{Cint}, Csize_t, Cdouble, Cdouble, Cdouble, Cdouble, Cdouble, Cdouble, Ptr{Cint}), convert(Vector{Cint}, collect(Cint, Iterators.flatten(dimTags))), 2 * length(dimTags), x, y, z, a, b, c, ierr) ierr[] != 0 && error("gmshModelGeoDilate returned non-zero error code: $(ierr[])") @@ -2455,12 +2605,12 @@ end """ gmsh.model.geo.symmetrize(dimTags, a, b, c, d) -Apply a symmetry transformation to the geometrical entities `dimTag`, with -respect to the plane of equation `a` * x + `b` * y + `c` * z + `d` = 0. +Apply a symmetry transformation to the model entities `dimTag`, with respect to +the plane of equation `a` * x + `b` * y + `c` * z + `d` = 0. """ function symmetrize(dimTags, a, b, c, d) ierr = Ref{Cint}() - ccall((:gmshModelGeoSymmetrize, gmsh.lib), Nothing, + ccall((:gmshModelGeoSymmetrize, gmsh.lib), Cvoid, (Ptr{Cint}, Csize_t, Cdouble, Cdouble, Cdouble, Cdouble, Ptr{Cint}), convert(Vector{Cint}, collect(Cint, Iterators.flatten(dimTags))), 2 * length(dimTags), a, b, c, d, ierr) ierr[] != 0 && error("gmshModelGeoSymmetrize returned non-zero error code: $(ierr[])") @@ -2478,7 +2628,7 @@ function copy(dimTags) api_outDimTags_ = Ref{Ptr{Cint}}() api_outDimTags_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelGeoCopy, gmsh.lib), Nothing, + ccall((:gmshModelGeoCopy, gmsh.lib), Cvoid, (Ptr{Cint}, Csize_t, Ptr{Ptr{Cint}}, Ptr{Csize_t}, Ptr{Cint}), convert(Vector{Cint}, collect(Cint, Iterators.flatten(dimTags))), 2 * length(dimTags), api_outDimTags_, api_outDimTags_n_, ierr) ierr[] != 0 && error("gmshModelGeoCopy returned non-zero error code: $(ierr[])") @@ -2495,7 +2645,7 @@ on their boundaries, down to dimension 0. """ function remove(dimTags, recursive = false) ierr = Ref{Cint}() - ccall((:gmshModelGeoRemove, gmsh.lib), Nothing, + ccall((:gmshModelGeoRemove, gmsh.lib), Cvoid, (Ptr{Cint}, Csize_t, Cint, Ptr{Cint}), convert(Vector{Cint}, collect(Cint, Iterators.flatten(dimTags))), 2 * length(dimTags), recursive, ierr) ierr[] != 0 && error("gmshModelGeoRemove returned non-zero error code: $(ierr[])") @@ -2510,7 +2660,7 @@ location). """ function removeAllDuplicates() ierr = Ref{Cint}() - ccall((:gmshModelGeoRemoveAllDuplicates, gmsh.lib), Nothing, + ccall((:gmshModelGeoRemoveAllDuplicates, gmsh.lib), Cvoid, (Ptr{Cint},), ierr) ierr[] != 0 && error("gmshModelGeoRemoveAllDuplicates returned non-zero error code: $(ierr[])") @@ -2520,13 +2670,13 @@ end """ gmsh.model.geo.synchronize() -Synchronize the internal GEO CAD representation with the current Gmsh model. -This can be called at any time, but since it involves a non trivial amount of +Synchronize the built-in CAD representation with the current Gmsh model. This +can be called at any time, but since it involves a non trivial amount of processing, the number of synchronization points should normally be minimized. """ function synchronize() ierr = Ref{Cint}() - ccall((:gmshModelGeoSynchronize, gmsh.lib), Nothing, + ccall((:gmshModelGeoSynchronize, gmsh.lib), Cvoid, (Ptr{Cint},), ierr) ierr[] != 0 && error("gmshModelGeoSynchronize returned non-zero error code: $(ierr[])") @@ -2536,7 +2686,7 @@ end """ module gmsh.model.geo.mesh -GEO-specific meshing constraints +Built-in CAD kernel meshing constraints """ module mesh @@ -2545,12 +2695,12 @@ import ....gmsh """ gmsh.model.geo.mesh.setSize(dimTags, size) -Set a mesh size constraint on the geometrical entities `dimTags`. Currently only +Set a mesh size constraint on the model entities `dimTags`. Currently only entities of dimension 0 (points) are handled. """ function setSize(dimTags, size) ierr = Ref{Cint}() - ccall((:gmshModelGeoMeshSetSize, gmsh.lib), Nothing, + ccall((:gmshModelGeoMeshSetSize, gmsh.lib), Cvoid, (Ptr{Cint}, Csize_t, Cdouble, Ptr{Cint}), convert(Vector{Cint}, collect(Cint, Iterators.flatten(dimTags))), 2 * length(dimTags), size, ierr) ierr[] != 0 && error("gmshModelGeoMeshSetSize returned non-zero error code: $(ierr[])") @@ -2563,11 +2713,11 @@ end Set a transfinite meshing constraint on the curve `tag`, with `numNodes` nodes distributed according to `meshType` and `coef`. Currently supported types are "Progression" (geometrical progression with power `coef`) and "Bump" (refinement -toward both extreminties of the curve). +toward both extremities of the curve). """ function setTransfiniteCurve(tag, nPoints, meshType = "Progression", coef = 1.) ierr = Ref{Cint}() - ccall((:gmshModelGeoMeshSetTransfiniteCurve, gmsh.lib), Nothing, + ccall((:gmshModelGeoMeshSetTransfiniteCurve, gmsh.lib), Cvoid, (Cint, Cint, Ptr{Cchar}, Cdouble, Ptr{Cint}), tag, nPoints, meshType, coef, ierr) ierr[] != 0 && error("gmshModelGeoMeshSetTransfiniteCurve returned non-zero error code: $(ierr[])") @@ -2586,7 +2736,7 @@ mandatory if the surface has more that 3 or 4 points on its boundary. """ function setTransfiniteSurface(tag, arrangement = "Left", cornerTags = Cint[]) ierr = Ref{Cint}() - ccall((:gmshModelGeoMeshSetTransfiniteSurface, gmsh.lib), Nothing, + ccall((:gmshModelGeoMeshSetTransfiniteSurface, gmsh.lib), Cvoid, (Cint, Ptr{Cchar}, Ptr{Cint}, Csize_t, Ptr{Cint}), tag, arrangement, convert(Vector{Cint}, cornerTags), length(cornerTags), ierr) ierr[] != 0 && error("gmshModelGeoMeshSetTransfiniteSurface returned non-zero error code: $(ierr[])") @@ -2602,7 +2752,7 @@ explicitly. """ function setTransfiniteVolume(tag, cornerTags = Cint[]) ierr = Ref{Cint}() - ccall((:gmshModelGeoMeshSetTransfiniteVolume, gmsh.lib), Nothing, + ccall((:gmshModelGeoMeshSetTransfiniteVolume, gmsh.lib), Cvoid, (Cint, Ptr{Cint}, Csize_t, Ptr{Cint}), tag, convert(Vector{Cint}, cornerTags), length(cornerTags), ierr) ierr[] != 0 && error("gmshModelGeoMeshSetTransfiniteVolume returned non-zero error code: $(ierr[])") @@ -2612,13 +2762,13 @@ end """ gmsh.model.geo.mesh.setRecombine(dim, tag, angle = 45.) -Set a recombination meshing constraint on the geometrical entity of dimension -`dim` and tag `tag`. Currently only entities of dimension 2 (to recombine -triangles into quadrangles) are supported. +Set a recombination meshing constraint on the model entity of dimension `dim` +and tag `tag`. Currently only entities of dimension 2 (to recombine triangles +into quadrangles) are supported. """ function setRecombine(dim, tag, angle = 45.) ierr = Ref{Cint}() - ccall((:gmshModelGeoMeshSetRecombine, gmsh.lib), Nothing, + ccall((:gmshModelGeoMeshSetRecombine, gmsh.lib), Cvoid, (Cint, Cint, Cdouble, Ptr{Cint}), dim, tag, angle, ierr) ierr[] != 0 && error("gmshModelGeoMeshSetRecombine returned non-zero error code: $(ierr[])") @@ -2628,12 +2778,12 @@ end """ gmsh.model.geo.mesh.setSmoothing(dim, tag, val) -Set a smoothing meshing constraint on the geometrical entity of dimension `dim` -and tag `tag`. `val` iterations of a Laplace smoother are applied. +Set a smoothing meshing constraint on the model entity of dimension `dim` and +tag `tag`. `val` iterations of a Laplace smoother are applied. """ function setSmoothing(dim, tag, val) ierr = Ref{Cint}() - ccall((:gmshModelGeoMeshSetSmoothing, gmsh.lib), Nothing, + ccall((:gmshModelGeoMeshSetSmoothing, gmsh.lib), Cvoid, (Cint, Cint, Cint, Ptr{Cint}), dim, tag, val, ierr) ierr[] != 0 && error("gmshModelGeoMeshSetSmoothing returned non-zero error code: $(ierr[])") @@ -2643,15 +2793,14 @@ end """ gmsh.model.geo.mesh.setReverse(dim, tag, val = true) -Set a reverse meshing constraint on the geometrical entity of dimension `dim` -and tag `tag`. If `val` is true, the mesh orientation will be reversed with -respect to the natural mesh orientation (i.e. the orientation consistent with -the orientation of the geometrical entity). If `val` is false, the mesh is left -as-is. +Set a reverse meshing constraint on the model entity of dimension `dim` and tag +`tag`. If `val` is true, the mesh orientation will be reversed with respect to +the natural mesh orientation (i.e. the orientation consistent with the +orientation of the geometry). If `val` is false, the mesh is left as-is. """ function setReverse(dim, tag, val = true) ierr = Ref{Cint}() - ccall((:gmshModelGeoMeshSetReverse, gmsh.lib), Nothing, + ccall((:gmshModelGeoMeshSetReverse, gmsh.lib), Cvoid, (Cint, Cint, Cint, Ptr{Cint}), dim, tag, val, ierr) ierr[] != 0 && error("gmshModelGeoMeshSetReverse returned non-zero error code: $(ierr[])") @@ -2665,7 +2814,7 @@ end # end of module geo """ module gmsh.model.occ -Internal per-model OpenCASCADE CAD kernel functions +OpenCASCADE CAD kernel functions """ module occ @@ -2674,12 +2823,12 @@ import ...gmsh """ gmsh.model.occ.addPoint(x, y, z, meshSize = 0., tag = -1) -Add a geometrical point in the internal OpenCASCADE CAD representation, at -coordinates (`x`, `y`, `z`). If `meshSize` is > 0, add a meshing constraint at -that point. If `tag` is positive, set the tag explicitly; otherwise a new tag is -selected automatically. Return the tag of the point. (Note that the point will -be added in the current model only after `synchronize` is called. This behavior -holds for all the entities added in the occ module.) +Add a geometrical point in the OpenCASCADE CAD representation, at coordinates +(`x`, `y`, `z`). If `meshSize` is > 0, add a meshing constraint at that point. +If `tag` is positive, set the tag explicitly; otherwise a new tag is selected +automatically. Return the tag of the point. (Note that the point will be added +in the current model only after `synchronize` is called. This behavior holds for +all the entities added in the occ module.) Return an integer value. """ @@ -2818,7 +2967,7 @@ function addBSpline(pointTags, tag = -1, degree = 3, weights = Cdouble[], knots ierr = Ref{Cint}() api__result__ = ccall((:gmshModelOccAddBSpline, gmsh.lib), Cint, (Ptr{Cint}, Csize_t, Cint, Cint, Ptr{Cdouble}, Csize_t, Ptr{Cdouble}, Csize_t, Ptr{Cint}, Csize_t, Ptr{Cint}), - convert(Vector{Cint}, pointTags), length(pointTags), tag, degree, weights, length(weights), knots, length(knots), convert(Vector{Cint}, multiplicities), length(multiplicities), ierr) + convert(Vector{Cint}, pointTags), length(pointTags), tag, degree, convert(Vector{Cdouble}, weights), length(weights), convert(Vector{Cdouble}, knots), length(knots), convert(Vector{Cint}, multiplicities), length(multiplicities), ierr) ierr[] != 0 && error("gmshModelOccAddBSpline returned non-zero error code: $(ierr[])") return api__result__ end @@ -3125,7 +3274,7 @@ function addThruSections(wireTags, tag = -1, makeSolid = true, makeRuled = false api_outDimTags_ = Ref{Ptr{Cint}}() api_outDimTags_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelOccAddThruSections, gmsh.lib), Nothing, + ccall((:gmshModelOccAddThruSections, gmsh.lib), Cvoid, (Ptr{Cint}, Csize_t, Ptr{Ptr{Cint}}, Ptr{Csize_t}, Cint, Cint, Cint, Ptr{Cint}), convert(Vector{Cint}, wireTags), length(wireTags), api_outDimTags_, api_outDimTags_n_, tag, makeSolid, makeRuled, ierr) ierr[] != 0 && error("gmshModelOccAddThruSections returned non-zero error code: $(ierr[])") @@ -3149,7 +3298,7 @@ function addThickSolid(volumeTag, excludeSurfaceTags, offset, tag = -1) api_outDimTags_ = Ref{Ptr{Cint}}() api_outDimTags_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelOccAddThickSolid, gmsh.lib), Nothing, + ccall((:gmshModelOccAddThickSolid, gmsh.lib), Cvoid, (Cint, Ptr{Cint}, Csize_t, Cdouble, Ptr{Ptr{Cint}}, Ptr{Csize_t}, Cint, Ptr{Cint}), volumeTag, convert(Vector{Cint}, excludeSurfaceTags), length(excludeSurfaceTags), offset, api_outDimTags_, api_outDimTags_n_, tag, ierr) ierr[] != 0 && error("gmshModelOccAddThickSolid returned non-zero error code: $(ierr[])") @@ -3161,11 +3310,11 @@ end """ gmsh.model.occ.extrude(dimTags, dx, dy, dz, numElements = Cint[], heights = Cdouble[], recombine = false) -Extrude the geometrical entities `dimTags` by translation along (`dx`, `dy`, -`dz`). Return extruded entities in `outDimTags`. If `numElements` is not empty, -also extrude the mesh: the entries in `numElements` give the number of elements -in each layer. If `height` is not empty, it provides the (cummulative) height of -the different layers, normalized to 1. +Extrude the model entities `dimTags` by translation along (`dx`, `dy`, `dz`). +Return extruded entities in `outDimTags`. If `numElements` is not empty, also +extrude the mesh: the entries in `numElements` give the number of elements in +each layer. If `height` is not empty, it provides the (cumulative) height of the +different layers, normalized to 1. Return `outDimTags`. """ @@ -3173,9 +3322,9 @@ function extrude(dimTags, dx, dy, dz, numElements = Cint[], heights = Cdouble[], api_outDimTags_ = Ref{Ptr{Cint}}() api_outDimTags_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelOccExtrude, gmsh.lib), Nothing, + ccall((:gmshModelOccExtrude, gmsh.lib), Cvoid, (Ptr{Cint}, Csize_t, Cdouble, Cdouble, Cdouble, Ptr{Ptr{Cint}}, Ptr{Csize_t}, Ptr{Cint}, Csize_t, Ptr{Cdouble}, Csize_t, Cint, Ptr{Cint}), - convert(Vector{Cint}, collect(Cint, Iterators.flatten(dimTags))), 2 * length(dimTags), dx, dy, dz, api_outDimTags_, api_outDimTags_n_, convert(Vector{Cint}, numElements), length(numElements), heights, length(heights), recombine, ierr) + convert(Vector{Cint}, collect(Cint, Iterators.flatten(dimTags))), 2 * length(dimTags), dx, dy, dz, api_outDimTags_, api_outDimTags_n_, convert(Vector{Cint}, numElements), length(numElements), convert(Vector{Cdouble}, heights), length(heights), recombine, ierr) ierr[] != 0 && error("gmshModelOccExtrude returned non-zero error code: $(ierr[])") tmp_api_outDimTags_ = unsafe_wrap(Array, api_outDimTags_[], api_outDimTags_n_[], own=true) outDimTags = [ (tmp_api_outDimTags_[i], tmp_api_outDimTags_[i+1]) for i in 1:2:length(tmp_api_outDimTags_) ] @@ -3185,12 +3334,12 @@ end """ gmsh.model.occ.revolve(dimTags, x, y, z, ax, ay, az, angle, numElements = Cint[], heights = Cdouble[], recombine = false) -Extrude the geometrical entities `dimTags` by rotation of `angle` radians around -the axis of revolution defined by the point (`x`, `y`, `z`) and the direction -(`ax`, `ay`, `az`). Return extruded entities in `outDimTags`. If `numElements` -is not empty, also extrude the mesh: the entries in `numElements` give the -number of elements in each layer. If `height` is not empty, it provides the -(cummulative) height of the different layers, normalized to 1. +Extrude the model entities `dimTags` by rotation of `angle` radians around the +axis of revolution defined by the point (`x`, `y`, `z`) and the direction (`ax`, +`ay`, `az`). Return extruded entities in `outDimTags`. If `numElements` is not +empty, also extrude the mesh: the entries in `numElements` give the number of +elements in each layer. If `height` is not empty, it provides the (cumulative) +height of the different layers, normalized to 1. Return `outDimTags`. """ @@ -3198,9 +3347,9 @@ function revolve(dimTags, x, y, z, ax, ay, az, angle, numElements = Cint[], heig api_outDimTags_ = Ref{Ptr{Cint}}() api_outDimTags_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelOccRevolve, gmsh.lib), Nothing, + ccall((:gmshModelOccRevolve, gmsh.lib), Cvoid, (Ptr{Cint}, Csize_t, Cdouble, Cdouble, Cdouble, Cdouble, Cdouble, Cdouble, Cdouble, Ptr{Ptr{Cint}}, Ptr{Csize_t}, Ptr{Cint}, Csize_t, Ptr{Cdouble}, Csize_t, Cint, Ptr{Cint}), - convert(Vector{Cint}, collect(Cint, Iterators.flatten(dimTags))), 2 * length(dimTags), x, y, z, ax, ay, az, angle, api_outDimTags_, api_outDimTags_n_, convert(Vector{Cint}, numElements), length(numElements), heights, length(heights), recombine, ierr) + convert(Vector{Cint}, collect(Cint, Iterators.flatten(dimTags))), 2 * length(dimTags), x, y, z, ax, ay, az, angle, api_outDimTags_, api_outDimTags_n_, convert(Vector{Cint}, numElements), length(numElements), convert(Vector{Cdouble}, heights), length(heights), recombine, ierr) ierr[] != 0 && error("gmshModelOccRevolve returned non-zero error code: $(ierr[])") tmp_api_outDimTags_ = unsafe_wrap(Array, api_outDimTags_[], api_outDimTags_n_[], own=true) outDimTags = [ (tmp_api_outDimTags_[i], tmp_api_outDimTags_[i+1]) for i in 1:2:length(tmp_api_outDimTags_) ] @@ -3219,7 +3368,7 @@ function addPipe(dimTags, wireTag) api_outDimTags_ = Ref{Ptr{Cint}}() api_outDimTags_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelOccAddPipe, gmsh.lib), Nothing, + ccall((:gmshModelOccAddPipe, gmsh.lib), Cvoid, (Ptr{Cint}, Csize_t, Cint, Ptr{Ptr{Cint}}, Ptr{Csize_t}, Ptr{Cint}), convert(Vector{Cint}, collect(Cint, Iterators.flatten(dimTags))), 2 * length(dimTags), wireTag, api_outDimTags_, api_outDimTags_n_, ierr) ierr[] != 0 && error("gmshModelOccAddPipe returned non-zero error code: $(ierr[])") @@ -3243,9 +3392,9 @@ function fillet(volumeTags, curveTags, radii, removeVolume = true) api_outDimTags_ = Ref{Ptr{Cint}}() api_outDimTags_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelOccFillet, gmsh.lib), Nothing, + ccall((:gmshModelOccFillet, gmsh.lib), Cvoid, (Ptr{Cint}, Csize_t, Ptr{Cint}, Csize_t, Ptr{Cdouble}, Csize_t, Ptr{Ptr{Cint}}, Ptr{Csize_t}, Cint, Ptr{Cint}), - convert(Vector{Cint}, volumeTags), length(volumeTags), convert(Vector{Cint}, curveTags), length(curveTags), radii, length(radii), api_outDimTags_, api_outDimTags_n_, removeVolume, ierr) + convert(Vector{Cint}, volumeTags), length(volumeTags), convert(Vector{Cint}, curveTags), length(curveTags), convert(Vector{Cdouble}, radii), length(radii), api_outDimTags_, api_outDimTags_n_, removeVolume, ierr) ierr[] != 0 && error("gmshModelOccFillet returned non-zero error code: $(ierr[])") tmp_api_outDimTags_ = unsafe_wrap(Array, api_outDimTags_[], api_outDimTags_n_[], own=true) outDimTags = [ (tmp_api_outDimTags_[i], tmp_api_outDimTags_[i+1]) for i in 1:2:length(tmp_api_outDimTags_) ] @@ -3269,9 +3418,9 @@ function chamfer(volumeTags, curveTags, surfaceTags, distances, removeVolume = t api_outDimTags_ = Ref{Ptr{Cint}}() api_outDimTags_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelOccChamfer, gmsh.lib), Nothing, + ccall((:gmshModelOccChamfer, gmsh.lib), Cvoid, (Ptr{Cint}, Csize_t, Ptr{Cint}, Csize_t, Ptr{Cint}, Csize_t, Ptr{Cdouble}, Csize_t, Ptr{Ptr{Cint}}, Ptr{Csize_t}, Cint, Ptr{Cint}), - convert(Vector{Cint}, volumeTags), length(volumeTags), convert(Vector{Cint}, curveTags), length(curveTags), convert(Vector{Cint}, surfaceTags), length(surfaceTags), distances, length(distances), api_outDimTags_, api_outDimTags_n_, removeVolume, ierr) + convert(Vector{Cint}, volumeTags), length(volumeTags), convert(Vector{Cint}, curveTags), length(curveTags), convert(Vector{Cint}, surfaceTags), length(surfaceTags), convert(Vector{Cdouble}, distances), length(distances), api_outDimTags_, api_outDimTags_n_, removeVolume, ierr) ierr[] != 0 && error("gmshModelOccChamfer returned non-zero error code: $(ierr[])") tmp_api_outDimTags_ = unsafe_wrap(Array, api_outDimTags_[], api_outDimTags_n_[], own=true) outDimTags = [ (tmp_api_outDimTags_[i], tmp_api_outDimTags_[i+1]) for i in 1:2:length(tmp_api_outDimTags_) ] @@ -3283,7 +3432,7 @@ end Compute the boolean union (the fusion) of the entities `objectDimTags` and `toolDimTags`. Return the resulting entities in `outDimTags`. If `tag` is -positive, try to set the tag explicitly (ony valid if the boolean operation +positive, try to set the tag explicitly (only valid if the boolean operation results in a single entity). Remove the object if `removeObject` is set. Remove the tool if `removeTool` is set. @@ -3296,7 +3445,7 @@ function fuse(objectDimTags, toolDimTags, tag = -1, removeObject = true, removeT api_outDimTagsMap_n_ = Ref{Ptr{Csize_t}}() api_outDimTagsMap_nn_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelOccFuse, gmsh.lib), Nothing, + ccall((:gmshModelOccFuse, gmsh.lib), Cvoid, (Ptr{Cint}, Csize_t, Ptr{Cint}, Csize_t, Ptr{Ptr{Cint}}, Ptr{Csize_t}, Ptr{Ptr{Ptr{Cint}}}, Ptr{Ptr{Csize_t}}, Ptr{Csize_t}, Cint, Cint, Cint, Ptr{Cint}), convert(Vector{Cint}, collect(Cint, Iterators.flatten(objectDimTags))), 2 * length(objectDimTags), convert(Vector{Cint}, collect(Cint, Iterators.flatten(toolDimTags))), 2 * length(toolDimTags), api_outDimTags_, api_outDimTags_n_, api_outDimTagsMap_, api_outDimTagsMap_n_, api_outDimTagsMap_nn_, tag, removeObject, removeTool, ierr) ierr[] != 0 && error("gmshModelOccFuse returned non-zero error code: $(ierr[])") @@ -3318,7 +3467,7 @@ end Compute the boolean intersection (the common parts) of the entities `objectDimTags` and `toolDimTags`. Return the resulting entities in -`outDimTags`. If `tag` is positive, try to set the tag explicitly (ony valid if +`outDimTags`. If `tag` is positive, try to set the tag explicitly (only valid if the boolean operation results in a single entity). Remove the object if `removeObject` is set. Remove the tool if `removeTool` is set. @@ -3331,7 +3480,7 @@ function intersect(objectDimTags, toolDimTags, tag = -1, removeObject = true, re api_outDimTagsMap_n_ = Ref{Ptr{Csize_t}}() api_outDimTagsMap_nn_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelOccIntersect, gmsh.lib), Nothing, + ccall((:gmshModelOccIntersect, gmsh.lib), Cvoid, (Ptr{Cint}, Csize_t, Ptr{Cint}, Csize_t, Ptr{Ptr{Cint}}, Ptr{Csize_t}, Ptr{Ptr{Ptr{Cint}}}, Ptr{Ptr{Csize_t}}, Ptr{Csize_t}, Cint, Cint, Cint, Ptr{Cint}), convert(Vector{Cint}, collect(Cint, Iterators.flatten(objectDimTags))), 2 * length(objectDimTags), convert(Vector{Cint}, collect(Cint, Iterators.flatten(toolDimTags))), 2 * length(toolDimTags), api_outDimTags_, api_outDimTags_n_, api_outDimTagsMap_, api_outDimTagsMap_n_, api_outDimTagsMap_nn_, tag, removeObject, removeTool, ierr) ierr[] != 0 && error("gmshModelOccIntersect returned non-zero error code: $(ierr[])") @@ -3353,7 +3502,7 @@ end Compute the boolean difference between the entities `objectDimTags` and `toolDimTags`. Return the resulting entities in `outDimTags`. If `tag` is -positive, try to set the tag explicitly (ony valid if the boolean operation +positive, try to set the tag explicitly (only valid if the boolean operation results in a single entity). Remove the object if `removeObject` is set. Remove the tool if `removeTool` is set. @@ -3366,7 +3515,7 @@ function cut(objectDimTags, toolDimTags, tag = -1, removeObject = true, removeTo api_outDimTagsMap_n_ = Ref{Ptr{Csize_t}}() api_outDimTagsMap_nn_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelOccCut, gmsh.lib), Nothing, + ccall((:gmshModelOccCut, gmsh.lib), Cvoid, (Ptr{Cint}, Csize_t, Ptr{Cint}, Csize_t, Ptr{Ptr{Cint}}, Ptr{Csize_t}, Ptr{Ptr{Ptr{Cint}}}, Ptr{Ptr{Csize_t}}, Ptr{Csize_t}, Cint, Cint, Cint, Ptr{Cint}), convert(Vector{Cint}, collect(Cint, Iterators.flatten(objectDimTags))), 2 * length(objectDimTags), convert(Vector{Cint}, collect(Cint, Iterators.flatten(toolDimTags))), 2 * length(toolDimTags), api_outDimTags_, api_outDimTags_n_, api_outDimTagsMap_, api_outDimTagsMap_n_, api_outDimTagsMap_nn_, tag, removeObject, removeTool, ierr) ierr[] != 0 && error("gmshModelOccCut returned non-zero error code: $(ierr[])") @@ -3388,7 +3537,7 @@ end Compute the boolean fragments (general fuse) of the entities `objectDimTags` and `toolDimTags`. Return the resulting entities in `outDimTags`. If `tag` is -positive, try to set the tag explicitly (ony valid if the boolean operation +positive, try to set the tag explicitly (only valid if the boolean operation results in a single entity). Remove the object if `removeObject` is set. Remove the tool if `removeTool` is set. @@ -3401,7 +3550,7 @@ function fragment(objectDimTags, toolDimTags, tag = -1, removeObject = true, rem api_outDimTagsMap_n_ = Ref{Ptr{Csize_t}}() api_outDimTagsMap_nn_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelOccFragment, gmsh.lib), Nothing, + ccall((:gmshModelOccFragment, gmsh.lib), Cvoid, (Ptr{Cint}, Csize_t, Ptr{Cint}, Csize_t, Ptr{Ptr{Cint}}, Ptr{Csize_t}, Ptr{Ptr{Ptr{Cint}}}, Ptr{Ptr{Csize_t}}, Ptr{Csize_t}, Cint, Cint, Cint, Ptr{Cint}), convert(Vector{Cint}, collect(Cint, Iterators.flatten(objectDimTags))), 2 * length(objectDimTags), convert(Vector{Cint}, collect(Cint, Iterators.flatten(toolDimTags))), 2 * length(toolDimTags), api_outDimTags_, api_outDimTags_n_, api_outDimTagsMap_, api_outDimTagsMap_n_, api_outDimTagsMap_nn_, tag, removeObject, removeTool, ierr) ierr[] != 0 && error("gmshModelOccFragment returned non-zero error code: $(ierr[])") @@ -3421,11 +3570,11 @@ end """ gmsh.model.occ.translate(dimTags, dx, dy, dz) -Translate the geometrical entities `dimTags` along (`dx`, `dy`, `dz`). +Translate the model entities `dimTags` along (`dx`, `dy`, `dz`). """ function translate(dimTags, dx, dy, dz) ierr = Ref{Cint}() - ccall((:gmshModelOccTranslate, gmsh.lib), Nothing, + ccall((:gmshModelOccTranslate, gmsh.lib), Cvoid, (Ptr{Cint}, Csize_t, Cdouble, Cdouble, Cdouble, Ptr{Cint}), convert(Vector{Cint}, collect(Cint, Iterators.flatten(dimTags))), 2 * length(dimTags), dx, dy, dz, ierr) ierr[] != 0 && error("gmshModelOccTranslate returned non-zero error code: $(ierr[])") @@ -3435,13 +3584,13 @@ end """ gmsh.model.occ.rotate(dimTags, x, y, z, ax, ay, az, angle) -Rotate the geometrical entities `dimTags` of `angle` radians around the axis of +Rotate the model entities `dimTags` of `angle` radians around the axis of revolution defined by the point (`x`, `y`, `z`) and the direction (`ax`, `ay`, `az`). """ function rotate(dimTags, x, y, z, ax, ay, az, angle) ierr = Ref{Cint}() - ccall((:gmshModelOccRotate, gmsh.lib), Nothing, + ccall((:gmshModelOccRotate, gmsh.lib), Cvoid, (Ptr{Cint}, Csize_t, Cdouble, Cdouble, Cdouble, Cdouble, Cdouble, Cdouble, Cdouble, Ptr{Cint}), convert(Vector{Cint}, collect(Cint, Iterators.flatten(dimTags))), 2 * length(dimTags), x, y, z, ax, ay, az, angle, ierr) ierr[] != 0 && error("gmshModelOccRotate returned non-zero error code: $(ierr[])") @@ -3451,13 +3600,13 @@ end """ gmsh.model.occ.dilate(dimTags, x, y, z, a, b, c) -Scale the geometrical entities `dimTag` by factors `a`, `b` and `c` along the -three coordinate axes; use (`x`, `y`, `z`) as the center of the homothetic +Scale the model entities `dimTag` by factors `a`, `b` and `c` along the three +coordinate axes; use (`x`, `y`, `z`) as the center of the homothetic transformation. """ function dilate(dimTags, x, y, z, a, b, c) ierr = Ref{Cint}() - ccall((:gmshModelOccDilate, gmsh.lib), Nothing, + ccall((:gmshModelOccDilate, gmsh.lib), Cvoid, (Ptr{Cint}, Csize_t, Cdouble, Cdouble, Cdouble, Cdouble, Cdouble, Cdouble, Ptr{Cint}), convert(Vector{Cint}, collect(Cint, Iterators.flatten(dimTags))), 2 * length(dimTags), x, y, z, a, b, c, ierr) ierr[] != 0 && error("gmshModelOccDilate returned non-zero error code: $(ierr[])") @@ -3467,12 +3616,12 @@ end """ gmsh.model.occ.symmetrize(dimTags, a, b, c, d) -Apply a symmetry transformation to the geometrical entities `dimTag`, with -respect to the plane of equation `a` * x + `b` * y + `c` * z + `d` = 0. +Apply a symmetry transformation to the model entities `dimTag`, with respect to +the plane of equation `a` * x + `b` * y + `c` * z + `d` = 0. """ function symmetrize(dimTags, a, b, c, d) ierr = Ref{Cint}() - ccall((:gmshModelOccSymmetrize, gmsh.lib), Nothing, + ccall((:gmshModelOccSymmetrize, gmsh.lib), Cvoid, (Ptr{Cint}, Csize_t, Cdouble, Cdouble, Cdouble, Cdouble, Ptr{Cint}), convert(Vector{Cint}, collect(Cint, Iterators.flatten(dimTags))), 2 * length(dimTags), a, b, c, d, ierr) ierr[] != 0 && error("gmshModelOccSymmetrize returned non-zero error code: $(ierr[])") @@ -3483,14 +3632,14 @@ end gmsh.model.occ.affineTransform(dimTags, a) Apply a general affine transformation matrix `a` (16 entries of a 4x4 matrix, by -row; only the 12 first can be provided for convenience) to the geometrical -entities `dimTag`. +row; only the 12 first can be provided for convenience) to the model entities +`dimTag`. """ function affineTransform(dimTags, a) ierr = Ref{Cint}() - ccall((:gmshModelOccAffineTransform, gmsh.lib), Nothing, + ccall((:gmshModelOccAffineTransform, gmsh.lib), Cvoid, (Ptr{Cint}, Csize_t, Ptr{Cdouble}, Csize_t, Ptr{Cint}), - convert(Vector{Cint}, collect(Cint, Iterators.flatten(dimTags))), 2 * length(dimTags), a, length(a), ierr) + convert(Vector{Cint}, collect(Cint, Iterators.flatten(dimTags))), 2 * length(dimTags), convert(Vector{Cdouble}, a), length(a), ierr) ierr[] != 0 && error("gmshModelOccAffineTransform returned non-zero error code: $(ierr[])") return nothing end @@ -3506,7 +3655,7 @@ function copy(dimTags) api_outDimTags_ = Ref{Ptr{Cint}}() api_outDimTags_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelOccCopy, gmsh.lib), Nothing, + ccall((:gmshModelOccCopy, gmsh.lib), Cvoid, (Ptr{Cint}, Csize_t, Ptr{Ptr{Cint}}, Ptr{Csize_t}, Ptr{Cint}), convert(Vector{Cint}, collect(Cint, Iterators.flatten(dimTags))), 2 * length(dimTags), api_outDimTags_, api_outDimTags_n_, ierr) ierr[] != 0 && error("gmshModelOccCopy returned non-zero error code: $(ierr[])") @@ -3523,7 +3672,7 @@ on their boundaries, down to dimension 0. """ function remove(dimTags, recursive = false) ierr = Ref{Cint}() - ccall((:gmshModelOccRemove, gmsh.lib), Nothing, + ccall((:gmshModelOccRemove, gmsh.lib), Cvoid, (Ptr{Cint}, Csize_t, Cint, Ptr{Cint}), convert(Vector{Cint}, collect(Cint, Iterators.flatten(dimTags))), 2 * length(dimTags), recursive, ierr) ierr[] != 0 && error("gmshModelOccRemove returned non-zero error code: $(ierr[])") @@ -3539,7 +3688,7 @@ entities. """ function removeAllDuplicates() ierr = Ref{Cint}() - ccall((:gmshModelOccRemoveAllDuplicates, gmsh.lib), Nothing, + ccall((:gmshModelOccRemoveAllDuplicates, gmsh.lib), Cvoid, (Ptr{Cint},), ierr) ierr[] != 0 && error("gmshModelOccRemoveAllDuplicates returned non-zero error code: $(ierr[])") @@ -3561,7 +3710,7 @@ function importShapes(fileName, highestDimOnly = true, format = "") api_outDimTags_ = Ref{Ptr{Cint}}() api_outDimTags_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshModelOccImportShapes, gmsh.lib), Nothing, + ccall((:gmshModelOccImportShapes, gmsh.lib), Cvoid, (Ptr{Cchar}, Ptr{Ptr{Cint}}, Ptr{Csize_t}, Cint, Ptr{Cchar}, Ptr{Cint}), fileName, api_outDimTags_, api_outDimTags_n_, highestDimOnly, format, ierr) ierr[] != 0 && error("gmshModelOccImportShapes returned non-zero error code: $(ierr[])") @@ -3570,56 +3719,87 @@ function importShapes(fileName, highestDimOnly = true, format = "") return outDimTags end -""" - gmsh.model.occ.importShapesNativePointer(shape, highestDimOnly = true) - -Imports an OpenCASCADE `shape` by providing a pointer to a native OpenCASCADE -`TopoDS_Shape` object (passed as a pointer to void). The imported entities are -returned in `outDimTags`. If the optional argument `highestDimOnly` is set, only -import the highest dimensional entities in `shape`. Warning: this function is -unsafe, as providing an invalid pointer will lead to undefined behavior. - -Return `outDimTags`. -""" -function importShapesNativePointer(shape, highestDimOnly = true) - api_outDimTags_ = Ref{Ptr{Cint}}() - api_outDimTags_n_ = Ref{Csize_t}() - ierr = Ref{Cint}() - ccall((:gmshModelOccImportShapesNativePointer, gmsh.lib), Nothing, - (Ptr{Nothing}, Ptr{Ptr{Cint}}, Ptr{Csize_t}, Cint, Ptr{Cint}), - shape, api_outDimTags_, api_outDimTags_n_, highestDimOnly, ierr) - ierr[] != 0 && error("gmshModelOccImportShapesNativePointer returned non-zero error code: $(ierr[])") - tmp_api_outDimTags_ = unsafe_wrap(Array, api_outDimTags_[], api_outDimTags_n_[], own=true) - outDimTags = [ (tmp_api_outDimTags_[i], tmp_api_outDimTags_[i+1]) for i in 1:2:length(tmp_api_outDimTags_) ] - return outDimTags -end - """ gmsh.model.occ.setMeshSize(dimTags, size) -Set a mesh size constraint on the geometrical entities `dimTags`. Currently only +Set a mesh size constraint on the model entities `dimTags`. Currently only entities of dimension 0 (points) are handled. """ function setMeshSize(dimTags, size) ierr = Ref{Cint}() - ccall((:gmshModelOccSetMeshSize, gmsh.lib), Nothing, + ccall((:gmshModelOccSetMeshSize, gmsh.lib), Cvoid, (Ptr{Cint}, Csize_t, Cdouble, Ptr{Cint}), convert(Vector{Cint}, collect(Cint, Iterators.flatten(dimTags))), 2 * length(dimTags), size, ierr) ierr[] != 0 && error("gmshModelOccSetMeshSize returned non-zero error code: $(ierr[])") return nothing end +""" + gmsh.model.occ.getMass(dim, tag) + +Get the mass of the model entity of dimension `dim` and tag `tag`. + +Return `mass`. +""" +function getMass(dim, tag) + api_mass_ = Ref{Cdouble}() + ierr = Ref{Cint}() + ccall((:gmshModelOccGetMass, gmsh.lib), Cvoid, + (Cint, Cint, Ptr{Cdouble}, Ptr{Cint}), + dim, tag, api_mass_, ierr) + ierr[] != 0 && error("gmshModelOccGetMass returned non-zero error code: $(ierr[])") + return api_mass_[] +end + +""" + gmsh.model.occ.getCenterOfMass(dim, tag) + +Get the center of mass of the model entity of dimension `dim` and tag `tag`. + +Return `x`, `y`, `z`. +""" +function getCenterOfMass(dim, tag) + api_x_ = Ref{Cdouble}() + api_y_ = Ref{Cdouble}() + api_z_ = Ref{Cdouble}() + ierr = Ref{Cint}() + ccall((:gmshModelOccGetCenterOfMass, gmsh.lib), Cvoid, + (Cint, Cint, Ptr{Cdouble}, Ptr{Cdouble}, Ptr{Cdouble}, Ptr{Cint}), + dim, tag, api_x_, api_y_, api_z_, ierr) + ierr[] != 0 && error("gmshModelOccGetCenterOfMass returned non-zero error code: $(ierr[])") + return api_x_[], api_y_[], api_z_[] +end + +""" + gmsh.model.occ.getMatrixOfInertia(dim, tag) + +Get the matrix of inertia (by row) of the model entity of dimension `dim` and +tag `tag`. + +Return `mat`. +""" +function getMatrixOfInertia(dim, tag) + api_mat_ = Ref{Ptr{Cdouble}}() + api_mat_n_ = Ref{Csize_t}() + ierr = Ref{Cint}() + ccall((:gmshModelOccGetMatrixOfInertia, gmsh.lib), Cvoid, + (Cint, Cint, Ptr{Ptr{Cdouble}}, Ptr{Csize_t}, Ptr{Cint}), + dim, tag, api_mat_, api_mat_n_, ierr) + ierr[] != 0 && error("gmshModelOccGetMatrixOfInertia returned non-zero error code: $(ierr[])") + mat = unsafe_wrap(Array, api_mat_[], api_mat_n_[], own=true) + return mat +end + """ gmsh.model.occ.synchronize() -Synchronize the internal OpenCASCADE CAD representation with the current Gmsh -model. This can be called at any time, but since it involves a non trivial -amount of processing, the number of synchronization points should normally be -minimized. +Synchronize the OpenCASCADE CAD representation with the current Gmsh model. This +can be called at any time, but since it involves a non trivial amount of +processing, the number of synchronization points should normally be minimized. """ function synchronize() ierr = Ref{Cint}() - ccall((:gmshModelOccSynchronize, gmsh.lib), Nothing, + ccall((:gmshModelOccSynchronize, gmsh.lib), Cvoid, (Ptr{Cint},), ierr) ierr[] != 0 && error("gmshModelOccSynchronize returned non-zero error code: $(ierr[])") @@ -3664,7 +3844,7 @@ Remove the view with tag `tag`. """ function remove(tag) ierr = Ref{Cint}() - ccall((:gmshViewRemove, gmsh.lib), Nothing, + ccall((:gmshViewRemove, gmsh.lib), Cvoid, (Cint, Ptr{Cint}), tag, ierr) ierr[] != 0 && error("gmshViewRemove returned non-zero error code: $(ierr[])") @@ -3700,7 +3880,7 @@ function getTags() api_tags_ = Ref{Ptr{Cint}}() api_tags_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshViewGetTags, gmsh.lib), Nothing, + ccall((:gmshViewGetTags, gmsh.lib), Cvoid, (Ptr{Ptr{Cint}}, Ptr{Csize_t}, Ptr{Cint}), api_tags_, api_tags_n_, ierr) ierr[] != 0 && error("gmshViewGetTags returned non-zero error code: $(ierr[])") @@ -3727,7 +3907,7 @@ sub-sets. function addModelData(tag, step, modelName, dataType, tags, data, time = 0., numComponents = -1, partition = 0) api_data_n_ = [ length(data[i]) for i in 1:length(data) ] ierr = Ref{Cint}() - ccall((:gmshViewAddModelData, gmsh.lib), Nothing, + ccall((:gmshViewAddModelData, gmsh.lib), Cvoid, (Cint, Cint, Ptr{Cchar}, Ptr{Cchar}, Ptr{Csize_t}, Csize_t, Ptr{Ptr{Cdouble}}, Ptr{Csize_t}, Csize_t, Cdouble, Cint, Cint, Ptr{Cint}), tag, step, modelName, dataType, convert(Vector{Csize_t}, tags), length(tags), convert(Vector{Vector{Cdouble}},data), api_data_n_, length(data), time, numComponents, partition, ierr) ierr[] != 0 && error("gmshViewAddModelData returned non-zero error code: $(ierr[])") @@ -3753,7 +3933,7 @@ function getModelData(tag, step) api_time_ = Ref{Cdouble}() api_numComponents_ = Ref{Cint}() ierr = Ref{Cint}() - ccall((:gmshViewGetModelData, gmsh.lib), Nothing, + ccall((:gmshViewGetModelData, gmsh.lib), Cvoid, (Cint, Cint, Ptr{Ptr{Cchar}}, Ptr{Ptr{Csize_t}}, Ptr{Csize_t}, Ptr{Ptr{Ptr{Cdouble}}}, Ptr{Ptr{Csize_t}}, Ptr{Csize_t}, Ptr{Cdouble}, Ptr{Cint}, Ptr{Cint}), tag, step, api_dataType_, api_tags_, api_tags_n_, api_data_, api_data_n_, api_data_nn_, api_time_, api_numComponents_, ierr) ierr[] != 0 && error("gmshViewGetModelData returned non-zero error code: $(ierr[])") @@ -3775,9 +3955,9 @@ the `numEle` elements. """ function addListData(tag, dataType, numEle, data) ierr = Ref{Cint}() - ccall((:gmshViewAddListData, gmsh.lib), Nothing, + ccall((:gmshViewAddListData, gmsh.lib), Cvoid, (Cint, Ptr{Cchar}, Cint, Ptr{Cdouble}, Csize_t, Ptr{Cint}), - tag, dataType, numEle, data, length(data), ierr) + tag, dataType, numEle, convert(Vector{Cdouble}, data), length(data), ierr) ierr[] != 0 && error("gmshViewAddListData returned non-zero error code: $(ierr[])") return nothing end @@ -3800,7 +3980,7 @@ function getListData(tag) api_data_n_ = Ref{Ptr{Csize_t}}() api_data_nn_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshViewGetListData, gmsh.lib), Nothing, + ccall((:gmshViewGetListData, gmsh.lib), Cvoid, (Cint, Ptr{Ptr{Ptr{Cchar}}}, Ptr{Csize_t}, Ptr{Ptr{Cint}}, Ptr{Csize_t}, Ptr{Ptr{Ptr{Cdouble}}}, Ptr{Ptr{Csize_t}}, Ptr{Csize_t}, Ptr{Cint}), tag, api_dataType_, api_dataType_n_, api_numElements_, api_numElements_n_, api_data_, api_data_n_, api_data_nn_, ierr) ierr[] != 0 && error("gmshViewGetListData returned non-zero error code: $(ierr[])") @@ -3813,6 +3993,56 @@ function getListData(tag) return dataType, numElements, data end +""" + gmsh.view.addAlias(refTag, copyOptions = false, tag = -1) + +Add a post-processing view as an `alias` of the reference view with tag +`refTag`. If `copyOptions` is set, copy the options of the reference view. If +`tag` is positive use it (and remove the view with that tag if it already +exists), otherwise associate a new tag. Return the view tag. + +Return an integer value. +""" +function addAlias(refTag, copyOptions = false, tag = -1) + ierr = Ref{Cint}() + api__result__ = ccall((:gmshViewAddAlias, gmsh.lib), Cint, + (Cint, Cint, Cint, Ptr{Cint}), + refTag, copyOptions, tag, ierr) + ierr[] != 0 && error("gmshViewAddAlias returned non-zero error code: $(ierr[])") + return api__result__ +end + +""" + gmsh.view.copyOptions(refTag, tag) + +Copy the options from the view with tag `refTag` to the view with tag `tag`. +""" +function copyOptions(refTag, tag) + ierr = Ref{Cint}() + ccall((:gmshViewCopyOptions, gmsh.lib), Cvoid, + (Cint, Cint, Ptr{Cint}), + refTag, tag, ierr) + ierr[] != 0 && error("gmshViewCopyOptions returned non-zero error code: $(ierr[])") + return nothing +end + +""" + gmsh.view.combine(what, how, remove = false) + +Combine elements (if `what` == "elements") or steps (if `what` == "steps") of +all views (`how` == "all"), all visible views (`how` == "visible") or all views +having the same name (`how` == "name"). Remove original views if `remove` is +set. +""" +function combine(what, how, remove = false) + ierr = Ref{Cint}() + ccall((:gmshViewCombine, gmsh.lib), Cvoid, + (Ptr{Cchar}, Ptr{Cchar}, Cint, Ptr{Cint}), + what, how, remove, ierr) + ierr[] != 0 && error("gmshViewCombine returned non-zero error code: $(ierr[])") + return nothing +end + """ gmsh.view.probe(tag, x, y, z, step = -1, numComp = -1, gradient = false, tolerance = 0., xElemCoord = Cdouble[], yElemCoord = Cdouble[], zElemCoord = Cdouble[]) @@ -3830,9 +4060,9 @@ function probe(tag, x, y, z, step = -1, numComp = -1, gradient = false, toleranc api_value_ = Ref{Ptr{Cdouble}}() api_value_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshViewProbe, gmsh.lib), Nothing, + ccall((:gmshViewProbe, gmsh.lib), Cvoid, (Cint, Cdouble, Cdouble, Cdouble, Ptr{Ptr{Cdouble}}, Ptr{Csize_t}, Cint, Cint, Cint, Cdouble, Ptr{Cdouble}, Csize_t, Ptr{Cdouble}, Csize_t, Ptr{Cdouble}, Csize_t, Ptr{Cint}), - tag, x, y, z, api_value_, api_value_n_, step, numComp, gradient, tolerance, xElemCoord, length(xElemCoord), yElemCoord, length(yElemCoord), zElemCoord, length(zElemCoord), ierr) + tag, x, y, z, api_value_, api_value_n_, step, numComp, gradient, tolerance, convert(Vector{Cdouble}, xElemCoord), length(xElemCoord), convert(Vector{Cdouble}, yElemCoord), length(yElemCoord), convert(Vector{Cdouble}, zElemCoord), length(zElemCoord), ierr) ierr[] != 0 && error("gmshViewProbe returned non-zero error code: $(ierr[])") value = unsafe_wrap(Array, api_value_[], api_value_n_[], own=true) return value @@ -3846,7 +4076,7 @@ extension. Append to the file if `append` is set. """ function write(tag, fileName, append = false) ierr = Ref{Cint}() - ccall((:gmshViewWrite, gmsh.lib), Nothing, + ccall((:gmshViewWrite, gmsh.lib), Cvoid, (Cint, Ptr{Cchar}, Cint, Ptr{Cint}), tag, fileName, append, ierr) ierr[] != 0 && error("gmshViewWrite returned non-zero error code: $(ierr[])") @@ -3871,7 +4101,7 @@ Set the numerical option `option` to the value `value` for plugin `name`. """ function setNumber(name, option, value) ierr = Ref{Cint}() - ccall((:gmshPluginSetNumber, gmsh.lib), Nothing, + ccall((:gmshPluginSetNumber, gmsh.lib), Cvoid, (Ptr{Cchar}, Ptr{Cchar}, Cdouble, Ptr{Cint}), name, option, value, ierr) ierr[] != 0 && error("gmshPluginSetNumber returned non-zero error code: $(ierr[])") @@ -3885,7 +4115,7 @@ Set the string option `option` to the value `value` for plugin `name`. """ function setString(name, option, value) ierr = Ref{Cint}() - ccall((:gmshPluginSetString, gmsh.lib), Nothing, + ccall((:gmshPluginSetString, gmsh.lib), Cvoid, (Ptr{Cchar}, Ptr{Cchar}, Ptr{Cchar}, Ptr{Cint}), name, option, value, ierr) ierr[] != 0 && error("gmshPluginSetString returned non-zero error code: $(ierr[])") @@ -3899,7 +4129,7 @@ Run the plugin `name`. """ function run(name) ierr = Ref{Cint}() - ccall((:gmshPluginRun, gmsh.lib), Nothing, + ccall((:gmshPluginRun, gmsh.lib), Cvoid, (Ptr{Cchar}, Ptr{Cint}), name, ierr) ierr[] != 0 && error("gmshPluginRun returned non-zero error code: $(ierr[])") @@ -3924,7 +4154,7 @@ Draw all the OpenGL scenes. """ function draw() ierr = Ref{Cint}() - ccall((:gmshGraphicsDraw, gmsh.lib), Nothing, + ccall((:gmshGraphicsDraw, gmsh.lib), Cvoid, (Ptr{Cint},), ierr) ierr[] != 0 && error("gmshGraphicsDraw returned non-zero error code: $(ierr[])") @@ -3936,7 +4166,7 @@ end # end of module graphics """ module gmsh.fltk -Fltk graphical user interface functions +FLTK graphical user interface functions """ module fltk @@ -3945,11 +4175,11 @@ import ..gmsh """ gmsh.fltk.initialize() -Create the Fltk graphical user interface. Can only be called in the main thread. +Create the FLTK graphical user interface. Can only be called in the main thread. """ function initialize() ierr = Ref{Cint}() - ccall((:gmshFltkInitialize, gmsh.lib), Nothing, + ccall((:gmshFltkInitialize, gmsh.lib), Cvoid, (Ptr{Cint},), ierr) ierr[] != 0 && error("gmshFltkInitialize returned non-zero error code: $(ierr[])") @@ -3965,7 +4195,7 @@ yet been initialized. Can only be called in the main thread. """ function wait(time = -1.) ierr = Ref{Cint}() - ccall((:gmshFltkWait, gmsh.lib), Nothing, + ccall((:gmshFltkWait, gmsh.lib), Cvoid, (Cdouble, Ptr{Cint}), time, ierr) ierr[] != 0 && error("gmshFltkWait returned non-zero error code: $(ierr[])") @@ -3982,7 +4212,7 @@ the user interface from another thread. """ function update() ierr = Ref{Cint}() - ccall((:gmshFltkUpdate, gmsh.lib), Nothing, + ccall((:gmshFltkUpdate, gmsh.lib), Cvoid, (Ptr{Cint},), ierr) ierr[] != 0 && error("gmshFltkUpdate returned non-zero error code: $(ierr[])") @@ -3997,7 +4227,7 @@ perform an action (currently the only `action` allowed is "update"). """ function awake(action = "") ierr = Ref{Cint}() - ccall((:gmshFltkAwake, gmsh.lib), Nothing, + ccall((:gmshFltkAwake, gmsh.lib), Cvoid, (Ptr{Cchar}, Ptr{Cint}), action, ierr) ierr[] != 0 && error("gmshFltkAwake returned non-zero error code: $(ierr[])") @@ -4011,7 +4241,7 @@ Block the current thread until it can safely modify the user interface. """ function lock() ierr = Ref{Cint}() - ccall((:gmshFltkLock, gmsh.lib), Nothing, + ccall((:gmshFltkLock, gmsh.lib), Cvoid, (Ptr{Cint},), ierr) ierr[] != 0 && error("gmshFltkLock returned non-zero error code: $(ierr[])") @@ -4025,7 +4255,7 @@ Release the lock that was set using lock. """ function unlock() ierr = Ref{Cint}() - ccall((:gmshFltkUnlock, gmsh.lib), Nothing, + ccall((:gmshFltkUnlock, gmsh.lib), Cvoid, (Ptr{Cint},), ierr) ierr[] != 0 && error("gmshFltkUnlock returned non-zero error code: $(ierr[])") @@ -4041,7 +4271,7 @@ initialized. Can only be called in the main thread. """ function run() ierr = Ref{Cint}() - ccall((:gmshFltkRun, gmsh.lib), Nothing, + ccall((:gmshFltkRun, gmsh.lib), Cvoid, (Ptr{Cint},), ierr) ierr[] != 0 && error("gmshFltkRun returned non-zero error code: $(ierr[])") @@ -4125,7 +4355,7 @@ Set one or more parameters in the ONELAB database, encoded in `format`. """ function set(data, format = "json") ierr = Ref{Cint}() - ccall((:gmshOnelabSet, gmsh.lib), Nothing, + ccall((:gmshOnelabSet, gmsh.lib), Cvoid, (Ptr{Cchar}, Ptr{Cchar}, Ptr{Cint}), data, format, ierr) ierr[] != 0 && error("gmshOnelabSet returned non-zero error code: $(ierr[])") @@ -4143,7 +4373,7 @@ Return `data`. function get(name = "", format = "json") api_data_ = Ref{Ptr{Cchar}}() ierr = Ref{Cint}() - ccall((:gmshOnelabGet, gmsh.lib), Nothing, + ccall((:gmshOnelabGet, gmsh.lib), Cvoid, (Ptr{Ptr{Cchar}}, Ptr{Cchar}, Ptr{Cchar}, Ptr{Cint}), api_data_, name, format, ierr) ierr[] != 0 && error("gmshOnelabGet returned non-zero error code: $(ierr[])") @@ -4159,9 +4389,9 @@ parameter if it does not exist; update the value if the parameter exists. """ function setNumber(name, value) ierr = Ref{Cint}() - ccall((:gmshOnelabSetNumber, gmsh.lib), Nothing, + ccall((:gmshOnelabSetNumber, gmsh.lib), Cvoid, (Ptr{Cchar}, Ptr{Cdouble}, Csize_t, Ptr{Cint}), - name, value, length(value), ierr) + name, convert(Vector{Cdouble}, value), length(value), ierr) ierr[] != 0 && error("gmshOnelabSetNumber returned non-zero error code: $(ierr[])") return nothing end @@ -4174,7 +4404,7 @@ parameter if it does not exist; update the value if the parameter exists. """ function setString(name, value) ierr = Ref{Cint}() - ccall((:gmshOnelabSetString, gmsh.lib), Nothing, + ccall((:gmshOnelabSetString, gmsh.lib), Cvoid, (Ptr{Cchar}, Ptr{Ptr{Cchar}}, Csize_t, Ptr{Cint}), name, value, length(value), ierr) ierr[] != 0 && error("gmshOnelabSetString returned non-zero error code: $(ierr[])") @@ -4193,7 +4423,7 @@ function getNumber(name) api_value_ = Ref{Ptr{Cdouble}}() api_value_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshOnelabGetNumber, gmsh.lib), Nothing, + ccall((:gmshOnelabGetNumber, gmsh.lib), Cvoid, (Ptr{Cchar}, Ptr{Ptr{Cdouble}}, Ptr{Csize_t}, Ptr{Cint}), name, api_value_, api_value_n_, ierr) ierr[] != 0 && error("gmshOnelabGetNumber returned non-zero error code: $(ierr[])") @@ -4213,7 +4443,7 @@ function getString(name) api_value_ = Ref{Ptr{Ptr{Cchar}}}() api_value_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshOnelabGetString, gmsh.lib), Nothing, + ccall((:gmshOnelabGetString, gmsh.lib), Cvoid, (Ptr{Cchar}, Ptr{Ptr{Ptr{Cchar}}}, Ptr{Csize_t}, Ptr{Cint}), name, api_value_, api_value_n_, ierr) ierr[] != 0 && error("gmshOnelabGetString returned non-zero error code: $(ierr[])") @@ -4229,7 +4459,7 @@ Clear the ONELAB database, or remove a single parameter if `name` is given. """ function clear(name = "") ierr = Ref{Cint}() - ccall((:gmshOnelabClear, gmsh.lib), Nothing, + ccall((:gmshOnelabClear, gmsh.lib), Cvoid, (Ptr{Cchar}, Ptr{Cint}), name, ierr) ierr[] != 0 && error("gmshOnelabClear returned non-zero error code: $(ierr[])") @@ -4245,7 +4475,7 @@ to the processed input files. """ function run(name = "", command = "") ierr = Ref{Cint}() - ccall((:gmshOnelabRun, gmsh.lib), Nothing, + ccall((:gmshOnelabRun, gmsh.lib), Cvoid, (Ptr{Cchar}, Ptr{Cchar}, Ptr{Cint}), name, command, ierr) ierr[] != 0 && error("gmshOnelabRun returned non-zero error code: $(ierr[])") @@ -4257,7 +4487,7 @@ end # end of module onelab """ module gmsh.logger -Message logger functions +Information logging functions """ module logger @@ -4270,7 +4500,7 @@ Write a `message`. `level` can be "info", "warning" or "error". """ function write(message, level = "info") ierr = Ref{Cint}() - ccall((:gmshLoggerWrite, gmsh.lib), Nothing, + ccall((:gmshLoggerWrite, gmsh.lib), Cvoid, (Ptr{Cchar}, Ptr{Cchar}, Ptr{Cint}), message, level, ierr) ierr[] != 0 && error("gmshLoggerWrite returned non-zero error code: $(ierr[])") @@ -4284,7 +4514,7 @@ Start logging messages. """ function start() ierr = Ref{Cint}() - ccall((:gmshLoggerStart, gmsh.lib), Nothing, + ccall((:gmshLoggerStart, gmsh.lib), Cvoid, (Ptr{Cint},), ierr) ierr[] != 0 && error("gmshLoggerStart returned non-zero error code: $(ierr[])") @@ -4302,7 +4532,7 @@ function get() api_log_ = Ref{Ptr{Ptr{Cchar}}}() api_log_n_ = Ref{Csize_t}() ierr = Ref{Cint}() - ccall((:gmshLoggerGet, gmsh.lib), Nothing, + ccall((:gmshLoggerGet, gmsh.lib), Cvoid, (Ptr{Ptr{Ptr{Cchar}}}, Ptr{Csize_t}, Ptr{Cint}), api_log_, api_log_n_, ierr) ierr[] != 0 && error("gmshLoggerGet returned non-zero error code: $(ierr[])") @@ -4318,7 +4548,7 @@ Stop logging messages. """ function stop() ierr = Ref{Cint}() - ccall((:gmshLoggerStop, gmsh.lib), Nothing, + ccall((:gmshLoggerStop, gmsh.lib), Cvoid, (Ptr{Cint},), ierr) ierr[] != 0 && error("gmshLoggerStop returned non-zero error code: $(ierr[])") diff --git a/api/gmsh.py b/api/gmsh.py index dba82e3b356e618e5426af71ba5d5d15edea0383..056c9dbcbe4812ee0f4c054950133ede88f07ae9 100644 --- a/api/gmsh.py +++ b/api/gmsh.py @@ -3,7 +3,7 @@ # See the LICENSE.txt file for license information. Please report all # issues on https://gitlab.onelab.info/gmsh/gmsh/issues. -# This file defines the Gmsh Python API (v4.2). +# This file defines the Gmsh Python API (v4.4). # # Do not edit it directly: it is automatically generated by `api/gen.py'. # @@ -18,14 +18,16 @@ import os import platform from math import pi -GMSH_API_VERSION = "4.2" +GMSH_API_VERSION = "4.4" GMSH_API_VERSION_MAJOR = 4 -GMSH_API_VERSION_MINOR = 2 +GMSH_API_VERSION_MINOR = 4 + +__version__ = GMSH_API_VERSION signal.signal(signal.SIGINT, signal.SIG_DFL) libdir = os.path.dirname(os.path.realpath(__file__)) if platform.system() == "Windows": - libpath = os.path.join(libdir, "gmsh-4.2.dll") + libpath = os.path.join(libdir, "gmsh-4.4.dll") elif platform.system() == "Darwin": libpath = os.path.join(libdir, "libgmsh.dylib") else: @@ -214,7 +216,8 @@ def finalize(): def open(fileName): """ Open a file. Equivalent to the `File->Open' menu in the Gmsh app. Handling - of the file depends on its extension and/or its contents. + of the file depends on its extension and/or its contents: opening a file + with model data will create a new model. """ ierr = c_int() lib.gmshOpen( @@ -228,7 +231,8 @@ def open(fileName): def merge(fileName): """ Merge a file. Equivalent to the `File->Merge' menu in the Gmsh app. - Handling of the file depends on its extension and/or its contents. + Handling of the file depends on its extension and/or its contents. Merging + a file with model data will add the data to the current model. """ ierr = c_int() lib.gmshMerge( @@ -268,7 +272,7 @@ def clear(): class option: """ - Global option handling functions + Option handling functions """ @staticmethod @@ -347,10 +351,64 @@ class option: ierr.value) return _ostring(api_value_) + @staticmethod + def setColor(name, r, g, b, a=0): + """ + Set a color option to the RGBA value (`r', `g', `b', `a'), where where `r', + `g', `b' and `a' should be integers between 0 and 255. `name' is of the + form "category.option" or "category[num].option". Available categories and + options are listed in the Gmsh reference manual, with the "Color." middle + string removed. + """ + ierr = c_int() + lib.gmshOptionSetColor( + c_char_p(name.encode()), + c_int(r), + c_int(g), + c_int(b), + c_int(a), + byref(ierr)) + if ierr.value != 0: + raise ValueError( + "gmshOptionSetColor returned non-zero error code: ", + ierr.value) + + @staticmethod + def getColor(name): + """ + Get the `r', `g', `b', `a' value of a color option. `name' is of the form + "category.option" or "category[num].option". Available categories and + options are listed in the Gmsh reference manual, with the "Color." middle + string removed. + + Return `r', `g', `b', `a'. + """ + api_r_ = c_int() + api_g_ = c_int() + api_b_ = c_int() + api_a_ = c_int() + ierr = c_int() + lib.gmshOptionGetColor( + c_char_p(name.encode()), + byref(api_r_), + byref(api_g_), + byref(api_b_), + byref(api_a_), + byref(ierr)) + if ierr.value != 0: + raise ValueError( + "gmshOptionGetColor returned non-zero error code: ", + ierr.value) + return ( + api_r_.value, + api_g_.value, + api_b_.value, + api_a_.value) + class model: """ - Per-model functions + Model functions """ @staticmethod @@ -416,10 +474,9 @@ class model: @staticmethod def getEntities(dim=-1): """ - Get all the (elementary) geometrical entities in the current model. If - `dim' is >= 0, return only the entities of the specified dimension (e.g. - points if `dim' == 0). The entities are returned as a vector of (dim, tag) - integer pairs. + Get all the entities in the current model. If `dim' is >= 0, return only + the entities of the specified dimension (e.g. points if `dim' == 0). The + entities are returned as a vector of (dim, tag) integer pairs. Return `dimTags'. """ @@ -495,7 +552,7 @@ class model: @staticmethod def getEntitiesForPhysicalGroup(dim, tag): """ - Get the tags of the geometrical entities making up the physical group of + Get the tags of the model entities making up the physical group of dimension `dim' and tag `tag'. Return `tags'. @@ -516,8 +573,8 @@ class model: @staticmethod def getPhysicalGroupsForEntity(dim, tag): """ - Get the tags of the physical groups (if any) to which the geometrical - entity of dimension `dim' and tag `tag' belongs. + Get the tags of the physical groups (if any) to which the model entity of + dimension `dim' and tag `tag' belongs. Return `physicalTags'. """ @@ -537,9 +594,9 @@ class model: @staticmethod def addPhysicalGroup(dim, tags, tag=-1): """ - Add a physical group of dimension `dim', grouping the elementary entities - with tags `tags'. Return the tag of the physical group, equal to `tag' if - `tag' is positive, or a new tag if `tag' < 0. + Add a physical group of dimension `dim', grouping the model entities with + tags `tags'. Return the tag of the physical group, equal to `tag' if `tag' + is positive, or a new tag if `tag' < 0. Return an integer value. """ @@ -595,12 +652,12 @@ class model: @staticmethod def getBoundary(dimTags, combined=True, oriented=True, recursive=False): """ - Get the boundary of the geometrical entities `dimTags'. Return in - `outDimTags' the boundary of the individual entities (if `combined' is - false) or the boundary of the combined geometrical shape formed by all - input entities (if `combined' is true). Return tags multiplied by the sign - of the boundary entity if `oriented' is true. Apply the boundary operator - recursively down to dimension 0 (i.e. to points) if `recursive' is true. + Get the boundary of the model entities `dimTags'. Return in `outDimTags' + the boundary of the individual entities (if `combined' is false) or the + boundary of the combined geometrical shape formed by all input entities (if + `combined' is true). Return tags multiplied by the sign of the boundary + entity if `oriented' is true. Apply the boundary operator recursively down + to dimension 0 (i.e. to points) if `recursive' is true. Return `outDimTags'. """ @@ -623,10 +680,10 @@ class model: @staticmethod def getEntitiesInBoundingBox(xmin, ymin, zmin, xmax, ymax, zmax, dim=-1): """ - Get the (elementary) geometrical entities in the bounding box defined by - the two points (`xmin', `ymin', `zmin') and (`xmax', `ymax', `zmax'). If - `dim' is >= 0, return only the entities of the specified dimension (e.g. - points if `dim' == 0). + Get the model entities in the bounding box defined by the two points + (`xmin', `ymin', `zmin') and (`xmax', `ymax', `zmax'). If `dim' is >= 0, + return only the entities of the specified dimension (e.g. points if `dim' + == 0). Return `tags'. """ @@ -652,7 +709,8 @@ class model: def getBoundingBox(dim, tag): """ Get the bounding box (`xmin', `ymin', `zmin'), (`xmax', `ymax', `zmax') of - the geometrical entity of dimension `dim' and tag `tag'. + the model entity of dimension `dim' and tag `tag'. If `dim' and `tag' are + negative, get the bounding box of the whole model. Return `xmin', `ymin', `zmin', `xmax', `ymax', `zmax'. """ @@ -704,12 +762,11 @@ class model: @staticmethod def addDiscreteEntity(dim, tag=-1, boundary=[]): """ - Add a discrete geometrical entity (defined by a mesh) of dimension `dim' in - the current model. Return the tag of the new discrete entity, equal to - `tag' if `tag' is positive, or a new tag if `tag' < 0. `boundary' specifies - the tags of the entities on the boundary of the discrete entity, if any. - Specyfing `boundary' allows Gmsh to construct the topology of the overall - model. + Add a discrete model entity (defined by a mesh) of dimension `dim' in the + current model. Return the tag of the new discrete entity, equal to `tag' if + `tag' is positive, or a new tag if `tag' < 0. `boundary' specifies the tags + of the entities on the boundary of the discrete entity, if any. Specifying + `boundary' allows Gmsh to construct the topology of the overall model. Return an integer value. """ @@ -999,8 +1056,8 @@ class model: @staticmethod def setVisibility(dimTags, value, recursive=False): """ - Set the visibility of the geometrical entities `dimTags' to `value'. Apply - the visibility setting recursively if `recursive' is true. + Set the visibility of the model entities `dimTags' to `value'. Apply the + visibility setting recursively if `recursive' is true. """ api_dimTags_, api_dimTags_n_ = _ivectorpair(dimTags) ierr = c_int() @@ -1017,8 +1074,7 @@ class model: @staticmethod def getVisibility(dim, tag): """ - Get the visibility of the geometrical entity of dimension `dim' and tag - `tag'. + Get the visibility of the model entity of dimension `dim' and tag `tag'. Return `value'. """ @@ -1038,9 +1094,9 @@ class model: @staticmethod def setColor(dimTags, r, g, b, a=0, recursive=False): """ - Set the color of the geometrical entities `dimTags' to the RGBA value (`r', - `g', `b', `a'), where `r', `g', `b' and `a' should be integers between 0 - and 255. Apply the color setting recursively if `recursive' is true. + Set the color of the model entities `dimTags' to the RGBA value (`r', `g', + `b', `a'), where `r', `g', `b' and `a' should be integers between 0 and + 255. Apply the color setting recursively if `recursive' is true. """ api_dimTags_, api_dimTags_n_ = _ivectorpair(dimTags) ierr = c_int() @@ -1060,7 +1116,7 @@ class model: @staticmethod def getColor(dim, tag): """ - Get the color of the geometrical entity of dimension `dim' and tag `tag'. + Get the color of the model entity of dimension `dim' and tag `tag'. Return `r', `g', `b', `a'. """ @@ -1087,10 +1143,27 @@ class model: api_b_.value, api_a_.value) + @staticmethod + def setCoordinates(tag, x, y, z): + """ + Set the `x', `y', `z' coordinates of a geometrical point. + """ + ierr = c_int() + lib.gmshModelSetCoordinates( + c_int(tag), + c_double(x), + c_double(y), + c_double(z), + byref(ierr)) + if ierr.value != 0: + raise ValueError( + "gmshModelSetCoordinates returned non-zero error code: ", + ierr.value) + class mesh: """ - Per-model meshing functions + Mesh functions """ @staticmethod @@ -1134,6 +1207,36 @@ class model: "gmshModelMeshUnpartition returned non-zero error code: ", ierr.value) + @staticmethod + def optimize(method): + """ + Optimize the mesh of the current model using `method' (empty for default + tetrahedral mesh optimizer, "Netgen" for Netgen optimizer, "HighOrder" for + direct high-order mesh optimizer, "HighOrderElastic" for high-order elastic + smoother). + """ + ierr = c_int() + lib.gmshModelMeshOptimize( + c_char_p(method.encode()), + byref(ierr)) + if ierr.value != 0: + raise ValueError( + "gmshModelMeshOptimize returned non-zero error code: ", + ierr.value) + + @staticmethod + def recombine(): + """ + Recombine the mesh of the current model. + """ + ierr = c_int() + lib.gmshModelMeshRecombine( + byref(ierr)) + if ierr.value != 0: + raise ValueError( + "gmshModelMeshRecombine returned non-zero error code: ", + ierr.value) + @staticmethod def refine(): """ @@ -1147,6 +1250,19 @@ class model: "gmshModelMeshRefine returned non-zero error code: ", ierr.value) + @staticmethod + def smooth(): + """ + Smooth the mesh of the current model. + """ + ierr = c_int() + lib.gmshModelMeshSmooth( + byref(ierr)) + if ierr.value != 0: + raise ValueError( + "gmshModelMeshSmooth returned non-zero error code: ", + ierr.value) + @staticmethod def setOrder(order): """ @@ -1200,7 +1316,7 @@ class model: return _ovectorsize(api_nodeTags_, api_nodeTags_n_.value) @staticmethod - def getNodes(dim=-1, tag=-1, includeBoundary=False): + def getNodes(dim=-1, tag=-1, includeBoundary=False, returnParametricCoord=True): """ Get the nodes classified on the entity of dimension `dim' and tag `tag'. If `tag' < 0, get the nodes for all entities of dimension `dim'. If `dim' and @@ -1208,12 +1324,13 @@ class model: node tags (their unique, strictly positive identification numbers). `coord' is a vector of length 3 times the length of `nodeTags' that contains the x, y, z coordinates of the nodes, concatenated: [n1x, n1y, n1z, n2x, ...]. If - `dim' >= 0, `parametricCoord' contains the parametric coordinates ([u1, u2, - ...] or [u1, v1, u2, ...]) of the nodes, if available. The length of - `parametricCoord' can be 0 or `dim' times the length of `nodeTags'. If - `includeBoundary' is set, also return the nodes classified on the boundary - of the entity (wich will be reparametrized on the entity if `dim' >= 0 in - order to compute their parametric coordinates). + `dim' >= 0 and `returnParamtricCoord' is set, `parametricCoord' contains + the parametric coordinates ([u1, u2, ...] or [u1, v1, u2, ...]) of the + nodes, if available. The length of `parametricCoord' can be 0 or `dim' + times the length of `nodeTags'. If `includeBoundary' is set, also return + the nodes classified on the boundary of the entity (which will be + reparametrized on the entity if `dim' >= 0 in order to compute their + parametric coordinates). Return `nodeTags', `coord', `parametricCoord'. """ @@ -1228,6 +1345,7 @@ class model: c_int(dim), c_int(tag), c_int(bool(includeBoundary)), + c_int(bool(returnParametricCoord)), byref(ierr)) if ierr.value != 0: raise ValueError( @@ -1245,7 +1363,7 @@ class model: with tag `tag'. This is a sometimes useful but inefficient way of accessing nodes, as it relies on a cache stored in the model. For large meshes all the nodes in the model should be numbered in a continuous sequence of tags - from 1 to N to maintain reasonnable performance (in this case the internal + from 1 to N to maintain reasonable performance (in this case the internal cache is based on a vector; otherwise it uses a map). Return `coord', `parametricCoord'. @@ -1310,10 +1428,10 @@ class model: @staticmethod def setNodes(dim, tag, nodeTags, coord, parametricCoord=[]): """ - Set the nodes classified on the geometrical entity of dimension `dim' and - tag `tag'. `nodeTags' contains the node tags (their unique, strictly - positive identification numbers). `coord' is a vector of length 3 times the - length of `nodeTags' that contains the x, y, z coordinates of the nodes, + Set the nodes classified on the model entity of dimension `dim' and tag + `tag'. `nodeTags' contains the node tags (their unique, strictly positive + identification numbers). `coord' is a vector of length 3 times the length + of `nodeTags' that contains the x, y, z coordinates of the nodes, concatenated: [n1x, n1y, n1z, n2x, ...]. The optional `parametricCoord' vector contains the parametric coordinates of the nodes, if any. The length of `parametricCoord' can be 0 or `dim' times the length of `nodeTags'. If @@ -1339,7 +1457,7 @@ class model: @staticmethod def reclassifyNodes(): """ - Reclassify all nodes on their associated geometrical entity, based on the + Reclassify all nodes on their associated model entity, based on the elements. Can be used when importing nodes in bulk (e.g. by associating them all to a single volume), to reclassify them correctly on model surfaces, curves, etc. after the elements have been set. @@ -1416,7 +1534,7 @@ class model: sometimes useful but inefficient way of accessing elements, as it relies on a cache stored in the model. For large meshes all the elements in the model should be numbered in a continuous sequence of tags from 1 to N to maintain - reasonnable performance (in this case the internal cache is based on a + reasonable performance (in this case the internal cache is based on a vector; otherwise it uses a map). Return `elementType', `nodeTags'. @@ -1438,17 +1556,24 @@ class model: _ovectorsize(api_nodeTags_, api_nodeTags_n_.value)) @staticmethod - def getElementByCoordinates(x, y, z): + def getElementByCoordinates(x, y, z, dim=-1, strict=False): """ - Get the tag, type and node tags of the element located at coordinates (`x', - `y', `z'). This is a sometimes useful but inefficient way of accessing - elements, as it relies on a search in a spatial octree. + Search the mesh for an element located at coordinates (`x', `y', `z'). This + is a sometimes useful but inefficient way of accessing elements, as it + relies on a search in a spatial octree. If an element is found, return its + tag, type and node tags, as well as the local coordinates (`u', `v', `w') + within the element corresponding to search location. If `dim' is >= 0, only + search for elements of the given dimension. If `strict' is not set, use a + tolerance to find elements near the search location. - Return `elementTag', `elementType', `nodeTags'. + Return `elementTag', `elementType', `nodeTags', `u', `v', `w'. """ api_elementTag_ = c_size_t() api_elementType_ = c_int() api_nodeTags_, api_nodeTags_n_ = POINTER(c_size_t)(), c_size_t() + api_u_ = c_double() + api_v_ = c_double() + api_w_ = c_double() ierr = c_int() lib.gmshModelMeshGetElementByCoordinates( c_double(x), @@ -1457,6 +1582,11 @@ class model: byref(api_elementTag_), byref(api_elementType_), byref(api_nodeTags_), byref(api_nodeTags_n_), + byref(api_u_), + byref(api_v_), + byref(api_w_), + c_int(dim), + c_int(bool(strict)), byref(ierr)) if ierr.value != 0: raise ValueError( @@ -1465,7 +1595,10 @@ class model: return ( api_elementTag_.value, api_elementType_.value, - _ovectorsize(api_nodeTags_, api_nodeTags_n_.value)) + _ovectorsize(api_nodeTags_, api_nodeTags_n_.value), + api_u_.value, + api_v_.value, + api_w_.value) @staticmethod def getElementTypes(dim=-1, tag=-1): @@ -1549,7 +1682,7 @@ class model: @staticmethod def getElementsByType(elementType, tag=-1, task=0, numTasks=1): """ - Get the elements of type `elementType' classified on the entity of of tag + Get the elements of type `elementType' classified on the entity of tag `tag'. If `tag' < 0, get the elements for all entities. `elementTags' is a vector containing the tags (unique, strictly positive identifiers) of the elements of the corresponding type. `nodeTags' is a vector of length equal @@ -1580,33 +1713,6 @@ class model: _ovectorsize(api_elementTags_, api_elementTags_n_.value), _ovectorsize(api_nodeTags_, api_nodeTags_n_.value)) - @staticmethod - def preallocateElementsByType(elementType, elementTag, nodeTag, tag=-1): - """ - Preallocate the data for `getElementsByType'. This is necessary only if - `getElementsByType' is called with `numTasks' > 1. - - Return `elementTags', `nodeTags'. - """ - api_elementTags_, api_elementTags_n_ = POINTER(c_size_t)(), c_size_t() - api_nodeTags_, api_nodeTags_n_ = POINTER(c_size_t)(), c_size_t() - ierr = c_int() - lib.gmshModelMeshPreallocateElementsByType( - c_int(elementType), - c_int(bool(elementTag)), - c_int(bool(nodeTag)), - byref(api_elementTags_), byref(api_elementTags_n_), - byref(api_nodeTags_), byref(api_nodeTags_n_), - c_int(tag), - byref(ierr)) - if ierr.value != 0: - raise ValueError( - "gmshModelMeshPreallocateElementsByType returned non-zero error code: ", - ierr.value) - return ( - _ovectorsize(api_elementTags_, api_elementTags_n_.value), - _ovectorsize(api_nodeTags_, api_nodeTags_n_.value)) - @staticmethod def setElements(dim, tag, elementTypes, elementTags, nodeTags): """ @@ -1662,74 +1768,72 @@ class model: ierr.value) @staticmethod - def getJacobians(elementType, integrationType, tag=-1, task=0, numTasks=1): + def getIntegrationPoints(elementType, integrationType): """ - Get the Jacobians of all the elements of type `elementType' classified on - the entity of dimension `dim' and tag `tag', at the G integration points - required by the `integrationType' integration rule (e.g. "Gauss4" for a - Gauss quadrature suited for integrating 4th order polynomials). Data is - returned by element, with elements in the same order as in `getElements' - and `getElementsByType'. `jacobians' contains for each element the 9 - entries of the 3x3 Jacobian matrix at each integration point, by row: - [e1g1Jxu, e1g1Jxv, e1g1Jxw, e1g1Jyu, ..., e1g1Jzw, e1g2Jxu, ..., e1gGJzw, - e2g1Jxu, ...], with Jxu=dx/du, Jxv=dx/dv, etc. `determinants' contains for - each element the determinant of the Jacobian matrix at each integration - point: [e1g1, e1g2, ... e1gG, e2g1, ...]. `points' contains for each - element the x, y, z coordinates of the integration points. If `tag' < 0, - get the Jacobian data for all entities. If `numTasks' > 1, only compute and - return the part of the data indexed by `task'. + Get the numerical quadrature information for the given element type + `elementType' and integration rule `integrationType' (e.g. "Gauss4" for a + Gauss quadrature suited for integrating 4th order polynomials). + `integrationPoints' contains the u, v, w coordinates of the G integration + points in the reference element: [g1u, g1v, g1w, ..., gGu, gGv, gGw]. + `integrationWeigths' contains the associated weights: [g1q, ..., gGq]. - Return `jacobians', `determinants', `points'. + Return `integrationPoints', `integrationWeights'. """ - api_jacobians_, api_jacobians_n_ = POINTER(c_double)(), c_size_t() - api_determinants_, api_determinants_n_ = POINTER(c_double)(), c_size_t() - api_points_, api_points_n_ = POINTER(c_double)(), c_size_t() + api_integrationPoints_, api_integrationPoints_n_ = POINTER(c_double)(), c_size_t() + api_integrationWeights_, api_integrationWeights_n_ = POINTER(c_double)(), c_size_t() ierr = c_int() - lib.gmshModelMeshGetJacobians( + lib.gmshModelMeshGetIntegrationPoints( c_int(elementType), c_char_p(integrationType.encode()), - byref(api_jacobians_), byref(api_jacobians_n_), - byref(api_determinants_), byref(api_determinants_n_), - byref(api_points_), byref(api_points_n_), - c_int(tag), - c_size_t(task), - c_size_t(numTasks), + byref(api_integrationPoints_), byref(api_integrationPoints_n_), + byref(api_integrationWeights_), byref(api_integrationWeights_n_), byref(ierr)) if ierr.value != 0: raise ValueError( - "gmshModelMeshGetJacobians returned non-zero error code: ", + "gmshModelMeshGetIntegrationPoints returned non-zero error code: ", ierr.value) return ( - _ovectordouble(api_jacobians_, api_jacobians_n_.value), - _ovectordouble(api_determinants_, api_determinants_n_.value), - _ovectordouble(api_points_, api_points_n_.value)) + _ovectordouble(api_integrationPoints_, api_integrationPoints_n_.value), + _ovectordouble(api_integrationWeights_, api_integrationWeights_n_.value)) @staticmethod - def preallocateJacobians(elementType, integrationType, jacobian, determinant, point, tag=-1): + def getJacobians(elementType, integrationPoints, tag=-1, task=0, numTasks=1): """ - Preallocate the data required by `getJacobians'. This is necessary only if - `getJacobians' is called with `numTasks' > 1. + Get the Jacobians of all the elements of type `elementType' classified on + the entity of tag `tag', at the G integration points `integrationPoints' + given as concatenated triplets of coordinates in the reference element + [g1u, g1v, g1w, ..., gGu, gGv, gGw]. Data is returned by element, with + elements in the same order as in `getElements' and `getElementsByType'. + `jacobians' contains for each element the 9 entries of the 3x3 Jacobian + matrix at each integration point, by row: [e1g1Jxu, e1g1Jxv, e1g1Jxw, + e1g1Jyu, ..., e1g1Jzw, e1g2Jxu, ..., e1gGJzw, e2g1Jxu, ...], with + Jxu=dx/du, Jxv=dx/dv, etc. `determinants' contains for each element the + determinant of the Jacobian matrix at each integration point: [e1g1, e1g2, + ... e1gG, e2g1, ...]. `points' contains for each element the x, y, z + coordinates of the integration points. If `tag' < 0, get the Jacobian data + for all entities. If `numTasks' > 1, only compute and return the part of + the data indexed by `task'. Return `jacobians', `determinants', `points'. """ + api_integrationPoints_, api_integrationPoints_n_ = _ivectordouble(integrationPoints) api_jacobians_, api_jacobians_n_ = POINTER(c_double)(), c_size_t() api_determinants_, api_determinants_n_ = POINTER(c_double)(), c_size_t() api_points_, api_points_n_ = POINTER(c_double)(), c_size_t() ierr = c_int() - lib.gmshModelMeshPreallocateJacobians( + lib.gmshModelMeshGetJacobians( c_int(elementType), - c_char_p(integrationType.encode()), - c_int(bool(jacobian)), - c_int(bool(determinant)), - c_int(bool(point)), + api_integrationPoints_, api_integrationPoints_n_, byref(api_jacobians_), byref(api_jacobians_n_), byref(api_determinants_), byref(api_determinants_n_), byref(api_points_), byref(api_points_n_), c_int(tag), + c_size_t(task), + c_size_t(numTasks), byref(ierr)) if ierr.value != 0: raise ValueError( - "gmshModelMeshPreallocateJacobians returned non-zero error code: ", + "gmshModelMeshGetJacobians returned non-zero error code: ", ierr.value) return ( _ovectordouble(api_jacobians_, api_jacobians_n_.value), @@ -1737,31 +1841,29 @@ class model: _ovectordouble(api_points_, api_points_n_.value)) @staticmethod - def getBasisFunctions(elementType, integrationType, functionSpaceType): - """ - Get the basis functions of the element of type `elementType' for the given - `integrationType' integration rule (e.g. "Gauss4" for a Gauss quadrature - suited for integrating 4th order polynomials) and `functionSpaceType' - function space (e.g. "Lagrange" or "GradLagrange" for Lagrange basis - functions or their gradient, in the u, v, w coordinates of the reference - element). `integrationPoints' contains the u, v, w coordinates of the - integration points in the reference element as well as the associated - weight q, concatenated: [g1u, g1v, g1w, g1q, g2u, ...]. `numComponents' - returns the number C of components of a basis function. `basisFunctions' - contains the evaluation of the basis functions at the integration points: - [g1f1, ..., g1fC, g2f1, ...]. - - Return `integrationPoints', `numComponents', `basisFunctions'. - """ - api_integrationPoints_, api_integrationPoints_n_ = POINTER(c_double)(), c_size_t() + def getBasisFunctions(elementType, integrationPoints, functionSpaceType): + """ + Get the basis functions of the element of type `elementType' at the + integration points `integrationPoints' (given as concatenated triplets of + coordinates in the reference element [g1u, g1v, g1w, ..., gGu, gGv, gGw]), + for the function space `functionSpaceType' (e.g. "Lagrange" or + "GradLagrange" for Lagrange basis functions or their gradient, in the u, v, + w coordinates of the reference element). `numComponents' returns the number + C of components of a basis function. `basisFunctions' returns the value of + the N basis functions at the integration points, i.e. [g1f1, g1f2, ..., + g1fN, g2f1, ...] when C == 1 or [g1f1u, g1f1v, g1f1w, g1f2u, ..., g1fNw, + g2f1u, ...] when C == 3. + + Return `numComponents', `basisFunctions'. + """ + api_integrationPoints_, api_integrationPoints_n_ = _ivectordouble(integrationPoints) api_numComponents_ = c_int() api_basisFunctions_, api_basisFunctions_n_ = POINTER(c_double)(), c_size_t() ierr = c_int() lib.gmshModelMeshGetBasisFunctions( c_int(elementType), - c_char_p(integrationType.encode()), + api_integrationPoints_, api_integrationPoints_n_, c_char_p(functionSpaceType.encode()), - byref(api_integrationPoints_), byref(api_integrationPoints_n_), byref(api_numComponents_), byref(api_basisFunctions_), byref(api_basisFunctions_n_), byref(ierr)) @@ -1770,10 +1872,105 @@ class model: "gmshModelMeshGetBasisFunctions returned non-zero error code: ", ierr.value) return ( - _ovectordouble(api_integrationPoints_, api_integrationPoints_n_.value), api_numComponents_.value, _ovectordouble(api_basisFunctions_, api_basisFunctions_n_.value)) + @staticmethod + def getBasisFunctionsForElements(elementType, integrationPoints, functionSpaceType, tag=-1): + """ + Get the element-dependent basis functions of the elements of type + `elementType' in the entity of tag `tag'at the integration points + `integrationPoints' (given as concatenated triplets of coordinates in the + reference element [g1u, g1v, g1w, ..., gGu, gGv, gGw]), for the function + space `functionSpaceType' (e.g. "H1Legendre3" or "GradH1Legendre3" for 3rd + order hierarchical H1 Legendre functions or their gradient, in the u, v, w + coordinates of the reference elements). `numComponents' returns the number + C of components of a basis function. `numBasisFunctions' returns the number + N of basis functions per element. `basisFunctions' returns the value of the + basis functions at the integration points for each element: [e1g1f1,..., + e1g1fN, e1g2f1,..., e2g1f1, ...] when C == 1 or [e1g1f1u, e1g1f1v,..., + e1g1fNw, e1g2f1u,..., e2g1f1u, ...]. Warning: this is an experimental + feature and will probably change in a future release. + + Return `numComponents', `numFunctionsPerElements', `basisFunctions'. + """ + api_integrationPoints_, api_integrationPoints_n_ = _ivectordouble(integrationPoints) + api_numComponents_ = c_int() + api_numFunctionsPerElements_ = c_int() + api_basisFunctions_, api_basisFunctions_n_ = POINTER(c_double)(), c_size_t() + ierr = c_int() + lib.gmshModelMeshGetBasisFunctionsForElements( + c_int(elementType), + api_integrationPoints_, api_integrationPoints_n_, + c_char_p(functionSpaceType.encode()), + byref(api_numComponents_), + byref(api_numFunctionsPerElements_), + byref(api_basisFunctions_), byref(api_basisFunctions_n_), + c_int(tag), + byref(ierr)) + if ierr.value != 0: + raise ValueError( + "gmshModelMeshGetBasisFunctionsForElements returned non-zero error code: ", + ierr.value) + return ( + api_numComponents_.value, + api_numFunctionsPerElements_.value, + _ovectordouble(api_basisFunctions_, api_basisFunctions_n_.value)) + + @staticmethod + def getKeysForElements(elementType, functionSpaceType, tag=-1, returnCoord=True): + """ + Generate the `keys' for the elements of type `elementType' in the entity of + tag `tag', for the `functionSpaceType' function space. Each key uniquely + identifies a basis function in the function space. If `returnCoord' is set, + the `coord' vector contains the x, y, z coordinates locating basis + functions for sorting purposes. Warning: this is an experimental feature + and will probably change in a future release. + + Return `keys', `coord'. + """ + api_keys_, api_keys_n_ = POINTER(c_int)(), c_size_t() + api_coord_, api_coord_n_ = POINTER(c_double)(), c_size_t() + ierr = c_int() + lib.gmshModelMeshGetKeysForElements( + c_int(elementType), + c_char_p(functionSpaceType.encode()), + byref(api_keys_), byref(api_keys_n_), + byref(api_coord_), byref(api_coord_n_), + c_int(tag), + c_int(bool(returnCoord)), + byref(ierr)) + if ierr.value != 0: + raise ValueError( + "gmshModelMeshGetKeysForElements returned non-zero error code: ", + ierr.value) + return ( + _ovectorpair(api_keys_, api_keys_n_.value), + _ovectordouble(api_coord_, api_coord_n_.value)) + + @staticmethod + def getInformationForElements(keys, order, elementType): + """ + Get information about the `keys'. Warning: this is an experimental feature + and will probably change in a future release. + + Return `info'. + """ + api_keys_, api_keys_n_ = _ivectorpair(keys) + api_info_, api_info_n_ = POINTER(c_int)(), c_size_t() + ierr = c_int() + lib.gmshModelMeshGetInformationForElements( + api_keys_, api_keys_n_, + byref(api_info_), byref(api_info_n_), + c_int(order), + c_int(elementType), + byref(ierr)) + if ierr.value != 0: + raise ValueError( + "gmshModelMeshGetInformationForElements returned non-zero error code: ", + ierr.value) + return _ovectorpair(api_info_, api_info_n_.value) + @staticmethod def precomputeBasisFunctions(elementType): """ @@ -1818,35 +2015,17 @@ class model: ierr.value) return _ovectordouble(api_barycenters_, api_barycenters_n_.value) - @staticmethod - def preallocateBarycenters(elementType, tag=-1): - """ - Preallocate the data required by `getBarycenters'. This is necessary only - if `getBarycenters' is called with `numTasks' > 1. - - Return `barycenters'. - """ - api_barycenters_, api_barycenters_n_ = POINTER(c_double)(), c_size_t() - ierr = c_int() - lib.gmshModelMeshPreallocateBarycenters( - c_int(elementType), - byref(api_barycenters_), byref(api_barycenters_n_), - c_int(tag), - byref(ierr)) - if ierr.value != 0: - raise ValueError( - "gmshModelMeshPreallocateBarycenters returned non-zero error code: ", - ierr.value) - return _ovectordouble(api_barycenters_, api_barycenters_n_.value) - @staticmethod def getElementEdgeNodes(elementType, tag=-1, primary=False, task=0, numTasks=1): """ Get the nodes on the edges of all elements of type `elementType' classified - on the entity of tag `tag'. `nodeTags' contains the node tags. If `primary' - is set, only the primary (begin/end) nodes of the edges are returned. If - `tag' < 0, get the edge nodes for all entities. If `numTasks' > 1, only - compute and return the part of the data indexed by `task'. + on the entity of tag `tag'. `nodeTags' contains the node tags of the edges + for all the elements: [e1a1n1, e1a1n2, e1a2n1, ...]. Data is returned by + element, with elements in the same order as in `getElements' and + `getElementsByType'. If `primary' is set, only the primary (begin/end) + nodes of the edges are returned. If `tag' < 0, get the edge nodes for all + entities. If `numTasks' > 1, only compute and return the part of the data + indexed by `task'. Return `nodeTags'. """ @@ -1871,10 +2050,13 @@ class model: """ Get the nodes on the faces of type `faceType' (3 for triangular faces, 4 for quadrangular faces) of all elements of type `elementType' classified on - the entity of tag `tag'. `nodeTags' contains the node tags. If `primary' is - set, only the primary (corner) nodes of the faces are returned. If `tag' < - 0, get the face nodes for all entities. If `numTasks' > 1, only compute and - return the part of the data indexed by `task'. + the entity of tag `tag'. `nodeTags' contains the node tags of the faces for + all elements: [e1f1n1, ..., e1f1nFaceType, e1f2n1, ...]. Data is returned + by element, with elements in the same order as in `getElements' and + `getElementsByType'. If `primary' is set, only the primary (corner) nodes + of the faces are returned. If `tag' < 0, get the face nodes for all + entities. If `numTasks' > 1, only compute and return the part of the data + indexed by `task'. Return `nodeTags'. """ @@ -1923,8 +2105,8 @@ class model: @staticmethod def setSize(dimTags, size): """ - Set a mesh size constraint on the geometrical entities `dimTags'. Currently - only entities of dimension 0 (points) are handled. + Set a mesh size constraint on the model entities `dimTags'. Currently only + entities of dimension 0 (points) are handled. """ api_dimTags_, api_dimTags_n_ = _ivectorpair(dimTags) ierr = c_int() @@ -2001,9 +2183,9 @@ class model: @staticmethod def setRecombine(dim, tag): """ - Set a recombination meshing constraint on the geometrical entity of - dimension `dim' and tag `tag'. Currently only entities of dimension 2 (to - recombine triangles into quadrangles) are supported. + Set a recombination meshing constraint on the model entity of dimension + `dim' and tag `tag'. Currently only entities of dimension 2 (to recombine + triangles into quadrangles) are supported. """ ierr = c_int() lib.gmshModelMeshSetRecombine( @@ -2018,8 +2200,8 @@ class model: @staticmethod def setSmoothing(dim, tag, val): """ - Set a smoothing meshing constraint on the geometrical entity of dimension - `dim' and tag `tag'. `val' iterations of a Laplace smoother are applied. + Set a smoothing meshing constraint on the model entity of dimension `dim' + and tag `tag'. `val' iterations of a Laplace smoother are applied. """ ierr = c_int() lib.gmshModelMeshSetSmoothing( @@ -2035,11 +2217,11 @@ class model: @staticmethod def setReverse(dim, tag, val=True): """ - Set a reverse meshing constraint on the geometrical entity of dimension - `dim' and tag `tag'. If `val' is true, the mesh orientation will be - reversed with respect to the natural mesh orientation (i.e. the orientation - consistent with the orientation of the geometrical entity). If `val' is - false, the mesh is left as-is. + Set a reverse meshing constraint on the model entity of dimension `dim' and + tag `tag'. If `val' is true, the mesh orientation will be reversed with + respect to the natural mesh orientation (i.e. the orientation consistent + with the orientation of the geometry). If `val' is false, the mesh is left + as-is. """ ierr = c_int() lib.gmshModelMeshSetReverse( @@ -2072,9 +2254,8 @@ class model: @staticmethod def embed(dim, tags, inDim, inTag): """ - Embed the geometrical entities of dimension `dim' and tags `tags' in the - (inDim, inTag) geometrical entity. `inDim' must be strictly greater than - `dim'. + Embed the model entities of dimension `dim' and tags `tags' in the (inDim, + inTag) model entity. `inDim' must be strictly greater than `dim'. """ api_tags_, api_tags_n_ = _ivectorint(tags) ierr = c_int() @@ -2092,9 +2273,9 @@ class model: @staticmethod def removeEmbedded(dimTags, dim=-1): """ - Remove embedded entities in the geometrical entities `dimTags'. if `dim' is - >= 0, only remove embedded entities of the given dimension (e.g. embedded - points if `dim' == 0). + Remove embedded entities in the model entities `dimTags'. if `dim' is >= 0, + only remove embedded entities of the given dimension (e.g. embedded points + if `dim' == 0). """ api_dimTags_, api_dimTags_n_ = _ivectorpair(dimTags) ierr = c_int() @@ -2339,14 +2520,14 @@ class model: class field: """ - Per-model mesh size field functions + Mesh size field functions """ @staticmethod def add(fieldType, tag=-1): """ Add a new mesh size field of type `fieldType'. If `tag' is positive, assign - the tag explcitly; otherwise a new tag is assigned automatically. Return + the tag explicitly; otherwise a new tag is assigned automatically. Return the field tag. Return an integer value. @@ -2456,18 +2637,18 @@ class model: class geo: """ - Internal per-model GEO CAD kernel functions + Built-in CAD kernel functions """ @staticmethod def addPoint(x, y, z, meshSize=0., tag=-1): """ - Add a geometrical point in the internal GEO CAD representation, at - coordinates (`x', `y', `z'). If `meshSize' is > 0, add a meshing constraint - at that point. If `tag' is positive, set the tag explicitly; otherwise a - new tag is selected automatically. Return the tag of the point. (Note that - the point will be added in the current model only after `synchronize' is - called. This behavior holds for all the entities added in the geo module.) + Add a geometrical point in the built-in CAD representation, at coordinates + (`x', `y', `z'). If `meshSize' is > 0, add a meshing constraint at that + point. If `tag' is positive, set the tag explicitly; otherwise a new tag is + selected automatically. Return the tag of the point. (Note that the point + will be added in the current model only after `synchronize' is called. This + behavior holds for all the entities added in the geo module.) Return an integer value. """ @@ -2509,11 +2690,11 @@ class model: @staticmethod def addCircleArc(startTag, centerTag, endTag, tag=-1, nx=0., ny=0., nz=0.): """ - Add a circle arc (stricly smaller than Pi) between the two points with tags - `startTag' and `endTag', with center `centertag'. If `tag' is positive, set - the tag explicitly; otherwise a new tag is selected automatically. If - (`nx', `ny', `nz') != (0,0,0), explicitely set the plane of the circle arc. - Return the tag of the circle arc. + Add a circle arc (strictly smaller than Pi) between the two points with + tags `startTag' and `endTag', with center `centertag'. If `tag' is + positive, set the tag explicitly; otherwise a new tag is selected + automatically. If (`nx', `ny', `nz') != (0,0,0), explicitly set the plane + of the circle arc. Return the tag of the circle arc. Return an integer value. """ @@ -2536,12 +2717,11 @@ class model: @staticmethod def addEllipseArc(startTag, centerTag, majorTag, endTag, tag=-1, nx=0., ny=0., nz=0.): """ - Add an ellipse arc (stricly smaller than Pi) between the two points + Add an ellipse arc (strictly smaller than Pi) between the two points `startTag' and `endTag', with center `centertag' and major axis point `majorTag'. If `tag' is positive, set the tag explicitly; otherwise a new - tag is selected automatically. If (`nx', `ny', `nz') != (0,0,0), - explicitely set the plane of the circle arc. Return the tag of the ellipse - arc. + tag is selected automatically. If (`nx', `ny', `nz') != (0,0,0), explicitly + set the plane of the circle arc. Return the tag of the ellipse arc. Return an integer value. """ @@ -2631,8 +2811,8 @@ class model: def addCurveLoop(curveTags, tag=-1): """ Add a curve loop (a closed wire) formed by the curves `curveTags'. - `curveTags' should contain (signed) tags of geometrical enties of dimension - 1 forming a closed loop: a negative tag signifies that the underlying curve + `curveTags' should contain (signed) tags of model enties of dimension 1 + forming a closed loop: a negative tag signifies that the underlying curve is considered with reversed orientation. If `tag' is positive, set the tag explicitly; otherwise a new tag is selected automatically. Return the tag of the curve loop. @@ -2742,11 +2922,12 @@ class model: @staticmethod def extrude(dimTags, dx, dy, dz, numElements=[], heights=[], recombine=False): """ - Extrude the geometrical entities `dimTags' by translation along (`dx', - `dy', `dz'). Return extruded entities in `outDimTags'. If `numElements' is - not empty, also extrude the mesh: the entries in `numElements' give the - number of elements in each layer. If `height' is not empty, it provides the - (cummulative) height of the different layers, normalized to 1. + Extrude the model entities `dimTags' by translation along (`dx', `dy', + `dz'). Return extruded entities in `outDimTags'. If `numElements' is not + empty, also extrude the mesh: the entries in `numElements' give the number + of elements in each layer. If `height' is not empty, it provides the + (cumulative) height of the different layers, normalized to 1. If `dx' == + `dy' == `dz' == 0, the entities are extruded along their normal. Return `outDimTags'. """ @@ -2774,12 +2955,12 @@ class model: @staticmethod def revolve(dimTags, x, y, z, ax, ay, az, angle, numElements=[], heights=[], recombine=False): """ - Extrude the geometrical entities `dimTags' by rotation of `angle' radians - around the axis of revolution defined by the point (`x', `y', `z') and the + Extrude the model entities `dimTags' by rotation of `angle' radians around + the axis of revolution defined by the point (`x', `y', `z') and the direction (`ax', `ay', `az'). Return extruded entities in `outDimTags'. If `numElements' is not empty, also extrude the mesh: the entries in `numElements' give the number of elements in each layer. If `height' is not - empty, it provides the (cummulative) height of the different layers, + empty, it provides the (cumulative) height of the different layers, normalized to 1. Return `outDimTags'. @@ -2812,13 +2993,13 @@ class model: @staticmethod def twist(dimTags, x, y, z, dx, dy, dz, ax, ay, az, angle, numElements=[], heights=[], recombine=False): """ - Extrude the geometrical entities `dimTags' by a combined translation and - rotation of `angle' radians, along (`dx', `dy', `dz') and around the axis - of revolution defined by the point (`x', `y', `z') and the direction (`ax', + Extrude the model entities `dimTags' by a combined translation and rotation + of `angle' radians, along (`dx', `dy', `dz') and around the axis of + revolution defined by the point (`x', `y', `z') and the direction (`ax', `ay', `az'). Return extruded entities in `outDimTags'. If `numElements' is not empty, also extrude the mesh: the entries in `numElements' give the number of elements in each layer. If `height' is not empty, it provides the - (cummulative) height of the different layers, normalized to 1. + (cumulative) height of the different layers, normalized to 1. Return `outDimTags'. """ @@ -2853,7 +3034,7 @@ class model: @staticmethod def translate(dimTags, dx, dy, dz): """ - Translate the geometrical entities `dimTags' along (`dx', `dy', `dz'). + Translate the model entities `dimTags' along (`dx', `dy', `dz'). """ api_dimTags_, api_dimTags_n_ = _ivectorpair(dimTags) ierr = c_int() @@ -2871,9 +3052,9 @@ class model: @staticmethod def rotate(dimTags, x, y, z, ax, ay, az, angle): """ - Rotate the geometrical entities `dimTags' of `angle' radians around the - axis of revolution defined by the point (`x', `y', `z') and the direction - (`ax', `ay', `az'). + Rotate the model entities `dimTags' of `angle' radians around the axis of + revolution defined by the point (`x', `y', `z') and the direction (`ax', + `ay', `az'). """ api_dimTags_, api_dimTags_n_ = _ivectorpair(dimTags) ierr = c_int() @@ -2895,9 +3076,9 @@ class model: @staticmethod def dilate(dimTags, x, y, z, a, b, c): """ - Scale the geometrical entities `dimTag' by factors `a', `b' and `c' along - the three coordinate axes; use (`x', `y', `z') as the center of the - homothetic transformation. + Scale the model entities `dimTag' by factors `a', `b' and `c' along the + three coordinate axes; use (`x', `y', `z') as the center of the homothetic + transformation. """ api_dimTags_, api_dimTags_n_ = _ivectorpair(dimTags) ierr = c_int() @@ -2918,7 +3099,7 @@ class model: @staticmethod def symmetrize(dimTags, a, b, c, d): """ - Apply a symmetry transformation to the geometrical entities `dimTag', with + Apply a symmetry transformation to the model entities `dimTag', with respect to the plane of equation `a' * x + `b' * y + `c' * z + `d' = 0. """ api_dimTags_, api_dimTags_n_ = _ivectorpair(dimTags) @@ -2989,10 +3170,10 @@ class model: @staticmethod def synchronize(): """ - Synchronize the internal GEO CAD representation with the current Gmsh - model. This can be called at any time, but since it involves a non trivial - amount of processing, the number of synchronization points should normally - be minimized. + Synchronize the built-in CAD representation with the current Gmsh model. + This can be called at any time, but since it involves a non trivial amount + of processing, the number of synchronization points should normally be + minimized. """ ierr = c_int() lib.gmshModelGeoSynchronize( @@ -3005,14 +3186,14 @@ class model: class mesh: """ - GEO-specific meshing constraints + Built-in CAD kernel meshing constraints """ @staticmethod def setSize(dimTags, size): """ - Set a mesh size constraint on the geometrical entities `dimTags'. Currently - only entities of dimension 0 (points) are handled. + Set a mesh size constraint on the model entities `dimTags'. Currently only + entities of dimension 0 (points) are handled. """ api_dimTags_, api_dimTags_n_ = _ivectorpair(dimTags) ierr = c_int() @@ -3031,7 +3212,7 @@ class model: Set a transfinite meshing constraint on the curve `tag', with `numNodes' nodes distributed according to `meshType' and `coef'. Currently supported types are "Progression" (geometrical progression with power `coef') and - "Bump" (refinement toward both extreminties of the curve). + "Bump" (refinement toward both extremities of the curve). """ ierr = c_int() lib.gmshModelGeoMeshSetTransfiniteCurve( @@ -3089,9 +3270,9 @@ class model: @staticmethod def setRecombine(dim, tag, angle=45.): """ - Set a recombination meshing constraint on the geometrical entity of - dimension `dim' and tag `tag'. Currently only entities of dimension 2 (to - recombine triangles into quadrangles) are supported. + Set a recombination meshing constraint on the model entity of dimension + `dim' and tag `tag'. Currently only entities of dimension 2 (to recombine + triangles into quadrangles) are supported. """ ierr = c_int() lib.gmshModelGeoMeshSetRecombine( @@ -3107,8 +3288,8 @@ class model: @staticmethod def setSmoothing(dim, tag, val): """ - Set a smoothing meshing constraint on the geometrical entity of dimension - `dim' and tag `tag'. `val' iterations of a Laplace smoother are applied. + Set a smoothing meshing constraint on the model entity of dimension `dim' + and tag `tag'. `val' iterations of a Laplace smoother are applied. """ ierr = c_int() lib.gmshModelGeoMeshSetSmoothing( @@ -3124,11 +3305,11 @@ class model: @staticmethod def setReverse(dim, tag, val=True): """ - Set a reverse meshing constraint on the geometrical entity of dimension - `dim' and tag `tag'. If `val' is true, the mesh orientation will be - reversed with respect to the natural mesh orientation (i.e. the orientation - consistent with the orientation of the geometrical entity). If `val' is - false, the mesh is left as-is. + Set a reverse meshing constraint on the model entity of dimension `dim' and + tag `tag'. If `val' is true, the mesh orientation will be reversed with + respect to the natural mesh orientation (i.e. the orientation consistent + with the orientation of the geometry). If `val' is false, the mesh is left + as-is. """ ierr = c_int() lib.gmshModelGeoMeshSetReverse( @@ -3144,13 +3325,13 @@ class model: class occ: """ - Internal per-model OpenCASCADE CAD kernel functions + OpenCASCADE CAD kernel functions """ @staticmethod def addPoint(x, y, z, meshSize=0., tag=-1): """ - Add a geometrical point in the internal OpenCASCADE CAD representation, at + Add a geometrical point in the OpenCASCADE CAD representation, at coordinates (`x', `y', `z'). If `meshSize' is > 0, add a meshing constraint at that point. If `tag' is positive, set the tag explicitly; otherwise a new tag is selected automatically. Return the tag of the point. (Note that @@ -3780,11 +3961,11 @@ class model: @staticmethod def extrude(dimTags, dx, dy, dz, numElements=[], heights=[], recombine=False): """ - Extrude the geometrical entities `dimTags' by translation along (`dx', - `dy', `dz'). Return extruded entities in `outDimTags'. If `numElements' is - not empty, also extrude the mesh: the entries in `numElements' give the - number of elements in each layer. If `height' is not empty, it provides the - (cummulative) height of the different layers, normalized to 1. + Extrude the model entities `dimTags' by translation along (`dx', `dy', + `dz'). Return extruded entities in `outDimTags'. If `numElements' is not + empty, also extrude the mesh: the entries in `numElements' give the number + of elements in each layer. If `height' is not empty, it provides the + (cumulative) height of the different layers, normalized to 1. Return `outDimTags'. """ @@ -3812,12 +3993,12 @@ class model: @staticmethod def revolve(dimTags, x, y, z, ax, ay, az, angle, numElements=[], heights=[], recombine=False): """ - Extrude the geometrical entities `dimTags' by rotation of `angle' radians - around the axis of revolution defined by the point (`x', `y', `z') and the + Extrude the model entities `dimTags' by rotation of `angle' radians around + the axis of revolution defined by the point (`x', `y', `z') and the direction (`ax', `ay', `az'). Return extruded entities in `outDimTags'. If `numElements' is not empty, also extrude the mesh: the entries in `numElements' give the number of elements in each layer. If `height' is not - empty, it provides the (cummulative) height of the different layers, + empty, it provides the (cumulative) height of the different layers, normalized to 1. Return `outDimTags'. @@ -3938,9 +4119,9 @@ class model: """ Compute the boolean union (the fusion) of the entities `objectDimTags' and `toolDimTags'. Return the resulting entities in `outDimTags'. If `tag' is - positive, try to set the tag explicitly (ony valid if the boolean operation - results in a single entity). Remove the object if `removeObject' is set. - Remove the tool if `removeTool' is set. + positive, try to set the tag explicitly (only valid if the boolean + operation results in a single entity). Remove the object if `removeObject' + is set. Remove the tool if `removeTool' is set. Return `outDimTags', `outDimTagsMap'. """ @@ -3971,7 +4152,7 @@ class model: """ Compute the boolean intersection (the common parts) of the entities `objectDimTags' and `toolDimTags'. Return the resulting entities in - `outDimTags'. If `tag' is positive, try to set the tag explicitly (ony + `outDimTags'. If `tag' is positive, try to set the tag explicitly (only valid if the boolean operation results in a single entity). Remove the object if `removeObject' is set. Remove the tool if `removeTool' is set. @@ -4004,9 +4185,9 @@ class model: """ Compute the boolean difference between the entities `objectDimTags' and `toolDimTags'. Return the resulting entities in `outDimTags'. If `tag' is - positive, try to set the tag explicitly (ony valid if the boolean operation - results in a single entity). Remove the object if `removeObject' is set. - Remove the tool if `removeTool' is set. + positive, try to set the tag explicitly (only valid if the boolean + operation results in a single entity). Remove the object if `removeObject' + is set. Remove the tool if `removeTool' is set. Return `outDimTags', `outDimTagsMap'. """ @@ -4037,7 +4218,7 @@ class model: """ Compute the boolean fragments (general fuse) of the entities `objectDimTags' and `toolDimTags'. Return the resulting entities in - `outDimTags'. If `tag' is positive, try to set the tag explicitly (ony + `outDimTags'. If `tag' is positive, try to set the tag explicitly (only valid if the boolean operation results in a single entity). Remove the object if `removeObject' is set. Remove the tool if `removeTool' is set. @@ -4068,7 +4249,7 @@ class model: @staticmethod def translate(dimTags, dx, dy, dz): """ - Translate the geometrical entities `dimTags' along (`dx', `dy', `dz'). + Translate the model entities `dimTags' along (`dx', `dy', `dz'). """ api_dimTags_, api_dimTags_n_ = _ivectorpair(dimTags) ierr = c_int() @@ -4086,9 +4267,9 @@ class model: @staticmethod def rotate(dimTags, x, y, z, ax, ay, az, angle): """ - Rotate the geometrical entities `dimTags' of `angle' radians around the - axis of revolution defined by the point (`x', `y', `z') and the direction - (`ax', `ay', `az'). + Rotate the model entities `dimTags' of `angle' radians around the axis of + revolution defined by the point (`x', `y', `z') and the direction (`ax', + `ay', `az'). """ api_dimTags_, api_dimTags_n_ = _ivectorpair(dimTags) ierr = c_int() @@ -4110,9 +4291,9 @@ class model: @staticmethod def dilate(dimTags, x, y, z, a, b, c): """ - Scale the geometrical entities `dimTag' by factors `a', `b' and `c' along - the three coordinate axes; use (`x', `y', `z') as the center of the - homothetic transformation. + Scale the model entities `dimTag' by factors `a', `b' and `c' along the + three coordinate axes; use (`x', `y', `z') as the center of the homothetic + transformation. """ api_dimTags_, api_dimTags_n_ = _ivectorpair(dimTags) ierr = c_int() @@ -4133,7 +4314,7 @@ class model: @staticmethod def symmetrize(dimTags, a, b, c, d): """ - Apply a symmetry transformation to the geometrical entities `dimTag', with + Apply a symmetry transformation to the model entities `dimTag', with respect to the plane of equation `a' * x + `b' * y + `c' * z + `d' = 0. """ api_dimTags_, api_dimTags_n_ = _ivectorpair(dimTags) @@ -4155,7 +4336,7 @@ class model: """ Apply a general affine transformation matrix `a' (16 entries of a 4x4 matrix, by row; only the 12 first can be provided for convenience) to the - geometrical entities `dimTag'. + model entities `dimTag'. """ api_dimTags_, api_dimTags_n_ = _ivectorpair(dimTags) api_a_, api_a_n_ = _ivectordouble(a) @@ -4247,54 +4428,98 @@ class model: return _ovectorpair(api_outDimTags_, api_outDimTags_n_.value) @staticmethod - def importShapesNativePointer(shape, highestDimOnly=True): + def setMeshSize(dimTags, size): """ - Imports an OpenCASCADE `shape' by providing a pointer to a native - OpenCASCADE `TopoDS_Shape' object (passed as a pointer to void). The - imported entities are returned in `outDimTags'. If the optional argument - `highestDimOnly' is set, only import the highest dimensional entities in - `shape'. Warning: this function is unsafe, as providing an invalid pointer - will lead to undefined behavior. + Set a mesh size constraint on the model entities `dimTags'. Currently only + entities of dimension 0 (points) are handled. + """ + api_dimTags_, api_dimTags_n_ = _ivectorpair(dimTags) + ierr = c_int() + lib.gmshModelOccSetMeshSize( + api_dimTags_, api_dimTags_n_, + c_double(size), + byref(ierr)) + if ierr.value != 0: + raise ValueError( + "gmshModelOccSetMeshSize returned non-zero error code: ", + ierr.value) - Return `outDimTags'. + @staticmethod + def getMass(dim, tag): """ - api_outDimTags_, api_outDimTags_n_ = POINTER(c_int)(), c_size_t() + Get the mass of the model entity of dimension `dim' and tag `tag'. + + Return `mass'. + """ + api_mass_ = c_double() ierr = c_int() - lib.gmshModelOccImportShapesNativePointer( - c_void_p(shape), - byref(api_outDimTags_), byref(api_outDimTags_n_), - c_int(bool(highestDimOnly)), + lib.gmshModelOccGetMass( + c_int(dim), + c_int(tag), + byref(api_mass_), byref(ierr)) if ierr.value != 0: raise ValueError( - "gmshModelOccImportShapesNativePointer returned non-zero error code: ", + "gmshModelOccGetMass returned non-zero error code: ", ierr.value) - return _ovectorpair(api_outDimTags_, api_outDimTags_n_.value) + return api_mass_.value @staticmethod - def setMeshSize(dimTags, size): + def getCenterOfMass(dim, tag): """ - Set a mesh size constraint on the geometrical entities `dimTags'. Currently - only entities of dimension 0 (points) are handled. + Get the center of mass of the model entity of dimension `dim' and tag + `tag'. + + Return `x', `y', `z'. """ - api_dimTags_, api_dimTags_n_ = _ivectorpair(dimTags) + api_x_ = c_double() + api_y_ = c_double() + api_z_ = c_double() ierr = c_int() - lib.gmshModelOccSetMeshSize( - api_dimTags_, api_dimTags_n_, - c_double(size), + lib.gmshModelOccGetCenterOfMass( + c_int(dim), + c_int(tag), + byref(api_x_), + byref(api_y_), + byref(api_z_), byref(ierr)) if ierr.value != 0: raise ValueError( - "gmshModelOccSetMeshSize returned non-zero error code: ", + "gmshModelOccGetCenterOfMass returned non-zero error code: ", ierr.value) + return ( + api_x_.value, + api_y_.value, + api_z_.value) + + @staticmethod + def getMatrixOfInertia(dim, tag): + """ + Get the matrix of inertia (by row) of the model entity of dimension `dim' + and tag `tag'. + + Return `mat'. + """ + api_mat_, api_mat_n_ = POINTER(c_double)(), c_size_t() + ierr = c_int() + lib.gmshModelOccGetMatrixOfInertia( + c_int(dim), + c_int(tag), + byref(api_mat_), byref(api_mat_n_), + byref(ierr)) + if ierr.value != 0: + raise ValueError( + "gmshModelOccGetMatrixOfInertia returned non-zero error code: ", + ierr.value) + return _ovectordouble(api_mat_, api_mat_n_.value) @staticmethod def synchronize(): """ - Synchronize the internal OpenCASCADE CAD representation with the current - Gmsh model. This can be called at any time, but since it involves a non - trivial amount of processing, the number of synchronization points should - normally be minimized. + Synchronize the OpenCASCADE CAD representation with the current Gmsh model. + This can be called at any time, but since it involves a non trivial amount + of processing, the number of synchronization points should normally be + minimized. """ ierr = c_int() lib.gmshModelOccSynchronize( @@ -4501,6 +4726,63 @@ class view: _ovectorint(api_numElements_, api_numElements_n_.value), _ovectorvectordouble(api_data_, api_data_n_, api_data_nn_)) + @staticmethod + def addAlias(refTag, copyOptions=False, tag=-1): + """ + Add a post-processing view as an `alias' of the reference view with tag + `refTag'. If `copyOptions' is set, copy the options of the reference view. + If `tag' is positive use it (and remove the view with that tag if it + already exists), otherwise associate a new tag. Return the view tag. + + Return an integer value. + """ + ierr = c_int() + api__result__ = lib.gmshViewAddAlias( + c_int(refTag), + c_int(bool(copyOptions)), + c_int(tag), + byref(ierr)) + if ierr.value != 0: + raise ValueError( + "gmshViewAddAlias returned non-zero error code: ", + ierr.value) + return api__result__ + + @staticmethod + def copyOptions(refTag, tag): + """ + Copy the options from the view with tag `refTag' to the view with tag + `tag'. + """ + ierr = c_int() + lib.gmshViewCopyOptions( + c_int(refTag), + c_int(tag), + byref(ierr)) + if ierr.value != 0: + raise ValueError( + "gmshViewCopyOptions returned non-zero error code: ", + ierr.value) + + @staticmethod + def combine(what, how, remove=False): + """ + Combine elements (if `what' == "elements") or steps (if `what' == "steps") + of all views (`how' == "all"), all visible views (`how' == "visible") or + all views having the same name (`how' == "name"). Remove original views if + `remove' is set. + """ + ierr = c_int() + lib.gmshViewCombine( + c_char_p(what.encode()), + c_char_p(how.encode()), + c_int(bool(remove)), + byref(ierr)) + if ierr.value != 0: + raise ValueError( + "gmshViewCombine returned non-zero error code: ", + ierr.value) + @staticmethod def probe(tag, x, y, z, step=-1, numComp=-1, gradient=False, tolerance=0., xElemCoord=[], yElemCoord=[], zElemCoord=[]): """ @@ -4630,13 +4912,13 @@ class graphics: class fltk: """ - Fltk graphical user interface functions + FLTK graphical user interface functions """ @staticmethod def initialize(): """ - Create the Fltk graphical user interface. Can only be called in the main + Create the FLTK graphical user interface. Can only be called in the main thread. """ ierr = c_int() @@ -4950,7 +5232,7 @@ class onelab: class logger: """ - Message logger functions + Information logging functions """ @staticmethod diff --git a/api/gmshc.cpp b/api/gmshc.cpp index 0fb13ca5d72c0e74421bd2f7f9130ac727820a2f..c4d8aaf917f6d7c96bfc89e56cf8b2f09609d531 100644 --- a/api/gmshc.cpp +++ b/api/gmshc.cpp @@ -181,6 +181,28 @@ GMSH_API void gmshOptionGetString(const char * name, char ** value, int * ierr) } } +GMSH_API void gmshOptionSetColor(const char * name, const int r, const int g, const int b, const int a, int * ierr) +{ + if(ierr) *ierr = 0; + try { + gmsh::option::setColor(name, r, g, b, a); + } + catch(int api_ierr_){ + if(ierr) *ierr = api_ierr_; + } +} + +GMSH_API void gmshOptionGetColor(const char * name, int * r, int * g, int * b, int * a, int * ierr) +{ + if(ierr) *ierr = 0; + try { + gmsh::option::getColor(name, *r, *g, *b, *a); + } + catch(int api_ierr_){ + if(ierr) *ierr = api_ierr_; + } +} + GMSH_API void gmshModelAdd(const char * name, int * ierr) { if(ierr) *ierr = 0; @@ -631,6 +653,17 @@ GMSH_API void gmshModelGetColor(const int dim, const int tag, int * r, int * g, } } +GMSH_API void gmshModelSetCoordinates(const int tag, const double x, const double y, const double z, int * ierr) +{ + if(ierr) *ierr = 0; + try { + gmsh::model::setCoordinates(tag, x, y, z); + } + catch(int api_ierr_){ + if(ierr) *ierr = api_ierr_; + } +} + GMSH_API void gmshModelMeshGenerate(const int dim, int * ierr) { if(ierr) *ierr = 0; @@ -664,6 +697,28 @@ GMSH_API void gmshModelMeshUnpartition(int * ierr) } } +GMSH_API void gmshModelMeshOptimize(const char * method, int * ierr) +{ + if(ierr) *ierr = 0; + try { + gmsh::model::mesh::optimize(method); + } + catch(int api_ierr_){ + if(ierr) *ierr = api_ierr_; + } +} + +GMSH_API void gmshModelMeshRecombine(int * ierr) +{ + if(ierr) *ierr = 0; + try { + gmsh::model::mesh::recombine(); + } + catch(int api_ierr_){ + if(ierr) *ierr = api_ierr_; + } +} + GMSH_API void gmshModelMeshRefine(int * ierr) { if(ierr) *ierr = 0; @@ -675,6 +730,17 @@ GMSH_API void gmshModelMeshRefine(int * ierr) } } +GMSH_API void gmshModelMeshSmooth(int * ierr) +{ + if(ierr) *ierr = 0; + try { + gmsh::model::mesh::smooth(); + } + catch(int api_ierr_){ + if(ierr) *ierr = api_ierr_; + } +} + GMSH_API void gmshModelMeshSetOrder(const int order, int * ierr) { if(ierr) *ierr = 0; @@ -712,14 +778,14 @@ GMSH_API void gmshModelMeshGetLastNodeError(size_t ** nodeTags, size_t * nodeTag } } -GMSH_API void gmshModelMeshGetNodes(size_t ** nodeTags, size_t * nodeTags_n, double ** coord, size_t * coord_n, double ** parametricCoord, size_t * parametricCoord_n, const int dim, const int tag, const int includeBoundary, int * ierr) +GMSH_API void gmshModelMeshGetNodes(size_t ** nodeTags, size_t * nodeTags_n, double ** coord, size_t * coord_n, double ** parametricCoord, size_t * parametricCoord_n, const int dim, const int tag, const int includeBoundary, const int returnParametricCoord, int * ierr) { if(ierr) *ierr = 0; try { std::vector<std::size_t> api_nodeTags_; std::vector<double> api_coord_; std::vector<double> api_parametricCoord_; - gmsh::model::mesh::getNodes(api_nodeTags_, api_coord_, api_parametricCoord_, dim, tag, includeBoundary); + gmsh::model::mesh::getNodes(api_nodeTags_, api_coord_, api_parametricCoord_, dim, tag, includeBoundary, returnParametricCoord); vector2ptr(api_nodeTags_, nodeTags, nodeTags_n); vector2ptr(api_coord_, coord, coord_n); vector2ptr(api_parametricCoord_, parametricCoord, parametricCoord_n); @@ -836,12 +902,12 @@ GMSH_API void gmshModelMeshGetElement(const size_t elementTag, int * elementType } } -GMSH_API void gmshModelMeshGetElementByCoordinates(const double x, const double y, const double z, size_t * elementTag, int * elementType, size_t ** nodeTags, size_t * nodeTags_n, int * ierr) +GMSH_API void gmshModelMeshGetElementByCoordinates(const double x, const double y, const double z, size_t * elementTag, int * elementType, size_t ** nodeTags, size_t * nodeTags_n, double * u, double * v, double * w, const int dim, const int strict, int * ierr) { if(ierr) *ierr = 0; try { std::vector<std::size_t> api_nodeTags_; - gmsh::model::mesh::getElementByCoordinates(x, y, z, *elementTag, *elementType, api_nodeTags_); + gmsh::model::mesh::getElementByCoordinates(x, y, z, *elementTag, *elementType, api_nodeTags_, *u, *v, *w, dim, strict); vector2ptr(api_nodeTags_, nodeTags, nodeTags_n); } catch(int api_ierr_){ @@ -951,14 +1017,30 @@ GMSH_API void gmshModelMeshSetElementsByType(const int tag, const int elementTyp } } -GMSH_API void gmshModelMeshGetJacobians(const int elementType, const char * integrationType, double ** jacobians, size_t * jacobians_n, double ** determinants, size_t * determinants_n, double ** points, size_t * points_n, const int tag, const size_t task, const size_t numTasks, int * ierr) +GMSH_API void gmshModelMeshGetIntegrationPoints(const int elementType, const char * integrationType, double ** integrationPoints, size_t * integrationPoints_n, double ** integrationWeights, size_t * integrationWeights_n, int * ierr) { if(ierr) *ierr = 0; try { + std::vector<double> api_integrationPoints_; + std::vector<double> api_integrationWeights_; + gmsh::model::mesh::getIntegrationPoints(elementType, integrationType, api_integrationPoints_, api_integrationWeights_); + vector2ptr(api_integrationPoints_, integrationPoints, integrationPoints_n); + vector2ptr(api_integrationWeights_, integrationWeights, integrationWeights_n); + } + catch(int api_ierr_){ + if(ierr) *ierr = api_ierr_; + } +} + +GMSH_API void gmshModelMeshGetJacobians(const int elementType, double * integrationPoints, size_t integrationPoints_n, double ** jacobians, size_t * jacobians_n, double ** determinants, size_t * determinants_n, double ** points, size_t * points_n, const int tag, const size_t task, const size_t numTasks, int * ierr) +{ + if(ierr) *ierr = 0; + try { + std::vector<double> api_integrationPoints_(integrationPoints, integrationPoints + integrationPoints_n); std::vector<double> api_jacobians_; std::vector<double> api_determinants_; std::vector<double> api_points_; - gmsh::model::mesh::getJacobians(elementType, integrationType, api_jacobians_, api_determinants_, api_points_, tag, task, numTasks); + gmsh::model::mesh::getJacobians(elementType, api_integrationPoints_, api_jacobians_, api_determinants_, api_points_, tag, task, numTasks); vector2ptr(api_jacobians_, jacobians, jacobians_n); vector2ptr(api_determinants_, determinants, determinants_n); vector2ptr(api_points_, points, points_n); @@ -968,14 +1050,14 @@ GMSH_API void gmshModelMeshGetJacobians(const int elementType, const char * inte } } -GMSH_API void gmshModelMeshPreallocateJacobians(const int elementType, const char * integrationType, const int jacobian, const int determinant, const int point, double ** jacobians, size_t * jacobians_n, double ** determinants, size_t * determinants_n, double ** points, size_t * points_n, const int tag, int * ierr) +GMSH_API void gmshModelMeshPreallocateJacobians(const int elementType, const int numIntegrationPoints, const int jacobian, const int determinant, const int point, double ** jacobians, size_t * jacobians_n, double ** determinants, size_t * determinants_n, double ** points, size_t * points_n, const int tag, int * ierr) { if(ierr) *ierr = 0; try { std::vector<double> api_jacobians_; std::vector<double> api_determinants_; std::vector<double> api_points_; - gmsh::model::mesh::preallocateJacobians(elementType, integrationType, jacobian, determinant, point, api_jacobians_, api_determinants_, api_points_, tag); + gmsh::model::mesh::preallocateJacobians(elementType, numIntegrationPoints, jacobian, determinant, point, api_jacobians_, api_determinants_, api_points_, tag); vector2ptr(api_jacobians_, jacobians, jacobians_n); vector2ptr(api_determinants_, determinants, determinants_n); vector2ptr(api_points_, points, points_n); @@ -985,14 +1067,27 @@ GMSH_API void gmshModelMeshPreallocateJacobians(const int elementType, const cha } } -GMSH_API void gmshModelMeshGetBasisFunctions(const int elementType, const char * integrationType, const char * functionSpaceType, double ** integrationPoints, size_t * integrationPoints_n, int * numComponents, double ** basisFunctions, size_t * basisFunctions_n, int * ierr) +GMSH_API void gmshModelMeshGetBasisFunctions(const int elementType, double * integrationPoints, size_t integrationPoints_n, const char * functionSpaceType, int * numComponents, double ** basisFunctions, size_t * basisFunctions_n, int * ierr) { if(ierr) *ierr = 0; try { - std::vector<double> api_integrationPoints_; + std::vector<double> api_integrationPoints_(integrationPoints, integrationPoints + integrationPoints_n); std::vector<double> api_basisFunctions_; - gmsh::model::mesh::getBasisFunctions(elementType, integrationType, functionSpaceType, api_integrationPoints_, *numComponents, api_basisFunctions_); - vector2ptr(api_integrationPoints_, integrationPoints, integrationPoints_n); + gmsh::model::mesh::getBasisFunctions(elementType, api_integrationPoints_, functionSpaceType, *numComponents, api_basisFunctions_); + vector2ptr(api_basisFunctions_, basisFunctions, basisFunctions_n); + } + catch(int api_ierr_){ + if(ierr) *ierr = api_ierr_; + } +} + +GMSH_API void gmshModelMeshGetBasisFunctionsForElements(const int elementType, double * integrationPoints, size_t integrationPoints_n, const char * functionSpaceType, int * numComponents, int * numFunctionsPerElements, double ** basisFunctions, size_t * basisFunctions_n, const int tag, int * ierr) +{ + if(ierr) *ierr = 0; + try { + std::vector<double> api_integrationPoints_(integrationPoints, integrationPoints + integrationPoints_n); + std::vector<double> api_basisFunctions_; + gmsh::model::mesh::getBasisFunctionsForElements(elementType, api_integrationPoints_, functionSpaceType, *numComponents, *numFunctionsPerElements, api_basisFunctions_, tag); vector2ptr(api_basisFunctions_, basisFunctions, basisFunctions_n); } catch(int api_ierr_){ @@ -1000,6 +1095,39 @@ GMSH_API void gmshModelMeshGetBasisFunctions(const int elementType, const char * } } +GMSH_API void gmshModelMeshGetKeysForElements(const int elementType, const char * functionSpaceType, int ** keys, size_t * keys_n, double ** coord, size_t * coord_n, const int tag, const int returnCoord, int * ierr) +{ + if(ierr) *ierr = 0; + try { + gmsh::vectorpair api_keys_; + std::vector<double> api_coord_; + gmsh::model::mesh::getKeysForElements(elementType, functionSpaceType, api_keys_, api_coord_, tag, returnCoord); + vectorpair2intptr(api_keys_, keys, keys_n); + vector2ptr(api_coord_, coord, coord_n); + } + catch(int api_ierr_){ + if(ierr) *ierr = api_ierr_; + } +} + +GMSH_API void gmshModelMeshGetInformationForElements(int * keys, size_t keys_n, int ** info, size_t * info_n, const int order, const int elementType, int * ierr) +{ + if(ierr) *ierr = 0; + try { + gmsh::vectorpair api_keys_(keys_n/2); + for(size_t i = 0; i < keys_n/2; ++i){ + api_keys_[i].first = keys[i * 2 + 0]; + api_keys_[i].second = keys[i * 2 + 1]; + } + gmsh::vectorpair api_info_; + gmsh::model::mesh::getInformationForElements(api_keys_, api_info_, order, elementType); + vectorpair2intptr(api_info_, info, info_n); + } + catch(int api_ierr_){ + if(ierr) *ierr = api_ierr_; + } +} + GMSH_API void gmshModelMeshPrecomputeBasisFunctions(const int elementType, int * ierr) { if(ierr) *ierr = 0; @@ -2555,6 +2683,41 @@ GMSH_API void gmshModelOccSetMeshSize(int * dimTags, size_t dimTags_n, const dou } } +GMSH_API void gmshModelOccGetMass(const int dim, const int tag, double * mass, int * ierr) +{ + if(ierr) *ierr = 0; + try { + gmsh::model::occ::getMass(dim, tag, *mass); + } + catch(int api_ierr_){ + if(ierr) *ierr = api_ierr_; + } +} + +GMSH_API void gmshModelOccGetCenterOfMass(const int dim, const int tag, double * x, double * y, double * z, int * ierr) +{ + if(ierr) *ierr = 0; + try { + gmsh::model::occ::getCenterOfMass(dim, tag, *x, *y, *z); + } + catch(int api_ierr_){ + if(ierr) *ierr = api_ierr_; + } +} + +GMSH_API void gmshModelOccGetMatrixOfInertia(const int dim, const int tag, double ** mat, size_t * mat_n, int * ierr) +{ + if(ierr) *ierr = 0; + try { + std::vector<double> api_mat_; + gmsh::model::occ::getMatrixOfInertia(dim, tag, api_mat_); + vector2ptr(api_mat_, mat, mat_n); + } + catch(int api_ierr_){ + if(ierr) *ierr = api_ierr_; + } +} + GMSH_API void gmshModelOccSynchronize(int * ierr) { if(ierr) *ierr = 0; @@ -2660,6 +2823,41 @@ GMSH_API void gmshViewGetListData(const int tag, char *** dataType, size_t * dat } } +GMSH_API int gmshViewAddAlias(const int refTag, const int copyOptions, const int tag, int * ierr) +{ + int result_api_ = 0; + if(ierr) *ierr = 0; + try { + result_api_ = gmsh::view::addAlias(refTag, copyOptions, tag); + } + catch(int api_ierr_){ + if(ierr) *ierr = api_ierr_; + } + return result_api_; +} + +GMSH_API void gmshViewCopyOptions(const int refTag, const int tag, int * ierr) +{ + if(ierr) *ierr = 0; + try { + gmsh::view::copyOptions(refTag, tag); + } + catch(int api_ierr_){ + if(ierr) *ierr = api_ierr_; + } +} + +GMSH_API void gmshViewCombine(const char * what, const char * how, const int remove, int * ierr) +{ + if(ierr) *ierr = 0; + try { + gmsh::view::combine(what, how, remove); + } + catch(int api_ierr_){ + if(ierr) *ierr = api_ierr_; + } +} + GMSH_API void gmshViewProbe(const int tag, const double x, const double y, const double z, double ** value, size_t * value_n, const int step, const int numComp, const int gradient, const double tolerance, double * xElemCoord, size_t xElemCoord_n, double * yElemCoord, size_t yElemCoord_n, double * zElemCoord, size_t zElemCoord_n, int * ierr) { if(ierr) *ierr = 0; diff --git a/api/gmshc.h b/api/gmshc.h index 721809a46346bf49c43cd03bbcbcc874bfe84a73..677021ee7e51b425b5e323aa983d9cfa4e4e97f0 100644 --- a/api/gmshc.h +++ b/api/gmshc.h @@ -9,7 +9,7 @@ #define GMSHC_H /* - * This file defines the Gmsh C API (v4.2). + * This file defines the Gmsh C API (v4.4). * * Do not edit it directly: it is automatically generated by `api/gen.py'. * @@ -19,9 +19,9 @@ #include <stddef.h> -#define GMSH_API_VERSION "4.2" +#define GMSH_API_VERSION "4.4" #define GMSH_API_VERSION_MAJOR 4 -#define GMSH_API_VERSION_MINOR 2 +#define GMSH_API_VERSION_MINOR 4 #if defined(GMSH_DLL) #if defined(GMSH_DLL_EXPORT) @@ -49,12 +49,14 @@ GMSH_API void gmshInitialize(int argc, char ** argv, GMSH_API void gmshFinalize(int * ierr); /* Open a file. Equivalent to the `File->Open' menu in the Gmsh app. Handling - * of the file depends on its extension and/or its contents. */ + * of the file depends on its extension and/or its contents: opening a file + * with model data will create a new model. */ GMSH_API void gmshOpen(const char * fileName, int * ierr); /* Merge a file. Equivalent to the `File->Merge' menu in the Gmsh app. - * Handling of the file depends on its extension and/or its contents. */ + * Handling of the file depends on its extension and/or its contents. Merging + * a file with model data will add the data to the current model. */ GMSH_API void gmshMerge(const char * fileName, int * ierr); @@ -94,6 +96,29 @@ GMSH_API void gmshOptionGetString(const char * name, char ** value, int * ierr); +/* Set a color option to the RGBA value (`r', `g', `b', `a'), where where `r', + * `g', `b' and `a' should be integers between 0 and 255. `name' is of the + * form "category.option" or "category[num].option". Available categories and + * options are listed in the Gmsh reference manual, with the "Color." middle + * string removed. */ +GMSH_API void gmshOptionSetColor(const char * name, + const int r, + const int g, + const int b, + const int a, + int * ierr); + +/* Get the `r', `g', `b', `a' value of a color option. `name' is of the form + * "category.option" or "category[num].option". Available categories and + * options are listed in the Gmsh reference manual, with the "Color." middle + * string removed. */ +GMSH_API void gmshOptionGetColor(const char * name, + int * r, + int * g, + int * b, + int * a, + int * ierr); + /* Add a new model, with name `name', and set it as the current model. */ GMSH_API void gmshModelAdd(const char * name, int * ierr); @@ -110,10 +135,9 @@ GMSH_API void gmshModelList(char *** names, size_t * names_n, GMSH_API void gmshModelSetCurrent(const char * name, int * ierr); -/* Get all the (elementary) geometrical entities in the current model. If - * `dim' is >= 0, return only the entities of the specified dimension (e.g. - * points if `dim' == 0). The entities are returned as a vector of (dim, tag) - * integer pairs. */ +/* Get all the entities in the current model. If `dim' is >= 0, return only + * the entities of the specified dimension (e.g. points if `dim' == 0). The + * entities are returned as a vector of (dim, tag) integer pairs. */ GMSH_API void gmshModelGetEntities(int ** dimTags, size_t * dimTags_n, const int dim, int * ierr); @@ -137,23 +161,23 @@ GMSH_API void gmshModelGetPhysicalGroups(int ** dimTags, size_t * dimTags_n, const int dim, int * ierr); -/* Get the tags of the geometrical entities making up the physical group of +/* Get the tags of the model entities making up the physical group of * dimension `dim' and tag `tag'. */ GMSH_API void gmshModelGetEntitiesForPhysicalGroup(const int dim, const int tag, int ** tags, size_t * tags_n, int * ierr); -/* Get the tags of the physical groups (if any) to which the geometrical - * entity of dimension `dim' and tag `tag' belongs. */ +/* Get the tags of the physical groups (if any) to which the model entity of + * dimension `dim' and tag `tag' belongs. */ GMSH_API void gmshModelGetPhysicalGroupsForEntity(const int dim, const int tag, int ** physicalTags, size_t * physicalTags_n, int * ierr); -/* Add a physical group of dimension `dim', grouping the elementary entities - * with tags `tags'. Return the tag of the physical group, equal to `tag' if - * `tag' is positive, or a new tag if `tag' < 0. */ +/* Add a physical group of dimension `dim', grouping the model entities with + * tags `tags'. Return the tag of the physical group, equal to `tag' if `tag' + * is positive, or a new tag if `tag' < 0. */ GMSH_API int gmshModelAddPhysicalGroup(const int dim, int * tags, size_t tags_n, const int tag, @@ -171,12 +195,12 @@ GMSH_API void gmshModelGetPhysicalName(const int dim, char ** name, int * ierr); -/* Get the boundary of the geometrical entities `dimTags'. Return in - * `outDimTags' the boundary of the individual entities (if `combined' is - * false) or the boundary of the combined geometrical shape formed by all - * input entities (if `combined' is true). Return tags multiplied by the sign - * of the boundary entity if `oriented' is true. Apply the boundary operator - * recursively down to dimension 0 (i.e. to points) if `recursive' is true. */ +/* Get the boundary of the model entities `dimTags'. Return in `outDimTags' + * the boundary of the individual entities (if `combined' is false) or the + * boundary of the combined geometrical shape formed by all input entities (if + * `combined' is true). Return tags multiplied by the sign of the boundary + * entity if `oriented' is true. Apply the boundary operator recursively down + * to dimension 0 (i.e. to points) if `recursive' is true. */ GMSH_API void gmshModelGetBoundary(int * dimTags, size_t dimTags_n, int ** outDimTags, size_t * outDimTags_n, const int combined, @@ -184,10 +208,10 @@ GMSH_API void gmshModelGetBoundary(int * dimTags, size_t dimTags_n, const int recursive, int * ierr); -/* Get the (elementary) geometrical entities in the bounding box defined by - * the two points (`xmin', `ymin', `zmin') and (`xmax', `ymax', `zmax'). If - * `dim' is >= 0, return only the entities of the specified dimension (e.g. - * points if `dim' == 0). */ +/* Get the model entities in the bounding box defined by the two points + * (`xmin', `ymin', `zmin') and (`xmax', `ymax', `zmax'). If `dim' is >= 0, + * return only the entities of the specified dimension (e.g. points if `dim' + * == 0). */ GMSH_API void gmshModelGetEntitiesInBoundingBox(const double xmin, const double ymin, const double zmin, @@ -199,7 +223,8 @@ GMSH_API void gmshModelGetEntitiesInBoundingBox(const double xmin, int * ierr); /* Get the bounding box (`xmin', `ymin', `zmin'), (`xmax', `ymax', `zmax') of - * the geometrical entity of dimension `dim' and tag `tag'. */ + * the model entity of dimension `dim' and tag `tag'. If `dim' and `tag' are + * negative, get the bounding box of the whole model. */ GMSH_API void gmshModelGetBoundingBox(const int dim, const int tag, double * xmin, @@ -213,12 +238,11 @@ GMSH_API void gmshModelGetBoundingBox(const int dim, /* Get the geometrical dimension of the current model. */ GMSH_API int gmshModelGetDimension(int * ierr); -/* Add a discrete geometrical entity (defined by a mesh) of dimension `dim' in - * the current model. Return the tag of the new discrete entity, equal to - * `tag' if `tag' is positive, or a new tag if `tag' < 0. `boundary' specifies - * the tags of the entities on the boundary of the discrete entity, if any. - * Specyfing `boundary' allows Gmsh to construct the topology of the overall - * model. */ +/* Add a discrete model entity (defined by a mesh) of dimension `dim' in the + * current model. Return the tag of the new discrete entity, equal to `tag' if + * `tag' is positive, or a new tag if `tag' < 0. `boundary' specifies the tags + * of the entities on the boundary of the discrete entity, if any. Specifying + * `boundary' allows Gmsh to construct the topology of the overall model. */ GMSH_API int gmshModelAddDiscreteEntity(const int dim, const int tag, int * boundary, size_t boundary_n, @@ -325,23 +349,22 @@ GMSH_API void gmshModelGetNormal(const int tag, double ** normals, size_t * normals_n, int * ierr); -/* Set the visibility of the geometrical entities `dimTags' to `value'. Apply - * the visibility setting recursively if `recursive' is true. */ +/* Set the visibility of the model entities `dimTags' to `value'. Apply the + * visibility setting recursively if `recursive' is true. */ GMSH_API void gmshModelSetVisibility(int * dimTags, size_t dimTags_n, const int value, const int recursive, int * ierr); -/* Get the visibility of the geometrical entity of dimension `dim' and tag - * `tag'. */ +/* Get the visibility of the model entity of dimension `dim' and tag `tag'. */ GMSH_API void gmshModelGetVisibility(const int dim, const int tag, int * value, int * ierr); -/* Set the color of the geometrical entities `dimTags' to the RGBA value (`r', - * `g', `b', `a'), where `r', `g', `b' and `a' should be integers between 0 - * and 255. Apply the color setting recursively if `recursive' is true. */ +/* Set the color of the model entities `dimTags' to the RGBA value (`r', `g', + * `b', `a'), where `r', `g', `b' and `a' should be integers between 0 and + * 255. Apply the color setting recursively if `recursive' is true. */ GMSH_API void gmshModelSetColor(int * dimTags, size_t dimTags_n, const int r, const int g, @@ -350,7 +373,7 @@ GMSH_API void gmshModelSetColor(int * dimTags, size_t dimTags_n, const int recursive, int * ierr); -/* Get the color of the geometrical entity of dimension `dim' and tag `tag'. */ +/* Get the color of the model entity of dimension `dim' and tag `tag'. */ GMSH_API void gmshModelGetColor(const int dim, const int tag, int * r, @@ -359,6 +382,13 @@ GMSH_API void gmshModelGetColor(const int dim, int * a, int * ierr); +/* Set the `x', `y', `z' coordinates of a geometrical point. */ +GMSH_API void gmshModelSetCoordinates(const int tag, + const double x, + const double y, + const double z, + int * ierr); + /* Generate a mesh of the current model, up to dimension `dim' (0, 1, 2 or 3). */ GMSH_API void gmshModelMeshGenerate(const int dim, int * ierr); @@ -370,9 +400,22 @@ GMSH_API void gmshModelMeshPartition(const int numPart, /* Unpartition the mesh of the current model. */ GMSH_API void gmshModelMeshUnpartition(int * ierr); +/* Optimize the mesh of the current model using `method' (empty for default + * tetrahedral mesh optimizer, "Netgen" for Netgen optimizer, "HighOrder" for + * direct high-order mesh optimizer, "HighOrderElastic" for high-order elastic + * smoother). */ +GMSH_API void gmshModelMeshOptimize(const char * method, + int * ierr); + +/* Recombine the mesh of the current model. */ +GMSH_API void gmshModelMeshRecombine(int * ierr); + /* Refine the mesh of the current model by uniformly splitting the elements. */ GMSH_API void gmshModelMeshRefine(int * ierr); +/* Smooth the mesh of the current model. */ +GMSH_API void gmshModelMeshSmooth(int * ierr); + /* Set the order of the elements in the mesh of the current model to `order'. */ GMSH_API void gmshModelMeshSetOrder(const int order, int * ierr); @@ -393,25 +436,27 @@ GMSH_API void gmshModelMeshGetLastNodeError(size_t ** nodeTags, size_t * nodeTag * node tags (their unique, strictly positive identification numbers). `coord' * is a vector of length 3 times the length of `nodeTags' that contains the x, * y, z coordinates of the nodes, concatenated: [n1x, n1y, n1z, n2x, ...]. If - * `dim' >= 0, `parametricCoord' contains the parametric coordinates ([u1, u2, - * ...] or [u1, v1, u2, ...]) of the nodes, if available. The length of - * `parametricCoord' can be 0 or `dim' times the length of `nodeTags'. If - * `includeBoundary' is set, also return the nodes classified on the boundary - * of the entity (wich will be reparametrized on the entity if `dim' >= 0 in - * order to compute their parametric coordinates). */ + * `dim' >= 0 and `returnParamtricCoord' is set, `parametricCoord' contains + * the parametric coordinates ([u1, u2, ...] or [u1, v1, u2, ...]) of the + * nodes, if available. The length of `parametricCoord' can be 0 or `dim' + * times the length of `nodeTags'. If `includeBoundary' is set, also return + * the nodes classified on the boundary of the entity (which will be + * reparametrized on the entity if `dim' >= 0 in order to compute their + * parametric coordinates). */ GMSH_API void gmshModelMeshGetNodes(size_t ** nodeTags, size_t * nodeTags_n, double ** coord, size_t * coord_n, double ** parametricCoord, size_t * parametricCoord_n, const int dim, const int tag, const int includeBoundary, + const int returnParametricCoord, int * ierr); /* Get the coordinates and the parametric coordinates (if any) of the node * with tag `tag'. This is a sometimes useful but inefficient way of accessing * nodes, as it relies on a cache stored in the model. For large meshes all * the nodes in the model should be numbered in a continuous sequence of tags - * from 1 to N to maintain reasonnable performance (in this case the internal + * from 1 to N to maintain reasonable performance (in this case the internal * cache is based on a vector; otherwise it uses a map). */ GMSH_API void gmshModelMeshGetNode(const size_t nodeTag, double ** coord, size_t * coord_n, @@ -432,10 +477,10 @@ GMSH_API void gmshModelMeshGetNodesForPhysicalGroup(const int dim, double ** coord, size_t * coord_n, int * ierr); -/* Set the nodes classified on the geometrical entity of dimension `dim' and - * tag `tag'. `nodeTags' contains the node tags (their unique, strictly - * positive identification numbers). `coord' is a vector of length 3 times the - * length of `nodeTags' that contains the x, y, z coordinates of the nodes, +/* Set the nodes classified on the model entity of dimension `dim' and tag + * `tag'. `nodeTags' contains the node tags (their unique, strictly positive + * identification numbers). `coord' is a vector of length 3 times the length + * of `nodeTags' that contains the x, y, z coordinates of the nodes, * concatenated: [n1x, n1y, n1z, n2x, ...]. The optional `parametricCoord' * vector contains the parametric coordinates of the nodes, if any. The length * of `parametricCoord' can be 0 or `dim' times the length of `nodeTags'. If @@ -448,7 +493,7 @@ GMSH_API void gmshModelMeshSetNodes(const int dim, double * parametricCoord, size_t parametricCoord_n, int * ierr); -/* Reclassify all nodes on their associated geometrical entity, based on the +/* Reclassify all nodes on their associated model entity, based on the * elements. Can be used when importing nodes in bulk (e.g. by associating * them all to a single volume), to reclassify them correctly on model * surfaces, curves, etc. after the elements have been set. */ @@ -486,22 +531,31 @@ GMSH_API void gmshModelMeshGetElements(int ** elementTypes, size_t * elementType * sometimes useful but inefficient way of accessing elements, as it relies on * a cache stored in the model. For large meshes all the elements in the model * should be numbered in a continuous sequence of tags from 1 to N to maintain - * reasonnable performance (in this case the internal cache is based on a + * reasonable performance (in this case the internal cache is based on a * vector; otherwise it uses a map). */ GMSH_API void gmshModelMeshGetElement(const size_t elementTag, int * elementType, size_t ** nodeTags, size_t * nodeTags_n, int * ierr); -/* Get the tag, type and node tags of the element located at coordinates (`x', - * `y', `z'). This is a sometimes useful but inefficient way of accessing - * elements, as it relies on a search in a spatial octree. */ +/* Search the mesh for an element located at coordinates (`x', `y', `z'). This + * is a sometimes useful but inefficient way of accessing elements, as it + * relies on a search in a spatial octree. If an element is found, return its + * tag, type and node tags, as well as the local coordinates (`u', `v', `w') + * within the element corresponding to search location. If `dim' is >= 0, only + * search for elements of the given dimension. If `strict' is not set, use a + * tolerance to find elements near the search location. */ GMSH_API void gmshModelMeshGetElementByCoordinates(const double x, const double y, const double z, size_t * elementTag, int * elementType, size_t ** nodeTags, size_t * nodeTags_n, + double * u, + double * v, + double * w, + const int dim, + const int strict, int * ierr); /* Get the types of elements in the entity of dimension `dim' and tag `tag'. @@ -533,7 +587,7 @@ GMSH_API void gmshModelMeshGetElementProperties(const int elementType, double ** parametricCoord, size_t * parametricCoord_n, int * ierr); -/* Get the elements of type `elementType' classified on the entity of of tag +/* Get the elements of type `elementType' classified on the entity of tag * `tag'. If `tag' < 0, get the elements for all entities. `elementTags' is a * vector containing the tags (unique, strictly positive identifiers) of the * elements of the corresponding type. `nodeTags' is a vector of length equal @@ -550,8 +604,8 @@ GMSH_API void gmshModelMeshGetElementsByType(const int elementType, const size_t numTasks, int * ierr); -/* Preallocate the data for `getElementsByType'. This is necessary only if - * `getElementsByType' is called with `numTasks' > 1. */ +/* Preallocate data before calling `getElementsByType' with `numTasks' > 1. + * For C and C++ only. */ GMSH_API void gmshModelMeshPreallocateElementsByType(const int elementType, const int elementTag, const int nodeTag, @@ -589,22 +643,34 @@ GMSH_API void gmshModelMeshSetElementsByType(const int tag, size_t * nodeTags, size_t nodeTags_n, int * ierr); +/* Get the numerical quadrature information for the given element type + * `elementType' and integration rule `integrationType' (e.g. "Gauss4" for a + * Gauss quadrature suited for integrating 4th order polynomials). + * `integrationPoints' contains the u, v, w coordinates of the G integration + * points in the reference element: [g1u, g1v, g1w, ..., gGu, gGv, gGw]. + * `integrationWeigths' contains the associated weights: [g1q, ..., gGq]. */ +GMSH_API void gmshModelMeshGetIntegrationPoints(const int elementType, + const char * integrationType, + double ** integrationPoints, size_t * integrationPoints_n, + double ** integrationWeights, size_t * integrationWeights_n, + int * ierr); + /* Get the Jacobians of all the elements of type `elementType' classified on - * the entity of dimension `dim' and tag `tag', at the G integration points - * required by the `integrationType' integration rule (e.g. "Gauss4" for a - * Gauss quadrature suited for integrating 4th order polynomials). Data is - * returned by element, with elements in the same order as in `getElements' - * and `getElementsByType'. `jacobians' contains for each element the 9 - * entries of the 3x3 Jacobian matrix at each integration point, by row: - * [e1g1Jxu, e1g1Jxv, e1g1Jxw, e1g1Jyu, ..., e1g1Jzw, e1g2Jxu, ..., e1gGJzw, - * e2g1Jxu, ...], with Jxu=dx/du, Jxv=dx/dv, etc. `determinants' contains for - * each element the determinant of the Jacobian matrix at each integration - * point: [e1g1, e1g2, ... e1gG, e2g1, ...]. `points' contains for each - * element the x, y, z coordinates of the integration points. If `tag' < 0, - * get the Jacobian data for all entities. If `numTasks' > 1, only compute and - * return the part of the data indexed by `task'. */ + * the entity of tag `tag', at the G integration points `integrationPoints' + * given as concatenated triplets of coordinates in the reference element + * [g1u, g1v, g1w, ..., gGu, gGv, gGw]. Data is returned by element, with + * elements in the same order as in `getElements' and `getElementsByType'. + * `jacobians' contains for each element the 9 entries of the 3x3 Jacobian + * matrix at each integration point, by row: [e1g1Jxu, e1g1Jxv, e1g1Jxw, + * e1g1Jyu, ..., e1g1Jzw, e1g2Jxu, ..., e1gGJzw, e2g1Jxu, ...], with + * Jxu=dx/du, Jxv=dx/dv, etc. `determinants' contains for each element the + * determinant of the Jacobian matrix at each integration point: [e1g1, e1g2, + * ... e1gG, e2g1, ...]. `points' contains for each element the x, y, z + * coordinates of the integration points. If `tag' < 0, get the Jacobian data + * for all entities. If `numTasks' > 1, only compute and return the part of + * the data indexed by `task'. */ GMSH_API void gmshModelMeshGetJacobians(const int elementType, - const char * integrationType, + double * integrationPoints, size_t integrationPoints_n, double ** jacobians, size_t * jacobians_n, double ** determinants, size_t * determinants_n, double ** points, size_t * points_n, @@ -613,10 +679,10 @@ GMSH_API void gmshModelMeshGetJacobians(const int elementType, const size_t numTasks, int * ierr); -/* Preallocate the data required by `getJacobians'. This is necessary only if - * `getJacobians' is called with `numTasks' > 1. */ +/* Preallocate data before calling `getJacobians' with `numTasks' > 1. For C + * and C++ only. */ GMSH_API void gmshModelMeshPreallocateJacobians(const int elementType, - const char * integrationType, + const int numIntegrationPoints, const int jacobian, const int determinant, const int point, @@ -626,25 +692,67 @@ GMSH_API void gmshModelMeshPreallocateJacobians(const int elementType, const int tag, int * ierr); -/* Get the basis functions of the element of type `elementType' for the given - * `integrationType' integration rule (e.g. "Gauss4" for a Gauss quadrature - * suited for integrating 4th order polynomials) and `functionSpaceType' - * function space (e.g. "Lagrange" or "GradLagrange" for Lagrange basis - * functions or their gradient, in the u, v, w coordinates of the reference - * element). `integrationPoints' contains the u, v, w coordinates of the - * integration points in the reference element as well as the associated - * weight q, concatenated: [g1u, g1v, g1w, g1q, g2u, ...]. `numComponents' - * returns the number C of components of a basis function. `basisFunctions' - * contains the evaluation of the basis functions at the integration points: - * [g1f1, ..., g1fC, g2f1, ...]. */ +/* Get the basis functions of the element of type `elementType' at the + * integration points `integrationPoints' (given as concatenated triplets of + * coordinates in the reference element [g1u, g1v, g1w, ..., gGu, gGv, gGw]), + * for the function space `functionSpaceType' (e.g. "Lagrange" or + * "GradLagrange" for Lagrange basis functions or their gradient, in the u, v, + * w coordinates of the reference element). `numComponents' returns the number + * C of components of a basis function. `basisFunctions' returns the value of + * the N basis functions at the integration points, i.e. [g1f1, g1f2, ..., + * g1fN, g2f1, ...] when C == 1 or [g1f1u, g1f1v, g1f1w, g1f2u, ..., g1fNw, + * g2f1u, ...] when C == 3. */ GMSH_API void gmshModelMeshGetBasisFunctions(const int elementType, - const char * integrationType, + double * integrationPoints, size_t integrationPoints_n, const char * functionSpaceType, - double ** integrationPoints, size_t * integrationPoints_n, int * numComponents, double ** basisFunctions, size_t * basisFunctions_n, int * ierr); +/* Get the element-dependent basis functions of the elements of type + * `elementType' in the entity of tag `tag'at the integration points + * `integrationPoints' (given as concatenated triplets of coordinates in the + * reference element [g1u, g1v, g1w, ..., gGu, gGv, gGw]), for the function + * space `functionSpaceType' (e.g. "H1Legendre3" or "GradH1Legendre3" for 3rd + * order hierarchical H1 Legendre functions or their gradient, in the u, v, w + * coordinates of the reference elements). `numComponents' returns the number + * C of components of a basis function. `numBasisFunctions' returns the number + * N of basis functions per element. `basisFunctions' returns the value of the + * basis functions at the integration points for each element: [e1g1f1,..., + * e1g1fN, e1g2f1,..., e2g1f1, ...] when C == 1 or [e1g1f1u, e1g1f1v,..., + * e1g1fNw, e1g2f1u,..., e2g1f1u, ...]. Warning: this is an experimental + * feature and will probably change in a future release. */ +GMSH_API void gmshModelMeshGetBasisFunctionsForElements(const int elementType, + double * integrationPoints, size_t integrationPoints_n, + const char * functionSpaceType, + int * numComponents, + int * numFunctionsPerElements, + double ** basisFunctions, size_t * basisFunctions_n, + const int tag, + int * ierr); + +/* Generate the `keys' for the elements of type `elementType' in the entity of + * tag `tag', for the `functionSpaceType' function space. Each key uniquely + * identifies a basis function in the function space. If `returnCoord' is set, + * the `coord' vector contains the x, y, z coordinates locating basis + * functions for sorting purposes. Warning: this is an experimental feature + * and will probably change in a future release. */ +GMSH_API void gmshModelMeshGetKeysForElements(const int elementType, + const char * functionSpaceType, + int ** keys, size_t * keys_n, + double ** coord, size_t * coord_n, + const int tag, + const int returnCoord, + int * ierr); + +/* Get information about the `keys'. Warning: this is an experimental feature + * and will probably change in a future release. */ +GMSH_API void gmshModelMeshGetInformationForElements(int * keys, size_t keys_n, + int ** info, size_t * info_n, + const int order, + const int elementType, + int * ierr); + /* Precomputes the basis functions corresponding to `elementType'. */ GMSH_API void gmshModelMeshPrecomputeBasisFunctions(const int elementType, int * ierr); @@ -665,18 +773,21 @@ GMSH_API void gmshModelMeshGetBarycenters(const int elementType, const size_t numTasks, int * ierr); -/* Preallocate the data required by `getBarycenters'. This is necessary only - * if `getBarycenters' is called with `numTasks' > 1. */ +/* Preallocate data before calling `getBarycenters' with `numTasks' > 1. For C + * and C++ only. */ GMSH_API void gmshModelMeshPreallocateBarycenters(const int elementType, double ** barycenters, size_t * barycenters_n, const int tag, int * ierr); /* Get the nodes on the edges of all elements of type `elementType' classified - * on the entity of tag `tag'. `nodeTags' contains the node tags. If `primary' - * is set, only the primary (begin/end) nodes of the edges are returned. If - * `tag' < 0, get the edge nodes for all entities. If `numTasks' > 1, only - * compute and return the part of the data indexed by `task'. */ + * on the entity of tag `tag'. `nodeTags' contains the node tags of the edges + * for all the elements: [e1a1n1, e1a1n2, e1a2n1, ...]. Data is returned by + * element, with elements in the same order as in `getElements' and + * `getElementsByType'. If `primary' is set, only the primary (begin/end) + * nodes of the edges are returned. If `tag' < 0, get the edge nodes for all + * entities. If `numTasks' > 1, only compute and return the part of the data + * indexed by `task'. */ GMSH_API void gmshModelMeshGetElementEdgeNodes(const int elementType, size_t ** nodeTags, size_t * nodeTags_n, const int tag, @@ -687,10 +798,13 @@ GMSH_API void gmshModelMeshGetElementEdgeNodes(const int elementType, /* Get the nodes on the faces of type `faceType' (3 for triangular faces, 4 * for quadrangular faces) of all elements of type `elementType' classified on - * the entity of tag `tag'. `nodeTags' contains the node tags. If `primary' is - * set, only the primary (corner) nodes of the faces are returned. If `tag' < - * 0, get the face nodes for all entities. If `numTasks' > 1, only compute and - * return the part of the data indexed by `task'. */ + * the entity of tag `tag'. `nodeTags' contains the node tags of the faces for + * all elements: [e1f1n1, ..., e1f1nFaceType, e1f2n1, ...]. Data is returned + * by element, with elements in the same order as in `getElements' and + * `getElementsByType'. If `primary' is set, only the primary (corner) nodes + * of the faces are returned. If `tag' < 0, get the face nodes for all + * entities. If `numTasks' > 1, only compute and return the part of the data + * indexed by `task'. */ GMSH_API void gmshModelMeshGetElementFaceNodes(const int elementType, const int faceType, size_t ** nodeTags, size_t * nodeTags_n, @@ -708,8 +822,8 @@ GMSH_API void gmshModelMeshGetGhostElements(const int dim, int ** partitions, size_t * partitions_n, int * ierr); -/* Set a mesh size constraint on the geometrical entities `dimTags'. Currently - * only entities of dimension 0 (points) are handled. */ +/* Set a mesh size constraint on the model entities `dimTags'. Currently only + * entities of dimension 0 (points) are handled. */ GMSH_API void gmshModelMeshSetSize(int * dimTags, size_t dimTags_n, const double size, int * ierr); @@ -743,25 +857,25 @@ GMSH_API void gmshModelMeshSetTransfiniteVolume(const int tag, int * cornerTags, size_t cornerTags_n, int * ierr); -/* Set a recombination meshing constraint on the geometrical entity of - * dimension `dim' and tag `tag'. Currently only entities of dimension 2 (to - * recombine triangles into quadrangles) are supported. */ +/* Set a recombination meshing constraint on the model entity of dimension + * `dim' and tag `tag'. Currently only entities of dimension 2 (to recombine + * triangles into quadrangles) are supported. */ GMSH_API void gmshModelMeshSetRecombine(const int dim, const int tag, int * ierr); -/* Set a smoothing meshing constraint on the geometrical entity of dimension - * `dim' and tag `tag'. `val' iterations of a Laplace smoother are applied. */ +/* Set a smoothing meshing constraint on the model entity of dimension `dim' + * and tag `tag'. `val' iterations of a Laplace smoother are applied. */ GMSH_API void gmshModelMeshSetSmoothing(const int dim, const int tag, const int val, int * ierr); -/* Set a reverse meshing constraint on the geometrical entity of dimension - * `dim' and tag `tag'. If `val' is true, the mesh orientation will be - * reversed with respect to the natural mesh orientation (i.e. the orientation - * consistent with the orientation of the geometrical entity). If `val' is - * false, the mesh is left as-is. */ +/* Set a reverse meshing constraint on the model entity of dimension `dim' and + * tag `tag'. If `val' is true, the mesh orientation will be reversed with + * respect to the natural mesh orientation (i.e. the orientation consistent + * with the orientation of the geometry). If `val' is false, the mesh is left + * as-is. */ GMSH_API void gmshModelMeshSetReverse(const int dim, const int tag, const int val, @@ -774,18 +888,17 @@ GMSH_API void gmshModelMeshSetReverse(const int dim, GMSH_API void gmshModelMeshSetOutwardOrientation(const int tag, int * ierr); -/* Embed the geometrical entities of dimension `dim' and tags `tags' in the - * (inDim, inTag) geometrical entity. `inDim' must be strictly greater than - * `dim'. */ +/* Embed the model entities of dimension `dim' and tags `tags' in the (inDim, + * inTag) model entity. `inDim' must be strictly greater than `dim'. */ GMSH_API void gmshModelMeshEmbed(const int dim, int * tags, size_t tags_n, const int inDim, const int inTag, int * ierr); -/* Remove embedded entities in the geometrical entities `dimTags'. if `dim' is - * >= 0, only remove embedded entities of the given dimension (e.g. embedded - * points if `dim' == 0). */ +/* Remove embedded entities in the model entities `dimTags'. if `dim' is >= 0, + * only remove embedded entities of the given dimension (e.g. embedded points + * if `dim' == 0). */ GMSH_API void gmshModelMeshRemoveEmbedded(int * dimTags, size_t dimTags_n, const int dim, int * ierr); @@ -879,7 +992,7 @@ GMSH_API void gmshModelMeshComputeCohomology(int * domainTags, size_t domainTags int * ierr); /* Add a new mesh size field of type `fieldType'. If `tag' is positive, assign - * the tag explcitly; otherwise a new tag is assigned automatically. Return + * the tag explicitly; otherwise a new tag is assigned automatically. Return * the field tag. */ GMSH_API int gmshModelMeshFieldAdd(const char * fieldType, const int tag, @@ -915,12 +1028,12 @@ GMSH_API void gmshModelMeshFieldSetAsBackgroundMesh(const int tag, GMSH_API void gmshModelMeshFieldSetAsBoundaryLayer(const int tag, int * ierr); -/* Add a geometrical point in the internal GEO CAD representation, at - * coordinates (`x', `y', `z'). If `meshSize' is > 0, add a meshing constraint - * at that point. If `tag' is positive, set the tag explicitly; otherwise a - * new tag is selected automatically. Return the tag of the point. (Note that - * the point will be added in the current model only after `synchronize' is - * called. This behavior holds for all the entities added in the geo module.) */ +/* Add a geometrical point in the built-in CAD representation, at coordinates + * (`x', `y', `z'). If `meshSize' is > 0, add a meshing constraint at that + * point. If `tag' is positive, set the tag explicitly; otherwise a new tag is + * selected automatically. Return the tag of the point. (Note that the point + * will be added in the current model only after `synchronize' is called. This + * behavior holds for all the entities added in the geo module.) */ GMSH_API int gmshModelGeoAddPoint(const double x, const double y, const double z, @@ -936,11 +1049,11 @@ GMSH_API int gmshModelGeoAddLine(const int startTag, const int tag, int * ierr); -/* Add a circle arc (stricly smaller than Pi) between the two points with tags - * `startTag' and `endTag', with center `centertag'. If `tag' is positive, set - * the tag explicitly; otherwise a new tag is selected automatically. If - * (`nx', `ny', `nz') != (0,0,0), explicitely set the plane of the circle arc. - * Return the tag of the circle arc. */ +/* Add a circle arc (strictly smaller than Pi) between the two points with + * tags `startTag' and `endTag', with center `centertag'. If `tag' is + * positive, set the tag explicitly; otherwise a new tag is selected + * automatically. If (`nx', `ny', `nz') != (0,0,0), explicitly set the plane + * of the circle arc. Return the tag of the circle arc. */ GMSH_API int gmshModelGeoAddCircleArc(const int startTag, const int centerTag, const int endTag, @@ -950,12 +1063,11 @@ GMSH_API int gmshModelGeoAddCircleArc(const int startTag, const double nz, int * ierr); -/* Add an ellipse arc (stricly smaller than Pi) between the two points +/* Add an ellipse arc (strictly smaller than Pi) between the two points * `startTag' and `endTag', with center `centertag' and major axis point * `majorTag'. If `tag' is positive, set the tag explicitly; otherwise a new - * tag is selected automatically. If (`nx', `ny', `nz') != (0,0,0), - * explicitely set the plane of the circle arc. Return the tag of the ellipse - * arc. */ + * tag is selected automatically. If (`nx', `ny', `nz') != (0,0,0), explicitly + * set the plane of the circle arc. Return the tag of the ellipse arc. */ GMSH_API int gmshModelGeoAddEllipseArc(const int startTag, const int centerTag, const int majorTag, @@ -990,8 +1102,8 @@ GMSH_API int gmshModelGeoAddBezier(int * pointTags, size_t pointTags_n, int * ierr); /* Add a curve loop (a closed wire) formed by the curves `curveTags'. - * `curveTags' should contain (signed) tags of geometrical enties of dimension - * 1 forming a closed loop: a negative tag signifies that the underlying curve + * `curveTags' should contain (signed) tags of model enties of dimension 1 + * forming a closed loop: a negative tag signifies that the underlying curve * is considered with reversed orientation. If `tag' is positive, set the tag * explicitly; otherwise a new tag is selected automatically. Return the tag * of the curve loop. */ @@ -1031,11 +1143,12 @@ GMSH_API int gmshModelGeoAddVolume(int * shellTags, size_t shellTags_n, const int tag, int * ierr); -/* Extrude the geometrical entities `dimTags' by translation along (`dx', - * `dy', `dz'). Return extruded entities in `outDimTags'. If `numElements' is - * not empty, also extrude the mesh: the entries in `numElements' give the - * number of elements in each layer. If `height' is not empty, it provides the - * (cummulative) height of the different layers, normalized to 1. */ +/* Extrude the model entities `dimTags' by translation along (`dx', `dy', + * `dz'). Return extruded entities in `outDimTags'. If `numElements' is not + * empty, also extrude the mesh: the entries in `numElements' give the number + * of elements in each layer. If `height' is not empty, it provides the + * (cumulative) height of the different layers, normalized to 1. If `dx' == + * `dy' == `dz' == 0, the entities are extruded along their normal. */ GMSH_API void gmshModelGeoExtrude(int * dimTags, size_t dimTags_n, const double dx, const double dy, @@ -1046,12 +1159,12 @@ GMSH_API void gmshModelGeoExtrude(int * dimTags, size_t dimTags_n, const int recombine, int * ierr); -/* Extrude the geometrical entities `dimTags' by rotation of `angle' radians - * around the axis of revolution defined by the point (`x', `y', `z') and the +/* Extrude the model entities `dimTags' by rotation of `angle' radians around + * the axis of revolution defined by the point (`x', `y', `z') and the * direction (`ax', `ay', `az'). Return extruded entities in `outDimTags'. If * `numElements' is not empty, also extrude the mesh: the entries in * `numElements' give the number of elements in each layer. If `height' is not - * empty, it provides the (cummulative) height of the different layers, + * empty, it provides the (cumulative) height of the different layers, * normalized to 1. */ GMSH_API void gmshModelGeoRevolve(int * dimTags, size_t dimTags_n, const double x, @@ -1067,13 +1180,13 @@ GMSH_API void gmshModelGeoRevolve(int * dimTags, size_t dimTags_n, const int recombine, int * ierr); -/* Extrude the geometrical entities `dimTags' by a combined translation and - * rotation of `angle' radians, along (`dx', `dy', `dz') and around the axis - * of revolution defined by the point (`x', `y', `z') and the direction (`ax', +/* Extrude the model entities `dimTags' by a combined translation and rotation + * of `angle' radians, along (`dx', `dy', `dz') and around the axis of + * revolution defined by the point (`x', `y', `z') and the direction (`ax', * `ay', `az'). Return extruded entities in `outDimTags'. If `numElements' is * not empty, also extrude the mesh: the entries in `numElements' give the * number of elements in each layer. If `height' is not empty, it provides the - * (cummulative) height of the different layers, normalized to 1. */ + * (cumulative) height of the different layers, normalized to 1. */ GMSH_API void gmshModelGeoTwist(int * dimTags, size_t dimTags_n, const double x, const double y, @@ -1091,16 +1204,16 @@ GMSH_API void gmshModelGeoTwist(int * dimTags, size_t dimTags_n, const int recombine, int * ierr); -/* Translate the geometrical entities `dimTags' along (`dx', `dy', `dz'). */ +/* Translate the model entities `dimTags' along (`dx', `dy', `dz'). */ GMSH_API void gmshModelGeoTranslate(int * dimTags, size_t dimTags_n, const double dx, const double dy, const double dz, int * ierr); -/* Rotate the geometrical entities `dimTags' of `angle' radians around the - * axis of revolution defined by the point (`x', `y', `z') and the direction - * (`ax', `ay', `az'). */ +/* Rotate the model entities `dimTags' of `angle' radians around the axis of + * revolution defined by the point (`x', `y', `z') and the direction (`ax', + * `ay', `az'). */ GMSH_API void gmshModelGeoRotate(int * dimTags, size_t dimTags_n, const double x, const double y, @@ -1111,9 +1224,9 @@ GMSH_API void gmshModelGeoRotate(int * dimTags, size_t dimTags_n, const double angle, int * ierr); -/* Scale the geometrical entities `dimTag' by factors `a', `b' and `c' along - * the three coordinate axes; use (`x', `y', `z') as the center of the - * homothetic transformation. */ +/* Scale the model entities `dimTag' by factors `a', `b' and `c' along the + * three coordinate axes; use (`x', `y', `z') as the center of the homothetic + * transformation. */ GMSH_API void gmshModelGeoDilate(int * dimTags, size_t dimTags_n, const double x, const double y, @@ -1123,7 +1236,7 @@ GMSH_API void gmshModelGeoDilate(int * dimTags, size_t dimTags_n, const double c, int * ierr); -/* Apply a symmetry transformation to the geometrical entities `dimTag', with +/* Apply a symmetry transformation to the model entities `dimTag', with * respect to the plane of equation `a' * x + `b' * y + `c' * z + `d' = 0. */ GMSH_API void gmshModelGeoSymmetrize(int * dimTags, size_t dimTags_n, const double a, @@ -1147,14 +1260,14 @@ GMSH_API void gmshModelGeoRemove(int * dimTags, size_t dimTags_n, * location). */ GMSH_API void gmshModelGeoRemoveAllDuplicates(int * ierr); -/* Synchronize the internal GEO CAD representation with the current Gmsh - * model. This can be called at any time, but since it involves a non trivial - * amount of processing, the number of synchronization points should normally - * be minimized. */ +/* Synchronize the built-in CAD representation with the current Gmsh model. + * This can be called at any time, but since it involves a non trivial amount + * of processing, the number of synchronization points should normally be + * minimized. */ GMSH_API void gmshModelGeoSynchronize(int * ierr); -/* Set a mesh size constraint on the geometrical entities `dimTags'. Currently - * only entities of dimension 0 (points) are handled. */ +/* Set a mesh size constraint on the model entities `dimTags'. Currently only + * entities of dimension 0 (points) are handled. */ GMSH_API void gmshModelGeoMeshSetSize(int * dimTags, size_t dimTags_n, const double size, int * ierr); @@ -1162,7 +1275,7 @@ GMSH_API void gmshModelGeoMeshSetSize(int * dimTags, size_t dimTags_n, /* Set a transfinite meshing constraint on the curve `tag', with `numNodes' * nodes distributed according to `meshType' and `coef'. Currently supported * types are "Progression" (geometrical progression with power `coef') and - * "Bump" (refinement toward both extreminties of the curve). */ + * "Bump" (refinement toward both extremities of the curve). */ GMSH_API void gmshModelGeoMeshSetTransfiniteCurve(const int tag, const int nPoints, const char * meshType, @@ -1188,32 +1301,32 @@ GMSH_API void gmshModelGeoMeshSetTransfiniteVolume(const int tag, int * cornerTags, size_t cornerTags_n, int * ierr); -/* Set a recombination meshing constraint on the geometrical entity of - * dimension `dim' and tag `tag'. Currently only entities of dimension 2 (to - * recombine triangles into quadrangles) are supported. */ +/* Set a recombination meshing constraint on the model entity of dimension + * `dim' and tag `tag'. Currently only entities of dimension 2 (to recombine + * triangles into quadrangles) are supported. */ GMSH_API void gmshModelGeoMeshSetRecombine(const int dim, const int tag, const double angle, int * ierr); -/* Set a smoothing meshing constraint on the geometrical entity of dimension - * `dim' and tag `tag'. `val' iterations of a Laplace smoother are applied. */ +/* Set a smoothing meshing constraint on the model entity of dimension `dim' + * and tag `tag'. `val' iterations of a Laplace smoother are applied. */ GMSH_API void gmshModelGeoMeshSetSmoothing(const int dim, const int tag, const int val, int * ierr); -/* Set a reverse meshing constraint on the geometrical entity of dimension - * `dim' and tag `tag'. If `val' is true, the mesh orientation will be - * reversed with respect to the natural mesh orientation (i.e. the orientation - * consistent with the orientation of the geometrical entity). If `val' is - * false, the mesh is left as-is. */ +/* Set a reverse meshing constraint on the model entity of dimension `dim' and + * tag `tag'. If `val' is true, the mesh orientation will be reversed with + * respect to the natural mesh orientation (i.e. the orientation consistent + * with the orientation of the geometry). If `val' is false, the mesh is left + * as-is. */ GMSH_API void gmshModelGeoMeshSetReverse(const int dim, const int tag, const int val, int * ierr); -/* Add a geometrical point in the internal OpenCASCADE CAD representation, at +/* Add a geometrical point in the OpenCASCADE CAD representation, at * coordinates (`x', `y', `z'). If `meshSize' is > 0, add a meshing constraint * at that point. If `tag' is positive, set the tag explicitly; otherwise a * new tag is selected automatically. Return the tag of the point. (Note that @@ -1502,11 +1615,11 @@ GMSH_API void gmshModelOccAddThickSolid(const int volumeTag, const int tag, int * ierr); -/* Extrude the geometrical entities `dimTags' by translation along (`dx', - * `dy', `dz'). Return extruded entities in `outDimTags'. If `numElements' is - * not empty, also extrude the mesh: the entries in `numElements' give the - * number of elements in each layer. If `height' is not empty, it provides the - * (cummulative) height of the different layers, normalized to 1. */ +/* Extrude the model entities `dimTags' by translation along (`dx', `dy', + * `dz'). Return extruded entities in `outDimTags'. If `numElements' is not + * empty, also extrude the mesh: the entries in `numElements' give the number + * of elements in each layer. If `height' is not empty, it provides the + * (cumulative) height of the different layers, normalized to 1. */ GMSH_API void gmshModelOccExtrude(int * dimTags, size_t dimTags_n, const double dx, const double dy, @@ -1517,12 +1630,12 @@ GMSH_API void gmshModelOccExtrude(int * dimTags, size_t dimTags_n, const int recombine, int * ierr); -/* Extrude the geometrical entities `dimTags' by rotation of `angle' radians - * around the axis of revolution defined by the point (`x', `y', `z') and the +/* Extrude the model entities `dimTags' by rotation of `angle' radians around + * the axis of revolution defined by the point (`x', `y', `z') and the * direction (`ax', `ay', `az'). Return extruded entities in `outDimTags'. If * `numElements' is not empty, also extrude the mesh: the entries in * `numElements' give the number of elements in each layer. If `height' is not - * empty, it provides the (cummulative) height of the different layers, + * empty, it provides the (cumulative) height of the different layers, * normalized to 1. */ GMSH_API void gmshModelOccRevolve(int * dimTags, size_t dimTags_n, const double x, @@ -1576,9 +1689,9 @@ GMSH_API void gmshModelOccChamfer(int * volumeTags, size_t volumeTags_n, /* Compute the boolean union (the fusion) of the entities `objectDimTags' and * `toolDimTags'. Return the resulting entities in `outDimTags'. If `tag' is - * positive, try to set the tag explicitly (ony valid if the boolean operation - * results in a single entity). Remove the object if `removeObject' is set. - * Remove the tool if `removeTool' is set. */ + * positive, try to set the tag explicitly (only valid if the boolean + * operation results in a single entity). Remove the object if `removeObject' + * is set. Remove the tool if `removeTool' is set. */ GMSH_API void gmshModelOccFuse(int * objectDimTags, size_t objectDimTags_n, int * toolDimTags, size_t toolDimTags_n, int ** outDimTags, size_t * outDimTags_n, @@ -1590,7 +1703,7 @@ GMSH_API void gmshModelOccFuse(int * objectDimTags, size_t objectDimTags_n, /* Compute the boolean intersection (the common parts) of the entities * `objectDimTags' and `toolDimTags'. Return the resulting entities in - * `outDimTags'. If `tag' is positive, try to set the tag explicitly (ony + * `outDimTags'. If `tag' is positive, try to set the tag explicitly (only * valid if the boolean operation results in a single entity). Remove the * object if `removeObject' is set. Remove the tool if `removeTool' is set. */ GMSH_API void gmshModelOccIntersect(int * objectDimTags, size_t objectDimTags_n, @@ -1604,9 +1717,9 @@ GMSH_API void gmshModelOccIntersect(int * objectDimTags, size_t objectDimTags_n, /* Compute the boolean difference between the entities `objectDimTags' and * `toolDimTags'. Return the resulting entities in `outDimTags'. If `tag' is - * positive, try to set the tag explicitly (ony valid if the boolean operation - * results in a single entity). Remove the object if `removeObject' is set. - * Remove the tool if `removeTool' is set. */ + * positive, try to set the tag explicitly (only valid if the boolean + * operation results in a single entity). Remove the object if `removeObject' + * is set. Remove the tool if `removeTool' is set. */ GMSH_API void gmshModelOccCut(int * objectDimTags, size_t objectDimTags_n, int * toolDimTags, size_t toolDimTags_n, int ** outDimTags, size_t * outDimTags_n, @@ -1618,7 +1731,7 @@ GMSH_API void gmshModelOccCut(int * objectDimTags, size_t objectDimTags_n, /* Compute the boolean fragments (general fuse) of the entities * `objectDimTags' and `toolDimTags'. Return the resulting entities in - * `outDimTags'. If `tag' is positive, try to set the tag explicitly (ony + * `outDimTags'. If `tag' is positive, try to set the tag explicitly (only * valid if the boolean operation results in a single entity). Remove the * object if `removeObject' is set. Remove the tool if `removeTool' is set. */ GMSH_API void gmshModelOccFragment(int * objectDimTags, size_t objectDimTags_n, @@ -1630,16 +1743,16 @@ GMSH_API void gmshModelOccFragment(int * objectDimTags, size_t objectDimTags_n, const int removeTool, int * ierr); -/* Translate the geometrical entities `dimTags' along (`dx', `dy', `dz'). */ +/* Translate the model entities `dimTags' along (`dx', `dy', `dz'). */ GMSH_API void gmshModelOccTranslate(int * dimTags, size_t dimTags_n, const double dx, const double dy, const double dz, int * ierr); -/* Rotate the geometrical entities `dimTags' of `angle' radians around the - * axis of revolution defined by the point (`x', `y', `z') and the direction - * (`ax', `ay', `az'). */ +/* Rotate the model entities `dimTags' of `angle' radians around the axis of + * revolution defined by the point (`x', `y', `z') and the direction (`ax', + * `ay', `az'). */ GMSH_API void gmshModelOccRotate(int * dimTags, size_t dimTags_n, const double x, const double y, @@ -1650,9 +1763,9 @@ GMSH_API void gmshModelOccRotate(int * dimTags, size_t dimTags_n, const double angle, int * ierr); -/* Scale the geometrical entities `dimTag' by factors `a', `b' and `c' along - * the three coordinate axes; use (`x', `y', `z') as the center of the - * homothetic transformation. */ +/* Scale the model entities `dimTag' by factors `a', `b' and `c' along the + * three coordinate axes; use (`x', `y', `z') as the center of the homothetic + * transformation. */ GMSH_API void gmshModelOccDilate(int * dimTags, size_t dimTags_n, const double x, const double y, @@ -1662,7 +1775,7 @@ GMSH_API void gmshModelOccDilate(int * dimTags, size_t dimTags_n, const double c, int * ierr); -/* Apply a symmetry transformation to the geometrical entities `dimTag', with +/* Apply a symmetry transformation to the model entities `dimTag', with * respect to the plane of equation `a' * x + `b' * y + `c' * z + `d' = 0. */ GMSH_API void gmshModelOccSymmetrize(int * dimTags, size_t dimTags_n, const double a, @@ -1673,7 +1786,7 @@ GMSH_API void gmshModelOccSymmetrize(int * dimTags, size_t dimTags_n, /* Apply a general affine transformation matrix `a' (16 entries of a 4x4 * matrix, by row; only the 12 first can be provided for convenience) to the - * geometrical entities `dimTag'. */ + * model entities `dimTag'. */ GMSH_API void gmshModelOccAffineTransform(int * dimTags, size_t dimTags_n, double * a, size_t a_n, int * ierr); @@ -1709,23 +1822,45 @@ GMSH_API void gmshModelOccImportShapes(const char * fileName, * OpenCASCADE `TopoDS_Shape' object (passed as a pointer to void). The * imported entities are returned in `outDimTags'. If the optional argument * `highestDimOnly' is set, only import the highest dimensional entities in - * `shape'. Warning: this function is unsafe, as providing an invalid pointer - * will lead to undefined behavior. */ + * `shape'. For C and C++ only. Warning: this function is unsafe, as providing + * an invalid pointer will lead to undefined behavior. */ GMSH_API void gmshModelOccImportShapesNativePointer(const void * shape, int ** outDimTags, size_t * outDimTags_n, const int highestDimOnly, int * ierr); -/* Set a mesh size constraint on the geometrical entities `dimTags'. Currently - * only entities of dimension 0 (points) are handled. */ +/* Set a mesh size constraint on the model entities `dimTags'. Currently only + * entities of dimension 0 (points) are handled. */ GMSH_API void gmshModelOccSetMeshSize(int * dimTags, size_t dimTags_n, const double size, int * ierr); -/* Synchronize the internal OpenCASCADE CAD representation with the current - * Gmsh model. This can be called at any time, but since it involves a non - * trivial amount of processing, the number of synchronization points should - * normally be minimized. */ +/* Get the mass of the model entity of dimension `dim' and tag `tag'. */ +GMSH_API void gmshModelOccGetMass(const int dim, + const int tag, + double * mass, + int * ierr); + +/* Get the center of mass of the model entity of dimension `dim' and tag + * `tag'. */ +GMSH_API void gmshModelOccGetCenterOfMass(const int dim, + const int tag, + double * x, + double * y, + double * z, + int * ierr); + +/* Get the matrix of inertia (by row) of the model entity of dimension `dim' + * and tag `tag'. */ +GMSH_API void gmshModelOccGetMatrixOfInertia(const int dim, + const int tag, + double ** mat, size_t * mat_n, + int * ierr); + +/* Synchronize the OpenCASCADE CAD representation with the current Gmsh model. + * This can be called at any time, but since it involves a non trivial amount + * of processing, the number of synchronization points should normally be + * minimized. */ GMSH_API void gmshModelOccSynchronize(int * ierr); /* Add a new post-processing view, with name `name'. If `tag' is positive use @@ -1804,6 +1939,30 @@ GMSH_API void gmshViewGetListData(const int tag, double *** data, size_t ** data_n, size_t *data_nn, int * ierr); +/* Add a post-processing view as an `alias' of the reference view with tag + * `refTag'. If `copyOptions' is set, copy the options of the reference view. + * If `tag' is positive use it (and remove the view with that tag if it + * already exists), otherwise associate a new tag. Return the view tag. */ +GMSH_API int gmshViewAddAlias(const int refTag, + const int copyOptions, + const int tag, + int * ierr); + +/* Copy the options from the view with tag `refTag' to the view with tag + * `tag'. */ +GMSH_API void gmshViewCopyOptions(const int refTag, + const int tag, + int * ierr); + +/* Combine elements (if `what' == "elements") or steps (if `what' == "steps") + * of all views (`how' == "all"), all visible views (`how' == "visible") or + * all views having the same name (`how' == "name"). Remove original views if + * `remove' is set. */ +GMSH_API void gmshViewCombine(const char * what, + const char * how, + const int remove, + int * ierr); + /* Probe the view `tag' for its `value' at point (`x', `y', `z'). Return only * the value at step `step' is `step' is positive. Return only values with * `numComp' if `numComp' is positive. Return the gradient of the `value' if @@ -1851,7 +2010,7 @@ GMSH_API void gmshPluginRun(const char * name, /* Draw all the OpenGL scenes. */ GMSH_API void gmshGraphicsDraw(int * ierr); -/* Create the Fltk graphical user interface. Can only be called in the main +/* Create the FLTK graphical user interface. Can only be called in the main * thread. */ GMSH_API void gmshFltkInitialize(int * ierr); diff --git a/benchmarks/2d/naca12BL.geo b/benchmarks/2d/naca12BL.geo index d0fe8037b4396b88f9c2175cecdd6b4c1676fedc..0a83772a45eae24c81358d05abf3bd41e7704897 100644 --- a/benchmarks/2d/naca12BL.geo +++ b/benchmarks/2d/naca12BL.geo @@ -235,7 +235,7 @@ Field[1].ratio = 2.4; Field[1].thickness = 0.02*SC; //Field[1].fan_angle = 80; //Background Field = 1; -Field[1].NodesList = {1}; +//Field[1].NodesList = {1}; Field[1].FanNodesList = {1}; -Field[1].Quads = 0; +Field[1].Quads = 1; BoundaryLayer Field = 1; diff --git a/benchmarks/3d/periodic_translate.geo b/benchmarks/3d/periodic_translate.geo new file mode 100644 index 0000000000000000000000000000000000000000..2762edff0ac48c473b4e524f6768f0a93278be22 --- /dev/null +++ b/benchmarks/3d/periodic_translate.geo @@ -0,0 +1,120 @@ +Point(1) = {0, 0, 0, 1.0}; +Point(2) = {1, 0, 0, 1.0}; +Point(3) = {0, 1, 0, 1.0}; +Point(4) = {0, 0, 1, 1.0}; +Point(5) = {0, 1, 1, 1.0}; +Point(6) = {1, 0, 1, 1.0}; +Point(7) = {1, 1, 0, 1.0}; +Point(8) = {1, 1, 1, 1.0}; +Line(1) = {5, 4}; +Line(2) = {4, 6}; +Line(3) = {6, 8}; +Line(4) = {8, 5}; +Line(5) = {4, 1}; +Line(6) = {1, 3}; +Line(7) = {3, 5}; +Line(8) = {3, 7}; +Line(9) = {7, 2}; +Line(10) = {2, 1}; +Line(11) = {8, 7}; +Line(12) = {2, 6}; +Curve Loop(1) = {1, 2, 3, 4}; +Plane Surface(1) = {1}; +Curve Loop(2) = {11, -8, 7, -4}; +Plane Surface(2) = {2}; +Curve Loop(3) = {6, 8, 9, 10}; +Plane Surface(3) = {3}; +Curve Loop(4) = {5, -10, 12, -2}; +Plane Surface(4) = {4}; +Curve Loop(5) = {11, 9, 12, 3}; +Plane Surface(5) = {5}; +Curve Loop(6) = {7, 1, 5, 6}; +Plane Surface(6) = {6}; +Surface Loop(1) = {5, 2, 3, 6, 1, 4}; + +Point(9) = {0.6, 0.6, 0.6, 1.0}; +Point(10) = {0.85, 0.6, 0.6, 1.0}; +Point(11) = {0.35, 0.6, 0.6, 1.0}; +Point(12) = {0.6, 0.85, 0.6, 1.0}; +Point(13) = {0.6, 0.35, 0.6, 1.0}; +Point(14) = {0.6, 0.6, 0.85, 1.0}; +Point(15) = {0.6, 0.6, 0.35, 1.0}; + +Point(16) = {0.3, 0.3, 0.3, 1.0}; +Point(17) = {0.4, 0.3, 0.3, 1.0}; +Point(18) = {0.2, 0.3, 0.3, 1.0}; +Point(19) = {0.3, 0.4, 0.3, 1.0}; +Point(20) = {0.3, 0.2, 0.3, 1.0}; +Point(21) = {0.3, 0.3, 0.4, 1.0}; +Point(22) = {0.3, 0.3, 0.2, 1.0}; +Circle(13) = {12, 9, 14}; +Circle(14) = {12, 9, 15}; +Circle(15) = {13, 9, 14}; +Circle(16) = {13, 9, 15}; +Circle(17) = {10, 9, 12}; +Circle(18) = {11, 9, 12}; +Circle(19) = {11, 9, 13}; +Circle(20) = {13, 9, 10}; +Circle(21) = {11, 9, 15}; +Circle(22) = {15, 9, 10}; +Circle(23) = {10, 9, 14}; +Circle(24) = {14, 9, 11}; +Circle(25) = {19, 16, 21}; +Circle(26) = {19, 16, 22}; +Circle(27) = {20, 16, 21}; +Circle(28) = {20, 16, 22}; +Circle(29) = {17, 16, 19}; +Circle(30) = {18, 16, 19}; +Circle(31) = {18, 16, 20}; +Circle(32) = {20, 16, 17}; +Circle(33) = {18, 16, 22}; +Circle(34) = {22, 16, 17}; +Circle(35) = {17, 16, 21}; +Circle(36) = {21, 16, 18}; +Curve Loop(7) = {13, -23, 17}; +Surface(7) = {7}; +Curve Loop(8) = {18, 13, 24}; +Surface(8) = {8}; +Curve Loop(9) = {18, 14, -21}; +Surface(9) = {9}; +Curve Loop(10) = {14, 22, 17}; +Surface(10) = {10}; +Curve Loop(11) = {16, -21, 19}; +Surface(11) = {11}; +Curve Loop(12) = {19, 15, 24}; +Surface(12) = {12}; +Curve Loop(13) = {15, -23, -20}; +Surface(13) = {13}; +Curve Loop(14) = {20, -22, -16}; +Surface(14) = {14}; +Surface Loop(2) = {13, 12, 11, 14, 10, 9, 8, 7}; +Curve Loop(15) = {25, -35, 29}; +Surface(15) = {15}; +Curve Loop(16) = {30, 25, 36}; +Surface(16) = {16}; +Curve Loop(17) = {30, 26, -33}; +Surface(17) = {17}; +Curve Loop(18) = {26, 34, 29}; +Surface(18) = {18}; +Curve Loop(19) = {28, -33, 31}; +Surface(19) = {19}; +Curve Loop(20) = {31, 27, 36}; +Surface(20) = {20}; +Curve Loop(21) = {27, -35, -32}; +Surface(21) = {21}; +Curve Loop(22) = {32, -34, -28}; +Surface(22) = {22}; +Surface Loop(3) = {21, 20, 19, 22, 18, 17, 16, 15}; + +Volume(1) = {2}; +Volume(2) = {3}; +Volume(3) = {1,2,3}; + +Physical Volume("ball") = {1}; +Physical Volume("bball") = {2}; +Physical Volume("complement") = {3}; + +Mesh.CharacteristicLengthFactor = 0.2; +Periodic Surface{5} = {6} Translate {1,0,0}; +Periodic Surface{2} = {4} Translate {0,1,0}; +Periodic Surface{1} = {3} Translate {0,0,1}; diff --git a/benchmarks/occ_large/ell.geo b/benchmarks/occ_large/ell.geo new file mode 100644 index 0000000000000000000000000000000000000000..2607f737f129debe4d563d40f72733ccf5687099 --- /dev/null +++ b/benchmarks/occ_large/ell.geo @@ -0,0 +1,46 @@ +SetFactory("OpenCASCADE"); + +Macro FCCUnitCell + coeffs_1 = {1,-1,1,-1, 1,-1,1,-1, 1,-1, 0, 0, 0, 0}; + coeffs_2 = {1,1,-1,-1, 1,1,-1,-1, 0, 0, 1,-1, 0, 0}; + coeffs_3 = {1,1,1,1, -1,-1,-1,-1, 0, 0, 0, 0, 1, -1}; + + size = #coeffs_1() - 1; + + For i In {0:size} + center = {0.5*coeffs_1[i], 0.5*coeffs_2[i], 0.5*coeffs_3[i]}; + v = newv; Sphere(v) = {center(0),center(1), center(2), r}; + Dilate { {0.,0.,0.}, {1/aspect_ratio_31, 1/aspect_ratio_32, 1} } { + Volume{v}; + } + iVolumes() += v; + EndFor + + // Box + v_box = newreg; Box(v_box) = {-0.5/aspect_ratio_31,-0.5/aspect_ratio_32,-0.5, + 1/aspect_ratio_31,1/aspect_ratio_32,1}; + + BooleanIntersection{ Volume{v_box}; }{ Volume{iVolumes()}; Delete; } +Return + +iVolumes() = {}; +mVolume() = {}; + +cl = 0.1/2; +vf = 0.15; +fiber = 1; +matrix = 2; +nparticles = 4.; +r = (3.*vf/(nparticles*4.*Pi))^(1.0/3.0); + +Mesh.CharacteristicLengthMin = cl; +Mesh.CharacteristicLengthMax = cl; + +aspect_ratio_31 = 1/5; +aspect_ratio_32 = 1; + +Call FCCUnitCell; + +Coherence; + +Save "ell.brep"; diff --git a/benchmarks/step/wing.geo b/benchmarks/step/wing.geo new file mode 100644 index 0000000000000000000000000000000000000000..b92b32ba09b4949d811558e3c24481760aa895fd --- /dev/null +++ b/benchmarks/step/wing.geo @@ -0,0 +1,26 @@ +SetFactory("OpenCASCADE"); + +Geometry.OCCTargetUnit = "M"; + +v() = ShapeFromFile("wing_fuselage.step"); +Box(3) = {-5, -5, -5, 10, 10, 10}; +out() = BooleanDifference{ Volume{3}; Delete; }{ Volume{v()}; Delete; }; + +s() = Boundary{ Volume{out()}; }; +s1() = Surface In BoundingBox{-2,-2,-2,4,4,4}; +s() -= s1(); + +Physical Surface("Infinity", 1) = s(); +Physical Surface("Fuselage", 2) = s1(); +Physical Volume("Air", 3) = out(); + +p() = PointsOf{ Surface{s1()}; }; +Characteristic Length{p()} = 0.02; + +Mesh.CharacteristicLengthFromCurvature = 1; +Mesh.CharacteristicLengthFromPoints = 1; +Mesh.MinimumCirclePoints = 20; + +Mesh.CharacteristicLengthMin = 0.002; +Mesh.CharacteristicLengthMax = 1; +Mesh.Algorithm = 6; diff --git a/benchmarks/step/wing_fuselage.step b/benchmarks/step/wing_fuselage.step new file mode 100644 index 0000000000000000000000000000000000000000..f1b9b0ee6b15b3a1d4d5664649c52135e0fe4ea0 --- /dev/null +++ b/benchmarks/step/wing_fuselage.step @@ -0,0 +1,1947 @@ +ISO-10303-21; +HEADER; +FILE_DESCRIPTION( ( '' ), ' ' ); +FILE_NAME( '/vol/tmp/translate-12444423116078043301/5c9498e7de633f17ec287f48.step', '2019-03-22T08:12:24', ( '' ), ( '' ), ' ', ' ', ' ' ); +FILE_SCHEMA( ( 'AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }' ) ); +ENDSEC; +DATA; +#1 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION( ' ', ( #12, #13, #14, #15, #16, #17, #18, #19, #20, #21, #22, #23, #24, #25, #26, #27 ), #8 ); +#2 = PRODUCT_DEFINITION_CONTEXT( '', #28, 'design' ); +#3 = APPLICATION_PROTOCOL_DEFINITION( 'international standard', 'automotive_design', 2001, #28 ); +#4 = PRODUCT_CATEGORY_RELATIONSHIP( 'NONE', 'NONE', #29, #30 ); +#5 = SHAPE_DEFINITION_REPRESENTATION( #31, #32 ); +#6 = PRODUCT_CATEGORY_RELATIONSHIP( 'NONE', 'NONE', #29, #33 ); +#7 = SHAPE_DEFINITION_REPRESENTATION( #34, #35 ); +#8 = ( GEOMETRIC_REPRESENTATION_CONTEXT( 3 )GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT( ( #38 ) )GLOBAL_UNIT_ASSIGNED_CONTEXT( ( #40, #41, #42 ) )REPRESENTATION_CONTEXT( 'NONE', 'WORKSPACE' ) ); +#12 = STYLED_ITEM( '', ( #44 ), #45 ); +#13 = STYLED_ITEM( '', ( #46 ), #47 ); +#14 = STYLED_ITEM( '', ( #48 ), #49 ); +#15 = STYLED_ITEM( '', ( #50 ), #51 ); +#16 = STYLED_ITEM( '', ( #52 ), #53 ); +#17 = STYLED_ITEM( '', ( #54 ), #55 ); +#18 = STYLED_ITEM( '', ( #56 ), #57 ); +#19 = STYLED_ITEM( '', ( #58 ), #59 ); +#20 = STYLED_ITEM( '', ( #60 ), #61 ); +#21 = STYLED_ITEM( '', ( #62 ), #63 ); +#22 = STYLED_ITEM( '', ( #64 ), #65 ); +#23 = STYLED_ITEM( '', ( #66 ), #67 ); +#24 = STYLED_ITEM( '', ( #68 ), #69 ); +#25 = STYLED_ITEM( '', ( #70 ), #71 ); +#26 = STYLED_ITEM( '', ( #72 ), #73 ); +#27 = STYLED_ITEM( '', ( #74 ), #75 ); +#28 = APPLICATION_CONTEXT( 'core data for automotive mechanical design processes' ); +#29 = PRODUCT_CATEGORY( 'part', 'NONE' ); +#30 = PRODUCT_RELATED_PRODUCT_CATEGORY( 'detail', ' ', ( #76 ) ); +#31 = PRODUCT_DEFINITION_SHAPE( 'NONE', 'NONE', #77 ); +#32 = ADVANCED_BREP_SHAPE_REPRESENTATION( 'Part 2', ( #78, #79 ), #8 ); +#33 = PRODUCT_RELATED_PRODUCT_CATEGORY( 'detail', ' ', ( #80 ) ); +#34 = PRODUCT_DEFINITION_SHAPE( 'NONE', 'NONE', #81 ); +#35 = ADVANCED_BREP_SHAPE_REPRESENTATION( 'Part 1', ( #82, #83 ), #8 ); +#38 = UNCERTAINTY_MEASURE_WITH_UNIT( LENGTH_MEASURE( 1.00000000000000E-06 ), #40, '', '' ); +#40 = ( CONVERSION_BASED_UNIT( 'METRE', #86 )LENGTH_UNIT( )NAMED_UNIT( #89 ) ); +#41 = ( NAMED_UNIT( #91 )PLANE_ANGLE_UNIT( )SI_UNIT( $, .RADIAN. ) ); +#42 = ( NAMED_UNIT( #91 )SI_UNIT( $, .STERADIAN. )SOLID_ANGLE_UNIT( ) ); +#44 = PRESENTATION_STYLE_ASSIGNMENT( ( #97 ) ); +#45 = ADVANCED_FACE( '', ( #98 ), #99, .T. ); +#46 = PRESENTATION_STYLE_ASSIGNMENT( ( #100 ) ); +#47 = ADVANCED_FACE( '', ( #101 ), #102, .F. ); +#48 = PRESENTATION_STYLE_ASSIGNMENT( ( #103 ) ); +#49 = ADVANCED_FACE( '', ( #104 ), #105, .T. ); +#50 = PRESENTATION_STYLE_ASSIGNMENT( ( #106 ) ); +#51 = ADVANCED_FACE( '', ( #107 ), #108, .F. ); +#52 = PRESENTATION_STYLE_ASSIGNMENT( ( #109 ) ); +#53 = ADVANCED_FACE( '', ( #110 ), #111, .T. ); +#54 = PRESENTATION_STYLE_ASSIGNMENT( ( #112 ) ); +#55 = ADVANCED_FACE( '', ( #113 ), #114, .F. ); +#56 = PRESENTATION_STYLE_ASSIGNMENT( ( #115 ) ); +#57 = ADVANCED_FACE( '', ( #116 ), #117, .F. ); +#58 = PRESENTATION_STYLE_ASSIGNMENT( ( #118 ) ); +#59 = ADVANCED_FACE( '', ( #119 ), #120, .F. ); +#60 = PRESENTATION_STYLE_ASSIGNMENT( ( #121 ) ); +#61 = ADVANCED_FACE( '', ( #122 ), #123, .F. ); +#62 = PRESENTATION_STYLE_ASSIGNMENT( ( #124 ) ); +#63 = ADVANCED_FACE( '', ( #125 ), #126, .F. ); +#64 = PRESENTATION_STYLE_ASSIGNMENT( ( #127 ) ); +#65 = ADVANCED_FACE( '', ( #128 ), #129, .T. ); +#66 = PRESENTATION_STYLE_ASSIGNMENT( ( #130 ) ); +#67 = ADVANCED_FACE( '', ( #131, #132 ), #133, .T. ); +#68 = PRESENTATION_STYLE_ASSIGNMENT( ( #134 ) ); +#69 = ADVANCED_FACE( '', ( #135 ), #136, .F. ); +#70 = PRESENTATION_STYLE_ASSIGNMENT( ( #137 ) ); +#71 = ADVANCED_FACE( '', ( #138 ), #139, .T. ); +#72 = PRESENTATION_STYLE_ASSIGNMENT( ( #140 ) ); +#73 = ADVANCED_FACE( '', ( #141, #142 ), #143, .T. ); +#74 = PRESENTATION_STYLE_ASSIGNMENT( ( #144 ) ); +#75 = ADVANCED_FACE( '', ( #145 ), #146, .T. ); +#76 = PRODUCT( 'Part 2', 'Part 2', 'PART-Part 2-DESC', ( #147 ) ); +#77 = PRODUCT_DEFINITION( 'NONE', 'NONE', #148, #2 ); +#78 = MANIFOLD_SOLID_BREP( 'Part 2', #149 ); +#79 = AXIS2_PLACEMENT_3D( '', #150, #151, #152 ); +#80 = PRODUCT( 'Part 1', 'Part 1', 'PART-Part 1-DESC', ( #147 ) ); +#81 = PRODUCT_DEFINITION( 'NONE', 'NONE', #153, #2 ); +#82 = MANIFOLD_SOLID_BREP( 'Part 1', #154 ); +#83 = AXIS2_PLACEMENT_3D( '', #155, #156, #157 ); +#86 = LENGTH_MEASURE_WITH_UNIT( LENGTH_MEASURE( 1.00000000000000 ), #158 ); +#89 = DIMENSIONAL_EXPONENTS( 1.00000000000000, 0.00000000000000, 0.00000000000000, 0.00000000000000, 0.00000000000000, 0.00000000000000, 0.00000000000000 ); +#91 = DIMENSIONAL_EXPONENTS( 0.00000000000000, 0.00000000000000, 0.00000000000000, 0.00000000000000, 0.00000000000000, 0.00000000000000, 0.00000000000000 ); +#97 = SURFACE_STYLE_USAGE( .BOTH., #159 ); +#98 = FACE_OUTER_BOUND( '', #160, .T. ); +#99 = SURFACE_OF_LINEAR_EXTRUSION( '', #161, #162 ); +#100 = SURFACE_STYLE_USAGE( .BOTH., #163 ); +#101 = FACE_OUTER_BOUND( '', #164, .T. ); +#102 = ( BOUNDED_SURFACE( )B_SPLINE_SURFACE( 2, 3, ( ( #167, #168, #169, #170, #171, #172, #173, #174, #175, #176, #177, #178, #179, #180, #181, #182, #183, #184, #185, #186, #187, #188, #189, #190, #191, #192, #193, #194, #195, #196, #197, #198, #199, #200, #201, #202, #203, #204, #205, #206, #207, #208, #209, #210, #211, #212, #213, #214, #215, #216, #217, #218, #219, #220, #221, #222, #223, #224, #225, #226, #227, #228, #229, #230, #231, #232, #233, #234, #235, #236, #237, #238, #239, #240 ), ( #241, #242, #243, #244, #245, #246, #247, #248, #249, #250, #251, #252, #253, #254, #255, #256, #257, #258, #259, #260, #261, #262, #263, #264, #265, #266, #267, #268, #269, #270, #271, #272, #273, #274, #275, #276, #277, #278, #279, #280, #281, #282, #283, #284, #285, #286, #287, #288, #289, #290, #291, #292, #293, #294, #295, #296, #297, #298, #299, #300, #301, #302, #303, #304, #305, #306, #307, #308, #309, #310, #311, #312, #313, #314 ), ( #315, #316, #317, #318, #319, #320, #321, #322, #323, #324, #325, #326, #327, #328, #329, #330, #331, #332, #333, #334, #335, #336, #337, #338, #339, #340, #341, #342, #343, #344, #345, #346, #347, #348, #349, #350, #351, #352, #353, #354, #355, #356, #357, #358, #359, #360, #361, #362, #363, #364, #365, #366, #367, #368, #369, #370, #371, #372, #373, #374, #375, #376, #377, #378, #379, #380, #381, #382, #383, #384, #385, #386, #387, #388 ) ), .UNSPECIFIED., .F., .F., .F. )B_SPLINE_SURFACE_WITH_KNOTS( ( 3, 3 ), ( 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4 ), ( 0.00000000000000, 1.00000000000000 ), ( 0.489989462631597, 0.496400312506120, 0.502811162380643, 0.506016587317904, 0.507619299786535, 0.509222012255166, 0.512427437192427, 0.514030149661058, 0.515632862129689, 0.515751115825458, 0.515810242673342, 0.515869369521227, 0.516105876912765, 0.516578891695841, 0.517524921261994, 0.519416980394300, 0.523201098658912, 0.526985216923524, 0.530769335188136, 0.534553453452748, 0.538337571717359, 0.545905808246583, 0.553474044775807, 0.561042281305030, 0.568610517834254, 0.576178754363478, 0.591315227421925, 0.606451700480372, 0.621588173538819, 0.636724646597267, 0.697270538831055, 0.757816431064844, 0.818362323298633, 0.878908215532422, 0.939454107766211, 0.969727053883106, 1.00000000000000 ), .UNSPECIFIED. )GEOMETRIC_REPRESENTATION_ITEM( )RATIONAL_B_SPLINE_SURFACE( ( ( 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000 ), ( 0.729824545895176, 0.730515730902410, 0.731208675789547, 0.732599552088341, 0.733284967533316, 0.734303987664714, 0.734640388094595, 0.735157720283093, 0.735332050383730, 0.735684593648398, 0.735865443768593, 0.736388434500506, 0.736713651772957, 0.737173539436138, 0.737357113914557, 0.737811153599201, 0.738077740334447, 0.738410521285747, 0.738433624994603, 0.738468639501799, 0.738480370827896, 0.738503953686113, 0.738468655632940, 0.738379828799365, 0.738319650227677, 0.738176480274374, 0.738132596180194, 0.738176826601060, 0.738416286010099, 0.739637246564410, 0.741234092527305, 0.748048211782015, 0.755405233409266, 0.771453678977081, 0.779720478622838, 0.793174408791800, 0.798516872090859, 0.806799986722763, 0.809796344917587, 0.814400662787794, 0.816006033530718, 0.819796402372766, 0.820881562749374, 0.822233385765381, 0.822414791144091, 0.822397365246888, 0.822181912542904, 0.821558754906926, 0.821148532349770, 0.820222844442612, 0.819703177898048, 0.818062421976170, 0.816869572337108, 0.814462575645891, 0.813265744154008, 0.810841831646791, 0.809618042654785, 0.807121557022200, 0.805850968659874, 0.799383155231154, 0.793849094363541, 0.781569404793971, 0.774843502607951, 0.759247795497314, 0.750348974359066, 0.730269865707875, 0.719054757271756, 0.694262858234545, 0.680557555469922, 0.659701832520093, 0.652715935621082, 0.639887007792891, 0.634030501257168, 0.630179703455306 ), ( 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000 ) ) )REPRESENTATION_ITEM( '' )SURFACE( ) ); +#103 = SURFACE_STYLE_USAGE( .BOTH., #394 ); +#104 = FACE_OUTER_BOUND( '', #395, .T. ); +#105 = ( BOUNDED_SURFACE( )B_SPLINE_SURFACE( 2, 3, ( ( #398, #399, #400, #401, #402, #403, #404, #405, #406, #407, #408, #409, #410, #411, #412, #413, #414, #415, #416, #417, #418, #419, #420, #421, #422, #423, #424, #425, #426, #427, #428, #429, #430, #431, #432, #433, #434, #435, #436, #437, #438, #439, #440, #441, #442, #443, #444, #445, #446, #447, #448, #449, #450, #451, #452, #453, #454, #455, #456, #457, #458, #459, #460, #461, #462, #463, #464, #465, #466, #467, #468, #469, #470, #471 ), ( #472, #473, #474, #475, #476, #477, #478, #479, #480, #481, #482, #483, #484, #485, #486, #487, #488, #489, #490, #491, #492, #493, #494, #495, #496, #497, #498, #499, #500, #501, #502, #503, #504, #505, #506, #507, #508, #509, #510, #511, #512, #513, #514, #515, #516, #517, #518, #519, #520, #521, #522, #523, #524, #525, #526, #527, #528, #529, #530, #531, #532, #533, #534, #535, #536, #537, #538, #539, #540, #541, #542, #543, #544, #545 ), ( #546, #547, #548, #549, #550, #551, #552, #553, #554, #555, #556, #557, #558, #559, #560, #561, #562, #563, #564, #565, #566, #567, #568, #569, #570, #571, #572, #573, #574, #575, #576, #577, #578, #579, #580, #581, #582, #583, #584, #585, #586, #587, #588, #589, #590, #591, #592, #593, #594, #595, #596, #597, #598, #599, #600, #601, #602, #603, #604, #605, #606, #607, #608, #609, #610, #611, #612, #613, #614, #615, #616, #617, #618, #619 ) ), .UNSPECIFIED., .F., .F., .F. )B_SPLINE_SURFACE_WITH_KNOTS( ( 3, 3 ), ( 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4 ), ( 0.00000000000000, 1.00000000000000 ), ( 0.489989462631597, 0.496400312506120, 0.502811162380643, 0.506016587317904, 0.507619299786535, 0.509222012255166, 0.512427437192427, 0.514030149661058, 0.515632862129689, 0.515751115825458, 0.515810242673342, 0.515869369521227, 0.516105876912765, 0.516578891695841, 0.517524921261994, 0.519416980394300, 0.523201098658912, 0.526985216923524, 0.530769335188136, 0.534553453452748, 0.538337571717359, 0.545905808246583, 0.553474044775807, 0.561042281305030, 0.568610517834254, 0.576178754363478, 0.591315227421925, 0.606451700480372, 0.621588173538819, 0.636724646597267, 0.697270538831055, 0.757816431064844, 0.818362323298633, 0.878908215532422, 0.939454107766211, 0.969727053883106, 1.00000000000000 ), .UNSPECIFIED. )GEOMETRIC_REPRESENTATION_ITEM( )RATIONAL_B_SPLINE_SURFACE( ( ( 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000 ), ( 0.729824545895176, 0.730515730902410, 0.731208675789547, 0.732599552088341, 0.733284967533316, 0.734303987664714, 0.734640388094595, 0.735157720283093, 0.735332050383730, 0.735684593648398, 0.735865443768593, 0.736388434500506, 0.736713651772957, 0.737173539436138, 0.737357113914557, 0.737811153599201, 0.738077740334447, 0.738410521285747, 0.738433624994603, 0.738468639501799, 0.738480370827896, 0.738503953686113, 0.738468655632940, 0.738379828799365, 0.738319650227677, 0.738176480274374, 0.738132596180194, 0.738176826601060, 0.738416286010099, 0.739637246564410, 0.741234092527305, 0.748048211782015, 0.755405233409266, 0.771453678977081, 0.779720478622838, 0.793174408791800, 0.798516872090859, 0.806799986722763, 0.809796344917587, 0.814400662787794, 0.816006033530718, 0.819796402372766, 0.820881562749374, 0.822233385765381, 0.822414791144091, 0.822397365246888, 0.822181912542904, 0.821558754906926, 0.821148532349770, 0.820222844442612, 0.819703177898048, 0.818062421976170, 0.816869572337108, 0.814462575645891, 0.813265744154008, 0.810841831646791, 0.809618042654785, 0.807121557022200, 0.805850968659874, 0.799383155231154, 0.793849094363541, 0.781569404793971, 0.774843502607951, 0.759247795497314, 0.750348974359066, 0.730269865707875, 0.719054757271756, 0.694262858234545, 0.680557555469922, 0.659701832520093, 0.652715935621082, 0.639887007792891, 0.634030501257168, 0.630179703455306 ), ( 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000 ) ) )REPRESENTATION_ITEM( '' )SURFACE( ) ); +#106 = SURFACE_STYLE_USAGE( .BOTH., #625 ); +#107 = FACE_OUTER_BOUND( '', #626, .T. ); +#108 = PLANE( '', #627 ); +#109 = SURFACE_STYLE_USAGE( .BOTH., #628 ); +#110 = FACE_OUTER_BOUND( '', #629, .T. ); +#111 = SURFACE_OF_LINEAR_EXTRUSION( '', #630, #631 ); +#112 = SURFACE_STYLE_USAGE( .BOTH., #632 ); +#113 = FACE_OUTER_BOUND( '', #633, .T. ); +#114 = PLANE( '', #634 ); +#115 = SURFACE_STYLE_USAGE( .BOTH., #635 ); +#116 = FACE_OUTER_BOUND( '', #636, .T. ); +#117 = PLANE( '', #637 ); +#118 = SURFACE_STYLE_USAGE( .BOTH., #638 ); +#119 = FACE_OUTER_BOUND( '', #639, .T. ); +#120 = SURFACE_OF_LINEAR_EXTRUSION( '', #640, #641 ); +#121 = SURFACE_STYLE_USAGE( .BOTH., #642 ); +#122 = FACE_OUTER_BOUND( '', #643, .T. ); +#123 = PLANE( '', #644 ); +#124 = SURFACE_STYLE_USAGE( .BOTH., #645 ); +#125 = FACE_OUTER_BOUND( '', #646, .T. ); +#126 = ( BOUNDED_SURFACE( )B_SPLINE_SURFACE( 2, 3, ( ( #649, #650, #651, #652, #653, #654, #655, #656, #657, #658, #659, #660, #661, #662, #663, #664, #665, #666, #667, #668, #669, #670, #671, #672, #673, #674, #675, #676, #677, #678, #679, #680, #681, #682, #683, #684, #685, #686, #687, #688, #689, #690, #691, #692, #693, #694, #695, #696, #697, #698, #699, #700, #701, #702, #703, #704, #705, #706, #707, #708, #709, #710, #711, #712, #713, #714 ), ( #715, #716, #717, #718, #719, #720, #721, #722, #723, #724, #725, #726, #727, #728, #729, #730, #731, #732, #733, #734, #735, #736, #737, #738, #739, #740, #741, #742, #743, #744, #745, #746, #747, #748, #749, #750, #751, #752, #753, #754, #755, #756, #757, #758, #759, #760, #761, #762, #763, #764, #765, #766, #767, #768, #769, #770, #771, #772, #773, #774, #775, #776, #777, #778, #779, #780 ), ( #781, #782, #783, #784, #785, #786, #787, #788, #789, #790, #791, #792, #793, #794, #795, #796, #797, #798, #799, #800, #801, #802, #803, #804, #805, #806, #807, #808, #809, #810, #811, #812, #813, #814, #815, #816, #817, #818, #819, #820, #821, #822, #823, #824, #825, #826, #827, #828, #829, #830, #831, #832, #833, #834, #835, #836, #837, #838, #839, #840, #841, #842, #843, #844, #845, #846 ) ), .UNSPECIFIED., .F., .F., .F. )B_SPLINE_SURFACE_WITH_KNOTS( ( 3, 3 ), ( 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4 ), ( 0.00000000000000, 1.00000000000000 ), ( 0.00000000000000, 0.0644541077662110, 0.128908215532422, 0.193362323298633, 0.257816431064844, 0.322270538831055, 0.354497592714160, 0.386724646597266, 0.418951700480372, 0.435065227421924, 0.451178754363477, 0.467292281305030, 0.483405808246582, 0.491462571717359, 0.499519335188135, 0.503547716923523, 0.507576098658911, 0.509590289526605, 0.511604480394300, 0.512611575828147, 0.513618671261994, 0.514625766695841, 0.515129314412764, 0.515381088271226, 0.515412560003534, 0.515444031735841, 0.515506975200457, 0.515632862129688, 0.516438538476765, 0.517244214823843, 0.518049891170921, 0.518855567517998, 0.522078272906309 ), .UNSPECIFIED. )GEOMETRIC_REPRESENTATION_ITEM( )RATIONAL_B_SPLINE_SURFACE( ( ( 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000 ), ( 0.792839752124912, 0.822980590217648, 0.844649787580774, 0.879245731273322, 0.892110399635226, 0.912841607019611, 0.920657350332144, 0.933372816204302, 0.938237887553698, 0.945218454791916, 0.947368771756750, 0.947817855046716, 0.947497699374301, 0.945454996610564, 0.943739752646873, 0.937857253578691, 0.933737087660053, 0.923849780235710, 0.919894461059996, 0.910365156362766, 0.904801233627132, 0.891344765738107, 0.883491397840909, 0.863600118511422, 0.851511863193304, 0.828626145635816, 0.820237747837733, 0.802062440665860, 0.792129794955840, 0.777546615892503, 0.772750236938026, 0.763619435871964, 0.759265571968119, 0.753259412581573, 0.751335654404596, 0.747997801194220, 0.746552706471099, 0.744690776265381, 0.744137189335814, 0.743054649205931, 0.742471418629123, 0.741310422737406, 0.740732432344108, 0.739962385954420, 0.739722157906463, 0.739400843603592, 0.739300261788727, 0.739195911680261, 0.739184439548979, 0.739161745329676, 0.739142098669194, 0.739147234143833, 0.739154606541989, 0.739170941716742, 0.739181957482739, 0.739264414605799, 0.739342214738374, 0.739503577989451, 0.739580843907966, 0.739728898615175, 0.739802447810854, 0.739955772415954, 0.740034562068542, 0.740434524595263, 0.740781079414815, 0.741178632722028 ), ( 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000 ) ) )REPRESENTATION_ITEM( '' )SURFACE( ) ); +#127 = SURFACE_STYLE_USAGE( .BOTH., #852 ); +#128 = FACE_OUTER_BOUND( '', #853, .T. ); +#129 = PLANE( '', #854 ); +#130 = SURFACE_STYLE_USAGE( .BOTH., #855 ); +#131 = FACE_OUTER_BOUND( '', #856, .T. ); +#132 = FACE_BOUND( '', #857, .T. ); +#133 = SURFACE_OF_REVOLUTION( '', #858, #859 ); +#134 = SURFACE_STYLE_USAGE( .BOTH., #860 ); +#135 = FACE_OUTER_BOUND( '', #861, .T. ); +#136 = SURFACE_OF_LINEAR_EXTRUSION( '', #862, #863 ); +#137 = SURFACE_STYLE_USAGE( .BOTH., #864 ); +#138 = FACE_OUTER_BOUND( '', #865, .T. ); +#139 = PLANE( '', #866 ); +#140 = SURFACE_STYLE_USAGE( .BOTH., #867 ); +#141 = FACE_OUTER_BOUND( '', #868, .T. ); +#142 = FACE_BOUND( '', #869, .T. ); +#143 = SURFACE_OF_REVOLUTION( '', #870, #871 ); +#144 = SURFACE_STYLE_USAGE( .BOTH., #872 ); +#145 = FACE_OUTER_BOUND( '', #873, .T. ); +#146 = ( BOUNDED_SURFACE( )B_SPLINE_SURFACE( 2, 3, ( ( #876, #877, #878, #879, #880, #881, #882, #883, #884, #885, #886, #887, #888, #889, #890, #891, #892, #893, #894, #895, #896, #897, #898, #899, #900, #901, #902, #903, #904, #905, #906, #907, #908, #909, #910, #911, #912, #913, #914, #915, #916, #917, #918, #919, #920, #921, #922, #923, #924, #925, #926, #927, #928, #929, #930, #931, #932, #933, #934, #935, #936, #937, #938, #939, #940, #941 ), ( #942, #943, #944, #945, #946, #947, #948, #949, #950, #951, #952, #953, #954, #955, #956, #957, #958, #959, #960, #961, #962, #963, #964, #965, #966, #967, #968, #969, #970, #971, #972, #973, #974, #975, #976, #977, #978, #979, #980, #981, #982, #983, #984, #985, #986, #987, #988, #989, #990, #991, #992, #993, #994, #995, #996, #997, #998, #999, #1000, #1001, #1002, #1003, #1004, #1005, #1006, #1007 ), ( #1008, #1009, #1010, #1011, #1012, #1013, #1014, #1015, #1016, #1017, #1018, #1019, #1020, #1021, #1022, #1023, #1024, #1025, #1026, #1027, #1028, #1029, #1030, #1031, #1032, #1033, #1034, #1035, #1036, #1037, #1038, #1039, #1040, #1041, #1042, #1043, #1044, #1045, #1046, #1047, #1048, #1049, #1050, #1051, #1052, #1053, #1054, #1055, #1056, #1057, #1058, #1059, #1060, #1061, #1062, #1063, #1064, #1065, #1066, #1067, #1068, #1069, #1070, #1071, #1072, #1073 ) ), .UNSPECIFIED., .F., .F., .F. )B_SPLINE_SURFACE_WITH_KNOTS( ( 3, 3 ), ( 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4 ), ( 0.00000000000000, 1.00000000000000 ), ( 0.00000000000000, 0.0644541077662110, 0.128908215532422, 0.193362323298633, 0.257816431064844, 0.322270538831055, 0.354497592714160, 0.386724646597266, 0.418951700480372, 0.435065227421924, 0.451178754363477, 0.467292281305030, 0.483405808246582, 0.491462571717359, 0.499519335188135, 0.503547716923523, 0.507576098658911, 0.509590289526605, 0.511604480394300, 0.512611575828147, 0.513618671261994, 0.514625766695841, 0.515129314412764, 0.515381088271226, 0.515412560003534, 0.515444031735841, 0.515506975200457, 0.515632862129688, 0.516438538476765, 0.517244214823843, 0.518049891170921, 0.518855567517998, 0.522078272906309 ), .UNSPECIFIED. )GEOMETRIC_REPRESENTATION_ITEM( )RATIONAL_B_SPLINE_SURFACE( ( ( 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000 ), ( 0.792839752124912, 0.822980590217648, 0.844649787580774, 0.879245731273322, 0.892110399635226, 0.912841607019611, 0.920657350332144, 0.933372816204302, 0.938237887553698, 0.945218454791916, 0.947368771756750, 0.947817855046716, 0.947497699374301, 0.945454996610564, 0.943739752646873, 0.937857253578691, 0.933737087660053, 0.923849780235710, 0.919894461059996, 0.910365156362766, 0.904801233627132, 0.891344765738107, 0.883491397840909, 0.863600118511422, 0.851511863193304, 0.828626145635816, 0.820237747837733, 0.802062440665860, 0.792129794955840, 0.777546615892503, 0.772750236938026, 0.763619435871964, 0.759265571968119, 0.753259412581573, 0.751335654404596, 0.747997801194220, 0.746552706471099, 0.744690776265381, 0.744137189335814, 0.743054649205931, 0.742471418629123, 0.741310422737406, 0.740732432344108, 0.739962385954420, 0.739722157906463, 0.739400843603592, 0.739300261788727, 0.739195911680261, 0.739184439548979, 0.739161745329676, 0.739142098669194, 0.739147234143833, 0.739154606541989, 0.739170941716742, 0.739181957482739, 0.739264414605799, 0.739342214738374, 0.739503577989451, 0.739580843907966, 0.739728898615175, 0.739802447810854, 0.739955772415954, 0.740034562068542, 0.740434524595263, 0.740781079414815, 0.741178632722028 ), ( 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000 ) ) )REPRESENTATION_ITEM( '' )SURFACE( ) ); +#147 = PRODUCT_CONTEXT( '', #28, 'mechanical' ); +#148 = PRODUCT_DEFINITION_FORMATION_WITH_SPECIFIED_SOURCE( ' ', 'NONE', #76, .NOT_KNOWN. ); +#149 = CLOSED_SHELL( '', ( #73, #53, #47, #63, #61, #57, #69, #71 ) ); +#150 = CARTESIAN_POINT( '', ( 0.00000000000000, 0.00000000000000, 0.00000000000000 ) ); +#151 = DIRECTION( '', ( 0.00000000000000, 0.00000000000000, 1.00000000000000 ) ); +#152 = DIRECTION( '', ( 1.00000000000000, 0.00000000000000, 0.00000000000000 ) ); +#153 = PRODUCT_DEFINITION_FORMATION_WITH_SPECIFIED_SOURCE( ' ', 'NONE', #80, .NOT_KNOWN. ); +#154 = CLOSED_SHELL( '', ( #59, #67, #51, #55, #75, #49, #45, #65 ) ); +#155 = CARTESIAN_POINT( '', ( 0.00000000000000, 0.00000000000000, 0.00000000000000 ) ); +#156 = DIRECTION( '', ( 0.00000000000000, 0.00000000000000, 1.00000000000000 ) ); +#157 = DIRECTION( '', ( 1.00000000000000, 0.00000000000000, 0.00000000000000 ) ); +#158 = ( LENGTH_UNIT( )NAMED_UNIT( #89 )SI_UNIT( $, .METRE. ) ); +#159 = SURFACE_SIDE_STYLE( '', ( #1080 ) ); +#160 = EDGE_LOOP( '', ( #1081, #1082, #1083, #1084 ) ); +#161 = B_SPLINE_CURVE_WITH_KNOTS( '', 3, ( #1085, #1086, #1087, #1088, #1089, #1090 ), .UNSPECIFIED., .F., .F., ( 4, 1, 1, 4 ), ( 0.00000000000000, 0.239391242362016, 0.578687076655342, 1.00000000000000 ), .UNSPECIFIED. ); +#162 = VECTOR( '', #1091, 1.00000000000000 ); +#163 = SURFACE_SIDE_STYLE( '', ( #1092 ) ); +#164 = EDGE_LOOP( '', ( #1093, #1094, #1095, #1096 ) ); +#167 = CARTESIAN_POINT( '', ( -0.0680974975178552, -0.0239894454205930, 0.0152172169424728 ) ); +#168 = CARTESIAN_POINT( '', ( -0.0680032181105161, -0.0246759447506517, 0.0141527504259519 ) ); +#169 = CARTESIAN_POINT( '', ( -0.0679071745984749, -0.0252681551165487, 0.0130804649572200 ) ); +#170 = CARTESIAN_POINT( '', ( -0.0677114375662217, -0.0262957543466452, 0.0109188252235341 ) ); +#171 = CARTESIAN_POINT( '', ( -0.0676135711148685, -0.0267220039426466, 0.00984893477481779 ) ); +#172 = CARTESIAN_POINT( '', ( -0.0674659341255867, -0.0272554769347834, 0.00825144176784390 ) ); +#173 = CARTESIAN_POINT( '', ( -0.0674168423020544, -0.0274149309854798, 0.00772294009365939 ) ); +#174 = CARTESIAN_POINT( '', ( -0.0673407771457563, -0.0276347978686475, 0.00690836927164076 ) ); +#175 = CARTESIAN_POINT( '', ( -0.0673150526819579, -0.0277046677148782, 0.00663357911931615 ) ); +#176 = CARTESIAN_POINT( '', ( -0.0672628439234829, -0.0278371859086408, 0.00607726647192766 ) ); +#177 = CARTESIAN_POINT( '', ( -0.0672359649971746, -0.0279006430611896, 0.00579156963124011 ) ); +#178 = CARTESIAN_POINT( '', ( -0.0671579390310775, -0.0280715304356377, 0.00496443909377650 ) ); +#179 = CARTESIAN_POINT( '', ( -0.0671090148630545, -0.0281613026512849, 0.00444883237524072 ) ); +#180 = CARTESIAN_POINT( '', ( -0.0670392282840175, -0.0282706195966596, 0.00371801618676356 ) ); +#181 = CARTESIAN_POINT( '', ( -0.0670113818393531, -0.0283114175644096, 0.00342623695078522 ) ); +#182 = CARTESIAN_POINT( '', ( -0.0669425804655466, -0.0283960926970616, 0.00270426305648970 ) ); +#183 = CARTESIAN_POINT( '', ( -0.0669022014035962, -0.0284391349009694, 0.00228020869590057 ) ); +#184 = CARTESIAN_POINT( '', ( -0.0668517974488390, -0.0284771855782259, 0.00175042341340950 ) ); +#185 = CARTESIAN_POINT( '', ( -0.0668482980989998, -0.0284797571771000, 0.00171364048952353 ) ); +#186 = CARTESIAN_POINT( '', ( -0.0668429947056285, -0.0284835438486693, 0.00165789152716251 ) ); +#187 = CARTESIAN_POINT( '', ( -0.0668412178461092, -0.0284847942825137, 0.00163921277724751 ) ); +#188 = CARTESIAN_POINT( '', ( -0.0668376459183344, -0.0284872705069466, 0.00160166282863587 ) ); +#189 = CARTESIAN_POINT( '', ( -0.0668358241958317, -0.0284884986717803, 0.00158279446174343 ) ); +#190 = CARTESIAN_POINT( '', ( -0.0668263032976867, -0.0284946078539997, 0.00148801116844473 ) ); +#191 = CARTESIAN_POINT( '', ( -0.0668175855721837, -0.0284993745805055, 0.00141074777256666 ) ); +#192 = CARTESIAN_POINT( '', ( -0.0667877732050374, -0.0285132384613731, 0.00117471357936273 ) ); +#193 = CARTESIAN_POINT( '', ( -0.0667623360526505, -0.0285220241268447, 0.00100850945384205 ) ); +#194 = CARTESIAN_POINT( '', ( -0.0666757898022021, -0.0285444344992712, 0.000530812897485948 ) ); +#195 = CARTESIAN_POINT( '', ( -0.0666061727573671, -0.0285545921274810, 0.000239015749984288 ) ); +#196 = CARTESIAN_POINT( '', ( -0.0663591024405948, -0.0285762855912515, -0.000621138281703568 ) ); +#197 = CARTESIAN_POINT( '', ( -0.0661293851234302, -0.0285787804485868, -0.00120627291414547 ) ); +#198 = CARTESIAN_POINT( '', ( -0.0652606207134267, -0.0285519956194662, -0.00290664576490434 ) ); +#199 = CARTESIAN_POINT( '', ( -0.0644263448901085, -0.0284877724269739, -0.00399134967968776 ) ); +#200 = CARTESIAN_POINT( '', ( -0.0624150482720823, -0.0283203901458413, -0.00588790513868985 ) ); +#201 = CARTESIAN_POINT( '', ( -0.0612709160852482, -0.0282222803780746, -0.00667265988017430 ) ); +#202 = CARTESIAN_POINT( '', ( -0.0590677341404702, -0.0280555966984728, -0.00789323608605263 ) ); +#203 = CARTESIAN_POINT( '', ( -0.0580036997004594, -0.0279856043625949, -0.00834200514118173 ) ); +#204 = CARTESIAN_POINT( '', ( -0.0560452742407442, -0.0278764492096935, -0.00904030408215007 ) ); +#205 = CARTESIAN_POINT( '', ( -0.0551472913416803, -0.0278364057016355, -0.00929077381555528 ) ); +#206 = CARTESIAN_POINT( '', ( -0.0535084759563641, -0.0277760113318876, -0.00968210369225548 ) ); +#207 = CARTESIAN_POINT( '', ( -0.0527721739814236, -0.0277555814316387, -0.00982168333021428 ) ); +#208 = CARTESIAN_POINT( '', ( -0.0506858219764946, -0.0277098458928896, -0.0101586981015100 ) ); +#209 = CARTESIAN_POINT( '', ( -0.0495196773685441, -0.0277009175472106, -0.0102665370910013 ) ); +#210 = CARTESIAN_POINT( '', ( -0.0473523061484450, -0.0276965812878753, -0.0104077498104480 ) ); +#211 = CARTESIAN_POINT( '', ( -0.0463762539402309, -0.0277021920492007, -0.0104340808287343 ) ); +#212 = CARTESIAN_POINT( '', ( -0.0445314617524677, -0.0277190021915799, -0.0104466274020195 ) ); +#213 = CARTESIAN_POINT( '', ( -0.0436645761667178, -0.0277304341506706, -0.0104315875510217 ) ); +#214 = CARTESIAN_POINT( '', ( -0.0420048500686268, -0.0277550661519189, -0.0103781292878846 ) ); +#215 = CARTESIAN_POINT( '', ( -0.0412153167929905, -0.0277682894648764, -0.0103395716320095 ) ); +#216 = CARTESIAN_POINT( '', ( -0.0396786710199361, -0.0277945574287578, -0.0102479690463288 ) ); +#217 = CARTESIAN_POINT( '', ( -0.0389276419987500, -0.0278076740418744, -0.0101945069800269 ) ); +#218 = CARTESIAN_POINT( '', ( -0.0367367541794043, -0.0278446756634191, -0.0100209781497018 ) ); +#219 = CARTESIAN_POINT( '', ( -0.0353658181285591, -0.0278661077444651, -0.00988896227223852 ) ); +#220 = CARTESIAN_POINT( '', ( -0.0327021831156756, -0.0278972067393815, -0.00961689290300660 ) ); +#221 = CARTESIAN_POINT( '', ( -0.0314254562098134, -0.0279065180507469, -0.00947903206576338 ) ); +#222 = CARTESIAN_POINT( '', ( -0.0288670234126698, -0.0279114515731687, -0.00920120653513699 ) ); +#223 = CARTESIAN_POINT( '', ( -0.0275995711568395, -0.0279074984997185, -0.00906101291212786 ) ); +#224 = CARTESIAN_POINT( '', ( -0.0250544115885846, -0.0278872388622220, -0.00877575322083382 ) ); +#225 = CARTESIAN_POINT( '', ( -0.0237799013506103, -0.0278709223868793, -0.00863094383113887 ) ); +#226 = CARTESIAN_POINT( '', ( -0.0174099365910672, -0.0277603483038352, -0.00789751580841742 ) ); +#227 = CARTESIAN_POINT( '', ( -0.0123072138172379, -0.0275783949241999, -0.00728085775544191 ) ); +#228 = CARTESIAN_POINT( '', ( -0.00208009819624626, -0.0270715002177851, -0.00598071181933509 ) ); +#229 = CARTESIAN_POINT( '', ( 0.00304583943413600, -0.0267478443117049, -0.00529580321902737 ) ); +#230 = CARTESIAN_POINT( '', ( 0.0132716921228300, -0.0259922941640531, -0.00383393039891068 ) ); +#231 = CARTESIAN_POINT( '', ( 0.0183572511870987, -0.0255597142074450, -0.00306321507609866 ) ); +#232 = CARTESIAN_POINT( '', ( 0.0284799256287902, -0.0245867880430304, -0.00149751881323853 ) ); +#233 = CARTESIAN_POINT( '', ( 0.0335173561999578, -0.0240462927992094, -0.000700016694566884 ) ); +#234 = CARTESIAN_POINT( '', ( 0.0436249889767960, -0.0228523255961816, 0.000860081144564746 ) ); +#235 = CARTESIAN_POINT( '', ( 0.0486747749560920, -0.0221989651941210, 0.00162811957750628 ) ); +#236 = CARTESIAN_POINT( '', ( 0.0563422902165441, -0.0211520665244603, 0.00262747460243457 ) ); +#237 = CARTESIAN_POINT( '', ( 0.0589094699403461, -0.0207927787442985, 0.00293434889074103 ) ); +#238 = CARTESIAN_POINT( '', ( 0.0640917763588146, -0.0200697254662340, 0.00343478326499825 ) ); +#239 = CARTESIAN_POINT( '', ( 0.0667058694409421, -0.0197056333265326, 0.00363077968371243 ) ); +#240 = CARTESIAN_POINT( '', ( 0.0693533048033715, -0.0193591210695326, 0.00370415160432458 ) ); +#241 = CARTESIAN_POINT( '', ( -0.0541642509566917, -0.0247604389928616, 0.0166290129324165 ) ); +#242 = CARTESIAN_POINT( '', ( -0.0540928858860643, -0.0254907806172192, 0.0155442685511894 ) ); +#243 = CARTESIAN_POINT( '', ( -0.0540207188392731, -0.0261264890960852, 0.0144473341852541 ) ); +#244 = CARTESIAN_POINT( '', ( -0.0538748073167880, -0.0272379215596894, 0.0122294886375731 ) ); +#245 = CARTESIAN_POINT( '', ( -0.0538023774289274, -0.0277040842627183, 0.0111285591045261 ) ); +#246 = CARTESIAN_POINT( '', ( -0.0536938879863540, -0.0282942466864352, 0.00947952671089024 ) ); +#247 = CARTESIAN_POINT( '', ( -0.0536579650476316, -0.0284718965133879, 0.00893350040432491 ) ); +#248 = CARTESIAN_POINT( '', ( -0.0536025072988408, -0.0287190092572910, 0.00809054626920878 ) ); +#249 = CARTESIAN_POINT( '', ( -0.0535837909420826, -0.0287979136070635, 0.00780605887712973 ) ); +#250 = CARTESIAN_POINT( '', ( -0.0535458726710120, -0.0289484146639097, 0.00722970365008470 ) ); +#251 = CARTESIAN_POINT( '', ( -0.0535263858025668, -0.0290209522830422, 0.00693350453104635 ) ); +#252 = CARTESIAN_POINT( '', ( -0.0534699436160619, -0.0292176071660863, 0.00607558700734159 ) ); +#253 = CARTESIAN_POINT( '', ( -0.0534346963834103, -0.0293228802143663, 0.00553983138866790 ) ); +#254 = CARTESIAN_POINT( '', ( -0.0533846769144392, -0.0294534054744383, 0.00477953874922391 ) ); +#255 = CARTESIAN_POINT( '', ( -0.0533647066265607, -0.0295025494539084, 0.00447599168659322 ) ); +#256 = CARTESIAN_POINT( '', ( -0.0533152345525605, -0.0296072614656064, 0.00372401941465751 ) ); +#257 = CARTESIAN_POINT( '', ( -0.0532861638882399, -0.0296618096875129, 0.00328214722846862 ) ); +#258 = CARTESIAN_POINT( '', ( -0.0532497758982434, -0.0297135948708384, 0.00272905217314232 ) ); +#259 = CARTESIAN_POINT( '', ( -0.0532472502619092, -0.0297171156631480, 0.00269066266692799 ) ); +#260 = CARTESIAN_POINT( '', ( -0.0532434219605695, -0.0297223362628699, 0.00263247273828741 ) ); +#261 = CARTESIAN_POINT( '', ( -0.0532421392505157, -0.0297240663248522, 0.00261297562980983 ) ); +#262 = CARTESIAN_POINT( '', ( -0.0532395605023151, -0.0297275051247002, 0.00257377882672071 ) ); +#263 = CARTESIAN_POINT( '', ( -0.0532383716250275, -0.0297274716334923, 0.00258497949634849 ) ); +#264 = CARTESIAN_POINT( '', ( -0.0532323274113530, -0.0297305123843142, 0.00258689043963365 ) ); +#265 = CARTESIAN_POINT( '', ( -0.0532276696802113, -0.0297332153789603, 0.00258876480809111 ) ); +#266 = CARTESIAN_POINT( '', ( -0.0532143593111828, -0.0297422374860775, 0.00259537026379171 ) ); +#267 = CARTESIAN_POINT( '', ( -0.0532062806917272, -0.0297496604881986, 0.00260124139391619 ) ); +#268 = CARTESIAN_POINT( '', ( -0.0531870375068206, -0.0297743055494966, 0.00262033571182521 ) ); +#269 = CARTESIAN_POINT( '', ( -0.0531802798634318, -0.0297934925621957, 0.00263458765661844 ) ); +#270 = CARTESIAN_POINT( '', ( -0.0531718719519608, -0.0298602606793359, 0.00267461256139442 ) ); +#271 = CARTESIAN_POINT( '', ( -0.0531837168299934, -0.0299208539924116, 0.00269933242328981 ) ); +#272 = CARTESIAN_POINT( '', ( -0.0532444757471666, -0.0301352776465574, 0.00270423977130782 ) ); +#273 = CARTESIAN_POINT( '', ( -0.0533160097698169, -0.0303227724429072, 0.00260289274570820 ) ); +#274 = CARTESIAN_POINT( '', ( -0.0532566085889412, -0.0306625132578309, 0.00214933838531748 ) ); +#275 = CARTESIAN_POINT( '', ( -0.0531190904820338, -0.0308063726644161, 0.00182261750446362 ) ); +#276 = CARTESIAN_POINT( '', ( -0.0526449210956708, -0.0310094139234238, 0.00120496644327082 ) ); +#277 = CARTESIAN_POINT( '', ( -0.0523207124653370, -0.0310756286021963, 0.000913090377670255 ) ); +#278 = CARTESIAN_POINT( '', ( -0.0516100577044887, -0.0311701190130074, 0.000428112151042987 ) ); +#279 = CARTESIAN_POINT( '', ( -0.0512232155428389, -0.0311995600186201, 0.000229246426801847 ) ); +#280 = CARTESIAN_POINT( '', ( -0.0504497852395880, -0.0312431839448264, -9.35190532440663E-05 ) ); +#281 = CARTESIAN_POINT( '', ( -0.0500646893976891, -0.0312572325074276, -0.000218756236476702 ) ); +#282 = CARTESIAN_POINT( '', ( -0.0489064655067526, -0.0312905691279647, -0.000529942810438687 ) ); +#283 = CARTESIAN_POINT( '', ( -0.0481597558280874, -0.0313005442736259, -0.000646824063189471 ) ); +#284 = CARTESIAN_POINT( '', ( -0.0466846362587980, -0.0313162363909651, -0.000804280438297384 ) ); +#285 = CARTESIAN_POINT( '', ( -0.0459660554999862, -0.0313208488542549, -0.000841041817614910 ) ); +#286 = CARTESIAN_POINT( '', ( -0.0445487133772001, -0.0313271891766754, -0.000870485769930532 ) ); +#287 = CARTESIAN_POINT( '', ( -0.0438490951932218, -0.0313287597605274, -0.000862341850999632 ) ); +#288 = CARTESIAN_POINT( '', ( -0.0424677757977868, -0.0313290841674978, -0.000818778373880951 ) ); +#289 = CARTESIAN_POINT( '', ( -0.0417882544598426, -0.0313277984599981, -0.000783315880143320 ) ); +#290 = CARTESIAN_POINT( '', ( -0.0404347579064744, -0.0313222091065412, -0.000694848094175399 ) ); +#291 = CARTESIAN_POINT( '', ( -0.0397567284535381, -0.0313178857755183, -0.000641318942143141 ) ); +#292 = CARTESIAN_POINT( '', ( -0.0377392969056140, -0.0312998069690201, -0.000464462563639454 ) ); +#293 = CARTESIAN_POINT( '', ( -0.0364274223065419, -0.0312810241493483, -0.000326591323171962 ) ); +#294 = CARTESIAN_POINT( '', ( -0.0337985551275461, -0.0312283828059239, -4.15594289670996E-05 ) ); +#295 = CARTESIAN_POINT( '', ( -0.0324853978418817, -0.0311944849320473, 0.000103628829725752 ) ); +#296 = CARTESIAN_POINT( '', ( -0.0298802824343279, -0.0311096263137959, 0.000384425999479647 ) ); +#297 = CARTESIAN_POINT( '', ( -0.0285895538212730, -0.0310591391972878, 0.000521593037774900 ) ); +#298 = CARTESIAN_POINT( '', ( -0.0259980519641140, -0.0309424616162730, 0.000792741953544227 ) ); +#299 = CARTESIAN_POINT( '', ( -0.0247004030784956, -0.0308762511326939, 0.000926361532265652 ) ); +#300 = CARTESIAN_POINT( '', ( -0.0181855741841940, -0.0305071299027447, 0.00158578582008351 ) ); +#301 = CARTESIAN_POINT( '', ( -0.0129926489777095, -0.0300939956579190, 0.00207282683911527 ) ); +#302 = CARTESIAN_POINT( '', ( -0.00263700009743053, -0.0290966719547919, 0.00297843840397611 ) ); +#303 = CARTESIAN_POINT( '', ( 0.00253865910116842, -0.0285093522539465, 0.00339863214374307 ) ); +#304 = CARTESIAN_POINT( '', ( 0.0128473672367784, -0.0272142005036743, 0.00419979499255808 ) ); +#305 = CARTESIAN_POINT( '', ( 0.0180152912087230, -0.0264990417352235, 0.00457587013973826 ) ); +#306 = CARTESIAN_POINT( '', ( 0.0282872128613586, -0.0250025739801457, 0.00517804344527355 ) ); +#307 = CARTESIAN_POINT( '', ( 0.0334253570456015, -0.0242139573043199, 0.00540470576967906 ) ); +#308 = CARTESIAN_POINT( '', ( 0.0436983176435042, -0.0226434558891338, 0.00561267512374345 ) ); +#309 = CARTESIAN_POINT( '', ( 0.0488441228963437, -0.0218588528811304, 0.00558877595035438 ) ); +#310 = CARTESIAN_POINT( '', ( 0.0565031701563695, -0.0208015586059076, 0.00522800465003920 ) ); +#311 = CARTESIAN_POINT( '', ( 0.0590822573395741, -0.0204657298072173, 0.00504788125137986 ) ); +#312 = CARTESIAN_POINT( '', ( 0.0642435455523163, -0.0198569531737212, 0.00452233142116073 ) ); +#313 = CARTESIAN_POINT( '', ( 0.0668124256934670, -0.0195878429941818, 0.00417645385822074 ) ); +#314 = CARTESIAN_POINT( '', ( 0.0693533048033715, -0.0193591210695326, 0.00370415160432459 ) ); +#315 = CARTESIAN_POINT( '', ( -0.0546610390339507, -0.0365696029253114, 0.0241801590416303 ) ); +#316 = CARTESIAN_POINT( '', ( -0.0545543843367636, -0.0376178562681313, 0.0225590146572133 ) ); +#317 = CARTESIAN_POINT( '', ( -0.0544468826885366, -0.0385214967040836, 0.0209249966726782 ) ); +#318 = CARTESIAN_POINT( '', ( -0.0542300947171114, -0.0400874380733963, 0.0176298337613946 ) ); +#319 = CARTESIAN_POINT( '', ( -0.0541227629261336, -0.0407358835491193, 0.0159983975958801 ) ); +#320 = CARTESIAN_POINT( '', ( -0.0539624875474870, -0.0415452885835383, 0.0135622223789793 ) ); +#321 = CARTESIAN_POINT( '', ( -0.0539094608951785, -0.0417867952169023, 0.0127562207505318 ) ); +#322 = CARTESIAN_POINT( '', ( -0.0538277330505419, -0.0421190494119364, 0.0115139628858768 ) ); +#323 = CARTESIAN_POINT( '', ( -0.0538001629570136, -0.0422244968431589, 0.0110948992770531 ) ); +#324 = CARTESIAN_POINT( '', ( -0.0537443489185469, -0.0424241941806301, 0.0102465295622786 ) ); +#325 = CARTESIAN_POINT( '', ( -0.0537156862029461, -0.0425196560841232, 0.00981085816979537 ) ); +#326 = CARTESIAN_POINT( '', ( -0.0536327071340396, -0.0427762131643736, 0.00854958177850805 ) ); +#327 = CARTESIAN_POINT( '', ( -0.0535809848247393, -0.0429102470487744, 0.00776340607802180 ) ); +#328 = CARTESIAN_POINT( '', ( -0.0535076812296804, -0.0430723555661763, 0.00664919625303024 ) ); +#329 = CARTESIAN_POINT( '', ( -0.0534784171980682, -0.0431327534141550, 0.00620438489671283 ) ); +#330 = CARTESIAN_POINT( '', ( -0.0534060205776309, -0.0432575070916431, 0.00510396102633353 ) ); +#331 = CARTESIAN_POINT( '', ( -0.0533635036659127, -0.0433206152049582, 0.00445770676381564 ) ); +#332 = CARTESIAN_POINT( '', ( -0.0533103980369430, -0.0433755480974604, 0.00365050469531111 ) ); +#333 = CARTESIAN_POINT( '', ( -0.0533067109742278, -0.0433792552588394, 0.00359446158447348 ) ); +#334 = CARTESIAN_POINT( '', ( -0.0533011228707824, -0.0433847052670054, 0.00350952277953703 ) ); +#335 = CARTESIAN_POINT( '', ( -0.0532992505847880, -0.0433865034828029, 0.00348106415552890 ) ); +#336 = CARTESIAN_POINT( '', ( -0.0532954867512713, -0.0433900613705857, 0.00342385413355764 ) ); +#337 = CARTESIAN_POINT( '', ( -0.0532958044384286, -0.0433918235167558, 0.00342878814864310 ) ); +#338 = CARTESIAN_POINT( '', ( -0.0532934058019060, -0.0434005677248049, 0.00339428916354447 ) ); +#339 = CARTESIAN_POINT( '', ( -0.0532912253948317, -0.0434073302003497, 0.00336644654110380 ) ); +#340 = CARTESIAN_POINT( '', ( -0.0532838443093318, -0.0434267906183907, 0.00328226176219134 ) ); +#341 = CARTESIAN_POINT( '', ( -0.0532776417455970, -0.0434388222723248, 0.00322420027067874 ) ); +#342 = CARTESIAN_POINT( '', ( -0.0532569961541920, -0.0434684522884171, 0.00306052519148980 ) ); +#343 = CARTESIAN_POINT( '', ( -0.0532408996223807, -0.0434803895629964, 0.00296448436287202 ) ); +#344 = CARTESIAN_POINT( '', ( -0.0531856345509266, -0.0435011889864556, 0.00268867052183029 ) ); +#345 = CARTESIAN_POINT( '', ( -0.0531365482418410, -0.0434940327746878, 0.00251199801243281 ) ); +#346 = CARTESIAN_POINT( '', ( -0.0529591254986711, -0.0434136081372272, 0.00201559957676413 ) ); +#347 = CARTESIAN_POINT( '', ( -0.0527991076383562, -0.0432797945122916, 0.00172025368355520 ) ); +#348 = CARTESIAN_POINT( '', ( -0.0523976769991102, -0.0429473208257671, 0.00118147378184144 ) ); +#349 = CARTESIAN_POINT( '', ( -0.0521593197030119, -0.0427578609789788, 0.000944613165741870 ) ); +#350 = CARTESIAN_POINT( '', ( -0.0516397600238076, -0.0424337796496477, 0.000536167217203414 ) ); +#351 = CARTESIAN_POINT( '', ( -0.0513579404697644, -0.0422964829206747, 0.000363017689249577 ) ); +#352 = CARTESIAN_POINT( '', ( -0.0507688054226550, -0.0420770122780616, 6.50193333880485E-05 ) ); +#353 = CARTESIAN_POINT( '', ( -0.0504615907882494, -0.0419933259926960, -5.97038080293960E-05 ) ); +#354 = CARTESIAN_POINT( '', ( -0.0498389858082419, -0.0418610781953754, -0.000271411935586759 ) ); +#355 = CARTESIAN_POINT( '', ( -0.0495266848203537, -0.0418124449645948, -0.000357820030714355 ) ); +#356 = CARTESIAN_POINT( '', ( -0.0485658315497535, -0.0416938692733487, -0.000581014693949919 ) ); +#357 = CARTESIAN_POINT( '', ( -0.0479242315256405, -0.0416532467443129, -0.000675394701242241 ) ); +#358 = CARTESIAN_POINT( '', ( -0.0466130600142234, -0.0415952100369516, -0.000806402532980248 ) ); +#359 = CARTESIAN_POINT( '', ( -0.0459550642097339, -0.0415797857896056, -0.000840552568345336 ) ); +#360 = CARTESIAN_POINT( '', ( -0.0446305846101389, -0.0415581067334646, -0.000869429667588777 ) ); +#361 = CARTESIAN_POINT( '', ( -0.0439639731928960, -0.0415522769328363, -0.000863752597228429 ) ); +#362 = CARTESIAN_POINT( '', ( -0.0426302996737868, -0.0415429890655192, -0.000825355581689191 ) ); +#363 = CARTESIAN_POINT( '', ( -0.0419657094009150, -0.0415395754458813, -0.000792734789455270 ) ); +#364 = CARTESIAN_POINT( '', ( -0.0406298777088851, -0.0415315960864344, -0.000708832258471119 ) ); +#365 = CARTESIAN_POINT( '', ( -0.0399546843751176, -0.0415271702319105, -0.000657106786645576 ) ); +#366 = CARTESIAN_POINT( '', ( -0.0379333172631551, -0.0415085691837988, -0.000483545315485825 ) ); +#367 = CARTESIAN_POINT( '', ( -0.0366007769381703, -0.0414887685354734, -0.000344926032121224 ) ); +#368 = CARTESIAN_POINT( '', ( -0.0339066851857667, -0.0414251787568609, -5.36582304640227E-05 ) ); +#369 = CARTESIAN_POINT( '', ( -0.0325458783577641, -0.0413807195980484, 9.70916979150059E-05 ) ); +#370 = CARTESIAN_POINT( '', ( -0.0298571361924550, -0.0412654024016009, 0.000386938542240794 ) ); +#371 = CARTESIAN_POINT( '', ( -0.0285264500478985, -0.0411950395942611, 0.000528307484000488 ) ); +#372 = CARTESIAN_POINT( '', ( -0.0258576964800841, -0.0410301660998887, 0.000807296592032621 ) ); +#373 = CARTESIAN_POINT( '', ( -0.0245229832876291, -0.0409356092959497, 0.000944542515443657 ) ); +#374 = CARTESIAN_POINT( '', ( -0.0178622362935748, -0.0404051504152805, 0.00161740850194910 ) ); +#375 = CARTESIAN_POINT( '', ( -0.0125598360520481, -0.0397955646735621, 0.00211275314425499 ) ); +#376 = CARTESIAN_POINT( '', ( -0.00203962334103179, -0.0382787268670233, 0.00302811289043587 ) ); +#377 = CARTESIAN_POINT( '', ( 0.00317539928664909, -0.0373727793181302, 0.00345015821870362 ) ); +#378 = CARTESIAN_POINT( '', ( 0.0135429761878093, -0.0353207863866082, 0.00425115848547986 ) ); +#379 = CARTESIAN_POINT( '', ( 0.0187076500880150, -0.0341729556019719, 0.00462267431181238 ) ); +#380 = CARTESIAN_POINT( '', ( 0.0289528783971528, -0.0316588134411239, 0.00520872320256118 ) ); +#381 = CARTESIAN_POINT( '', ( 0.0340360440496324, -0.0302922783951462, 0.00542624655913420 ) ); +#382 = CARTESIAN_POINT( '', ( 0.0441755235454418, -0.0273738365643854, 0.00561053420907344 ) ); +#383 = CARTESIAN_POINT( '', ( 0.0492128672660333, -0.0258220955287610, 0.00558115454022278 ) ); +#384 = CARTESIAN_POINT( '', ( 0.0567757515649417, -0.0234153874619387, 0.00520917386539241 ) ); +#385 = CARTESIAN_POINT( '', ( 0.0592933982529094, -0.0226009900139395, 0.00502981481237106 ) ); +#386 = CARTESIAN_POINT( '', ( 0.0643289327612552, -0.0209708423417502, 0.00450969444119862 ) ); +#387 = CARTESIAN_POINT( '', ( 0.0668462332366741, -0.0201552116105254, 0.00417016966394554 ) ); +#388 = CARTESIAN_POINT( '', ( 0.0693533048033715, -0.0193591210695326, 0.00370415160432459 ) ); +#394 = SURFACE_SIDE_STYLE( '', ( #1097 ) ); +#395 = EDGE_LOOP( '', ( #1098, #1099, #1100, #1101 ) ); +#398 = CARTESIAN_POINT( '', ( -0.0680974975178552, 0.0239894454205930, 0.0152172169424728 ) ); +#399 = CARTESIAN_POINT( '', ( -0.0680032181105161, 0.0246759447506517, 0.0141527504259518 ) ); +#400 = CARTESIAN_POINT( '', ( -0.0679071745984749, 0.0252681551165487, 0.0130804649572200 ) ); +#401 = CARTESIAN_POINT( '', ( -0.0677114375662217, 0.0262957543466452, 0.0109188252235341 ) ); +#402 = CARTESIAN_POINT( '', ( -0.0676135711148685, 0.0267220039426466, 0.00984893477481778 ) ); +#403 = CARTESIAN_POINT( '', ( -0.0674659341255867, 0.0272554769347834, 0.00825144176784388 ) ); +#404 = CARTESIAN_POINT( '', ( -0.0674168423020544, 0.0274149309854798, 0.00772294009365937 ) ); +#405 = CARTESIAN_POINT( '', ( -0.0673407771457563, 0.0276347978686475, 0.00690836927164075 ) ); +#406 = CARTESIAN_POINT( '', ( -0.0673150526819579, 0.0277046677148782, 0.00663357911931613 ) ); +#407 = CARTESIAN_POINT( '', ( -0.0672628439234829, 0.0278371859086408, 0.00607726647192764 ) ); +#408 = CARTESIAN_POINT( '', ( -0.0672359649971746, 0.0279006430611897, 0.00579156963124010 ) ); +#409 = CARTESIAN_POINT( '', ( -0.0671579390310775, 0.0280715304356377, 0.00496443909377648 ) ); +#410 = CARTESIAN_POINT( '', ( -0.0671090148630545, 0.0281613026512849, 0.00444883237524070 ) ); +#411 = CARTESIAN_POINT( '', ( -0.0670392282840175, 0.0282706195966596, 0.00371801618676354 ) ); +#412 = CARTESIAN_POINT( '', ( -0.0670113818393531, 0.0283114175644096, 0.00342623695078520 ) ); +#413 = CARTESIAN_POINT( '', ( -0.0669425804655466, 0.0283960926970616, 0.00270426305648969 ) ); +#414 = CARTESIAN_POINT( '', ( -0.0669022014035962, 0.0284391349009694, 0.00228020869590055 ) ); +#415 = CARTESIAN_POINT( '', ( -0.0668517974488390, 0.0284771855782259, 0.00175042341340948 ) ); +#416 = CARTESIAN_POINT( '', ( -0.0668482980989998, 0.0284797571771000, 0.00171364048952352 ) ); +#417 = CARTESIAN_POINT( '', ( -0.0668429947056285, 0.0284835438486693, 0.00165789152716249 ) ); +#418 = CARTESIAN_POINT( '', ( -0.0668412178461092, 0.0284847942825137, 0.00163921277724750 ) ); +#419 = CARTESIAN_POINT( '', ( -0.0668376459183344, 0.0284872705069466, 0.00160166282863586 ) ); +#420 = CARTESIAN_POINT( '', ( -0.0668358241958317, 0.0284884986717803, 0.00158279446174341 ) ); +#421 = CARTESIAN_POINT( '', ( -0.0668263032976867, 0.0284946078539997, 0.00148801116844471 ) ); +#422 = CARTESIAN_POINT( '', ( -0.0668175855721837, 0.0284993745805055, 0.00141074777256664 ) ); +#423 = CARTESIAN_POINT( '', ( -0.0667877732050374, 0.0285132384613731, 0.00117471357936271 ) ); +#424 = CARTESIAN_POINT( '', ( -0.0667623360526505, 0.0285220241268447, 0.00100850945384203 ) ); +#425 = CARTESIAN_POINT( '', ( -0.0666757898022021, 0.0285444344992712, 0.000530812897485930 ) ); +#426 = CARTESIAN_POINT( '', ( -0.0666061727573671, 0.0285545921274810, 0.000239015749984270 ) ); +#427 = CARTESIAN_POINT( '', ( -0.0663591024405948, 0.0285762855912515, -0.000621138281703585 ) ); +#428 = CARTESIAN_POINT( '', ( -0.0661293851234302, 0.0285787804485868, -0.00120627291414549 ) ); +#429 = CARTESIAN_POINT( '', ( -0.0652606207134267, 0.0285519956194662, -0.00290664576490436 ) ); +#430 = CARTESIAN_POINT( '', ( -0.0644263448901085, 0.0284877724269739, -0.00399134967968778 ) ); +#431 = CARTESIAN_POINT( '', ( -0.0624150482720823, 0.0283203901458413, -0.00588790513868986 ) ); +#432 = CARTESIAN_POINT( '', ( -0.0612709160852482, 0.0282222803780746, -0.00667265988017431 ) ); +#433 = CARTESIAN_POINT( '', ( -0.0590677341404702, 0.0280555966984728, -0.00789323608605264 ) ); +#434 = CARTESIAN_POINT( '', ( -0.0580036997004594, 0.0279856043625949, -0.00834200514118174 ) ); +#435 = CARTESIAN_POINT( '', ( -0.0560452742407442, 0.0278764492096935, -0.00904030408215009 ) ); +#436 = CARTESIAN_POINT( '', ( -0.0551472913416803, 0.0278364057016355, -0.00929077381555530 ) ); +#437 = CARTESIAN_POINT( '', ( -0.0535084759563641, 0.0277760113318876, -0.00968210369225549 ) ); +#438 = CARTESIAN_POINT( '', ( -0.0527721739814236, 0.0277555814316387, -0.00982168333021429 ) ); +#439 = CARTESIAN_POINT( '', ( -0.0506858219764946, 0.0277098458928896, -0.0101586981015100 ) ); +#440 = CARTESIAN_POINT( '', ( -0.0495196773685441, 0.0277009175472106, -0.0102665370910013 ) ); +#441 = CARTESIAN_POINT( '', ( -0.0473523061484450, 0.0276965812878753, -0.0104077498104480 ) ); +#442 = CARTESIAN_POINT( '', ( -0.0463762539402309, 0.0277021920492007, -0.0104340808287343 ) ); +#443 = CARTESIAN_POINT( '', ( -0.0445314617524677, 0.0277190021915799, -0.0104466274020195 ) ); +#444 = CARTESIAN_POINT( '', ( -0.0436645761667178, 0.0277304341506706, -0.0104315875510217 ) ); +#445 = CARTESIAN_POINT( '', ( -0.0420048500686268, 0.0277550661519189, -0.0103781292878846 ) ); +#446 = CARTESIAN_POINT( '', ( -0.0412153167929905, 0.0277682894648764, -0.0103395716320095 ) ); +#447 = CARTESIAN_POINT( '', ( -0.0396786710199361, 0.0277945574287578, -0.0102479690463288 ) ); +#448 = CARTESIAN_POINT( '', ( -0.0389276419987500, 0.0278076740418744, -0.0101945069800269 ) ); +#449 = CARTESIAN_POINT( '', ( -0.0367367541794043, 0.0278446756634191, -0.0100209781497019 ) ); +#450 = CARTESIAN_POINT( '', ( -0.0353658181285591, 0.0278661077444650, -0.00988896227223853 ) ); +#451 = CARTESIAN_POINT( '', ( -0.0327021831156756, 0.0278972067393815, -0.00961689290300661 ) ); +#452 = CARTESIAN_POINT( '', ( -0.0314254562098134, 0.0279065180507469, -0.00947903206576340 ) ); +#453 = CARTESIAN_POINT( '', ( -0.0288670234126698, 0.0279114515731687, -0.00920120653513700 ) ); +#454 = CARTESIAN_POINT( '', ( -0.0275995711568395, 0.0279074984997185, -0.00906101291212788 ) ); +#455 = CARTESIAN_POINT( '', ( -0.0250544115885846, 0.0278872388622220, -0.00877575322083384 ) ); +#456 = CARTESIAN_POINT( '', ( -0.0237799013506103, 0.0278709223868793, -0.00863094383113889 ) ); +#457 = CARTESIAN_POINT( '', ( -0.0174099365910672, 0.0277603483038352, -0.00789751580841744 ) ); +#458 = CARTESIAN_POINT( '', ( -0.0123072138172379, 0.0275783949241999, -0.00728085775544192 ) ); +#459 = CARTESIAN_POINT( '', ( -0.00208009819624626, 0.0270715002177850, -0.00598071181933511 ) ); +#460 = CARTESIAN_POINT( '', ( 0.00304583943413600, 0.0267478443117049, -0.00529580321902739 ) ); +#461 = CARTESIAN_POINT( '', ( 0.0132716921228300, 0.0259922941640531, -0.00383393039891069 ) ); +#462 = CARTESIAN_POINT( '', ( 0.0183572511870987, 0.0255597142074450, -0.00306321507609868 ) ); +#463 = CARTESIAN_POINT( '', ( 0.0284799256287902, 0.0245867880430304, -0.00149751881323854 ) ); +#464 = CARTESIAN_POINT( '', ( 0.0335173561999578, 0.0240462927992094, -0.000700016694566899 ) ); +#465 = CARTESIAN_POINT( '', ( 0.0436249889767960, 0.0228523255961816, 0.000860081144564732 ) ); +#466 = CARTESIAN_POINT( '', ( 0.0486747749560920, 0.0221989651941210, 0.00162811957750627 ) ); +#467 = CARTESIAN_POINT( '', ( 0.0563422902165441, 0.0211520665244603, 0.00262747460243455 ) ); +#468 = CARTESIAN_POINT( '', ( 0.0589094699403461, 0.0207927787442985, 0.00293434889074102 ) ); +#469 = CARTESIAN_POINT( '', ( 0.0640917763588146, 0.0200697254662340, 0.00343478326499824 ) ); +#470 = CARTESIAN_POINT( '', ( 0.0667058694409421, 0.0197056333265326, 0.00363077968371242 ) ); +#471 = CARTESIAN_POINT( '', ( 0.0693533048033715, 0.0193591210695326, 0.00370415160432457 ) ); +#472 = CARTESIAN_POINT( '', ( -0.0541642509566917, 0.0247604389928616, 0.0166290129324165 ) ); +#473 = CARTESIAN_POINT( '', ( -0.0540928858860643, 0.0254907806172192, 0.0155442685511894 ) ); +#474 = CARTESIAN_POINT( '', ( -0.0540207188392731, 0.0261264890960852, 0.0144473341852541 ) ); +#475 = CARTESIAN_POINT( '', ( -0.0538748073167880, 0.0272379215596894, 0.0122294886375731 ) ); +#476 = CARTESIAN_POINT( '', ( -0.0538023774289274, 0.0277040842627183, 0.0111285591045260 ) ); +#477 = CARTESIAN_POINT( '', ( -0.0536938879863540, 0.0282942466864352, 0.00947952671089022 ) ); +#478 = CARTESIAN_POINT( '', ( -0.0536579650476316, 0.0284718965133879, 0.00893350040432489 ) ); +#479 = CARTESIAN_POINT( '', ( -0.0536025072988408, 0.0287190092572910, 0.00809054626920875 ) ); +#480 = CARTESIAN_POINT( '', ( -0.0535837909420826, 0.0287979136070635, 0.00780605887712971 ) ); +#481 = CARTESIAN_POINT( '', ( -0.0535458726710120, 0.0289484146639097, 0.00722970365008468 ) ); +#482 = CARTESIAN_POINT( '', ( -0.0535263858025668, 0.0290209522830422, 0.00693350453104633 ) ); +#483 = CARTESIAN_POINT( '', ( -0.0534699436160619, 0.0292176071660863, 0.00607558700734157 ) ); +#484 = CARTESIAN_POINT( '', ( -0.0534346963834103, 0.0293228802143663, 0.00553983138866788 ) ); +#485 = CARTESIAN_POINT( '', ( -0.0533846769144392, 0.0294534054744383, 0.00477953874922389 ) ); +#486 = CARTESIAN_POINT( '', ( -0.0533647066265607, 0.0295025494539084, 0.00447599168659321 ) ); +#487 = CARTESIAN_POINT( '', ( -0.0533152345525605, 0.0296072614656064, 0.00372401941465749 ) ); +#488 = CARTESIAN_POINT( '', ( -0.0532861638882399, 0.0296618096875129, 0.00328214722846860 ) ); +#489 = CARTESIAN_POINT( '', ( -0.0532497758982434, 0.0297135948708384, 0.00272905217314230 ) ); +#490 = CARTESIAN_POINT( '', ( -0.0532472502619092, 0.0297171156631480, 0.00269066266692797 ) ); +#491 = CARTESIAN_POINT( '', ( -0.0532434219605695, 0.0297223362628699, 0.00263247273828740 ) ); +#492 = CARTESIAN_POINT( '', ( -0.0532421392505157, 0.0297240663248522, 0.00261297562980981 ) ); +#493 = CARTESIAN_POINT( '', ( -0.0532395605023151, 0.0297275051247002, 0.00257377882672070 ) ); +#494 = CARTESIAN_POINT( '', ( -0.0532383716250275, 0.0297274716334923, 0.00258497949634848 ) ); +#495 = CARTESIAN_POINT( '', ( -0.0532323274113530, 0.0297305123843142, 0.00258689043963362 ) ); +#496 = CARTESIAN_POINT( '', ( -0.0532276696802113, 0.0297332153789603, 0.00258876480809110 ) ); +#497 = CARTESIAN_POINT( '', ( -0.0532143593111828, 0.0297422374860775, 0.00259537026379169 ) ); +#498 = CARTESIAN_POINT( '', ( -0.0532062806917272, 0.0297496604881986, 0.00260124139391617 ) ); +#499 = CARTESIAN_POINT( '', ( -0.0531870375068206, 0.0297743055494966, 0.00262033571182519 ) ); +#500 = CARTESIAN_POINT( '', ( -0.0531802798634318, 0.0297934925621957, 0.00263458765661842 ) ); +#501 = CARTESIAN_POINT( '', ( -0.0531718719519608, 0.0298602606793359, 0.00267461256139440 ) ); +#502 = CARTESIAN_POINT( '', ( -0.0531837168299934, 0.0299208539924116, 0.00269933242328979 ) ); +#503 = CARTESIAN_POINT( '', ( -0.0532444757471666, 0.0301352776465574, 0.00270423977130780 ) ); +#504 = CARTESIAN_POINT( '', ( -0.0533160097698169, 0.0303227724429072, 0.00260289274570818 ) ); +#505 = CARTESIAN_POINT( '', ( -0.0532566085889412, 0.0306625132578309, 0.00214933838531746 ) ); +#506 = CARTESIAN_POINT( '', ( -0.0531190904820338, 0.0308063726644161, 0.00182261750446360 ) ); +#507 = CARTESIAN_POINT( '', ( -0.0526449210956708, 0.0310094139234238, 0.00120496644327080 ) ); +#508 = CARTESIAN_POINT( '', ( -0.0523207124653370, 0.0310756286021963, 0.000913090377670236 ) ); +#509 = CARTESIAN_POINT( '', ( -0.0516100577044887, 0.0311701190130074, 0.000428112151042968 ) ); +#510 = CARTESIAN_POINT( '', ( -0.0512232155428389, 0.0311995600186201, 0.000229246426801828 ) ); +#511 = CARTESIAN_POINT( '', ( -0.0504497852395880, 0.0312431839448264, -9.35190532440855E-05 ) ); +#512 = CARTESIAN_POINT( '', ( -0.0500646893976891, 0.0312572325074276, -0.000218756236476721 ) ); +#513 = CARTESIAN_POINT( '', ( -0.0489064655067526, 0.0312905691279647, -0.000529942810438706 ) ); +#514 = CARTESIAN_POINT( '', ( -0.0481597558280874, 0.0313005442736259, -0.000646824063189490 ) ); +#515 = CARTESIAN_POINT( '', ( -0.0466846362587980, 0.0313162363909651, -0.000804280438297403 ) ); +#516 = CARTESIAN_POINT( '', ( -0.0459660554999862, 0.0313208488542549, -0.000841041817614928 ) ); +#517 = CARTESIAN_POINT( '', ( -0.0445487133772001, 0.0313271891766754, -0.000870485769930551 ) ); +#518 = CARTESIAN_POINT( '', ( -0.0438490951932218, 0.0313287597605274, -0.000862341850999651 ) ); +#519 = CARTESIAN_POINT( '', ( -0.0424677757977868, 0.0313290841674978, -0.000818778373880971 ) ); +#520 = CARTESIAN_POINT( '', ( -0.0417882544598426, 0.0313277984599981, -0.000783315880143339 ) ); +#521 = CARTESIAN_POINT( '', ( -0.0404347579064744, 0.0313222091065412, -0.000694848094175419 ) ); +#522 = CARTESIAN_POINT( '', ( -0.0397567284535381, 0.0313178857755183, -0.000641318942143160 ) ); +#523 = CARTESIAN_POINT( '', ( -0.0377392969056140, 0.0312998069690201, -0.000464462563639473 ) ); +#524 = CARTESIAN_POINT( '', ( -0.0364274223065419, 0.0312810241493483, -0.000326591323171981 ) ); +#525 = CARTESIAN_POINT( '', ( -0.0337985551275461, 0.0312283828059239, -4.15594289671188E-05 ) ); +#526 = CARTESIAN_POINT( '', ( -0.0324853978418817, 0.0311944849320473, 0.000103628829725733 ) ); +#527 = CARTESIAN_POINT( '', ( -0.0298802824343279, 0.0311096263137959, 0.000384425999479628 ) ); +#528 = CARTESIAN_POINT( '', ( -0.0285895538212730, 0.0310591391972878, 0.000521593037774881 ) ); +#529 = CARTESIAN_POINT( '', ( -0.0259980519641140, 0.0309424616162730, 0.000792741953544208 ) ); +#530 = CARTESIAN_POINT( '', ( -0.0247004030784956, 0.0308762511326939, 0.000926361532265634 ) ); +#531 = CARTESIAN_POINT( '', ( -0.0181855741841940, 0.0305071299027447, 0.00158578582008349 ) ); +#532 = CARTESIAN_POINT( '', ( -0.0129926489777095, 0.0300939956579190, 0.00207282683911525 ) ); +#533 = CARTESIAN_POINT( '', ( -0.00263700009743053, 0.0290966719547919, 0.00297843840397609 ) ); +#534 = CARTESIAN_POINT( '', ( 0.00253865910116842, 0.0285093522539465, 0.00339863214374305 ) ); +#535 = CARTESIAN_POINT( '', ( 0.0128473672367784, 0.0272142005036743, 0.00419979499255807 ) ); +#536 = CARTESIAN_POINT( '', ( 0.0180152912087230, 0.0264990417352235, 0.00457587013973824 ) ); +#537 = CARTESIAN_POINT( '', ( 0.0282872128613586, 0.0250025739801457, 0.00517804344527354 ) ); +#538 = CARTESIAN_POINT( '', ( 0.0334253570456015, 0.0242139573043200, 0.00540470576967905 ) ); +#539 = CARTESIAN_POINT( '', ( 0.0436983176435042, 0.0226434558891338, 0.00561267512374344 ) ); +#540 = CARTESIAN_POINT( '', ( 0.0488441228963437, 0.0218588528811304, 0.00558877595035436 ) ); +#541 = CARTESIAN_POINT( '', ( 0.0565031701563695, 0.0208015586059076, 0.00522800465003918 ) ); +#542 = CARTESIAN_POINT( '', ( 0.0590822573395741, 0.0204657298072173, 0.00504788125137985 ) ); +#543 = CARTESIAN_POINT( '', ( 0.0642435455523163, 0.0198569531737212, 0.00452233142116072 ) ); +#544 = CARTESIAN_POINT( '', ( 0.0668124256934670, 0.0195878429941818, 0.00417645385822073 ) ); +#545 = CARTESIAN_POINT( '', ( 0.0693533048033715, 0.0193591210695326, 0.00370415160432457 ) ); +#546 = CARTESIAN_POINT( '', ( -0.0546610390339507, 0.0365696029253115, 0.0241801590416302 ) ); +#547 = CARTESIAN_POINT( '', ( -0.0545543843367636, 0.0376178562681313, 0.0225590146572133 ) ); +#548 = CARTESIAN_POINT( '', ( -0.0544468826885366, 0.0385214967040836, 0.0209249966726782 ) ); +#549 = CARTESIAN_POINT( '', ( -0.0542300947171114, 0.0400874380733963, 0.0176298337613946 ) ); +#550 = CARTESIAN_POINT( '', ( -0.0541227629261336, 0.0407358835491193, 0.0159983975958801 ) ); +#551 = CARTESIAN_POINT( '', ( -0.0539624875474870, 0.0415452885835384, 0.0135622223789792 ) ); +#552 = CARTESIAN_POINT( '', ( -0.0539094608951785, 0.0417867952169023, 0.0127562207505318 ) ); +#553 = CARTESIAN_POINT( '', ( -0.0538277330505419, 0.0421190494119364, 0.0115139628858768 ) ); +#554 = CARTESIAN_POINT( '', ( -0.0538001629570136, 0.0422244968431589, 0.0110948992770531 ) ); +#555 = CARTESIAN_POINT( '', ( -0.0537443489185469, 0.0424241941806302, 0.0102465295622786 ) ); +#556 = CARTESIAN_POINT( '', ( -0.0537156862029461, 0.0425196560841232, 0.00981085816979535 ) ); +#557 = CARTESIAN_POINT( '', ( -0.0536327071340396, 0.0427762131643736, 0.00854958177850802 ) ); +#558 = CARTESIAN_POINT( '', ( -0.0535809848247393, 0.0429102470487745, 0.00776340607802177 ) ); +#559 = CARTESIAN_POINT( '', ( -0.0535076812296804, 0.0430723555661763, 0.00664919625303022 ) ); +#560 = CARTESIAN_POINT( '', ( -0.0534784171980682, 0.0431327534141551, 0.00620438489671280 ) ); +#561 = CARTESIAN_POINT( '', ( -0.0534060205776309, 0.0432575070916431, 0.00510396102633351 ) ); +#562 = CARTESIAN_POINT( '', ( -0.0533635036659127, 0.0433206152049582, 0.00445770676381561 ) ); +#563 = CARTESIAN_POINT( '', ( -0.0533103980369430, 0.0433755480974604, 0.00365050469531109 ) ); +#564 = CARTESIAN_POINT( '', ( -0.0533067109742278, 0.0433792552588394, 0.00359446158447345 ) ); +#565 = CARTESIAN_POINT( '', ( -0.0533011228707824, 0.0433847052670054, 0.00350952277953701 ) ); +#566 = CARTESIAN_POINT( '', ( -0.0532992505847880, 0.0433865034828029, 0.00348106415552888 ) ); +#567 = CARTESIAN_POINT( '', ( -0.0532954867512713, 0.0433900613705857, 0.00342385413355761 ) ); +#568 = CARTESIAN_POINT( '', ( -0.0532958044384286, 0.0433918235167558, 0.00342878814864307 ) ); +#569 = CARTESIAN_POINT( '', ( -0.0532934058019060, 0.0434005677248049, 0.00339428916354444 ) ); +#570 = CARTESIAN_POINT( '', ( -0.0532912253948317, 0.0434073302003497, 0.00336644654110378 ) ); +#571 = CARTESIAN_POINT( '', ( -0.0532838443093318, 0.0434267906183907, 0.00328226176219131 ) ); +#572 = CARTESIAN_POINT( '', ( -0.0532776417455970, 0.0434388222723248, 0.00322420027067872 ) ); +#573 = CARTESIAN_POINT( '', ( -0.0532569961541920, 0.0434684522884171, 0.00306052519148978 ) ); +#574 = CARTESIAN_POINT( '', ( -0.0532408996223807, 0.0434803895629964, 0.00296448436287200 ) ); +#575 = CARTESIAN_POINT( '', ( -0.0531856345509266, 0.0435011889864556, 0.00268867052183027 ) ); +#576 = CARTESIAN_POINT( '', ( -0.0531365482418410, 0.0434940327746878, 0.00251199801243278 ) ); +#577 = CARTESIAN_POINT( '', ( -0.0529591254986711, 0.0434136081372272, 0.00201559957676410 ) ); +#578 = CARTESIAN_POINT( '', ( -0.0527991076383562, 0.0432797945122916, 0.00172025368355517 ) ); +#579 = CARTESIAN_POINT( '', ( -0.0523976769991102, 0.0429473208257671, 0.00118147378184141 ) ); +#580 = CARTESIAN_POINT( '', ( -0.0521593197030119, 0.0427578609789788, 0.000944613165741844 ) ); +#581 = CARTESIAN_POINT( '', ( -0.0516397600238076, 0.0424337796496477, 0.000536167217203388 ) ); +#582 = CARTESIAN_POINT( '', ( -0.0513579404697644, 0.0422964829206747, 0.000363017689249552 ) ); +#583 = CARTESIAN_POINT( '', ( -0.0507688054226550, 0.0420770122780616, 6.50193333880227E-05 ) ); +#584 = CARTESIAN_POINT( '', ( -0.0504615907882494, 0.0419933259926960, -5.97038080294217E-05 ) ); +#585 = CARTESIAN_POINT( '', ( -0.0498389858082419, 0.0418610781953754, -0.000271411935586786 ) ); +#586 = CARTESIAN_POINT( '', ( -0.0495266848203537, 0.0418124449645948, -0.000357820030714380 ) ); +#587 = CARTESIAN_POINT( '', ( -0.0485658315497535, 0.0416938692733487, -0.000581014693949944 ) ); +#588 = CARTESIAN_POINT( '', ( -0.0479242315256405, 0.0416532467443129, -0.000675394701242266 ) ); +#589 = CARTESIAN_POINT( '', ( -0.0466130600142234, 0.0415952100369516, -0.000806402532980274 ) ); +#590 = CARTESIAN_POINT( '', ( -0.0459550642097339, 0.0415797857896056, -0.000840552568345361 ) ); +#591 = CARTESIAN_POINT( '', ( -0.0446305846101389, 0.0415581067334646, -0.000869429667588803 ) ); +#592 = CARTESIAN_POINT( '', ( -0.0439639731928960, 0.0415522769328363, -0.000863752597228454 ) ); +#593 = CARTESIAN_POINT( '', ( -0.0426302996737868, 0.0415429890655192, -0.000825355581689216 ) ); +#594 = CARTESIAN_POINT( '', ( -0.0419657094009150, 0.0415395754458813, -0.000792734789455296 ) ); +#595 = CARTESIAN_POINT( '', ( -0.0406298777088851, 0.0415315960864344, -0.000708832258471145 ) ); +#596 = CARTESIAN_POINT( '', ( -0.0399546843751176, 0.0415271702319105, -0.000657106786645602 ) ); +#597 = CARTESIAN_POINT( '', ( -0.0379333172631551, 0.0415085691837988, -0.000483545315485851 ) ); +#598 = CARTESIAN_POINT( '', ( -0.0366007769381703, 0.0414887685354734, -0.000344926032121249 ) ); +#599 = CARTESIAN_POINT( '', ( -0.0339066851857667, 0.0414251787568609, -5.36582304640480E-05 ) ); +#600 = CARTESIAN_POINT( '', ( -0.0325458783577641, 0.0413807195980484, 9.70916979149806E-05 ) ); +#601 = CARTESIAN_POINT( '', ( -0.0298571361924550, 0.0412654024016009, 0.000386938542240769 ) ); +#602 = CARTESIAN_POINT( '', ( -0.0285264500478985, 0.0411950395942611, 0.000528307484000463 ) ); +#603 = CARTESIAN_POINT( '', ( -0.0258576964800841, 0.0410301660998887, 0.000807296592032596 ) ); +#604 = CARTESIAN_POINT( '', ( -0.0245229832876291, 0.0409356092959497, 0.000944542515443632 ) ); +#605 = CARTESIAN_POINT( '', ( -0.0178622362935748, 0.0404051504152805, 0.00161740850194907 ) ); +#606 = CARTESIAN_POINT( '', ( -0.0125598360520481, 0.0397955646735621, 0.00211275314425497 ) ); +#607 = CARTESIAN_POINT( '', ( -0.00203962334103179, 0.0382787268670233, 0.00302811289043585 ) ); +#608 = CARTESIAN_POINT( '', ( 0.00317539928664909, 0.0373727793181302, 0.00345015821870359 ) ); +#609 = CARTESIAN_POINT( '', ( 0.0135429761878093, 0.0353207863866082, 0.00425115848547984 ) ); +#610 = CARTESIAN_POINT( '', ( 0.0187076500880150, 0.0341729556019719, 0.00462267431181236 ) ); +#611 = CARTESIAN_POINT( '', ( 0.0289528783971528, 0.0316588134411239, 0.00520872320256116 ) ); +#612 = CARTESIAN_POINT( '', ( 0.0340360440496324, 0.0302922783951462, 0.00542624655913418 ) ); +#613 = CARTESIAN_POINT( '', ( 0.0441755235454418, 0.0273738365643855, 0.00561053420907342 ) ); +#614 = CARTESIAN_POINT( '', ( 0.0492128672660333, 0.0258220955287610, 0.00558115454022276 ) ); +#615 = CARTESIAN_POINT( '', ( 0.0567757515649417, 0.0234153874619387, 0.00520917386539239 ) ); +#616 = CARTESIAN_POINT( '', ( 0.0592933982529094, 0.0226009900139395, 0.00502981481237104 ) ); +#617 = CARTESIAN_POINT( '', ( 0.0643289327612552, 0.0209708423417502, 0.00450969444119861 ) ); +#618 = CARTESIAN_POINT( '', ( 0.0668462332366741, 0.0201552116105254, 0.00417016966394553 ) ); +#619 = CARTESIAN_POINT( '', ( 0.0693533048033715, 0.0193591210695326, 0.00370415160432457 ) ); +#625 = SURFACE_SIDE_STYLE( '', ( #1102 ) ); +#626 = EDGE_LOOP( '', ( #1103, #1104, #1105, #1106 ) ); +#627 = AXIS2_PLACEMENT_3D( '', #1107, #1108, #1109 ); +#628 = SURFACE_SIDE_STYLE( '', ( #1110 ) ); +#629 = EDGE_LOOP( '', ( #1111, #1112, #1113, #1114, #1115 ) ); +#630 = B_SPLINE_CURVE_WITH_KNOTS( '', 3, ( #1116, #1117, #1118, #1119, #1120, #1121 ), .UNSPECIFIED., .F., .F., ( 4, 1, 1, 4 ), ( 0.00000000000000, 0.239380222557408, 0.640067607836079, 1.00000000000000 ), .UNSPECIFIED. ); +#631 = VECTOR( '', #1122, 1.00000000000000 ); +#632 = SURFACE_SIDE_STYLE( '', ( #1123 ) ); +#633 = EDGE_LOOP( '', ( #1124, #1125, #1126 ) ); +#634 = AXIS2_PLACEMENT_3D( '', #1127, #1128, #1129 ); +#635 = SURFACE_SIDE_STYLE( '', ( #1130 ) ); +#636 = EDGE_LOOP( '', ( #1131, #1132, #1133, #1134 ) ); +#637 = AXIS2_PLACEMENT_3D( '', #1135, #1136, #1137 ); +#638 = SURFACE_SIDE_STYLE( '', ( #1138 ) ); +#639 = EDGE_LOOP( '', ( #1139, #1140, #1141, #1142, #1143 ) ); +#640 = B_SPLINE_CURVE_WITH_KNOTS( '', 3, ( #1144, #1145, #1146, #1147, #1148, #1149 ), .UNSPECIFIED., .F., .F., ( 4, 1, 1, 4 ), ( 0.00000000000000, 0.239380222557408, 0.640067607836079, 1.00000000000000 ), .UNSPECIFIED. ); +#641 = VECTOR( '', #1150, 1.00000000000000 ); +#642 = SURFACE_SIDE_STYLE( '', ( #1151 ) ); +#643 = EDGE_LOOP( '', ( #1152, #1153, #1154 ) ); +#644 = AXIS2_PLACEMENT_3D( '', #1155, #1156, #1157 ); +#645 = SURFACE_SIDE_STYLE( '', ( #1158 ) ); +#646 = EDGE_LOOP( '', ( #1159, #1160, #1161 ) ); +#649 = CARTESIAN_POINT( '', ( 0.0694836154580117, -0.0191419071944495, 0.00463145086541773 ) ); +#650 = CARTESIAN_POINT( '', ( 0.0643011992826509, -0.0192849511343043, 0.00675842959296416 ) ); +#651 = CARTESIAN_POINT( '', ( 0.0590541717518088, -0.0191968906358069, 0.00860256867371319 ) ); +#652 = CARTESIAN_POINT( '', ( 0.0484516195146550, -0.0188876382757721, 0.0119037823432385 ) ); +#653 = CARTESIAN_POINT( '', ( 0.0430926731276420, -0.0186607685231542, 0.0133578659515471 ) ); +#654 = CARTESIAN_POINT( '', ( 0.0322867461997799, -0.0182032661253969, 0.0159680373562130 ) ); +#655 = CARTESIAN_POINT( '', ( 0.0268417347596844, -0.0179708663246592, 0.0171238726291039 ) ); +#656 = CARTESIAN_POINT( '', ( 0.0158820168842233, -0.0175413529287746, 0.0192041476515475 ) ); +#657 = CARTESIAN_POINT( '', ( 0.0103604228432698, -0.0173439226971866, 0.0201264856378418 ) ); +#658 = CARTESIAN_POINT( '', ( -0.000833094279259031, -0.0171234972915820, 0.0216665287229768 ) ); +#659 = CARTESIAN_POINT( '', ( -0.00649616415257889, -0.0170989647703935, 0.0222868785588195 ) ); +#660 = CARTESIAN_POINT( '', ( -0.0151492132375884, -0.0173455816301968, 0.0228600268723300 ) ); +#661 = CARTESIAN_POINT( '', ( -0.0180559941203536, -0.0174751218920850, 0.0229902466084410 ) ); +#662 = CARTESIAN_POINT( '', ( -0.0239409359518543, -0.0178683068258398, 0.0230841722072953 ) ); +#663 = CARTESIAN_POINT( '', ( -0.0269338423414960, -0.0181333881051074, 0.0230485778726938 ) ); +#664 = CARTESIAN_POINT( '', ( -0.0330153789929286, -0.0188510886360646, 0.0227271624402378 ) ); +#665 = CARTESIAN_POINT( '', ( -0.0361065706121687, -0.0193034980929606, 0.0224444932346738 ) ); +#666 = CARTESIAN_POINT( '', ( -0.0408635282671651, -0.0201771502576221, 0.0217052232873932 ) ); +#667 = CARTESIAN_POINT( '', ( -0.0424686438073828, -0.0205015358144872, 0.0214047911587278 ) ); +#668 = CARTESIAN_POINT( '', ( -0.0457155502157597, -0.0212203312702111, 0.0206619811281845 ) ); +#669 = CARTESIAN_POINT( '', ( -0.0473542216808956, -0.0216133209004764, 0.0202215005538979 ) ); +#670 = CARTESIAN_POINT( '', ( -0.0506669422017590, -0.0224690277349293, 0.0191495599381344 ) ); +#671 = CARTESIAN_POINT( '', ( -0.0523411043979083, -0.0229311226006468, 0.0185220799408779 ) ); +#672 = CARTESIAN_POINT( '', ( -0.0558055798625884, -0.0239585380585201, 0.0169260282591570 ) ); +#673 = CARTESIAN_POINT( '', ( -0.0575983118557650, -0.0245250295377452, 0.0159611169315655 ) ); +#674 = CARTESIAN_POINT( '', ( -0.0602816379220738, -0.0254455400188271, 0.0140544573433406 ) ); +#675 = CARTESIAN_POINT( '', ( -0.0611692649959915, -0.0257623000395939, 0.0133442332403554 ) ); +#676 = CARTESIAN_POINT( '', ( -0.0628817845872273, -0.0264046657048893, 0.0117164965011782 ) ); +#677 = CARTESIAN_POINT( '', ( -0.0637154318544728, -0.0267340677335919, 0.0107866924180567 ) ); +#678 = CARTESIAN_POINT( '', ( -0.0648027338245179, -0.0271974943140753, 0.00923167386939495 ) ); +#679 = CARTESIAN_POINT( '', ( -0.0651380618012726, -0.0273468001934177, 0.00868705111858922 ) ); +#680 = CARTESIAN_POINT( '', ( -0.0657371714593334, -0.0276293164429715, 0.00754252877351221 ) ); +#681 = CARTESIAN_POINT( '', ( -0.0660025707277202, -0.0277630887398720, 0.00694182758540805 ) ); +#682 = CARTESIAN_POINT( '', ( -0.0663381185346199, -0.0279512564444852, 0.00596717014693786 ) ); +#683 = CARTESIAN_POINT( '', ( -0.0664396652796460, -0.0280122766624184, 0.00562611613445203 ) ); +#684 = CARTESIAN_POINT( '', ( -0.0666049387251777, -0.0281205286538437, 0.00496919653930407 ) ); +#685 = CARTESIAN_POINT( '', ( -0.0666705760712226, -0.0281687051119437, 0.00464923697593071 ) ); +#686 = CARTESIAN_POINT( '', ( -0.0667472333898910, -0.0282330892526394, 0.00418287523536629 ) ); +#687 = CARTESIAN_POINT( '', ( -0.0667685724754947, -0.0282526482021053, 0.00403441687886397 ) ); +#688 = CARTESIAN_POINT( '', ( -0.0668071224223972, -0.0282919003962013, 0.00372133667705279 ) ); +#689 = CARTESIAN_POINT( '', ( -0.0668262292845528, -0.0283135744637437, 0.00354061387626293 ) ); +#690 = CARTESIAN_POINT( '', ( -0.0668572866713163, -0.0283590780329963, 0.00312867489853819 ) ); +#691 = CARTESIAN_POINT( '', ( -0.0668692502911563, -0.0283829141411641, 0.00289742667666706 ) ); +#692 = CARTESIAN_POINT( '', ( -0.0668749284314983, -0.0284182847899746, 0.00251096150279795 ) ); +#693 = CARTESIAN_POINT( '', ( -0.0668747563823203, -0.0284300046155354, 0.00237554297257866 ) ); +#694 = CARTESIAN_POINT( '', ( -0.0668703510148082, -0.0284471651502754, 0.00216237249559964 ) ); +#695 = CARTESIAN_POINT( '', ( -0.0668681900766758, -0.0284528150024072, 0.00208964256306403 ) ); +#696 = CARTESIAN_POINT( '', ( -0.0668648729867393, -0.0284590594840170, 0.00200593110459007 ) ); +#697 = CARTESIAN_POINT( '', ( -0.0668644921120724, -0.0284597517626337, 0.00199660358291355 ) ); +#698 = CARTESIAN_POINT( '', ( -0.0668637053514366, -0.0284611330987881, 0.00197789602387504 ) ); +#699 = CARTESIAN_POINT( '', ( -0.0668632974095109, -0.0284618223397101, 0.00196851617249754 ) ); +#700 = CARTESIAN_POINT( '', ( -0.0668620490181888, -0.0284638838473950, 0.00194029660114331 ) ); +#701 = CARTESIAN_POINT( '', ( -0.0668612119194714, -0.0284652474087880, 0.00192137434688770 ) ); +#702 = CARTESIAN_POINT( '', ( -0.0668586862885288, -0.0284693039196670, 0.00186427809451717 ) ); +#703 = CARTESIAN_POINT( '', ( -0.0668569833074532, -0.0284719627168598, 0.00182577464479565 ) ); +#704 = CARTESIAN_POINT( '', ( -0.0668442373704891, -0.0284912638721303, 0.00153756089872016 ) ); +#705 = CARTESIAN_POINT( '', ( -0.0668322270134122, -0.0285060831374043, 0.00126565045403804 ) ); +#706 = CARTESIAN_POINT( '', ( -0.0668073033879075, -0.0285279097286698, 0.000701516180856744 ) ); +#707 = CARTESIAN_POINT( '', ( -0.0667953269507031, -0.0285341948317934, 0.000431152475614877 ) ); +#708 = CARTESIAN_POINT( '', ( -0.0667722933728067, -0.0285395023519105, -8.73672062003678E-05 ) ); +#709 = CARTESIAN_POINT( '', ( -0.0667608255047442, -0.0285387235963498, -0.000345107481368780 ) ); +#710 = CARTESIAN_POINT( '', ( -0.0667369183073094, -0.0285294270284388, -0.000882507063719664 ) ); +#711 = CARTESIAN_POINT( '', ( -0.0667246256417942, -0.0285208235042160, -0.00115874399296278 ) ); +#712 = CARTESIAN_POINT( '', ( -0.0666621542872701, -0.0284559068052891, -0.00256158806573388 ) ); +#713 = CARTESIAN_POINT( '', ( -0.0666078397098298, -0.0283383923802691, -0.00377900593498790 ) ); +#714 = CARTESIAN_POINT( '', ( -0.0665455901645436, -0.0280868607642046, -0.00517607722392665 ) ); +#715 = CARTESIAN_POINT( '', ( 0.0694836154580117, -0.0191419071944495, 0.00463145086541773 ) ); +#716 = CARTESIAN_POINT( '', ( 0.0643247096702335, -0.0194607604573522, 0.00601947385276102 ) ); +#717 = CARTESIAN_POINT( '', ( 0.0588851083327575, -0.0197019648133129, 0.00746055688892495 ) ); +#718 = CARTESIAN_POINT( '', ( 0.0481314135938109, -0.0200011437996338, 0.0101558553007855 ) ); +#719 = CARTESIAN_POINT( '', ( 0.0426921014641457, -0.0200753490151721, 0.0114460984059811 ) ); +#720 = CARTESIAN_POINT( '', ( 0.0318501199123147, -0.0201441676329741, 0.0138147286356203 ) ); +#721 = CARTESIAN_POINT( '', ( 0.0263809379808412, -0.0201429135844989, 0.0149136859831765 ) ); +#722 = CARTESIAN_POINT( '', ( 0.0154474124187311, -0.0201109135304834, 0.0169127254319475 ) ); +#723 = CARTESIAN_POINT( '', ( 0.00994948214903935, -0.0200802012600269, 0.0178199375767306 ) ); +#724 = CARTESIAN_POINT( '', ( -0.00108666760419048, -0.0201603522154555, 0.0192917713734006 ) ); +#725 = CARTESIAN_POINT( '', ( -0.00665349234706491, -0.0202700863362849, 0.0198668443735907 ) ); +#726 = CARTESIAN_POINT( '', ( -0.0150193924309207, -0.0207295206402392, 0.0202810584265473 ) ); +#727 = CARTESIAN_POINT( '', ( -0.0178136697316548, -0.0209323175580827, 0.0203436194818388 ) ); +#728 = CARTESIAN_POINT( '', ( -0.0233970711726944, -0.0214799495324946, 0.0202554452815069 ) ); +#729 = CARTESIAN_POINT( '', ( -0.0262103011250284, -0.0218281327703490, 0.0201041420568647 ) ); +#730 = CARTESIAN_POINT( '', ( -0.0317947068902024, -0.0227163544894120, 0.0194804205754932 ) ); +#731 = CARTESIAN_POINT( '', ( -0.0345868923303988, -0.0232618649898122, 0.0190055992915349 ) ); +#732 = CARTESIAN_POINT( '', ( -0.0386733460085433, -0.0242487001565301, 0.0179101002657916 ) ); +#733 = CARTESIAN_POINT( '', ( -0.0400265406930691, -0.0246092008033263, 0.0174752966927764 ) ); +#734 = CARTESIAN_POINT( '', ( -0.0426962548234996, -0.0253814063548345, 0.0164395600084408 ) ); +#735 = CARTESIAN_POINT( '', ( -0.0440127860322988, -0.0257937273051562, 0.0158367616658802 ) ); +#736 = CARTESIAN_POINT( '', ( -0.0465536418310586, -0.0266454069712859, 0.0144309460629292 ) ); +#737 = CARTESIAN_POINT( '', ( -0.0477868030722041, -0.0270885320488184, 0.0136218186834342 ) ); +#738 = CARTESIAN_POINT( '', ( -0.0501114557535610, -0.0279791308416144, 0.0117031951346540 ) ); +#739 = CARTESIAN_POINT( '', ( -0.0512097889838412, -0.0284324559317272, 0.0105689411228687 ) ); +#740 = CARTESIAN_POINT( '', ( -0.0524972537481801, -0.0290048408348668, 0.00866520037384566 ) ); +#741 = CARTESIAN_POINT( '', ( -0.0528669480617642, -0.0291780843224650, 0.00798810103670270 ) ); +#742 = CARTESIAN_POINT( '', ( -0.0534251768049525, -0.0294570761179292, 0.00661373388990258 ) ); +#743 = CARTESIAN_POINT( '', ( -0.0536081413806991, -0.0295606549347183, 0.00590742180925447 ) ); +#744 = CARTESIAN_POINT( '', ( -0.0537162620940607, -0.0296478110118307, 0.00495338349311287 ) ); +#745 = CARTESIAN_POINT( '', ( -0.0537252817851434, -0.0296659851871921, 0.00465064006334252 ) ); +#746 = CARTESIAN_POINT( '', ( -0.0537001825416978, -0.0296861727501444, 0.00409253662314329 ) ); +#747 = CARTESIAN_POINT( '', ( -0.0536657885410287, -0.0296880384592922, 0.00383711319634791 ) ); +#748 = CARTESIAN_POINT( '', ( -0.0535929180717767, -0.0296869051523706, 0.00348652784595501 ) ); +#749 = CARTESIAN_POINT( '', ( -0.0535646017241111, -0.0296859065068572, 0.00337404371214325 ) ); +#750 = CARTESIAN_POINT( '', ( -0.0535082230240340, -0.0296848450709272, 0.00317424815570603 ) ); +#751 = CARTESIAN_POINT( '', ( -0.0534799534981712, -0.0296847969173076, 0.00308529114921882 ) ); +#752 = CARTESIAN_POINT( '', ( -0.0534394536352563, -0.0296864219330641, 0.00296377683341920 ) ); +#753 = CARTESIAN_POINT( '', ( -0.0534266481226834, -0.0296872035752076, 0.00292639388125999 ) ); +#754 = CARTESIAN_POINT( '', ( -0.0534000790601429, -0.0296895738230758, 0.00284988696933060 ) ); +#755 = CARTESIAN_POINT( '', ( -0.0533849353359501, -0.0296912860091345, 0.00280691998962009 ) ); +#756 = CARTESIAN_POINT( '', ( -0.0533516463912372, -0.0296968674451558, 0.00271258344587873 ) ); +#757 = CARTESIAN_POINT( '', ( -0.0533334954465308, -0.0297007363137743, 0.00266123687897624 ) ); +#758 = CARTESIAN_POINT( '', ( -0.0533049805883363, -0.0297094664988672, 0.00257784819297184 ) ); +#759 = CARTESIAN_POINT( '', ( -0.0532952613864064, -0.0297128720878036, 0.00254896443733593 ) ); +#760 = CARTESIAN_POINT( '', ( -0.0532805212032089, -0.0297189316240584, 0.00250385463163318 ) ); +#761 = CARTESIAN_POINT( '', ( -0.0532755802180833, -0.0297211107641679, 0.00248851653832234 ) ); +#762 = CARTESIAN_POINT( '', ( -0.0532700067937514, -0.0297237622884048, 0.00247089979489735 ) ); +#763 = CARTESIAN_POINT( '', ( -0.0532693872431685, -0.0297240597166160, 0.00246893711409927 ) ); +#764 = CARTESIAN_POINT( '', ( -0.0532681477680690, -0.0297246602153892, 0.00246500154190728 ) ); +#765 = CARTESIAN_POINT( '', ( -0.0532673293057996, -0.0297246527862436, 0.00246782593388613 ) ); +#766 = CARTESIAN_POINT( '', ( -0.0532663741250778, -0.0297269867072207, 0.00244003095635416 ) ); +#767 = CARTESIAN_POINT( '', ( -0.0532658260374704, -0.0297286770077926, 0.00241916388271329 ) ); +#768 = CARTESIAN_POINT( '', ( -0.0532640331920667, -0.0297334989428421, 0.00235955180455473 ) ); +#769 = CARTESIAN_POINT( '', ( -0.0532628241132289, -0.0297366706278189, 0.00231934995445755 ) ); +#770 = CARTESIAN_POINT( '', ( -0.0532537740366666, -0.0297597830037314, 0.00201843506780345 ) ); +#771 = CARTESIAN_POINT( '', ( -0.0532452333439444, -0.0297780543542164, 0.00173445718496706 ) ); +#772 = CARTESIAN_POINT( '', ( -0.0532275079712381, -0.0298066441533176, 0.00114508885408163 ) ); +#773 = CARTESIAN_POINT( '', ( -0.0532190102516258, -0.0298159801281185, 0.000862539826363226 ) ); +#774 = CARTESIAN_POINT( '', ( -0.0532027089021942, -0.0298268193831120, 0.000320520244295235 ) ); +#775 = CARTESIAN_POINT( '', ( -0.0531946039454059, -0.0298286327218192, 5.10305735672491E-05 ) ); +#776 = CARTESIAN_POINT( '', ( -0.0531776999514600, -0.0298243844887254, -0.000511026927969810 ) ); +#777 = CARTESIAN_POINT( '', ( -0.0531690086100755, -0.0298181991983306, -0.000800013876229660 ) ); +#778 = CARTESIAN_POINT( '', ( -0.0531248714089447, -0.0297645674058115, -0.00226757503792035 ) ); +#779 = CARTESIAN_POINT( '', ( -0.0530865259538606, -0.0296540797599882, -0.00354256074512159 ) ); +#780 = CARTESIAN_POINT( '', ( -0.0530424222912323, -0.0294044509835573, -0.00500900675251365 ) ); +#781 = CARTESIAN_POINT( '', ( 0.0694836154580116, -0.0191419071944495, 0.00463145086541773 ) ); +#782 = CARTESIAN_POINT( '', ( 0.0641690759811638, -0.0202039546137935, 0.00606134768150408 ) ); +#783 = CARTESIAN_POINT( '', ( 0.0588008691691839, -0.0209559560893042, 0.00748162025777227 ) ); +#784 = CARTESIAN_POINT( '', ( 0.0480109221420702, -0.0220965552700963, 0.0101861053648128 ) ); +#785 = CARTESIAN_POINT( '', ( 0.0425875478690584, -0.0224843368097248, 0.0114696554231641 ) ); +#786 = CARTESIAN_POINT( '', ( 0.0317085560535202, -0.0230724853923180, 0.0138449243305319 ) ); +#787 = CARTESIAN_POINT( '', ( 0.0262481164059888, -0.0232729761550313, 0.0149392047730151 ) ); +#788 = CARTESIAN_POINT( '', ( 0.0153021068664016, -0.0235776768603239, 0.0169380115483504 ) ); +#789 = CARTESIAN_POINT( '', ( 0.00983237830000406, -0.0236805412777613, 0.0178366396543255 ) ); +#790 = CARTESIAN_POINT( '', ( -0.00111556669058941, -0.0240223765556888, 0.0192945199215330 ) ); +#791 = CARTESIAN_POINT( '', ( -0.00658821302807713, -0.0242593075791512, 0.0198563132519936 ) ); +#792 = CARTESIAN_POINT( '', ( -0.0147497555746435, -0.0249769885973268, 0.0202709649519929 ) ); +#793 = CARTESIAN_POINT( '', ( -0.0174576595305775, -0.0252770024508426, 0.0203365953222648 ) ); +#794 = CARTESIAN_POINT( '', ( -0.0228278627701086, -0.0260633438715471, 0.0202733841605519 ) ); +#795 = CARTESIAN_POINT( '', ( -0.0255046898007140, -0.0265515491714945, 0.0201443837053642 ) ); +#796 = CARTESIAN_POINT( '', ( -0.0307620287342813, -0.0278021553141756, 0.0196153063469558 ) ); +#797 = CARTESIAN_POINT( '', ( -0.0333456216531482, -0.0285640586808797, 0.0192164600253740 ) ); +#798 = CARTESIAN_POINT( '', ( -0.0370982186147320, -0.0300023884691647, 0.0183260969918297 ) ); +#799 = CARTESIAN_POINT( '', ( -0.0383236957953477, -0.0305321228738083, 0.0179812016312168 ) ); +#800 = CARTESIAN_POINT( '', ( -0.0407517050873639, -0.0316998509258020, 0.0171631919715141 ) ); +#801 = CARTESIAN_POINT( '', ( -0.0419478122434517, -0.0323357100951563, 0.0166924764546820 ) ); +#802 = CARTESIAN_POINT( '', ( -0.0442785441186665, -0.0337176772279002, 0.0156039064045224 ) ); +#803 = CARTESIAN_POINT( '', ( -0.0454141976565052, -0.0344627032859808, 0.0149880410079850 ) ); +#804 = CARTESIAN_POINT( '', ( -0.0476319107856152, -0.0361182240850137, 0.0135304642863491 ) ); +#805 = CARTESIAN_POINT( '', ( -0.0487120637836850, -0.0370308478525777, 0.0126896437902420 ) ); +#806 = CARTESIAN_POINT( '', ( -0.0501918108358767, -0.0385167452926618, 0.0111966027163773 ) ); +#807 = CARTESIAN_POINT( '', ( -0.0506584627227205, -0.0390285798312668, 0.0106627693726993 ) ); +#808 = CARTESIAN_POINT( '', ( -0.0515164144955420, -0.0400671352072925, 0.00950449476957229 ) ); +#809 = CARTESIAN_POINT( '', ( -0.0519112379304215, -0.0406000277666403, 0.00887278287376699 ) ); +#810 = CARTESIAN_POINT( '', ( -0.0524055253451901, -0.0413485523040352, 0.00786733726294773 ) ); +#811 = CARTESIAN_POINT( '', ( -0.0525543021144705, -0.0415894642547636, 0.00752256000026956 ) ); +#812 = CARTESIAN_POINT( '', ( -0.0528161488706745, -0.0420441252773342, 0.00681074804127568 ) ); +#813 = CARTESIAN_POINT( '', ( -0.0529299601884255, -0.0422587875042904, 0.00644317166688665 ) ); +#814 = CARTESIAN_POINT( '', ( -0.0530728419124045, -0.0425589541732990, 0.00585300857144684 ) ); +#815 = CARTESIAN_POINT( '', ( -0.0531158757620716, -0.0426559503153109, 0.00564748643319063 ) ); +#816 = CARTESIAN_POINT( '', ( -0.0531858780603611, -0.0428272071328920, 0.00525251741011489 ) ); +#817 = CARTESIAN_POINT( '', ( -0.0532136642001081, -0.0429029821472133, 0.00506056038267947 ) ); +#818 = CARTESIAN_POINT( '', ( -0.0532462408151039, -0.0430035543792972, 0.00478065615729622 ) ); +#819 = CARTESIAN_POINT( '', ( -0.0532553358388410, -0.0430339751546512, 0.00469153895690651 ) ); +#820 = CARTESIAN_POINT( '', ( -0.0532718179516892, -0.0430947878444922, 0.00450346097706423 ) ); +#821 = CARTESIAN_POINT( '', ( -0.0532800051880828, -0.0431282784618679, 0.00439483851463650 ) ); +#822 = CARTESIAN_POINT( '', ( -0.0532934026657377, -0.0431981780830640, 0.00414675394956595 ) ); +#823 = CARTESIAN_POINT( '', ( -0.0532986214936261, -0.0432345977213267, 0.00400728149011548 ) ); +#824 = CARTESIAN_POINT( '', ( -0.0533012712585152, -0.0432880676972484, 0.00377326712473547 ) ); +#825 = CARTESIAN_POINT( '', ( -0.0533012821772134, -0.0433056870408364, 0.00369112470836253 ) ); +#826 = CARTESIAN_POINT( '', ( -0.0532995296831139, -0.0433312864917623, 0.00356148288436691 ) ); +#827 = CARTESIAN_POINT( '', ( -0.0532986500384456, -0.0433396806497115, 0.00351719757304505 ) ); +#828 = CARTESIAN_POINT( '', ( -0.0532972802496586, -0.0433489135634316, 0.00346615094844441 ) ); +#829 = CARTESIAN_POINT( '', ( -0.0532971227669525, -0.0433499365167858, 0.00346046207972170 ) ); +#830 = CARTESIAN_POINT( '', ( -0.0532967970615578, -0.0433519763712742, 0.00344905022765818 ) ); +#831 = CARTESIAN_POINT( '', ( -0.0532967859960819, -0.0433529934666169, 0.00344858196230315 ) ); +#832 = CARTESIAN_POINT( '', ( -0.0532955479173552, -0.0433560341256059, 0.00340741586640303 ) ); +#833 = CARTESIAN_POINT( '', ( -0.0532946443051548, -0.0433580444843198, 0.00337737077662399 ) ); +#834 = CARTESIAN_POINT( '', ( -0.0532920282244962, -0.0433640224986759, 0.00329038614071392 ) ); +#835 = CARTESIAN_POINT( '', ( -0.0532902640602500, -0.0433679371421515, 0.00323172771054148 ) ); +#836 = CARTESIAN_POINT( '', ( -0.0532770587152355, -0.0433963259191464, 0.00279265022094253 ) ); +#837 = CARTESIAN_POINT( '', ( -0.0532646011072636, -0.0434179611907555, 0.00237843497486876 ) ); +#838 = CARTESIAN_POINT( '', ( -0.0532387570574105, -0.0434492541794316, 0.00151912077156368 ) ); +#839 = CARTESIAN_POINT( '', ( -0.0532263719836776, -0.0434578523584382, 0.00110731728766102 ) ); +#840 = CARTESIAN_POINT( '', ( -0.0532026205930219, -0.0434639888374617, 0.000317583965881883 ) ); +#841 = CARTESIAN_POINT( '', ( -0.0531908152569356, -0.0434618121390966, -7.49432514631047E-05 ) ); +#842 = CARTESIAN_POINT( '', ( -0.0531662024053930, -0.0434455943161150, -0.000893320132588172 ) ); +#843 = CARTESIAN_POINT( '', ( -0.0531535516577460, -0.0434314290118855, -0.00131395726946383 ) ); +#844 = CARTESIAN_POINT( '', ( -0.0530893109620517, -0.0433271250188174, -0.00344995927202009 ) ); +#845 = CARTESIAN_POINT( '', ( -0.0530335763666726, -0.0431433306009137, -0.00530313358862335 ) ); +#846 = CARTESIAN_POINT( '', ( -0.0529696431840111, -0.0427550414874563, -0.00742891078824146 ) ); +#852 = SURFACE_SIDE_STYLE( '', ( #1162 ) ); +#853 = EDGE_LOOP( '', ( #1163, #1164 ) ); +#854 = AXIS2_PLACEMENT_3D( '', #1165, #1166, #1167 ); +#855 = SURFACE_SIDE_STYLE( '', ( #1168 ) ); +#856 = EDGE_LOOP( '', ( #1169, #1170 ) ); +#857 = EDGE_LOOP( '', ( #1171, #1172, #1173 ) ); +#858 = B_SPLINE_CURVE_WITH_KNOTS( '', 3, ( #1174, #1175, #1176, #1177, #1178, #1179, #1180 ), .UNSPECIFIED., .F., .F., ( 4, 1, 1, 1, 4 ), ( 0.00000000000000, 0.151648070701946, 0.385343354126889, 0.742908913194043, 1.00000000000000 ), .UNSPECIFIED. ); +#859 = AXIS1_PLACEMENT( '', #1181, #1182 ); +#860 = SURFACE_SIDE_STYLE( '', ( #1183 ) ); +#861 = EDGE_LOOP( '', ( #1184, #1185, #1186, #1187 ) ); +#862 = B_SPLINE_CURVE_WITH_KNOTS( '', 3, ( #1188, #1189, #1190, #1191, #1192, #1193 ), .UNSPECIFIED., .F., .F., ( 4, 1, 1, 4 ), ( 0.00000000000000, 0.239391242362016, 0.578687076655342, 1.00000000000000 ), .UNSPECIFIED. ); +#863 = VECTOR( '', #1194, 1.00000000000000 ); +#864 = SURFACE_SIDE_STYLE( '', ( #1195 ) ); +#865 = EDGE_LOOP( '', ( #1196, #1197 ) ); +#866 = AXIS2_PLACEMENT_3D( '', #1198, #1199, #1200 ); +#867 = SURFACE_SIDE_STYLE( '', ( #1201 ) ); +#868 = EDGE_LOOP( '', ( #1202, #1203 ) ); +#869 = EDGE_LOOP( '', ( #1204, #1205, #1206 ) ); +#870 = B_SPLINE_CURVE_WITH_KNOTS( '', 3, ( #1207, #1208, #1209, #1210, #1211, #1212, #1213 ), .UNSPECIFIED., .F., .F., ( 4, 1, 1, 1, 4 ), ( 0.00000000000000, 0.151648070701946, 0.385343354126889, 0.742908913194043, 1.00000000000000 ), .UNSPECIFIED. ); +#871 = AXIS1_PLACEMENT( '', #1214, #1215 ); +#872 = SURFACE_SIDE_STYLE( '', ( #1216 ) ); +#873 = EDGE_LOOP( '', ( #1217, #1218, #1219 ) ); +#876 = CARTESIAN_POINT( '', ( 0.0694836154580117, 0.0191419071944495, 0.00463145086541772 ) ); +#877 = CARTESIAN_POINT( '', ( 0.0643011992826509, 0.0192849511343043, 0.00675842959296415 ) ); +#878 = CARTESIAN_POINT( '', ( 0.0590541717518088, 0.0191968906358069, 0.00860256867371318 ) ); +#879 = CARTESIAN_POINT( '', ( 0.0484516195146550, 0.0188876382757721, 0.0119037823432385 ) ); +#880 = CARTESIAN_POINT( '', ( 0.0430926731276420, 0.0186607685231542, 0.0133578659515471 ) ); +#881 = CARTESIAN_POINT( '', ( 0.0322867461997799, 0.0182032661253969, 0.0159680373562129 ) ); +#882 = CARTESIAN_POINT( '', ( 0.0268417347596844, 0.0179708663246592, 0.0171238726291039 ) ); +#883 = CARTESIAN_POINT( '', ( 0.0158820168842233, 0.0175413529287746, 0.0192041476515475 ) ); +#884 = CARTESIAN_POINT( '', ( 0.0103604228432698, 0.0173439226971866, 0.0201264856378418 ) ); +#885 = CARTESIAN_POINT( '', ( -0.000833094279259030, 0.0171234972915820, 0.0216665287229768 ) ); +#886 = CARTESIAN_POINT( '', ( -0.00649616415257889, 0.0170989647703935, 0.0222868785588195 ) ); +#887 = CARTESIAN_POINT( '', ( -0.0151492132375884, 0.0173455816301968, 0.0228600268723300 ) ); +#888 = CARTESIAN_POINT( '', ( -0.0180559941203536, 0.0174751218920850, 0.0229902466084410 ) ); +#889 = CARTESIAN_POINT( '', ( -0.0239409359518543, 0.0178683068258398, 0.0230841722072953 ) ); +#890 = CARTESIAN_POINT( '', ( -0.0269338423414960, 0.0181333881051075, 0.0230485778726938 ) ); +#891 = CARTESIAN_POINT( '', ( -0.0330153789929286, 0.0188510886360646, 0.0227271624402378 ) ); +#892 = CARTESIAN_POINT( '', ( -0.0361065706121687, 0.0193034980929606, 0.0224444932346738 ) ); +#893 = CARTESIAN_POINT( '', ( -0.0408635282671651, 0.0201771502576221, 0.0217052232873932 ) ); +#894 = CARTESIAN_POINT( '', ( -0.0424686438073828, 0.0205015358144872, 0.0214047911587278 ) ); +#895 = CARTESIAN_POINT( '', ( -0.0457155502157597, 0.0212203312702112, 0.0206619811281845 ) ); +#896 = CARTESIAN_POINT( '', ( -0.0473542216808956, 0.0216133209004764, 0.0202215005538979 ) ); +#897 = CARTESIAN_POINT( '', ( -0.0506669422017590, 0.0224690277349293, 0.0191495599381344 ) ); +#898 = CARTESIAN_POINT( '', ( -0.0523411043979083, 0.0229311226006468, 0.0185220799408779 ) ); +#899 = CARTESIAN_POINT( '', ( -0.0558055798625884, 0.0239585380585201, 0.0169260282591570 ) ); +#900 = CARTESIAN_POINT( '', ( -0.0575983118557650, 0.0245250295377452, 0.0159611169315655 ) ); +#901 = CARTESIAN_POINT( '', ( -0.0602816379220738, 0.0254455400188271, 0.0140544573433406 ) ); +#902 = CARTESIAN_POINT( '', ( -0.0611692649959915, 0.0257623000395939, 0.0133442332403554 ) ); +#903 = CARTESIAN_POINT( '', ( -0.0628817845872273, 0.0264046657048893, 0.0117164965011781 ) ); +#904 = CARTESIAN_POINT( '', ( -0.0637154318544728, 0.0267340677335919, 0.0107866924180567 ) ); +#905 = CARTESIAN_POINT( '', ( -0.0648027338245179, 0.0271974943140753, 0.00923167386939494 ) ); +#906 = CARTESIAN_POINT( '', ( -0.0651380618012726, 0.0273468001934177, 0.00868705111858920 ) ); +#907 = CARTESIAN_POINT( '', ( -0.0657371714593334, 0.0276293164429715, 0.00754252877351219 ) ); +#908 = CARTESIAN_POINT( '', ( -0.0660025707277202, 0.0277630887398720, 0.00694182758540803 ) ); +#909 = CARTESIAN_POINT( '', ( -0.0663381185346199, 0.0279512564444852, 0.00596717014693784 ) ); +#910 = CARTESIAN_POINT( '', ( -0.0664396652796460, 0.0280122766624184, 0.00562611613445201 ) ); +#911 = CARTESIAN_POINT( '', ( -0.0666049387251777, 0.0281205286538437, 0.00496919653930405 ) ); +#912 = CARTESIAN_POINT( '', ( -0.0666705760712226, 0.0281687051119437, 0.00464923697593070 ) ); +#913 = CARTESIAN_POINT( '', ( -0.0667472333898910, 0.0282330892526394, 0.00418287523536628 ) ); +#914 = CARTESIAN_POINT( '', ( -0.0667685724754947, 0.0282526482021053, 0.00403441687886395 ) ); +#915 = CARTESIAN_POINT( '', ( -0.0668071224223972, 0.0282919003962013, 0.00372133667705277 ) ); +#916 = CARTESIAN_POINT( '', ( -0.0668262292845528, 0.0283135744637437, 0.00354061387626292 ) ); +#917 = CARTESIAN_POINT( '', ( -0.0668572866713163, 0.0283590780329963, 0.00312867489853818 ) ); +#918 = CARTESIAN_POINT( '', ( -0.0668692502911563, 0.0283829141411641, 0.00289742667666704 ) ); +#919 = CARTESIAN_POINT( '', ( -0.0668749284314983, 0.0284182847899746, 0.00251096150279794 ) ); +#920 = CARTESIAN_POINT( '', ( -0.0668747563823203, 0.0284300046155354, 0.00237554297257865 ) ); +#921 = CARTESIAN_POINT( '', ( -0.0668703510148082, 0.0284471651502754, 0.00216237249559962 ) ); +#922 = CARTESIAN_POINT( '', ( -0.0668681900766758, 0.0284528150024072, 0.00208964256306400 ) ); +#923 = CARTESIAN_POINT( '', ( -0.0668648729867393, 0.0284590594840170, 0.00200593110459005 ) ); +#924 = CARTESIAN_POINT( '', ( -0.0668644921120724, 0.0284597517626337, 0.00199660358291353 ) ); +#925 = CARTESIAN_POINT( '', ( -0.0668637053514366, 0.0284611330987881, 0.00197789602387503 ) ); +#926 = CARTESIAN_POINT( '', ( -0.0668632974095109, 0.0284618223397101, 0.00196851617249753 ) ); +#927 = CARTESIAN_POINT( '', ( -0.0668620490181888, 0.0284638838473950, 0.00194029660114330 ) ); +#928 = CARTESIAN_POINT( '', ( -0.0668612119194714, 0.0284652474087880, 0.00192137434688769 ) ); +#929 = CARTESIAN_POINT( '', ( -0.0668586862885288, 0.0284693039196670, 0.00186427809451715 ) ); +#930 = CARTESIAN_POINT( '', ( -0.0668569833074532, 0.0284719627168598, 0.00182577464479564 ) ); +#931 = CARTESIAN_POINT( '', ( -0.0668442373704891, 0.0284912638721303, 0.00153756089872014 ) ); +#932 = CARTESIAN_POINT( '', ( -0.0668322270134122, 0.0285060831374043, 0.00126565045403803 ) ); +#933 = CARTESIAN_POINT( '', ( -0.0668073033879075, 0.0285279097286698, 0.000701516180856726 ) ); +#934 = CARTESIAN_POINT( '', ( -0.0667953269507031, 0.0285341948317934, 0.000431152475614860 ) ); +#935 = CARTESIAN_POINT( '', ( -0.0667722933728067, 0.0285395023519105, -8.73672062003853E-05 ) ); +#936 = CARTESIAN_POINT( '', ( -0.0667608255047442, 0.0285387235963498, -0.000345107481368797 ) ); +#937 = CARTESIAN_POINT( '', ( -0.0667369183073094, 0.0285294270284388, -0.000882507063719681 ) ); +#938 = CARTESIAN_POINT( '', ( -0.0667246256417942, 0.0285208235042160, -0.00115874399296280 ) ); +#939 = CARTESIAN_POINT( '', ( -0.0666621542872701, 0.0284559068052891, -0.00256158806573390 ) ); +#940 = CARTESIAN_POINT( '', ( -0.0666078397098298, 0.0283383923802691, -0.00377900593498791 ) ); +#941 = CARTESIAN_POINT( '', ( -0.0665455901645436, 0.0280868607642046, -0.00517607722392667 ) ); +#942 = CARTESIAN_POINT( '', ( 0.0694836154580117, 0.0191419071944495, 0.00463145086541772 ) ); +#943 = CARTESIAN_POINT( '', ( 0.0643247096702335, 0.0194607604573522, 0.00601947385276100 ) ); +#944 = CARTESIAN_POINT( '', ( 0.0588851083327575, 0.0197019648133129, 0.00746055688892494 ) ); +#945 = CARTESIAN_POINT( '', ( 0.0481314135938109, 0.0200011437996338, 0.0101558553007855 ) ); +#946 = CARTESIAN_POINT( '', ( 0.0426921014641457, 0.0200753490151721, 0.0114460984059811 ) ); +#947 = CARTESIAN_POINT( '', ( 0.0318501199123147, 0.0201441676329741, 0.0138147286356203 ) ); +#948 = CARTESIAN_POINT( '', ( 0.0263809379808412, 0.0201429135844989, 0.0149136859831764 ) ); +#949 = CARTESIAN_POINT( '', ( 0.0154474124187311, 0.0201109135304834, 0.0169127254319475 ) ); +#950 = CARTESIAN_POINT( '', ( 0.00994948214903935, 0.0200802012600269, 0.0178199375767306 ) ); +#951 = CARTESIAN_POINT( '', ( -0.00108666760419048, 0.0201603522154555, 0.0192917713734006 ) ); +#952 = CARTESIAN_POINT( '', ( -0.00665349234706491, 0.0202700863362849, 0.0198668443735907 ) ); +#953 = CARTESIAN_POINT( '', ( -0.0150193924309207, 0.0207295206402392, 0.0202810584265473 ) ); +#954 = CARTESIAN_POINT( '', ( -0.0178136697316548, 0.0209323175580828, 0.0203436194818388 ) ); +#955 = CARTESIAN_POINT( '', ( -0.0233970711726944, 0.0214799495324946, 0.0202554452815069 ) ); +#956 = CARTESIAN_POINT( '', ( -0.0262103011250284, 0.0218281327703491, 0.0201041420568647 ) ); +#957 = CARTESIAN_POINT( '', ( -0.0317947068902024, 0.0227163544894120, 0.0194804205754932 ) ); +#958 = CARTESIAN_POINT( '', ( -0.0345868923303988, 0.0232618649898122, 0.0190055992915349 ) ); +#959 = CARTESIAN_POINT( '', ( -0.0386733460085433, 0.0242487001565301, 0.0179101002657916 ) ); +#960 = CARTESIAN_POINT( '', ( -0.0400265406930691, 0.0246092008033263, 0.0174752966927764 ) ); +#961 = CARTESIAN_POINT( '', ( -0.0426962548234996, 0.0253814063548345, 0.0164395600084408 ) ); +#962 = CARTESIAN_POINT( '', ( -0.0440127860322988, 0.0257937273051562, 0.0158367616658801 ) ); +#963 = CARTESIAN_POINT( '', ( -0.0465536418310586, 0.0266454069712859, 0.0144309460629292 ) ); +#964 = CARTESIAN_POINT( '', ( -0.0477868030722041, 0.0270885320488184, 0.0136218186834341 ) ); +#965 = CARTESIAN_POINT( '', ( -0.0501114557535610, 0.0279791308416144, 0.0117031951346540 ) ); +#966 = CARTESIAN_POINT( '', ( -0.0512097889838412, 0.0284324559317272, 0.0105689411228687 ) ); +#967 = CARTESIAN_POINT( '', ( -0.0524972537481801, 0.0290048408348668, 0.00866520037384563 ) ); +#968 = CARTESIAN_POINT( '', ( -0.0528669480617642, 0.0291780843224651, 0.00798810103670267 ) ); +#969 = CARTESIAN_POINT( '', ( -0.0534251768049525, 0.0294570761179292, 0.00661373388990257 ) ); +#970 = CARTESIAN_POINT( '', ( -0.0536081413806991, 0.0295606549347183, 0.00590742180925446 ) ); +#971 = CARTESIAN_POINT( '', ( -0.0537162620940607, 0.0296478110118307, 0.00495338349311285 ) ); +#972 = CARTESIAN_POINT( '', ( -0.0537252817851434, 0.0296659851871922, 0.00465064006334250 ) ); +#973 = CARTESIAN_POINT( '', ( -0.0537001825416978, 0.0296861727501444, 0.00409253662314327 ) ); +#974 = CARTESIAN_POINT( '', ( -0.0536657885410287, 0.0296880384592922, 0.00383711319634789 ) ); +#975 = CARTESIAN_POINT( '', ( -0.0535929180717767, 0.0296869051523706, 0.00348652784595499 ) ); +#976 = CARTESIAN_POINT( '', ( -0.0535646017241111, 0.0296859065068572, 0.00337404371214323 ) ); +#977 = CARTESIAN_POINT( '', ( -0.0535082230240340, 0.0296848450709272, 0.00317424815570601 ) ); +#978 = CARTESIAN_POINT( '', ( -0.0534799534981712, 0.0296847969173076, 0.00308529114921881 ) ); +#979 = CARTESIAN_POINT( '', ( -0.0534394536352563, 0.0296864219330641, 0.00296377683341918 ) ); +#980 = CARTESIAN_POINT( '', ( -0.0534266481226834, 0.0296872035752076, 0.00292639388125997 ) ); +#981 = CARTESIAN_POINT( '', ( -0.0534000790601429, 0.0296895738230758, 0.00284988696933058 ) ); +#982 = CARTESIAN_POINT( '', ( -0.0533849353359501, 0.0296912860091345, 0.00280691998962007 ) ); +#983 = CARTESIAN_POINT( '', ( -0.0533516463912372, 0.0296968674451558, 0.00271258344587871 ) ); +#984 = CARTESIAN_POINT( '', ( -0.0533334954465308, 0.0297007363137743, 0.00266123687897622 ) ); +#985 = CARTESIAN_POINT( '', ( -0.0533049805883363, 0.0297094664988672, 0.00257784819297182 ) ); +#986 = CARTESIAN_POINT( '', ( -0.0532952613864064, 0.0297128720878036, 0.00254896443733591 ) ); +#987 = CARTESIAN_POINT( '', ( -0.0532805212032089, 0.0297189316240584, 0.00250385463163317 ) ); +#988 = CARTESIAN_POINT( '', ( -0.0532755802180833, 0.0297211107641679, 0.00248851653832233 ) ); +#989 = CARTESIAN_POINT( '', ( -0.0532700067937514, 0.0297237622884048, 0.00247089979489733 ) ); +#990 = CARTESIAN_POINT( '', ( -0.0532693872431685, 0.0297240597166160, 0.00246893711409925 ) ); +#991 = CARTESIAN_POINT( '', ( -0.0532681477680690, 0.0297246602153892, 0.00246500154190726 ) ); +#992 = CARTESIAN_POINT( '', ( -0.0532673293057996, 0.0297246527862436, 0.00246782593388611 ) ); +#993 = CARTESIAN_POINT( '', ( -0.0532663741250778, 0.0297269867072207, 0.00244003095635415 ) ); +#994 = CARTESIAN_POINT( '', ( -0.0532658260374704, 0.0297286770077926, 0.00241916388271327 ) ); +#995 = CARTESIAN_POINT( '', ( -0.0532640331920667, 0.0297334989428421, 0.00235955180455471 ) ); +#996 = CARTESIAN_POINT( '', ( -0.0532628241132289, 0.0297366706278189, 0.00231934995445754 ) ); +#997 = CARTESIAN_POINT( '', ( -0.0532537740366666, 0.0297597830037314, 0.00201843506780343 ) ); +#998 = CARTESIAN_POINT( '', ( -0.0532452333439444, 0.0297780543542164, 0.00173445718496704 ) ); +#999 = CARTESIAN_POINT( '', ( -0.0532275079712381, 0.0298066441533176, 0.00114508885408161 ) ); +#1000 = CARTESIAN_POINT( '', ( -0.0532190102516258, 0.0298159801281185, 0.000862539826363207 ) ); +#1001 = CARTESIAN_POINT( '', ( -0.0532027089021942, 0.0298268193831120, 0.000320520244295217 ) ); +#1002 = CARTESIAN_POINT( '', ( -0.0531946039454059, 0.0298286327218192, 5.10305735672309E-05 ) ); +#1003 = CARTESIAN_POINT( '', ( -0.0531776999514600, 0.0298243844887254, -0.000511026927969829 ) ); +#1004 = CARTESIAN_POINT( '', ( -0.0531690086100755, 0.0298181991983306, -0.000800013876229679 ) ); +#1005 = CARTESIAN_POINT( '', ( -0.0531248714089447, 0.0297645674058115, -0.00226757503792036 ) ); +#1006 = CARTESIAN_POINT( '', ( -0.0530865259538606, 0.0296540797599882, -0.00354256074512161 ) ); +#1007 = CARTESIAN_POINT( '', ( -0.0530424222912323, 0.0294044509835572, -0.00500900675251367 ) ); +#1008 = CARTESIAN_POINT( '', ( 0.0694836154580116, 0.0191419071944495, 0.00463145086541772 ) ); +#1009 = CARTESIAN_POINT( '', ( 0.0641690759811638, 0.0202039546137935, 0.00606134768150407 ) ); +#1010 = CARTESIAN_POINT( '', ( 0.0588008691691839, 0.0209559560893042, 0.00748162025777226 ) ); +#1011 = CARTESIAN_POINT( '', ( 0.0480109221420702, 0.0220965552700963, 0.0101861053648128 ) ); +#1012 = CARTESIAN_POINT( '', ( 0.0425875478690584, 0.0224843368097248, 0.0114696554231641 ) ); +#1013 = CARTESIAN_POINT( '', ( 0.0317085560535202, 0.0230724853923180, 0.0138449243305319 ) ); +#1014 = CARTESIAN_POINT( '', ( 0.0262481164059888, 0.0232729761550313, 0.0149392047730151 ) ); +#1015 = CARTESIAN_POINT( '', ( 0.0153021068664016, 0.0235776768603239, 0.0169380115483504 ) ); +#1016 = CARTESIAN_POINT( '', ( 0.00983237830000406, 0.0236805412777613, 0.0178366396543255 ) ); +#1017 = CARTESIAN_POINT( '', ( -0.00111556669058941, 0.0240223765556888, 0.0192945199215330 ) ); +#1018 = CARTESIAN_POINT( '', ( -0.00658821302807713, 0.0242593075791512, 0.0198563132519936 ) ); +#1019 = CARTESIAN_POINT( '', ( -0.0147497555746435, 0.0249769885973268, 0.0202709649519929 ) ); +#1020 = CARTESIAN_POINT( '', ( -0.0174576595305775, 0.0252770024508426, 0.0203365953222647 ) ); +#1021 = CARTESIAN_POINT( '', ( -0.0228278627701086, 0.0260633438715471, 0.0202733841605519 ) ); +#1022 = CARTESIAN_POINT( '', ( -0.0255046898007140, 0.0265515491714946, 0.0201443837053642 ) ); +#1023 = CARTESIAN_POINT( '', ( -0.0307620287342813, 0.0278021553141756, 0.0196153063469558 ) ); +#1024 = CARTESIAN_POINT( '', ( -0.0333456216531482, 0.0285640586808797, 0.0192164600253740 ) ); +#1025 = CARTESIAN_POINT( '', ( -0.0370982186147320, 0.0300023884691647, 0.0183260969918296 ) ); +#1026 = CARTESIAN_POINT( '', ( -0.0383236957953477, 0.0305321228738084, 0.0179812016312168 ) ); +#1027 = CARTESIAN_POINT( '', ( -0.0407517050873639, 0.0316998509258020, 0.0171631919715141 ) ); +#1028 = CARTESIAN_POINT( '', ( -0.0419478122434517, 0.0323357100951563, 0.0166924764546819 ) ); +#1029 = CARTESIAN_POINT( '', ( -0.0442785441186665, 0.0337176772279002, 0.0156039064045223 ) ); +#1030 = CARTESIAN_POINT( '', ( -0.0454141976565052, 0.0344627032859808, 0.0149880410079849 ) ); +#1031 = CARTESIAN_POINT( '', ( -0.0476319107856152, 0.0361182240850138, 0.0135304642863491 ) ); +#1032 = CARTESIAN_POINT( '', ( -0.0487120637836850, 0.0370308478525777, 0.0126896437902420 ) ); +#1033 = CARTESIAN_POINT( '', ( -0.0501918108358767, 0.0385167452926618, 0.0111966027163773 ) ); +#1034 = CARTESIAN_POINT( '', ( -0.0506584627227205, 0.0390285798312668, 0.0106627693726993 ) ); +#1035 = CARTESIAN_POINT( '', ( -0.0515164144955420, 0.0400671352072925, 0.00950449476957227 ) ); +#1036 = CARTESIAN_POINT( '', ( -0.0519112379304215, 0.0406000277666403, 0.00887278287376696 ) ); +#1037 = CARTESIAN_POINT( '', ( -0.0524055253451901, 0.0413485523040352, 0.00786733726294770 ) ); +#1038 = CARTESIAN_POINT( '', ( -0.0525543021144705, 0.0415894642547636, 0.00752256000026954 ) ); +#1039 = CARTESIAN_POINT( '', ( -0.0528161488706745, 0.0420441252773342, 0.00681074804127565 ) ); +#1040 = CARTESIAN_POINT( '', ( -0.0529299601884255, 0.0422587875042904, 0.00644317166688663 ) ); +#1041 = CARTESIAN_POINT( '', ( -0.0530728419124045, 0.0425589541732990, 0.00585300857144681 ) ); +#1042 = CARTESIAN_POINT( '', ( -0.0531158757620716, 0.0426559503153109, 0.00564748643319060 ) ); +#1043 = CARTESIAN_POINT( '', ( -0.0531858780603611, 0.0428272071328920, 0.00525251741011486 ) ); +#1044 = CARTESIAN_POINT( '', ( -0.0532136642001081, 0.0429029821472133, 0.00506056038267944 ) ); +#1045 = CARTESIAN_POINT( '', ( -0.0532462408151039, 0.0430035543792972, 0.00478065615729620 ) ); +#1046 = CARTESIAN_POINT( '', ( -0.0532553358388410, 0.0430339751546512, 0.00469153895690649 ) ); +#1047 = CARTESIAN_POINT( '', ( -0.0532718179516892, 0.0430947878444922, 0.00450346097706421 ) ); +#1048 = CARTESIAN_POINT( '', ( -0.0532800051880828, 0.0431282784618679, 0.00439483851463647 ) ); +#1049 = CARTESIAN_POINT( '', ( -0.0532934026657377, 0.0431981780830640, 0.00414675394956592 ) ); +#1050 = CARTESIAN_POINT( '', ( -0.0532986214936261, 0.0432345977213267, 0.00400728149011546 ) ); +#1051 = CARTESIAN_POINT( '', ( -0.0533012712585152, 0.0432880676972484, 0.00377326712473545 ) ); +#1052 = CARTESIAN_POINT( '', ( -0.0533012821772134, 0.0433056870408364, 0.00369112470836251 ) ); +#1053 = CARTESIAN_POINT( '', ( -0.0532995296831139, 0.0433312864917623, 0.00356148288436688 ) ); +#1054 = CARTESIAN_POINT( '', ( -0.0532986500384456, 0.0433396806497115, 0.00351719757304502 ) ); +#1055 = CARTESIAN_POINT( '', ( -0.0532972802496586, 0.0433489135634316, 0.00346615094844438 ) ); +#1056 = CARTESIAN_POINT( '', ( -0.0532971227669525, 0.0433499365167858, 0.00346046207972167 ) ); +#1057 = CARTESIAN_POINT( '', ( -0.0532967970615578, 0.0433519763712742, 0.00344905022765815 ) ); +#1058 = CARTESIAN_POINT( '', ( -0.0532967859960819, 0.0433529934666169, 0.00344858196230312 ) ); +#1059 = CARTESIAN_POINT( '', ( -0.0532955479173552, 0.0433560341256059, 0.00340741586640301 ) ); +#1060 = CARTESIAN_POINT( '', ( -0.0532946443051548, 0.0433580444843198, 0.00337737077662396 ) ); +#1061 = CARTESIAN_POINT( '', ( -0.0532920282244962, 0.0433640224986759, 0.00329038614071389 ) ); +#1062 = CARTESIAN_POINT( '', ( -0.0532902640602500, 0.0433679371421515, 0.00323172771054145 ) ); +#1063 = CARTESIAN_POINT( '', ( -0.0532770587152355, 0.0433963259191464, 0.00279265022094251 ) ); +#1064 = CARTESIAN_POINT( '', ( -0.0532646011072636, 0.0434179611907555, 0.00237843497486873 ) ); +#1065 = CARTESIAN_POINT( '', ( -0.0532387570574105, 0.0434492541794316, 0.00151912077156366 ) ); +#1066 = CARTESIAN_POINT( '', ( -0.0532263719836776, 0.0434578523584382, 0.00110731728766099 ) ); +#1067 = CARTESIAN_POINT( '', ( -0.0532026205930219, 0.0434639888374617, 0.000317583965881856 ) ); +#1068 = CARTESIAN_POINT( '', ( -0.0531908152569356, 0.0434618121390966, -7.49432514631313E-05 ) ); +#1069 = CARTESIAN_POINT( '', ( -0.0531662024053930, 0.0434455943161150, -0.000893320132588198 ) ); +#1070 = CARTESIAN_POINT( '', ( -0.0531535516577460, 0.0434314290118855, -0.00131395726946386 ) ); +#1071 = CARTESIAN_POINT( '', ( -0.0530893109620517, 0.0433271250188174, -0.00344995927202012 ) ); +#1072 = CARTESIAN_POINT( '', ( -0.0530335763666726, 0.0431433306009137, -0.00530313358862338 ) ); +#1073 = CARTESIAN_POINT( '', ( -0.0529696431840111, 0.0427550414874563, -0.00742891078824148 ) ); +#1080 = SURFACE_STYLE_FILL_AREA( #1220 ); +#1081 = ORIENTED_EDGE( '', *, *, #1221, .T. ); +#1082 = ORIENTED_EDGE( '', *, *, #1222, .T. ); +#1083 = ORIENTED_EDGE( '', *, *, #1223, .F. ); +#1084 = ORIENTED_EDGE( '', *, *, #1224, .T. ); +#1085 = CARTESIAN_POINT( '', ( -0.0532965101301670, 0.400000000000000, 0.00343940942548216 ) ); +#1086 = CARTESIAN_POINT( '', ( -0.0529236682414016, 0.400000000000000, -0.00222776276841670 ) ); +#1087 = CARTESIAN_POINT( '', ( -0.0283500454020692, 0.400000000000000, 0.000689010657937705 ) ); +#1088 = CARTESIAN_POINT( '', ( 0.00566517592916088, 0.400000000000000, 0.00385661377523630 ) ); +#1089 = CARTESIAN_POINT( '', ( 0.0517703147850388, 0.400000000000000, 0.00697250301460056 ) ); +#1090 = CARTESIAN_POINT( '', ( 0.0693533048033715, 0.400000000000000, 0.00370415160432457 ) ); +#1091 = DIRECTION( '', ( 0.00000000000000, -1.00000000000000, 0.00000000000000 ) ); +#1092 = SURFACE_STYLE_FILL_AREA( #1225 ); +#1093 = ORIENTED_EDGE( '', *, *, #1226, .T. ); +#1094 = ORIENTED_EDGE( '', *, *, #1227, .T. ); +#1095 = ORIENTED_EDGE( '', *, *, #1228, .F. ); +#1096 = ORIENTED_EDGE( '', *, *, #1229, .T. ); +#1097 = SURFACE_STYLE_FILL_AREA( #1230 ); +#1098 = ORIENTED_EDGE( '', *, *, #1222, .F. ); +#1099 = ORIENTED_EDGE( '', *, *, #1231, .F. ); +#1100 = ORIENTED_EDGE( '', *, *, #1232, .T. ); +#1101 = ORIENTED_EDGE( '', *, *, #1233, .F. ); +#1102 = SURFACE_STYLE_FILL_AREA( #1234 ); +#1103 = ORIENTED_EDGE( '', *, *, #1235, .F. ); +#1104 = ORIENTED_EDGE( '', *, *, #1221, .F. ); +#1105 = ORIENTED_EDGE( '', *, *, #1236, .F. ); +#1106 = ORIENTED_EDGE( '', *, *, #1237, .T. ); +#1107 = CARTESIAN_POINT( '', ( 0.0694184601306915, 0.400000000000000, 0.00416780123487115 ) ); +#1108 = DIRECTION( '', ( -0.990269946274707, 0.00000000000000, 0.139159740963719 ) ); +#1109 = DIRECTION( '', ( 0.139159740963719, 0.00000000000000, 0.990269946274707 ) ); +#1110 = SURFACE_STYLE_FILL_AREA( #1238 ); +#1111 = ORIENTED_EDGE( '', *, *, #1227, .F. ); +#1112 = ORIENTED_EDGE( '', *, *, #1239, .F. ); +#1113 = ORIENTED_EDGE( '', *, *, #1240, .T. ); +#1114 = ORIENTED_EDGE( '', *, *, #1241, .T. ); +#1115 = ORIENTED_EDGE( '', *, *, #1242, .F. ); +#1116 = CARTESIAN_POINT( '', ( -0.0532965101301670, -0.400000000000000, 0.00343940942548240 ) ); +#1117 = CARTESIAN_POINT( '', ( -0.0534951835870743, -0.400000000000000, 0.0100452983751895 ) ); +#1118 = CARTESIAN_POINT( '', ( -0.0364378771469696, -0.400000000000000, 0.0245493400805307 ) ); +#1119 = CARTESIAN_POINT( '', ( 0.0241224432897519, -0.400000000000000, 0.0164604041971117 ) ); +#1120 = CARTESIAN_POINT( '', ( 0.0547200557612873, -0.400000000000000, 0.00860364207717048 ) ); +#1121 = CARTESIAN_POINT( '', ( 0.0694836154580116, -0.400000000000000, 0.00463145086541796 ) ); +#1122 = DIRECTION( '', ( 1.23052249786856E-17, 1.00000000000000, -6.12323399573677E-16 ) ); +#1123 = SURFACE_STYLE_FILL_AREA( #1243 ); +#1124 = ORIENTED_EDGE( '', *, *, #1244, .T. ); +#1125 = ORIENTED_EDGE( '', *, *, #1236, .T. ); +#1126 = ORIENTED_EDGE( '', *, *, #1224, .F. ); +#1127 = CARTESIAN_POINT( '', ( 0.00799421593546867, 0.400000000000000, 0.0117409116751992 ) ); +#1128 = DIRECTION( '', ( 0.00000000000000, -1.00000000000000, 0.00000000000000 ) ); +#1129 = DIRECTION( '', ( 1.00000000000000, 0.00000000000000, 0.00000000000000 ) ); +#1130 = SURFACE_STYLE_FILL_AREA( #1245 ); +#1131 = ORIENTED_EDGE( '', *, *, #1246, .T. ); +#1132 = ORIENTED_EDGE( '', *, *, #1241, .F. ); +#1133 = ORIENTED_EDGE( '', *, *, #1247, .T. ); +#1134 = ORIENTED_EDGE( '', *, *, #1248, .T. ); +#1135 = CARTESIAN_POINT( '', ( 0.0694184601306915, -0.400000000000000, 0.00416780123487139 ) ); +#1136 = DIRECTION( '', ( -0.990269946274707, 9.73962601492381E-17, 0.139159740963719 ) ); +#1137 = DIRECTION( '', ( 0.139159740963719, 6.04653068078036E-16, 0.990269946274707 ) ); +#1138 = SURFACE_STYLE_FILL_AREA( #1249 ); +#1139 = ORIENTED_EDGE( '', *, *, #1233, .T. ); +#1140 = ORIENTED_EDGE( '', *, *, #1250, .T. ); +#1141 = ORIENTED_EDGE( '', *, *, #1237, .F. ); +#1142 = ORIENTED_EDGE( '', *, *, #1244, .F. ); +#1143 = ORIENTED_EDGE( '', *, *, #1223, .T. ); +#1144 = CARTESIAN_POINT( '', ( -0.0532965101301670, 0.400000000000000, 0.00343940942548216 ) ); +#1145 = CARTESIAN_POINT( '', ( -0.0534951835870743, 0.400000000000000, 0.0100452983751893 ) ); +#1146 = CARTESIAN_POINT( '', ( -0.0364378771469696, 0.400000000000000, 0.0245493400805304 ) ); +#1147 = CARTESIAN_POINT( '', ( 0.0241224432897519, 0.400000000000000, 0.0164604041971115 ) ); +#1148 = CARTESIAN_POINT( '', ( 0.0547200557612873, 0.400000000000000, 0.00860364207717023 ) ); +#1149 = CARTESIAN_POINT( '', ( 0.0694836154580116, 0.400000000000000, 0.00463145086541772 ) ); +#1150 = DIRECTION( '', ( 0.00000000000000, -1.00000000000000, 0.00000000000000 ) ); +#1151 = SURFACE_STYLE_FILL_AREA( #1251 ); +#1152 = ORIENTED_EDGE( '', *, *, #1240, .F. ); +#1153 = ORIENTED_EDGE( '', *, *, #1252, .T. ); +#1154 = ORIENTED_EDGE( '', *, *, #1247, .F. ); +#1155 = CARTESIAN_POINT( '', ( 0.00799421593546867, -0.400000000000000, 0.0117409116751995 ) ); +#1156 = DIRECTION( '', ( 1.23052249786856E-17, 1.00000000000000, -6.12323399573677E-16 ) ); +#1157 = DIRECTION( '', ( 1.00000000000000, -1.23052249786856E-17, 3.76738859573385E-33 ) ); +#1158 = SURFACE_STYLE_FILL_AREA( #1253 ); +#1159 = ORIENTED_EDGE( '', *, *, #1254, .T. ); +#1160 = ORIENTED_EDGE( '', *, *, #1228, .T. ); +#1161 = ORIENTED_EDGE( '', *, *, #1242, .T. ); +#1162 = SURFACE_STYLE_FILL_AREA( #1255 ); +#1163 = ORIENTED_EDGE( '', *, *, #1256, .F. ); +#1164 = ORIENTED_EDGE( '', *, *, #1257, .T. ); +#1165 = CARTESIAN_POINT( '', ( 0.0855121847450269, 2.99620357321681E-18, 0.0170472582209232 ) ); +#1166 = DIRECTION( '', ( -6.15261248934280E-18, -1.00000000000000, 3.06161699786839E-16 ) ); +#1167 = DIRECTION( '', ( 1.00000000000000, -6.15261248934280E-18, 6.15261248934280E-18 ) ); +#1168 = SURFACE_STYLE_FILL_AREA( #1258 ); +#1169 = ORIENTED_EDGE( '', *, *, #1257, .F. ); +#1170 = ORIENTED_EDGE( '', *, *, #1256, .T. ); +#1171 = ORIENTED_EDGE( '', *, *, #1259, .T. ); +#1172 = ORIENTED_EDGE( '', *, *, #1231, .T. ); +#1173 = ORIENTED_EDGE( '', *, *, #1235, .T. ); +#1174 = CARTESIAN_POINT( '', ( -0.137850114450625, -8.48752308726683E-19, -1.65742903555131E-18 ) ); +#1175 = CARTESIAN_POINT( '', ( -0.137850114450625, 1.38214926025960E-18, 0.00728667749930682 ) ); +#1176 = CARTESIAN_POINT( '', ( -0.0977169822433808, 7.38646904023919E-18, 0.0277047879121596 ) ); +#1177 = CARTESIAN_POINT( '', ( -0.00992200133263989, 8.87446655702053E-18, 0.0343292808328824 ) ); +#1178 = CARTESIAN_POINT( '', ( 0.183871036847927, -2.90005374730091E-18, -0.000234764391036044 ) ); +#1179 = CARTESIAN_POINT( '', ( 0.299713641405106, -7.59530860773236E-19, 0.00908468198031192 ) ); +#1180 = CARTESIAN_POINT( '', ( 0.308874483940678, -3.59727565208566E-18, -1.85704763287042E-18 ) ); +#1181 = CARTESIAN_POINT( '', ( 0.0855121847450269, -1.37456865812971E-18, 0.00000000000000 ) ); +#1182 = DIRECTION( '', ( 1.00000000000000, -6.15261248934280E-18, -0.00000000000000 ) ); +#1183 = SURFACE_STYLE_FILL_AREA( #1260 ); +#1184 = ORIENTED_EDGE( '', *, *, #1248, .F. ); +#1185 = ORIENTED_EDGE( '', *, *, #1252, .F. ); +#1186 = ORIENTED_EDGE( '', *, *, #1239, .T. ); +#1187 = ORIENTED_EDGE( '', *, *, #1226, .F. ); +#1188 = CARTESIAN_POINT( '', ( -0.0532965101301670, -0.400000000000000, 0.00343940942548240 ) ); +#1189 = CARTESIAN_POINT( '', ( -0.0529236682414017, -0.400000000000000, -0.00222776276841646 ) ); +#1190 = CARTESIAN_POINT( '', ( -0.0283500454020693, -0.400000000000000, 0.000689010657937950 ) ); +#1191 = CARTESIAN_POINT( '', ( 0.00566517592916088, -0.400000000000000, 0.00385661377523655 ) ); +#1192 = CARTESIAN_POINT( '', ( 0.0517703147850388, -0.400000000000000, 0.00697250301460080 ) ); +#1193 = CARTESIAN_POINT( '', ( 0.0693533048033715, -0.400000000000000, 0.00370415160432482 ) ); +#1194 = DIRECTION( '', ( 1.23052249786856E-17, 1.00000000000000, -6.12323399573677E-16 ) ); +#1195 = SURFACE_STYLE_FILL_AREA( #1261 ); +#1196 = ORIENTED_EDGE( '', *, *, #1262, .T. ); +#1197 = ORIENTED_EDGE( '', *, *, #1263, .F. ); +#1198 = CARTESIAN_POINT( '', ( 0.0855121847450269, 6.38998486232267E-18, 0.0170472582209232 ) ); +#1199 = DIRECTION( '', ( 6.15261248934280E-18, 1.00000000000000, -3.06161699786839E-16 ) ); +#1200 = DIRECTION( '', ( 1.00000000000000, -6.15261248934280E-18, 6.15261248934280E-18 ) ); +#1201 = SURFACE_STYLE_FILL_AREA( #1264 ); +#1202 = ORIENTED_EDGE( '', *, *, #1263, .T. ); +#1203 = ORIENTED_EDGE( '', *, *, #1262, .F. ); +#1204 = ORIENTED_EDGE( '', *, *, #1254, .F. ); +#1205 = ORIENTED_EDGE( '', *, *, #1246, .F. ); +#1206 = ORIENTED_EDGE( '', *, *, #1229, .F. ); +#1207 = CARTESIAN_POINT( '', ( -0.137850114450625, 2.54502898037918E-18, -1.65742903555131E-18 ) ); +#1208 = CARTESIAN_POINT( '', ( -0.137850114450625, 4.77593054936546E-18, 0.00728667749930682 ) ); +#1209 = CARTESIAN_POINT( '', ( -0.0977169822433808, 1.07802503293450E-17, 0.0277047879121596 ) ); +#1210 = CARTESIAN_POINT( '', ( -0.00992200133263989, 1.22682478461264E-17, 0.0343292808328824 ) ); +#1211 = CARTESIAN_POINT( '', ( 0.183871036847927, 4.93727541804947E-19, -0.000234764391036044 ) ); +#1212 = CARTESIAN_POINT( '', ( 0.299713641405106, 2.63425042833262E-18, 0.00908468198031192 ) ); +#1213 = CARTESIAN_POINT( '', ( 0.308874483940678, -2.03494362979802E-19, -1.85704763287042E-18 ) ); +#1214 = CARTESIAN_POINT( '', ( 0.0855121847450269, 3.22321986423223E-19, -5.19522924088709E-34 ) ); +#1215 = DIRECTION( '', ( 1.00000000000000, -6.15261248934280E-18, -0.00000000000000 ) ); +#1216 = SURFACE_STYLE_FILL_AREA( #1265 ); +#1217 = ORIENTED_EDGE( '', *, *, #1259, .F. ); +#1218 = ORIENTED_EDGE( '', *, *, #1250, .F. ); +#1219 = ORIENTED_EDGE( '', *, *, #1232, .F. ); +#1220 = FILL_AREA_STYLE( '', ( #1266 ) ); +#1221 = EDGE_CURVE( '', #1267, #1268, #1269, .T. ); +#1222 = EDGE_CURVE( '', #1268, #1270, #1271, .T. ); +#1223 = EDGE_CURVE( '', #1272, #1270, #1273, .T. ); +#1224 = EDGE_CURVE( '', #1272, #1267, #1274, .T. ); +#1225 = FILL_AREA_STYLE( '', ( #1275 ) ); +#1226 = EDGE_CURVE( '', #1276, #1277, #1278, .F. ); +#1227 = EDGE_CURVE( '', #1277, #1279, #1280, .F. ); +#1228 = EDGE_CURVE( '', #1281, #1279, #1282, .F. ); +#1229 = EDGE_CURVE( '', #1281, #1276, #1283, .F. ); +#1230 = FILL_AREA_STYLE( '', ( #1284 ) ); +#1231 = EDGE_CURVE( '', #1285, #1268, #1286, .T. ); +#1232 = EDGE_CURVE( '', #1285, #1287, #1288, .T. ); +#1233 = EDGE_CURVE( '', #1270, #1287, #1289, .T. ); +#1234 = FILL_AREA_STYLE( '', ( #1290 ) ); +#1235 = EDGE_CURVE( '', #1268, #1291, #1292, .T. ); +#1236 = EDGE_CURVE( '', #1293, #1267, #1294, .T. ); +#1237 = EDGE_CURVE( '', #1293, #1291, #1295, .T. ); +#1238 = FILL_AREA_STYLE( '', ( #1296 ) ); +#1239 = EDGE_CURVE( '', #1297, #1277, #1298, .T. ); +#1240 = EDGE_CURVE( '', #1297, #1299, #1300, .T. ); +#1241 = EDGE_CURVE( '', #1299, #1301, #1302, .T. ); +#1242 = EDGE_CURVE( '', #1279, #1301, #1303, .F. ); +#1243 = FILL_AREA_STYLE( '', ( #1304 ) ); +#1244 = EDGE_CURVE( '', #1272, #1293, #1305, .T. ); +#1245 = FILL_AREA_STYLE( '', ( #1306 ) ); +#1246 = EDGE_CURVE( '', #1276, #1301, #1307, .T. ); +#1247 = EDGE_CURVE( '', #1299, #1308, #1309, .T. ); +#1248 = EDGE_CURVE( '', #1308, #1276, #1310, .T. ); +#1249 = FILL_AREA_STYLE( '', ( #1311 ) ); +#1250 = EDGE_CURVE( '', #1287, #1291, #1312, .T. ); +#1251 = FILL_AREA_STYLE( '', ( #1313 ) ); +#1252 = EDGE_CURVE( '', #1297, #1308, #1314, .T. ); +#1253 = FILL_AREA_STYLE( '', ( #1315 ) ); +#1254 = EDGE_CURVE( '', #1301, #1281, #1316, .F. ); +#1255 = FILL_AREA_STYLE( '', ( #1317 ) ); +#1256 = EDGE_CURVE( '', #1318, #1319, #1320, .T. ); +#1257 = EDGE_CURVE( '', #1318, #1319, #1321, .T. ); +#1258 = FILL_AREA_STYLE( '', ( #1322 ) ); +#1259 = EDGE_CURVE( '', #1291, #1285, #1323, .T. ); +#1260 = FILL_AREA_STYLE( '', ( #1324 ) ); +#1261 = FILL_AREA_STYLE( '', ( #1325 ) ); +#1262 = EDGE_CURVE( '', #1326, #1327, #1328, .T. ); +#1263 = EDGE_CURVE( '', #1326, #1327, #1329, .T. ); +#1264 = FILL_AREA_STYLE( '', ( #1330 ) ); +#1265 = FILL_AREA_STYLE( '', ( #1331 ) ); +#1266 = FILL_AREA_STYLE_COLOUR( '', #1332 ); +#1267 = VERTEX_POINT( '', #1333 ); +#1268 = VERTEX_POINT( '', #1334 ); +#1269 = LINE( '', #1335, #1336 ); +#1270 = VERTEX_POINT( '', #1337 ); +#1271 = B_SPLINE_CURVE_WITH_KNOTS( '', 3, ( #1338, #1339, #1340, #1341, #1342, #1343, #1344, #1345, #1346, #1347, #1348, #1349, #1350, #1351, #1352, #1353, #1354, #1355, #1356, #1357, #1358, #1359, #1360, #1361, #1362, #1363, #1364, #1365, #1366, #1367, #1368, #1369, #1370, #1371, #1372, #1373, #1374, #1375, #1376, #1377, #1378, #1379, #1380, #1381, #1382, #1383, #1384, #1385, #1386 ), .UNSPECIFIED., .F., .F., ( 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4 ), ( 0.00000000000000, 0.00689022690607843, 0.0140334899600277, 0.0214335262240529, 0.0290938779298514, 0.0370178692195279, 0.0452085820393672, 0.0536688312414035, 0.0624011389426533, 0.0898920090242147, 0.124508790567960, 0.155176182293752, 0.186375327509241, 0.206682211915613, 0.227276172722141, 0.248126126746490, 0.292018816309169, 0.333268609466304, 0.371620556044654, 0.435685759852337, 0.495574564035765, 0.558263687997047, 0.619975211254184, 0.682435279766762, 0.745328872137144, 0.776965330641446, 0.808301148285554, 0.828321317079568, 0.849592892826148, 0.871714534940984, 0.880101514385216, 0.903122455006389, 0.921460127165153, 0.934152568075109, 0.942541401993082, 0.949518134912384, 0.957992162335394, 0.965226690466539, 0.973549535815423, 0.977909466197110, 0.982319983640192, 0.986955300861010, 0.990781950419681, 0.992887555805202, 0.995029807674022, 0.997447736547404, 1.00000000000000 ), .UNSPECIFIED. ); +#1272 = VERTEX_POINT( '', #1387 ); +#1273 = LINE( '', #1388, #1389 ); +#1274 = B_SPLINE_CURVE_WITH_KNOTS( '', 3, ( #1390, #1391, #1392, #1393, #1394, #1395 ), .UNSPECIFIED., .F., .F., ( 4, 1, 1, 4 ), ( 0.00000000000000, 0.239391242362016, 0.578687076655342, 1.00000000000000 ), .UNSPECIFIED. ); +#1275 = FILL_AREA_STYLE_COLOUR( '', #1396 ); +#1276 = VERTEX_POINT( '', #1397 ); +#1277 = VERTEX_POINT( '', #1398 ); +#1278 = B_SPLINE_CURVE_WITH_KNOTS( '', 3, ( #1399, #1400, #1401, #1402, #1403, #1404, #1405, #1406, #1407, #1408, #1409, #1410, #1411, #1412, #1413, #1414, #1415, #1416, #1417, #1418, #1419, #1420, #1421, #1422, #1423, #1424, #1425, #1426, #1427, #1428, #1429, #1430, #1431, #1432, #1433, #1434, #1435, #1436, #1437, #1438, #1439, #1440, #1441, #1442, #1443, #1444, #1445, #1446, #1447, #1448, #1449, #1450, #1451, #1452 ), .UNSPECIFIED., .F., .F., ( 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4 ), ( 0.00000000000000, 9.88200095517477E-05, 0.000587291519072775, 0.00156423453811483, 0.00351812057620071, 0.00742589265237292, 0.0152414368047167, 0.0230569809570607, 0.0308725251094044, 0.0386880692617482, 0.0465036134140902, 0.0621347017187779, 0.0777657900234658, 0.0933968783281516, 0.109027966632839, 0.124659054937527, 0.155921231546901, 0.187183408156274, 0.218445584765648, 0.249707761375024, 0.374756467812518, 0.499805174250014, 0.624853880687511, 0.749902587125007, 0.874951293562503, 0.937475646781253, 1.00000000000000 ), .UNSPECIFIED. ); +#1279 = VERTEX_POINT( '', #1453 ); +#1280 = ( BOUNDED_CURVE( )B_SPLINE_CURVE( 2, ( #1456, #1457, #1458 ), .UNSPECIFIED., .F., .F. )B_SPLINE_CURVE_WITH_KNOTS( ( 3, 3 ), ( 0.00000000000000, 1.00000000000000 ), .UNSPECIFIED. )CURVE( )GEOMETRIC_REPRESENTATION_ITEM( )RATIONAL_B_SPLINE_CURVE( ( 0.999082926470136, 0.999540471294838, 0.999999628520138 ) )REPRESENTATION_ITEM( '' ) ); +#1281 = VERTEX_POINT( '', #1464 ); +#1282 = B_SPLINE_CURVE_WITH_KNOTS( '', 3, ( #1465, #1466, #1467, #1468, #1469, #1470, #1471, #1472, #1473, #1474, #1475, #1476, #1477, #1478, #1479, #1480, #1481, #1482, #1483, #1484, #1485, #1486, #1487, #1488, #1489, #1490, #1491, #1492, #1493, #1494, #1495, #1496, #1497, #1498, #1499, #1500, #1501, #1502, #1503, #1504, #1505, #1506, #1507, #1508, #1509, #1510, #1511, #1512, #1513 ), .UNSPECIFIED., .F., .F., ( 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4 ), ( 0.00000000000000, 0.0175788246062748, 0.0347702818091491, 0.0515553700026682, 0.0679160149503796, 0.0838350892124909, 0.0992964230738540, 0.114284807495129, 0.128785989676875, 0.142786661878995, 0.156274444176741, 0.169237861859891, 0.181666318194672, 0.193550063269718, 0.204880159638947, 0.215648445457014, 0.225847495778504, 0.235470582661542, 0.244511634681578, 0.252965196423291, 0.260826388479418, 0.268090868446738, 0.274754793374053, 0.280814784088662, 0.286267891814407, 0.376669673076997, 0.443090423656863, 0.484621639136216, 0.501004593988885, 0.518974290011935, 0.538241150995313, 0.558794934203211, 0.580621825521851, 0.603703936189455, 0.628018807433455, 0.653538937766834, 0.680231354282197, 0.708057370170338, 0.736972115501565, 0.766924290359314, 0.797856103584685, 0.829703289727969, 0.862395267018691, 0.895855446145794, 0.930001694331242, 0.964746952936514, 1.00000000000000 ), .UNSPECIFIED. ); +#1283 = B_SPLINE_CURVE_WITH_KNOTS( '', 3, ( #1514, #1515, #1516, #1517, #1518, #1519, #1520, #1521, #1522, #1523, #1524, #1525, #1526, #1527, #1528, #1529, #1530, #1531, #1532, #1533, #1534, #1535, #1536, #1537, #1538, #1539, #1540, #1541, #1542, #1543, #1544, #1545, #1546, #1547, #1548, #1549, #1550, #1551, #1552, #1553, #1554, #1555, #1556, #1557, #1558, #1559, #1560, #1561, #1562, #1563, #1564, #1565, #1566, #1567, #1568, #1569, #1570, #1571 ), .UNSPECIFIED., .F., .F., ( 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4 ), ( 0.00000000000000, 0.0624999999999991, 0.125000000000000, 0.250000000000000, 0.375000000000001, 0.500000000000001, 0.625000000000001, 0.750000000000000, 0.781250000000001, 0.812500000000001, 0.843750000000000, 0.875000000000000, 0.890625000000001, 0.906250000000002, 0.921875000000000, 0.937500000000001, 0.953125000000002, 0.960937500000000, 0.968750000000000, 0.976562500000001, 0.984375000000001, 0.992187500000002, 0.996093750000002, 0.998046875000002, 0.999023437500001, 0.999511718750001, 0.999633789062501, 0.999755859375000, 1.00000000000000 ), .UNSPECIFIED. ); +#1284 = FILL_AREA_STYLE_COLOUR( '', #1572 ); +#1285 = VERTEX_POINT( '', #1573 ); +#1286 = B_SPLINE_CURVE_WITH_KNOTS( '', 3, ( #1574, #1575, #1576, #1577, #1578, #1579, #1580, #1581, #1582, #1583, #1584, #1585, #1586, #1587, #1588, #1589, #1590, #1591, #1592, #1593, #1594, #1595, #1596, #1597, #1598, #1599, #1600, #1601, #1602, #1603, #1604, #1605, #1606, #1607, #1608, #1609, #1610, #1611, #1612, #1613, #1614, #1615, #1616, #1617, #1618, #1619 ), .UNSPECIFIED., .F., .F., ( 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4 ), ( 0.00000000000000, 0.00248031638781802, 0.00468559506628753, 0.00661745392712146, 0.00983186768081871, 0.0130585454371441, 0.0194958498084898, 0.0260399881198390, 0.0396178452960476, 0.0540065249228954, 0.0676628821750199, 0.0821203073303989, 0.106235139893556, 0.135167000197221, 0.167497158185208, 0.180632414662155, 0.194663319783929, 0.215444925069195, 0.239099399070592, 0.257267100599835, 0.281473584870197, 0.312027458985485, 0.349332177453405, 0.405194911753387, 0.457146757727556, 0.513221979746225, 0.565569928807608, 0.619076561452022, 0.673741466818234, 0.726045092300358, 0.781471005662724, 0.805885913486852, 0.835467791582042, 0.865437452675072, 0.883580066950666, 0.889743731909715, 0.910762869945431, 0.929027651504924, 0.944505220870431, 0.957078676191427, 0.968918568452000, 0.980020865435718, 0.990382218489177, 1.00000000000000 ), .UNSPECIFIED. ); +#1287 = VERTEX_POINT( '', #1620 ); +#1288 = B_SPLINE_CURVE_WITH_KNOTS( '', 3, ( #1621, #1622, #1623, #1624, #1625, #1626, #1627, #1628, #1629, #1630, #1631, #1632, #1633, #1634, #1635, #1636, #1637, #1638, #1639, #1640, #1641, #1642, #1643, #1644, #1645, #1646, #1647, #1648, #1649, #1650, #1651, #1652, #1653, #1654, #1655, #1656, #1657, #1658, #1659, #1660, #1661, #1662, #1663, #1664, #1665, #1666, #1667, #1668, #1669, #1670, #1671, #1672, #1673, #1674, #1675, #1676, #1677 ), .UNSPECIFIED., .F., .F., ( 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4 ), ( 0.00000000000000, 0.0161627137485338, 0.0322245160534040, 0.0481763185471945, 0.0640091825641373, 0.0797143378941944, 0.0952832003975932, 0.110707388390584, 0.125978737726649, 0.141089315511346, 0.156031432403075, 0.170797653466264, 0.185380807557373, 0.199773995237627, 0.213970595219391, 0.227964269365240, 0.241748966270114, 0.255318923467339, 0.268668668308497, 0.281793017575345, 0.294687075888956, 0.307346232987090, 0.319766159945490, 0.331942804422347, 0.343872385007636, 0.355551384760316, 0.366976544017470, 0.378144852558635, 0.389053541207098, 0.399700072948622, 0.410082133645472, 0.420197622420611, 0.430044641783566, 0.439621487565738, 0.448926638728961, 0.457958747106963, 0.466716627135144, 0.475199245619787, 0.483405711593564, 0.491335266300022, 0.498987273345667, 0.536022871446084, 0.573074732858296, 0.610087312779215, 0.647005896179863, 0.683777082389731, 0.720347290454282, 0.756664643773182, 0.792679484261005, 0.828344757356724, 0.863616340410501, 0.898453317378018, 0.932818204492966, 0.966677133350172, 1.00000000000000 ), .UNSPECIFIED. ); +#1289 = B_SPLINE_CURVE_WITH_KNOTS( '', 3, ( #1678, #1679, #1680, #1681 ), .UNSPECIFIED., .F., .F., ( 4, 4 ), ( 0.00000000000000, 1.00000000000000 ), .UNSPECIFIED. ); +#1290 = FILL_AREA_STYLE_COLOUR( '', #1682 ); +#1291 = VERTEX_POINT( '', #1683 ); +#1292 = B_SPLINE_CURVE_WITH_KNOTS( '', 3, ( #1684, #1685, #1686, #1687 ), .UNSPECIFIED., .F., .F., ( 4, 4 ), ( 0.00000000000000, 0.000961273454260169 ), .UNSPECIFIED. ); +#1293 = VERTEX_POINT( '', #1688 ); +#1294 = LINE( '', #1689, #1690 ); +#1295 = LINE( '', #1691, #1692 ); +#1296 = FILL_AREA_STYLE_COLOUR( '', #1693 ); +#1297 = VERTEX_POINT( '', #1694 ); +#1298 = LINE( '', #1695, #1696 ); +#1299 = VERTEX_POINT( '', #1697 ); +#1300 = B_SPLINE_CURVE_WITH_KNOTS( '', 3, ( #1698, #1699, #1700, #1701, #1702, #1703 ), .UNSPECIFIED., .F., .F., ( 4, 1, 1, 4 ), ( 0.00000000000000, 0.239380222557408, 0.640067607836079, 1.00000000000000 ), .UNSPECIFIED. ); +#1301 = VERTEX_POINT( '', #1704 ); +#1302 = LINE( '', #1705, #1706 ); +#1303 = B_SPLINE_CURVE_WITH_KNOTS( '', 3, ( #1707, #1708, #1709, #1710, #1711, #1712, #1713, #1714, #1715, #1716, #1717, #1718, #1719, #1720, #1721, #1722, #1723, #1724, #1725, #1726, #1727, #1728, #1729, #1730, #1731, #1732, #1733, #1734, #1735, #1736, #1737, #1738, #1739, #1740, #1741, #1742, #1743, #1744, #1745, #1746, #1747, #1748, #1749, #1750, #1751, #1752, #1753, #1754, #1755, #1756, #1757, #1758 ), .UNSPECIFIED., .F., .F., ( 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4 ), ( 0.00000000000000, 0.125046480227357, 0.250092960454713, 0.375139440682070, 0.500185920909426, 0.625232401136783, 0.687755641250461, 0.750278881364139, 0.812802121477817, 0.844063741534656, 0.875325361591496, 0.906586981648335, 0.937848601705173, 0.953479411733594, 0.969110221762013, 0.976925626776222, 0.984741031790432, 0.988648734297536, 0.992556436804643, 0.994510288058195, 0.996464139311747, 0.998417990565300, 0.999394916192075, 0.999883379005464, 0.999944436857138, 1.00000000000000 ), .UNSPECIFIED. ); +#1304 = FILL_AREA_STYLE_COLOUR( '', #1759 ); +#1305 = B_SPLINE_CURVE_WITH_KNOTS( '', 3, ( #1760, #1761, #1762, #1763, #1764, #1765 ), .UNSPECIFIED., .F., .F., ( 4, 1, 1, 4 ), ( 0.00000000000000, 0.239380222557408, 0.640067607836079, 1.00000000000000 ), .UNSPECIFIED. ); +#1306 = FILL_AREA_STYLE_COLOUR( '', #1766 ); +#1307 = B_SPLINE_CURVE_WITH_KNOTS( '', 3, ( #1767, #1768, #1769, #1770 ), .UNSPECIFIED., .F., .F., ( 4, 4 ), ( 0.00000000000000, 0.000961273454260169 ), .UNSPECIFIED. ); +#1308 = VERTEX_POINT( '', #1771 ); +#1309 = LINE( '', #1772, #1773 ); +#1310 = LINE( '', #1774, #1775 ); +#1311 = FILL_AREA_STYLE_COLOUR( '', #1776 ); +#1312 = B_SPLINE_CURVE_WITH_KNOTS( '', 3, ( #1777, #1778, #1779, #1780, #1781, #1782, #1783, #1784, #1785, #1786, #1787, #1788, #1789, #1790, #1791, #1792, #1793, #1794, #1795, #1796, #1797, #1798, #1799, #1800, #1801, #1802, #1803, #1804, #1805, #1806, #1807, #1808, #1809, #1810, #1811, #1812, #1813, #1814, #1815, #1816, #1817, #1818, #1819, #1820, #1821, #1822, #1823, #1824, #1825, #1826 ), .UNSPECIFIED., .F., .F., ( 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4 ), ( 0.00000000000000, 0.000446944246481258, 0.00114570110918917, 0.00209564813463714, 0.00329543572915897, 0.00541625134031885, 0.00927157238411698, 0.0161723254542552, 0.0232922904897623, 0.0311067452233375, 0.0413692146854357, 0.0536439683692715, 0.0645409646592811, 0.0793495252929882, 0.0972148660800895, 0.103692376457873, 0.119547835366667, 0.134458508553778, 0.148317234498617, 0.169698382589451, 0.190010527304828, 0.209203042688537, 0.228908350966962, 0.249169061810684, 0.270012958287947, 0.308027554416025, 0.349543786293018, 0.387531601473712, 0.429586505621412, 0.466800358786924, 0.510236597787666, 0.542863572383007, 0.591324475208191, 0.636757671244566, 0.672786648294618, 0.719405407519743, 0.761848132952663, 0.800617375097028, 0.836117639508221, 0.856870119030796, 0.876894653526407, 0.896238381489009, 0.914942935477539, 0.933044848136295, 0.950575946377255, 0.967563734112199, 0.984031764139864, 1.00000000000000 ), .UNSPECIFIED. ); +#1313 = FILL_AREA_STYLE_COLOUR( '', #1827 ); +#1314 = B_SPLINE_CURVE_WITH_KNOTS( '', 3, ( #1828, #1829, #1830, #1831, #1832, #1833 ), .UNSPECIFIED., .F., .F., ( 4, 1, 1, 4 ), ( 0.00000000000000, 0.239391242362016, 0.578687076655342, 1.00000000000000 ), .UNSPECIFIED. ); +#1315 = FILL_AREA_STYLE_COLOUR( '', #1834 ); +#1316 = B_SPLINE_CURVE_WITH_KNOTS( '', 3, ( #1835, #1836, #1837, #1838, #1839, #1840, #1841, #1842, #1843, #1844, #1845, #1846, #1847, #1848, #1849, #1850, #1851, #1852, #1853, #1854, #1855, #1856, #1857, #1858, #1859, #1860, #1861, #1862, #1863, #1864, #1865, #1866, #1867, #1868, #1869, #1870, #1871, #1872, #1873, #1874, #1875, #1876, #1877, #1878, #1879, #1880, #1881, #1882, #1883, #1884, #1885, #1886, #1887, #1888, #1889, #1890 ), .UNSPECIFIED., .F., .F., ( 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4 ), ( 0.00000000000000, 0.000244140625000426, 0.000366210937501285, 0.000427246093750099, 0.000488281250000421, 0.000976562500001057, 0.00195312499999996, 0.00390624999999992, 0.00585937499999989, 0.00781249999999963, 0.0117187500000015, 0.0156250000000012, 0.0234375000000008, 0.0312500000000006, 0.0468749999999998, 0.0625000000000011, 0.0937499999999997, 0.125000000000000, 0.156250000000001, 0.187500000000000, 0.250000000000000, 0.312500000000000, 0.375000000000000, 0.500000000000000, 0.625000000000000, 0.750000000000000, 0.875000000000000, 1.00000000000000 ), .UNSPECIFIED. ); +#1317 = FILL_AREA_STYLE_COLOUR( '', #1891 ); +#1318 = VERTEX_POINT( '', #1892 ); +#1319 = VERTEX_POINT( '', #1893 ); +#1320 = B_SPLINE_CURVE_WITH_KNOTS( '', 3, ( #1894, #1895, #1896, #1897, #1898, #1899, #1900 ), .UNSPECIFIED., .F., .F., ( 4, 1, 1, 1, 4 ), ( 0.00000000000000, 0.151648070701946, 0.385343354126889, 0.742908913194043, 1.00000000000000 ), .UNSPECIFIED. ); +#1321 = B_SPLINE_CURVE_WITH_KNOTS( '', 3, ( #1901, #1902, #1903, #1904, #1905, #1906, #1907 ), .UNSPECIFIED., .F., .F., ( 4, 1, 1, 1, 4 ), ( 0.00000000000000, 0.151648070701946, 0.385343354126889, 0.742908913194043, 1.00000000000000 ), .UNSPECIFIED. ); +#1322 = FILL_AREA_STYLE_COLOUR( '', #1908 ); +#1323 = B_SPLINE_CURVE_WITH_KNOTS( '', 3, ( #1909, #1910, #1911, #1912, #1913, #1914, #1915, #1916, #1917, #1918, #1919, #1920, #1921, #1922, #1923, #1924, #1925, #1926, #1927, #1928, #1929, #1930, #1931, #1932, #1933, #1934, #1935, #1936, #1937, #1938, #1939, #1940, #1941, #1942, #1943, #1944, #1945, #1946, #1947, #1948, #1949, #1950, #1951, #1952, #1953, #1954, #1955, #1956, #1957, #1958, #1959, #1960, #1961, #1962, #1963 ), .UNSPECIFIED., .F., .F., ( 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4 ), ( 0.00000000000000, 0.00756594188503339, 0.0152180275596247, 0.0229559827957812, 0.0307794938894266, 0.0386882079894793, 0.0466817333769494, 0.0547596396967693, 0.0629214581449604, 0.0711666816135803, 0.0794947647958285, 0.0879051242535299, 0.0963971384491236, 0.104970147744188, 0.113623454366423, 0.122356322346906, 0.131167977429391, 0.140057606953264, 0.149024359711776, 0.158067345787023, 0.167185636363125, 0.176378263518965, 0.185644220001804, 0.194982458983018, 0.204391893797170, 0.213871397665574, 0.223419803405464, 0.250289008297021, 0.277914224943015, 0.306257713388116, 0.335277657574664, 0.392373381707927, 0.447918895924363, 0.506686573581626, 0.562521985328050, 0.624351254284887, 0.681417747981768, 0.728320875828063, 0.772017366311615, 0.813165459054029, 0.842096443275943, 0.868672716507699, 0.893235816478495, 0.919128950774593, 0.942385075979492, 0.956105188606548, 0.969104023808742, 0.976002705753153, 0.982777863590405, 0.985394442969945, 0.988006807491034, 0.993714504093511, 1.00000000000000 ), .UNSPECIFIED. ); +#1324 = FILL_AREA_STYLE_COLOUR( '', #1964 ); +#1325 = FILL_AREA_STYLE_COLOUR( '', #1965 ); +#1326 = VERTEX_POINT( '', #1966 ); +#1327 = VERTEX_POINT( '', #1967 ); +#1328 = B_SPLINE_CURVE_WITH_KNOTS( '', 3, ( #1968, #1969, #1970, #1971, #1972, #1973, #1974 ), .UNSPECIFIED., .F., .F., ( 4, 1, 1, 1, 4 ), ( 0.00000000000000, 0.151648070701946, 0.385343354126889, 0.742908913194043, 1.00000000000000 ), .UNSPECIFIED. ); +#1329 = B_SPLINE_CURVE_WITH_KNOTS( '', 3, ( #1975, #1976, #1977, #1978, #1979, #1980, #1981 ), .UNSPECIFIED., .F., .F., ( 4, 1, 1, 1, 4 ), ( 0.00000000000000, 0.151648070701946, 0.385343354126889, 0.742908913194043, 1.00000000000000 ), .UNSPECIFIED. ); +#1330 = FILL_AREA_STYLE_COLOUR( '', #1982 ); +#1331 = FILL_AREA_STYLE_COLOUR( '', #1983 ); +#1332 = COLOUR_RGB( '', 0.647058844600000, 0.647058844600000, 0.647058844600000 ); +#1333 = CARTESIAN_POINT( '', ( 0.0693533048033714, 0.400000000000000, 0.00370415160432457 ) ); +#1334 = CARTESIAN_POINT( '', ( 0.0693533048033714, 0.0193591210695326, 0.00370415160432457 ) ); +#1335 = CARTESIAN_POINT( '', ( 0.0693533048033714, 0.400000000000000, 0.00370415160432457 ) ); +#1336 = VECTOR( '', #1984, 1.00000000000000 ); +#1337 = CARTESIAN_POINT( '', ( -0.0532965104833789, 0.0433892845136069, 0.00343942117022943 ) ); +#1338 = CARTESIAN_POINT( '', ( 0.0693533048033715, 0.0193591210695325, 0.00370415160432457 ) ); +#1339 = CARTESIAN_POINT( '', ( 0.0690770909003153, 0.0194469671299613, 0.00375457094989768 ) ); +#1340 = CARTESIAN_POINT( '', ( 0.0685145194366761, 0.0196258853025934, 0.00385726123710248 ) ); +#1341 = CARTESIAN_POINT( '', ( 0.0676538379078527, 0.0199011997012896, 0.00400215990797954 ) ); +#1342 = CARTESIAN_POINT( '', ( 0.0667612056284909, 0.0201876178384559, 0.00414351599210076 ) ); +#1343 = CARTESIAN_POINT( '', ( 0.0658360674297071, 0.0204853154655854, 0.00428002312891588 ) ); +#1344 = CARTESIAN_POINT( '', ( 0.0648780486058335, 0.0207942430438186, 0.00441155744437398 ) ); +#1345 = CARTESIAN_POINT( '', ( 0.0638867697797741, 0.0211144131696871, 0.00453767113816603 ) ); +#1346 = CARTESIAN_POINT( '', ( 0.0628619038465633, 0.0214458265396136, 0.00465802172301526 ) ); +#1347 = CARTESIAN_POINT( '', ( 0.0610561844308174, 0.0220302072610441, 0.00485282807621547 ) ); +#1348 = CARTESIAN_POINT( '', ( 0.0581887663229853, 0.0229595750815253, 0.00510798118115930 ) ); +#1349 = CARTESIAN_POINT( '', ( 0.0544230515773641, 0.0241682097852647, 0.00534048363434725 ) ); +#1350 = CARTESIAN_POINT( '', ( 0.0504959370339356, 0.0254045988616485, 0.00549027502672123 ) ); +#1351 = CARTESIAN_POINT( '', ( 0.0471450096097914, 0.0264433229050878, 0.00555398403761846 ) ); +#1352 = CARTESIAN_POINT( '', ( 0.0441999210260446, 0.0273398391820817, 0.00556954326632289 ) ); +#1353 = CARTESIAN_POINT( '', ( 0.0416720811718616, 0.0280894634746408, 0.00555772650667424 ) ); +#1354 = CARTESIAN_POINT( '', ( 0.0381736463361261, 0.0291069614098254, 0.00550911233363180 ) ); +#1355 = CARTESIAN_POINT( '', ( 0.0338177095523127, 0.0303302580930053, 0.00539136845492763 ) ); +#1356 = CARTESIAN_POINT( '', ( 0.0287268719456517, 0.0316887745060166, 0.00518070017172267 ) ); +#1357 = CARTESIAN_POINT( '', ( 0.0227875756941635, 0.0331917955222766, 0.00486808072517846 ) ); +#1358 = CARTESIAN_POINT( '', ( 0.0160508971907638, 0.0347620374477747, 0.00443231178017715 ) ); +#1359 = CARTESIAN_POINT( '', ( 0.00827196443640327, 0.0363952963861108, 0.00384960645669099 ) ); +#1360 = CARTESIAN_POINT( '', ( 0.000557872270561304, 0.0378265616525311, 0.00323758954556272 ) ); +#1361 = CARTESIAN_POINT( '', ( -0.00729586599645770, 0.0390744767360574, 0.00257891080642720 ) ); +#1362 = CARTESIAN_POINT( '', ( -0.0151863720569771, 0.0400995398623063, 0.00186800205603898 ) ); +#1363 = CARTESIAN_POINT( '', ( -0.0218285169516121, 0.0407438789133416, 0.00122159275466752 ) ); +#1364 = CARTESIAN_POINT( '', ( -0.0271614019517019, 0.0411232327059491, 0.000673243362605509 ) ); +#1365 = CARTESIAN_POINT( '', ( -0.0306805585246276, 0.0413093139148785, 0.000299599151072510 ) ); +#1366 = CARTESIAN_POINT( '', ( -0.0337614352772328, 0.0414213378458736, -3.58939745127363E-05 ) ); +#1367 = CARTESIAN_POINT( '', ( -0.0364520640832622, 0.0414855500172669, -0.000331946958987316 ) ); +#1368 = CARTESIAN_POINT( '', ( -0.0386521994213929, 0.0415180878071336, -0.000549592695124902 ) ); +#1369 = CARTESIAN_POINT( '', ( -0.0409302154705244, 0.0415311791676286, -0.000735008776855851 ) ); +#1370 = CARTESIAN_POINT( '', ( -0.0430512215916743, 0.0415442898536408, -0.000860130465439043 ) ); +#1371 = CARTESIAN_POINT( '', ( -0.0453603635958171, 0.0415661121057140, -0.000875118138685477 ) ); +#1372 = CARTESIAN_POINT( '', ( -0.0470415008781150, 0.0416078364642337, -0.000777242962087493 ) ); +#1373 = CARTESIAN_POINT( '', ( -0.0482295857574151, 0.0416736131779923, -0.000630021879564249 ) ); +#1374 = CARTESIAN_POINT( '', ( -0.0492265400361881, 0.0417649693967253, -0.000441538625193977 ) ); +#1375 = CARTESIAN_POINT( '', ( -0.0501525598710050, 0.0419103948423079, -0.000185439491393198 ) ); +#1376 = CARTESIAN_POINT( '', ( -0.0510773482336438, 0.0421627386888482, 0.000192874439046084 ) ); +#1377 = CARTESIAN_POINT( '', ( -0.0517560351131423, 0.0424886980745642, 0.000606331593422680 ) ); +#1378 = CARTESIAN_POINT( '', ( -0.0522458526201176, 0.0428272608760656, 0.00103067657129363 ) ); +#1379 = CARTESIAN_POINT( '', ( -0.0525821319927783, 0.0430987989853410, 0.00140807496528841 ) ); +#1380 = CARTESIAN_POINT( '', ( -0.0528577862596070, 0.0433277853845506, 0.00182864334625832 ) ); +#1381 = CARTESIAN_POINT( '', ( -0.0530392899072385, 0.0434555707369049, 0.00222613233917922 ) ); +#1382 = CARTESIAN_POINT( '', ( -0.0531475815743871, 0.0434953452650551, 0.00255227611798897 ) ); +#1383 = CARTESIAN_POINT( '', ( -0.0532170084206477, 0.0434953976732235, 0.00282899473230303 ) ); +#1384 = CARTESIAN_POINT( '', ( -0.0532700097912753, 0.0434631954961819, 0.00312756741249670 ) ); +#1385 = CARTESIAN_POINT( '', ( -0.0532875189378722, 0.0434143614731774, 0.00333360581610851 ) ); +#1386 = CARTESIAN_POINT( '', ( -0.0532965101301670, 0.0433892845176025, 0.00343940942548216 ) ); +#1387 = CARTESIAN_POINT( '', ( -0.0532965101301670, 0.400000000000000, 0.00343940942548216 ) ); +#1388 = CARTESIAN_POINT( '', ( -0.0532965101301670, 0.400000000000000, 0.00343940942548216 ) ); +#1389 = VECTOR( '', #1985, 1.00000000000000 ); +#1390 = CARTESIAN_POINT( '', ( -0.0532965101301670, 0.400000000000000, 0.00343940942548216 ) ); +#1391 = CARTESIAN_POINT( '', ( -0.0529236682414016, 0.400000000000000, -0.00222776276841670 ) ); +#1392 = CARTESIAN_POINT( '', ( -0.0283500454020692, 0.400000000000000, 0.000689010657937705 ) ); +#1393 = CARTESIAN_POINT( '', ( 0.00566517592916088, 0.400000000000000, 0.00385661377523630 ) ); +#1394 = CARTESIAN_POINT( '', ( 0.0517703147850388, 0.400000000000000, 0.00697250301460056 ) ); +#1395 = CARTESIAN_POINT( '', ( 0.0693533048033715, 0.400000000000000, 0.00370415160432457 ) ); +#1396 = COLOUR_RGB( '', 0.647058844600000, 0.647058844600000, 0.647058844600000 ); +#1397 = CARTESIAN_POINT( '', ( 0.0693533048033714, -0.0193591210695326, 0.00370415160432459 ) ); +#1398 = CARTESIAN_POINT( '', ( -0.0532965104833789, -0.0433892845136069, 0.00343942117022945 ) ); +#1399 = CARTESIAN_POINT( '', ( -0.0532965109318374, -0.0433892987870815, 0.00343943435830842 ) ); +#1400 = CARTESIAN_POINT( '', ( -0.0532955789450765, -0.0433907332571486, 0.00342530605060230 ) ); +#1401 = CARTESIAN_POINT( '', ( -0.0532957129151924, -0.0433921571638971, 0.00342747179298361 ) ); +#1402 = CARTESIAN_POINT( '', ( -0.0532934058019060, -0.0434005677248049, 0.00339428916354447 ) ); +#1403 = CARTESIAN_POINT( '', ( -0.0532912253948317, -0.0434073302003497, 0.00336644654110380 ) ); +#1404 = CARTESIAN_POINT( '', ( -0.0532838443093318, -0.0434267906183907, 0.00328226176219134 ) ); +#1405 = CARTESIAN_POINT( '', ( -0.0532776417455970, -0.0434388222723248, 0.00322420027067874 ) ); +#1406 = CARTESIAN_POINT( '', ( -0.0532569961541920, -0.0434684522884171, 0.00306052519148980 ) ); +#1407 = CARTESIAN_POINT( '', ( -0.0532408996223807, -0.0434803895629964, 0.00296448436287202 ) ); +#1408 = CARTESIAN_POINT( '', ( -0.0531856345509266, -0.0435011889864556, 0.00268867052183029 ) ); +#1409 = CARTESIAN_POINT( '', ( -0.0531365482418410, -0.0434940327746878, 0.00251199801243281 ) ); +#1410 = CARTESIAN_POINT( '', ( -0.0529591254986711, -0.0434136081372272, 0.00201559957676413 ) ); +#1411 = CARTESIAN_POINT( '', ( -0.0527991076383562, -0.0432797945122916, 0.00172025368355520 ) ); +#1412 = CARTESIAN_POINT( '', ( -0.0523976769991102, -0.0429473208257671, 0.00118147378184144 ) ); +#1413 = CARTESIAN_POINT( '', ( -0.0521593197030119, -0.0427578609789788, 0.000944613165741870 ) ); +#1414 = CARTESIAN_POINT( '', ( -0.0516397600238076, -0.0424337796496477, 0.000536167217203414 ) ); +#1415 = CARTESIAN_POINT( '', ( -0.0513579404697644, -0.0422964829206747, 0.000363017689249577 ) ); +#1416 = CARTESIAN_POINT( '', ( -0.0507688054226550, -0.0420770122780616, 6.50193333880485E-05 ) ); +#1417 = CARTESIAN_POINT( '', ( -0.0504615907882494, -0.0419933259926960, -5.97038080293960E-05 ) ); +#1418 = CARTESIAN_POINT( '', ( -0.0498389858082419, -0.0418610781953754, -0.000271411935586759 ) ); +#1419 = CARTESIAN_POINT( '', ( -0.0495266848203537, -0.0418124449645948, -0.000357820030714355 ) ); +#1420 = CARTESIAN_POINT( '', ( -0.0485658315497535, -0.0416938692733487, -0.000581014693949919 ) ); +#1421 = CARTESIAN_POINT( '', ( -0.0479242315256405, -0.0416532467443129, -0.000675394701242241 ) ); +#1422 = CARTESIAN_POINT( '', ( -0.0466130600142234, -0.0415952100369516, -0.000806402532980248 ) ); +#1423 = CARTESIAN_POINT( '', ( -0.0459550642097339, -0.0415797857896056, -0.000840552568345336 ) ); +#1424 = CARTESIAN_POINT( '', ( -0.0446305846101389, -0.0415581067334646, -0.000869429667588777 ) ); +#1425 = CARTESIAN_POINT( '', ( -0.0439639731928960, -0.0415522769328363, -0.000863752597228429 ) ); +#1426 = CARTESIAN_POINT( '', ( -0.0426302996737868, -0.0415429890655192, -0.000825355581689191 ) ); +#1427 = CARTESIAN_POINT( '', ( -0.0419657094009150, -0.0415395754458813, -0.000792734789455270 ) ); +#1428 = CARTESIAN_POINT( '', ( -0.0406298777088851, -0.0415315960864344, -0.000708832258471119 ) ); +#1429 = CARTESIAN_POINT( '', ( -0.0399546843751176, -0.0415271702319105, -0.000657106786645576 ) ); +#1430 = CARTESIAN_POINT( '', ( -0.0379333172631551, -0.0415085691837988, -0.000483545315485825 ) ); +#1431 = CARTESIAN_POINT( '', ( -0.0366007769381703, -0.0414887685354734, -0.000344926032121224 ) ); +#1432 = CARTESIAN_POINT( '', ( -0.0339066851857667, -0.0414251787568609, -5.36582304640227E-05 ) ); +#1433 = CARTESIAN_POINT( '', ( -0.0325458783577641, -0.0413807195980484, 9.70916979150059E-05 ) ); +#1434 = CARTESIAN_POINT( '', ( -0.0298571361924550, -0.0412654024016009, 0.000386938542240794 ) ); +#1435 = CARTESIAN_POINT( '', ( -0.0285264500478985, -0.0411950395942611, 0.000528307484000488 ) ); +#1436 = CARTESIAN_POINT( '', ( -0.0258576964800841, -0.0410301660998887, 0.000807296592032621 ) ); +#1437 = CARTESIAN_POINT( '', ( -0.0245229832876291, -0.0409356092959497, 0.000944542515443657 ) ); +#1438 = CARTESIAN_POINT( '', ( -0.0178622362935748, -0.0404051504152805, 0.00161740850194910 ) ); +#1439 = CARTESIAN_POINT( '', ( -0.0125598360520481, -0.0397955646735621, 0.00211275314425499 ) ); +#1440 = CARTESIAN_POINT( '', ( -0.00203962334103179, -0.0382787268670233, 0.00302811289043587 ) ); +#1441 = CARTESIAN_POINT( '', ( 0.00317539928664909, -0.0373727793181302, 0.00345015821870362 ) ); +#1442 = CARTESIAN_POINT( '', ( 0.0135429761878093, -0.0353207863866082, 0.00425115848547986 ) ); +#1443 = CARTESIAN_POINT( '', ( 0.0187076500880150, -0.0341729556019719, 0.00462267431181238 ) ); +#1444 = CARTESIAN_POINT( '', ( 0.0289528783971528, -0.0316588134411239, 0.00520872320256118 ) ); +#1445 = CARTESIAN_POINT( '', ( 0.0340360440496324, -0.0302922783951462, 0.00542624655913420 ) ); +#1446 = CARTESIAN_POINT( '', ( 0.0441755235454418, -0.0273738365643854, 0.00561053420907344 ) ); +#1447 = CARTESIAN_POINT( '', ( 0.0492128672660333, -0.0258220955287610, 0.00558115454022278 ) ); +#1448 = CARTESIAN_POINT( '', ( 0.0567757515649417, -0.0234153874619387, 0.00520917386539241 ) ); +#1449 = CARTESIAN_POINT( '', ( 0.0592933982529094, -0.0226009900139395, 0.00502981481237106 ) ); +#1450 = CARTESIAN_POINT( '', ( 0.0643289327612552, -0.0209708423417502, 0.00450969444119862 ) ); +#1451 = CARTESIAN_POINT( '', ( 0.0668462332366741, -0.0201552116105254, 0.00417016966394554 ) ); +#1452 = CARTESIAN_POINT( '', ( 0.0693533048033715, -0.0193591210695326, 0.00370415160432459 ) ); +#1453 = CARTESIAN_POINT( '', ( -0.0532964927479410, -0.0433536809119412, 0.00343883271860510 ) ); +#1456 = CARTESIAN_POINT( '', ( -0.0532964412371230, -0.0433537837439189, 0.00343773914251416 ) ); +#1457 = CARTESIAN_POINT( '', ( -0.0532964723910012, -0.0433715077763713, 0.00343885034482449 ) ); +#1458 = CARTESIAN_POINT( '', ( -0.0532965455217999, -0.0433892318585928, 0.00343995878004800 ) ); +#1464 = CARTESIAN_POINT( '', ( -0.0668552608835381, -0.0284745709810872, 0.00178682684124731 ) ); +#1465 = CARTESIAN_POINT( '', ( -0.0532964753657149, -0.0433537332995508, 0.00343825601172751 ) ); +#1466 = CARTESIAN_POINT( '', ( -0.0532971879203262, -0.0432241842855638, 0.00342960684573119 ) ); +#1467 = CARTESIAN_POINT( '', ( -0.0532985973276781, -0.0429679410027894, 0.00341249910696925 ) ); +#1468 = CARTESIAN_POINT( '', ( -0.0533130999820735, -0.0425882803212071, 0.00338635935391257 ) ); +#1469 = CARTESIAN_POINT( '', ( -0.0533358858909402, -0.0422180849394660, 0.00336037952920013 ) ); +#1470 = CARTESIAN_POINT( '', ( -0.0533671134296283, -0.0418579361263151, 0.00333461794062810 ) ); +#1471 = CARTESIAN_POINT( '', ( -0.0534058139806998, -0.0415083564829117, 0.00330919567386016 ) ); +#1472 = CARTESIAN_POINT( '', ( -0.0534512884324317, -0.0411698136626408, 0.00328420281861911 ) ); +#1473 = CARTESIAN_POINT( '', ( -0.0535027546582487, -0.0408427202626741, 0.00325972372486328 ) ); +#1474 = CARTESIAN_POINT( '', ( -0.0535594456626702, -0.0405274354704074, 0.00323583159192488 ) ); +#1475 = CARTESIAN_POINT( '', ( -0.0536205913989522, -0.0402242669454584, 0.00321259094864606 ) ); +#1476 = CARTESIAN_POINT( '', ( -0.0536854299459589, -0.0399334732415776, 0.00319005809278950 ) ); +#1477 = CARTESIAN_POINT( '', ( -0.0537532106568093, -0.0396552666011119, 0.00316828201798860 ) ); +#1478 = CARTESIAN_POINT( '', ( -0.0538231988087499, -0.0393898160747282, 0.00314730516710154 ) ); +#1479 = CARTESIAN_POINT( '', ( -0.0538946793124187, -0.0391372508897251, 0.00312716416838509 ) ); +#1480 = CARTESIAN_POINT( '', ( -0.0539669600998086, -0.0388976640010302, 0.00310789050467218 ) ); +#1481 = CARTESIAN_POINT( '', ( -0.0540393750444070, -0.0386711157603198, 0.00308951112208364 ) ); +#1482 = CARTESIAN_POINT( '', ( -0.0541112864691069, -0.0384576376458720, 0.00307204896633048 ) ); +#1483 = CARTESIAN_POINT( '', ( -0.0541820872580528, -0.0382572359942450, 0.00305552346220296 ) ); +#1484 = CARTESIAN_POINT( '', ( -0.0542512025920604, -0.0380698957035085, 0.00303995087328695 ) ); +#1485 = CARTESIAN_POINT( '', ( -0.0543180913743011, -0.0378955838051916, 0.00302534474842618 ) ); +#1486 = CARTESIAN_POINT( '', ( -0.0543822472582263, -0.0377342530730544, 0.00301171575269910 ) ); +#1487 = CARTESIAN_POINT( '', ( -0.0544431997216804, -0.0375858449505821, 0.00299907323809051 ) ); +#1488 = CARTESIAN_POINT( '', ( -0.0545005138630609, -0.0374502940553966, 0.00298742072399121 ) ); +#1489 = CARTESIAN_POINT( '', ( -0.0545537934296202, -0.0373275267216077, 0.00297677106123258 ) ); +#1490 = CARTESIAN_POINT( '', ( -0.0548583468411884, -0.0366418412518012, 0.00291649765795206 ) ); +#1491 = CARTESIAN_POINT( '', ( -0.0554216351900977, -0.0355834479549802, 0.00281887186697276 ) ); +#1492 = CARTESIAN_POINT( '', ( -0.0562537811647990, -0.0343813913919984, 0.00269637401646899 ) ); +#1493 = CARTESIAN_POINT( '', ( -0.0568335733728396, -0.0336724062115256, 0.00262163553200950 ) ); +#1494 = CARTESIAN_POINT( '', ( -0.0572054895683623, -0.0332554795356821, 0.00257682634932614 ) ); +#1495 = CARTESIAN_POINT( '', ( -0.0574756798269296, -0.0329677277317765, 0.00254418034251376 ) ); +#1496 = CARTESIAN_POINT( '', ( -0.0577753480183202, -0.0326657357252249, 0.00250917051767725 ) ); +#1497 = CARTESIAN_POINT( '', ( -0.0581043957681586, -0.0323531613703130, 0.00247179870489563 ) ); +#1498 = CARTESIAN_POINT( '', ( -0.0584640800535385, -0.0320323650263074, 0.00243230872610293 ) ); +#1499 = CARTESIAN_POINT( '', ( -0.0588555351481897, -0.0317059602435310, 0.00239085507556263 ) ); +#1500 = CARTESIAN_POINT( '', ( -0.0592797317287284, -0.0313768009346921, 0.00234765453527405 ) ); +#1501 = CARTESIAN_POINT( '', ( -0.0597374282055834, -0.0310479743668268, 0.00230293598448357 ) ); +#1502 = CARTESIAN_POINT( '', ( -0.0602291244605034, -0.0307227794920284, 0.00225697521095048 ) ); +#1503 = CARTESIAN_POINT( '', ( -0.0607550091451878, -0.0304047084488659, 0.00220997973038150 ) ); +#1504 = CARTESIAN_POINT( '', ( -0.0613149183353346, -0.0300974009061381, 0.00216220246413450 ) ); +#1505 = CARTESIAN_POINT( '', ( -0.0619082926883537, -0.0298045967322878, 0.00211392874328996 ) ); +#1506 = CARTESIAN_POINT( '', ( -0.0625341423244310, -0.0295300877576370, 0.00206544767198223 ) ); +#1507 = CARTESIAN_POINT( '', ( -0.0631910193555223, -0.0292776265754180, 0.00201705329835477 ) ); +#1508 = CARTESIAN_POINT( '', ( -0.0638770128387902, -0.0290509531270046, 0.00196904241790377 ) ); +#1509 = CARTESIAN_POINT( '', ( -0.0645897115978793, -0.0288533354094044, 0.00192168943760532 ) ); +#1510 = CARTESIAN_POINT( '', ( -0.0653263579551799, -0.0286889658893654, 0.00187531667203809 ) ); +#1511 = CARTESIAN_POINT( '', ( -0.0660833396963963, -0.0285572134975039, 0.00182999350205294 ) ); +#1512 = CARTESIAN_POINT( '', ( -0.0665967124351507, -0.0285022513903649, 0.00180128514782300 ) ); +#1513 = CARTESIAN_POINT( '', ( -0.0668552608835383, -0.0284745709810869, 0.00178682684125237 ) ); +#1514 = CARTESIAN_POINT( '', ( 0.0693533048033715, -0.0193591210695326, 0.00370415160432458 ) ); +#1515 = CARTESIAN_POINT( '', ( 0.0667058694409421, -0.0197056333265326, 0.00363077968371243 ) ); +#1516 = CARTESIAN_POINT( '', ( 0.0640917763588146, -0.0200697254662340, 0.00343478326499825 ) ); +#1517 = CARTESIAN_POINT( '', ( 0.0589094699403461, -0.0207927787442985, 0.00293434889074103 ) ); +#1518 = CARTESIAN_POINT( '', ( 0.0563422902165441, -0.0211520665244603, 0.00262747460243457 ) ); +#1519 = CARTESIAN_POINT( '', ( 0.0486747749560920, -0.0221989651941210, 0.00162811957750628 ) ); +#1520 = CARTESIAN_POINT( '', ( 0.0436249889767960, -0.0228523255961816, 0.000860081144564746 ) ); +#1521 = CARTESIAN_POINT( '', ( 0.0335173561999578, -0.0240462927992094, -0.000700016694566884 ) ); +#1522 = CARTESIAN_POINT( '', ( 0.0284799256287902, -0.0245867880430304, -0.00149751881323853 ) ); +#1523 = CARTESIAN_POINT( '', ( 0.0183572511870987, -0.0255597142074450, -0.00306321507609866 ) ); +#1524 = CARTESIAN_POINT( '', ( 0.0132716921228300, -0.0259922941640531, -0.00383393039891068 ) ); +#1525 = CARTESIAN_POINT( '', ( 0.00304583943413600, -0.0267478443117049, -0.00529580321902737 ) ); +#1526 = CARTESIAN_POINT( '', ( -0.00208009819624626, -0.0270715002177851, -0.00598071181933509 ) ); +#1527 = CARTESIAN_POINT( '', ( -0.0123072138172379, -0.0275783949241999, -0.00728085775544191 ) ); +#1528 = CARTESIAN_POINT( '', ( -0.0174099365910672, -0.0277603483038352, -0.00789751580841742 ) ); +#1529 = CARTESIAN_POINT( '', ( -0.0237799013506103, -0.0278709223868793, -0.00863094383113887 ) ); +#1530 = CARTESIAN_POINT( '', ( -0.0250544115885846, -0.0278872388622220, -0.00877575322083382 ) ); +#1531 = CARTESIAN_POINT( '', ( -0.0275995711568395, -0.0279074984997185, -0.00906101291212786 ) ); +#1532 = CARTESIAN_POINT( '', ( -0.0288670234126698, -0.0279114515731687, -0.00920120653513699 ) ); +#1533 = CARTESIAN_POINT( '', ( -0.0314254562098134, -0.0279065180507469, -0.00947903206576338 ) ); +#1534 = CARTESIAN_POINT( '', ( -0.0327021831156756, -0.0278972067393815, -0.00961689290300660 ) ); +#1535 = CARTESIAN_POINT( '', ( -0.0353658181285591, -0.0278661077444651, -0.00988896227223852 ) ); +#1536 = CARTESIAN_POINT( '', ( -0.0367367541794043, -0.0278446756634191, -0.0100209781497018 ) ); +#1537 = CARTESIAN_POINT( '', ( -0.0389276419987500, -0.0278076740418744, -0.0101945069800269 ) ); +#1538 = CARTESIAN_POINT( '', ( -0.0396786710199361, -0.0277945574287578, -0.0102479690463288 ) ); +#1539 = CARTESIAN_POINT( '', ( -0.0412153167929905, -0.0277682894648764, -0.0103395716320095 ) ); +#1540 = CARTESIAN_POINT( '', ( -0.0420048500686268, -0.0277550661519189, -0.0103781292878846 ) ); +#1541 = CARTESIAN_POINT( '', ( -0.0436645761667178, -0.0277304341506706, -0.0104315875510217 ) ); +#1542 = CARTESIAN_POINT( '', ( -0.0445314617524677, -0.0277190021915799, -0.0104466274020195 ) ); +#1543 = CARTESIAN_POINT( '', ( -0.0463762539402309, -0.0277021920492007, -0.0104340808287343 ) ); +#1544 = CARTESIAN_POINT( '', ( -0.0473523061484450, -0.0276965812878753, -0.0104077498104480 ) ); +#1545 = CARTESIAN_POINT( '', ( -0.0495196773685441, -0.0277009175472106, -0.0102665370910013 ) ); +#1546 = CARTESIAN_POINT( '', ( -0.0506858219764946, -0.0277098458928896, -0.0101586981015100 ) ); +#1547 = CARTESIAN_POINT( '', ( -0.0527721739814236, -0.0277555814316387, -0.00982168333021428 ) ); +#1548 = CARTESIAN_POINT( '', ( -0.0535084759563641, -0.0277760113318876, -0.00968210369225548 ) ); +#1549 = CARTESIAN_POINT( '', ( -0.0551472913416803, -0.0278364057016355, -0.00929077381555528 ) ); +#1550 = CARTESIAN_POINT( '', ( -0.0560452742407442, -0.0278764492096935, -0.00904030408215007 ) ); +#1551 = CARTESIAN_POINT( '', ( -0.0580036997004594, -0.0279856043625949, -0.00834200514118173 ) ); +#1552 = CARTESIAN_POINT( '', ( -0.0590677341404702, -0.0280555966984728, -0.00789323608605263 ) ); +#1553 = CARTESIAN_POINT( '', ( -0.0612709160852482, -0.0282222803780746, -0.00667265988017430 ) ); +#1554 = CARTESIAN_POINT( '', ( -0.0624150482720823, -0.0283203901458413, -0.00588790513868985 ) ); +#1555 = CARTESIAN_POINT( '', ( -0.0644263448901085, -0.0284877724269739, -0.00399134967968776 ) ); +#1556 = CARTESIAN_POINT( '', ( -0.0652606207134267, -0.0285519956194662, -0.00290664576490434 ) ); +#1557 = CARTESIAN_POINT( '', ( -0.0661293851234302, -0.0285787804485868, -0.00120627291414547 ) ); +#1558 = CARTESIAN_POINT( '', ( -0.0663591024405948, -0.0285762855912515, -0.000621138281703568 ) ); +#1559 = CARTESIAN_POINT( '', ( -0.0666061727573671, -0.0285545921274810, 0.000239015749984288 ) ); +#1560 = CARTESIAN_POINT( '', ( -0.0666757898022021, -0.0285444344992712, 0.000530812897485948 ) ); +#1561 = CARTESIAN_POINT( '', ( -0.0667623360526505, -0.0285220241268447, 0.00100850945384205 ) ); +#1562 = CARTESIAN_POINT( '', ( -0.0667877732050374, -0.0285132384613731, 0.00117471357936273 ) ); +#1563 = CARTESIAN_POINT( '', ( -0.0668175855721837, -0.0284993745805055, 0.00141074777256666 ) ); +#1564 = CARTESIAN_POINT( '', ( -0.0668263032976867, -0.0284946078539997, 0.00148801116844473 ) ); +#1565 = CARTESIAN_POINT( '', ( -0.0668358241958317, -0.0284884986717803, 0.00158279446174343 ) ); +#1566 = CARTESIAN_POINT( '', ( -0.0668376459183344, -0.0284872705069466, 0.00160166282863587 ) ); +#1567 = CARTESIAN_POINT( '', ( -0.0668412178461092, -0.0284847942825137, 0.00163921277724751 ) ); +#1568 = CARTESIAN_POINT( '', ( -0.0668429947056285, -0.0284835438486693, 0.00165789152716251 ) ); +#1569 = CARTESIAN_POINT( '', ( -0.0668482980989982, -0.0284797571771011, 0.00171364048950710 ) ); +#1570 = CARTESIAN_POINT( '', ( -0.0668517974488359, -0.0284771855782282, 0.00175042341337697 ) ); +#1571 = CARTESIAN_POINT( '', ( -0.0668552608835360, -0.0284745709810879, 0.00178682684123926 ) ); +#1572 = COLOUR_RGB( '', 0.647058844600000, 0.647058844600000, 0.647058844600000 ); +#1573 = CARTESIAN_POINT( '', ( -0.0668552608835381, 0.0284745709810872, 0.00178682684124729 ) ); +#1574 = CARTESIAN_POINT( '', ( -0.0668552608835357, 0.0284745709810882, 0.00178682684123512 ) ); +#1575 = CARTESIAN_POINT( '', ( -0.0668434625262812, 0.0284826495081433, 0.00166933782830390 ) ); +#1576 = CARTESIAN_POINT( '', ( -0.0668211741098463, 0.0284979107492889, 0.00144738794237913 ) ); +#1577 = CARTESIAN_POINT( '', ( -0.0667809250605384, 0.0285155415575835, 0.00113464138168353 ) ); +#1578 = CARTESIAN_POINT( '', ( -0.0667254101295403, 0.0285328038414138, 0.000788645106953950 ) ); +#1579 = CARTESIAN_POINT( '', ( -0.0666436168061312, 0.0285490238118100, 0.000397688854537505 ) ); +#1580 = CARTESIAN_POINT( '', ( -0.0664889935756667, 0.0285671608754213, -0.000196967159076714 ) ); +#1581 = CARTESIAN_POINT( '', ( -0.0662383414686594, 0.0285777115403812, -0.000930099159224143 ) ); +#1582 = CARTESIAN_POINT( '', ( -0.0657137168362210, 0.0285706227084340, -0.00208551742516773 ) ); +#1583 = CARTESIAN_POINT( '', ( -0.0648235584243767, 0.0285184760279417, -0.00348204413799671 ) ); +#1584 = CARTESIAN_POINT( '', ( -0.0634785416310561, 0.0284100339776799, -0.00495105885177248 ) ); +#1585 = CARTESIAN_POINT( '', ( -0.0619083103756475, 0.0282760130768270, -0.00623649352081858 ) ); +#1586 = CARTESIAN_POINT( '', ( -0.0597972396156593, 0.0281059447432984, -0.00756059502705932 ) ); +#1587 = CARTESIAN_POINT( '', ( -0.0568412024921771, 0.0279054080957988, -0.00886321131676503 ) ); +#1588 = CARTESIAN_POINT( '', ( -0.0528871274659109, 0.0277398484706536, -0.00989465286540935 ) ); +#1589 = CARTESIAN_POINT( '', ( -0.0493516640114886, 0.0276937788922761, -0.0103101486179025 ) ); +#1590 = CARTESIAN_POINT( '', ( -0.0465152482121600, 0.0277005608820161, -0.0104348578918891 ) ); +#1591 = CARTESIAN_POINT( '', ( -0.0442269666920425, 0.0277211182332942, -0.0104530465718335 ) ); +#1592 = CARTESIAN_POINT( '', ( -0.0414381103894392, 0.0277637270167698, -0.0103655245623701 ) ); +#1593 = CARTESIAN_POINT( '', ( -0.0384572951599269, 0.0278159451337064, -0.0101694878361232 ) ); +#1594 = CARTESIAN_POINT( '', ( -0.0353198137088854, 0.0278684843978188, -0.00988552581496734 ) ); +#1595 = CARTESIAN_POINT( '', ( -0.0318580851176748, 0.0279069535584000, -0.00953227508516482 ) ); +#1596 = CARTESIAN_POINT( '', ( -0.0274910462855119, 0.0279140752602198, -0.00905452839460234 ) ); +#1597 = CARTESIAN_POINT( '', ( -0.0216255626369688, 0.0278506738488944, -0.00838708383925370 ) ); +#1598 = CARTESIAN_POINT( '', ( -0.0147507937601151, 0.0276657804340912, -0.00757562670328546 ) ); +#1599 = CARTESIAN_POINT( '', ( -0.00699680424127045, 0.0273326931601452, -0.00661416717042687 ) ); +#1600 = CARTESIAN_POINT( '', ( 0.000579558895336335, 0.0269032372754409, -0.00562472137814382 ) ); +#1601 = CARTESIAN_POINT( '', ( 0.00821587098432937, 0.0263792152982954, -0.00456785547684111 ) ); +#1602 = CARTESIAN_POINT( '', ( 0.0157703978365449, 0.0257797954787881, -0.00345477085139448 ) ); +#1603 = CARTESIAN_POINT( '', ( 0.0233097029701673, 0.0250975136794445, -0.00230171321656194 ) ); +#1604 = CARTESIAN_POINT( '', ( 0.0309272601932190, 0.0243243901800862, -0.00110940448281426 ) ); +#1605 = CARTESIAN_POINT( '', ( 0.0371191348403310, 0.0236271485985717, -0.000142628199861300 ) ); +#1606 = CARTESIAN_POINT( '', ( 0.0422433797698549, 0.0230093720859381, 0.000645919542209647 ) ); +#1607 = CARTESIAN_POINT( '', ( 0.0461750676150448, 0.0225148663089744, 0.00123757046977963 ) ); +#1608 = CARTESIAN_POINT( '', ( 0.0498144611651739, 0.0220381642422223, 0.00175892363632232 ) ); +#1609 = CARTESIAN_POINT( '', ( 0.0523581798412156, 0.0216958324622059, 0.00210478216196182 ) ); +#1610 = CARTESIAN_POINT( '', ( 0.0544827127608147, 0.0214062001041313, 0.00238758057247467 ) ); +#1611 = CARTESIAN_POINT( '', ( 0.0566148537460921, 0.0211127045696031, 0.00265368832205442 ) ); +#1612 = CARTESIAN_POINT( '', ( 0.0591862532561207, 0.0207545992472680, 0.00294975203407591 ) ); +#1613 = CARTESIAN_POINT( '', ( 0.0613635859337146, 0.0204502117211222, 0.00317552447236995 ) ); +#1614 = CARTESIAN_POINT( '', ( 0.0632412778133372, 0.0201886381792477, 0.00334608595337269 ) ); +#1615 = CARTESIAN_POINT( '', ( 0.0649149131785030, 0.0199570263014063, 0.00347787303131270 ) ); +#1616 = CARTESIAN_POINT( '', ( 0.0664860807111870, 0.0197419690663089, 0.00358065748010534 ) ); +#1617 = CARTESIAN_POINT( '', ( 0.0679538794668383, 0.0195435826983011, 0.00365818389541077 ) ); +#1618 = CARTESIAN_POINT( '', ( 0.0688985490749932, 0.0194190635188785, 0.00368921398785925 ) ); +#1619 = CARTESIAN_POINT( '', ( 0.0693533048033716, 0.0193591210695326, 0.00370415160432456 ) ); +#1620 = CARTESIAN_POINT( '', ( -0.0532964927479410, 0.0433536809119412, 0.00343883271860507 ) ); +#1621 = CARTESIAN_POINT( '', ( -0.0668552608835374, 0.0284745709810868, 0.00178682684125390 ) ); +#1622 = CARTESIAN_POINT( '', ( -0.0667366329830459, 0.0284862956104436, 0.00179342034479739 ) ); +#1623 = CARTESIAN_POINT( '', ( -0.0665001178319862, 0.0285096716667670, 0.00180656618553250 ) ); +#1624 = CARTESIAN_POINT( '', ( -0.0661477452067012, 0.0285552711484827, 0.00182694824937295 ) ); +#1625 = CARTESIAN_POINT( '', ( -0.0657989161287659, 0.0286082132311337, 0.00184769003914392 ) ); +#1626 = CARTESIAN_POINT( '', ( -0.0654540646508865, 0.0286690256760581, 0.00186880155372438 ) ); +#1627 = CARTESIAN_POINT( '', ( -0.0651135166090242, 0.0287372517366708, 0.00189022505297087 ) ); +#1628 = CARTESIAN_POINT( '', ( -0.0647776054126457, 0.0288126726018607, 0.00191192105196940 ) ); +#1629 = CARTESIAN_POINT( '', ( -0.0644466400396702, 0.0288949852492085, 0.00193384575107749 ) ); +#1630 = CARTESIAN_POINT( '', ( -0.0641209123734031, 0.0289838896499534, 0.00195595722230181 ) ); +#1631 = CARTESIAN_POINT( '', ( -0.0638006943102518, 0.0290790676740210, 0.00197821397190778 ) ); +#1632 = CARTESIAN_POINT( '', ( -0.0634862377606082, 0.0291801906834938, 0.00200057550667515 ) ); +#1633 = CARTESIAN_POINT( '', ( -0.0631777740729582, 0.0292869195716292, 0.00202300235685655 ) ); +#1634 = CARTESIAN_POINT( '', ( -0.0628755137957244, 0.0293989068032197, 0.00204545622771887 ) ); +#1635 = CARTESIAN_POINT( '', ( -0.0625796465312565, 0.0295157979161131, 0.00206790010156708 ) ); +#1636 = CARTESIAN_POINT( '', ( -0.0622903409406648, 0.0296372331366485, 0.00209029833667290 ) ); +#1637 = CARTESIAN_POINT( '', ( -0.0620077448763134, 0.0297628489212217, 0.00211261675053629 ) ); +#1638 = CARTESIAN_POINT( '', ( -0.0617319856389144, 0.0298922794589473, 0.00213482269066482 ) ); +#1639 = CARTESIAN_POINT( '', ( -0.0614631703496467, 0.0300251581132723, 0.00215688509208548 ) ); +#1640 = CARTESIAN_POINT( '', ( -0.0612013864284475, 0.0301611187969865, 0.00217877452203698 ) ); +#1641 = CARTESIAN_POINT( '', ( -0.0609467021686732, 0.0302997972723538, 0.00220046321212992 ) ); +#1642 = CARTESIAN_POINT( '', ( -0.0606991673980406, 0.0304408323704504, 0.00222192507843621 ) ); +#1643 = CARTESIAN_POINT( '', ( -0.0604588142155138, 0.0305838671248209, 0.00224313573007316 ) ); +#1644 = CARTESIAN_POINT( '', ( -0.0602256577937494, 0.0307285498158930, 0.00226407246690423 ) ); +#1645 = CARTESIAN_POINT( '', ( -0.0599996972367977, 0.0308745349237868, 0.00228471426706832 ) ); +#1646 = CARTESIAN_POINT( '', ( -0.0597809164829784, 0.0310214839882997, 0.00230504176509311 ) ); +#1647 = CARTESIAN_POINT( '', ( -0.0595692852431608, 0.0311690663758914, 0.00232503722137868 ) ); +#1648 = CARTESIAN_POINT( '', ( -0.0593647599651570, 0.0313169599545277, 0.00234468448385483 ) ); +#1649 = CARTESIAN_POINT( '', ( -0.0591672848153968, 0.0314648516780286, 0.00236396894270942 ) ); +#1650 = CARTESIAN_POINT( '', ( -0.0589767926696572, 0.0316124380823903, 0.00238287747893858 ) ); +#1651 = CARTESIAN_POINT( '', ( -0.0587932061052455, 0.0317594256972278, 0.00240139840754386 ) ); +#1652 = CARTESIAN_POINT( '', ( -0.0586164383877225, 0.0319055313760056, 0.00241952141628520 ) ); +#1653 = CARTESIAN_POINT( '', ( -0.0584463944458098, 0.0320504825493478, 0.00243723750032854 ) ); +#1654 = CARTESIAN_POINT( '', ( -0.0582829718292869, 0.0321940174055469, 0.00245453889510500 ) ); +#1655 = CARTESIAN_POINT( '', ( -0.0581260616436854, 0.0323358850046316, 0.00247141900237985 ) ); +#1656 = CARTESIAN_POINT( '', ( -0.0579755494622983, 0.0324758453255334, 0.00248787233060355 ) ); +#1657 = CARTESIAN_POINT( '', ( -0.0578313161950971, 0.0326136692711258, 0.00250389437714364 ) ); +#1658 = CARTESIAN_POINT( '', ( -0.0576932389718370, 0.0327491385662548, 0.00251948171360735 ) ); +#1659 = CARTESIAN_POINT( '', ( -0.0575611918224049, 0.0328820458037908, 0.00253463134555678 ) ); +#1660 = CARTESIAN_POINT( '', ( -0.0574350469164841, 0.0330121937545784, 0.00254934265428415 ) ); +#1661 = CARTESIAN_POINT( '', ( -0.0573146736472246, 0.0331393971058719, 0.00256361017021212 ) ); +#1662 = CARTESIAN_POINT( '', ( -0.0570517002177582, 0.0334238016967231, 0.00259533033979016 ) ); +#1663 = CARTESIAN_POINT( '', ( -0.0566578252002886, 0.0338791536589996, 0.00264482293889293 ) ); +#1664 = CARTESIAN_POINT( '', ( -0.0561573108441428, 0.0345264725306218, 0.00271207642689131 ) ); +#1665 = CARTESIAN_POINT( '', ( -0.0556935514512181, 0.0351996071592930, 0.00277907400009724 ) ); +#1666 = CARTESIAN_POINT( '', ( -0.0552684475962213, 0.0358953878248746, 0.00284569215097672 ) ); +#1667 = CARTESIAN_POINT( '', ( -0.0548835568458925, 0.0366104607884532, 0.00291240704199491 ) ); +#1668 = CARTESIAN_POINT( '', ( -0.0545399839575316, 0.0373414180914484, 0.00297837042887848 ) ); +#1669 = CARTESIAN_POINT( '', ( -0.0542384694730288, 0.0380847559741911, 0.00304313539299849 ) ); +#1670 = CARTESIAN_POINT( '', ( -0.0539793706821403, 0.0388369583816117, 0.00310626050745636 ) ); +#1671 = CARTESIAN_POINT( '', ( -0.0537626460952807, 0.0395945438747067, 0.00316741702947032 ) ); +#1672 = CARTESIAN_POINT( '', ( -0.0535879838460607, 0.0403541157058253, 0.00322635571388187 ) ); +#1673 = CARTESIAN_POINT( '', ( -0.0534544117899816, 0.0411124053614377, 0.00328292793016869 ) ); +#1674 = CARTESIAN_POINT( '', ( -0.0533618440111332, 0.0418663114558743, 0.00333703367574070 ) ); +#1675 = CARTESIAN_POINT( '', ( -0.0533055705614141, 0.0426129309066996, 0.00338881583515126 ) ); +#1676 = CARTESIAN_POINT( '', ( -0.0532994909272514, 0.0431081162423806, 0.00342186385263956 ) ); +#1677 = CARTESIAN_POINT( '', ( -0.0532964753657149, 0.0433537332995508, 0.00343825601172808 ) ); +#1678 = CARTESIAN_POINT( '', ( -0.0532965108365908, 0.0433892845096115, 0.00343943291497728 ) ); +#1679 = CARTESIAN_POINT( '', ( -0.0532965106011254, 0.0433774340597735, 0.00343942508514723 ) ); +#1680 = CARTESIAN_POINT( '', ( -0.0532965103656508, 0.0433655836099355, 0.00343941725531553 ) ); +#1681 = CARTESIAN_POINT( '', ( -0.0532965101301670, 0.0433537331600976, 0.00343940942548216 ) ); +#1682 = COLOUR_RGB( '', 0.647058844600000, 0.647058844600000, 0.647058844600000 ); +#1683 = CARTESIAN_POINT( '', ( 0.0694836154580117, 0.0191419071944495, 0.00463145086541772 ) ); +#1684 = CARTESIAN_POINT( '', ( 0.0693533048033715, 0.0193591210695326, 0.00370415160432457 ) ); +#1685 = CARTESIAN_POINT( '', ( 0.0693969821520155, 0.0192941657327705, 0.00401496251411490 ) ); +#1686 = CARTESIAN_POINT( '', ( 0.0694404190874772, 0.0192217626747021, 0.00432406262775463 ) ); +#1687 = CARTESIAN_POINT( '', ( 0.0694836154580117, 0.0191419071944495, 0.00463145086541772 ) ); +#1688 = CARTESIAN_POINT( '', ( 0.0694836154580116, 0.400000000000000, 0.00463145086541772 ) ); +#1689 = CARTESIAN_POINT( '', ( 0.0694184601306915, 0.400000000000000, 0.00416780123487115 ) ); +#1690 = VECTOR( '', #1986, 1.00000000000000 ); +#1691 = CARTESIAN_POINT( '', ( 0.0694836154580116, 0.400000000000000, 0.00463145086541772 ) ); +#1692 = VECTOR( '', #1987, 1.00000000000000 ); +#1693 = COLOUR_RGB( '', 0.647058844600000, 0.647058844600000, 0.647058844600000 ); +#1694 = CARTESIAN_POINT( '', ( -0.0532965101301670, -0.400000000000000, 0.00343940942548240 ) ); +#1695 = CARTESIAN_POINT( '', ( -0.0532965101301670, -0.400000000000000, 0.00343940942548240 ) ); +#1696 = VECTOR( '', #1988, 1.00000000000000 ); +#1697 = CARTESIAN_POINT( '', ( 0.0694836154580116, -0.400000000000000, 0.00463145086541797 ) ); +#1698 = CARTESIAN_POINT( '', ( -0.0532965101301670, -0.400000000000000, 0.00343940942548240 ) ); +#1699 = CARTESIAN_POINT( '', ( -0.0534951835870743, -0.400000000000000, 0.0100452983751895 ) ); +#1700 = CARTESIAN_POINT( '', ( -0.0364378771469696, -0.400000000000000, 0.0245493400805307 ) ); +#1701 = CARTESIAN_POINT( '', ( 0.0241224432897519, -0.400000000000000, 0.0164604041971117 ) ); +#1702 = CARTESIAN_POINT( '', ( 0.0547200557612873, -0.400000000000000, 0.00860364207717048 ) ); +#1703 = CARTESIAN_POINT( '', ( 0.0694836154580116, -0.400000000000000, 0.00463145086541796 ) ); +#1704 = CARTESIAN_POINT( '', ( 0.0694836154580117, -0.0191419071944495, 0.00463145086541773 ) ); +#1705 = CARTESIAN_POINT( '', ( 0.0694836154580116, -0.400000000000000, 0.00463145086541797 ) ); +#1706 = VECTOR( '', #1989, 1.00000000000000 ); +#1707 = CARTESIAN_POINT( '', ( 0.0694836154580116, -0.0191419071944495, 0.00463145086541773 ) ); +#1708 = CARTESIAN_POINT( '', ( 0.0641690759811638, -0.0202039546137935, 0.00606134768150408 ) ); +#1709 = CARTESIAN_POINT( '', ( 0.0588008691691839, -0.0209559560893042, 0.00748162025777227 ) ); +#1710 = CARTESIAN_POINT( '', ( 0.0480109221420702, -0.0220965552700963, 0.0101861053648128 ) ); +#1711 = CARTESIAN_POINT( '', ( 0.0425875478690584, -0.0224843368097248, 0.0114696554231641 ) ); +#1712 = CARTESIAN_POINT( '', ( 0.0317085560535202, -0.0230724853923180, 0.0138449243305319 ) ); +#1713 = CARTESIAN_POINT( '', ( 0.0262481164059888, -0.0232729761550313, 0.0149392047730151 ) ); +#1714 = CARTESIAN_POINT( '', ( 0.0153021068664016, -0.0235776768603239, 0.0169380115483504 ) ); +#1715 = CARTESIAN_POINT( '', ( 0.00983237830000406, -0.0236805412777613, 0.0178366396543255 ) ); +#1716 = CARTESIAN_POINT( '', ( -0.00111556669058941, -0.0240223765556888, 0.0192945199215330 ) ); +#1717 = CARTESIAN_POINT( '', ( -0.00658821302807713, -0.0242593075791512, 0.0198563132519936 ) ); +#1718 = CARTESIAN_POINT( '', ( -0.0147497555746435, -0.0249769885973268, 0.0202709649519929 ) ); +#1719 = CARTESIAN_POINT( '', ( -0.0174576595305775, -0.0252770024508426, 0.0203365953222648 ) ); +#1720 = CARTESIAN_POINT( '', ( -0.0228278627701086, -0.0260633438715471, 0.0202733841605519 ) ); +#1721 = CARTESIAN_POINT( '', ( -0.0255046898007140, -0.0265515491714945, 0.0201443837053642 ) ); +#1722 = CARTESIAN_POINT( '', ( -0.0307620287342813, -0.0278021553141756, 0.0196153063469558 ) ); +#1723 = CARTESIAN_POINT( '', ( -0.0333456216531482, -0.0285640586808797, 0.0192164600253740 ) ); +#1724 = CARTESIAN_POINT( '', ( -0.0370982186147320, -0.0300023884691647, 0.0183260969918297 ) ); +#1725 = CARTESIAN_POINT( '', ( -0.0383236957953477, -0.0305321228738083, 0.0179812016312168 ) ); +#1726 = CARTESIAN_POINT( '', ( -0.0407517050873639, -0.0316998509258020, 0.0171631919715141 ) ); +#1727 = CARTESIAN_POINT( '', ( -0.0419478122434517, -0.0323357100951563, 0.0166924764546820 ) ); +#1728 = CARTESIAN_POINT( '', ( -0.0442785441186665, -0.0337176772279002, 0.0156039064045224 ) ); +#1729 = CARTESIAN_POINT( '', ( -0.0454141976565052, -0.0344627032859808, 0.0149880410079850 ) ); +#1730 = CARTESIAN_POINT( '', ( -0.0476319107856152, -0.0361182240850137, 0.0135304642863491 ) ); +#1731 = CARTESIAN_POINT( '', ( -0.0487120637836850, -0.0370308478525777, 0.0126896437902420 ) ); +#1732 = CARTESIAN_POINT( '', ( -0.0501918108358767, -0.0385167452926618, 0.0111966027163773 ) ); +#1733 = CARTESIAN_POINT( '', ( -0.0506584627227205, -0.0390285798312668, 0.0106627693726993 ) ); +#1734 = CARTESIAN_POINT( '', ( -0.0515164144955420, -0.0400671352072925, 0.00950449476957229 ) ); +#1735 = CARTESIAN_POINT( '', ( -0.0519112379304215, -0.0406000277666403, 0.00887278287376699 ) ); +#1736 = CARTESIAN_POINT( '', ( -0.0524055253451901, -0.0413485523040352, 0.00786733726294773 ) ); +#1737 = CARTESIAN_POINT( '', ( -0.0525543021144705, -0.0415894642547636, 0.00752256000026956 ) ); +#1738 = CARTESIAN_POINT( '', ( -0.0528161488706745, -0.0420441252773342, 0.00681074804127568 ) ); +#1739 = CARTESIAN_POINT( '', ( -0.0529299601884255, -0.0422587875042904, 0.00644317166688665 ) ); +#1740 = CARTESIAN_POINT( '', ( -0.0530728419124045, -0.0425589541732990, 0.00585300857144684 ) ); +#1741 = CARTESIAN_POINT( '', ( -0.0531158757620716, -0.0426559503153109, 0.00564748643319063 ) ); +#1742 = CARTESIAN_POINT( '', ( -0.0531858780603611, -0.0428272071328920, 0.00525251741011489 ) ); +#1743 = CARTESIAN_POINT( '', ( -0.0532136642001081, -0.0429029821472133, 0.00506056038267947 ) ); +#1744 = CARTESIAN_POINT( '', ( -0.0532462408151039, -0.0430035543792972, 0.00478065615729622 ) ); +#1745 = CARTESIAN_POINT( '', ( -0.0532553358388410, -0.0430339751546512, 0.00469153895690651 ) ); +#1746 = CARTESIAN_POINT( '', ( -0.0532718179516892, -0.0430947878444922, 0.00450346097706423 ) ); +#1747 = CARTESIAN_POINT( '', ( -0.0532800051880828, -0.0431282784618679, 0.00439483851463650 ) ); +#1748 = CARTESIAN_POINT( '', ( -0.0532934026657377, -0.0431981780830640, 0.00414675394956595 ) ); +#1749 = CARTESIAN_POINT( '', ( -0.0532986214936261, -0.0432345977213267, 0.00400728149011548 ) ); +#1750 = CARTESIAN_POINT( '', ( -0.0533012712585152, -0.0432880676972484, 0.00377326712473547 ) ); +#1751 = CARTESIAN_POINT( '', ( -0.0533012821772134, -0.0433056870408364, 0.00369112470836253 ) ); +#1752 = CARTESIAN_POINT( '', ( -0.0532995296831139, -0.0433312864917623, 0.00356148288436691 ) ); +#1753 = CARTESIAN_POINT( '', ( -0.0532986500384456, -0.0433396806497115, 0.00351719757304505 ) ); +#1754 = CARTESIAN_POINT( '', ( -0.0532972802496586, -0.0433489135634316, 0.00346615094844441 ) ); +#1755 = CARTESIAN_POINT( '', ( -0.0532971227669525, -0.0433499365167858, 0.00346046207972170 ) ); +#1756 = CARTESIAN_POINT( '', ( -0.0532968117169727, -0.0433518845861383, 0.00344956371447726 ) ); +#1757 = CARTESIAN_POINT( '', ( -0.0532967892169408, -0.0433528103831069, 0.00344870865979576 ) ); +#1758 = CARTESIAN_POINT( '', ( -0.0532964753657149, -0.0433537332995508, 0.00343825601172751 ) ); +#1759 = COLOUR_RGB( '', 0.647058844600000, 0.647058844600000, 0.647058844600000 ); +#1760 = CARTESIAN_POINT( '', ( -0.0532965101301670, 0.400000000000000, 0.00343940942548216 ) ); +#1761 = CARTESIAN_POINT( '', ( -0.0534951835870743, 0.400000000000000, 0.0100452983751893 ) ); +#1762 = CARTESIAN_POINT( '', ( -0.0364378771469696, 0.400000000000000, 0.0245493400805304 ) ); +#1763 = CARTESIAN_POINT( '', ( 0.0241224432897519, 0.400000000000000, 0.0164604041971115 ) ); +#1764 = CARTESIAN_POINT( '', ( 0.0547200557612873, 0.400000000000000, 0.00860364207717023 ) ); +#1765 = CARTESIAN_POINT( '', ( 0.0694836154580116, 0.400000000000000, 0.00463145086541772 ) ); +#1766 = COLOUR_RGB( '', 0.647058844600000, 0.647058844600000, 0.647058844600000 ); +#1767 = CARTESIAN_POINT( '', ( 0.0693533048033715, -0.0193591210695326, 0.00370415160432458 ) ); +#1768 = CARTESIAN_POINT( '', ( 0.0693969821520155, -0.0192941657327705, 0.00401496251411491 ) ); +#1769 = CARTESIAN_POINT( '', ( 0.0694404190874772, -0.0192217626747021, 0.00432406262775464 ) ); +#1770 = CARTESIAN_POINT( '', ( 0.0694836154580117, -0.0191419071944495, 0.00463145086541773 ) ); +#1771 = CARTESIAN_POINT( '', ( 0.0693533048033714, -0.400000000000000, 0.00370415160432482 ) ); +#1772 = CARTESIAN_POINT( '', ( 0.0694184601306915, -0.400000000000000, 0.00416780123487139 ) ); +#1773 = VECTOR( '', #1990, 1.00000000000000 ); +#1774 = CARTESIAN_POINT( '', ( 0.0693533048033714, -0.400000000000000, 0.00370415160432482 ) ); +#1775 = VECTOR( '', #1991, 1.00000000000000 ); +#1776 = COLOUR_RGB( '', 0.647058844600000, 0.647058844600000, 0.647058844600000 ); +#1777 = CARTESIAN_POINT( '', ( -0.0532965101301670, 0.0433536285243315, 0.00343940942548216 ) ); +#1778 = CARTESIAN_POINT( '', ( -0.0532970796428849, 0.0433508916997244, 0.00345955994569743 ) ); +#1779 = CARTESIAN_POINT( '', ( -0.0532985395371730, 0.0433438760976382, 0.00351121397982614 ) ); +#1780 = CARTESIAN_POINT( '', ( -0.0533003064177736, 0.0433248310276479, 0.00360469853168184 ) ); +#1781 = CARTESIAN_POINT( '', ( -0.0533013708837366, 0.0432977688930745, 0.00373144992463462 ) ); +#1782 = CARTESIAN_POINT( '', ( -0.0533001939142737, 0.0432547282700468, 0.00392098456036603 ) ); +#1783 = CARTESIAN_POINT( '', ( -0.0532911489539807, 0.0431760352426606, 0.00423788046411734 ) ); +#1784 = CARTESIAN_POINT( '', ( -0.0532525038716448, 0.0430074502528413, 0.00479837503442612 ) ); +#1785 = CARTESIAN_POINT( '', ( -0.0531456459260244, 0.0427128511834890, 0.00555159102236391 ) ); +#1786 = CARTESIAN_POINT( '', ( -0.0529413834376542, 0.0422753898434471, 0.00642225915156622 ) ); +#1787 = CARTESIAN_POINT( '', ( -0.0526278948633712, 0.0417040908151866, 0.00736795841828140 ) ); +#1788 = CARTESIAN_POINT( '', ( -0.0521545700671024, 0.0409486247666801, 0.00842620866903362 ) ); +#1789 = CARTESIAN_POINT( '', ( -0.0515211148886091, 0.0400734770268098, 0.00950103280502217 ) ); +#1790 = CARTESIAN_POINT( '', ( -0.0506917308645496, 0.0390590096010240, 0.0106302787449434 ) ); +#1791 = CARTESIAN_POINT( '', ( -0.0496115450479711, 0.0379020008665119, 0.0118287868817373 ) ); +#1792 = CARTESIAN_POINT( '', ( -0.0485126492097841, 0.0368913821828174, 0.0128065970122400 ) ); +#1793 = CARTESIAN_POINT( '', ( -0.0473059771334270, 0.0358795389413025, 0.0137377320991290 ) ); +#1794 = CARTESIAN_POINT( '', ( -0.0461192890526734, 0.0349743335661658, 0.0145446737001830 ) ); +#1795 = CARTESIAN_POINT( '', ( -0.0446054527463953, 0.0339387111809382, 0.0154193889306320 ) ); +#1796 = CARTESIAN_POINT( '', ( -0.0428187932660637, 0.0328309174790473, 0.0163106921736578 ) ); +#1797 = CARTESIAN_POINT( '', ( -0.0407356286956242, 0.0316846583187533, 0.0171783101190961 ) ); +#1798 = CARTESIAN_POINT( '', ( -0.0383428773026403, 0.0305343664351574, 0.0179800040615338 ) ); +#1799 = CARTESIAN_POINT( '', ( -0.0359246624813036, 0.0295315725452409, 0.0186272818909246 ) ); +#1800 = CARTESIAN_POINT( '', ( -0.0334348707653296, 0.0286468556065663, 0.0191528542065075 ) ); +#1801 = CARTESIAN_POINT( '', ( -0.0308169407997265, 0.0278508220122906, 0.0195771356480640 ) ); +#1802 = CARTESIAN_POINT( '', ( -0.0273516845083786, 0.0269574197816676, 0.0199895133315838 ) ); +#1803 = CARTESIAN_POINT( '', ( -0.0228773872873097, 0.0260570334893574, 0.0202866623924173 ) ); +#1804 = CARTESIAN_POINT( '', ( -0.0175813755821137, 0.0252853909477222, 0.0203453407898998 ) ); +#1805 = CARTESIAN_POINT( '', ( -0.0120796435269561, 0.0247150575362530, 0.0201677310309490 ) ); +#1806 = CARTESIAN_POINT( '', ( -0.00676842720416389, 0.0243244557003606, 0.0198063298872642 ) ); +#1807 = CARTESIAN_POINT( '', ( -0.00121679845825294, 0.0240434265367945, 0.0192677127191813 ) ); +#1808 = CARTESIAN_POINT( '', ( 0.00389756681307787, 0.0238578871846877, 0.0186435259439404 ) ); +#1809 = CARTESIAN_POINT( '', ( 0.00950649400464926, 0.0237066900163061, 0.0178486509989354 ) ); +#1810 = CARTESIAN_POINT( '', ( 0.0151905696819735, 0.0235694989532937, 0.0169388460844447 ) ); +#1811 = CARTESIAN_POINT( '', ( 0.0210105584580553, 0.0234225097746010, 0.0159064078390758 ) ); +#1812 = CARTESIAN_POINT( '', ( 0.0267350106155974, 0.0232459353692717, 0.0148229081799662 ) ); +#1813 = CARTESIAN_POINT( '', ( 0.0323118185250646, 0.0230268507505386, 0.0137006261064971 ) ); +#1814 = CARTESIAN_POINT( '', ( 0.0379933179388542, 0.0227434524356650, 0.0124825520308952 ) ); +#1815 = CARTESIAN_POINT( '', ( 0.0431644879007512, 0.0224214197860745, 0.0113131403752647 ) ); +#1816 = CARTESIAN_POINT( '', ( 0.0473613768791364, 0.0221009940052823, 0.0103210517346272 ) ); +#1817 = CARTESIAN_POINT( '', ( 0.0507213163867346, 0.0217997105706265, 0.00950273198584484 ) ); +#1818 = CARTESIAN_POINT( '', ( 0.0533641301853904, 0.0215346911898588, 0.00884620867282611 ) ); +#1819 = CARTESIAN_POINT( '', ( 0.0559115287770037, 0.0212507959254956, 0.00820231477703104 ) ); +#1820 = CARTESIAN_POINT( '', ( 0.0583692302101683, 0.0209480423639287, 0.00757168663295334 ) ); +#1821 = CARTESIAN_POINT( '', ( 0.0607422032323333, 0.0206263677281359, 0.00695491929396375 ) ); +#1822 = CARTESIAN_POINT( '', ( 0.0630348017509827, 0.0202860237346722, 0.00635257665773610 ) ); +#1823 = CARTESIAN_POINT( '', ( 0.0652505180220010, 0.0199261353566706, 0.00576516832132102 ) ); +#1824 = CARTESIAN_POINT( '', ( 0.0673930784666210, 0.0195498412762829, 0.00519323861449392 ) ); +#1825 = CARTESIAN_POINT( '', ( 0.0687939649803205, 0.0192764811989094, 0.00481677989384772 ) ); +#1826 = CARTESIAN_POINT( '', ( 0.0694836154580116, 0.0191419071944495, 0.00463145086541772 ) ); +#1827 = COLOUR_RGB( '', 0.647058844600000, 0.647058844600000, 0.647058844600000 ); +#1828 = CARTESIAN_POINT( '', ( -0.0532965101301670, -0.400000000000000, 0.00343940942548240 ) ); +#1829 = CARTESIAN_POINT( '', ( -0.0529236682414017, -0.400000000000000, -0.00222776276841646 ) ); +#1830 = CARTESIAN_POINT( '', ( -0.0283500454020693, -0.400000000000000, 0.000689010657937950 ) ); +#1831 = CARTESIAN_POINT( '', ( 0.00566517592916088, -0.400000000000000, 0.00385661377523655 ) ); +#1832 = CARTESIAN_POINT( '', ( 0.0517703147850388, -0.400000000000000, 0.00697250301460080 ) ); +#1833 = CARTESIAN_POINT( '', ( 0.0693533048033715, -0.400000000000000, 0.00370415160432482 ) ); +#1834 = COLOUR_RGB( '', 0.647058844600000, 0.647058844600000, 0.647058844600000 ); +#1835 = CARTESIAN_POINT( '', ( -0.0668552608835384, -0.0284745709810866, 0.00178682684125577 ) ); +#1836 = CARTESIAN_POINT( '', ( -0.0668569833074525, -0.0284719627168609, 0.00182577464477976 ) ); +#1837 = CARTESIAN_POINT( '', ( -0.0668586862885284, -0.0284693039196676, 0.00186427809450932 ) ); +#1838 = CARTESIAN_POINT( '', ( -0.0668612119194714, -0.0284652474087880, 0.00192137434688771 ) ); +#1839 = CARTESIAN_POINT( '', ( -0.0668620490181888, -0.0284638838473950, 0.00194029660114331 ) ); +#1840 = CARTESIAN_POINT( '', ( -0.0668632974095109, -0.0284618223397101, 0.00196851617249754 ) ); +#1841 = CARTESIAN_POINT( '', ( -0.0668637053514366, -0.0284611330987881, 0.00197789602387504 ) ); +#1842 = CARTESIAN_POINT( '', ( -0.0668644921120724, -0.0284597517626337, 0.00199660358291355 ) ); +#1843 = CARTESIAN_POINT( '', ( -0.0668648729867393, -0.0284590594840170, 0.00200593110459007 ) ); +#1844 = CARTESIAN_POINT( '', ( -0.0668681900766758, -0.0284528150024072, 0.00208964256306403 ) ); +#1845 = CARTESIAN_POINT( '', ( -0.0668703510148082, -0.0284471651502754, 0.00216237249559964 ) ); +#1846 = CARTESIAN_POINT( '', ( -0.0668747563823203, -0.0284300046155354, 0.00237554297257866 ) ); +#1847 = CARTESIAN_POINT( '', ( -0.0668749284314983, -0.0284182847899746, 0.00251096150279795 ) ); +#1848 = CARTESIAN_POINT( '', ( -0.0668692502911563, -0.0283829141411641, 0.00289742667666706 ) ); +#1849 = CARTESIAN_POINT( '', ( -0.0668572866713163, -0.0283590780329963, 0.00312867489853819 ) ); +#1850 = CARTESIAN_POINT( '', ( -0.0668262292845528, -0.0283135744637437, 0.00354061387626293 ) ); +#1851 = CARTESIAN_POINT( '', ( -0.0668071224223972, -0.0282919003962013, 0.00372133667705279 ) ); +#1852 = CARTESIAN_POINT( '', ( -0.0667685724754947, -0.0282526482021053, 0.00403441687886397 ) ); +#1853 = CARTESIAN_POINT( '', ( -0.0667472333898910, -0.0282330892526394, 0.00418287523536629 ) ); +#1854 = CARTESIAN_POINT( '', ( -0.0666705760712226, -0.0281687051119437, 0.00464923697593071 ) ); +#1855 = CARTESIAN_POINT( '', ( -0.0666049387251777, -0.0281205286538437, 0.00496919653930407 ) ); +#1856 = CARTESIAN_POINT( '', ( -0.0664396652796460, -0.0280122766624184, 0.00562611613445203 ) ); +#1857 = CARTESIAN_POINT( '', ( -0.0663381185346199, -0.0279512564444852, 0.00596717014693786 ) ); +#1858 = CARTESIAN_POINT( '', ( -0.0660025707277202, -0.0277630887398720, 0.00694182758540805 ) ); +#1859 = CARTESIAN_POINT( '', ( -0.0657371714593334, -0.0276293164429715, 0.00754252877351220 ) ); +#1860 = CARTESIAN_POINT( '', ( -0.0651380618012726, -0.0273468001934178, 0.00868705111858922 ) ); +#1861 = CARTESIAN_POINT( '', ( -0.0648027338245179, -0.0271974943140753, 0.00923167386939494 ) ); +#1862 = CARTESIAN_POINT( '', ( -0.0637154318544728, -0.0267340677335919, 0.0107866924180567 ) ); +#1863 = CARTESIAN_POINT( '', ( -0.0628817845872273, -0.0264046657048893, 0.0117164965011782 ) ); +#1864 = CARTESIAN_POINT( '', ( -0.0611692649959915, -0.0257623000395940, 0.0133442332403554 ) ); +#1865 = CARTESIAN_POINT( '', ( -0.0602816379220738, -0.0254455400188271, 0.0140544573433406 ) ); +#1866 = CARTESIAN_POINT( '', ( -0.0575983118557650, -0.0245250295377452, 0.0159611169315654 ) ); +#1867 = CARTESIAN_POINT( '', ( -0.0558055798625884, -0.0239585380585201, 0.0169260282591570 ) ); +#1868 = CARTESIAN_POINT( '', ( -0.0523411043979083, -0.0229311226006468, 0.0185220799408779 ) ); +#1869 = CARTESIAN_POINT( '', ( -0.0506669422017590, -0.0224690277349293, 0.0191495599381344 ) ); +#1870 = CARTESIAN_POINT( '', ( -0.0473542216808956, -0.0216133209004764, 0.0202215005538979 ) ); +#1871 = CARTESIAN_POINT( '', ( -0.0457155502157597, -0.0212203312702111, 0.0206619811281845 ) ); +#1872 = CARTESIAN_POINT( '', ( -0.0424686438073828, -0.0205015358144873, 0.0214047911587278 ) ); +#1873 = CARTESIAN_POINT( '', ( -0.0408635282671651, -0.0201771502576221, 0.0217052232873932 ) ); +#1874 = CARTESIAN_POINT( '', ( -0.0361065706121687, -0.0193034980929606, 0.0224444932346738 ) ); +#1875 = CARTESIAN_POINT( '', ( -0.0330153789929286, -0.0188510886360646, 0.0227271624402378 ) ); +#1876 = CARTESIAN_POINT( '', ( -0.0269338423414960, -0.0181333881051074, 0.0230485778726937 ) ); +#1877 = CARTESIAN_POINT( '', ( -0.0239409359518543, -0.0178683068258399, 0.0230841722072953 ) ); +#1878 = CARTESIAN_POINT( '', ( -0.0180559941203536, -0.0174751218920850, 0.0229902466084410 ) ); +#1879 = CARTESIAN_POINT( '', ( -0.0151492132375884, -0.0173455816301969, 0.0228600268723300 ) ); +#1880 = CARTESIAN_POINT( '', ( -0.00649616415257889, -0.0170989647703936, 0.0222868785588195 ) ); +#1881 = CARTESIAN_POINT( '', ( -0.000833094279259031, -0.0171234972915820, 0.0216665287229768 ) ); +#1882 = CARTESIAN_POINT( '', ( 0.0103604228432698, -0.0173439226971867, 0.0201264856378418 ) ); +#1883 = CARTESIAN_POINT( '', ( 0.0158820168842234, -0.0175413529287746, 0.0192041476515475 ) ); +#1884 = CARTESIAN_POINT( '', ( 0.0268417347596844, -0.0179708663246592, 0.0171238726291038 ) ); +#1885 = CARTESIAN_POINT( '', ( 0.0322867461997800, -0.0182032661253969, 0.0159680373562130 ) ); +#1886 = CARTESIAN_POINT( '', ( 0.0430926731276419, -0.0186607685231542, 0.0133578659515471 ) ); +#1887 = CARTESIAN_POINT( '', ( 0.0484516195146550, -0.0188876382757721, 0.0119037823432385 ) ); +#1888 = CARTESIAN_POINT( '', ( 0.0590541717518088, -0.0191968906358069, 0.00860256867371319 ) ); +#1889 = CARTESIAN_POINT( '', ( 0.0643011992826509, -0.0192849511343043, 0.00675842959296416 ) ); +#1890 = CARTESIAN_POINT( '', ( 0.0694836154580117, -0.0191419071944495, 0.00463145086541773 ) ); +#1891 = COLOUR_RGB( '', 0.647058844600000, 0.647058844600000, 0.647058844600000 ); +#1892 = CARTESIAN_POINT( '', ( -0.137850114450625, -8.48752308726682E-19, -8.48445322276465E-19 ) ); +#1893 = CARTESIAN_POINT( '', ( 0.308874483940678, -3.59727565208566E-18, -8.48445322276465E-19 ) ); +#1894 = CARTESIAN_POINT( '', ( -0.137850114450625, -8.48752308726683E-19, -1.65742903555131E-18 ) ); +#1895 = CARTESIAN_POINT( '', ( -0.137850114450625, 1.38214926025960E-18, 0.00728667749930682 ) ); +#1896 = CARTESIAN_POINT( '', ( -0.0977169822433808, 7.38646904023919E-18, 0.0277047879121596 ) ); +#1897 = CARTESIAN_POINT( '', ( -0.00992200133263989, 8.87446655702053E-18, 0.0343292808328824 ) ); +#1898 = CARTESIAN_POINT( '', ( 0.183871036847927, -2.90005374730091E-18, -0.000234764391036044 ) ); +#1899 = CARTESIAN_POINT( '', ( 0.299713641405106, -7.59530860773236E-19, 0.00908468198031192 ) ); +#1900 = CARTESIAN_POINT( '', ( 0.308874483940678, -3.59727565208566E-18, -1.85704763287042E-18 ) ); +#1901 = CARTESIAN_POINT( '', ( -0.137850114450625, 8.48138335826248E-19, 1.65742903555131E-18 ) ); +#1902 = CARTESIAN_POINT( '', ( -0.137850114450625, -4.90402605565524E-19, -0.00728667749930682 ) ); +#1903 = CARTESIAN_POINT( '', ( -0.0977169822433808, -4.48807225028085E-18, -0.0277047879121596 ) ); +#1904 = CARTESIAN_POINT( '', ( -0.00992200133263989, -6.24514035403451E-18, -0.0343292808328824 ) ); +#1905 = CARTESIAN_POINT( '', ( 0.183871036847927, -1.08816171873355E-18, 0.000234764391036044 ) ); +#1906 = CARTESIAN_POINT( '', ( 0.299713641405106, -3.51285089960456E-18, -0.00908468198031192 ) ); +#1907 = CARTESIAN_POINT( '', ( 0.308874483940678, -1.90038500753273E-18, 1.85704763287042E-18 ) ); +#1908 = COLOUR_RGB( '', 0.647058844600000, 0.647058844600000, 0.647058844600000 ); +#1909 = CARTESIAN_POINT( '', ( 0.0694836154580116, 0.0191419071944495, 0.00463145086541772 ) ); +#1910 = CARTESIAN_POINT( '', ( 0.0691347996039772, 0.0191508876582094, 0.00477378885086340 ) ); +#1911 = CARTESIAN_POINT( '', ( 0.0684331963719419, 0.0191689508348863, 0.00506008544396555 ) ); +#1912 = CARTESIAN_POINT( '', ( 0.0673709417565408, 0.0191881036577799, 0.00548274431176038 ) ); +#1913 = CARTESIAN_POINT( '', ( 0.0662940423901800, 0.0192019610545162, 0.00590341269478197 ) ); +#1914 = CARTESIAN_POINT( '', ( 0.0652023001901417, 0.0192101296853046, 0.00632129992305175 ) ); +#1915 = CARTESIAN_POINT( '', ( 0.0640958949403561, 0.0192130024210984, 0.00673648039313177 ) ); +#1916 = CARTESIAN_POINT( '', ( 0.0629749078109400, 0.0192107575374136, 0.00714879893378521 ) ); +#1917 = CARTESIAN_POINT( '', ( 0.0618394512678651, 0.0192036312229338, 0.00755816864115195 ) ); +#1918 = CARTESIAN_POINT( '', ( 0.0606896338024526, 0.0191918432438965, 0.00796448940494246 ) ); +#1919 = CARTESIAN_POINT( '', ( 0.0595255696468147, 0.0191756170743985, 0.00836766973606784 ) ); +#1920 = CARTESIAN_POINT( '', ( 0.0583473762426901, 0.0191551743138740, 0.00876762047101412 ) ); +#1921 = CARTESIAN_POINT( '', ( 0.0571551750454239, 0.0191307361098744, 0.00916425613377580 ) ); +#1922 = CARTESIAN_POINT( '', ( 0.0559490914219642, 0.0191025226798340, 0.00955749421631340 ) ); +#1923 = CARTESIAN_POINT( '', ( 0.0547292547969618, 0.0190707533544861, 0.00994725502766721 ) ); +#1924 = CARTESIAN_POINT( '', ( 0.0534957987330052, 0.0190356464829547, 0.0103334613907055 ) ); +#1925 = CARTESIAN_POINT( '', ( 0.0522488610303844, 0.0189974193781374, 0.0107160383825527 ) ); +#1926 = CARTESIAN_POINT( '', ( 0.0509885838231649, 0.0189562882529540, 0.0110949130652759 ) ); +#1927 = CARTESIAN_POINT( '', ( 0.0497151136778803, 0.0189124681599843, 0.0114700142213852 ) ); +#1928 = CARTESIAN_POINT( '', ( 0.0484286016931469, 0.0188661729304226, 0.0118412720896248 ) ); +#1929 = CARTESIAN_POINT( '', ( 0.0471292036005879, 0.0188176151119197, 0.0122086181039550 ) ); +#1930 = CARTESIAN_POINT( '', ( 0.0458170798672446, 0.0187670059071903, 0.0125719846281294 ) ); +#1931 = CARTESIAN_POINT( '', ( 0.0444923957983541, 0.0187145551022319, 0.0129313047131666 ) ); +#1932 = CARTESIAN_POINT( '', ( 0.0431553216448510, 0.0186604710234237, 0.0132865117744765 ) ); +#1933 = CARTESIAN_POINT( '', ( 0.0418060326990990, 0.0186049603720320, 0.0136375395781556 ) ); +#1934 = CARTESIAN_POINT( '', ( 0.0404447094411428, 0.0185482285050361, 0.0139843210653439 ) ); +#1935 = CARTESIAN_POINT( '', ( 0.0390715375003302, 0.0184904780115559, 0.0143267915677922 ) ); +#1936 = CARTESIAN_POINT( '', ( 0.0368525861400671, 0.0183966387398381, 0.0148685130421828 ) ); +#1937 = CARTESIAN_POINT( '', ( 0.0337494156006120, 0.0182648098452846, 0.0155956334591561 ) ); +#1938 = CARTESIAN_POINT( '', ( 0.0297238369639194, 0.0180950414546094, 0.0164847266876609 ) ); +#1939 = CARTESIAN_POINT( '', ( 0.0255827407288701, 0.0179239093655390, 0.0173462313228838 ) ); +#1940 = CARTESIAN_POINT( '', ( 0.0199921864036138, 0.0176999675368650, 0.0184406279985885 ) ); +#1941 = CARTESIAN_POINT( '', ( 0.0130494985015457, 0.0174403496812535, 0.0196767326469567 ) ); +#1942 = CARTESIAN_POINT( '', ( 0.00461089443598168, 0.0172080910345094, 0.0209590914695612 ) ); +#1943 = CARTESIAN_POINT( '', ( -0.00380260542558739, 0.0171115218756231, 0.0219894480072961 ) ); +#1944 = CARTESIAN_POINT( '', ( -0.0125593256799569, 0.0172238629144588, 0.0227525316460854 ) ); +#1945 = CARTESIAN_POINT( '', ( -0.0212515680378702, 0.0176208678416851, 0.0231282011263563 ) ); +#1946 = CARTESIAN_POINT( '', ( -0.0294837570912986, 0.0183716999208358, 0.0230011226167031 ) ); +#1947 = CARTESIAN_POINT( '', ( -0.0367506861731991, 0.0193916989345241, 0.0223907508914154 ) ); +#1948 = CARTESIAN_POINT( '', ( -0.0431254420975357, 0.0206018207775414, 0.0213467723542317 ) ); +#1949 = CARTESIAN_POINT( '', ( -0.0484767188656631, 0.0218763614106537, 0.0199404315204945 ) ); +#1950 = CARTESIAN_POINT( '', ( -0.0528597422140692, 0.0230709474241381, 0.0183300962172453 ) ); +#1951 = CARTESIAN_POINT( '', ( -0.0563370034443759, 0.0241195315297633, 0.0166666747337268 ) ); +#1952 = CARTESIAN_POINT( '', ( -0.0594839084279121, 0.0251577812338901, 0.0147181591251576 ) ); +#1953 = CARTESIAN_POINT( '', ( -0.0622339434945754, 0.0261441819694012, 0.0124727204049314 ) ); +#1954 = CARTESIAN_POINT( '', ( -0.0642308425119148, 0.0269420542294984, 0.0101706239429872 ) ); +#1955 = CARTESIAN_POINT( '', ( -0.0654989594415741, 0.0275077592437062, 0.00809663113715278 ) ); +#1956 = CARTESIAN_POINT( '', ( -0.0661530629953639, 0.0278404740887177, 0.00658418298882862 ) ); +#1957 = CARTESIAN_POINT( '', ( -0.0665291716211178, 0.0280657783426671, 0.00532864636559680 ) ); +#1958 = CARTESIAN_POINT( '', ( -0.0666939262295782, 0.0281852404386561, 0.00454195847190966 ) ); +#1959 = CARTESIAN_POINT( '', ( -0.0667802008712074, 0.0282631789822268, 0.00395537246257127 ) ); +#1960 = CARTESIAN_POINT( '', ( -0.0668411947998328, 0.0283286734905474, 0.00341797655856995 ) ); +#1961 = CARTESIAN_POINT( '', ( -0.0668815459191162, 0.0284065250609663, 0.00269467582499983 ) ); +#1962 = CARTESIAN_POINT( '', ( -0.0668642995234980, 0.0284511720181720, 0.00209900903623796 ) ); +#1963 = CARTESIAN_POINT( '', ( -0.0668552608835380, 0.0284745709810872, 0.00178682684124734 ) ); +#1964 = COLOUR_RGB( '', 0.647058844600000, 0.647058844600000, 0.647058844600000 ); +#1965 = COLOUR_RGB( '', 0.647058844600000, 0.647058844600000, 0.647058844600000 ); +#1966 = CARTESIAN_POINT( '', ( -0.137850114450625, 2.54502898037918E-18, -8.48445322276466E-19 ) ); +#1967 = CARTESIAN_POINT( '', ( 0.308874483940678, -2.03494362979802E-19, -8.48445322276466E-19 ) ); +#1968 = CARTESIAN_POINT( '', ( -0.137850114450625, 2.54502898037918E-18, -1.65742903555131E-18 ) ); +#1969 = CARTESIAN_POINT( '', ( -0.137850114450625, 4.77593054936546E-18, 0.00728667749930682 ) ); +#1970 = CARTESIAN_POINT( '', ( -0.0977169822433808, 1.07802503293450E-17, 0.0277047879121596 ) ); +#1971 = CARTESIAN_POINT( '', ( -0.00992200133263989, 1.22682478461264E-17, 0.0343292808328824 ) ); +#1972 = CARTESIAN_POINT( '', ( 0.183871036847927, 4.93727541804947E-19, -0.000234764391036044 ) ); +#1973 = CARTESIAN_POINT( '', ( 0.299713641405106, 2.63425042833262E-18, 0.00908468198031192 ) ); +#1974 = CARTESIAN_POINT( '', ( 0.308874483940678, -2.03494362979802E-19, -1.85704763287042E-18 ) ); +#1975 = CARTESIAN_POINT( '', ( -0.137850114450625, 8.48138335826248E-19, 1.65742903555131E-18 ) ); +#1976 = CARTESIAN_POINT( '', ( -0.137850114450625, -2.27512386075455E-18, -0.00728667749930682 ) ); +#1977 = CARTESIAN_POINT( '', ( -0.0977169822433808, -1.12737882178173E-17, -0.0277047879121596 ) ); +#1978 = CARTESIAN_POINT( '', ( -0.00992200133263989, -1.46533891318385E-17, -0.0343292808328824 ) ); +#1979 = CARTESIAN_POINT( '', ( 0.183871036847927, -1.03066102672634E-18, 0.000234764391036044 ) ); +#1980 = CARTESIAN_POINT( '', ( 0.299713641405106, -5.73795624129668E-18, -0.00908468198031192 ) ); +#1981 = CARTESIAN_POINT( '', ( 0.308874483940678, -1.90038500753273E-18, 1.85704763287042E-18 ) ); +#1982 = COLOUR_RGB( '', 0.647058844600000, 0.647058844600000, 0.647058844600000 ); +#1983 = COLOUR_RGB( '', 0.647058844600000, 0.647058844600000, 0.647058844600000 ); +#1984 = DIRECTION( '', ( 0.00000000000000, -1.00000000000000, 0.00000000000000 ) ); +#1985 = DIRECTION( '', ( 0.00000000000000, -1.00000000000000, 0.00000000000000 ) ); +#1986 = DIRECTION( '', ( -0.139159740963719, 0.00000000000000, -0.990269946274707 ) ); +#1987 = DIRECTION( '', ( 0.00000000000000, -1.00000000000000, 0.00000000000000 ) ); +#1988 = DIRECTION( '', ( 1.23052249786856E-17, 1.00000000000000, -6.12323399573677E-16 ) ); +#1989 = DIRECTION( '', ( 1.23052249786856E-17, 1.00000000000000, -6.12323399573677E-16 ) ); +#1990 = DIRECTION( '', ( -0.139159740963719, -6.04653068078036E-16, -0.990269946274707 ) ); +#1991 = DIRECTION( '', ( 1.23052249786856E-17, 1.00000000000000, -6.12323399573677E-16 ) ); +ENDSEC; +END-ISO-10303-21; diff --git a/contrib/HighOrderMeshOptimizer/BoundaryLayerCurver2D.cpp b/contrib/HighOrderMeshOptimizer/BoundaryLayerCurver2D.cpp index dcb45df42e2c60049c47175af99707c5c4961a5a..cafe4de5f064ca2ea33470627e086a32843f8d9c 100644 --- a/contrib/HighOrderMeshOptimizer/BoundaryLayerCurver2D.cpp +++ b/contrib/HighOrderMeshOptimizer/BoundaryLayerCurver2D.cpp @@ -70,20 +70,14 @@ namespace { } } - void drawBezierControlPolygon(const fullMatrix<double> &controlPoints, - GEdge *gedge) + void drawBezierControlPolygon(const bezierCoeff &controlPoints, GEdge *gedge) { - const int nVert = controlPoints.size1(); - std::vector<int> idx(nVert); - idx[0] = 0; - for(int i = 1; i < nVert - 1; ++i) idx[i] = i + 1; - idx[nVert - 1] = 1; + const int nVert = controlPoints.getNumCoeff(); MVertex *previous = NULL; for(int i = 0; i < nVert; ++i) { - MVertex *v = - new MVertex(controlPoints(idx[i], 0), controlPoints(idx[i], 1), - controlPoints(idx[i], 2), gedge); + MVertex *v = new MVertex(controlPoints(i, 0), controlPoints(i, 1), + controlPoints(i, 2), gedge); if(previous) { MLine *line = new MLine(v, previous); gedge->addLine(line); @@ -96,53 +90,35 @@ namespace { void drawBezierControlPolygon(const std::vector<MVertex *> &vertices, GEdge *gedge = NULL) { - if(!gedge) { gedge = *GModel::current()->firstEdge(); } + if(!gedge) { + gedge = *GModel::current()->firstEdge(); + } const int nVert = (int)vertices.size(); - const bezierBasis *fs = BasisFactory::getBezierBasis(TYPE_LIN, nVert - 1); - fullMatrix<double> xyz(nVert, 3); for(int i = 0; i < nVert; ++i) { xyz(i, 0) = vertices[i]->x(); xyz(i, 1) = vertices[i]->y(); xyz(i, 2) = vertices[i]->z(); } - fullMatrix<double> controlPoints(nVert, 3); - fs->lag2Bez(xyz, controlPoints); - - bool subdivide = false; - bool subdivide2 = false; - if(subdivide) { - fullMatrix<double> allSubs(2 * nVert, 3); - fs->subdivideBezCoeff(controlPoints, allSubs); - fullMatrix<double> sub(nVert, 3); - sub.copy(allSubs, 0, nVert, 0, 3, 0, 0); - if(subdivide2) { - fullMatrix<double> allSubs2(2 * nVert, 3); - fs->subdivideBezCoeff(sub, allSubs2); - fullMatrix<double> sub2(nVert, 3); - sub2.copy(allSubs2, 0, nVert, 0, 3, 0, 0); - drawBezierControlPolygon(sub2, gedge); - sub2.copy(allSubs2, nVert, nVert, 0, 3, 0, 0); - drawBezierControlPolygon(sub2, gedge); - } - else - drawBezierControlPolygon(sub, gedge); - sub.copy(allSubs, nVert, nVert, 0, 3, 0, 0); - if(subdivide2) { - fullMatrix<double> allSubs2(2 * nVert, 3); - fs->subdivideBezCoeff(sub, allSubs2); - fullMatrix<double> sub2(nVert, 3); - sub2.copy(allSubs2, 0, nVert, 0, 3, 0, 0); - drawBezierControlPolygon(sub2, gedge); - sub2.copy(allSubs2, nVert, nVert, 0, 3, 0, 0); - drawBezierControlPolygon(sub2, gedge); + + bezierCoeff *controlPoints = + new bezierCoeff(FuncSpaceData(TYPE_LIN, nVert - 1, false), xyz); + std::vector<bezierCoeff *> allControlPoints(1, controlPoints); + + int numSubdivision = 0; // change this to choose num subdivision + while(numSubdivision-- > 0) { + std::vector<bezierCoeff *> gatherSubs; + for(std::size_t i = 0; i < allControlPoints.size(); ++i) { + std::vector<bezierCoeff *> tmp; + allControlPoints[i]->subdivide(tmp); + gatherSubs.insert(allControlPoints.end(), tmp.begin(), tmp.end()); } - else - drawBezierControlPolygon(sub, gedge); + allControlPoints.swap(gatherSubs); } - else { - drawBezierControlPolygon(controlPoints, gedge); + + for(std::size_t i = 0; i < allControlPoints.size(); ++i) { + drawBezierControlPolygon(*allControlPoints[i], gedge); } } @@ -241,9 +217,9 @@ namespace BoundaryLayerCurver { Msg::Warning("Could not compute param of vertex %d on edge %d", edge->getVertex(i)->getNum(), gedge->tag()); } - else if(gedge->periodic(0) && - gedge->getBeginVertex() && - edge->getVertex(i) == gedge->getBeginVertex()->mesh_vertices[0]) { + else if(gedge->periodic(0) && gedge->getBeginVertex() && + edge->getVertex(i) == + gedge->getBeginVertex()->mesh_vertices[0]) { double u0 = gedge->getLowerBound(); double un = gedge->getUpperBound(); int k = (nVert == 2 ? 1 - i : (i == 0 ? 2 : nVert - 1)); @@ -272,7 +248,9 @@ namespace BoundaryLayerCurver { t = _gedge->firstDer(paramGeoEdge); t.normalize(); } - if(!_gedge || t.norm() == 0) { t = _edgeOnBoundary->tangent(paramEdge); } + if(!_gedge || t.norm() == 0) { + t = _edgeOnBoundary->tangent(paramEdge); + } if(_gface) { SPoint2 paramGFace; @@ -490,7 +468,7 @@ namespace BoundaryLayerCurver { data->invA.mult(xyz, newxyzLow); std::vector<MVertex *> vertices = edge->getVertices(); - vertices.resize((unsigned int)order + 1); + vertices.resize(static_cast<std::size_t>(order) + 1); MEdgeN lowOrderEdge(vertices); for(std::size_t i = 2; i < vertices.size(); ++i) { @@ -606,7 +584,9 @@ namespace BoundaryLayerCurver { for(int i = 0; i < nbDofh; ++i) { double sf[100]; fs->f(refNodesh(i, 0), refNodesh(i, 1), refNodesh(i, 2), sf); - for(int j = 0; j < nbDof; ++j) { Mh(i, j) = sf[j]; } + for(int j = 0; j < nbDof; ++j) { + Mh(i, j) = sf[j]; + } } // Mh.print("Mh"); @@ -626,7 +606,9 @@ namespace BoundaryLayerCurver { double *val = new double[nbDofh]; for(int i = 0; i < nbDofh; ++i) { LegendrePolynomials::fc(order + 1, refNodesh(i, 0), val); - for(int j = 0; j < nbDofh; ++j) { vandermonde(i, j) = val[j]; } + for(int j = 0; j < nbDofh; ++j) { + vandermonde(i, j) = val[j]; + } } delete val; @@ -643,7 +625,9 @@ namespace BoundaryLayerCurver { double *val = new double[nbDof]; for(int i = 0; i < nbDof; ++i) { LegendrePolynomials::fc(order, refNodes(i, 0), val); - for(int j = 0; j < nbDof; ++j) { Me(i, j) = val[j]; } + for(int j = 0; j < nbDof; ++j) { + Me(i, j) = val[j]; + } } delete val; } @@ -1026,7 +1010,9 @@ namespace BoundaryLayerCurver { const fullMatrix<double> &refNodes = fs->getReferenceNodes(); for(int i = 0; i < szSpace; ++i) { basis.f(refNodes(i, 0), 0, 0, val); - for(int j = 0; j < szSpace; ++j) { Leg2Lag(i, j) = val[j]; } + for(int j = 0; j < szSpace; ++j) { + Leg2Lag(i, j) = val[j]; + } } } @@ -1062,7 +1048,9 @@ namespace BoundaryLayerCurver { M2(i, j) = val[i] * data->intPoints[j].weight; } } - for(int i = 0; i < nConstraint; ++i) { M2(szSpace + i, nGP + i) = 1; } + for(int i = 0; i < nConstraint; ++i) { + M2(szSpace + i, nGP + i) = 1; + } } fullMatrix<double> M1(szSpace + nConstraint, szSpace + nConstraint, true); @@ -1084,7 +1072,9 @@ namespace BoundaryLayerCurver { { for(int i = 0; i < szSpace; ++i) { basis.f(refNodes(i, 0), refNodes(i, 1), 0, val); - for(int j = 0; j < szSpace; ++j) { Leg2Lag(i, j) = val[j]; } + for(int j = 0; j < szSpace; ++j) { + Leg2Lag(i, j) = val[j]; + } } } @@ -1120,7 +1110,9 @@ namespace BoundaryLayerCurver { M2(i, j) = val[i] * data->intPoints[j].weight; } } - for(int i = 0; i < nConstraint; ++i) { M2(szSpace + i, nGP + i) = 1; } + for(int i = 0; i < nConstraint; ++i) { + M2(szSpace + i, nGP + i) = 1; + } } fullMatrix<double> M1(szSpace + nConstraint, szSpace + nConstraint, true); @@ -1142,7 +1134,9 @@ namespace BoundaryLayerCurver { { for(int i = 0; i < szSpace; ++i) { basis.f(refNodes(i, 0), refNodes(i, 1), 0, val); - for(int j = 0; j < szSpace; ++j) { Leg2Lag(i, j) = val[j]; } + for(int j = 0; j < szSpace; ++j) { + Leg2Lag(i, j) = val[j]; + } } } @@ -1227,14 +1221,18 @@ namespace BoundaryLayerCurver { } for(int l = k - numVertexPerLayer; l < k; ++l) { - if(stack[l] == vbot) { stack[l + numVertexPerLayer] = vtop; } + if(stack[l] == vbot) { + stack[l + numVertexPerLayer] = vtop; + } } } // If there remains NULL values, it is because the vertex is the same // on bottom face and top face. for(int l = k; l < k + numVertexPerLayer; ++l) { - if(stack[l] == NULL) { stack[l] = stack[l - numVertexPerLayer]; } + if(stack[l] == NULL) { + stack[l] = stack[l - numVertexPerLayer]; + } } k += numVertexPerLayer; diff --git a/contrib/HighOrderMeshOptimizer/HighOrderMeshFastCurving.cpp b/contrib/HighOrderMeshOptimizer/HighOrderMeshFastCurving.cpp index e91f5bdd41bca6685e882e3e8d23936a67a6898b..56d242c8133d369de5eeba8a6deff5694139d988 100644 --- a/contrib/HighOrderMeshOptimizer/HighOrderMeshFastCurving.cpp +++ b/contrib/HighOrderMeshOptimizer/HighOrderMeshFastCurving.cpp @@ -49,6 +49,7 @@ #include "Field.h" #include "boundaryLayersData.h" #include "BoundaryLayerCurver.h" +#include "FuncSpaceData.h" namespace { @@ -58,7 +59,7 @@ namespace { // Compute edge -> element connectivity (for 2D elements) void calcEdge2Elements(GEntity *entity, MEdgeVecMEltMap &ed2el) { - for(size_t iEl = 0; iEl < entity->getNumMeshElements(); iEl++) { + for(std::size_t iEl = 0; iEl < entity->getNumMeshElements(); iEl++) { MElement *elt = entity->getMeshElement(iEl); // elt->setVisibility(0); // fordebug if(elt->getDim() == 2) @@ -71,7 +72,7 @@ namespace { // Compute face -> element connectivity (for 3D elements) void calcFace2Elements(GEntity *entity, MFaceVecMEltMap &face2el) { - for(size_t iEl = 0; iEl < entity->getNumMeshElements(); iEl++) { + for(std::size_t iEl = 0; iEl < entity->getNumMeshElements(); iEl++) { MElement *elt = entity->getMeshElement(iEl); // elt->setVisibility(0); // fordebug if(elt->getDim() == 3) @@ -734,8 +735,9 @@ namespace { { const int nbVert = bndElt->getNumVertices(); const int nbPrimVert = bndElt->getNumPrimaryVertices(); - const GradientBasis *gb = - BasisFactory::getGradientBasis(FuncSpaceData(bndElt)); + const GradientBasis *gb; + const int tag = bndElt->getTypeForMSH(); + gb = BasisFactory::getGradientBasis(tag, FuncSpaceData(bndElt)); // Coordinates of nodes fullMatrix<double> nodesXYZ(nbVert, 3); diff --git a/contrib/MeshOptimizer/CADDistances.cpp b/contrib/MeshOptimizer/CADDistances.cpp index 14fe8dcc0b3b1e753e8116a6e0fa84456ef06540..21ef1364c146160062e901b0ea2d7ae41a197ad9 100644 --- a/contrib/MeshOptimizer/CADDistances.cpp +++ b/contrib/MeshOptimizer/CADDistances.cpp @@ -224,7 +224,9 @@ namespace { const std::vector<SPoint3> &Q) { double CAij; - if(CA(i, j) > -1.) { CAij = CA(i, j); } + if(CA(i, j) > -1.) { + CAij = CA(i, j); + } else if(i == 0 && j == 0) { CA(i, j) = P[0].distance(Q[0]); // update the CA permanent CAij = CA(i, j); // set the current relevant value @@ -469,7 +471,8 @@ double taylorDistanceSq2D(const GradientBasis *gb, double taylorDistanceEdge(MLine *l, GEdge *ge) { const int nV = l->getNumVertices(); - const GradientBasis *gb = BasisFactory::getGradientBasis(FuncSpaceData(l)); + const GradientBasis *gb; + gb = BasisFactory::getGradientBasis(l->getTypeForMSH(), FuncSpaceData(l)); // Coordinates of vertices fullMatrix<double> nodesXYZ(nV, 3); @@ -491,7 +494,8 @@ double taylorDistanceEdge(MLine *l, GEdge *ge) double taylorDistanceFace(MElement *el, GFace *gf) { const int nV = el->getNumVertices(); - const GradientBasis *gb = BasisFactory::getGradientBasis(FuncSpaceData(el)); + const GradientBasis *gb; + gb = BasisFactory::getGradientBasis(el->getTypeForMSH(), FuncSpaceData(el)); // Coordinates of vertices fullMatrix<double> nodesXYZ(nV, 3); diff --git a/contrib/MeshOptimizer/Patch.cpp b/contrib/MeshOptimizer/Patch.cpp index 548b9837e9b7c9ea40ab06b1111b5cbb4e4c6e37..9334ce30406c1841a696f94d986269aa06ea7ab6 100644 --- a/contrib/MeshOptimizer/Patch.cpp +++ b/contrib/MeshOptimizer/Patch.cpp @@ -32,6 +32,7 @@ #include "CADDistances.h" #include "qualityMeasures.h" #include "Patch.h" +#include "bezierBasis.h" Patch::Patch(const std::map<MElement *, GEntity *> &element2entity, const std::map<MElement *, GEntity *> &bndEl2Ent, @@ -414,8 +415,7 @@ void Patch::scaledJacAndGradients(int iEl, std::vector<double> &sJ, const JacobianBasis *jacBasis = _el[iEl]->getJacobianFuncSpace(); const int &numJacNodes = _nBezEl[iEl]; const int &numMapNodes = _nNodEl[iEl]; - fullMatrix<double> JDJ(numJacNodes, 3 * numMapNodes + 1), - BDB(numJacNodes, 3 * numMapNodes + 1); + fullMatrix<double> JDJ(numJacNodes, 3 * numMapNodes + 1); // Coordinates of nodes fullMatrix<double> nodesXYZ(numMapNodes, 3), normals(_dim, 3); @@ -432,7 +432,7 @@ void Patch::scaledJacAndGradients(int iEl, std::vector<double> &sJ, if(_dim == 3) JDJ.scale(_invStraightJac[iEl]); // Transform Jacobian and gradients from Lagrangian to Bezier basis - jacBasis->lag2Bez(JDJ, BDB); + bezierCoeff BDB(jacBasis->getFuncSpaceData(), JDJ); // Scaled jacobian for(int l = 0; l < numJacNodes; l++) sJ[l] = BDB(l, 3 * numMapNodes); @@ -496,7 +496,9 @@ void Patch::metricMinAndGradients(int iEl, std::vector<double> &lambda, int iPC = 0; std::vector<SPoint3> gXyzV(numJacNodes); std::vector<SPoint3> gUvwV(numJacNodes); - for(int l = 0; l < numJacNodes; l++) { lambda[l] = lambdaB(l); } + for(int l = 0; l < numJacNodes; l++) { + lambda[l] = lambdaB(l); + } for(int i = 0; i < numMapNodes; i++) { int &iFVi = _el2FV[iEl][i]; if(iFVi >= 0) { @@ -562,7 +564,9 @@ bool Patch::bndDistAndGradients(int iEl, double &f, std::vector<double> &gradF, nodes[i] = _xyz[_el2V[iEl][closure[i]]]; onedge[i] = element->getVertex(closure[i])->onWhat() == edge && _el2FV[iEl][closure[i]] >= 0; - if(onedge[i]) { params[i] = _uvw[_el2FV[iEl][closure[i]]].x(); } + if(onedge[i]) { + params[i] = _uvw[_el2FV[iEl][closure[i]]].x(); + } else reparamMeshVertexOnEdge(element->getVertex(closure[i]), edge, params[i]); @@ -583,8 +587,9 @@ void Patch::scaledCADDistSqAndGradients(int iBndEl, double &scaledDist, { const std::vector<int> &iV = _bndEl2V[iBndEl], &iFV = _bndEl2FV[iBndEl]; const int nV = iV.size(); - const GradientBasis *gb = - BasisFactory::getGradientBasis(FuncSpaceData(_bndEl[iBndEl])); + const GradientBasis *gb; + const int tag = _bndEl[iBndEl]->getTypeForMSH(); + gb = BasisFactory::getGradientBasis(tag, FuncSpaceData(_bndEl[iBndEl])); // Coordinates of nodes fullMatrix<double> nodesXYZ(nV, 3); @@ -793,8 +798,7 @@ void Patch::idealJacAndGradients(int iEl, std::vector<double> &iJ, const JacobianBasis *jacBasis = _el[iEl]->getJacobianFuncSpace(); const int &numJacNodes = _nIJacEl[iEl]; const int &numMapNodes = _nNodEl[iEl]; - fullMatrix<double> JDJ(numJacNodes, 3 * numMapNodes + 1), - BDB(numJacNodes, 3 * numMapNodes + 1); + fullMatrix<double> JDJ(numJacNodes, 3 * numMapNodes + 1); // Coordinates of nodes fullMatrix<double> nodesXYZ(numMapNodes, 3), normals(_dim, 3); @@ -811,7 +815,7 @@ void Patch::idealJacAndGradients(int iEl, std::vector<double> &iJ, if(_dim == 3) JDJ.scale(_invIJac[iEl]); // Transform Jacobian and gradients from Lagrangian to Bezier basis - jacBasis->lag2Bez(JDJ, BDB); + bezierCoeff BDB(jacBasis->getFuncSpaceData(), JDJ); // Scaled jacobian for(int l = 0; l < numJacNodes; l++) iJ[l] = BDB(l, 3 * numMapNodes); diff --git a/contrib/MeshOptimizer/doc/mesh_optimization.tex b/contrib/MeshOptimizer/doc/mesh_optimization.tex index d813f2cf414cd71228e298cd61daca3417247ad1..7ea881fc5c6ec0f00cf54af64746210c3d59abf4 100644 --- a/contrib/MeshOptimizer/doc/mesh_optimization.tex +++ b/contrib/MeshOptimizer/doc/mesh_optimization.tex @@ -16,7 +16,7 @@ \usepackage{subfig} \usepackage{epstopdf} \usepackage{amsfonts,amsmath,amssymb,amscd} -% typesetting headers and footers +% typesetting headers and footers \usepackage{fancyhdr} %\usepackage{lastpage} @@ -49,7 +49,7 @@ %\newcommand{\reference}{D4.1-30b} %\newcommand{\shorttitle}{Curvilinear Mesh Generation Capability in Gmsh} %\newcommand{\theauthor}{T. Toulorge, J.F. Remacle} - + \title{Mesh Optimization in Gmsh} \author{Thomas Toulorge} \date{November 2014} @@ -80,7 +80,7 @@ %\newcommand{\chaptermark}[1]{\markboth{#1}{}} % ------------------------------------------------------------------------------ -% main text +% main text % ------------------------------------------------------------------------------ %\newpage @@ -163,7 +163,7 @@ $m$ will never exceed $\epsilon$. %\end{center} \caption{Barrier function for $\omega=1$ and $\epsilon<\omega$ (left) or $\epsilon>\omega$ -(right)\label{fig:barrier}} +(right)\label{fig:barrier}} \end{figure} In order for the measure $m$ to remain in the domain of definition of @@ -193,7 +193,7 @@ function is composed of a fixed barrier set to $m_{\min}$, plus a moving barrier that forces $m$ to drop below a value $m_{\max}$. This technique can also prove useful when one wants to impose a constraint on a crucial measure $m_1$ in a first pass, and then improve another less important -one $m_2$ in a second pass. +one $m_2$ in a second pass. \begin{figure} %\begin{center} @@ -201,7 +201,7 @@ one $m_2$ in a second pass. \includegraphics[width=0.95\textwidth]{opti_process/opti_process} %\end{center} \caption{Optimization process: three successive series of -(maximum) 30 conjugate gradient iterations\label{fig:opti_process}} +(maximum) 30 conjugate gradient iterations\label{fig:opti_process}} \end{figure} @@ -353,7 +353,7 @@ entity each element is classified) should be passed respectively: \item to \texttt{patchDef} (see Section~\ref{sec:patch-selec}), in order to take it into account in the selection of mesh patches, \item to the classes \texttt{MeshOpt} and \texttt{Patch}, in order -to take it into account in the evaluation of quality measures. +to take it into account in the evaluation of quality measures. \end{itemize} If both fields are set to \texttt{false}, the geometrical information is not computed, which may result in an improved performance. @@ -671,7 +671,7 @@ on the minimum scaled Jacobian plus a moving barrier on the maximum scaled Jacobian with $J_{\max}$ as target value. -The high-order mesh optimizer is accessible from the ``High order +The high-order mesh optimizer is accessible from the ``High-order tools'' window in Gmsh's graphical interface. The parameters are as follows: diff --git a/demos/api/adapt_mesh.cpp b/demos/api/adapt_mesh.cpp index a614a1698687014ac1c6c41423fd0b12007c1c0b..8aa7b60fe3e87213079af3afda537440f600cb94 100644 --- a/demos/api/adapt_mesh.cpp +++ b/demos/api/adapt_mesh.cpp @@ -80,21 +80,17 @@ class myMesh{ (vtags[i], vxyz[3*i], vxyz[3*i+1], vxyz[3*i+2]); } for(unsigned int i = 0; i < etypes.size(); i++){ + std::vector<double> quvw, qweight; + gmsh::model::mesh::getIntegrationPoints(etypes[i], "Gauss2", quvw, qweight); std::vector<double> qdeter, qjacob, qpoints; - gmsh::model::mesh::getJacobians(etypes[i], "Gauss2", - qjacob, qdeter, qpoints); - std::vector<double> quvwo, fsdata; - int fsnumcomp; - gmsh::model::mesh::getBasisFunctions(etypes[i], "Gauss2", "None", - quvwo, fsnumcomp, fsdata); + gmsh::model::mesh::getJacobians(etypes[i], quvw, qjacob, qdeter, qpoints); int nev = evtags[i].size() / etags[i].size(); - int nq = quvwo.size() / 4; - std::vector<double> qu, qv, qw, qweight; - for(unsigned int j = 0; j < quvwo.size(); j+=4){ - qu.push_back(quvwo[j]); - qv.push_back(quvwo[j+1]); - qw.push_back(quvwo[j+2]); - qweight.push_back(quvwo[j+3]); + int nq = quvw.size() / 3; + std::vector<double> qu, qv, qw; + for(unsigned int j = 0; j < quvw.size(); j+=3){ + qu.push_back(quvw[j]); + qv.push_back(quvw[j+1]); + qw.push_back(quvw[j+2]); } for(unsigned int j = 0; j < etags[i].size(); j++){ std::vector<myVertex*> ev; diff --git a/demos/api/adapt_mesh.py b/demos/api/adapt_mesh.py index 5b266fc4f72b59ae3753a59d6aa870810f855d97..809f6c598232bb321ec939587b348ebb6b5eaaeb 100644 --- a/demos/api/adapt_mesh.py +++ b/demos/api/adapt_mesh.py @@ -28,9 +28,9 @@ def my_function(xyz): def compute_interpolation_error(nodes, triangles, f): - jac,det,pt = gmsh.model.mesh.getJacobians(2,"Gauss2") - uvwo,numcomp,sf = gmsh.model.mesh.getBasisFunctions(2,"Gauss2","Lagrange") - weights = uvwo.reshape([-1,4])[:,3] + uvw,weights = gmsh.model.mesh.getIntegrationPoints(2,"Gauss2") + jac,det,pt = gmsh.model.mesh.getJacobians(2,uvw) + numcomp,sf = gmsh.model.mesh.getBasisFunctions(2,uvw,"Lagrange") sf = sf.reshape((weights.shape[0],-1)) qx = pt.reshape((triangles.shape[0],-1,3)) det = np.abs(det.reshape((triangles.shape[0],-1))) diff --git a/demos/api/edges.cpp b/demos/api/edges.cpp index 22e58872c7775db3bc7c1ea2cf3df1e2fc6cfee8..9cd4bf367297d579d0f3738e22e58c93150338a3 100644 --- a/demos/api/edges.cpp +++ b/demos/api/edges.cpp @@ -84,10 +84,11 @@ int main(int argc, char **argv) // iterate over all 1D elements and get integration information gmsh::model::mesh::getElementTypes(eleTypes, 1); int eleType1D = eleTypes[0]; - std::vector<double> intpts, bf; + std::vector<double> uvw, q; + gmsh::model::mesh::getIntegrationPoints(eleType1D, "Gauss3", uvw, q); + std::vector<double> bf; int numComp; - gmsh::model::mesh::getBasisFunctions(eleType1D, "Gauss3", "IsoParametric", - intpts, numComp, bf); + gmsh::model::mesh::getBasisFunctions(eleType1D, uvw, "Lagrange", numComp, bf); gmsh::model::getEntities(entities, 1); for(std::size_t i = 0; i < entities.size(); i++){ int c = entities[i].second; @@ -96,7 +97,7 @@ int main(int argc, char **argv) gmsh::logger::write("- " + std::to_string(elementTags.size()) + " elements on curve " + std::to_string(c)); std::vector<double> jac, det, pts; - gmsh::model::mesh::getJacobians(eleType1D, "Gauss3", jac, det, pts, c); + gmsh::model::mesh::getJacobians(eleType1D, uvw, jac, det, pts, c); } gmsh::fltk::run(); diff --git a/demos/api/faces.cpp b/demos/api/faces.cpp index b2bfd41539b0075abcad26dc0f9967c9ab909b65..ecf36324ea107b7a824de05be2e55f7653074cc5 100644 --- a/demos/api/faces.cpp +++ b/demos/api/faces.cpp @@ -84,10 +84,11 @@ int main(int argc, char **argv) // iterate over all 2D elements and get integration information gmsh::model::mesh::getElementTypes(eleTypes, 2); int eleType2D = eleTypes[0]; - std::vector<double> intpts, bf; + std::vector<double> uvw, q; + gmsh::model::mesh::getIntegrationPoints(eleType2D, "Gauss3", uvw, q); + std::vector<double> bf; int numComp; - gmsh::model::mesh::getBasisFunctions(eleType2D, "Gauss3", "IsoParametric", - intpts, numComp, bf); + gmsh::model::mesh::getBasisFunctions(eleType2D, uvw, "Lagrange", numComp, bf); gmsh::model::getEntities(entities, 2); for(std::size_t i = 0; i < entities.size(); i++){ int s = entities[i].second; @@ -96,7 +97,7 @@ int main(int argc, char **argv) gmsh::logger::write("- " + std::to_string(elementTags.size()) + " elements on surface " + std::to_string(s)); std::vector<double> jac, det, pts; - gmsh::model::mesh::getJacobians(eleType2D, "Gauss3", jac, det, pts, s); + gmsh::model::mesh::getJacobians(eleType2D, uvw, jac, det, pts, s); } gmsh::fltk::run(); diff --git a/demos/api/neighbors.py b/demos/api/neighbors.py new file mode 100644 index 0000000000000000000000000000000000000000..e448f0e1a4128f24f582eafdbffddbac589d3e58 --- /dev/null +++ b/demos/api/neighbors.py @@ -0,0 +1,44 @@ +import gmsh +import sys + +# small example showing how the api can be used to compute the neighbours (by a +# face) of all tets in the mesh + +gmsh.initialize(sys.argv) +gmsh.option.setNumber("General.Terminal", 1) + +gmsh.model.add("my test model"); +gmsh.model.occ.addBox(0,0,0, 1,1,1); +gmsh.model.occ.synchronize() +gmsh.model.mesh.generate(3) + +print "--- getting tets and face nodes" +tets, _ = gmsh.model.mesh.getElementsByType(4) +fnodes = gmsh.model.mesh.getElementFaceNodes(4, 3) + +print "--- computing face x tet incidence" +faces = [] +fxt = {} +for i in range(0, len(fnodes), 3): + f = tuple(sorted(fnodes[i:i+3])) + faces.append(f) + t = tets[i/12] + if not f in fxt: + fxt[f] = [t] + else: + fxt[f].append(t) + +print "--- computing neighbors by face" +txt = {} +for i in range(0, len(faces)): + f = faces[i] + t = tets[i/4] + if not t in txt: + txt[t] = set() + for tt in fxt[f]: + if tt != t: + txt[t].add(tt) + +print "--- done: neighbors by face =", txt + +gmsh.finalize() diff --git a/demos/api/poisson.py b/demos/api/poisson.py index 7764dae868046a9b48f8fb1c0872068a8cf01eb0..0692714175343787bc02c984cd403f85829eee2d 100644 --- a/demos/api/poisson.py +++ b/demos/api/poisson.py @@ -11,7 +11,6 @@ import sys # $ python demos/api/poisson.py # with usual gmsh line arguments, e.g., -clscale 0.5 -order 2 -INTEGRATION = 'Gauss2' DEBUG = 0 RECOMBINE = 0 @@ -98,12 +97,12 @@ def fem_solve(): # Assembly of stiffness matrix for all 2 dimensional elements # (triangles or quadrangles) if dimEntity==2 : - uvwo, numcomp, sf = model.mesh.getBasisFunctions( - elementType, INTEGRATION, 'Lagrange') - # debug('%uvwo =', len(uvwo), '%numcomp =', numcomp, - # '%sf =', len(sf)) - # only keep the Gauss weights - weights = np.array(uvwo).reshape((-1,4))[:,3] + prop = model.mesh.getElementProperties(elementType) + uvw, weights = model.mesh.getIntegrationPoints( + elementType, "Gauss" + str(2 * prop[2])) + numcomp, sf = model.mesh.getBasisFunctions( + elementType, uvw, 'Lagrange') + weigths = np.array(weights) numGaussPoints = weights.shape[0] debug('numGaussPoints = g =', numGaussPoints, ', %weights (g) =', weights.shape) @@ -111,17 +110,15 @@ def fem_solve(): debug('%sf (g,n) =', sf.shape) if sf.shape[1] != numElementNodes: error('Something went wrong') - _, numcomp, dsfdu = model.mesh.getBasisFunctions( - elementType, INTEGRATION, 'GradLagrange') - # debug('%uvwo =', len(uvwo), '%numcomp =', numcomp, '%dsfdu =', - # len(dsfdu)) + numcomp, dsfdu = model.mesh.getBasisFunctions( + elementType, uvw, 'GradLagrange') # remove useless dsfdw dsfdu = np.array(dsfdu).reshape( (numGaussPoints,numElementNodes,3))[:,:,:-1] debug('%dsfdu (g,n,u) =', dsfdu.shape) qjac, qdet, qpoint = model.mesh.getJacobians( - elementType, INTEGRATION, tagEntity) + elementType, uvw, tagEntity) debug('Gauss integr:', len(qjac), len(qdet), len(qpoint), '= (9, 1, 3) x', numGaussPoints, 'x', numElements) qdet = np.array(qdet).reshape((numElements, numGaussPoints)) @@ -129,7 +126,7 @@ def fem_solve(): # remove components of dxdu useless in dimEntity dimensions (here 2D) dxdu = np.array(qjac).reshape( (numElements, numGaussPoints, 3, 3))[:,:,:-1,:-1] - # jacobien store by row, so dxdu[i][j] = dxdu_ij = dxi/duj + # jacobian stored by row, so dxdu[i][j] = dxdu_ij = dxi/duj debug('%dxdu (e,g,x,u)=', dxdu.shape) # dudx[j][k] = dudx_jk = duj/dxk diff --git a/demos/api/step_assembly.py b/demos/api/step_assembly.py index 250e193080a5639683fe58d70bf94877cb8fd024..4a27c99294943e26cc151bf61fc257cbb1f616a5 100644 --- a/demos/api/step_assembly.py +++ b/demos/api/step_assembly.py @@ -14,7 +14,8 @@ for e in ent: # get entity labels read from STEP and create a physical group for all # entities having the same 3rd label in the /-separated label path if n: - print('Entity ' + str(e) + ' has label ' + n) + print('Entity ' + str(e) + ' has label ' + n + ' (and mass ' + + str(gmsh.model.occ.getMass(e[0], e[1])) + ')') path = n.split('/') if e[0] == 3 and len(path) > 3: if(path[2] not in physicals): diff --git a/demos/boolean/slicer.geo b/demos/boolean/slicer.geo new file mode 100644 index 0000000000000000000000000000000000000000..dc7ce62c9a12c3d2b5c3d2b5d8494aff45039c7e --- /dev/null +++ b/demos/boolean/slicer.geo @@ -0,0 +1,43 @@ +SetFactory("OpenCASCADE"); + +// load volume from step file +v() = ShapeFromFile("component8.step"); + +// get bounding box of volume +bbox() = BoundingBox Volume{v()}; +xmin = bbox(0); +ymin = bbox(1); +zmin = bbox(2); +xmax = bbox(3); +ymax = bbox(4); +zmax = bbox(5); + +// define number of slices along z-axis +DefineConstant[ N = {3, Min 2, Max 100, Step 1, Name "Number of slices"}]; +dz = (zmax - zmin) / N; + +// define cutting planes +For i In {1:N-1} + Rectangle(1000 + i) = {xmin, ymin, zmin + i * dz, + xmax-xmin, ymax-ymin}; +EndFor + +// fragment (i.e. "intersect") the volume with all the cutting planes +BooleanFragments{ Volume{v()}; Delete; }{ Surface{1000+1:1000+N-1}; Delete; } + +// delete all resulting surfaces that are not on the boundary of a volume, all +// curves that are not on the boundary of a surface, and all points that are not +// on the boundary of a curve +Delete { Surface{:}; Curve{:}; Point{:}; } + +// Et voila :-) + +// To slice the mesh instead the CAD, one can use the "SimplePartition" Plugin: +/* + Plugin("SimplePartition").NumSlicesX = 1; + Plugin("SimplePartition").NumSlicesY = 1; + Plugin("SimplePartition").NumSlicesZ = N; + Plugin("SimplePartition").Run +*/ + +// For general mesh partitions of course, use "PartitionMesh N;" diff --git a/doc/gmsh.1 b/doc/gmsh.1 index c25df5fb5c05c8a11e40d63a9ee4da689c5d9535..6f581d4a34a8e42c6870a077379e933e0ed83a79 100644 --- a/doc/gmsh.1 +++ b/doc/gmsh.1 @@ -1,4 +1,4 @@ -.TH Gmsh 1 "5 March 2019" "4.2" "Gmsh Manual Pages" +.TH Gmsh 1 "19 April 2019" "4.3" "Gmsh Manual Pages" .UC 4 .\" ******************************************************************** .SH NAME diff --git a/doc/gmsh.html b/doc/gmsh.html index f7b6d810c7caab9cc925cc017efb75d9f8b05aad..0cada6281a385890317528cfe504365713d49f97 100644 --- a/doc/gmsh.html +++ b/doc/gmsh.html @@ -28,6 +28,7 @@ CAO, OpenGL, GL2PS, Gmesh"> <h1 class="short">Gmsh</h1> <div id="banner"> + <img src="http://gmsh.info/gallery/gmsh_logo.png" alt=""> <img src="http://gmsh.info/gallery/a319_4_small.png" alt=""> <img src="http://gmsh.info/gallery/Zylkopf3D_small.png" alt=""> <img src="http://gmsh.info/gallery/gmsh_quad2_small.png" alt=""> @@ -37,8 +38,8 @@ CAO, OpenGL, GL2PS, Gmesh"> <img src="http://gmsh.info/gallery/remesh.png" alt=""> </div> -<h1>A three-dimensional finite element mesh generator - with built-in pre- and post-processing facilities</h1> +<h1>A three-dimensional finite element mesh generator with built-in pre- and + post-processing facilities</h1> <h4>Christophe Geuzaine and Jean-François Remacle</h4> @@ -88,21 +89,21 @@ Public License (GPL)</a>: <ul> <li> <div class="highlight"> - Current stable release (version 4.2.2, 13 March 2019): + Current stable release (version 4.3.0, 19 April 2019): <ul> <li>Download Gmsh for - <a href="bin/Windows/gmsh-4.2.2-Windows64.zip">Windows 64-bit</a>, - <a href="bin/Windows/gmsh-4.2.2-Windows32.zip">Windows 32-bit</a>, - <a href="bin/Linux/gmsh-4.2.2-Linux64.tgz">Linux 64-bit</a>, - <a href="bin/Linux/gmsh-4.2.2-Linux32.tgz">Linux 32-bit</a> or - <a href="bin/MacOSX/gmsh-4.2.2-MacOSX.dmg">MacOS</a> - <li>Download the <a href="src/gmsh-4.2.2-source.tgz">source code</a> + <a href="bin/Windows/gmsh-4.3.0-Windows64.zip">Windows 64-bit</a>, + <a href="bin/Windows/gmsh-4.3.0-Windows32.zip">Windows 32-bit</a>, + <a href="bin/Linux/gmsh-4.3.0-Linux64.tgz">Linux 64-bit</a>, + <a href="bin/Linux/gmsh-4.3.0-Linux32.tgz">Linux 32-bit</a> or + <a href="bin/MacOSX/gmsh-4.3.0-MacOSX.dmg">MacOS</a> + <li>Download the <a href="src/gmsh-4.3.0-source.tgz">source code</a> <li>Download the Software Development Kit (SDK) for - <a href="bin/Windows/gmsh-4.2.2-Windows64-sdk.zip">Windows 64-bit</a>, - <a href="bin/Windows/gmsh-4.2.2-Windows32-sdk.zip">Windows 32-bit</a>, - <a href="bin/Linux/gmsh-4.2.2-Linux64-sdk.tgz">Linux 64-bit</a>, - <a href="bin/Linux/gmsh-4.2.2-Linux32-sdk.tgz">Linux 32-bit</a> or - <a href="bin/MacOSX/gmsh-4.2.2-MacOSX-sdk.tgz">MacOS</a> + <a href="bin/Windows/gmsh-4.3.0-Windows64-sdk.zip">Windows 64-bit</a>, + <a href="bin/Windows/gmsh-4.3.0-Windows32-sdk.zip">Windows 32-bit</a>, + <a href="bin/Linux/gmsh-4.3.0-Linux64-sdk.tgz">Linux 64-bit</a>, + <a href="bin/Linux/gmsh-4.3.0-Linux32-sdk.tgz">Linux 32-bit</a> or + <a href="bin/MacOSX/gmsh-4.3.0-MacOSX-sdk.tgz">MacOS</a> </ul> </div> <p> diff --git a/doc/texinfo/api.texi b/doc/texinfo/api.texi index 22086b8c757771f5b2fcf88a318a8c1657084245..583ced66f48110e98b29fb1ee924f5f32f9896a9 100644 --- a/doc/texinfo/api.texi +++ b/doc/texinfo/api.texi @@ -1,6 +1,25 @@ @c This file was generated by api/gen.py: do not edit manually! -@heading Module @code{/gmsh} +@menu +* Namespace gmsh:: +* Namespace gmsh/option:: +* Namespace gmsh/model:: +* Namespace gmsh/model/mesh:: +* Namespace gmsh/model/mesh/field:: +* Namespace gmsh/model/geo:: +* Namespace gmsh/model/geo/mesh:: +* Namespace gmsh/model/occ:: +* Namespace gmsh/view:: +* Namespace gmsh/plugin:: +* Namespace gmsh/graphics:: +* Namespace gmsh/fltk:: +* Namespace gmsh/onelab:: +* Namespace gmsh/logger:: +@end menu + +@node Namespace gmsh, Namespace gmsh/option, , Gmsh API +@section Namespace @code{gmsh}: top-level functions + @ftable @code @item initialize Initialize Gmsh. This must be called before any call to the other functions in @@ -32,7 +51,8 @@ Finalize Gmsh. This must be called when you are done using the Gmsh API. @item open Open a file. Equivalent to the @code{File->Open} menu in the Gmsh app. Handling -of the file depends on its extension and/or its contents. +of the file depends on its extension and/or its contents: opening a file with +model data will create a new model. @table @asis @item Input: @@ -45,7 +65,8 @@ of the file depends on its extension and/or its contents. @item merge Merge a file. Equivalent to the @code{File->Merge} menu in the Gmsh app. -Handling of the file depends on its extension and/or its contents. +Handling of the file depends on its extension and/or its contents. Merging a +file with model data will add the data to the current model. @table @asis @item Input: @@ -82,7 +103,9 @@ Clear all loaded models and post-processing data, and add a new empty model. @end ftable -@heading Module @code{/gmsh/option} +@node Namespace gmsh/option, Namespace gmsh/model, Namespace gmsh, Gmsh API +@section Namespace @code{gmsh/option}: option handling functions + @ftable @code @item setNumber Set a numerical option to @code{value}. @code{name} is of the form @@ -140,9 +163,42 @@ are listed in the Gmsh reference manual. - @end table +@item setColor +Set a color option to the RGBA value (@code{r}, @code{g}, @code{b}, @code{a}), +where where @code{r}, @code{g}, @code{b} and @code{a} should be integers between +0 and 255. @code{name} is of the form "category.option" or +"category[num].option". Available categories and options are listed in the Gmsh +reference manual, with the "Color." middle string removed. + +@table @asis +@item Input: +@code{name}, @code{r}, @code{g}, @code{b}, @code{a} +@item Output: +- +@item Return: +- +@end table + +@item getColor +Get the @code{r}, @code{g}, @code{b}, @code{a} value of a color option. +@code{name} is of the form "category.option" or "category[num].option". +Available categories and options are listed in the Gmsh reference manual, with +the "Color." middle string removed. + +@table @asis +@item Input: +@code{name} +@item Output: +@code{r}, @code{g}, @code{b}, @code{a} +@item Return: +- +@end table + @end ftable -@heading Module @code{/gmsh/model} +@node Namespace gmsh/model, Namespace gmsh/model/mesh, Namespace gmsh/option, Gmsh API +@section Namespace @code{gmsh/model}: model functions + @ftable @code @item add Add a new model, with name @code{name}, and set it as the current model. @@ -194,10 +250,9 @@ the same name, select the one that was added first. @end table @item getEntities -Get all the (elementary) geometrical entities in the current model. If -@code{dim} is >= 0, return only the entities of the specified dimension (e.g. -points if @code{dim} == 0). The entities are returned as a vector of (dim, tag) -integer pairs. +Get all the entities in the current model. If @code{dim} is >= 0, return only +the entities of the specified dimension (e.g. points if @code{dim} == 0). The +entities are returned as a vector of (dim, tag) integer pairs. @table @asis @item Input: @@ -247,8 +302,8 @@ only the entities of the specified dimension (e.g. physical points if @code{dim} @end table @item getEntitiesForPhysicalGroup -Get the tags of the geometrical entities making up the physical group of -dimension @code{dim} and tag @code{tag}. +Get the tags of the model entities making up the physical group of dimension +@code{dim} and tag @code{tag}. @table @asis @item Input: @@ -260,7 +315,7 @@ dimension @code{dim} and tag @code{tag}. @end table @item getPhysicalGroupsForEntity -Get the tags of the physical groups (if any) to which the geometrical entity of +Get the tags of the physical groups (if any) to which the model entity of dimension @code{dim} and tag @code{tag} belongs. @table @asis @@ -273,9 +328,9 @@ dimension @code{dim} and tag @code{tag} belongs. @end table @item addPhysicalGroup -Add a physical group of dimension @code{dim}, grouping the elementary entities -with tags @code{tags}. Return the tag of the physical group, equal to @code{tag} -if @code{tag} is positive, or a new tag if @code{tag} < 0. +Add a physical group of dimension @code{dim}, grouping the model entities with +tags @code{tags}. Return the tag of the physical group, equal to @code{tag} if +@code{tag} is positive, or a new tag if @code{tag} < 0. @table @asis @item Input: @@ -311,7 +366,7 @@ Get the name of the physical group of dimension @code{dim} and tag @code{tag}. @end table @item getBoundary -Get the boundary of the geometrical entities @code{dimTags}. Return in +Get the boundary of the model entities @code{dimTags}. Return in @code{outDimTags} the boundary of the individual entities (if @code{combined} is false) or the boundary of the combined geometrical shape formed by all input entities (if @code{combined} is true). Return tags multiplied by the sign of the @@ -328,8 +383,8 @@ recursively down to dimension 0 (i.e. to points) if @code{recursive} is true. @end table @item getEntitiesInBoundingBox -Get the (elementary) geometrical entities in the bounding box defined by the two -points (@code{xmin}, @code{ymin}, @code{zmin}) and (@code{xmax}, @code{ymax}, +Get the model entities in the bounding box defined by the two points +(@code{xmin}, @code{ymin}, @code{zmin}) and (@code{xmax}, @code{ymax}, @code{zmax}). If @code{dim} is >= 0, return only the entities of the specified dimension (e.g. points if @code{dim} == 0). @@ -344,8 +399,9 @@ dimension (e.g. points if @code{dim} == 0). @item getBoundingBox Get the bounding box (@code{xmin}, @code{ymin}, @code{zmin}), (@code{xmax}, -@code{ymax}, @code{zmax}) of the geometrical entity of dimension @code{dim} and -tag @code{tag}. +@code{ymax}, @code{zmax}) of the model entity of dimension @code{dim} and tag +@code{tag}. If @code{dim} and @code{tag} are negative, get the bounding box of +the whole model. @table @asis @item Input: @@ -369,12 +425,12 @@ integer value @end table @item addDiscreteEntity -Add a discrete geometrical entity (defined by a mesh) of dimension @code{dim} in -the current model. Return the tag of the new discrete entity, equal to -@code{tag} if @code{tag} is positive, or a new tag if @code{tag} < 0. -@code{boundary} specifies the tags of the entities on the boundary of the -discrete entity, if any. Specyfing @code{boundary} allows Gmsh to construct the -topology of the overall model. +Add a discrete model entity (defined by a mesh) of dimension @code{dim} in the +current model. Return the tag of the new discrete entity, equal to @code{tag} if +@code{tag} is positive, or a new tag if @code{tag} < 0. @code{boundary} +specifies the tags of the entities on the boundary of the discrete entity, if +any. Specifying @code{boundary} allows Gmsh to construct the topology of the +overall model. @table @asis @item Input: @@ -560,8 +616,8 @@ triplets of x, y, z components, concatenated: [n1x, n1y, n1z, n2x, ...]. @end table @item setVisibility -Set the visibility of the geometrical entities @code{dimTags} to @code{value}. -Apply the visibility setting recursively if @code{recursive} is true. +Set the visibility of the model entities @code{dimTags} to @code{value}. Apply +the visibility setting recursively if @code{recursive} is true. @table @asis @item Input: @@ -573,7 +629,7 @@ Apply the visibility setting recursively if @code{recursive} is true. @end table @item getVisibility -Get the visibility of the geometrical entity of dimension @code{dim} and tag +Get the visibility of the model entity of dimension @code{dim} and tag @code{tag}. @table @asis @@ -586,10 +642,10 @@ Get the visibility of the geometrical entity of dimension @code{dim} and tag @end table @item setColor -Set the color of the geometrical entities @code{dimTags} to the RGBA value -(@code{r}, @code{g}, @code{b}, @code{a}), where @code{r}, @code{g}, @code{b} and -@code{a} should be integers between 0 and 255. Apply the color setting -recursively if @code{recursive} is true. +Set the color of the model entities @code{dimTags} to the RGBA value (@code{r}, +@code{g}, @code{b}, @code{a}), where @code{r}, @code{g}, @code{b} and @code{a} +should be integers between 0 and 255. Apply the color setting recursively if +@code{recursive} is true. @table @asis @item Input: @@ -601,8 +657,7 @@ recursively if @code{recursive} is true. @end table @item getColor -Get the color of the geometrical entity of dimension @code{dim} and tag -@code{tag}. +Get the color of the model entity of dimension @code{dim} and tag @code{tag}. @table @asis @item Input: @@ -613,9 +668,23 @@ Get the color of the geometrical entity of dimension @code{dim} and tag - @end table +@item setCoordinates +Set the @code{x}, @code{y}, @code{z} coordinates of a geometrical point. + +@table @asis +@item Input: +@code{tag}, @code{x}, @code{y}, @code{z} +@item Output: +- +@item Return: +- +@end table + @end ftable -@heading Module @code{/gmsh/model/mesh} +@node Namespace gmsh/model/mesh, Namespace gmsh/model/mesh/field, Namespace gmsh/model, Gmsh API +@section Namespace @code{gmsh/model/mesh}: mesh functions + @ftable @code @item generate Generate a mesh of the current model, up to dimension @code{dim} (0, 1, 2 or 3). @@ -653,6 +722,33 @@ Unpartition the mesh of the current model. - @end table +@item optimize +Optimize the mesh of the current model using @code{method} (empty for default +tetrahedral mesh optimizer, "Netgen" for Netgen optimizer, "HighOrder" for +direct high-order mesh optimizer, "HighOrderElastic" for high-order elastic +smoother). + +@table @asis +@item Input: +@code{method} +@item Output: +- +@item Return: +- +@end table + +@item recombine +Recombine the mesh of the current model. + +@table @asis +@item Input: +- +@item Output: +- +@item Return: +- +@end table + @item refine Refine the mesh of the current model by uniformly splitting the elements. @@ -665,6 +761,18 @@ Refine the mesh of the current model by uniformly splitting the elements. - @end table +@item smooth +Smooth the mesh of the current model. + +@table @asis +@item Input: +- +@item Output: +- +@item Return: +- +@end table + @item setOrder Set the order of the elements in the mesh of the current model to @code{order}. @@ -710,17 +818,17 @@ Get the nodes classified on the entity of dimension @code{dim} and tag mesh. @code{nodeTags} contains the node tags (their unique, strictly positive identification numbers). @code{coord} is a vector of length 3 times the length of @code{nodeTags} that contains the x, y, z coordinates of the nodes, -concatenated: [n1x, n1y, n1z, n2x, ...]. If @code{dim} >= 0, -@code{parametricCoord} contains the parametric coordinates ([u1, u2, ...] or -[u1, v1, u2, ...]) of the nodes, if available. The length of -@code{parametricCoord} can be 0 or @code{dim} times the length of -@code{nodeTags}. If @code{includeBoundary} is set, also return the nodes -classified on the boundary of the entity (wich will be reparametrized on the -entity if @code{dim} >= 0 in order to compute their parametric coordinates). +concatenated: [n1x, n1y, n1z, n2x, ...]. If @code{dim} >= 0 and +@code{returnParamtricCoord} is set, @code{parametricCoord} contains the +parametric coordinates ([u1, u2, ...] or [u1, v1, u2, ...]) of the nodes, if +available. The length of @code{parametricCoord} can be 0 or @code{dim} times the +length of @code{nodeTags}. If @code{includeBoundary} is set, also return the +nodes classified on the boundary of the entity (which will be reparametrized on +the entity if @code{dim} >= 0 in order to compute their parametric coordinates). @table @asis @item Input: -@code{dim}, @code{tag}, @code{includeBoundary} +@code{dim}, @code{tag}, @code{includeBoundary}, @code{returnParametricCoord} @item Output: @code{nodeTags}, @code{coord}, @code{parametricCoord} @item Return: @@ -732,7 +840,7 @@ Get the coordinates and the parametric coordinates (if any) of the node with tag @code{tag}. This is a sometimes useful but inefficient way of accessing nodes, as it relies on a cache stored in the model. For large meshes all the nodes in the model should be numbered in a continuous sequence of tags from 1 to N to -maintain reasonnable performance (in this case the internal cache is based on a +maintain reasonable performance (in this case the internal cache is based on a vector; otherwise it uses a map). @table @asis @@ -773,8 +881,8 @@ n2x, ...]. @end table @item setNodes -Set the nodes classified on the geometrical entity of dimension @code{dim} and -tag @code{tag}. @code{nodeTags} contains the node tags (their unique, strictly +Set the nodes classified on the model entity of dimension @code{dim} and tag +@code{tag}. @code{nodeTags} contains the node tags (their unique, strictly positive identification numbers). @code{coord} is a vector of length 3 times the length of @code{nodeTags} that contains the x, y, z coordinates of the nodes, concatenated: [n1x, n1y, n1z, n2x, ...]. The optional @code{parametricCoord} @@ -793,10 +901,10 @@ automatically assigned to the nodes. @end table @item reclassifyNodes -Reclassify all nodes on their associated geometrical entity, based on the -elements. Can be used when importing nodes in bulk (e.g. by associating them all -to a single volume), to reclassify them correctly on model surfaces, curves, -etc. after the elements have been set. +Reclassify all nodes on their associated model entity, based on the elements. +Can be used when importing nodes in bulk (e.g. by associating them all to a +single volume), to reclassify them correctly on model surfaces, curves, etc. +after the elements have been set. @table @asis @item Input: @@ -850,7 +958,7 @@ that contains the node tags of all the elements of the given type, concatenated: Get the type and node tags of the element with tag @code{tag}. This is a sometimes useful but inefficient way of accessing elements, as it relies on a cache stored in the model. For large meshes all the elements in the model should -be numbered in a continuous sequence of tags from 1 to N to maintain reasonnable +be numbered in a continuous sequence of tags from 1 to N to maintain reasonable performance (in this case the internal cache is based on a vector; otherwise it uses a map). @@ -864,15 +972,19 @@ uses a map). @end table @item getElementByCoordinates -Get the tag, type and node tags of the element located at coordinates (@code{x}, -@code{y}, @code{z}). This is a sometimes useful but inefficient way of accessing -elements, as it relies on a search in a spatial octree. +Search the mesh for an element located at coordinates (@code{x}, @code{y}, +@code{z}). This is a sometimes useful but inefficient way of accessing elements, +as it relies on a search in a spatial octree. If an element is found, return its +tag, type and node tags, as well as the local coordinates (@code{u}, @code{v}, +@code{w}) within the element corresponding to search location. If @code{dim} is +>= 0, only search for elements of the given dimension. If @code{strict} is not +set, use a tolerance to find elements near the search location. @table @asis @item Input: -@code{x}, @code{y}, @code{z} +@code{x}, @code{y}, @code{z}, @code{dim}, @code{strict} @item Output: -@code{elementTag}, @code{elementType}, @code{nodeTags} +@code{elementTag}, @code{elementType}, @code{nodeTags}, @code{u}, @code{v}, @code{w} @item Return: - @end table @@ -923,7 +1035,7 @@ vector, of length @code{dim} times @code{numNodes}). @end table @item getElementsByType -Get the elements of type @code{elementType} classified on the entity of of tag +Get the elements of type @code{elementType} classified on the entity of tag @code{tag}. If @code{tag} < 0, get the elements for all entities. @code{elementTags} is a vector containing the tags (unique, strictly positive identifiers) of the elements of the corresponding type. @code{nodeTags} is a @@ -943,8 +1055,8 @@ indexed by @code{task}. @end table @item preallocateElementsByType -Preallocate the data for @code{getElementsByType}. This is necessary only if -@code{getElementsByType} is called with @code{numTasks} > 1. +Preallocate data before calling @code{getElementsByType} with @code{numTasks} > +1. For C and C++ only. @table @asis @item Input: @@ -993,13 +1105,30 @@ automatically assigned to the elements. - @end table +@item getIntegrationPoints +Get the numerical quadrature information for the given element type +@code{elementType} and integration rule @code{integrationType} (e.g. "Gauss4" +for a Gauss quadrature suited for integrating 4th order polynomials). +@code{integrationPoints} contains the u, v, w coordinates of the G integration +points in the reference element: [g1u, g1v, g1w, ..., gGu, gGv, gGw]. +@code{integrationWeigths} contains the associated weights: [g1q, ..., gGq]. + +@table @asis +@item Input: +@code{elementType}, @code{integrationType} +@item Output: +@code{integrationPoints}, @code{integrationWeights} +@item Return: +- +@end table + @item getJacobians Get the Jacobians of all the elements of type @code{elementType} classified on -the entity of dimension @code{dim} and tag @code{tag}, at the G integration -points required by the @code{integrationType} integration rule (e.g. "Gauss4" -for a Gauss quadrature suited for integrating 4th order polynomials). Data is -returned by element, with elements in the same order as in @code{getElements} -and @code{getElementsByType}. @code{jacobians} contains for each element the 9 +the entity of tag @code{tag}, at the G integration points +@code{integrationPoints} given as concatenated triplets of coordinates in the +reference element [g1u, g1v, g1w, ..., gGu, gGv, gGw]. Data is returned by +element, with elements in the same order as in @code{getElements} and +@code{getElementsByType}. @code{jacobians} contains for each element the 9 entries of the 3x3 Jacobian matrix at each integration point, by row: [e1g1Jxu, e1g1Jxv, e1g1Jxw, e1g1Jyu, ..., e1g1Jzw, e1g2Jxu, ..., e1gGJzw, e2g1Jxu, ...], with Jxu=dx/du, Jxv=dx/dv, etc. @code{determinants} contains for each element @@ -1011,7 +1140,7 @@ the data indexed by @code{task}. @table @asis @item Input: -@code{elementType}, @code{integrationType}, @code{tag}, @code{task}, @code{numTasks} +@code{elementType}, @code{integrationPoints}, @code{tag}, @code{task}, @code{numTasks} @item Output: @code{jacobians}, @code{determinants}, @code{points} @item Return: @@ -1019,12 +1148,12 @@ the data indexed by @code{task}. @end table @item preallocateJacobians -Preallocate the data required by @code{getJacobians}. This is necessary only if -@code{getJacobians} is called with @code{numTasks} > 1. +Preallocate data before calling @code{getJacobians} with @code{numTasks} > 1. +For C and C++ only. @table @asis @item Input: -@code{elementType}, @code{integrationType}, @code{jacobian}, @code{determinant}, @code{point}, @code{tag} +@code{elementType}, @code{numIntegrationPoints}, @code{jacobian}, @code{determinant}, @code{point}, @code{tag} @item Output: @code{jacobians}, @code{determinants}, @code{points} @item Return: @@ -1032,23 +1161,75 @@ Preallocate the data required by @code{getJacobians}. This is necessary only if @end table @item getBasisFunctions -Get the basis functions of the element of type @code{elementType} for the given -@code{integrationType} integration rule (e.g. "Gauss4" for a Gauss quadrature -suited for integrating 4th order polynomials) and @code{functionSpaceType} -function space (e.g. "Lagrange" or "GradLagrange" for Lagrange basis functions -or their gradient, in the u, v, w coordinates of the reference element). -@code{integrationPoints} contains the u, v, w coordinates of the integration -points in the reference element as well as the associated weight q, -concatenated: [g1u, g1v, g1w, g1q, g2u, ...]. @code{numComponents} returns the -number C of components of a basis function. @code{basisFunctions} contains the -evaluation of the basis functions at the integration points: [g1f1, ..., g1fC, -g2f1, ...]. +Get the basis functions of the element of type @code{elementType} at the +integration points @code{integrationPoints} (given as concatenated triplets of +coordinates in the reference element [g1u, g1v, g1w, ..., gGu, gGv, gGw]), for +the function space @code{functionSpaceType} (e.g. "Lagrange" or "GradLagrange" +for Lagrange basis functions or their gradient, in the u, v, w coordinates of +the reference element). @code{numComponents} returns the number C of components +of a basis function. @code{basisFunctions} returns the value of the N basis +functions at the integration points, i.e. [g1f1, g1f2, ..., g1fN, g2f1, ...] +when C == 1 or [g1f1u, g1f1v, g1f1w, g1f2u, ..., g1fNw, g2f1u, ...] when C == 3. + +@table @asis +@item Input: +@code{elementType}, @code{integrationPoints}, @code{functionSpaceType} +@item Output: +@code{numComponents}, @code{basisFunctions} +@item Return: +- +@end table + +@item getBasisFunctionsForElements +Get the element-dependent basis functions of the elements of type +@code{elementType} in the entity of tag @code{tag}at the integration points +@code{integrationPoints} (given as concatenated triplets of coordinates in the +reference element [g1u, g1v, g1w, ..., gGu, gGv, gGw]), for the function space +@code{functionSpaceType} (e.g. "H1Legendre3" or "GradH1Legendre3" for 3rd order +hierarchical H1 Legendre functions or their gradient, in the u, v, w coordinates +of the reference elements). @code{numComponents} returns the number C of +components of a basis function. @code{numBasisFunctions} returns the number N of +basis functions per element. @code{basisFunctions} returns the value of the +basis functions at the integration points for each element: [e1g1f1,..., e1g1fN, +e1g2f1,..., e2g1f1, ...] when C == 1 or [e1g1f1u, e1g1f1v,..., e1g1fNw, +e1g2f1u,..., e2g1f1u, ...]. Warning: this is an experimental feature and will +probably change in a future release. + +@table @asis +@item Input: +@code{elementType}, @code{integrationPoints}, @code{functionSpaceType}, @code{tag} +@item Output: +@code{numComponents}, @code{numFunctionsPerElements}, @code{basisFunctions} +@item Return: +- +@end table + +@item getKeysForElements +Generate the @code{keys} for the elements of type @code{elementType} in the +entity of tag @code{tag}, for the @code{functionSpaceType} function space. Each +key uniquely identifies a basis function in the function space. If +@code{returnCoord} is set, the @code{coord} vector contains the x, y, z +coordinates locating basis functions for sorting purposes. Warning: this is an +experimental feature and will probably change in a future release. + +@table @asis +@item Input: +@code{elementType}, @code{functionSpaceType}, @code{tag}, @code{returnCoord} +@item Output: +@code{keys}, @code{coord} +@item Return: +- +@end table + +@item getInformationForElements +Get information about the @code{keys}. Warning: this is an experimental feature +and will probably change in a future release. @table @asis @item Input: -@code{elementType}, @code{integrationType}, @code{functionSpaceType} +@code{keys}, @code{order}, @code{elementType} @item Output: -@code{integrationPoints}, @code{numComponents}, @code{basisFunctions} +@code{info} @item Return: - @end table @@ -1084,8 +1265,8 @@ the part of the data indexed by @code{task}. @end table @item preallocateBarycenters -Preallocate the data required by @code{getBarycenters}. This is necessary only -if @code{getBarycenters} is called with @code{numTasks} > 1. +Preallocate data before calling @code{getBarycenters} with @code{numTasks} > 1. +For C and C++ only. @table @asis @item Input: @@ -1098,11 +1279,13 @@ if @code{getBarycenters} is called with @code{numTasks} > 1. @item getElementEdgeNodes Get the nodes on the edges of all elements of type @code{elementType} classified -on the entity of tag @code{tag}. @code{nodeTags} contains the node tags. If -@code{primary} is set, only the primary (begin/end) nodes of the edges are -returned. If @code{tag} < 0, get the edge nodes for all entities. If -@code{numTasks} > 1, only compute and return the part of the data indexed by -@code{task}. +on the entity of tag @code{tag}. @code{nodeTags} contains the node tags of the +edges for all the elements: [e1a1n1, e1a1n2, e1a2n1, ...]. Data is returned by +element, with elements in the same order as in @code{getElements} and +@code{getElementsByType}. If @code{primary} is set, only the primary (begin/end) +nodes of the edges are returned. If @code{tag} < 0, get the edge nodes for all +entities. If @code{numTasks} > 1, only compute and return the part of the data +indexed by @code{task}. @table @asis @item Input: @@ -1116,11 +1299,13 @@ returned. If @code{tag} < 0, get the edge nodes for all entities. If @item getElementFaceNodes Get the nodes on the faces of type @code{faceType} (3 for triangular faces, 4 for quadrangular faces) of all elements of type @code{elementType} classified on -the entity of tag @code{tag}. @code{nodeTags} contains the node tags. If -@code{primary} is set, only the primary (corner) nodes of the faces are -returned. If @code{tag} < 0, get the face nodes for all entities. If -@code{numTasks} > 1, only compute and return the part of the data indexed by -@code{task}. +the entity of tag @code{tag}. @code{nodeTags} contains the node tags of the +faces for all elements: [e1f1n1, ..., e1f1nFaceType, e1f2n1, ...]. Data is +returned by element, with elements in the same order as in @code{getElements} +and @code{getElementsByType}. If @code{primary} is set, only the primary +(corner) nodes of the faces are returned. If @code{tag} < 0, get the face nodes +for all entities. If @code{numTasks} > 1, only compute and return the part of +the data indexed by @code{task}. @table @asis @item Input: @@ -1145,8 +1330,8 @@ stored in the ghost entity of dimension @code{dim} and tag @code{tag}. @end table @item setSize -Set a mesh size constraint on the geometrical entities @code{dimTags}. Currently -only entities of dimension 0 (points) are handled. +Set a mesh size constraint on the model entities @code{dimTags}. Currently only +entities of dimension 0 (points) are handled. @table @asis @item Input: @@ -1205,7 +1390,7 @@ interpolation explicitly. @end table @item setRecombine -Set a recombination meshing constraint on the geometrical entity of dimension +Set a recombination meshing constraint on the model entity of dimension @code{dim} and tag @code{tag}. Currently only entities of dimension 2 (to recombine triangles into quadrangles) are supported. @@ -1219,9 +1404,8 @@ recombine triangles into quadrangles) are supported. @end table @item setSmoothing -Set a smoothing meshing constraint on the geometrical entity of dimension -@code{dim} and tag @code{tag}. @code{val} iterations of a Laplace smoother are -applied. +Set a smoothing meshing constraint on the model entity of dimension @code{dim} +and tag @code{tag}. @code{val} iterations of a Laplace smoother are applied. @table @asis @item Input: @@ -1233,11 +1417,11 @@ applied. @end table @item setReverse -Set a reverse meshing constraint on the geometrical entity of dimension -@code{dim} and tag @code{tag}. If @code{val} is true, the mesh orientation will -be reversed with respect to the natural mesh orientation (i.e. the orientation -consistent with the orientation of the geometrical entity). If @code{val} is -false, the mesh is left as-is. +Set a reverse meshing constraint on the model entity of dimension @code{dim} and +tag @code{tag}. If @code{val} is true, the mesh orientation will be reversed +with respect to the natural mesh orientation (i.e. the orientation consistent +with the orientation of the geometry). If @code{val} is false, the mesh is left +as-is. @table @asis @item Input: @@ -1263,9 +1447,9 @@ available with the OpenCASCADE kernel, as it relies on the STL triangulation. @end table @item embed -Embed the geometrical entities of dimension @code{dim} and tags @code{tags} in -the (inDim, inTag) geometrical entity. @code{inDim} must be strictly greater -than @code{dim}. +Embed the model entities of dimension @code{dim} and tags @code{tags} in the +(inDim, inTag) model entity. @code{inDim} must be strictly greater than +@code{dim}. @table @asis @item Input: @@ -1277,9 +1461,9 @@ than @code{dim}. @end table @item removeEmbedded -Remove embedded entities in the geometrical entities @code{dimTags}. if -@code{dim} is >= 0, only remove embedded entities of the given dimension (e.g. -embedded points if @code{dim} == 0). +Remove embedded entities in the model entities @code{dimTags}. if @code{dim} is +>= 0, only remove embedded entities of the given dimension (e.g. embedded points +if @code{dim} == 0). @table @asis @item Input: @@ -1468,11 +1652,13 @@ stored as physical groups in the mesh. @end ftable -@heading Module @code{/gmsh/model/mesh/field} +@node Namespace gmsh/model/mesh/field, Namespace gmsh/model/geo, Namespace gmsh/model/mesh, Gmsh API +@section Namespace @code{gmsh/model/mesh/field}: mesh size field functions + @ftable @code @item add Add a new mesh size field of type @code{fieldType}. If @code{tag} is positive, -assign the tag explcitly; otherwise a new tag is assigned automatically. Return +assign the tag explicitly; otherwise a new tag is assigned automatically. Return the field tag. @table @asis @@ -1560,10 +1746,12 @@ Set the field @code{tag} as a boundary layer size field. @end ftable -@heading Module @code{/gmsh/model/geo} +@node Namespace gmsh/model/geo, Namespace gmsh/model/geo/mesh, Namespace gmsh/model/mesh/field, Gmsh API +@section Namespace @code{gmsh/model/geo}: built-in CAD kernel functions + @ftable @code @item addPoint -Add a geometrical point in the internal GEO CAD representation, at coordinates +Add a geometrical point in the built-in CAD representation, at coordinates (@code{x}, @code{y}, @code{z}). If @code{meshSize} is > 0, add a meshing constraint at that point. If @code{tag} is positive, set the tag explicitly; otherwise a new tag is selected automatically. Return the tag of the point. @@ -1595,10 +1783,10 @@ integer value @end table @item addCircleArc -Add a circle arc (stricly smaller than Pi) between the two points with tags +Add a circle arc (strictly smaller than Pi) between the two points with tags @code{startTag} and @code{endTag}, with center @code{centertag}. If @code{tag} is positive, set the tag explicitly; otherwise a new tag is selected -automatically. If (@code{nx}, @code{ny}, @code{nz}) != (0,0,0), explicitely set +automatically. If (@code{nx}, @code{ny}, @code{nz}) != (0,0,0), explicitly set the plane of the circle arc. Return the tag of the circle arc. @table @asis @@ -1611,11 +1799,11 @@ integer value @end table @item addEllipseArc -Add an ellipse arc (stricly smaller than Pi) between the two points +Add an ellipse arc (strictly smaller than Pi) between the two points @code{startTag} and @code{endTag}, with center @code{centertag} and major axis point @code{majorTag}. If @code{tag} is positive, set the tag explicitly; otherwise a new tag is selected automatically. If (@code{nx}, @code{ny}, -@code{nz}) != (0,0,0), explicitely set the plane of the circle arc. Return the +@code{nz}) != (0,0,0), explicitly set the plane of the circle arc. Return the tag of the ellipse arc. @table @asis @@ -1673,8 +1861,8 @@ integer value @item addCurveLoop Add a curve loop (a closed wire) formed by the curves @code{curveTags}. -@code{curveTags} should contain (signed) tags of geometrical enties of dimension -1 forming a closed loop: a negative tag signifies that the underlying curve is +@code{curveTags} should contain (signed) tags of model enties of dimension 1 +forming a closed loop: a negative tag signifies that the underlying curve is considered with reversed orientation. If @code{tag} is positive, set the tag explicitly; otherwise a new tag is selected automatically. Return the tag of the curve loop. @@ -1748,12 +1936,13 @@ integer value @end table @item extrude -Extrude the geometrical entities @code{dimTags} by translation along (@code{dx}, +Extrude the model entities @code{dimTags} by translation along (@code{dx}, @code{dy}, @code{dz}). Return extruded entities in @code{outDimTags}. If @code{numElements} is not empty, also extrude the mesh: the entries in @code{numElements} give the number of elements in each layer. If @code{height} -is not empty, it provides the (cummulative) height of the different layers, -normalized to 1. +is not empty, it provides the (cumulative) height of the different layers, +normalized to 1. If @code{dx} == @code{dy} == @code{dz} == 0, the entities are +extruded along their normal. @table @asis @item Input: @@ -1765,13 +1954,13 @@ normalized to 1. @end table @item revolve -Extrude the geometrical entities @code{dimTags} by rotation of @code{angle} -radians around the axis of revolution defined by the point (@code{x}, @code{y}, +Extrude the model entities @code{dimTags} by rotation of @code{angle} radians +around the axis of revolution defined by the point (@code{x}, @code{y}, @code{z}) and the direction (@code{ax}, @code{ay}, @code{az}). Return extruded entities in @code{outDimTags}. If @code{numElements} is not empty, also extrude the mesh: the entries in @code{numElements} give the number of elements in each -layer. If @code{height} is not empty, it provides the (cummulative) height of -the different layers, normalized to 1. +layer. If @code{height} is not empty, it provides the (cumulative) height of the +different layers, normalized to 1. @table @asis @item Input: @@ -1783,14 +1972,14 @@ the different layers, normalized to 1. @end table @item twist -Extrude the geometrical entities @code{dimTags} by a combined translation and -rotation of @code{angle} radians, along (@code{dx}, @code{dy}, @code{dz}) and -around the axis of revolution defined by the point (@code{x}, @code{y}, -@code{z}) and the direction (@code{ax}, @code{ay}, @code{az}). Return extruded -entities in @code{outDimTags}. If @code{numElements} is not empty, also extrude -the mesh: the entries in @code{numElements} give the number of elements in each -layer. If @code{height} is not empty, it provides the (cummulative) height of -the different layers, normalized to 1. +Extrude the model entities @code{dimTags} by a combined translation and rotation +of @code{angle} radians, along (@code{dx}, @code{dy}, @code{dz}) and around the +axis of revolution defined by the point (@code{x}, @code{y}, @code{z}) and the +direction (@code{ax}, @code{ay}, @code{az}). Return extruded entities in +@code{outDimTags}. If @code{numElements} is not empty, also extrude the mesh: +the entries in @code{numElements} give the number of elements in each layer. If +@code{height} is not empty, it provides the (cumulative) height of the different +layers, normalized to 1. @table @asis @item Input: @@ -1802,7 +1991,7 @@ the different layers, normalized to 1. @end table @item translate -Translate the geometrical entities @code{dimTags} along (@code{dx}, @code{dy}, +Translate the model entities @code{dimTags} along (@code{dx}, @code{dy}, @code{dz}). @table @asis @@ -1815,9 +2004,9 @@ Translate the geometrical entities @code{dimTags} along (@code{dx}, @code{dy}, @end table @item rotate -Rotate the geometrical entities @code{dimTags} of @code{angle} radians around -the axis of revolution defined by the point (@code{x}, @code{y}, @code{z}) and -the direction (@code{ax}, @code{ay}, @code{az}). +Rotate the model entities @code{dimTags} of @code{angle} radians around the axis +of revolution defined by the point (@code{x}, @code{y}, @code{z}) and the +direction (@code{ax}, @code{ay}, @code{az}). @table @asis @item Input: @@ -1829,7 +2018,7 @@ the direction (@code{ax}, @code{ay}, @code{az}). @end table @item dilate -Scale the geometrical entities @code{dimTag} by factors @code{a}, @code{b} and +Scale the model entities @code{dimTag} by factors @code{a}, @code{b} and @code{c} along the three coordinate axes; use (@code{x}, @code{y}, @code{z}) as the center of the homothetic transformation. @@ -1843,7 +2032,7 @@ the center of the homothetic transformation. @end table @item symmetrize -Apply a symmetry transformation to the geometrical entities @code{dimTag}, with +Apply a symmetry transformation to the model entities @code{dimTag}, with respect to the plane of equation @code{a} * x + @code{b} * y + @code{c} * z + @code{d} = 0. @@ -1896,8 +2085,8 @@ location). @end table @item synchronize -Synchronize the internal GEO CAD representation with the current Gmsh model. -This can be called at any time, but since it involves a non trivial amount of +Synchronize the built-in CAD representation with the current Gmsh model. This +can be called at any time, but since it involves a non trivial amount of processing, the number of synchronization points should normally be minimized. @table @asis @@ -1911,11 +2100,13 @@ processing, the number of synchronization points should normally be minimized. @end ftable -@heading Module @code{/gmsh/model/geo/mesh} +@node Namespace gmsh/model/geo/mesh, Namespace gmsh/model/occ, Namespace gmsh/model/geo, Gmsh API +@section Namespace @code{gmsh/model/geo/mesh}: built-in CAD kernel meshing constraints + @ftable @code @item setSize -Set a mesh size constraint on the geometrical entities @code{dimTags}. Currently -only entities of dimension 0 (points) are handled. +Set a mesh size constraint on the model entities @code{dimTags}. Currently only +entities of dimension 0 (points) are handled. @table @asis @item Input: @@ -1930,7 +2121,7 @@ only entities of dimension 0 (points) are handled. Set a transfinite meshing constraint on the curve @code{tag}, with @code{numNodes} nodes distributed according to @code{meshType} and @code{coef}. Currently supported types are "Progression" (geometrical progression with power -@code{coef}) and "Bump" (refinement toward both extreminties of the curve). +@code{coef}) and "Bump" (refinement toward both extremities of the curve). @table @asis @item Input: @@ -1974,7 +2165,7 @@ interpolation explicitly. @end table @item setRecombine -Set a recombination meshing constraint on the geometrical entity of dimension +Set a recombination meshing constraint on the model entity of dimension @code{dim} and tag @code{tag}. Currently only entities of dimension 2 (to recombine triangles into quadrangles) are supported. @@ -1988,9 +2179,8 @@ recombine triangles into quadrangles) are supported. @end table @item setSmoothing -Set a smoothing meshing constraint on the geometrical entity of dimension -@code{dim} and tag @code{tag}. @code{val} iterations of a Laplace smoother are -applied. +Set a smoothing meshing constraint on the model entity of dimension @code{dim} +and tag @code{tag}. @code{val} iterations of a Laplace smoother are applied. @table @asis @item Input: @@ -2002,11 +2192,11 @@ applied. @end table @item setReverse -Set a reverse meshing constraint on the geometrical entity of dimension -@code{dim} and tag @code{tag}. If @code{val} is true, the mesh orientation will -be reversed with respect to the natural mesh orientation (i.e. the orientation -consistent with the orientation of the geometrical entity). If @code{val} is -false, the mesh is left as-is. +Set a reverse meshing constraint on the model entity of dimension @code{dim} and +tag @code{tag}. If @code{val} is true, the mesh orientation will be reversed +with respect to the natural mesh orientation (i.e. the orientation consistent +with the orientation of the geometry). If @code{val} is false, the mesh is left +as-is. @table @asis @item Input: @@ -2019,14 +2209,16 @@ false, the mesh is left as-is. @end ftable -@heading Module @code{/gmsh/model/occ} +@node Namespace gmsh/model/occ, Namespace gmsh/view, Namespace gmsh/model/geo/mesh, Gmsh API +@section Namespace @code{gmsh/model/occ}: OpenCASCADE CAD kernel functions + @ftable @code @item addPoint -Add a geometrical point in the internal OpenCASCADE CAD representation, at -coordinates (@code{x}, @code{y}, @code{z}). If @code{meshSize} is > 0, add a -meshing constraint at that point. If @code{tag} is positive, set the tag -explicitly; otherwise a new tag is selected automatically. Return the tag of the -point. (Note that the point will be added in the current model only after +Add a geometrical point in the OpenCASCADE CAD representation, at coordinates +(@code{x}, @code{y}, @code{z}). If @code{meshSize} is > 0, add a meshing +constraint at that point. If @code{tag} is positive, set the tag explicitly; +otherwise a new tag is selected automatically. Return the tag of the point. +(Note that the point will be added in the current model only after @code{synchronize} is called. This behavior holds for all the entities added in the occ module.) @@ -2413,11 +2605,11 @@ otherwise a new tag is selected automatically. @end table @item extrude -Extrude the geometrical entities @code{dimTags} by translation along (@code{dx}, +Extrude the model entities @code{dimTags} by translation along (@code{dx}, @code{dy}, @code{dz}). Return extruded entities in @code{outDimTags}. If @code{numElements} is not empty, also extrude the mesh: the entries in @code{numElements} give the number of elements in each layer. If @code{height} -is not empty, it provides the (cummulative) height of the different layers, +is not empty, it provides the (cumulative) height of the different layers, normalized to 1. @table @asis @@ -2430,13 +2622,13 @@ normalized to 1. @end table @item revolve -Extrude the geometrical entities @code{dimTags} by rotation of @code{angle} -radians around the axis of revolution defined by the point (@code{x}, @code{y}, +Extrude the model entities @code{dimTags} by rotation of @code{angle} radians +around the axis of revolution defined by the point (@code{x}, @code{y}, @code{z}) and the direction (@code{ax}, @code{ay}, @code{az}). Return extruded entities in @code{outDimTags}. If @code{numElements} is not empty, also extrude the mesh: the entries in @code{numElements} give the number of elements in each -layer. If @code{height} is not empty, it provides the (cummulative) height of -the different layers, normalized to 1. +layer. If @code{height} is not empty, it provides the (cumulative) height of the +different layers, normalized to 1. @table @asis @item Input: @@ -2499,7 +2691,7 @@ original volume if @code{removeVolume} is set. @item fuse Compute the boolean union (the fusion) of the entities @code{objectDimTags} and @code{toolDimTags}. Return the resulting entities in @code{outDimTags}. If -@code{tag} is positive, try to set the tag explicitly (ony valid if the boolean +@code{tag} is positive, try to set the tag explicitly (only valid if the boolean operation results in a single entity). Remove the object if @code{removeObject} is set. Remove the tool if @code{removeTool} is set. @@ -2515,9 +2707,10 @@ is set. Remove the tool if @code{removeTool} is set. @item intersect Compute the boolean intersection (the common parts) of the entities @code{objectDimTags} and @code{toolDimTags}. Return the resulting entities in -@code{outDimTags}. If @code{tag} is positive, try to set the tag explicitly (ony -valid if the boolean operation results in a single entity). Remove the object if -@code{removeObject} is set. Remove the tool if @code{removeTool} is set. +@code{outDimTags}. If @code{tag} is positive, try to set the tag explicitly +(only valid if the boolean operation results in a single entity). Remove the +object if @code{removeObject} is set. Remove the tool if @code{removeTool} is +set. @table @asis @item Input: @@ -2531,7 +2724,7 @@ valid if the boolean operation results in a single entity). Remove the object if @item cut Compute the boolean difference between the entities @code{objectDimTags} and @code{toolDimTags}. Return the resulting entities in @code{outDimTags}. If -@code{tag} is positive, try to set the tag explicitly (ony valid if the boolean +@code{tag} is positive, try to set the tag explicitly (only valid if the boolean operation results in a single entity). Remove the object if @code{removeObject} is set. Remove the tool if @code{removeTool} is set. @@ -2547,9 +2740,10 @@ is set. Remove the tool if @code{removeTool} is set. @item fragment Compute the boolean fragments (general fuse) of the entities @code{objectDimTags} and @code{toolDimTags}. Return the resulting entities in -@code{outDimTags}. If @code{tag} is positive, try to set the tag explicitly (ony -valid if the boolean operation results in a single entity). Remove the object if -@code{removeObject} is set. Remove the tool if @code{removeTool} is set. +@code{outDimTags}. If @code{tag} is positive, try to set the tag explicitly +(only valid if the boolean operation results in a single entity). Remove the +object if @code{removeObject} is set. Remove the tool if @code{removeTool} is +set. @table @asis @item Input: @@ -2561,7 +2755,7 @@ valid if the boolean operation results in a single entity). Remove the object if @end table @item translate -Translate the geometrical entities @code{dimTags} along (@code{dx}, @code{dy}, +Translate the model entities @code{dimTags} along (@code{dx}, @code{dy}, @code{dz}). @table @asis @@ -2574,9 +2768,9 @@ Translate the geometrical entities @code{dimTags} along (@code{dx}, @code{dy}, @end table @item rotate -Rotate the geometrical entities @code{dimTags} of @code{angle} radians around -the axis of revolution defined by the point (@code{x}, @code{y}, @code{z}) and -the direction (@code{ax}, @code{ay}, @code{az}). +Rotate the model entities @code{dimTags} of @code{angle} radians around the axis +of revolution defined by the point (@code{x}, @code{y}, @code{z}) and the +direction (@code{ax}, @code{ay}, @code{az}). @table @asis @item Input: @@ -2588,7 +2782,7 @@ the direction (@code{ax}, @code{ay}, @code{az}). @end table @item dilate -Scale the geometrical entities @code{dimTag} by factors @code{a}, @code{b} and +Scale the model entities @code{dimTag} by factors @code{a}, @code{b} and @code{c} along the three coordinate axes; use (@code{x}, @code{y}, @code{z}) as the center of the homothetic transformation. @@ -2602,7 +2796,7 @@ the center of the homothetic transformation. @end table @item symmetrize -Apply a symmetry transformation to the geometrical entities @code{dimTag}, with +Apply a symmetry transformation to the model entities @code{dimTag}, with respect to the plane of equation @code{a} * x + @code{b} * y + @code{c} * z + @code{d} = 0. @@ -2617,8 +2811,8 @@ respect to the plane of equation @code{a} * x + @code{b} * y + @code{c} * z + @item affineTransform Apply a general affine transformation matrix @code{a} (16 entries of a 4x4 -matrix, by row; only the 12 first can be provided for convenience) to the -geometrical entities @code{dimTag}. +matrix, by row; only the 12 first can be provided for convenience) to the model +entities @code{dimTag}. @table @asis @item Input: @@ -2690,8 +2884,8 @@ Imports an OpenCASCADE @code{shape} by providing a pointer to a native OpenCASCADE @code{TopoDS_Shape} object (passed as a pointer to void). The imported entities are returned in @code{outDimTags}. If the optional argument @code{highestDimOnly} is set, only import the highest dimensional entities in -@code{shape}. Warning: this function is unsafe, as providing an invalid pointer -will lead to undefined behavior. +@code{shape}. For C and C++ only. Warning: this function is unsafe, as providing +an invalid pointer will lead to undefined behavior. @table @asis @item Input: @@ -2703,8 +2897,8 @@ will lead to undefined behavior. @end table @item setMeshSize -Set a mesh size constraint on the geometrical entities @code{dimTags}. Currently -only entities of dimension 0 (points) are handled. +Set a mesh size constraint on the model entities @code{dimTags}. Currently only +entities of dimension 0 (points) are handled. @table @asis @item Input: @@ -2715,11 +2909,48 @@ only entities of dimension 0 (points) are handled. - @end table +@item getMass +Get the mass of the model entity of dimension @code{dim} and tag @code{tag}. + +@table @asis +@item Input: +@code{dim}, @code{tag} +@item Output: +@code{mass} +@item Return: +- +@end table + +@item getCenterOfMass +Get the center of mass of the model entity of dimension @code{dim} and tag +@code{tag}. + +@table @asis +@item Input: +@code{dim}, @code{tag} +@item Output: +@code{x}, @code{y}, @code{z} +@item Return: +- +@end table + +@item getMatrixOfInertia +Get the matrix of inertia (by row) of the model entity of dimension @code{dim} +and tag @code{tag}. + +@table @asis +@item Input: +@code{dim}, @code{tag} +@item Output: +@code{mat} +@item Return: +- +@end table + @item synchronize -Synchronize the internal OpenCASCADE CAD representation with the current Gmsh -model. This can be called at any time, but since it involves a non trivial -amount of processing, the number of synchronization points should normally be -minimized. +Synchronize the OpenCASCADE CAD representation with the current Gmsh model. This +can be called at any time, but since it involves a non trivial amount of +processing, the number of synchronization points should normally be minimized. @table @asis @item Input: @@ -2732,7 +2963,9 @@ minimized. @end ftable -@heading Module @code{/gmsh/view} +@node Namespace gmsh/view, Namespace gmsh/plugin, Namespace gmsh/model/occ, Gmsh API +@section Namespace @code{gmsh/view}: post-processing view functions + @ftable @code @item add Add a new post-processing view, with name @code{name}. If @code{tag} is positive @@ -2853,6 +3086,49 @@ data type and the @code{data} for each data type. - @end table +@item addAlias +Add a post-processing view as an @code{alias} of the reference view with tag +@code{refTag}. If @code{copyOptions} is set, copy the options of the reference +view. If @code{tag} is positive use it (and remove the view with that tag if it +already exists), otherwise associate a new tag. Return the view tag. + +@table @asis +@item Input: +@code{refTag}, @code{copyOptions}, @code{tag} +@item Output: +- +@item Return: +integer value +@end table + +@item copyOptions +Copy the options from the view with tag @code{refTag} to the view with tag +@code{tag}. + +@table @asis +@item Input: +@code{refTag}, @code{tag} +@item Output: +- +@item Return: +- +@end table + +@item combine +Combine elements (if @code{what} == "elements") or steps (if @code{what} == +"steps") of all views (@code{how} == "all"), all visible views (@code{how} == +"visible") or all views having the same name (@code{how} == "name"). Remove +original views if @code{remove} is set. + +@table @asis +@item Input: +@code{what}, @code{how}, @code{remove} +@item Output: +- +@item Return: +- +@end table + @item probe Probe the view @code{tag} for its @code{value} at point (@code{x}, @code{y}, @code{z}). Return only the value at step @code{step} is @code{step} is positive. @@ -2887,7 +3163,9 @@ file extension. Append to the file if @code{append} is set. @end ftable -@heading Module @code{/gmsh/plugin} +@node Namespace gmsh/plugin, Namespace gmsh/graphics, Namespace gmsh/view, Gmsh API +@section Namespace @code{gmsh/plugin}: plugin functions + @ftable @code @item setNumber Set the numerical option @code{option} to the value @code{value} for plugin @@ -2929,7 +3207,9 @@ Run the plugin @code{name}. @end ftable -@heading Module @code{/gmsh/graphics} +@node Namespace gmsh/graphics, Namespace gmsh/fltk, Namespace gmsh/plugin, Gmsh API +@section Namespace @code{gmsh/graphics}: graphics functions + @ftable @code @item draw Draw all the OpenGL scenes. @@ -2945,10 +3225,12 @@ Draw all the OpenGL scenes. @end ftable -@heading Module @code{/gmsh/fltk} +@node Namespace gmsh/fltk, Namespace gmsh/onelab, Namespace gmsh/graphics, Gmsh API +@section Namespace @code{gmsh/fltk}: FLTK graphical user interface functions + @ftable @code @item initialize -Create the Fltk graphical user interface. Can only be called in the main thread. +Create the FLTK graphical user interface. Can only be called in the main thread. @table @asis @item Input: @@ -3079,7 +3361,9 @@ integer value @end ftable -@heading Module @code{/gmsh/onelab} +@node Namespace gmsh/onelab, Namespace gmsh/logger, Namespace gmsh/fltk, Gmsh API +@section Namespace @code{gmsh/onelab}: ONELAB server functions + @ftable @code @item set Set one or more parameters in the ONELAB database, encoded in @code{format}. @@ -3186,7 +3470,9 @@ might be linked to the processed input files. @end ftable -@heading Module @code{/gmsh/logger} +@node Namespace gmsh/logger, , Namespace gmsh/onelab, Gmsh API +@section Namespace @code{gmsh/logger}: information logging functions + @ftable @code @item write Write a @code{message}. @code{level} can be "info", "warning" or "error". diff --git a/doc/texinfo/cmake_options.texi b/doc/texinfo/cmake_options.texi index 16455a159241b7373d239ee1a487b8e4a496f9f4..0ef0f0f952145a0e0dd860cecb2f743baed053c5 100644 --- a/doc/texinfo/cmake_options.texi +++ b/doc/texinfo/cmake_options.texi @@ -4,12 +4,12 @@ Enable proprietary 3M extension (default: OFF) @item ENABLE_ACIS Enable ACIS geometrical models (experimental) (default: ON) +@item ENABLE_ALGLIB +Enable ALGLIB (used by some mesh optimizers) (default: ON) @item ENABLE_ANN Enable ANN (used for fast point search in mesh/post) (default: ON) @item ENABLE_BAMG Enable Bamg 2D anisotropic mesh generator (default: ON) -@item ENABLE_BFGS -Enable BFGS (used by some mesh optimizers) (default: ON) @item ENABLE_BLAS_LAPACK Enable BLAS/Lapack for linear algebra (required for meshing) (default: ON) @item ENABLE_BLOSSOM diff --git a/doc/texinfo/commandline.texi b/doc/texinfo/commandline.texi index a9c7f3981b092af8dc8b4ff63ae08dfc2bc1ec58..a8760a558c4e86822af87365a1af0eb6d7492ba9 100644 --- a/doc/texinfo/commandline.texi +++ b/doc/texinfo/commandline.texi @@ -139,6 +139,8 @@ Create new model before merge next file Merge next files @item -open Open next files +@item -log filename +Log all messages to filename @item -a, -g, -m, -s, -p Start in automatic, geometry, mesh, solver or post-processing mode @item -pid diff --git a/doc/texinfo/gmsh.texi b/doc/texinfo/gmsh.texi index ba3d6d5f041e1f495e694363b81d38b72c8a8f26..8b93d09e77e66736a61c2044511cf30acfb017c3 100644 --- a/doc/texinfo/gmsh.texi +++ b/doc/texinfo/gmsh.texi @@ -243,7 +243,7 @@ API}. A brief description of the four modules is given hereafter. @c ------------------------------------------------------------------------- @node Geometry, Mesh, Overview, Overview -@section Geometry: geometrical entity definition +@section Geometry: model entity creation A model in Gmsh is defined using its Boundary Representation (BRep): a volume is bounded by a set of surfaces, a surface is bounded by a series @@ -265,11 +265,11 @@ crucial for complex models where translations invariably introduce issues linked to slightly different representations. Gmsh's scripting language and the Gmsh API allow to parametrize all -geometrical entities. The entities can either be built in a +model entities. The entities can either be built in a ``bottom-up'' manner (first points, then curves, surfaces and volumes) or in a ``Constructive Solid Geometry'' fashion (solids on which boolean operations are performed). Both methodologies can also be -combined. Finally, groups of geometrical entities (called ``physical +combined. Finally, groups of model entities (called ``physical groups'') can be defined, based on the elementary geometric entities. @c ------------------------------------------------------------------------- @@ -646,15 +646,15 @@ example, to quickly save a mesh, you can press @kbd{Ctrl+Shift+s}.}. To create a new geometry or to modify an existing geometry, select 'Geometry' in the tree. For example, to create a spline, select -`Elementary', `Add', `New' and `Spline'. You will then be asked to -select a list of points, and to type @kbd{e} to finish the selection (or -@kbd{q} to abort it). Once the interactive command is completed, a text -string is automatically added at the end of the current script file. You -can edit the script file by hand at any time by pressing the `Edit' -button in the `Geometry' menu and then reloading the model by pressing -`Reload'. For example, it is often faster to define variables and points -directly in the script file, and then use the GUI to define the curves, -the surfaces and the volumes interactively. +`Elementary entities', `Add', `New' and `Spline'. You will then be asked +to select a list of points, and to type @kbd{e} to finish the selection +(or @kbd{q} to abort it). Once the interactive command is completed, a +text string is automatically added at the end of the current script +file. You can edit the script file by hand at any time by pressing the +`Edit' button in the `Geometry' menu and then reloading the model by +pressing `Reload'. For example, it is often faster to define variables +and points directly in the script file, and then use the GUI to define +the curves, the surfaces and the volumes interactively. Several files can be loaded simultaneously in Gmsh. When specified on the command line, the first one defines the active model and the others @@ -980,7 +980,9 @@ List of expressions are also widely used, and are defined as: @var{extrude} | @var{boolean} | Point|Curve|Surface|Volume In BoundingBox @{ @var{expression-list} @} | - BoundingBox Point|Curve|Surface|Volume @{ @var{expression-list} @} + BoundingBox Point|Curve|Surface|Volume @{ @var{expression-list} @} | + Mass Curve|Surface|Volume @{ @var{expression} @} | + CenterOfMass Curve|Surface|Volume @{ @var{expression} @} | Point @{ @var{expression} @} | Physical Point|Curve|Surface|Volume @{ @var{expression-list} @} | <Physical> Point|Curve|Surface|Volume @{ : @} | @@ -1007,11 +1009,11 @@ through geometrical transformations, extrusions and boolean operations operations}). The next two cases allow to retrieve entities in a given bounding box, -or get the bounding box of a given entity. The last three cases permit -to retrieve the coordinates of a given geometry point (@pxref{Points}), -to retrieve the elementary entities making up physical groups, and to -retrieve the tags of all (physical or elementary) points, curves, -surfaces or volumes in the model. @value{SYNCS} +or get the bounding box of a given entity. The last five cases permit to +retrieve the mass or the center of mass of an entity, the coordinates of +a given geometry point (@pxref{Points}), the elementary entities making +up physical groups, and the tags of all (physical or elementary) points, +curves, surfaces or volumes in the model. @value{SYNCS} To see the practical use of such expressions, have a look at the first couple of examples in @ref{Tutorial}. Note that, in order to lighten the @@ -1721,7 +1723,7 @@ planes, etc. @item BoundingBox; Recomputes the bounding box of the scene (which is normally computed only -after new geometrical entities are added or after files are included or +after new model entities are added or after files are included or merged). The bounding box is computed as follows: @enumerate @item @@ -1743,7 +1745,7 @@ Forces the bounding box of the scene to the given @w{@var{expression}s} (X min, X max, Y min, Y max, Z min, Z max). @item Delete Model; -Deletes the current model (all geometrical entities and their associated +Deletes the current model (all model entities and their associated meshes). @item Delete Physicals; @@ -1830,7 +1832,7 @@ Geometries can be constructed in Gmsh using different underlying CAD kernels. Selecting the CAD kernel in @code{.geo} files is done with the @code{SetFactory} command. In the Gmsh API, the kernel appears explicitely in all the relevant functions from the @code{gmsh/model} -module, with @code{geo} or @code{occ} prefixes for the built-in and +namespace, with @code{geo} or @code{occ} prefixes for the built-in and OpenCASCADE kernel, respectively. The built-in CAD kernel (@code{SetFactory("Built-in")}) provides a @@ -1846,26 +1848,26 @@ bottom-up manner, or by using a constructive solid geometry approach where solids are defined first. Boolean operations can then be performed to modify them. -These geometrical entities are dubbed ``elementary'' in Gmsh's jargon, -and are assigned tags (stricly positive global identification numbers) -when they are created: +These geometrical model entities are also referred to as ``elementary +entities'' in Gmsh, and are assigned tags (stricly positive global +identification numbers) when they are created: @enumerate -@item each elementary point must possess a unique tag; -@item each elementary curve must possess a unique tag; -@item each elementary surface must possess a unique tag; -@item each elementary volume must possess a unique tag. +@item each point must possess a unique tag; +@item each curve must possess a unique tag; +@item each surface must possess a unique tag; +@item each volume must possess a unique tag. @end enumerate -@noindent Elementary geometrical entities can then be manipulated in various +@noindent Elementary entities can then be manipulated in various ways, for example using the @code{Translate}, @code{Rotate}, @code{Scale} or @code{Symmetry} commands. They can be deleted with the @code{Delete} command, provided that no higher-dimension entity references them. Zero or negative tags are reserved by the system for special uses: do not use them in your scripts. -Groups of elementary geometrical entities can also be defined and are -called ``physical'' groups. These physical groups cannot be modified by +Groups of elementary entities can also be defined and are called +``physical'' groups. These physical groups cannot be modified by geometry commands: their only purpose is to assemble elementary entities into larger groups so that they can be referred to later as single entities. As is the case with elementary entities, each physical point, @@ -1890,12 +1892,12 @@ physical groups affect the way meshes are saved. The next subsections describe all the available geometry commands in the scripting language. For the equivalent commands in the Gmsh API, see the -@code{gmsh/model/geo} and @code{gmsh/model/occ} modules in @ref{Gmsh +@code{gmsh/model/geo} and @code{gmsh/model/occ} namespaces in @ref{Gmsh API}. Note that the following general syntax rule is followed for the -definition of geometrical entities: ``If an @var{expression} defines a -new entity, it is enclosed between parentheses. If an @var{expression} +definition of model entities: ``If an @var{expression} defines a new +entity, it is enclosed between parentheses. If an @var{expression} refers to a previously defined entity, it is enclosed between braces.'' @menu @@ -1923,10 +1925,10 @@ refers to a previously defined entity, it is enclosed between braces.'' @ftable @code @item Point ( @var{expression} ) = @{ @var{expression}, @var{expression}, @var{expression} <, @var{expression} > @}; -Creates an elementary point. The @var{expression} inside the parentheses -is the point's tag; the three first @w{@var{expression}s} inside the -braces on the right hand side give the three X, Y and Z coordinates of -the point in the three-dimensional Euclidean space; the optional last +Creates a point. The @var{expression} inside the parentheses is the +point's tag; the three first @w{@var{expression}s} inside the braces on +the right hand side give the three X, Y and Z coordinates of the point +in the three-dimensional Euclidean space; the optional last @var{expression} sets the prescribed mesh element size at that point. See @ref{Specifying mesh element sizes}, for more information about how this value is used in the meshing process. @@ -2001,14 +2003,14 @@ expressions). Creates an oriented loop of curves, i.e. a closed wire. The @var{expression} inside the parentheses is the curve loop's tag; the @var{expression-list} on the right hand side should contain the tags of -all the elementary curves that constitute the curve loop. A curve loop must -be a closed loop, and the elementary curves should be ordered and -oriented (using negative tags to specify reverse orientation). If the -orientation is correct, but the ordering is wrong, Gmsh will actually -reorder the list internally to create a consistent loop. Although Gmsh -supports it, it is not recommended to specify multiple curve loops (or -subloops) in a single @code{Curve Loop} command. (Curve loops are used -to create surfaces: see @ref{Surfaces}.) +all the curves that constitute the curve loop. A curve loop must be a +closed loop, and the curves should be ordered and oriented (using +negative tags to specify reverse orientation). If the orientation is +correct, but the ordering is wrong, Gmsh will actually reorder the list +internally to create a consistent loop. Although Gmsh supports it, it is +not recommended to specify multiple curve loops (or subloops) in a +single @code{Curve Loop} command. (Curve loops are used to create +surfaces: see @ref{Surfaces}.) @item Wire ( @var{expression} ) = @{ @var{expression-list} @}; Creates a path made of curves. Wires are only available with the @@ -2018,14 +2020,15 @@ extrusions along paths. @item Physical Curve ( @var{expression} | @var{char-expression} <, @var{expression}> ) <+|->= @{ @var{expression-list} @}; Creates a physical curve. The @var{expression} inside the parentheses is the physical curve's tag; the @var{expression-list} on the right hand -side should contain the tags of all the elementary curves that need to be -grouped inside the physical curve. If a @var{char-expression} is given -instead instead of @var{expression} inside the parentheses, a string -label is associated with the physical tag, which can be either provided -explicitly (after the comma) or not (in which case a unique tag is -automatically created). Specifying negative tags in the -@var{expression-list} will reverse the orientation of the mesh elements -belonging to the corresponding elementary curves in the saved mesh file. +side should contain the tags of all the elementary curves that need to +be grouped inside the physical curve. If a @var{char-expression} is +given instead instead of @var{expression} inside the parentheses, a +string label is associated with the physical tag, which can be either +provided explicitly (after the comma) or not (in which case a unique tag +is automatically created). In some mesh file formats (e.g. MSH2), +specifying negative tags in the @var{expression-list} will reverse the +orientation of the mesh elements belonging to the corresponding +elementary curves in the saved mesh file. @end ftable @@ -2055,11 +2058,11 @@ have any curves in common with another curve loop defining a hole in the same surface (in which case the two curve loops should be combined). @item Surface ( @var{expression} ) = @{ @var{expression-list} @} < In Sphere @{ @var{expression} @} >; -Creates a surface filling. With the built-in kernel, the first curve loop -should be composed of either three or four elementary curves. With the +Creates a surface filling. With the built-in kernel, the first curve +loop should be composed of either three or four curves. With the built-in kernel, the optional @code{In Sphere} argument forces the -surface to be a spherical patch (the extra parameter gives the -tag of the center of the sphere). +surface to be a spherical patch (the extra parameter gives the tag of +the center of the sphere). @item Disk ( @var{expression} ) = @{ @var{expression-list} @}; Creates a disk. When four expressions are provided on the right hand @@ -2076,26 +2079,25 @@ corners. @code{Rectangle} is only available with the OpenCASCADE kernel. @item Surface Loop ( @var{expression} ) = @{ @var{expression-list} @}; Creates a surface loop (a shell). The @var{expression} inside the parentheses is the surface loop's tag; the @var{expression-list} on the -right hand side should contain the tags of all the elementary surfaces -that constitute the surface loop. A surface loop must always represent a -closed shell, and the elementary surfaces should be oriented -consistently (using negative tags to specify reverse -orientation). (Surface loops are used to create volumes: see -@ref{Volumes}.) +right hand side should contain the tags of all the surfaces that +constitute the surface loop. A surface loop must always represent a +closed shell, and the surfaces should be oriented consistently (using +negative tags to specify reverse orientation). (Surface loops are used +to create volumes: see @ref{Volumes}.) @item Physical Surface ( @var{expression} | @var{char-expression} <, @var{expression}> ) <+|->= @{ @var{expression-list} @}; Creates a physical surface. The @var{expression} inside the parentheses -is the physical surface's tag; the -@var{expression-list} on the right hand side should contain the -tags of all the elementary surfaces that need to be -grouped inside the physical surface. If a @var{char-expression} is -given instead instead of @var{expression} inside the parentheses, a -string label is associated with the physical tag, -which can be either provided explicitly (after the comma) or not (in -which case a unique tag is automatically created). -Specifying negative tags in the @var{expression-list} -will reverse the orientation of the mesh elements belonging to the -corresponding elementary surfaces in the saved mesh file. +is the physical surface's tag; the @var{expression-list} on the right +hand side should contain the tags of all the elementary surfaces that +need to be grouped inside the physical surface. If a +@var{char-expression} is given instead instead of @var{expression} +inside the parentheses, a string label is associated with the physical +tag, which can be either provided explicitly (after the comma) or not +(in which case a unique tag is automatically created). In some mesh +file formats (e.g. MSH2), specifying negative tags in the +@var{expression-list} will reverse the orientation of the mesh elements +belonging to the corresponding elementary surfaces in the saved mesh +file. @end ftable @@ -2462,13 +2464,13 @@ Here is a list of all other geometry commands currently available: @ftable @code @item Coherence; -Removes all duplicate elementary geometrical entities (e.g., points -having identical coordinates). Note that with the built-in geometry -kernel Gmsh executes the @code{Coherence} command automatically after -each geometrical transformation, unless @code{Geometry.AutoCoherence} is -set to zero (@pxref{Geometry options list}). With the OpenCASCADE -geoemtry kernel, @code{Coherence} is simply a shortcut for a -@code{BooleanFragments} operation on all entities. +Removes all duplicate elementary entities (e.g., points having identical +coordinates). Note that with the built-in geometry kernel Gmsh executes +the @code{Coherence} command automatically after each geometrical +transformation, unless @code{Geometry.AutoCoherence} is set to zero +(@pxref{Geometry options list}). With the OpenCASCADE geoemtry kernel, +@code{Coherence} is simply a shortcut for a @code{BooleanFragments} +operation on all entities. @item < Recursive > Delete @{ <Physical> Point | Curve | Surface | Volume @{ @var{expression-list-or-all} @}; @dots{} @} Deletes all elementary entities whose tags are given @@ -2511,8 +2513,8 @@ or @code{1}. @cindex Geometry, options The list of all the options that control the behavior of geometry -commands, as well as the way geometrical entities are handled in the -GUI, is given in @ref{Geometry options list}. +commands, as well as the way model entities are handled in the GUI, is +given in @ref{Geometry options list}. @c ========================================================================= @c Mesh module @@ -2602,12 +2604,16 @@ by means of Delaunay triangulation and Bowyer-Watson algorithm}, J. Comput. Phys. 106, pp. 25--138, 1993.}. @item Other experimental algorithms with specific features are also -available. In particular, ``Frontal-Delaunay for Quads'' is a variant of -the ``Frontal-Delaunay'' algorithm aiming at generating right-angle -triangles suitable for recombination; and ``BAMG''@footnote{F. Hecht, -@emph{BAMG: bidimensional anisotropic mesh generator}, User Guide, -INRIA, Rocquencourt, 1998.} allows to generate anisotropic -triangulations. +available. In particular, ``Frontal-Delaunay for +Quads''@footnote{J.-F. Remacle, F. Henrotte, T. Carrier-Baudouin, +E. Béchet, E. Marchandise, C. Geuzaine and T. Mouton, @emph{A frontal +Delaunay quad mesh generator using the Linf norm}, International Journal +for Numerical Methods in Engineering, 94(5), pp. 494-512, 2013.} is a +variant of the ``Frontal-Delaunay'' algorithm aiming at generating +right-angle triangles suitable for recombination; and +``BAMG''@footnote{F. Hecht, @emph{BAMG: bidimensional anisotropic mesh +generator}, User Guide, INRIA, Rocquencourt, 1998.} allows to generate +anisotropic triangulations. @end itemize For very complex curved surfaces the ``MeshAdapt'' algorithm is the most @@ -2649,10 +2655,9 @@ tetrahedralizations. @end itemize The ``Delaunay'' algorithm is currently the most robust and is the only -one that supports embedded geometrical entities, the @code{Field} -mechanism to specify element sizes (@pxref{Specifying mesh element -sizes}) and the automatic generation of hybrid meshes with -pyramids. +one that supports embedded model entities, the @code{Field} mechanism to +specify element sizes (@pxref{Specifying mesh element sizes}) and the +automatic generation of hybrid meshes with pyramids. If your version of Gmsh is compiled with OpenMP support (@pxref{Compiling the source code}), most of the meshing steps can be @@ -2680,8 +2685,8 @@ command line (@pxref{Command-line options}), or with the @node Elementary entities vs physical groups, Mesh commands, Choosing the right unstructured algorithm, Mesh module @section Elementary entities vs. physical groups -It is usually convenient to combine geometrical entities into more -meaningful groups, e.g. to define some mathematical (``domain'', +It is usually convenient to combine elementary geometrical entities into +more meaningful groups, e.g. to define some mathematical (``domain'', ``boundary with Neumann condition''), functional (``left wing'', ``fuselage'') or material (``steel'', ``carbon'') properties. Such grouping is done in Gmsh's geometry module (@pxref{Geometry module}) @@ -2710,9 +2715,9 @@ To save all mesh element wether or not physical groups are defined, use The mesh module commands allow to modify the mesh element sizes and specify structured grid parameters. Certain mesh ``actions'' (i.e., ``mesh the curves'', ``mesh the surfaces'' and ``mesh the volumes'') can -also be specified in the script files but are performed either in the -GUI or on the command line (see @ref{Running Gmsh on your system}, and -@ref{Command-line options}). +also be specified in the script files but are usually performed either +in the GUI or on the command line (see @ref{Running Gmsh on your +system}, and @ref{Command-line options}). In the Gmsh API, the mesh commands are available in the @code{gmsh/model/mesh} module (@pxref{Gmsh API}). @@ -2754,9 +2759,8 @@ advanced methods explained below. @item Second, if @code{Mesh.CharacteristicLengthFromCurvature} is set (it is not by default), the mesh will be adapted with respect to the curvature -of the geometrical entities and the value of -@code{Mesh.MinimumCirclePoints}, which gives the number of points per 2 -pi radians. +of the model entities and the value of @code{Mesh.MinimumCirclePoints}, +which gives the number of points per 2 pi radians. @item Finally, you can specify a general background mesh size, expressed as a combination of so-called mesh size fields: @@ -2766,7 +2770,7 @@ The @code{Box} field specifies the size of the elements inside and outside of a parallelepipedic region. @item The @code{Distance} field specifies the size of the mesh according to the -distance to some geometrical entities. +distance to some model entities. @item The @code{MathEval} field specifies the size of the mesh using an explicit mathematical function. @@ -2804,8 +2808,10 @@ by default). All element sizes are further constrained in the interval [ @code{Mesh.CharacteristicLengthMin}, @code{Mesh.CharacteristicLengthMax} -]. The resulting value is then finally multiplied by -@code{Mesh.CharacteristicLengthFactor}. +] (which can also be provided on the command line with @code{-clmin} and +@code{-clmax}). The resulting value is then finally multiplied by +@code{Mesh.CharacteristicLengthFactor} (@code{-clscale} on the command +line). Note that when the element size is fully specified by a background mesh field, it is thus often desirable to set @@ -3672,7 +3678,7 @@ cases.) The MSH file format version 4 (current revision: version 4.1) contains one mandatory section giving information about the file (@code{$MeshFormat}), followed by several optional sections defining the -physical group names (@code{$PhysicalName}), the elementary geometrical +physical group names (@code{$PhysicalName}), the elementary model entities (@code{$Entities}), the partitioned entities (@code{$PartitionedEntities}), the nodes (@code{$Nodes}), the elements (@code{$Elements}), the periodicity relations (@code{$Periodic}), the @@ -4109,10 +4115,10 @@ sizes. @cindex Nodes, ordering Historically, Gmsh first supported linear elements (lines, triangles, -quadrangles, tetrahedar, prisms and hexahedra). Then, support for second +quadrangles, tetrahedra, prisms and hexahedra). Then, support for second and some third order elements has been added. Below we distinguish such ``low order elements'', which are hardcoded (i.e. they are explicitly -defined in the code), and general ``high order elements'', that have +defined in the code), and general ``high-order elements'', that have been coded in a more general fashion, theoretically valid for any order. @subsection Low order elements @@ -4122,9 +4128,13 @@ are defined as follows. @smallexample @group -Line: Line3: Line4: +Line: Line3: Line4: -0----------1 --> u 0-----2----1 0----2----3----1 + v + ^ + | + | +0-----+-----1 --> u 0----2----1 0---2---3---1 @end group @end smallexample @@ -4259,7 +4269,7 @@ Pyramid: Pyramid13: Pyramid14: @end group @end smallexample -@subsection High order elements +@subsection High-order elements The node ordering of a higher order (possibly curved) element is compatible with the numbering of low order element (it is a @@ -4427,10 +4437,10 @@ file format}. gives the number of integer tags that follow for the @var{n}-th element. By default, the first @var{tag} is the tag of the physical entity to which the element belongs; the second is the tag of the -elementary geometrical entity to which the element belongs; the third is -the number of mesh partitions to which the element belongs, followed by -the partition ids (negative partition ids indicate ghost cells). A zero -tag is equivalent to no tag. Gmsh and most codes using the MSH 2 format +elementary model entity to which the element belongs; the third is the +number of mesh partitions to which the element belongs, followed by the +partition ids (negative partition ids indicate ghost cells). A zero tag +is equivalent to no tag. Gmsh and most codes using the MSH 2 format require at least the first two tags (physical and elementary tags). @item @var{node-number-list} @@ -5199,7 +5209,7 @@ options' button in `Tools->Options->General->Advanced', or erase the by hand. All the options can be manipulated through the Gmsh API through the -@code{gmsh/option} module (@pxref{Gmsh API}). +@code{gmsh/option} namespace (@pxref{Gmsh API}). @c All the included files are generated automatically with `gmsh -doc' @@ -5357,14 +5367,99 @@ that this will lead to (slightly) reduced performance compared to using the native Gmsh C++ API, as it entails additional data copies between the C++ wrapper, the C API and the native C++ code. -The functions available in the API are given below (see the relevant -header/module file for the exact definition in each supported -language@footnote{In C++ @code{/gmsh/model/geo/addPoint} will lead to a -namespaced function @code{gmsh::model::geo::addPoint}, while in Python -and Julia it will lead to @code{gmsh.model.geo.addPoint}, and in C to +The structure of the API reflects the underlying Gmsh data model +(@pxref{Source code structure}): +@itemize +@item +There are two main data containers: @emph{models} (which hold the +geometrical and the mesh data) and @emph{views} (which hold +post-processing data). These are manipulated by the API functions in the +top-level namespaces @code{gmsh/model} and @code{gmsh/view}, +respectively. The other top-level namespaces are @code{gmsh/option} +(which handles all options), @code{gmsh/plugin} (which handles +extensions to core Gmsh functionality), @code{gmsh/graphics} (which +handles drawing), @code{gmsh/fltk} (which handles the graphical user +interface), @code{gmsh/onelab} (which handles ONELAB parameters and +communications with external codes) and @code{gmsh/logger} (which +handles information logging). +@item +Geometrical data is made of model @emph{entities}, called @emph{points} +(entities of dimension 0), @emph{curves} (entities of dimension 1), +@emph{surfaces} (entities of dimension 2) or @emph{volumes} (entities of +dimension 3). Model entities are stored using a boundary representation: +a volume is bounded by a set of surfaces, a surface is bounded by a +series of curves, and a curve is bounded by two end points. Volumes and +surfaces can also store @emph{embedded} entities of lower dimension, to +force a subsequent mesh to be conformal to internal features like a +point in the middle of a surface. Model entities are identified by their +dimension and by a @emph{tag}: a strictly positive identification +number. @emph{Physical groups} are collections of model entities and are +identified by their dimension and by a @emph{tag}. Operations which do +not directly reference a model are performed on the @emph{current} +model. +@item +Model entities can be either CAD entities (from the built-in @emph{geo} +kernel or from the OpenCASCADE @emph{occ} kernel) or @emph{discrete} +entities (defined by a mesh). Operations on CAD entities are performed +directly within their respective CAD kernels (i.e. using functions from +the @code{gmsh/model/geo} or @code{gmsh/model/occ} namespaces, +respectively), as Gmsh does not translate across CAD formats but rather +directly accesses the native representation. CAD entities must be +@emph{synchronized} with the model in order to be meshed. 1D and 2D +meshing algorithms use the @emph{parametrization} of the underlying +geometrical curve or surface to generate the mesh. Discrete entities can +be remeshed provided that a parametrization is explicitly recomputed for +them. +@item +Mesh data is made of @emph{elements} (points, lines, triangles, +quadrangles, tetrahedra, hexahedra, prisms, pyramids, ...), defined by +an ordered list of their @emph{nodes}. Elements and nodes are identified +by @emph{tags} (strictly positive identification numbers), and are +stored (@emph{classified}) in the model entity they discretize. Once +meshed, a model entity of dimension 0 (a geometrical point) will thus +contain a mesh element of type point (MSH type 15: cf. @ref{MSH file +format}), as well as a mesh node. A model curve will contain line +elements (e.g. of MSH type 1 or 8 for first order or second order +meshes, respectively) as well as its interior nodes, while its boundary +nodes will be stored in the bounding model points. A model surface will +contain triangular and/or quadrangular elements and all the nodes not +classified on its boundary or on its embedded entities (curves and +points). A model volume will contain tetrahedra, hexahedra, etc. and all +the nodes not classified on its boundary or on its embedded entities +(surfaces, curves and points). This data model allows to easily and +efficiently handle the creation, modification and destruction of +conformal meshes. All the mesh-related functions are provided in the +@code{gmsh/model/mesh} namespace. +@item +Post-processing data is made of @emph{views}. Each view is identified by +a @emph{tag}, and can also be accessed by its @emph{index} (which can +change when views are sorted, added or deleted). A view stores both +display @emph{options} and @emph{data}, unless the view is an +@emph{alias} of another view (in which case it only stores display +options, and the data points to a reference view). View data can +contain several @emph{steps} (e.g. to store time series) and can be +either linked to one or more models@footnote{Each step can be linked to +a different model, which allows to have a single time series based on +multiple (e.g. deforming or moving) meshes.} (@emph{mesh-based} data, as +stored in MSH files: cf. @ref{MSH file format}) or independent from any +model (@emph{list-based} data, as stored in parsed POS files: +cf. @ref{Post-processing commands}). Various @emph{plugins} exist to +modify and create views. +@end itemize + +All the functions available in the API are given below. See the relevant +header/module file for the exact definition in each supported language: +in @url{https://gitlab.onelab.info/gmsh/gmsh/tree/master/api/gmsh.h,C++} +@code{gmsh/model/geo/addPoint} will lead to a namespaced function +@code{gmsh::model::geo::addPoint}, while in +@url{https://gitlab.onelab.info/gmsh/gmsh/tree/master/api/gmsh.py,Python} +and +@url{https://gitlab.onelab.info/gmsh/gmsh/tree/master/api/gmsh.jl,Julia} +it will lead to @code{gmsh.model.geo.addPoint}, and in +@url{https://gitlab.onelab.info/gmsh/gmsh/tree/master/api/gmshc.h,C} to @code{gmshModelGeoAddPoint}. Output values are passed by reference in C++, as pointers in C and directly returned (after the return value, if -any) in Python and Julia.}): +any) in Python and Julia. @include api.texi @@ -5436,10 +5531,10 @@ and volumes Concrete implementations of these classes are provided for each supported CAD kernel (e.g. @url{https://gitlab.onelab.info/gmsh/gmsh/tree/master/Geo/gmshVertex.h,Geo/gmshVertex.h} -for geometry points in Gmsh's built-in CAD kernel, or +for points in Gmsh's built-in CAD kernel, or @url{https://gitlab.onelab.info/gmsh/gmsh/tree/master/Geo/OCCVertex.h,Geo/OCCVertex.h} -for geometry points from OpenCASCADE). All these elementary geometry -entities derive from +for points from OpenCASCADE). All these elementary model entities derive +from @url{https://gitlab.onelab.info/gmsh/gmsh/tree/master/Geo/GEntity.h,Geo/GEntity.h}. Physical groups are simply stored as integer tags in the entities. @@ -5455,20 +5550,25 @@ tetrahedra (@url{https://gitlab.onelab.info/gmsh/gmsh/tree/master/Geo/MTetrahedron.h,Geo/MTetrahedron.h}), etc. All the mesh elements are derived from @url{https://gitlab.onelab.info/gmsh/gmsh/tree/master/Geo/MElement.h,Geo/MElement.h}, -and are stored in the corresponding geometrical entities: one mesh point -per geometrical point, mesh lines in geometrical curves, triangles and +and are stored in the corresponding model entities: one mesh point per +geometrical point, mesh lines in geometrical curves, triangles and quadrangles in surfaces, etc. The elements are defined in terms of their nodes (@url{https://gitlab.onelab.info/gmsh/gmsh/tree/master/Geo/MVertex.h,Geo/MVertex.h}). -Each geometrical entity stores only its internal nodes: boundary nodes -are stored in the bounding entities. This allows to easily and -efficiently handle the creation, modification and destruction of -conformal meshes. +Each model entity stores only its internal nodes: nodes on boundaries or +on embedded entities are stored in the associated bounding/embedded +entity. The post-processing module is based on the concept of views (@url{https://gitlab.onelab.info/gmsh/gmsh/tree/master/Post/PView.h,Post/PView.h}) and abstract data containers (derived from @url{https://gitlab.onelab.info/gmsh/gmsh/tree/master/Post/PViewData.h,Post/PViewData.h}). +Data can be either mesh-based +(@url{https://gitlab.onelab.info/gmsh/gmsh/tree/master/Post/PViewDataGModel.h,Post/PViewDataGModel.h}), +in which case the view is linked to one or more models, or list-based +(@url{https://gitlab.onelab.info/gmsh/gmsh/tree/master/Post/PViewDataList.h,Post/PViewDataLis.h}), +in which case all the relevant geometrical information is self-contained +in the view. @c ------------------------------------------------------------------------- @c Coding style @@ -5573,8 +5673,8 @@ Gmsh is an automatic three-dimensional finite element mesh generator with built-in pre- and post-processing facilities. With Gmsh you can create or import 1D, 2D and 3D geometrical models, mesh them, launch external finite element solvers and visualize solutions. Gmsh can be -used either as a stand-alone program (graphical or not) or as a C++ -library. +used either as a stand-alone program (graphical or not) or as a library +to integrate in C++, C, Python or Julia codes. @item What are the terms and conditions of use? @@ -5615,7 +5715,9 @@ database} and a searchable archive of the Gmsh mailing list @enumerate @item Which OSes does Gmsh run on? -Gmsh runs on Windows, Mac OS X, Linux and most Unix variants. +Gmsh runs on Windows, Mac OS X, Linux and most Unix variants. Gmsh is +also available as part of the ONELAB package on Android and iOS tablets +and phones. @item Are there additional requirements to run Gmsh? @@ -5626,9 +5728,7 @@ found at @url{http://www.mesa3d.org}. @item How do I compile Gmsh from the source code? You need cmake (@url{http://www.cmake.org}) and a C++ compiler. See -@ref{Compiling the source code} and the -@url{https://gitlab.onelab.info/gmsh/gmsh/tree/master/README.txt,README.txt} -file in the top-level source directory for more information. +@ref{Compiling the source code} for more information. @item Where does Gmsh save its configuration files? @@ -5685,6 +5785,14 @@ guesses the format from the file extension, so you can just type @file{myfile.jpg} in the dialog and Gmsh will automatically create a JPEG image file. +@item How save high-resolution images? + +You can specify the dimension in the dialog (e.g. set the width of the +image to 5000 pixels; leaving one dimension negative will rescale using +the natural aspect ratio), or through the @code{Print.Width} and +@code{Print.Height} options. The maximum image size is graphics hardware +dependent. + @item How can I save MPEG, AVI, ..., animations? You can create simple MPEG animations by choosing MPEG as the format in @@ -5717,16 +5825,17 @@ clipboard. @section Geometry module @enumerate -@item Does Gmsh support NURBS curves/surfaces? +@item Does Gmsh support trimmed NURBS surfaces? Yes, but only with the OpenCASCADE kernel. -@item Gmsh is very slow when I use many transformations (Translate, Rotate, Symmetry, Extrude, etc. ). What's wrong? +@item Gmsh is very slow when I use many transformations (Translate, Rotate, Symmetry, Extrude, etc.) with the built-in CAD kernel. What's wrong? The default behavior of Gmsh is to check and suppress all duplicate -entities (points, curves and surfaces) each time a transformation command -is issued. This can slow down things a lot if many transformations are -performed. There are two solutions to this problem: +entities (points, curves and surfaces) each time a transformation +command is issued with the built-in CAD kernel. This can slow down +things a lot if many transformations are performed. There are two +solutions to this problem: @itemize @item you may save the unrolled geometry in another file (e.g. with gmsh @@ -5747,15 +5856,27 @@ a list or tree browser, by tag, interactively, or per window). @item Can I edit STEP/IGES/BRep models? -Yes. With the OpenCASCADE kernel (@code{SetFactory("OpenCASCADE");}), -load the file (@code{Merge "file.step";} or @code{ShapeFromFile("file.step");}) -and add the relevant scripting commands after that to delete parts, -create new parts or apply boolean operators. +Yes: with the OpenCASCADE kernel (@code{SetFactory("OpenCASCADE");}), +load the file (@code{Merge "file.step";} or +@code{ShapeFromFile("file.step");}) and add the relevant scripting +commands after that to delete parts, create new parts or apply boolean +operators. See +e.g. @url{https://gitlab.onelab.info/gmsh/gmsh/tree/master/demos/boolean/import.geo,demos/boolean/import.geo}. + +@item Why are there surfaces missing when I export a STEP as an unrolled .geo file? + +You should @emph{not} export STEP models as .geo files. By design, Gmsh +never translates from one CAD format to another. The ``unrolled GEO'' +feature is there for unrolling complex GEO scripts. While it can indeed +export a limited subset of geometrical entities created by other CAD +kernels, it's there only for debugging purposes. If you want to modify a +STEP model, see the previous question. @item How can I build modular geometries? Define common geometrical objects and options in separate files or using -@code{Macro}, reusable in all your problem definition structures. +@code{Macro}, reusable in all your problem definition structures. Or use +the features of your language of choice and the Gmsh API. @item Some files take much more time to load with Gmsh 4 compared to Gmsh 3: what's happening? @@ -5824,13 +5945,14 @@ Use `Optimize quality' in the mesh menu. @item Non-recombined 3D extruded meshes sometimes fail. -The swapping algorithm is not very clever at the moment. Try to change -the surface mesh a bit, or recombine your mesh to generate prisms or -hexahedra instead of tetrahedra. +The swapping algorithm is not very clever. Try to change the surface +mesh a bit, or recombine your mesh to generate prisms or hexahedra +instead of tetrahedra. @item Does Gmsh automatically couple unstructured tetrahedral meshes and structured hexahedral meshed using pyramids? -Only in simple geometrical cases. We need your help to improve this. +Yes, but only if pyramids need to be created on a single side of the +quadrangular surface mesh. @item Can I explicitly assign region tags to extruded layers? @@ -5844,10 +5966,11 @@ algorithm with smoothing (e.g., with @code{Mesh.Smoothing = 10}). @item Does Gmsh support curved elements? -Yes, just choose the appropriate order in the mesh menu after the mesh is -completed. High order optimization tools are in development and also available -in the mesh menu. You can select the order on the command line with e.g. -@code{-order 2}. +Yes, just choose the appropriate order in the mesh menu after the mesh +is completed. High-order optimization tools are also available in the +mesh menu. You can select the order on the command line with e.g. +@code{-order 2}, and activcate high-order optization with +@code{-optimize_ho}. @item Can I import an existing surface mesh in Gmsh and use it to build a 3D mesh? @@ -5919,6 +6042,26 @@ In the API: @code{gmsh::option::setNumber("Mesh.MshFileVersion", x.y)}. As an alternative method, you can also not specify the format explicitely, and just choose a filename with the @code{.msh2} or @code{.msh4} extension. + +@item Why isn't neighboring element information stored in the MSH file? + +Each numerical method has its own requirements: it might need +neighboring elements connected by a node, an edge or a face; it might +require a single layer or multiple layers; it should include elements of +lower dimension (boundaries) or not, go across geometrical entities or +mesh partitions or not, etc. Given the number of possibilities, +generating the appropriate information is thus best performed in the +numerical solver itself. The Gmsh API makes these computations easy: see +for example +@url{https://gitlab.onelab.info/gmsh/gmsh/tree/master/demos/api/neighbors.py,demos/api/neighbors.py}. + +@item Could mesh edges/faces be stored in the MSH file? + +Edge/faces can be easily generated from the information already +available in the file (i.e. nodes and elements), or through the Gmsh +API: see for example +@url{https://gitlab.onelab.info/gmsh/gmsh/tree/master/demos/api/faces.cpp,demos/api/faces.cpp}. + @end enumerate @c ------------------------------------------------------------------------- @@ -5932,21 +6075,28 @@ explicitely, and just choose a filename with the @code{.msh2} or @item How do I integrate my own solver with Gmsh? Gmsh uses the ONELAB interface (@url{http://www.onelab.info}) to -interact with external solvers. Have a look at the GetDP finite element -solver (@url{http://getdp.info}) to see how this is done. +interact with external solvers. See @ref{Solver module}. @item Can I launch Gmsh from my solver (instead of launching my solver from Gmsh) in order to monitor a solution? -Sure. The simplest (but rather crude) approach if to re-launch Gmsh -everytime you want to visualize something (a simple C program showing -how to do this is given in -@url{https://gitlab.onelab.info/gmsh/gmsh/tree/master/utils/misc/callgmsh.c,utils/misc/callgmsh.c}). A -better approach is to modify your program so that it can communicate -with Gmsh over a socket (see ``How do I integrate my own solver with -Gmsh?'' above; you can skip the option file creation). Then select -`Always listen to incoming connection requests' in the solver option -panel (or run gmsh with the @code{-listen} command line option) and Gmsh -will always listen for your program on the Solver.SocketName socket. +The simplest (but rather crude) approach if to re-launch Gmsh everytime +you want to visualize something (a simple C program showing how to do +this is given in +@url{https://gitlab.onelab.info/gmsh/gmsh/tree/master/utils/misc/callgmsh.c,utils/misc/callgmsh.c}). + +Another approach is to modify your program so that it can communicate +with Gmsh through ONELAB over a socket, select `Always listen to +incoming connection requests' in the solver option panel (or run gmsh +with the @code{-listen} command line option), and Gmsh will always +listen for your program on the @code{Solver.SocketName} socket. + +Using the Gmsh API, you can also directly embed Gmsh in your own solver, +and use ONELAB for interactive parameter definition and +modification. See +@url{https://gitlab.onelab.info/gmsh/gmsh/tree/master/demos/api/custom_gui.py,custom_gui.py} +and +@url{https://gitlab.onelab.info/gmsh/gmsh/tree/master/demos/api/custom_gui.cpp,custom_gui.cpp}) +for examples. @end enumerate @c ------------------------------------------------------------------------- diff --git a/doc/texinfo/opt_general.texi b/doc/texinfo/opt_general.texi index defb6b8907ba3f5d8678bb4b94ab0842961b15a1..594e28090821935c95caf191691c3e76ec57dc27 100644 --- a/doc/texinfo/opt_general.texi +++ b/doc/texinfo/opt_general.texi @@ -158,7 +158,7 @@ Saved in: @code{General.SessionFileName} @item General.Version Gmsh version (read-only)@* -Default value: @code{"4.2.3-git-18b4eb06e"}@* +Default value: @code{"4.4.0-git-ed924c4ba"}@* Saved in: @code{-} @item General.WatchFilePattern diff --git a/doc/texinfo/opt_geometry.texi b/doc/texinfo/opt_geometry.texi index 494aad2a91d0df93e4e872fdcdaed732229ec495..7894caa4062f53796e55400f787942b81c85d68d 100644 --- a/doc/texinfo/opt_geometry.texi +++ b/doc/texinfo/opt_geometry.texi @@ -22,7 +22,7 @@ Default value: @code{""}@* Saved in: @code{General.OptionsFileName} @item Geometry.OCCTargetUnit -Length unit to which coordinates from STEP and IGES files are converted to when imported by OpenCASCADE, e.g. 'M' for meters (leave empty to keep the unit defined in the STEP and IGES file)@* +Length unit to which coordinates from STEP and IGES files are converted to when imported by OpenCASCADE, e.g. 'M' for meters (leave empty to use OpenCASCADE default bahavior)@* Default value: @code{""}@* Saved in: @code{General.OptionsFileName} diff --git a/doc/texinfo/opt_mesh.texi b/doc/texinfo/opt_mesh.texi index 896295bea3d0d651ff384cbe368e03f3c49a0251..8eacb4d94e5f3c13a983062a9e562566c0b0da44 100644 --- a/doc/texinfo/opt_mesh.texi +++ b/doc/texinfo/opt_mesh.texi @@ -176,6 +176,11 @@ Try to fix flipped surface mesh elements in high-order optimizer?@* Default value: @code{0}@* Saved in: @code{General.OptionsFileName} +@item Mesh.HighOrderDistCAD +Try to optimize distance to CAD in high-order optimizer?@* +Default value: @code{0}@* +Saved in: @code{General.OptionsFileName} + @item Mesh.HighOrderThresholdMin Minimum threshold for high-order element optimization@* Default value: @code{0.1}@* @@ -252,17 +257,32 @@ Default value: @code{0}@* Saved in: @code{General.OptionsFileName} @item Mesh.MetisAlgorithm -METIS partitioning algorithm (1: Recursive, 2: K-way)@* +METIS partitioning algorithm 'ptype' (1: Recursive, 2: K-way)@* Default value: @code{1}@* Saved in: @code{General.OptionsFileName} @item Mesh.MetisEdgeMatching -METIS edge matching type (1: Random, 2: Sorted Heavy-Edge)@* +METIS edge matching type 'ctype' (1: Random, 2: Sorted Heavy-Edge)@* Default value: @code{2}@* Saved in: @code{General.OptionsFileName} +@item Mesh.MetisMaxLoadImbalance +METIS maximum load imbalance 'ufactor' (-1: default, i.e. 30 for K-way and 1 for Recursive)@* +Default value: @code{-1}@* +Saved in: @code{General.OptionsFileName} + +@item Mesh.MetisObjective +METIS objective type 'objtype' (1: min. edge-cut, 2: min. communication volume)@* +Default value: @code{1}@* +Saved in: @code{General.OptionsFileName} + +@item Mesh.MetisMinConn +METIS minimize maximum connectivity of partitions 'minconn' (-1: default)@* +Default value: @code{-1}@* +Saved in: @code{General.OptionsFileName} + @item Mesh.MetisRefinementAlgorithm -METIS algorithm for k-way refinement (1: FM-based cut, 2: Greedy, 3: Two-sided node FM, 4: One-sided node FM)@* +METIS algorithm for k-way refinement 'rtype' (1: FM-based cut, 2: Greedy, 3: Two-sided node FM, 4: One-sided node FM)@* Default value: @code{2}@* Saved in: @code{General.OptionsFileName} @@ -291,6 +311,11 @@ Import groups of nodes (0: no; 1: create geometrical point for each node)?@* Default value: @code{0}@* Saved in: @code{General.OptionsFileName} +@item Mesh.MedSingleModel +Import MED meshes in the current model, even if several MED mesh names exist@* +Default value: @code{0}@* +Saved in: @code{General.OptionsFileName} + @item Mesh.PartitionHexWeight Weight of hexahedral element for METIS load balancing (-1: automatic)@* Default value: @code{-1}@* @@ -512,7 +537,7 @@ Default value: @code{0}@* Saved in: @code{General.OptionsFileName} @item Mesh.IgnorePeriodicity -Ignore alignment of periodic boundaries when reading the mesh (used by ParaView plugin)@* +Ignore alignment of periodic boundaries when reading the mesh in MSH2 format (used by ParaView plugin)@* Default value: @code{0}@* Saved in: @code{General.OptionsFileName} diff --git a/doc/texinfo/opt_plugin.texi b/doc/texinfo/opt_plugin.texi index ce6f83a14137dccb995f2dbbbe1f00d83355ddd2..44da7c40cb003fa93c27ffacb66ac73243b011ee 100644 --- a/doc/texinfo/opt_plugin.texi +++ b/doc/texinfo/opt_plugin.texi @@ -17,8 +17,7 @@ Parameters:@* @* - ICNMeasure = @{0, 1@}@* @* -- HidingThreshold = [0, 1]: Hides all element for which min(mu) is strictly greater than the threshold, where mu is the ICN if ICN measure == 1, otherwise mu is the IGE it IGE measure == 1, otherwise mu is the Jacobian determinant.@* -If threshold == 0, hides all elements except invalid.@* +- HidingThreshold = [0, 1]: Hides all element for which min(mu) is strictly greater than the threshold, where mu is ICN ifICNMeasure == 1, otherwise it is IGE if IGEMeasure == 1. If ICNMeasure == IGEMeasure == 0, nothing happens. If threshold == 0, hides all elements except invalid.@* @* - DrawPView = @{0, 1@}: Creates a PView of min(J)/max(J), min(IGE) and/or min(ICN) according to what is asked. If 'Recompute' = 1, new PViews are created.@* @* diff --git a/doc/texinfo/version.texi b/doc/texinfo/version.texi index 5decadcf485a2fe2f8ad55b7c1b0ac846d1d79b3..19cea23fd3ceaa247507feedd1ff810a5929cea8 100644 --- a/doc/texinfo/version.texi +++ b/doc/texinfo/version.texi @@ -1,3 +1,3 @@ @c This file was generated by cmake: do not edit manually! -@set GMSH-VERSION 4.2.3 (development version) +@set GMSH-VERSION 4.4.0 (development version) diff --git a/utils/docker/Dockerfile.debian.wheezy.32bit b/utils/docker/Dockerfile.debian.wheezy.32bit index 1abbf09a2d2e8022700e1ee40527e883ccbc4ab6..b70f43a53fd0a4c17a6fdb05e638a54e206e3d3f 100644 --- a/utils/docker/Dockerfile.debian.wheezy.32bit +++ b/utils/docker/Dockerfile.debian.wheezy.32bit @@ -105,6 +105,9 @@ RUN git clone https://github.com/fltk/fltk.git && cd fltk && make -j 4 && make i # Minimal Gmsh library # ----------------------- +# "docker build --build-arg REBUILD_GMSH=yes" +ARG REBUILD_GMSH= + RUN git clone https://gitlab.onelab.info/gmsh/gmsh.git && cd gmsh && mkdir build && cd build && cmake -DDEFAULT=0 -DENABLE_PARSER=1 -DENABLE_POST=1 -DENABLE_PLUGINS=1 -DENABLE_ANN=1 -DENABLE_BLAS_LAPACK=1 -DENABLE_BUILD_LIB=1 -DENABLE_PRIVATE_API=1 .. && make -j 4 lib && make install/fast && cd ../.. && rm -rf gmsh VOLUME ["/etc/gitlab-runner"] diff --git a/utils/docker/Dockerfile.debian.wheezy.64bit b/utils/docker/Dockerfile.debian.wheezy.64bit index 2387c3c502e08955a45691f0d195cb4ffc7ae6e9..c672714112195ce94f9ff4ab60e28a825b1081fe 100644 --- a/utils/docker/Dockerfile.debian.wheezy.64bit +++ b/utils/docker/Dockerfile.debian.wheezy.64bit @@ -105,6 +105,9 @@ RUN git clone https://github.com/fltk/fltk.git && cd fltk && make -j 4 && make i # Minimal Gmsh library # ----------------------- +# "docker build --build-arg REBUILD_GMSH=yes" +ARG REBUILD_GMSH= + RUN git clone https://gitlab.onelab.info/gmsh/gmsh.git && cd gmsh && mkdir build && cd build && cmake -DDEFAULT=0 -DENABLE_PARSER=1 -DENABLE_POST=1 -DENABLE_PLUGINS=1 -DENABLE_ANN=1 -DENABLE_BLAS_LAPACK=1 -DENABLE_BUILD_LIB=1 -DENABLE_PRIVATE_API=1 .. && make -j 4 lib && make install/fast && cd ../.. && rm -rf gmsh VOLUME ["/etc/gitlab-runner"] diff --git a/utils/docker/Dockerfile.ubuntu16.04 b/utils/docker/Dockerfile.ubuntu16.04 deleted file mode 100644 index db3d44b9d20898ad39ed5d4632f0e389c3526999..0000000000000000000000000000000000000000 --- a/utils/docker/Dockerfile.ubuntu16.04 +++ /dev/null @@ -1,12 +0,0 @@ -FROM ubuntu:16.04 - -RUN apt-get update && apt-get install -y cmake curl g++ gfortran libfltk1.3-dev libfreetype6-dev libgl1-mesa-dev liblapack-dev libxi-dev libxmu-dev mesa-common-dev tcl-dev tk-dev -RUN curl -L -o occ71.tgz "http://git.dev.opencascade.org/gitweb/?p=occt.git;a=snapshot;h=refs/tags/V7_1_0;sf=tgz" -RUN tar xf occ71.tgz -RUN cd occt-V7_1_0 && mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_MODULE_Draw=0 -DBUILD_MODULE_Visualization=0 -DBUILD_MODULE_ApplicationFramework=0 .. && cat CMakeCache.txt && make -j8 -RUN cd occt-V7_1_0/build && make install - -VOLUME ["/etc/gitlab-runner"] -RUN useradd -ms /bin/bash validator -USER validator -WORKDIR /home/validator diff --git a/utils/docker/Dockerfile.ubuntu18.04 b/utils/docker/Dockerfile.ubuntu18.04 deleted file mode 100644 index d5b33439c4cd9381bdf59e5336bc5eed74ebb297..0000000000000000000000000000000000000000 --- a/utils/docker/Dockerfile.ubuntu18.04 +++ /dev/null @@ -1,62 +0,0 @@ -FROM ubuntu:18.04 - -ENV DEBIAN_FRONTEND noninteractive - -RUN apt-get update && apt-get install -y git cmake python curl g++ gfortran texlive texinfo valgrind libopenblas-dev libfltk1.3-dev libfreetype6-dev libgl1-mesa-dev libxi-dev libxmu-dev mesa-common-dev tcl-dev tk-dev libhdf5-dev libcgns-dev - -# ----------------------- -# OpenCASCADE -# ----------------------- - -# could simply use apt-get install libocct-data-exchange-dev - -RUN curl -L -o occ73.tgz "http://git.dev.opencascade.org/gitweb/?p=occt.git;a=snapshot;h=refs/tags/V7_3_0;sf=tgz" -RUN tar xf occ73.tgz -RUN cd occt-V7_3_0 && mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_MODULE_Draw=0 -DBUILD_MODULE_Visualization=0 -DBUILD_MODULE_ApplicationFramework=0 .. && cat CMakeCache.txt && make -j8 -RUN cd occt-V7_3_0/build && make install -ENV LD_LIBRARY_PATH /usr/local/lib:$LD_LIBRARY_PATH - -# ----------------------- -# PETSc -# ----------------------- - -RUN curl -O http://ftp.mcs.anl.gov/pub/petsc/release-snapshots/petsc-3.10.2.tar.gz -RUN tar zxf petsc-3.10.2.tar.gz -ENV PETSC_DIR ${PWD}/petsc-3.10.2 -ENV PETSC_ARCH real_mumps_seq -RUN cd ${PETSC_DIR} && ./configure --with-clanguage=cxx --with-debugging=0 --with-mpi=0 --with-mpiuni-fortran-binding=0 --download-mumps=yes --with-mumps-serial --with-shared-libraries=0 --with-x=0 --with-ssl=0 --with-scalar-type=real && make - -# ----------------------- -# SLEPc -# ----------------------- - -RUN curl -O http://slepc.upv.es/download/distrib/slepc-3.10.1.tar.gz -RUN tar zxf slepc-3.10.1.tar.gz -ENV SLEPC_DIR ${PWD}/slepc-3.10.1 -RUN cd ${SLEPC_DIR} && ./configure && make - -# ----------------------- -# Minimal Gmsh library -# ----------------------- - -RUN git clone https://gitlab.onelab.info/gmsh/gmsh.git -RUN cd gmsh && mkdir build && cd build && cmake -DDEFAULT=0 -DENABLE_PARSER=1 -DENABLE_POST=1 -DENABLE_PLUGINS=1 -DENABLE_ANN=1 -DENABLE_BLAS_LAPACK=1 -DENABLE_BUILD_LIB=1 -DENABLE_PRIVATE_API=1 .. && make -j8 lib && make install/fast - -# ----------------------- -# New stuff -# ----------------------- -# will be moved at the begining once we're happy, to rebuild the whole container - -RUN apt-get install -y clang-tidy - -# ----------------------- -# Gmsh lib latest git -# ----------------------- -# update to latest version and rebuild (docker build --build-arg REDO_FROM_HERE=yes) -ARG REDO_FROM_HERE= -RUN cd gmsh && git pull && cd build && make -j8 lib && make install/fast - -VOLUME ["/etc/gitlab-runner"] -RUN useradd -ms /bin/bash validator -USER validator -WORKDIR /home/validator diff --git a/utils/docker/Dockerfile.ubuntu18.04.simple b/utils/docker/Dockerfile.ubuntu18.04.simple deleted file mode 100644 index 5c778b547e7f0cba7192381360433ed2fba27ca6..0000000000000000000000000000000000000000 --- a/utils/docker/Dockerfile.ubuntu18.04.simple +++ /dev/null @@ -1,13 +0,0 @@ -FROM ubuntu:18.04 - -ENV DEBIAN_FRONTEND noninteractive - -RUN apt-get update && apt-get install -y git cmake python curl g++ gfortran texlive texlive-generic-recommended texinfo valgrind libfreetype6-dev libgl1-mesa-dev libxi-dev libxmu-dev mesa-common-dev tcl-dev tk-dev - -VOLUME ["/etc/gitlab-runner"] -RUN useradd -ms /bin/bash validator -USER validator -WORKDIR /home/validator - -RUN mkdir -p ~/.ssh -RUN chmod 700 ~/.ssh diff --git a/utils/docker/Dockerfile.ubuntu18.10 b/utils/docker/Dockerfile.ubuntu18.10 new file mode 100644 index 0000000000000000000000000000000000000000..e963b1f325ed874a7294064c94628d7eb445ef02 --- /dev/null +++ b/utils/docker/Dockerfile.ubuntu18.10 @@ -0,0 +1,26 @@ +FROM ubuntu:18.10 + +ENV DEBIAN_FRONTEND noninteractive + +RUN apt-get update && apt-get install -y git cmake python curl g++ gfortran texlive texlive-generic-recommended texinfo libopenblas-dev libfltk1.3-dev libfreetype6-dev libgl1-mesa-dev libxi-dev libxmu-dev mesa-common-dev tcl-dev tk-dev libhdf5-dev libcgns-dev libxft-dev libxinerama-dev libxcursor-dev libxfixes-dev clang-tidy libocct-foundation-dev libocct-data-exchange-dev libocct-ocaf-dev petsc-dev slepc-dev libopenmpi-dev emacs-nox && apt-get clean + +# valgrind 3.13 shipping with ubuntu 18.10 is buggy +RUN curl -L -O http://www.valgrind.org/downloads/valgrind-3.14.0.tar.bz2 && tar xf valgrind-3.14.0.tar.bz2 && cd valgrind-3.14.0 && ./configure && make -j 4 && make install && cd .. && rm -rf valgrind-3.14.0* +RUN apt-get install -y libc6-dbg + +ENV LD_LIBRARY_PATH /usr/local/lib:$LD_LIBRARY_PATH +ENV PATH /usr/local/bin:$PATH + +RUN apt-get install -y swig libpython-dev python-numpy python-scipy && apt-get clean + +# "docker build --build-arg REBUILD_GMSH=yes -f Dockerfile.ubuntu18.10 -t onelab/ubuntu18.10 ." +ARG REBUILD_GMSH= + +RUN git clone https://gitlab.onelab.info/gmsh/gmsh.git && cd gmsh && mkdir build && cd build && cmake -DDEFAULT=0 -DENABLE_PARSER=1 -DENABLE_POST=1 -DENABLE_PLUGINS=1 -DENABLE_ANN=1 -DENABLE_BLAS_LAPACK=1 -DENABLE_BUILD_SHARED=1 -DENABLE_PRIVATE_API=1 .. && make -j8 shared && make install/fast && cd .. && rm -rf gmsh + +VOLUME ["/etc/gitlab-runner"] +RUN useradd -ms /bin/bash validator +USER validator +WORKDIR /home/validator +RUN mkdir -p ~/.ssh +RUN chmod 700 ~/.ssh diff --git a/utils/docker/README b/utils/docker/README index 0c35b192905bf1023b844b8599997860d0fde8f6..8c1cc00974cf280356ff4a7b1f3fc576ca0cf8bd 100644 --- a/utils/docker/README +++ b/utils/docker/README @@ -1,18 +1,19 @@ -# build image -docker build -f Dockerfile.ubuntu16.04 -t onelab/ubuntu16.04 . -docker build -f Dockerfile.ubuntu18.04 -t onelab/ubuntu18.04 --build-arg REDO_FROM_HERE=yes . -docker build -f Dockerfile.ubuntu18.04.simple -t onelab/ubuntu18.04.simple . + +# build image (add "--build-arg REBUILD_GMSH=yes" to rebuild the Gmsh lib) + +docker build -f Dockerfile.ubuntu18.10 -t onelab/ubuntu18.10 . docker build -f Dockerfile.debian.wheezy.64bit -t onelab/debian.wheezy.64bit . docker build -f Dockerfile.debian.wheezy.32bit -t onelab/debian.wheezy.32bit . # push image to docker-hub + docker login -docker push onelab/ubuntu16.04 -docker push onelab/ubuntu18.04 -docker push onelab/ubuntu18.04.simple +docker push onelab/ubuntu18.10 docker push onelab/debian.wheezy.64bit docker push onelab/debian.wheezy.32bit # run something -docker run onelab/ubuntu18.04 ls -al /' + +docker run onelab/ubuntu18.10 ls -al /' +docker run -it onelab/ubuntu18.10 bash docker run -it onelab/debian.wheezy.64bit bash diff --git a/utils/icons/gmsh.svg b/utils/icons/gmsh.svg new file mode 100644 index 0000000000000000000000000000000000000000..3476aa7646e2cff4e8de65de0dc54c68306aff4a --- /dev/null +++ b/utils/icons/gmsh.svg @@ -0,0 +1,493 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:osb="http://www.openswatchbook.org/uri/2009/osb" + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + version="1.1" + id="svg3942" + width="1365.3333" + height="1365.3333" + viewBox="0 0 1365.3333 1365.3333" + sodipodi:docname="gmsh.svg" + inkscape:version="0.92.4 (5da689c313, 2019-01-14)" + inkscape:export-filename="/Users/geuzaine/src/gmsh/utils/icons/gmsh.png" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96" + inkscape:label="Standard Gmsh logo"> + <metadata + id="metadata3948"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs3946"> + <linearGradient + id="ONELAB_right" + inkscape:collect="always"> + <stop + id="stop898" + offset="0" + style="stop-color:#264222;stop-opacity:1" /> + <stop + id="stop900" + offset="1" + style="stop-color:#37c037;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="FEM_right"> + <stop + style="stop-color:#2f286b;stop-opacity:1" + offset="0" + id="stop7458" /> + <stop + style="stop-color:#5950a0;stop-opacity:1" + offset="1" + id="stop7460" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="Gmsh_right"> + <stop + style="stop-color:#001000;stop-opacity:1" + offset="0" + id="stop7019" /> + <stop + style="stop-color:#000000;stop-opacity:1" + offset="1" + id="stop7021" /> + </linearGradient> + <linearGradient + id="Gmsh_bottom" + inkscape:collect="always"> + <stop + id="stop7001" + offset="0" + style="stop-color:#000000;stop-opacity:1;" /> + <stop + id="stop7003" + offset="1" + style="stop-color:#ffffff;stop-opacity:1" /> + </linearGradient> + <linearGradient + id="linearGradient6982" + osb:paint="solid"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop6980" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3984"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop3980" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop3982" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3984" + id="linearGradient3986" + x1="1374.7368" + y1="1212.358" + x2="-258.08997" + y2="1149.2543" + gradientUnits="userSpaceOnUse" /> + <filter + style="color-interpolation-filters:sRGB;" + inkscape:label="Drop Shadow" + id="filter5509"> + <feFlood + flood-opacity="0.498039" + flood-color="rgb(0,0,0)" + result="flood" + id="feFlood5499" /> + <feComposite + in="flood" + in2="SourceGraphic" + operator="in" + result="composite1" + id="feComposite5501" /> + <feGaussianBlur + in="composite1" + stdDeviation="20.9" + result="blur" + id="feGaussianBlur5503" /> + <feOffset + dx="0" + dy="22" + result="offset" + id="feOffset5505" /> + <feComposite + in="offset" + in2="offset" + operator="atop" + result="composite2" + id="feComposite5507" /> + </filter> + <linearGradient + inkscape:collect="always" + xlink:href="#Gmsh_bottom" + id="linearGradient6994" + x1="98.440674" + y1="1140.7246" + x2="1247.4576" + y2="1140.7246" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#Gmsh_bottom" + id="linearGradient7007" + gradientUnits="userSpaceOnUse" + x1="1356.4407" + y1="1220.7246" + x2="-206.54234" + y2="1114.7246" /> + <linearGradient + inkscape:collect="always" + xlink:href="#Gmsh_right" + id="linearGradient7017" + gradientUnits="userSpaceOnUse" + x1="1351.4303" + y1="1495.3979" + x2="569.65436" + y2="17.254723" /> + <linearGradient + inkscape:collect="always" + xlink:href="#Gmsh_right" + id="linearGradient7051" + gradientUnits="userSpaceOnUse" + x1="1351.4303" + y1="1495.3979" + x2="569.65436" + y2="17.254723" + gradientTransform="matrix(0.72159831,0,0,0.72159831,196.23556,60.993142)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#FEM_right" + id="linearGradient7464" + x1="1078.3035" + y1="1022.6629" + x2="615.56616" + y2="143.02209" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#Gmsh_right" + id="linearGradient7526" + gradientUnits="userSpaceOnUse" + x1="1078.3035" + y1="1022.6629" + x2="615.56616" + y2="143.02209" /> + <linearGradient + inkscape:collect="always" + xlink:href="#Gmsh_bottom" + id="linearGradient7590" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.72159831,0,0,0.72159831,196.23556,60.993142)" + x1="1356.4407" + y1="1220.7246" + x2="-206.54234" + y2="1114.7246" /> + <linearGradient + inkscape:collect="always" + xlink:href="#FEM_right" + id="linearGradient7634" + gradientUnits="userSpaceOnUse" + x1="1078.3035" + y1="1022.6629" + x2="615.56616" + y2="143.02209" /> + <linearGradient + inkscape:collect="always" + xlink:href="#ONELAB_right" + id="linearGradient904" + gradientUnits="userSpaceOnUse" + x1="1078.3035" + y1="1022.6629" + x2="615.56616" + y2="143.02209" /> + </defs> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1455" + inkscape:window-height="1005" + id="namedview3944" + showgrid="false" + inkscape:zoom="0.35355339" + inkscape:cx="330.61038" + inkscape:cy="737.06583" + inkscape:window-x="97" + inkscape:window-y="0" + inkscape:window-maximized="0" + inkscape:current-layer="g7502" /> + <g + inkscape:groupmode="layer" + id="layer7" + inkscape:label="Document" + style="display:none" + sodipodi:insensitive="true"> + <image + y="32.128391" + x="-9.5009756" + id="image7840" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABAAAAAQACAYAAAB/HSuDAAAABmJLR0QAGQBGAAoAcVbgAAAACXBI WXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4wQGDTgiRshU3AAAACJ0RVh0Q29tbWVudABDcmVhdGVk IHdpdGggR0lNUCBvbiBhIE1hY4eod0MAACAASURBVHja7N15lGV1fe/9795nqKGruhuBBgS8zUMS woUrph+v0TAYUBCiMUIQaBokEURD4FEIgkM0Gr0+ink0moRroiBkueSRdUUzLEXxKjigeRIzLRka hEbobsWepGuezn7+qNpVu3b9xj2d6f1aq1adOmdPZ59d3fX97N8QRFEkAAAAAACgt9U5BShbEAQB ZwEA0I0i7pQAAHqpNuP/NXRQoU9QAACotL4vbEP8QQUAIAAABX/mwp4wAADQiUW/1/oEAwAAAgD0 ctEfFFTUEwAAADopCIiK2iahAACAAADdXPgHHs/nCRAAAGhnIBCV8BqBAACAAABdWfjbfnYt8AkB AACdVPi7LB/lXJZAAABAAICOLP59Cn/XEKCorgMAAOQt9rMU7i4BgPd2CQMAAAQAaFfx71ro+wQC Lq0GAABoZ0CQtbiPCliHMAAAQACAthb/WR8X3TIAAIAyCn6f16KMr9mWJQwAABAAoCOLf9NzgRTX OkAICACAIr2i7Uc5fnZ57LOc9jgJAgAABAAoMgDIWvCrvsTwXVfMU+ADAMou/iPL85FjwR45bN+2 rE9oQBAAACAAQCXFv+61UPE9TPxs2o4tECAMAADkLfZ9Cv1I8Vj1s2uh7xIsuIYBBAEAAAIAFBYA +BT/8c9h6qsuIrWlxzWHEMDWGoAQAABQZOEvmoI/+XNLUezHz9uW0YUJrmFA5lYBBAEAAAIAuBb/ 4lCk65r8x4V//NVIPDaFAD5BACEAAMC36DcV0umCX1KFvu57+rkFxXq2UMA3DCAIAABkVucUwFBg +xT/Iit3+mtLhX9TRAaWvjcTIUAg6kECXVoAEAAAAPIEAaqiWXfHX1XsLyget1KPk8/ptpncd6D5 njzGQHHcQeo9pX9eDvgJAgAABADIGwqoCvmarNz5H9y1a9ejnDoA6PEqO1VbtqPWjPcZBIFx/1EU SRiG0ezs7EERkTAMg9nZ2bEgCKLp6ennRGT+4MGD+6anp5+bm5ubnJmZee6pp57+6Ze+9MWHHnjg gX1LRX268E9/tTQ/61oOqIp+UQQCPkHAqm0RBAAAROgCANH2/Xdt8h+kiv/4zv+QiKzbtWvXf3CG AaD3C/+i/54ocnu2QMC27FJoIHNzc2Pz8/N7JyYm9szMzPx8z549O+++++7vfv7zn39aROaXinzV 91bi53R4oOsuIGIejFAUy4jlsRACAAABAGeBAEAXAPgU/4Ek7vyLyLCIjOzateufOcMA0LvFfycX /qbt6Qp9358bjYa0Wq3nxsfHn56YmNj5wx/+8Pt/+Id/+MBSwT+39D35tZB6nA4DdN0ECAIAAAQA KDQACCwhgKrPf3Lwv5ok7v4vBQDf5wwDAAFApxT/tudcWjWYjrPRaEitVpuempravW/fvkc++clP 3vX5z3/+JyIymwoF5paK/vh7squAbgDBLEGAcaBAQgAAIAAAAYBpkL4w9Tg9+n8cAIyIyOiuXbu+ wxkGgN4MAHq1+LcdS3qd5LgDydfCMJR169ZFCwsL+w8ePLjj05/+9G0f//jHf7QUBsylvpKtAtID ChYdBNAaAAAIANDnxb+t8Fd9qQKAAVls/r9ORNbv2rXrfs4yAPRe8V900V7FtnQBgO9YBrr3bwoT Go2GrF+/PhKRsSeeeOKf3vve9/7N17/+9d1LYUD8lWwhsKAIA2xBgM90gmuCAEIAACAAQP8EAL79 /dPFfzIAiFsArN+1a9c3OcsAQABQVfFvKvRtxbrLsaSXdQkV0tavXy+jo6OtvXv37vrSl770Nzfc cMP9SwHAzFIAMJshCNCFAT6BAEEAABAAoA8DANXd/7jpf5gKAJLf4xkAhhMBwDc4ywBA8d9Jxb/p fbjOGGBa33UbIyMjcsghh8jExMTEv//7v//jq171qluXQoBZWdsyIDmzQHKgwJa4dQsgBAAALBd1 gDIfEH1XgHQ4EGoeAwBQSTDhWvyXeQw+r4+NjcnTTz8tMzMz60477bSL9+7de9/Xv/71m0dGRg6R xSB93dLXkCwG7PFXXRYH3g1TX6pWeraWfZJ6vPjE6i6CAIBeKfAIePv8AljdAkD3h0Ly7r/qzn/8 1ZCVMQDiFgD3cpYBoHeK7CKL6nb2+7c9tm2n1Wp5n5vkMqrlNm7cKIceeqiMjY3N/9u//dtXf+u3 futj8/PzUyIyLfoWAaqWAC4DBqq+px/TEgAAegx3aKHMBRSPXQcFDBXBAQAApRX/Wffhegy2fv++ xb/qtSiKZP/+/fLkk09KGIb1M84447efeuqpe++6664rRWS9rLQIGBaRQVndGkDXEsClNYDu//3F H5ZwxQIAAQC6vcpf2/8/HQKoZgjQFf2hJggAAFC4V35MPi0C8rwvn+JfFygkLSwsyK5du2TXrl1y 6KGHDrzmNa950+OPP/7lm2+++XQRGV0KAoZldbeARiIICAxhgEu3AOXfBYQAANAjNSAtuwgALH8I hIZiP5SVPoi1pT8+BmV1F4B/4EwDQO8U/t3Q/D/vQH62dVTruQYLLuvHj4MgkKOOOkpGR0dlbGxM fvzjH//HxRdf/K6f/OQn+2SxW0BywMB5WekakOwOoBskkC4BANCHaAEASYUAuud0g/8Flp8BAOi4 4j/L9vO0HrDNDpBeLooiabVasnPnTtm9e7eMjo7KiSeeeMr999//5b/8y7+8SBZbA8QDBMZdAuKW ADVxbw0ghu9r/j6gJQAAdHnRR5Dbxx++egDA+Dldk/50P8N0C4AhWd0C4MucaQDojYK90+7+52n6 n6ffvm0wP9M2dNtMDiqoWqZer8vmzZslCIJ49oDtr371q6/fs2fPARFJDxQYtwRItgZwGSRQNM+l H9MSAAC6FHdoocwGDI9NX7QAAABUGkpkKf6L2G9ZrRiSLQCSX3Nzc/LEE0/I9PS0bNy4UY477rgT vve9733pHe94x5myMkBgsjVA3BIgPV2gafBe3f/16b8HaAkAAN1a6BHg9vGHr28BkC7oVS0Aaorv jaU/PNbJSguAL3KmAaA3Cu0i/mYo6+5/lkH4fO/eq55z2YZLn3/VcqrjDoJADj/8cDniiCPk4MGD Mj4+Lg8//PA3zzvvvD8VkUlZbA2QHBsgOV1guhVA3OzAZ1wAWgIAQBfjDi28MgOhBQAA9O9/Ah1y 07eIfv9Zin/VuqZz4lP8u77nKIrk2WeflaefflpGR0dldHRUTj755LN++MMf3n3KKaccI4tjA8RT BQ7I6nEBkq0BVP9vu4wLQEsAACAAQI8W+yJrpwPU/TGgGjuAPwoAAM5Fd6ccQ/qOfN7j9xkzwHW5 AwcOyBNPPCEjIyMyOjoqRxxxxKbPf/7z/+8f/dEfnS6ruwQMyEqXgLjFnqr5PyEAABAAAKuK/sBQ /OvmFgYA9FDBnrXW65am/1WMI6Aq9HWhgymcGB8fl8cff1yGhoZkdHRUNmzY0Lz66qs/fOedd16j CQEastISQNd6jxAAAAgA0IfFvsvrLl0BAAC99p9Em2o9nyI8a7//qo5VVfxnCQwmJibkscceWw4B 1q1bF7zsZS+79Gtf+9otom8JkOwO4NIawBYKEAIAAAEAeqDYN93VTxf4pj8UAAB9rKyiu+jtutz9 z1rYuxb7LrMbpH+empqS7du3L4cAw8PDsnnz5l//zne+c/vAwMCGpRAgHhcgDgHqqRBAN+iv6e8A QgAAIABAj4QBgeNrdAEAgD4s2ju5zsvb9N+nG0AR4wLYtq8KDYIgWPXa5OSkPProozI8PCwjIyMy PDwsmzZtOu7b3/723SeeeOLzxd4SIF38i8P/74QAAEAAgB4KAUyvm/4ooAUAAPTDfxgV1nmuhXaW Pvymu/NZuw743Ml3PWZTWBB3B9i+fbuMjIzIyMiIDA0NyYYNGzbeeeednz/77LOPl8VWAMmWAA1R dwdwmSGAEAAACADQxUV/4LicLiTg7j8AEAJkLtzLCARc+9Zn3UfWMQmyrJe826+aRjB+7uDBg/LE E0/E4wHI4OCgjI6ODn74wx++/aKLLjpZ1nYHMIUAtnEATLMCEQIAQAeqcwqQsehX3fVP/8z//QDQ JyFA1YPrqf5/iaLIu1WCyzqmZVRN813Wj59Lf7e9R9U2k9sQEdm3b580m0055phjpNVqxQFB46ab brp1eHj4hjvuuOPfFJucSzxuLYUA0dJj5SEk/u+PH0eJvwWiOASIOmH+RwCAiNACAP7Fv22cALoA AECfhgBlF/1ZlymjFYCpdUGe7go+rQ5Mx7B7927Zt2+frF+/XoaHh2VgYECGhobq11577cevueaa l8pKS4B4TICmrG0J4DpNoPHvBe4GAAABALqj8PdZPihgOwCADpC1YO62Os/Wp77osEE3oF+esQBM zz355JMyNTW1PDNAs9mUwcHB2lVXXfWRt771racuhQDrZLE7QEPWdgdw6RJACAAABADo05CAu/8A 0O//OSTqvCJafucdZT/LslkH/styDC6BQfqxbhvp761WSx599FEJw3B5UMBmsymNRiN8wxve8KHr rrvuN8Q+MCAhAAAQAIDif81/9q4hAQAAPcln5P+84YHrdufm5uSRRx6R4eHh5UEBG42GNBqN8Ior rvjQ9ddff3oiBBhIhQAhIQAAEACAwl/1vO4/fQBAlxexvXjMZfTfL6qAd20VoNtO+is5M0A8HkC9 XpdGoxFu27btA29729vOEH1LAEIAACAAQB8X/0FBywEACBJK2Uae5v+m532nFdT1+bf+h5uaDUDX JcFnLILdu3fL/v37ZWRkZHk8gFqtJvV6Pbzsssv+dCkEWCciQ44hQEgIAAAEAAAAAJWFCkXe/S8z rNAFAa51sGuxb1pu+/btIiIyPDwsQ0ND0mg00iHA6bIyO0AyBKgrQoCAEAAACAAAAAA6KiRoZzDg UrBnGSfAdbyB5Pbn5ubk4YcfluHhYRkeHl4eDyAMQ6nVaskQIN0doE4IAAAEAIAN/6kDADq6GO/0 47eNFeDbMuDAgQPyzDPPyLp161Z1BSAEAAACAAAAgJ4qsnXN5dPbylOT2vru5zlOXeGvmzJQ9dyO HTtkZmZmuRVAs9mUMAx9QoAaIQAAEAAAAACK8q7arkmWmjTrtH9FnQOXrgGtVkseeughGRwcXJ4V oNFoSBAEEgSBSwhQIwQAAAIAAABA8d5Rx5r3PZVZk9qKddVj23PJ10wzHIyNjclTTz0l69atk6Gh IWk2m1Kv1yUMQ1UIkBwYcEBWZgcgBAAAAgAAAIDODg1cR85vV/Gf5TnfLgdPPvnkqq4A8YCAcQ0e hwA33njjGaKeHYAQAAAIAAAAAFBUEJBn+kPTcnFXgKGhIWUrgDgEuOSSS96XCAGGCAEAgAAAAAD0 WCHaCdsqY3tLBWZpx1BV9wTdNl0HDRQR2b9/v+zevXu5K0Cj0VieFSAZAmzdupUQAAAIAAAAADoj jCiroHbdT9ZB+tpxrpK2b98uQRDI0NCQDAwMrAoA4ho8DMNw69at73v7299+OiEAABAAAAAACveO Pr5OqSWzNOmP7+L7tkRIr6PaxszMjDz++OMyNDS0PC1gHAIkz1sYhuEll1zy/ptuuomWAABAAAAA ANB9RX+n1pd5WhrYtpnexk9+8hOZmppaMyCgKgS4+OKL30cIAAAEAAAAoIcL5U4upF2L4uQxlnG8 ZbeCcD1m31YG8YCAg4ODq1oBBEGgawlACAAABAAAAACdpR11o0uTftNrpin9fN5Psh9//LNu33v3 7pVnn31WhoeHZWBgYHlAwOQ2Et/DSy655H0333wzYwIAAAEAAACg4O49nTbOge1cq8YASD9Ofn/4 4YelVqstDwhYr9eXAwBVCHDxxRe/nxAAAAgAAAAAhXshx9Hu46pyGsIoiip9v+n3Njk5KU8++eRy AJBsBZAq/gkBAIAAAAAAoPqQoBMVMZ2h65gFeWYHSG/3iSeekFarJUNDQ9JsNqVerysHBEyHAO94 xzsYEwAACAAAAAAIG8o+BpcQQDc4YPL5ubk5eeyxx2RwcNBlLIBkCPA+QgAAIAAAAABoa4Gcp07M MsNAFcV8lmVdPfXUUzIzM7OmFYApBBARQgAAIAAAAACovugvaj2fqffy1qK+swfE+0yP9u/zXtIt AEQWpwV89NFHV7UCiLsBEAIAAAEAAABA180AUObxqrat69NvKKgL49uq4JlnnpGJiYlVrQCSYYMt BHjXu971m4QAAEAAAAAAUHkxb3q9iNrRdcA+1eum4jwIAu2AfT6tE9LrxHf+da0HoiiSRx99VAYG BmRgYECazeaaGQFMIcDrX//69xICAAABAAAAQE+GDL5BQJnH4UMXQOzatUvGxsaUYwG4hgDvfve7 X04IAAAEAAAAAG0vhMtuGWDalqrJfxGDBKped3mfqjEGHnnkEWk2m6tmBPAMAd733ve+90xCAAAg AAAAALAWq1XUc3mCAJ9C3nU/qsI673tLF/i6pv/Jx7t375axsbHlAQF1MwLoQoAoioLzzz//PbQE AAACAAAA0AcFfC8db5HvTdU3X/e6T7BgOsbkeAIuAwPGYwE0m01pNpurZgRIF/yWlgB/QggAAAQA AACghwr3qmuuLIPvlV3w5x0HoKpzGIcAyVBAte+dO3fK+Pi4DA4OSqPRWJ4RwCcEiKIovPDCC//k 3e9+9+mEAABAAAAAAKAtgru5G4Cu/7/PbAFFdAnwHXMg3mcURbJ9+/Y1YwHoCn5TS4ALL7zw/e98 5zsJAQCAAAAAAPRqAc97yx50uBTprsdl2n6yNUDa008/LdPT08rBAH1DgIsuuogQAAAIAAAAQC8U t93YDaDo9+1byPscQxGBgO/7bbVasn37dhkYGFg1FkC8P98Q4OKLLyYEAAACAAAAACmtSM9SXPs2 vXcNAkwD+vmGBVnPlW25ZIuAHTt2yPz8/JpWAKaC3zQmgCIEGCAEAAACAAAA0AMFfL+9J9fxAFwL eZdgwDeMsIUPyZ8XFhbkxz/+8ZpWAHlDgLe//e2nLoUAw4QAAEAAAAAAuqxwL6rGKuquu2+xnfW4 8vThz3NubFP6JZvq5+kG8eMf/1iCIJBmsyn1el05GKBvCLBt27YP3Hjjjb+xFAAQAgAAAQAAAOjX MKHM7RVRxJu2oWsF4NISwBRqmLabZfuu+5+ampJnnnlmuQVAvV5XDgboGwJcdtllH7zxxhtPrSAE EEIAAAQAAAAAfRgidGINmOXOvMtUg7pWAi6BQbxuEATy+OOPS6PRWNUKoKgQ4KabbnpZySFAQAgA gAAAAACg4KI777z17SjsyzpWl4H/XAtzn234nheX8GHfvn1y8OBBZTeAvCHApZde+iFCAAAgAAAA AKgsUHAZvd9WcJfV99/1XLgGAllaGOzYsUPq9frybACEAADQ+eqcAnT7H2gAgM7/vyCKouXvebdT 9HGVsW2fY49fS74eny/bsuntRlEkYRhKq9VatZ0gCNY8p1ouvU4URdJqtSQMw+XH8TI/+clP5IUv fOHyOADz8/OrPmvVe0leB7rnlt5feOmll35IRN51yy23fN/hFLeWvoeJx0lRouCPHye/L4cAUZkX AgC0GS0AAACAsXDt5mPOO2Vf1edVN3Cg6i69S+sC3Z34PO8zro8nJydl7969ywFAchwA1XFnaQlw ySWX/I+3vvWttAQAAAIAAADQbUV5kbVVN3YDyNL03ud9qwp8l6LfNj2gbl9PP/201Ot160CAWUOA IAhqV1xxBSEAABAAAACAfg0SyiyY23HsWafk8y30s5wD1b7jn5955hkJgmBVAFBiCPDrSwHAECEA ABAAAACADim6y9yOyzazNv1XPV/mFISmn23T9+m6BmQJNnR3/23bmZ6eln379i13A1B1ASgwBPi/ r7322peIyDpCAAAgAAAAAH0QKGS5011EIGAq0rOGCL5dAooMJXymFzRtY/fu3cstAJKtAMoIAd74 xjd+mBAAAAgAAAAACi/6ffvEF3VMplYBLn34ddvQPWdrbaA79iiKZOfOnRKGoXUcAEIAACAAAAAA PVZMt2M7rnfYXbeZpRWAz3s2Hb/PY9u2ixgbwBYkPPfcczI5OakMAAgBAIAAAAAAECh0TJhQVKFv W8alr79rCBFFkXMI4PJzenu2Y41bCcTL/uxnP9MGAGWGANdcc81/JwQAAAIAAADQgUV7O44vayuA IsMB2zHYmu/7hAx53m+WLgpRFMlPf/pTbTeAMkOAq6666iOEAABAAAAAADq8UK+yFUDe6QNdjrmo 92Vqwm8oho0BiKoY9w0FTAMfPvvssxIEwfJAgLVazbnQLyIEeMtb3vJ/EgIAAAEAAAAooXjvlO3o CvU8+87aCiBL+JH1DrxP4GAqvG3hgct7DYJAZmZm5ODBg6umAlRNCVhWCHD11Vd/9Oqrr95CCAAA BAAAAKADQ4Cit1X2vvK2AvCZEtAUbNhG87fd6bet6xuSxI+fffbZNS0AfAr9vCHAW97ylj8jBAAA AgAAANDBQULRXQGKaKbve2x5uhi4DOKXd9+mcCE97Z9uwD/bce/Zs0fCMFweA8A0GwAhAAAQAAAA gC4r3jtlO2Xu23f6vSzL6Jrjm+7Ku/b71y1ra1XgGyDs2bNHREQ7CGCVIcCb3/zmXyMEAAACAAAA 0GEhQBlBQNZR9Is6prx3930LclXx7LpdW8Dh0roiCAKZnJyUqampVS0AbLMBlBUCvPnNb/5/CAEA gAAAAAB0aJBQ5Oj5PoW277aLbrqfdWwBlz77tnEEbO/FdZaBWLobgKqorzIEuOqqq15ECAAABAAA AKDA4r2bj9v1TrtvWJB3sEDX/dqK9yKCDVd79+5dc/c/DMO2hQDXXHONLgSoEwIAIAAAAABoQwjQ jlYAZTXxd92PS/HtE1TougCY7vy7hhC6955e7sCBAxIEwapuAKp1KgwB6hlDgIAQAAABAAAAQAcH Cb4hgG9QUGQrAJ+AwPf9mQptn8LftRtAbP/+/Yt/YDr2/68yBHjjG994SiIEGEyFAGEqBAgJAQAQ AAAAAJRYvBe9LZ99ZS3ui24FoCvm84QdLiP+u8wcYAs45ubm5ODBg6u6AdimA6wqBLj22ms/ZggB 6oQAAAgAAAAAKizcO7UrQJ5WBUVt3ycIcD1HtjAgyzk8cODAmuLfVMRXHQJcfvnl/40QAAABAAAA QI8ECXmLdtfXymjq79oqQHcMphH+dftyWca1II/HAbDd+W9XCHD99df/OSEAAAIAAACADinei96W z76qGu2/jOPT9fPPOhZAlm4JyQCgU1sCEAIAIAAAAADokMK9W7oC+KxvG0TPVLy7BAG+o/n7bMOn FcEvfvGLxT8yNYU/IQAAEAAAAAAUHiRkDQF8ZwUwrecbLJj65eteN0315zM9oM9+dO9jenpaZmZm lLMAEAIQAgAgAAAAABTvlWzLZ3+++/XtOuATVuiOyadAj6JIWdjbAgfXsCDpueeeW9MNgBCAEAAA AQAAACAEKLwYdy2ss+4372CBRbyfLO8p77SDrucoDgDyFPiEAABAAAAAAPo0SCg6BMi7vKmPftZp +bIU+KZ++y7jDqj2aSrGXd5fugUAIQAhAAACAAAA0CfFeyeGAEU02S/jPRQ9cKGuQHYNFlymKUwv c/DgwTX71c0E0GkhwGWXXXYSIQAAAgAAAIAeCAGK3GeeVgAu/e5VxbfPduN+/7pjtk0NaBtIUBc0 xAGA7u5/J4cAN9xwwycJAQAQAAAAAHRICFDUNvJO/ecbTBQ5wGCW2QWyhBtJqoEEVduZmpqS+fn5 VXf+u2lMgBtuuOGT27Zt+68iMkwIAIAAAAAAoE0hQLu25bPPvK0AihyvIG8wkXXbY2Nj1ub/nRwC 3HjjjZ/ctm3bSYQAAAgAAAAA2hwk5KmVshbYvv3lizh+n6LcNHWfKlxwmdLPNbBQjQPgMgZAp4YA ItIgBABAAAAAAFBR4V3VsRTRFUBX4GdpBWAr4rMU6lmO0RQW2FoqjI+PZyrQOzEE2Lp1K90BABAA AAAAtCMEKGNAwLxdAXwChSKK+GR//KKCDZfHtvcTf42PjyuL9m4MAW666aa/IAQAQAAAAADQ5iCh k7oCZC30s7YSKHKsgCLPcxRFMjY2ZgwACAEIAQBUr84pQBV/nAEAkP7/QTVFXbuPJe9x+WxL93oU RWvuvqu26bp+vGyr1ZIoiiQMQ2m1WquWTRa/YRhKFEXSarVWPRf/nHycXF5ElvchIjIxMbH8erxe FEVrjs/2cxHLuLxmem7pPTVuuummvxCR6+66666HNR/rfOJxaykEaOlykkTBHz9Ofl8OAaJO+WUB 0PVoAQAAANpWeBe1jSq7ApTRCkC3nGuTfFUrAlvXAJdtZD1XQRDI1NTUctDgOwZA+mdaAnBHBQAB AAAAQCldAYraVlFhgq341xXxqp99QgfT8di6JURRJBMTE5kHAuyyEGCAEAAAAQAAAIBH4d0tx9Ip rQCqOH8+7zG9bNwNIOsYAF0UAgwTAgAgAAAAAKggBCiqK4DvnfAitlNUKwDV+r6hhqr4ddmPbrm4 BYBrAd6NIcCll156IiEAAAIAAACANgQJVdVH7WoFYCrI00Wt636zTBeoCwuSjycnJzMV8N0WAlx8 8cUnEAIAIAAAAADwKI477Vg6rRVA1mOy3dkval/p92HqAtArIUAURc13vvOdf0UIAIAAAAAAoMIQ oNdaAfiEClmb+xcVIKSn2RNZ3QLAVFD3SgjwO7/zO4QAAAgAAAAAqg4B2r2NLEW5T8Hvuh9Vt4As 4URydH8V1fNxAJBcPwzDng0B3v/+9xMCACAAAAAA6OTiO8928vTtz3rctmDAd7C+POfPtNzU1JS2 uCYEIAQAQAAAAABQ2Gj+RfXhL+O9FBEY+I78b2sNYBjszljI65aZn5+Xubk55Wu9HgK89rWv/WVC AAAEAAAAABWGAFUcS5VjqEFKNgAAIABJREFUD6j62qeL0jLOge2cpLsIxN+npqac7/73Ugjwp3/6 p/+TEAAAAQAAAECXBAlFzwjgcofdtK+sBb5uekCfqQazhhxxNwDd+++jEGCIEAAAAQAAAEAJxbtL Qd1Jx1p0OOEbDricM1PrA936qnEAbEV3j4YA6wgBABAAAAAAVBACVHUsRU4J6DvAn8uI/3lnJvB9 T9PT08ptEQIQAgAgAAAAAOioIKHowQCzjCdQdC3nMzChrbuCTboLgE/hTwhACACAAAAAAFC8l1J8 5z0W3/2UfTy2Yj/La7r3q1s+GQCozhEhACEAAAIAAACAjgkByq6hsjbZ9xkHwKV7gOux+gQHcRcA XfHfjyHAueeee3wqBGgQAgAgAAAAAKiwEHfdd95WAFnu2vuO4K/bR3LwvrLPaRAEa8YAIASImh/+ 8If/OhUCDBICACAAAAAAKKGI76RaqKgB+8rcps/YAGkzMzPadfo9BDjnnHP+D0IAAAQAAAAABRfF RayftxWAaf2iin2X7WbtVpAlQEkGAIQAq0OAj3zkI4QAAAgAAAAAOj1IqPL48hxrusl/cpumoMJW 7LuOJxBFkczOzhICqAOUAUIAAAQAAAAAJRbvRQ0IWPZYAL4FeN7WDXmOx7Qt324A/RgCvPKVrzyO EAAAAQAAAEAJIUAnHXfZ0wbmHfsgbzDgMxBgv4YAH/3oR/+GEAAAAQAAAECJhXiZ0wIWOehglpkD XJbL24rAZfn0OACEAIQAAAgAAAAASinEy9xOkYMSllGLpbepGhPA1M2giEAjy0CAhACEAAAIAAAA ADqmeC+y0M/znG5/Puvrjs9U9Ou2lQ4Z8rYAIAQgBABAAAAAANC2IKHsfvtlBhXpItVUmGc5lvQ2 krMAmMIFQgBCAAAEAAAAAJUUyGXXPy7N/YsYk8BnG0UPDKh6fm5uznoeCAHWhgC33HILswMAIAAA AAAoKzzotPqnrJYJqnVUd//TzflVYwiki9n0tmZmZp3CEEKANd8HCQEAEAAAAAB0edFd1PpF1mq6 4j7PMURRJHNzM9b1CAEIAQAQAAAAAFReCJexPZft5g0eigwi4jAg6z6SYYKqBQAhQKEhQI0QAAAB AAAAQI6i3Fb/tPPOv2076cJaV4xWIT0GACFA9hDgN3/zN/+LIgRoEAIAcFHnFKAdf1ABAFDW/ztZ m7Hn3Wbeffuun7xDH0WRNgRIbzdeNr1OGIbSarWWl0n+nH5NVbAmjycIguV1giCwBgDp9588Ptfv 6WPTPc7ycxHLuLxmem7p++DHPvaxT7/tbW+76tvf/vbTDpdJaykEaOkuo0TBHz9Ofl8OAaKif7EA tAUtAAAAQM+FAEWvV/Sd/jICclsrANfXTIP8ZT0WlwAgvR4tAfQtAf78z//8M2ecccYLhJYAAAgA AAAAqgsWOqEuqmIQQd1sALquBull5+fnCQEKDAE+8YlPfHopBBgmBABAAAAAACjWKyyks67fzhYL qmn/VAWoTzCg4xoAEAK4hQAiMvSJT3zi0y972csIAQAQAAAAAHRyKJGlgHepvbLUZ7oR/11DA5fl XbsBEAL4hQC33nrrZwgBABAAAAAAlFzEV7mPvC0F8vThV4UFfscXeQcAhADeIcCxhAAACAAAAADF eoVFflGFdhHv37X4z9OdwOk9RH5dAAgBCAEAEAAAAAD0VNjgW/gWGW7otlnkOAbJ57O0ACAE8AoB hm+99dbPvPjFLz6GEAAAAQAAAEAXFPtVHb+qKb8paPDtFrBqznvJ3gKAEMAvBPj0pz99GyEAAAIA AABAsd4Dx9hJ78lnvII8LQAIAbxDgM9s2bLl+YQAAAgAAAAA+jRsqOp9RlG0qlVAEAS5WwAQAniF AOs+85nP3E4IAIAAAAAAoEtDgqLGAsi6H1Xx6WphYaGU4yME0L5PQgAABAAAAICim/dR3bHFrxXR BYAQIFMIcNsLX/jCIwkBABAAAAAAEAjk2q7rOABFtgAgBPAKAUbuuOOOzyZCgEFCAIAAAAAAAG0u 3IvuIlDEslmOd9UMAEtjARQ1BgAhQO4QYB0hAEAAAAAAgJyFuGIwtlyFbNnvqcz6LF3ktlqtSj4v QgBCAAAEAAAAAD0dUNjqrOSo/GXtR3XnP1ZGFwBCAP8Q4M4777z9pJNOOoIQACAAAAAAQJsLelut VHQtpRvRv6ixAGJldQEgBPCeInD0c5/73GcJAQACAAAAABRUaOftBlDVcaqCAJ9AwHVKwLJbABAC +IcAxx9//OGEAAABAAAAAMV8hdur6jhcli/ivalCgTLHACAEyBYC3H333XekQoABQgCAAAAAAABt KOazzhhg2laeVgZZ1y17EEBCgGwhQBiG61MhwFAiBKgTAgAEAAAAAPAs5KvcThl3+eMB/eLvWYKJ qroAEAL4hwBf+MIX4u4Aw4kQoEkIABAAAAAA9HVhXtb2uumc6GYUSG8v+XPVLQAIAdxDgFqttuEL X/jCZzdv3nwYIQBAAAAAAIAOKNLbVS/ZCmXTscXPt6MFACGAXwjwxS9+8Q5CAIAAAAAAAG0qWDtx e1mKbl2rAUKAjuoOsPGee+65Y/PmzXQHAAgAAAAAUHZh3WnFf1FjCrSzBQAhgHsIEATBxi9+8Yuf JQQACAAAAADQ5yFG1jqtXWMAEAJkawlACAAQAAAAAKCHi3ufbdn6/KuWaXc3AEIA7+4AtytCAKYI BAgAAAAAKLK7/T1keS+mddIFf6e0AiAEcO4OcMg999xz+6ZNm5IhwCAhAEAAAAAAQHHfxcduusNv Gv3fdRudFgAQAriHAPfee+9thAAAAQAAAACkN1oBlPl+4gKzU7oAEAJ4hwDPIwQAekOdUwD+IAIA oJj/82wFbvx6Gf8/RlHkvV3V8agKQlVRGIahtFqt5f3GPyfXSx9TJwYA6c8ufuzzPf1edY+z/FzE Mi6vmZ5b+v68r3zlK7ede+65v793716X09paCgF0zT6iRMEfP05+Xw4Bok69cIAuRAsAAAAAS3HY T/vWDeJnav5vOs7ka50wFaDP+6YlwOrvtVrteV/96ldvP+ywww4VWgIABAAAAACEBd0fPPjsX9Xv v1vrNUIAewhQr9cPLSEEEEIAgAAAAAAAJRS56SLQtfi3DfJnWi8Igo4bBJAQIHsIcO+9995mCAFC zxAgIAQACAAAAABKK+7gdk58m/z3wvkmBHDqDnDYvffee9v69es3KkKABiEAQAAAAABAUd1Fx6wb DyDLz4QAvRkCfOtb3/osIQBAAAAAAEDx34fHbupa0G2DuRMC2EOAMAwP/+Y3v3n7UggwJPruAAEh AEAAAAAAQIFewDEX/b5sswH4vtaNAQAhgHNLgE3f+MY3PrNu3br1qRCgmQgBaoQAAAEAAAAAOqz4 z1IA91oXAEIAvxCg0Wgc+cADD9y+bt260UQAMEAIABAAAAAAoMKAoMz95hkkkBCg51oCHPXNb37z tnq9PiorYwLoQoCAEAAgAAAAAECHFPq+xb2tJUA3TANICJAvBGg2m0c/+OCDn7aEAGGq8CcEAAgA AAAA0AlhgG5/PlMI9kp9Rgjg1B3g2O9+97t/LSLrNCFATRECmAp/QgCAAAAAAIDiv9uCAEKA/ggB BgYG/ssPfvCDv/EIAVRhQEgIABAAAAAAUKyXUKj7Fr39VPQTAmQKATY/+OCD/zMRAgx6hACSCgGE EAAgAAAAAOib4r8b6pr0OAC9NAYAIYB/CDA0NHT8gw8++FepEKDpEAKEqRDAVvwTAgAEAAAAAMgT HhTVz79X6zFCAKcQ4Je/973vfVJWdwfwDQFcugEQAgAEAAAAAN1ReJum1suzryLrIJ995H0/hAC9 EwIMDw//6ne+851P5AgBQkIAgAAAAAAABRX/URQVFiD0S/FPCOAeAoyMjPzXBx544ONLIcCQ+HcH sIUAQggAEAAAAACggoLXFBgEQSC1Wo0QoM9DgPXr1598//33/5mIjMjqMQEaBYQAASEAQAAAAAAA zwK2jCK4X4MRQoDV3zds2HDKt771rVtSIcAAIQBAAAAAAICKC1jXOonpAAkBsoYAGzdu/LVvfetb HyIEAAgAAAAA0EFFrK6odV2+388fIYA2BPjv99133wdk9RSBhAAAAQAAAADaHQK4LqMKA2gJQAig ep+HHXbYS++77773JUKAgaWvOiEAQAAAAAAAxwK96D79qgLO9XFRx0MI0JMhwGlf/epX37MUAqzL EAIEhAAAAQAAAEBHFH/tqDPK2KdP4GALCggBCAGS34888siXf/WrX32HrO0O4BICBIQAgJs6pwDd 9scHAADd/P9iFEWlbyt+3uf/4SiKtMsnn08uF4ahtFqtVY91r/f73wXJzyt+7PM9fe51j7P8XMQy Lq+ZnouiSI488shX/v3f//38a1/72j/TXaaJx62l4j/5Pb1skPieXD9IbisIgiAq6hcT6HC0AAAA ACih2MsirkFstUgVTf+zvlfTvhkYkJYApudERI499thz/+7v/u56UbcEaMhKK4BCWwIABAAAAAAo rOgrqvhtR/Hv2rRfNyBguijkeiAEMIUAL3jBC179pS996TrRdwcoPASgKwAIAAAAAFBqAVhF8d6u 99IL748QoH0hwHHHHfe6L3zhC29eCgGGZGVgwEbOEEAIAUAAAAAAgLYWx91UKGdthUB9RQjgGgJE USQnnHDCRXfddddVsnqKwKZDCBAYQoCAEAAEAAAAAEABoYRp1P8w5E9PQgC/EODEE0/c+rnPfe73 ZXV3gKaYuwOEhAAAAQAAAEDPFNp5tu/SL9+3z75tMMAoiggACAEyhQAnn3zy5XfcccflSwGA65gA hAAAAQAAAEDvFvcuhb/ttfRypjv6vu+PAIAQIGsI8KIXvej3b7/99m0eIUBACAAQAAAAAPRcEGAb WLDqOiZrgMA1IcriOgxD5fd+CwG2bNly1ac+9amLNSFATdQtALKEAEIIgJ79t8Y2zyx6+j8a3SAp 6X88w8Q/qsnv8VecvDZlcZTWYREZFZENe/bsuYMzDQDoNL5//2T9eyleL7m+6jnVevGXalnV66qf VcvbvlTLt1ot5WPTz6p1Wq3WqvcTF3bJY1VtL7l+rVaTer2+6jgHBgZWbSsIAhkcHFy1zODgoIRh KLVaTQYHB5efq9VqEobh8vLJ54aHh0VEZGBgYHmf7bhOTdeP7nNPf6bJc+9y7eiuhbzLuLxmei4I Avnud7/7F9dee+09IjIhIlMiMi0iMyIyJyILS18tEYkU39Nfonic/B7vm6IJPaHOKQAAAKhOXKgW vWynvB/bMZuCh3Sxn/xZFy6kgwVVoesSdiQfp99DJJEEEsjAwIA0m00ZGRmRZrMpjYGmjAyvk0aj IUNDQzI4OLj8eqPRkIGBARkeHpZms7kcMPie2/Q5jZ9zLZ7jc1Wr1bTnIPnZJG94p38uYhmX10zP RVEkp5122rUf/ehHZ97+9rf/Y3K3ilPYksUbV8nvay5JWbn7Hz9Ofo/Pe0AIAAIAAAAAlBIEuBT/ vsV3p0gX7sliP13k6553aZ1gukttu4O9XFAHgcjSczMzMyIisnfv3tT7WVxM9fkki/ihoaHlgGB0 dFTWrVsnQ0NDMjw8LMPDw7Ju3ToZGRlZfpxsdWAaZNEUAoRhaA1FVAFKEATL57MDQ4DgnHPO+aPZ 2dmZd7/73fcZAgBCAIAAAAAAoPcChDKL//Qd6PR+bM+Zjs23K4IuINCtn37Nts9Vxb+I9vmVgEAk kED5erJQD4JAZmdnlwME1XLpInpoaEhGRkZkw4YNMjo6KqOjo7J+/fpV3zds2KBcN92twhYApAOD ZNHtEgxUHQK0Wq3gNa95zbumpqbmPvjBD95vCADiECDeGSEACAAAAAAA30BAV+TrCv4srRpMTGMj qApc1TKq7XiJFrsImI5J95rqvSeXnZ2dleeee0527dq1Zrl4RoUwDGXjxo1yyCGHyMaNG2Xjxo3y vOc9TzZu3CgbNmyQjRs3Sq1W04YbrmM4JJ9XBQPtCgFe//rXv3d2dnb6lltu+X6ieBfRdwkgBAAB AAAAAPq7oLcVqVmLd5/nsrRisBXxRddpri0bfI/f5b0kLSwsiEggYRjI3r1713RLSI64v2HDBjns sMPksMMOk0MPPXT58SGHHLKqm4GptYXpcTosUL3HEkOAcOvWrf9jfHz85ltvvfWfU8W8EAIABAAA AACZi75uPeb04HG650zPu+7H1CpAtXxZ59fWRSLrfk0hQBXXysr2I1lYsAc7e/bskb179yqn44tD gU2bNsmmTZvk8MMPlyOOOGLNLApRFMnCwsKa8RpU4zcsLCxou1+UEQJEUVR705ve9JHp6enrb7/9 9v+wBADJEEA3xR8hAAgAAAAAUGxR2o4wwOVuf9bi3lYkp58roljWbcPnvZmO36U7g0vYYtpP+ph1 U8+7jqmQfpwusJNjBvzsZz+TZ599Vh5++OE1rQaOOuqoVV+HHnromub/cSiQ/p5+nO5CkB5HoIgQ 4LrrrvvY1NTUtXfdddcjlgAgDgF0rQAIAUAAAAAAgO5Q5F3oLHe48wwK2Inn0TUESBfgpud0AYEp wDAVyzamsQiSLQPi7/v27ZP9+/fLQw89tPz84OCgHHPMMfKCF7xAjj32WDnmmGNk/fr1i9V0ouhP f6mCgWQIoCr6M4YA9Xe84x2fHB8fv+Yf/uEfHicEAAgAAAAA2l5Ud9tx5i36da0B0o+TX7rn2/WZ mEKAZFFtu6PvGwa4DKZoCwZsXTp0Yw+kWw2Mj4/LY489Jo899tiqlgJxIBB/DQwMKMOA+fn5NcFA vFyyVUHOMQGaH/jAB/5qamrq6m984xs7DIU9IQD68/8yrtO+/kMmWPrHK/0VJr7HXzXF9/irvvTV FJEhERkWkVER2bBnz547ONMAgE6T9e+fIgaocxkVXjVivcvrpvV0I+S7TsGnGhk+Xlb1fHKQuOQy ugHkdP3JXfqZ66YCTD6nO1+uo/S7DNDn85rvoIWu3Rxc95P3dyEZyCQDmmazKZs3b5bjjz9efumX fkmOPvro5bv9CwsLMjc3tyoMiL8nWwnYpm9UXevp54IgmP6DP/iDK7///e8/IyITIjIlItMiMrf0 tbBU9MdfUeK76ksUj9NhghACgAAABAAAABAAVBIAuIYCpqLfZ8745LKqEMA0xVzRAYBpfy6BiW8R nzUIyBMG+I514DvNYRHjMaS/hoeH5fjjj1/+OuKII5aL/fn5eZmbm5P5+flVX+kuA3GA5BsCiMjk FVdcccV//ud//iwRAszkCAF0xT8hAAgAQABAAAAAIADwDwBMxXwZAYBLOKALAdJFmWsIoCrabQFA siBsVwDgGwT4FPeuy2YNAbK+vzxhgIhIGIYSBIGEYShhGMphhx0mJ510kpx00kly7LHHLn+2s7Oz a8KAdHcB3bVrCQHGf/d3f/eKJ5988uepEGB2KQRoEQKAAAAEAAQAAAACgI4JAHTrmQIA3WPXwj9+ XVV4uT6fDgp0xb1vCwBVv/HkOvG+dC0aTOc2a2Gfp7D2bcrv230g62tFDiQZf8WBQBAEcsghhyyH AZs3b5YoimRubk7m5uZkdnZ2VQuBdDeB+DN2CQEWFhaeu/DCC3/vqaee2iMik7K2OwAhAAgAQABA AAAAIAAoPgAwPa97XddXXRcAuBS8vuMA2O6um8YBSBfqur77pub+LuFAOmywvS/bZ5G16Xyefvcu oVDewt00G0Oerg2mACD9OBkIhGEoo6Ojcsopp8iWLVvkqKOOWm4VEH8lWwckAyBdKw9FCLD/3HPP /f29e/fuS4UAsyIyTwgAAgAQABAAAAAIALouAFAV+LrnixwI0KULgOnOv2srgPRAcUUFAHkK6jKC AN/C32VbplkHbFM96vaZnplBN8uB6blkq4AwDOXoo4+WLVu2yIte9CIZHByU+fl5ZRiQnk3AIQT4 +VlnnfXGgwcPHlgKAaYVIcBCqvhPhwCtRKFPCAACABAAEAAAAHo1BGhnAGAKBqoMAEwDAWYJAfK0 AFCFAaZWC6risIj+/K7LFjFeQN6BAbPsM892VAV/OmRItxCIg4BGoyEnn3yyvOQlL5HjjjtuOQiY mZlZDgLSXQRs4wTMzc399Mwzz3zjxMTEQVlpCTCTCAGSAwNGhhBAVfQnTwIhAAgAQAAAAAABgPuU cq4BgKpI9A0AdOv5jgFgavZv6gpQxECApmPyGQOg6IHy8g7c53OMRY74b2sVkFwuLuLTy+gCAN2+ VFMLhmEomzZtkpe+9KXya7/2a9JsNmV2dlamp6eVrQJ0AVX8fXJy8plTTz31SlkcFNAlBEh+l1Qg QAgAAgAQABAAAAAIAMoLAFSvZ50JwBQMJF9TFdcu4wDoBgLUjeCvG/RPNQBguh+4awhgClWKLuZ9 l/UZA8A1DDAV70Ve+77Ff/r4VF0K0mHA4OCgvPjFL5ZTTz1VNm7cKHNzczI9Pb2qVUCye4AuBBgf H3/y9NNPf4uIjCdCgNkyQwACABAAoOcDgL179xIAAAB6JgSoOgDQBQFZAgDb4ICud8x9ggBdcZ9e xnXkf92XKUxwmSmhrGsib8sC35kA4gK6G/6+t40pYOpSEASB1Ot1OfHEE+X000+XF7zgBauCgJmZ mTWDBqoGCxwbG3vsjDPO+ENZ2xJgjhAABAAgACAAAAAQABQaALgUkK4BgCo0sPV7zzoegCkEiJfV Ff+qrgCuAYCpO4AuBHC5+5/ls/Ut/vOGBb7jAHTa707WbduCgCAIZPPmzXLmmWfKr/zKr8jc3JxM TU1pg4B0i4D9+/f/6BWveMX1hAAgAAABAAEAAIAAoKMDAFMQYAoDfIp/1xkBTK/rCnPTtICmECBZ /MfNvF1DAN/PIOu1UHS/f5+AoIzfk/Sd+eTPtlYHrmMJ+AYCyfECRESe//znyyte8Qo56aSTloOA 9DgBqukDf/7zn//rq171qpuWAoBxWZkZwCUE0E0NqJoRgBAABAAgAAAAgADAPwCwFfeqol21nmuL ABH/AQFNXQF8BgRM3+03tQ5wGQvA9bMw9WH3LeZ9nvcd6b/Kv+dV+zI121eN9J/lHLm+zzAM5aij jpLzzjtPfvmXf1lmZ2dlcnJyuUXA7OyscrDAnTt3/uC3f/u3/1gWWwJMEAKAAAAEAAQAAAACgMID AFsxpOvnX1QAYCv8s3YDcC3+fccBSLcASA4GaNuPaeyFov4mzjvVXxUzABTx/mx99bOeoyLea9w1 4Pjjj5fzzjtPjj76aJmenl5uEZDsGpAMAnbs2HH/BRdc8AFZ6Q4wLYvdAeaXgoCWIgRQBQCmEICZ AUAAAAIAAAAIAMzr+wQAuqK+yADAZzrAIkKAZKFmu/tvGwjQd+T/Iq+PvE39ywwAdM3zfe/ilxUA +L7veArBU045Rc455xzZsGHDchAwNTW1ataA+Dr50Y9+9I+XXXbZx2WlJcCMrB4TgBAABAAgACAA AAAQAJQfAJiKfFsAYNqez7R5RXYDiLdnGgcgebffpRuAqSVA3ikAy7rusoz2b9quqZ998jXX/viq fvd5fz9civkizkt8vI1GQ1760pfKmWeeKc1mUyYnJ2V6enp5jIB4fICFhQX553/+5/919dVX3yrq lgDpEMDUFYAQAAQAIAAAAIAAwH0AN9/p/kyvuQQAplAg/VoR3QDyzgZgGmDQ1gWgygCgqrveydfT Bb7tZ5fj17UCyDP9YNaiX9UqxhZYDA0NyVlnnSWnnXba8vgA8awByfEBvvOd79x53XXX3akIAeZk cTyABVnbAoAQAAQAIADgTAMACADKDQBcX3OdLrCKbgC6wQCzhgDJsQCS4YNLq4a8IUCWO+muRXze EKDK36GsIYDr74dtFgeffR9zzDFywQUXyJFHHilTU1MyMTGxPD7A/Py8zM3NyVe+8pW/ete73vW/ lkKAqaWv2VQI4DIoICEAOkadUwAAAFCOuCDKc3c0XVj53MXVvZbnTrBuP7oCLH0O0tPHJR+nv+L1 ba+FYSitVmv5exRFy4+r+pxVTeNVswqYzrtuFgLT51hVoa97b+n3rfrZdnymZZLXiU/3Bds+d+7c Kbfeequceuqp8spXvlIajYZMTExIvV6X6elpCYJAzjvvvGumpqamPvCBD/yj6Ef1l6WiP37j4dLP aw4psUz8OPk9fl8BIQAIAAAAAPo8RHApemzL5in00wW8qtBSzRVvKv7TRWS6yNcFA8nX4kI/HQbE IUByvAFTMJPl3Jj6w+sKdN050i2vK7Rdgx6XIj5P6KM7TtVx28IqXTDkepyqz9O07vz8vDzwwAPy 0EMPyfnnny/HHXecNBoNqdfrMjU1JWEYBueff/4fHTx4cPITn/jE/04U77qNxhea7sRHidcJAUAA AAAA0C3FeCdsx2ebukDAVgjalrEVuabiX/XdtxVA8nVVS4D4ed2MCLYCPEvh73vubaGAy4B3vsdk Cw7yhiHpz8cWHPgGKapQyqWVhGqZffv2yW233SZbtmyRV7/61bJhwwap1+tSq9UkDMPgiiuu+OPx 8fGJ22677QeG4j8ZAuhaASSDgCC1rcBh2wABAAAAQDeEBmV0A3DdZpbWAL7Ny5OFna3Y1X1XFfvJ In5NpbV0Zz/dEkBEjF0A0neHVU3zy7gOVOfH1CrCFEyYPh+f60z3Xss4By7XmSkYUZ1Hly4wqpYr qnP2r//6r/LEE0/IhRdeKJs3b06GAOFb3vKWDx04cOD/uueee34k6lYAkUMIoGoBoHqeVgAo73eO 66qv/yBhEEAAQF8rYsAyn3Vsg5i5ru8ytZ/qNdPzroMB2l5PDwAYF+qm6fnSy+mm9zNN/af6Oblt 22wIrp9FnsLYVqz7XB+q4y6yZUlZ23EZK0H3/kyPXb+btpEMj0477TQ5++yzZXp6WiYmJmRyclL2 7t0797a3ve3KBx9enD7gAAAgAElEQVR88CkRGZfFQQHjmQFmxT49YEv0AwEyKCAIAEAAAABApwUA WdazFSGdEAD4FP62ZXUj8NuCAFWhn15WNwtAOkDQhRHtnAqw6MK/iGP2CQ6KmPLP51y4hARFhwHJ oOKYY46RrVu3ytDQkIyPj8vExITs3r17etu2bZfv2LHjp7I4PeCULE4ROLf01RL97ACiCQGYGQAE ACAAAACAAMC9sDFNb2cKAHwKf99WAHEhnizOba0ATIW+KgxIPk7vR7cP1yKw7OvNZ857n+K/qH79 RZyXLNMjuv5+uBb/PtMHprujDA0NyUUXXSTHHXecjI2NycTEhDz99NNj55133qVjY2MHZGWKwBlZ bAUwnwgAXKYIJAQAAQAIAAAAIADwDwB0BY/r665Fvm6fthYAulYAqrBAd9ffFggkQwTT8afHB6jy b2KfICBv4V/V70XW3wmX521daFTLqsIe1XXvckxhGMpZZ50lZ5xxhoyPj8v4+Lg89thj+84+++zL FxYWfiGLLQGmZaUlgC4EUAUATiEAAQAIAEAAAABAlxU7WQs7VcGte15X4Nte9+0KYFvOtRWAqcm+ KQAwfXf5Sp9H3YCBVV5rvsFA3qK/Heu6Fv6uYZlrVwqXO/+2QTFPOukkueCCC2RmZkbGxsbkRz/6 0c5XvepVvy+LrQCSLQHmZaU7gGlMAF0QQAgAAgAQAAAA0O8BgK6Y8RkbwOV1l0DANQDwaQVgGhBQ 19TfFAKYjtF2/ov6G9klWPANBqq8dsvcXxGD/+l+x1wChCzjQcTjAtRqNRkbG5N/+qd/+s/Xve51 N8jioIATstgKIA4Bki0BbF0BbK0BCAFAAAACAAAAujkAcC06bAFAniBAVSS7FPe6dU3FfrJw1xX/ 6WV1zf1VIYBpXIH0sfoUl0UV0ar1TAFBu+7uZ91WnuV8wgDX4t814NFdE7rjOuSQQ+Tyyy+X4eFh ee655+TrX//613/v937vw0sBQDww4EwiANCNCZCeHUBX/BMCgAAABAAAALQrBCgjAHAtPG0D/ZkK fJ9woMjBAF1mCrDNHKDqBmAKFNLbczmHts+hyILc9rNPl4R2/D2fdUYA3y4AWQZGdJ0dQHVNuP5u joyMyLZt22Tjxo3yi1/8Qu6+++6/vf766z8riy0B4jEBZmWxK0AyAEiPCSDiOTMAAQDyqHMKAAAA yhUXSUVMn2baRvI1332plk/O2W7bluv87slzYVs/+XwQBBKG4XJhHD8Ow3C54Fc9VoUA8TaTBWHy Od170R2ja6Gs21Z6/yIitVrNeN6TAUGW48obYiT36bP/9LKm82P6XNLrpZdNfubp55PXevyz6rjS n0nS5OSk3HnnnXLppZfKpk2b5Pzzz798+/btj33qU5/6tqy9wy+JIj7eUXyzrZV4Lr1M/Dj5XYIg CAgBkPn/EK6dvv5jhBYAAABI+S0A0sWmz2u65crqBpAuoIoaDNCnNYDqLr9LM3+XgQBdP4uiPm/T c3l/znuMJumgperfOZ/xGbK2AvDpIqB7rdlsytatW+WII46QHTt2zL/pTW9644MPPvikrAwKmHVm AMYDAAEACAAAACAAyDcdYLpg1xVOZQ4G6Fqwm7oJ+Iz4bwsAXM9/nmujrOK/6L/lyxr/IB0sFB0O +Azu57OOy/HU63XZunWrbNq0SR566KGxl7zkJb8rK4MCxuMBxF0BdN0BIvGbHYAAAAQAIAAAAKBT AwBToZk3ADAV/66tA1TBQJmtAOJiMEurANtAg77HbPpcyyiIs9zRLvoarHJdn5YLtoDAp6++z1gA umvC9fNoNpvLYwLcf//9P3rNa17zVlkZD2BKVsYDmLcEAIwHAAIAdG8AsG/fPgIAAAAhgGMA4Frw uRYwRQQBRbQGSD6vKuDT69mK/CLu/GftDuDz2eftBtAp0/+V8TuVpftFMjhyXdd1tH/dOj7XyNDQ kGzbtk0GBwfl9ttvv/3666//W1lsBRBPDzgra7sC2LoDiOhbAxACgAAABAAAAPR6AKArbkwFfrrI 1q2Tp7jPMyZAvJ5rqwBdqGDbv+6zyFKs+14bRRT/VV2rWdYtaj8+o/3HdC0HTNd/lv3a3uP69evl DW94gxw8eDC68sor/+Dee+99SFa6AkxJCeMBEACAAAAEAAAAdHAAYCr+sgYApuLfVKjrvhdxt7+o QQLzNvc3tQbIU/y7XANZwoCiiv8qCv+8x+OzH1sIoNpuMhjI2/ffpTtIEARy9NFHy+tf/3p56KGH Dm7ZsuX1IjImi90BpmVxPIBZWdsKwNQdQFf8EwLAG9MAAgAASDHT5pV5HLpp+kzP+WxLtYyu6Emv b5viTrdtVfFkk57eL3k8qi/da7ZzoJuuLvlYd7y6c2M6R7ZpCH3Oke+yrsetWjbP8bhcK8n9qJa1 hQq1Wm1NGKD6HbFNDen6uysisnv3brnvvvvknHPOWX/PPfe854ILLvgTWdv3Py7gkzfhRFZPCZie DnBV0Q8QAAAAAPRxYOFa2KuKn3TxZyoGVfOr60IDXQGsO64sc9qn10sX/aoQwFREqn52nffeVsCb ApOsxb9ryFJEYJCl8NddQ6bgyFToJ5fVbTddyEdRpAwDVJ+Hbd8un8Ejjzwihx9+uJx11lmnXXnl lVtuu+22/09WZgGI7/7Xlgr6cGm1lqboTxf+QeL1aOk9BLQCgNP/HVwnff2HA10AAACwFFJlLl91 NwDXwf/Sx5Klmb/rukVNLeg65aGpK4Du3FfRPL+IAfPafZ1nXc5nakzfJvougwCaBhfM+nspstha 5XWve53MzMxMnHjiiRfIYjeAuCvAtKinBlSNB2DqCkA3AHihBQAAAEBFyug24NMNwKV7gG27yQJH 93P8nMvd/zzdAVTHG6+req/p1gCqQtB0p9r2nmzN2XXL2tZVveZzflzOuWkdW4sH1+26XifJz8mn e4ktqEm3DEgHA7VaTbm9ZNcB3XWh87WvfU22bdu27stf/vK7X/e6171PVgYAnJe1g/4l7+zrugJI YrlVj2kFAAIAAACAPgsUfIv/9GNTUafrJuDTV9rWnSBLCGAq9k1dHmzFvcvrrgW67Vy5FtKuxbhv we8bMOQdA8DlczeFM6bPQ9enX9V1QNUFJn1sLte3rvXAzMyM3HfffXLWWWedfvbZZx9/3333bZfV MwHEd/jD5OZE3xVAFQQkAwHA/O8lIVFf/9FAFwAAABwKqCLXcW3CnLcbQPo112bwLlMH6p6zve7y mss+XfevO6emqeB8P6e8z7mMLF/UtVrl70jeLg2uU/W5fo6qriIu62T5nFSh3G/8xm9IFEU/ffGL X3yFLM4KEE8NOLMUBqQHCXTtCsCMAPAScgoAAACqk2WQuzzbNA1e53OHXbWu68B46XVU6yafM/2c /ArDUPlY9XNyO2EYLn+pfk4+l35sW973ueTP6WV129Ctl14m75fLZ2j6bHTH5npefLalWs62HdVn 63KOsxzHv/zLv8jmzZuPuuWWW35HRAZl8cZZQxZvosU32FQzAqS7AqQ/GNXsAYD+32ECor7+A4QW AAAApJQ9EGB6Hdc7nabnfVsBmAYDNLUK8BlYr4g7/b7Hn+W96c5rlvngi2wZ4HONFfn3vMu2yvwd 8b3b79tyIO96ed7rEUccIVu2bJk67rjjzpfFVgDjstIKIDkgYCSruwfQCgCFYQwAAACAHMoY2M+0 3Sz7M/XXt00BmHw+vZ7Lz/FzLn3iXafXMw1maOrzr3pvpkH5XKbtM50j1bouy9mOzWXdrAW6y1SD RUwB6LKs6RpzGSfAVPjbAgDXc+8TDvz85z+XmZmZob/927+9+g1veMNfydpZAJJFfigrYwGYBgSM n2MsABAAAAAAdFNokCdM0BXCvsWy7bWsQYBpBH3dMq5zxfsW/6b3bSt0XWZScBk40aewt+3DVqC6 XDtFF/2m9+c68J/teF0HcdT9XpgCAFNQYfocbeHAD37wAznzzDNfU6vVPruwsDArqwcETIYA6Ra6 IqsHBIw0YUB8TMwIAAIAAACArMV5J+/PZRtFtQLIEwRkCQF0RaZrEGALBmzvy1bY2grXIor+Iqft 8yniXe7c+4YJthYRWWcFsK1nK8zTMwiorklbUOEy9eXs7Kz89Kc/bd51111/eNFFF/2ZiMQhQE1W mvsHmgAgXfyrWgEABAAAAAC9FEa4Pm+bJlBXHNteyxMEmIrgPCGAz3v1bR2h277v1H22afqqKvpd wiLf0CVLmODSTcTlbr9P+KVaRzdtoE8g4lL8x68/8sgj8vKXv/w3a7XarQsLCzNLIUByFgBVK4Bk kW9qBUAQAAIAAACAbi/ui96X6Q69rr982UGArQhUHYcuCHAt6G0hgOoc+XxWPkW6T1GbZfk8YYFL IOOyL5cxIrKGTrbjsDXbV93p123TNYTQtT7YuXPn4Oc+97krt27d+heyMghg3BUgHow7Ev2sANZW AHQDAAEAAABAhcV8meu7FLS+QYDtLrquKb1r4W9qUm0rsFwKVVuffdM5MPXrdwkJXIr+IsOCIor6 vNvN0mLBpyWA7/gQquvSp2DXXdNhGDoPNqjbZ/pc7dixQ17ykpecJSJ/LSIDiQBgXha7A6RbAESK xyK0AgABAAAAAOGCS8HrUtzbCiXfwl+1vs9Afy6FrcuddtdWDroQIEvR77JeEdPNFRkWFLEdl/7/ LgW/awGuuuNu24+ppYHt8zeFEaZr+sCBA6Mf/OAHz/njP/7jfxCRhix2BYjHAqAVAMr5P4Xroa// oFANMBL/YxN/j79qiu/xV33pqykiQyIyLCKjIrJh3759d3CmAQDdqMy5zlXr+cxDb9qvacCz5Guq 7y7Pua6Tfs1lm3mPz+dcmt6X6Zy7fM6mae6KWL7qa7vs7Znev8uUe64j+Lss63Msrr+PusCjXq/L CSecsHvLli1XisiYiIyLyKSsDAyYnCIwOT5A+nGUCASi1M9CAIAkWgAAAAAUoB3dAFy35TI9nssd UZftpYscW5Nu2111lybdtgHYfGYMKOtacJnSz7frQFH98vMW9lm3Z/p8XFqHuHRNsS1rCwBcRv43 HV/8s2rGglarJa1W64hTTz316O9973tPyMpNtbgbQEvWtgJQtQgQock/XP99IhDq6z9UaAEAAEDO 4ifvOsn1bIWIT1Flez7dUiDLHXvTdk0/27abt5VCnju7rusUeT1U3QKg6n1luZZ9xkvw+cx8fsds MwKYrjfT8STDgKGhIRkZGfn+2Wef/T4ROSgiEyIyJSszA6haAaRnC0g+TrcGiI+Dog8iQgsAAAAA pTLuDJexf9fBAF36/ccFi+sde9OUeuliKb0Nl9Hh069nGRgv69R9VX+GtmPTtSgooih3Hegvz3kw fcaud+d127CNG5B1UEHV1ICmGSdsYzyozsvMzIw8//nPP0EWxwBoLNVn8Q235M259KCAyb7+6R0z GCAIAAAAADo1NMg6gn+e43CZLs+lqb+uG4Gt8HIdBDDLTAGu58p10MCsn4NvaOHSTaDIa9Wl4C9q v66hj2uTettAf6bt+oQS6QBAFZ6Yin+X8zc/N3/I1q1bT7jrrrv+XVZ3A4jv/AeGL6HIh9fvPq1B +vqPFLoAAADgUCCWvY6uuNAVIi77dOkK4NIE39Z1wLRN1y4FLk33szb5d3nN99zmfa3sa8mnePdp al/m71WWpvm2dX3fm+64fH8n/cY6EKmFdRkaHvr+ueee+37x7waQ7gogsro7AAMBYhVaAAAAABgK KN+/m4vuOmAbkE/3vMuytub7PgMD2tY1PTYVZy7NrLN+Lrr34do8vqgWG2VcS67nyTbYoGtLgSzH pjrPvi1CbE3sTQW7S4uB9Gdgup5127F9FgutBRkdHT1e1nYBSHYDSN/1V7UCUDX5D0QkYjpAEAAA AAB0YNhQZoBg2p/rzAG2QMC32LfNSOBTzBYVBtg+A5+AIG/xbOoWkLf491nPZ1aDvJ+D7rPXhQG6 PvrpY7d1U9HtxzbGgO36djqnQXDoCSecsHH79u2TsrobgK74Vxb6/EsK6+8dQVBf/6FReheA/fv3 38GZBgB0s7xN+rOs49tE2vS8qglzel+2ZvJ5ugS4rOczC4DqfWZp5u8yd7xvt4AyZgjwXU9VuBa5 jyLeu89x2AZyNH128bqun6tte6YZAHy2pXpPzYEB2btnz91XXHHFZ0RkTBa7AUzL6m4ALXGbEUBk bXcAugFARGgBAAAAYC2ouv3vZtt7cJkhwGUwQN32XGYBSL7uWxQW1UIg68wLpuMwdRHIUji7DhSY 55yYBsTT7b+IFgG6baqa6me5g2/6TGyDH6aDBF1rFZfzqXpufm5ejj76mF+VlW4AdTF3A9ANBhiI vjsAQAAAAADQaYV61ibqWcYCcJ3Oz1TEu0w7qCqobMfg2v/ftauA7zksoo+/S/iSpzg2TYtX5HVZ RRBgm/rPdN5cQxnTbASmsEB11992rbh0C0iuNzDQPFJWWtgmi/9Q1s4GoDyFmqKfcQBAAAAAAFBF Md8p+zWFA7ZCV1X0ZA0B8gzkpyumbAOxlfVZudxZdi0EsxbHLneX2xkE+AYbqs/DFiqkQxDdcbpO Rai7ttLb9RmQ0LSv+Odarfa8kZGR4fHx8clUEJDu/y+ytgUAhT0IAAAAALqtmM/bCsB3mz771hX6 pnV1g7apCrIsd/99iy3fsCTLec5b1LuGDq5Fd55i3DcIyFLs695LntYFqmtGF5bougSYWsO4DFbp 0q0g+fzk5GT95ptv/vX3vOc994p9JgBVEJDuArC8K/4VBwEAAABAHwUWebsCuIwH4BIguBZrrs/Z tudTJLerdXRRLRDyFP9ZggKfu98+4YWpf7/qeZep+HyuPdu+XO7821obqF6fm5uTX/3VX/0VEbnP o/hP7pz+/yAAAAAAaFeRlqewy9sKIE9XANvUgLZB/VxbCZju/pcZDvgGAlWEA0UMope18C/iWH2m ENQtryvodcW26x1436DCJRTQ9eN3CSpMGo3GIbJ2Fi7TXX9dCwCAAAAAAKAfgoc8wYJL8e87ir9L iJClKLOtawsTsvZbryIIcOVaXJd9rC4DHbpMYWgrrHUtBVzCLl23AFtrGdf1dMdpGpMgvWyz2Twk Ufwnp+VWhQBeH5cwECAIAAAAAMotxvO2ArC95tsKIEs/ddcm/z4tCZKFlc8MAL5FfzcU0kUU4XkH V8zah98nDHC59nRN7ov4PXNtIRCfS9X1q2v14DIgpMv0lc1mc0Sy9f/XjQNAqwAQAAAAAPR68GBb N2tXgKJCgPS2shTspuLX5e6/rXjOMshdu0KDsot/3XI+A/vZ9uVyh9ylC4BL83zTZ2UaLFC1D5/3 aTvXtVptWNZOAZheyTQdIMU/CAAAAAC6sYA33enP00c9T1eAvCGAqYizFUe2Qr/MAtx3kLt+urZd XstyF9/n7r8pCLBN32c7BtU6WacCTC+X/j2u1+tDiuI/ftwSt+kAKfpBAAAAANDOYr7s/WXtCpB1 +y5jAZgKdpdpBnVFWhF9/4sODYoexb/KaSerCEt8Wxm4DAiY3pepeDdds1mmINS1BMjSSiJ+vPS9 oSj+VcU+QAAAAADQT+FD3jnq80wN6FO0u7YG0BV4tjDBp5Avermyiu+iZwWoMgDwuS5NoZXuZ9tY BKai3PX3wLXbger3xed3T3H+a4bCf9UmxDwoIK0AQAAAAADQKcV7UesWMV2dbzN/WwGUZUC/okbk d5lG0PaazzbKLr7LbHHSTV0WXAbfU92dL+L8mWYeSN69t11rLuc/CALVwH+ieS5d7AeWwp9QAAQA AAAAVRbzeffpMv1YUV0BXAYD1BVJtmkDVUGAS5GUZTrAsgv5PNt1DQF0RWSnBgBFjt6vW841NLJ1 DXA9x6rWBKpQQBVG2LafOvZAzKP/i7gNBEjRDwIAAACAfg4kiggBVAW8S1Fp2o6pNYBrEGAq2Fzv 6ld19z9LEZ5lsLl2FP9VXee2Efldmv6r1rEV6S7TIeYcNFJV6Ot+FtGPCZBsGSAEASAAAAAAqKDo zrOOb6Hush+f8QDS+00X7brCzHVKQFvLAJ/CNW+x3q5p/Hp1n0W3AnBZX3ft+Hy2roMJuoQL6WDC dgxLr5ua+9uCAutMAEEQBFHVTZhAAAAAAEBwUN52sr7u8rwtEHANAUyFkW16Ndvgf753/7MW/+0c H6CbAocqf39Un4lqcEDT+fBt3WIKtVTXr8e2dWMAMBMACAAAAAC6sZgv63h8j89lNHNdca0r6l0G 4bMVQi6DBZZZiLfrMy6rUK8qACjjM4m3abrWfcdMcGnSnzUgMIUCltDANMK/KEIBgAAAAACg14ID W1N/nxDAdzwA0zHojksXFLjMLKALG0xBgGkdXVHaaXf/qyjiyz7uKgIZl+b0Lv35XX8ffbuk2EIB w/qB4rtLCwCCABAAAAAAdGIxX1VXgCzru4YAqsJeV6j7FOF5goAqitssxXCnHVuZx1FmMOI6eKPq OVU3gPQ0flk+V9cm/57n3nb3X7V8eipAZgAAAQAAAECvhw55uwKkQwBTQZNlgMB0AeYzu4Dp7r7q OIu4+6+bgi7r1IPd3Ae/jHChnS0pfH6vTO/TZRpL3bYVz+vu7gcOzwEEAAAAAJ1UOORdL71uGV0B VEW3b5cAXUHvOrWgaxCgKyRd54lvR4Ha6yFAGefW93OwTfPnM61iurVA+np2KfzDMPT5fdc193dt +s/dfxAAAAAA9Ep4UPR2XKcBdA0BVMGBz/R/pj78tvVdwgBdIV5ElwLfJv95py7s1mChqOLf1hLE 5bqwdQVQbT8MQ6drSddSwOX3SlPk+975JwwAAQAAAECvhwe+XQFs/epd+977tgZwLfpMRb3PdvIW +77FqOtn6VPom9brhhCgqFYVeUOELC1jXM+x6Vq1zJTh2//ftCzFPwgAUO0fJgAAUIxXs27ergC2 ZbJ2CVCtowsCVCGBy0CCvtMDurYQ8A0bun3qvk77G9E20J7v8y7hSp5BG12DLYdrLnAMBALHIIBA AAQAAAAAvRYgFBkC6IqUoloDuAQBLl0AfFsGuEwN6FPQuQQIqC74UI32n3VbRR675a6/SxDgsqxu 9H8KfxAAAAAAdEoRX/a+s84MUGZrAFUBbiqS8oYBqsKsiOb8nTKKfa9xDanyfB5lfna2liKG9+dy QFxwIAAAAADo5hCgqIH8TEW7bkT9rMeVtTWA7mfX8QKyhAE+xV+ZxX+eJub9VPy7NKM3Fd66601X pGdtKaD7PNO/G6bj8Nh3cgBA34uHVgAgAAAAAOiVACFLCOC6T5cB0bIGAbbi3zQdoGsY4FN8u3QJ yFrA91NrgSzvM8vgkL6fr+53xGVGCN1+TPtSHbtuQEJFwZ7rI6DgBwEAAABAhxfxRe3fNwSwFT22 ZUyD/Nm241L867ZZZJP+Mkb47/c7/kW+Z5/Px3SdmO7K+1wjrq1EVL+blnOlmvaP5iIgAAAAAOi1 EKCIACFLCOC6b9fWAFUHAbqCTHdX2XW+d5fXqiyAe7noL6LLRnyOwjB0HvnfZzpF31kl0r+LnlM3 UvSDAAAAAIAAoZgQQFcM5ZklIGsQoFs+7zR+PlPFZSk4q9CukezbEQL4vnfHO+rO+ynivep+Nv1u 5dg/IQEIAAAAAHqhiC/qGFxH6vc9dpfZB9JFnGux7jpdn+r5LCPI5+3fn6ewzHrnu19+j1w/p6zB TvycLdjSjV+R5/0Ufb0BBAAAAABdGAIUFSBkGalf95xLkW9bxne7qvVMUwqaiinflgJ5C3KfZbO2 VOhlebt56JaxTYtpas6f5XMrMQjMOiMACAAAAADQSwGCbjtltgZwKbKz3EW1dQkwveY68r/PuXQt XPMW73nW75bxAsp6/7bPoshpHm2tR7KOHwEQAAAAAPRZEV9WCKArRPK0BnBZ1nbHPksXAVM3gDx9 /bMW2C77LKsY7obxAoougIsYqyHr75nLtIS+3RQAAgAAAABCgMKPw2dEf9/j8OkaoCqW8rQK8BkX IGtT7SL7gbscW9FBQTsKdZeCvYr96PZpK9RduyQk1zd1LwAIAAAAAFB5CGArQrO2Bsha0PsU2K4t CspsCZC1qHM5tnYUjO1oRVDUnfEiBuXTDZxpmyZSV+iHYVhq0AEQAAAAAPRgAV9WCGDbtqkYKisI yBsGqIpK3yAhawFZZcGb9fP3Oa4qClaXmRl8t5N3AE7fMSXyDPiY51oCCAAAAAAIAbwLctvYAK5j BhRVoLncyfedhrATCvNO7gfu0p2iCnn3m3dsB911nXV8B5eBLONF+ZcSBAAAAAAoPATQbctW7OsK ozzNr7OEAa7byDKIoW+Bl6fILrpwLmKfebsBFBF0VfF+TQW+z7SVumtN10rAFMABBAAAAAAU76WG ALpixHeQwKzFX54i3XUe+KKah7dbnhkIyn6fVY0fUFRAYQu1VNdOkecxPT4AQAAAAABACFB6CKDb nm0ftjuZWVsFFD0iv2mE924blK2Tj72qY7OFPVmO09bKxHcGDd8wACAAAAAAIASoPARwKYBcC/es rQLKGJSvyHnZq54iz+W9dBKf89qO6f9cz2vWQf9cjiG5DOEACAAAAAAIAdoSAui26bIfUxBQRLP7 PO/TdXrArHeQqyxYfdZpRysBnzv0umWrOu48Tf3zdseg8AcBAAAAACFAx4QA6SLHdzq/osYIMBVM eaeLcwkFTAVgEUVcWYVgp8044HI8vrM2lBVamI413m8Yhl4DWBIEgAAAPf0HDQAA6O4QQLddnyDA NtJ6kX9zZN1e1kK50//e6bSWAi7Fv0/IU+aYAy4DBBZxDfA3MwgAAAAACAFyFRNVtAZw3Z9pmaLu 6GctpnR3m7ttYMCqw4Ki2T6HrMFB3uNxPTd5xrgACAAAAAAIATpmW0UHAUUtV0bRm3dsAJT/OWRZ zvcztH3+tgBb6+4AABkWSURBVAEB0/vRHWcRUw0CBAAAAACEAKW1BsgbBLgUTO0IA2yFn22auF5W dfjh2v+/ilkTVOvarsvk73EQBNb9UvyDAAAAAIAQoCO3V2QQ4LN81WGAab/9VrD5jOrfaSGBz+fl 2k3F9nocTvj8HhACgAAAAACAEKDUQr3MIjlL0Z6lm0CVhWjZ57Gbw4FOPCe+MwkUNWiirYsAAQAI AAAAAFBqCFDWNqsIA3yLrna9R4KA7jsnWcMkCnYQAAAAAKArQoCqirSiwgDfYq3K6e8IA/IXx512 3sqcUQAgAAAAAEClIUCZ260qDOiU9QkDyrs2+uW90ZoABAAAAACoJARoR9HlM6J+3hYCPtspqhBj Wrds58znM+jGoIBrAgQAAAAAaGsI0M4gwBQGuL5e1H6qKvRoGVDM50NrC4AAAAAAoC+KpF4MAtoV BlSpn1oGVPH52FoNEAwABAAAAAA9EQSUWdxUPT5AO8OAdr2nXi9Sq/h8bOezm4IBugeAAAAAAADW gqFXWwMUUeh1Q/HXD03ZqyhuTa0B0ueVYhsEAAAAAOja4qrXWwMUWTh3csFNv/Zyzh1dBAACAAAA gJ4rfqpoat2tzadt3Qg6ST+MFVB2aOWyb99zTGAAAgAAAAB0VCFc5Qj33VQQddNx0y2g3MLbNSCw rVfUcdElAQQAAAAAyFVMVFE4dtI4Ab1YcHVjS4AyroWqp1V0HayRwh0EAAAAAOiYIreqwrxbg4Bu +Aw7tSh3OeYqQ6iy98c4AiAAAAAAQFcUkFUHARRG/X0d2IrmIrTjjrxpn1nHFQAIAAAAAFB4IdbO 4o8woH+vg166vrLMNAAQAAAAAKBtBVM7CkDCAK6Dqq4vH3nOges+aRkAAgAAAAC0tVhqZ/FHGNB5 RXO/fg5VhCEU/iAAAAAAQM8XPhSh3RkG5NWNn2MR7z/5vpMhm2qMgPSyAAEA+I8EAAD0TRBAGMA1 1Wt/+5p+5u9kEAAAAACAos1QIBEKdN81xWcGdI6QUwAAAIB00dapdyfjY+PuaXddTwA6Ay0AAAAA YCzcOvUOrk9hyV1oriUAtAAAAACAQ/HW7XdxaTnQWUEAgPagBQAAAAC8i7duvpNb9GjvFNB+543W AAABAAAAAAgD+vL999Nd8WTxz4wPAAEAAAAACAO69v0j2zVTxjkkVAAIAAAAAEAYgA69Zoos5LkW AQIAAAAAEAaghwICmzwtDLhuQQAAAAAAEAagC6893+I+vS7XLggAAAAAgJwFGYUVOiUYMF2XeVoj xNvKE0gABAAAAADoqWKMQgjdFBK4Xre2bTGYJAgAAAAAQBgAdNl1mw4GuKZBAAAAAAAQBqDPggHG FQABAAAAAOBZSJlQVKEXr2uAAAAAAAAwFFWEAQBAAAAAAIA+CwN8dWp40El3jQlYAAIAAAAAoOtV 0ZKg25uAM60dQAAAAAAA9GwYgHLPF+EBQAAAAAAAoA8whgNAAAAAAACgj8OAvAgTQAAAAAAAAH2A lgUgAAAAAACAPg4DbAgLQAAAFPwPKwAAANDpf9MSBoAAAAAAAAD6LAxwEQcG6fV0zwMEAAAAAADQ hXQFPoU/2iHkFAAAAAAAQAAAAAAAAAAIAAAAAAAAwP/f3r0mNW5EARi9bZxkc9n/XiZgKX/smabp lzACGc6pcmFeMyllqkv3U1sWAAAAAAABAAAAABAAAAAAAAEAAAAAEAAAAAAAAQAAAAAEAAAAAEAA AAAAAAQAAAAAQAAAAAAABAAAAABAAAAAAAAEAAAAAEAAAAAAAAEAAAAAEAAAAAAAAQAAAAA4rLND wJ5SSg4CAADAAdgBAAAAAAIAAAAAIAAAAAAAAgAAAAAgAAAAAAACAAAAACAAAAAAAAIAAAAAIAAA AACAAAAAAAAIAAAAAIAAAAAAAAgAAAAAgAAAAAAACAAAAACAAAAAAAAIAAAAACAAAAAAAAIAAAAA IAAAAAAAAgAAAAAgAAAAAAACAAAAAHCXs0PAnlJKDgIAAMAB2AEAAAAAAgAAAAAgAAAAAAACAAAA ACAAAAAAAAIAAAAAIAAAAAAAAgAAAAAgAAAAAIAAAAAAAAgAAAAAgAAAAAAACAAAAACAAAAAAAAI AAAAAIAAAAAAAAgAAAAAIAAAAAAAAgAAAAAgAAAAAAACAAAAACAAAAAAAAIAAAAAcJezQ8CeUkoO AgAAwAHYAQAAAAACAAAAACAAAAAAAAIAAAAAIAAAAAAAAgAAAAAgAAAAAAACAAAAACAAAAAAgAAA AAAACAAAAACAAAAAAAAIAAAAAIAAAAAAAAgAAAAAgAAAAAAACAAAAAAgAAAAAAACAAAAACAAAAAA AAIAAAAA8IXODgF7Sik5CAAAAAdgBwAAAAAIAAAAAIAAAAAAAAgAAAAAgAAAAAAACAAAAACAAAAA AAAIAAAAAIAAAAAAAAIAAAAAIAAAAAAAAgAAAAAgAAAAAAACAAAAACAAAAAAAAIAAAAAIAAAAACA AAAAAAAIAAAAAIAAAAAAAAgAAAAAgAAAAAAACAAAAACAAAAAAAD0nR0C9pRSchAAAAAOwA4AAAAA EAAAAAAAAQAAAAAQAAAAAAABAAAAABAAAAAAAAEAAAAAEAAAAAAAAQAAAAAEAAAAAEAAAAAAAAQA AAAAQAAAAAAABAAAAABAAAAAAAAEAAAAAEAAAAAAAAEAAAAAEAAAAAAAAQAAAAAQAAAAAAABAAAA ABAAAAAAAAEAAAAAEAAAAADgxzs7BOwppeQgAAAAHIAdAAAAACAAAAAAAAIAAAAAIAAAAAAAAgAA AAAgAAAAAAACAAAAACAAAAAAAAIAAAAACAAAAACAAAAAAAAIAAAAAIAAAAAAAAgAAAAAgAAAAAAA CAAAAACAAAAAAAACAAAAACAAAAAAAAIAAAAAIAAAAAAAAgAAAAAgAAAAAAACAAAAANB3dgjYU0rJ QQAAADgAOwAAAABAAAAAAAAEAAAAAEAAAAAAAAQAAAAAQAAAAAAABAAAAABAAAAAAAAEAAAAABAA AAAAAAEAAAAAEAAAAAAAAQAAAAAQAAAAAAABAAAAABAAAAAAAAEAAAAABAAAAABAAAAAAAAEAAAA AEAAAAAAAAQAAAAAQAAAAAAABAAAAABAAAAAAAABwCEAAAAAAQAAAAD4Bs4OAXtKKTkIAAAAB2AH AAAAAAgAAAAAgAAAAAAACAAAAACAAAAAAAAIAAAAAIAAAAAAAAgAAAAAgAAAAAAAAgAAAAAgAAAA AAACAAAAACAAAAAAAAIAAAAAIAAAAAAAAgAAAAAgAAAAAIAAAAAAAAgAAAAAgAAAAAAACAAAAACA AAAAAAAIAAAAAIAAAAAAAPSdHQL2lFJyEAAAAA7ADgAAAAAQAAAAAAABAAAAABAAAAAAAAEAAAAA EAAAAAAAAQAAAAAQAAAAAAABAAAAAAQAAAAAQAAAAAAABAAAAABAAAAAAAAEAAAAAEAAAAAAAAQA AAAAQAAAAAAAAQAAAAAQAAAAAAABAAAAABAAAAAAAAEAAAAAEAAAAAAAAQAAAAAQAAAAAEAAcAgA AABAAAAAAAAEAAAAAEAAAAAAAAQAAAAA4HOcHQL2lFJyEAAAAA7ADgAAAAAQAAAAAAABAAAAABAA AAAAAAEAAAAAEAAAAAAAAQAAAAAQAAAAAAABAAAAAAQAAAAAQAAAAAAABAAAAABAAAAAAAAEAAAA AEAAAAAAAAQAAAAAQAAAAAAAAQAAAAAQAAAAAAABAAAAABAAAAAAAAEAAAAAEAAAAAAAAQAAAAAQ AAAAAEAAcAgAAABAAAAAAAAEAAAAAEAAAAAAAAQAAAAAQAAAAAAABAAAAABg1tkhYE8pJQcBAADg AOwAAAAAAAEAAAAAEAAAAAAAAQAAAAAQAAAAAAABAAAAABAAAAAAAAEAAAAAEAAAAABAAAAAAAAE AAAAAEAAAAAAAAQAAAAAQAAAAAAABAAAAABAAAAAAAAEAAAAABAAAAAAAAEAAAAAEAAAAAAAAQAA AAAQAAAAAAABAAAAABAAAAAAAAEAAAAABACHAAAAAAQAAAAAQAAAAAAABAAAAABAAAAAAAAEAAAA AEAAAAAAAAQAAAAAQAAAAAAAAQAAAAAQAAAAAIDHcnYI2FNKyUEAAAA4ADsAAAAAQAAAAAAABAAA AABAAAAAAAAEAAAAAEAAAAAAAAQAAAAAQAAAAAAABAAAAAAQAAAAAAABAAAAABAAAAAAAAEAAAAA EAAAAAAAAQAAAAAQAAAAAAABAAAAAAQAAAAAQAAAAAAABAAAAABAAAAAAAAEAAAAAEAAAAAAAAQA AAAAQAAAAAAAAcAhAAAAAAEAAAAAEAAAAAAAAQAAAAAQAAAAAAABAAAAABAAAAAAAAEAAAAAEAAA AABAAAAAAAAEAAAAAEAAAAAAAAQAAAAAQAAAAAAABAAAAABAAAAAAAAEAAAAABAAAAAAgG/q7BCw p5SSgwAAAHAAdgAAAACAAAAAAAAIAAAAAIAAAAAAAAgAAAAAgAAAAAAACAAAAACAAAAAAAAIAAAA ACAAAAAAAAIAAAAAIAAAAAAAAgAAAAAgAAAAAAACAAAAACAAAAAAAAIAAAAACAAAAACAAAAAAAAI AAAAAIAAAAAAAAgAAAAAgAAAAAAACAAAAACAAAAAAAACgEMAAAAAAgAAAAAgAAAAAAACAAAAACAA AAAAAAIAAAAAIAAAAAAAAgAAAAAgAAAAAIAAAAAAAAgAAAAAgAAAAAAACAAAAACAAAAAAAAIAAAA AIAAAAAAAAgAAAAAIAAAAAAAAgAAAAAgAAAAAAACAAAAACAAAAAAAAIAAAAAIAAAAAAAAgAAAAAI AAAAAIAAAAAAAAgAAAAAgAAAAAAACAAAAACAAAAAAAAIAAAAAIAAAAAAAAgAAAAAIAAAAAAAAgAA AAAgAAAAAAACAAAAACAAAAAAAAIAAAAAIAAAAAAAAgAAAAAIAAAAAIAAAAAAAAgAAAAAgAAAAAAA CAAAAACAAAAAAAAIAAAAAIAAAAAAAAIAAAAAIAAAAAAAAgAAAAAgAAAAAAACAAAAACAAAAAAAAIA AAAAIAAAAAAAAgAAAAAIAAAAAIAAAAAAAAgAAAAAgAAAAAAACAAAAACAAAAAAAAIAAAAAIAAAAAA AAIAAAAAIAAAAAAAAgAAAAAgAAAAAAACAAAAACAAAAAAAAIAAAAAIAAAAACAAAAAAAAIAAAAAIAA AAAAAAgAAAAAgAAAAAAACAAAAACAAAAAAAAIAAAAAIAAAAAAAAIAAAAAIAAAAAAAAgAAAAAgAAAA AAACAAAAACAAAAAAAAIAAAAAIAAAAACAAAAAAAAIAAAAAIAAAAAAAAgAAAAAgAAAAAAACAAAAACA AAAAAAAIAAAAACAAAAAAAAIAAAAAIAAAAAAAAgAAAAAgAAAAAAACAAAAACAAAAAAAAIAAAAAIAAA AACAAAAAAAAIAAAAAIAAAAAAAAgAAAAAgAAAAAAACAAAAACAAAAAAAAIAAAAACAAAAAAAAIAAAAA IAAAAAAAAgAAAAAgAAAAAAACAAAAACAAAAAAAAIAAAAACAAAAACAAAAAAAAIAAAAAIAAAAAAAAgA AAAAgAAAAAAACAAAAACAAAAAAAAIAAAAACAAAAAAAAIAAAAAIAAAAAAAAgAAAAAgAAAAAAACAAAA ACAAAAAAAAIAAAAACAAAAACAAAAAAAAIAAAAAIAAAAAAAAgAAAAAgAAAAAAACAAAAACAAAAAAAAC AAAAACAAAAAAAAIAAAAAIAAAAAAAAgAAAAAgAAAAAAACAAAAACAAAAAAAAIAAAAACAAAAACAAAAA AAAIAAAAAIAAAAAAAAgAAAAAgAAAAAAACAAAAACAAAAAAAACAAAAACAAwAarQwAAAM6hEQAAAAAA AQAAAAAQAPhsa/Hx3p8DAACceyMAcPCFqPb11QIEAAC7RIB1cC4OAgCfthiNfg4AANh2rt36notu CAAcYmFaY1woAQCA8bl277zauTYCALsO9zMLlIUJAAA+/lz8PRfYnIsjAPCuRWNtLCRrY2GyCwAA AN5/Dt47px6dmzsHRwDgQyNA+fW18vli8QEAgHedfy+Nc+yZc3MQABguMuvkz7UWlnzwvz0uDi0A AGxyKc6pRy+3nT2PFwcQAGguJDMRoHX1/xYCXhxOAADY5KUY/Efn3/ec2yMAYPivLha91xqVg//l unA9O6QAALDJ8/Vc+lIJAVvuzSUCIADQHfpr36tVx2gsQLeHAAAAAPcHgLVz3t16Pjq/5wc7OwQ0 FoY0sXDUrv7fdgA8R8SvlNK/EfFPRPwdEX9dH0/XR8o+nq6PlH0e2ecp+29K/hcBAHCQ8+baeXHE 66v3+ev5L9nH23nzc0T8FxG/ro/neH0vANv/EQD49MWttuDUIsBLMdDfvna+Pp6u33vKfuZUPE+d 4V8AAADgSOfItfPi/G7+S/H8Eq9fOvuSRYD/4s8ugNHw7+23EQD4sMUsZQtKKr7XWngu1wH+VjOj CABPUd8B8DQY/ms7AIQAAAC+6lw5BsN/GQEuUd8BUEaA5yIQ9Ib/XowAAYC7F7rR4pauC1U+nOd1 s7z6Xz7sAAAA4NHOjyPmdgCUb5m9FBHgdhEtvwngMnEeDgIAH7Kg9XYBjAJAygLAEn+u/J86j9Eu gBAAAAA40PlyxPjq/9J5XDqPXgDohQgQANg8+Neej67+l28HWC5KSyMC1G4EWLsZYBkAxAAAAL5i 6K8FgKgM7EsnBFyivhtgaYSE0Q4Ab/+HAMDmxSw1Bv8U7dc7RRECyqv25bBeLlqp8vun7PMIOwAA ADjm+XN5btwa4Ec7AWpfb513t87Je19HAIDfi0PqfK0WAZZicM/jwdoY3lu7B07Zn397LNHf/i8E AADwlYN/bdhune/ORIAl+jsIyrjQG/5j8DUEAGguFq0Q0HopQG1gLxem1tX/U7y96V8y/AMAcOAI ULtbf21wb70l4EwMGA3+Bn0EABor1rquKaVyu/9o8C+fL8VQvhZfay2WpyIALNng37ryLwAAAHDk ABDRvxnglncGKH9n9I4AoxCw3mYA/+sEACgXh/ImgLUr/1FZ2PIBfaksROW2/97gb/s/AACPEgAi 5t42e+aeAFuG/tY7ABj0EQCYWsRa9wIor/yfGgHg9laAtUWoNvyXN/6LzvAvAgAAcNThPyoD+jIR AfKXA6zZx1YAWBohoPbfKQQgALB5YSsDQKoM/qfs+dN14TpVIkL+sXzd/yX6V/8N/QAAHPGcubUL IGL8zgC1K/6XqN83oBUaVgM/AgD3LGLlDfxqbwO4FIN/+TxfjGoBoHXH/9bgLwAAAHD0AFALATMv B6iFgKXyM6Or/0IAAgDDhSt1FrTSkg34vQgQ2cB/6gSA3uBv2z8AAEcPANEYykcBoPZ8NPzP3Axw 5pweAYAftVr9eSeAWggon+fDfLmQtCLAbfDP/45TJwBEzF39FwIAADjS4D/62IoA0Rnyl8HAH1F/ F4Dq4O8dABAA6C1oqfO8VhjLCFAO9aOr/xFu/AcAwPcKAbMvCei9XWBv+B8O/iAA0Bv6WwN/FIN4 bWGp3dk/YrzdvxcADP8AADxKBBgFgJgMALNX/kdBQAxAAOBdQWB28Shv6Nd7vf9o8Hf1HwCARwoA 62QI+MiHgR8BgMnV6vV9AFp3628tcFEM+Pmd/0+Nn/GafwAAfkIE2HJPgPzrS/b56O3/YuLv9fp/ BAA2L2it3QD55/nV/6Uy7K8x93r/2sAvAgAAcPThfyYCbH3LwNbw76o/AgC7DPtpQwSo/Vlbhv7R lX8hAACAow/+owgQMX+PgJnhXxRgKNkJwu9/DK/fDrD2vDWg927mt2Xgn9nyb/gHAODoEeA9IWA0 +JfPR0O/7f+8YQcAvYVs5r4Aa2NIX6N99b/cQbD1pn8iAAAAjzb896JAb8Cfvcu/twFkyA4AXv+D eL0LoDWQz+wOSBt+rjfYG/YBAHj0KLBlN0DE3Fb/qeHf1X9ydgAws4DVdgJEjN8isPUOAjNX/yO2 vfUgAAAcNQJs3RHw3oHfuTNddgDw9h/F210AvUF9y/P3XO23AwAAgEce/me+tmWwnx7+Xf1HAOCj IsDs8L/lewZ+AAC+exCY3R2wZdg3/CMAsEsE2DrEf8SVflEAAIBHHPZH35vdGTA9+Bv+EQDYIwJs DQFbhnkDPwAA3z0IbAkD6+yfa/hHAOCzQ8A9AcDwDwDAT4oA64bfMfgjAHCYEDAa4LcM90IAAADf efCf/dnun2PwRwDgKDHgnmFeAAAA4KcEgE2/Y+hHAOCRgoChHwAAMWD2lw1tCAA8zD+y+8MAAAB8 ewZ9BAAAAADgbieHAAAAAAQAAAAAQAAAAAAABAAAAABAAAAAAAAEAAAAAEAAAAAAAAQAAAAAQAAA AAAAAQAAAAAQAAAAAAABAAAAABAAAAAAAAEAAAAAEAAAAAAAAQAAAAAQAAAAAEAAAAAAAAQAAAAA QAAAAAAABAAAAABAAAAAAAAEAAAAAEAAAAAAAAQAAAAAEAAAAAAAAQAAAAAQAAAAAIAH8D/HMUQs 0BQqDwAAAABJRU5ErkJggg== " + preserveAspectRatio="none" + height="1365.3333" + width="1365.3333" /> + </g> + <g + inkscape:groupmode="layer" + id="g7632" + inkscape:label="Gmsh-FEM" + style="display:none" + sodipodi:insensitive="true"> + <g + transform="matrix(0.88396032,0,0,0.88396032,79.183481,110.34907)" + id="g7618" + inkscape:label="(null) copy"> + <path + transform="matrix(0.72159828,0,0,0.72159828,196.23555,60.993139)" + inkscape:connector-curvature="0" + id="path7610" + d="M 673.62708,115.51411 98.44067,1213.322 1247.4576,1213.1864 Z" + style="fill:#000005;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter5509)" /> + <path + style="fill:url(#linearGradient7634);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.72159827;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 682.32369,145.79111 0.0591,684.51755 414.01601,107.56086 z" + id="path7612" + inkscape:connector-curvature="0" /> + <path + style="fill:#f7f7f7;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.72159827px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 682.32369,145.79111 267.27016,937.9674 682.38279,830.30866 Z" + id="path7614" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccc" /> + <path + style="fill:url(#linearGradient7590);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.72159827px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 1096.3988,937.86952 -829.12864,0.0982 415.11263,-107.65874 z" + id="path7616" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccc" /> + </g> + <g + style="display:inline" + inkscape:label="FEM text" + id="g7630" + inkscape:groupmode="layer"> + <text + id="text7628" + y="1204.7993" + x="492.69046" + style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:'Bitstream Vera Sans';letter-spacing:0px;word-spacing:0px;display:inline;fill:#261a88;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve"><tspan + style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:192px;font-family:'Lucida Grande';-inkscape-font-specification:'Lucida Grande Semi-Bold';fill:#261a88;fill-opacity:1" + y="1204.7993" + x="492.69046" + id="tspan7626" + sodipodi:role="line">FEM</tspan></text> + </g> + </g> + <g + style="display:none" + inkscape:label="ONELAB" + id="g80" + inkscape:groupmode="layer" + sodipodi:insensitive="true"> + <g + inkscape:label="(null) copy" + id="g72" + transform="matrix(0.88396032,0,0,0.88396032,79.183481,110.34907)"> + <path + style="fill:#000005;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter5509)" + d="M 673.62708,115.51411 98.44067,1213.322 1247.4576,1213.1864 Z" + id="path64" + inkscape:connector-curvature="0" + transform="matrix(0.72159828,0,0,0.72159828,196.23555,60.993139)" /> + <path + inkscape:connector-curvature="0" + id="path66" + d="m 682.32369,145.79111 0.0591,684.51755 414.01601,107.56086 z" + style="fill:url(#linearGradient904);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.72159827;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <path + sodipodi:nodetypes="cccc" + inkscape:connector-curvature="0" + id="path68" + d="M 682.32369,145.79111 267.27016,937.9674 682.38279,830.30866 Z" + style="fill:#f7f7f7;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.72159827px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + sodipodi:nodetypes="cccc" + inkscape:connector-curvature="0" + id="path70" + d="m 1096.3988,937.86952 -829.12864,0.0982 415.11263,-107.65874 z" + style="fill:url(#linearGradient7590);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.72159827px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + <g + inkscape:groupmode="layer" + id="g78" + inkscape:label="ONELAB text" + style="display:inline"> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:'Bitstream Vera Sans';letter-spacing:0px;word-spacing:0px;display:inline;fill:#348228;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="288.69046" + y="1204.7993" + id="text76"><tspan + sodipodi:role="line" + id="tspan74" + x="288.69046" + y="1204.7993" + style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:192px;font-family:'Lucida Grande';-inkscape-font-specification:'Lucida Grande Semi-Bold';fill:#348228;fill-opacity:1">ONELAB</tspan></text> + </g> + </g> + <g + style="display:inline" + inkscape:label="Gmsh" + id="g7502" + inkscape:groupmode="layer" + sodipodi:insensitive="true"> + <g + inkscape:label="(null) copy" + id="g7494" + transform="matrix(0.88396032,0,0,0.88396032,79.183481,110.34907)"> + <path + style="fill:#000005;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter5509)" + d="M 673.62708,115.51411 98.44067,1213.322 1247.4576,1213.1864 Z" + id="path7486" + inkscape:connector-curvature="0" + transform="matrix(0.72159828,0,0,0.72159828,196.23555,60.993139)" /> + <path + inkscape:connector-curvature="0" + id="path7488" + d="m 682.32369,145.79111 0.0591,684.51755 414.01601,107.56086 z" + style="fill:url(#linearGradient7526);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.72159827;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <path + sodipodi:nodetypes="cccc" + inkscape:connector-curvature="0" + id="path7490" + d="M 682.32369,145.79111 267.27016,937.9674 682.38279,830.30866 Z" + style="fill:#f7f7f7;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.72159827px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + sodipodi:nodetypes="cccc" + inkscape:connector-curvature="0" + id="path7492" + d="m 1096.3988,937.86952 -829.12864,0.0982 415.11263,-107.65874 z" + style="fill:url(#linearGradient7590);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.72159827px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + <g + style="display:none" + inkscape:label="CAD text" + id="g7500" + inkscape:groupmode="layer"> + <text + id="text7498" + y="1204.7993" + x="466.69046" + style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:'Bitstream Vera Sans';letter-spacing:0px;word-spacing:0px;display:inline;fill:#565656;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve"><tspan + style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:192px;font-family:'Lucida Grande';-inkscape-font-specification:'Lucida Grande Semi-Bold';fill:#565656;fill-opacity:1" + y="1204.7993" + x="466.69046" + id="tspan7496" + sodipodi:role="line">CAD</tspan></text> + </g> + <g + inkscape:groupmode="layer" + id="g86" + inkscape:label="SOLVER text" + style="display:none"> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:'Bitstream Vera Sans';letter-spacing:0px;word-spacing:0px;display:inline;fill:#565656;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="308.69046" + y="1204.7993" + id="text84"><tspan + sodipodi:role="line" + id="tspan82" + x="308.69046" + y="1204.7993" + style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:192px;font-family:'Lucida Grande';-inkscape-font-specification:'Lucida Grande Semi-Bold';fill:#565656;fill-opacity:1">SOLVER</tspan></text> + </g> + <g + inkscape:groupmode="layer" + id="g7702" + inkscape:label="POST text" + style="display:none"> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:'Bitstream Vera Sans';letter-spacing:0px;word-spacing:0px;display:inline;fill:#565656;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="430.69046" + y="1204.7993" + id="text7700"><tspan + sodipodi:role="line" + id="tspan7698" + x="430.69046" + y="1204.7993" + style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:192px;font-family:'Lucida Grande';-inkscape-font-specification:'Lucida Grande Semi-Bold';fill:#565656;fill-opacity:1">POST</tspan></text> + </g> + <g + inkscape:groupmode="layer" + id="g7604" + inkscape:label="MESH text" + style="display:none"> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:'Bitstream Vera Sans';letter-spacing:0px;word-spacing:0px;display:inline;fill:#565656;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="402.69046" + y="1204.7993" + id="text7602"><tspan + sodipodi:role="line" + id="tspan7600" + x="402.69046" + y="1204.7993" + style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:192px;font-family:'Lucida Grande';-inkscape-font-specification:'Lucida Grande Semi-Bold';fill:#565656;fill-opacity:1">MESH</tspan></text> + </g> + <g + style="display:none" + inkscape:label="Gmsh text" + id="g870" + inkscape:groupmode="layer"> + <text + id="text868" + y="1204.7993" + x="402.69046" + style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:'Bitstream Vera Sans';letter-spacing:0px;word-spacing:0px;display:inline;fill:#565656;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96"><tspan + style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:192px;font-family:'Lucida Grande';-inkscape-font-specification:'Lucida Grande Semi-Bold';fill:#565656;fill-opacity:1" + y="1204.7993" + x="402.69046" + id="tspan866" + sodipodi:role="line">Gmsh</tspan></text> + </g> + </g> +</svg> diff --git a/utils/icons/gmsh.xcf b/utils/icons/gmsh.xcf index 55ed3191733e06cc692fcfac9ac4e1246d1089b0..8180a40db91a7c7c03d6e5ffb95794b8ac5841b3 100644 Binary files a/utils/icons/gmsh.xcf and b/utils/icons/gmsh.xcf differ diff --git a/utils/icons/gmsh_fem_1024x1024.png b/utils/icons/gmsh_fem_1024x1024.png new file mode 100644 index 0000000000000000000000000000000000000000..e9aa192d36386a4179af2fafedaa15a30830dd53 Binary files /dev/null and b/utils/icons/gmsh_fem_1024x1024.png differ diff --git a/utils/icons/gmsh_logo.png b/utils/icons/gmsh_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8794f7391b0e03c5fd0666038d117db1841ec9a5 Binary files /dev/null and b/utils/icons/gmsh_logo.png differ diff --git a/utils/wrappers/gmshpy/gmshGeo.i b/utils/wrappers/gmshpy/gmshGeo.i index 37690f9489d3466707da952caeb1f21849198a39..0d542b0b685ebb32056cacb822897583642b5991 100644 --- a/utils/wrappers/gmshpy/gmshGeo.i +++ b/utils/wrappers/gmshpy/gmshGeo.i @@ -150,14 +150,12 @@ namespace std { { std::vector<MElement*> elements; for (unsigned int i = 0; i < p.size()/3; i++){ - SPoint3 P(p[i * 3], p[i * 3 + 1], p[i * 3 + 2]); - MElement *e = $self->getMeshElementByCoord(P, dim, strict_); - double xyz[3] = {P.x(), P.y(), P.z()}, uvw[3] = {0., 0., 0.}; - e->xyz2uvw(xyz, uvw); + SPoint3 P(p[i * 3], p[i * 3 + 1], p[i * 3 + 2]), U; + MElement *e = $self->getMeshElementByCoord(P, U, dim, strict_); elements.push_back(e); - paramCoord.push_back(uvw[0]); - paramCoord.push_back(uvw[1]); - paramCoord.push_back(uvw[2]); + paramCoord.push_back(U.x()); + paramCoord.push_back(U.y()); + paramCoord.push_back(U.z()); } return elements; } @@ -229,4 +227,3 @@ namespace std { $self->meshAttributes.recombine3D = 1; } } - diff --git a/utils/wrappers/gmshpy/gmshMesh.i b/utils/wrappers/gmshpy/gmshMesh.i index 1661a84a6510fdeae4ce4be22efe16ad33452767..a6e7ade9a4e2956ddebbea5f8d50e3891eeb15b2 100644 --- a/utils/wrappers/gmshpy/gmshMesh.i +++ b/utils/wrappers/gmshpy/gmshMesh.i @@ -24,10 +24,12 @@ #include "Field.h" #include "FieldPython.h" #include "meshMetric.h" +#if defined(HAVE_DOMHEX) #include "simple3D.h" #include "directions3D.h" #include "yamakawa.h" #endif +#endif %} %include std_vector.i @@ -71,7 +73,9 @@ namespace std { } } %include "meshMetric.h" +#if defined(HAVE_DOMHEX) %include "simple3D.h" %include "directions3D.h" %include "yamakawa.h" #endif +#endif