diff --git a/.github/.codecov.yml b/.github/.codecov.yml index 3be680db8..33b8595b3 100644 --- a/.github/.codecov.yml +++ b/.github/.codecov.yml @@ -1,7 +1,14 @@ coverage: - range: 70..80 + range: 80..90 round: up precision: 4 +parsers: + gcov: + branch_detection: + conditional: no + loop: no + method: no + macro: no ignore: - "**/*Parser.cpp" - "Developer" @@ -16,3 +23,5 @@ ignore: - "Toolbox/mumps-src" - "Toolbox/superlu-src" - "Toolbox/superlumt-src" + - "Toolbox/argument.cpp" + - "Toolbox/command.cpp" diff --git a/.github/ISSUE_TEMPLATE/application_execution.md b/.github/ISSUE_TEMPLATE/application_execution.md new file mode 100644 index 000000000..cabf0451e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/application_execution.md @@ -0,0 +1,18 @@ +--- +name: Application Execution +about: Create a report to help us improve +title: "[Portability]" +labels: 'portability' +assignees: '' + +--- + +***The application officially distributed requires AVX support. Please make sure your CPU supports AVX.*** + +***If possible, please try to compile the application locally first to see if it executes.*** + +**Platform** +Please provide platform information, including OS, CPU. + +**Issue** +Please provide a screenshot, etc., that shows the failed execution of the application. diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 337697528..6329ef691 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,8 +1,8 @@ --- -name: Bug report +name: Bug Report about: Create a report to help us improve title: "[BUG]" -labels: '' +labels: 'bug' assignees: '' --- @@ -10,11 +10,11 @@ assignees: '' **Describe the bug** A clear and concise description of what the bug is. -**Expected behavior** -A clear and concise description of the expected result should be. +**Expected behaviour** +A clear and concise description of the expected result should be. It would be even better if there is a theoretical solution or reference. -**To Reproduce** -Please provide a MWE. +**To reproduce** +Please provide a MWE (minimum working example) model. It shall be as simple as possible to help efficiently identify the problem. **Additional context** Add any other context about the problem here. If there are any references, please also provide them. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 8e9fda848..8aa81569d 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -1,8 +1,8 @@ --- -name: Feature request +name: Feature Request about: Suggest an idea for this project title: "[FEATURE]" -labels: '' +labels: 'feature' assignees: '' --- diff --git a/.github/workflows/dev-mkl-vtk.yml b/.github/workflows/dev-mkl-vtk.yml index 246299c39..0766eea72 100644 --- a/.github/workflows/dev-mkl-vtk.yml +++ b/.github/workflows/dev-mkl-vtk.yml @@ -14,8 +14,8 @@ jobs: run: | wget -O- https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB | gpg --dearmor | sudo tee /usr/share/keyrings/oneapi-archive-keyring.gpg > /dev/null echo "deb [signed-by=/usr/share/keyrings/oneapi-archive-keyring.gpg] https://apt.repos.intel.com/oneapi all main" | sudo tee /etc/apt/sources.list.d/oneAPI.list - wget https://github.com/TLCFEM/prebuilds/releases/download/latest/VTK-9.2.2-linux.tar.gz - tar xf VTK-9.2.2-linux.tar.gz + wget https://github.com/TLCFEM/prebuilds/releases/download/latest/VTK-9.2.5-linux.tar.gz + tar xf VTK-9.2.5-linux.tar.gz - name: Golang uses: actions/setup-go@v3 - name: Compile @@ -32,11 +32,11 @@ jobs: ./suanPan-linux-mkl-vtk/bin/suanPan -v - uses: actions/upload-artifact@v3 with: - name: suanPan-2.7.0-1.x86_64.deb - path: suanPan-2.7.0-1.x86_64.deb + name: suanPan-2.8.0-1.x86_64.deb + path: suanPan-2.8.0-1.x86_64.deb fedora-mkl-vtk-dev: runs-on: ubuntu-22.04 - container: fedora:35 + container: fedora:36 steps: - name: Setup run: | @@ -57,8 +57,8 @@ jobs: uses: actions/checkout@v3 - name: Install MKL VTK run: | - wget https://github.com/TLCFEM/prebuilds/releases/download/latest/VTK-9.2.2-linux.tar.gz - tar xf VTK-9.2.2-linux.tar.gz + wget https://github.com/TLCFEM/prebuilds/releases/download/latest/VTK-9.2.5-linux.tar.gz + tar xf VTK-9.2.5-linux.tar.gz - name: Compile run: | source /opt/intel/oneapi/setvars.sh @@ -66,10 +66,10 @@ jobs: make package -j"$(nproc)" - name: Test run: | - dnf install ./suanPan-2.7.0-1.x86_64.rpm -y + dnf install ./suanPan-2.8.0-1.x86_64.rpm -y suanPan -v - name: Upload uses: actions/upload-artifact@v3 with: - name: suanPan-2.7.0-1.x86_64.rpm - path: suanPan-2.7.0-1.x86_64.rpm + name: suanPan-2.8.0-1.x86_64.rpm + path: suanPan-2.8.0-1.x86_64.rpm diff --git a/.github/workflows/dev-vtk.yml b/.github/workflows/dev-vtk.yml index 3d4489c86..114c36108 100644 --- a/.github/workflows/dev-vtk.yml +++ b/.github/workflows/dev-vtk.yml @@ -12,8 +12,8 @@ jobs: uses: actions/checkout@v3 - name: Install VTK run: | - wget https://github.com/TLCFEM/prebuilds/releases/download/latest/VTK-9.2.2-linux.tar.gz - tar xf VTK-9.2.2-linux.tar.gz + wget https://github.com/TLCFEM/prebuilds/releases/download/latest/VTK-9.2.5-linux.tar.gz + tar xf VTK-9.2.5-linux.tar.gz - name: Golang uses: actions/setup-go@v3 - name: Compile @@ -29,8 +29,8 @@ jobs: ./suanPan-linux-openblas-vtk/bin/suanPan -v - uses: actions/upload-artifact@v3 with: - name: suanPan-2.7.0-1.x86_64.deb - path: suanPan-2.7.0-1.x86_64.deb + name: suanPan-2.8.0-1.x86_64.deb + path: suanPan-2.8.0-1.x86_64.deb macos-openblas-vtk-dev: runs-on: macos-11 steps: @@ -38,15 +38,15 @@ jobs: uses: actions/checkout@v3 - name: Install VTK run: | - wget https://github.com/TLCFEM/prebuilds/releases/download/latest/VTK-9.2.2-macos.tar.gz - tar xf VTK-9.2.2-macos.tar.gz + wget https://github.com/TLCFEM/prebuilds/releases/download/latest/VTK-9.2.5-macos.tar.gz + tar xf VTK-9.2.5-macos.tar.gz - name: Golang uses: actions/setup-go@v3 - name: Compile run: | - export CC=$(brew --prefix llvm@14)/bin/clang && export CXX=$(brew --prefix llvm@14)/bin/clang++ && export FC=gfortran-10 + export CC=$(brew --prefix llvm@15)/bin/clang && export CXX=$(brew --prefix llvm@15)/bin/clang++ && export FC=gfortran-11 go build Checker/updater.go - brew install llvm glfw glew libomp + brew install glfw glew libomp cmake -DCMAKE_BUILD_TYPE=Debug -DBUILD_MULTITHREAD=ON -DUSE_HDF5=ON -DUSE_EXTERNAL_VTK=ON -DVTK_DIR=./lib/cmake/vtk-9.2/ -DCMAKE_INSTALL_PREFIX=suanPan-macos-openblas-vtk . make install -j4 - name: Test @@ -60,15 +60,15 @@ jobs: uses: actions/checkout@v3 - name: Install VTK run: | - C:/msys64/usr/bin/wget.exe https://github.com/TLCFEM/prebuilds/releases/download/latest/VTK-9.2.2-win.7z - 7z x VTK-9.2.2-win.7z + C:/msys64/usr/bin/wget.exe https://github.com/TLCFEM/prebuilds/releases/download/latest/VTK-9.2.5-win.7z + 7z x VTK-9.2.5-win.7z - name: Golang uses: actions/setup-go@v3 - name: Compile run: | go build Checker/updater.go cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_MULTITHREAD=ON -DUSE_HDF5=ON -DUSE_EXTERNAL_VTK=ON -DVTK_DIR=D:/a/suanPan/suanPan/lib/cmake/vtk-9.2/ -DCMAKE_INSTALL_PREFIX=suanPan-win-openblas-vtk . - cmake --build . --target INSTALL --config Release + cmake --build . --target INSTALL --config Release -j 4 - name: Pack run: | cp updater.exe suanPan-win-openblas-vtk/bin diff --git a/.github/workflows/dev.yml b/.github/workflows/dev.yml index adc62df8a..12f7efea6 100644 --- a/.github/workflows/dev.yml +++ b/.github/workflows/dev.yml @@ -35,9 +35,10 @@ jobs: uses: actions/setup-go@v3 - name: Compile run: | - export CC=gcc-10 && export CXX=g++-10 && export FC=gfortran-10 + export CC=gcc-11 && export CXX=g++-11 && export FC=gfortran-11 go build Checker/updater.go brew install libomp cmake -DCMAKE_BUILD_TYPE=Debug -DUSE_HDF5=ON . make -j4 + export DYLD_LIBRARY_PATH=Libs/mac/ ./suanPan -v diff --git a/.github/workflows/master-mkl-vtk.yml b/.github/workflows/master-mkl-vtk.yml index 5549ebb6b..c98fa42fc 100644 --- a/.github/workflows/master-mkl-vtk.yml +++ b/.github/workflows/master-mkl-vtk.yml @@ -15,8 +15,8 @@ jobs: echo "SP_TIME=daily-$(date +''%Y%m%d%H'')" >> $GITHUB_ENV wget -O- https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB | gpg --dearmor | sudo tee /usr/share/keyrings/oneapi-archive-keyring.gpg > /dev/null echo "deb [signed-by=/usr/share/keyrings/oneapi-archive-keyring.gpg] https://apt.repos.intel.com/oneapi all main" | sudo tee /etc/apt/sources.list.d/oneAPI.list - wget https://github.com/TLCFEM/prebuilds/releases/download/latest/VTK-9.2.2-linux.tar.gz - tar xf VTK-9.2.2-linux.tar.gz + wget https://github.com/TLCFEM/prebuilds/releases/download/latest/VTK-9.2.5-linux.tar.gz + tar xf VTK-9.2.5-linux.tar.gz - name: Golang uses: actions/setup-go@v3 - name: Compile @@ -32,7 +32,7 @@ jobs: tar czf suanPan-linux-mkl-vtk.tar.gz suanPan-linux-mkl-vtk - name: Test run: | - sudo apt-get install ./suanPan-2.7.0-1.x86_64.deb -y + sudo apt-get install ./suanPan-2.8.0-1.x86_64.deb -y suanPan -v export LD_LIBRARY_PATH=/home/runner/work/suanPan/suanPan/suanPan-linux-mkl-vtk/lib cd suanPan-linux-mkl-vtk/bin @@ -50,14 +50,14 @@ jobs: uses: svenstaro/upload-release-action@v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} - file: suanPan-2.7.0-1.x86_64.deb - asset_name: suanPan-2.7.0-1.x86_64.deb + file: suanPan-2.8.0-1.x86_64.deb + asset_name: suanPan-2.8.0-1.x86_64.deb tag: ${{ env.SP_TIME }} prerelease: true overwrite: true fedora-mkl-vtk: runs-on: ubuntu-22.04 - container: fedora:35 + container: fedora:36 steps: - name: Setup run: | @@ -79,22 +79,22 @@ jobs: uses: actions/checkout@v3 - name: Install MKL VTK run: | - wget https://github.com/TLCFEM/prebuilds/releases/download/latest/VTK-9.2.2-linux.tar.gz - tar xf VTK-9.2.2-linux.tar.gz + wget https://github.com/TLCFEM/prebuilds/releases/download/latest/VTK-9.2.5-linux.tar.gz + tar xf VTK-9.2.5-linux.tar.gz - name: Compile run: | cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_MULTITHREAD=ON -DUSE_HDF5=ON -DUSE_EXTERNAL_VTK=ON -DVTK_DIR=./lib/cmake/vtk-9.2/ -DUSE_MKL=ON -DMKLROOT=/opt/intel/oneapi/mkl/latest/ -DUSE_INTEL_OPENMP=OFF -DLINK_DYNAMIC_MKL=OFF . make package -j"$(nproc)" - name: Test run: | - dnf install ./suanPan-2.7.0-1.x86_64.rpm -y + dnf install ./suanPan-2.8.0-1.x86_64.rpm -y suanPan -v - name: RPM uses: svenstaro/upload-release-action@v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} - file: suanPan-2.7.0-1.x86_64.rpm - asset_name: suanPan-2.7.0-1.x86_64.rpm + file: suanPan-2.8.0-1.x86_64.rpm + asset_name: suanPan-2.8.0-1.x86_64.rpm tag: ${{ env.SP_TIME }} prerelease: true overwrite: true diff --git a/.github/workflows/master-vtk.yml b/.github/workflows/master-vtk.yml index fe4b4de4e..67a006df8 100644 --- a/.github/workflows/master-vtk.yml +++ b/.github/workflows/master-vtk.yml @@ -13,8 +13,8 @@ jobs: - name: Install VTK run: | echo "SP_TIME=daily-$(date +''%Y%m%d%H'')" >> $GITHUB_ENV - wget https://github.com/TLCFEM/prebuilds/releases/download/latest/VTK-9.2.2-linux.tar.gz - tar xf VTK-9.2.2-linux.tar.gz + wget https://github.com/TLCFEM/prebuilds/releases/download/latest/VTK-9.2.5-linux.tar.gz + tar xf VTK-9.2.5-linux.tar.gz - name: Golang uses: actions/setup-go@v3 - name: Compile @@ -46,15 +46,15 @@ jobs: - name: Install VTK run: | echo "SP_TIME=daily-$(date +''%Y%m%d%H'')" >> $GITHUB_ENV - wget https://github.com/TLCFEM/prebuilds/releases/download/latest/VTK-9.2.2-macos.tar.gz - tar xf VTK-9.2.2-macos.tar.gz + wget https://github.com/TLCFEM/prebuilds/releases/download/latest/VTK-9.2.5-macos.tar.gz + tar xf VTK-9.2.5-macos.tar.gz - name: Golang uses: actions/setup-go@v3 - name: Compile run: | - export CC=$(brew --prefix llvm@14)/bin/clang && export CXX=$(brew --prefix llvm@14)/bin/clang++ && export FC=gfortran-10 + export CC=$(brew --prefix llvm@15)/bin/clang && export CXX=$(brew --prefix llvm@15)/bin/clang++ && export FC=gfortran-11 go build Checker/updater.go - brew install llvm glfw glew libomp + brew install glfw glew libomp cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_MULTITHREAD=ON -DUSE_HDF5=ON -DUSE_EXTERNAL_VTK=ON -DVTK_DIR=./lib/cmake/vtk-9.2/ -DCMAKE_INSTALL_PREFIX=suanPan-macos-openblas-vtk . make install -j4 - name: Pack @@ -81,8 +81,8 @@ jobs: - name: Install VTK run: | echo ("SP_TIME=daily-"+(get-date -format "yyyyMMddHH")) >> $env:GITHUB_ENV - C:/msys64/usr/bin/wget.exe https://github.com/TLCFEM/prebuilds/releases/download/latest/VTK-9.2.2-win.7z - 7z x VTK-9.2.2-win.7z + C:/msys64/usr/bin/wget.exe https://github.com/TLCFEM/prebuilds/releases/download/latest/VTK-9.2.5-win.7z + 7z x VTK-9.2.5-win.7z - name: Golang uses: actions/setup-go@v3 - name: Compile diff --git a/.github/workflows/master.yml b/.github/workflows/master.yml index c71b475d8..9123e1913 100644 --- a/.github/workflows/master.yml +++ b/.github/workflows/master.yml @@ -42,7 +42,7 @@ jobs: uses: actions/setup-go@v3 - name: Compile run: | - export CC=gcc-10 && export CXX=g++-10 && export FC=gfortran-10 + export CC=gcc-11 && export CXX=g++-11 && export FC=gfortran-11 go build Checker/updater.go echo "SP_TIME=daily-$(date +''%Y%m%d%H'')" >> $GITHUB_ENV cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_MULTITHREAD=ON -DUSE_HDF5=ON -DCMAKE_INSTALL_PREFIX=suanPan-macos-openblas . diff --git a/.gitignore b/.gitignore index 9ed609e70..e25b172bc 100644 --- a/.gitignore +++ b/.gitignore @@ -20,6 +20,7 @@ $RECYCLE.BIN/ /.vscode/* /build/* /Checker/.idea/* +/Checker/*.exe /cmake-build*/* /Document/* /MSVC/Debug/* diff --git a/CHANGELOG.md b/CHANGELOG.md index c331c24e4..26088fced 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,16 +3,29 @@ ## known issues 1. `MKL` includes outdated `FEAST`, the external names in `FEAST` library are modified to avoid linking error. -2. `OpenBLAS` causes SEGFAULT with version 0.3.15+ when compiled with `DYNAMIC_ARCH` enabled. + +## version 2.8 + +1. better on screen display with the fmt library [#99](https://github.com/TLCFEM/suanPan/pull/99) +2. add command `overview` +3. update `OpenBLAS` to version `0.3.21` +4. add Euler buckling load check for `T2D2` [#104](https://github.com/TLCFEM/suanPan/pull/104) +5. speed-up analysis with visualisation recorder [#102](https://github.com/TLCFEM/suanPan/pull/102) +6. update `VTK` to version `9.2.5` +7. add `Expression` to support custom function definition [#105](https://github.com/TLCFEM/suanPan/pull/105) +8. add `CustomMises1D`, `CustomCC`, `CustomCDP`, `CustomDP`, `CustomJ2` and `CustomHoffman` models ## version 2.7 1. optimise assembling of symmetric global matrices [#79](https://github.com/TLCFEM/suanPan/pull/79) -2. extend `BatheTwoStep` to allow customisation of spectral radius [#81](https://github.com/TLCFEM/suanPan/pull/81) and sub-step size [#82](https://github.com/TLCFEM/suanPan/pull/82) +2. extend `BatheTwoStep` to allow customisation of spectral radius [#81](https://github.com/TLCFEM/suanPan/pull/81) and + sub-step size [#82](https://github.com/TLCFEM/suanPan/pull/82) 3. update `Catch2` to version `2.13.10` 4. update `Armadillo` to version `11.4` 5. update modern `Arpack` [#94](https://github.com/TLCFEM/suanPan/pull/94) -6. add `Tchamwa` [#88](https://github.com/TLCFEM/suanPan/pull/88), `BatheExplicit` [#90](https://github.com/TLCFEM/suanPan/pull/90) and `GeneralisedAlphaExplicit` [#93](https://github.com/TLCFEM/suanPan/pull/93) explicit time integration methods +6. add `Tchamwa` [#88](https://github.com/TLCFEM/suanPan/pull/88), + `BatheExplicit` [#90](https://github.com/TLCFEM/suanPan/pull/90) + and `GeneralisedAlphaExplicit` [#93](https://github.com/TLCFEM/suanPan/pull/93) explicit time integration methods 7. add `OALTS` two-step implicit time integration method [#92](https://github.com/TLCFEM/suanPan/pull/92) 8. add `Sinh1D` and `Tanh1D` nonlinear elastic 1D material 9. add `linear_system` flag to speed up linear system analysis diff --git a/CITATION.cff b/CITATION.cff index cd65e6600..353e860a5 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -28,5 +28,5 @@ keywords: - IGA - Solid Mechanics license: GPL-3.0 -version: '2.6.1' -date-released: '2022-11-09' +version: '2.7' +date-released: '2022-12-21' diff --git a/CMakeLists.txt b/CMakeLists.txt index 97d3088a4..c0bd082f9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -37,6 +37,8 @@ link_directories(${PROJECT_BINARY_DIR}/Libs) add_executable(${PROJECT_NAME} "suanPan.cpp" + "Include/fmt/src/format.cc" + "Include/whereami/whereami.c" "Constraint/CMakeLists.txt" "Database/CMakeLists.txt" "Domain/CMakeLists.txt" @@ -129,6 +131,9 @@ if (COMPILER_IDENTIFIER MATCHES "(linux|mac)") endif () else () target_link_libraries(${PROJECT_NAME} openblas) + if (COMPILER_IDENTIFIER MATCHES "linux") + set(CMAKE_EXE_LINKER_FLAGS "-Wl,-init,gotoblas_init") + endif () endif () elseif (COMPILER_IDENTIFIER MATCHES "win") if (USE_MKL) @@ -181,6 +186,8 @@ if (COMPILER_IDENTIFIER MATCHES "(linux|mac)") elseif (COMPILER_IDENTIFIER MATCHES "mac") set(DECOR "") set(SUFFIX ".dylib") + file(GLOB OPENBLAS_FILES Libs/${SP_EXTERNAL_LIB_PATH}/libopenblas*) + install(PROGRAMS ${OPENBLAS_FILES} DESTINATION lib) endif () install(PROGRAMS Enhancement/suanPan.sh DESTINATION bin) if (BUILD_MULTITHREAD) @@ -304,6 +311,7 @@ endif () message(STATUS "suanPan C_FLAGS: ${CMAKE_C_FLAGS}") message(STATUS "suanPan CXX_FLAGS: ${CMAKE_CXX_FLAGS}") +message(STATUS "suanPan LINK_LIBRARY_FLAG: ${CMAKE_LINK_LIBRARY_FLAG}") if (FORTRAN_STATUS) message(STATUS "suanPan Fortran_FLAGS: ${CMAKE_Fortran_FLAGS}") endif () @@ -345,7 +353,7 @@ if (CMAKE_SYSTEM_NAME MATCHES "Linux") set(CPACK_PACKAGE_ICON ${ROOT}/Resource/suanPan-ua.svg) set(CPACK_PACKAGE_RELEASE 1) set(CPACK_PACKAGE_VENDOR "tlcfem") - set(CPACK_PACKAGE_VERSION "2.7.0") + set(CPACK_PACKAGE_VERSION "2.8.0") set(CPACK_PACKAGE_DESCRIPTION "An Open Source, Parallel and Heterogeneous Finite Element Analysis Framework") set(CPACK_PACKAGE_HOMEPAGE_URL "https://github.com/TLCFEM/suanPan") diff --git a/Constraint/BC/GroupMultiplierBC.cpp b/Constraint/BC/GroupMultiplierBC.cpp index fc663f4f4..b7b380e46 100644 --- a/Constraint/BC/GroupMultiplierBC.cpp +++ b/Constraint/BC/GroupMultiplierBC.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Constraint/BC/GroupMultiplierBC.h b/Constraint/BC/GroupMultiplierBC.h index 9158c2934..090565a56 100644 --- a/Constraint/BC/GroupMultiplierBC.h +++ b/Constraint/BC/GroupMultiplierBC.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Constraint/BC/GroupPenaltyBC.cpp b/Constraint/BC/GroupPenaltyBC.cpp index d33e25844..3c80c230b 100644 --- a/Constraint/BC/GroupPenaltyBC.cpp +++ b/Constraint/BC/GroupPenaltyBC.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Constraint/BC/GroupPenaltyBC.h b/Constraint/BC/GroupPenaltyBC.h index 515162069..d247681d9 100644 --- a/Constraint/BC/GroupPenaltyBC.h +++ b/Constraint/BC/GroupPenaltyBC.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Constraint/BC/MultiplierBC.cpp b/Constraint/BC/MultiplierBC.cpp index 8178f8784..f71352a92 100644 --- a/Constraint/BC/MultiplierBC.cpp +++ b/Constraint/BC/MultiplierBC.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Constraint/BC/MultiplierBC.h b/Constraint/BC/MultiplierBC.h index 298b5ebaf..d3995d351 100644 --- a/Constraint/BC/MultiplierBC.h +++ b/Constraint/BC/MultiplierBC.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Constraint/BC/PenaltyBC.cpp b/Constraint/BC/PenaltyBC.cpp index 45de2edc3..49fe43068 100644 --- a/Constraint/BC/PenaltyBC.cpp +++ b/Constraint/BC/PenaltyBC.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Constraint/BC/PenaltyBC.h b/Constraint/BC/PenaltyBC.h index 54348b84d..bc80a0a58 100644 --- a/Constraint/BC/PenaltyBC.h +++ b/Constraint/BC/PenaltyBC.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Constraint/Constraint.cpp b/Constraint/Constraint.cpp index 54eec59df..1f68ccada 100644 --- a/Constraint/Constraint.cpp +++ b/Constraint/Constraint.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,9 +21,7 @@ double Constraint::multiplier = 1E8; Constraint::Constraint(const unsigned T, const unsigned ST, const unsigned AT, uvec&& N, uvec&& D, const unsigned S) : ConditionalModifier(T, ST, AT, std::forward(N), std::forward(D)) - , num_size(S) { suanpan_debug("Constraint %u ctor() called.\n", get_tag()); } - -Constraint::~Constraint() { suanpan_debug("Constraint %u dtor() called.\n", get_tag()); } + , num_size(S) {} const sp_vec& Constraint::get_resistance() const { return resistance; } diff --git a/Constraint/Constraint.h b/Constraint/Constraint.h index 2de69ce1f..1090559f2 100644 --- a/Constraint/Constraint.h +++ b/Constraint/Constraint.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -64,7 +64,7 @@ class Constraint : public ConditionalModifier { Constraint& operator=(const Constraint&) = delete; // assign forbidden Constraint& operator=(Constraint&&) = delete; // assign forbidden - ~Constraint() override; + ~Constraint() override = default; const sp_vec& get_resistance() const; const sp_mat& get_stiffness() const; diff --git a/Constraint/ConstraintParser.cpp b/Constraint/ConstraintParser.cpp index 37e5229d9..5c3fdbef5 100644 --- a/Constraint/ConstraintParser.cpp +++ b/Constraint/ConstraintParser.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -24,20 +24,20 @@ void new_bc(unique_ptr& return_obj, istringstream& command, const bool penalty, const bool group) { unsigned bc_id; if(!get_input(command, bc_id)) { - suanpan_error("new_bc() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } string dof_id; if(!get_input(command, dof_id)) { - suanpan_error("new_bc() needs a valid DoF identifier.\n"); + suanpan_error("A valid dof identifier is required.\n"); return; } const auto bc_type = suanpan::to_lower(dof_id[0]); if(!is_equal(bc_type, 'p') && !is_equal(bc_type, 'e') && !is_equal(bc_type, 'x') && !is_equal(bc_type, 'y') && !is_equal(bc_type, 'z') && !is_equal(bc_type, '1') && !is_equal(bc_type, '2') && !is_equal(bc_type, '3') && !is_equal(bc_type, '4') && !is_equal(bc_type, '5') && !is_equal(bc_type, '6')) { - suanpan_error("new_bc() needs a valid DoF identifier.\n"); + suanpan_error("A valid dof identifier is required.\n"); return; } @@ -51,13 +51,13 @@ void new_bc(unique_ptr& return_obj, istringstream& command, const bo void new_fixedlength(unique_ptr& return_obj, istringstream& command, const unsigned dof) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_fixedlength() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uword node_i, node_j; if(!get_input(command, node_i) || !get_input(command, node_j)) { - suanpan_error("new_fixedlength() needs two node tags.\n"); + suanpan_error("Two valid nodes are required.\n"); return; } @@ -67,19 +67,19 @@ void new_fixedlength(unique_ptr& return_obj, istringstream& command, void new_minimumgap(unique_ptr& return_obj, istringstream& command, const unsigned dof) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_minimumgap() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uword node_i, node_j; if(!get_input(command, node_i) || !get_input(command, node_j)) { - suanpan_error("new_minimumgap() needs two node tags.\n"); + suanpan_error("Two valid nodes are required.\n"); return; } double gap; if(!get_input(command, gap)) { - suanpan_error("new_minimumgap() needs a valid minimum gap.\n"); + suanpan_error("A valid minimum gap is required.\n"); return; } @@ -89,19 +89,19 @@ void new_minimumgap(unique_ptr& return_obj, istringstream& command, void new_maximumgap(unique_ptr& return_obj, istringstream& command, const unsigned dof) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_maximumgap() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uword node_i, node_j; if(!get_input(command, node_i) || !get_input(command, node_j)) { - suanpan_error("new_maximumgap() needs two node tags.\n"); + suanpan_error("Two valid nodes are required.\n"); return; } double gap; if(!get_input(command, gap)) { - suanpan_error("new_maximumgap() needs a valid minimum gap.\n"); + suanpan_error("A valid minimum gap is required.\n"); return; } @@ -111,23 +111,23 @@ void new_maximumgap(unique_ptr& return_obj, istringstream& command, void new_sleeve(unique_ptr& return_obj, istringstream& command, const unsigned dof) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_sleeve() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uword node_i, node_j; if(!get_input(command, node_i) || !get_input(command, node_j)) { - suanpan_error("new_sleeve() needs two node tags.\n"); + suanpan_error("Two valid nodes are required.\n"); return; } double min_gap, max_gap; if(!get_input(command, min_gap)) { - suanpan_error("new_sleeve() needs a valid minimum gap.\n"); + suanpan_error("A valid minimum gap is required.\n"); return; } if(!get_input(command, max_gap)) { - suanpan_error("new_sleeve() needs a valid maximum gap.\n"); + suanpan_error("A valid maximum gap is required.\n"); return; } @@ -137,19 +137,19 @@ void new_sleeve(unique_ptr& return_obj, istringstream& command, cons void new_embed(unique_ptr& return_obj, istringstream& command, const unsigned dof) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_embed() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } unsigned element_tag; if(!get_input(command, element_tag)) { - suanpan_error("new_embed() needs a valid element tag.\n"); + suanpan_error("A valid element tag is required.\n"); return; } unsigned node_tag; if(!get_input(command, node_tag)) { - suanpan_error("new_embed() needs a valid node tag.\n"); + suanpan_error("A valid node tag is required.\n"); return; } @@ -160,19 +160,19 @@ void new_embed(unique_ptr& return_obj, istringstream& command, const void new_mpc(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_mpc() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } unsigned amplitude; if(!get_input(command, amplitude)) { - suanpan_error("new_mpc() needs a valid amplitude tag.\n"); + suanpan_error("A valid amplitude tag is required.\n"); return; } double magnitude; if(!get_input(command, magnitude)) { - suanpan_error("new_mpc() needs a valid magnitude.\n"); + suanpan_error("A valid magnitude is required.\n"); return; } @@ -193,14 +193,14 @@ void new_mpc(unique_ptr& return_obj, istringstream& command) { void new_nodeline(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_nodeline() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(3); for(auto& I : node_tag) if(!get_input(command, I)) { - suanpan_error("new_nodeline() needs a valid node tag.\n"); + suanpan_error("A valid node tag is required.\n"); return; } @@ -210,14 +210,14 @@ void new_nodeline(unique_ptr& return_obj, istringstream& command) { void new_nodefacet(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_nodefacet() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(4); for(auto& I : node_tag) if(!get_input(command, I)) { - suanpan_error("new_nodefacet() needs a valid node tag.\n"); + suanpan_error("A valid node tag is required.\n"); return; } @@ -227,19 +227,19 @@ void new_nodefacet(unique_ptr& return_obj, istringstream& command) { void new_particlecollision(unique_ptr& return_obj, istringstream& command, const unsigned dim) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_particlecollision() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } auto space = 1.; if(!command.eof() && !get_input(command, space)) { - suanpan_error("new_particlecollision() needs a valid spacing.\n"); + suanpan_error("A valid spacing is required.\n"); return; } auto alpha = 1.; if(!command.eof() && !get_input(command, alpha)) { - suanpan_error("new_particlecollision() needs a valid multiplier.\n"); + suanpan_error("A valid multiplier is required.\n"); return; } @@ -249,19 +249,19 @@ void new_particlecollision(unique_ptr& return_obj, istringstream& co void new_ljpotential(unique_ptr& return_obj, istringstream& command, const unsigned) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_particlecollision() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } auto space = 1.; if(!command.eof() && !get_input(command, space)) { - suanpan_error("new_particlecollision() needs a valid spacing.\n"); + suanpan_error("A valid spacing is required.\n"); return; } auto alpha = 1.; if(!command.eof() && !get_input(command, alpha)) { - suanpan_error("new_particlecollision() needs a valid multiplier.\n"); + suanpan_error("A valid multiplier is required.\n"); return; } @@ -271,19 +271,19 @@ void new_ljpotential(unique_ptr& return_obj, istringstream& command, void new_linearspring(unique_ptr& return_obj, istringstream& command, const unsigned) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_linearspring() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } auto space = 1.; if(!command.eof() && !get_input(command, space)) { - suanpan_error("new_linearspring() needs a valid spacing.\n"); + suanpan_error("A valid spacing is required.\n"); return; } auto alpha = 1.; if(!command.eof() && !get_input(command, alpha)) { - suanpan_error("new_linearspring() needs a valid multiplier.\n"); + suanpan_error("A valid multiplier is required.\n"); return; } @@ -293,7 +293,7 @@ void new_linearspring(unique_ptr& return_obj, istringstream& command void new_rigidwall(unique_ptr& return_obj, istringstream& command, const bool finite, const bool penalty) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_rigidwall() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } @@ -357,14 +357,14 @@ void new_rigidwall(unique_ptr& return_obj, istringstream& command, c else return_obj = make_unique(tag, 0, 0, vec{p[0], p[1], p[2]}, vec{p[3], p[4], p[5]}, vec{p[6], p[7], p[8]}, p[9]); break; default: - suanpan_error("new_rigidwall() requires valid number of parameters.\n"); + suanpan_error("A valid number of parameters is required.\n"); } } void new_restitutionwall(unique_ptr& return_obj, istringstream& command, const bool finite) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_restitutionwall() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } @@ -414,33 +414,33 @@ void new_restitutionwall(unique_ptr& return_obj, istringstream& comm return_obj = make_unique(tag, 0, 0, vec{p[0], p[1], p[2]}, vec{p[3], p[4], p[5]}, vec{p[6], p[7], p[8]}, p[9], p[10]); break; default: - suanpan_error("new_restitutionwall() requires valid number of parameters.\n"); + suanpan_error("A valid number of parameters is required.\n"); } } int create_new_criterion(const shared_ptr& domain, istringstream& command) { const auto& step_tag = domain->get_current_step_tag(); if(0 == step_tag) { - suanpan_error("create_new_criterion() needs a valid step.\n"); + suanpan_error("A valid step is required.\n"); return SUANPAN_SUCCESS; } string criterion_type; if(!get_input(command, criterion_type)) { - suanpan_error("create_new_criterion() need a criterion type.\n"); + suanpan_error("A valid criterion type is required.\n"); return SUANPAN_SUCCESS; } unsigned tag; if(!get_input(command, tag)) { - suanpan_error("create_new_criterion() requires a tag.\n"); + suanpan_error("A valid tag is required.\n"); return SUANPAN_SUCCESS; } if(is_equal(criterion_type.substr(0, 5), "Logic")) { unsigned tag_a, tag_b; if(!get_input(command, tag_a) || !get_input(command, tag_b)) { - suanpan_error("create_new_criterion() requires a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return SUANPAN_SUCCESS; } @@ -453,37 +453,37 @@ int create_new_criterion(const shared_ptr& domain, istringstream& co if(is_equal(criterion_type, "StrainEnergyEvolution")) { unsigned incre_level, final_level; if(!get_input(command, incre_level)) { - suanpan_error("create_new_criterion() requires a valid level.\n"); + suanpan_error("A valid level is required.\n"); return SUANPAN_SUCCESS; } if(!get_input(command, final_level)) { - suanpan_error("create_new_criterion() requires a valid level.\n"); + suanpan_error("A valid level is required.\n"); return SUANPAN_SUCCESS; } auto weight = 1.; if(!command.eof() && !get_input(command, weight)) { - suanpan_error("create_new_criterion() requires a valid weight of central element.\n"); + suanpan_error("A valid weight of central element is required.\n"); return SUANPAN_SUCCESS; } auto iteration = 2; if(!command.eof() && !get_input(command, iteration)) { - suanpan_error("create_new_criterion() requires a valid number of iteration.\n"); + suanpan_error("A valid number of iteration is required.\n"); return SUANPAN_SUCCESS; } auto reactivation = 10; if(!command.eof() && !get_input(command, reactivation)) { - suanpan_error("create_new_criterion() requires a valid number of reactivation ratio.\n"); + suanpan_error("A valid number of reactivation ratio is required.\n"); return SUANPAN_SUCCESS; } auto propagation = .5; if(!command.eof() && !get_input(command, propagation)) { - suanpan_error("create_new_criterion() requires a valid propagation factor.\n"); + suanpan_error("A valid propagation factor is required.\n"); return SUANPAN_SUCCESS; } auto tolerance = 1E-5; if(!command.eof() && !get_input(command, tolerance)) { - suanpan_error("create_new_criterion() requires a valid tolerance.\n"); + suanpan_error("A valid tolerance is required.\n"); return SUANPAN_SUCCESS; } @@ -496,11 +496,11 @@ int create_new_criterion(const shared_ptr& domain, istringstream& co string type; double limit; if(!get_input(command, type)) { - suanpan_error("create_new_criterion() requires a valid type.\n"); + suanpan_error("A valid type is required.\n"); return SUANPAN_SUCCESS; } if(!get_input(command, limit)) { - suanpan_error("create_new_criterion() requires a valid limit.\n"); + suanpan_error("A valid limit is required.\n"); return SUANPAN_SUCCESS; } @@ -511,19 +511,19 @@ int create_new_criterion(const shared_ptr& domain, istringstream& co unsigned node; if(!get_input(command, node)) { - suanpan_error("create_new_criterion() requires a node.\n"); + suanpan_error("A valid node tag is required.\n"); return SUANPAN_SUCCESS; } unsigned dof; if(!get_input(command, dof)) { - suanpan_error("create_new_criterion() requires a dof.\n"); + suanpan_error("A valid dof identifier is required.\n"); return SUANPAN_SUCCESS; } double limit; if(!get_input(command, limit)) { - suanpan_error("create_new_criterion() requires a limit.\n"); + suanpan_error("A valid limit is required.\n"); return SUANPAN_SUCCESS; } @@ -538,7 +538,7 @@ int create_new_criterion(const shared_ptr& domain, istringstream& co int create_new_constraint(const shared_ptr& domain, istringstream& command) { string constraint_id; if(!get_input(command, constraint_id)) { - suanpan_error("create_new_constraint() needs constraint type.\n"); + suanpan_error("A valid constraint type is required.\n"); return SUANPAN_SUCCESS; } @@ -575,7 +575,8 @@ int create_new_constraint(const shared_ptr& domain, istringstream& c if(new_constraint != nullptr) new_constraint->set_start_step(domain->get_current_step_tag()); - if(new_constraint == nullptr || !domain->insert(std::move(new_constraint))) suanpan_error("create_new_constraint() fails to create new constraint.\n"); + if(new_constraint == nullptr || !domain->insert(std::move(new_constraint))) + suanpan_error("Fail to create new constraint via \"{}\".\n", command.str()); return SUANPAN_SUCCESS; } diff --git a/Constraint/ConstraintParser.h b/Constraint/ConstraintParser.h index 7fbfedcc4..a07845f7b 100644 --- a/Constraint/ConstraintParser.h +++ b/Constraint/ConstraintParser.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Constraint/Criterion/ComplementaryEnergyEvolution.cpp b/Constraint/Criterion/ComplementaryEnergyEvolution.cpp index 18ab165f5..f795ffa0f 100644 --- a/Constraint/Criterion/ComplementaryEnergyEvolution.cpp +++ b/Constraint/Criterion/ComplementaryEnergyEvolution.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Constraint/Criterion/ComplementaryEnergyEvolution.h b/Constraint/Criterion/ComplementaryEnergyEvolution.h index 716418597..5263fd83c 100644 --- a/Constraint/Criterion/ComplementaryEnergyEvolution.h +++ b/Constraint/Criterion/ComplementaryEnergyEvolution.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Constraint/Criterion/Criterion.cpp b/Constraint/Criterion/Criterion.cpp index 1a0d556ac..0ad295bb1 100644 --- a/Constraint/Criterion/Criterion.cpp +++ b/Constraint/Criterion/Criterion.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,9 +20,7 @@ Criterion::Criterion(const unsigned T, const unsigned ST) : Tag(T) - , step_tag(ST) { suanpan_debug("Criterion %u ctor() called.\n", T); } - -Criterion::~Criterion() { suanpan_debug("Criterion %u dtor() called.\n", get_tag()); } + , step_tag(ST) {} void Criterion::set_step_tag(const unsigned T) { step_tag = T; } diff --git a/Constraint/Criterion/Criterion.h b/Constraint/Criterion/Criterion.h index a999f2e7d..16d6be0ef 100644 --- a/Constraint/Criterion/Criterion.h +++ b/Constraint/Criterion/Criterion.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -40,7 +40,7 @@ class Criterion : public Tag { public: explicit Criterion(unsigned = 0, unsigned = 0); - ~Criterion() override; + ~Criterion() override = default; void set_step_tag(unsigned); [[nodiscard]] unsigned get_step_tag() const; diff --git a/Constraint/Criterion/EnergyEvolution.cpp b/Constraint/Criterion/EnergyEvolution.cpp index 82ece5759..af47b821a 100644 --- a/Constraint/Criterion/EnergyEvolution.cpp +++ b/Constraint/Criterion/EnergyEvolution.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -80,7 +80,7 @@ int EnergyEvolution::process(const shared_ptr& D) { }); } - suanpan_info("current rejection ratio: %.4E.\n", current_level / 100.); + suanpan_highlight("-> Current Rejection Ratio: {:.3f}.\n", current_level / 100.); energy = (1. - propagation_weight) * energy + propagation_weight * current_energy; diff --git a/Constraint/Criterion/EnergyEvolution.h b/Constraint/Criterion/EnergyEvolution.h index 5a3541077..2c34979f8 100644 --- a/Constraint/Criterion/EnergyEvolution.h +++ b/Constraint/Criterion/EnergyEvolution.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Constraint/Criterion/LogicCriterion.cpp b/Constraint/Criterion/LogicCriterion.cpp index 527349013..d08a00440 100644 --- a/Constraint/Criterion/LogicCriterion.cpp +++ b/Constraint/Criterion/LogicCriterion.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -28,7 +28,7 @@ int LogicCriterion::initialize(const shared_ptr& D) { const auto& t_criterion_b = D->get(tag_b); if(nullptr == t_criterion_a || nullptr == t_criterion_b) { - suanpan_error("cannot find criterion %u and/or %u.\n", tag_a, tag_b); + suanpan_error("Cannot find criteria {} and/or {}.\n", tag_a, tag_b); D->disable_criterion(get_tag()); return SUANPAN_SUCCESS; } @@ -37,7 +37,7 @@ int LogicCriterion::initialize(const shared_ptr& D) { criterion_b = t_criterion_b->get_copy(); if(SUANPAN_SUCCESS != criterion_a->initialize(D) || SUANPAN_SUCCESS != criterion_b->initialize(D)) { - suanpan_error("fail to initialize criterion %u and/or %u.\n", tag_a, tag_b); + suanpan_error("Fail to initialize criteria {} and/or {}.\n", tag_a, tag_b); D->disable_criterion(get_tag()); } diff --git a/Constraint/Criterion/LogicCriterion.h b/Constraint/Criterion/LogicCriterion.h index af1b7dc0d..279611480 100644 --- a/Constraint/Criterion/LogicCriterion.h +++ b/Constraint/Criterion/LogicCriterion.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Constraint/Criterion/MaxDisplacement.cpp b/Constraint/Criterion/MaxDisplacement.cpp index 7ac082392..ed6e11258 100644 --- a/Constraint/Criterion/MaxDisplacement.cpp +++ b/Constraint/Criterion/MaxDisplacement.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Constraint/Criterion/MaxDisplacement.h b/Constraint/Criterion/MaxDisplacement.h index 2a66b56a5..17bb7c93c 100644 --- a/Constraint/Criterion/MaxDisplacement.h +++ b/Constraint/Criterion/MaxDisplacement.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Constraint/Criterion/MaxHistory.cpp b/Constraint/Criterion/MaxHistory.cpp index 45be8d7cd..7d3adf237 100644 --- a/Constraint/Criterion/MaxHistory.cpp +++ b/Constraint/Criterion/MaxHistory.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Constraint/Criterion/MaxHistory.h b/Constraint/Criterion/MaxHistory.h index 5a2660999..d11c862e4 100644 --- a/Constraint/Criterion/MaxHistory.h +++ b/Constraint/Criterion/MaxHistory.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Constraint/Criterion/MaxResistance.cpp b/Constraint/Criterion/MaxResistance.cpp index f8a1082e4..025aa2274 100644 --- a/Constraint/Criterion/MaxResistance.cpp +++ b/Constraint/Criterion/MaxResistance.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Constraint/Criterion/MaxResistance.h b/Constraint/Criterion/MaxResistance.h index e39823361..1737faad8 100644 --- a/Constraint/Criterion/MaxResistance.h +++ b/Constraint/Criterion/MaxResistance.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Constraint/Criterion/MinDisplacement.cpp b/Constraint/Criterion/MinDisplacement.cpp index b4d7d58b5..80bd5c5b3 100644 --- a/Constraint/Criterion/MinDisplacement.cpp +++ b/Constraint/Criterion/MinDisplacement.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Constraint/Criterion/MinDisplacement.h b/Constraint/Criterion/MinDisplacement.h index c32ba0268..39ac68c48 100644 --- a/Constraint/Criterion/MinDisplacement.h +++ b/Constraint/Criterion/MinDisplacement.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Constraint/Criterion/MinResistance.cpp b/Constraint/Criterion/MinResistance.cpp index ac7664b7c..641485a78 100644 --- a/Constraint/Criterion/MinResistance.cpp +++ b/Constraint/Criterion/MinResistance.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Constraint/Criterion/MinResistance.h b/Constraint/Criterion/MinResistance.h index f2aaaabe9..02219f3fa 100644 --- a/Constraint/Criterion/MinResistance.h +++ b/Constraint/Criterion/MinResistance.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Constraint/Criterion/NodeBasedCriterion.cpp b/Constraint/Criterion/NodeBasedCriterion.cpp index 3a34e473f..462b9b9e3 100644 --- a/Constraint/Criterion/NodeBasedCriterion.cpp +++ b/Constraint/Criterion/NodeBasedCriterion.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -26,7 +26,7 @@ NodeBasedCriterion::NodeBasedCriterion(const unsigned T, const unsigned ST, cons int NodeBasedCriterion::initialize(const shared_ptr& D) { if(!D->find(node)) { - suanpan_error("Node %u is not active in the model.\n", node); + suanpan_error("Node {} is not active.\n", node); D->disable_criterion(get_tag()); } diff --git a/Constraint/Criterion/NodeBasedCriterion.h b/Constraint/Criterion/NodeBasedCriterion.h index 88af3c2d8..950e3eb47 100644 --- a/Constraint/Criterion/NodeBasedCriterion.h +++ b/Constraint/Criterion/NodeBasedCriterion.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Constraint/Criterion/StrainEnergyEvolution.cpp b/Constraint/Criterion/StrainEnergyEvolution.cpp index 26eeb1090..c4971ab72 100644 --- a/Constraint/Criterion/StrainEnergyEvolution.cpp +++ b/Constraint/Criterion/StrainEnergyEvolution.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Constraint/Criterion/StrainEnergyEvolution.h b/Constraint/Criterion/StrainEnergyEvolution.h index 87d36c937..dbe4bada9 100644 --- a/Constraint/Criterion/StrainEnergyEvolution.h +++ b/Constraint/Criterion/StrainEnergyEvolution.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Constraint/Embed.cpp b/Constraint/Embed.cpp index 78e02c53e..efcdb2750 100644 --- a/Constraint/Embed.cpp +++ b/Constraint/Embed.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Constraint/Embed.h b/Constraint/Embed.h index 7bb2d134c..4df8b2571 100644 --- a/Constraint/Embed.h +++ b/Constraint/Embed.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Constraint/FixedLength.cpp b/Constraint/FixedLength.cpp index 2bbccdc49..755690372 100644 --- a/Constraint/FixedLength.cpp +++ b/Constraint/FixedLength.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Constraint/FixedLength.h b/Constraint/FixedLength.h index 0e55782de..d7ae7515b 100644 --- a/Constraint/FixedLength.h +++ b/Constraint/FixedLength.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Constraint/LJPotential2D.cpp b/Constraint/LJPotential2D.cpp index 5606b25e1..7828e98c2 100644 --- a/Constraint/LJPotential2D.cpp +++ b/Constraint/LJPotential2D.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Constraint/LJPotential2D.h b/Constraint/LJPotential2D.h index ea3775b8b..64fc3d862 100644 --- a/Constraint/LJPotential2D.h +++ b/Constraint/LJPotential2D.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Constraint/LinearSpring2D.cpp b/Constraint/LinearSpring2D.cpp index 3fe3fe9c4..96b95d562 100644 --- a/Constraint/LinearSpring2D.cpp +++ b/Constraint/LinearSpring2D.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Constraint/LinearSpring2D.h b/Constraint/LinearSpring2D.h index e861e64b5..abed5117d 100644 --- a/Constraint/LinearSpring2D.h +++ b/Constraint/LinearSpring2D.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Constraint/MPC.cpp b/Constraint/MPC.cpp index 5b1964a3a..f613ac75f 100644 --- a/Constraint/MPC.cpp +++ b/Constraint/MPC.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Constraint/MPC.h b/Constraint/MPC.h index 7f38c510d..c2289c0ae 100644 --- a/Constraint/MPC.h +++ b/Constraint/MPC.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Constraint/NodeFacet.cpp b/Constraint/NodeFacet.cpp index a5a3b9d76..fbe8416f1 100644 --- a/Constraint/NodeFacet.cpp +++ b/Constraint/NodeFacet.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,7 +19,7 @@ #include #include #include -#include +#include std::vector NodeFacet::get_position(const shared_ptr& D) { std::vector position; diff --git a/Constraint/NodeFacet.h b/Constraint/NodeFacet.h index 5e29f2950..d038cd1ac 100644 --- a/Constraint/NodeFacet.h +++ b/Constraint/NodeFacet.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Constraint/NodeLine.cpp b/Constraint/NodeLine.cpp index 2cecab2fe..c1d99366c 100644 --- a/Constraint/NodeLine.cpp +++ b/Constraint/NodeLine.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Constraint/NodeLine.h b/Constraint/NodeLine.h index 4c1ca6b0d..44e14c445 100644 --- a/Constraint/NodeLine.h +++ b/Constraint/NodeLine.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Constraint/ParticleCollision.cpp b/Constraint/ParticleCollision.cpp index 856f3e523..e8aa9bed8 100644 --- a/Constraint/ParticleCollision.cpp +++ b/Constraint/ParticleCollision.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -32,7 +32,7 @@ ParticleCollision::ParticleCollision(const unsigned T, const unsigned S, const u int ParticleCollision::initialize(const shared_ptr& D) { if(const auto t_scheme = D->get_factory()->get_storage_scheme(); StorageScheme::FULL != t_scheme && StorageScheme::SPARSE != t_scheme && StorageScheme::SPARSESYMM != t_scheme) { - suanpan_warning("DEM requires full/sparse matrix storage scheme.\n"); + suanpan_warning("The full or sparse matrix storage scheme is required.\n"); return SUANPAN_FAIL; } diff --git a/Constraint/ParticleCollision.h b/Constraint/ParticleCollision.h index 0b94b338a..4e5c5b3db 100644 --- a/Constraint/ParticleCollision.h +++ b/Constraint/ParticleCollision.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Constraint/ParticleCollision2D.cpp b/Constraint/ParticleCollision2D.cpp index 39ed13114..319ccfe90 100644 --- a/Constraint/ParticleCollision2D.cpp +++ b/Constraint/ParticleCollision2D.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -35,7 +35,8 @@ int ParticleCollision2D::process_meta(const shared_ptr& D, const boo suanpan_for(static_cast(0), node_size, [&](const decltype(node_size) I) { const auto& t_node = node_pool[I]; - if(norm(t_node->get_trial_velocity()) * W->get_incre_time() > space) suanpan_warning("the speed of Node %u seems to be too large, please decrease time step size.\n", t_node->get_tag()); + if(norm(t_node->get_trial_velocity()) * W->get_incre_time() > space) + suanpan_warning("The nodal speed seems to be too large.\n"); const auto new_pos = get_position(t_node); list[I].y = static_cast(floor(new_pos(1) / space)); list[I].x = static_cast(floor(new_pos(0) / space)); diff --git a/Constraint/ParticleCollision2D.h b/Constraint/ParticleCollision2D.h index 06b9bf8f7..ba99a0ec1 100644 --- a/Constraint/ParticleCollision2D.h +++ b/Constraint/ParticleCollision2D.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Constraint/ParticleCollision3D.cpp b/Constraint/ParticleCollision3D.cpp index 311beddf2..fae5ac7ed 100644 --- a/Constraint/ParticleCollision3D.cpp +++ b/Constraint/ParticleCollision3D.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -40,7 +40,8 @@ int ParticleCollision3D::process_meta(const shared_ptr& D, const boo suanpan_for(static_cast(0), node_size, [&](const decltype(node_size) I) { const auto& t_node = node_pool[I]; - if(norm(t_node->get_trial_velocity()) * W->get_incre_time() > space) suanpan_warning("the speed of Node %u seems to be too large, please decrease time step size.\n", t_node->get_tag()); + if(norm(t_node->get_trial_velocity()) * W->get_incre_time() > space) + suanpan_warning("The nodal speed seems to be too large.\n"); const auto new_pos = get_position(t_node); list[I].x = static_cast(floor(new_pos(0) / space)); list[I].y = static_cast(floor(new_pos(1) / space)); diff --git a/Constraint/ParticleCollision3D.h b/Constraint/ParticleCollision3D.h index a7640b5ad..678aa42e8 100644 --- a/Constraint/ParticleCollision3D.h +++ b/Constraint/ParticleCollision3D.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Constraint/RestitutionWallPenalty.cpp b/Constraint/RestitutionWallPenalty.cpp index 11bb3816c..719b939d2 100644 --- a/Constraint/RestitutionWallPenalty.cpp +++ b/Constraint/RestitutionWallPenalty.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -31,7 +31,7 @@ RestitutionWallPenalty::RestitutionWallPenalty(const unsigned T, const unsigned int RestitutionWallPenalty::initialize(const shared_ptr& D) { if(AnalysisType::DYNAMICS != D->get_factory()->get_analysis_type()) { - suanpan_error("restitution rigid wall constraint can only be applied in dynamic analysis.\n"); + suanpan_error("Restitution rigid wall constraint can only be applied in dynamic analysis.\n"); return SUANPAN_FAIL; } diff --git a/Constraint/RestitutionWallPenalty.h b/Constraint/RestitutionWallPenalty.h index 272acab89..604f1a164 100644 --- a/Constraint/RestitutionWallPenalty.h +++ b/Constraint/RestitutionWallPenalty.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Constraint/RigidWallMultiplier.cpp b/Constraint/RigidWallMultiplier.cpp index 1e13f7c0a..daf0177aa 100644 --- a/Constraint/RigidWallMultiplier.cpp +++ b/Constraint/RigidWallMultiplier.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -23,7 +23,7 @@ int RigidWallMultiplier::initialize(const shared_ptr& D) { // for dynamic analysis, velocity and acceleration shall be changed // multiplier method does not give proper result if(AnalysisType::DYNAMICS == D->get_factory()->get_analysis_type()) { - suanpan_warning("multiplier rigid wall constraint cannot be applied in dynamic analysis.\n"); + suanpan_warning("Multiplier rigid wall constraint cannot be applied in dynamic analysis.\n"); access::rw(use_penalty) = true; } diff --git a/Constraint/RigidWallMultiplier.h b/Constraint/RigidWallMultiplier.h index 7fac17dc4..edf326090 100644 --- a/Constraint/RigidWallMultiplier.h +++ b/Constraint/RigidWallMultiplier.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Constraint/RigidWallPenalty.cpp b/Constraint/RigidWallPenalty.cpp index 237f135c0..a6bea2dc8 100644 --- a/Constraint/RigidWallPenalty.cpp +++ b/Constraint/RigidWallPenalty.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Constraint/RigidWallPenalty.h b/Constraint/RigidWallPenalty.h index 53aa042a7..51a49931d 100644 --- a/Constraint/RigidWallPenalty.h +++ b/Constraint/RigidWallPenalty.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Converger/AbsDisp.cpp b/Converger/AbsDisp.cpp index 9a38e0f17..a43790412 100644 --- a/Converger/AbsDisp.cpp +++ b/Converger/AbsDisp.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -37,7 +37,8 @@ bool AbsDisp::is_converged(unsigned) { set_error(norm(W->get_incre_displacement() + W->get_ninja()) / static_cast(W->get_size())); set_conv_flag(get_tolerance() > get_error()); - if(is_print()) suanpan_info("absolute displacement error: %.5E.\n", get_error()); + if(is_print()) + suanpan_info("Absolute displacement error: {:.5E}.\n", get_error()); return get_conv_flag(); } diff --git a/Converger/AbsDisp.h b/Converger/AbsDisp.h index aba9156e2..6a8542fff 100644 --- a/Converger/AbsDisp.h +++ b/Converger/AbsDisp.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Converger/AbsError.cpp b/Converger/AbsError.cpp index e2755d38e..8770056ff 100644 --- a/Converger/AbsError.cpp +++ b/Converger/AbsError.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -41,7 +41,8 @@ bool AbsError::is_converged(unsigned) { set_error(fabs(W->get_error()) / static_cast(W->get_size())); set_conv_flag(get_tolerance() > get_error()); - if(is_print()) suanpan_info("absolute error: %.5E.\n", get_error()); + if(is_print()) + suanpan_info("--> Absolute Error: {:.5E}.\n", get_error()); return get_conv_flag(); } diff --git a/Converger/AbsError.h b/Converger/AbsError.h index beeb2b987..c1f21bb17 100644 --- a/Converger/AbsError.h +++ b/Converger/AbsError.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Converger/AbsIncreAcc.cpp b/Converger/AbsIncreAcc.cpp index f9d9c1ab6..1cea54426 100644 --- a/Converger/AbsIncreAcc.cpp +++ b/Converger/AbsIncreAcc.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -41,7 +41,8 @@ bool AbsIncreAcc::is_converged(unsigned) { set_error(norm(W->get_ninja()) / static_cast(W->get_size())); set_conv_flag(get_tolerance() > get_error()); - if(is_print()) suanpan_info("absolute incremental acceleration error: %.5E.\n", get_error()); + if(is_print()) + suanpan_info("--> Absolute Incremental Acceleration: {:.5E}.\n", get_error()); return get_conv_flag(); } diff --git a/Converger/AbsIncreAcc.h b/Converger/AbsIncreAcc.h index b77c73e53..30976f72a 100644 --- a/Converger/AbsIncreAcc.h +++ b/Converger/AbsIncreAcc.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Converger/AbsIncreDisp.cpp b/Converger/AbsIncreDisp.cpp index 748031fe3..0ee7664ee 100644 --- a/Converger/AbsIncreDisp.cpp +++ b/Converger/AbsIncreDisp.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -41,7 +41,8 @@ bool AbsIncreDisp::is_converged(unsigned) { set_error(norm(W->get_ninja()) / static_cast(W->get_size())); set_conv_flag(get_tolerance() > get_error()); - if(is_print()) suanpan_info("absolute incremental displacement error: %.5E.\n", get_error()); + if(is_print()) + suanpan_info("--> Absolute Incremental Displacement: {:.5E}.\n", get_error()); return get_conv_flag(); } diff --git a/Converger/AbsIncreDisp.h b/Converger/AbsIncreDisp.h index 16f35657c..6a72bfca7 100644 --- a/Converger/AbsIncreDisp.h +++ b/Converger/AbsIncreDisp.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Converger/AbsIncreEnergy.cpp b/Converger/AbsIncreEnergy.cpp index 7ae326a85..01cacdf3a 100644 --- a/Converger/AbsIncreEnergy.cpp +++ b/Converger/AbsIncreEnergy.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -37,7 +37,8 @@ bool AbsIncreEnergy::is_converged(unsigned) { set_error(fabs(dot(W->get_ninja(), get_residual())) / static_cast(W->get_size())); set_conv_flag(get_tolerance() > get_error()); - if(is_print()) suanpan_info("absolute energy increment error: %.5E.\n", get_error()); + if(is_print()) + suanpan_info("--> Absolute Incremental Energy: {:.5E}.\n", get_error()); return get_conv_flag(); } diff --git a/Converger/AbsIncreEnergy.h b/Converger/AbsIncreEnergy.h index b59a975ec..b289af096 100644 --- a/Converger/AbsIncreEnergy.h +++ b/Converger/AbsIncreEnergy.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Converger/AbsResidual.cpp b/Converger/AbsResidual.cpp index 980271225..c01803874 100644 --- a/Converger/AbsResidual.cpp +++ b/Converger/AbsResidual.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -30,7 +30,8 @@ bool AbsResidual::is_converged(unsigned) { set_error(norm(get_residual()) / static_cast(W->get_size())); set_conv_flag(get_tolerance() > get_error()); - if(is_print()) suanpan_info("absolute residual: %.5E.\n", get_error()); + if(is_print()) + suanpan_info("--> Absolute Residual: {:.5E}.\n", get_error()); return get_conv_flag(); } diff --git a/Converger/AbsResidual.h b/Converger/AbsResidual.h index 3154c6eb7..624505480 100644 --- a/Converger/AbsResidual.h +++ b/Converger/AbsResidual.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Converger/Converger.cpp b/Converger/Converger.cpp index 6ddb9797a..a1a82ba49 100644 --- a/Converger/Converger.cpp +++ b/Converger/Converger.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -30,11 +30,11 @@ Converger::Converger(const unsigned T, const double E, const unsigned M, const b : Tag(T) , tolerance(E) , max_iteration(M) - , print_flag(P) { suanpan_debug("Converger %u ctor() called.\n", T); } + , print_flag(P) {} int Converger::initialize() { if(nullptr == database.lock()) { - suanpan_error("initialize() needs a valid Domain.\n"); + suanpan_error("A valid domain is required.\n"); return SUANPAN_FAIL; } diff --git a/Converger/Converger.h b/Converger/Converger.h index ade6a918e..fe795e4bc 100644 --- a/Converger/Converger.h +++ b/Converger/Converger.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Converger/ConvergerParser.cpp b/Converger/ConvergerParser.cpp index 858da67a7..a5cb67a8d 100644 --- a/Converger/ConvergerParser.cpp +++ b/Converger/ConvergerParser.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -24,13 +24,13 @@ int create_new_converger(const shared_ptr& domain, istringstream& command) { string converger_id; if(!get_input(command, converger_id)) { - suanpan_error("create_new_converger() requires converger type.\n"); + suanpan_error("A valid converger type is required.\n"); return SUANPAN_SUCCESS; } unsigned tag; if(!get_input(command, tag)) { - suanpan_error("create_new_converger() requires a tag.\n"); + suanpan_error("A valid tag is required.\n"); return SUANPAN_SUCCESS; } @@ -38,31 +38,32 @@ int create_new_converger(const shared_ptr& domain, istringstream& co if(is_equal(converger_id.substr(0, 5), "Logic")) { unsigned tag_a, tag_b; if(!get_input(command, tag_a) || !get_input(command, tag_b)) { - suanpan_error("create_new_converger() requires a tag.\n"); + suanpan_error("A valid tag is required.\n"); return SUANPAN_SUCCESS; } if(is_equal(converger_id, "LogicAND") && domain->insert(make_shared(tag, tag_a, tag_b))) code = 1; // NOLINT(bugprone-branch-clone) else if(is_equal(converger_id, "LogicOR") && domain->insert(make_shared(tag, tag_a, tag_b))) code = 1; else if(is_equal(converger_id, "LogicXOR") && domain->insert(make_shared(tag, tag_a, tag_b))) code = 1; - else suanpan_error("create_new_converger() cannot identify the converger type.\n"); + else + suanpan_error("Cannot identify converger type.\n"); } else { auto tolerance = 1E-6; if(!is_equal(converger_id, "FixedNumber") && (!command.eof() && !get_input(command, tolerance))) { - suanpan_error("create_new_converger() reads wrong tolerance.\n"); + suanpan_error("A valid tolerance is required.\n"); return SUANPAN_SUCCESS; } auto max_iteration = 10; if(!command.eof() && !get_input(command, max_iteration)) { - suanpan_error("create_new_converger() reads wrong max iteration.\n"); + suanpan_error("A valid maximum iteration is required.\n"); return SUANPAN_SUCCESS; } string print_flag = "false"; if(!command.eof() && !get_input(command, print_flag)) { - suanpan_error("create_new_converger() reads wrong print flag.\n"); + suanpan_error("A valid print flag is required.\n"); return SUANPAN_SUCCESS; } @@ -79,14 +80,16 @@ int create_new_converger(const shared_ptr& domain, istringstream& co else if(is_equal(converger_id, "AbsIncreEnergy") && domain->insert(make_shared(tag, tolerance, max_iteration, is_true(print_flag)))) code = 1; else if(is_equal(converger_id, "RelIncreEnergy") && domain->insert(make_shared(tag, tolerance, max_iteration, is_true(print_flag)))) code = 1; else if(is_equal(converger_id, "FixedNumber") && domain->insert(make_shared(tag, max_iteration, is_true(print_flag)))) code = 1; - else suanpan_error("create_new_converger() cannot identify the converger type.\n"); + else + suanpan_error("Cannot identify converger type.\n"); } if(1 == code) { if(domain->get_current_step_tag() != 0) domain->get_current_step()->set_converger_tag(tag); domain->set_current_converger_tag(tag); } - else suanpan_error("create_new_converger() fails to create the new converger.\n"); + else + suanpan_error("Fail to create new converger via \"{}\".\n", command.str()); return SUANPAN_SUCCESS; } diff --git a/Converger/ConvergerParser.h b/Converger/ConvergerParser.h index e23f06bfc..5ad47e9fb 100644 --- a/Converger/ConvergerParser.h +++ b/Converger/ConvergerParser.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Converger/FixedNumber.cpp b/Converger/FixedNumber.cpp index 5efaa2ed3..d68e7a891 100644 --- a/Converger/FixedNumber.cpp +++ b/Converger/FixedNumber.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -29,7 +29,8 @@ FixedNumber::FixedNumber(const unsigned T, const unsigned M, const bool P) unique_ptr FixedNumber::get_copy() { return make_unique(*this); } bool FixedNumber::is_converged(const unsigned counter) { - if(is_print()) suanpan_info("iteration counter: %u.\n", counter); + if(is_print()) + suanpan_info("--> Iteration Counter: {}.\n", counter); set_conv_flag(get_max_iteration() <= counter); diff --git a/Converger/FixedNumber.h b/Converger/FixedNumber.h index c04a44abc..e4ce5df8d 100644 --- a/Converger/FixedNumber.h +++ b/Converger/FixedNumber.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Converger/LogicConverger.cpp b/Converger/LogicConverger.cpp index ea9c2aec1..fec258abf 100644 --- a/Converger/LogicConverger.cpp +++ b/Converger/LogicConverger.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -28,7 +28,7 @@ LogicConverger::LogicConverger(const unsigned T, const unsigned TA, const unsign int LogicConverger::initialize() { const auto t_domain = get_domain().lock(); if(nullptr == t_domain) { - suanpan_error("initialize() needs a valid Domain.\n"); + suanpan_error("A valid domain is required.\n"); return SUANPAN_FAIL; } @@ -36,7 +36,7 @@ int LogicConverger::initialize() { const auto& t_converger_b = t_domain->get_converger(tag_b); if(nullptr == t_converger_a || nullptr == t_converger_b) { - suanpan_error("initialize() needs valid convergers.\n"); + suanpan_error("Two valid convergers are required.\n"); return SUANPAN_FAIL; } diff --git a/Converger/LogicConverger.h b/Converger/LogicConverger.h index 499849421..70a7a6442 100644 --- a/Converger/LogicConverger.h +++ b/Converger/LogicConverger.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Converger/RelDisp.cpp b/Converger/RelDisp.cpp index 44e029578..d0b174b48 100644 --- a/Converger/RelDisp.cpp +++ b/Converger/RelDisp.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -31,7 +31,8 @@ bool RelDisp::is_converged(unsigned) { set_error(std::isfinite(rel_disp) ? rel_disp : 1.); set_conv_flag(get_tolerance() > get_error()); - if(is_print()) suanpan_info("relative displacement error: %.5E.\n", get_error()); + if(is_print()) + suanpan_info("--> Relative Displacement: {:.5E}.\n", get_error()); return get_conv_flag(); } diff --git a/Converger/RelDisp.h b/Converger/RelDisp.h index 2c04b947c..e9ebbb67f 100644 --- a/Converger/RelDisp.h +++ b/Converger/RelDisp.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Converger/RelError.cpp b/Converger/RelError.cpp index af37abb15..b23057c90 100644 --- a/Converger/RelError.cpp +++ b/Converger/RelError.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -42,7 +42,8 @@ bool RelError::is_converged(unsigned) { set_error(std::isfinite(rel_error) ? rel_error : 1.); set_conv_flag(get_tolerance() > get_error()); - if(is_print()) suanpan_info("relative error: %.5E.\n", get_error()); + if(is_print()) + suanpan_info("--> Relative Error: {:.5E}.\n", get_error()); return get_conv_flag(); } diff --git a/Converger/RelError.h b/Converger/RelError.h index e25d41d48..a08c19059 100644 --- a/Converger/RelError.h +++ b/Converger/RelError.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Converger/RelIncreAcc.cpp b/Converger/RelIncreAcc.cpp index a7c59621c..946118c7d 100644 --- a/Converger/RelIncreAcc.cpp +++ b/Converger/RelIncreAcc.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -31,7 +31,8 @@ bool RelIncreAcc::is_converged(unsigned) { set_error(std::isfinite(rel_incre_disp) ? rel_incre_disp : 1.); set_conv_flag(get_tolerance() > get_error()); - if(is_print()) suanpan_info("relative incremental acceleration error: %.5E.\n", get_error()); + if(is_print()) + suanpan_info("--> Relative Incremental Acceleration: {:.5E}.\n", get_error()); return get_conv_flag(); } diff --git a/Converger/RelIncreAcc.h b/Converger/RelIncreAcc.h index 8661cf59a..b3a093007 100644 --- a/Converger/RelIncreAcc.h +++ b/Converger/RelIncreAcc.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Converger/RelIncreDisp.cpp b/Converger/RelIncreDisp.cpp index aa119a362..1bd3a6e85 100644 --- a/Converger/RelIncreDisp.cpp +++ b/Converger/RelIncreDisp.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -31,7 +31,8 @@ bool RelIncreDisp::is_converged(unsigned) { set_error(std::isfinite(rel_incre_disp) ? rel_incre_disp : 1.); set_conv_flag(get_tolerance() > get_error()); - if(is_print()) suanpan_info("relative incremental displacement error: %.5E.\n", get_error()); + if(is_print()) + suanpan_info("--> Relative Incremental Displacement: {:.5E}.\n", get_error()); return get_conv_flag(); } diff --git a/Converger/RelIncreDisp.h b/Converger/RelIncreDisp.h index f8daffd66..18355149a 100644 --- a/Converger/RelIncreDisp.h +++ b/Converger/RelIncreDisp.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Converger/RelIncreEnergy.cpp b/Converger/RelIncreEnergy.cpp index 92f802c72..d9de01587 100644 --- a/Converger/RelIncreEnergy.cpp +++ b/Converger/RelIncreEnergy.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -40,7 +40,8 @@ bool RelIncreEnergy::is_converged(const unsigned counter) { set_error(energy / ref_energy); set_conv_flag(get_tolerance() > get_error()); - if(is_print()) suanpan_info("relative energy increment error: %.5E.\n", get_error()); + if(is_print()) + suanpan_info("-> Relative Incremental Energy: {:.5E}.\n", get_error()); return get_conv_flag(); } diff --git a/Converger/RelIncreEnergy.h b/Converger/RelIncreEnergy.h index b70e286b9..139154b47 100644 --- a/Converger/RelIncreEnergy.h +++ b/Converger/RelIncreEnergy.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Converger/RelResidual.cpp b/Converger/RelResidual.cpp index d89733ac3..e2826edfe 100644 --- a/Converger/RelResidual.cpp +++ b/Converger/RelResidual.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -28,7 +28,8 @@ bool RelResidual::is_converged(const unsigned counter) { set_error(residual / ref_residual); set_conv_flag(get_tolerance() > get_error()); - if(is_print()) suanpan_info("relative residual: %.5E.\n", get_error()); + if(is_print()) + suanpan_info("--> Relative Residual: {:.5E}.\n", get_error()); return get_conv_flag(); } diff --git a/Converger/RelResidual.h b/Converger/RelResidual.h index a99dcc32f..912a4bb72 100644 --- a/Converger/RelResidual.h +++ b/Converger/RelResidual.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Database/Database.cpp b/Database/Database.cpp index 78d8b7527..3d4068b33 100644 --- a/Database/Database.cpp +++ b/Database/Database.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,9 +18,7 @@ #include "Database.h" Database::Database(const unsigned T) - : Tag(T) { suanpan_debug("Database %u ctor() called.\n", T); } - -Database::~Database() { suanpan_debug("Database %u dtor() called.\n", get_tag()); } + : Tag(T) {} void Database::set_domain(const shared_ptr& D) { domain = D; } diff --git a/Database/Database.h b/Database/Database.h index 477484fd9..57765d092 100644 --- a/Database/Database.h +++ b/Database/Database.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -35,7 +35,7 @@ class Database : public Tag { public: explicit Database(unsigned = 0); - ~Database() override; + ~Database() override = default; void set_domain(const shared_ptr& D); [[nodiscard]] const shared_ptr& get_domain() const; diff --git a/Database/HDF.cpp b/Database/HDF.cpp index 23dda0652..3fd240633 100644 --- a/Database/HDF.cpp +++ b/Database/HDF.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Database/HDF.h b/Database/HDF.h index f71696e61..5a46a6699 100644 --- a/Database/HDF.h +++ b/Database/HDF.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Developer/Element/CMakeLists.txt b/Developer/Element/CMakeLists.txt index e47aee2de..71e515f0f 100644 --- a/Developer/Element/CMakeLists.txt +++ b/Developer/Element/CMakeLists.txt @@ -31,7 +31,7 @@ add_library(${PROJECT_NAME} SHARED ../../Element/Element.cpp ../../Material/Material.cpp ../../Section/Section.cpp - ../../Toolbox/print.cpp + ../../Include/fmt/src/format.cc ) message(STATUS "ElementExample CXX_FLAGS: ${CMAKE_CXX_FLAGS}") diff --git a/Developer/Element/ElementExample.cpp b/Developer/Element/ElementExample.cpp index bc5bddb19..743cbf39e 100644 --- a/Developer/Element/ElementExample.cpp +++ b/Developer/Element/ElementExample.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -24,27 +24,28 @@ SUANPAN_EXPORT void new_elementexample(unique_ptr& return_obj, std::istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_elementexample() needs a tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } std::vector node_tag(3); for(auto& I : node_tag) if(!get_input(command, I)) { - suanpan_error("new_elementexample() needs 3 nodes.\n"); + suanpan_error("Three valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_elementexample() needs a material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } auto thickness = 1.; - if(command.eof()) suanpan_info("new_elementexample() assumes a unit thickness.\n"); + if(command.eof()) + suanpan_debug("Unit thickness assumed.\n"); else if(!get_input(command, thickness)) { - suanpan_error("new_elementexample() needs a valid thickness.\n"); + suanpan_error("A valid thickness is required.\n"); return; } @@ -100,6 +101,6 @@ int ElementExample::clear_status() { return m_material->clear_status(); } int ElementExample::reset_status() { return m_material->reset_status(); } void ElementExample::print() { - suanpan_info("This is an element example based on CP3 element using the following material model.\n"); + suanpan_info("An element example based on CP3 element using the following material model.\n"); if(m_material) m_material->print(); } diff --git a/Developer/Element/ElementExample.h b/Developer/Element/ElementExample.h index 9b397df33..0965b55c6 100644 --- a/Developer/Element/ElementExample.h +++ b/Developer/Element/ElementExample.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Developer/Material/CMakeLists.txt b/Developer/Material/CMakeLists.txt index 866b739aa..50eb3ac80 100644 --- a/Developer/Material/CMakeLists.txt +++ b/Developer/Material/CMakeLists.txt @@ -28,7 +28,7 @@ add_library(${PROJECT_NAME} SHARED MaterialExample.cpp ../../Domain/Tag.cpp ../../Material/Material.cpp - ../../Toolbox/print.cpp + ../../Include/fmt/src/format.cc ) message(STATUS "MaterialExample CXX_FLAGS: ${CMAKE_CXX_FLAGS}") diff --git a/Developer/Material/ElasticExternal.cpp b/Developer/Material/ElasticExternal.cpp index dff540679..74ca82e4b 100644 --- a/Developer/Material/ElasticExternal.cpp +++ b/Developer/Material/ElasticExternal.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -97,7 +97,7 @@ SUANPAN_EXPORT void elasticexternal_handler(ExternalMaterialData* data, int* inf else if(CLEAR == *info) clear(data, info); else if(VALIDATE == *info) validate(data, info); else { - suanpan_error("unknown flag received.\n"); + suanpan_error("Unknown flag {} received.\n", *info); *info = -1; } } diff --git a/Developer/Material/MaterialExample.cpp b/Developer/Material/MaterialExample.cpp index 59a3d2b8e..2e7b581c7 100644 --- a/Developer/Material/MaterialExample.cpp +++ b/Developer/Material/MaterialExample.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,40 +21,43 @@ SUANPAN_EXPORT void new_materialexample(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_materialexample() requires a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } double elastic_modulus; if(!get_input(command, elastic_modulus)) { - suanpan_error("new_materialexample() requires a valid elastic modulus.\n"); + suanpan_error("A valid elastic modulus is required.\n"); return; } double yield_stress; if(!get_input(command, yield_stress)) { - suanpan_error("new_materialexample() requires a valid yield stress.\n"); + suanpan_error("A valid yield stress is required.\n"); return; } auto hardening_ratio = 0.; - if(command.eof()) suanpan_debug("new_materialexample() assumes zero hardening ratio.\n"); + if(command.eof()) + suanpan_debug("Zero hardening ratio assumed.\n"); else if(!get_input(command, hardening_ratio)) { - suanpan_error("new_materialexample() requires a valid hardening ratio.\n"); + suanpan_error("A valid hardening ratio is required.\n"); return; } auto beta = 0.; - if(command.eof()) suanpan_debug("new_materialexample() assumes isotropic hardening.\n"); + if(command.eof()) + suanpan_debug("Isotropic hardening assumed.\n"); else if(!get_input(command, beta)) { - suanpan_error("new_materialexample() requires a valid beta.\n"); + suanpan_error("A valid beta is required.\n"); return; } auto density = 0.; - if(command.eof()) suanpan_debug("new_materialexample() assumes zero density.\n"); + if(command.eof()) + suanpan_debug("Zero density assumed.\n"); else if(!get_input(command, density)) { - suanpan_error("new_materialexample() requires a valid density.\n"); + suanpan_error("A valid density is required.\n"); return; } @@ -215,5 +218,5 @@ int MaterialExample::reset_status() { void MaterialExample::print() { suanpan_info("A material example based on uniaxial J2 bilinear mixed hardening model.\n"); - suanpan_info("Strain: %.5E\tStress: %.5E\n", current_strain.at(0), current_stress.at(0)); + suanpan_info("Strain: {:.5E}\tStress: {:.5E}\n", current_strain.at(0), current_stress.at(0)); } diff --git a/Developer/Material/MaterialExample.h b/Developer/Material/MaterialExample.h index 9addcc8eb..cd5375675 100644 --- a/Developer/Material/MaterialExample.h +++ b/Developer/Material/MaterialExample.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Developer/Modifier/CMakeLists.txt b/Developer/Modifier/CMakeLists.txt index f08a80a9e..fab91abeb 100644 --- a/Developer/Modifier/CMakeLists.txt +++ b/Developer/Modifier/CMakeLists.txt @@ -32,7 +32,7 @@ add_library(${PROJECT_NAME} SHARED ../../Element/Modifier/Modifier.cpp ../../Material/Material.cpp ../../Section/Section.cpp - ../../Toolbox/print.cpp + ../../Include/fmt/src/format.cc ) message(STATUS "ModifierExample CXX_FLAGS: ${CMAKE_CXX_FLAGS}") diff --git a/Developer/Modifier/ModifierExample.cpp b/Developer/Modifier/ModifierExample.cpp index d7c2f6192..19bf10ced 100644 --- a/Developer/Modifier/ModifierExample.cpp +++ b/Developer/Modifier/ModifierExample.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,17 +21,13 @@ SUANPAN_EXPORT void new_modifierexample(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_modifierexample() requires a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } double a, b; - if(!get_input(command, a)) { - suanpan_info("new_modifierexample() needs two valid numbers.\n"); - return; - } - if(!get_input(command, b)) { - suanpan_info("new_modifierexample() needs two valid numbers.\n"); + if(!get_input(command, a, b)) { + suanpan_debug("Two valid numbers are required.\n"); return; } diff --git a/Developer/Modifier/ModifierExample.h b/Developer/Modifier/ModifierExample.h index 782dcae11..2b5a8f40b 100644 --- a/Developer/Modifier/ModifierExample.h +++ b/Developer/Modifier/ModifierExample.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Developer/ModuleBundle/CMakeLists.txt b/Developer/ModuleBundle/CMakeLists.txt index b4a3d4b25..e15339885 100644 --- a/Developer/ModuleBundle/CMakeLists.txt +++ b/Developer/ModuleBundle/CMakeLists.txt @@ -34,11 +34,11 @@ add_library(${PROJECT_NAME} SHARED ../../Element/Element.cpp ../../Material/Material.cpp ../../Section/Section.cpp - ../../Toolbox/print.cpp ../Element/ElementExample.cpp ../Material/MaterialExample.cpp ../Material/ElasticExternal.cpp ../Section/SectionExample.cpp + ../../Include/fmt/src/format.cc ) message(STATUS "ModuleBundle CXX_FLAGS: ${CMAKE_CXX_FLAGS}") diff --git a/Developer/Section/CMakeLists.txt b/Developer/Section/CMakeLists.txt index 97017ec3f..bc4ed992a 100644 --- a/Developer/Section/CMakeLists.txt +++ b/Developer/Section/CMakeLists.txt @@ -28,7 +28,7 @@ add_library(${PROJECT_NAME} SHARED ../../Domain/Tag.cpp ../../Material/Material.cpp ../../Section/Section.cpp - ../../Toolbox/print.cpp + ../../Include/fmt/src/format.cc ) message(STATUS "SectionExample CXX_FLAGS: ${CMAKE_CXX_FLAGS}") diff --git a/Developer/Section/SectionExample.cpp b/Developer/Section/SectionExample.cpp index aebaf3829..02e328e32 100644 --- a/Developer/Section/SectionExample.cpp +++ b/Developer/Section/SectionExample.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,19 +21,19 @@ SUANPAN_EXPORT void new_sectionexample(unique_ptr
& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_sectionexample() requires a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } double edge; if(!get_input(command, edge)) { - suanpan_error("new_sectionexample() requires a valid width.\n"); + suanpan_error("A valid width is required.\n"); return; } double elastic_modulus; if(!get_input(command, elastic_modulus)) { - suanpan_error("new_sectionexample() requires a valid modulus.\n"); + suanpan_error("A valid modulus is required.\n"); return; } @@ -83,4 +83,6 @@ int SectionExample::reset_status() { return 0; } -void SectionExample::print() { suanpan_info("This is an example section object represents the square elastic section.\n"); } +void SectionExample::print() { + suanpan_info("An example section that represents a square elastic section.\n"); +} diff --git a/Developer/Section/SectionExample.h b/Developer/Section/SectionExample.h index c12085480..6d1132180 100644 --- a/Developer/Section/SectionExample.h +++ b/Developer/Section/SectionExample.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Domain/ConditionalModifier.cpp b/Domain/ConditionalModifier.cpp index 2f92b7df4..ff5a157db 100644 --- a/Domain/ConditionalModifier.cpp +++ b/Domain/ConditionalModifier.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Domain/ConditionalModifier.h b/Domain/ConditionalModifier.h index a4043d45c..8a07bddcf 100644 --- a/Domain/ConditionalModifier.h +++ b/Domain/ConditionalModifier.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Domain/DOF.h b/Domain/DOF.h index d123dee72..7081ccd62 100644 --- a/Domain/DOF.h +++ b/Domain/DOF.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Domain/Domain.cpp b/Domain/Domain.cpp index 6852f0602..31d01a15d 100644 --- a/Domain/Domain.cpp +++ b/Domain/Domain.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -36,6 +36,7 @@ #include #include #include +#include #include #include @@ -74,6 +75,11 @@ bool Domain::insert(const shared_ptr& A) { return amplitude_pond.insert(A); } +bool Domain::insert(const shared_ptr& E) { + updated = false; + return expression_pond.insert(E); +} + bool Domain::insert(const shared_ptr& C) { updated = false; return constraint_pond.insert(C); @@ -161,6 +167,13 @@ bool Domain::erase_amplitude(const unsigned T) { return amplitude_pond.erase(T); } +bool Domain::erase_expression(const unsigned T) { + if(!find(T)) return true; + + updated = false; + return expression_pond.erase(T); +} + bool Domain::erase_constraint(const unsigned T) { if(!find(T)) return true; @@ -280,6 +293,13 @@ void Domain::disable_amplitude(const unsigned T) { amplitude_pond.disable(T); } +void Domain::disable_expression(const unsigned T) { + if(!find(T) || !get(T)->is_active() || get(T)->is_guarded()) return; + + updated = false; + expression_pond.disable(T); +} + void Domain::disable_constraint(const unsigned T) { if(!find(T) || !get(T)->is_active() || get(T)->is_guarded()) return; @@ -400,6 +420,13 @@ void Domain::enable_amplitude(const unsigned T) { amplitude_pond.enable(T); } +void Domain::enable_expression(const unsigned T) { + if(!find(T) || get(T)->is_active()) return; + + updated = false; + expression_pond.enable(T); +} + void Domain::enable_constraint(const unsigned T) { if(!find(T) || get(T)->is_active()) return; @@ -515,6 +542,8 @@ void Domain::enable_step(const unsigned T) { const shared_ptr& Domain::get_amplitude(const unsigned T) const { return amplitude_pond.at(T); } +const shared_ptr& Domain::get_expression(const unsigned T) const { return expression_pond.at(T); } + const shared_ptr& Domain::get_constraint(const unsigned T) const { return constraint_pond.at(T); } const shared_ptr& Domain::get_converger(const unsigned T) const { return converger_pond.at(T); } @@ -549,6 +578,8 @@ const shared_ptr& Domain::get_step(const unsigned T) const { return step_p const AmplitudeQueue& Domain::get_amplitude_pool() const { return amplitude_pond.get(); } +const ExpressionQueue& Domain::get_expression_pool() const { return expression_pond.get(); } + const ConstraintQueue& Domain::get_constraint_pool() const { return constraint_pond.get(); } const ConvergerQueue& Domain::get_converger_pool() const { return converger_pond.get(); } @@ -583,6 +614,8 @@ const StepQueue& Domain::get_step_pool() const { return step_pond; } size_t Domain::get_amplitude() const { return amplitude_pond.size(); } +size_t Domain::get_expression() const { return expression_pond.size(); } + size_t Domain::get_constraint() const { return constraint_pond.size(); } size_t Domain::get_converger() const { return converger_pond.size(); } @@ -617,6 +650,8 @@ size_t Domain::get_step() const { return step_pond.size(); } bool Domain::find_amplitude(const unsigned T) const { return amplitude_pond.find(T); } +bool Domain::find_expression(const unsigned T) const { return expression_pond.find(T); } + bool Domain::find_constraint(const unsigned T) const { return constraint_pond.find(T); } bool Domain::find_converger(const unsigned T) const { return converger_pond.find(T); } @@ -826,7 +861,7 @@ int Domain::assign_color() { suanpan::for_all(color_map, [&](std::vector& color) { std::ranges::transform(color, color.begin(), [&](const unsigned element) { return element_map[element]; }); }); - suanpan_debug("The model is colored by %llu colors.\n", color_map.size()); + suanpan_debug("The model is colored by {} colors.\n", color_map.size()); } // count how many entries in the sparse form and preallocate memory @@ -975,7 +1010,7 @@ int Domain::initialize() { for(const auto I : remove_list) erase_element(I); element_pond.update(); if(element_pond.get().empty()) { - suanpan_warning("no active element.\n"); + suanpan_warning("No active elements.\n"); return SUANPAN_FAIL; } @@ -1178,8 +1213,8 @@ void Domain::enable_all() { } void Domain::summary() const { - suanpan_info("Domain %u contains:\n\t%llu nodes, %llu elements, %llu materials,\n", get_tag(), get_node(), get_element(), get_material()); - suanpan_info("\t%llu loads, %llu constraints and %llu recorders.\n", get_load(), get_constraint(), get_recorder()); + suanpan_info("Domain {} contains:\n\t{} nodes, {} elements, {} materials, {} expressions,\n", get_tag(), get_node(), get_element(), get_material(), get_expression()); + suanpan_info("\t{} loads, {} constraints and {} recorders.\n", get_load(), get_constraint(), get_recorder()); } void Domain::erase_machine_error(vec& ninja) const { suanpan::for_all(restrained_dofs, [&](const uword I) { ninja(I) = 0.; }); } diff --git a/Domain/Domain.h b/Domain/Domain.h index 54ebb9f44..a81961058 100644 --- a/Domain/Domain.h +++ b/Domain/Domain.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -36,7 +36,7 @@ using ThreadQueue = std::vector>>; class Domain final : public DomainBase, public std::enable_shared_from_this { std::atomic_bool updated = false; - ColorMethod color_model = ColorMethod::WP; + ColorMethod color_model = ColorMethod::MIS; unsigned current_step_tag = 0; unsigned current_converger_tag = 0; @@ -53,6 +53,7 @@ class Domain final : public DomainBase, public std::enable_shared_from_this&) override; + bool insert(const shared_ptr&) override; bool insert(const shared_ptr&) override; bool insert(const shared_ptr&) override; bool insert(const shared_ptr&) override; @@ -114,6 +116,7 @@ class Domain final : public DomainBase, public std::enable_shared_from_this&) override; bool erase_amplitude(unsigned) override; + bool erase_expression(unsigned) override; bool erase_constraint(unsigned) override; bool erase_converger(unsigned) override; bool erase_criterion(unsigned) override; @@ -132,6 +135,7 @@ class Domain final : public DomainBase, public std::enable_shared_from_this& get_amplitude(unsigned) const override; + const shared_ptr& get_expression(unsigned) const override; const shared_ptr& get_constraint(unsigned) const override; const shared_ptr& get_converger(unsigned) const override; const shared_ptr& get_criterion(unsigned) const override; @@ -186,6 +192,7 @@ class Domain final : public DomainBase, public std::enable_shared_from_this& get_step(unsigned) const override; const AmplitudeQueue& get_amplitude_pool() const override; + const ExpressionQueue& get_expression_pool() const override; const ConstraintQueue& get_constraint_pool() const override; const ConvergerQueue& get_converger_pool() const override; const CriterionQueue& get_criterion_pool() const override; @@ -204,6 +211,7 @@ class Domain final : public DomainBase, public std::enable_shared_from_this& get_amplitude(const shared_ptr&, unsigned); + friend shared_ptr& get_expression(const shared_ptr&, unsigned); friend shared_ptr& get_constraint(const shared_ptr&, unsigned); friend shared_ptr& get_converger(const shared_ptr&, unsigned); friend shared_ptr& get_criterion(const shared_ptr&, unsigned); @@ -222,6 +230,7 @@ class Domain final : public DomainBase, public std::enable_shared_from_this& get_step(const shared_ptr&, unsigned); friend shared_ptr& get_amplitude(const shared_ptr&, unsigned); + friend shared_ptr& get_expression(const shared_ptr&, unsigned); friend shared_ptr& get_constraint(const shared_ptr&, unsigned); friend shared_ptr& get_converger(const shared_ptr&, unsigned); friend shared_ptr& get_criterion(const shared_ptr&, unsigned); @@ -240,6 +249,7 @@ class Domain final : public DomainBase, public std::enable_shared_from_this& get_step(const shared_ptr&, unsigned); size_t get_amplitude() const override; + size_t get_expression() const override; size_t get_constraint() const override; size_t get_converger() const override; size_t get_criterion() const override; @@ -258,6 +268,7 @@ class Domain final : public DomainBase, public std::enable_shared_from_this class Factory; class Amplitude; +class Expression; class Constraint; class Converger; class Criterion; @@ -62,6 +63,7 @@ class Solver; class Step; using AmplitudeQueue = std::vector>; +using ExpressionQueue = std::vector>; using ConstraintQueue = std::vector>; using ConvergerQueue = std::vector>; using CriterionQueue = std::vector>; @@ -98,7 +100,7 @@ class DomainBase : public Tag { DomainBase(DomainBase&&) = delete; // move forbidden DomainBase& operator=(const DomainBase&) = delete; // assign forbidden DomainBase& operator=(DomainBase&&) = delete; // assign forbidden - ~DomainBase() override; + ~DomainBase() override = default; virtual void set_factory(const shared_ptr&) = 0; [[nodiscard]] virtual const shared_ptr& get_factory() const = 0; @@ -111,6 +113,7 @@ class DomainBase : public Tag { [[nodiscard]] virtual const std::vector>& get_external_module_pool() const = 0; virtual bool insert(const shared_ptr&) = 0; + virtual bool insert(const shared_ptr&) = 0; virtual bool insert(const shared_ptr&) = 0; virtual bool insert(const shared_ptr&) = 0; virtual bool insert(const shared_ptr&) = 0; @@ -130,6 +133,7 @@ class DomainBase : public Tag { template bool erase(unsigned); virtual bool erase_amplitude(unsigned) = 0; + virtual bool erase_expression(unsigned) = 0; virtual bool erase_constraint(unsigned) = 0; virtual bool erase_converger(unsigned) = 0; virtual bool erase_criterion(unsigned) = 0; @@ -148,6 +152,7 @@ class DomainBase : public Tag { virtual bool erase_step(unsigned) = 0; virtual void disable_amplitude(unsigned) = 0; + virtual void disable_expression(unsigned) = 0; virtual void disable_constraint(unsigned) = 0; virtual void disable_converger(unsigned) = 0; virtual void disable_criterion(unsigned) = 0; @@ -166,6 +171,7 @@ class DomainBase : public Tag { virtual void disable_step(unsigned) = 0; virtual void enable_amplitude(unsigned) = 0; + virtual void enable_expression(unsigned) = 0; virtual void enable_constraint(unsigned) = 0; virtual void enable_converger(unsigned) = 0; virtual void enable_criterion(unsigned) = 0; @@ -187,6 +193,7 @@ class DomainBase : public Tag { template const shared_ptr& get(uword); template std::vector> get(const uvec&); [[nodiscard]] virtual const shared_ptr& get_amplitude(unsigned) const = 0; + [[nodiscard]] virtual const shared_ptr& get_expression(unsigned) const = 0; [[nodiscard]] virtual const shared_ptr& get_constraint(unsigned) const = 0; [[nodiscard]] virtual const shared_ptr& get_converger(unsigned) const = 0; [[nodiscard]] virtual const shared_ptr& get_criterion(unsigned) const = 0; @@ -206,6 +213,7 @@ class DomainBase : public Tag { template const std::vector>& get_pool(); [[nodiscard]] virtual const AmplitudeQueue& get_amplitude_pool() const = 0; + [[nodiscard]] virtual const ExpressionQueue& get_expression_pool() const = 0; [[nodiscard]] virtual const ConstraintQueue& get_constraint_pool() const = 0; [[nodiscard]] virtual const ConvergerQueue& get_converger_pool() const = 0; [[nodiscard]] virtual const CriterionQueue& get_criterion_pool() const = 0; @@ -224,6 +232,7 @@ class DomainBase : public Tag { [[nodiscard]] virtual const StepQueue& get_step_pool() const = 0; friend shared_ptr& get_amplitude(const shared_ptr&, unsigned); + friend shared_ptr& get_expression(const shared_ptr&, unsigned); friend shared_ptr& get_constraint(const shared_ptr&, unsigned); friend shared_ptr& get_converger(const shared_ptr&, unsigned); friend shared_ptr& get_criterion(const shared_ptr&, unsigned); @@ -243,6 +252,7 @@ class DomainBase : public Tag { template size_t get(); [[nodiscard]] virtual size_t get_amplitude() const = 0; + [[nodiscard]] virtual size_t get_expression() const = 0; [[nodiscard]] virtual size_t get_constraint() const = 0; [[nodiscard]] virtual size_t get_converger() const = 0; [[nodiscard]] virtual size_t get_criterion() const = 0; @@ -264,6 +274,7 @@ class DomainBase : public Tag { template bool find(uword); template bool find(const uvec&); [[nodiscard]] virtual bool find_amplitude(unsigned) const = 0; + [[nodiscard]] virtual bool find_expression(unsigned) const = 0; [[nodiscard]] virtual bool find_constraint(unsigned) const = 0; [[nodiscard]] virtual bool find_converger(unsigned) const = 0; [[nodiscard]] virtual bool find_criterion(unsigned) const = 0; @@ -403,6 +414,8 @@ template bool DomainBase::erase(unsigned) { throw invalid_argument(" template<> inline bool DomainBase::erase(const unsigned T) { return erase_amplitude(T); } +template<> inline bool DomainBase::erase(const unsigned T) { return erase_expression(T); } + template<> inline bool DomainBase::erase(const unsigned T) { return erase_constraint(T); } template<> inline bool DomainBase::erase(const unsigned T) { return erase_converger(T); } @@ -450,6 +463,8 @@ template std::vector> DomainBase::get(const uvec& P) { template<> inline const shared_ptr& DomainBase::get(const uword T) { return get_amplitude(static_cast(T)); } +template<> inline const shared_ptr& DomainBase::get(const uword T) { return get_expression(static_cast(T)); } + template<> inline const shared_ptr& DomainBase::get(const uword T) { return get_constraint(static_cast(T)); } template<> inline const shared_ptr& DomainBase::get(const uword T) { return get_converger(static_cast(T)); } @@ -484,6 +499,8 @@ template<> inline const shared_ptr& DomainBase::get(const uword T) { template<> inline const shared_ptr& DomainBase::get(const unsigned T) { return get_amplitude(T); } +template<> inline const shared_ptr& DomainBase::get(const unsigned T) { return get_expression(T); } + template<> inline const shared_ptr& DomainBase::get(const unsigned T) { return get_constraint(T); } template<> inline const shared_ptr& DomainBase::get(const unsigned T) { return get_converger(T); } @@ -520,6 +537,8 @@ template const std::vector>& DomainBase::get_pool() { template<> inline const std::vector>& DomainBase::get_pool() { return get_amplitude_pool(); } +template<> inline const std::vector>& DomainBase::get_pool() { return get_expression_pool(); } + template<> inline const std::vector>& DomainBase::get_pool() { return get_constraint_pool(); } template<> inline const std::vector>& DomainBase::get_pool() { return get_converger_pool(); } @@ -554,6 +573,8 @@ template size_t DomainBase::get() { throw invalid_argument("unsuppor template<> inline size_t DomainBase::get() { return get_amplitude(); } +template<> inline size_t DomainBase::get() { return get_expression(); } + template<> inline size_t DomainBase::get() { return get_constraint(); } template<> inline size_t DomainBase::get() { return get_converger(); } @@ -598,6 +619,8 @@ template bool DomainBase::find(const uvec& P) { template<> inline bool DomainBase::find(const uword T) { return find_amplitude(static_cast(T)); } +template<> inline bool DomainBase::find(const uword T) { return find_expression(static_cast(T)); } + template<> inline bool DomainBase::find(const uword T) { return find_constraint(static_cast(T)); } template<> inline bool DomainBase::find(const uword T) { return find_converger(static_cast(T)); } @@ -632,6 +655,8 @@ template<> inline bool DomainBase::find(const uword T) { return find_step( template<> inline bool DomainBase::find(const unsigned T) { return find_amplitude(T); } +template<> inline bool DomainBase::find(const unsigned T) { return find_expression(T); } + template<> inline bool DomainBase::find(const unsigned T) { return find_constraint(T); } template<> inline bool DomainBase::find(const unsigned T) { return find_converger(T); } diff --git a/Domain/DomainHelper.cpp b/Domain/DomainHelper.cpp index b9eee8d41..7f4b22372 100644 --- a/Domain/DomainHelper.cpp +++ b/Domain/DomainHelper.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,6 +19,8 @@ shared_ptr& get_amplitude(const shared_ptr& D, const unsigned T) { return D->amplitude_pond[T]; } +shared_ptr& get_expression(const shared_ptr& D, const unsigned T) { return D->expression_pond[T]; } + shared_ptr& get_constraint(const shared_ptr& D, const unsigned T) { return D->constraint_pond[T]; } shared_ptr& get_converger(const shared_ptr& D, const unsigned T) { return D->converger_pond[T]; } @@ -53,6 +55,8 @@ shared_ptr& get_step(const shared_ptr& D, const unsigned T) { retu shared_ptr& get_amplitude(const shared_ptr& D, const unsigned T) { return std::dynamic_pointer_cast(D)->amplitude_pond[T]; } +shared_ptr& get_expression(const shared_ptr& D, const unsigned T) { return std::dynamic_pointer_cast(D)->expression_pond[T]; } + shared_ptr& get_constraint(const shared_ptr& D, const unsigned T) { return std::dynamic_pointer_cast(D)->constraint_pond[T]; } shared_ptr& get_converger(const shared_ptr& D, const unsigned T) { return std::dynamic_pointer_cast(D)->converger_pond[T]; } diff --git a/Domain/DomainState.cpp b/Domain/DomainState.cpp index 127a36f8e..d51b99365 100644 --- a/Domain/DomainState.cpp +++ b/Domain/DomainState.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -373,7 +373,7 @@ int Domain::update_current_status() const { suanpan::for_all(element_pond.get(), [&](const shared_ptr& t_element) { code += t_element->update_status(); }); if(SUANPAN_SUCCESS != code) { - suanpan_error("initial conditions cause significant non-linearity, use an analysis step instead.\n"); + suanpan_error("Initial conditions cause significant non-linearity, use an analysis step instead.\n"); return SUANPAN_FAIL; } diff --git a/Domain/ExternalModule.cpp b/Domain/ExternalModule.cpp index eea855c5e..d20185a5a 100644 --- a/Domain/ExternalModule.cpp +++ b/Domain/ExternalModule.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -78,7 +78,8 @@ ExternalModule::ExternalModule(string L) suanpan::to_upper(gnu_name); ext_library = LoadLibraryA(gnu_name.c_str()); } - if(ext_library == nullptr) suanpan_error("locate_module() cannot find the library with the given name %s.\n", file_name.c_str()); + if(ext_library == nullptr) + suanpan_error("Cannot load the library with the name \"{}\".\n", file_name); #elif defined(SUANPAN_UNIX) auto file_name = "./lib" + library_name + ".so"; ext_library = dlopen(file_name.c_str(), RTLD_NOW); @@ -86,7 +87,7 @@ ExternalModule::ExternalModule(string L) file_name = "./" + library_name + ".so"; ext_library = dlopen(file_name.c_str(), RTLD_NOW); } - if(ext_library == nullptr) suanpan_error("locate_module() cannot find the library with the given name %s.\n", file_name.c_str()); + if(ext_library == nullptr) suanpan_error("Cannot load the library with the name \"{}\".\n", file_name); #endif } @@ -126,7 +127,7 @@ void ExternalModule::new_adapter(unique_ptr& return_obj, istringstream unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_wrapper() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } diff --git a/Domain/ExternalModule.h b/Domain/ExternalModule.h index 5d74598da..f31b3fb62 100644 --- a/Domain/ExternalModule.h +++ b/Domain/ExternalModule.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Domain/Factory.hpp b/Domain/Factory.hpp index 22ce096af..50c75cc88 100644 --- a/Domain/Factory.hpp +++ b/Domain/Factory.hpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -1847,7 +1847,9 @@ template void Factory::assemble_stiffness(const SpMat& EK, const u for(auto I = EK.begin(); I != EK.end(); ++I) global_stiffness->at(EI(I.row()), EI(I.col())) += *I; } -template void Factory::print() const { suanpan_info("This is a Factory object with size of %u.\n", n_size); } +template void Factory::print() const { + suanpan_info("A Factory object with size of {}.\n", n_size); +} #endif // FACTORY_HPP diff --git a/Domain/FactoryHelper.hpp b/Domain/FactoryHelper.hpp index 4094daaf0..2e1d98db9 100644 --- a/Domain/FactoryHelper.hpp +++ b/Domain/FactoryHelper.hpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Domain/Group/ElementGroup.cpp b/Domain/Group/ElementGroup.cpp index 9374a6945..387b21dca 100644 --- a/Domain/Group/ElementGroup.cpp +++ b/Domain/Group/ElementGroup.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -30,4 +30,6 @@ void ElementGroup::initialize(const shared_ptr& D) { for(uword I = 0; I < pool.n_elem; ++I) pool(I) = e_pool[I]->get_tag(); } -void ElementGroup::print() { suanpan_info("An Element Group.\n"); } +void ElementGroup::print() { + suanpan_info("An element group.\n"); +} diff --git a/Domain/Group/ElementGroup.h b/Domain/Group/ElementGroup.h index 9d187010e..8a4de07dd 100644 --- a/Domain/Group/ElementGroup.h +++ b/Domain/Group/ElementGroup.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Domain/Group/Group.cpp b/Domain/Group/Group.cpp index 8993a7936..9eea2990b 100644 --- a/Domain/Group/Group.cpp +++ b/Domain/Group/Group.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,19 +18,16 @@ #include "Group.h" Group::Group(const unsigned T) - : Tag(T) { suanpan_debug("Group %u ctor() called.\n", get_tag()); } + : Tag(T) {} Group::Group(const unsigned T, uvec&& R) : Tag(T) - , pool(std::forward(R)) { suanpan_debug("Group %u ctor() called.\n", get_tag()); } - -Group::~Group() { suanpan_debug("Group %u dtor() called.\n", get_tag()); } + , pool(std::forward(R)) {} void Group::initialize(const shared_ptr&) {} const uvec& Group::get_pool() const { return pool; } void Group::print() { - suanpan_info("A Group object with tag %u contains the following tags:\n", get_tag()); - pool.t().print(); + suanpan_info("A group contains the following tags:", pool); } diff --git a/Domain/Group/Group.h b/Domain/Group/Group.h index b6b088263..069238526 100644 --- a/Domain/Group/Group.h +++ b/Domain/Group/Group.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -44,7 +44,7 @@ class Group : public Tag { Group(Group&&) = delete; // move forbidden Group& operator=(const Group&) = delete; // assign forbidden Group& operator=(Group&&) = delete; // assign forbidden - ~Group() override; + ~Group() override = default; virtual void initialize(const shared_ptr&); diff --git a/Domain/Group/GroupGroup.cpp b/Domain/Group/GroupGroup.cpp index 6b6125905..e954bfa87 100644 --- a/Domain/Group/GroupGroup.cpp +++ b/Domain/Group/GroupGroup.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Domain/Group/GroupGroup.h b/Domain/Group/GroupGroup.h index 3cd822b8f..e00162a81 100644 --- a/Domain/Group/GroupGroup.h +++ b/Domain/Group/GroupGroup.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Domain/Group/NodeGroup.cpp b/Domain/Group/NodeGroup.cpp index f64c8355d..5da658cba 100644 --- a/Domain/Group/NodeGroup.cpp +++ b/Domain/Group/NodeGroup.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Domain/Group/NodeGroup.h b/Domain/Group/NodeGroup.h index 5445d5412..f85b67e92 100644 --- a/Domain/Group/NodeGroup.h +++ b/Domain/Group/NodeGroup.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Domain/MetaMat/BandMat.hpp b/Domain/MetaMat/BandMat.hpp index 5a84959df..86b64082a 100644 --- a/Domain/MetaMat/BandMat.hpp +++ b/Domain/MetaMat/BandMat.hpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -129,7 +129,7 @@ template Mat BandMat::operator*(const Mat& X) const { template int BandMat::direct_solve(Mat& X, const Mat& B) { if(this->factored) return this->solve_trs(X, B); - suanpan_debug([&] { if(this->n_rows != this->n_cols) throw invalid_argument("requires a square matrix"); }); + suanpan_assert([&] { if(this->n_rows != this->n_cols) throw invalid_argument("requires a square matrix"); }); auto INFO = 0; @@ -158,7 +158,8 @@ template int BandMat::direct_solve(Mat& X, const Mat& B) { if(0 == INFO) INFO = this->solve_trs(X, B); } - if(0 != INFO) suanpan_error("solve() receives error code %u from base driver, the matrix is probably singular.\n", INFO); + if(0 != INFO) + suanpan_error("Error code {} received, the matrix is probably singular.\n", INFO); return INFO; } @@ -203,11 +204,12 @@ template int BandMat::solve_trs(Mat& X, const Mat& B) { X += incre; - suanpan_debug("mixed precision algorithm multiplier: %.5E.\n", multiplier = arma::norm(full_residual -= this->operator*(incre))); + suanpan_debug("Mixed precision algorithm multiplier: {:.5E}.\n", multiplier = arma::norm(full_residual -= this->operator*(incre))); } } - if(INFO != 0) suanpan_error("solve() receives error code %u from base driver, the matrix is probably singular.\n", INFO); + if(0 != INFO) + suanpan_error("Error code {} received, the matrix is probably singular.\n", INFO); return INFO; } @@ -215,7 +217,7 @@ template int BandMat::solve_trs(Mat& X, const Mat& B) { template int BandMat::direct_solve(Mat& X, Mat&& B) { if(this->factored) return this->solve_trs(X, std::forward>(B)); - suanpan_debug([&] { if(this->n_rows != this->n_cols) throw invalid_argument("requires a square matrix"); }); + suanpan_assert([&] { if(this->n_rows != this->n_cols) throw invalid_argument("requires a square matrix"); }); auto INFO = 0; @@ -244,7 +246,8 @@ template int BandMat::direct_solve(Mat& X, Mat&& B) { if(0 == INFO) INFO = this->solve_trs(X, std::forward>(B)); } - if(0 != INFO) suanpan_error("solve() receives error code %u from base driver, the matrix is probably singular.\n", INFO); + if(0 != INFO) + suanpan_error("Error code {} received, the matrix is probably singular.\n", INFO); return INFO; } @@ -287,11 +290,12 @@ template int BandMat::solve_trs(Mat& X, Mat&& B) { X += incre; - suanpan_debug("mixed precision algorithm multiplier: %.5E.\n", multiplier = arma::norm(B -= this->operator*(incre))); + suanpan_debug("Mixed precision algorithm multiplier: {:.5E}.\n", multiplier = arma::norm(B -= this->operator*(incre))); } } - if(INFO != 0) suanpan_error("solve() receives error code %u from base driver, the matrix is probably singular.\n", INFO); + if(0 != INFO) + suanpan_error("Error code {} received, the matrix is probably singular.\n", INFO); return INFO; } diff --git a/Domain/MetaMat/BandMatSpike.hpp b/Domain/MetaMat/BandMatSpike.hpp index 481a8040f..2056e4ade 100644 --- a/Domain/MetaMat/BandMatSpike.hpp +++ b/Domain/MetaMat/BandMatSpike.hpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -161,8 +161,8 @@ template int BandMatSpike::direct_solve(Mat& X, const Mat& B) { sspike_gbtrf_(SPIKE.memptr(), &N, &KL, &KU, this->s_memory.mem, &LDAB, SWORK.memptr(), &INFO); } - if(INFO != 0) { - suanpan_error("solve() receives error code %u from the base driver, the matrix is probably singular.\n", INFO); + if(0 != INFO) { + suanpan_error("Error code {} received, the matrix is probably singular.\n", INFO); return INFO; } @@ -209,7 +209,7 @@ template int BandMatSpike::solve_trs(Mat& X, const Mat& B) { X += incre; - suanpan_debug("mixed precision algorithm multiplier: %.5E.\n", multiplier = arma::norm(full_residual -= this->operator*(incre))); + suanpan_debug("Mixed precision algorithm multiplier: {:.5E}.\n", multiplier = arma::norm(full_residual -= this->operator*(incre))); } } @@ -241,8 +241,8 @@ template int BandMatSpike::direct_solve(Mat& X, Mat&& B) { sspike_gbtrf_(SPIKE.memptr(), &N, &KL, &KU, this->s_memory.mem, &LDAB, SWORK.memptr(), &INFO); } - if(INFO != 0) { - suanpan_error("solve() receives error code %u from the base driver, the matrix is probably singular.\n", INFO); + if(0 != INFO) { + suanpan_error("Error code {} received, the matrix is probably singular.\n", INFO); return INFO; } @@ -287,7 +287,7 @@ template int BandMatSpike::solve_trs(Mat& X, Mat&& B) { X += incre; - suanpan_debug("mixed precision algorithm multiplier: %.5E.\n", multiplier = arma::norm(B -= this->operator*(incre))); + suanpan_debug("Mixed precision algorithm multiplier: {:.5E}.\n", multiplier = arma::norm(B -= this->operator*(incre))); } } diff --git a/Domain/MetaMat/BandSymmMat.hpp b/Domain/MetaMat/BandSymmMat.hpp index 159a77c46..db8243a2c 100644 --- a/Domain/MetaMat/BandSymmMat.hpp +++ b/Domain/MetaMat/BandSymmMat.hpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -149,7 +149,8 @@ template int BandSymmMat::direct_solve(Mat& X, const Mat& B) { if(0 == INFO) INFO = this->solve_trs(X, B); } - if(0 != INFO) suanpan_error("solve() receives error code %u from the base driver, the matrix is probably singular.\n", INFO); + if(0 != INFO) + suanpan_error("Error code {} received, the matrix is probably singular.\n", INFO); return INFO; } @@ -192,11 +193,12 @@ template int BandSymmMat::solve_trs(Mat& X, const Mat& B) { X += incre; - suanpan_debug("mixed precision algorithm multiplier: %.5E.\n", multiplier = arma::norm(full_residual -= this->operator*(incre))); + suanpan_debug("Mixed precision algorithm multiplier: {:.5E}.\n", multiplier = arma::norm(full_residual -= this->operator*(incre))); } } - if(0 != INFO) suanpan_error("solve() receives error code %u from the base driver, the matrix is probably singular.\n", INFO); + if(0 != INFO) + suanpan_error("Error code {} received, the matrix is probably singular.\n", INFO); return INFO; } @@ -229,7 +231,8 @@ template int BandSymmMat::direct_solve(Mat& X, Mat&& B) { if(0 == INFO) INFO = this->solve_trs(X, std::forward>(B)); } - if(0 != INFO) suanpan_error("solve() receives error code %u from the base driver, the matrix is probably singular.\n", INFO); + if(0 != INFO) + suanpan_error("Error code {} received, the matrix is probably singular.\n", INFO); return INFO; } @@ -270,11 +273,12 @@ template int BandSymmMat::solve_trs(Mat& X, Mat&& B) { X += incre; - suanpan_debug("mixed precision algorithm multiplier: %.5E.\n", multiplier = arma::norm(B -= this->operator*(incre))); + suanpan_debug("Mixed precision algorithm multiplier: {:.5E}.\n", multiplier = arma::norm(B -= this->operator*(incre))); } } - if(0 != INFO) suanpan_error("solve() receives error code %u from the base driver, the matrix is probably singular.\n", INFO); + if(0 != INFO) + suanpan_error("Error code {} received, the matrix is probably singular.\n", INFO); return INFO; } diff --git a/Domain/MetaMat/DenseMat.hpp b/Domain/MetaMat/DenseMat.hpp index 1e0f50c79..de723176f 100644 --- a/Domain/MetaMat/DenseMat.hpp +++ b/Domain/MetaMat/DenseMat.hpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Domain/MetaMat/FullMat.hpp b/Domain/MetaMat/FullMat.hpp index 9cd5f46ad..74f2b805a 100644 --- a/Domain/MetaMat/FullMat.hpp +++ b/Domain/MetaMat/FullMat.hpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -142,7 +142,8 @@ template int FullMat::direct_solve(Mat& X, const Mat& B) { if(0 == INFO) INFO = this->solve_trs(X, B); } - if(0 != INFO) suanpan_error("solve() receives error code %u from the base driver, the matrix is probably singular.\n", INFO); + if(0 != INFO) + suanpan_error("Error code {} received, the matrix is probably singular.\n", INFO); return INFO; } @@ -183,7 +184,7 @@ template int FullMat::solve_trs(Mat& X, const Mat& B) { X += incre; - suanpan_debug("mixed precision algorithm multiplier: %.5E.\n", multiplier = arma::norm(full_residual -= this->operator*(incre))); + suanpan_debug("Mixed precision algorithm multiplier: {:.5E}.\n", multiplier = arma::norm(full_residual -= this->operator*(incre))); } } @@ -218,7 +219,8 @@ template int FullMat::direct_solve(Mat& X, Mat&& B) { if(0 == INFO) INFO = this->solve_trs(X, std::forward>(B)); } - if(0 != INFO) suanpan_error("solve() receives error code %u from the base driver, the matrix is probably singular.\n", INFO); + if(0 != INFO) + suanpan_error("Error code {} received, the matrix is probably singular.\n", INFO); return INFO; } @@ -257,7 +259,7 @@ template int FullMat::solve_trs(Mat& X, Mat&& B) { X += incre; - suanpan_debug("mixed precision algorithm multiplier: %.5E.\n", multiplier = arma::norm(B -= this->operator*(incre))); + suanpan_debug("Mixed precision algorithm multiplier: {:.5E}.\n", multiplier = arma::norm(B -= this->operator*(incre))); } } diff --git a/Domain/MetaMat/FullMatCUDA.hpp b/Domain/MetaMat/FullMatCUDA.hpp index 4b71bb3a6..77d8806de 100644 --- a/Domain/MetaMat/FullMatCUDA.hpp +++ b/Domain/MetaMat/FullMatCUDA.hpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -168,7 +168,7 @@ template int FullMatCUDA::direct_solve(Mat& X, const Mat& B) { X += incre; - suanpan_debug("mixed precision algorithm multiplier: %.5E\n", multiplier = arma::norm(full_residual -= this->operator*(incre))); + suanpan_debug("Mixed precision algorithm multiplier: {:.5E}.\n", multiplier = arma::norm(full_residual -= this->operator*(incre))); } if(d_x) cudaFree(d_x); diff --git a/Domain/MetaMat/ILU.hpp b/Domain/MetaMat/ILU.hpp index 55a63b5cd..5b960c90e 100644 --- a/Domain/MetaMat/ILU.hpp +++ b/Domain/MetaMat/ILU.hpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -177,7 +177,7 @@ template int ILU::init() { B.ncol = 0; if(const auto code = this->apply_solver(&X, &B); 0 != code) { - suanpan_error("ILU factorisation returns %d.\n", code); + suanpan_error("Error code {} received.\n", code); return SUANPAN_FAIL; } diff --git a/Domain/MetaMat/IterativeSolver.hpp b/Domain/MetaMat/IterativeSolver.hpp index 74b0871b2..3e1f3b0b8 100644 --- a/Domain/MetaMat/IterativeSolver.hpp +++ b/Domain/MetaMat/IterativeSolver.hpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -68,7 +68,7 @@ template System> int GMRES(const System* system auto stop_criterion = [&] { residual = (beta = arma::norm(r = conditioner->apply(b - system->evaluate(x)))) / norm_b; - suanpan_debug("GMRES solver local residual: %.4e.\n", residual); + suanpan_debug("Iterative solver residual: {:.5E}.\n", residual); if(residual > setting.tolerance) return SUANPAN_FAIL; setting.tolerance = residual; setting.max_iteration = counter; @@ -107,7 +107,7 @@ template System> int GMRES(const System* system apply_rotation(s(i), s(j), cs(i), sn(i)); residual = std::fabs(s(j)) / norm_b; - suanpan_debug("GMRES solver local residual: %.4e.\n", residual); + suanpan_debug("Iterative solver residual: {:.5E}.\n", residual); if(residual < setting.tolerance) { x += update(i); setting.tolerance = residual; @@ -140,7 +140,7 @@ template System> int BiCGSTAB(const System* sys const auto initial_r = r; data_t residual = arma::norm(r) / norm_b; - suanpan_debug("BiCGSTAB solver local residual: %.4e.\n", residual); + suanpan_debug("Iterative solver residual: {:.5E}.\n", residual); if(residual < setting.tolerance) { setting.tolerance = residual; setting.max_iteration = 0; @@ -166,7 +166,7 @@ template System> int BiCGSTAB(const System* sys alpha = rho / arma::dot(initial_r, v); const Col s = r - alpha * v; - suanpan_debug("BiCGSTAB solver local residual: %.4e.\n", residual = arma::norm(s) / norm_b); + suanpan_debug("Iterative solver residual: {:.5E}.\n", residual = arma::norm(s) / norm_b); if(residual < setting.tolerance) { x += alpha * phat; setting.tolerance = residual; @@ -182,7 +182,7 @@ template System> int BiCGSTAB(const System* sys pre_rho = rho; - suanpan_debug("BiCGSTAB solver local residual: %.4e.\n", residual = arma::norm(r) / norm_b); + suanpan_debug("Iterative solver residual: {:.5E}.\n", residual = arma::norm(r) / norm_b); if(residual < setting.tolerance) { setting.tolerance = residual; setting.max_iteration = i; diff --git a/Domain/MetaMat/Jacobi.hpp b/Domain/MetaMat/Jacobi.hpp index afe29d9bf..673238502 100644 --- a/Domain/MetaMat/Jacobi.hpp +++ b/Domain/MetaMat/Jacobi.hpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Domain/MetaMat/MetaMat.hpp b/Domain/MetaMat/MetaMat.hpp index d1392f301..970e428cb 100644 --- a/Domain/MetaMat/MetaMat.hpp +++ b/Domain/MetaMat/MetaMat.hpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -174,7 +174,10 @@ template int MetaMat::direct_solve(Mat& X, Mat&& B) { return th template int MetaMat::direct_solve(Mat& X, SpMat&& B) { return this->direct_solve(X, B); } -template void MetaMat::save(const char* name) { if(!to_mat(*this).save(name)) suanpan_error("cannot save matrix to file.\n"); } +template void MetaMat::save(const char* name) { + if(!to_mat(*this).save(name)) + suanpan_error("Cannot save to file \"{}\".\n", name); +} template void MetaMat::csc_condense() {} diff --git a/Domain/MetaMat/Preconditioner.hpp b/Domain/MetaMat/Preconditioner.hpp index b2545d6de..1d26224de 100644 --- a/Domain/MetaMat/Preconditioner.hpp +++ b/Domain/MetaMat/Preconditioner.hpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Domain/MetaMat/SolverSetting.hpp b/Domain/MetaMat/SolverSetting.hpp index c6682d0c2..a351473bf 100644 --- a/Domain/MetaMat/SolverSetting.hpp +++ b/Domain/MetaMat/SolverSetting.hpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Domain/MetaMat/SparseMat.hpp b/Domain/MetaMat/SparseMat.hpp index b54cf3e4d..8d1c864e5 100644 --- a/Domain/MetaMat/SparseMat.hpp +++ b/Domain/MetaMat/SparseMat.hpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Domain/MetaMat/SparseMatCUDA.hpp b/Domain/MetaMat/SparseMatCUDA.hpp index d3b433535..b315d3449 100644 --- a/Domain/MetaMat/SparseMatCUDA.hpp +++ b/Domain/MetaMat/SparseMatCUDA.hpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -184,7 +184,7 @@ template int SparseMatCUDA::direct_solve(Mat& X, const Mat& B) X += incre; - suanpan_debug("mixed precision algorithm multiplier: %.5E\n", multiplier = arma::norm(full_residual -= this->operator*(incre))); + suanpan_debug("Mixed precision algorithm multiplier: {:.5E}.\n", multiplier = arma::norm(full_residual -= this->operator*(incre))); } } diff --git a/Domain/MetaMat/SparseMatFGMRES.hpp b/Domain/MetaMat/SparseMatFGMRES.hpp index 9eb3d39f2..71d3e105d 100644 --- a/Domain/MetaMat/SparseMatFGMRES.hpp +++ b/Domain/MetaMat/SparseMatFGMRES.hpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -94,7 +94,7 @@ template int SparseMatBaseFGMRES::direct_solve(Mat& X, const Mat int SparseMatBaseMUMPS::alloc() { mumps_job.job = 4; dmumps_c(&mumps_job); - if(0 != mumps_job.info[0]) suanpan_error("factorization fails with code %d.\n", mumps_job.info[0]); + if(0 != mumps_job.info[0]) + suanpan_error("Error code {} received.\n", mumps_job.info[0]); return mumps_job.info[0]; } diff --git a/Domain/MetaMat/SparseMatPARDISO.hpp b/Domain/MetaMat/SparseMatPARDISO.hpp index 7b912ac1c..737cf1ca8 100644 --- a/Domain/MetaMat/SparseMatPARDISO.hpp +++ b/Domain/MetaMat/SparseMatPARDISO.hpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -85,7 +85,7 @@ template int SparseMatPARDISO::direct_solve(Mat& X, const Mat& pardiso(pt, &maxfct, &mnum, &mtype, &phase, &n, (void*)csr_mat.val_mem(), csr_mat.row_mem(), csr_mat.col_mem(), nullptr, &nrhs, iparm, &msglvl, nullptr, nullptr, &error); if(0 != error) { - suanpan_error("PARDISO solver returns %d.\n", error); + suanpan_error("Error code {} received.\n", error); return SUANPAN_FAIL; } @@ -93,7 +93,7 @@ template int SparseMatPARDISO::direct_solve(Mat& X, const Mat& pardiso(pt, &maxfct, &mnum, &mtype, &phase, &n, (void*)csr_mat.val_mem(), csr_mat.row_mem(), csr_mat.col_mem(), nullptr, &nrhs, iparm, &msglvl, (void*)B.memptr(), (void*)X.memptr(), &error); if(0 != error) { - suanpan_error("PARDISO solver returns %d.\n", error); + suanpan_error("Error code {} received.\n", error); return SUANPAN_FAIL; } diff --git a/Domain/MetaMat/SparseMatSuperLU.hpp b/Domain/MetaMat/SparseMatSuperLU.hpp index 0c7d118a7..4e841cb85 100644 --- a/Domain/MetaMat/SparseMatSuperLU.hpp +++ b/Domain/MetaMat/SparseMatSuperLU.hpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -276,7 +276,7 @@ template int SparseMatSuperLU::solve_trs(Mat& out_mat, const Matoperator*(incre))); + suanpan_debug("Mixed precision algorithm multiplier: {:.5E}.\n", multiplier = norm(full_residual -= this->operator*(incre))); } return flag; @@ -345,7 +345,7 @@ template int SparseMatSuperLU::solve_trs(Mat& out_mat, Mat&& in out_mat += incre; - suanpan_debug("mixed precision algorithm multiplier: %.5E.\n", multiplier = norm(in_mat -= this->operator*(incre))); + suanpan_debug("Mixed precision algorithm multiplier: {:.5E}.\n", multiplier = norm(in_mat -= this->operator*(incre))); } return flag; diff --git a/Domain/MetaMat/SymmPackMat.hpp b/Domain/MetaMat/SymmPackMat.hpp index 2f9cfa1a8..236010dc2 100644 --- a/Domain/MetaMat/SymmPackMat.hpp +++ b/Domain/MetaMat/SymmPackMat.hpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -140,7 +140,8 @@ template int SymmPackMat::direct_solve(Mat& X, const Mat& B) { if(0 == INFO) INFO = this->solve_trs(X, B); } - if(0 != INFO) suanpan_error("solve() receives error code %u from the base driver, the matrix is probably singular.\n", INFO); + if(0 != INFO) + suanpan_error("Error code {} received, the matrix is probably singular.\n", INFO); return INFO; } @@ -181,11 +182,12 @@ template int SymmPackMat::solve_trs(Mat& X, const Mat& B) { X += incre; - suanpan_debug("mixed precision algorithm multiplier: %.5E.\n", multiplier = arma::norm(full_residual -= this->operator*(incre))); + suanpan_debug("Mixed precision algorithm multiplier: {:.5E}.\n", multiplier = arma::norm(full_residual -= this->operator*(incre))); } } - if(INFO != 0) suanpan_error("solve() receives error code %u from base driver, the matrix is probably singular.\n", INFO); + if(0 != INFO) + suanpan_error("Error code {} received, the matrix is probably singular.\n", INFO); return INFO; } @@ -216,7 +218,8 @@ template int SymmPackMat::direct_solve(Mat& X, Mat&& B) { if(0 == INFO) INFO = this->solve_trs(X, std::forward>(B)); } - if(0 != INFO) suanpan_error("solve() receives error code %u from the base driver, the matrix is probably singular.\n", INFO); + if(0 != INFO) + suanpan_error("Error code {} received, the matrix is probably singular.\n", INFO); return INFO; } @@ -255,11 +258,12 @@ template int SymmPackMat::solve_trs(Mat& X, Mat&& B) { X += incre; - suanpan_debug("mixed precision algorithm multiplier: %.5E.\n", multiplier = arma::norm(B -= this->operator*(incre))); + suanpan_debug("Mixed precision algorithm multiplier: {:.5E}.\n", multiplier = arma::norm(B -= this->operator*(incre))); } } - if(INFO != 0) suanpan_error("solve() receives error code %u from base driver, the matrix is probably singular.\n", INFO); + if(0 != INFO) + suanpan_error("Error code {} received, the matrix is probably singular.\n", INFO); return INFO; } diff --git a/Domain/MetaMat/csc_form.hpp b/Domain/MetaMat/csc_form.hpp index 24bc750a7..435165ccf 100644 --- a/Domain/MetaMat/csc_form.hpp +++ b/Domain/MetaMat/csc_form.hpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -163,16 +163,16 @@ template csc_form& csc_form void csc_form::print() const { - suanpan_info("A sparse matrix in triplet form with size of %u by %u, the sparsity of %.3f%%.\n", static_cast(n_rows), static_cast(n_cols), 1E2 - static_cast(n_elem) / static_cast(n_rows) / static_cast(n_cols) * 1E2); + suanpan_info("A sparse matrix in triplet form with size of {} by {}, the sparsity of {:.3f}%.\n", static_cast(n_rows), static_cast(n_cols), 1E2 - static_cast(n_elem) / static_cast(n_rows) / static_cast(n_cols) * 1E2); if(n_elem > index_t(1000)) { - suanpan_info("more than 1000 elements exist.\n"); + suanpan_info("More than 1000 elements exist.\n"); return; } index_t c_idx = 1; for(index_t I = 0; I < n_elem; ++I) { if(I >= col_ptr[c_idx]) ++c_idx; - suanpan_info("(%3u, %3u) ===> %+.4E\n", static_cast(row_idx[I]), static_cast(c_idx) - 1, val_idx[I]); + suanpan_info("({}, {}) ===> {:+.8E}\n", static_cast(row_idx[I]), static_cast(c_idx) - 1, val_idx[I]); } } diff --git a/Domain/MetaMat/csr_form.hpp b/Domain/MetaMat/csr_form.hpp index 5e2a7c8c7..3700db42c 100644 --- a/Domain/MetaMat/csr_form.hpp +++ b/Domain/MetaMat/csr_form.hpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -161,16 +161,16 @@ template csr_form& csr_form void csr_form::print() const { - suanpan_info("A sparse matrix in triplet form with size of %u by %u, the sparsity of %.3f%%.\n", static_cast(n_rows), static_cast(n_cols), 1E2 - static_cast(n_elem) / static_cast(n_rows) / static_cast(n_cols) * 1E2); + suanpan_info("A sparse matrix in triplet form with size of {} by {}, the sparsity of {:.3f}%.\n", static_cast(n_rows), static_cast(n_cols), 1E2 - static_cast(n_elem) / static_cast(n_rows) / static_cast(n_cols) * 1E2); if(n_elem > index_t(1000)) { - suanpan_info("more than 1000 elements exist.\n"); + suanpan_info("More than 1000 elements exist.\n"); return; } index_t c_idx = 1; for(index_t I = 0; I < n_elem; ++I) { if(I >= row_ptr[c_idx]) ++c_idx; - suanpan_info("(%3u, %3u) ===> %+.4E\n", static_cast(c_idx) - 1, static_cast(col_idx[I]), val_idx[I]); + suanpan_info("({}, {}) ===> {:+.8E}\n", static_cast(c_idx) - 1, static_cast(col_idx[I]), val_idx[I]); } } diff --git a/Domain/MetaMat/operator_times.hpp b/Domain/MetaMat/operator_times.hpp index 90fe03ef2..17a6b1fed 100644 --- a/Domain/MetaMat/operator_times.hpp +++ b/Domain/MetaMat/operator_times.hpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Domain/MetaMat/triplet_form.hpp b/Domain/MetaMat/triplet_form.hpp index 318fe489c..f4a012747 100644 --- a/Domain/MetaMat/triplet_form.hpp +++ b/Domain/MetaMat/triplet_form.hpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -227,7 +227,7 @@ template class triplet_form final { template void assemble(const triplet_form&, index_t, index_t, data_t); template void assemble(const triplet_form& in_mat, const std::vector& row_shift, const std::vector& col_shift, const std::vector& scalar) { - suanpan_debug([&] { if(scalar.size() != row_shift.size() || scalar.size() != col_shift.size()) throw invalid_argument("size mismatch detected"); }); + suanpan_assert([&] { if(scalar.size() != row_shift.size() || scalar.size() != col_shift.size()) throw invalid_argument("size mismatch detected"); }); reserve(n_elem + index_t(scalar.size()) * index_t(in_mat.n_elem)); @@ -380,7 +380,7 @@ template template triplet_for } template data_t& triplet_form::at(const index_t row, const index_t col) { - suanpan_debug([&] { if(row >= n_rows || col >= n_cols) throw invalid_argument("inconsistent size"); }); + suanpan_assert([&] { if(row >= n_rows || col >= n_cols) throw invalid_argument("inconsistent size"); }); invalidate_sorting_flag(); reserve(n_elem + 1); @@ -390,12 +390,13 @@ template data_t& triplet_form::at(co } template void triplet_form::print() const { - suanpan_info("A sparse matrix in triplet form with size of %u by %u, the density of %.3f%%.\n", static_cast(n_rows), static_cast(n_cols), static_cast(n_elem) / static_cast(n_rows) / static_cast(n_cols) * 1E2); + suanpan_info("A sparse matrix in triplet form with size of {} by {}, the density of {:.3f}%.\n", static_cast(n_rows), static_cast(n_cols), static_cast(n_elem) / static_cast(n_rows) / static_cast(n_cols) * 1E2); if(n_elem > index_t(1000)) { - suanpan_info("Not going to print all elements as more than 1000 elements exist.\n"); + suanpan_info("More than 1000 elements exist.\n"); return; } - for(index_t I = 0; I < n_elem; ++I) suanpan_info("(%3u, %3u) ===> %+.10E\n", static_cast(row_idx[I]), static_cast(col_idx[I]), val_idx[I]); + for(index_t I = 0; I < n_elem; ++I) + suanpan_info("({}, {}) ===> {:+.8E}\n", static_cast(row_idx[I]), static_cast(col_idx[I]), val_idx[I]); } template void triplet_form::csr_sort() { diff --git a/Domain/Node.cpp b/Domain/Node.cpp index e3db082cf..8efaccb3c 100644 --- a/Domain/Node.cpp +++ b/Domain/Node.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -22,13 +22,12 @@ #include Node::Node(const unsigned T) - : Tag(T) { suanpan_debug("Node %u ctor() called.\n", T); } + : Tag(T) {} Node::Node(const unsigned T, vec&& C) : Tag(T) { num_dof = static_cast(C.n_elem); coordinate = std::forward(C); - suanpan_debug("Node %u ctor() called.\n", T); } /** @@ -40,7 +39,6 @@ Node::Node(const unsigned T, const unsigned D) : Tag(T) { num_dof = D; coordinate.zeros(D); - suanpan_debug("Node %u ctor() called.\n", T); } /** @@ -53,14 +51,8 @@ Node::Node(const unsigned T, const unsigned D, vec&& C) : Tag(T) { num_dof = D; coordinate = std::forward(C); - suanpan_debug("Node %u ctor() called.\n", T); } -/** - * \brief default destructor. - */ -Node::~Node() { suanpan_debug("Node %u dtor() called.\n", get_tag()); } - /** * \brief This method should be called after Element objects are set. Element * objects will set the minimum number of DoFs for all related Node objects. @@ -92,7 +84,7 @@ void Node::initialize(const shared_ptr& D) { trial_acceleration.resize(num_dof); } else { - suanpan_debug("Node %u is not used in the problem, now disable it.\n", get_tag()); + suanpan_debug("Node {} disabled as it is not used.\n", get_tag()); D->disable_node(get_tag()); } @@ -119,7 +111,8 @@ void Node::set_dof_identifier(const std::vector& D) { for(size_t I = 0; I < D.size(); ++I) { if(DOF::NONE == D[I]) continue; - if(DOF::NONE != dof_identifier[I] && D[I] != dof_identifier[I]) suanpan_warning("inconsistent DoF assignment for Node %u detected, which is likely an error, please double check the model.\n", get_tag()); + if(DOF::NONE != dof_identifier[I] && D[I] != dof_identifier[I]) + suanpan_warning("Inconsistent DoF assignment for node {} detected.\n", get_tag()); dof_identifier[I] = D[I]; } } @@ -494,57 +487,59 @@ void Node::clear_status() { std::vector Node::record(const OutputType L) const { std::vector data; - if(L == OutputType::RF) data.push_back(current_resistance); - else if(L == OutputType::DF) data.push_back(current_damping_force); - else if(L == OutputType::IF) data.push_back(current_inertial_force); + if(L == OutputType::RF) data.push_back(current_resistance.empty() ? zeros(num_dof) : current_resistance); + else if(L == OutputType::DF) data.push_back(current_damping_force.empty() ? zeros(num_dof) : current_damping_force); + else if(L == OutputType::IF) data.push_back(current_inertial_force.empty() ? zeros(num_dof) : current_inertial_force); else if(L == OutputType::U) data.push_back(current_displacement); else if(L == OutputType::V) data.push_back(current_velocity); else if(L == OutputType::A) data.push_back(current_acceleration); - else if(L == OutputType::U1 && current_displacement.n_elem >= 1) data.emplace_back(vec{current_displacement(0)}); - else if(L == OutputType::U2 && current_displacement.n_elem >= 2) data.emplace_back(vec{current_displacement(1)}); - else if(L == OutputType::U3 && current_displacement.n_elem >= 3) data.emplace_back(vec{current_displacement(2)}); - else if(L == OutputType::UR1 && current_displacement.n_elem >= 4) data.emplace_back(vec{current_displacement(3)}); - else if(L == OutputType::UR2 && current_displacement.n_elem >= 5) data.emplace_back(vec{current_displacement(4)}); - else if(L == OutputType::UR3 && current_displacement.n_elem >= 6) data.emplace_back(vec{current_displacement(5)}); - else if(L == OutputType::V1 && current_velocity.n_elem >= 1) data.emplace_back(vec{current_velocity(0)}); - else if(L == OutputType::V2 && current_velocity.n_elem >= 2) data.emplace_back(vec{current_velocity(1)}); - else if(L == OutputType::V3 && current_velocity.n_elem >= 3) data.emplace_back(vec{current_velocity(2)}); - else if(L == OutputType::VR1 && current_velocity.n_elem >= 4) data.emplace_back(vec{current_velocity(3)}); - else if(L == OutputType::VR2 && current_velocity.n_elem >= 5) data.emplace_back(vec{current_velocity(4)}); - else if(L == OutputType::VR3 && current_velocity.n_elem >= 6) data.emplace_back(vec{current_velocity(5)}); - else if(L == OutputType::A1 && current_acceleration.n_elem >= 1) data.emplace_back(vec{current_acceleration(0)}); - else if(L == OutputType::A2 && current_acceleration.n_elem >= 2) data.emplace_back(vec{current_acceleration(1)}); - else if(L == OutputType::A3 && current_acceleration.n_elem >= 3) data.emplace_back(vec{current_acceleration(2)}); - else if(L == OutputType::AR1 && current_acceleration.n_elem >= 4) data.emplace_back(vec{current_acceleration(3)}); - else if(L == OutputType::AR2 && current_acceleration.n_elem >= 5) data.emplace_back(vec{current_acceleration(4)}); - else if(L == OutputType::AR3 && current_acceleration.n_elem >= 6) data.emplace_back(vec{current_acceleration(5)}); - else if(L == OutputType::RF1 && current_resistance.n_elem >= 1) data.emplace_back(vec{current_resistance(0)}); - else if(L == OutputType::RF2 && current_resistance.n_elem >= 2) data.emplace_back(vec{current_resistance(1)}); - else if(L == OutputType::RF3 && current_resistance.n_elem >= 3) data.emplace_back(vec{current_resistance(2)}); - else if(L == OutputType::RM1 && current_resistance.n_elem >= 4) data.emplace_back(vec{current_resistance(3)}); - else if(L == OutputType::RM2 && current_resistance.n_elem >= 5) data.emplace_back(vec{current_resistance(4)}); - else if(L == OutputType::RM3 && current_resistance.n_elem >= 6) data.emplace_back(vec{current_resistance(5)}); - else if(L == OutputType::DF1 && current_damping_force.n_elem >= 1) data.emplace_back(vec{current_damping_force(0)}); - else if(L == OutputType::DF2 && current_damping_force.n_elem >= 2) data.emplace_back(vec{current_damping_force(1)}); - else if(L == OutputType::DF3 && current_damping_force.n_elem >= 3) data.emplace_back(vec{current_damping_force(2)}); - else if(L == OutputType::DM1 && current_damping_force.n_elem >= 4) data.emplace_back(vec{current_damping_force(3)}); - else if(L == OutputType::DM2 && current_damping_force.n_elem >= 5) data.emplace_back(vec{current_damping_force(4)}); - else if(L == OutputType::DM3 && current_damping_force.n_elem >= 6) data.emplace_back(vec{current_damping_force(5)}); - else if(L == OutputType::IF1 && current_inertial_force.n_elem >= 1) data.emplace_back(vec{current_inertial_force(0)}); - else if(L == OutputType::IF2 && current_inertial_force.n_elem >= 2) data.emplace_back(vec{current_inertial_force(1)}); - else if(L == OutputType::IF3 && current_inertial_force.n_elem >= 3) data.emplace_back(vec{current_inertial_force(2)}); - else if(L == OutputType::IM1 && current_inertial_force.n_elem >= 4) data.emplace_back(vec{current_inertial_force(3)}); - else if(L == OutputType::IM2 && current_inertial_force.n_elem >= 5) data.emplace_back(vec{current_inertial_force(4)}); - else if(L == OutputType::IM3 && current_inertial_force.n_elem >= 6) data.emplace_back(vec{current_inertial_force(5)}); + else if(L == OutputType::U1) data.emplace_back(vec{current_displacement.n_elem >= 1 ? current_displacement(0) : 0.}); + else if(L == OutputType::U2) data.emplace_back(vec{current_displacement.n_elem >= 2 ? current_displacement(1) : 0.}); + else if(L == OutputType::U3) data.emplace_back(vec{current_displacement.n_elem >= 3 ? current_displacement(2) : 0.}); + else if(L == OutputType::U4 || L == OutputType::UR1) data.emplace_back(vec{current_displacement.n_elem >= 4 ? current_displacement(3) : 0.}); + else if(L == OutputType::U5 || L == OutputType::UR2) data.emplace_back(vec{current_displacement.n_elem >= 5 ? current_displacement(4) : 0.}); + else if(L == OutputType::U6 || L == OutputType::UR3) data.emplace_back(vec{current_displacement.n_elem >= 6 ? current_displacement(5) : 0.}); + else if(L == OutputType::V1) data.emplace_back(vec{current_velocity.n_elem >= 1 ? current_velocity(0) : 0.}); + else if(L == OutputType::V2) data.emplace_back(vec{current_velocity.n_elem >= 2 ? current_velocity(1) : 0.}); + else if(L == OutputType::V3) data.emplace_back(vec{current_velocity.n_elem >= 3 ? current_velocity(2) : 0.}); + else if(L == OutputType::V4 || L == OutputType::VR1) data.emplace_back(vec{current_velocity.n_elem >= 4 ? current_velocity(3) : 0.}); + else if(L == OutputType::V5 || L == OutputType::VR2) data.emplace_back(vec{current_velocity.n_elem >= 5 ? current_velocity(4) : 0.}); + else if(L == OutputType::V6 || L == OutputType::VR3) data.emplace_back(vec{current_velocity.n_elem >= 6 ? current_velocity(5) : 0.}); + else if(L == OutputType::A1) data.emplace_back(vec{current_acceleration.n_elem >= 1 ? current_acceleration(0) : 0.}); + else if(L == OutputType::A2) data.emplace_back(vec{current_acceleration.n_elem >= 2 ? current_acceleration(1) : 0.}); + else if(L == OutputType::A3) data.emplace_back(vec{current_acceleration.n_elem >= 3 ? current_acceleration(2) : 0.}); + else if(L == OutputType::A4 || L == OutputType::AR1) data.emplace_back(vec{current_acceleration.n_elem >= 4 ? current_acceleration(3) : 0.}); + else if(L == OutputType::A5 || L == OutputType::AR2) data.emplace_back(vec{current_acceleration.n_elem >= 5 ? current_acceleration(4) : 0.}); + else if(L == OutputType::A6 || L == OutputType::AR3) data.emplace_back(vec{current_acceleration.n_elem >= 6 ? current_acceleration(5) : 0.}); + else if(L == OutputType::RF1) data.emplace_back(vec{current_resistance.n_elem >= 1 ? current_resistance(0) : 0.}); + else if(L == OutputType::RF2) data.emplace_back(vec{current_resistance.n_elem >= 2 ? current_resistance(1) : 0.}); + else if(L == OutputType::RF3) data.emplace_back(vec{current_resistance.n_elem >= 3 ? current_resistance(2) : 0.}); + else if(L == OutputType::RF4 || L == OutputType::RM1) data.emplace_back(vec{current_resistance.n_elem >= 4 ? current_resistance(3) : 0.}); + else if(L == OutputType::RF5 || L == OutputType::RM2) data.emplace_back(vec{current_resistance.n_elem >= 5 ? current_resistance(4) : 0.}); + else if(L == OutputType::RF6 || L == OutputType::RM3) data.emplace_back(vec{current_resistance.n_elem >= 6 ? current_resistance(5) : 0.}); + else if(L == OutputType::DF1) data.emplace_back(vec{current_damping_force.n_elem >= 1 ? current_damping_force(0) : 0.}); + else if(L == OutputType::DF2) data.emplace_back(vec{current_damping_force.n_elem >= 2 ? current_damping_force(1) : 0.}); + else if(L == OutputType::DF3) data.emplace_back(vec{current_damping_force.n_elem >= 3 ? current_damping_force(2) : 0.}); + else if(L == OutputType::DF4 || L == OutputType::DM1) data.emplace_back(vec{current_damping_force.n_elem >= 4 ? current_damping_force(3) : 0.}); + else if(L == OutputType::DF5 || L == OutputType::DM2) data.emplace_back(vec{current_damping_force.n_elem >= 5 ? current_damping_force(4) : 0.}); + else if(L == OutputType::DF6 || L == OutputType::DM3) data.emplace_back(vec{current_damping_force.n_elem >= 6 ? current_damping_force(5) : 0.}); + else if(L == OutputType::IF1) data.emplace_back(vec{current_inertial_force.n_elem >= 1 ? current_inertial_force(0) : 0.}); + else if(L == OutputType::IF2) data.emplace_back(vec{current_inertial_force.n_elem >= 2 ? current_inertial_force(1) : 0.}); + else if(L == OutputType::IF3) data.emplace_back(vec{current_inertial_force.n_elem >= 3 ? current_inertial_force(2) : 0.}); + else if(L == OutputType::IF4 || L == OutputType::IM1) data.emplace_back(vec{current_inertial_force.n_elem >= 4 ? current_inertial_force(3) : 0.}); + else if(L == OutputType::IF5 || L == OutputType::IM2) data.emplace_back(vec{current_inertial_force.n_elem >= 5 ? current_inertial_force(4) : 0.}); + else if(L == OutputType::IF6 || L == OutputType::IM3) data.emplace_back(vec{current_inertial_force.n_elem >= 6 ? current_inertial_force(5) : 0.}); return data; } void Node::print() { - suanpan_info("Node %u:\n", get_tag(), is_active() ? "" : " is currently inactive"); - coordinate.t().print("Coordinate:"); - current_displacement.t().print("Displacement:"); - current_resistance.t().print("Resistance:"); - if(!suanpan::approx_equal(accu(current_velocity), 0.)) current_velocity.t().print("Velocity:"); - if(!suanpan::approx_equal(accu(current_acceleration), 0.)) current_acceleration.t().print("Acceleration:"); + suanpan_info("Node {}{}\n", get_tag(), is_active() ? ":" : " is currently inactive."); + suanpan_info("Coordinate:", coordinate); + suanpan_info("Displacement:", current_displacement); + suanpan_info("Resistance:", current_resistance); + if(!suanpan::approx_equal(accu(current_velocity), 0.)) + suanpan_info("Velocity:", current_velocity); + if(!suanpan::approx_equal(accu(current_acceleration), 0.)) + suanpan_info("Acceleration:", current_acceleration); } diff --git a/Domain/Node.h b/Domain/Node.h index f996d8e43..5a842c25a 100644 --- a/Domain/Node.h +++ b/Domain/Node.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -90,7 +90,7 @@ class Node final : protected NodeData, public Tag { Node(Node&&) = delete; // move forbidden Node& operator=(const Node&) = delete; // assign forbidden Node& operator=(Node&&) = delete; // assign forbidden - ~Node() override; + ~Node() override = default; void initialize(const shared_ptr&); diff --git a/Domain/NodeHelper.hpp b/Domain/NodeHelper.hpp index 46bd266cd..a0c91440b 100644 --- a/Domain/NodeHelper.hpp +++ b/Domain/NodeHelper.hpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Domain/Storage.hpp b/Domain/Storage.hpp index 5fd49cbd1..3dfc02860 100644 --- a/Domain/Storage.hpp +++ b/Domain/Storage.hpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -30,6 +30,7 @@ #include class Amplitude; +class Expression; class Constraint; class Converger; class Criterion; @@ -52,6 +53,8 @@ template const char* StorageType() { return "Unknown"; } template<> inline const char* StorageType() { return "Amplitude"; } +template<> inline const char* StorageType() { return "Expression"; } + template<> inline const char* StorageType() { return "Constraint"; } template<> inline const char* StorageType() { return "Converger"; } @@ -102,12 +105,12 @@ template class Storage : public std::enable_shared_from_this class Storage : public std::enable_shared_from_this Storage::Storage() { suanpan_debug("Storage %s ctor() called.\n", type); } - -template Storage::~Storage() { suanpan_debug("Storage %s dtor() called.\n", type); } - template typename Storage::const_iterator Storage::cbegin() const { return pond.cbegin(); } template typename Storage::const_iterator Storage::cend() const { return pond.cend(); } @@ -147,7 +146,8 @@ template typename Storage::iterator Storage::end() { return po template bool Storage::insert(const shared_ptr& I) { auto flag = pond.insert({I->get_tag(), I}).second; - if(!flag) suanpan_warning("Storage fails to insert %s %u.\n", type, I->get_tag()); + if(!flag) + suanpan_warning("Fail to insert {} {}.\n", type, I->get_tag()); return flag; } @@ -202,6 +202,7 @@ template typename Storage::iterator begin(Storage& S) { return template typename Storage::iterator end(Storage& S) { return S.end(); } using AmplitudeStorage = Storage; +using ExpressionStorage = Storage; using ConstraintStorage = Storage; using ConvergerStorage = Storage; using CriterionStorage = Storage; diff --git a/Domain/Tag.cpp b/Domain/Tag.cpp index 3df28b7df..3b7581cd2 100644 --- a/Domain/Tag.cpp +++ b/Domain/Tag.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -37,4 +37,6 @@ bool Tag::is_active() const { return alive; } bool Tag::is_guarded() const { return guarded; } -void Tag::print() { suanpan_info("A tagged object.\n"); } +void Tag::print() { + suanpan_info("A tagged object.\n"); +} diff --git a/Domain/Tag.h b/Domain/Tag.h index ea7e0fd71..9a75a5303 100644 --- a/Domain/Tag.h +++ b/Domain/Tag.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Beam/B21.cpp b/Element/Beam/B21.cpp index 0e64d870a..6894932dd 100644 --- a/Element/Beam/B21.cpp +++ b/Element/Beam/B21.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -113,13 +113,13 @@ vector B21::record(const OutputType P) { } void B21::print() { - suanpan_info("A classic 2D displacement based beam element using Hermite interpolation functions%s", nlgeom ? " and corotational formulation.\n" : ".\n"); - node_encoding.t().print("The element connects nodes:"); + suanpan_info("A classic 2D displacement based beam element using Hermite interpolation functions{}", nlgeom ? " and corotational formulation.\n" : ".\n"); + suanpan_info("The element connects nodes:", node_encoding); if(!is_initialized()) return; suanpan_info("Section:\n"); auto J = 1; for(const auto& I : int_pt) { - suanpan_info("IP %d: ", J++); + suanpan_info("IP {}: ", J++); I.b_section->print(); } } diff --git a/Element/Beam/B21.h b/Element/Beam/B21.h index 1cbbeb113..ceda5a3eb 100644 --- a/Element/Beam/B21.h +++ b/Element/Beam/B21.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Beam/B21E.cpp b/Element/Beam/B21E.cpp index 56e9b3814..ced27ade8 100644 --- a/Element/Beam/B21E.cpp +++ b/Element/Beam/B21E.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -40,7 +40,7 @@ int B21E::update_status() { auto counter = 0u; while(true) { if(++counter > max_iteration) { - suanpan_error("B21E element %u fails to converge to %.1E.\n", get_tag(), tolerance); + suanpan_error("Element {} fails to converge to {:.2E}.\n", get_tag(), tolerance); return SUANPAN_FAIL; } @@ -55,7 +55,7 @@ int B21E::update_status() { const auto error = norm(local_resistance(a)); const vec incre = solve(local_stiffness(a, a), local_resistance(a)); - suanpan_extra_debug("B21E local iteration error: %.4E.\n", error); + suanpan_debug("Local iteration error: {:.5E}.\n", error); if(error < tolerance && norm(incre) < tolerance) { const mat t_mat = local_stiffness(b, b) - local_stiffness(b, a) * solve(local_stiffness(a, a), local_stiffness(a, b)); diff --git a/Element/Beam/B21E.h b/Element/Beam/B21E.h index 02e5ff6ee..3147e5bb5 100644 --- a/Element/Beam/B21E.h +++ b/Element/Beam/B21E.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Beam/B21H.cpp b/Element/Beam/B21H.cpp index 06f7ca55a..1396138fc 100644 --- a/Element/Beam/B21H.cpp +++ b/Element/Beam/B21H.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -135,14 +135,14 @@ vector B21H::record(const OutputType P) { } void B21H::print() { - suanpan_info("A 2D beam element with lumped end plasticity (hinges)%s", nlgeom ? " and corotational formulation.\n" : ".\n"); - suanpan_info("The plastic length is: %.3f.\n", hinge_length); - node_encoding.t().print("The element connects nodes:"); + suanpan_info("A 2D beam element with lumped end plasticity (hinges){}", nlgeom ? " and corotational formulation.\n" : ".\n"); + suanpan_info("The plastic hinge length is: {:.3f}.\n", hinge_length); + suanpan_info("The element connects nodes:", node_encoding); if(!is_initialized()) return; suanpan_info("Section:\n"); auto J = 1; for(const auto& I : int_pt) { - suanpan_info("IP %d: ", J++); + suanpan_info("IP {}: ", J++); I.b_section->print(); } } diff --git a/Element/Beam/B21H.h b/Element/Beam/B21H.h index 389c82ed0..beb82ccd8 100644 --- a/Element/Beam/B21H.h +++ b/Element/Beam/B21H.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Beam/B31.cpp b/Element/Beam/B31.cpp index 6de144a3e..28a30621e 100644 --- a/Element/Beam/B31.cpp +++ b/Element/Beam/B31.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -39,14 +39,14 @@ int B31::initialize(const shared_ptr& D) { const mat sec_stiff = sec_proto->get_initial_stiffness()(b_span, b_span); if(!D->find_orientation(orientation_tag)) { - suanpan_warning("Element %u cannot find the assigned transformation.\n", get_tag()); + suanpan_warning("Element {} cannot find the assigned transformation {}.\n", get_tag(), orientation_tag); return SUANPAN_FAIL; } b_trans = D->get_orientation(orientation_tag)->get_copy(); if(b_trans->is_nlgeom() != is_nlgeom()) { - suanpan_warning("Element %u is assigned with an inconsistent transformation.\n", get_tag()); + suanpan_warning("Element {} is assigned with an inconsistent transformation {}.\n", get_tag(), orientation_tag); return SUANPAN_FAIL; } @@ -128,7 +128,9 @@ vector B31::record(const OutputType P) { return output; } -void B31::print() { suanpan_info("A spatial beam element.\n"); } +void B31::print() { + suanpan_info("A spatial beam element.\n"); +} #ifdef SUANPAN_VTK #include diff --git a/Element/Beam/B31.h b/Element/Beam/B31.h index b4d42c7dd..a7fa3a9e7 100644 --- a/Element/Beam/B31.h +++ b/Element/Beam/B31.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Beam/EB21.cpp b/Element/Beam/EB21.cpp index d6cbaf3be..33f0a099c 100644 --- a/Element/Beam/EB21.cpp +++ b/Element/Beam/EB21.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -83,7 +83,9 @@ vector EB21::record(const OutputType P) { return {}; } -void EB21::print() { suanpan_info("An elastic B21 element%s", nlgeom ? " with corotational formulation.\n" : ".\n"); } +void EB21::print() { + suanpan_info("An elastic B21 element{}", nlgeom ? " with corotational formulation.\n" : ".\n"); +} #ifdef SUANPAN_VTK #include diff --git a/Element/Beam/EB21.h b/Element/Beam/EB21.h index 4014a6482..f85f53bf2 100644 --- a/Element/Beam/EB21.h +++ b/Element/Beam/EB21.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Beam/F21.cpp b/Element/Beam/F21.cpp index 1786db601..ea892b393 100644 --- a/Element/Beam/F21.cpp +++ b/Element/Beam/F21.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -144,13 +144,13 @@ vector F21::record(const OutputType P) { } void F21::print() { - suanpan_info("A 2D force based beam element%s.\n", nlgeom ? " and corotational formulation" : ""); - node_encoding.t().print("The element connects nodes:"); + suanpan_info("A 2D force based beam element{}.\n", nlgeom ? " and corotational formulation" : ""); + suanpan_info("The element connects nodes:", node_encoding); if(!is_initialized()) return; suanpan_info("Section:\n"); auto J = 1; for(const auto& I : int_pt) { - suanpan_info("IP %d: ", J++); + suanpan_info("IP {}: ", J++); I.b_section->print(); } } diff --git a/Element/Beam/F21.h b/Element/Beam/F21.h index 71123f08d..0d00099d9 100644 --- a/Element/Beam/F21.h +++ b/Element/Beam/F21.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Beam/F21H.cpp b/Element/Beam/F21H.cpp index ef63c10ec..d9e8f1291 100644 --- a/Element/Beam/F21H.cpp +++ b/Element/Beam/F21H.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -179,13 +179,13 @@ vector F21H::record(const OutputType P) { } void F21H::print() { - suanpan_info("A 2D force based beam element with lumped plasticity%sReference: https://doi.org/10.1016/0045-7949(95)00103-N \n", nlgeom ? " and corotational formulation.\n" : ".\n"); - node_encoding.t().print("The element connects nodes:"); + suanpan_info("A 2D force based beam element with lumped plasticity{} doi: https://doi.org/10.1016/0045-7949(95)00103-N \n", nlgeom ? " and corotational formulation." : "."); + suanpan_info("The element connects nodes:", node_encoding); if(!is_initialized()) return; suanpan_info("Section:\n"); auto J = 1; for(const auto& I : int_pt) { - suanpan_info("IP %d: ", J++); + suanpan_info("IP {}: ", J++); I.b_section->print(); } } diff --git a/Element/Beam/F21H.h b/Element/Beam/F21H.h index 5fdb2925f..1f1c08c2f 100644 --- a/Element/Beam/F21H.h +++ b/Element/Beam/F21H.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Beam/F31.cpp b/Element/Beam/F31.cpp index f06e5ac99..f308481df 100644 --- a/Element/Beam/F31.cpp +++ b/Element/Beam/F31.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -38,14 +38,14 @@ int F31::initialize(const shared_ptr& D) { auto& sec_proto = D->get
(section_tag(0)); if(!D->find_orientation(orientation_tag)) { - suanpan_warning("Element %u cannot find the assigned transformation.\n", get_tag()); + suanpan_warning("Element {} cannot find the assigned transformation {}.\n", get_tag(), orientation_tag); return SUANPAN_FAIL; } b_trans = D->get_orientation(orientation_tag)->get_copy(); if(b_trans->is_nlgeom() != is_nlgeom()) { - suanpan_warning("Element %u is assigned with an inconsistent transformation.\n", get_tag()); + suanpan_warning("Element {} is assigned with an inconsistent transformation {}.\n", get_tag(), orientation_tag); return SUANPAN_FAIL; } @@ -160,13 +160,13 @@ vector F31::record(const OutputType P) { } void F31::print() { - suanpan_info("A 2D force based beam element%s.\n", nlgeom ? " and corotational formulation" : ""); - node_encoding.t().print("The element connects nodes:"); + suanpan_info("A 2D force based beam element{}.\n", nlgeom ? " and corotational formulation" : ""); + suanpan_info("The element connects nodes:", node_encoding); if(!is_initialized()) return; suanpan_info("Section:\n"); auto J = 1; for(const auto& I : int_pt) { - suanpan_info("IP %d: ", J++); + suanpan_info("IP {}: ", J++); I.b_section->print(); } } diff --git a/Element/Beam/F31.h b/Element/Beam/F31.h index 8ff27782f..1b26d4040 100644 --- a/Element/Beam/F31.h +++ b/Element/Beam/F31.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Beam/MVLEM.cpp b/Element/Beam/MVLEM.cpp index f9a3ebb0a..0c3e451ef 100644 --- a/Element/Beam/MVLEM.cpp +++ b/Element/Beam/MVLEM.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -66,7 +66,7 @@ int MVLEM::initialize(const shared_ptr& D) { shear_spring = suanpan::make_copy(D->get(shear_spring_tag)); if(MaterialType::D1 != shear_spring->get_material_type()) { - suanpan_warning("Element %u is assigned with an inconsistent material.\n", get_tag()); + suanpan_warning("Element {} is assigned with an inconsistent material.\n", get_tag()); return SUANPAN_FAIL; } @@ -216,12 +216,12 @@ vector MVLEM::record(const OutputType P) { } void MVLEM::print() { - node_encoding.t().print("A MVLEM element connects nodes:"); + suanpan_info("A MVLEM element connects nodes:", node_encoding); if(!is_initialized()) return; suanpan_info("Section:\n"); auto J = 0; for(const auto& I : axial_spring) { - suanpan_info("Fibre %d:\n", ++J); + suanpan_info("Fibre {}:\n", ++J); suanpan_info("Concrete: "); I.c_material->print(); suanpan_info("Steel: "); diff --git a/Element/Beam/MVLEM.h b/Element/Beam/MVLEM.h index 47797a8a3..ebe881f3b 100644 --- a/Element/Beam/MVLEM.h +++ b/Element/Beam/MVLEM.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Beam/NMB21.cpp b/Element/Beam/NMB21.cpp index a75ecbee3..effaff819 100644 --- a/Element/Beam/NMB21.cpp +++ b/Element/Beam/NMB21.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Beam/NMB21.h b/Element/Beam/NMB21.h index 9175ce439..933dfbc24 100644 --- a/Element/Beam/NMB21.h +++ b/Element/Beam/NMB21.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Beam/NMB21E.cpp b/Element/Beam/NMB21E.cpp index c4f286f10..ab6327057 100644 --- a/Element/Beam/NMB21E.cpp +++ b/Element/Beam/NMB21E.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Beam/NMB21E.h b/Element/Beam/NMB21E.h index cb4396fde..8b7713ac1 100644 --- a/Element/Beam/NMB21E.h +++ b/Element/Beam/NMB21E.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Beam/NMB31.cpp b/Element/Beam/NMB31.cpp index 02b176768..81d0c5372 100644 --- a/Element/Beam/NMB31.cpp +++ b/Element/Beam/NMB31.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -27,14 +27,14 @@ NMB31::NMB31(const unsigned T, uvec&& N, const unsigned S, const unsigned O, con int NMB31::initialize(const shared_ptr& D) { if(!D->find_orientation(orientation_tag)) { - suanpan_warning("Element %u cannot find the assigned transformation.\n", get_tag()); + suanpan_warning("Element {} cannot find the assigned transformation {}.\n", get_tag(), orientation_tag); return SUANPAN_FAIL; } b_trans = D->get_orientation(orientation_tag)->get_copy(); if(b_trans->is_nlgeom() != is_nlgeom()) { - suanpan_warning("Element %u is assigned with an inconsistent transformation.\n", get_tag()); + suanpan_warning("Element {} is assigned with an inconsistent transformation {}.\n", get_tag(), orientation_tag); return SUANPAN_FAIL; } diff --git a/Element/Beam/NMB31.h b/Element/Beam/NMB31.h index 786f119d5..3b05c8bc5 100644 --- a/Element/Beam/NMB31.h +++ b/Element/Beam/NMB31.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Cube/C3D20.cpp b/Element/Cube/C3D20.cpp index 98f18a9a9..b9fd66260 100644 --- a/Element/Cube/C3D20.cpp +++ b/Element/Cube/C3D20.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,8 +19,8 @@ #include #include #include -#include -#include +#include +#include C3D20::IntegrationPoint::IntegrationPoint(vec&& C, const double W, unique_ptr&& M, mat&& P) : coor(std::forward(C)) @@ -184,16 +184,14 @@ vector C3D20::record(const OutputType T) { } void C3D20::print() { - suanpan_info("C3D20 element%s%s.\n", reduced_scheme ? " reduced eight-point Gauss integration" : " full fourteen-point Irons integration", nlgeom ? " nonlinear geometry" : ""); - node_encoding.t().print("The element connects nodes:"); + suanpan_info("A C3D20 element{}{}.\n", reduced_scheme ? " reduced eight-point Gauss integration" : " full fourteen-point Irons integration", nlgeom ? " nonlinear geometry" : ""); + suanpan_info("The element connects nodes:", node_encoding); if(!is_initialized()) return; suanpan_info("Material:\n"); for(const auto& t_pt : int_pt) { t_pt.c_material->print(); - suanpan_info("Strain:\t"); - t_pt.c_material->get_trial_strain().t().print(); - suanpan_info("Stress:\t"); - t_pt.c_material->get_trial_stress().t().print(); + suanpan_info("Strain:\t", t_pt.c_material->get_trial_strain()); + suanpan_info("Stress:\t", t_pt.c_material->get_trial_stress()); } } diff --git a/Element/Cube/C3D20.h b/Element/Cube/C3D20.h index 24e2b51de..eb3e5414b 100644 --- a/Element/Cube/C3D20.h +++ b/Element/Cube/C3D20.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Cube/C3D4.cpp b/Element/Cube/C3D4.cpp index 5d5c46e36..8c7558740 100644 --- a/Element/Cube/C3D4.cpp +++ b/Element/Cube/C3D4.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,8 +19,8 @@ #include #include #include -#include -#include +#include +#include C3D4::C3D4(const unsigned T, uvec&& N, const unsigned M, const bool F) : MaterialElement3D(T, c_node, c_dof, std::forward(N), uvec{M}, F) {} @@ -141,14 +141,12 @@ int C3D4::reset_status() { return c_material->reset_status(); } vector C3D4::record(const OutputType T) { return c_material->record(T); } void C3D4::print() { - node_encoding.t().print("C3D4 element connects:"); + suanpan_info("C3D4 element connects:", node_encoding); if(!is_initialized()) return; suanpan_info("Material:\n"); c_material->print(); - suanpan_info("Strain:\t"); - c_material->get_trial_strain().t().print(); - suanpan_info("Stress:\t"); - c_material->get_trial_stress().t().print(); + suanpan_info("Strain:\t", c_material->get_trial_strain()); + suanpan_info("Stress:\t", c_material->get_trial_stress()); } #ifdef SUANPAN_VTK diff --git a/Element/Cube/C3D4.h b/Element/Cube/C3D4.h index 4c63fa08e..6cb4229eb 100644 --- a/Element/Cube/C3D4.h +++ b/Element/Cube/C3D4.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Cube/C3D8.cpp b/Element/Cube/C3D8.cpp index d943014f9..ef05f070f 100644 --- a/Element/Cube/C3D8.cpp +++ b/Element/Cube/C3D8.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,8 +20,8 @@ #include #include #include -#include -#include +#include +#include const field C3D8::h_mode{{1., 1., -1., -1., -1., -1., 1., 1.}, {1., -1., -1., 1., -1., 1., 1., -1.}, {1., -1., 1., -1., 1., -1., 1., -1.}, {-1., 1., -1., 1., 1., -1., 1., -1.}}; @@ -204,16 +204,19 @@ vector C3D8::record(const OutputType T) { } void C3D8::print() { - suanpan_info("C3D8 element%s%s.\n", int_scheme == 'R' ? " reduced integration" : int_scheme == 'I' ? " Iron's integration" : " full integration", nlgeom ? " nonlinear geometry" : ""); - node_encoding.t().print("The element connects nodes:"); + suanpan_info("A C3D8 element{}{}.\n", int_scheme == 'R' + ? " reduced integration" + : int_scheme == 'I' + ? " Iron's integration" + : " full integration", + nlgeom ? " nonlinear geometry" : ""); + suanpan_info("The element connects nodes:", node_encoding); if(!is_initialized()) return; suanpan_info("Material:\n"); for(const auto& t_pt : int_pt) { t_pt.c_material->print(); - suanpan_info("Strain:\t"); - t_pt.c_material->get_trial_strain().t().print(); - suanpan_info("Stress:\t"); - t_pt.c_material->get_trial_stress().t().print(); + suanpan_info("Strain:\t", t_pt.c_material->get_trial_strain()); + suanpan_info("Stress:\t", t_pt.c_material->get_trial_stress()); } } diff --git a/Element/Cube/C3D8.h b/Element/Cube/C3D8.h index 0f47853ee..2f6a58106 100644 --- a/Element/Cube/C3D8.h +++ b/Element/Cube/C3D8.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Cube/C3D8I.cpp b/Element/Cube/C3D8I.cpp index 57e42681b..13917e88a 100644 --- a/Element/Cube/C3D8I.cpp +++ b/Element/Cube/C3D8I.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,7 +20,7 @@ #include #include #include -#include +#include C3D8I::IntegrationPoint::IntegrationPoint(vec&& C, const double W, unique_ptr&& M, mat&& P) : coor(std::forward(C)) @@ -147,15 +147,13 @@ vector C3D8I::record(const OutputType T) { } void C3D8I::print() { - node_encoding.t().print("C3D8I element connects nodes:"); + suanpan_info("C3D8I element connects nodes:", node_encoding); if(!is_initialized()) return; suanpan_info("Material:\n"); for(const auto& t_pt : int_pt) { t_pt.c_material->print(); - suanpan_info("Strain:\t"); - t_pt.c_material->get_trial_strain().t().print(); - suanpan_info("Stress:\t"); - t_pt.c_material->get_trial_stress().t().print(); + suanpan_info("Strain:\t", t_pt.c_material->get_trial_strain()); + suanpan_info("Stress:\t", t_pt.c_material->get_trial_stress()); } } diff --git a/Element/Cube/C3D8I.h b/Element/Cube/C3D8I.h index b7696f238..58d4fdd2c 100644 --- a/Element/Cube/C3D8I.h +++ b/Element/Cube/C3D8I.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Cube/CIN3D8.cpp b/Element/Cube/CIN3D8.cpp index 7a9d120e2..d25c5f4c0 100644 --- a/Element/Cube/CIN3D8.cpp +++ b/Element/Cube/CIN3D8.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,7 +20,7 @@ #include #include #include -#include +#include CIN3D8::IntegrationPoint::IntegrationPoint(vec&& C, const double W, unique_ptr&& M, mat&& P) : coor(std::forward(C)) @@ -233,15 +233,13 @@ vector CIN3D8::record(const OutputType T) { } void CIN3D8::print() { - node_encoding.t().print("CIN3D8 element connects nodes:"); + suanpan_info("CIN3D8 element connects nodes:", node_encoding); if(!is_initialized()) return; suanpan_info("Material:\n"); for(const auto& t_pt : int_pt) { t_pt.c_material->print(); - suanpan_info("Strain:\t"); - t_pt.c_material->get_trial_strain().t().print(); - suanpan_info("Stress:\t"); - t_pt.c_material->get_trial_stress().t().print(); + suanpan_info("Strain:\t", t_pt.c_material->get_trial_strain()); + suanpan_info("Stress:\t", t_pt.c_material->get_trial_stress()); } } diff --git a/Element/Cube/CIN3D8.h b/Element/Cube/CIN3D8.h index 87f07a3be..3395e89b6 100644 --- a/Element/Cube/CIN3D8.h +++ b/Element/Cube/CIN3D8.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Cube/DC3D4.cpp b/Element/Cube/DC3D4.cpp index 90baa802d..e463d49cf 100644 --- a/Element/Cube/DC3D4.cpp +++ b/Element/Cube/DC3D4.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,7 +19,7 @@ #include #include #include -#include +#include const uvec DC3D4::u_dof{0, 1, 2, 4, 5, 6, 8, 9, 10, 12, 13, 14}; const uvec DC3D4::d_dof{3, 7, 11, 15}; @@ -112,14 +112,12 @@ vector DC3D4::record(const OutputType T) { } void DC3D4::print() { - node_encoding.t().print("DC3D4 element connects:"); + suanpan_info("DC3D4 element connects:", node_encoding); if(!is_initialized()) return; suanpan_info("Material:\n"); c_material->print(); - suanpan_info("Strain:\t"); - c_material->get_current_strain().t().print(); - suanpan_info("Stress:\t"); - c_material->get_current_stress().t().print(); + suanpan_info("Strain:\t", c_material->get_current_strain()); + suanpan_info("Stress:\t", c_material->get_current_stress()); } #ifdef SUANPAN_VTK diff --git a/Element/Cube/DC3D4.h b/Element/Cube/DC3D4.h index ee2de1499..9b0ff6c13 100644 --- a/Element/Cube/DC3D4.h +++ b/Element/Cube/DC3D4.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Cube/DC3D8.cpp b/Element/Cube/DC3D8.cpp index 24df8d054..45af1c4ed 100644 --- a/Element/Cube/DC3D8.cpp +++ b/Element/Cube/DC3D8.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,7 +20,7 @@ #include #include #include -#include +#include const uvec DC3D8::u_dof{0, 1, 2, 4, 5, 6, 8, 9, 10, 12, 13, 14, 16, 17, 18, 20, 21, 22, 24, 25, 26, 28, 29, 30}; const uvec DC3D8::d_dof{3, 7, 11, 15, 19, 23, 27, 31}; @@ -136,15 +136,13 @@ vector DC3D8::record(const OutputType T) { } void DC3D8::print() { - node_encoding.t().print("DC3D8 element connects:"); + suanpan_info("DC3D8 element connects:", node_encoding); if(!is_initialized()) return; suanpan_info("Material:\n"); for(const auto& t_pt : int_pt) { t_pt.c_material->print(); - suanpan_info("Strain:\t"); - t_pt.c_material->get_current_strain().t().print(); - suanpan_info("Stress:\t"); - t_pt.c_material->get_current_stress().t().print(); + suanpan_info("Strain:\t", t_pt.c_material->get_current_strain()); + suanpan_info("Stress:\t", t_pt.c_material->get_current_stress()); } } diff --git a/Element/Cube/DC3D8.h b/Element/Cube/DC3D8.h index dcf615085..e4e61b18e 100644 --- a/Element/Cube/DC3D8.h +++ b/Element/Cube/DC3D8.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Element b/Element/Element index 97ae91533..22f358fb3 100644 --- a/Element/Element +++ b/Element/Element @@ -11,9 +11,8 @@ #include "Visualisation/Visualisation" #include "Element.h" -#include "ElementTemplate.h" #include "MaterialElement.h" #include "SectionElement.h" #include -#include
\ No newline at end of file +#include
diff --git a/Element/Element.cpp b/Element/Element.cpp index 0f90c7f7d..500a39236 100644 --- a/Element/Element.cpp +++ b/Element/Element.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -257,10 +257,7 @@ Element::Element(const unsigned T, const unsigned NN, const unsigned ND, uvec&& , num_dof(ND) , mat_type(MTP) , sec_type(SectionType::D0) - , dof_identifier(std::forward>(DI)) { - suanpan_debug("Element %u ctor() called.\n", T); - suanpan_debug([&] { if(!dof_identifier.empty() && num_dof != dof_identifier.size()) throw invalid_argument("size of dof identifier must meet number of dofs"); }); -} + , dof_identifier(std::forward>(DI)) { suanpan_assert([&] { if(!dof_identifier.empty() && num_dof != dof_identifier.size()) throw invalid_argument("size of dof identifier must meet number of dofs"); }); } Element::Element(const unsigned T, const unsigned NN, const unsigned ND, uvec&& NT, uvec&& ST, const bool F, const SectionType STP, std::vector&& DI) : DataElement{std::forward(NT), uvec{}, std::forward(ST), F, true, true, true, true, {}} @@ -269,10 +266,7 @@ Element::Element(const unsigned T, const unsigned NN, const unsigned ND, uvec&& , num_dof(ND) , mat_type(MaterialType::D0) , sec_type(STP) - , dof_identifier(std::forward>(DI)) { - suanpan_debug("Element %u ctor() called.\n", T); - suanpan_debug([&] { if(!dof_identifier.empty() && num_dof != dof_identifier.size()) throw invalid_argument("size of dof identifier must meet number of dofs"); }); -} + , dof_identifier(std::forward>(DI)) { suanpan_assert([&] { if(!dof_identifier.empty() && num_dof != dof_identifier.size()) throw invalid_argument("size of dof identifier must meet number of dofs"); }); } // for contact elements that use node groups Element::Element(const unsigned T, const unsigned ND, uvec&& GT) @@ -282,7 +276,7 @@ Element::Element(const unsigned T, const unsigned ND, uvec&& GT) , num_dof(ND) , use_group(true) , mat_type(MaterialType::D0) - , sec_type(SectionType::D0) { suanpan_debug("Element %u ctor() called.\n", T); } + , sec_type(SectionType::D0) {} // for elements that use other elements Element::Element(const unsigned T, const unsigned ND, const unsigned ET, const unsigned NT) @@ -292,9 +286,7 @@ Element::Element(const unsigned T, const unsigned ND, const unsigned ET, const u , num_dof(ND) , use_other(ET) , mat_type(MaterialType::D0) - , sec_type(SectionType::D0) { suanpan_debug("Element %u ctor() called.\n", T); } - -Element::~Element() { suanpan_debug("Element %u dtor() called.\n", get_tag()); } + , sec_type(SectionType::D0) {} int Element::initialize_base(const shared_ptr& D) { // initialized already, check node validity @@ -348,7 +340,7 @@ int Element::initialize_base(const shared_ptr& D) { node_ptr.reserve(num_node); for(const auto& t_tag : node_encoding) { if(!D->find(t_tag)) { - suanpan_warning("Element %u cannot find node %u thus disabled.\n", get_tag(), t_tag); + suanpan_warning("Element {} disabled as node {} cannot be found.\n", get_tag(), t_tag); return SUANPAN_FAIL; } auto& t_node = D->get(t_tag); @@ -356,7 +348,7 @@ int Element::initialize_base(const shared_ptr& D) { if(!t_node->is_active()) inactive = true; } if(inactive) { - suanpan_warning("Element %u finds inactive nodes thus disabled.\n", get_tag()); + suanpan_warning("Element {} disabled as inactive nodes used.\n", get_tag()); return SUANPAN_FAIL; } for(auto& I : node_ptr) if(I.lock()->get_dof_number() < num_dof) I.lock()->set_dof_number(num_dof); @@ -365,7 +357,7 @@ int Element::initialize_base(const shared_ptr& D) { if(MaterialType::D0 != mat_type) for(const auto& t_tag : material_tag) if(auto& t_material = D->get(t_tag); nullptr == t_material || !t_material->is_active() || t_material->get_material_type() != MaterialType::DS && t_material->get_material_type() != mat_type) { - suanpan_warning("Element %u cannot find valid material %llu thus disabled.\n", get_tag(), t_tag); + suanpan_warning("Element {} disabled as material {} cannot be found.\n", get_tag(), t_tag); return SUANPAN_FAIL; } @@ -373,7 +365,7 @@ int Element::initialize_base(const shared_ptr& D) { if(SectionType::D0 != sec_type) for(const auto& t_tag : section_tag) if(auto& t_section = D->get
(t_tag); nullptr == t_section || !t_section->is_active() || t_section->get_section_type() != sec_type) { - suanpan_warning("Element %u cannot find valid section %llu thus disabled.\n", get_tag(), t_tag); + suanpan_warning("Element {} disabled as section {} cannot be found.\n", get_tag(), t_tag); return SUANPAN_FAIL; } diff --git a/Element/Element.h b/Element/Element.h index 549ce1573..246cac6d5 100644 --- a/Element/Element.h +++ b/Element/Element.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -176,7 +176,7 @@ class Element : protected DataElement, public ElementBase { Element& operator=(const Element&) = delete; // assign forbidden Element& operator=(Element&&) = delete; // assign forbidden - ~Element() override; + ~Element() override = default; int initialize_base(const shared_ptr&) final; diff --git a/Element/ElementBase.h b/Element/ElementBase.h index e956d5512..615fe9302 100644 --- a/Element/ElementBase.h +++ b/Element/ElementBase.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/ElementParser.cpp b/Element/ElementParser.cpp index 4432cce21..a4e47b3fb 100644 --- a/Element/ElementParser.cpp +++ b/Element/ElementParser.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -26,25 +26,27 @@ using std::vector; void new_allman(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_allman() needs a tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(3); if(!get_input(command, node_tag)) { - suanpan_error("new_allman() needs three valid nodes.\n"); + suanpan_error("Three valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_allman() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } auto thickness = 1.; - if(command.eof()) suanpan_debug("new_allman() assumes thickness to be unit.\n"); - else if(!get_input(command, thickness)) suanpan_error("new_allman() needs a valid thickness.\n"); + if(command.eof()) + suanpan_debug("Unit thickness assumed.\n"); + else if(!get_input(command, thickness)) + suanpan_error("A valid thickness is required.\n"); return_obj = make_unique(tag, std::move(node_tag), material_tag, thickness); } @@ -52,31 +54,31 @@ void new_allman(unique_ptr& return_obj, istringstream& command) { void new_b21(unique_ptr& return_obj, istringstream& command, const unsigned which) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_b21() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(2); if(!get_input(command, node_tag)) { - suanpan_error("new_b21() needs two valid nodes.\n"); + suanpan_error("Two valid nodes are required.\n"); return; } unsigned section_id; if(!get_input(command, section_id)) { - suanpan_error("new_b21() needs a valid section tag.\n"); + suanpan_error("A valid section tag is required.\n"); return; } unsigned int_pt = 6; if(!get_optional_input(command, int_pt)) { - suanpan_error("new_b21() needs a valid number of integration points.\n"); + suanpan_error("A valid number of integration points is required.\n"); return; } string nonlinear = "false"; if(!get_optional_input(command, nonlinear)) { - suanpan_error("new_b21() needs a valid nonlinear geometry switch (0,1).\n"); + suanpan_error("A valid nonlinear geometry switch is required.\n"); return; } @@ -87,31 +89,31 @@ void new_b21(unique_ptr& return_obj, istringstream& command, const unsi void new_b21h(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_b21h() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(2); if(!get_input(command, node_tag)) { - suanpan_error("new_b21h() needs two valid nodes.\n"); + suanpan_error("Two valid nodes are required.\n"); return; } unsigned section_id; if(!get_input(command, section_id)) { - suanpan_error("new_b21h() needs a valid section tag.\n"); + suanpan_error("A valid section tag is required.\n"); return; } auto elastic_length = .2; if(!command.eof() && !get_input(command, elastic_length)) { - suanpan_error("new_b21h() needs a valid number of integration points.\n"); + suanpan_error("A valid number of integration points is required.\n"); return; } string nonlinear = "false"; if(!get_optional_input(command, nonlinear)) { - suanpan_error("new_b21h() needs a valid nonlinear geometry switch (0,1).\n"); + suanpan_error("A valid nonlinear geometry switch is required.\n"); return; } @@ -121,37 +123,37 @@ void new_b21h(unique_ptr& return_obj, istringstream& command) { void new_b31(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_b31() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(2); if(!get_input(command, node_tag)) { - suanpan_error("new_b31() needs two valid nodes.\n"); + suanpan_error("Two valid nodes are required.\n"); return; } unsigned section_id; if(!get_input(command, section_id)) { - suanpan_error("new_b31() needs a valid section tag.\n"); + suanpan_error("A valid section tag is required.\n"); return; } unsigned orientation_id; if(!get_input(command, orientation_id)) { - suanpan_error("new_b31() needs a valid orientation tag.\n"); + suanpan_error("A valid orientation tag is required.\n"); return; } unsigned int_pt = 6; if(!get_optional_input(command, int_pt)) { - suanpan_error("new_b31() needs a valid number of integration points.\n"); + suanpan_error("A valid number of integration points is required.\n"); return; } string nonlinear = "false"; if(!get_optional_input(command, nonlinear)) { - suanpan_error("new_b31() needs a valid nlgeom switch.\n"); + suanpan_error("A valid nlgeom switch is required.\n"); return; } @@ -161,25 +163,25 @@ void new_b31(unique_ptr& return_obj, istringstream& command) { void new_nmb21(unique_ptr& return_obj, istringstream& command, const unsigned which) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_nmb21() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(2); if(!get_input(command, node_tag)) { - suanpan_error("new_nmb21() needs two valid nodes.\n"); + suanpan_error("Two valid nodes are required.\n"); return; } unsigned section_id; if(!get_input(command, section_id)) { - suanpan_error("new_nmb21() needs a valid section tag.\n"); + suanpan_error("A valid section tag is required.\n"); return; } string nonlinear = "false"; if(!get_optional_input(command, nonlinear)) { - suanpan_error("new_nmb21() needs a valid nonlinear geometry switch.\n"); + suanpan_error("A valid nonlinear geometry switch is required.\n"); return; } @@ -190,31 +192,31 @@ void new_nmb21(unique_ptr& return_obj, istringstream& command, const un void new_nmb31(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_nmb31() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(2); if(!get_input(command, node_tag)) { - suanpan_error("new_nmb31() needs two valid nodes.\n"); + suanpan_error("Two valid nodes are required.\n"); return; } unsigned section_id; if(!get_input(command, section_id)) { - suanpan_error("new_nmb31() needs a valid section tag.\n"); + suanpan_error("A valid section tag is required.\n"); return; } unsigned orientation_id; if(!get_input(command, orientation_id)) { - suanpan_error("new_nmb31() needs a valid orientation tag.\n"); + suanpan_error("A valid orientation tag is required.\n"); return; } string nonlinear = "false"; if(!get_optional_input(command, nonlinear)) { - suanpan_error("new_nmb31() needs a valid nonlinear geometry switch.\n"); + suanpan_error("A valid nonlinear geometry switch is required.\n"); return; } @@ -224,29 +226,33 @@ void new_nmb31(unique_ptr& return_obj, istringstream& command) { void new_c3d20(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_c3d20() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(20); if(!get_input(command, node_tag)) { - suanpan_error("new_c3d20() needs twenty valid nodes.\n"); + suanpan_error("Twenty valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_c3d20() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } string reduced_scheme = "true"; - if(command.eof()) suanpan_debug("new_c3d20() assumes standard Irons 14-point integration scheme.\n"); - else if(!get_input(command, reduced_scheme)) suanpan_error("new_c3d20() needs a valid reduced integration switch (0,1).\n"); + if(command.eof()) + suanpan_debug("Standard Irons 14-point integration scheme assumed.\n"); + else if(!get_input(command, reduced_scheme)) + suanpan_error("A valid reduced integration switch is required.\n"); string nonlinear = "false"; - if(command.eof()) suanpan_debug("new_c3d20() assumes linear geometry.\n"); - else if(!get_input(command, nonlinear)) suanpan_error("new_c3d20() needs a valid nonlinear geometry switch (0,1).\n"); + if(command.eof()) + suanpan_debug("Linear geometry assumed.\n"); + else if(!get_input(command, nonlinear)) + suanpan_error("A valid nonlinear geometry switch is required.\n"); return_obj = make_unique(tag, std::move(node_tag), material_tag, is_true(reduced_scheme), is_true(nonlinear)); } @@ -254,25 +260,27 @@ void new_c3d20(unique_ptr& return_obj, istringstream& command) { void new_c3d4(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_c3d4() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(4); if(!get_input(command, node_tag)) { - suanpan_error("new_c3d4() needs four valid nodes.\n"); + suanpan_error("Four valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_c3d4() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } string nonlinear = "false"; - if(command.eof()) suanpan_debug("new_c3d4() assumes linear geometry.\n"); - else if(!get_input(command, nonlinear)) suanpan_error("new_c3d4() needs a valid nonlinear geometry switch (0,1).\n"); + if(command.eof()) + suanpan_debug("Linear geometry assumed.\n"); + else if(!get_input(command, nonlinear)) + suanpan_error("A valid nonlinear geometry switch is required.\n"); return_obj = make_unique(tag, std::move(node_tag), material_tag, is_true(nonlinear)); } @@ -280,29 +288,33 @@ void new_c3d4(unique_ptr& return_obj, istringstream& command) { void new_c3d8(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_c3d8() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(8); if(!get_input(command, node_tag)) { - suanpan_error("new_c3d8() needs eight valid nodes.\n"); + suanpan_error("Eight valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_c3d8() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } string reduced_scheme = "I"; - if(command.eof()) suanpan_debug("new_c3d8() assumes standard integration scheme (2*2).\n"); - else if(!get_input(command, reduced_scheme)) suanpan_error("new_c3d8() needs a valid reduced integration switch (0,1).\n"); + if(command.eof()) + suanpan_debug("Standard 4-point integration scheme assumed.\n"); + else if(!get_input(command, reduced_scheme)) + suanpan_error("A valid reduced integration switch is required.\n"); string nonlinear = "false"; - if(command.eof()) suanpan_debug("new_c3d8() assumes linear geometry.\n"); - else if(!get_input(command, nonlinear)) suanpan_error("new_c3d8() needs a valid nonlinear geometry switch (0,1).\n"); + if(command.eof()) + suanpan_debug("Linear geometry assumed.\n"); + else if(!get_input(command, nonlinear)) + suanpan_error("A valid nonlinear geometry switch is required.\n"); return_obj = make_unique(tag, std::move(node_tag), material_tag, suanpan::to_upper(reduced_scheme[0]), is_true(nonlinear)); } @@ -310,25 +322,27 @@ void new_c3d8(unique_ptr& return_obj, istringstream& command) { void new_c3d8r(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_c3d8r() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(8); if(!get_input(command, node_tag)) { - suanpan_error("new_c3d8r() needs eight valid nodes.\n"); + suanpan_error("Eight valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_c3d8r() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } string nonlinear = "false"; - if(command.eof()) suanpan_debug("new_c3d8() assumes linear geometry.\n"); - else if(!get_input(command, nonlinear)) suanpan_error("new_c3d8() needs a valid nonlinear geometry switch (0,1).\n"); + if(command.eof()) + suanpan_debug("Linear geometry assumed.\n"); + else if(!get_input(command, nonlinear)) + suanpan_error("A valid nonlinear geometry switch is required.\n"); return_obj = make_unique(tag, std::move(node_tag), material_tag, 'R', is_true(nonlinear)); } @@ -336,19 +350,19 @@ void new_c3d8r(unique_ptr& return_obj, istringstream& command) { void new_c3d8i(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_c3d8i() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(8); if(!get_input(command, node_tag)) { - suanpan_error("new_c3d8i() needs eight valid nodes.\n"); + suanpan_error("Eight valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_c3d8i() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } @@ -358,25 +372,27 @@ void new_c3d8i(unique_ptr& return_obj, istringstream& command) { void new_cax3(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_cax3() needs a tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(3); if(!get_input(command, node_tag)) { - suanpan_error("new_cax3() needs three valid nodes.\n"); + suanpan_error("Three valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_cax3() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } string nonlinear = "false"; - if(command.eof()) suanpan_debug("new_cax3() assumes linear geometry.\n"); - else if(!get_input(command, nonlinear)) suanpan_error("new_cax3() needs a valid nonlinear geometry switch.\n"); + if(command.eof()) + suanpan_debug("Linear geometry assumed.\n"); + else if(!get_input(command, nonlinear)) + suanpan_error("A valid nonlinear geometry switch is required.\n"); return_obj = make_unique(tag, std::move(node_tag), material_tag, is_true(nonlinear)); } @@ -384,19 +400,19 @@ void new_cax3(unique_ptr& return_obj, istringstream& command) { void new_cax4(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_cax4() needs a tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(4); if(!get_input(command, node_tag)) { - suanpan_error("new_cax4() needs four valid nodes.\n"); + suanpan_error("Four valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_cax4() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } @@ -406,19 +422,19 @@ void new_cax4(unique_ptr& return_obj, istringstream& command) { void new_cax8(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_cax8() needs a tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(8); if(!get_input(command, node_tag)) { - suanpan_error("new_cax8() needs eight valid nodes.\n"); + suanpan_error("Eight valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_cax8() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } @@ -428,23 +444,23 @@ void new_cax8(unique_ptr& return_obj, istringstream& command) { void new_contact2d(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_contact2d() needs a tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } unsigned master_tag, slave_tag; if(!get_input(command, master_tag)) { - suanpan_error("new_contact2d() needs valid master group tag.\n"); + suanpan_error("A valid master group tag is required.\n"); return; } if(!get_input(command, slave_tag)) { - suanpan_error("new_contact2d() needs valid slave group tag.\n"); + suanpan_error("A valid slave group tag is required.\n"); return; } auto alpha = 1E6; if(!get_optional_input(command, alpha)) { - suanpan_error("new_contact2d() needs valid multiplier.\n"); + suanpan_error("A valid multiplier is required.\n"); return; } @@ -454,23 +470,23 @@ void new_contact2d(unique_ptr& return_obj, istringstream& command) { void new_contact3d(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_contact3d() needs a tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } unsigned master_tag, slave_tag; if(!get_input(command, master_tag)) { - suanpan_error("new_contact3d() needs valid master group tag.\n"); + suanpan_error("A valid master group tag is required.\n"); return; } if(!get_input(command, slave_tag)) { - suanpan_error("new_contact3d() needs valid slave group tag.\n"); + suanpan_error("A valid slave group tag is required.\n"); return; } auto alpha = 1E6; if(!get_optional_input(command, alpha)) { - suanpan_error("new_contact3d() needs valid multiplier.\n"); + suanpan_error("A valid multiplier is required.\n"); return; } @@ -480,31 +496,33 @@ void new_contact3d(unique_ptr& return_obj, istringstream& command) { void new_cp3(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_cp3() needs a tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(3); if(!get_input(command, node_tag)) { - suanpan_error("new_cp3() needs three valid nodes.\n"); + suanpan_error("Three valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_cp3() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } auto thickness = 1.; if(!get_optional_input(command, thickness)) { - suanpan_error("new_cp3() assumes thickness to be unit.\n"); + suanpan_error("A valid thickness is required.\n"); return; } string nonlinear = "false"; - if(command.eof()) suanpan_debug("new_cp3() assumes linear geometry.\n"); - else if(!get_input(command, nonlinear)) suanpan_error("new_cp3() needs a valid nonlinear geometry switch.\n"); + if(command.eof()) + suanpan_debug("Linear geometry assumed.\n"); + else if(!get_input(command, nonlinear)) + suanpan_error("A valid nonlinear geometry switch is required.\n"); return_obj = make_unique(tag, std::move(node_tag), material_tag, thickness, is_true(nonlinear)); } @@ -512,39 +530,41 @@ void new_cp3(unique_ptr& return_obj, istringstream& command) { void new_cp4(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_cp4() needs a tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(4); if(!get_input(command, node_tag)) { - suanpan_error("new_cp4() needs four valid nodes.\n"); + suanpan_error("Four valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_cp4() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } auto thickness = 1.; if(!get_optional_input(command, thickness)) { - suanpan_error("new_cp4() needs a valid thickness.\n"); + suanpan_error("A valid thickness is required.\n"); return; } string reduced_scheme = "N"; - if(command.eof()) suanpan_debug("new_cp4() assumes full integration.\n"); + if(command.eof()) + suanpan_debug("Full integration assumed.\n"); else if(!get_input(command, reduced_scheme)) { - suanpan_error("new_cp4() needs a valid reduced scheme switch.\n"); + suanpan_error("A valid reduced scheme switch is required.\n"); return; } string nonlinear = "N"; - if(command.eof()) suanpan_debug("new_cp4() assumes linear geometry.\n"); + if(command.eof()) + suanpan_debug("Linear geometry assumed.\n"); else if(!get_input(command, nonlinear)) { - suanpan_error("new_cp4() needs a valid nonlinear geometry switch.\n"); + suanpan_error("A valid nonlinear geometry switch is required.\n"); return; } @@ -554,25 +574,25 @@ void new_cp4(unique_ptr& return_obj, istringstream& command) { void new_cp4i(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_cp4i() needs a tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(4); if(!get_input(command, node_tag)) { - suanpan_error("new_cp4i() needs four valid nodes.\n"); + suanpan_error("Four valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_cp4i() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } auto thickness = 1.; if(!get_optional_input(command, thickness)) { - suanpan_error("new_cp4i() needs a valid thickness.\n"); + suanpan_error("A valid thickness is required.\n"); return; } @@ -582,31 +602,33 @@ void new_cp4i(unique_ptr& return_obj, istringstream& command) { void new_cp4r(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_cp4r() needs a tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(4); if(!get_input(command, node_tag)) { - suanpan_error("new_cp4r() needs four valid nodes.\n"); + suanpan_error("Four valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_cp4r() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } auto thickness = 1.; if(!get_optional_input(command, thickness)) { - suanpan_error("new_cp4r() needs a valid thickness.\n"); + suanpan_error("A valid thickness is required.\n"); return; } string nonlinear = "false"; - if(command.eof()) suanpan_debug("new_cp4r() assumes linear geometry.\n"); - else if(!get_input(command, nonlinear)) suanpan_error("new_cp4r() needs a valid nonlinear geometry switch (0,1).\n"); + if(command.eof()) + suanpan_debug("Linear geometry assumed.\n"); + else if(!get_input(command, nonlinear)) + suanpan_error("A valid nonlinear geometry switch is required.\n"); return_obj = make_unique(tag, std::move(node_tag), material_tag, thickness, true, is_true(nonlinear)); } @@ -614,31 +636,31 @@ void new_cp4r(unique_ptr& return_obj, istringstream& command) { void new_cp5(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_cp5() needs a tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(5); if(!get_input(command, node_tag)) { - suanpan_error("new_cp5() needs five valid nodes.\n"); + suanpan_error("Five valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_cp5() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } auto thickness = 1.; if(!get_optional_input(command, thickness)) { - suanpan_error("new_cp5() needs a valid thickness.\n"); + suanpan_error("A valid thickness is required.\n"); return; } string nonlinear = "N"; if(!command.eof() && !get_input(command, nonlinear)) { - suanpan_error("new_cp5() needs a valid nonlinear geometry switch (0,1).\n"); + suanpan_error("A valid nonlinear geometry switch is required.\n"); return; } @@ -648,31 +670,31 @@ void new_cp5(unique_ptr& return_obj, istringstream& command) { void new_cp6(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_cp6() needs a tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(6); if(!get_input(command, node_tag)) { - suanpan_error("new_cp6() needs six valid nodes.\n"); + suanpan_error("Six valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_cp6() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } auto thickness = 1.; if(!get_optional_input(command, thickness)) { - suanpan_error("new_cp6() needs a valid thickness.\n"); + suanpan_error("A valid thickness is required.\n"); return; } string nonlinear = "false"; if(!get_optional_input(command, nonlinear)) { - suanpan_error("new_cp6() needs a valid nonlinear geometry switch.\n"); + suanpan_error("A valid nonlinear geometry switch is required.\n"); return; } @@ -682,31 +704,31 @@ void new_cp6(unique_ptr& return_obj, istringstream& command) { void new_cp7(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_cp7() needs a tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(7); if(!get_input(command, node_tag)) { - suanpan_error("new_cp7() needs five valid nodes.\n"); + suanpan_error("Five valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_cp7() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } auto thickness = 1.; if(!get_optional_input(command, thickness)) { - suanpan_error("new_cp7() needs a valid thickness.\n"); + suanpan_error("A valid thickness is required.\n"); return; } string nonlinear = "N"; if(!command.eof() && !get_input(command, nonlinear)) { - suanpan_error("new_cp7() needs a valid nonlinear geometry switch (0,1).\n"); + suanpan_error("A valid nonlinear geometry switch is required.\n"); return; } @@ -716,37 +738,37 @@ void new_cp7(unique_ptr& return_obj, istringstream& command) { void new_cp8(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_cp8() needs a tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(8); if(!get_input(command, node_tag)) { - suanpan_error("new_cp8() needs eight valid nodes.\n"); + suanpan_error("Eight valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_cp8() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } auto thickness = 1.; if(!get_optional_input(command, thickness)) { - suanpan_error("new_cp8() needs a valid thickness.\n"); + suanpan_error("A valid thickness is required.\n"); return; } string reduced_scheme = "N"; if(!get_optional_input(command, reduced_scheme)) { - suanpan_error("new_cp8() needs a valid reduced integration switch.\n"); + suanpan_error("A valid reduced integration switch is required.\n"); return; } string nonlinear = "N"; if(!get_optional_input(command, nonlinear)) { - suanpan_error("new_cp8() needs a valid nonlinear geometry switch (0,1).\n"); + suanpan_error("A valid nonlinear geometry switch is required.\n"); return; } @@ -756,31 +778,31 @@ void new_cp8(unique_ptr& return_obj, istringstream& command) { void new_cpe8(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_cpe8() needs a tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(8); if(!get_input(command, node_tag)) { - suanpan_error("new_cpe8() needs eight valid nodes.\n"); + suanpan_error("Eight valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_cpe8() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } string reduced_scheme = "N"; if(!command.eof() && !get_input(command, reduced_scheme)) { - suanpan_error("new_cp8() needs a valid reduced integration switch (0,1).\n"); + suanpan_error("A valid reduced integration switch is required.\n"); return; } string nonlinear = "N"; if(!command.eof() && !get_input(command, nonlinear)) { - suanpan_error("new_cp8() needs a valid nonlinear geometry switch (0,1).\n"); + suanpan_error("A valid nonlinear geometry switch is required.\n"); return; } @@ -790,25 +812,25 @@ void new_cpe8(unique_ptr& return_obj, istringstream& command) { void new_cpe8r(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_cpe8r() needs a tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(8); if(!get_input(command, node_tag)) { - suanpan_error("new_cpe8r() needs eight valid nodes.\n"); + suanpan_error("Eight valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_cpe8r() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } string nonlinear = "N"; if(!command.eof() && !get_input(command, nonlinear)) { - suanpan_error("new_cpe8r() needs a valid nonlinear geometry switch.\n"); + suanpan_error("A valid nonlinear geometry switch is required.\n"); return; } @@ -818,25 +840,25 @@ void new_cpe8r(unique_ptr& return_obj, istringstream& command) { void new_cinp4(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_cinp4() needs a tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(4); if(!get_input(command, node_tag)) { - suanpan_error("new_cinp4() needs four valid nodes.\n"); + suanpan_error("Four valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_cinp4() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } auto thickness = 1.; if(!get_optional_input(command, thickness)) { - suanpan_error("new_cinp4() needs a valid thickness.\n"); + suanpan_error("A valid thickness is required.\n"); return; } @@ -846,19 +868,19 @@ void new_cinp4(unique_ptr& return_obj, istringstream& command) { void new_cin3d8(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_cin3d8() needs a tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(8); if(!get_input(command, node_tag)) { - suanpan_error("new_cin3d8() needs eight valid nodes.\n"); + suanpan_error("Eight valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_cin3d8() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } @@ -868,31 +890,31 @@ void new_cin3d8(unique_ptr& return_obj, istringstream& command) { void new_csmt3(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_csmt3() needs a tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(3); if(!get_input(command, node_tag)) { - suanpan_error("new_csmt3() needs three valid nodes.\n"); + suanpan_error("Three valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_csmt3() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } auto thickness = 1.; if(!get_optional_input(command, thickness)) { - suanpan_error("new_csmt3() needs a valid thickness.\n"); + suanpan_error("A valid thickness is required.\n"); return; } auto length = -1.; if(!get_optional_input(command, length)) { - suanpan_error("new_csmt3() needs a valid length.\n"); + suanpan_error("A valid length is required.\n"); return; } @@ -902,31 +924,31 @@ void new_csmt3(unique_ptr& return_obj, istringstream& command) { void new_csmt6(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_csmt6() needs a tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(6); if(!get_input(command, node_tag)) { - suanpan_error("new_csmt6() needs six valid nodes.\n"); + suanpan_error("Six valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_csmt6() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } auto thickness = 1.; if(!get_optional_input(command, thickness)) { - suanpan_error("new_csmt6() needs a valid thickness.\n"); + suanpan_error("A valid thickness is required.\n"); return; } auto length = -1.; if(!get_optional_input(command, length)) { - suanpan_error("new_csmt6() needs a valid length.\n"); + suanpan_error("A valid length is required.\n"); return; } @@ -936,31 +958,31 @@ void new_csmt6(unique_ptr& return_obj, istringstream& command) { void new_csmq(unique_ptr& return_obj, istringstream& command, const unsigned size) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_csmq() needs a tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(size); if(!get_input(command, node_tag)) { - suanpan_error("new_csmq() needs four valid nodes.\n"); + suanpan_error("Four valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_csmq() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } auto thickness = 1.; if(!get_optional_input(command, thickness)) { - suanpan_error("new_csmq() needs a valid thickness.\n"); + suanpan_error("A valid thickness is required.\n"); return; } auto length = -1.; if(!get_optional_input(command, length)) { - suanpan_error("new_csmq() needs a valid length.\n"); + suanpan_error("A valid length is required.\n"); return; } @@ -974,19 +996,19 @@ void new_csmq(unique_ptr& return_obj, istringstream& command, const uns void new_damper01(unique_ptr& return_obj, istringstream& command, const unsigned dimension) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_damper01() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(2); if(!get_input(command, node_tag)) { - suanpan_error("new_damper01() needs two valid nodes.\n"); + suanpan_error("Two valid nodes are required.\n"); return; } unsigned damper_tag; if(!get_input(command, damper_tag)) { - suanpan_error("new_damper01() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } @@ -996,43 +1018,43 @@ void new_damper01(unique_ptr& return_obj, istringstream& command, const void new_damper02(unique_ptr& return_obj, istringstream& command, const unsigned dimension) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_damper02() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(2); if(!get_input(command, node_tag)) { - suanpan_error("new_damper02() needs two valid nodes.\n"); + suanpan_error("Two valid nodes are required.\n"); return; } unsigned damper_tag; if(!get_input(command, damper_tag)) { - suanpan_error("new_damper02() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } unsigned spring_tag; if(!get_input(command, spring_tag)) { - suanpan_error("new_damper02() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } string use_matrix = "true"; if(!command.eof() && !get_input(command, use_matrix)) { - suanpan_error("new_damper02() needs a valid switch.\n"); + suanpan_error("A valid switch is required.\n"); return; } unsigned proceed = 0; if(!command.eof() && !get_input(command, proceed)) { - suanpan_error("new_damper02() needs a valid proceed switch.\n"); + suanpan_error("A valid proceed switch is required.\n"); return; } auto beta = .5; if(!command.eof() && !get_input(command, beta)) { - suanpan_error("new_damper02() needs a valid beta value.\n"); + suanpan_error("A valid beta value is required.\n"); return; } @@ -1042,31 +1064,31 @@ void new_damper02(unique_ptr& return_obj, istringstream& command, const void new_dc3d4(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_dc3d4() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(4); if(!get_input(command, node_tag)) { - suanpan_error("new_dc3d4() needs four valid nodes.\n"); + suanpan_error("Four valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_dc3d4() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } double length; if(!get_input(command, length)) { - suanpan_error("new_dc3d4() needs a valid characteristic length.\n"); + suanpan_error("A valid characteristic length is required.\n"); return; } double rate; if(!get_input(command, rate)) { - suanpan_error("new_dc3d4() needs a valid energy release rate.\n"); + suanpan_error("A valid energy release rate is required.\n"); return; } @@ -1076,31 +1098,31 @@ void new_dc3d4(unique_ptr& return_obj, istringstream& command) { void new_dc3d8(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_dc3d8() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(8); if(!get_input(command, node_tag)) { - suanpan_error("new_dc3d8() needs four valid nodes.\n"); + suanpan_error("Four valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_dc3d8() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } double length; if(!get_input(command, length)) { - suanpan_error("new_dc3d8() needs a valid characteristic length.\n"); + suanpan_error("A valid characteristic length is required.\n"); return; } double rate; if(!get_input(command, rate)) { - suanpan_error("new_dc3d8() needs a valid energy release rate.\n"); + suanpan_error("A valid energy release rate is required.\n"); return; } @@ -1110,37 +1132,37 @@ void new_dc3d8(unique_ptr& return_obj, istringstream& command) { void new_dcp3(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_dcp3() needs a tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(3); if(!get_input(command, node_tag)) { - suanpan_error("new_dcp3() needs three valid nodes.\n"); + suanpan_error("Three valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_dcp3() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } double length; if(!get_input(command, length)) { - suanpan_error("new_dcp3() needs a valid characteristic length.\n"); + suanpan_error("A valid characteristic length is required.\n"); return; } double rate; if(!get_input(command, rate)) { - suanpan_error("new_dcp3() needs a valid energy release rate.\n"); + suanpan_error("A valid energy release rate is required.\n"); return; } auto thickness = 1.; if(!get_optional_input(command, thickness)) { - suanpan_error("new_dcp3() needs a valid thickness.\n"); + suanpan_error("A valid thickness is required.\n"); return; } @@ -1150,37 +1172,37 @@ void new_dcp3(unique_ptr& return_obj, istringstream& command) { void new_dcp4(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_dcp4() needs a tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(4); if(!get_input(command, node_tag)) { - suanpan_error("new_dcp4() needs four valid nodes.\n"); + suanpan_error("Four valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_dcp4() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } double length; if(!get_input(command, length)) { - suanpan_error("new_dcp4() needs a valid characteristic length.\n"); + suanpan_error("A valid characteristic length is required.\n"); return; } double rate; if(!get_input(command, rate)) { - suanpan_error("new_dcp4() needs a valid energy release rate.\n"); + suanpan_error("A valid energy release rate is required.\n"); return; } auto thickness = 1.; if(!get_optional_input(command, thickness)) { - suanpan_error("new_dcp4() needs a valid thickness.\n"); + suanpan_error("A valid thickness is required.\n"); return; } @@ -1190,31 +1212,31 @@ void new_dcp4(unique_ptr& return_obj, istringstream& command) { void new_dkt3(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_dkt3() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(3); if(!get_input(command, node_tag)) { - suanpan_error("new_dkt3() needs three valid nodes.\n"); + suanpan_error("Three valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_dkt3() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } double thickness; if(!get_input(command, thickness)) { - suanpan_error("new_dkt3() needs a valid thickness.\n"); + suanpan_error("A valid thickness is required.\n"); return; } unsigned num_ip = 3; if(!get_optional_input(command, num_ip)) { - suanpan_error("new_dkt3() needs a valid number of integration points.\n"); + suanpan_error("A valid number of integration points is required.\n"); return; } @@ -1224,31 +1246,31 @@ void new_dkt3(unique_ptr& return_obj, istringstream& command) { void new_dkt4(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_dkt4() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(4); if(!get_input(command, node_tag)) { - suanpan_error("new_dkt4() needs four valid nodes.\n"); + suanpan_error("Four valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_dkt4() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } double thickness; if(!get_input(command, thickness)) { - suanpan_error("new_dkt4() needs a valid thickness.\n"); + suanpan_error("A valid thickness is required.\n"); return; } unsigned num_ip = 3; if(!get_optional_input(command, num_ip)) { - suanpan_error("new_dkt4() needs a valid number of integration points.\n"); + suanpan_error("A valid number of integration points is required.\n"); return; } @@ -1258,31 +1280,31 @@ void new_dkt4(unique_ptr& return_obj, istringstream& command) { void new_dkts3(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_dkts3() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(3); if(!get_input(command, node_tag)) { - suanpan_error("new_dkts3() needs three valid nodes.\n"); + suanpan_error("Three valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_dkts3() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } double thickness; if(!get_input(command, thickness)) { - suanpan_error("new_dkts3() needs a valid thickness.\n"); + suanpan_error("A valid thickness is required.\n"); return; } unsigned num_ip = 3; if(!get_optional_input(command, num_ip)) { - suanpan_error("new_dkts3() needs a valid number of integration points.\n"); + suanpan_error("A valid number of integration points is required.\n"); return; } @@ -1292,25 +1314,25 @@ void new_dkts3(unique_ptr& return_obj, istringstream& command) { void new_embedded(unique_ptr& return_obj, istringstream& command, const unsigned dof) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_embedded() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } unsigned element_tag; if(!get_input(command, element_tag)) { - suanpan_error("new_embedded() needs a valid element tag.\n"); + suanpan_error("A valid element tag is required.\n"); return; } unsigned node_tag; if(!get_input(command, node_tag)) { - suanpan_error("new_embedded() needs a valid node tag.\n"); + suanpan_error("A valid node tag is required.\n"); return; } auto alpha = 1E4; if(!get_optional_input(command, alpha)) { - suanpan_error("new_embedded() needs a valid alpha.\n"); + suanpan_error("A valid alpha is required.\n"); return; } @@ -1321,37 +1343,39 @@ void new_embedded(unique_ptr& return_obj, istringstream& command, const void new_eb21(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_eb21() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(2); if(!get_input(command, node_tag)) { - suanpan_error("new_eb21() needs two valid nodes.\n"); + suanpan_error("Two valid nodes are required.\n"); return; } double area; if(!get_input(command, area)) { - suanpan_error("new_eb21() needs a valid area.\n"); + suanpan_error("A valid area is required.\n"); return; } double moment_inertia; if(!get_input(command, moment_inertia)) { - suanpan_error("new_eb21() needs a valid moment of inertia.\n"); + suanpan_error("A valid moment of inertia is required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_eb21() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } string nonlinear = "false"; - if(command.eof()) suanpan_debug("new_eb21() assumes linear geometry.\n"); - else if(!get_input(command, nonlinear)) suanpan_error("new_eb21() needs a valid nonlinear geometry switch (0,1).\n"); + if(command.eof()) + suanpan_debug("Linear geometry assumed.\n"); + else if(!get_input(command, nonlinear)) + suanpan_error("A valid nonlinear geometry switch is required.\n"); return_obj = make_unique(tag, std::move(node_tag), area, moment_inertia, material_tag, is_true(nonlinear)); } @@ -1359,31 +1383,33 @@ void new_eb21(unique_ptr& return_obj, istringstream& command) { void new_f21(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_f21() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(2); if(!get_input(command, node_tag)) { - suanpan_error("new_f21() needs two valid nodes.\n"); + suanpan_error("Two valid nodes are required.\n"); return; } unsigned section_id; if(!get_input(command, section_id)) { - suanpan_error("new_f21() needs a valid section tag.\n"); + suanpan_error("A valid section tag is required.\n"); return; } unsigned int_pt = 6; if(!get_optional_input(command, int_pt)) { - suanpan_error("new_f21() needs a valid number of integration points.\n"); + suanpan_error("A valid number of integration points is required.\n"); return; } unsigned nonlinear = 0; - if(command.eof()) suanpan_debug("new_f21() assumes linear geometry.\n"); - else if(!get_input(command, nonlinear)) suanpan_error("new_f21() needs a valid nonlinear geometry switch (0,1).\n"); + if(command.eof()) + suanpan_debug("Linear geometry assumed.\n"); + else if(!get_input(command, nonlinear)) + suanpan_error("A valid nonlinear geometry switch is required.\n"); return_obj = make_unique(tag, std::move(node_tag), section_id, int_pt, !!nonlinear); } @@ -1391,31 +1417,33 @@ void new_f21(unique_ptr& return_obj, istringstream& command) { void new_f21h(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_f21h() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(2); if(!get_input(command, node_tag)) { - suanpan_error("new_f21h() needs two valid nodes.\n"); + suanpan_error("Two valid nodes are required.\n"); return; } unsigned section_id; if(!get_input(command, section_id)) { - suanpan_error("new_f21h() needs a valid section tag.\n"); + suanpan_error("A valid section tag is required.\n"); return; } auto elastic_length = .2; if(!command.eof() && !get_input(command, elastic_length)) { - suanpan_error("new_f21h() needs a valid number of integration points.\n"); + suanpan_error("A valid number of integration points is required.\n"); return; } unsigned nonlinear = 0; - if(command.eof()) suanpan_debug("new_f21h() assumes linear geometry.\n"); - else if(!get_input(command, nonlinear)) suanpan_error("new_f21h() needs a valid nonlinear geometry switch (0,1).\n"); + if(command.eof()) + suanpan_debug("Linear geometry assumed.\n"); + else if(!get_input(command, nonlinear)) + suanpan_error("A valid nonlinear geometry switch is required.\n"); return_obj = make_unique(tag, std::move(node_tag), section_id, elastic_length, !!nonlinear); } @@ -1423,37 +1451,37 @@ void new_f21h(unique_ptr& return_obj, istringstream& command) { void new_f31(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_f31() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(2); if(!get_input(command, node_tag)) { - suanpan_error("new_f31() needs two valid nodes.\n"); + suanpan_error("Two valid nodes are required.\n"); return; } unsigned section_id; if(!get_input(command, section_id)) { - suanpan_error("new_f31() needs a valid section tag.\n"); + suanpan_error("A valid section tag is required.\n"); return; } unsigned orientation_id; if(!get_input(command, orientation_id)) { - suanpan_error("new_f31() needs a valid orientation tag.\n"); + suanpan_error("A valid orientation tag is required.\n"); return; } unsigned int_pt = 5; if(!command.eof() && !get_input(command, int_pt)) { - suanpan_error("new_f31() needs a valid number of integration points.\n"); + suanpan_error("A valid number of integration points is required.\n"); return; } string nonlinear = "false"; if(!command.eof() && !get_input(command, nonlinear)) { - suanpan_error("new_f31() needs a valid nonlinear geometry switch.\n"); + suanpan_error("A valid nonlinear geometry switch is required.\n"); return; } @@ -1463,28 +1491,31 @@ void new_f31(unique_ptr& return_obj, istringstream& command) { void new_gcmq(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_gcmq() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(4); if(!get_input(command, node_tag)) { - suanpan_error("new_gcmq() needs four valid nodes.\n"); + suanpan_error("Four valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_gcmq() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } auto thickness = 1.; - if(command.eof()) suanpan_debug("new_gcmq() assumes thickness to be unit.\n"); - else if(!get_input(command, thickness)) suanpan_error("new_gcmq() needs a valid thickness.\n"); + if(command.eof()) + suanpan_debug("Unit thickness assumed.\n"); + else if(!get_input(command, thickness)) + suanpan_error("A valid thickness is required.\n"); string int_scheme = "I"; - if(!command.eof() && !get_input(command, int_scheme)) suanpan_error("new_gcmq() needs a valid reduced scheme switch.\n"); + if(!command.eof() && !get_input(command, int_scheme)) + suanpan_error("A valid reduced scheme switch is required.\n"); return_obj = make_unique(tag, std::move(node_tag), material_tag, thickness, suanpan::to_upper(int_scheme[0])); } @@ -1492,25 +1523,27 @@ void new_gcmq(unique_ptr& return_obj, istringstream& command) { void new_gcmqi(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_gcmq() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(4); if(!get_input(command, node_tag)) { - suanpan_error("new_gcmq() needs four valid nodes.\n"); + suanpan_error("Four valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_gcmq() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } auto thickness = 1.; - if(command.eof()) suanpan_debug("new_gcmq() assumes thickness to be unit.\n"); - else if(!get_input(command, thickness)) suanpan_error("new_gcmq() needs a valid thickness.\n"); + if(command.eof()) + suanpan_debug("Unit thickness assumed.\n"); + else if(!get_input(command, thickness)) + suanpan_error("A valid thickness is required.\n"); return_obj = make_unique(tag, std::move(node_tag), material_tag, thickness, 'I'); } @@ -1518,25 +1551,27 @@ void new_gcmqi(unique_ptr& return_obj, istringstream& command) { void new_gcmql(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_gcmq() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(4); if(!get_input(command, node_tag)) { - suanpan_error("new_gcmq() needs four valid nodes.\n"); + suanpan_error("Four valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_gcmq() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } auto thickness = 1.; - if(command.eof()) suanpan_debug("new_gcmq() assumes thickness to be unit.\n"); - else if(!get_input(command, thickness)) suanpan_error("new_gcmq() needs a valid thickness.\n"); + if(command.eof()) + suanpan_debug("Unit thickness assumed.\n"); + else if(!get_input(command, thickness)) + suanpan_error("A valid thickness is required.\n"); return_obj = make_unique(tag, std::move(node_tag), material_tag, thickness, 'L'); } @@ -1544,25 +1579,27 @@ void new_gcmql(unique_ptr& return_obj, istringstream& command) { void new_gcmqg(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_gcmq() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(4); if(!get_input(command, node_tag)) { - suanpan_error("new_gcmq() needs four valid nodes.\n"); + suanpan_error("Four valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_gcmq() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } auto thickness = 1.; - if(command.eof()) suanpan_debug("new_gcmq() assumes thickness to be unit.\n"); - else if(!get_input(command, thickness)) suanpan_error("new_gcmq() needs a valid thickness.\n"); + if(command.eof()) + suanpan_debug("Unit thickness assumed.\n"); + else if(!get_input(command, thickness)) + suanpan_error("A valid thickness is required.\n"); return_obj = make_unique(tag, std::move(node_tag), material_tag, thickness, 'G'); } @@ -1570,25 +1607,27 @@ void new_gcmqg(unique_ptr& return_obj, istringstream& command) { void new_sgcmqi(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_sgcmqi() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(4); if(!get_input(command, node_tag)) { - suanpan_error("new_sgcmqi() needs four valid nodes.\n"); + suanpan_error("Four valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_sgcmqi() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } auto thickness = 1.; - if(command.eof()) suanpan_debug("new_sgcmqi() assumes thickness to be unit.\n"); - else if(!get_input(command, thickness)) suanpan_error("new_sgcmqi() needs a valid thickness.\n"); + if(command.eof()) + suanpan_debug("Unit thickness assumed.\n"); + else if(!get_input(command, thickness)) + suanpan_error("A valid thickness is required.\n"); return_obj = make_unique(tag, std::move(node_tag), material_tag, thickness, 'I'); } @@ -1596,25 +1635,27 @@ void new_sgcmqi(unique_ptr& return_obj, istringstream& command) { void new_sgcmql(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_sgcmql() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(4); if(!get_input(command, node_tag)) { - suanpan_error("new_sgcmql() needs four valid nodes.\n"); + suanpan_error("Four valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_sgcmql() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } auto thickness = 1.; - if(command.eof()) suanpan_debug("new_sgcmql() assumes thickness to be unit.\n"); - else if(!get_input(command, thickness)) suanpan_error("new_sgcmql() needs a valid thickness.\n"); + if(command.eof()) + suanpan_debug("Unit thickness assumed.\n"); + else if(!get_input(command, thickness)) + suanpan_error("A valid thickness is required.\n"); return_obj = make_unique(tag, std::move(node_tag), material_tag, thickness, 'L'); } @@ -1622,25 +1663,27 @@ void new_sgcmql(unique_ptr& return_obj, istringstream& command) { void new_sgcmqg(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_sgcmqg() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(4); if(!get_input(command, node_tag)) { - suanpan_error("new_sgcmqg() needs four valid nodes.\n"); + suanpan_error("Four valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_sgcmqg() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } auto thickness = 1.; - if(command.eof()) suanpan_debug("new_sgcmqg() assumes thickness to be unit.\n"); - else if(!get_input(command, thickness)) suanpan_error("new_sgcmqg() needs a valid thickness.\n"); + if(command.eof()) + suanpan_debug("Unit thickness assumed.\n"); + else if(!get_input(command, thickness)) + suanpan_error("A valid thickness is required.\n"); return_obj = make_unique(tag, std::move(node_tag), material_tag, thickness, 'G'); } @@ -1648,25 +1691,25 @@ void new_sgcmqg(unique_ptr& return_obj, istringstream& command) { void new_sgcms(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_sgcms() needs a tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(4); if(!get_input(command, node_tag)) { - suanpan_error("new_sgcms() needs four valid nodes.\n"); + suanpan_error("Four valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_sgcms() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } auto thickness = 1.; if(!command.eof() && !get_input(command, thickness)) { - suanpan_error("new_sgcms() needs a valid thickness.\n"); + suanpan_error("A valid thickness is required.\n"); return; } @@ -1676,25 +1719,27 @@ void new_sgcms(unique_ptr& return_obj, istringstream& command) { void new_gq12(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_gq12() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(4); if(!get_input(command, node_tag)) { - suanpan_error("new_gq12() needs four valid nodes.\n"); + suanpan_error("Four valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_gq12() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } auto thickness = 1.; - if(command.eof()) suanpan_debug("new_gq12() assumes thickness to be unit.\n"); - else if(!get_input(command, thickness)) suanpan_error("new_gq12() needs a valid thickness.\n"); + if(command.eof()) + suanpan_debug("Unit thickness assumed.\n"); + else if(!get_input(command, thickness)) + suanpan_error("A valid thickness is required.\n"); return_obj = make_unique(tag, std::move(node_tag), material_tag, thickness); } @@ -1702,13 +1747,13 @@ void new_gq12(unique_ptr& return_obj, istringstream& command) { void new_joint(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_joint() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(2); if(!get_input(command, node_tag)) { - suanpan_error("new_joint() needs two valid nodes.\n"); + suanpan_error("Two valid nodes are required.\n"); return; } @@ -1722,19 +1767,19 @@ void new_joint(unique_ptr& return_obj, istringstream& command) { void new_mass(unique_ptr& return_obj, istringstream& command, const unsigned which) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_mass() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } unsigned node; if(!get_input(command, node)) { - suanpan_error("new_mass() needs one valid node.\n"); + suanpan_error("A valid node tag is required.\n"); return; } double magnitude; if(!get_input(command, magnitude)) { - suanpan_error("new_mass() needs a valid magnitude.\n"); + suanpan_error("A valid magnitude is required.\n"); return; } @@ -1743,11 +1788,11 @@ void new_mass(unique_ptr& return_obj, istringstream& command, const uns while(!command.eof() && get_input(command, dof)) dof_tag.push_back(dof); if(2 == which && *std::max_element(dof_tag.cbegin(), dof_tag.cend()) > 3) { - suanpan_error("new_mass() supports at most three dofs.\n"); + suanpan_error("At most three dofs are supported.\n"); return; } if(3 == which && *std::max_element(dof_tag.cbegin(), dof_tag.cend()) > 6) { - suanpan_error("new_mass() supports at most six dofs.\n"); + suanpan_error("At most six dofs are supported.\n"); return; } @@ -1758,19 +1803,19 @@ void new_mass(unique_ptr& return_obj, istringstream& command, const uns void new_masspoint(unique_ptr& return_obj, istringstream& command, const unsigned which) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_masspoint() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } unsigned node; if(!get_input(command, node)) { - suanpan_error("new_masspoint() needs one valid node.\n"); + suanpan_error("A valid node tag is required.\n"); return; } double translational_magnitude; if(!get_input(command, translational_magnitude)) { - suanpan_error("new_masspoint() needs a valid translational magnitude.\n"); + suanpan_error("A valid translational magnitude is required.\n"); return; } @@ -1781,7 +1826,7 @@ void new_masspoint(unique_ptr& return_obj, istringstream& command, cons else { double rotational_magnitude; if(!get_input(command, rotational_magnitude)) { - suanpan_error("new_masspoint() needs a valid rotational magnitude.\n"); + suanpan_error("A valid rotational magnitude is required.\n"); return; } if(2 == which) return_obj = make_unique(tag, node, translational_magnitude, rotational_magnitude); @@ -1792,31 +1837,31 @@ void new_masspoint(unique_ptr& return_obj, istringstream& command, cons void new_mindlin(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_mindlin() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(4); if(!get_input(command, node_tag)) { - suanpan_error("new_mindlin() needs four valid nodes.\n"); + suanpan_error("Four valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_mindlin() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } double thickness; if(!get_input(command, thickness)) { - suanpan_error("new_mindlin() needs a valid thickness.\n"); + suanpan_error("A valid thickness is required.\n"); return; } unsigned num_ip = 5; if(!command.eof() && !get_input(command, num_ip)) { - suanpan_error("new_mindlin() needs a valid number of integration points.\n"); + suanpan_error("A valid number of integration points is required.\n"); return; } @@ -1826,25 +1871,25 @@ void new_mindlin(unique_ptr& return_obj, istringstream& command) { void new_mvlem(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_mvlem() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(2); if(!get_input(command, node_tag)) { - suanpan_error("new_mvlem() needs two valid nodes.\n"); + suanpan_error("Two valid nodes are required.\n"); return; } unsigned shear_tag; if(!get_input(command, shear_tag)) { - suanpan_error("new_mvlem() needs a valid shear material.\n"); + suanpan_error("A valid shear material is required.\n"); return; } double c_height; if(!get_input(command, c_height)) { - suanpan_error("new_mvlem() needs a valid c.\n"); + suanpan_error("A valid c is required.\n"); return; } @@ -1854,27 +1899,27 @@ void new_mvlem(unique_ptr& return_obj, istringstream& command) { double t_value; uword t_tag; if(!get_input(command, t_value)) { - suanpan_error("new_mvlem() needs a valid fibre width.\n"); + suanpan_error("A valid fibre width is required.\n"); return; } B.emplace_back(t_value); if(!get_input(command, t_value)) { - suanpan_error("new_mvlem() needs a valid fibre thickness.\n"); + suanpan_error("A valid fibre thickness is required.\n"); return; } H.emplace_back(t_value); if(!get_input(command, t_value)) { - suanpan_error("new_mvlem() needs a valid fibre reinforcement ratio.\n"); + suanpan_error("A valid fibre reinforcement ratio is required.\n"); return; } R.emplace_back(t_value); if(!get_input(command, t_tag)) { - suanpan_error("new_mvlem() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } CT.emplace_back(t_tag); if(!get_input(command, t_tag)) { - suanpan_error("new_mvlem() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } ST.emplace_back(t_tag); @@ -1886,38 +1931,38 @@ void new_mvlem(unique_ptr& return_obj, istringstream& command) { void new_pcpedc(unique_ptr& return_obj, istringstream& command, const unsigned node) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_pcpedc() needs a tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(node); if(!get_input(command, node_tag)) { - suanpan_error("new_pcpedc() needs %u valid nodes.\n", node); + suanpan_error("{} valid nodes are required.\n", node); return; } unsigned solid_tag; if(!get_input(command, solid_tag)) { - suanpan_error("new_pcpedc() needs a valid material tag for solid phase.\n"); + suanpan_error("A valid material tag for solid phase is required.\n"); return; } unsigned fluid_tag; if(!get_input(command, fluid_tag)) { - suanpan_error("new_pcpedc() needs a valid material tag for fluid phase.\n"); + suanpan_error("A valid material tag for fluid phase is required.\n"); return; } double alpha, n, k; if(!get_optional_input(command, alpha)) { - suanpan_error("new_pcpedc() needs a valid alpha.\n"); + suanpan_error("A valid alpha is required.\n"); return; } if(!get_optional_input(command, n)) { - suanpan_error("new_pcpedc() needs a valid porosity.\n"); + suanpan_error("A valid porosity is required.\n"); return; } if(!get_optional_input(command, k)) { - suanpan_error("new_pcpedc() needs a valid permeability.\n"); + suanpan_error("A valid permeability is required.\n"); return; } @@ -1928,34 +1973,34 @@ void new_pcpedc(unique_ptr& return_obj, istringstream& command, const u void new_pcpeuc(unique_ptr& return_obj, istringstream& command, const unsigned node) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_pcpeuc() needs a tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(node); if(!get_input(command, node_tag)) { - suanpan_error("new_pcpeuc() needs %u valid nodes.\n", node); + suanpan_error("{} valid nodes are required.\n", node); return; } unsigned solid_tag; if(!get_input(command, solid_tag)) { - suanpan_error("new_pcpeuc() needs a valid material tag for solid phase.\n"); + suanpan_error("A valid material tag for solid phase is required.\n"); return; } unsigned fluid_tag; if(!get_input(command, fluid_tag)) { - suanpan_error("new_pcpeuc() needs a valid material tag for fluid phase.\n"); + suanpan_error("A valid material tag for fluid phase is required.\n"); return; } double alpha, n; if(!get_optional_input(command, alpha)) { - suanpan_error("new_pcpeuc() needs a valid alpha.\n"); + suanpan_error("A valid alpha is required.\n"); return; } if(!get_optional_input(command, n)) { - suanpan_error("new_pcpeuc() needs a valid porosity.\n"); + suanpan_error("A valid porosity is required.\n"); return; } @@ -1966,25 +2011,27 @@ void new_pcpeuc(unique_ptr& return_obj, istringstream& command, const u void new_ps(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_ps() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(4); if(!get_input(command, node_tag)) { - suanpan_error("new_ps() needs four valid nodes.\n"); + suanpan_error("Four valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_ps() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } auto thickness = 1.; - if(command.eof()) suanpan_debug("new_ps() assumes thickness to be unit.\n"); - else if(!get_input(command, thickness)) suanpan_error("new_ps() needs a valid thickness.\n"); + if(command.eof()) + suanpan_debug("Unit thickness assumed.\n"); + else if(!get_input(command, thickness)) + suanpan_error("A valid thickness is required.\n"); return_obj = make_unique(tag, std::move(node_tag), material_tag, thickness); } @@ -1992,25 +2039,27 @@ void new_ps(unique_ptr& return_obj, istringstream& command) { void new_qe2(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_qe2() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(4); if(!get_input(command, node_tag)) { - suanpan_error("new_qe2() needs four valid nodes.\n"); + suanpan_error("Four valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_qe2() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } auto thickness = 1.; - if(command.eof()) suanpan_debug("new_qe2() assumes thickness to be unit.\n"); - else if(!get_input(command, thickness)) suanpan_error("new_qe2() needs a valid thickness.\n"); + if(command.eof()) + suanpan_debug("Unit thickness assumed.\n"); + else if(!get_input(command, thickness)) + suanpan_error("A valid thickness is required.\n"); return_obj = make_unique(tag, std::move(node_tag), material_tag, thickness); } @@ -2018,25 +2067,25 @@ void new_qe2(unique_ptr& return_obj, istringstream& command) { void new_s4(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_s4() needs a tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(4); if(!get_input(command, node_tag)) { - suanpan_error("new_s4() needs four valid nodes.\n"); + suanpan_error("Four valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_s4() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } auto thickness = 1.; if(!command.eof() && !get_input(command, thickness)) { - suanpan_error("new_s4() needs a valid thickness.\n"); + suanpan_error("A valid thickness is required.\n"); return; } @@ -2046,19 +2095,19 @@ void new_s4(unique_ptr& return_obj, istringstream& command) { void new_singlesection2d(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_singlesection2d() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } unsigned node; if(!get_input(command, node)) { - suanpan_error("new_singlesection2d() needs one valid node.\n"); + suanpan_error("A valid node tag is required.\n"); return; } unsigned section_tag; if(!get_input(command, section_tag)) { - suanpan_error("new_singlesection2d() needs a valid section tag.\n"); + suanpan_error("A valid section tag is required.\n"); return; } @@ -2068,19 +2117,19 @@ void new_singlesection2d(unique_ptr& return_obj, istringstream& command void new_singlesection3d(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_singlesection3d() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } unsigned node; if(!get_input(command, node)) { - suanpan_error("new_singlesection3d() needs one valid node.\n"); + suanpan_error("A valid node tag is required.\n"); return; } unsigned section_tag; if(!get_input(command, section_tag)) { - suanpan_error("new_singlesection3d() needs a valid section tag.\n"); + suanpan_error("A valid section tag is required.\n"); return; } @@ -2090,19 +2139,19 @@ void new_singlesection3d(unique_ptr& return_obj, istringstream& command void new_spring01(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_spring01() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(2); if(!get_input(command, node_tag)) { - suanpan_error("new_spring01() needs two valid nodes.\n"); + suanpan_error("Two valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_spring01() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } @@ -2112,19 +2161,19 @@ void new_spring01(unique_ptr& return_obj, istringstream& command) { void new_spring02(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_spring02() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(2); if(!get_input(command, node_tag)) { - suanpan_error("new_spring02() needs two valid nodes.\n"); + suanpan_error("Two valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_spring02() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } @@ -2134,68 +2183,84 @@ void new_spring02(unique_ptr& return_obj, istringstream& command) { void new_t2d2(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_t2d2() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(2); if(!get_input(command, node_tag)) { - suanpan_error("new_t2d2() needs two valid nodes.\n"); + suanpan_error("Two valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_t2d2() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } double area; if(!get_input(command, area)) { - suanpan_error("new_t2d2() needs a valid area.\n"); + suanpan_error("A valid area is required.\n"); return; } string nonlinear = "N", update_area = "N", log_strain = "N"; + double rigidity = -1.; - if(command.eof()) suanpan_debug("new_t2d2() assumes linear geometry.\n"); - else if(!get_input(command, nonlinear)) suanpan_error("new_t2d2() needs a valid nonlinear geometry switch.\n"); + if(command.eof()) + suanpan_debug("Linear geometry assumed.\n"); + else if(!get_input(command, nonlinear)) + suanpan_error("A valid nonlinear geometry switch is required.\n"); - if(command.eof()) suanpan_debug("new_t2d2() assumes constant area.\n"); - else if(!get_input(command, update_area)) suanpan_error("new_t2d2() needs a valid switch (0,1) to indicate if to update area.\n"); + if(command.eof()) + suanpan_debug("Constant area assumed.\n"); + else if(!get_input(command, update_area)) + suanpan_error("A valid area switch is required.\n"); - if(command.eof()) suanpan_debug("new_t2d2() assumes engineering strain.\n"); - else if(!get_input(command, log_strain)) suanpan_error("new_t2d2() needs a valid switch (0,1) to indicate if to use engineering strain.\n"); + if(command.eof()) + suanpan_debug("Engineering strain assumed.\n"); + else if(!get_input(command, log_strain)) + suanpan_error("A valid engineering strain switch is required.\n"); - return_obj = make_unique(tag, std::move(node_tag), material_tag, area, is_true(nonlinear), is_true(update_area), is_true(log_strain)); + if(command.eof()) + suanpan_debug("No buckling check.\n"); + else if(!get_input(command, rigidity)) + suanpan_error("A valid flexural rigidity is required.\n"); + + return_obj = make_unique(tag, std::move(node_tag), material_tag, area, is_true(nonlinear), is_true(update_area), is_true(log_strain), rigidity); } void new_t2d2s(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_t2d2s() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(2); if(!get_input(command, node_tag)) { - suanpan_error("new_t2d2s() needs two valid nodes.\n"); + suanpan_error("Two valid nodes are required.\n"); return; } unsigned section_tag; if(!get_input(command, section_tag)) { - suanpan_error("new_t2d2s() needs a valid material/section tag.\n"); + suanpan_error("A valid material/section tag is required.\n"); return; } string nonlinear = "N", log_strain = "N"; - if(command.eof()) suanpan_debug("new_t2d2() assumes linear geometry.\n"); - else if(!get_input(command, nonlinear)) suanpan_error("new_t2d2s() needs a valid nonlinear geometry switch.\n"); + if(command.eof()) + suanpan_debug("Linear geometry assumed.\n"); + else if(!get_input(command, nonlinear)) + suanpan_error("A valid nonlinear geometry switch is required.\n"); - if(command.eof()) suanpan_debug("new_t2d2() assumes engineering strain.\n"); - else if(!get_input(command, log_strain)) suanpan_error("new_t2d2s() needs a valid switch to indicate if to use engineering strain.\n"); + if(command.eof()) + suanpan_debug("Engineering strain assumed.\n"); + else if(!get_input(command, log_strain)) + suanpan_error("A valid switch to indicate if to use engineering strain is required.\n"); return_obj = make_unique(tag, std::move(node_tag), section_tag, is_true(nonlinear), is_true(log_strain)); } @@ -2203,38 +2268,44 @@ void new_t2d2s(unique_ptr& return_obj, istringstream& command) { void new_t3d2(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_t3d2() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(2); if(!get_input(command, node_tag)) { - suanpan_error("new_t3d2() needs two valid nodes.\n"); + suanpan_error("Two valid nodes are required.\n"); return; } unsigned material_tag; if(!get_input(command, material_tag)) { - suanpan_error("new_t3d2() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } double area; if(!get_input(command, area)) { - suanpan_error("new_t3d2() needs a valid area.\n"); + suanpan_error("A valid area is required.\n"); return; } string nonlinear = "N", update_area = "N", log_strain = "N"; - if(command.eof()) suanpan_debug("new_t2d2() assumes linear geometry.\n"); - else if(!get_input(command, nonlinear)) suanpan_error("new_t3d2() needs a valid nonlinear geometry switch (0,1).\n"); + if(command.eof()) + suanpan_debug("Linear geometry assumed.\n"); + else if(!get_input(command, nonlinear)) + suanpan_error("A valid nonlinear geometry switch is required.\n"); - if(command.eof()) suanpan_debug("new_truss2d() assumes constant area.\n"); - else if(!get_input(command, update_area)) suanpan_error("new_t3d2() needs a valid switch (0,1) to indicate if update area.\n"); + if(command.eof()) + suanpan_debug("Constant area assumed.\n"); + else if(!get_input(command, update_area)) + suanpan_error("A valid area switch is required.\n"); - if(command.eof()) suanpan_debug("new_t3d2() assumes engineering strain.\n"); - else if(!get_input(command, log_strain)) suanpan_error("new_t3d2() needs a valid switch (0,1) to indicate if to use engineering strain.\n"); + if(command.eof()) + suanpan_debug("Engineering strain assumed.\n"); + else if(!get_input(command, log_strain)) + suanpan_error("A valid engineering strain switch is required.\n"); return_obj = make_unique(tag, std::move(node_tag), material_tag, area, is_true(nonlinear), is_true(update_area), is_true(log_strain)); } @@ -2242,29 +2313,33 @@ void new_t3d2(unique_ptr& return_obj, istringstream& command) { void new_t3d2s(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_t3d2s() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } uvec node_tag(2); if(!get_input(command, node_tag)) { - suanpan_error("new_t3d2s() needs two valid nodes.\n"); + suanpan_error("Two valid nodes are required.\n"); return; } unsigned section_tag; if(!get_input(command, section_tag)) { - suanpan_error("new_t3d2s() needs a valid material/section tag.\n"); + suanpan_error("A valid material/section tag is required.\n"); return; } string nonlinear = "N", log_strain = "N"; - if(command.eof()) suanpan_debug("new_t2d2() assumes linear geometry.\n"); - else if(!get_input(command, nonlinear)) suanpan_error("new_t3d2s() needs a valid nonlinear geometry switch.\n"); + if(command.eof()) + suanpan_debug("Linear geometry assumed.\n"); + else if(!get_input(command, nonlinear)) + suanpan_error("A valid nonlinear geometry switch is required.\n"); - if(command.eof()) suanpan_debug("new_t2d2() assumes engineering strain.\n"); - else if(!get_input(command, log_strain)) suanpan_error("new_t3d2s() needs a valid switch to indicate if to use engineering strain.\n"); + if(command.eof()) + suanpan_debug("Engineering strain assumed.\n"); + else if(!get_input(command, log_strain)) + suanpan_error("A valid switch to indicate if to use engineering strain is required.\n"); return_obj = make_unique(tag, std::move(node_tag), section_tag, is_true(nonlinear), is_true(log_strain)); } @@ -2272,13 +2347,13 @@ void new_t3d2s(unique_ptr& return_obj, istringstream& command) { void new_tie(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_tie() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } double magnitude, penalty; if(!get_input(command, magnitude) || !get_input(command, penalty)) { - suanpan_error("new_tie() needs a valid magnitude.\n"); + suanpan_error("A valid magnitude is required.\n"); return; } @@ -2300,7 +2375,7 @@ void new_tie(unique_ptr& return_obj, istringstream& command) { void new_patchquad(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_patchquad() needs a tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } @@ -2329,14 +2404,14 @@ void new_patchquad(unique_ptr& return_obj, istringstream& command) { } else if(is_equal(parameter, "-material")) { if(!get_input(command, material_tag)) { - suanpan_error("new_patchquad() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } ignore_whitespace(command); } else if(is_equal(parameter, "-thickness")) { if(!get_input(command, thickness)) { - suanpan_error("new_patchquad() needs a valid thickness.\n"); + suanpan_error("A valid thickness is required.\n"); return; } ignore_whitespace(command); @@ -2345,15 +2420,15 @@ void new_patchquad(unique_ptr& return_obj, istringstream& command) { } if(node_tag.empty()) { - suanpan_error("new_patchquad() needs a valid node tags.\n"); + suanpan_error("A valid node tags is required.\n"); return; } if(knot_x.empty() || knot_y.empty()) { - suanpan_error("new_patchquad() needs a valid knot vector.\n"); + suanpan_error("A valid knot vector is required.\n"); return; } if(-1 == material_tag) { - suanpan_error("new_patchquad() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } @@ -2363,7 +2438,7 @@ void new_patchquad(unique_ptr& return_obj, istringstream& command) { void new_patchcube(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("new_patchcube() needs a tag.\n"); + suanpan_error("A valid tag is required.\n"); return; } @@ -2396,7 +2471,7 @@ void new_patchcube(unique_ptr& return_obj, istringstream& command) { } else if(is_equal(parameter, "-material")) { if(!get_input(command, material_tag)) { - suanpan_error("new_patchcube() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } ignore_whitespace(command); @@ -2405,15 +2480,15 @@ void new_patchcube(unique_ptr& return_obj, istringstream& command) { } if(node_tag.empty()) { - suanpan_error("new_patchcube() needs a valid node tags.\n"); + suanpan_error("A valid node tags is required.\n"); return; } if(knot_x.empty() || knot_y.empty() || knot_z.empty()) { - suanpan_error("new_patchcube() needs a valid knot vector.\n"); + suanpan_error("A valid knot vector is required.\n"); return; } if(-1 == material_tag) { - suanpan_error("new_patchcube() needs a valid material tag.\n"); + suanpan_error("A valid material tag is required.\n"); return; } @@ -2423,19 +2498,19 @@ void new_patchcube(unique_ptr& return_obj, istringstream& command) { int create_new_mass(const shared_ptr& domain, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("create_new_mass() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return SUANPAN_SUCCESS; } unsigned node; if(!get_input(command, node)) { - suanpan_error("create_new_mass() needs one valid node.\n"); + suanpan_error("A valid node tag is required.\n"); return SUANPAN_SUCCESS; } double magnitude; if(!get_input(command, magnitude)) { - suanpan_error("create_new_mass() needs a valid magnitude.\n"); + suanpan_error("A valid magnitude is required.\n"); return SUANPAN_SUCCESS; } @@ -2444,7 +2519,7 @@ int create_new_mass(const shared_ptr& domain, istringstream& command while(get_input(command, dof)) dof_tag.push_back(dof); if(*std::max_element(dof_tag.cbegin(), dof_tag.cend()) > 6) { - suanpan_error("new_mass() supports at most six dofs.\n"); + suanpan_error("At most six dofs are supported.\n"); return SUANPAN_SUCCESS; } @@ -2456,7 +2531,7 @@ int create_new_mass(const shared_ptr& domain, istringstream& command int create_new_modifier(const shared_ptr& domain, istringstream& command) { string modifier_type; if(!get_input(command, modifier_type)) { - suanpan_error("create_new_modifier() needs a valid modifier type.\n"); + suanpan_error("A valid modifier type is required.\n"); return SUANPAN_SUCCESS; } @@ -2473,7 +2548,7 @@ int create_new_modifier(const shared_ptr& domain, istringstream& com if(is_equal(modifier_type, "LumpedSimple")) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("create_new_modifier() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return SUANPAN_SUCCESS; } @@ -2482,7 +2557,7 @@ int create_new_modifier(const shared_ptr& domain, istringstream& com else if(is_equal(modifier_type, "LumpedScale")) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("create_new_modifier() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return SUANPAN_SUCCESS; } @@ -2491,13 +2566,13 @@ int create_new_modifier(const shared_ptr& domain, istringstream& com else if(is_equal(modifier_type, "Rayleigh")) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("create_new_modifier() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return SUANPAN_SUCCESS; } double a, b, c, d; if(!get_input(command, a, b, c, d)) { - suanpan_error("create_new_modifier() needs four valid numbers.\n"); + suanpan_error("A valid value is required.\n"); return SUANPAN_SUCCESS; } @@ -2506,13 +2581,13 @@ int create_new_modifier(const shared_ptr& domain, istringstream& com else if(is_equal(modifier_type, "LeeElementalDamping")) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("create_new_modifier() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return SUANPAN_SUCCESS; } double damping_ratio = -1.; if(!command.eof() && !get_input(command, damping_ratio)) { - suanpan_error("create_new_modifier() needs a valid damping ratio.\n"); + suanpan_error("A valid damping ratio is required.\n"); return SUANPAN_SUCCESS; } @@ -2521,13 +2596,13 @@ int create_new_modifier(const shared_ptr& domain, istringstream& com else if(is_equal(modifier_type, "LinearViscosity")) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("create_new_modifier() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return SUANPAN_SUCCESS; } double mu; if(!get_input(command, mu)) { - suanpan_error("create_new_modifier() needs four valid numbers.\n"); + suanpan_error("A valid value is required.\n"); return SUANPAN_SUCCESS; } @@ -2536,13 +2611,13 @@ int create_new_modifier(const shared_ptr& domain, istringstream& com else if(is_equal(modifier_type, "ElementalModal")) { unsigned tag; if(!get_input(command, tag)) { - suanpan_error("create_new_modifier() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return SUANPAN_SUCCESS; } double a, b; if(!get_input(command, a, b)) { - suanpan_error("create_new_modifier() needs two valid numbers.\n"); + suanpan_error("A valid value is required.\n"); return SUANPAN_SUCCESS; } @@ -2568,7 +2643,8 @@ int create_new_modifier(const shared_ptr& domain, istringstream& com } } - if(nullptr == new_modifier || !domain->insert(std::move(new_modifier))) suanpan_error("create_new_modifier() fails to create new modifier.\n"); + if(nullptr == new_modifier || !domain->insert(std::move(new_modifier))) + suanpan_error("Fail to create new modifier via \"{}\".\n", command.str()); return SUANPAN_SUCCESS; } @@ -2576,19 +2652,19 @@ int create_new_modifier(const shared_ptr& domain, istringstream& com int create_new_orientation(const shared_ptr& domain, istringstream& command) { string file_type; if(!get_input(command, file_type)) { - suanpan_error("create_new_orientation() needs a valid type.\n"); + suanpan_error("A valid type is required.\n"); return SUANPAN_SUCCESS; } unsigned tag; if(!get_input(command, tag)) { - suanpan_error("create_new_orientation() needs a valid tag.\n"); + suanpan_error("A valid tag is required.\n"); return SUANPAN_SUCCESS; } vec xyz(3); if(!get_input(command, xyz)) { - suanpan_error("create_new_orientation() needs a vector.\n"); + suanpan_error("A valid vector is required.\n"); return SUANPAN_SUCCESS; } @@ -2601,8 +2677,8 @@ int create_new_orientation(const shared_ptr& domain, istringstream& int create_new_element(const shared_ptr& domain, istringstream& command) { string element_id; if(!get_input(command, element_id)) { - suanpan_error("create_new_element() needs element type.\n"); - return 0; + suanpan_error("A valid element type is required.\n"); + return SUANPAN_SUCCESS; } unique_ptr new_element = nullptr; @@ -2701,7 +2777,8 @@ int create_new_element(const shared_ptr& domain, istringstream& comm else if(is_equal(element_id, "PatchCube")) new_patchcube(new_element, command); else load::object(new_element, domain, element_id, command); - if(new_element == nullptr || !domain->insert(std::move(new_element))) suanpan_error("create_new_element() fails to create new element.\n"); + if(new_element == nullptr || !domain->insert(std::move(new_element))) + suanpan_error("Fail to create new element via \"{}\".\n", command.str()); return 0; } diff --git a/Element/ElementParser.h b/Element/ElementParser.h index 388f182e4..cba109dec 100644 --- a/Element/ElementParser.h +++ b/Element/ElementParser.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/ElementTemplate.cpp b/Element/ElementTemplate.cpp index d074e043c..210903309 100644 --- a/Element/ElementTemplate.cpp +++ b/Element/ElementTemplate.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/ElementTemplate.h b/Element/ElementTemplate.h index 48ba74df5..36f4c7c95 100644 --- a/Element/ElementTemplate.h +++ b/Element/ElementTemplate.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/MaterialElement.cpp b/Element/MaterialElement.cpp index deb657abb..b4a2586f4 100644 --- a/Element/MaterialElement.cpp +++ b/Element/MaterialElement.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/MaterialElement.h b/Element/MaterialElement.h index dba28583e..f8bd9bb84 100644 --- a/Element/MaterialElement.h +++ b/Element/MaterialElement.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Membrane/Axisymmetric/CAX3.cpp b/Element/Membrane/Axisymmetric/CAX3.cpp index 7c01d0f25..22f98863e 100644 --- a/Element/Membrane/Axisymmetric/CAX3.cpp +++ b/Element/Membrane/Axisymmetric/CAX3.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -28,7 +28,7 @@ int CAX3::initialize(const shared_ptr& D) { auto& material_proto = D->get(material_tag(0)); if(PlaneType::A != static_cast(material_proto->get_parameter(ParameterType::PLANETYPE))) { - suanpan_warning("Element %u is assigned with an inconsistent material.\n", get_tag()); + suanpan_warning("Element {} is assigned with an inconsistent material.\n", get_tag()); return SUANPAN_FAIL; } @@ -87,7 +87,7 @@ int CAX3::reset_status() { return m_material->reset_status(); } vector CAX3::record(const OutputType T) { return m_material->record(T); } void CAX3::print() { - node_encoding.t().print("CAX3 element connects:"); + suanpan_info("CAX3 element connects:", node_encoding); if(!is_initialized()) return; suanpan_info("Material:\n"); m_material->print(); diff --git a/Element/Membrane/Axisymmetric/CAX3.h b/Element/Membrane/Axisymmetric/CAX3.h index 5f5be3317..7efbabb6d 100644 --- a/Element/Membrane/Axisymmetric/CAX3.h +++ b/Element/Membrane/Axisymmetric/CAX3.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Membrane/Axisymmetric/CAX4.cpp b/Element/Membrane/Axisymmetric/CAX4.cpp index 9c4a9ad83..32290f4df 100644 --- a/Element/Membrane/Axisymmetric/CAX4.cpp +++ b/Element/Membrane/Axisymmetric/CAX4.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,7 +19,7 @@ #include #include #include -#include +#include #include CAX4::IntegrationPoint::IntegrationPoint(vec&& C, const double W, unique_ptr&& M) @@ -46,7 +46,7 @@ int CAX4::initialize(const shared_ptr& D) { auto& material_proto = D->get(material_tag(0)); if(PlaneType::A != static_cast(material_proto->get_parameter(ParameterType::PLANETYPE))) { - suanpan_warning("Element %u is assigned with an inconsistent material.\n", get_tag()); + suanpan_warning("Element {} is assigned with an inconsistent material.\n", get_tag()); return SUANPAN_FAIL; } @@ -134,13 +134,13 @@ vector CAX4::record(const OutputType P) { } void CAX4::print() { - suanpan_info("Element %u is a four-node axisymmteric element (CAX4)%s.\n", get_tag(), nlgeom ? " with nonlinear geometry (TL formulation)" : ""); - node_encoding.t().print("The nodes connected are:"); + suanpan_info("A four-node axisymmteric element (CAX4){}.\n", nlgeom ? " with nonlinear geometry (TL formulation)" : ""); + suanpan_info("The nodes connected are:", node_encoding); if(!is_initialized()) return; suanpan_info("Material:\n"); for(size_t I = 0; I < int_pt.size(); ++I) { - suanpan_info("Integration Point %llu:\t", I + 1); - int_pt[I].coor.t().print(); + suanpan_info("IP {}:\t", I + 1); + suanpan_info(int_pt[I].coor); int_pt[I].m_material->print(); } } diff --git a/Element/Membrane/Axisymmetric/CAX4.h b/Element/Membrane/Axisymmetric/CAX4.h index d2b15fb72..143def8b4 100644 --- a/Element/Membrane/Axisymmetric/CAX4.h +++ b/Element/Membrane/Axisymmetric/CAX4.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Membrane/Axisymmetric/CAX8.cpp b/Element/Membrane/Axisymmetric/CAX8.cpp index 885c7eaa6..2edb51bc8 100644 --- a/Element/Membrane/Axisymmetric/CAX8.cpp +++ b/Element/Membrane/Axisymmetric/CAX8.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,7 +20,7 @@ #include #include #include -#include +#include #include CAX8::IntegrationPoint::IntegrationPoint(vec&& C, const double W, unique_ptr&& M) @@ -54,7 +54,7 @@ int CAX8::initialize(const shared_ptr& D) { auto& material_proto = D->get(material_tag(0)); if(PlaneType::A != static_cast(material_proto->get_parameter(ParameterType::PLANETYPE))) { - suanpan_warning("Element %u is assigned with an inconsistent material.\n", get_tag()); + suanpan_warning("Element {} is assigned with an inconsistent material.\n", get_tag()); return SUANPAN_FAIL; } @@ -143,8 +143,8 @@ vector CAX8::record(const OutputType T) { } void CAX8::print() { - suanpan_info("A CAX8%s element%s.\n", reduced_scheme ? "R" : "", nlgeom ? " with nonlinear geometry on" : ""); - node_encoding.t().print("The nodes connected are:"); + suanpan_info("A CAX8{} element{}.\n", reduced_scheme ? "R" : "", nlgeom ? " with nonlinear geometry on" : ""); + suanpan_info("The nodes connected are:", node_encoding); if(!is_initialized()) return; suanpan_info("Material:\n"); for(const auto& I : int_pt) I.m_material->print(); diff --git a/Element/Membrane/Axisymmetric/CAX8.h b/Element/Membrane/Axisymmetric/CAX8.h index 5a1559d3d..b399188e3 100644 --- a/Element/Membrane/Axisymmetric/CAX8.h +++ b/Element/Membrane/Axisymmetric/CAX8.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Membrane/CSM/CSMQ.cpp b/Element/Membrane/CSM/CSMQ.cpp index 4c69d7e64..7baa4a8d9 100644 --- a/Element/Membrane/CSM/CSMQ.cpp +++ b/Element/Membrane/CSM/CSMQ.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,7 +20,7 @@ #include #include #include -#include +#include #include CSMQ::IntegrationPoint::IntegrationPoint(vec&& C, const double W, unique_ptr&& M) @@ -37,7 +37,7 @@ int CSMQ::initialize(const shared_ptr& D) { auto& material_proto = D->get(material_tag(0)); if(!material_proto->is_support_couple()) { - suanpan_warning("Element %u is assigned with a material that does not support couple stress.\n", get_tag()); + suanpan_warning("Element {} is assigned with a material that does not support couple stress.\n", get_tag()); return SUANPAN_FAIL; } @@ -198,13 +198,13 @@ vector CSMQ::record(const OutputType P) { } void CSMQ::print() { - suanpan_info("Element %u is a membrane element (CSMQ) with %u nodes.\n", get_tag(), m_node); - node_encoding.t().print("The nodes connected are:"); + suanpan_info("A membrane element (CSMQ) with {} nodes.\n", m_node); + suanpan_info("The nodes connected are:", node_encoding); if(!is_initialized()) return; suanpan_info("Material:\n"); for(size_t I = 0; I < int_pt.size(); ++I) { - suanpan_info("Integration Point %llu:\t", I + 1); - int_pt[I].coor.t().print(); + suanpan_info("IP {}:\t", I + 1); + suanpan_info(int_pt[I].coor); int_pt[I].m_material->print(); } } diff --git a/Element/Membrane/CSM/CSMQ.h b/Element/Membrane/CSM/CSMQ.h index 9cea90d9e..eb71d3f24 100644 --- a/Element/Membrane/CSM/CSMQ.h +++ b/Element/Membrane/CSM/CSMQ.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Membrane/CSM/CSMQ4.cpp b/Element/Membrane/CSM/CSMQ4.cpp index ee213e64a..23858d05b 100644 --- a/Element/Membrane/CSM/CSMQ4.cpp +++ b/Element/Membrane/CSM/CSMQ4.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,7 +20,7 @@ #include #include #include -#include +#include #include CSMQ4::IntegrationPoint::IntegrationPoint(vec&& C, const double W, unique_ptr&& M) @@ -36,7 +36,7 @@ int CSMQ4::initialize(const shared_ptr& D) { auto& material_proto = D->get(material_tag(0)); if(!material_proto->is_support_couple()) { - suanpan_warning("Element %u is assigned with a material that does not support couple stress.\n", get_tag()); + suanpan_warning("Element {} is assigned with a material that does not support couple stress.\n", get_tag()); return SUANPAN_FAIL; } @@ -208,13 +208,12 @@ vector CSMQ4::record(const OutputType P) { } void CSMQ4::print() { - suanpan_info("Element %u is a four-node membrane element (CSMQ4).\n", get_tag()); - node_encoding.t().print("The nodes connected are:"); + suanpan_info("A four-node membrane element (CSMQ4) connecting nodes:", node_encoding); if(!is_initialized()) return; suanpan_info("Material:\n"); for(size_t I = 0; I < int_pt.size(); ++I) { - suanpan_info("Integration Point %llu:\t", I + 1); - int_pt[I].coor.t().print(); + suanpan_info("IP {}:\t", I + 1); + suanpan_info(int_pt[I].coor); int_pt[I].m_material->print(); } } diff --git a/Element/Membrane/CSM/CSMQ4.h b/Element/Membrane/CSM/CSMQ4.h index 43bdf3cee..e75ac57f1 100644 --- a/Element/Membrane/CSM/CSMQ4.h +++ b/Element/Membrane/CSM/CSMQ4.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Membrane/CSM/CSMQ8.cpp b/Element/Membrane/CSM/CSMQ8.cpp index 614da8d95..77e5fef25 100644 --- a/Element/Membrane/CSM/CSMQ8.cpp +++ b/Element/Membrane/CSM/CSMQ8.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,7 +20,7 @@ #include #include #include -#include +#include #include CSMQ8::IntegrationPoint::IntegrationPoint(vec&& C, const double W, unique_ptr&& M) @@ -36,7 +36,7 @@ int CSMQ8::initialize(const shared_ptr& D) { auto& material_proto = D->get(material_tag(0)); if(!material_proto->is_support_couple()) { - suanpan_warning("Element %u is assigned with a material that does not support couple stress.\n", get_tag()); + suanpan_warning("Element {} is assigned with a material that does not support couple stress.\n", get_tag()); return SUANPAN_FAIL; } @@ -190,13 +190,12 @@ vector CSMQ8::record(const OutputType P) { } void CSMQ8::print() { - suanpan_info("Element %u is a eight-node membrane element (CSMQ8).\n", get_tag()); - node_encoding.t().print("The nodes connected are:"); + suanpan_info("A eight-node membrane element (CSMQ8) connecting nodes:", node_encoding); if(!is_initialized()) return; suanpan_info("Material:\n"); for(size_t I = 0; I < int_pt.size(); ++I) { - suanpan_info("Integration Point %llu:\t", I + 1); - int_pt[I].coor.t().print(); + suanpan_info("IP {}:\t", I + 1); + suanpan_info(int_pt[I].coor); int_pt[I].m_material->print(); } } diff --git a/Element/Membrane/CSM/CSMQ8.h b/Element/Membrane/CSM/CSMQ8.h index be2839824..424092123 100644 --- a/Element/Membrane/CSM/CSMQ8.h +++ b/Element/Membrane/CSM/CSMQ8.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Membrane/CSM/CSMT3.cpp b/Element/Membrane/CSM/CSMT3.cpp index d0ea28ae2..94472cc2a 100644 --- a/Element/Membrane/CSM/CSMT3.cpp +++ b/Element/Membrane/CSM/CSMT3.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -33,7 +33,7 @@ int CSMT3::initialize(const shared_ptr& D) { auto& material_proto = D->get(material_tag(0)); if(!material_proto->is_support_couple()) { - suanpan_warning("Element %u is assigned with a material that does not support couple stress.\n", get_tag()); + suanpan_warning("Element {} is assigned with a material that does not support couple stress.\n", get_tag()); return SUANPAN_FAIL; } @@ -199,7 +199,7 @@ vector CSMT3::record(const OutputType T) { } void CSMT3::print() { - node_encoding.t().print("CSMT3 element connects:"); + suanpan_info("CSMT3 element connects:", node_encoding); if(!is_initialized()) return; suanpan_info("Material:\n"); for(const auto& I : int_pt) I.m_material->print(); diff --git a/Element/Membrane/CSM/CSMT3.h b/Element/Membrane/CSM/CSMT3.h index eadc50a68..cace0e43a 100644 --- a/Element/Membrane/CSM/CSMT3.h +++ b/Element/Membrane/CSM/CSMT3.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Membrane/CSM/CSMT6.cpp b/Element/Membrane/CSM/CSMT6.cpp index 36fb2c138..4b5899e99 100644 --- a/Element/Membrane/CSM/CSMT6.cpp +++ b/Element/Membrane/CSM/CSMT6.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,7 +20,7 @@ #include #include #include -#include +#include #include CSMT6::IntegrationPoint::IntegrationPoint(vec&& C, const double W, unique_ptr&& M) @@ -36,7 +36,7 @@ int CSMT6::initialize(const shared_ptr& D) { auto& material_proto = D->get(material_tag(0)); if(!material_proto->is_support_couple()) { - suanpan_warning("Element %u is assigned with a material that does not support couple stress.\n", get_tag()); + suanpan_warning("Element {} is assigned with a material that does not support couple stress.\n", get_tag()); return SUANPAN_FAIL; } @@ -195,13 +195,12 @@ vector CSMT6::record(const OutputType P) { } void CSMT6::print() { - suanpan_info("Element %u is a six-node triangular membrane element (CSMT6).\n", get_tag()); - node_encoding.t().print("The nodes connected are:"); + suanpan_info("A six-node triangular membrane element (CSMT6) connecting nodes:", node_encoding); if(!is_initialized()) return; suanpan_info("Material:\n"); for(size_t I = 0; I < int_pt.size(); ++I) { - suanpan_info("Integration Point %llu:\t", I + 1); - int_pt[I].coor.t().print(); + suanpan_info("IP {}:\t", I + 1); + suanpan_info(int_pt[I].coor); int_pt[I].m_material->print(); } } diff --git a/Element/Membrane/CSM/CSMT6.h b/Element/Membrane/CSM/CSMT6.h index 93d4b5234..624f06f26 100644 --- a/Element/Membrane/CSM/CSMT6.h +++ b/Element/Membrane/CSM/CSMT6.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Membrane/Drilling/Allman.cpp b/Element/Membrane/Drilling/Allman.cpp index d32de910e..3917aab4b 100644 --- a/Element/Membrane/Drilling/Allman.cpp +++ b/Element/Membrane/Drilling/Allman.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,7 +18,7 @@ #include "Allman.h" #include #include -#include +#include #include Allman::IntegrationPoint::IntegrationPoint(vec&& C, const double W, unique_ptr&& M) @@ -168,7 +168,9 @@ vector Allman::record(const OutputType T) { return data; } -void Allman::print() { node_encoding.t().print("Allman element connects:"); } +void Allman::print() { + suanpan_info("Allman element connects:\t", node_encoding); +} #ifdef SUANPAN_VTK #include diff --git a/Element/Membrane/Drilling/Allman.h b/Element/Membrane/Drilling/Allman.h index 10b53ae89..1dca716a7 100644 --- a/Element/Membrane/Drilling/Allman.h +++ b/Element/Membrane/Drilling/Allman.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Membrane/Drilling/GCMQ.cpp b/Element/Membrane/Drilling/GCMQ.cpp index f77f51f8d..3d3793ea7 100644 --- a/Element/Membrane/Drilling/GCMQ.cpp +++ b/Element/Membrane/Drilling/GCMQ.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,8 +20,8 @@ #include #include #include -#include -#include +#include +#include #include /** @@ -185,7 +185,7 @@ int GCMQ::initialize(const shared_ptr& D) { HT = trans(H); if(!solve(NT, H, N) || !solve(MT, H, M)) { - suanpan_error("GCMQ %u fails to initialize and is disabled.\n", get_tag()); + suanpan_error("Element {} fails to initialize and is disabled.\n", get_tag()); return SUANPAN_FAIL; } @@ -316,23 +316,20 @@ vector GCMQ::record(const OutputType T) { } void GCMQ::print() { - suanpan_info("GCMQ mixed quadrilateral element %u connects nodes:\n", get_tag()); - node_encoding.t().print(); + suanpan_info("A GCMQ mixed quadrilateral element connecting nodes:", node_encoding); if(!is_initialized()) return; suanpan_info("Material Response:\n"); for(size_t I = 0; I < int_pt.size(); ++I) { - suanpan_info("Integration Point %llu:\t", I + 1); - int_pt[I].coor.t().print(); + suanpan_info("IP {}:\t", I + 1); + suanpan_info(int_pt[I].coor); int_pt[I].m_material->print(); } suanpan_info("Element Response:\n"); for(size_t I = 0; I < int_pt.size(); ++I) { - suanpan_info("Integration Point %llu:\t", I + 1); - int_pt[I].coor.t().print(); - suanpan_info("Strain: "); - (int_pt[I].poly_strain * current_beta).t().print(); - suanpan_info("Stress: "); - (int_pt[I].poly_stress * current_alpha).t().print(); + suanpan_info("IP {}:\t", I + 1); + suanpan_info(int_pt[I].coor); + suanpan_info("Strain:\t", vec{int_pt[I].poly_strain * current_beta}); + suanpan_info("Stress:\t", vec{int_pt[I].poly_stress * current_alpha}); } } diff --git a/Element/Membrane/Drilling/GCMQ.h b/Element/Membrane/Drilling/GCMQ.h index c375dea78..de5127181 100644 --- a/Element/Membrane/Drilling/GCMQ.h +++ b/Element/Membrane/Drilling/GCMQ.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Membrane/Drilling/GQ12.cpp b/Element/Membrane/Drilling/GQ12.cpp index 26debc57b..0ed6978f2 100644 --- a/Element/Membrane/Drilling/GQ12.cpp +++ b/Element/Membrane/Drilling/GQ12.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,7 +19,7 @@ #include #include #include -#include +#include #include GQ12::IntegrationPoint::IntegrationPoint(vec&& C, const double W, unique_ptr&& M) @@ -172,11 +172,11 @@ vector GQ12::record(const OutputType T) { } void GQ12::print() { - suanpan_info("GQ12 element.\n"); + suanpan_info("A GQ12 element.\n"); if(!is_initialized()) return; suanpan_info("Material:\n"); for(size_t I = 0; I < int_pt.size(); ++I) { - suanpan_info("Integration Point %llu:\n", I + 1); + suanpan_info("IP {}:\t", I + 1); int_pt[I].m_material->print(); } } diff --git a/Element/Membrane/Drilling/GQ12.h b/Element/Membrane/Drilling/GQ12.h index ad765914b..6a5fc29aa 100644 --- a/Element/Membrane/Drilling/GQ12.h +++ b/Element/Membrane/Drilling/GQ12.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Membrane/Drilling/SGCMQ.cpp b/Element/Membrane/Drilling/SGCMQ.cpp index 4c16e6d3f..1d749ff4a 100644 --- a/Element/Membrane/Drilling/SGCMQ.cpp +++ b/Element/Membrane/Drilling/SGCMQ.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,7 +20,7 @@ #include #include #include -#include +#include #include const mat SGCMQ::mapping = [] { @@ -269,13 +269,12 @@ vector SGCMQ::record(const OutputType T) { } void SGCMQ::print() { - suanpan_info("SGCMQ mixed quadrilateral element %u connects nodes:\n", get_tag()); - node_encoding.t().print(); + suanpan_info("A SGCMQ mixed quadrilateral element connects nodes:", node_encoding); if(!is_initialized()) return; suanpan_info("Material:\n"); for(size_t I = 0, J = 1; I < int_pt.size(); ++I, ++J) { - suanpan_info("Integration Point %llu:\t", J); - int_pt[I].coor.t().print(); + suanpan_info("IP {}:\t", J); + suanpan_info(int_pt[I].coor); int_pt[I].m_material->print(); } } diff --git a/Element/Membrane/Drilling/SGCMQ.h b/Element/Membrane/Drilling/SGCMQ.h index 7a61b80dc..851fc08ed 100644 --- a/Element/Membrane/Drilling/SGCMQ.h +++ b/Element/Membrane/Drilling/SGCMQ.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Membrane/Infinite/CINP4.cpp b/Element/Membrane/Infinite/CINP4.cpp index 944095bd4..615a43777 100644 --- a/Element/Membrane/Infinite/CINP4.cpp +++ b/Element/Membrane/Infinite/CINP4.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,7 +19,7 @@ #include #include #include -#include +#include #include CINP4::IntegrationPoint::IntegrationPoint(vec&& C, const double W, unique_ptr&& M, mat&& PNPXY) @@ -346,12 +346,12 @@ vector CINP4::record(const OutputType P) { } void CINP4::print() { - node_encoding.t().print("CINP4 element (doi: 10.1016/0045-7949(84)90019-1) connects: "); + suanpan_info("CINP4 element (doi: 10.1016/0045-7949(84)90019-1) connects: ", node_encoding); if(!is_initialized()) return; suanpan_info("Material:\n"); for(size_t I = 0; I < int_pt.size(); ++I) { - suanpan_info("Integration Point %llu:\t", I + 1); - int_pt[I].coor.t().print(); + suanpan_info("IP {}:\t", I + 1); + suanpan_info(int_pt[I].coor); int_pt[I].m_material->print(); } } diff --git a/Element/Membrane/Infinite/CINP4.h b/Element/Membrane/Infinite/CINP4.h index 289f57745..5e69b7234 100644 --- a/Element/Membrane/Infinite/CINP4.h +++ b/Element/Membrane/Infinite/CINP4.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Membrane/Mixed/PS.cpp b/Element/Membrane/Mixed/PS.cpp index 00fc3d01d..3ca0e05c6 100644 --- a/Element/Membrane/Mixed/PS.cpp +++ b/Element/Membrane/Mixed/PS.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,7 +19,7 @@ #include #include #include -#include +#include #include PS::IntegrationPoint::IntegrationPoint(vec&& C, const double W, unique_ptr&& M) @@ -163,13 +163,12 @@ vector PS::record(const OutputType P) { } void PS::print() { - suanpan_info("Element %u is a four-node membrane element (Pian-Sumihara).\n", get_tag()); - node_encoding.t().print("The nodes connected are:"); + suanpan_info("A four-node membrane element (Pian-Sumihara) connecting nodes:", node_encoding); if(!is_initialized()) return; suanpan_info("Material:\n"); for(size_t I = 0; I < int_pt.size(); ++I) { - suanpan_info("Integration Point %llu:\t", I + 1); - int_pt[I].coor.t().print(); + suanpan_info("IP {}:\t", I + 1); + suanpan_info(int_pt[I].coor); int_pt[I].m_material->print(); } } diff --git a/Element/Membrane/Mixed/PS.h b/Element/Membrane/Mixed/PS.h index 6d2d381b9..3cc518c93 100644 --- a/Element/Membrane/Mixed/PS.h +++ b/Element/Membrane/Mixed/PS.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Membrane/Mixed/QE2.cpp b/Element/Membrane/Mixed/QE2.cpp index 729c541cd..03718bd66 100644 --- a/Element/Membrane/Mixed/QE2.cpp +++ b/Element/Membrane/Mixed/QE2.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,7 +20,7 @@ #include #include #include -#include +#include #include mat QE2::mapping = [] { @@ -95,7 +95,7 @@ int QE2::initialize(const shared_ptr& D) { HT = trans(H); if(!solve(HIL, H, L) || !solve(HILI, H, LI)) { - suanpan_error("QE2 %u fails to initialize and is disabled.\n", get_tag()); + suanpan_error("Element {} fails to initialize and is disabled.\n", get_tag()); return SUANPAN_FAIL; } @@ -215,20 +215,18 @@ vector QE2::record(const OutputType T) { } void QE2::print() { - node_encoding.t().print("Piltner's mixed quad element connects nodes:"); + suanpan_info("Piltner's mixed quad element connects nodes:", node_encoding); if(!is_initialized()) return; suanpan_info("Material Response:\n"); for(size_t I = 0; I < int_pt.size(); ++I) { - suanpan_info("Integration Point %llu:\n", I + 1); + suanpan_info("IP {}:\t", I + 1); int_pt[I].m_material->print(); } suanpan_info("Element Response:\n"); for(size_t I = 0; I < int_pt.size(); ++I) { - suanpan_info("Integration Point %llu:\n", I + 1); - suanpan_info("Strain:\n"); - (int_pt[I].A * current_alpha).t().print(); - suanpan_info("Stress:\n"); - (int_pt[I].P * current_beta).t().print(); + suanpan_info("IP {}:\n", I + 1); + suanpan_info("Strain:\t", vec{int_pt[I].A * current_alpha}); + suanpan_info("Stress:\t", vec{int_pt[I].P * current_beta}); } } diff --git a/Element/Membrane/Mixed/QE2.h b/Element/Membrane/Mixed/QE2.h index 0eaa0685e..a3060710a 100644 --- a/Element/Membrane/Mixed/QE2.h +++ b/Element/Membrane/Mixed/QE2.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Membrane/PFM/DCP3.cpp b/Element/Membrane/PFM/DCP3.cpp index f826628e5..bd7a2cfed 100644 --- a/Element/Membrane/PFM/DCP3.cpp +++ b/Element/Membrane/PFM/DCP3.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -120,7 +120,7 @@ vector DCP3::record(const OutputType T) { } void DCP3::print() { - node_encoding.t().print("DCP3 element connects nodes:"); + suanpan_info("DCP3 element connects nodes:", node_encoding); if(!is_initialized()) return; suanpan_info("Material:\n"); m_material->print(); diff --git a/Element/Membrane/PFM/DCP3.h b/Element/Membrane/PFM/DCP3.h index f338b71b0..03d1d075c 100644 --- a/Element/Membrane/PFM/DCP3.h +++ b/Element/Membrane/PFM/DCP3.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Membrane/PFM/DCP4.cpp b/Element/Membrane/PFM/DCP4.cpp index 2c1ab700c..a356da981 100644 --- a/Element/Membrane/PFM/DCP4.cpp +++ b/Element/Membrane/PFM/DCP4.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,7 +20,7 @@ #include #include #include -#include +#include #include const uvec DCP4::u_dof{0, 1, 3, 4, 6, 7, 9, 10}; @@ -178,13 +178,13 @@ vector DCP4::record(const OutputType P) { } void DCP4::print() { - suanpan_info("Element %u is a four-node membrane element (DCP4)%s.\n", get_tag(), nlgeom ? " with nonlinear geometry (TL formulation)" : ""); - node_encoding.t().print("The nodes connected are:"); + suanpan_info("A four-node membrane element (DCP4){}.\n", nlgeom ? " with nonlinear geometry (TL formulation)" : ""); + suanpan_info("The nodes connected are:", node_encoding); if(!is_initialized()) return; suanpan_info("Material:\n"); for(size_t I = 0; I < int_pt.size(); ++I) { - suanpan_info("Integration Point %llu:\t", I + 1); - int_pt[I].coor.t().print(); + suanpan_info("IP {}:\t", I + 1); + suanpan_info(int_pt[I].coor); int_pt[I].m_material->print(); } } diff --git a/Element/Membrane/PFM/DCP4.h b/Element/Membrane/PFM/DCP4.h index 263d898bc..d69e5f826 100644 --- a/Element/Membrane/PFM/DCP4.h +++ b/Element/Membrane/PFM/DCP4.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Membrane/Plane/CP3.cpp b/Element/Membrane/Plane/CP3.cpp index f9bc0fc00..dd33e799e 100644 --- a/Element/Membrane/Plane/CP3.cpp +++ b/Element/Membrane/Plane/CP3.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,7 +19,7 @@ #include #include #include -#include +#include #include void CP3::stack_stiffness(mat& K, const mat& D, const mat& N, const double F) { @@ -249,7 +249,7 @@ int CP3::reset_status() { return m_material->reset_status(); } vector CP3::record(const OutputType T) { return m_material->record(T); } void CP3::print() { - node_encoding.t().print("CP3 element connects nodes:"); + suanpan_info("CP3 element connects nodes:", node_encoding); if(!is_initialized()) return; suanpan_info("Material:\n"); m_material->print(); diff --git a/Element/Membrane/Plane/CP3.h b/Element/Membrane/Plane/CP3.h index 84e1d34f6..6e34f93d5 100644 --- a/Element/Membrane/Plane/CP3.h +++ b/Element/Membrane/Plane/CP3.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Membrane/Plane/CP4.cpp b/Element/Membrane/Plane/CP4.cpp index 9ad36b2f0..95953e5b8 100644 --- a/Element/Membrane/Plane/CP4.cpp +++ b/Element/Membrane/Plane/CP4.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,8 +20,8 @@ #include #include #include -#include -#include +#include +#include #include const vec CP4::h_mode{1., -1., 1., -1.}; @@ -399,13 +399,13 @@ vector CP4::record(const OutputType P) { } void CP4::print() { - suanpan_info("Element %u is a four-node membrane element (CP4)%s.\n", get_tag(), nlgeom ? " with nonlinear geometry (TL formulation)" : ""); - node_encoding.t().print("The nodes connected are:"); + suanpan_info("A four-node membrane element (CP4){}.\n", nlgeom ? " with nonlinear geometry (TL formulation)" : ""); + suanpan_info("The nodes connected are:", node_encoding); if(!is_initialized()) return; suanpan_info("Material:\n"); for(size_t I = 0; I < int_pt.size(); ++I) { - suanpan_info("Integration Point %llu:\t", I + 1); - int_pt[I].coor.t().print(); + suanpan_info("IP {}:\t", I + 1); + suanpan_info(int_pt[I].coor); int_pt[I].m_material->print(); } } diff --git a/Element/Membrane/Plane/CP4.h b/Element/Membrane/Plane/CP4.h index b1ebde146..ce141d5ef 100644 --- a/Element/Membrane/Plane/CP4.h +++ b/Element/Membrane/Plane/CP4.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Membrane/Plane/CP4I.cpp b/Element/Membrane/Plane/CP4I.cpp index 62e872bc1..fa0fa09a7 100644 --- a/Element/Membrane/Plane/CP4I.cpp +++ b/Element/Membrane/Plane/CP4I.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,7 +19,7 @@ #include #include #include -#include +#include #include CP4I::IntegrationPoint::IntegrationPoint(vec&& C, const double W, unique_ptr&& M, mat&& PNPXY) @@ -352,13 +352,13 @@ vector CP4I::record(const OutputType P) { } void CP4I::print() { - suanpan_info("Element %u is a four-node membrane element (CP4I).\n", get_tag()); - node_encoding.t().print("The nodes connected are:"); + suanpan_info("A four-node membrane element (CP4I).\n"); + suanpan_info("The nodes connected are:", node_encoding); if(!is_initialized()) return; suanpan_info("Material:\n"); for(size_t I = 0; I < int_pt.size(); ++I) { - suanpan_info("Integration Point %llu:\t", I + 1); - int_pt[I].coor.t().print(); + suanpan_info("IP {}:\t", I + 1); + suanpan_info(int_pt[I].coor); int_pt[I].m_material->print(); } } diff --git a/Element/Membrane/Plane/CP4I.h b/Element/Membrane/Plane/CP4I.h index 56fe006b9..217867562 100644 --- a/Element/Membrane/Plane/CP4I.h +++ b/Element/Membrane/Plane/CP4I.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Membrane/Plane/CP5.cpp b/Element/Membrane/Plane/CP5.cpp index 0565fad67..8ba3a12c2 100644 --- a/Element/Membrane/Plane/CP5.cpp +++ b/Element/Membrane/Plane/CP5.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,8 +20,8 @@ #include #include #include -#include -#include +#include +#include #include CP5::IntegrationPoint::IntegrationPoint(vec&& C, const double W, unique_ptr&& M, mat&& PNPXY) @@ -183,8 +183,8 @@ vector CP5::record(const OutputType P) { } void CP5::print() { - suanpan_info("A CP5 element%s.\n", nlgeom ? " with nonlinear geometry on" : ""); - node_encoding.t().print("The nodes connected are:"); + suanpan_info("A CP5 element{}.\n", nlgeom ? " with nonlinear geometry on" : ""); + suanpan_info("The nodes connected are:", node_encoding); if(!is_initialized()) return; suanpan_info("Material:\n"); for(const auto& I : int_pt) I.m_material->print(); diff --git a/Element/Membrane/Plane/CP5.h b/Element/Membrane/Plane/CP5.h index f7151ee73..88a676e78 100644 --- a/Element/Membrane/Plane/CP5.h +++ b/Element/Membrane/Plane/CP5.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Membrane/Plane/CP6.cpp b/Element/Membrane/Plane/CP6.cpp index 1c5c7695c..951c3cd0f 100644 --- a/Element/Membrane/Plane/CP6.cpp +++ b/Element/Membrane/Plane/CP6.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,8 +19,8 @@ #include #include #include -#include -#include +#include +#include #include CP6::IntegrationPoint::IntegrationPoint(vec&& C, const double W, unique_ptr&& M, mat&& P) @@ -183,7 +183,7 @@ vector CP6::record(const OutputType T) { } void CP6::print() { - node_encoding.t().print("CP6 element connects:"); + suanpan_info("CP6 element connects:", node_encoding); if(!is_initialized()) return; suanpan_info("Material:\n"); for(const auto& I : int_pt) I.m_material->print(); diff --git a/Element/Membrane/Plane/CP6.h b/Element/Membrane/Plane/CP6.h index f2f59c5a6..3a27ae8fb 100644 --- a/Element/Membrane/Plane/CP6.h +++ b/Element/Membrane/Plane/CP6.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Membrane/Plane/CP7.cpp b/Element/Membrane/Plane/CP7.cpp index 24d0de549..5da1e2646 100644 --- a/Element/Membrane/Plane/CP7.cpp +++ b/Element/Membrane/Plane/CP7.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,8 +20,8 @@ #include #include #include -#include -#include +#include +#include #include CP7::IntegrationPoint::IntegrationPoint(vec&& C, const double W, unique_ptr&& M, mat&& PNPXY) @@ -183,8 +183,8 @@ vector CP7::record(const OutputType P) { } void CP7::print() { - suanpan_info("A CP7 element%s.\n", nlgeom ? " with nonlinear geometry on" : ""); - node_encoding.t().print("The nodes connected are:"); + suanpan_info("A CP7 element{}.\n", nlgeom ? " with nonlinear geometry on" : ""); + suanpan_info("The nodes connected are:", node_encoding); if(!is_initialized()) return; suanpan_info("Material:\n"); for(const auto& I : int_pt) I.m_material->print(); diff --git a/Element/Membrane/Plane/CP7.h b/Element/Membrane/Plane/CP7.h index 376e9e5b9..5848c570a 100644 --- a/Element/Membrane/Plane/CP7.h +++ b/Element/Membrane/Plane/CP7.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Membrane/Plane/CP8.cpp b/Element/Membrane/Plane/CP8.cpp index 6a4ae67f8..08d9b1177 100644 --- a/Element/Membrane/Plane/CP8.cpp +++ b/Element/Membrane/Plane/CP8.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,8 +20,8 @@ #include #include #include -#include -#include +#include +#include #include CP8::IntegrationPoint::IntegrationPoint(vec&& C, const double W, unique_ptr&& M, mat&& PNPXY) @@ -184,8 +184,8 @@ vector CP8::record(const OutputType P) { } void CP8::print() { - suanpan_info("A CP8%s element%s.\n", reduced_scheme ? "R" : "", nlgeom ? " with nonlinear geometry on" : ""); - node_encoding.t().print("The nodes connected are:"); + suanpan_info("A CP8{} element{}.\n", reduced_scheme ? "R" : "", nlgeom ? " with nonlinear geometry on" : ""); + suanpan_info("The nodes connected are:", node_encoding); if(!is_initialized()) return; suanpan_info("Material:\n"); for(const auto& I : int_pt) I.m_material->print(); diff --git a/Element/Membrane/Plane/CP8.h b/Element/Membrane/Plane/CP8.h index 47a3696ae..329fb638b 100644 --- a/Element/Membrane/Plane/CP8.h +++ b/Element/Membrane/Plane/CP8.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Membrane/Porous/PCPE4DC.cpp b/Element/Membrane/Porous/PCPE4DC.cpp index 6c7662918..7790882b2 100644 --- a/Element/Membrane/Porous/PCPE4DC.cpp +++ b/Element/Membrane/Porous/PCPE4DC.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,8 +20,8 @@ #include #include #include -#include -#include +#include +#include #include const uvec PCPE4DC::s_dof{0, 1, 4, 5, 8, 9, 12, 13}; @@ -45,11 +45,11 @@ int PCPE4DC::initialize(const shared_ptr& D) { // validate material type if(PlaneType::E != static_cast(s_mat->get_parameter(ParameterType::PLANETYPE))) { - suanpan_error("PCPE4DC %u only supports the plane strain material for solid phase.\n", get_tag()); + suanpan_error("Only plane strain material for solid phase is supported.\n"); return SUANPAN_FAIL; } if(MaterialType::DS != f_mat->get_material_type()) { - suanpan_error("PCPE4DC %u only supports the isotropic fluid phase.\n", get_tag()); + suanpan_error("Only isotropic fluid phase is supported.\n"); return SUANPAN_FAIL; } @@ -58,11 +58,11 @@ int PCPE4DC::initialize(const shared_ptr& D) { const auto kf = f_mat->get_parameter(ParameterType::BULKMODULUS); if(suanpan::approx_equal(ks, 0.)) { - suanpan_error("PCPE4DC %u solid phase returns a zero bulk modulus.\n", get_tag()); + suanpan_error("A zero bulk modulus is detected.\n"); return SUANPAN_FAIL; } if(suanpan::approx_equal(kf, 0.)) { - suanpan_error("PCPE4DC %u fluid phase returns a zero bulk modulus.\n", get_tag()); + suanpan_error("A zero bulk modulus is detected.\n"); return SUANPAN_FAIL; } @@ -214,13 +214,13 @@ vector PCPE4DC::record(const OutputType P) { } void PCPE4DC::print() { - suanpan_info("Element %u is a four-node membrane element (PCPE4DC).\n", get_tag()); - node_encoding.t().print("The nodes connected are:"); + suanpan_info("A four-node membrane element (PCPE4DC).\n"); + suanpan_info("The nodes connected are:", node_encoding); if(!is_initialized()) return; suanpan_info("Material:\n"); for(size_t I = 0; I < int_pt.size(); ++I) { - suanpan_info("Integration Point %llu:\t", I + 1); - int_pt[I].coor.t().print(); + suanpan_info("IP {}:\t", I + 1); + suanpan_info(int_pt[I].coor); int_pt[I].m_material->print(); } } diff --git a/Element/Membrane/Porous/PCPE4DC.h b/Element/Membrane/Porous/PCPE4DC.h index a44b7e3c1..6cd33645b 100644 --- a/Element/Membrane/Porous/PCPE4DC.h +++ b/Element/Membrane/Porous/PCPE4DC.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Membrane/Porous/PCPE4UC.cpp b/Element/Membrane/Porous/PCPE4UC.cpp index 019c69bad..3e4650ab4 100644 --- a/Element/Membrane/Porous/PCPE4UC.cpp +++ b/Element/Membrane/Porous/PCPE4UC.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,8 +20,8 @@ #include #include #include -#include -#include +#include +#include #include PCPE4UC::IntegrationPoint::IntegrationPoint(vec&& C, const double W, unique_ptr&& M) @@ -41,11 +41,11 @@ int PCPE4UC::initialize(const shared_ptr& D) { // validate material type if(PlaneType::E != static_cast(s_mat->get_parameter(ParameterType::PLANETYPE))) { - suanpan_error("PCPE4UC %u only supports the plane strain material for solid phase.\n", get_tag()); + suanpan_error("Only plane strain material for solid phase is supported.\n"); return SUANPAN_FAIL; } if(MaterialType::DS != f_mat->get_material_type()) { - suanpan_error("PCPE4UC %u only supports the isotropic fluid phase.\n", get_tag()); + suanpan_error("Only isotropic fluid phase is supported.\n"); return SUANPAN_FAIL; } @@ -54,11 +54,11 @@ int PCPE4UC::initialize(const shared_ptr& D) { const auto kf = f_mat->get_parameter(ParameterType::BULKMODULUS); if(suanpan::approx_equal(ks, 0.)) { - suanpan_error("PCPE4UC %u solid phase returns a zero bulk modulus.\n", get_tag()); + suanpan_error("A zero bulk modulus is detected.\n"); return SUANPAN_FAIL; } if(suanpan::approx_equal(kf, 0.)) { - suanpan_error("PCPE4UC %u fluid phase returns a zero bulk modulus.\n", get_tag()); + suanpan_error("A zero bulk modulus is detected.\n"); return SUANPAN_FAIL; } @@ -179,13 +179,13 @@ vector PCPE4UC::record(const OutputType P) { } void PCPE4UC::print() { - suanpan_info("Element %u is a four-node membrane element (PCPE4UC).\n", get_tag()); - node_encoding.t().print("The nodes connected are:"); + suanpan_info("A four-node membrane element (PCPE4UC).\n"); + suanpan_info("The nodes connected are:", node_encoding); if(!is_initialized()) return; suanpan_info("Material:\n"); for(size_t I = 0; I < int_pt.size(); ++I) { - suanpan_info("Integration Point %llu:\t", I + 1); - int_pt[I].coor.t().print(); + suanpan_info("IP {}:\t", I + 1); + suanpan_info(int_pt[I].coor); int_pt[I].m_material->print(); } } diff --git a/Element/Membrane/Porous/PCPE4UC.h b/Element/Membrane/Porous/PCPE4UC.h index 1ae1bdd15..02c705e16 100644 --- a/Element/Membrane/Porous/PCPE4UC.h +++ b/Element/Membrane/Porous/PCPE4UC.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Membrane/Porous/PCPE8DC.cpp b/Element/Membrane/Porous/PCPE8DC.cpp index f2bb93972..80a3994fe 100644 --- a/Element/Membrane/Porous/PCPE8DC.cpp +++ b/Element/Membrane/Porous/PCPE8DC.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,8 +20,8 @@ #include #include #include -#include -#include +#include +#include #include const uvec PCPE8DC::s_dof{0, 1, 4, 5, 8, 9, 12, 13, 16, 17, 20, 21, 24, 25, 28, 29}; @@ -45,11 +45,11 @@ int PCPE8DC::initialize(const shared_ptr& D) { // validate material type if(PlaneType::E != static_cast(s_mat->get_parameter(ParameterType::PLANETYPE))) { - suanpan_error("PCPE8DC %u only supports the plane strain material for solid phase.\n", get_tag()); + suanpan_error("Only plane strain material for solid phase is supported.\n"); return SUANPAN_FAIL; } if(MaterialType::DS != f_mat->get_material_type()) { - suanpan_error("PCPE8DC %u only supports the isotropic fluid phase.\n", get_tag()); + suanpan_error("Only isotropic fluid phase is supported.\n"); return SUANPAN_FAIL; } @@ -58,11 +58,11 @@ int PCPE8DC::initialize(const shared_ptr& D) { const auto kf = f_mat->get_parameter(ParameterType::BULKMODULUS); if(suanpan::approx_equal(ks, 0.)) { - suanpan_error("PCPE8DC %u solid phase returns a zero bulk modulus.\n", get_tag()); + suanpan_error("A zero bulk modulus is detected.\n"); return SUANPAN_FAIL; } if(suanpan::approx_equal(kf, 0.)) { - suanpan_error("PCPE8DC %u fluid phase returns a zero bulk modulus.\n", get_tag()); + suanpan_error("A zero bulk modulus is detected.\n"); return SUANPAN_FAIL; } @@ -198,13 +198,13 @@ vector PCPE8DC::record(const OutputType P) { } void PCPE8DC::print() { - suanpan_info("Element %u is a eight-node membrane element (PCPE8DC).\n", get_tag()); - node_encoding.t().print("The nodes connected are:"); + suanpan_info("A eight-node membrane element (PCPE8DC).\n"); + suanpan_info("The nodes connected are:", node_encoding); if(!is_initialized()) return; suanpan_info("Material:\n"); for(size_t I = 0; I < int_pt.size(); ++I) { - suanpan_info("Integration Point %llu:\t", I + 1); - int_pt[I].coor.t().print(); + suanpan_info("IP {}:\t", I + 1); + suanpan_info(int_pt[I].coor); int_pt[I].m_material->print(); } } diff --git a/Element/Membrane/Porous/PCPE8DC.h b/Element/Membrane/Porous/PCPE8DC.h index a41228d27..0fe31794e 100644 --- a/Element/Membrane/Porous/PCPE8DC.h +++ b/Element/Membrane/Porous/PCPE8DC.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Membrane/Porous/PCPE8UC.cpp b/Element/Membrane/Porous/PCPE8UC.cpp index c8f9e9782..cc604eeae 100644 --- a/Element/Membrane/Porous/PCPE8UC.cpp +++ b/Element/Membrane/Porous/PCPE8UC.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,8 +20,8 @@ #include #include #include -#include -#include +#include +#include #include PCPE8UC::IntegrationPoint::IntegrationPoint(vec&& C, const double W, unique_ptr&& M) @@ -41,11 +41,11 @@ int PCPE8UC::initialize(const shared_ptr& D) { // validate material type if(PlaneType::E != static_cast(s_mat->get_parameter(ParameterType::PLANETYPE))) { - suanpan_error("PCPE8UC %u only supports the plane strain material for solid phase.\n", get_tag()); + suanpan_error("Only plane strain material for solid phase is supported.\n"); return SUANPAN_FAIL; } if(MaterialType::DS != f_mat->get_material_type()) { - suanpan_error("PCPE8UC %u only supports the isotropic fluid phase.\n", get_tag()); + suanpan_error("Only isotropic fluid phase is supported.\n"); return SUANPAN_FAIL; } @@ -54,11 +54,11 @@ int PCPE8UC::initialize(const shared_ptr& D) { const auto kf = f_mat->get_parameter(ParameterType::BULKMODULUS); if(suanpan::approx_equal(ks, 0.)) { - suanpan_error("PCPE8UC %u solid phase returns a zero bulk modulus.\n", get_tag()); + suanpan_error("A zero bulk modulus is detected.\n"); return SUANPAN_FAIL; } if(suanpan::approx_equal(kf, 0.)) { - suanpan_error("PCPE8UC %u fluid phase returns a zero bulk modulus.\n", get_tag()); + suanpan_error("A zero bulk modulus is detected.\n"); return SUANPAN_FAIL; } @@ -163,13 +163,13 @@ vector PCPE8UC::record(const OutputType P) { } void PCPE8UC::print() { - suanpan_info("Element %u is a eight-node membrane element (PCPE8UC).\n", get_tag()); - node_encoding.t().print("The nodes connected are:"); + suanpan_info("A eight-node membrane element (PCPE8UC).\n"); + suanpan_info("The nodes connected are:", node_encoding); if(!is_initialized()) return; suanpan_info("Material:\n"); for(size_t I = 0; I < int_pt.size(); ++I) { - suanpan_info("Integration Point %llu:\t", I + 1); - int_pt[I].coor.t().print(); + suanpan_info("IP {}:\t", I + 1); + suanpan_info(int_pt[I].coor); int_pt[I].m_material->print(); } } diff --git a/Element/Membrane/Porous/PCPE8UC.h b/Element/Membrane/Porous/PCPE8UC.h index 4636988d9..788b88da2 100644 --- a/Element/Membrane/Porous/PCPE8UC.h +++ b/Element/Membrane/Porous/PCPE8UC.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Modifier/ElementalModal.cpp b/Element/Modifier/ElementalModal.cpp index c475c7eaf..1098b5bc5 100644 --- a/Element/Modifier/ElementalModal.cpp +++ b/Element/Modifier/ElementalModal.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Modifier/ElementalModal.h b/Element/Modifier/ElementalModal.h index 236549a98..0f991e43e 100644 --- a/Element/Modifier/ElementalModal.h +++ b/Element/Modifier/ElementalModal.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Modifier/LeeElementalDamping.cpp b/Element/Modifier/LeeElementalDamping.cpp index 7de0f2bd5..70a240621 100644 --- a/Element/Modifier/LeeElementalDamping.cpp +++ b/Element/Modifier/LeeElementalDamping.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Modifier/LeeElementalDamping.h b/Element/Modifier/LeeElementalDamping.h index 62b1f8636..7ab3c720b 100644 --- a/Element/Modifier/LeeElementalDamping.h +++ b/Element/Modifier/LeeElementalDamping.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Modifier/LinearViscosity.cpp b/Element/Modifier/LinearViscosity.cpp index 9501b9b0e..01d9b6f62 100644 --- a/Element/Modifier/LinearViscosity.cpp +++ b/Element/Modifier/LinearViscosity.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Modifier/LinearViscosity.h b/Element/Modifier/LinearViscosity.h index ab25ba286..fa1fcdf84 100644 --- a/Element/Modifier/LinearViscosity.h +++ b/Element/Modifier/LinearViscosity.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Modifier/LumpedScale.cpp b/Element/Modifier/LumpedScale.cpp index 1bc551717..5902fe1a9 100644 --- a/Element/Modifier/LumpedScale.cpp +++ b/Element/Modifier/LumpedScale.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Modifier/LumpedScale.h b/Element/Modifier/LumpedScale.h index 3afe349ff..288dd0bb9 100644 --- a/Element/Modifier/LumpedScale.h +++ b/Element/Modifier/LumpedScale.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Modifier/LumpedSimple.cpp b/Element/Modifier/LumpedSimple.cpp index 18309774a..f1db99da4 100644 --- a/Element/Modifier/LumpedSimple.cpp +++ b/Element/Modifier/LumpedSimple.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Modifier/LumpedSimple.h b/Element/Modifier/LumpedSimple.h index 1ab6fda35..285615180 100644 --- a/Element/Modifier/LumpedSimple.h +++ b/Element/Modifier/LumpedSimple.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Modifier/Modifier.cpp b/Element/Modifier/Modifier.cpp index 996a76557..e391478fd 100644 --- a/Element/Modifier/Modifier.cpp +++ b/Element/Modifier/Modifier.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,9 +20,7 @@ Modifier::Modifier(const unsigned T, uvec&& ET) : Tag(T) - , element_tag(std::forward(ET)) { suanpan_debug("Modifier %u ctor() called.\n", T); } - -Modifier::~Modifier() { suanpan_debug("Modifier %u dtor() called.\n", get_tag()); } + , element_tag(std::forward(ET)) {} void Modifier::initialize(const shared_ptr& D) { element_pool.clear(); diff --git a/Element/Modifier/Modifier.h b/Element/Modifier/Modifier.h index 1494e89a2..619306a6a 100644 --- a/Element/Modifier/Modifier.h +++ b/Element/Modifier/Modifier.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -48,7 +48,7 @@ class Modifier : public Tag { Modifier& operator=(const Modifier&) = delete; // assign forbidden Modifier& operator=(Modifier&&) = delete; // assign forbidden - ~Modifier() override; + ~Modifier() override = default; virtual void initialize(const shared_ptr&); diff --git a/Element/Modifier/Rayleigh.cpp b/Element/Modifier/Rayleigh.cpp index 15602884e..71e0015e2 100644 --- a/Element/Modifier/Rayleigh.cpp +++ b/Element/Modifier/Rayleigh.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Modifier/Rayleigh.h b/Element/Modifier/Rayleigh.h index 802221fdf..5e2b22189 100644 --- a/Element/Modifier/Rayleigh.h +++ b/Element/Modifier/Rayleigh.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Patch/Patch.cpp b/Element/Patch/Patch.cpp index 900919e48..e5d85ffeb 100644 --- a/Element/Patch/Patch.cpp +++ b/Element/Patch/Patch.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Patch/Patch.h b/Element/Patch/Patch.h index b6a5b5907..1d5a35518 100644 --- a/Element/Patch/Patch.h +++ b/Element/Patch/Patch.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Patch/PatchCube.cpp b/Element/Patch/PatchCube.cpp index b8b20f5c1..8b7698d39 100644 --- a/Element/Patch/PatchCube.cpp +++ b/Element/Patch/PatchCube.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,7 +21,7 @@ #include #include #include -#include +#include PatchCube::IntegrationPoint::IntegrationPoint(vec&& C, const double W, unique_ptr&& M) : coor(std::forward(C)) @@ -149,14 +149,12 @@ vector PatchCube::record(const OutputType T) { } void PatchCube::print() { - node_encoding.t().print("PatchCube element connects nodes:"); + suanpan_info("PatchCube element connects nodes:", node_encoding); if(!is_initialized()) return; suanpan_info("Material:\n"); for(const auto& t_pt : int_pt) { t_pt.c_material->print(); - suanpan_info("Strain:\t"); - t_pt.c_material->get_trial_strain().t().print(); - suanpan_info("Stress:\t"); - t_pt.c_material->get_trial_stress().t().print(); + suanpan_info("Strain:\t", t_pt.c_material->get_trial_strain()); + suanpan_info("Stress:\t", t_pt.c_material->get_trial_stress()); } } diff --git a/Element/Patch/PatchCube.h b/Element/Patch/PatchCube.h index 13145cfa9..1bf8053d6 100644 --- a/Element/Patch/PatchCube.h +++ b/Element/Patch/PatchCube.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Patch/PatchQuad.cpp b/Element/Patch/PatchQuad.cpp index 3793006cd..8bccf78e6 100644 --- a/Element/Patch/PatchQuad.cpp +++ b/Element/Patch/PatchQuad.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,7 +20,7 @@ #include #include #include -#include +#include #include PatchQuad::IntegrationPoint::IntegrationPoint(vec&& C, const double W, unique_ptr&& M) @@ -154,13 +154,13 @@ vector PatchQuad::record(const OutputType T) { } void PatchQuad::print() { - suanpan_info("Element %u is a four-node membrane patch (PatchQuad).\n", get_tag()); - node_encoding.t().print("The nodes connected are:"); + suanpan_info("A four-node membrane patch (PatchQuad).\n"); + suanpan_info("The nodes connected are:", node_encoding); if(!is_initialized()) return; suanpan_info("Material:\n"); for(size_t I = 0; I < int_pt.size(); ++I) { - suanpan_info("Integration Point %llu:\t", I + 1); - int_pt[I].coor.t().print(); + suanpan_info("IP {}:\t", I + 1); + suanpan_info(int_pt[I].coor); int_pt[I].m_material->print(); } } diff --git a/Element/Patch/PatchQuad.h b/Element/Patch/PatchQuad.h index dd3fbd3ea..7cb1ac8bd 100644 --- a/Element/Patch/PatchQuad.h +++ b/Element/Patch/PatchQuad.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Plate/DKT3.cpp b/Element/Plate/DKT3.cpp index b09474059..ad107319f 100644 --- a/Element/Plate/DKT3.cpp +++ b/Element/Plate/DKT3.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,7 +19,7 @@ #include #include #include -#include +#include DKT3::IntegrationPoint::SectionIntegrationPoint::SectionIntegrationPoint(const double E, const double F, unique_ptr&& M) : eccentricity(E) @@ -200,7 +200,9 @@ vector DKT3::record(const OutputType P) { return data; } -void DKT3::print() { node_encoding.t().print("A DKT triangular plate element connects:"); } +void DKT3::print() { + suanpan_info("A DKT triangular plate element connects:", node_encoding); +} #ifdef SUANPAN_VTK #include diff --git a/Element/Plate/DKT3.h b/Element/Plate/DKT3.h index 61fd87245..f0c1d7a88 100644 --- a/Element/Plate/DKT3.h +++ b/Element/Plate/DKT3.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Plate/DKT4.cpp b/Element/Plate/DKT4.cpp index ee8915105..c7ac62852 100644 --- a/Element/Plate/DKT4.cpp +++ b/Element/Plate/DKT4.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,7 +19,7 @@ #include #include #include -#include +#include DKT4::IntegrationPoint::SectionIntegrationPoint::SectionIntegrationPoint(const double E, const double F, unique_ptr&& M) : eccentricity(E) @@ -191,7 +191,9 @@ vector DKT4::record(const OutputType P) { return data; } -void DKT4::print() { node_encoding.t().print("A DKT quadrilateral plate element connects:"); } +void DKT4::print() { + suanpan_info("A DKT quadrilateral plate element connects:", node_encoding); +} #ifdef SUANPAN_VTK #include diff --git a/Element/Plate/DKT4.h b/Element/Plate/DKT4.h index 1c9fdc9ac..f3850f81c 100644 --- a/Element/Plate/DKT4.h +++ b/Element/Plate/DKT4.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Plate/Mindlin.cpp b/Element/Plate/Mindlin.cpp index f5a7dd67a..a855ce864 100644 --- a/Element/Plate/Mindlin.cpp +++ b/Element/Plate/Mindlin.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,7 +20,7 @@ #include #include #include -#include +#include #include Mindlin::IntegrationPoint::SectionIntegrationPoint::SectionIntegrationPoint(const double E, const double F, unique_ptr&& M) @@ -143,7 +143,9 @@ vector Mindlin::record(const OutputType P) { return data; } -void Mindlin::print() { node_encoding.t().print("A Mindlin plate element connects:"); } +void Mindlin::print() { + suanpan_info("A Mindlin plate element connects:", node_encoding); +} #ifdef SUANPAN_VTK #include diff --git a/Element/Plate/Mindlin.h b/Element/Plate/Mindlin.h index ac49a3d4d..8cb96b4e4 100644 --- a/Element/Plate/Mindlin.h +++ b/Element/Plate/Mindlin.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/SectionElement.cpp b/Element/SectionElement.cpp index c1de96124..0885f4554 100644 --- a/Element/SectionElement.cpp +++ b/Element/SectionElement.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/SectionElement.h b/Element/SectionElement.h index f55b2ef72..3eb1a3710 100644 --- a/Element/SectionElement.h +++ b/Element/SectionElement.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Shell/DKTS3.cpp b/Element/Shell/DKTS3.cpp index 31023196d..3f68216d1 100644 --- a/Element/Shell/DKTS3.cpp +++ b/Element/Shell/DKTS3.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,7 +21,7 @@ #include #include #include -#include +#include DKTS3::IntegrationPoint::SectionIntegrationPoint::SectionIntegrationPoint(const double E, const double F, unique_ptr&& M) : eccentricity(E) @@ -249,7 +249,9 @@ vector DKTS3::record(const OutputType P) { return data; } -void DKTS3::print() { suanpan_info("A three node planar shell element using CST for membrane action and DKT3 for plate action.\n"); } +void DKTS3::print() { + suanpan_info("A three-node planar shell element using CST for membrane action and DKT3 for plate action.\n"); +} #ifdef SUANPAN_VTK #include diff --git a/Element/Shell/DKTS3.h b/Element/Shell/DKTS3.h index c8f3dd647..779242d4c 100644 --- a/Element/Shell/DKTS3.h +++ b/Element/Shell/DKTS3.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Shell/S4.cpp b/Element/Shell/S4.cpp index 65267d88e..7d8a422c1 100644 --- a/Element/Shell/S4.cpp +++ b/Element/Shell/S4.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,7 +20,7 @@ #include #include #include -#include +#include #include S4::IntegrationPoint::SectionIntegrationPoint::SectionIntegrationPoint(const double E, const double F, unique_ptr&& M) @@ -223,7 +223,9 @@ vector S4::record(const OutputType P) { return data; } -void S4::print() { suanpan_info("A four node planar shell element using GQ12 for membrane action and Mindlin for plate action.\n"); } +void S4::print() { + suanpan_info("A four-node planar shell element using GQ12 for membrane action and Mindlin for plate action.\n"); +} #ifdef SUANPAN_VTK #include diff --git a/Element/Shell/S4.h b/Element/Shell/S4.h index bcea5649e..26ed329aa 100644 --- a/Element/Shell/S4.h +++ b/Element/Shell/S4.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Shell/SGCMS.cpp b/Element/Shell/SGCMS.cpp index 789e8cbe9..83ec69293 100644 --- a/Element/Shell/SGCMS.cpp +++ b/Element/Shell/SGCMS.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,7 +20,7 @@ #include #include #include -#include +#include const mat SGCMS::mapping = [] { mat t_mapping(4, 4); @@ -336,7 +336,9 @@ vector SGCMS::record(const OutputType P) { return data; } -void SGCMS::print() { suanpan_info("A four node planar shell element using SGCMQ for membrane action and DKT4 for plate action.\n"); } +void SGCMS::print() { + suanpan_info("A four-node planar shell element using SGCMQ for membrane action and DKT4 for plate action.\n"); +} #ifdef SUANPAN_VTK #include diff --git a/Element/Shell/SGCMS.h b/Element/Shell/SGCMS.h index fabcb95c4..e6d3e5a9a 100644 --- a/Element/Shell/SGCMS.h +++ b/Element/Shell/SGCMS.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Shell/ShellBase.cpp b/Element/Shell/ShellBase.cpp index fa56ee4fd..7951febec 100644 --- a/Element/Shell/ShellBase.cpp +++ b/Element/Shell/ShellBase.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ const uvec ShellBase::m_dof{0, 1, 5}; const uvec ShellBase::p_dof{2, 3, 4}; vec ShellBase::reshuffle(const vec& membrane_resistance, const vec& plate_resistance) { - suanpan_debug([&] { if(membrane_resistance.n_elem != plate_resistance.n_elem) throw invalid_argument("size conflicts"); }); + suanpan_assert([&] { if(membrane_resistance.n_elem != plate_resistance.n_elem) throw invalid_argument("size conflicts"); }); const auto t_size = 2 * plate_resistance.n_elem; @@ -38,7 +38,7 @@ vec ShellBase::reshuffle(const vec& membrane_resistance, const vec& plate_resist } mat ShellBase::reshuffle(const mat& membrane_stiffness, const mat& plate_stiffness) { - suanpan_debug([&] { + suanpan_assert([&] { if(membrane_stiffness.n_cols != membrane_stiffness.n_rows) throw invalid_argument("size conflicts"); if(membrane_stiffness.n_cols != plate_stiffness.n_cols) throw invalid_argument("size conflicts"); if(plate_stiffness.n_cols != plate_stiffness.n_rows) throw invalid_argument("size conflicts"); @@ -91,7 +91,7 @@ vec& ShellBase::transform_from_global_to_local(vec& displacement) const { } mat& ShellBase::transform_from_local_to_global(mat& stiffness) const { - suanpan_debug([&] { if(stiffness.n_cols != stiffness.n_rows) throw invalid_argument("size conflicts"); }); + suanpan_assert([&] { if(stiffness.n_cols != stiffness.n_rows) throw invalid_argument("size conflicts"); }); for(auto I = 0llu, K = 2llu; I < stiffness.n_cols; I += 3llu, K += 3llu) { const span i_span(I, K); diff --git a/Element/Shell/ShellBase.h b/Element/Shell/ShellBase.h index 07714ab96..dcf4339c7 100644 --- a/Element/Shell/ShellBase.h +++ b/Element/Shell/ShellBase.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Special/Contact2D.cpp b/Element/Special/Contact2D.cpp index ca5a31338..ffaab6a13 100644 --- a/Element/Special/Contact2D.cpp +++ b/Element/Special/Contact2D.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Special/Contact2D.h b/Element/Special/Contact2D.h index fbf36f178..29d7ea113 100644 --- a/Element/Special/Contact2D.h +++ b/Element/Special/Contact2D.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Special/Contact3D.cpp b/Element/Special/Contact3D.cpp index 982c374d8..76a171bcb 100644 --- a/Element/Special/Contact3D.cpp +++ b/Element/Special/Contact3D.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,7 +20,7 @@ #include #include #include -#include +#include void Contact3D::update_position() { for(auto& [node, span, position] : slave) { @@ -149,7 +149,7 @@ int Contact3D::initialize(const shared_ptr& D) { const auto& m_pool = D->get(master_tag)->get_pool(); if(0 != m_pool.n_elem % 3) { - suanpan_error("Contact3D %u master group has wrong number of nodes.", get_tag()); + suanpan_error("Element {} has wrong number of nodes.", get_tag()); return SUANPAN_FAIL; } diff --git a/Element/Special/Contact3D.h b/Element/Special/Contact3D.h index fc551a92f..038977b8b 100644 --- a/Element/Special/Contact3D.h +++ b/Element/Special/Contact3D.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Special/Damper01.cpp b/Element/Special/Damper01.cpp index 4f712e2f7..54ea95ef2 100644 --- a/Element/Special/Damper01.cpp +++ b/Element/Special/Damper01.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -90,4 +90,6 @@ int Damper01::reset_status() { return damper->reset_status(); } vector Damper01::record(const OutputType P) { return damper->record(P); } -void Damper01::print() { suanpan_info("A viscous damper element using displacement and velocity as basic quantities.\n"); } +void Damper01::print() { + suanpan_info("A viscous damper element using displacement and velocity as basic quantities.\n"); +} diff --git a/Element/Special/Damper01.h b/Element/Special/Damper01.h index f8cb7b685..8a80584ff 100644 --- a/Element/Special/Damper01.h +++ b/Element/Special/Damper01.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Special/Damper02.cpp b/Element/Special/Damper02.cpp index af164a99e..c828e520e 100644 --- a/Element/Special/Damper02.cpp +++ b/Element/Special/Damper02.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -87,4 +87,6 @@ int Damper02::reset_status() { return device->reset_status(); } vector Damper02::record(const OutputType P) { return device->record(P); } -void Damper02::print() { suanpan_info("A viscous damper element using displacement and velocity as basic quantities.\n"); } +void Damper02::print() { + suanpan_info("A viscous damper element using displacement and velocity as basic quantities.\n"); +} diff --git a/Element/Special/Damper02.h b/Element/Special/Damper02.h index 0e7e768c4..8282d5c0c 100644 --- a/Element/Special/Damper02.h +++ b/Element/Special/Damper02.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Special/Embedded.cpp b/Element/Special/Embedded.cpp index ab1adae01..10c261b7e 100644 --- a/Element/Special/Embedded.cpp +++ b/Element/Special/Embedded.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Special/Embedded.h b/Element/Special/Embedded.h index 4cff66425..7a327eff2 100644 --- a/Element/Special/Embedded.h +++ b/Element/Special/Embedded.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Special/Joint.cpp b/Element/Special/Joint.cpp index dd392d5a6..943ecc0df 100644 --- a/Element/Special/Joint.cpp +++ b/Element/Special/Joint.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -76,4 +76,6 @@ vector Joint::record(const OutputType P) { return data; } -void Joint::print() { suanpan_info("A joint element that uses displacement as basic quantity. The material model used shall be based on displacement--force relationship.\n"); } +void Joint::print() { + suanpan_info("A joint element that uses displacement as basic quantity. The material model used shall be based on displacement-force relationship.\n"); +} diff --git a/Element/Special/Joint.h b/Element/Special/Joint.h index 50bb3781e..fcdce0b77 100644 --- a/Element/Special/Joint.h +++ b/Element/Special/Joint.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Special/Mass.cpp b/Element/Special/Mass.cpp index 8b7506f48..b0234ee98 100644 --- a/Element/Special/Mass.cpp +++ b/Element/Special/Mass.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -29,7 +29,9 @@ int MassBase::clear_status() { return SUANPAN_SUCCESS; } int MassBase::reset_status() { return SUANPAN_SUCCESS; } -void MassBase::print() { suanpan_info("A point mass element.\n"); } +void MassBase::print() { + suanpan_info("A point mass element.\n"); +} #ifdef SUANPAN_VTK #include diff --git a/Element/Special/Mass.h b/Element/Special/Mass.h index c45c4b3e7..510a8b1a8 100644 --- a/Element/Special/Mass.h +++ b/Element/Special/Mass.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Special/SingleSection2D.cpp b/Element/Special/SingleSection2D.cpp index 39724c06a..11534cc8f 100644 --- a/Element/Special/SingleSection2D.cpp +++ b/Element/Special/SingleSection2D.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Special/SingleSection2D.h b/Element/Special/SingleSection2D.h index a1b3e8afc..5547736f2 100644 --- a/Element/Special/SingleSection2D.h +++ b/Element/Special/SingleSection2D.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Special/SingleSection3D.cpp b/Element/Special/SingleSection3D.cpp index 1d4bf6a0b..c8cbcdf2f 100644 --- a/Element/Special/SingleSection3D.cpp +++ b/Element/Special/SingleSection3D.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -48,6 +48,5 @@ int SingleSection3D::reset_status() { return s_section->reset_status(); } void SingleSection3D::print() { suanpan_info("A SingleSection3D element that represents a section which can be used for section analysis.\n"); - if(is_initialized()) s_section->print(); } diff --git a/Element/Special/SingleSection3D.h b/Element/Special/SingleSection3D.h index 03d3c87c6..5b4602944 100644 --- a/Element/Special/SingleSection3D.h +++ b/Element/Special/SingleSection3D.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Special/Spring01.cpp b/Element/Special/Spring01.cpp index 740fa2656..eec89b9fd 100644 --- a/Element/Special/Spring01.cpp +++ b/Element/Special/Spring01.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -67,7 +67,7 @@ int Spring01::reset_status() { return s_material->reset_status(); } vector Spring01::record(const OutputType P) { return s_material->record(P); } void Spring01::print() { - suanpan_info("A spring element that uses displacement as basic quantity. The material model used shall be based on displacement--force relationship.\n"); + suanpan_info("A spring element that uses displacement as basic quantity. The material model used shall be based on displacement-force relationship.\n"); if(!is_initialized()) return; suanpan_info("Material:\n"); s_material->print(); diff --git a/Element/Special/Spring01.h b/Element/Special/Spring01.h index 797a232e0..5cde742ee 100644 --- a/Element/Special/Spring01.h +++ b/Element/Special/Spring01.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Special/Spring02.cpp b/Element/Special/Spring02.cpp index 41f59f571..e18c7724e 100644 --- a/Element/Special/Spring02.cpp +++ b/Element/Special/Spring02.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -73,7 +73,7 @@ int Spring02::reset_status() { return s_material->reset_status(); } vector Spring02::record(const OutputType P) { return s_material->record(P); } void Spring02::print() { - suanpan_info("A spring element that uses strain as basic quantity. The material model used shall be based on displacement--force relationship.\n"); + suanpan_info("A spring element that uses strain as basic quantity. The material model used shall be based on displacement-force relationship.\n"); if(!is_initialized()) return; suanpan_info("Material:\n"); s_material->print(); diff --git a/Element/Special/Spring02.h b/Element/Special/Spring02.h index af37856ec..5cb5e6136 100644 --- a/Element/Special/Spring02.h +++ b/Element/Special/Spring02.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Special/Tie.cpp b/Element/Special/Tie.cpp index 951ab30da..d33d97d29 100644 --- a/Element/Special/Tie.cpp +++ b/Element/Special/Tie.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Special/Tie.h b/Element/Special/Tie.h index 6f5ec99d1..dc1e07d7a 100644 --- a/Element/Special/Tie.h +++ b/Element/Special/Tie.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Truss/T2D2.cpp b/Element/Truss/T2D2.cpp index ec88c08d1..c7b1ecc6d 100644 --- a/Element/Truss/T2D2.cpp +++ b/Element/Truss/T2D2.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,9 +19,10 @@ #include #include -T2D2::T2D2(const unsigned T, uvec&& N, const unsigned M, const double A, const bool F, const bool UA, const bool LS) +T2D2::T2D2(const unsigned T, uvec&& N, const unsigned M, const double A, const bool F, const bool UA, const bool LS, const double FR) : MaterialElement1D(T, t_node, t_dof, std::forward(N), uvec{M}, F, {DOF::U1, DOF::U2}) , area(A) + , rigidity(FR) , t_trans(F ? make_unique() : make_unique()) , update_area(UA) , log_strain(LS) {} @@ -31,6 +32,8 @@ int T2D2::initialize(const shared_ptr& D) { access::rw(length) = t_trans->get_length(); + if(rigidity > 0.) access::rw(euler) = -pow(datum::pi / length, 2.) * rigidity; + t_material = D->get(material_tag(0))->get_copy(); trial_stiffness = current_stiffness = initial_stiffness = t_trans->to_global_stiffness_mat(area / length * t_material->get_initial_stiffness()); @@ -63,9 +66,15 @@ int T2D2::update_status() { trial_stiffness = t_trans->to_global_stiffness_mat(area / length * t_material->get_trial_stiffness()); } - trial_resistance = t_trans->to_global_vec(new_area * t_material->get_trial_stress()); + const vec axial_force = new_area * t_material->get_trial_stress(); + trial_resistance = t_trans->to_global_vec(axial_force); + + if(euler < 0. && axial_force(0) <= euler) { + suanpan_error("Element {} exceeds Euler buckling limit.\n", get_tag()); + return SUANPAN_FAIL; + } - suanpan_debug([&] { if(!trial_stiffness.is_finite() || !trial_resistance.is_finite()) throw invalid_argument("infinite number detected"); }); + suanpan_assert([&] { if(!trial_stiffness.is_finite() || !trial_resistance.is_finite()) throw invalid_argument("infinite number detected"); }); return SUANPAN_SUCCESS; } @@ -91,11 +100,13 @@ int T2D2::reset_status() { vector T2D2::record(const OutputType P) { return t_material->record(P); } void T2D2::print() { - suanpan_info("2D truss element with "); - if(nlgeom) suanpan_info("corotational formulation, assuming constant %s and %s strain. ", update_area ? "volume" : "area", log_strain ? "logarithmic" : "engineering"); - else suanpan_info("linear formulation. "); - node_encoding.t().print("The nodes connected are:"); - suanpan_info("The area is %.4E. The initial element length is %.4E.\n", area, length); + suanpan_info("A 2D truss element with "); + if(nlgeom) + suanpan_info("corotational formulation, assuming constant {} and {} strain. ", update_area ? "volume" : "area", log_strain ? "logarithmic" : "engineering"); + else + suanpan_info("linear formulation. "); + suanpan_info("The nodes connected are:", node_encoding); + suanpan_info("The area is {:.4E}. The initial element length is {:.4E}.\n", area, length); if(!is_initialized()) return; suanpan_info("Material:\n"); t_material->print(); diff --git a/Element/Truss/T2D2.h b/Element/Truss/T2D2.h index 0acf002b2..4a9d0d15e 100644 --- a/Element/Truss/T2D2.h +++ b/Element/Truss/T2D2.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -40,6 +40,8 @@ class T2D2 final : public MaterialElement1D { const double length = 0.; // length of the element const double area; // area of the cross-section + const double rigidity; + const double euler = 1.; unique_ptr t_material; // material model unique_ptr t_trans; // transformation @@ -53,7 +55,8 @@ class T2D2 final : public MaterialElement1D { double, // area bool = false, // nonlinear geometry switch bool = true, // update area switch - bool = true // log strain switch + bool = true, // log strain switch + double = -1. // flexural rigidity ); int initialize(const shared_ptr&) override; diff --git a/Element/Truss/T2D2S.cpp b/Element/Truss/T2D2S.cpp index 7eb8e5fa1..13cd8992a 100644 --- a/Element/Truss/T2D2S.cpp +++ b/Element/Truss/T2D2S.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -84,10 +84,12 @@ int T2D2S::reset_status() { vector T2D2S::record(const OutputType P) { return t_section->record(P); } void T2D2S::print() { - suanpan_info("2D truss element with "); - if(nlgeom) suanpan_info("corotational formulation, assuming constant area and %s strain. ", log_strain ? "logarithmic" : "engineering"); - else suanpan_info("linear formulation. "); - node_encoding.t().print("The nodes connected are:"); + suanpan_info("A 2D truss element with "); + if(nlgeom) + suanpan_info("corotational formulation, assuming constant area and {} strain.", log_strain ? "logarithmic" : "engineering"); + else + suanpan_info("linear formulation."); + suanpan_info(" The nodes connected are:", node_encoding); if(!is_initialized()) return; suanpan_info("Section:\n"); t_section->print(); diff --git a/Element/Truss/T2D2S.h b/Element/Truss/T2D2S.h index 588df0a70..fab2f8e07 100644 --- a/Element/Truss/T2D2S.h +++ b/Element/Truss/T2D2S.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Truss/T3D2.cpp b/Element/Truss/T3D2.cpp index 133394e79..f82eb569d 100644 --- a/Element/Truss/T3D2.cpp +++ b/Element/Truss/T3D2.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -89,11 +89,13 @@ int T3D2::reset_status() { vector T3D2::record(const OutputType T) { return t_material->record(T); } void T3D2::print() { - suanpan_info("3D truss element with "); - if(nlgeom) suanpan_info("corotational formulation, assuming constant %s and %s strain. ", update_area ? "volume" : "area", log_strain ? "logarithmic" : "engineering"); - else suanpan_info("linear formulation. "); - node_encoding.t().print("The nodes connected are:"); - suanpan_info("The area is %.4E. The initial element length is %.4E.\n", area, length); + suanpan_info("A 3D truss element with "); + if(nlgeom) + suanpan_info("corotational formulation, assuming constant {} and {} strain.", update_area ? "volume" : "area", log_strain ? "logarithmic" : "engineering"); + else + suanpan_info("linear formulation."); + suanpan_info(" The nodes connected are:", node_encoding); + suanpan_info("The area is {:.4E}. The initial element length is {:.4E}.\n", area, length); if(!is_initialized()) return; suanpan_info("Material:\n"); t_material->print(); diff --git a/Element/Truss/T3D2.h b/Element/Truss/T3D2.h index 2a88ff91a..2c86ad3d0 100644 --- a/Element/Truss/T3D2.h +++ b/Element/Truss/T3D2.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Truss/T3D2S.cpp b/Element/Truss/T3D2S.cpp index 5638979dc..291c28dd5 100644 --- a/Element/Truss/T3D2S.cpp +++ b/Element/Truss/T3D2S.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -84,10 +84,12 @@ int T3D2S::reset_status() { vector T3D2S::record(const OutputType T) { return t_section->record(T); } void T3D2S::print() { - suanpan_info("3D truss element with "); - if(nlgeom) suanpan_info("corotational formulation, assuming constant area and %s strain. ", log_strain ? "logarithmic" : "engineering"); - else suanpan_info("linear formulation. "); - node_encoding.t().print("The nodes connected are:"); + suanpan_info("A 3D truss element with "); + if(nlgeom) + suanpan_info("corotational formulation, assuming constant area and {} strain.", log_strain ? "logarithmic" : "engineering"); + else + suanpan_info("linear formulation."); + suanpan_info(" The nodes connected are:", node_encoding); if(!is_initialized()) return; suanpan_info("Section:\n"); t_section->print(); diff --git a/Element/Truss/T3D2S.h b/Element/Truss/T3D2S.h index 6db00957e..a4a0cd754 100644 --- a/Element/Truss/T3D2S.h +++ b/Element/Truss/T3D2S.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Utility/B2DC.cpp b/Element/Utility/B2DC.cpp index 6f7aee963..1b83adad7 100644 --- a/Element/Utility/B2DC.cpp +++ b/Element/Utility/B2DC.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -17,7 +17,7 @@ #include "B2DC.h" #include -#include +#include unique_ptr B2DC::get_copy() { return make_unique(*this); } diff --git a/Element/Utility/B2DC.h b/Element/Utility/B2DC.h index 3349bff3f..a93d3ccdf 100644 --- a/Element/Utility/B2DC.h +++ b/Element/Utility/B2DC.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Utility/B2DL.cpp b/Element/Utility/B2DL.cpp index 672767074..0a327ec0b 100644 --- a/Element/Utility/B2DL.cpp +++ b/Element/Utility/B2DL.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -17,7 +17,7 @@ #include "B2DL.h" #include -#include +#include void B2DL::form_trans_mat(const vec& d_cosine) { trans_mat.zeros(3, 6); diff --git a/Element/Utility/B2DL.h b/Element/Utility/B2DL.h index eca2c58cd..ce6648e2a 100644 --- a/Element/Utility/B2DL.h +++ b/Element/Utility/B2DL.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Utility/B3DC.cpp b/Element/Utility/B3DC.cpp index 453f97625..97879720b 100644 --- a/Element/Utility/B3DC.cpp +++ b/Element/Utility/B3DC.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -17,7 +17,7 @@ #include "B3DC.h" #include -#include +#include unique_ptr B3DC::get_copy() { return make_unique(*this); } diff --git a/Element/Utility/B3DC.h b/Element/Utility/B3DC.h index fe6119f3c..e45f0375b 100644 --- a/Element/Utility/B3DC.h +++ b/Element/Utility/B3DC.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Utility/B3DL.cpp b/Element/Utility/B3DL.cpp index 290c2860c..82c920134 100644 --- a/Element/Utility/B3DL.cpp +++ b/Element/Utility/B3DL.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Utility/B3DL.h b/Element/Utility/B3DL.h index d13b01df2..77fcc190f 100644 --- a/Element/Utility/B3DL.h +++ b/Element/Utility/B3DL.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Utility/IGA/BSpline.cpp b/Element/Utility/IGA/BSpline.cpp index 2c169bf72..830279fcb 100644 --- a/Element/Utility/IGA/BSpline.cpp +++ b/Element/Utility/IGA/BSpline.cpp @@ -1,5 +1,5 @@ //////////////////////////////////////////////////////////////////////////////// -// Copyright (C) 2017-2022 Theodore Chang +// Copyright (C) 2017-2023 Theodore Chang // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -196,7 +196,7 @@ vec BSpline::evaluate_point(const double u, const field& polygon) const { const auto span = evaluate_span(u); const auto basis = evaluate_basis(u); - suanpan_debug([&] { if(polygon.n_elem < knot.n_elem - order - 1) throw invalid_argument("need more control points"); }); + suanpan_assert([&] { if(polygon.n_elem < knot.n_elem - order - 1) throw invalid_argument("need more control points"); }); vec point(dimension, fill::zeros); diff --git a/Element/Utility/IGA/BSpline.h b/Element/Utility/IGA/BSpline.h index c1c2e7c6f..ac7cfe9f1 100644 --- a/Element/Utility/IGA/BSpline.h +++ b/Element/Utility/IGA/BSpline.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Utility/IGA/BSplineSurface.cpp b/Element/Utility/IGA/BSplineSurface.cpp index 42f4aaa44..23922fe20 100644 --- a/Element/Utility/IGA/BSplineSurface.cpp +++ b/Element/Utility/IGA/BSplineSurface.cpp @@ -1,5 +1,5 @@ //////////////////////////////////////////////////////////////////////////////// -// Copyright (C) 2017-2022 Theodore Chang +// Copyright (C) 2017-2023 Theodore Chang // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/Element/Utility/IGA/BSplineSurface.h b/Element/Utility/IGA/BSplineSurface.h index 23da279b4..e6148c90e 100644 --- a/Element/Utility/IGA/BSplineSurface.h +++ b/Element/Utility/IGA/BSplineSurface.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Utility/IGA/BSplineVolume.cpp b/Element/Utility/IGA/BSplineVolume.cpp index a091e6001..e549d8ac3 100644 --- a/Element/Utility/IGA/BSplineVolume.cpp +++ b/Element/Utility/IGA/BSplineVolume.cpp @@ -1,5 +1,5 @@ //////////////////////////////////////////////////////////////////////////////// -// Copyright (C) 2017-2022 Theodore Chang +// Copyright (C) 2017-2023 Theodore Chang // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/Element/Utility/IGA/BSplineVolume.h b/Element/Utility/IGA/BSplineVolume.h index e11bbc650..8b42aa915 100644 --- a/Element/Utility/IGA/BSplineVolume.h +++ b/Element/Utility/IGA/BSplineVolume.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Utility/IGA/NURBS.cpp b/Element/Utility/IGA/NURBS.cpp index e21d3d891..8d9d8dd30 100644 --- a/Element/Utility/IGA/NURBS.cpp +++ b/Element/Utility/IGA/NURBS.cpp @@ -1,5 +1,5 @@ //////////////////////////////////////////////////////////////////////////////// -// Copyright (C) 2017-2022 Theodore Chang +// Copyright (C) 2017-2023 Theodore Chang // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/Element/Utility/IGA/NURBS.h b/Element/Utility/IGA/NURBS.h index 16a1117a1..2c32be4ee 100644 --- a/Element/Utility/IGA/NURBS.h +++ b/Element/Utility/IGA/NURBS.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Utility/IGA/NURBSSurface.cpp b/Element/Utility/IGA/NURBSSurface.cpp index fe4fb3499..cbf4f49f8 100644 --- a/Element/Utility/IGA/NURBSSurface.cpp +++ b/Element/Utility/IGA/NURBSSurface.cpp @@ -1,5 +1,5 @@ //////////////////////////////////////////////////////////////////////////////// -// Copyright (C) 2017-2022 Theodore Chang +// Copyright (C) 2017-2023 Theodore Chang // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/Element/Utility/IGA/NURBSSurface.h b/Element/Utility/IGA/NURBSSurface.h index b9adf1766..757834436 100644 --- a/Element/Utility/IGA/NURBSSurface.h +++ b/Element/Utility/IGA/NURBSSurface.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Utility/IGA/NURBSVolume.cpp b/Element/Utility/IGA/NURBSVolume.cpp index c5bd6605b..e62aeb16c 100644 --- a/Element/Utility/IGA/NURBSVolume.cpp +++ b/Element/Utility/IGA/NURBSVolume.cpp @@ -1,5 +1,5 @@ //////////////////////////////////////////////////////////////////////////////// -// Copyright (C) 2017-2022 Theodore Chang +// Copyright (C) 2017-2023 Theodore Chang // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/Element/Utility/IGA/NURBSVolume.h b/Element/Utility/IGA/NURBSVolume.h index 9af8cc0a4..d173fa565 100644 --- a/Element/Utility/IGA/NURBSVolume.h +++ b/Element/Utility/IGA/NURBSVolume.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Utility/MatrixModifier.hpp b/Element/Utility/MatrixModifier.hpp index 77c8a922b..892f0aeb7 100644 --- a/Element/Utility/MatrixModifier.hpp +++ b/Element/Utility/MatrixModifier.hpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Utility/Orientation.cpp b/Element/Utility/Orientation.cpp index 19e685496..90e5c1fcb 100644 --- a/Element/Utility/Orientation.cpp +++ b/Element/Utility/Orientation.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,7 +18,7 @@ #include "Orientation.h" #include -void Orientation::check_element_ptr() const { suanpan_debug([&] { if(element_ptr == nullptr) throw logic_error("need to set element pointer first.\n"); }); } +void Orientation::check_element_ptr() const { suanpan_assert([&] { if(element_ptr == nullptr) throw logic_error("need to set element pointer first"); }); } Orientation::Orientation(const unsigned T, vec&& O) : Tag(T) diff --git a/Element/Utility/Orientation.h b/Element/Utility/Orientation.h index d44cd6d5e..3dab8c7a8 100644 --- a/Element/Utility/Orientation.h +++ b/Element/Utility/Orientation.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Utility/PhaseField.cpp b/Element/Utility/PhaseField.cpp index 70a8c3ba3..bb5400f1a 100644 --- a/Element/Utility/PhaseField.cpp +++ b/Element/Utility/PhaseField.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ ******************************************************************************/ #include "PhaseField.h" -#include +#include void PhaseField::commit_status(const unique_ptr& mat_obj) { const auto i_strain = mat_obj->get_trial_strain() - mat_obj->get_current_strain(); diff --git a/Element/Utility/PhaseField.h b/Element/Utility/PhaseField.h index b0009f557..9899b9ccf 100644 --- a/Element/Utility/PhaseField.h +++ b/Element/Utility/PhaseField.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Utility/T2DC.cpp b/Element/Utility/T2DC.cpp index 0975a5e2f..9c481c3e4 100644 --- a/Element/Utility/T2DC.cpp +++ b/Element/Utility/T2DC.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -17,7 +17,7 @@ #include "T2DC.h" #include -#include +#include unique_ptr T2DC::get_copy() { return make_unique(*this); } diff --git a/Element/Utility/T2DC.h b/Element/Utility/T2DC.h index efe79c198..aec11a6b0 100644 --- a/Element/Utility/T2DC.h +++ b/Element/Utility/T2DC.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Utility/T2DL.cpp b/Element/Utility/T2DL.cpp index 5646ee031..f2112d354 100644 --- a/Element/Utility/T2DL.cpp +++ b/Element/Utility/T2DL.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -17,7 +17,7 @@ #include "T2DL.h" #include -#include +#include const span T2DL::IS(0, 1); const span T2DL::JS(2, 3); diff --git a/Element/Utility/T2DL.h b/Element/Utility/T2DL.h index 297c7d42d..6bb42f15f 100644 --- a/Element/Utility/T2DL.h +++ b/Element/Utility/T2DL.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Utility/T3DC.cpp b/Element/Utility/T3DC.cpp index d5a80085e..93c5c3706 100644 --- a/Element/Utility/T3DC.cpp +++ b/Element/Utility/T3DC.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Utility/T3DC.h b/Element/Utility/T3DC.h index 0f54e0e44..8ee6cbdde 100644 --- a/Element/Utility/T3DC.h +++ b/Element/Utility/T3DC.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Utility/T3DL.cpp b/Element/Utility/T3DL.cpp index cc8cefbd6..aa5f5a977 100644 --- a/Element/Utility/T3DL.cpp +++ b/Element/Utility/T3DL.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Utility/T3DL.h b/Element/Utility/T3DL.h index 104c36470..7b8893216 100644 --- a/Element/Utility/T3DL.h +++ b/Element/Utility/T3DL.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Visualisation/vtkBase.cpp b/Element/Visualisation/vtkBase.cpp index 5720c423e..63817b296 100644 --- a/Element/Visualisation/vtkBase.cpp +++ b/Element/Visualisation/vtkBase.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Visualisation/vtkBase.h b/Element/Visualisation/vtkBase.h index 96c39a07f..71ff5c376 100644 --- a/Element/Visualisation/vtkBase.h +++ b/Element/Visualisation/vtkBase.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Element/Visualisation/vtkParser.cpp b/Element/Visualisation/vtkParser.cpp index 216cb0472..1aea6ec44 100644 --- a/Element/Visualisation/vtkParser.cpp +++ b/Element/Visualisation/vtkParser.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -115,13 +115,14 @@ void vtk_setup(const vtkSmartPointer& grid, const vtkInfo& interactor->Start(); } -void vtk_save(const vtkSmartPointer& grid, const vtkInfo& config) { +void vtk_save(vtkSmartPointer&& grid, const vtkInfo config) { + // NOLINT(performance-unnecessary-value-param) const auto writer = vtkSmartPointer::New(); writer->SetInputData(grid); writer->SetFileName(config.file_name.c_str()); writer->SetFileTypeToBinary(); writer->Write(); - suanpan_debug("plot is written to %s.\n", config.file_name.c_str()); + suanpan_debug("Plot is written to file \"{}\".\n", config.file_name); } int vtk_parser(const shared_ptr& domain, istringstream& command) { @@ -170,7 +171,7 @@ void vtk_plot_node_quantity(const shared_ptr& domain, vtkInfo config data->SetComponentName(4, "5"); data->SetComponentName(5, "6"); - const auto grid = vtkSmartPointer::New(); + auto grid = vtkSmartPointer::New(); grid->Allocate(static_cast(t_element_pool.size())); std::ranges::for_each(t_element_pool, [&](const shared_ptr& t_element) { t_element->SetDeformation(node, config.scale); @@ -188,7 +189,8 @@ void vtk_plot_node_quantity(const shared_ptr& domain, vtkInfo config else if(config.save_file) { grid->GetPointData()->SetScalars(data); grid->GetPointData()->SetActiveScalars(vtk_get_name(config.type)); - vtk_save(grid, config); + auto writer = std::thread(vtk_save, std::move(grid), config); + writer.detach(); } else { const auto sub_data = vtkSmartPointer::New(); @@ -234,7 +236,7 @@ void vtk_plot_element_quantity(const shared_ptr& domain, vtkInfo con mat tensor(6, max_node, fill::zeros); vec counter(max_node, fill::zeros); - const auto grid = vtkSmartPointer::New(); + auto grid = vtkSmartPointer::New(); grid->Allocate(static_cast(t_element_pool.size())); std::ranges::for_each(t_element_pool, [&](const shared_ptr& t_element) { if(-1 != config.material_type) if(const auto& t_tag = t_element->get_material_tag(); t_tag.empty() || static_cast(config.material_type) != t_tag(0)) return; @@ -261,7 +263,8 @@ void vtk_plot_element_quantity(const shared_ptr& domain, vtkInfo con else if(config.save_file) { grid->GetPointData()->SetScalars(data); grid->GetPointData()->SetActiveScalars(vtk_get_name(config.type)); - vtk_save(grid, config); + auto writer = std::thread(vtk_save, std::move(grid), config); + writer.detach(); } else { const auto sub_data = vtkSmartPointer::New(); @@ -306,6 +309,33 @@ int vtk_get_index(const OutputType config) { if(config == OutputType::PE12) return 3; if(config == OutputType::PE23) return 4; if(config == OutputType::PE13) return 5; + if(config == OutputType::U1) return 0; + if(config == OutputType::U2) return 1; + if(config == OutputType::U3) return 2; + if(config == OutputType::U4) return 3; + if(config == OutputType::U5) return 4; + if(config == OutputType::U6) return 5; + if(config == OutputType::UR1) return 3; + if(config == OutputType::UR2) return 4; + if(config == OutputType::UR3) return 5; + if(config == OutputType::V1) return 0; + if(config == OutputType::V2) return 1; + if(config == OutputType::V3) return 2; + if(config == OutputType::V4) return 3; + if(config == OutputType::V5) return 4; + if(config == OutputType::V6) return 5; + if(config == OutputType::VR1) return 3; + if(config == OutputType::VR2) return 4; + if(config == OutputType::VR3) return 5; + if(config == OutputType::A1) return 0; + if(config == OutputType::A2) return 1; + if(config == OutputType::A3) return 2; + if(config == OutputType::A4) return 3; + if(config == OutputType::A5) return 4; + if(config == OutputType::A6) return 5; + if(config == OutputType::AR1) return 3; + if(config == OutputType::AR2) return 4; + if(config == OutputType::AR3) return 5; return 0; } diff --git a/Element/Visualisation/vtkParser.h b/Element/Visualisation/vtkParser.h index 21371f611..bf341e451 100644 --- a/Element/Visualisation/vtkParser.h +++ b/Element/Visualisation/vtkParser.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -50,7 +50,7 @@ vtkInfo vtk_process(istringstream&); void vtk_setup(const vtkSmartPointer&, const vtkInfo&); -void vtk_save(const vtkSmartPointer&, const vtkInfo&); +void vtk_save(vtkSmartPointer&&, vtkInfo); void vtk_plot_node_quantity(const shared_ptr&, vtkInfo); diff --git a/Enhancement/AddAssociation.bat b/Enhancement/AddAssociation.bat index bee48cdb7..941ab96ba 100644 --- a/Enhancement/AddAssociation.bat +++ b/Enhancement/AddAssociation.bat @@ -38,7 +38,7 @@ set "target=%target:\=/%" :copyfile -echo {"cmd":["%program%","-f","$file"],"selector":"source.supan","file_patterns":["*.supan","*.sp"]} > "%~dp0suanPan.sublime-build" +echo {"cmd":["%program%","-nc","-f","$file"],"selector":"source.supan","file_patterns":["*.supan","*.sp"]} > "%~dp0suanPan.sublime-build" xcopy "%~dp0suanPan.sublime*" "%target%" :byebye \ No newline at end of file diff --git a/Enhancement/POST.txt b/Enhancement/POST.txt index 348fad2bc..c93f7ad3f 100644 --- a/Enhancement/POST.txt +++ b/Enhancement/POST.txt @@ -1,4 +1,4 @@ -Please visit bit.ly/suanpan-doc/ for user manual and examples. +Please visit https://tlcfem.github.io/suanPan-manual/latest/ for user manual and examples. Please ensure your CPU supports AVX. The binary is compiled with AVX. It can only be executed on platforms that support AVX. diff --git a/Enhancement/pack.py b/Enhancement/pack.py index 3cbe149ee..913394663 100644 --- a/Enhancement/pack.py +++ b/Enhancement/pack.py @@ -32,7 +32,7 @@ verification.write('\nEXECUTABLE\n') fl = [ - '../suanPan-vs/Release/suanPan.exe', + '../suanPan/build/Release/suanPan.exe', 'updater.exe' ] cl = [ diff --git a/Enhancement/suanPan.iss b/Enhancement/suanPan.iss index 75d6eaedc..ebd4f2f4d 100644 --- a/Enhancement/suanPan.iss +++ b/Enhancement/suanPan.iss @@ -2,7 +2,7 @@ ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! #define MyAppName "suanPan" -#define MyAppVersion "2.7" +#define MyAppVersion "2.8" #define MyAppPublisher "Theodore Chang" #define MyAppURL "https://github.com/TLCFEM/suanPan" #define MyAppExeName "suanPan.exe" @@ -48,7 +48,7 @@ Name: "updater"; Description: "Include updater.exe" Name: "vcredist"; Description: "Include Microsoft Visual C++ Redistributable *.dll" [Files] -Source: "..\..\suanPan-vs\Release\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion +Source: "..\..\suanPan\build\Release\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion Source: "{#StoragePath}libifcoremd.dll"; DestDir: "{app}"; Flags: ignoreversion Source: "{#StoragePath}libiomp5md.dll"; DestDir: "{app}"; Flags: ignoreversion Source: "{#StoragePath}libmmd.dll"; DestDir: "{app}"; Flags: ignoreversion diff --git a/Enhancement/suanPan.sh b/Enhancement/suanPan.sh index 4aa88b331..199c8ca36 100644 --- a/Enhancement/suanPan.sh +++ b/Enhancement/suanPan.sh @@ -5,61 +5,68 @@ CURRENT_PATH="$(dirname "$(readlink -f "$0")")" TARGET_PATH="$HOME/.local/bin" if [[ $# == 1 ]] && [[ $1 == "--create-link" ]]; then - echo "This script does the following tasks:" - echo " 1. Create a link to suanPan in ~/.local/bin" - echo " 2. Check Sublime Text and add corresponding files to ~/.config/sublime-text/Packages/User" - echo " 3. Add a desktop file to ~/.local/share/applications" - echo "To uninstall, remove those files manually." - echo "" - - # make sure the link does not exist - if [[ -f "$TARGET_PATH/suanpan" ]]; then - echo "$TARGET_PATH/suanpan exists, now deleting it." + echo "This script does the following tasks:" + echo " 1. Create a link to suanPan in ~/.local/bin" + echo " 2. Check Sublime Text and add corresponding files to ~/.config/sublime-text/Packages/User" + echo " 3. Add a desktop file to ~/.local/share/applications" + echo "To uninstall, remove those files manually." echo "" - rm "$TARGET_PATH/suanpan" - fi - # make sure the path exists - if ! [[ -d $TARGET_PATH ]]; then - mkdir -p "$TARGET_PATH" - fi + # make sure the link does not exist + if [[ -f "$TARGET_PATH/suanpan" ]]; then + echo "$TARGET_PATH/suanpan exists, now deleting it." + echo "" + rm "$TARGET_PATH/suanpan" + fi + + # make sure the path exists + if ! [[ -d $TARGET_PATH ]]; then + mkdir -p "$TARGET_PATH" + fi - # create the link - ln -s "$CURRENT_PATH/suanPan.sh" "$TARGET_PATH/suanpan" + # create the link + ln -s "$CURRENT_PATH/suanPan.sh" "$TARGET_PATH/suanpan" - echo "$TARGET_PATH/suanpan is successfully created." - echo "" + echo "$TARGET_PATH/suanpan is successfully created." + echo "" - INSTALLED=false + INSTALLED=false - # check if sublime text is installed - ST_DIR="$HOME/.config/sublime-text-3/Packages/User" - if [[ -d $ST_DIR ]]; then - INSTALLED=true - else - ST_DIR="$HOME/.config/sublime-text/Packages/User" + # check if sublime text is installed + ST_DIR="$HOME/.config/sublime-text-3/Packages/User" if [[ -d $ST_DIR ]]; then - INSTALLED=true + INSTALLED=true + else + ST_DIR="$HOME/.config/sublime-text/Packages/User" + if [[ -d $ST_DIR ]]; then + INSTALLED=true + fi fi - fi - # install the files - if [[ $INSTALLED == true ]]; then - echo "{\"cmd\":[\"suanpan\",\"-f\",\"\$file\"],\"selector\":\"source.supan\",\"file_patterns\":[\"*.supan\",\"*.sp\"]}" >suanPan.sublime-build - cp suanPan.sublime* "$ST_DIR" - echo "Sublime Text installed, configuration files are copied to default folder $ST_DIR." - echo "" - fi + # install the files + if [[ $INSTALLED == true ]]; then + echo "{\"cmd\":[\"suanpan\",\"-f\",\"\$file\"],\"selector\":\"source.supan\",\"file_patterns\":[\"*.supan\",\"*.sp\"]}" >suanPan.sublime-build + cp suanPan.sublime* "$ST_DIR" + echo "Sublime Text installed, configuration files are copied to default folder $ST_DIR." + echo "" + fi - # make sure the path exists - if ! [[ -d "$HOME/.local/share/applications" ]]; then - mkdir -p "$HOME/.local/share/applications" - fi + # make sure the path exists + if ! [[ -d "$HOME/.local/share/applications" ]]; then + mkdir -p "$HOME/.local/share/applications" + fi - # desktop file - echo -e "[Desktop Entry]\nExec=suanpan\nVersion=2.0\nType=Application\nIcon=$CURRENT_PATH/suanPan-ua.svg\nCategories=Science\nName=suanPan\nTerminal=true\n" >"$TARGET_PATH/../share/applications/suanPan.desktop" - echo "$HOME/.local/share/applications/suanPan.desktop is successfully created." + # desktop file + echo -e "[Desktop Entry]\nExec=suanpan\nVersion=2.0\nType=Application\nIcon=$CURRENT_PATH/suanPan-ua.svg\nCategories=Science\nName=suanPan\nTerminal=true\n" >"$TARGET_PATH/../share/applications/suanPan.desktop" + echo "$HOME/.local/share/applications/suanPan.desktop is successfully created." else - export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CURRENT_PATH/../lib - "$CURRENT_PATH/suanPan" "$@" + case "$(uname -s)" in + Darwin*) + export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:$CURRENT_PATH/../lib + ;; + *) + export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CURRENT_PATH/../lib + ;; + esac + "$CURRENT_PATH/suanPan" "$@" fi diff --git a/Enhancement/suanPan.sublime-completions b/Enhancement/suanPan.sublime-completions index 6ac7c0348..88c827071 100644 --- a/Enhancement/suanPan.sublime-completions +++ b/Enhancement/suanPan.sublime-completions @@ -1,2398 +1,15141 @@ { - "completions":[ - "1000WB215", - "1000WB258", - "1000WB296", - "1000WB322", - "100UC14.8", - "100X3.0SHS", - "100X4.0SHS", - "100X5.0SHS", - "100X50X2.0RHS", - "100X50X2.5RHS", - "100X50X3.0RHS", - "100X50X3.5RHS", - "100X50X4.0RHS", - "100X50X5.0RHS", - "100X50X6.0RHS", - "100X6.0SHS", - "100X9.0SHS", - "101.6X2.6CHS", - "101.6X3.2CHS", - "101.6X4.0CHS", - "101.6X5.0CHS", - "114.3X3.2CHS", - "114.3X3.6CHS", - "114.3X4.5CHS", - "114.3X4.8CHS", - "114.3X5.4CHS", - "114.3X6.0CHS", - "1200WB249", - "1200WB278", - "1200WB317", - "1200WB342", - "1200WB392", - "1200WB423", - "1200WB455", - "125X4.0SHS", - "125X5.0SHS", - "125X6.0SHS", - "125X75X3.0RHS", - "125X75X4.0RHS", - "125X75X5.0RHS", - "125X9.0SHS", - "139.7X3.0CHS", - "139.7X3.5CHS", - "139.7X5.0CHS", - "139.7X5.4CHS", - "150UB14.0", - "150UB18.0", - "150UC23.4", - "150UC30.0", - "150UC37.2", - "150X100X4.0RHS", - "150X100X5.0RHS", - "150X100X6.0RHS", - "150X5.0SHS", - "150X50X3.0RHS", - "150X50X4.0RHS", - "150X50X5.0RHS", - "150X6.0SHS", - "150X9.0SHS", - "165.1X3.0CHS", - "165.1X3.5CHS", - "165.1X5.0CHS", - "165.1X5.4CHS", - "168.3X4.8CHS", - "168.3X6.4CHS", - "168.3X7.1CHS", - "180UB16.1", - "180UB18.1", - "180UB22.2", - "200UB18.2", - "200UB22.3", - "200UB25.4", - "200UB29.8", - "200UC46.2", - "200UC52.2", - "200UC59.5", - "200X100X4.0RHS", - "200X100X5.0RHS", - "200X100X6.0RHS", - "200X100X9.0RHS", - "200X5.0SHS", - "200X6.0SHS", - "200X9.0SHS", - "20X1.6SHS", - "219.1X4.8CHS", - "219.1X6.4CHS", - "219.1X8.2CHS", - "250UB25.7", - "250UB31.4", - "250UB37.3", - "250UC72.9", - "250UC89.5", - "250X150X5.0RHS", - "250X150X6.0RHS", - "250X150X9.0RHS", - "250X6.0SHS", - "250X9.0SHS", - "25X1.6SHS", - "25X2.0SHS", - "25X2.5SHS", - "25X3.0SHS", - "273.1X4.8CHS", - "273.1X6.4CHS", - "273.1X9.3CHS", - "30X1.6SHS", - "30X2.0SHS", - "310UB32.0", - "310UB40.4", - "310UB46.2", - "310UC118", - "310UC137", - "310UC96.8", - "320UC158", - "323.9X12.7CHS", - "323.9X6.4CHS", - "323.9X9.5CHS", - "350WC197", - "350WC230", - "350WC258", - "350WC280", - "355.6X12.7CHS", - "355.6X6.4CHS", - "355.6X9.5CHS", - "35X1.6SHS", - "35X2.0SHS", - "35X2.5SHS", - "35X3.0SHS", - "360UB44.7", - "360UB50.7", - "360UB56.7", - "400WC144", - "400WC181", - "400WC212", - "400WC270", - "400WC303", - "400WC328", - "400WC361", - "406.4X12.7CHS", - "406.4X6.4CHS", - "406.4X9.5CHS", - "40X1.6SHS", - "40X2.0SHS", - "40X2.5SHS", - "40X4.0SHS", - "410UB53.7", - "410UB59.7", - "42.4X3.2CHS", - "42.4X4.0CHS", - "42.4X4.9CHS", - "457.0X12.7CHS", - "457.0X6.4CHS", - "457.0X9.5CHS", - "460UB67.1", - "460UB74.6", - "460UB82.1", - "48.3X3.2CHS", - "48.3X4.0CHS", - "48.3X5.4CHS", - "500WC228", - "500WC267", - "500WC290", - "500WC340", - "500WC383", - "500WC414", - "500WC440", - "508.0X12.7CHS", - "508.0X6.4CHS", - "508.0X9.5CHS", - "50X1.6SHS", - "50X2.0SHS", - "50X2.5SHS", - "50X20X1.6RHS", - "50X20X2.0RHS", - "50X20X2.5RHS", - "50X20X3.0RHS", - "50X25X1.6RHS", - "50X25X2.0RHS", - "50X25X2.5RHS", - "50X25X3.0RHS", - "50X3.0SHS", - "50X4.0SHS", - "530UB82.0", - "530UB92.4", - "60.3X3.6CHS", - "60.3X4.5CHS", - "60.3X5.4CHS", - "610.0X12.7CHS", - "610.0X6.4CHS", - "610.0X9.5CHS", - "610UB101", - "610UB113", - "610UB125", - "65X2.0SHS", - "65X2.5SHS", - "65X3.0SHS", - "65X35X2.0RHS", - "65X35X2.5RHS", - "65X35X3.0RHS", - "700WB115", - "700WB130", - "700WB150", - "700WB173", - "75X2.5SHS", - "75X25X1.6RHS", - "75X25X2.0RHS", - "75X25X2.5RHS", - "75X3.0SHS", - "75X3.5SHS", - "75X4.0SHS", - "75X5.0SHS", - "75X50X2.0RHS", - "75X50X2.5RHS", - "75X50X3.0RHS", - "75X50X4.0RHS", - "75X6.0SHS", - "76.1X2.3CHS", - "76.1X3.2CHS", - "76.1X3.6CHS", - "76.1X4.5CHS", - "76.1X5.9CHS", - "800WB122", - "800WB146", - "800WB168", - "800WB192", - "88.9X2.6CHS", - "88.9X3.2CHS", - "88.9X4.0CHS", - "88.9X4.8CHS", - "88.9X5.0CHS", - "88.9X5.5CHS", - "88.9X5.9CHS", - "89X3.5SHS", - "89X5.0SHS", - "89X6.0SHS", - "900WB175", - "900WB218", - "900WB257", - "900WB282", - "AFC", - "AFC03", - "AFCS", - "AbsDisp", - "AbsError", - "AbsIncreDisp", - "AbsIncreAcc", - "AbsIncreEnergy", - "AbsResidual", - "ArcLength", - "ArmstrongFrederick", - "ArmstrongFrederick1D", - "Axisymmetric", - "AxisymmetricElastic", - "B3DL", - "Bilinear1D", - "Bilinear2D", - "BilinearCC", - "BilinearDP", - "BilinearHoffman", - "BilinearJ2", - "BilinearMises1D", - "BilinearPeric", - "BilinearViscosity", - "BlatzKo", - "Buckle", - "C3D8R", - "CDP", - "CDPM2", - "CDPM2ANISO", - "CDPM2ISO", - "CDPM2NO", - "CIN3D8", - "CP4R", - "CPE8", - "CPE8R", - "CPS8", - "CSMQ4", - "CSMQ5", - "CSMQ6", - "CSMQ7", - "CSMQ8", - "CSMT3", - "CSMT6", - "CircularHollow3D", - "Combine", - "Concrete21", - "Concrete22", - "ConcreteTable", - "Constant", - "Cosine", - "CoulombFriction", - "DC3D4", - "DC3D8", - "DafaliasManzari", - "Damping", - "Decay", - "Dhakal", - "Dynamic", - "ImplicitDynamic", - "ExplicitDynamic", - "EU2D", - "EU3D", - "Eigen", - "Elastic2D", - "Elastic3D", - "Element", - "ElementalModal", - "Embed2D", - "Embed3D", - "ExpCC", - "ExpDP", - "ExpGurson", - "ExpGurson1D", - "ExpHoffman", - "ExpJ2", - "ExpMises1D", - "FEAST", - "FixedLength2D", - "FixedLength3D", - "FixedNumber", - "Fluid", - "Frame", - "Frequency", - "GCMQG", - "GCMQI", - "GCMQL", - "Gap01", - "Global", - "GroupElement", - "GroupMultiplierBC", - "GroupNode", - "GroupPenaltyBC", - "GroupSum", - "HEA100", - "HEA1000", - "HEA120", - "HEA140", - "HEA160", - "HEA180", - "HEA200", - "HEA220", - "HEA240", - "HEA260", - "HEA280", - "HEA300", - "HEA320", - "HEA340", - "HEA360", - "HEA400", - "HEA450", - "HEA500", - "HEA550", - "HEA600", - "HEA650", - "HEA700", - "HEA800", - "HEA900", - "HEB100", - "HEB1000", - "HEB120", - "HEB140", - "HEB160", - "HEB180", - "HEB200", - "HEB220", - "HEB240", - "HEB260", - "HEB280", - "HEB300", - "HEB320", - "HEB340", - "HEB360", - "HEB400", - "HEB450", - "HEB500", - "HEB550", - "HEB600", - "HEB650", - "HEB700", - "HEB800", - "HEB900", - "HEM100", - "HEM1000", - "HEM120", - "HEM140", - "HEM160", - "HEM180", - "HEM200", - "HEM220", - "HEM240", - "HEM260", - "HEM280", - "HEM300", - "HEM320", - "HEM340", - "HEM360", - "HEM400", - "HEM450", - "HEM500", - "HEM550", - "HEM600", - "HEM650", - "HEM700", - "HEM800", - "HEM900", - "HP10X42", - "HP10X57", - "HP12X53", - "HP12X63", - "HP12X74", - "HP12X84", - "HP12X89", - "HP14X102", - "HP14X117", - "HP14X73", - "HP14X89", - "HP16X101", - "HP16X121", - "HP16X141", - "HP16X162", - "HP16X183", - "HP16X88", - "HP18X135", - "HP18X157", - "HP18X181", - "HP18X204", - "HP8X36", - "ILU", - "IPE100", - "IPE120", - "IPE140", - "IPE160", - "IPE180", - "IPE200", - "IPE220", - "IPE240", - "IPE270", - "IPE300", - "IPE330", - "IPE360", - "IPE400", - "IPE450", - "IPE500", - "IPE550", - "IPE600", - "IPE80", - "IsotropicElastic3D", - "Jacobi", - "Kelvin", - "LBFGS", - "LJPotential2D", - "Laminated", - "LeeElementalDamping", - "LineUDL2D", - "LineUDL3D", - "Linear", - "LinearDamage", - "LinearViscosity", - "LogicAND", - "LogicOR", - "LogicXOR", - "LumpedScale", - "LumpedSimple", - "M10X7.5", - "M10X8", - "M10X9", - "M12.5X11.6", - "M12.5X12.4", - "M12X10", - "M12X10.8", - "M12X11.8", - "M3X2.9", - "M4X3.2", - "M4X3.45", - "M4X4.08", - "M4X6", - "M5X18.9", - "M6X3.7", - "M6X4.4", - "M8X6.2", - "M8X6.5", - "MPC", - "MPDC", - "MT2.5X9.45", - "MT2X3", - "MT3X1.85", - "MT3X2.2", - "MT4X3.1", - "MT4X3.25", - "MT5X3.75", - "MT5X4", - "MT5X4.5", - "MT6.25X5.8", - "MT6.25X6.2", - "MT6X5", - "MT6X5.4", - "MT6X5.9", - "Mass2D", - "Mass3D", - "MassPoint2D", - "MassPoint3D", - "MaxDisplacement", - "MaxGap2D", - "MaxGap3D", - "MaxHistory", - "MaxResistance", - "MaximumGap2D", - "MaximumGap3D", - "Maxwell", - "MinDisplacement", - "MinGap2D", - "MinGap3D", - "MinResistance", - "MinimumGap2D", - "MinimumGap3D", - "Model", - "Modulated", - "MooneyRivlin", - "MultilinearJ2", - "MultilinearMises1D", - "MultiplierBC", - "NLE3D01", - "NM2D3", - "NM2D3K", - "NM3D3", - "NM3D3K", - "NZ2D", - "NZ3D", - "NZStrongMotion", - "Node", - "NodeFacet", - "NodeLine", - "Optimisation", - "OrthotropicElastic3D", - "PCPE4DC", - "PCPE4DI", - "PCPE4UC", - "PCPE8DC", - "PCPE8UC", - "ParabolicCC", - "Parallel", - "ParticleCollision2D", - "ParticleCollision3D", - "PenaltyBC", - "PlaneStrain", - "PlaneStress", - "PlaneSymmetric13", - "PlaneSymmetric23", - "PolyJ2", - "R2D2", - "R3D2", - "Ramm", - "Ramp", - "Rayleigh", - "Rebar2D", - "Rebar3D", - "Recorder", - "RelDisp", - "RelError", - "RelIncreDisp", - "RelIncreAcc", - "RelIncreEnergy", - "RelResidual", - "Rotation2D", - "Rotation3D", - "S10X25.4", - "S10X35", - "S12X31.8", - "S12X35", - "S12X40.8", - "S12X50", - "S15X42.9", - "S15X50", - "S18X54.7", - "S18X70", - "S20X66", - "S20X75", - "S20X86", - "S20X96", - "S24X100", - "S24X106", - "S24X121", - "S24X80", - "S24X90", - "S3X5.7", - "S3X7.5", - "S4X7.7", - "S4X9.5", - "S5X10", - "S6X12.5", - "S6X17.25", - "S8X18.4", - "S8X23", - "SGCMQG", - "SGCMQI", - "SGCMQL", - "ST1.5X2.85", - "ST1.5X3.75", - "ST10X33", - "ST10X37.5", - "ST10X43", - "ST10X48", - "ST12X40", - "ST12X45", - "ST12X50", - "ST12X53", - "ST12X60.5", - "ST2.5X5", - "ST2X3.85", - "ST2X4.75", - "ST3X6.25", - "ST3X8.6", - "ST4X11.5", - "ST4X9.2", - "ST5X12.7", - "ST5X17.5", - "ST6X15.9", - "ST6X17.5", - "ST6X20.4", - "ST6X25", - "ST7.5X21.45", - "ST7.5X25", - "ST9X27.35", - "ST9X35", - "Scale", - "Sequential", - "SimpleSand", - "Sine", - "Sleeve2D", - "Sleeve3D", - "Stacked", - "Static", - "Stiffness", - "StrainEnergyEvolution", - "Substepping", - "Sum", - "TableCDP", - "TableGurson", - "Tabular", - "Tie", - "TrilinearDegradation", - "Trivial", - "US2D", - "US3D", - "Uniaxial", - "VAFCRP", - "VAFCRP1D", - "Viscosity01", - "Viscosity02", - "Visualisation", - "W10X100", - "W10X112", - "W10X12", - "W10X15", - "W10X17", - "W10X19", - "W10X22", - "W10X26", - "W10X30", - "W10X33", - "W10X39", - "W10X45", - "W10X49", - "W10X54", - "W10X60", - "W10X68", - "W10X77", - "W10X88", - "W12X106", - "W12X120", - "W12X136", - "W12X14", - "W12X152", - "W12X16", - "W12X170", - "W12X19", - "W12X190", - "W12X210", - "W12X22", - "W12X230", - "W12X252", - "W12X26", - "W12X279", - "W12X30", - "W12X305", - "W12X336", - "W12X35", - "W12X40", - "W12X45", - "W12X50", - "W12X53", - "W12X58", - "W12X65", - "W12X72", - "W12X79", - "W12X87", - "W12X96", - "W14X109", - "W14X120", - "W14X132", - "W14X145", - "W14X159", - "W14X176", - "W14X193", - "W14X211", - "W14X22", - "W14X233", - "W14X257", - "W14X26", - "W14X283", - "W14X30", - "W14X311", - "W14X34", - "W14X342", - "W14X370", - "W14X38", - "W14X398", - "W14X426", - "W14X43", - "W14X455", - "W14X48", - "W14X500", - "W14X53", - "W14X550", - "W14X605", - "W14X61", - "W14X665", - "W14X68", - "W14X730", - "W14X74", - "W14X808", - "W14X82", - "W14X873", - "W14X90", - "W14X99", - "W16X100", - "W16X26", - "W16X31", - "W16X36", - "W16X40", - "W16X45", - "W16X50", - "W16X57", - "W16X67", - "W16X77", - "W16X89", - "W18X106", - "W18X119", - "W18X130", - "W18X143", - "W18X158", - "W18X175", - "W18X192", - "W18X211", - "W18X234", - "W18X258", - "W18X283", - "W18X311", - "W18X35", - "W18X40", - "W18X46", - "W18X50", - "W18X55", - "W18X60", - "W18X65", - "W18X71", - "W18X76", - "W18X86", - "W18X97", - "W21X101", - "W21X111", - "W21X122", - "W21X132", - "W21X147", - "W21X166", - "W21X182", - "W21X201", - "W21X223", - "W21X248", - "W21X275", - "W21X44", - "W21X48", - "W21X50", - "W21X55", - "W21X57", - "W21X62", - "W21X68", - "W21X73", - "W21X83", - "W21X93", - "W24X103", - "W24X104", - "W24X117", - "W24X131", - "W24X146", - "W24X162", - "W24X176", - "W24X192", - "W24X207", - "W24X229", - "W24X250", - "W24X279", - "W24X306", - "W24X335", - "W24X370", - "W24X55", - "W24X62", - "W24X68", - "W24X76", - "W24X84", - "W24X94", - "W27X102", - "W27X114", - "W27X129", - "W27X146", - "W27X161", - "W27X178", - "W27X194", - "W27X217", - "W27X235", - "W27X258", - "W27X281", - "W27X307", - "W27X336", - "W27X368", - "W27X539", - "W27X84", - "W27X94", - "W30X108", - "W30X116", - "W30X124", - "W30X132", - "W30X148", - "W30X173", - "W30X191", - "W30X211", - "W30X235", - "W30X261", - "W30X292", - "W30X326", - "W30X357", - "W30X391", - "W30X90", - "W30X99", - "W33X118", - "W33X130", - "W33X141", - "W33X152", - "W33X169", - "W33X201", - "W33X221", - "W33X241", - "W33X263", - "W33X291", - "W33X318", - "W33X354", - "W33X387", - "W36X135", - "W36X150", - "W36X160", - "W36X170", - "W36X182", - "W36X194", - "W36X210", - "W36X231", - "W36X232", - "W36X247", - "W36X256", - "W36X262", - "W36X282", - "W36X302", - "W36X330", - "W36X361", - "W36X395", - "W36X441", - "W36X487", - "W36X529", - "W36X652", - "W36X723", - "W36X802", - "W36X853", - "W36X925", - "W40X149", - "W40X167", - "W40X183", - "W40X199", - "W40X211", - "W40X215", - "W40X235", - "W40X249", - "W40X264", - "W40X277", - "W40X278", - "W40X294", - "W40X297", - "W40X324", - "W40X327", - "W40X331", - "W40X362", - "W40X372", - "W40X392", - "W40X397", - "W40X431", - "W40X503", - "W40X593", - "W40X655", - "W44X230", - "W44X262", - "W44X290", - "W44X335", - "W4X13", - "W5X16", - "W5X19", - "W6X12", - "W6X15", - "W6X16", - "W6X20", - "W6X25", - "W6X8.5", - "W6X9", - "W8X10", - "W8X13", - "W8X15", - "W8X18", - "W8X21", - "W8X24", - "W8X28", - "W8X31", - "W8X35", - "W8X40", - "W8X48", - "W8X58", - "W8X67", - "WT10.5X100.5", - "WT10.5X111.5", - "WT10.5X124", - "WT10.5X137.5", - "WT10.5X22", - "WT10.5X24", - "WT10.5X25", - "WT10.5X27.5", - "WT10.5X28.5", - "WT10.5X31", - "WT10.5X34", - "WT10.5X36.5", - "WT10.5X41.5", - "WT10.5X46.5", - "WT10.5X50.5", - "WT10.5X55.5", - "WT10.5X61", - "WT10.5X66", - "WT10.5X73.5", - "WT10.5X83", - "WT10.5X91", - "WT12X103.5", - "WT12X114.5", - "WT12X125", - "WT12X139.5", - "WT12X153", - "WT12X167.5", - "WT12X185", - "WT12X27.5", - "WT12X31", - "WT12X34", - "WT12X38", - "WT12X42", - "WT12X47", - "WT12X51.5", - "WT12X52", - "WT12X58.5", - "WT12X65.5", - "WT12X73", - "WT12X81", - "WT12X88", - "WT12X96", - "WT13.5X108.5", - "WT13.5X117.5", - "WT13.5X129", - "WT13.5X140.5", - "WT13.5X153.5", - "WT13.5X168", - "WT13.5X184", - "WT13.5X269.5", - "WT13.5X42", - "WT13.5X47", - "WT13.5X51", - "WT13.5X57", - "WT13.5X64.5", - "WT13.5X73", - "WT13.5X80.5", - "WT13.5X89", - "WT13.5X97", - "WT15X105.5", - "WT15X117.5", - "WT15X130.5", - "WT15X146", - "WT15X163", - "WT15X178.5", - "WT15X195.5", - "WT15X45", - "WT15X49.5", - "WT15X54", - "WT15X58", - "WT15X62", - "WT15X66", - "WT15X74", - "WT15X86.5", - "WT15X95.5", - "WT16.5X100.5", - "WT16.5X110.5", - "WT16.5X120.5", - "WT16.5X131.5", - "WT16.5X145.5", - "WT16.5X159", - "WT16.5X177", - "WT16.5X193.5", - "WT16.5X59", - "WT16.5X65", - "WT16.5X70.5", - "WT16.5X76", - "WT16.5X84.5", - "WT18X105", - "WT18X115.5", - "WT18X116", - "WT18X123.5", - "WT18X128", - "WT18X131", - "WT18X141", - "WT18X151", - "WT18X165", - "WT18X180.5", - "WT18X197.5", - "WT18X220.5", - "WT18X243.5", - "WT18X264.5", - "WT18X326", - "WT18X361.5", - "WT18X401", - "WT18X426.5", - "WT18X462.5", - "WT18X67.5", - "WT18X75", - "WT18X80", - "WT18X85", - "WT18X91", - "WT18X97", - "WT2.5X8", - "WT2.5X9.5", - "WT20X105.5", - "WT20X107.5", - "WT20X117.5", - "WT20X124.5", - "WT20X132", - "WT20X138.5", - "WT20X139", - "WT20X147", - "WT20X148.5", - "WT20X162", - "WT20X163.5", - "WT20X165.5", - "WT20X181", - "WT20X186", - "WT20X196", - "WT20X198.5", - "WT20X215.5", - "WT20X251.5", - "WT20X296.5", - "WT20X327.5", - "WT20X74.5", - "WT20X83.5", - "WT20X91.5", - "WT20X99.5", - "WT22X115", - "WT22X131", - "WT22X145", - "WT22X167.5", - "WT2X6.5", - "WT3X10", - "WT3X12.5", - "WT3X4.25", - "WT3X4.5", - "WT3X6", - "WT3X7.5", - "WT3X8", - "WT4X10.5", - "WT4X12", - "WT4X14", - "WT4X15.5", - "WT4X17.5", - "WT4X20", - "WT4X24", - "WT4X29", - "WT4X33.5", - "WT4X5", - "WT4X6.5", - "WT4X7.5", - "WT4X9", - "WT5X11", - "WT5X13", - "WT5X15", - "WT5X16.5", - "WT5X19.5", - "WT5X22.5", - "WT5X24.5", - "WT5X27", - "WT5X30", - "WT5X34", - "WT5X38.5", - "WT5X44", - "WT5X50", - "WT5X56", - "WT5X6", - "WT5X7.5", - "WT5X8.5", - "WT5X9.5", - "WT6X105", - "WT6X11", - "WT6X115", - "WT6X126", - "WT6X13", - "WT6X139.5", - "WT6X15", - "WT6X152.5", - "WT6X168", - "WT6X17.5", - "WT6X20", - "WT6X22.5", - "WT6X25", - "WT6X26.5", - "WT6X29", - "WT6X32.5", - "WT6X36", - "WT6X39.5", - "WT6X43.5", - "WT6X48", - "WT6X53", - "WT6X60", - "WT6X68", - "WT6X7", - "WT6X76", - "WT6X8", - "WT6X85", - "WT6X9.5", - "WT6X95", - "WT7X105.5", - "WT7X11", - "WT7X116.5", - "WT7X128.5", - "WT7X13", - "WT7X141.5", - "WT7X15", - "WT7X155.5", - "WT7X17", - "WT7X171", - "WT7X185", - "WT7X19", - "WT7X199", - "WT7X21.5", - "WT7X213", - "WT7X227.5", - "WT7X24", - "WT7X250", - "WT7X26.5", - "WT7X275", - "WT7X30.5", - "WT7X302.5", - "WT7X332.5", - "WT7X34", - "WT7X365", - "WT7X37", - "WT7X404", - "WT7X41", - "WT7X436.5", - "WT7X45", - "WT7X49.5", - "WT7X54.5", - "WT7X60", - "WT7X66", - "WT7X72.5", - "WT7X79.5", - "WT7X88", - "WT7X96.5", - "WT8X13", - "WT8X15.5", - "WT8X18", - "WT8X20", - "WT8X22.5", - "WT8X25", - "WT8X28.5", - "WT8X33.5", - "WT8X38.5", - "WT8X44.5", - "WT8X50", - "WT9X105.5", - "WT9X117", - "WT9X129", - "WT9X141.5", - "WT9X155.5", - "WT9X17.5", - "WT9X20", - "WT9X23", - "WT9X25", - "WT9X27.5", - "WT9X30", - "WT9X32.5", - "WT9X35.5", - "WT9X38", - "WT9X43", - "WT9X48.5", - "WT9X53", - "WT9X59.5", - "WT9X65", - "WT9X71.5", - "WT9X79", - "WT9X87.5", - "WT9X96", - "Width", - "Yeoh", - "acc", - "acceleration", - "amplitude", - "analyse", - "analyze", - "angularvelocity", - "avel", - "bodyforce", - "cload", - "command", - "constraint", - "converger", - "criterion", - "deformed", - "delete", - "disable", - "disp", - "displacement", - "dispload", - "double", - "eigen_number", - "eigenvalue", - "element", - "elementgroup", - "enable", - "erase", - "finiterestitutionwall", - "finiterestitutionwallpenalty", - "finiterigidwall", - "finiterigidwallmultiplier", - "finiterigidwallpenalty", - "fix", - "fix2", - "fixedlength2d", - "fixedlength3d", - "fontsize", - "full", - "generate", - "generatebyplane", - "generatebypoint", - "generatebyrule", - "group", - "groupbodyforce", - "groupcload", - "groupdisp", - "groupdisplacement", - "groupdispload", - "groupgroup", - "groupmultiplierbc", - "grouppenaltybc", - "hdf5recorder", - "help", - "history", - "initial", - "integrator", - "list", - "load", - "mass", - "material", - "materialtest1d", - "materialtest2d", - "materialtest3d", - "materialtestbyload1d", - "materialtestbyload2d", - "materialtestbyload3d", - "materialtestbyloadwithbase3d", - "materialtestbystrainhistory", - "materialtestbystresshistory", - "materialtestwithbase3d", - "mixed", - "modifier", - "mpc", - "multiplierbc", - "mute", - "nobar", - "nodegroup", - "output_folder", - "particlecollision2d", - "particlecollision3d", - "peek", - "penaltybc", - "plainrecorder", - "plot", - "precheck", - "print", - "protect", - "recorder", - "remove", - "restitutionwall", - "restitutionwallpenalty", - "rigidwall", - "rigidwallmultiplier", - "rigidwallpenalty", - "scale", - "screen_output", - "section", - "set", - "single", - "size", - "solver", - "sparse_mat", - "step", - "summary", - "supportacceleration", - "supportdisplacement", - "supportvelocity", - "suspend", - "system_solver", - "tabularspline", - "terminal", - "tolerance", - "type", - "undeformed", - "vel", - "velocity", - "version", - { - "contents":"", - "details":"", - "kind":"type", - "trigger":"DC3D4" - }, - { - "contents":"", - "details":"", - "kind":"type", - "trigger":"DC3D8" - }, - { - "contents":"", - "details":"Linear Infinite Cube/Brick", - "kind":"type", - "trigger":"CIN3D8" - }, - { - "contents":"", - "details":"element Tie ${1:(1)} ${2:(2)} ${3:(3)} ${(4:[(4)} ${5:(5)} ${6:(6)}...]\n# (1) int, unique element tag\n# (2) double, right hand side of the constraint equation, the constraint is homogeneous if this parameter is zero\n# (3) double, penalty number, a relatively large number\n# (4) int, node tag\n# (5) int, dof tag\n# (6) double, weight", - "kind":"type", - "trigger":"Tie" - }, - { - "contents":"", - "details":"material Flag02 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:(6)} ${7:(7)} ${8:(8)}\n# (1) int, unique material tag\n# (2) double, elastic modulus\n# (3) double, tension yield stress, positive\n# (4) double, tension residual stress, can be either positive or negative\n# (5) double, tension hardening ratio\n# (6) double, compression yield stress, negative\n# (7) double, compression residual stress, can be either positive or negative\n# (8) double, compression hardening ratio", - "kind":"type", - "trigger":"Flag02" - }, - { - "contents":"Mass ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4...)}\nelement Mass ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4...)}\n# (1) int, unique element tag\n# (2) int, node tag\n# (3) double, magnitude\n# (4...) int, dof tag", - "details":"Point Mass", - "kind":"type", - "trigger":"Mass" - }, - { - "contents":"Multilinear Peak Oriented Hysteresis Model", - "details":"material MultilinearPO ${1:(1)} ${2:(2)} ${3:(3)} ${4:[4]}\n# (1) int, unique material tag\n# (2) string, file name of tension backbone\n# (3) string, file name of compression backbone\n# [4] double, density, default: 0.0", - "kind":"type", - "trigger":"MultilinearPO" - }, - { - "contents":"clear", - "details":"Clear Domain", - "kind":"type", - "trigger":"clear" - }, - { - "contents":"converger ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:[5]}\n# (1) string, converger type\n# (2) int, unique tag\n# (3) double, tolerance\n# (4) int, maximum iteration\n# [5] bool string, print switch, default: false", - "details":"Convergence Tester", - "kind":"type", - "trigger":"converger" + "completions": [ + { + "contents": "section NZ2D 1000WB215 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 1000WB215", + "kind": "keyword", + "trigger": "1000WB215" + }, + { + "contents": "section NZ3D 1000WB215 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 1000WB215", + "kind": "keyword", + "trigger": "1000WB215" + }, + { + "contents": "section NZ2D 1000WB258 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 1000WB258", + "kind": "keyword", + "trigger": "1000WB258" + }, + { + "contents": "section NZ3D 1000WB258 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 1000WB258", + "kind": "keyword", + "trigger": "1000WB258" + }, + { + "contents": "section NZ2D 1000WB296 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 1000WB296", + "kind": "keyword", + "trigger": "1000WB296" + }, + { + "contents": "section NZ3D 1000WB296 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 1000WB296", + "kind": "keyword", + "trigger": "1000WB296" + }, + { + "contents": "section NZ2D 1000WB322 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 1000WB322", + "kind": "keyword", + "trigger": "1000WB322" + }, + { + "contents": "section NZ3D 1000WB322 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 1000WB322", + "kind": "keyword", + "trigger": "1000WB322" + }, + { + "contents": "section NZ2D 100UC14.8 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 100UC14.8", + "kind": "keyword", + "trigger": "100UC14.8" + }, + { + "contents": "section NZ3D 100UC14.8 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 100UC14.8", + "kind": "keyword", + "trigger": "100UC14.8" + }, + { + "contents": "section NZ2D 100X3.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 100X3.0SHS", + "kind": "keyword", + "trigger": "100X3.0SHS" + }, + { + "contents": "section NZ3D 100X3.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 100X3.0SHS", + "kind": "keyword", + "trigger": "100X3.0SHS" + }, + { + "contents": "section NZ2D 100X4.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 100X4.0SHS", + "kind": "keyword", + "trigger": "100X4.0SHS" + }, + { + "contents": "section NZ3D 100X4.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 100X4.0SHS", + "kind": "keyword", + "trigger": "100X4.0SHS" + }, + { + "contents": "section NZ2D 100X5.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 100X5.0SHS", + "kind": "keyword", + "trigger": "100X5.0SHS" + }, + { + "contents": "section NZ3D 100X5.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 100X5.0SHS", + "kind": "keyword", + "trigger": "100X5.0SHS" + }, + { + "contents": "section NZ2D 100X50X2.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 100X50X2.0RHS", + "kind": "keyword", + "trigger": "100X50X2.0RHS" + }, + { + "contents": "section NZ3D 100X50X2.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 100X50X2.0RHS", + "kind": "keyword", + "trigger": "100X50X2.0RHS" + }, + { + "contents": "section NZ2D 100X50X2.5RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 100X50X2.5RHS", + "kind": "keyword", + "trigger": "100X50X2.5RHS" + }, + { + "contents": "section NZ3D 100X50X2.5RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 100X50X2.5RHS", + "kind": "keyword", + "trigger": "100X50X2.5RHS" + }, + { + "contents": "section NZ2D 100X50X3.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 100X50X3.0RHS", + "kind": "keyword", + "trigger": "100X50X3.0RHS" + }, + { + "contents": "section NZ3D 100X50X3.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 100X50X3.0RHS", + "kind": "keyword", + "trigger": "100X50X3.0RHS" + }, + { + "contents": "section NZ2D 100X50X3.5RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 100X50X3.5RHS", + "kind": "keyword", + "trigger": "100X50X3.5RHS" + }, + { + "contents": "section NZ3D 100X50X3.5RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 100X50X3.5RHS", + "kind": "keyword", + "trigger": "100X50X3.5RHS" + }, + { + "contents": "section NZ2D 100X50X4.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 100X50X4.0RHS", + "kind": "keyword", + "trigger": "100X50X4.0RHS" + }, + { + "contents": "section NZ3D 100X50X4.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 100X50X4.0RHS", + "kind": "keyword", + "trigger": "100X50X4.0RHS" + }, + { + "contents": "section NZ2D 100X50X5.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 100X50X5.0RHS", + "kind": "keyword", + "trigger": "100X50X5.0RHS" + }, + { + "contents": "section NZ3D 100X50X5.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 100X50X5.0RHS", + "kind": "keyword", + "trigger": "100X50X5.0RHS" + }, + { + "contents": "section NZ2D 100X50X6.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 100X50X6.0RHS", + "kind": "keyword", + "trigger": "100X50X6.0RHS" + }, + { + "contents": "section NZ3D 100X50X6.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 100X50X6.0RHS", + "kind": "keyword", + "trigger": "100X50X6.0RHS" + }, + { + "contents": "section NZ2D 100X6.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 100X6.0SHS", + "kind": "keyword", + "trigger": "100X6.0SHS" + }, + { + "contents": "section NZ3D 100X6.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 100X6.0SHS", + "kind": "keyword", + "trigger": "100X6.0SHS" + }, + { + "contents": "section NZ2D 100X9.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 100X9.0SHS", + "kind": "keyword", + "trigger": "100X9.0SHS" + }, + { + "contents": "section NZ3D 100X9.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 100X9.0SHS", + "kind": "keyword", + "trigger": "100X9.0SHS" + }, + { + "contents": "section NZ2D 101.6X2.6CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 101.6X2.6CHS", + "kind": "keyword", + "trigger": "101.6X2.6CHS" + }, + { + "contents": "section NZ3D 101.6X2.6CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 101.6X2.6CHS", + "kind": "keyword", + "trigger": "101.6X2.6CHS" + }, + { + "contents": "section NZ2D 101.6X3.2CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 101.6X3.2CHS", + "kind": "keyword", + "trigger": "101.6X3.2CHS" + }, + { + "contents": "section NZ3D 101.6X3.2CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 101.6X3.2CHS", + "kind": "keyword", + "trigger": "101.6X3.2CHS" + }, + { + "contents": "section NZ2D 101.6X4.0CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 101.6X4.0CHS", + "kind": "keyword", + "trigger": "101.6X4.0CHS" + }, + { + "contents": "section NZ3D 101.6X4.0CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 101.6X4.0CHS", + "kind": "keyword", + "trigger": "101.6X4.0CHS" + }, + { + "contents": "section NZ2D 101.6X5.0CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 101.6X5.0CHS", + "kind": "keyword", + "trigger": "101.6X5.0CHS" + }, + { + "contents": "section NZ3D 101.6X5.0CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 101.6X5.0CHS", + "kind": "keyword", + "trigger": "101.6X5.0CHS" + }, + { + "contents": "section NZ2D 114.3X3.2CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 114.3X3.2CHS", + "kind": "keyword", + "trigger": "114.3X3.2CHS" + }, + { + "contents": "section NZ3D 114.3X3.2CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 114.3X3.2CHS", + "kind": "keyword", + "trigger": "114.3X3.2CHS" + }, + { + "contents": "section NZ2D 114.3X3.6CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 114.3X3.6CHS", + "kind": "keyword", + "trigger": "114.3X3.6CHS" + }, + { + "contents": "section NZ3D 114.3X3.6CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 114.3X3.6CHS", + "kind": "keyword", + "trigger": "114.3X3.6CHS" + }, + { + "contents": "section NZ2D 114.3X4.5CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 114.3X4.5CHS", + "kind": "keyword", + "trigger": "114.3X4.5CHS" + }, + { + "contents": "section NZ3D 114.3X4.5CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 114.3X4.5CHS", + "kind": "keyword", + "trigger": "114.3X4.5CHS" + }, + { + "contents": "section NZ2D 114.3X4.8CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 114.3X4.8CHS", + "kind": "keyword", + "trigger": "114.3X4.8CHS" + }, + { + "contents": "section NZ3D 114.3X4.8CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 114.3X4.8CHS", + "kind": "keyword", + "trigger": "114.3X4.8CHS" + }, + { + "contents": "section NZ2D 114.3X5.4CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 114.3X5.4CHS", + "kind": "keyword", + "trigger": "114.3X5.4CHS" + }, + { + "contents": "section NZ3D 114.3X5.4CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 114.3X5.4CHS", + "kind": "keyword", + "trigger": "114.3X5.4CHS" + }, + { + "contents": "section NZ2D 114.3X6.0CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 114.3X6.0CHS", + "kind": "keyword", + "trigger": "114.3X6.0CHS" + }, + { + "contents": "section NZ3D 114.3X6.0CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 114.3X6.0CHS", + "kind": "keyword", + "trigger": "114.3X6.0CHS" + }, + { + "contents": "section NZ2D 1200WB249 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 1200WB249", + "kind": "keyword", + "trigger": "1200WB249" + }, + { + "contents": "section NZ3D 1200WB249 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 1200WB249", + "kind": "keyword", + "trigger": "1200WB249" + }, + { + "contents": "section NZ2D 1200WB278 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 1200WB278", + "kind": "keyword", + "trigger": "1200WB278" + }, + { + "contents": "section NZ3D 1200WB278 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 1200WB278", + "kind": "keyword", + "trigger": "1200WB278" + }, + { + "contents": "section NZ2D 1200WB317 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 1200WB317", + "kind": "keyword", + "trigger": "1200WB317" + }, + { + "contents": "section NZ3D 1200WB317 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 1200WB317", + "kind": "keyword", + "trigger": "1200WB317" + }, + { + "contents": "section NZ2D 1200WB342 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 1200WB342", + "kind": "keyword", + "trigger": "1200WB342" + }, + { + "contents": "section NZ3D 1200WB342 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 1200WB342", + "kind": "keyword", + "trigger": "1200WB342" + }, + { + "contents": "section NZ2D 1200WB392 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 1200WB392", + "kind": "keyword", + "trigger": "1200WB392" + }, + { + "contents": "section NZ3D 1200WB392 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 1200WB392", + "kind": "keyword", + "trigger": "1200WB392" + }, + { + "contents": "section NZ2D 1200WB423 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 1200WB423", + "kind": "keyword", + "trigger": "1200WB423" + }, + { + "contents": "section NZ3D 1200WB423 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 1200WB423", + "kind": "keyword", + "trigger": "1200WB423" + }, + { + "contents": "section NZ2D 1200WB455 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 1200WB455", + "kind": "keyword", + "trigger": "1200WB455" + }, + { + "contents": "section NZ3D 1200WB455 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 1200WB455", + "kind": "keyword", + "trigger": "1200WB455" + }, + { + "contents": "section NZ2D 125X4.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 125X4.0SHS", + "kind": "keyword", + "trigger": "125X4.0SHS" + }, + { + "contents": "section NZ3D 125X4.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 125X4.0SHS", + "kind": "keyword", + "trigger": "125X4.0SHS" + }, + { + "contents": "section NZ2D 125X5.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 125X5.0SHS", + "kind": "keyword", + "trigger": "125X5.0SHS" + }, + { + "contents": "section NZ3D 125X5.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 125X5.0SHS", + "kind": "keyword", + "trigger": "125X5.0SHS" + }, + { + "contents": "section NZ2D 125X6.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 125X6.0SHS", + "kind": "keyword", + "trigger": "125X6.0SHS" + }, + { + "contents": "section NZ3D 125X6.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 125X6.0SHS", + "kind": "keyword", + "trigger": "125X6.0SHS" + }, + { + "contents": "section NZ2D 125X75X3.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 125X75X3.0RHS", + "kind": "keyword", + "trigger": "125X75X3.0RHS" + }, + { + "contents": "section NZ3D 125X75X3.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 125X75X3.0RHS", + "kind": "keyword", + "trigger": "125X75X3.0RHS" + }, + { + "contents": "section NZ2D 125X75X4.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 125X75X4.0RHS", + "kind": "keyword", + "trigger": "125X75X4.0RHS" + }, + { + "contents": "section NZ3D 125X75X4.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 125X75X4.0RHS", + "kind": "keyword", + "trigger": "125X75X4.0RHS" + }, + { + "contents": "section NZ2D 125X75X5.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 125X75X5.0RHS", + "kind": "keyword", + "trigger": "125X75X5.0RHS" + }, + { + "contents": "section NZ3D 125X75X5.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 125X75X5.0RHS", + "kind": "keyword", + "trigger": "125X75X5.0RHS" + }, + { + "contents": "section NZ2D 125X9.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 125X9.0SHS", + "kind": "keyword", + "trigger": "125X9.0SHS" + }, + { + "contents": "section NZ3D 125X9.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 125X9.0SHS", + "kind": "keyword", + "trigger": "125X9.0SHS" + }, + { + "contents": "section NZ2D 139.7X3.0CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 139.7X3.0CHS", + "kind": "keyword", + "trigger": "139.7X3.0CHS" + }, + { + "contents": "section NZ3D 139.7X3.0CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 139.7X3.0CHS", + "kind": "keyword", + "trigger": "139.7X3.0CHS" + }, + { + "contents": "section NZ2D 139.7X3.5CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 139.7X3.5CHS", + "kind": "keyword", + "trigger": "139.7X3.5CHS" + }, + { + "contents": "section NZ3D 139.7X3.5CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 139.7X3.5CHS", + "kind": "keyword", + "trigger": "139.7X3.5CHS" + }, + { + "contents": "section NZ2D 139.7X5.0CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 139.7X5.0CHS", + "kind": "keyword", + "trigger": "139.7X5.0CHS" + }, + { + "contents": "section NZ3D 139.7X5.0CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 139.7X5.0CHS", + "kind": "keyword", + "trigger": "139.7X5.0CHS" + }, + { + "contents": "section NZ2D 139.7X5.4CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 139.7X5.4CHS", + "kind": "keyword", + "trigger": "139.7X5.4CHS" + }, + { + "contents": "section NZ3D 139.7X5.4CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 139.7X5.4CHS", + "kind": "keyword", + "trigger": "139.7X5.4CHS" + }, + { + "contents": "section NZ2D 150UB14.0 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 150UB14.0", + "kind": "keyword", + "trigger": "150UB14.0" + }, + { + "contents": "section NZ3D 150UB14.0 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 150UB14.0", + "kind": "keyword", + "trigger": "150UB14.0" + }, + { + "contents": "section NZ2D 150UB18.0 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 150UB18.0", + "kind": "keyword", + "trigger": "150UB18.0" + }, + { + "contents": "section NZ3D 150UB18.0 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 150UB18.0", + "kind": "keyword", + "trigger": "150UB18.0" + }, + { + "contents": "section NZ2D 150UC23.4 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 150UC23.4", + "kind": "keyword", + "trigger": "150UC23.4" + }, + { + "contents": "section NZ3D 150UC23.4 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 150UC23.4", + "kind": "keyword", + "trigger": "150UC23.4" + }, + { + "contents": "section NZ2D 150UC30.0 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 150UC30.0", + "kind": "keyword", + "trigger": "150UC30.0" + }, + { + "contents": "section NZ3D 150UC30.0 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 150UC30.0", + "kind": "keyword", + "trigger": "150UC30.0" + }, + { + "contents": "section NZ2D 150UC37.2 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 150UC37.2", + "kind": "keyword", + "trigger": "150UC37.2" + }, + { + "contents": "section NZ3D 150UC37.2 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 150UC37.2", + "kind": "keyword", + "trigger": "150UC37.2" + }, + { + "contents": "section NZ2D 150X100X4.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 150X100X4.0RHS", + "kind": "keyword", + "trigger": "150X100X4.0RHS" + }, + { + "contents": "section NZ3D 150X100X4.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 150X100X4.0RHS", + "kind": "keyword", + "trigger": "150X100X4.0RHS" + }, + { + "contents": "section NZ2D 150X100X5.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 150X100X5.0RHS", + "kind": "keyword", + "trigger": "150X100X5.0RHS" + }, + { + "contents": "section NZ3D 150X100X5.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 150X100X5.0RHS", + "kind": "keyword", + "trigger": "150X100X5.0RHS" + }, + { + "contents": "section NZ2D 150X100X6.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 150X100X6.0RHS", + "kind": "keyword", + "trigger": "150X100X6.0RHS" + }, + { + "contents": "section NZ3D 150X100X6.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 150X100X6.0RHS", + "kind": "keyword", + "trigger": "150X100X6.0RHS" + }, + { + "contents": "section NZ2D 150X5.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 150X5.0SHS", + "kind": "keyword", + "trigger": "150X5.0SHS" + }, + { + "contents": "section NZ3D 150X5.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 150X5.0SHS", + "kind": "keyword", + "trigger": "150X5.0SHS" + }, + { + "contents": "section NZ2D 150X50X3.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 150X50X3.0RHS", + "kind": "keyword", + "trigger": "150X50X3.0RHS" + }, + { + "contents": "section NZ3D 150X50X3.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 150X50X3.0RHS", + "kind": "keyword", + "trigger": "150X50X3.0RHS" + }, + { + "contents": "section NZ2D 150X50X4.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 150X50X4.0RHS", + "kind": "keyword", + "trigger": "150X50X4.0RHS" + }, + { + "contents": "section NZ3D 150X50X4.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 150X50X4.0RHS", + "kind": "keyword", + "trigger": "150X50X4.0RHS" + }, + { + "contents": "section NZ2D 150X50X5.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 150X50X5.0RHS", + "kind": "keyword", + "trigger": "150X50X5.0RHS" + }, + { + "contents": "section NZ3D 150X50X5.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 150X50X5.0RHS", + "kind": "keyword", + "trigger": "150X50X5.0RHS" + }, + { + "contents": "section NZ2D 150X6.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 150X6.0SHS", + "kind": "keyword", + "trigger": "150X6.0SHS" + }, + { + "contents": "section NZ3D 150X6.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 150X6.0SHS", + "kind": "keyword", + "trigger": "150X6.0SHS" + }, + { + "contents": "section NZ2D 150X9.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 150X9.0SHS", + "kind": "keyword", + "trigger": "150X9.0SHS" + }, + { + "contents": "section NZ3D 150X9.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 150X9.0SHS", + "kind": "keyword", + "trigger": "150X9.0SHS" + }, + { + "contents": "section NZ2D 165.1X3.0CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 165.1X3.0CHS", + "kind": "keyword", + "trigger": "165.1X3.0CHS" + }, + { + "contents": "section NZ3D 165.1X3.0CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 165.1X3.0CHS", + "kind": "keyword", + "trigger": "165.1X3.0CHS" + }, + { + "contents": "section NZ2D 165.1X3.5CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 165.1X3.5CHS", + "kind": "keyword", + "trigger": "165.1X3.5CHS" + }, + { + "contents": "section NZ3D 165.1X3.5CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 165.1X3.5CHS", + "kind": "keyword", + "trigger": "165.1X3.5CHS" + }, + { + "contents": "section NZ2D 165.1X5.0CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 165.1X5.0CHS", + "kind": "keyword", + "trigger": "165.1X5.0CHS" + }, + { + "contents": "section NZ3D 165.1X5.0CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 165.1X5.0CHS", + "kind": "keyword", + "trigger": "165.1X5.0CHS" + }, + { + "contents": "section NZ2D 165.1X5.4CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 165.1X5.4CHS", + "kind": "keyword", + "trigger": "165.1X5.4CHS" + }, + { + "contents": "section NZ3D 165.1X5.4CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 165.1X5.4CHS", + "kind": "keyword", + "trigger": "165.1X5.4CHS" + }, + { + "contents": "section NZ2D 168.3X4.8CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 168.3X4.8CHS", + "kind": "keyword", + "trigger": "168.3X4.8CHS" + }, + { + "contents": "section NZ3D 168.3X4.8CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 168.3X4.8CHS", + "kind": "keyword", + "trigger": "168.3X4.8CHS" + }, + { + "contents": "section NZ2D 168.3X6.4CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 168.3X6.4CHS", + "kind": "keyword", + "trigger": "168.3X6.4CHS" + }, + { + "contents": "section NZ3D 168.3X6.4CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 168.3X6.4CHS", + "kind": "keyword", + "trigger": "168.3X6.4CHS" + }, + { + "contents": "section NZ2D 168.3X7.1CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 168.3X7.1CHS", + "kind": "keyword", + "trigger": "168.3X7.1CHS" + }, + { + "contents": "section NZ3D 168.3X7.1CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 168.3X7.1CHS", + "kind": "keyword", + "trigger": "168.3X7.1CHS" + }, + { + "contents": "section NZ2D 180UB16.1 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 180UB16.1", + "kind": "keyword", + "trigger": "180UB16.1" + }, + { + "contents": "section NZ3D 180UB16.1 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 180UB16.1", + "kind": "keyword", + "trigger": "180UB16.1" + }, + { + "contents": "section NZ2D 180UB18.1 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 180UB18.1", + "kind": "keyword", + "trigger": "180UB18.1" + }, + { + "contents": "section NZ3D 180UB18.1 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 180UB18.1", + "kind": "keyword", + "trigger": "180UB18.1" + }, + { + "contents": "section NZ2D 180UB22.2 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 180UB22.2", + "kind": "keyword", + "trigger": "180UB22.2" + }, + { + "contents": "section NZ3D 180UB22.2 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 180UB22.2", + "kind": "keyword", + "trigger": "180UB22.2" + }, + { + "contents": "section NZ2D 200UB18.2 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 200UB18.2", + "kind": "keyword", + "trigger": "200UB18.2" + }, + { + "contents": "section NZ3D 200UB18.2 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 200UB18.2", + "kind": "keyword", + "trigger": "200UB18.2" + }, + { + "contents": "section NZ2D 200UB22.3 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 200UB22.3", + "kind": "keyword", + "trigger": "200UB22.3" + }, + { + "contents": "section NZ3D 200UB22.3 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 200UB22.3", + "kind": "keyword", + "trigger": "200UB22.3" + }, + { + "contents": "section NZ2D 200UB25.4 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 200UB25.4", + "kind": "keyword", + "trigger": "200UB25.4" + }, + { + "contents": "section NZ3D 200UB25.4 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 200UB25.4", + "kind": "keyword", + "trigger": "200UB25.4" + }, + { + "contents": "section NZ2D 200UB29.8 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 200UB29.8", + "kind": "keyword", + "trigger": "200UB29.8" + }, + { + "contents": "section NZ3D 200UB29.8 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 200UB29.8", + "kind": "keyword", + "trigger": "200UB29.8" + }, + { + "contents": "section NZ2D 200UC46.2 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 200UC46.2", + "kind": "keyword", + "trigger": "200UC46.2" + }, + { + "contents": "section NZ3D 200UC46.2 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 200UC46.2", + "kind": "keyword", + "trigger": "200UC46.2" + }, + { + "contents": "section NZ2D 200UC52.2 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 200UC52.2", + "kind": "keyword", + "trigger": "200UC52.2" + }, + { + "contents": "section NZ3D 200UC52.2 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 200UC52.2", + "kind": "keyword", + "trigger": "200UC52.2" + }, + { + "contents": "section NZ2D 200UC59.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 200UC59.5", + "kind": "keyword", + "trigger": "200UC59.5" + }, + { + "contents": "section NZ3D 200UC59.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 200UC59.5", + "kind": "keyword", + "trigger": "200UC59.5" + }, + { + "contents": "section NZ2D 200X100X4.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 200X100X4.0RHS", + "kind": "keyword", + "trigger": "200X100X4.0RHS" + }, + { + "contents": "section NZ3D 200X100X4.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 200X100X4.0RHS", + "kind": "keyword", + "trigger": "200X100X4.0RHS" + }, + { + "contents": "section NZ2D 200X100X5.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 200X100X5.0RHS", + "kind": "keyword", + "trigger": "200X100X5.0RHS" + }, + { + "contents": "section NZ3D 200X100X5.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 200X100X5.0RHS", + "kind": "keyword", + "trigger": "200X100X5.0RHS" + }, + { + "contents": "section NZ2D 200X100X6.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 200X100X6.0RHS", + "kind": "keyword", + "trigger": "200X100X6.0RHS" + }, + { + "contents": "section NZ3D 200X100X6.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 200X100X6.0RHS", + "kind": "keyword", + "trigger": "200X100X6.0RHS" + }, + { + "contents": "section NZ2D 200X100X9.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 200X100X9.0RHS", + "kind": "keyword", + "trigger": "200X100X9.0RHS" + }, + { + "contents": "section NZ3D 200X100X9.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 200X100X9.0RHS", + "kind": "keyword", + "trigger": "200X100X9.0RHS" + }, + { + "contents": "section NZ2D 200X5.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 200X5.0SHS", + "kind": "keyword", + "trigger": "200X5.0SHS" + }, + { + "contents": "section NZ3D 200X5.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 200X5.0SHS", + "kind": "keyword", + "trigger": "200X5.0SHS" + }, + { + "contents": "section NZ2D 200X6.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 200X6.0SHS", + "kind": "keyword", + "trigger": "200X6.0SHS" + }, + { + "contents": "section NZ3D 200X6.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 200X6.0SHS", + "kind": "keyword", + "trigger": "200X6.0SHS" + }, + { + "contents": "section NZ2D 200X9.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 200X9.0SHS", + "kind": "keyword", + "trigger": "200X9.0SHS" + }, + { + "contents": "section NZ3D 200X9.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 200X9.0SHS", + "kind": "keyword", + "trigger": "200X9.0SHS" + }, + { + "contents": "section NZ2D 20X1.6SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 20X1.6SHS", + "kind": "keyword", + "trigger": "20X1.6SHS" + }, + { + "contents": "section NZ3D 20X1.6SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 20X1.6SHS", + "kind": "keyword", + "trigger": "20X1.6SHS" + }, + { + "contents": "section NZ2D 219.1X4.8CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 219.1X4.8CHS", + "kind": "keyword", + "trigger": "219.1X4.8CHS" + }, + { + "contents": "section NZ3D 219.1X4.8CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 219.1X4.8CHS", + "kind": "keyword", + "trigger": "219.1X4.8CHS" + }, + { + "contents": "section NZ2D 219.1X6.4CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 219.1X6.4CHS", + "kind": "keyword", + "trigger": "219.1X6.4CHS" + }, + { + "contents": "section NZ3D 219.1X6.4CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 219.1X6.4CHS", + "kind": "keyword", + "trigger": "219.1X6.4CHS" + }, + { + "contents": "section NZ2D 219.1X8.2CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 219.1X8.2CHS", + "kind": "keyword", + "trigger": "219.1X8.2CHS" + }, + { + "contents": "section NZ3D 219.1X8.2CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 219.1X8.2CHS", + "kind": "keyword", + "trigger": "219.1X8.2CHS" + }, + { + "contents": "section NZ2D 250UB25.7 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 250UB25.7", + "kind": "keyword", + "trigger": "250UB25.7" + }, + { + "contents": "section NZ3D 250UB25.7 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 250UB25.7", + "kind": "keyword", + "trigger": "250UB25.7" + }, + { + "contents": "section NZ2D 250UB31.4 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 250UB31.4", + "kind": "keyword", + "trigger": "250UB31.4" + }, + { + "contents": "section NZ3D 250UB31.4 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 250UB31.4", + "kind": "keyword", + "trigger": "250UB31.4" + }, + { + "contents": "section NZ2D 250UB37.3 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 250UB37.3", + "kind": "keyword", + "trigger": "250UB37.3" + }, + { + "contents": "section NZ3D 250UB37.3 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 250UB37.3", + "kind": "keyword", + "trigger": "250UB37.3" + }, + { + "contents": "section NZ2D 250UC72.9 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 250UC72.9", + "kind": "keyword", + "trigger": "250UC72.9" + }, + { + "contents": "section NZ3D 250UC72.9 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 250UC72.9", + "kind": "keyword", + "trigger": "250UC72.9" + }, + { + "contents": "section NZ2D 250UC89.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 250UC89.5", + "kind": "keyword", + "trigger": "250UC89.5" + }, + { + "contents": "section NZ3D 250UC89.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 250UC89.5", + "kind": "keyword", + "trigger": "250UC89.5" + }, + { + "contents": "section NZ2D 250X150X5.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 250X150X5.0RHS", + "kind": "keyword", + "trigger": "250X150X5.0RHS" + }, + { + "contents": "section NZ3D 250X150X5.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 250X150X5.0RHS", + "kind": "keyword", + "trigger": "250X150X5.0RHS" + }, + { + "contents": "section NZ2D 250X150X6.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 250X150X6.0RHS", + "kind": "keyword", + "trigger": "250X150X6.0RHS" + }, + { + "contents": "section NZ3D 250X150X6.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 250X150X6.0RHS", + "kind": "keyword", + "trigger": "250X150X6.0RHS" + }, + { + "contents": "section NZ2D 250X150X9.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 250X150X9.0RHS", + "kind": "keyword", + "trigger": "250X150X9.0RHS" + }, + { + "contents": "section NZ3D 250X150X9.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 250X150X9.0RHS", + "kind": "keyword", + "trigger": "250X150X9.0RHS" + }, + { + "contents": "section NZ2D 250X6.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 250X6.0SHS", + "kind": "keyword", + "trigger": "250X6.0SHS" + }, + { + "contents": "section NZ3D 250X6.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 250X6.0SHS", + "kind": "keyword", + "trigger": "250X6.0SHS" + }, + { + "contents": "section NZ2D 250X9.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 250X9.0SHS", + "kind": "keyword", + "trigger": "250X9.0SHS" + }, + { + "contents": "section NZ3D 250X9.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 250X9.0SHS", + "kind": "keyword", + "trigger": "250X9.0SHS" + }, + { + "contents": "section NZ2D 25X1.6SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 25X1.6SHS", + "kind": "keyword", + "trigger": "25X1.6SHS" + }, + { + "contents": "section NZ3D 25X1.6SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 25X1.6SHS", + "kind": "keyword", + "trigger": "25X1.6SHS" + }, + { + "contents": "section NZ2D 25X2.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 25X2.0SHS", + "kind": "keyword", + "trigger": "25X2.0SHS" + }, + { + "contents": "section NZ3D 25X2.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 25X2.0SHS", + "kind": "keyword", + "trigger": "25X2.0SHS" + }, + { + "contents": "section NZ2D 25X2.5SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 25X2.5SHS", + "kind": "keyword", + "trigger": "25X2.5SHS" + }, + { + "contents": "section NZ3D 25X2.5SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 25X2.5SHS", + "kind": "keyword", + "trigger": "25X2.5SHS" + }, + { + "contents": "section NZ2D 25X3.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 25X3.0SHS", + "kind": "keyword", + "trigger": "25X3.0SHS" + }, + { + "contents": "section NZ3D 25X3.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 25X3.0SHS", + "kind": "keyword", + "trigger": "25X3.0SHS" + }, + { + "contents": "section NZ2D 273.1X4.8CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 273.1X4.8CHS", + "kind": "keyword", + "trigger": "273.1X4.8CHS" + }, + { + "contents": "section NZ3D 273.1X4.8CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 273.1X4.8CHS", + "kind": "keyword", + "trigger": "273.1X4.8CHS" + }, + { + "contents": "section NZ2D 273.1X6.4CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 273.1X6.4CHS", + "kind": "keyword", + "trigger": "273.1X6.4CHS" + }, + { + "contents": "section NZ3D 273.1X6.4CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 273.1X6.4CHS", + "kind": "keyword", + "trigger": "273.1X6.4CHS" + }, + { + "contents": "section NZ2D 273.1X9.3CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 273.1X9.3CHS", + "kind": "keyword", + "trigger": "273.1X9.3CHS" + }, + { + "contents": "section NZ3D 273.1X9.3CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 273.1X9.3CHS", + "kind": "keyword", + "trigger": "273.1X9.3CHS" + }, + { + "contents": "section NZ2D 30X1.6SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 30X1.6SHS", + "kind": "keyword", + "trigger": "30X1.6SHS" + }, + { + "contents": "section NZ3D 30X1.6SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 30X1.6SHS", + "kind": "keyword", + "trigger": "30X1.6SHS" + }, + { + "contents": "section NZ2D 30X2.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 30X2.0SHS", + "kind": "keyword", + "trigger": "30X2.0SHS" + }, + { + "contents": "section NZ3D 30X2.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 30X2.0SHS", + "kind": "keyword", + "trigger": "30X2.0SHS" + }, + { + "contents": "section NZ2D 310UB32.0 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 310UB32.0", + "kind": "keyword", + "trigger": "310UB32.0" + }, + { + "contents": "section NZ3D 310UB32.0 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 310UB32.0", + "kind": "keyword", + "trigger": "310UB32.0" + }, + { + "contents": "section NZ2D 310UB40.4 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 310UB40.4", + "kind": "keyword", + "trigger": "310UB40.4" + }, + { + "contents": "section NZ3D 310UB40.4 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 310UB40.4", + "kind": "keyword", + "trigger": "310UB40.4" + }, + { + "contents": "section NZ2D 310UB46.2 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 310UB46.2", + "kind": "keyword", + "trigger": "310UB46.2" + }, + { + "contents": "section NZ3D 310UB46.2 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 310UB46.2", + "kind": "keyword", + "trigger": "310UB46.2" + }, + { + "contents": "section NZ2D 310UC118 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 310UC118", + "kind": "keyword", + "trigger": "310UC118" + }, + { + "contents": "section NZ3D 310UC118 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 310UC118", + "kind": "keyword", + "trigger": "310UC118" + }, + { + "contents": "section NZ2D 310UC137 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 310UC137", + "kind": "keyword", + "trigger": "310UC137" + }, + { + "contents": "section NZ3D 310UC137 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 310UC137", + "kind": "keyword", + "trigger": "310UC137" + }, + { + "contents": "section NZ2D 310UC96.8 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 310UC96.8", + "kind": "keyword", + "trigger": "310UC96.8" + }, + { + "contents": "section NZ3D 310UC96.8 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 310UC96.8", + "kind": "keyword", + "trigger": "310UC96.8" + }, + { + "contents": "section NZ2D 320UC158 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 320UC158", + "kind": "keyword", + "trigger": "320UC158" + }, + { + "contents": "section NZ3D 320UC158 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 320UC158", + "kind": "keyword", + "trigger": "320UC158" + }, + { + "contents": "section NZ2D 323.9X12.7CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 323.9X12.7CHS", + "kind": "keyword", + "trigger": "323.9X12.7CHS" + }, + { + "contents": "section NZ3D 323.9X12.7CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 323.9X12.7CHS", + "kind": "keyword", + "trigger": "323.9X12.7CHS" + }, + { + "contents": "section NZ2D 323.9X6.4CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 323.9X6.4CHS", + "kind": "keyword", + "trigger": "323.9X6.4CHS" + }, + { + "contents": "section NZ3D 323.9X6.4CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 323.9X6.4CHS", + "kind": "keyword", + "trigger": "323.9X6.4CHS" + }, + { + "contents": "section NZ2D 323.9X9.5CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 323.9X9.5CHS", + "kind": "keyword", + "trigger": "323.9X9.5CHS" + }, + { + "contents": "section NZ3D 323.9X9.5CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 323.9X9.5CHS", + "kind": "keyword", + "trigger": "323.9X9.5CHS" + }, + { + "contents": "section NZ2D 350WC197 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 350WC197", + "kind": "keyword", + "trigger": "350WC197" + }, + { + "contents": "section NZ3D 350WC197 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 350WC197", + "kind": "keyword", + "trigger": "350WC197" + }, + { + "contents": "section NZ2D 350WC230 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 350WC230", + "kind": "keyword", + "trigger": "350WC230" + }, + { + "contents": "section NZ3D 350WC230 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 350WC230", + "kind": "keyword", + "trigger": "350WC230" + }, + { + "contents": "section NZ2D 350WC258 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 350WC258", + "kind": "keyword", + "trigger": "350WC258" + }, + { + "contents": "section NZ3D 350WC258 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 350WC258", + "kind": "keyword", + "trigger": "350WC258" + }, + { + "contents": "section NZ2D 350WC280 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 350WC280", + "kind": "keyword", + "trigger": "350WC280" + }, + { + "contents": "section NZ3D 350WC280 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 350WC280", + "kind": "keyword", + "trigger": "350WC280" + }, + { + "contents": "section NZ2D 355.6X12.7CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 355.6X12.7CHS", + "kind": "keyword", + "trigger": "355.6X12.7CHS" + }, + { + "contents": "section NZ3D 355.6X12.7CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 355.6X12.7CHS", + "kind": "keyword", + "trigger": "355.6X12.7CHS" + }, + { + "contents": "section NZ2D 355.6X6.4CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 355.6X6.4CHS", + "kind": "keyword", + "trigger": "355.6X6.4CHS" + }, + { + "contents": "section NZ3D 355.6X6.4CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 355.6X6.4CHS", + "kind": "keyword", + "trigger": "355.6X6.4CHS" + }, + { + "contents": "section NZ2D 355.6X9.5CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 355.6X9.5CHS", + "kind": "keyword", + "trigger": "355.6X9.5CHS" + }, + { + "contents": "section NZ3D 355.6X9.5CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 355.6X9.5CHS", + "kind": "keyword", + "trigger": "355.6X9.5CHS" + }, + { + "contents": "section NZ2D 35X1.6SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 35X1.6SHS", + "kind": "keyword", + "trigger": "35X1.6SHS" + }, + { + "contents": "section NZ3D 35X1.6SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 35X1.6SHS", + "kind": "keyword", + "trigger": "35X1.6SHS" + }, + { + "contents": "section NZ2D 35X2.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 35X2.0SHS", + "kind": "keyword", + "trigger": "35X2.0SHS" + }, + { + "contents": "section NZ3D 35X2.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 35X2.0SHS", + "kind": "keyword", + "trigger": "35X2.0SHS" + }, + { + "contents": "section NZ2D 35X2.5SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 35X2.5SHS", + "kind": "keyword", + "trigger": "35X2.5SHS" + }, + { + "contents": "section NZ3D 35X2.5SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 35X2.5SHS", + "kind": "keyword", + "trigger": "35X2.5SHS" + }, + { + "contents": "section NZ2D 35X3.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 35X3.0SHS", + "kind": "keyword", + "trigger": "35X3.0SHS" + }, + { + "contents": "section NZ3D 35X3.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 35X3.0SHS", + "kind": "keyword", + "trigger": "35X3.0SHS" + }, + { + "contents": "section NZ2D 360UB44.7 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 360UB44.7", + "kind": "keyword", + "trigger": "360UB44.7" + }, + { + "contents": "section NZ3D 360UB44.7 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 360UB44.7", + "kind": "keyword", + "trigger": "360UB44.7" + }, + { + "contents": "section NZ2D 360UB50.7 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 360UB50.7", + "kind": "keyword", + "trigger": "360UB50.7" + }, + { + "contents": "section NZ3D 360UB50.7 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 360UB50.7", + "kind": "keyword", + "trigger": "360UB50.7" + }, + { + "contents": "section NZ2D 360UB56.7 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 360UB56.7", + "kind": "keyword", + "trigger": "360UB56.7" + }, + { + "contents": "section NZ3D 360UB56.7 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 360UB56.7", + "kind": "keyword", + "trigger": "360UB56.7" + }, + { + "contents": "section NZ2D 400WC144 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 400WC144", + "kind": "keyword", + "trigger": "400WC144" + }, + { + "contents": "section NZ3D 400WC144 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 400WC144", + "kind": "keyword", + "trigger": "400WC144" + }, + { + "contents": "section NZ2D 400WC181 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 400WC181", + "kind": "keyword", + "trigger": "400WC181" + }, + { + "contents": "section NZ3D 400WC181 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 400WC181", + "kind": "keyword", + "trigger": "400WC181" + }, + { + "contents": "section NZ2D 400WC212 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 400WC212", + "kind": "keyword", + "trigger": "400WC212" + }, + { + "contents": "section NZ3D 400WC212 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 400WC212", + "kind": "keyword", + "trigger": "400WC212" + }, + { + "contents": "section NZ2D 400WC270 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 400WC270", + "kind": "keyword", + "trigger": "400WC270" + }, + { + "contents": "section NZ3D 400WC270 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 400WC270", + "kind": "keyword", + "trigger": "400WC270" + }, + { + "contents": "section NZ2D 400WC303 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 400WC303", + "kind": "keyword", + "trigger": "400WC303" + }, + { + "contents": "section NZ3D 400WC303 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 400WC303", + "kind": "keyword", + "trigger": "400WC303" + }, + { + "contents": "section NZ2D 400WC328 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 400WC328", + "kind": "keyword", + "trigger": "400WC328" + }, + { + "contents": "section NZ3D 400WC328 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 400WC328", + "kind": "keyword", + "trigger": "400WC328" + }, + { + "contents": "section NZ2D 400WC361 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 400WC361", + "kind": "keyword", + "trigger": "400WC361" + }, + { + "contents": "section NZ3D 400WC361 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 400WC361", + "kind": "keyword", + "trigger": "400WC361" + }, + { + "contents": "section NZ2D 406.4X12.7CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 406.4X12.7CHS", + "kind": "keyword", + "trigger": "406.4X12.7CHS" + }, + { + "contents": "section NZ3D 406.4X12.7CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 406.4X12.7CHS", + "kind": "keyword", + "trigger": "406.4X12.7CHS" + }, + { + "contents": "section NZ2D 406.4X6.4CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 406.4X6.4CHS", + "kind": "keyword", + "trigger": "406.4X6.4CHS" + }, + { + "contents": "section NZ3D 406.4X6.4CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 406.4X6.4CHS", + "kind": "keyword", + "trigger": "406.4X6.4CHS" + }, + { + "contents": "section NZ2D 406.4X9.5CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 406.4X9.5CHS", + "kind": "keyword", + "trigger": "406.4X9.5CHS" + }, + { + "contents": "section NZ3D 406.4X9.5CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 406.4X9.5CHS", + "kind": "keyword", + "trigger": "406.4X9.5CHS" + }, + { + "contents": "section NZ2D 40X1.6SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 40X1.6SHS", + "kind": "keyword", + "trigger": "40X1.6SHS" + }, + { + "contents": "section NZ3D 40X1.6SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 40X1.6SHS", + "kind": "keyword", + "trigger": "40X1.6SHS" + }, + { + "contents": "section NZ2D 40X2.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 40X2.0SHS", + "kind": "keyword", + "trigger": "40X2.0SHS" + }, + { + "contents": "section NZ3D 40X2.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 40X2.0SHS", + "kind": "keyword", + "trigger": "40X2.0SHS" + }, + { + "contents": "section NZ2D 40X2.5SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 40X2.5SHS", + "kind": "keyword", + "trigger": "40X2.5SHS" + }, + { + "contents": "section NZ3D 40X2.5SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 40X2.5SHS", + "kind": "keyword", + "trigger": "40X2.5SHS" + }, + { + "contents": "section NZ2D 40X4.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 40X4.0SHS", + "kind": "keyword", + "trigger": "40X4.0SHS" + }, + { + "contents": "section NZ3D 40X4.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 40X4.0SHS", + "kind": "keyword", + "trigger": "40X4.0SHS" + }, + { + "contents": "section NZ2D 410UB53.7 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 410UB53.7", + "kind": "keyword", + "trigger": "410UB53.7" + }, + { + "contents": "section NZ3D 410UB53.7 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 410UB53.7", + "kind": "keyword", + "trigger": "410UB53.7" + }, + { + "contents": "section NZ2D 410UB59.7 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 410UB59.7", + "kind": "keyword", + "trigger": "410UB59.7" + }, + { + "contents": "section NZ3D 410UB59.7 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 410UB59.7", + "kind": "keyword", + "trigger": "410UB59.7" + }, + { + "contents": "section NZ2D 42.4X3.2CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 42.4X3.2CHS", + "kind": "keyword", + "trigger": "42.4X3.2CHS" + }, + { + "contents": "section NZ3D 42.4X3.2CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 42.4X3.2CHS", + "kind": "keyword", + "trigger": "42.4X3.2CHS" + }, + { + "contents": "section NZ2D 42.4X4.0CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 42.4X4.0CHS", + "kind": "keyword", + "trigger": "42.4X4.0CHS" + }, + { + "contents": "section NZ3D 42.4X4.0CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 42.4X4.0CHS", + "kind": "keyword", + "trigger": "42.4X4.0CHS" + }, + { + "contents": "section NZ2D 42.4X4.9CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 42.4X4.9CHS", + "kind": "keyword", + "trigger": "42.4X4.9CHS" + }, + { + "contents": "section NZ3D 42.4X4.9CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 42.4X4.9CHS", + "kind": "keyword", + "trigger": "42.4X4.9CHS" + }, + { + "contents": "section NZ2D 457.0X12.7CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 457.0X12.7CHS", + "kind": "keyword", + "trigger": "457.0X12.7CHS" + }, + { + "contents": "section NZ3D 457.0X12.7CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 457.0X12.7CHS", + "kind": "keyword", + "trigger": "457.0X12.7CHS" + }, + { + "contents": "section NZ2D 457.0X6.4CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 457.0X6.4CHS", + "kind": "keyword", + "trigger": "457.0X6.4CHS" + }, + { + "contents": "section NZ3D 457.0X6.4CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 457.0X6.4CHS", + "kind": "keyword", + "trigger": "457.0X6.4CHS" + }, + { + "contents": "section NZ2D 457.0X9.5CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 457.0X9.5CHS", + "kind": "keyword", + "trigger": "457.0X9.5CHS" + }, + { + "contents": "section NZ3D 457.0X9.5CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 457.0X9.5CHS", + "kind": "keyword", + "trigger": "457.0X9.5CHS" + }, + { + "contents": "section NZ2D 460UB67.1 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 460UB67.1", + "kind": "keyword", + "trigger": "460UB67.1" + }, + { + "contents": "section NZ3D 460UB67.1 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 460UB67.1", + "kind": "keyword", + "trigger": "460UB67.1" + }, + { + "contents": "section NZ2D 460UB74.6 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 460UB74.6", + "kind": "keyword", + "trigger": "460UB74.6" + }, + { + "contents": "section NZ3D 460UB74.6 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 460UB74.6", + "kind": "keyword", + "trigger": "460UB74.6" + }, + { + "contents": "section NZ2D 460UB82.1 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 460UB82.1", + "kind": "keyword", + "trigger": "460UB82.1" + }, + { + "contents": "section NZ3D 460UB82.1 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 460UB82.1", + "kind": "keyword", + "trigger": "460UB82.1" + }, + { + "contents": "section NZ2D 48.3X3.2CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 48.3X3.2CHS", + "kind": "keyword", + "trigger": "48.3X3.2CHS" + }, + { + "contents": "section NZ3D 48.3X3.2CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 48.3X3.2CHS", + "kind": "keyword", + "trigger": "48.3X3.2CHS" + }, + { + "contents": "section NZ2D 48.3X4.0CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 48.3X4.0CHS", + "kind": "keyword", + "trigger": "48.3X4.0CHS" + }, + { + "contents": "section NZ3D 48.3X4.0CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 48.3X4.0CHS", + "kind": "keyword", + "trigger": "48.3X4.0CHS" + }, + { + "contents": "section NZ2D 48.3X5.4CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 48.3X5.4CHS", + "kind": "keyword", + "trigger": "48.3X5.4CHS" + }, + { + "contents": "section NZ3D 48.3X5.4CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 48.3X5.4CHS", + "kind": "keyword", + "trigger": "48.3X5.4CHS" + }, + { + "contents": "section NZ2D 500WC228 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 500WC228", + "kind": "keyword", + "trigger": "500WC228" + }, + { + "contents": "section NZ3D 500WC228 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 500WC228", + "kind": "keyword", + "trigger": "500WC228" + }, + { + "contents": "section NZ2D 500WC267 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 500WC267", + "kind": "keyword", + "trigger": "500WC267" + }, + { + "contents": "section NZ3D 500WC267 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 500WC267", + "kind": "keyword", + "trigger": "500WC267" + }, + { + "contents": "section NZ2D 500WC290 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 500WC290", + "kind": "keyword", + "trigger": "500WC290" + }, + { + "contents": "section NZ3D 500WC290 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 500WC290", + "kind": "keyword", + "trigger": "500WC290" + }, + { + "contents": "section NZ2D 500WC340 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 500WC340", + "kind": "keyword", + "trigger": "500WC340" + }, + { + "contents": "section NZ3D 500WC340 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 500WC340", + "kind": "keyword", + "trigger": "500WC340" + }, + { + "contents": "section NZ2D 500WC383 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 500WC383", + "kind": "keyword", + "trigger": "500WC383" + }, + { + "contents": "section NZ3D 500WC383 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 500WC383", + "kind": "keyword", + "trigger": "500WC383" + }, + { + "contents": "section NZ2D 500WC414 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 500WC414", + "kind": "keyword", + "trigger": "500WC414" + }, + { + "contents": "section NZ3D 500WC414 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 500WC414", + "kind": "keyword", + "trigger": "500WC414" + }, + { + "contents": "section NZ2D 500WC440 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 500WC440", + "kind": "keyword", + "trigger": "500WC440" + }, + { + "contents": "section NZ3D 500WC440 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 500WC440", + "kind": "keyword", + "trigger": "500WC440" + }, + { + "contents": "section NZ2D 508.0X12.7CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 508.0X12.7CHS", + "kind": "keyword", + "trigger": "508.0X12.7CHS" + }, + { + "contents": "section NZ3D 508.0X12.7CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 508.0X12.7CHS", + "kind": "keyword", + "trigger": "508.0X12.7CHS" + }, + { + "contents": "section NZ2D 508.0X6.4CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 508.0X6.4CHS", + "kind": "keyword", + "trigger": "508.0X6.4CHS" + }, + { + "contents": "section NZ3D 508.0X6.4CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 508.0X6.4CHS", + "kind": "keyword", + "trigger": "508.0X6.4CHS" + }, + { + "contents": "section NZ2D 508.0X9.5CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 508.0X9.5CHS", + "kind": "keyword", + "trigger": "508.0X9.5CHS" + }, + { + "contents": "section NZ3D 508.0X9.5CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 508.0X9.5CHS", + "kind": "keyword", + "trigger": "508.0X9.5CHS" + }, + { + "contents": "section NZ2D 50X1.6SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 50X1.6SHS", + "kind": "keyword", + "trigger": "50X1.6SHS" + }, + { + "contents": "section NZ3D 50X1.6SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 50X1.6SHS", + "kind": "keyword", + "trigger": "50X1.6SHS" + }, + { + "contents": "section NZ2D 50X2.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 50X2.0SHS", + "kind": "keyword", + "trigger": "50X2.0SHS" + }, + { + "contents": "section NZ3D 50X2.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 50X2.0SHS", + "kind": "keyword", + "trigger": "50X2.0SHS" + }, + { + "contents": "section NZ2D 50X2.5SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 50X2.5SHS", + "kind": "keyword", + "trigger": "50X2.5SHS" + }, + { + "contents": "section NZ3D 50X2.5SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 50X2.5SHS", + "kind": "keyword", + "trigger": "50X2.5SHS" + }, + { + "contents": "section NZ2D 50X20X1.6RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 50X20X1.6RHS", + "kind": "keyword", + "trigger": "50X20X1.6RHS" + }, + { + "contents": "section NZ3D 50X20X1.6RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 50X20X1.6RHS", + "kind": "keyword", + "trigger": "50X20X1.6RHS" + }, + { + "contents": "section NZ2D 50X20X2.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 50X20X2.0RHS", + "kind": "keyword", + "trigger": "50X20X2.0RHS" + }, + { + "contents": "section NZ3D 50X20X2.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 50X20X2.0RHS", + "kind": "keyword", + "trigger": "50X20X2.0RHS" + }, + { + "contents": "section NZ2D 50X20X2.5RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 50X20X2.5RHS", + "kind": "keyword", + "trigger": "50X20X2.5RHS" + }, + { + "contents": "section NZ3D 50X20X2.5RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 50X20X2.5RHS", + "kind": "keyword", + "trigger": "50X20X2.5RHS" + }, + { + "contents": "section NZ2D 50X20X3.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 50X20X3.0RHS", + "kind": "keyword", + "trigger": "50X20X3.0RHS" + }, + { + "contents": "section NZ3D 50X20X3.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 50X20X3.0RHS", + "kind": "keyword", + "trigger": "50X20X3.0RHS" + }, + { + "contents": "section NZ2D 50X25X1.6RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 50X25X1.6RHS", + "kind": "keyword", + "trigger": "50X25X1.6RHS" + }, + { + "contents": "section NZ3D 50X25X1.6RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 50X25X1.6RHS", + "kind": "keyword", + "trigger": "50X25X1.6RHS" + }, + { + "contents": "section NZ2D 50X25X2.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 50X25X2.0RHS", + "kind": "keyword", + "trigger": "50X25X2.0RHS" + }, + { + "contents": "section NZ3D 50X25X2.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 50X25X2.0RHS", + "kind": "keyword", + "trigger": "50X25X2.0RHS" + }, + { + "contents": "section NZ2D 50X25X2.5RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 50X25X2.5RHS", + "kind": "keyword", + "trigger": "50X25X2.5RHS" + }, + { + "contents": "section NZ3D 50X25X2.5RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 50X25X2.5RHS", + "kind": "keyword", + "trigger": "50X25X2.5RHS" + }, + { + "contents": "section NZ2D 50X25X3.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 50X25X3.0RHS", + "kind": "keyword", + "trigger": "50X25X3.0RHS" + }, + { + "contents": "section NZ3D 50X25X3.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 50X25X3.0RHS", + "kind": "keyword", + "trigger": "50X25X3.0RHS" + }, + { + "contents": "section NZ2D 50X3.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 50X3.0SHS", + "kind": "keyword", + "trigger": "50X3.0SHS" + }, + { + "contents": "section NZ3D 50X3.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 50X3.0SHS", + "kind": "keyword", + "trigger": "50X3.0SHS" + }, + { + "contents": "section NZ2D 50X4.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 50X4.0SHS", + "kind": "keyword", + "trigger": "50X4.0SHS" + }, + { + "contents": "section NZ3D 50X4.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 50X4.0SHS", + "kind": "keyword", + "trigger": "50X4.0SHS" + }, + { + "contents": "section NZ2D 530UB82.0 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 530UB82.0", + "kind": "keyword", + "trigger": "530UB82.0" + }, + { + "contents": "section NZ3D 530UB82.0 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 530UB82.0", + "kind": "keyword", + "trigger": "530UB82.0" + }, + { + "contents": "section NZ2D 530UB92.4 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 530UB92.4", + "kind": "keyword", + "trigger": "530UB92.4" + }, + { + "contents": "section NZ3D 530UB92.4 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 530UB92.4", + "kind": "keyword", + "trigger": "530UB92.4" + }, + { + "contents": "section NZ2D 60.3X3.6CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 60.3X3.6CHS", + "kind": "keyword", + "trigger": "60.3X3.6CHS" + }, + { + "contents": "section NZ3D 60.3X3.6CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 60.3X3.6CHS", + "kind": "keyword", + "trigger": "60.3X3.6CHS" + }, + { + "contents": "section NZ2D 60.3X4.5CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 60.3X4.5CHS", + "kind": "keyword", + "trigger": "60.3X4.5CHS" + }, + { + "contents": "section NZ3D 60.3X4.5CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 60.3X4.5CHS", + "kind": "keyword", + "trigger": "60.3X4.5CHS" + }, + { + "contents": "section NZ2D 60.3X5.4CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 60.3X5.4CHS", + "kind": "keyword", + "trigger": "60.3X5.4CHS" + }, + { + "contents": "section NZ3D 60.3X5.4CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 60.3X5.4CHS", + "kind": "keyword", + "trigger": "60.3X5.4CHS" + }, + { + "contents": "section NZ2D 610.0X12.7CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 610.0X12.7CHS", + "kind": "keyword", + "trigger": "610.0X12.7CHS" + }, + { + "contents": "section NZ3D 610.0X12.7CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 610.0X12.7CHS", + "kind": "keyword", + "trigger": "610.0X12.7CHS" + }, + { + "contents": "section NZ2D 610.0X6.4CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 610.0X6.4CHS", + "kind": "keyword", + "trigger": "610.0X6.4CHS" + }, + { + "contents": "section NZ3D 610.0X6.4CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 610.0X6.4CHS", + "kind": "keyword", + "trigger": "610.0X6.4CHS" + }, + { + "contents": "section NZ2D 610.0X9.5CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 610.0X9.5CHS", + "kind": "keyword", + "trigger": "610.0X9.5CHS" + }, + { + "contents": "section NZ3D 610.0X9.5CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 610.0X9.5CHS", + "kind": "keyword", + "trigger": "610.0X9.5CHS" + }, + { + "contents": "section NZ2D 610UB101 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 610UB101", + "kind": "keyword", + "trigger": "610UB101" + }, + { + "contents": "section NZ3D 610UB101 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 610UB101", + "kind": "keyword", + "trigger": "610UB101" + }, + { + "contents": "section NZ2D 610UB113 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 610UB113", + "kind": "keyword", + "trigger": "610UB113" + }, + { + "contents": "section NZ3D 610UB113 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 610UB113", + "kind": "keyword", + "trigger": "610UB113" + }, + { + "contents": "section NZ2D 610UB125 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 610UB125", + "kind": "keyword", + "trigger": "610UB125" + }, + { + "contents": "section NZ3D 610UB125 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 610UB125", + "kind": "keyword", + "trigger": "610UB125" + }, + { + "contents": "section NZ2D 65X2.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 65X2.0SHS", + "kind": "keyword", + "trigger": "65X2.0SHS" + }, + { + "contents": "section NZ3D 65X2.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 65X2.0SHS", + "kind": "keyword", + "trigger": "65X2.0SHS" + }, + { + "contents": "section NZ2D 65X2.5SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 65X2.5SHS", + "kind": "keyword", + "trigger": "65X2.5SHS" + }, + { + "contents": "section NZ3D 65X2.5SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 65X2.5SHS", + "kind": "keyword", + "trigger": "65X2.5SHS" + }, + { + "contents": "section NZ2D 65X3.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 65X3.0SHS", + "kind": "keyword", + "trigger": "65X3.0SHS" + }, + { + "contents": "section NZ3D 65X3.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 65X3.0SHS", + "kind": "keyword", + "trigger": "65X3.0SHS" + }, + { + "contents": "section NZ2D 65X35X2.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 65X35X2.0RHS", + "kind": "keyword", + "trigger": "65X35X2.0RHS" + }, + { + "contents": "section NZ3D 65X35X2.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 65X35X2.0RHS", + "kind": "keyword", + "trigger": "65X35X2.0RHS" + }, + { + "contents": "section NZ2D 65X35X2.5RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 65X35X2.5RHS", + "kind": "keyword", + "trigger": "65X35X2.5RHS" + }, + { + "contents": "section NZ3D 65X35X2.5RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 65X35X2.5RHS", + "kind": "keyword", + "trigger": "65X35X2.5RHS" + }, + { + "contents": "section NZ2D 65X35X3.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 65X35X3.0RHS", + "kind": "keyword", + "trigger": "65X35X3.0RHS" + }, + { + "contents": "section NZ3D 65X35X3.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 65X35X3.0RHS", + "kind": "keyword", + "trigger": "65X35X3.0RHS" + }, + { + "contents": "section NZ2D 700WB115 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 700WB115", + "kind": "keyword", + "trigger": "700WB115" + }, + { + "contents": "section NZ3D 700WB115 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 700WB115", + "kind": "keyword", + "trigger": "700WB115" + }, + { + "contents": "section NZ2D 700WB130 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 700WB130", + "kind": "keyword", + "trigger": "700WB130" + }, + { + "contents": "section NZ3D 700WB130 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 700WB130", + "kind": "keyword", + "trigger": "700WB130" + }, + { + "contents": "section NZ2D 700WB150 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 700WB150", + "kind": "keyword", + "trigger": "700WB150" + }, + { + "contents": "section NZ3D 700WB150 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 700WB150", + "kind": "keyword", + "trigger": "700WB150" + }, + { + "contents": "section NZ2D 700WB173 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 700WB173", + "kind": "keyword", + "trigger": "700WB173" + }, + { + "contents": "section NZ3D 700WB173 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 700WB173", + "kind": "keyword", + "trigger": "700WB173" + }, + { + "contents": "section NZ2D 75X2.5SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 75X2.5SHS", + "kind": "keyword", + "trigger": "75X2.5SHS" + }, + { + "contents": "section NZ3D 75X2.5SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 75X2.5SHS", + "kind": "keyword", + "trigger": "75X2.5SHS" + }, + { + "contents": "section NZ2D 75X25X1.6RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 75X25X1.6RHS", + "kind": "keyword", + "trigger": "75X25X1.6RHS" + }, + { + "contents": "section NZ3D 75X25X1.6RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 75X25X1.6RHS", + "kind": "keyword", + "trigger": "75X25X1.6RHS" + }, + { + "contents": "section NZ2D 75X25X2.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 75X25X2.0RHS", + "kind": "keyword", + "trigger": "75X25X2.0RHS" + }, + { + "contents": "section NZ3D 75X25X2.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 75X25X2.0RHS", + "kind": "keyword", + "trigger": "75X25X2.0RHS" + }, + { + "contents": "section NZ2D 75X25X2.5RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 75X25X2.5RHS", + "kind": "keyword", + "trigger": "75X25X2.5RHS" + }, + { + "contents": "section NZ3D 75X25X2.5RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 75X25X2.5RHS", + "kind": "keyword", + "trigger": "75X25X2.5RHS" + }, + { + "contents": "section NZ2D 75X3.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 75X3.0SHS", + "kind": "keyword", + "trigger": "75X3.0SHS" + }, + { + "contents": "section NZ3D 75X3.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 75X3.0SHS", + "kind": "keyword", + "trigger": "75X3.0SHS" + }, + { + "contents": "section NZ2D 75X3.5SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 75X3.5SHS", + "kind": "keyword", + "trigger": "75X3.5SHS" + }, + { + "contents": "section NZ3D 75X3.5SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 75X3.5SHS", + "kind": "keyword", + "trigger": "75X3.5SHS" + }, + { + "contents": "section NZ2D 75X4.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 75X4.0SHS", + "kind": "keyword", + "trigger": "75X4.0SHS" + }, + { + "contents": "section NZ3D 75X4.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 75X4.0SHS", + "kind": "keyword", + "trigger": "75X4.0SHS" + }, + { + "contents": "section NZ2D 75X5.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 75X5.0SHS", + "kind": "keyword", + "trigger": "75X5.0SHS" + }, + { + "contents": "section NZ3D 75X5.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 75X5.0SHS", + "kind": "keyword", + "trigger": "75X5.0SHS" + }, + { + "contents": "section NZ2D 75X50X2.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 75X50X2.0RHS", + "kind": "keyword", + "trigger": "75X50X2.0RHS" + }, + { + "contents": "section NZ3D 75X50X2.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 75X50X2.0RHS", + "kind": "keyword", + "trigger": "75X50X2.0RHS" + }, + { + "contents": "section NZ2D 75X50X2.5RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 75X50X2.5RHS", + "kind": "keyword", + "trigger": "75X50X2.5RHS" + }, + { + "contents": "section NZ3D 75X50X2.5RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 75X50X2.5RHS", + "kind": "keyword", + "trigger": "75X50X2.5RHS" + }, + { + "contents": "section NZ2D 75X50X3.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 75X50X3.0RHS", + "kind": "keyword", + "trigger": "75X50X3.0RHS" + }, + { + "contents": "section NZ3D 75X50X3.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 75X50X3.0RHS", + "kind": "keyword", + "trigger": "75X50X3.0RHS" + }, + { + "contents": "section NZ2D 75X50X4.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 75X50X4.0RHS", + "kind": "keyword", + "trigger": "75X50X4.0RHS" + }, + { + "contents": "section NZ3D 75X50X4.0RHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 75X50X4.0RHS", + "kind": "keyword", + "trigger": "75X50X4.0RHS" + }, + { + "contents": "section NZ2D 75X6.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 75X6.0SHS", + "kind": "keyword", + "trigger": "75X6.0SHS" + }, + { + "contents": "section NZ3D 75X6.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 75X6.0SHS", + "kind": "keyword", + "trigger": "75X6.0SHS" + }, + { + "contents": "section NZ2D 76.1X2.3CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 76.1X2.3CHS", + "kind": "keyword", + "trigger": "76.1X2.3CHS" + }, + { + "contents": "section NZ3D 76.1X2.3CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 76.1X2.3CHS", + "kind": "keyword", + "trigger": "76.1X2.3CHS" + }, + { + "contents": "section NZ2D 76.1X3.2CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 76.1X3.2CHS", + "kind": "keyword", + "trigger": "76.1X3.2CHS" + }, + { + "contents": "section NZ3D 76.1X3.2CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 76.1X3.2CHS", + "kind": "keyword", + "trigger": "76.1X3.2CHS" + }, + { + "contents": "section NZ2D 76.1X3.6CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 76.1X3.6CHS", + "kind": "keyword", + "trigger": "76.1X3.6CHS" + }, + { + "contents": "section NZ3D 76.1X3.6CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 76.1X3.6CHS", + "kind": "keyword", + "trigger": "76.1X3.6CHS" + }, + { + "contents": "section NZ2D 76.1X4.5CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 76.1X4.5CHS", + "kind": "keyword", + "trigger": "76.1X4.5CHS" + }, + { + "contents": "section NZ3D 76.1X4.5CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 76.1X4.5CHS", + "kind": "keyword", + "trigger": "76.1X4.5CHS" + }, + { + "contents": "section NZ2D 76.1X5.9CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 76.1X5.9CHS", + "kind": "keyword", + "trigger": "76.1X5.9CHS" + }, + { + "contents": "section NZ3D 76.1X5.9CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 76.1X5.9CHS", + "kind": "keyword", + "trigger": "76.1X5.9CHS" + }, + { + "contents": "section NZ2D 800WB122 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 800WB122", + "kind": "keyword", + "trigger": "800WB122" + }, + { + "contents": "section NZ3D 800WB122 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 800WB122", + "kind": "keyword", + "trigger": "800WB122" + }, + { + "contents": "section NZ2D 800WB146 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 800WB146", + "kind": "keyword", + "trigger": "800WB146" + }, + { + "contents": "section NZ3D 800WB146 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 800WB146", + "kind": "keyword", + "trigger": "800WB146" + }, + { + "contents": "section NZ2D 800WB168 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 800WB168", + "kind": "keyword", + "trigger": "800WB168" + }, + { + "contents": "section NZ3D 800WB168 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 800WB168", + "kind": "keyword", + "trigger": "800WB168" + }, + { + "contents": "section NZ2D 800WB192 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 800WB192", + "kind": "keyword", + "trigger": "800WB192" + }, + { + "contents": "section NZ3D 800WB192 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 800WB192", + "kind": "keyword", + "trigger": "800WB192" + }, + { + "contents": "section NZ2D 88.9X2.6CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 88.9X2.6CHS", + "kind": "keyword", + "trigger": "88.9X2.6CHS" + }, + { + "contents": "section NZ3D 88.9X2.6CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 88.9X2.6CHS", + "kind": "keyword", + "trigger": "88.9X2.6CHS" + }, + { + "contents": "section NZ2D 88.9X3.2CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 88.9X3.2CHS", + "kind": "keyword", + "trigger": "88.9X3.2CHS" + }, + { + "contents": "section NZ3D 88.9X3.2CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 88.9X3.2CHS", + "kind": "keyword", + "trigger": "88.9X3.2CHS" + }, + { + "contents": "section NZ2D 88.9X4.0CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 88.9X4.0CHS", + "kind": "keyword", + "trigger": "88.9X4.0CHS" + }, + { + "contents": "section NZ3D 88.9X4.0CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 88.9X4.0CHS", + "kind": "keyword", + "trigger": "88.9X4.0CHS" + }, + { + "contents": "section NZ2D 88.9X4.8CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 88.9X4.8CHS", + "kind": "keyword", + "trigger": "88.9X4.8CHS" + }, + { + "contents": "section NZ3D 88.9X4.8CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 88.9X4.8CHS", + "kind": "keyword", + "trigger": "88.9X4.8CHS" + }, + { + "contents": "section NZ2D 88.9X5.0CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 88.9X5.0CHS", + "kind": "keyword", + "trigger": "88.9X5.0CHS" + }, + { + "contents": "section NZ3D 88.9X5.0CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 88.9X5.0CHS", + "kind": "keyword", + "trigger": "88.9X5.0CHS" + }, + { + "contents": "section NZ2D 88.9X5.5CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 88.9X5.5CHS", + "kind": "keyword", + "trigger": "88.9X5.5CHS" + }, + { + "contents": "section NZ3D 88.9X5.5CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 88.9X5.5CHS", + "kind": "keyword", + "trigger": "88.9X5.5CHS" + }, + { + "contents": "section NZ2D 88.9X5.9CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 88.9X5.9CHS", + "kind": "keyword", + "trigger": "88.9X5.9CHS" + }, + { + "contents": "section NZ3D 88.9X5.9CHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 88.9X5.9CHS", + "kind": "keyword", + "trigger": "88.9X5.9CHS" + }, + { + "contents": "section NZ2D 89X3.5SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 89X3.5SHS", + "kind": "keyword", + "trigger": "89X3.5SHS" + }, + { + "contents": "section NZ3D 89X3.5SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 89X3.5SHS", + "kind": "keyword", + "trigger": "89X3.5SHS" + }, + { + "contents": "section NZ2D 89X5.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 89X5.0SHS", + "kind": "keyword", + "trigger": "89X5.0SHS" + }, + { + "contents": "section NZ3D 89X5.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 89X5.0SHS", + "kind": "keyword", + "trigger": "89X5.0SHS" + }, + { + "contents": "section NZ2D 89X6.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 89X6.0SHS", + "kind": "keyword", + "trigger": "89X6.0SHS" + }, + { + "contents": "section NZ3D 89X6.0SHS ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 89X6.0SHS", + "kind": "keyword", + "trigger": "89X6.0SHS" + }, + { + "contents": "section NZ2D 900WB175 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 900WB175", + "kind": "keyword", + "trigger": "900WB175" + }, + { + "contents": "section NZ3D 900WB175 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 900WB175", + "kind": "keyword", + "trigger": "900WB175" + }, + { + "contents": "section NZ2D 900WB218 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 900WB218", + "kind": "keyword", + "trigger": "900WB218" + }, + { + "contents": "section NZ3D 900WB218 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 900WB218", + "kind": "keyword", + "trigger": "900WB218" + }, + { + "contents": "section NZ2D 900WB257 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 900WB257", + "kind": "keyword", + "trigger": "900WB257" + }, + { + "contents": "section NZ3D 900WB257 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 900WB257", + "kind": "keyword", + "trigger": "900WB257" + }, + { + "contents": "section NZ2D 900WB282 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "NZ 2D Section 900WB282", + "kind": "keyword", + "trigger": "900WB282" + }, + { + "contents": "section NZ3D 900WB282 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "NZ 3D Section 900WB282", + "kind": "keyword", + "trigger": "900WB282" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "AFC" + }, + { + "contents": "material AFC01 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:(6)} ${7:(7)} ${8:(8)}\n# (1) int, unique tag\n# (2) double, elastic modulus\n# (3) double, tension yield stress\n# (4) double, tension hardening modulus\n# (5) double, tension unloading modulus\n# (6) double, compression yield stress\n# (7) double, compression hardening modulus\n# (8) double, compression unloading modulus", + "details": "Asymmetrical Friction Connection", + "kind": "type", + "trigger": "AFC01" + }, + { + "contents": "material AFC02 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)}\n# (1) int, unique tag\n# (2) double, elastic modulus\n# (3) double, yield stress\n# (4) double, hardening modulus\n# (5) double, unloading modulus", + "details": "Symmetrical Friction Connection", + "kind": "type", + "trigger": "AFC02" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "AFC03" + }, + { + "contents": "material AFCN ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:(6)} ${7:(7)} ${8:(8)} ${9:[9]} ${10:[10]}\n# (1) int, unique tag\n# (2) double, elastic modulus\n# (3) double, tension yield stress\n# (4) double, tension hardening modulus\n# (5) double, tension unloading modulus\n# (6) double, compression yield stress\n# (7) double, compression hardening modulus\n# (8) double, compression unloading modulus\n# [9] double, non-negative degradation paramater, default: 0.0\n# [10] double, density, default: 0.0", + "details": "Nonlinear Version of AFC", + "kind": "type", + "trigger": "AFCN" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "AFCS" + }, + { + "contents": "converger AbsDisp ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]}\n# (2) int, unique tag\n# (3) double, tolerance\n# (4) int, maximum iteration\n# [5] bool string, print switch, default: false\n", + "details": "Converger AbsDisp", + "kind": "type", + "trigger": "AbsDisp" + }, + { + "contents": "converger AbsError ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]}\n# (2) int, unique tag\n# (3) double, tolerance\n# (4) int, maximum iteration\n# [5] bool string, print switch, default: false\n", + "details": "Converger AbsError", + "kind": "type", + "trigger": "AbsError" + }, + { + "contents": "converger AbsIncreAcc ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]}\n# (2) int, unique tag\n# (3) double, tolerance\n# (4) int, maximum iteration\n# [5] bool string, print switch, default: false\n", + "details": "Converger AbsIncreAcc", + "kind": "type", + "trigger": "AbsIncreAcc" + }, + { + "contents": "converger AbsIncreDisp ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]}\n# (2) int, unique tag\n# (3) double, tolerance\n# (4) int, maximum iteration\n# [5] bool string, print switch, default: false\n", + "details": "Converger AbsIncreDisp", + "kind": "type", + "trigger": "AbsIncreDisp" + }, + { + "contents": "converger AbsIncreEnergy ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]}\n# (2) int, unique tag\n# (3) double, tolerance\n# (4) int, maximum iteration\n# [5] bool string, print switch, default: false\n", + "details": "Converger AbsIncreEnergy", + "kind": "type", + "trigger": "AbsIncreEnergy" + }, + { + "contents": "converger AbsResidual ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]}\n# (2) int, unique tag\n# (3) double, tolerance\n# (4) int, maximum iteration\n# [5] bool string, print switch, default: false\n", + "details": "Converger AbsResidual", + "kind": "type", + "trigger": "AbsResidual" + }, + { + "contents": "element Allman ${1:(1)} ${2:(2...4)} ${5:(5)} ${6:[6]}\n# (1) int, unique element tag\n# (2...4) int, node i, j, k\n# (5) int, material tag\n# [6] double, element thickness, default: 1.0", + "details": "Allman\u2019s Triangle With Drilling DoFs", + "kind": "type", + "trigger": "Allman" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "ArcLength" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "ArmstrongFrederick" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "ArmstrongFrederick1D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Axisymmetric" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "AxisymmetricElastic" + }, + { + "contents": "element B21 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:[5]} ${6:[6]}\n# (1) int, unique element tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, section tag\n# [5] int, number of integration points, default: 6\n# [6] bool string, nonlinear geometry switch, default: false", + "details": "2D Displacement Based Bernoulli Beam", + "kind": "type", + "trigger": "B21" + }, + { + "contents": "element B21EH ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:[5]} ${6:[6]}\n# (1) int, unique element tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, section tag\n# [5] int, number of integration points, default: 6\n# [6] bool string, nonlinear geometry switch, default: false", + "details": "2D Displacement Based Bernoulli Beam With End Moment Release", + "kind": "type", + "trigger": "B21EH" + }, + { + "contents": "element B21EL ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:[5]} ${6:[6]}\n# (1) int, unique element tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, section tag\n# [5] int, number of integration points, default: 6\n# [6] bool string, nonlinear geometry switch, default: false", + "details": "2D Displacement Based Bernoulli Beam With End Moment Release", + "kind": "type", + "trigger": "B21EL" + }, + { + "contents": "element B21H ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:[5]} ${6:[6]}\n# (1) int, unique element tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, section tag\n# [5] double, normalized length of each end hinge, default: 0.2 \n# [6] bool string, nonlinear geometry switch, default: false", + "details": "2D Displacement Based Bernoulli Beam with Lumped End Hinges", + "kind": "type", + "trigger": "B21H" + }, + { + "contents": "element B31 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:[6]} ${7:[7]}\n# (1) int, unique element tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, section tag\n# (5) int, orientation tag\n# [6] int, number of integration points, default: 5\n# [7] bool string, nonlinear geometry switch, default: false", + "details": "3D Displacement Based Bernoulli Beam", + "kind": "type", + "trigger": "B31" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "B3DL" + }, + { + "contents": "set system_solver BICGSTAB", + "details": "Use BICGSTAB Solver", + "kind": "type", + "trigger": "BICGSTAB" + }, + { + "contents": "material BWBN ${1:(1)} ${2:[2...18]}\n# (1) int, unique material tag\n# [2] double, elastic modulus, default: 2E5\n# [3] double, yield stress, default: 4E2\n# [4] double, hardening ratio, default: 1E-2\n# [5] double, beta (>0), default: 0.5\n# [6] double, exponent n (>0, normally >=1), default: 1.0\n# [7] double, initial \nu (>0), default: 1.0\n# [8] double, slope of \nu (>0), default: 0.0\n# [9] double, initial eta (>0), default: 1.0\n# [10] double, slope of eta (>0), default: 0.0\n# [11] double, initial phi (>0), default: 1.0\n# [12] double, slope of phi (>0), default: 0.0\n# [13] double, zeta ${1>zeta>0:(1>zeta>0)}, default: 0.0\n# [14] double, slope of A (>0), default: 0.0\n# [15] double, p (>0), default: 0.0\n# [16] double, q (>0), default: 0.0\n# [17] double, lambda (>0), default: 1.0\n# [18] double, density, default: 0.0", + "details": "Bouc-Wen-Baber-Noori Model", + "kind": "type", + "trigger": "BWBN" + }, + { + "contents": "section Bar2D ${1:(1)} ${2:(2)} ${3:(3)} ${4:[4]}\n# (1) int, unique section tag\n# (2) double, area\n# (3) int, material tag\n# [4] double, eccentricity, default: 0.0", + "details": "2D Reinforcing Bar Section", + "kind": "type", + "trigger": "Bar2D" + }, + { + "contents": "section Bar3D ${1:(1)} ${2:(2)} ${3:(3)} ${4:[4]} ${5:[5]}\n# (1) int, unique section tag\n# (2) double, area\n# (3) int, material tag\n# [4] double, eccentricity along y axis, default: 0.0\n# [5] double, eccentricity along z axis, default: 0.0", + "details": "3D Reinforcing Bar Section", + "kind": "type", + "trigger": "Bar3D" + }, + { + "contents": "integrator BatheExplicit ${1:(1)} ${2:(2)}\n# (1) int, unique integrator tag\n# [2] double, spectral radius, default: 0.5", + "details": "", + "kind": "type", + "trigger": "BatheExplicit" + }, + { + "contents": "integrator BatheTwoStep ${1:(1)} ${2:(2)} ${3:(3)}\n# (1) int, unique integrator tag\n# [2] double, spectral radius, default: 0\n# [3] double, sub-step size, default: 0.5", + "details": "", + "kind": "type", + "trigger": "BatheTwoStep" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Bilinear1D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Bilinear2D" + }, + { + "contents": "material BilinearCC ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:(6)} ${7:(7)} ${8:(8)} ${9:[9]}\n# (1) int, unique material tag\n# (2) double, elastic modulus\n# (3) double, poissons ratio\n# (4) double, beta, controls compression side shape\n# (5) double, m, slope of CSL\n# (6) double, p_t, initial tension strength\n# (7) double, a_0, initial a_0\n# (8) double, H\n# [9] double, density, default: 0.0", + "details": "Cam-Clay model with bilinear hardening model", + "kind": "type", + "trigger": "BilinearCC" + }, + { + "contents": "material CustomCC ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:(6)} ${7:(7)} ${8:[8]}\n# (1) int, unique material tag\n# (2) double, elastic modulus\n# (3) double, poissons ratio\n# (4) double, beta, controls compression side shape\n# (5) double, m, slope of CSL\n# (6) double, p_t, initial tension strength\n# (7) int, hardening expression tag\n# [8] double, density, default: 0.0", + "details": "Cam-Clay model with custom hardening function", + "kind": "type", + "trigger": "CustomCC" + }, + { + "contents": "material BilinearDP ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:(6)} ${7:(7)} ${8:(8)} ${9:[9]}\n# (1) int, unique material tag\n# (2) double, elastic modulus\n# (3) double, poissons ratio\n# (4) double, \eta_y\n# (5) double, \eta_f\n# (6) double, \xi\n# (7) double, cohesion\n# (8) double, hardening ratio\n# [9] double, density, default: 0.0", + "details": "DP model with bilinear hardening function", + "kind": "type", + "trigger": "BilinearDP" + }, + { + "contents": "material BilinearElastic1D ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:[5]}\n# (1) int, unique material tag\n# (2) double, elastic modulus\n# (3) double, yield stress\n# (4) double, hardening modulus\n# [5] double, density, default: 0.0", + "details": "Uniaxial Bilinear Elastic Material", + "kind": "type", + "trigger": "BilinearElastic1D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "BilinearHoffman" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "BilinearJ2" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "BilinearMises1D" + }, + { + "contents": "material BilinearOO ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:(6)} ${7:[7]}\n# (1) int, unique material tag\n# (2) double, elastic modulus\n# (3) double, tension yield strain\n# (4) double, tension hardening ratio\n# (5) double, compression yield strain\n# (6) double, compression hardening ratio\n# [7] double, density, default: 0.0", + "details": "Bilinear Origin Oriented Model", + "kind": "type", + "trigger": "BilinearOO" + }, + { + "contents": "material BilinearPO ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:(6)} ${7:[7]}\n# (1) int, unique material tag\n# (2) double, elastic modulus\n# (3) double, tension yield strain\n# (4) double, tension hardening ratio\n# (5) double, compression yield strain\n# (6) double, compression hardening ratio\n# [7] double, density, default: 0.0", + "details": "Bilinear Peak Oriented Model", + "kind": "type", + "trigger": "BilinearPO" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "BilinearPeric" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "BilinearViscosity" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "BlatzKo" + }, + { + "contents": "material BoucWen ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:(6)}\n# (1) int, unique material tag\n# (2) double, elastic modulus\n# (3) double, yield stress\n# (4) double, hardening ratio\n# (5) double, beta, a positive parameter\n# (6) double, n, a positive exponent", + "details": "Bouc-Wen Model", + "kind": "type", + "trigger": "BouncWen" + }, + { + "contents": "section Box2D ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:[6]} ${7:[7]}\n# (1) int, unique section tag\n# (2) double, width\n# (3) double, height\n# (4) double, thickness\n# (5) int, material tag\n# [6] int, number of integration points, default: 6\n# [7] double, eccentricity, default: 0.0", + "details": "2D Box Section", + "kind": "type", + "trigger": "Box2D" + }, + { + "contents": "section Box3D ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:[6]} ${7:[7]} ${8:[8]}\n# (1) int, unique section tag\n# (2) double, width\n# (3) double, height\n# (4) double, thickness\n# (5) int, material tag\n# [6] int, number of integration points, default: 3\n# [7] double, eccentricity along y axis, default: 0.0\n# [8] double, eccentricity along z axis, default: 0.0", + "details": "3D Box Section", + "kind": "type", + "trigger": "Box3D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Buckle" + }, + { + "contents": "element C3D20 ${1:(1)} ${2:(2...21)} ${22:(22)} ${23:[23]} ${24:[24]}\n# (1) int, unique element tag\n# (2...21) int, eight corner nodes with conventional order\n# (22) int, material tag\n# [23] bool string, reduced integration scheme switch, default: true\n# [24] bool string, nonlinear geometry switch, default: false", + "details": "Second Order Cube/Brick", + "kind": "type", + "trigger": "C3D20" + }, + { + "contents": "element C3D4 ${1:(1)} ${2:(2...5)} ${6:(6)} ${7:[7]}\n# (1) int, unique element tag\n# (2...5) int, four corner nodes with conventional order\n# (6) int, material tag\n# [7] bool string, nonlinear geometry switch, default: false", + "details": "Linear Tetrahedral", + "kind": "type", + "trigger": "C3D4" + }, + { + "contents": "element C3D8 ${1:(1)} ${2:(2...9)} ${10:(10)} ${11:[11]} ${12:[12]}\n# (1) int, unique element tag\n# (2...9) int, eight corner nodes with conventional order\n# (10) int, material tag\n# [11] string, integration scheme, default: 'I'\n# [12] bool string, nonlinear geometry switch, default: false", + "details": "Linear Cube/Brick", + "kind": "type", + "trigger": "C3D8" + }, + { + "contents": "element C3D8I ${1:(1)} ${2:(2...9)} ${10:(10)}\n# (1) int, unique element tag\n# (2...9) int, eight corner nodes with conventional order\n# (10) int, material tag", + "details": "Linear Cube/Brick with Incompatible Modes", + "kind": "type", + "trigger": "C3D8I" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "C3D8R" + }, + { + "contents": "element CAX3 ${1:(1)} ${2:(2...4)} ${5:(5)} ${6:[6]}\n# (1) int, unique element tag\n# (2...4) int, node tags\n# (5) int, material tag\n# [6] bool string, nonlinear geometry switch, default: false", + "details": "Axisymmetric Linear Triangle", + "kind": "type", + "trigger": "CAX3" + }, + { + "contents": "element CAX4 ${1:(1)} ${2:(2...5)} ${6:(6)}\n# (1) int, unique element tag\n# (2...5) int, node i, j, k, l\n# (6) int, material tag", + "details": "Axisymmetric Linear Quadrilateral", + "kind": "type", + "trigger": "CAX4" + }, + { + "contents": "element CAX8 ${1:(1)} ${2:(2...9)} ${10:(10)}\n# (1) int, unique element tag\n# (2...9) int, node tags\n# (10) int, material tag", + "details": "Axisymmetric Quadratic Quadrilateral", + "kind": "type", + "trigger": "CAX8" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "CDP" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "CDPM2" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "CDPM2ANISO" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "CDPM2ISO" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "CDPM2NO" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "CIN3D8" + }, + { + "contents": "", + "details": "Linear Infinite Cube/Brick", + "kind": "type", + "trigger": "CIN3D8" + }, + { + "contents": "element CINP4 ${1:(1)} ${2:(2...5)} ${6:(6)} ${7:[7]}\n# (1) int, unique element tag\n# (2...5) int, node i, j, k, l\n# (6) int, material tag\n# [7] double, element thickness, default: 1.0", + "details": "Bilinear Infinite Quadrilateral", + "kind": "type", + "trigger": "CINP4" + }, + { + "contents": "element CP3 ${1:(1)} ${2:(2...4)} ${5:(5)} ${6:[6]} ${7:[7]}\n# (1) int, unique element tag\n# (2...4) int, node i, j, k\n# (5) int, material tag\n# [6] double, element thickness, default: 1.0\n# [7] bool string, nonlinear geometry switch, default: false", + "details": "Constant Strain Triangle", + "kind": "type", + "trigger": "CP3" + }, + { + "contents": "element CP4 ${1:(1)} ${2:(2...5)} ${6:(6)} ${7:[7]} ${8:[8]} ${9:[9]}\n# (1) int, unique element tag\n# (2...5) int, node i, j, k, l\n# (6) int, material tag\n# [7] double, element thickness, default: 1.0\n# [8] bool string, reduced integration switch, default: false\n# [9] bool string, nonlinear geometry switch, default: false", + "details": "Bilinear Quadrilateral", + "kind": "type", + "trigger": "CP4" + }, + { + "contents": "element CP4I ${1:(1)} ${2:(2...5)} ${6:(6)} ${7:[7]}\n# (1) int, unique element tag\n# (2...5) int, node i, j, k, l\n# (6) int, material tag\n# [7] double, element thickness, default: 1.0", + "details": "Bilinear Incompatible Quadrilateral", + "kind": "type", + "trigger": "CP4I" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "CP4R" + }, + { + "contents": "element CP5 ${1:(1)} ${2:(2...6)} ${7:(7)} ${8:[8]} ${9:[9]}\n# (1) int, unique element tag\n# (2...6) int, node tags that define the element\n# (7) int, material tag\n# [8] double, element thickness, default: 1.0\n# [9] bool string, nonlinear geometry switch, default: false", + "details": "Five-Point Quadrilateral", + "kind": "type", + "trigger": "CP5" + }, + { + "contents": "element CP6 ${1:(1)} ${2:(2...7)} ${8:(8)} ${9:[9]} ${10:[10]}\n# (1) int, unique element tag\n# (2...7) int, node tags that define the element\n# (8) int, material tag\n# [9] double, element thickness, default: 1.0\n# [10] bool string, nonlinear geometry switch, default: false", + "details": "Quadratic Triangle", + "kind": "type", + "trigger": "CP6" + }, + { + "contents": "element CP7 ${1:(1)} ${2:(2...8)} ${9:(9)} ${10:[10]} ${11:[11]}\n# (1) int, unique element tag\n# (2...8) int, node tags that define the element\n# (9) int, material tag\n# [10] double, element thickness, default: 1.0\n# [11] bool string, nonlinear geometry switch, default: false", + "details": "Seven-Point Quadrilateral", + "kind": "type", + "trigger": "CP7" + }, + { + "contents": "element CP8 ${1:(1)} ${2:(2...9)} ${10:(10)} ${11:[11]} ${12:[12]} ${13:[13]}\n# (1) int, unique element tag\n# (2...9) int, node 1 to node 8\n# (10) int, material tag\n# [11] double, element thickness, default: 1.0\n# [12] bool string, reduced integration switch, default: false\n# [13] bool string, nonlinear geometry switch, default: false", + "details": "Second Order Quadrilateral", + "kind": "type", + "trigger": "CP8" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "CPE8" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "CPE8R" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "CPS8" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "CSMQ4" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "CSMQ5" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "CSMQ6" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "CSMQ7" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "CSMQ8" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "CSMT3" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "CSMT6" + }, + { + "contents": "set system_solver CUDA", + "details": "Use CUDA Solver", + "kind": "type", + "trigger": "CUDA" + }, + { + "contents": "section Circle1D ${1:(1)} ${2:(2)} ${3:(3)}\n# (1) int, unique section tag\n# (2) double, radius\n# (3) int, material tag", + "details": "1D Circle Section", + "kind": "type", + "trigger": "Circle1D" + }, + { + "contents": "section Circle2D ${1:(1)} ${2:(2)} ${3:(3)} ${4:[4]} ${5:[5]}\n# (1) int, unique section tag\n# (2) double, radius\n# (3) int, material tag\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0", + "details": "2D Circle Section", + "kind": "type", + "trigger": "Circle2D" + }, + { + "contents": "section Circle3D ${1:(1)} ${2:(2)} ${3:(3)} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique section tag\n# (2) double, radius\n# (3) int, material tag\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity along y axis, default: 0.0\n# [6] double, eccentricity along z axis, default: 0.0", + "details": "3D Circle Section", + "kind": "type", + "trigger": "Circle3D" + }, + { + "contents": "section CircularHollow3D ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:[5]} ${6:[6]} ${7:[7]}\n# (1) int, unique section tag\n# (2) double, radius\n# (3) double, thickness\n# (4) int, material tag\n# [5] int, number of integration points, default: 10\n# [6] double, eccentricity along y axis, default: 0.0\n# [7] double, eccentricity along z axis, default: 0.0", + "details": "3D Hollow Circle Section", + "kind": "type", + "trigger": "CircleHollow3D" + }, + { + "contents": "section CircularHollow2D ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:[5]} ${6:[6]}\n# (1) int, unique section tag\n# (2) double, radius\n# (3) double, thickness\n# (4) int, material tag\n# [5] int, number of integration points, default: 10\n# [6] double, eccentricity, default: 0.0", + "details": "2D Hollow Circular Section", + "kind": "type", + "trigger": "CircularHollow2D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "CircularHollow3D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Combine" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Concrete21" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Concrete22" + }, + { + "contents": "material ConcreteCM ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:(6)} ${7:[7]} ${8:[8]} ${9:[9]} ${10:[10]}\n# (1) int, unique material tag\n# (2) double, elastic modulus\n# (3) double, compression strength, should be negative but sign insensitive\n# (4) double, tension strength, should be positive but sign insensitive\n# (5) double, NC\n# (6) double, NT\n# [7] double, strain at compression strength, default: -2E-3\n# [8] double, strain at tension strength, default: 1E-4\n# [9] bool string, linear transition switch, default: false\n# [10] double, density, default: 0.0", + "details": "Chang-Mander Concrete Model", + "kind": "type", + "trigger": "ConcreteCM" + }, + { + "contents": "material ConcreteExp ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:(6)} ${7:(7)} ${8:(8)} ${9:[9]} ${10:[10]}\n# (1) int, unique tag\n# (2) double, elastic modulus\n# (3) double, f_t\n# (4) double, a_t\n# (5) double, g_t\n# (6) double, f_{c,m}\n# (7) double, a_c\n# (8) double, g_c\n# [9] double, middle point, default: 0.2\n# [10] double, density, default: 0.0", + "details": "Objective Concrete Model", + "kind": "type", + "trigger": "ConcreteExp" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "ConcreteTable" + }, + { + "contents": "material ConcreteTsai ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:(6)} ${7:(7)} ${8:[8]} ${9:[9]} ${10:[10]} ${11:[11]}\n# (1) int, unique material tag\n# (2) double, compression strength, should be negative but sign insensitive\n# (3) double, tension strength, should be positive but sign insensitive\n# (4) double, MC\n# (5) double, NC\n# (6) double, MT\n# (7) double, NT\n# [8] double, strain at compression strength, default: -2E-3\n# [9] double, strain at tension strength, default: 1E-4\n# [10] double, middle point, default: 0.2\n# [11] double, density, default: 0.0", + "details": "Uniaxial Concrete Model Using Tsai's Equation", + "kind": "type", + "trigger": "ConcreteTsai" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Constant" + }, + { + "contents": "element Contact2D ${1:(1)} ${2:(2)} ${3:(3)} ${4:[4]}\n# (1) int, unique element tag\n# (2) int, master group tag\n# (3) int, slave group tag\n# [4] double, penalty factor", + "details": "2D Node${Slave:(Slave)}-Line${Master:(Master)} Contact Element", + "kind": "type", + "trigger": "Contact2D" + }, + { + "contents": "element Contact3D ${1:(1)} ${2:(2)} ${3:(3)} ${4:[4]}\n# (1) int, unique element tag\n# (2) int, master group tag\n# (3) int, slave group tag\n# [4] double, penalty factor", + "details": "3D Node${Slave:(Slave)}-Triangular Facet${Master:(Master)} Contact Element", + "kind": "type", + "trigger": "Contact3D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Cosine" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "CoulombFriction" + }, + { + "contents": "element CustomElastic1D ${1:(1)} ${2:(2)} ${3:[3]}\n# (1) int, unique element tag\n# (2) int, expression tag\n# (3) double, density, default: 0", + "details": "", + "kind": "type", + "trigger": "CustomElastic1D" + }, + { + "contents": "element CustomMises1D ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:[5]}\n# (1) int, unique element tag\n# (2) double, elastic modulus\n# (3) int, isotropic hardening expression tag\n# (4) int, kinematic hardening expression tag\n# (5) double, density, default: 0", + "details": "", + "kind": "type", + "trigger": "CustomMises1D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "DC3D4" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "DC3D4" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "DC3D8" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "DC3D8" + }, + { + "contents": "element DCP3 ${1:(1)} ${2:(2...4)} ${5:(5)} ${6:(6)} ${7:(7)} ${8:[8]}\n# (1) int, unique element tag\n# (2...4) int, node i, j, k\n# (5) int, material tag\n# (6) double, characteristic length\n# (7) double, energy release rate\n# [8] double, element thickness, default: 1.0", + "details": "Constant Strain Triangle With Crack Phase", + "kind": "type", + "trigger": "DCP3" + }, + { + "contents": "element DCP4 ${1:(1)} ${2:(2...5)} ${6:(6)} ${7:(7)} ${8:(8)} ${9:[9]}\n# (1) int, unique element tag\n# (2...5) int, node i, j, k, l\n# (6) int, material tag\n# (7) double, characteristic length\n# (8) double, energy release rate\n# [9] double, element thickness, default: 1.0", + "details": "Bilinear Quadrilateral With Crack Phase", + "kind": "type", + "trigger": "DCP4" + }, + { + "contents": "element DKT3 ${1:(1)} ${2:(2...4)} ${5:(5)} ${6:(6)} ${7:[7]}\n# (1) int, unique element tag\n# (2...4) int, node i, j, k\n# (5) int, material tag\n# (6) double, thickness\n# [7] int, numer of integration points, default: 3", + "details": "DKT Triangle Plate", + "kind": "type", + "trigger": "DKT3" + }, + { + "contents": "element DKT4 ${1:(1)} ${2:(2...5)} ${6:(6)} ${7:(7)} ${8:[8]}\n# (1) int, unique element tag\n# (2...5) int, node i, j, k, l\n# (6) int, material tag\n# (7) double, thickness\n# [8] int, numer of integration points along thickness, default: 3", + "details": "DKT Quadrilateral Plate", + "kind": "type", + "trigger": "DKT4" + }, + { + "contents": "element DKTS3 ${1:(1)} ${2:(2...4)} ${5:(5)} ${6:(6)} ${7:[7]}\n# (1) int, unique element tag\n# (2...4) int, node i, j, k\n# (5) int, material tag\n# (6) double, thickness\n# [7] int, numer of integration points, default: 3", + "details": "DKT Triangle Shell", + "kind": "type", + "trigger": "DKTS3" + }, + { + "contents": "element DKTS4 ${1:(1)} ${2:(2...5)} ${6:(6)} ${7:(7)} ${8:[8]}\n# (1) int, unique element tag\n# (2...5) int, node i, j, k, l\n# (6) int, material tag\n# (7) double, thickness\n# [8] int, numer of integration points, default: 3", + "details": "DKT Quadrilateral Shell", + "kind": "type", + "trigger": "DKTS4" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "DafaliasManzari" + }, + { + "contents": "element Damper01 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)}\n# (1) int, unique tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, material tag of associated viscosity material", + "details": "2D Viscous Damper", + "kind": "type", + "trigger": "Damper01" + }, + { + "contents": "element Damper02 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:[6]} ${7:[7]} ${8:[8]}\n# (1) int, unique tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, damper tag\n# (5) int, spring tag\n# [6] bool string, if to use matrix in iteration, default: true\n# [7] int, the maximum delay number, default: 0\n# [8] double, beta, default: 0.5", + "details": "2D Maxwell Model", + "kind": "type", + "trigger": "Damper02" + }, + { + "contents": "element Damper03 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)}\n# (1) int, unique tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, material tag of associated viscosity material", + "details": "3D Viscous Damper", + "kind": "type", + "trigger": "Damper03" + }, + { + "contents": "element Damper04 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:[6]} ${7:[7]} ${8:[8]}\n# (1) int, unique tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, damper tag\n# (5) int, spring tag\n# [6] bool string, if to use matrix in iteration, default: true\n# [7] int, the maximum delay number, default: 0\n# [8] double, beta, default: 0.5", + "details": "3D Maxwell Model", + "kind": "type", + "trigger": "Damper04" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Damping" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Decay" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Dhakal" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Dynamic" + }, + { + "contents": "element EB21 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:(6)} ${7:[7]}\n# (1) int, unique element tag\n# (2) int, node i\n# (3) int, node j\n# (4) double, area\n# (5) double, moment inertia\n# (6) int, material tag\n# [7] bool string, nonlinear geometry switch, default: false", + "details": "2D Elastic Bernoulli Beam", + "kind": "type", + "trigger": "EB21" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "EU2D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "EU3D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Eigen" + }, + { + "contents": "material Elastic1D ${1:(1)} ${2:(2)} ${3:[3]}\n# (1) int, unique material tag\n# (2) double, elastic modulus\n# [3] double, density, default: 0.0", + "details": "Uniaxial Elastic Material", + "kind": "type", + "trigger": "Elastic1D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Elastic2D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Elastic3D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Element" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "ElementalModal" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Embed2D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Embed3D" + }, + { + "contents": "element Embedded2D ${1:(1)} ${2:(2)} ${3:(3)} ${4:[4]}\n# (1) int, unique element tag\n# (2) int, host element tag\n# (3) int, slave node tag\n# [4] double, penalty factor, default: 1E4", + "details": "2D Embedded Element", + "kind": "type", + "trigger": "Embedded2D" + }, + { + "contents": "element Embedded3D ${1:(1)} ${2:(2)} ${3:(3)} ${4:[4]}\n# (1) int, unique element tag\n# (2) int, host element tag\n# (3) int, slave node tag\n# [4] double, penalty factor, default: 1E4", + "details": "3D Embedded Element", + "kind": "type", + "trigger": "Embedded3D" + }, + { + "contents": "material ExpCC ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:(6)} ${7:(7)} ${8:(8)} ${9:(9)} ${10:(10)} ${11:[11]}\n +# (1) int, unique material tag\n +# (2) double, elastic modulus\n +# (3) double, poissons ratio\n +# (4) double, beta, controls compression side shape\n +# (5) double, m, slope of CSL\n +# (6) double, p_t, initial tension strength\n +# (7) double, a_0, initial a_0\n +# (8) double, e_0, initial void ratio\n +# (9) double, lambda\n +# (10) double, kappa\n +# [11] double, density, default: 0.0", + "details": "Cam-Clay model with exponential hardening", + "kind": "type", + "trigger": "ExpCC" + }, + { + "contents": "material ExpDP ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:(6)} ${7:(7)} ${8:(8)} ${9:(9)} ${10:[10]}\n# (1) int, unique material tag\n# (2) double, elastic modulus\n# (3) double, poissons ratio\n# (4) double, \eta_y\n# (5) double, \eta_f\n# (6) double, \xi\n# (7) double, cohesion\n# (8) double, cohesion_a\n# (9) double, cohesion_b\n# [10] double, density, default: 0.0", + "details": "DP model with exponential hardening function", + "kind": "type", + "trigger": "ExpDP" + }, + { + "contents": "material CustomDP ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:(6)} ${7:(7)} ${8:[8]}\n# (1) int, unique material tag\n# (2) double, elastic modulus\n# (3) double, poissons ratio\n# (4) double, \eta_y\n# (5) double, \eta_f\n# (6) double, \xi\n# (7) int, cohesion expression tag\n# [8] double, density, default: 0.0", + "details": "DP model with custom hardening function", + "kind": "type", + "trigger": "CustomDP" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "ExpGurson" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "ExpGurson1D" + }, + { + "contents": "material ExpHoffman ${1:(1)} ${2:(2...7)} ${3:(8...10)} ${4:(11...19)} ${5:(20)} ${6:(21)} ${7:[22]}\n# (1) int, unique material tag\n# (2...7) double, six moduli: E_{xx}, E_{yy}, E_{zz}, E_{xy}, E_{yz}, E_{zx}\n# (8...10) double, three poissions ratios: v_{xx}, v_{yy}, v_{zz}\n# (11...19) double, nine yield stress\n# (20) double, a\n# (21) double, b\n# [22] double, density, default: 0.0", + "details": "Hoffman model with exponential isotropic hardening", + "kind": "type", + "trigger": "ExpHoffman" + }, + { + "contents": "material CustomHoffman ${1:(1)} ${2:(2...7)} ${3:(8...10)} ${4:(11...19)} ${5:(20)} ${6:[21]}\n# (1) int, unique material tag\n# (2...7) double, six moduli: E_{xx}, E_{yy}, E_{zz}, E_{xy}, E_{yz}, E_{zx}\n# (8...10) double, three poissions ratios: v_{xx}, v_{yy}, v_{zz}\n# (11...19) double, nine yield stress\n# (20) int, hardening expression tag\n# [21] double, density, default: 0.0", + "details": "Hoffman model with custom isotropic hardening", + "kind": "type", + "trigger": "CustomHoffman" + }, + { + "contents": "material ExpJ2 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:(6)} ${7:[7]}\n#(1) int, unique material tag\n#(2) double, elastic modulus\n#(3) double, poissons ratio\n#(4) double, yield stress\n#(5) double, a\n#(6) double, b\n#[7] double, density, default: 0", + "details": "J2 model with exponential isotropic hardening", + "kind": "type", + "trigger": "ExpJ2" + }, + { + "contents": "material CustomJ2 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:[6]}\n#(1) int, unique material tag\n#(2) double, elastic modulus\n#(3) double, poissons ratio\n#(4) int, isotropic hardening expression tag\n#(5) int, kinematic hardening expression tag\n#[6] double, density, default: 0", + "details": "J2 model with exponential isotropic hardening", + "kind": "type", + "trigger": "CustomJ2" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "ExpMises1D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "ExplicitDynamic" + }, + { + "contents": "element F21 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:[5]} ${6:[6]}\n# (1) int, unique element tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, section tag\n# [5] int, number of integration points, default: 6\n# [6] bool string, nonlinear geometry switch, default: false", + "details": "2D Force Based Bernoulli Beam", + "kind": "type", + "trigger": "F21" + }, + { + "contents": "element F21H ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:[5]} ${6:[6]}\n# (1) int, unique element tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, section tag\n# [5] double, normalized length of each end hinge, default: 0.2 \n# [6] bool string, nonlinear geometry switch, default: false", + "details": "2D Force Based Bernoulli Beam With Lumped End Hinges", + "kind": "type", + "trigger": "F21H" + }, + { + "contents": "element F31 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:[6]} ${7:[7]}\n# (1) int, unique element tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, section tag\n# (5) int, orientation tag\n# [6] int, number of integration points, default: 5\n# [7] bool string, nonlinear geometry switch, default: false", + "details": "3D Displacement Based Bernoulli Beam", + "kind": "type", + "trigger": "F31" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "FEAST" + }, + { + "contents": "set system_solver FGMRES", + "details": "Use FGMRES Solver", + "kind": "type", + "trigger": "FGMRES" + }, + { + "contents": "section Fibre1D ${1:(1)} [${2:(2)}...]\n# (1) int, unique section tag\n# [(2)...] int, associated section tags", + "details": "1D Fibre Section", + "kind": "type", + "trigger": "Fibre1D" + }, + { + "contents": "section Fibre2D ${1:(1)} [${2:(2)}...]\n# (1) int, unique section tag\n# [(2)...] int, associated section tags", + "details": "2D Fibre Section", + "kind": "type", + "trigger": "Fibre2D" + }, + { + "contents": "section Fibre3D ${1:(1)} [${2:(2)}...]\n# (1) int, unique section tag\n# [(2)...] int, associated section tags", + "details": "3D Fibre Section", + "kind": "type", + "trigger": "Fibre3D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "FixedLength2D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "FixedLength3D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "FixedNumber" + }, + { + "contents": "material Flag01 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)}\n# (1) int, unique material tag\n# (2) double, elastic modulus\n# (3) double, yield stress, positive\n# (4) double, residual stress, can be either positive or negative\n# (5) double, hardening ratio", + "details": "", + "kind": "type", + "trigger": "Flag01" + }, + { + "contents": "material Flag02 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:(6)} ${7:(7)} ${8:(8)}\n# (1) int, unique material tag\n# (2) double, elastic modulus\n# (3) double, tension yield stress, positive\n# (4) double, tension residual stress, can be either positive or negative\n# (5) double, tension hardening ratio\n# (6) double, compression yield stress, negative\n# (7) double, compression residual stress, can be either positive or negative\n# (8) double, compression hardening ratio", + "details": "", + "kind": "type", + "trigger": "Flag02" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Fluid" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Frame" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Frequency" + }, + { + "contents": "element GCMQI ${1:(1)} ${2:(2...5)} ${6:(6)} ${7:[7]} ${8:[8]}\nelement GCMQL ${1:(1)} ${2:(2...5)} ${6:(6)} ${7:[7]} ${8:[8]}\nelement GCMQG ${1:(1)} ${2:(2...5)} ${6:(6)} ${7:[7]} ${8:[8]}\n# (1) int, unique element tag\n# (2...5) int, node i, j, k, l\n# (6) int, material tag\n# [7] double, element thickness, default: 1.0", + "details": "Generalized Conforming Mixed Quadrilateral With Drilling DoFs", + "kind": "type", + "trigger": "GCMQ" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "GCMQG" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "GCMQI" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "GCMQL" + }, + { + "contents": "set system_solver GMRES", + "details": "Use GMRES Solver", + "kind": "type", + "trigger": "GMRES" + }, + { + "contents": "element GQ12 ${1:(1)} ${2:(2...5)} ${6:(6)} ${7:[7]}\n# (1) int, unique element tag\n# (2...5) int, node i, j, k, l\n# (6) int, material tag\n# [7] double, element thickness, default: 1.0", + "details": "Quadrilateral With Drilling DoFs", + "kind": "type", + "trigger": "GQ12" + }, + { + "contents": "integrator GSSSSOptimal ${1:(1)} ${2:[2]}\n# (1) int, unique integrator tag\n# [2] double, spectral radius, default: 0.5", + "details": "Optimal scheme for GSSSS", + "kind": "type", + "trigger": "GSSSSOptimal" + }, + { + "contents": "integrator GSSSSU0 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)}\n# (1) int, unique integrator tag\n# (2-4) double, three spectral radii", + "details": "U0 family scheme for GSSSS", + "kind": "type", + "trigger": "GSSSSU0" + }, + { + "contents": "integrator GSSSSV0 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)}\n# (1) int, unique integrator tag\n# (2-4) double, three spectral radii", + "details": "V0 family scheme for GSSSS", + "kind": "type", + "trigger": "GSSSSV0" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Gap01" + }, + { + "contents": "integrator GeneralisedAlpha ${1:(1)} ${2:[2]}\n# (1) int, unique tag\n# [2] double, spectral radius at infinite frequency, default: 0.5\n\nintegrator GeneralisedAlpha ${1:(1)} ${2:(2)} ${3:(3)}\n# (1) int, unique tag\n# (2) double, \\alpha_f\n# (3) double, \\alpha_m", + "details": "", + "kind": "type", + "trigger": "GeneralisedAlpha" + }, + { + "contents": "integrator GeneralisedAlphaExplicit ${1:(1)} ${2:[2]}\n# (1) int, unique tag\n# [2] double, spectral radius at infinite frequency, default: 0.5", + "details": "", + "kind": "type", + "trigger": "GeneralisedAlphaExplicit" + }, + { + "contents": "integrator GeneralisedAlpha ${1:(1)} ${2:[2]}\n# (1) int, unique tag\n# [2] double, spectral radius at infinite frequency, default: 0.5\n\nintegrator GeneralisedAlpha ${1:(1)} ${2:(2)} ${3:(3)}\n# (1) int, unique tag\n# (2) double, \\alpha_f\n# (3) double, \\alpha_m", + "details": "", + "kind": "type", + "trigger": "GeneralizedAlpha" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Global" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "GroupElement" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "GroupMultiplierBC" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "GroupNode" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "GroupPenaltyBC" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "GroupSum" + }, + { + "contents": "section EU2D HEA100 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEA100", + "kind": "keyword", + "trigger": "HEA100" + }, + { + "contents": "section EU3D HEA100 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEA100", + "kind": "keyword", + "trigger": "HEA100" + }, + { + "contents": "section EU2D HEA1000 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEA1000", + "kind": "keyword", + "trigger": "HEA1000" + }, + { + "contents": "section EU3D HEA1000 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEA1000", + "kind": "keyword", + "trigger": "HEA1000" + }, + { + "contents": "section EU2D HEA120 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEA120", + "kind": "keyword", + "trigger": "HEA120" + }, + { + "contents": "section EU3D HEA120 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEA120", + "kind": "keyword", + "trigger": "HEA120" + }, + { + "contents": "section EU2D HEA140 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEA140", + "kind": "keyword", + "trigger": "HEA140" + }, + { + "contents": "section EU3D HEA140 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEA140", + "kind": "keyword", + "trigger": "HEA140" + }, + { + "contents": "section EU2D HEA160 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEA160", + "kind": "keyword", + "trigger": "HEA160" + }, + { + "contents": "section EU3D HEA160 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEA160", + "kind": "keyword", + "trigger": "HEA160" + }, + { + "contents": "section EU2D HEA180 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEA180", + "kind": "keyword", + "trigger": "HEA180" + }, + { + "contents": "section EU3D HEA180 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEA180", + "kind": "keyword", + "trigger": "HEA180" + }, + { + "contents": "section EU2D HEA200 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEA200", + "kind": "keyword", + "trigger": "HEA200" + }, + { + "contents": "section EU3D HEA200 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEA200", + "kind": "keyword", + "trigger": "HEA200" + }, + { + "contents": "section EU2D HEA220 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEA220", + "kind": "keyword", + "trigger": "HEA220" + }, + { + "contents": "section EU3D HEA220 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEA220", + "kind": "keyword", + "trigger": "HEA220" + }, + { + "contents": "section EU2D HEA240 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEA240", + "kind": "keyword", + "trigger": "HEA240" + }, + { + "contents": "section EU3D HEA240 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEA240", + "kind": "keyword", + "trigger": "HEA240" + }, + { + "contents": "section EU2D HEA260 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEA260", + "kind": "keyword", + "trigger": "HEA260" + }, + { + "contents": "section EU3D HEA260 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEA260", + "kind": "keyword", + "trigger": "HEA260" + }, + { + "contents": "section EU2D HEA280 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEA280", + "kind": "keyword", + "trigger": "HEA280" + }, + { + "contents": "section EU3D HEA280 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEA280", + "kind": "keyword", + "trigger": "HEA280" + }, + { + "contents": "section EU2D HEA300 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEA300", + "kind": "keyword", + "trigger": "HEA300" + }, + { + "contents": "section EU3D HEA300 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEA300", + "kind": "keyword", + "trigger": "HEA300" + }, + { + "contents": "section EU2D HEA320 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEA320", + "kind": "keyword", + "trigger": "HEA320" + }, + { + "contents": "section EU3D HEA320 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEA320", + "kind": "keyword", + "trigger": "HEA320" + }, + { + "contents": "section EU2D HEA340 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEA340", + "kind": "keyword", + "trigger": "HEA340" + }, + { + "contents": "section EU3D HEA340 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEA340", + "kind": "keyword", + "trigger": "HEA340" + }, + { + "contents": "section EU2D HEA360 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEA360", + "kind": "keyword", + "trigger": "HEA360" + }, + { + "contents": "section EU3D HEA360 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEA360", + "kind": "keyword", + "trigger": "HEA360" + }, + { + "contents": "section EU2D HEA400 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEA400", + "kind": "keyword", + "trigger": "HEA400" + }, + { + "contents": "section EU3D HEA400 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEA400", + "kind": "keyword", + "trigger": "HEA400" + }, + { + "contents": "section EU2D HEA450 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEA450", + "kind": "keyword", + "trigger": "HEA450" + }, + { + "contents": "section EU3D HEA450 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEA450", + "kind": "keyword", + "trigger": "HEA450" + }, + { + "contents": "section EU2D HEA500 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEA500", + "kind": "keyword", + "trigger": "HEA500" + }, + { + "contents": "section EU3D HEA500 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEA500", + "kind": "keyword", + "trigger": "HEA500" + }, + { + "contents": "section EU2D HEA550 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEA550", + "kind": "keyword", + "trigger": "HEA550" + }, + { + "contents": "section EU3D HEA550 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEA550", + "kind": "keyword", + "trigger": "HEA550" + }, + { + "contents": "section EU2D HEA600 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEA600", + "kind": "keyword", + "trigger": "HEA600" + }, + { + "contents": "section EU3D HEA600 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEA600", + "kind": "keyword", + "trigger": "HEA600" + }, + { + "contents": "section EU2D HEA650 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEA650", + "kind": "keyword", + "trigger": "HEA650" + }, + { + "contents": "section EU3D HEA650 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEA650", + "kind": "keyword", + "trigger": "HEA650" + }, + { + "contents": "section EU2D HEA700 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEA700", + "kind": "keyword", + "trigger": "HEA700" + }, + { + "contents": "section EU3D HEA700 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEA700", + "kind": "keyword", + "trigger": "HEA700" + }, + { + "contents": "section EU2D HEA800 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEA800", + "kind": "keyword", + "trigger": "HEA800" + }, + { + "contents": "section EU3D HEA800 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEA800", + "kind": "keyword", + "trigger": "HEA800" + }, + { + "contents": "section EU2D HEA900 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEA900", + "kind": "keyword", + "trigger": "HEA900" + }, + { + "contents": "section EU3D HEA900 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEA900", + "kind": "keyword", + "trigger": "HEA900" + }, + { + "contents": "section EU2D HEB100 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEB100", + "kind": "keyword", + "trigger": "HEB100" + }, + { + "contents": "section EU3D HEB100 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEB100", + "kind": "keyword", + "trigger": "HEB100" + }, + { + "contents": "section EU2D HEB1000 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEB1000", + "kind": "keyword", + "trigger": "HEB1000" + }, + { + "contents": "section EU3D HEB1000 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEB1000", + "kind": "keyword", + "trigger": "HEB1000" + }, + { + "contents": "section EU2D HEB120 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEB120", + "kind": "keyword", + "trigger": "HEB120" + }, + { + "contents": "section EU3D HEB120 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEB120", + "kind": "keyword", + "trigger": "HEB120" + }, + { + "contents": "section EU2D HEB140 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEB140", + "kind": "keyword", + "trigger": "HEB140" + }, + { + "contents": "section EU3D HEB140 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEB140", + "kind": "keyword", + "trigger": "HEB140" + }, + { + "contents": "section EU2D HEB160 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEB160", + "kind": "keyword", + "trigger": "HEB160" + }, + { + "contents": "section EU3D HEB160 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEB160", + "kind": "keyword", + "trigger": "HEB160" + }, + { + "contents": "section EU2D HEB180 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEB180", + "kind": "keyword", + "trigger": "HEB180" + }, + { + "contents": "section EU3D HEB180 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEB180", + "kind": "keyword", + "trigger": "HEB180" + }, + { + "contents": "section EU2D HEB200 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEB200", + "kind": "keyword", + "trigger": "HEB200" + }, + { + "contents": "section EU3D HEB200 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEB200", + "kind": "keyword", + "trigger": "HEB200" + }, + { + "contents": "section EU2D HEB220 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEB220", + "kind": "keyword", + "trigger": "HEB220" + }, + { + "contents": "section EU3D HEB220 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEB220", + "kind": "keyword", + "trigger": "HEB220" + }, + { + "contents": "section EU2D HEB240 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEB240", + "kind": "keyword", + "trigger": "HEB240" + }, + { + "contents": "section EU3D HEB240 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEB240", + "kind": "keyword", + "trigger": "HEB240" + }, + { + "contents": "section EU2D HEB260 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEB260", + "kind": "keyword", + "trigger": "HEB260" + }, + { + "contents": "section EU3D HEB260 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEB260", + "kind": "keyword", + "trigger": "HEB260" + }, + { + "contents": "section EU2D HEB280 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEB280", + "kind": "keyword", + "trigger": "HEB280" + }, + { + "contents": "section EU3D HEB280 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEB280", + "kind": "keyword", + "trigger": "HEB280" + }, + { + "contents": "section EU2D HEB300 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEB300", + "kind": "keyword", + "trigger": "HEB300" + }, + { + "contents": "section EU3D HEB300 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEB300", + "kind": "keyword", + "trigger": "HEB300" + }, + { + "contents": "section EU2D HEB320 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEB320", + "kind": "keyword", + "trigger": "HEB320" + }, + { + "contents": "section EU3D HEB320 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEB320", + "kind": "keyword", + "trigger": "HEB320" + }, + { + "contents": "section EU2D HEB340 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEB340", + "kind": "keyword", + "trigger": "HEB340" + }, + { + "contents": "section EU3D HEB340 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEB340", + "kind": "keyword", + "trigger": "HEB340" + }, + { + "contents": "section EU2D HEB360 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEB360", + "kind": "keyword", + "trigger": "HEB360" + }, + { + "contents": "section EU3D HEB360 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEB360", + "kind": "keyword", + "trigger": "HEB360" + }, + { + "contents": "section EU2D HEB400 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEB400", + "kind": "keyword", + "trigger": "HEB400" + }, + { + "contents": "section EU3D HEB400 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEB400", + "kind": "keyword", + "trigger": "HEB400" + }, + { + "contents": "section EU2D HEB450 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEB450", + "kind": "keyword", + "trigger": "HEB450" + }, + { + "contents": "section EU3D HEB450 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEB450", + "kind": "keyword", + "trigger": "HEB450" + }, + { + "contents": "section EU2D HEB500 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEB500", + "kind": "keyword", + "trigger": "HEB500" + }, + { + "contents": "section EU3D HEB500 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEB500", + "kind": "keyword", + "trigger": "HEB500" + }, + { + "contents": "section EU2D HEB550 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEB550", + "kind": "keyword", + "trigger": "HEB550" + }, + { + "contents": "section EU3D HEB550 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEB550", + "kind": "keyword", + "trigger": "HEB550" + }, + { + "contents": "section EU2D HEB600 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEB600", + "kind": "keyword", + "trigger": "HEB600" + }, + { + "contents": "section EU3D HEB600 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEB600", + "kind": "keyword", + "trigger": "HEB600" + }, + { + "contents": "section EU2D HEB650 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEB650", + "kind": "keyword", + "trigger": "HEB650" + }, + { + "contents": "section EU3D HEB650 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEB650", + "kind": "keyword", + "trigger": "HEB650" + }, + { + "contents": "section EU2D HEB700 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEB700", + "kind": "keyword", + "trigger": "HEB700" + }, + { + "contents": "section EU3D HEB700 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEB700", + "kind": "keyword", + "trigger": "HEB700" + }, + { + "contents": "section EU2D HEB800 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEB800", + "kind": "keyword", + "trigger": "HEB800" + }, + { + "contents": "section EU3D HEB800 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEB800", + "kind": "keyword", + "trigger": "HEB800" + }, + { + "contents": "section EU2D HEB900 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEB900", + "kind": "keyword", + "trigger": "HEB900" + }, + { + "contents": "section EU3D HEB900 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEB900", + "kind": "keyword", + "trigger": "HEB900" + }, + { + "contents": "section EU2D HEM100 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEM100", + "kind": "keyword", + "trigger": "HEM100" + }, + { + "contents": "section EU3D HEM100 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEM100", + "kind": "keyword", + "trigger": "HEM100" + }, + { + "contents": "section EU2D HEM1000 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEM1000", + "kind": "keyword", + "trigger": "HEM1000" + }, + { + "contents": "section EU3D HEM1000 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEM1000", + "kind": "keyword", + "trigger": "HEM1000" + }, + { + "contents": "section EU2D HEM120 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEM120", + "kind": "keyword", + "trigger": "HEM120" + }, + { + "contents": "section EU3D HEM120 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEM120", + "kind": "keyword", + "trigger": "HEM120" + }, + { + "contents": "section EU2D HEM140 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEM140", + "kind": "keyword", + "trigger": "HEM140" + }, + { + "contents": "section EU3D HEM140 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEM140", + "kind": "keyword", + "trigger": "HEM140" + }, + { + "contents": "section EU2D HEM160 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEM160", + "kind": "keyword", + "trigger": "HEM160" + }, + { + "contents": "section EU3D HEM160 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEM160", + "kind": "keyword", + "trigger": "HEM160" + }, + { + "contents": "section EU2D HEM180 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEM180", + "kind": "keyword", + "trigger": "HEM180" + }, + { + "contents": "section EU3D HEM180 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEM180", + "kind": "keyword", + "trigger": "HEM180" + }, + { + "contents": "section EU2D HEM200 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEM200", + "kind": "keyword", + "trigger": "HEM200" + }, + { + "contents": "section EU3D HEM200 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEM200", + "kind": "keyword", + "trigger": "HEM200" + }, + { + "contents": "section EU2D HEM220 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEM220", + "kind": "keyword", + "trigger": "HEM220" + }, + { + "contents": "section EU3D HEM220 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEM220", + "kind": "keyword", + "trigger": "HEM220" + }, + { + "contents": "section EU2D HEM240 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEM240", + "kind": "keyword", + "trigger": "HEM240" + }, + { + "contents": "section EU3D HEM240 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEM240", + "kind": "keyword", + "trigger": "HEM240" + }, + { + "contents": "section EU2D HEM260 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEM260", + "kind": "keyword", + "trigger": "HEM260" + }, + { + "contents": "section EU3D HEM260 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEM260", + "kind": "keyword", + "trigger": "HEM260" + }, + { + "contents": "section EU2D HEM280 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEM280", + "kind": "keyword", + "trigger": "HEM280" + }, + { + "contents": "section EU3D HEM280 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEM280", + "kind": "keyword", + "trigger": "HEM280" + }, + { + "contents": "section EU2D HEM300 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEM300", + "kind": "keyword", + "trigger": "HEM300" + }, + { + "contents": "section EU3D HEM300 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEM300", + "kind": "keyword", + "trigger": "HEM300" + }, + { + "contents": "section EU2D HEM320 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEM320", + "kind": "keyword", + "trigger": "HEM320" + }, + { + "contents": "section EU3D HEM320 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEM320", + "kind": "keyword", + "trigger": "HEM320" + }, + { + "contents": "section EU2D HEM340 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEM340", + "kind": "keyword", + "trigger": "HEM340" + }, + { + "contents": "section EU3D HEM340 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEM340", + "kind": "keyword", + "trigger": "HEM340" + }, + { + "contents": "section EU2D HEM360 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEM360", + "kind": "keyword", + "trigger": "HEM360" + }, + { + "contents": "section EU3D HEM360 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEM360", + "kind": "keyword", + "trigger": "HEM360" + }, + { + "contents": "section EU2D HEM400 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEM400", + "kind": "keyword", + "trigger": "HEM400" + }, + { + "contents": "section EU3D HEM400 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEM400", + "kind": "keyword", + "trigger": "HEM400" + }, + { + "contents": "section EU2D HEM450 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEM450", + "kind": "keyword", + "trigger": "HEM450" + }, + { + "contents": "section EU3D HEM450 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEM450", + "kind": "keyword", + "trigger": "HEM450" + }, + { + "contents": "section EU2D HEM500 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEM500", + "kind": "keyword", + "trigger": "HEM500" + }, + { + "contents": "section EU3D HEM500 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEM500", + "kind": "keyword", + "trigger": "HEM500" + }, + { + "contents": "section EU2D HEM550 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEM550", + "kind": "keyword", + "trigger": "HEM550" + }, + { + "contents": "section EU3D HEM550 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEM550", + "kind": "keyword", + "trigger": "HEM550" + }, + { + "contents": "section EU2D HEM600 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEM600", + "kind": "keyword", + "trigger": "HEM600" + }, + { + "contents": "section EU3D HEM600 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEM600", + "kind": "keyword", + "trigger": "HEM600" + }, + { + "contents": "section EU2D HEM650 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEM650", + "kind": "keyword", + "trigger": "HEM650" + }, + { + "contents": "section EU3D HEM650 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEM650", + "kind": "keyword", + "trigger": "HEM650" + }, + { + "contents": "section EU2D HEM700 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEM700", + "kind": "keyword", + "trigger": "HEM700" + }, + { + "contents": "section EU3D HEM700 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEM700", + "kind": "keyword", + "trigger": "HEM700" + }, + { + "contents": "section EU2D HEM800 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEM800", + "kind": "keyword", + "trigger": "HEM800" + }, + { + "contents": "section EU3D HEM800 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEM800", + "kind": "keyword", + "trigger": "HEM800" + }, + { + "contents": "section EU2D HEM900 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section HEM900", + "kind": "keyword", + "trigger": "HEM900" + }, + { + "contents": "section EU3D HEM900 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section HEM900", + "kind": "keyword", + "trigger": "HEM900" + }, + { + "contents": "section US2D HP10X42 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section HP10X42", + "kind": "keyword", + "trigger": "HP10X42" + }, + { + "contents": "section US3D HP10X42 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section HP10X42", + "kind": "keyword", + "trigger": "HP10X42" + }, + { + "contents": "section US2D HP10X57 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section HP10X57", + "kind": "keyword", + "trigger": "HP10X57" + }, + { + "contents": "section US3D HP10X57 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section HP10X57", + "kind": "keyword", + "trigger": "HP10X57" + }, + { + "contents": "section US2D HP12X53 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section HP12X53", + "kind": "keyword", + "trigger": "HP12X53" + }, + { + "contents": "section US3D HP12X53 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section HP12X53", + "kind": "keyword", + "trigger": "HP12X53" + }, + { + "contents": "section US2D HP12X63 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section HP12X63", + "kind": "keyword", + "trigger": "HP12X63" + }, + { + "contents": "section US3D HP12X63 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section HP12X63", + "kind": "keyword", + "trigger": "HP12X63" + }, + { + "contents": "section US2D HP12X74 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section HP12X74", + "kind": "keyword", + "trigger": "HP12X74" + }, + { + "contents": "section US3D HP12X74 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section HP12X74", + "kind": "keyword", + "trigger": "HP12X74" + }, + { + "contents": "section US2D HP12X84 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section HP12X84", + "kind": "keyword", + "trigger": "HP12X84" + }, + { + "contents": "section US3D HP12X84 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section HP12X84", + "kind": "keyword", + "trigger": "HP12X84" + }, + { + "contents": "section US2D HP12X89 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section HP12X89", + "kind": "keyword", + "trigger": "HP12X89" + }, + { + "contents": "section US3D HP12X89 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section HP12X89", + "kind": "keyword", + "trigger": "HP12X89" + }, + { + "contents": "section US2D HP14X102 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section HP14X102", + "kind": "keyword", + "trigger": "HP14X102" + }, + { + "contents": "section US3D HP14X102 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section HP14X102", + "kind": "keyword", + "trigger": "HP14X102" + }, + { + "contents": "section US2D HP14X117 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section HP14X117", + "kind": "keyword", + "trigger": "HP14X117" + }, + { + "contents": "section US3D HP14X117 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section HP14X117", + "kind": "keyword", + "trigger": "HP14X117" + }, + { + "contents": "section US2D HP14X73 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section HP14X73", + "kind": "keyword", + "trigger": "HP14X73" + }, + { + "contents": "section US3D HP14X73 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section HP14X73", + "kind": "keyword", + "trigger": "HP14X73" + }, + { + "contents": "section US2D HP14X89 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section HP14X89", + "kind": "keyword", + "trigger": "HP14X89" + }, + { + "contents": "section US3D HP14X89 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section HP14X89", + "kind": "keyword", + "trigger": "HP14X89" + }, + { + "contents": "section US2D HP16X101 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section HP16X101", + "kind": "keyword", + "trigger": "HP16X101" + }, + { + "contents": "section US3D HP16X101 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section HP16X101", + "kind": "keyword", + "trigger": "HP16X101" + }, + { + "contents": "section US2D HP16X121 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section HP16X121", + "kind": "keyword", + "trigger": "HP16X121" + }, + { + "contents": "section US3D HP16X121 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section HP16X121", + "kind": "keyword", + "trigger": "HP16X121" + }, + { + "contents": "section US2D HP16X141 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section HP16X141", + "kind": "keyword", + "trigger": "HP16X141" + }, + { + "contents": "section US3D HP16X141 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section HP16X141", + "kind": "keyword", + "trigger": "HP16X141" + }, + { + "contents": "section US2D HP16X162 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section HP16X162", + "kind": "keyword", + "trigger": "HP16X162" + }, + { + "contents": "section US3D HP16X162 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section HP16X162", + "kind": "keyword", + "trigger": "HP16X162" + }, + { + "contents": "section US2D HP16X183 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section HP16X183", + "kind": "keyword", + "trigger": "HP16X183" + }, + { + "contents": "section US3D HP16X183 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section HP16X183", + "kind": "keyword", + "trigger": "HP16X183" + }, + { + "contents": "section US2D HP16X88 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section HP16X88", + "kind": "keyword", + "trigger": "HP16X88" + }, + { + "contents": "section US3D HP16X88 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section HP16X88", + "kind": "keyword", + "trigger": "HP16X88" + }, + { + "contents": "section US2D HP18X135 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section HP18X135", + "kind": "keyword", + "trigger": "HP18X135" + }, + { + "contents": "section US3D HP18X135 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section HP18X135", + "kind": "keyword", + "trigger": "HP18X135" + }, + { + "contents": "section US2D HP18X157 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section HP18X157", + "kind": "keyword", + "trigger": "HP18X157" + }, + { + "contents": "section US3D HP18X157 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section HP18X157", + "kind": "keyword", + "trigger": "HP18X157" + }, + { + "contents": "section US2D HP18X181 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section HP18X181", + "kind": "keyword", + "trigger": "HP18X181" + }, + { + "contents": "section US3D HP18X181 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section HP18X181", + "kind": "keyword", + "trigger": "HP18X181" + }, + { + "contents": "section US2D HP18X204 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section HP18X204", + "kind": "keyword", + "trigger": "HP18X204" + }, + { + "contents": "section US3D HP18X204 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section HP18X204", + "kind": "keyword", + "trigger": "HP18X204" + }, + { + "contents": "section US2D HP8X36 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section HP8X36", + "kind": "keyword", + "trigger": "HP8X36" + }, + { + "contents": "section US3D HP8X36 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section HP8X36", + "kind": "keyword", + "trigger": "HP8X36" + }, + { + "contents": "section HSection2D ${1:(1)} ${2:(2...7)} ${8:(8)} ${9:[9]} ${10:[10]}\n# (1) int, unique tag\n# (2...7) double, section dimensions\n# (8) int, material tag\n# [9] int, number of integration points, default: 6\n# [10] double, eccentricity measured from the centre, default: 0.0", + "details": "2D H-Section", + "kind": "type", + "trigger": "HSection2D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "ILU" + }, + { + "contents": "section EU2D IPE100 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section IPE100", + "kind": "keyword", + "trigger": "IPE100" + }, + { + "contents": "section EU3D IPE100 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section IPE100", + "kind": "keyword", + "trigger": "IPE100" + }, + { + "contents": "section EU2D IPE120 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section IPE120", + "kind": "keyword", + "trigger": "IPE120" + }, + { + "contents": "section EU3D IPE120 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section IPE120", + "kind": "keyword", + "trigger": "IPE120" + }, + { + "contents": "section EU2D IPE140 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section IPE140", + "kind": "keyword", + "trigger": "IPE140" + }, + { + "contents": "section EU3D IPE140 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section IPE140", + "kind": "keyword", + "trigger": "IPE140" + }, + { + "contents": "section EU2D IPE160 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section IPE160", + "kind": "keyword", + "trigger": "IPE160" + }, + { + "contents": "section EU3D IPE160 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section IPE160", + "kind": "keyword", + "trigger": "IPE160" + }, + { + "contents": "section EU2D IPE180 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section IPE180", + "kind": "keyword", + "trigger": "IPE180" + }, + { + "contents": "section EU3D IPE180 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section IPE180", + "kind": "keyword", + "trigger": "IPE180" + }, + { + "contents": "section EU2D IPE200 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section IPE200", + "kind": "keyword", + "trigger": "IPE200" + }, + { + "contents": "section EU3D IPE200 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section IPE200", + "kind": "keyword", + "trigger": "IPE200" + }, + { + "contents": "section EU2D IPE220 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section IPE220", + "kind": "keyword", + "trigger": "IPE220" + }, + { + "contents": "section EU3D IPE220 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section IPE220", + "kind": "keyword", + "trigger": "IPE220" + }, + { + "contents": "section EU2D IPE240 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section IPE240", + "kind": "keyword", + "trigger": "IPE240" + }, + { + "contents": "section EU3D IPE240 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section IPE240", + "kind": "keyword", + "trigger": "IPE240" + }, + { + "contents": "section EU2D IPE270 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section IPE270", + "kind": "keyword", + "trigger": "IPE270" + }, + { + "contents": "section EU3D IPE270 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section IPE270", + "kind": "keyword", + "trigger": "IPE270" + }, + { + "contents": "section EU2D IPE300 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section IPE300", + "kind": "keyword", + "trigger": "IPE300" + }, + { + "contents": "section EU3D IPE300 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section IPE300", + "kind": "keyword", + "trigger": "IPE300" + }, + { + "contents": "section EU2D IPE330 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section IPE330", + "kind": "keyword", + "trigger": "IPE330" + }, + { + "contents": "section EU3D IPE330 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section IPE330", + "kind": "keyword", + "trigger": "IPE330" + }, + { + "contents": "section EU2D IPE360 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section IPE360", + "kind": "keyword", + "trigger": "IPE360" + }, + { + "contents": "section EU3D IPE360 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section IPE360", + "kind": "keyword", + "trigger": "IPE360" + }, + { + "contents": "section EU2D IPE400 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section IPE400", + "kind": "keyword", + "trigger": "IPE400" + }, + { + "contents": "section EU3D IPE400 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section IPE400", + "kind": "keyword", + "trigger": "IPE400" + }, + { + "contents": "section EU2D IPE450 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section IPE450", + "kind": "keyword", + "trigger": "IPE450" + }, + { + "contents": "section EU3D IPE450 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section IPE450", + "kind": "keyword", + "trigger": "IPE450" + }, + { + "contents": "section EU2D IPE500 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section IPE500", + "kind": "keyword", + "trigger": "IPE500" + }, + { + "contents": "section EU3D IPE500 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section IPE500", + "kind": "keyword", + "trigger": "IPE500" + }, + { + "contents": "section EU2D IPE550 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section IPE550", + "kind": "keyword", + "trigger": "IPE550" + }, + { + "contents": "section EU3D IPE550 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section IPE550", + "kind": "keyword", + "trigger": "IPE550" + }, + { + "contents": "section EU2D IPE600 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section IPE600", + "kind": "keyword", + "trigger": "IPE600" + }, + { + "contents": "section EU3D IPE600 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section IPE600", + "kind": "keyword", + "trigger": "IPE600" + }, + { + "contents": "section EU2D IPE80 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "EU 2D Section IPE80", + "kind": "keyword", + "trigger": "IPE80" + }, + { + "contents": "section EU3D IPE80 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "EU 3D Section IPE80", + "kind": "keyword", + "trigger": "IPE80" + }, + { + "contents": "section ISection2D ${1:(1)} ${2:(2...7)} ${8:(8)} ${9:[9]} ${10:[10]}\n# (1) int, unique tag\n# (2...7) double, section dimensions\n# (8) int, material tag\n# [9] int, number of integration points, default: 6\n# [10] double, eccentricity measured from the centre, default: 0.0", + "details": "2D I-Section", + "kind": "type", + "trigger": "ISection2D" + }, + { + "contents": "section ISection3D ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:(6)} ${7:(7)} ${8:(8)} ${9:[9]} ${10:[10]} ${11:[11]}\n# (1) int, unique section tag\n# (2) double, top flange width\n# (3) double, top flange thickness\n# (4) double, bottom flange width\n# (5) double, bottom flange thickness\n# (6) double, web height\n# (7) double, web thickness\n# (8) int, material tag\n# [9] int, number of integration points, default: 3\n# [10] double, eccentricity along y axis, default: 0.0\n# [11] double, eccentricity along z axis, default: 0.0", + "details": "3D I-Section", + "kind": "type", + "trigger": "ISection3D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "ImplicitDynamic" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "IsotropicElastic3D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Jacobi" + }, + { + "contents": "element Joint ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4...)}\n# (1) int, unique element tag\n# (2) int, node i\n# (3) int, node j\n# (4...) int, material tags", + "details": "Joint Element", + "kind": "type", + "trigger": "Joint" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Kelvin" + }, + { + "contents": "set system_solver LAPACK", + "details": "Use LAPACK Solver", + "kind": "type", + "trigger": "LAPACK" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "LBFGS" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "LJPotential2D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Laminated" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "LeeElementalDamping" + }, + { + "contents": "integrator LeeElementalNewmark ${1:(1)} ${2:(2)} ${3:(3)} (${4:(4)} ${5:(5)}...)\n# (1) int, unique integrator tag\n# (2) double, alpha\n# (3) double, beta\n# (4) double, damping ratio \\zeta_p at the peak of each mode\n# (5) double, circular frequency\\omega_p at the peak of each mode", + "details": "", + "kind": "type", + "trigger": "LeeElementalNewmark" + }, + { + "contents": "integrator LeeNewmark ${1:(1)} ${2:(2)} ${3:(3)} (${4:(4)} ${5:(5)}...)\n# (1) int, unique integrator tag\n# (2) double, alpha\n# (3) double, beta\n# (4) double, damping ratio \\zeta_p at the peak of each mode\n# (5) double, circular frequency\\omega_p at the peak of each mode", + "details": "", + "kind": "type", + "trigger": "LeeNewmark" + }, + { + "contents": "integrator LeeNewmarkFull ${1:(1)} ${2:(2)} ${3:(3)} (${4:(4)} ${5:(5)} ${6:(6)} ${7:[7...]}...)\n# (1) int, unique integrator tag\n# (2) double, alpha in Newmark method\n# (3) double, beta in Newmark method\n# (4) string, type identifier\n# (5) double, \\zeta_p\n# (6) double, \\omega_p\n# (7...) double/int, parameters associated with the mode", + "details": "", + "kind": "type", + "trigger": "LeeNewmarkFull" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "LineUDL2D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "LineUDL3D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Linear" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "LinearDamage" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "LinearViscosity" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "LogicAND" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "LogicOR" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "LogicXOR" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "LumpedScale" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "LumpedSimple" + }, + { + "contents": "section US2D M10X7.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section M10X7.5", + "kind": "keyword", + "trigger": "M10X7.5" + }, + { + "contents": "section US3D M10X7.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section M10X7.5", + "kind": "keyword", + "trigger": "M10X7.5" + }, + { + "contents": "section US2D M10X8 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section M10X8", + "kind": "keyword", + "trigger": "M10X8" + }, + { + "contents": "section US3D M10X8 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section M10X8", + "kind": "keyword", + "trigger": "M10X8" + }, + { + "contents": "section US2D M10X9 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section M10X9", + "kind": "keyword", + "trigger": "M10X9" + }, + { + "contents": "section US3D M10X9 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section M10X9", + "kind": "keyword", + "trigger": "M10X9" + }, + { + "contents": "section US2D M12.5X11.6 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section M12.5X11.6", + "kind": "keyword", + "trigger": "M12.5X11.6" + }, + { + "contents": "section US3D M12.5X11.6 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section M12.5X11.6", + "kind": "keyword", + "trigger": "M12.5X11.6" + }, + { + "contents": "section US2D M12.5X12.4 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section M12.5X12.4", + "kind": "keyword", + "trigger": "M12.5X12.4" + }, + { + "contents": "section US3D M12.5X12.4 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section M12.5X12.4", + "kind": "keyword", + "trigger": "M12.5X12.4" + }, + { + "contents": "section US2D M12X10 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section M12X10", + "kind": "keyword", + "trigger": "M12X10" + }, + { + "contents": "section US3D M12X10 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section M12X10", + "kind": "keyword", + "trigger": "M12X10" + }, + { + "contents": "section US2D M12X10.8 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section M12X10.8", + "kind": "keyword", + "trigger": "M12X10.8" + }, + { + "contents": "section US3D M12X10.8 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section M12X10.8", + "kind": "keyword", + "trigger": "M12X10.8" + }, + { + "contents": "section US2D M12X11.8 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section M12X11.8", + "kind": "keyword", + "trigger": "M12X11.8" + }, + { + "contents": "section US3D M12X11.8 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section M12X11.8", + "kind": "keyword", + "trigger": "M12X11.8" + }, + { + "contents": "section US2D M3X2.9 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section M3X2.9", + "kind": "keyword", + "trigger": "M3X2.9" + }, + { + "contents": "section US3D M3X2.9 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section M3X2.9", + "kind": "keyword", + "trigger": "M3X2.9" + }, + { + "contents": "section US2D M4X3.2 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section M4X3.2", + "kind": "keyword", + "trigger": "M4X3.2" + }, + { + "contents": "section US3D M4X3.2 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section M4X3.2", + "kind": "keyword", + "trigger": "M4X3.2" + }, + { + "contents": "section US2D M4X3.45 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section M4X3.45", + "kind": "keyword", + "trigger": "M4X3.45" + }, + { + "contents": "section US3D M4X3.45 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section M4X3.45", + "kind": "keyword", + "trigger": "M4X3.45" + }, + { + "contents": "section US2D M4X4.08 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section M4X4.08", + "kind": "keyword", + "trigger": "M4X4.08" + }, + { + "contents": "section US3D M4X4.08 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section M4X4.08", + "kind": "keyword", + "trigger": "M4X4.08" + }, + { + "contents": "section US2D M4X6 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section M4X6", + "kind": "keyword", + "trigger": "M4X6" + }, + { + "contents": "section US3D M4X6 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section M4X6", + "kind": "keyword", + "trigger": "M4X6" + }, + { + "contents": "section US2D M5X18.9 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section M5X18.9", + "kind": "keyword", + "trigger": "M5X18.9" + }, + { + "contents": "section US3D M5X18.9 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section M5X18.9", + "kind": "keyword", + "trigger": "M5X18.9" + }, + { + "contents": "section US2D M6X3.7 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section M6X3.7", + "kind": "keyword", + "trigger": "M6X3.7" + }, + { + "contents": "section US3D M6X3.7 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section M6X3.7", + "kind": "keyword", + "trigger": "M6X3.7" + }, + { + "contents": "section US2D M6X4.4 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section M6X4.4", + "kind": "keyword", + "trigger": "M6X4.4" + }, + { + "contents": "section US3D M6X4.4 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section M6X4.4", + "kind": "keyword", + "trigger": "M6X4.4" + }, + { + "contents": "section US2D M8X6.2 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section M8X6.2", + "kind": "keyword", + "trigger": "M8X6.2" + }, + { + "contents": "section US3D M8X6.2 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section M8X6.2", + "kind": "keyword", + "trigger": "M8X6.2" + }, + { + "contents": "section US2D M8X6.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section M8X6.5", + "kind": "keyword", + "trigger": "M8X6.5" + }, + { + "contents": "section US3D M8X6.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section M8X6.5", + "kind": "keyword", + "trigger": "M8X6.5" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "MPC" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "MPDC" + }, + { + "contents": "material MPF ${1:(1)} ${2:(2)} ${3:(3)} ${4:[4]} ${5:[5]} ${6:[6]} ${7:[7]} ${8:[8]} ${9:[9]} ${10:[10]} ${11:[11]} ${12:[12]}\n# (1) int, unique material tag\n# (2) double, elastic modulus\n# (3) double, initial yield stress\n# [4] double, hardening ratio, default: 0.05\n# [5] double, R0, default: 20.0\n# [6] double, A1, default: 18.5\n# [7] double, A2, default: 0.15\n# [8] double, A3, default: 0.01\n# [9] double, A4, default: 7.0\n# [10] bool string, isotropic hardening switch, default: false\n# [11] bool string, constant radius switch, default: false\n# [12] double, density, default: 0.0", + "details": "Menegotto-Pinto-Filippou Steel Model", + "kind": "type", + "trigger": "MPF" + }, + { + "contents": "section US2D MT2.5X9.45 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section MT2.5X9.45", + "kind": "keyword", + "trigger": "MT2.5X9.45" + }, + { + "contents": "section US3D MT2.5X9.45 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section MT2.5X9.45", + "kind": "keyword", + "trigger": "MT2.5X9.45" + }, + { + "contents": "section US2D MT2X3 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section MT2X3", + "kind": "keyword", + "trigger": "MT2X3" + }, + { + "contents": "section US3D MT2X3 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section MT2X3", + "kind": "keyword", + "trigger": "MT2X3" + }, + { + "contents": "section US2D MT3X1.85 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section MT3X1.85", + "kind": "keyword", + "trigger": "MT3X1.85" + }, + { + "contents": "section US3D MT3X1.85 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section MT3X1.85", + "kind": "keyword", + "trigger": "MT3X1.85" + }, + { + "contents": "section US2D MT3X2.2 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section MT3X2.2", + "kind": "keyword", + "trigger": "MT3X2.2" + }, + { + "contents": "section US3D MT3X2.2 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section MT3X2.2", + "kind": "keyword", + "trigger": "MT3X2.2" + }, + { + "contents": "section US2D MT4X3.1 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section MT4X3.1", + "kind": "keyword", + "trigger": "MT4X3.1" + }, + { + "contents": "section US3D MT4X3.1 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section MT4X3.1", + "kind": "keyword", + "trigger": "MT4X3.1" + }, + { + "contents": "section US2D MT4X3.25 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section MT4X3.25", + "kind": "keyword", + "trigger": "MT4X3.25" + }, + { + "contents": "section US3D MT4X3.25 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section MT4X3.25", + "kind": "keyword", + "trigger": "MT4X3.25" + }, + { + "contents": "section US2D MT5X3.75 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section MT5X3.75", + "kind": "keyword", + "trigger": "MT5X3.75" + }, + { + "contents": "section US3D MT5X3.75 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section MT5X3.75", + "kind": "keyword", + "trigger": "MT5X3.75" + }, + { + "contents": "section US2D MT5X4 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section MT5X4", + "kind": "keyword", + "trigger": "MT5X4" + }, + { + "contents": "section US3D MT5X4 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section MT5X4", + "kind": "keyword", + "trigger": "MT5X4" + }, + { + "contents": "section US2D MT5X4.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section MT5X4.5", + "kind": "keyword", + "trigger": "MT5X4.5" + }, + { + "contents": "section US3D MT5X4.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section MT5X4.5", + "kind": "keyword", + "trigger": "MT5X4.5" + }, + { + "contents": "section US2D MT6.25X5.8 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section MT6.25X5.8", + "kind": "keyword", + "trigger": "MT6.25X5.8" + }, + { + "contents": "section US3D MT6.25X5.8 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section MT6.25X5.8", + "kind": "keyword", + "trigger": "MT6.25X5.8" + }, + { + "contents": "section US2D MT6.25X6.2 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section MT6.25X6.2", + "kind": "keyword", + "trigger": "MT6.25X6.2" + }, + { + "contents": "section US3D MT6.25X6.2 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section MT6.25X6.2", + "kind": "keyword", + "trigger": "MT6.25X6.2" + }, + { + "contents": "section US2D MT6X5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section MT6X5", + "kind": "keyword", + "trigger": "MT6X5" + }, + { + "contents": "section US3D MT6X5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section MT6X5", + "kind": "keyword", + "trigger": "MT6X5" + }, + { + "contents": "section US2D MT6X5.4 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section MT6X5.4", + "kind": "keyword", + "trigger": "MT6X5.4" + }, + { + "contents": "section US3D MT6X5.4 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section MT6X5.4", + "kind": "keyword", + "trigger": "MT6X5.4" + }, + { + "contents": "section US2D MT6X5.9 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section MT6X5.9", + "kind": "keyword", + "trigger": "MT6X5.9" + }, + { + "contents": "section US3D MT6X5.9 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section MT6X5.9", + "kind": "keyword", + "trigger": "MT6X5.9" + }, + { + "contents": "set system_solver MUMPS", + "details": "Use MUMPS Solver", + "kind": "type", + "trigger": "MUMPS" + }, + { + "contents": "element MVLEM ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} (${6:(6)} ${7:(7)} ${8:(8)} ${9:(9)} ${10:(10)}...)\n# (1) int, unique element tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, material tag of shear spring\n# (5) double, height of shear spring, ranges from 0 to 1\n# (6) double, fibre width\n# (7) double, fibre thickness\n# (8) double, reinforcement ratio of target fibre\n# (9) int, concrete material ${host:(host)} tag\n# (10) int, steel material tag", + "details": "Multiple Vertical Line Element Model", + "kind": "type", + "trigger": "MVLEM" + }, + { + "contents": "Mass ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4...)}\nelement Mass ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4...)}\n# (1) int, unique element tag\n# (2) int, node tag\n# (3) double, magnitude\n# (4...) int, dof tag", + "details": "Point Mass", + "kind": "type", + "trigger": "Mass" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Mass2D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Mass3D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "MassPoint2D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "MassPoint3D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "MaxDisplacement" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "MaxGap2D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "MaxGap3D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "MaxHistory" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "MaxResistance" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "MaximumGap2D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "MaximumGap3D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Maxwell" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "MinDisplacement" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "MinGap2D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "MinGap3D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "MinResistance" + }, + { + "contents": "element Mindlin ${1:(1)} ${2:(2...5)} ${6:(6)} ${7:(7)} ${8:[8]}\n# (1) int, unique element tag\n# (2...5) int, node i, j, k, l\n# (6) int, material tag\n# (7) double, thickness\n# [8] int, numer of integration points, default: 5", + "details": "Mindlin Plate Element", + "kind": "type", + "trigger": "Mindlin" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "MinimumGap2D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "MinimumGap3D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Model" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Modulated" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "MooneyRivlin" + }, + { + "contents": "material MultilinearElastic1D ${1:(1)} ${2:(2 3...)} ${4:[4]}\n# (1) int, unique material tag\n# (2) double, strain of the data point\n# (3) double, stress of the data point\n# [4] double, density, default: 0.0", + "details": "Uniaxial Multilinear Elastic Material", + "kind": "type", + "trigger": "MultilinearElastic1D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "MultilinearJ2" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "MultilinearMises1D" + }, + { + "contents": "material MultilinearOO ${1:(1)} ${2:(2)} ${3:(3)} ${4:[4]}\n# (1) int, unique material tag\n# (2) string, file name of tension backbone\n# (3) string, file name of compression backbone\n# [4] double, density, default: 0.0", + "details": "Multilinear Origin Oriented Hysteresis Model", + "kind": "type", + "trigger": "MultilinearOO" + }, + { + "contents": "Multilinear Peak Oriented Hysteresis Model", + "details": "material MultilinearPO ${1:(1)} ${2:(2)} ${3:(3)} ${4:[4]}\n# (1) int, unique material tag\n# (2) string, file name of tension backbone\n# (3) string, file name of compression backbone\n# [4] double, density, default: 0.0", + "kind": "type", + "trigger": "MultilinearPO" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "MultiplierBC" + }, + { + "contents": "material NLE1D01 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:[5]} ${6:[6]}\n# (1) int, unique material tag\n# (2) double, elastic modulus\n# (3) double, turning stress\n# (4) double, hardening ratio\n# [5] double, radius of transition, default: 20\n# [6] double, density, default: 0.0", + "details": "Nonlinear Elastic 1D Type 01", + "kind": "type", + "trigger": "NLE1D01" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "NLE3D01" + }, + { + "contents": "section NM2D1 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)}\n# (1) int, unique section tag\n# (2) double, EA\n# (3) double, EI\n# (4) double, linear density", + "details": "N-M Interaction Elastic Section", + "kind": "type", + "trigger": "NM2D1" + }, + { + "contents": "section NM2D2 ${1:(1)} ${2:(2...9)} [${10:(10)} ${11:(11)} ${12:(12)}...]\n# (1) int, unique section tag\n# (2) double, EA\n# (3) double, EI\n# (4) double, yielding axial force\n# (5) double, yielding strong axis moment\n# (6) double, d\n# (7) double, isotropic hardening parameter H\n# (8) double, kinematic hardening parameter K\n# (9) double, linear density\n# (10) double, a_i\n# (11) double, b_i\n# (12) double, c_i", + "details": "N-M Interaction Elastic Section", + "kind": "type", + "trigger": "NM2D2" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "NM2D3" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "NM2D3K" + }, + { + "contents": "section NM3D1 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)}\n# (1) int, unique section tag\n# (2) double, EA\n# (3) double, EI of strong axis\n# (4) double, EI of weak axis\n# (5) double, linear density", + "details": "N-M Interaction Elastic Section", + "kind": "type", + "trigger": "NM3D1" + }, + { + "contents": "section NM3D2 ${1:(1)} ${2:(2...11)}\n# (1) int, unique section tag\n# (2) double, EA\n# (3) double, strong axis EI\n# (4) double, weak axis EI\n# (5) double, yielding axial force\n# (6) double, yielding strong axis moment\n# (7) double, yielding weak axis moment\n# (8) double, c\n# (9) double, isotropic hardening parameter H\n# (10) double, kinematic hardening parameter K\n# (11) double, linear density", + "details": "N-M Interaction Elastic Section", + "kind": "type", + "trigger": "NM3D2" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "NM3D3" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "NM3D3K" + }, + { + "contents": "element NMB21 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:[5]}\n# (1) int, unique element tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, section tag\n# [5] bool string, nonlinear geometry switch, default: false", + "details": "2D Displacement Based Bernoulli Beam with N-M Interaction Sections", + "kind": "type", + "trigger": "NMB21" + }, + { + "contents": "element NMB21EH ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:[5]}\n# (1) int, unique element tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, section tag\n# [5] bool string, nonlinear geometry switch, default: false", + "details": "2D Displacement Based Bernoulli Beam with N-M Interaction Sections and High End Moment Release", + "kind": "type", + "trigger": "NMB21EH" + }, + { + "contents": "element NMB21EL ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:[5]}\n# (1) int, unique element tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, section tag\n# [5] bool string, nonlinear geometry switch, default: false", + "details": "2D Displacement Based Bernoulli Beam with N-M Interaction Sections and Low End Moment Release", + "kind": "type", + "trigger": "NMB21EL" + }, + { + "contents": "element NMB31 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:[6]}\n# (1) int, unique element tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, section tag\n# (5) int, orientation tag\n# [6] bool string, nonlinear geometry switch, default: false", + "details": "3D Displacement Based Bernoulli Beam with N-M Interaction Sections", + "kind": "type", + "trigger": "NMB31" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "NZ2D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "NZ3D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "NZStrongMotion" + }, + { + "contents": "integrator Newmark ${1:(1)} ${2:[2]} ${3:[3]}\n# (1) int, unique tag\n# [2] double, alpha, default: 0.25\n# [3] double, beta, default: 0.5", + "details": "", + "kind": "type", + "trigger": "Newmark" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Node" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "NodeFacet" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "NodeLine" + }, + { + "contents": "integrator OALTS ${1:(1)} ${2:[2]}\n# (1) int, unique integrator tag\n# [2] double, spectral radius, default: 0.5", + "details": "OALTS doi:10.1002/nme.6188", + "kind": "type", + "trigger": "OALTS" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Optimisation" + }, + { + "contents": "orientation ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)}\n# (1) int, unique orientation tag\n# (2) string, orientation type\n# (3) double, x component of local z axis\n# (4) double, y component of local z axis\n# (5) double, z component of local z axis", + "details": "Section Orientation For 3D Beams", + "kind": "type", + "trigger": "Orientation" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "OrthotropicElastic3D" + }, + { + "contents": "set system_solver PARDISO", + "details": "Use PARDISO Solver", + "kind": "type", + "trigger": "PARDISO" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "PCPE4DC" + }, + { + "contents": "element PCPE4DC ${1:(1)} ${2:(2...5)} ${6:(6)} ${7:(7)} ${8:(8)} ${9:(9)} ${10:(10)}\n# (1) int, unique element tag\n# (2...5) int, node i, j, k, l\n# (6) int, solid material tag\n# (7) int, fluid material tag\n# (8) double, alpha\n# (9) double, porosity n\n# (10) double, permeability k", + "details": "Bilinear Quadrilateral With Pore Pressure", + "kind": "type", + "trigger": "PCPE4DC" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "PCPE4DI" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "PCPE4UC" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "PCPE8DC" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "PCPE8UC" + }, + { + "contents": "element PS ${1:(1)} ${2:(2...5)} ${6:(6)} ${7:[7]}\n# (1) int, unique element tag\n# (2...5) int, node i, j, k, l\n# (6) int, material tag\n# [7] double, element thickness, default: 1.0", + "details": "Pian-Sumihara Quadrilateral Element", + "kind": "type", + "trigger": "PS" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "ParabolicCC" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Parallel" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "ParticleCollision2D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "ParticleCollision3D" + }, + { + "contents": "element PatchCube ${1:(1)} -node ${2:(2...)} -knotx ${3:(3...)} -knoty ${4:(4...)} -knotz ${5:(5...)} -material ${6:(6)} ${-thickness (7:[-thickness (7)}]\n# (1) int, unique element ${patch:(patch)} tag\n# (2...) int, node tags of control node polygon\n# (3...) double, knot vector along x axis\n# (4...) double, knot vector along y axis\n# (5...) double, knot vector along z axis\n# (6) int, material tag\n# (7) double, thickness", + "details": "Patch of Hexahedron Elements", + "kind": "type", + "trigger": "PatchCube" + }, + { + "contents": "element PatchQuad ${1:(1)} -node ${2:(2...)} -knotx ${3:(3...)} -knoty ${4:(4...)} -material ${5:(5)} ${-thickness (6:[-thickness (6)}]\n# (1) int, unique element ${patch:(patch)} tag\n# (2...) int, node tags of control node polygon\n# (3...) double, knot vector along x axis\n# (4...) double, knot vector along y axis\n# (5) int, material tag\n# (6) double, thickness", + "details": "Patch of Quadrilateral Elements", + "kind": "type", + "trigger": "PatchQuad" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "PenaltyBC" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "PlaneStrain" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "PlaneStress" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "PlaneSymmetric13" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "PlaneSymmetric23" + }, + { + "contents": "material PolyElastic1D ${1:(1)} [${2:(2)}...]\n# (1) int, unique material tag\n# (2) double, polynomial parameters, a_n", + "details": "Polynomial Based Uniaxial Nonlinear Elastic", + "kind": "type", + "trigger": "PolyElastic1D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "PolyJ2" + }, + { + "contents": "element QE2 ${1:(1)} ${2:(2...5)} ${6:(6)} ${7:[7]}\n# (1) int, unique element tag\n# (2...5) int, node i, j, k, l\n# (6) int, material tag\n# [7] double, element thickness, default: 1.0", + "details": "Mixed Four-Node Quadrilateral Element", + "kind": "type", + "trigger": "QE2" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "R2D2" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "R3D2" + }, + { + "contents": "material RambergOsgood ${1:(1)} ${2:(2)} ${3:(3)} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique material tag\n# (2) double, elastic modulus\n# (3) double, initial yield stress\n# [4] double, offset alpha, default: 1.0\n# [5] double, n, default: 4.0\n# [6] double, density, default: 0.0", + "details": "Ramberg-Osgood Steel Model", + "kind": "type", + "trigger": "RambergOsgood" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Ramm" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Ramp" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Rayleigh" + }, + { + "contents": "integrator RayleighNewmark ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:(6)} ${7:(7)}\n# (1) int, unique tag\n# (2) double, alpha (beta in some references) in Newmark method, normally 0.25\n# (3) double, beta (gamma in some references) in Newmark method, normally 0.5\n# (4) double, alpha\n# (5) double, beta\n# (6) double, theta\n# (7) double, eta", + "details": "", + "kind": "type", + "trigger": "RayleighNewmark" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Rebar2D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Rebar3D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Recorder" + }, + { + "contents": "section Rectangle1D ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)}\n# (1) int, unique section tag\n# (2) double, section width\n# (3) double, section height\n# (4) int, material tag", + "details": "1D Rectangle Section", + "kind": "type", + "trigger": "Rectangle1D" + }, + { + "contents": "section Rectangle2D ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) double, section width\n# (3) double, section height\n# (4) int, material tag\n# [5] int, number of integration points, default: 6\n# [6] double, eccentricity measured from the centre, default: 0.0", + "details": "2D Rectangle Section", + "kind": "type", + "trigger": "Rectangle2D" + }, + { + "contents": "section Rectangle3D ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:[5]} ${6:[6]} ${7:[7]}\n# (1) int, unique section tag\n# (2) double, section width\n# (3) double, section height\n# (4) int, material tag\n# [5] int, number of integration points, default: 3\n# [6] double, eccentricity along y axis, default: 0.0\n# [7] double, eccentricity along z axis, default: 0.0", + "details": "3D Rectangle Section", + "kind": "type", + "trigger": "Rectangle3D" + }, + { + "contents": "converger RelDisp ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]}\n# (2) int, unique tag\n# (3) double, tolerance\n# (4) int, maximum iteration\n# [5] bool string, print switch, default: false\n", + "details": "Converger RelDisp", + "kind": "type", + "trigger": "RelDisp" + }, + { + "contents": "converger RelError ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]}\n# (2) int, unique tag\n# (3) double, tolerance\n# (4) int, maximum iteration\n# [5] bool string, print switch, default: false\n", + "details": "Converger RelError", + "kind": "type", + "trigger": "RelError" + }, + { + "contents": "converger RelIncreAcc ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]}\n# (2) int, unique tag\n# (3) double, tolerance\n# (4) int, maximum iteration\n# [5] bool string, print switch, default: false\n", + "details": "Converger RelIncreAcc", + "kind": "type", + "trigger": "RelIncreAcc" + }, + { + "contents": "converger RelIncreDisp ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]}\n# (2) int, unique tag\n# (3) double, tolerance\n# (4) int, maximum iteration\n# [5] bool string, print switch, default: false\n", + "details": "Converger RelIncreDisp", + "kind": "type", + "trigger": "RelIncreDisp" + }, + { + "contents": "converger RelIncreEnergy ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]}\n# (2) int, unique tag\n# (3) double, tolerance\n# (4) int, maximum iteration\n# [5] bool string, print switch, default: false\n", + "details": "Converger RelIncreEnergy", + "kind": "type", + "trigger": "RelIncreEnergy" + }, + { + "contents": "converger RelResidual ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]}\n# (2) int, unique tag\n# (3) double, tolerance\n# (4) int, maximum iteration\n# [5] bool string, print switch, default: false\n", + "details": "Converger RelResidual", + "kind": "type", + "trigger": "RelResidual" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Rotation2D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Rotation3D" + }, + { + "contents": "section US2D S10X25.4 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section S10X25.4", + "kind": "keyword", + "trigger": "S10X25.4" + }, + { + "contents": "section US3D S10X25.4 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section S10X25.4", + "kind": "keyword", + "trigger": "S10X25.4" + }, + { + "contents": "section US2D S10X35 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section S10X35", + "kind": "keyword", + "trigger": "S10X35" + }, + { + "contents": "section US3D S10X35 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section S10X35", + "kind": "keyword", + "trigger": "S10X35" + }, + { + "contents": "section US2D S12X31.8 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section S12X31.8", + "kind": "keyword", + "trigger": "S12X31.8" + }, + { + "contents": "section US3D S12X31.8 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section S12X31.8", + "kind": "keyword", + "trigger": "S12X31.8" + }, + { + "contents": "section US2D S12X35 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section S12X35", + "kind": "keyword", + "trigger": "S12X35" + }, + { + "contents": "section US3D S12X35 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section S12X35", + "kind": "keyword", + "trigger": "S12X35" + }, + { + "contents": "section US2D S12X40.8 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section S12X40.8", + "kind": "keyword", + "trigger": "S12X40.8" + }, + { + "contents": "section US3D S12X40.8 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section S12X40.8", + "kind": "keyword", + "trigger": "S12X40.8" + }, + { + "contents": "section US2D S12X50 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section S12X50", + "kind": "keyword", + "trigger": "S12X50" + }, + { + "contents": "section US3D S12X50 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section S12X50", + "kind": "keyword", + "trigger": "S12X50" + }, + { + "contents": "section US2D S15X42.9 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section S15X42.9", + "kind": "keyword", + "trigger": "S15X42.9" + }, + { + "contents": "section US3D S15X42.9 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section S15X42.9", + "kind": "keyword", + "trigger": "S15X42.9" + }, + { + "contents": "section US2D S15X50 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section S15X50", + "kind": "keyword", + "trigger": "S15X50" + }, + { + "contents": "section US3D S15X50 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section S15X50", + "kind": "keyword", + "trigger": "S15X50" + }, + { + "contents": "section US2D S18X54.7 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section S18X54.7", + "kind": "keyword", + "trigger": "S18X54.7" + }, + { + "contents": "section US3D S18X54.7 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section S18X54.7", + "kind": "keyword", + "trigger": "S18X54.7" + }, + { + "contents": "section US2D S18X70 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section S18X70", + "kind": "keyword", + "trigger": "S18X70" + }, + { + "contents": "section US3D S18X70 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section S18X70", + "kind": "keyword", + "trigger": "S18X70" + }, + { + "contents": "section US2D S20X66 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section S20X66", + "kind": "keyword", + "trigger": "S20X66" + }, + { + "contents": "section US3D S20X66 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section S20X66", + "kind": "keyword", + "trigger": "S20X66" + }, + { + "contents": "section US2D S20X75 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section S20X75", + "kind": "keyword", + "trigger": "S20X75" + }, + { + "contents": "section US3D S20X75 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section S20X75", + "kind": "keyword", + "trigger": "S20X75" + }, + { + "contents": "section US2D S20X86 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section S20X86", + "kind": "keyword", + "trigger": "S20X86" + }, + { + "contents": "section US3D S20X86 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section S20X86", + "kind": "keyword", + "trigger": "S20X86" + }, + { + "contents": "section US2D S20X96 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section S20X96", + "kind": "keyword", + "trigger": "S20X96" + }, + { + "contents": "section US3D S20X96 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section S20X96", + "kind": "keyword", + "trigger": "S20X96" + }, + { + "contents": "section US2D S24X100 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section S24X100", + "kind": "keyword", + "trigger": "S24X100" + }, + { + "contents": "section US3D S24X100 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section S24X100", + "kind": "keyword", + "trigger": "S24X100" + }, + { + "contents": "section US2D S24X106 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section S24X106", + "kind": "keyword", + "trigger": "S24X106" + }, + { + "contents": "section US3D S24X106 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section S24X106", + "kind": "keyword", + "trigger": "S24X106" + }, + { + "contents": "section US2D S24X121 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section S24X121", + "kind": "keyword", + "trigger": "S24X121" + }, + { + "contents": "section US3D S24X121 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section S24X121", + "kind": "keyword", + "trigger": "S24X121" + }, + { + "contents": "section US2D S24X80 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section S24X80", + "kind": "keyword", + "trigger": "S24X80" + }, + { + "contents": "section US3D S24X80 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section S24X80", + "kind": "keyword", + "trigger": "S24X80" + }, + { + "contents": "section US2D S24X90 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section S24X90", + "kind": "keyword", + "trigger": "S24X90" + }, + { + "contents": "section US3D S24X90 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section S24X90", + "kind": "keyword", + "trigger": "S24X90" + }, + { + "contents": "section US2D S3X5.7 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section S3X5.7", + "kind": "keyword", + "trigger": "S3X5.7" + }, + { + "contents": "section US3D S3X5.7 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section S3X5.7", + "kind": "keyword", + "trigger": "S3X5.7" + }, + { + "contents": "section US2D S3X7.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section S3X7.5", + "kind": "keyword", + "trigger": "S3X7.5" + }, + { + "contents": "section US3D S3X7.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section S3X7.5", + "kind": "keyword", + "trigger": "S3X7.5" + }, + { + "contents": "element S4 ${1:(1)} ${2:(2...5)} ${6:(6)} ${7:(7)}\n# (1) int, unique element tag\n# (2...5) int, node i, j, k, l\n# (6) int, material tag\n# (7) double, thickness", + "details": "Four Node Shell Element", + "kind": "type", + "trigger": "S4" + }, + { + "contents": "section US2D S4X7.7 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section S4X7.7", + "kind": "keyword", + "trigger": "S4X7.7" + }, + { + "contents": "section US3D S4X7.7 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section S4X7.7", + "kind": "keyword", + "trigger": "S4X7.7" + }, + { + "contents": "section US2D S4X9.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section S4X9.5", + "kind": "keyword", + "trigger": "S4X9.5" + }, + { + "contents": "section US3D S4X9.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section S4X9.5", + "kind": "keyword", + "trigger": "S4X9.5" + }, + { + "contents": "section US2D S5X10 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section S5X10", + "kind": "keyword", + "trigger": "S5X10" + }, + { + "contents": "section US3D S5X10 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section S5X10", + "kind": "keyword", + "trigger": "S5X10" + }, + { + "contents": "section US2D S6X12.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section S6X12.5", + "kind": "keyword", + "trigger": "S6X12.5" + }, + { + "contents": "section US3D S6X12.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section S6X12.5", + "kind": "keyword", + "trigger": "S6X12.5" + }, + { + "contents": "section US2D S6X17.25 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section S6X17.25", + "kind": "keyword", + "trigger": "S6X17.25" + }, + { + "contents": "section US3D S6X17.25 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section S6X17.25", + "kind": "keyword", + "trigger": "S6X17.25" + }, + { + "contents": "section US2D S8X18.4 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section S8X18.4", + "kind": "keyword", + "trigger": "S8X18.4" + }, + { + "contents": "section US3D S8X18.4 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section S8X18.4", + "kind": "keyword", + "trigger": "S8X18.4" + }, + { + "contents": "section US2D S8X23 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section S8X23", + "kind": "keyword", + "trigger": "S8X23" + }, + { + "contents": "section US3D S8X23 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section S8X23", + "kind": "keyword", + "trigger": "S8X23" + }, + { + "contents": "element SGCMQI ${1:(1)} ${2:(2...5)} ${6:(6)} ${7:[7]} ${8:[8]}\nelement SGCMQL ${1:(1)} ${2:(2...5)} ${6:(6)} ${7:[7]} ${8:[8]}\nelement SGCMQG ${1:(1)} ${2:(2...5)} ${6:(6)} ${7:[7]} ${8:[8]}\n# (1) int, unique element tag\n# (2...5) int, node i, j, k, l\n# (6) int, material tag\n# [7] double, element thickness, default: 1.0", + "details": "Generalized Conforming Mixed Quadrilateral With Drilling DoFs", + "kind": "type", + "trigger": "SGCMQ" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "SGCMQG" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "SGCMQI" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "SGCMQL" + }, + { + "contents": "element SGCMS ${1:(1)} ${2:(2...5)} ${6:(6)} ${7:(7)}\n# (1) int, unique element tag\n# (2...5) int, node i, j, k, l\n# (6) int, material tag\n# (7) double, thickness", + "details": "Simplified Generalized Conforming Mixed Shell Element", + "kind": "type", + "trigger": "SGCMS" + }, + { + "contents": "section US2D ST1.5X2.85 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section ST1.5X2.85", + "kind": "keyword", + "trigger": "ST1.5X2.85" + }, + { + "contents": "section US3D ST1.5X2.85 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section ST1.5X2.85", + "kind": "keyword", + "trigger": "ST1.5X2.85" + }, + { + "contents": "section US2D ST1.5X3.75 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section ST1.5X3.75", + "kind": "keyword", + "trigger": "ST1.5X3.75" + }, + { + "contents": "section US3D ST1.5X3.75 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section ST1.5X3.75", + "kind": "keyword", + "trigger": "ST1.5X3.75" + }, + { + "contents": "section US2D ST10X33 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section ST10X33", + "kind": "keyword", + "trigger": "ST10X33" + }, + { + "contents": "section US3D ST10X33 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section ST10X33", + "kind": "keyword", + "trigger": "ST10X33" + }, + { + "contents": "section US2D ST10X37.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section ST10X37.5", + "kind": "keyword", + "trigger": "ST10X37.5" + }, + { + "contents": "section US3D ST10X37.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section ST10X37.5", + "kind": "keyword", + "trigger": "ST10X37.5" + }, + { + "contents": "section US2D ST10X43 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section ST10X43", + "kind": "keyword", + "trigger": "ST10X43" + }, + { + "contents": "section US3D ST10X43 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section ST10X43", + "kind": "keyword", + "trigger": "ST10X43" + }, + { + "contents": "section US2D ST10X48 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section ST10X48", + "kind": "keyword", + "trigger": "ST10X48" + }, + { + "contents": "section US3D ST10X48 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section ST10X48", + "kind": "keyword", + "trigger": "ST10X48" + }, + { + "contents": "section US2D ST12X40 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section ST12X40", + "kind": "keyword", + "trigger": "ST12X40" + }, + { + "contents": "section US3D ST12X40 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section ST12X40", + "kind": "keyword", + "trigger": "ST12X40" + }, + { + "contents": "section US2D ST12X45 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section ST12X45", + "kind": "keyword", + "trigger": "ST12X45" + }, + { + "contents": "section US3D ST12X45 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section ST12X45", + "kind": "keyword", + "trigger": "ST12X45" + }, + { + "contents": "section US2D ST12X50 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section ST12X50", + "kind": "keyword", + "trigger": "ST12X50" + }, + { + "contents": "section US3D ST12X50 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section ST12X50", + "kind": "keyword", + "trigger": "ST12X50" + }, + { + "contents": "section US2D ST12X53 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section ST12X53", + "kind": "keyword", + "trigger": "ST12X53" + }, + { + "contents": "section US3D ST12X53 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section ST12X53", + "kind": "keyword", + "trigger": "ST12X53" + }, + { + "contents": "section US2D ST12X60.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section ST12X60.5", + "kind": "keyword", + "trigger": "ST12X60.5" + }, + { + "contents": "section US3D ST12X60.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section ST12X60.5", + "kind": "keyword", + "trigger": "ST12X60.5" + }, + { + "contents": "section US2D ST2.5X5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section ST2.5X5", + "kind": "keyword", + "trigger": "ST2.5X5" + }, + { + "contents": "section US3D ST2.5X5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section ST2.5X5", + "kind": "keyword", + "trigger": "ST2.5X5" + }, + { + "contents": "section US2D ST2X3.85 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section ST2X3.85", + "kind": "keyword", + "trigger": "ST2X3.85" + }, + { + "contents": "section US3D ST2X3.85 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section ST2X3.85", + "kind": "keyword", + "trigger": "ST2X3.85" + }, + { + "contents": "section US2D ST2X4.75 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section ST2X4.75", + "kind": "keyword", + "trigger": "ST2X4.75" + }, + { + "contents": "section US3D ST2X4.75 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section ST2X4.75", + "kind": "keyword", + "trigger": "ST2X4.75" + }, + { + "contents": "section US2D ST3X6.25 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section ST3X6.25", + "kind": "keyword", + "trigger": "ST3X6.25" + }, + { + "contents": "section US3D ST3X6.25 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section ST3X6.25", + "kind": "keyword", + "trigger": "ST3X6.25" + }, + { + "contents": "section US2D ST3X8.6 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section ST3X8.6", + "kind": "keyword", + "trigger": "ST3X8.6" + }, + { + "contents": "section US3D ST3X8.6 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section ST3X8.6", + "kind": "keyword", + "trigger": "ST3X8.6" + }, + { + "contents": "section US2D ST4X11.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section ST4X11.5", + "kind": "keyword", + "trigger": "ST4X11.5" + }, + { + "contents": "section US3D ST4X11.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section ST4X11.5", + "kind": "keyword", + "trigger": "ST4X11.5" + }, + { + "contents": "section US2D ST4X9.2 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section ST4X9.2", + "kind": "keyword", + "trigger": "ST4X9.2" + }, + { + "contents": "section US3D ST4X9.2 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section ST4X9.2", + "kind": "keyword", + "trigger": "ST4X9.2" + }, + { + "contents": "section US2D ST5X12.7 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section ST5X12.7", + "kind": "keyword", + "trigger": "ST5X12.7" + }, + { + "contents": "section US3D ST5X12.7 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section ST5X12.7", + "kind": "keyword", + "trigger": "ST5X12.7" + }, + { + "contents": "section US2D ST5X17.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section ST5X17.5", + "kind": "keyword", + "trigger": "ST5X17.5" + }, + { + "contents": "section US3D ST5X17.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section ST5X17.5", + "kind": "keyword", + "trigger": "ST5X17.5" + }, + { + "contents": "section US2D ST6X15.9 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section ST6X15.9", + "kind": "keyword", + "trigger": "ST6X15.9" + }, + { + "contents": "section US3D ST6X15.9 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section ST6X15.9", + "kind": "keyword", + "trigger": "ST6X15.9" + }, + { + "contents": "section US2D ST6X17.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section ST6X17.5", + "kind": "keyword", + "trigger": "ST6X17.5" + }, + { + "contents": "section US3D ST6X17.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section ST6X17.5", + "kind": "keyword", + "trigger": "ST6X17.5" + }, + { + "contents": "section US2D ST6X20.4 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section ST6X20.4", + "kind": "keyword", + "trigger": "ST6X20.4" + }, + { + "contents": "section US3D ST6X20.4 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section ST6X20.4", + "kind": "keyword", + "trigger": "ST6X20.4" + }, + { + "contents": "section US2D ST6X25 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section ST6X25", + "kind": "keyword", + "trigger": "ST6X25" + }, + { + "contents": "section US3D ST6X25 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section ST6X25", + "kind": "keyword", + "trigger": "ST6X25" + }, + { + "contents": "section US2D ST7.5X21.45 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section ST7.5X21.45", + "kind": "keyword", + "trigger": "ST7.5X21.45" + }, + { + "contents": "section US3D ST7.5X21.45 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section ST7.5X21.45", + "kind": "keyword", + "trigger": "ST7.5X21.45" + }, + { + "contents": "section US2D ST7.5X25 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section ST7.5X25", + "kind": "keyword", + "trigger": "ST7.5X25" + }, + { + "contents": "section US3D ST7.5X25 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section ST7.5X25", + "kind": "keyword", + "trigger": "ST7.5X25" + }, + { + "contents": "section US2D ST9X27.35 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section ST9X27.35", + "kind": "keyword", + "trigger": "ST9X27.35" + }, + { + "contents": "section US3D ST9X27.35 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section ST9X27.35", + "kind": "keyword", + "trigger": "ST9X27.35" + }, + { + "contents": "section US2D ST9X35 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section ST9X35", + "kind": "keyword", + "trigger": "ST9X35" + }, + { + "contents": "section US3D ST9X35 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section ST9X35", + "kind": "keyword", + "trigger": "ST9X35" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Scale" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Sequential" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "SimpleSand" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Sine" + }, + { + "contents": "element SingleSection2D ${1:(1)} ${2:(2)} ${3:(3)}\n# (1) int, unique tag\n# (2) int, node tag\n# (3) int, section tag", + "details": "2D Single Section", + "kind": "type", + "trigger": "SingleSection2D" + }, + { + "contents": "element SingleSection3D ${1:(1)} ${2:(2)} ${3:(3)}\n# (1) int, unique tag\n# (2) int, node tag\n# (3) int, section tag", + "details": "3D Single Section", + "kind": "type", + "trigger": "SingleSection3D" + }, + { + "contents": "material Sinh1D ${1:(1)} ${2:(2)} ${3:[3]}\n# (1) int, unique material tag\n# (2) double, elastic modulus\n# [3] double, density, default: 0.0", + "details": "Uniaxial Nonlinear Elastic Material Using Sinh", + "kind": "type", + "trigger": "Sinh1D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Sleeve2D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Sleeve3D" + }, + { + "contents": "material SlipLock ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:[5]} ${6:[6]}\n# (1) int, unique material tag\n# (2) double, elastic modulus\n# (3) double, initial yield strain\n# (4) double, hardening ratio\n# [5] double, radius, default: 20.0\n# [6] double, density, default: 0.0", + "details": "Slip-Lock Material", + "kind": "type", + "trigger": "SlipLock" + }, + { + "contents": "set system_solver Spike", + "details": "Use Spike Solver", + "kind": "type", + "trigger": "Spike" + }, + { + "contents": "element Spring01 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)}\n# (1) int, unique tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, tag of associated material", + "details": "", + "kind": "type", + "trigger": "Spring01" + }, + { + "contents": "element Spring02 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)}\n# (1) int, unique tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, tag of associated material", + "details": "", + "kind": "type", + "trigger": "Spring02" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Stacked" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Static" + }, + { + "contents": "material SteelBRB ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:(6)} ${7:(7)} ${8:(8)} ${9:(9)} ${10:(10)} ${11:[11]}\n# (1) int, unique material tag\n# (2) double, elastic modulus\n# (3) double, yield stress\n# (4) double, plastic modulus\n# (5) double, tension saturated stress\n# (6) double, tension delta_r\n# (7) double, tension alpha\n# (8) double, compression saturated stress\n# (9) double, compression delta_r\n# (10) double, compression alpha\n# [11] double, density, default: 0.0", + "details": "Steel Model For Modelling BRB", + "kind": "type", + "trigger": "SteelBRB" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Stiffness" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "StrainEnergyEvolution" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Substepping" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Sum" + }, + { + "contents": "set system_solver SuperLU", + "details": "Use SuperLU Solver", + "kind": "type", + "trigger": "SuperLU" + }, + { + "contents": "element T2D2 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:[6]} ${7:[7]} ${8:[8]} ${9:[9]}\n# (1) int, unique element tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, material tag\n# (5) double, cross sectional area\n# [6] bool string, nonlinear geometry switch, default: false\n# [7] bool string, if to update sectional area, default: false\n# [8] bool string, if to use log strain, default: false\n# [9] double, flexural rigidity, -1.0", + "details": "2D Linear Truss", + "kind": "type", + "trigger": "T2D2" + }, + { + "contents": "element T2D2S ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${6:[6]} ${7:[7]} ${8:[8]}\n# (1) int, unique element tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, section tag\n# [5] bool string, nonlinear geometry switch, default: false\n# [6] bool string, if to use log strain, default: false", + "details": "2D Linear Truss Using Section", + "kind": "type", + "trigger": "T2D2S" + }, + { + "contents": "element T3D2 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:[6]} ${7:[7]} ${8:[8]}\n# (1) int, unique element tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, material tag\n# (5) double, cross sectional area\n# [6] bool string, nonlinear geometry switch, default: false\n# [7] bool string, if to update sectional area, default: false\n# [8] bool string, if to use log strain, default: false", + "details": "3D Linear Truss", + "kind": "type", + "trigger": "T3D2" + }, + { + "contents": "element T3D2S ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${6:[6]} ${7:[7]} ${8:[8]}\n# (1) int, unique element tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, section tag\n# [5] bool string, nonlinear geometry switch, default: false\n# [6] bool string, if to use log strain, default: false", + "details": "3D Linear Truss Using Section", + "kind": "type", + "trigger": "T3D2S" + }, + { + "contents": "section TSection2D ${1:(1)} ${2:(2...5)} ${6:(6)} ${7:[7]} ${8:[8]}\n# (1) int, unique tag\n# (2...5) double, section dimensions\n# (6) int, material tag\n# [7] int, number of integration points, default: 6\n# [8] double, eccentricity measured from the centre, default: 0.0", + "details": "2D T-Section", + "kind": "type", + "trigger": "TSection2D" + }, + { + "contents": "section TSection3D ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:(6)} ${7:[7]} ${8:[8]} ${9:[9]}\n# (1) int, unique section tag\n# (2) double, top flange width\n# (3) double, top flange thickness\n# (4) double, web height\n# (5) double, web thickness\n# (6) int, material tag\n# [7] int, number of integration points, default: 3\n# [8] double, eccentricity along y axis, default: 0.0\n# [9] double, eccentricity along z axis, default: 0.0", + "details": "3D T-Section", + "kind": "type", + "trigger": "TSection3D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "TableCDP" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "TableGurson" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Tabular" + }, + { + "contents": "material Tanh1D ${1:(1)} ${2:(2)} ${3:[3]}\n# (1) int, unique material tag\n# (2) double, elastic modulus\n# [3] double, density, default: 0.0", + "details": "Uniaxial Nonlinear Elastic Material Using Tanh", + "kind": "type", + "trigger": "Tanh1D" + }, + { + "contents": "integrator Tchamwa ${1:(1)} ${2:(2)}\n# (1) int, unique integrator tag\n# [2] double, spectral radius, default: 0.5", + "details": "", + "kind": "type", + "trigger": "Tchamwa" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Tie" + }, + { + "contents": "element Tie ${1:(1)} ${2:(2)} ${3:(3)} ${(4:[(4)} ${5:(5)} ${6:(6)}...]\n# (1) int, unique element tag\n# (2) double, right hand side of the constraint equation, the constraint is homogeneous if this parameter is zero\n# (3) double, penalty number, a relatively large number\n# (4) int, node tag\n# (5) int, dof tag\n# (6) double, weight", + "details": "", + "kind": "type", + "trigger": "Tie" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "TrilinearDegradation" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Trivial" + }, + { + "contents": "section TrussSection ${1:(1)} ${2:(2)} ${3:(3)}\n# (1) int, unique section tag\n# (2) double, section area\n# (3) int, material tag", + "details": "1D Truss Section", + "kind": "type", + "trigger": "TrussSection" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "US2D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "US3D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Uniaxial" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "VAFCRP" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "VAFCRP1D" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Viscosity01" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Viscosity02" + }, + { + "contents": "", + "details": "", + "kind": "type", + "trigger": "Visualisation" + }, + { + "contents": "section US2D W10X100 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W10X100", + "kind": "keyword", + "trigger": "W10X100" + }, + { + "contents": "section US3D W10X100 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W10X100", + "kind": "keyword", + "trigger": "W10X100" + }, + { + "contents": "section US2D W10X112 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W10X112", + "kind": "keyword", + "trigger": "W10X112" + }, + { + "contents": "section US3D W10X112 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W10X112", + "kind": "keyword", + "trigger": "W10X112" + }, + { + "contents": "section US2D W10X12 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W10X12", + "kind": "keyword", + "trigger": "W10X12" + }, + { + "contents": "section US3D W10X12 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W10X12", + "kind": "keyword", + "trigger": "W10X12" + }, + { + "contents": "section US2D W10X15 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W10X15", + "kind": "keyword", + "trigger": "W10X15" + }, + { + "contents": "section US3D W10X15 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W10X15", + "kind": "keyword", + "trigger": "W10X15" + }, + { + "contents": "section US2D W10X17 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W10X17", + "kind": "keyword", + "trigger": "W10X17" + }, + { + "contents": "section US3D W10X17 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W10X17", + "kind": "keyword", + "trigger": "W10X17" + }, + { + "contents": "section US2D W10X19 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W10X19", + "kind": "keyword", + "trigger": "W10X19" + }, + { + "contents": "section US3D W10X19 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W10X19", + "kind": "keyword", + "trigger": "W10X19" + }, + { + "contents": "section US2D W10X22 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W10X22", + "kind": "keyword", + "trigger": "W10X22" + }, + { + "contents": "section US3D W10X22 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W10X22", + "kind": "keyword", + "trigger": "W10X22" + }, + { + "contents": "section US2D W10X26 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W10X26", + "kind": "keyword", + "trigger": "W10X26" + }, + { + "contents": "section US3D W10X26 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W10X26", + "kind": "keyword", + "trigger": "W10X26" + }, + { + "contents": "section US2D W10X30 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W10X30", + "kind": "keyword", + "trigger": "W10X30" + }, + { + "contents": "section US3D W10X30 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W10X30", + "kind": "keyword", + "trigger": "W10X30" + }, + { + "contents": "section US2D W10X33 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W10X33", + "kind": "keyword", + "trigger": "W10X33" + }, + { + "contents": "section US3D W10X33 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W10X33", + "kind": "keyword", + "trigger": "W10X33" + }, + { + "contents": "section US2D W10X39 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W10X39", + "kind": "keyword", + "trigger": "W10X39" + }, + { + "contents": "section US3D W10X39 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W10X39", + "kind": "keyword", + "trigger": "W10X39" + }, + { + "contents": "section US2D W10X45 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W10X45", + "kind": "keyword", + "trigger": "W10X45" + }, + { + "contents": "section US3D W10X45 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W10X45", + "kind": "keyword", + "trigger": "W10X45" + }, + { + "contents": "section US2D W10X49 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W10X49", + "kind": "keyword", + "trigger": "W10X49" + }, + { + "contents": "section US3D W10X49 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W10X49", + "kind": "keyword", + "trigger": "W10X49" + }, + { + "contents": "section US2D W10X54 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W10X54", + "kind": "keyword", + "trigger": "W10X54" + }, + { + "contents": "section US3D W10X54 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W10X54", + "kind": "keyword", + "trigger": "W10X54" + }, + { + "contents": "section US2D W10X60 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W10X60", + "kind": "keyword", + "trigger": "W10X60" + }, + { + "contents": "section US3D W10X60 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W10X60", + "kind": "keyword", + "trigger": "W10X60" + }, + { + "contents": "section US2D W10X68 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W10X68", + "kind": "keyword", + "trigger": "W10X68" + }, + { + "contents": "section US3D W10X68 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W10X68", + "kind": "keyword", + "trigger": "W10X68" + }, + { + "contents": "section US2D W10X77 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W10X77", + "kind": "keyword", + "trigger": "W10X77" + }, + { + "contents": "section US3D W10X77 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W10X77", + "kind": "keyword", + "trigger": "W10X77" + }, + { + "contents": "section US2D W10X88 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W10X88", + "kind": "keyword", + "trigger": "W10X88" + }, + { + "contents": "section US3D W10X88 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W10X88", + "kind": "keyword", + "trigger": "W10X88" + }, + { + "contents": "section US2D W12X106 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W12X106", + "kind": "keyword", + "trigger": "W12X106" + }, + { + "contents": "section US3D W12X106 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W12X106", + "kind": "keyword", + "trigger": "W12X106" + }, + { + "contents": "section US2D W12X120 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W12X120", + "kind": "keyword", + "trigger": "W12X120" + }, + { + "contents": "section US3D W12X120 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W12X120", + "kind": "keyword", + "trigger": "W12X120" + }, + { + "contents": "section US2D W12X136 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W12X136", + "kind": "keyword", + "trigger": "W12X136" + }, + { + "contents": "section US3D W12X136 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W12X136", + "kind": "keyword", + "trigger": "W12X136" + }, + { + "contents": "section US2D W12X14 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W12X14", + "kind": "keyword", + "trigger": "W12X14" + }, + { + "contents": "section US3D W12X14 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W12X14", + "kind": "keyword", + "trigger": "W12X14" + }, + { + "contents": "section US2D W12X152 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W12X152", + "kind": "keyword", + "trigger": "W12X152" + }, + { + "contents": "section US3D W12X152 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W12X152", + "kind": "keyword", + "trigger": "W12X152" + }, + { + "contents": "section US2D W12X16 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W12X16", + "kind": "keyword", + "trigger": "W12X16" + }, + { + "contents": "section US3D W12X16 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W12X16", + "kind": "keyword", + "trigger": "W12X16" + }, + { + "contents": "section US2D W12X170 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W12X170", + "kind": "keyword", + "trigger": "W12X170" + }, + { + "contents": "section US3D W12X170 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W12X170", + "kind": "keyword", + "trigger": "W12X170" + }, + { + "contents": "section US2D W12X19 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W12X19", + "kind": "keyword", + "trigger": "W12X19" + }, + { + "contents": "section US3D W12X19 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W12X19", + "kind": "keyword", + "trigger": "W12X19" + }, + { + "contents": "section US2D W12X190 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W12X190", + "kind": "keyword", + "trigger": "W12X190" + }, + { + "contents": "section US3D W12X190 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W12X190", + "kind": "keyword", + "trigger": "W12X190" + }, + { + "contents": "section US2D W12X210 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W12X210", + "kind": "keyword", + "trigger": "W12X210" + }, + { + "contents": "section US3D W12X210 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W12X210", + "kind": "keyword", + "trigger": "W12X210" + }, + { + "contents": "section US2D W12X22 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W12X22", + "kind": "keyword", + "trigger": "W12X22" + }, + { + "contents": "section US3D W12X22 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W12X22", + "kind": "keyword", + "trigger": "W12X22" + }, + { + "contents": "section US2D W12X230 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W12X230", + "kind": "keyword", + "trigger": "W12X230" + }, + { + "contents": "section US3D W12X230 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W12X230", + "kind": "keyword", + "trigger": "W12X230" + }, + { + "contents": "section US2D W12X252 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W12X252", + "kind": "keyword", + "trigger": "W12X252" + }, + { + "contents": "section US3D W12X252 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W12X252", + "kind": "keyword", + "trigger": "W12X252" + }, + { + "contents": "section US2D W12X26 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W12X26", + "kind": "keyword", + "trigger": "W12X26" + }, + { + "contents": "section US3D W12X26 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W12X26", + "kind": "keyword", + "trigger": "W12X26" + }, + { + "contents": "section US2D W12X279 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W12X279", + "kind": "keyword", + "trigger": "W12X279" + }, + { + "contents": "section US3D W12X279 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W12X279", + "kind": "keyword", + "trigger": "W12X279" + }, + { + "contents": "section US2D W12X30 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W12X30", + "kind": "keyword", + "trigger": "W12X30" + }, + { + "contents": "section US3D W12X30 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W12X30", + "kind": "keyword", + "trigger": "W12X30" + }, + { + "contents": "section US2D W12X305 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W12X305", + "kind": "keyword", + "trigger": "W12X305" + }, + { + "contents": "section US3D W12X305 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W12X305", + "kind": "keyword", + "trigger": "W12X305" + }, + { + "contents": "section US2D W12X336 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W12X336", + "kind": "keyword", + "trigger": "W12X336" + }, + { + "contents": "section US3D W12X336 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W12X336", + "kind": "keyword", + "trigger": "W12X336" + }, + { + "contents": "section US2D W12X35 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W12X35", + "kind": "keyword", + "trigger": "W12X35" + }, + { + "contents": "section US3D W12X35 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W12X35", + "kind": "keyword", + "trigger": "W12X35" + }, + { + "contents": "section US2D W12X40 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W12X40", + "kind": "keyword", + "trigger": "W12X40" + }, + { + "contents": "section US3D W12X40 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W12X40", + "kind": "keyword", + "trigger": "W12X40" + }, + { + "contents": "section US2D W12X45 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W12X45", + "kind": "keyword", + "trigger": "W12X45" + }, + { + "contents": "section US3D W12X45 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W12X45", + "kind": "keyword", + "trigger": "W12X45" + }, + { + "contents": "section US2D W12X50 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W12X50", + "kind": "keyword", + "trigger": "W12X50" + }, + { + "contents": "section US3D W12X50 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W12X50", + "kind": "keyword", + "trigger": "W12X50" + }, + { + "contents": "section US2D W12X53 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W12X53", + "kind": "keyword", + "trigger": "W12X53" + }, + { + "contents": "section US3D W12X53 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W12X53", + "kind": "keyword", + "trigger": "W12X53" + }, + { + "contents": "section US2D W12X58 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W12X58", + "kind": "keyword", + "trigger": "W12X58" + }, + { + "contents": "section US3D W12X58 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W12X58", + "kind": "keyword", + "trigger": "W12X58" + }, + { + "contents": "section US2D W12X65 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W12X65", + "kind": "keyword", + "trigger": "W12X65" + }, + { + "contents": "section US3D W12X65 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W12X65", + "kind": "keyword", + "trigger": "W12X65" + }, + { + "contents": "section US2D W12X72 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W12X72", + "kind": "keyword", + "trigger": "W12X72" + }, + { + "contents": "section US3D W12X72 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W12X72", + "kind": "keyword", + "trigger": "W12X72" + }, + { + "contents": "section US2D W12X79 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W12X79", + "kind": "keyword", + "trigger": "W12X79" + }, + { + "contents": "section US3D W12X79 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W12X79", + "kind": "keyword", + "trigger": "W12X79" + }, + { + "contents": "section US2D W12X87 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W12X87", + "kind": "keyword", + "trigger": "W12X87" + }, + { + "contents": "section US3D W12X87 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W12X87", + "kind": "keyword", + "trigger": "W12X87" + }, + { + "contents": "section US2D W12X96 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W12X96", + "kind": "keyword", + "trigger": "W12X96" + }, + { + "contents": "section US3D W12X96 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W12X96", + "kind": "keyword", + "trigger": "W12X96" + }, + { + "contents": "section US2D W14X109 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W14X109", + "kind": "keyword", + "trigger": "W14X109" + }, + { + "contents": "section US3D W14X109 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W14X109", + "kind": "keyword", + "trigger": "W14X109" + }, + { + "contents": "section US2D W14X120 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W14X120", + "kind": "keyword", + "trigger": "W14X120" + }, + { + "contents": "section US3D W14X120 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W14X120", + "kind": "keyword", + "trigger": "W14X120" + }, + { + "contents": "section US2D W14X132 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W14X132", + "kind": "keyword", + "trigger": "W14X132" + }, + { + "contents": "section US3D W14X132 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W14X132", + "kind": "keyword", + "trigger": "W14X132" + }, + { + "contents": "section US2D W14X145 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W14X145", + "kind": "keyword", + "trigger": "W14X145" + }, + { + "contents": "section US3D W14X145 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W14X145", + "kind": "keyword", + "trigger": "W14X145" + }, + { + "contents": "section US2D W14X159 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W14X159", + "kind": "keyword", + "trigger": "W14X159" + }, + { + "contents": "section US3D W14X159 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W14X159", + "kind": "keyword", + "trigger": "W14X159" + }, + { + "contents": "section US2D W14X176 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W14X176", + "kind": "keyword", + "trigger": "W14X176" + }, + { + "contents": "section US3D W14X176 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W14X176", + "kind": "keyword", + "trigger": "W14X176" + }, + { + "contents": "section US2D W14X193 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W14X193", + "kind": "keyword", + "trigger": "W14X193" + }, + { + "contents": "section US3D W14X193 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W14X193", + "kind": "keyword", + "trigger": "W14X193" + }, + { + "contents": "section US2D W14X211 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W14X211", + "kind": "keyword", + "trigger": "W14X211" + }, + { + "contents": "section US3D W14X211 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W14X211", + "kind": "keyword", + "trigger": "W14X211" + }, + { + "contents": "section US2D W14X22 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W14X22", + "kind": "keyword", + "trigger": "W14X22" + }, + { + "contents": "section US3D W14X22 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W14X22", + "kind": "keyword", + "trigger": "W14X22" + }, + { + "contents": "section US2D W14X233 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W14X233", + "kind": "keyword", + "trigger": "W14X233" + }, + { + "contents": "section US3D W14X233 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W14X233", + "kind": "keyword", + "trigger": "W14X233" + }, + { + "contents": "section US2D W14X257 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W14X257", + "kind": "keyword", + "trigger": "W14X257" + }, + { + "contents": "section US3D W14X257 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W14X257", + "kind": "keyword", + "trigger": "W14X257" + }, + { + "contents": "section US2D W14X26 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W14X26", + "kind": "keyword", + "trigger": "W14X26" + }, + { + "contents": "section US3D W14X26 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W14X26", + "kind": "keyword", + "trigger": "W14X26" + }, + { + "contents": "section US2D W14X283 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W14X283", + "kind": "keyword", + "trigger": "W14X283" + }, + { + "contents": "section US3D W14X283 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W14X283", + "kind": "keyword", + "trigger": "W14X283" + }, + { + "contents": "section US2D W14X30 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W14X30", + "kind": "keyword", + "trigger": "W14X30" + }, + { + "contents": "section US3D W14X30 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W14X30", + "kind": "keyword", + "trigger": "W14X30" + }, + { + "contents": "section US2D W14X311 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W14X311", + "kind": "keyword", + "trigger": "W14X311" + }, + { + "contents": "section US3D W14X311 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W14X311", + "kind": "keyword", + "trigger": "W14X311" + }, + { + "contents": "section US2D W14X34 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W14X34", + "kind": "keyword", + "trigger": "W14X34" + }, + { + "contents": "section US3D W14X34 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W14X34", + "kind": "keyword", + "trigger": "W14X34" + }, + { + "contents": "section US2D W14X342 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W14X342", + "kind": "keyword", + "trigger": "W14X342" + }, + { + "contents": "section US3D W14X342 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W14X342", + "kind": "keyword", + "trigger": "W14X342" + }, + { + "contents": "section US2D W14X370 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W14X370", + "kind": "keyword", + "trigger": "W14X370" + }, + { + "contents": "section US3D W14X370 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W14X370", + "kind": "keyword", + "trigger": "W14X370" + }, + { + "contents": "section US2D W14X38 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W14X38", + "kind": "keyword", + "trigger": "W14X38" + }, + { + "contents": "section US3D W14X38 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W14X38", + "kind": "keyword", + "trigger": "W14X38" + }, + { + "contents": "section US2D W14X398 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W14X398", + "kind": "keyword", + "trigger": "W14X398" + }, + { + "contents": "section US3D W14X398 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W14X398", + "kind": "keyword", + "trigger": "W14X398" + }, + { + "contents": "section US2D W14X426 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W14X426", + "kind": "keyword", + "trigger": "W14X426" + }, + { + "contents": "section US3D W14X426 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W14X426", + "kind": "keyword", + "trigger": "W14X426" + }, + { + "contents": "section US2D W14X43 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W14X43", + "kind": "keyword", + "trigger": "W14X43" + }, + { + "contents": "section US3D W14X43 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W14X43", + "kind": "keyword", + "trigger": "W14X43" + }, + { + "contents": "section US2D W14X455 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W14X455", + "kind": "keyword", + "trigger": "W14X455" + }, + { + "contents": "section US3D W14X455 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W14X455", + "kind": "keyword", + "trigger": "W14X455" + }, + { + "contents": "section US2D W14X48 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W14X48", + "kind": "keyword", + "trigger": "W14X48" + }, + { + "contents": "section US3D W14X48 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W14X48", + "kind": "keyword", + "trigger": "W14X48" + }, + { + "contents": "section US2D W14X500 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W14X500", + "kind": "keyword", + "trigger": "W14X500" + }, + { + "contents": "section US3D W14X500 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W14X500", + "kind": "keyword", + "trigger": "W14X500" + }, + { + "contents": "section US2D W14X53 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W14X53", + "kind": "keyword", + "trigger": "W14X53" + }, + { + "contents": "section US3D W14X53 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W14X53", + "kind": "keyword", + "trigger": "W14X53" + }, + { + "contents": "section US2D W14X550 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W14X550", + "kind": "keyword", + "trigger": "W14X550" + }, + { + "contents": "section US3D W14X550 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W14X550", + "kind": "keyword", + "trigger": "W14X550" + }, + { + "contents": "section US2D W14X605 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W14X605", + "kind": "keyword", + "trigger": "W14X605" + }, + { + "contents": "section US3D W14X605 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W14X605", + "kind": "keyword", + "trigger": "W14X605" + }, + { + "contents": "section US2D W14X61 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W14X61", + "kind": "keyword", + "trigger": "W14X61" + }, + { + "contents": "section US3D W14X61 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W14X61", + "kind": "keyword", + "trigger": "W14X61" + }, + { + "contents": "section US2D W14X665 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W14X665", + "kind": "keyword", + "trigger": "W14X665" + }, + { + "contents": "section US3D W14X665 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W14X665", + "kind": "keyword", + "trigger": "W14X665" + }, + { + "contents": "section US2D W14X68 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W14X68", + "kind": "keyword", + "trigger": "W14X68" + }, + { + "contents": "section US3D W14X68 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W14X68", + "kind": "keyword", + "trigger": "W14X68" + }, + { + "contents": "section US2D W14X730 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W14X730", + "kind": "keyword", + "trigger": "W14X730" + }, + { + "contents": "section US3D W14X730 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W14X730", + "kind": "keyword", + "trigger": "W14X730" + }, + { + "contents": "section US2D W14X74 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W14X74", + "kind": "keyword", + "trigger": "W14X74" + }, + { + "contents": "section US3D W14X74 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W14X74", + "kind": "keyword", + "trigger": "W14X74" + }, + { + "contents": "section US2D W14X808 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W14X808", + "kind": "keyword", + "trigger": "W14X808" + }, + { + "contents": "section US3D W14X808 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W14X808", + "kind": "keyword", + "trigger": "W14X808" + }, + { + "contents": "section US2D W14X82 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W14X82", + "kind": "keyword", + "trigger": "W14X82" + }, + { + "contents": "section US3D W14X82 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W14X82", + "kind": "keyword", + "trigger": "W14X82" + }, + { + "contents": "section US2D W14X873 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W14X873", + "kind": "keyword", + "trigger": "W14X873" + }, + { + "contents": "section US3D W14X873 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W14X873", + "kind": "keyword", + "trigger": "W14X873" + }, + { + "contents": "section US2D W14X90 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W14X90", + "kind": "keyword", + "trigger": "W14X90" + }, + { + "contents": "section US3D W14X90 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W14X90", + "kind": "keyword", + "trigger": "W14X90" + }, + { + "contents": "section US2D W14X99 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W14X99", + "kind": "keyword", + "trigger": "W14X99" + }, + { + "contents": "section US3D W14X99 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W14X99", + "kind": "keyword", + "trigger": "W14X99" + }, + { + "contents": "section US2D W16X100 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W16X100", + "kind": "keyword", + "trigger": "W16X100" + }, + { + "contents": "section US3D W16X100 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W16X100", + "kind": "keyword", + "trigger": "W16X100" + }, + { + "contents": "section US2D W16X26 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W16X26", + "kind": "keyword", + "trigger": "W16X26" + }, + { + "contents": "section US3D W16X26 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W16X26", + "kind": "keyword", + "trigger": "W16X26" + }, + { + "contents": "section US2D W16X31 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W16X31", + "kind": "keyword", + "trigger": "W16X31" + }, + { + "contents": "section US3D W16X31 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W16X31", + "kind": "keyword", + "trigger": "W16X31" + }, + { + "contents": "section US2D W16X36 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W16X36", + "kind": "keyword", + "trigger": "W16X36" + }, + { + "contents": "section US3D W16X36 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W16X36", + "kind": "keyword", + "trigger": "W16X36" + }, + { + "contents": "section US2D W16X40 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W16X40", + "kind": "keyword", + "trigger": "W16X40" + }, + { + "contents": "section US3D W16X40 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W16X40", + "kind": "keyword", + "trigger": "W16X40" + }, + { + "contents": "section US2D W16X45 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W16X45", + "kind": "keyword", + "trigger": "W16X45" + }, + { + "contents": "section US3D W16X45 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W16X45", + "kind": "keyword", + "trigger": "W16X45" + }, + { + "contents": "section US2D W16X50 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W16X50", + "kind": "keyword", + "trigger": "W16X50" + }, + { + "contents": "section US3D W16X50 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W16X50", + "kind": "keyword", + "trigger": "W16X50" + }, + { + "contents": "section US2D W16X57 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W16X57", + "kind": "keyword", + "trigger": "W16X57" + }, + { + "contents": "section US3D W16X57 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W16X57", + "kind": "keyword", + "trigger": "W16X57" + }, + { + "contents": "section US2D W16X67 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W16X67", + "kind": "keyword", + "trigger": "W16X67" + }, + { + "contents": "section US3D W16X67 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W16X67", + "kind": "keyword", + "trigger": "W16X67" + }, + { + "contents": "section US2D W16X77 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W16X77", + "kind": "keyword", + "trigger": "W16X77" + }, + { + "contents": "section US3D W16X77 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W16X77", + "kind": "keyword", + "trigger": "W16X77" + }, + { + "contents": "section US2D W16X89 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W16X89", + "kind": "keyword", + "trigger": "W16X89" + }, + { + "contents": "section US3D W16X89 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W16X89", + "kind": "keyword", + "trigger": "W16X89" + }, + { + "contents": "section US2D W18X106 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W18X106", + "kind": "keyword", + "trigger": "W18X106" + }, + { + "contents": "section US3D W18X106 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W18X106", + "kind": "keyword", + "trigger": "W18X106" + }, + { + "contents": "section US2D W18X119 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W18X119", + "kind": "keyword", + "trigger": "W18X119" + }, + { + "contents": "section US3D W18X119 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W18X119", + "kind": "keyword", + "trigger": "W18X119" + }, + { + "contents": "section US2D W18X130 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W18X130", + "kind": "keyword", + "trigger": "W18X130" + }, + { + "contents": "section US3D W18X130 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W18X130", + "kind": "keyword", + "trigger": "W18X130" + }, + { + "contents": "section US2D W18X143 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W18X143", + "kind": "keyword", + "trigger": "W18X143" + }, + { + "contents": "section US3D W18X143 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W18X143", + "kind": "keyword", + "trigger": "W18X143" + }, + { + "contents": "section US2D W18X158 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W18X158", + "kind": "keyword", + "trigger": "W18X158" + }, + { + "contents": "section US3D W18X158 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W18X158", + "kind": "keyword", + "trigger": "W18X158" + }, + { + "contents": "section US2D W18X175 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W18X175", + "kind": "keyword", + "trigger": "W18X175" + }, + { + "contents": "section US3D W18X175 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W18X175", + "kind": "keyword", + "trigger": "W18X175" + }, + { + "contents": "section US2D W18X192 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W18X192", + "kind": "keyword", + "trigger": "W18X192" + }, + { + "contents": "section US3D W18X192 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W18X192", + "kind": "keyword", + "trigger": "W18X192" + }, + { + "contents": "section US2D W18X211 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W18X211", + "kind": "keyword", + "trigger": "W18X211" + }, + { + "contents": "section US3D W18X211 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W18X211", + "kind": "keyword", + "trigger": "W18X211" + }, + { + "contents": "section US2D W18X234 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W18X234", + "kind": "keyword", + "trigger": "W18X234" + }, + { + "contents": "section US3D W18X234 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W18X234", + "kind": "keyword", + "trigger": "W18X234" + }, + { + "contents": "section US2D W18X258 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W18X258", + "kind": "keyword", + "trigger": "W18X258" + }, + { + "contents": "section US3D W18X258 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W18X258", + "kind": "keyword", + "trigger": "W18X258" + }, + { + "contents": "section US2D W18X283 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W18X283", + "kind": "keyword", + "trigger": "W18X283" + }, + { + "contents": "section US3D W18X283 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W18X283", + "kind": "keyword", + "trigger": "W18X283" + }, + { + "contents": "section US2D W18X311 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W18X311", + "kind": "keyword", + "trigger": "W18X311" + }, + { + "contents": "section US3D W18X311 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W18X311", + "kind": "keyword", + "trigger": "W18X311" + }, + { + "contents": "section US2D W18X35 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W18X35", + "kind": "keyword", + "trigger": "W18X35" + }, + { + "contents": "section US3D W18X35 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W18X35", + "kind": "keyword", + "trigger": "W18X35" + }, + { + "contents": "section US2D W18X40 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W18X40", + "kind": "keyword", + "trigger": "W18X40" + }, + { + "contents": "section US3D W18X40 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W18X40", + "kind": "keyword", + "trigger": "W18X40" + }, + { + "contents": "section US2D W18X46 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W18X46", + "kind": "keyword", + "trigger": "W18X46" + }, + { + "contents": "section US3D W18X46 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W18X46", + "kind": "keyword", + "trigger": "W18X46" + }, + { + "contents": "section US2D W18X50 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W18X50", + "kind": "keyword", + "trigger": "W18X50" + }, + { + "contents": "section US3D W18X50 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W18X50", + "kind": "keyword", + "trigger": "W18X50" + }, + { + "contents": "section US2D W18X55 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W18X55", + "kind": "keyword", + "trigger": "W18X55" + }, + { + "contents": "section US3D W18X55 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W18X55", + "kind": "keyword", + "trigger": "W18X55" + }, + { + "contents": "section US2D W18X60 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W18X60", + "kind": "keyword", + "trigger": "W18X60" + }, + { + "contents": "section US3D W18X60 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W18X60", + "kind": "keyword", + "trigger": "W18X60" + }, + { + "contents": "section US2D W18X65 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W18X65", + "kind": "keyword", + "trigger": "W18X65" + }, + { + "contents": "section US3D W18X65 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W18X65", + "kind": "keyword", + "trigger": "W18X65" + }, + { + "contents": "section US2D W18X71 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W18X71", + "kind": "keyword", + "trigger": "W18X71" + }, + { + "contents": "section US3D W18X71 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W18X71", + "kind": "keyword", + "trigger": "W18X71" + }, + { + "contents": "section US2D W18X76 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W18X76", + "kind": "keyword", + "trigger": "W18X76" + }, + { + "contents": "section US3D W18X76 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W18X76", + "kind": "keyword", + "trigger": "W18X76" + }, + { + "contents": "section US2D W18X86 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W18X86", + "kind": "keyword", + "trigger": "W18X86" + }, + { + "contents": "section US3D W18X86 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W18X86", + "kind": "keyword", + "trigger": "W18X86" + }, + { + "contents": "section US2D W18X97 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W18X97", + "kind": "keyword", + "trigger": "W18X97" + }, + { + "contents": "section US3D W18X97 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W18X97", + "kind": "keyword", + "trigger": "W18X97" + }, + { + "contents": "section US2D W21X101 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W21X101", + "kind": "keyword", + "trigger": "W21X101" + }, + { + "contents": "section US3D W21X101 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W21X101", + "kind": "keyword", + "trigger": "W21X101" + }, + { + "contents": "section US2D W21X111 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W21X111", + "kind": "keyword", + "trigger": "W21X111" + }, + { + "contents": "section US3D W21X111 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W21X111", + "kind": "keyword", + "trigger": "W21X111" + }, + { + "contents": "section US2D W21X122 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W21X122", + "kind": "keyword", + "trigger": "W21X122" + }, + { + "contents": "section US3D W21X122 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W21X122", + "kind": "keyword", + "trigger": "W21X122" + }, + { + "contents": "section US2D W21X132 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W21X132", + "kind": "keyword", + "trigger": "W21X132" + }, + { + "contents": "section US3D W21X132 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W21X132", + "kind": "keyword", + "trigger": "W21X132" + }, + { + "contents": "section US2D W21X147 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W21X147", + "kind": "keyword", + "trigger": "W21X147" + }, + { + "contents": "section US3D W21X147 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W21X147", + "kind": "keyword", + "trigger": "W21X147" + }, + { + "contents": "section US2D W21X166 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W21X166", + "kind": "keyword", + "trigger": "W21X166" + }, + { + "contents": "section US3D W21X166 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W21X166", + "kind": "keyword", + "trigger": "W21X166" + }, + { + "contents": "section US2D W21X182 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W21X182", + "kind": "keyword", + "trigger": "W21X182" + }, + { + "contents": "section US3D W21X182 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W21X182", + "kind": "keyword", + "trigger": "W21X182" + }, + { + "contents": "section US2D W21X201 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W21X201", + "kind": "keyword", + "trigger": "W21X201" + }, + { + "contents": "section US3D W21X201 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W21X201", + "kind": "keyword", + "trigger": "W21X201" + }, + { + "contents": "section US2D W21X223 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W21X223", + "kind": "keyword", + "trigger": "W21X223" + }, + { + "contents": "section US3D W21X223 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W21X223", + "kind": "keyword", + "trigger": "W21X223" + }, + { + "contents": "section US2D W21X248 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W21X248", + "kind": "keyword", + "trigger": "W21X248" + }, + { + "contents": "section US3D W21X248 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W21X248", + "kind": "keyword", + "trigger": "W21X248" + }, + { + "contents": "section US2D W21X275 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W21X275", + "kind": "keyword", + "trigger": "W21X275" + }, + { + "contents": "section US3D W21X275 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W21X275", + "kind": "keyword", + "trigger": "W21X275" + }, + { + "contents": "section US2D W21X44 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W21X44", + "kind": "keyword", + "trigger": "W21X44" + }, + { + "contents": "section US3D W21X44 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W21X44", + "kind": "keyword", + "trigger": "W21X44" + }, + { + "contents": "section US2D W21X48 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W21X48", + "kind": "keyword", + "trigger": "W21X48" + }, + { + "contents": "section US3D W21X48 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W21X48", + "kind": "keyword", + "trigger": "W21X48" + }, + { + "contents": "section US2D W21X50 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W21X50", + "kind": "keyword", + "trigger": "W21X50" + }, + { + "contents": "section US3D W21X50 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W21X50", + "kind": "keyword", + "trigger": "W21X50" + }, + { + "contents": "section US2D W21X55 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W21X55", + "kind": "keyword", + "trigger": "W21X55" + }, + { + "contents": "section US3D W21X55 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W21X55", + "kind": "keyword", + "trigger": "W21X55" + }, + { + "contents": "section US2D W21X57 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W21X57", + "kind": "keyword", + "trigger": "W21X57" + }, + { + "contents": "section US3D W21X57 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W21X57", + "kind": "keyword", + "trigger": "W21X57" + }, + { + "contents": "section US2D W21X62 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W21X62", + "kind": "keyword", + "trigger": "W21X62" + }, + { + "contents": "section US3D W21X62 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W21X62", + "kind": "keyword", + "trigger": "W21X62" + }, + { + "contents": "section US2D W21X68 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W21X68", + "kind": "keyword", + "trigger": "W21X68" + }, + { + "contents": "section US3D W21X68 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W21X68", + "kind": "keyword", + "trigger": "W21X68" + }, + { + "contents": "section US2D W21X73 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W21X73", + "kind": "keyword", + "trigger": "W21X73" + }, + { + "contents": "section US3D W21X73 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W21X73", + "kind": "keyword", + "trigger": "W21X73" + }, + { + "contents": "section US2D W21X83 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W21X83", + "kind": "keyword", + "trigger": "W21X83" + }, + { + "contents": "section US3D W21X83 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W21X83", + "kind": "keyword", + "trigger": "W21X83" + }, + { + "contents": "section US2D W21X93 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W21X93", + "kind": "keyword", + "trigger": "W21X93" + }, + { + "contents": "section US3D W21X93 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W21X93", + "kind": "keyword", + "trigger": "W21X93" + }, + { + "contents": "section US2D W24X103 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W24X103", + "kind": "keyword", + "trigger": "W24X103" + }, + { + "contents": "section US3D W24X103 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W24X103", + "kind": "keyword", + "trigger": "W24X103" + }, + { + "contents": "section US2D W24X104 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W24X104", + "kind": "keyword", + "trigger": "W24X104" + }, + { + "contents": "section US3D W24X104 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W24X104", + "kind": "keyword", + "trigger": "W24X104" + }, + { + "contents": "section US2D W24X117 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W24X117", + "kind": "keyword", + "trigger": "W24X117" + }, + { + "contents": "section US3D W24X117 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W24X117", + "kind": "keyword", + "trigger": "W24X117" + }, + { + "contents": "section US2D W24X131 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W24X131", + "kind": "keyword", + "trigger": "W24X131" + }, + { + "contents": "section US3D W24X131 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W24X131", + "kind": "keyword", + "trigger": "W24X131" + }, + { + "contents": "section US2D W24X146 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W24X146", + "kind": "keyword", + "trigger": "W24X146" + }, + { + "contents": "section US3D W24X146 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W24X146", + "kind": "keyword", + "trigger": "W24X146" + }, + { + "contents": "section US2D W24X162 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W24X162", + "kind": "keyword", + "trigger": "W24X162" + }, + { + "contents": "section US3D W24X162 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W24X162", + "kind": "keyword", + "trigger": "W24X162" + }, + { + "contents": "section US2D W24X176 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W24X176", + "kind": "keyword", + "trigger": "W24X176" + }, + { + "contents": "section US3D W24X176 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W24X176", + "kind": "keyword", + "trigger": "W24X176" + }, + { + "contents": "section US2D W24X192 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W24X192", + "kind": "keyword", + "trigger": "W24X192" + }, + { + "contents": "section US3D W24X192 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W24X192", + "kind": "keyword", + "trigger": "W24X192" + }, + { + "contents": "section US2D W24X207 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W24X207", + "kind": "keyword", + "trigger": "W24X207" + }, + { + "contents": "section US3D W24X207 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W24X207", + "kind": "keyword", + "trigger": "W24X207" + }, + { + "contents": "section US2D W24X229 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W24X229", + "kind": "keyword", + "trigger": "W24X229" + }, + { + "contents": "section US3D W24X229 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W24X229", + "kind": "keyword", + "trigger": "W24X229" + }, + { + "contents": "section US2D W24X250 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W24X250", + "kind": "keyword", + "trigger": "W24X250" + }, + { + "contents": "section US3D W24X250 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W24X250", + "kind": "keyword", + "trigger": "W24X250" + }, + { + "contents": "section US2D W24X279 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W24X279", + "kind": "keyword", + "trigger": "W24X279" + }, + { + "contents": "section US3D W24X279 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W24X279", + "kind": "keyword", + "trigger": "W24X279" + }, + { + "contents": "section US2D W24X306 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W24X306", + "kind": "keyword", + "trigger": "W24X306" + }, + { + "contents": "section US3D W24X306 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W24X306", + "kind": "keyword", + "trigger": "W24X306" + }, + { + "contents": "section US2D W24X335 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W24X335", + "kind": "keyword", + "trigger": "W24X335" + }, + { + "contents": "section US3D W24X335 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W24X335", + "kind": "keyword", + "trigger": "W24X335" + }, + { + "contents": "section US2D W24X370 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W24X370", + "kind": "keyword", + "trigger": "W24X370" + }, + { + "contents": "section US3D W24X370 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W24X370", + "kind": "keyword", + "trigger": "W24X370" + }, + { + "contents": "section US2D W24X55 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W24X55", + "kind": "keyword", + "trigger": "W24X55" + }, + { + "contents": "section US3D W24X55 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W24X55", + "kind": "keyword", + "trigger": "W24X55" + }, + { + "contents": "section US2D W24X62 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W24X62", + "kind": "keyword", + "trigger": "W24X62" + }, + { + "contents": "section US3D W24X62 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W24X62", + "kind": "keyword", + "trigger": "W24X62" + }, + { + "contents": "section US2D W24X68 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W24X68", + "kind": "keyword", + "trigger": "W24X68" + }, + { + "contents": "section US3D W24X68 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W24X68", + "kind": "keyword", + "trigger": "W24X68" + }, + { + "contents": "section US2D W24X76 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W24X76", + "kind": "keyword", + "trigger": "W24X76" + }, + { + "contents": "section US3D W24X76 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W24X76", + "kind": "keyword", + "trigger": "W24X76" + }, + { + "contents": "section US2D W24X84 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W24X84", + "kind": "keyword", + "trigger": "W24X84" + }, + { + "contents": "section US3D W24X84 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W24X84", + "kind": "keyword", + "trigger": "W24X84" + }, + { + "contents": "section US2D W24X94 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W24X94", + "kind": "keyword", + "trigger": "W24X94" + }, + { + "contents": "section US3D W24X94 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W24X94", + "kind": "keyword", + "trigger": "W24X94" + }, + { + "contents": "section US2D W27X102 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W27X102", + "kind": "keyword", + "trigger": "W27X102" + }, + { + "contents": "section US3D W27X102 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W27X102", + "kind": "keyword", + "trigger": "W27X102" + }, + { + "contents": "section US2D W27X114 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W27X114", + "kind": "keyword", + "trigger": "W27X114" + }, + { + "contents": "section US3D W27X114 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W27X114", + "kind": "keyword", + "trigger": "W27X114" + }, + { + "contents": "section US2D W27X129 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W27X129", + "kind": "keyword", + "trigger": "W27X129" + }, + { + "contents": "section US3D W27X129 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W27X129", + "kind": "keyword", + "trigger": "W27X129" + }, + { + "contents": "section US2D W27X146 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W27X146", + "kind": "keyword", + "trigger": "W27X146" + }, + { + "contents": "section US3D W27X146 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W27X146", + "kind": "keyword", + "trigger": "W27X146" + }, + { + "contents": "section US2D W27X161 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W27X161", + "kind": "keyword", + "trigger": "W27X161" + }, + { + "contents": "section US3D W27X161 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W27X161", + "kind": "keyword", + "trigger": "W27X161" + }, + { + "contents": "section US2D W27X178 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W27X178", + "kind": "keyword", + "trigger": "W27X178" + }, + { + "contents": "section US3D W27X178 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W27X178", + "kind": "keyword", + "trigger": "W27X178" + }, + { + "contents": "section US2D W27X194 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W27X194", + "kind": "keyword", + "trigger": "W27X194" + }, + { + "contents": "section US3D W27X194 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W27X194", + "kind": "keyword", + "trigger": "W27X194" + }, + { + "contents": "section US2D W27X217 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W27X217", + "kind": "keyword", + "trigger": "W27X217" + }, + { + "contents": "section US3D W27X217 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W27X217", + "kind": "keyword", + "trigger": "W27X217" + }, + { + "contents": "section US2D W27X235 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W27X235", + "kind": "keyword", + "trigger": "W27X235" + }, + { + "contents": "section US3D W27X235 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W27X235", + "kind": "keyword", + "trigger": "W27X235" + }, + { + "contents": "section US2D W27X258 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W27X258", + "kind": "keyword", + "trigger": "W27X258" + }, + { + "contents": "section US3D W27X258 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W27X258", + "kind": "keyword", + "trigger": "W27X258" + }, + { + "contents": "section US2D W27X281 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W27X281", + "kind": "keyword", + "trigger": "W27X281" + }, + { + "contents": "section US3D W27X281 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W27X281", + "kind": "keyword", + "trigger": "W27X281" + }, + { + "contents": "section US2D W27X307 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W27X307", + "kind": "keyword", + "trigger": "W27X307" + }, + { + "contents": "section US3D W27X307 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W27X307", + "kind": "keyword", + "trigger": "W27X307" + }, + { + "contents": "section US2D W27X336 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W27X336", + "kind": "keyword", + "trigger": "W27X336" + }, + { + "contents": "section US3D W27X336 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W27X336", + "kind": "keyword", + "trigger": "W27X336" + }, + { + "contents": "section US2D W27X368 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W27X368", + "kind": "keyword", + "trigger": "W27X368" + }, + { + "contents": "section US3D W27X368 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W27X368", + "kind": "keyword", + "trigger": "W27X368" + }, + { + "contents": "section US2D W27X539 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W27X539", + "kind": "keyword", + "trigger": "W27X539" + }, + { + "contents": "section US3D W27X539 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W27X539", + "kind": "keyword", + "trigger": "W27X539" + }, + { + "contents": "section US2D W27X84 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W27X84", + "kind": "keyword", + "trigger": "W27X84" + }, + { + "contents": "section US3D W27X84 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W27X84", + "kind": "keyword", + "trigger": "W27X84" + }, + { + "contents": "section US2D W27X94 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W27X94", + "kind": "keyword", + "trigger": "W27X94" + }, + { + "contents": "section US3D W27X94 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W27X94", + "kind": "keyword", + "trigger": "W27X94" + }, + { + "contents": "section US2D W30X108 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W30X108", + "kind": "keyword", + "trigger": "W30X108" + }, + { + "contents": "section US3D W30X108 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W30X108", + "kind": "keyword", + "trigger": "W30X108" + }, + { + "contents": "section US2D W30X116 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W30X116", + "kind": "keyword", + "trigger": "W30X116" + }, + { + "contents": "section US3D W30X116 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W30X116", + "kind": "keyword", + "trigger": "W30X116" + }, + { + "contents": "section US2D W30X124 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W30X124", + "kind": "keyword", + "trigger": "W30X124" + }, + { + "contents": "section US3D W30X124 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W30X124", + "kind": "keyword", + "trigger": "W30X124" + }, + { + "contents": "section US2D W30X132 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W30X132", + "kind": "keyword", + "trigger": "W30X132" + }, + { + "contents": "section US3D W30X132 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W30X132", + "kind": "keyword", + "trigger": "W30X132" + }, + { + "contents": "section US2D W30X148 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W30X148", + "kind": "keyword", + "trigger": "W30X148" + }, + { + "contents": "section US3D W30X148 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W30X148", + "kind": "keyword", + "trigger": "W30X148" + }, + { + "contents": "section US2D W30X173 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W30X173", + "kind": "keyword", + "trigger": "W30X173" + }, + { + "contents": "section US3D W30X173 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W30X173", + "kind": "keyword", + "trigger": "W30X173" + }, + { + "contents": "section US2D W30X191 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W30X191", + "kind": "keyword", + "trigger": "W30X191" + }, + { + "contents": "section US3D W30X191 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W30X191", + "kind": "keyword", + "trigger": "W30X191" + }, + { + "contents": "section US2D W30X211 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W30X211", + "kind": "keyword", + "trigger": "W30X211" + }, + { + "contents": "section US3D W30X211 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W30X211", + "kind": "keyword", + "trigger": "W30X211" + }, + { + "contents": "section US2D W30X235 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W30X235", + "kind": "keyword", + "trigger": "W30X235" + }, + { + "contents": "section US3D W30X235 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W30X235", + "kind": "keyword", + "trigger": "W30X235" + }, + { + "contents": "section US2D W30X261 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W30X261", + "kind": "keyword", + "trigger": "W30X261" + }, + { + "contents": "section US3D W30X261 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W30X261", + "kind": "keyword", + "trigger": "W30X261" + }, + { + "contents": "section US2D W30X292 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W30X292", + "kind": "keyword", + "trigger": "W30X292" + }, + { + "contents": "section US3D W30X292 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W30X292", + "kind": "keyword", + "trigger": "W30X292" + }, + { + "contents": "section US2D W30X326 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W30X326", + "kind": "keyword", + "trigger": "W30X326" + }, + { + "contents": "section US3D W30X326 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W30X326", + "kind": "keyword", + "trigger": "W30X326" + }, + { + "contents": "section US2D W30X357 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W30X357", + "kind": "keyword", + "trigger": "W30X357" + }, + { + "contents": "section US3D W30X357 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W30X357", + "kind": "keyword", + "trigger": "W30X357" + }, + { + "contents": "section US2D W30X391 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W30X391", + "kind": "keyword", + "trigger": "W30X391" + }, + { + "contents": "section US3D W30X391 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W30X391", + "kind": "keyword", + "trigger": "W30X391" + }, + { + "contents": "section US2D W30X90 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W30X90", + "kind": "keyword", + "trigger": "W30X90" + }, + { + "contents": "section US3D W30X90 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W30X90", + "kind": "keyword", + "trigger": "W30X90" + }, + { + "contents": "section US2D W30X99 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W30X99", + "kind": "keyword", + "trigger": "W30X99" + }, + { + "contents": "section US3D W30X99 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W30X99", + "kind": "keyword", + "trigger": "W30X99" + }, + { + "contents": "section US2D W33X118 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W33X118", + "kind": "keyword", + "trigger": "W33X118" + }, + { + "contents": "section US3D W33X118 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W33X118", + "kind": "keyword", + "trigger": "W33X118" + }, + { + "contents": "section US2D W33X130 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W33X130", + "kind": "keyword", + "trigger": "W33X130" + }, + { + "contents": "section US3D W33X130 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W33X130", + "kind": "keyword", + "trigger": "W33X130" + }, + { + "contents": "section US2D W33X141 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W33X141", + "kind": "keyword", + "trigger": "W33X141" + }, + { + "contents": "section US3D W33X141 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W33X141", + "kind": "keyword", + "trigger": "W33X141" + }, + { + "contents": "section US2D W33X152 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W33X152", + "kind": "keyword", + "trigger": "W33X152" + }, + { + "contents": "section US3D W33X152 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W33X152", + "kind": "keyword", + "trigger": "W33X152" + }, + { + "contents": "section US2D W33X169 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W33X169", + "kind": "keyword", + "trigger": "W33X169" + }, + { + "contents": "section US3D W33X169 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W33X169", + "kind": "keyword", + "trigger": "W33X169" + }, + { + "contents": "section US2D W33X201 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W33X201", + "kind": "keyword", + "trigger": "W33X201" + }, + { + "contents": "section US3D W33X201 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W33X201", + "kind": "keyword", + "trigger": "W33X201" + }, + { + "contents": "section US2D W33X221 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W33X221", + "kind": "keyword", + "trigger": "W33X221" + }, + { + "contents": "section US3D W33X221 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W33X221", + "kind": "keyword", + "trigger": "W33X221" + }, + { + "contents": "section US2D W33X241 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W33X241", + "kind": "keyword", + "trigger": "W33X241" + }, + { + "contents": "section US3D W33X241 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W33X241", + "kind": "keyword", + "trigger": "W33X241" + }, + { + "contents": "section US2D W33X263 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W33X263", + "kind": "keyword", + "trigger": "W33X263" + }, + { + "contents": "section US3D W33X263 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W33X263", + "kind": "keyword", + "trigger": "W33X263" + }, + { + "contents": "section US2D W33X291 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W33X291", + "kind": "keyword", + "trigger": "W33X291" + }, + { + "contents": "section US3D W33X291 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W33X291", + "kind": "keyword", + "trigger": "W33X291" + }, + { + "contents": "section US2D W33X318 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W33X318", + "kind": "keyword", + "trigger": "W33X318" + }, + { + "contents": "section US3D W33X318 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W33X318", + "kind": "keyword", + "trigger": "W33X318" + }, + { + "contents": "section US2D W33X354 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W33X354", + "kind": "keyword", + "trigger": "W33X354" + }, + { + "contents": "section US3D W33X354 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W33X354", + "kind": "keyword", + "trigger": "W33X354" + }, + { + "contents": "section US2D W33X387 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W33X387", + "kind": "keyword", + "trigger": "W33X387" + }, + { + "contents": "section US3D W33X387 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W33X387", + "kind": "keyword", + "trigger": "W33X387" + }, + { + "contents": "section US2D W36X135 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W36X135", + "kind": "keyword", + "trigger": "W36X135" + }, + { + "contents": "section US3D W36X135 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W36X135", + "kind": "keyword", + "trigger": "W36X135" + }, + { + "contents": "section US2D W36X150 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W36X150", + "kind": "keyword", + "trigger": "W36X150" + }, + { + "contents": "section US3D W36X150 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W36X150", + "kind": "keyword", + "trigger": "W36X150" + }, + { + "contents": "section US2D W36X160 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W36X160", + "kind": "keyword", + "trigger": "W36X160" + }, + { + "contents": "section US3D W36X160 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W36X160", + "kind": "keyword", + "trigger": "W36X160" + }, + { + "contents": "section US2D W36X170 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W36X170", + "kind": "keyword", + "trigger": "W36X170" + }, + { + "contents": "section US3D W36X170 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W36X170", + "kind": "keyword", + "trigger": "W36X170" + }, + { + "contents": "section US2D W36X182 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W36X182", + "kind": "keyword", + "trigger": "W36X182" + }, + { + "contents": "section US3D W36X182 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W36X182", + "kind": "keyword", + "trigger": "W36X182" + }, + { + "contents": "section US2D W36X194 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W36X194", + "kind": "keyword", + "trigger": "W36X194" + }, + { + "contents": "section US3D W36X194 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W36X194", + "kind": "keyword", + "trigger": "W36X194" + }, + { + "contents": "section US2D W36X210 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W36X210", + "kind": "keyword", + "trigger": "W36X210" + }, + { + "contents": "section US3D W36X210 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W36X210", + "kind": "keyword", + "trigger": "W36X210" + }, + { + "contents": "section US2D W36X231 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W36X231", + "kind": "keyword", + "trigger": "W36X231" + }, + { + "contents": "section US3D W36X231 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W36X231", + "kind": "keyword", + "trigger": "W36X231" + }, + { + "contents": "section US2D W36X232 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W36X232", + "kind": "keyword", + "trigger": "W36X232" + }, + { + "contents": "section US3D W36X232 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W36X232", + "kind": "keyword", + "trigger": "W36X232" + }, + { + "contents": "section US2D W36X247 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W36X247", + "kind": "keyword", + "trigger": "W36X247" + }, + { + "contents": "section US3D W36X247 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W36X247", + "kind": "keyword", + "trigger": "W36X247" + }, + { + "contents": "section US2D W36X256 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W36X256", + "kind": "keyword", + "trigger": "W36X256" + }, + { + "contents": "section US3D W36X256 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W36X256", + "kind": "keyword", + "trigger": "W36X256" + }, + { + "contents": "section US2D W36X262 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W36X262", + "kind": "keyword", + "trigger": "W36X262" + }, + { + "contents": "section US3D W36X262 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W36X262", + "kind": "keyword", + "trigger": "W36X262" + }, + { + "contents": "section US2D W36X282 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W36X282", + "kind": "keyword", + "trigger": "W36X282" + }, + { + "contents": "section US3D W36X282 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W36X282", + "kind": "keyword", + "trigger": "W36X282" + }, + { + "contents": "section US2D W36X302 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W36X302", + "kind": "keyword", + "trigger": "W36X302" + }, + { + "contents": "section US3D W36X302 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W36X302", + "kind": "keyword", + "trigger": "W36X302" + }, + { + "contents": "section US2D W36X330 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W36X330", + "kind": "keyword", + "trigger": "W36X330" + }, + { + "contents": "section US3D W36X330 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W36X330", + "kind": "keyword", + "trigger": "W36X330" + }, + { + "contents": "section US2D W36X361 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W36X361", + "kind": "keyword", + "trigger": "W36X361" + }, + { + "contents": "section US3D W36X361 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W36X361", + "kind": "keyword", + "trigger": "W36X361" + }, + { + "contents": "section US2D W36X395 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W36X395", + "kind": "keyword", + "trigger": "W36X395" + }, + { + "contents": "section US3D W36X395 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W36X395", + "kind": "keyword", + "trigger": "W36X395" + }, + { + "contents": "section US2D W36X441 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W36X441", + "kind": "keyword", + "trigger": "W36X441" + }, + { + "contents": "section US3D W36X441 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W36X441", + "kind": "keyword", + "trigger": "W36X441" + }, + { + "contents": "section US2D W36X487 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W36X487", + "kind": "keyword", + "trigger": "W36X487" + }, + { + "contents": "section US3D W36X487 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W36X487", + "kind": "keyword", + "trigger": "W36X487" + }, + { + "contents": "section US2D W36X529 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W36X529", + "kind": "keyword", + "trigger": "W36X529" + }, + { + "contents": "section US3D W36X529 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W36X529", + "kind": "keyword", + "trigger": "W36X529" + }, + { + "contents": "section US2D W36X652 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W36X652", + "kind": "keyword", + "trigger": "W36X652" + }, + { + "contents": "section US3D W36X652 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W36X652", + "kind": "keyword", + "trigger": "W36X652" + }, + { + "contents": "section US2D W36X723 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W36X723", + "kind": "keyword", + "trigger": "W36X723" + }, + { + "contents": "section US3D W36X723 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W36X723", + "kind": "keyword", + "trigger": "W36X723" + }, + { + "contents": "section US2D W36X802 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W36X802", + "kind": "keyword", + "trigger": "W36X802" + }, + { + "contents": "section US3D W36X802 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W36X802", + "kind": "keyword", + "trigger": "W36X802" + }, + { + "contents": "section US2D W36X853 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W36X853", + "kind": "keyword", + "trigger": "W36X853" + }, + { + "contents": "section US3D W36X853 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W36X853", + "kind": "keyword", + "trigger": "W36X853" + }, + { + "contents": "section US2D W36X925 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W36X925", + "kind": "keyword", + "trigger": "W36X925" + }, + { + "contents": "section US3D W36X925 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W36X925", + "kind": "keyword", + "trigger": "W36X925" + }, + { + "contents": "section US2D W40X149 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W40X149", + "kind": "keyword", + "trigger": "W40X149" + }, + { + "contents": "section US3D W40X149 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W40X149", + "kind": "keyword", + "trigger": "W40X149" + }, + { + "contents": "section US2D W40X167 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W40X167", + "kind": "keyword", + "trigger": "W40X167" + }, + { + "contents": "section US3D W40X167 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W40X167", + "kind": "keyword", + "trigger": "W40X167" + }, + { + "contents": "section US2D W40X183 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W40X183", + "kind": "keyword", + "trigger": "W40X183" + }, + { + "contents": "section US3D W40X183 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W40X183", + "kind": "keyword", + "trigger": "W40X183" + }, + { + "contents": "section US2D W40X199 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W40X199", + "kind": "keyword", + "trigger": "W40X199" + }, + { + "contents": "section US3D W40X199 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W40X199", + "kind": "keyword", + "trigger": "W40X199" + }, + { + "contents": "section US2D W40X211 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W40X211", + "kind": "keyword", + "trigger": "W40X211" + }, + { + "contents": "section US3D W40X211 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W40X211", + "kind": "keyword", + "trigger": "W40X211" + }, + { + "contents": "section US2D W40X215 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W40X215", + "kind": "keyword", + "trigger": "W40X215" + }, + { + "contents": "section US3D W40X215 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W40X215", + "kind": "keyword", + "trigger": "W40X215" + }, + { + "contents": "section US2D W40X235 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W40X235", + "kind": "keyword", + "trigger": "W40X235" + }, + { + "contents": "section US3D W40X235 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W40X235", + "kind": "keyword", + "trigger": "W40X235" + }, + { + "contents": "section US2D W40X249 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W40X249", + "kind": "keyword", + "trigger": "W40X249" + }, + { + "contents": "section US3D W40X249 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W40X249", + "kind": "keyword", + "trigger": "W40X249" + }, + { + "contents": "section US2D W40X264 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W40X264", + "kind": "keyword", + "trigger": "W40X264" + }, + { + "contents": "section US3D W40X264 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W40X264", + "kind": "keyword", + "trigger": "W40X264" + }, + { + "contents": "section US2D W40X277 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W40X277", + "kind": "keyword", + "trigger": "W40X277" + }, + { + "contents": "section US3D W40X277 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W40X277", + "kind": "keyword", + "trigger": "W40X277" + }, + { + "contents": "section US2D W40X278 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W40X278", + "kind": "keyword", + "trigger": "W40X278" + }, + { + "contents": "section US3D W40X278 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W40X278", + "kind": "keyword", + "trigger": "W40X278" + }, + { + "contents": "section US2D W40X294 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W40X294", + "kind": "keyword", + "trigger": "W40X294" + }, + { + "contents": "section US3D W40X294 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W40X294", + "kind": "keyword", + "trigger": "W40X294" + }, + { + "contents": "section US2D W40X297 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W40X297", + "kind": "keyword", + "trigger": "W40X297" + }, + { + "contents": "section US3D W40X297 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W40X297", + "kind": "keyword", + "trigger": "W40X297" + }, + { + "contents": "section US2D W40X324 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W40X324", + "kind": "keyword", + "trigger": "W40X324" + }, + { + "contents": "section US3D W40X324 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W40X324", + "kind": "keyword", + "trigger": "W40X324" + }, + { + "contents": "section US2D W40X327 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W40X327", + "kind": "keyword", + "trigger": "W40X327" + }, + { + "contents": "section US3D W40X327 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W40X327", + "kind": "keyword", + "trigger": "W40X327" + }, + { + "contents": "section US2D W40X331 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W40X331", + "kind": "keyword", + "trigger": "W40X331" + }, + { + "contents": "section US3D W40X331 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W40X331", + "kind": "keyword", + "trigger": "W40X331" + }, + { + "contents": "section US2D W40X362 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W40X362", + "kind": "keyword", + "trigger": "W40X362" + }, + { + "contents": "section US3D W40X362 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W40X362", + "kind": "keyword", + "trigger": "W40X362" + }, + { + "contents": "section US2D W40X372 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W40X372", + "kind": "keyword", + "trigger": "W40X372" + }, + { + "contents": "section US3D W40X372 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W40X372", + "kind": "keyword", + "trigger": "W40X372" + }, + { + "contents": "section US2D W40X392 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W40X392", + "kind": "keyword", + "trigger": "W40X392" + }, + { + "contents": "section US3D W40X392 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W40X392", + "kind": "keyword", + "trigger": "W40X392" + }, + { + "contents": "section US2D W40X397 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W40X397", + "kind": "keyword", + "trigger": "W40X397" + }, + { + "contents": "section US3D W40X397 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W40X397", + "kind": "keyword", + "trigger": "W40X397" + }, + { + "contents": "section US2D W40X431 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W40X431", + "kind": "keyword", + "trigger": "W40X431" + }, + { + "contents": "section US3D W40X431 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W40X431", + "kind": "keyword", + "trigger": "W40X431" + }, + { + "contents": "section US2D W40X503 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W40X503", + "kind": "keyword", + "trigger": "W40X503" + }, + { + "contents": "section US3D W40X503 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W40X503", + "kind": "keyword", + "trigger": "W40X503" + }, + { + "contents": "section US2D W40X593 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W40X593", + "kind": "keyword", + "trigger": "W40X593" + }, + { + "contents": "section US3D W40X593 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W40X593", + "kind": "keyword", + "trigger": "W40X593" + }, + { + "contents": "section US2D W40X655 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W40X655", + "kind": "keyword", + "trigger": "W40X655" + }, + { + "contents": "section US3D W40X655 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W40X655", + "kind": "keyword", + "trigger": "W40X655" + }, + { + "contents": "section US2D W44X230 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W44X230", + "kind": "keyword", + "trigger": "W44X230" + }, + { + "contents": "section US3D W44X230 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W44X230", + "kind": "keyword", + "trigger": "W44X230" + }, + { + "contents": "section US2D W44X262 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W44X262", + "kind": "keyword", + "trigger": "W44X262" + }, + { + "contents": "section US3D W44X262 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W44X262", + "kind": "keyword", + "trigger": "W44X262" + }, + { + "contents": "section US2D W44X290 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W44X290", + "kind": "keyword", + "trigger": "W44X290" + }, + { + "contents": "section US3D W44X290 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W44X290", + "kind": "keyword", + "trigger": "W44X290" + }, + { + "contents": "section US2D W44X335 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W44X335", + "kind": "keyword", + "trigger": "W44X335" + }, + { + "contents": "section US3D W44X335 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W44X335", + "kind": "keyword", + "trigger": "W44X335" + }, + { + "contents": "section US2D W4X13 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W4X13", + "kind": "keyword", + "trigger": "W4X13" + }, + { + "contents": "section US3D W4X13 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W4X13", + "kind": "keyword", + "trigger": "W4X13" + }, + { + "contents": "section US2D W5X16 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W5X16", + "kind": "keyword", + "trigger": "W5X16" + }, + { + "contents": "section US3D W5X16 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W5X16", + "kind": "keyword", + "trigger": "W5X16" + }, + { + "contents": "section US2D W5X19 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W5X19", + "kind": "keyword", + "trigger": "W5X19" + }, + { + "contents": "section US3D W5X19 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W5X19", + "kind": "keyword", + "trigger": "W5X19" + }, + { + "contents": "section US2D W6X12 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W6X12", + "kind": "keyword", + "trigger": "W6X12" + }, + { + "contents": "section US3D W6X12 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W6X12", + "kind": "keyword", + "trigger": "W6X12" + }, + { + "contents": "section US2D W6X15 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W6X15", + "kind": "keyword", + "trigger": "W6X15" + }, + { + "contents": "section US3D W6X15 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W6X15", + "kind": "keyword", + "trigger": "W6X15" + }, + { + "contents": "section US2D W6X16 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W6X16", + "kind": "keyword", + "trigger": "W6X16" + }, + { + "contents": "section US3D W6X16 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W6X16", + "kind": "keyword", + "trigger": "W6X16" + }, + { + "contents": "section US2D W6X20 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W6X20", + "kind": "keyword", + "trigger": "W6X20" + }, + { + "contents": "section US3D W6X20 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W6X20", + "kind": "keyword", + "trigger": "W6X20" + }, + { + "contents": "section US2D W6X25 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W6X25", + "kind": "keyword", + "trigger": "W6X25" + }, + { + "contents": "section US3D W6X25 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W6X25", + "kind": "keyword", + "trigger": "W6X25" + }, + { + "contents": "section US2D W6X8.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W6X8.5", + "kind": "keyword", + "trigger": "W6X8.5" + }, + { + "contents": "section US3D W6X8.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W6X8.5", + "kind": "keyword", + "trigger": "W6X8.5" + }, + { + "contents": "section US2D W6X9 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W6X9", + "kind": "keyword", + "trigger": "W6X9" + }, + { + "contents": "section US3D W6X9 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W6X9", + "kind": "keyword", + "trigger": "W6X9" + }, + { + "contents": "section US2D W8X10 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W8X10", + "kind": "keyword", + "trigger": "W8X10" + }, + { + "contents": "section US3D W8X10 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W8X10", + "kind": "keyword", + "trigger": "W8X10" + }, + { + "contents": "section US2D W8X13 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W8X13", + "kind": "keyword", + "trigger": "W8X13" + }, + { + "contents": "section US3D W8X13 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W8X13", + "kind": "keyword", + "trigger": "W8X13" + }, + { + "contents": "section US2D W8X15 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W8X15", + "kind": "keyword", + "trigger": "W8X15" + }, + { + "contents": "section US3D W8X15 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W8X15", + "kind": "keyword", + "trigger": "W8X15" + }, + { + "contents": "section US2D W8X18 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W8X18", + "kind": "keyword", + "trigger": "W8X18" + }, + { + "contents": "section US3D W8X18 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W8X18", + "kind": "keyword", + "trigger": "W8X18" + }, + { + "contents": "section US2D W8X21 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W8X21", + "kind": "keyword", + "trigger": "W8X21" + }, + { + "contents": "section US3D W8X21 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W8X21", + "kind": "keyword", + "trigger": "W8X21" + }, + { + "contents": "section US2D W8X24 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W8X24", + "kind": "keyword", + "trigger": "W8X24" + }, + { + "contents": "section US3D W8X24 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W8X24", + "kind": "keyword", + "trigger": "W8X24" + }, + { + "contents": "section US2D W8X28 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W8X28", + "kind": "keyword", + "trigger": "W8X28" + }, + { + "contents": "section US3D W8X28 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W8X28", + "kind": "keyword", + "trigger": "W8X28" + }, + { + "contents": "section US2D W8X31 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W8X31", + "kind": "keyword", + "trigger": "W8X31" + }, + { + "contents": "section US3D W8X31 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W8X31", + "kind": "keyword", + "trigger": "W8X31" + }, + { + "contents": "section US2D W8X35 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W8X35", + "kind": "keyword", + "trigger": "W8X35" + }, + { + "contents": "section US3D W8X35 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W8X35", + "kind": "keyword", + "trigger": "W8X35" + }, + { + "contents": "section US2D W8X40 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W8X40", + "kind": "keyword", + "trigger": "W8X40" + }, + { + "contents": "section US3D W8X40 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W8X40", + "kind": "keyword", + "trigger": "W8X40" + }, + { + "contents": "section US2D W8X48 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W8X48", + "kind": "keyword", + "trigger": "W8X48" + }, + { + "contents": "section US3D W8X48 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W8X48", + "kind": "keyword", + "trigger": "W8X48" + }, + { + "contents": "section US2D W8X58 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W8X58", + "kind": "keyword", + "trigger": "W8X58" + }, + { + "contents": "section US3D W8X58 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W8X58", + "kind": "keyword", + "trigger": "W8X58" + }, + { + "contents": "section US2D W8X67 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section W8X67", + "kind": "keyword", + "trigger": "W8X67" + }, + { + "contents": "section US3D W8X67 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section W8X67", + "kind": "keyword", + "trigger": "W8X67" + }, + { + "contents": "section US2D WT10.5X100.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT10.5X100.5", + "kind": "keyword", + "trigger": "WT10.5X100.5" + }, + { + "contents": "section US3D WT10.5X100.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT10.5X100.5", + "kind": "keyword", + "trigger": "WT10.5X100.5" + }, + { + "contents": "section US2D WT10.5X111.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT10.5X111.5", + "kind": "keyword", + "trigger": "WT10.5X111.5" + }, + { + "contents": "section US3D WT10.5X111.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT10.5X111.5", + "kind": "keyword", + "trigger": "WT10.5X111.5" + }, + { + "contents": "section US2D WT10.5X124 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT10.5X124", + "kind": "keyword", + "trigger": "WT10.5X124" + }, + { + "contents": "section US3D WT10.5X124 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT10.5X124", + "kind": "keyword", + "trigger": "WT10.5X124" + }, + { + "contents": "section US2D WT10.5X137.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT10.5X137.5", + "kind": "keyword", + "trigger": "WT10.5X137.5" + }, + { + "contents": "section US3D WT10.5X137.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT10.5X137.5", + "kind": "keyword", + "trigger": "WT10.5X137.5" + }, + { + "contents": "section US2D WT10.5X22 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT10.5X22", + "kind": "keyword", + "trigger": "WT10.5X22" + }, + { + "contents": "section US3D WT10.5X22 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT10.5X22", + "kind": "keyword", + "trigger": "WT10.5X22" + }, + { + "contents": "section US2D WT10.5X24 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT10.5X24", + "kind": "keyword", + "trigger": "WT10.5X24" + }, + { + "contents": "section US3D WT10.5X24 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT10.5X24", + "kind": "keyword", + "trigger": "WT10.5X24" + }, + { + "contents": "section US2D WT10.5X25 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT10.5X25", + "kind": "keyword", + "trigger": "WT10.5X25" + }, + { + "contents": "section US3D WT10.5X25 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT10.5X25", + "kind": "keyword", + "trigger": "WT10.5X25" + }, + { + "contents": "section US2D WT10.5X27.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT10.5X27.5", + "kind": "keyword", + "trigger": "WT10.5X27.5" + }, + { + "contents": "section US3D WT10.5X27.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT10.5X27.5", + "kind": "keyword", + "trigger": "WT10.5X27.5" + }, + { + "contents": "section US2D WT10.5X28.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT10.5X28.5", + "kind": "keyword", + "trigger": "WT10.5X28.5" + }, + { + "contents": "section US3D WT10.5X28.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT10.5X28.5", + "kind": "keyword", + "trigger": "WT10.5X28.5" + }, + { + "contents": "section US2D WT10.5X31 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT10.5X31", + "kind": "keyword", + "trigger": "WT10.5X31" + }, + { + "contents": "section US3D WT10.5X31 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT10.5X31", + "kind": "keyword", + "trigger": "WT10.5X31" + }, + { + "contents": "section US2D WT10.5X34 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT10.5X34", + "kind": "keyword", + "trigger": "WT10.5X34" + }, + { + "contents": "section US3D WT10.5X34 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT10.5X34", + "kind": "keyword", + "trigger": "WT10.5X34" + }, + { + "contents": "section US2D WT10.5X36.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT10.5X36.5", + "kind": "keyword", + "trigger": "WT10.5X36.5" + }, + { + "contents": "section US3D WT10.5X36.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT10.5X36.5", + "kind": "keyword", + "trigger": "WT10.5X36.5" + }, + { + "contents": "section US2D WT10.5X41.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT10.5X41.5", + "kind": "keyword", + "trigger": "WT10.5X41.5" + }, + { + "contents": "section US3D WT10.5X41.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT10.5X41.5", + "kind": "keyword", + "trigger": "WT10.5X41.5" + }, + { + "contents": "section US2D WT10.5X46.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT10.5X46.5", + "kind": "keyword", + "trigger": "WT10.5X46.5" + }, + { + "contents": "section US3D WT10.5X46.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT10.5X46.5", + "kind": "keyword", + "trigger": "WT10.5X46.5" + }, + { + "contents": "section US2D WT10.5X50.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT10.5X50.5", + "kind": "keyword", + "trigger": "WT10.5X50.5" + }, + { + "contents": "section US3D WT10.5X50.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT10.5X50.5", + "kind": "keyword", + "trigger": "WT10.5X50.5" + }, + { + "contents": "section US2D WT10.5X55.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT10.5X55.5", + "kind": "keyword", + "trigger": "WT10.5X55.5" + }, + { + "contents": "section US3D WT10.5X55.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT10.5X55.5", + "kind": "keyword", + "trigger": "WT10.5X55.5" + }, + { + "contents": "section US2D WT10.5X61 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT10.5X61", + "kind": "keyword", + "trigger": "WT10.5X61" + }, + { + "contents": "section US3D WT10.5X61 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT10.5X61", + "kind": "keyword", + "trigger": "WT10.5X61" + }, + { + "contents": "section US2D WT10.5X66 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT10.5X66", + "kind": "keyword", + "trigger": "WT10.5X66" + }, + { + "contents": "section US3D WT10.5X66 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT10.5X66", + "kind": "keyword", + "trigger": "WT10.5X66" + }, + { + "contents": "section US2D WT10.5X73.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT10.5X73.5", + "kind": "keyword", + "trigger": "WT10.5X73.5" + }, + { + "contents": "section US3D WT10.5X73.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT10.5X73.5", + "kind": "keyword", + "trigger": "WT10.5X73.5" + }, + { + "contents": "section US2D WT10.5X83 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT10.5X83", + "kind": "keyword", + "trigger": "WT10.5X83" + }, + { + "contents": "section US3D WT10.5X83 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT10.5X83", + "kind": "keyword", + "trigger": "WT10.5X83" + }, + { + "contents": "section US2D WT10.5X91 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT10.5X91", + "kind": "keyword", + "trigger": "WT10.5X91" + }, + { + "contents": "section US3D WT10.5X91 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT10.5X91", + "kind": "keyword", + "trigger": "WT10.5X91" + }, + { + "contents": "section US2D WT12X103.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT12X103.5", + "kind": "keyword", + "trigger": "WT12X103.5" + }, + { + "contents": "section US3D WT12X103.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT12X103.5", + "kind": "keyword", + "trigger": "WT12X103.5" + }, + { + "contents": "section US2D WT12X114.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT12X114.5", + "kind": "keyword", + "trigger": "WT12X114.5" + }, + { + "contents": "section US3D WT12X114.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT12X114.5", + "kind": "keyword", + "trigger": "WT12X114.5" + }, + { + "contents": "section US2D WT12X125 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT12X125", + "kind": "keyword", + "trigger": "WT12X125" + }, + { + "contents": "section US3D WT12X125 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT12X125", + "kind": "keyword", + "trigger": "WT12X125" + }, + { + "contents": "section US2D WT12X139.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT12X139.5", + "kind": "keyword", + "trigger": "WT12X139.5" + }, + { + "contents": "section US3D WT12X139.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT12X139.5", + "kind": "keyword", + "trigger": "WT12X139.5" + }, + { + "contents": "section US2D WT12X153 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT12X153", + "kind": "keyword", + "trigger": "WT12X153" + }, + { + "contents": "section US3D WT12X153 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT12X153", + "kind": "keyword", + "trigger": "WT12X153" + }, + { + "contents": "section US2D WT12X167.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT12X167.5", + "kind": "keyword", + "trigger": "WT12X167.5" + }, + { + "contents": "section US3D WT12X167.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT12X167.5", + "kind": "keyword", + "trigger": "WT12X167.5" + }, + { + "contents": "section US2D WT12X185 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT12X185", + "kind": "keyword", + "trigger": "WT12X185" + }, + { + "contents": "section US3D WT12X185 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT12X185", + "kind": "keyword", + "trigger": "WT12X185" + }, + { + "contents": "section US2D WT12X27.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT12X27.5", + "kind": "keyword", + "trigger": "WT12X27.5" + }, + { + "contents": "section US3D WT12X27.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT12X27.5", + "kind": "keyword", + "trigger": "WT12X27.5" + }, + { + "contents": "section US2D WT12X31 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT12X31", + "kind": "keyword", + "trigger": "WT12X31" + }, + { + "contents": "section US3D WT12X31 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT12X31", + "kind": "keyword", + "trigger": "WT12X31" + }, + { + "contents": "section US2D WT12X34 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT12X34", + "kind": "keyword", + "trigger": "WT12X34" + }, + { + "contents": "section US3D WT12X34 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT12X34", + "kind": "keyword", + "trigger": "WT12X34" + }, + { + "contents": "section US2D WT12X38 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT12X38", + "kind": "keyword", + "trigger": "WT12X38" + }, + { + "contents": "section US3D WT12X38 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT12X38", + "kind": "keyword", + "trigger": "WT12X38" + }, + { + "contents": "section US2D WT12X42 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT12X42", + "kind": "keyword", + "trigger": "WT12X42" + }, + { + "contents": "section US3D WT12X42 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT12X42", + "kind": "keyword", + "trigger": "WT12X42" + }, + { + "contents": "section US2D WT12X47 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT12X47", + "kind": "keyword", + "trigger": "WT12X47" + }, + { + "contents": "section US3D WT12X47 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT12X47", + "kind": "keyword", + "trigger": "WT12X47" + }, + { + "contents": "section US2D WT12X51.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT12X51.5", + "kind": "keyword", + "trigger": "WT12X51.5" + }, + { + "contents": "section US3D WT12X51.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT12X51.5", + "kind": "keyword", + "trigger": "WT12X51.5" + }, + { + "contents": "section US2D WT12X52 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT12X52", + "kind": "keyword", + "trigger": "WT12X52" + }, + { + "contents": "section US3D WT12X52 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT12X52", + "kind": "keyword", + "trigger": "WT12X52" + }, + { + "contents": "section US2D WT12X58.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT12X58.5", + "kind": "keyword", + "trigger": "WT12X58.5" + }, + { + "contents": "section US3D WT12X58.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT12X58.5", + "kind": "keyword", + "trigger": "WT12X58.5" + }, + { + "contents": "section US2D WT12X65.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT12X65.5", + "kind": "keyword", + "trigger": "WT12X65.5" + }, + { + "contents": "section US3D WT12X65.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT12X65.5", + "kind": "keyword", + "trigger": "WT12X65.5" + }, + { + "contents": "section US2D WT12X73 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT12X73", + "kind": "keyword", + "trigger": "WT12X73" + }, + { + "contents": "section US3D WT12X73 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT12X73", + "kind": "keyword", + "trigger": "WT12X73" + }, + { + "contents": "section US2D WT12X81 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT12X81", + "kind": "keyword", + "trigger": "WT12X81" + }, + { + "contents": "section US3D WT12X81 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT12X81", + "kind": "keyword", + "trigger": "WT12X81" + }, + { + "contents": "section US2D WT12X88 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT12X88", + "kind": "keyword", + "trigger": "WT12X88" + }, + { + "contents": "section US3D WT12X88 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT12X88", + "kind": "keyword", + "trigger": "WT12X88" + }, + { + "contents": "section US2D WT12X96 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT12X96", + "kind": "keyword", + "trigger": "WT12X96" + }, + { + "contents": "section US3D WT12X96 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT12X96", + "kind": "keyword", + "trigger": "WT12X96" + }, + { + "contents": "section US2D WT13.5X108.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT13.5X108.5", + "kind": "keyword", + "trigger": "WT13.5X108.5" + }, + { + "contents": "section US3D WT13.5X108.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT13.5X108.5", + "kind": "keyword", + "trigger": "WT13.5X108.5" + }, + { + "contents": "section US2D WT13.5X117.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT13.5X117.5", + "kind": "keyword", + "trigger": "WT13.5X117.5" + }, + { + "contents": "section US3D WT13.5X117.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT13.5X117.5", + "kind": "keyword", + "trigger": "WT13.5X117.5" + }, + { + "contents": "section US2D WT13.5X129 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT13.5X129", + "kind": "keyword", + "trigger": "WT13.5X129" + }, + { + "contents": "section US3D WT13.5X129 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT13.5X129", + "kind": "keyword", + "trigger": "WT13.5X129" + }, + { + "contents": "section US2D WT13.5X140.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT13.5X140.5", + "kind": "keyword", + "trigger": "WT13.5X140.5" + }, + { + "contents": "section US3D WT13.5X140.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT13.5X140.5", + "kind": "keyword", + "trigger": "WT13.5X140.5" + }, + { + "contents": "section US2D WT13.5X153.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT13.5X153.5", + "kind": "keyword", + "trigger": "WT13.5X153.5" + }, + { + "contents": "section US3D WT13.5X153.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT13.5X153.5", + "kind": "keyword", + "trigger": "WT13.5X153.5" + }, + { + "contents": "section US2D WT13.5X168 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT13.5X168", + "kind": "keyword", + "trigger": "WT13.5X168" + }, + { + "contents": "section US3D WT13.5X168 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT13.5X168", + "kind": "keyword", + "trigger": "WT13.5X168" + }, + { + "contents": "section US2D WT13.5X184 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT13.5X184", + "kind": "keyword", + "trigger": "WT13.5X184" + }, + { + "contents": "section US3D WT13.5X184 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT13.5X184", + "kind": "keyword", + "trigger": "WT13.5X184" + }, + { + "contents": "section US2D WT13.5X269.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT13.5X269.5", + "kind": "keyword", + "trigger": "WT13.5X269.5" + }, + { + "contents": "section US3D WT13.5X269.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT13.5X269.5", + "kind": "keyword", + "trigger": "WT13.5X269.5" + }, + { + "contents": "section US2D WT13.5X42 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT13.5X42", + "kind": "keyword", + "trigger": "WT13.5X42" + }, + { + "contents": "section US3D WT13.5X42 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT13.5X42", + "kind": "keyword", + "trigger": "WT13.5X42" + }, + { + "contents": "section US2D WT13.5X47 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT13.5X47", + "kind": "keyword", + "trigger": "WT13.5X47" + }, + { + "contents": "section US3D WT13.5X47 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT13.5X47", + "kind": "keyword", + "trigger": "WT13.5X47" + }, + { + "contents": "section US2D WT13.5X51 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT13.5X51", + "kind": "keyword", + "trigger": "WT13.5X51" + }, + { + "contents": "section US3D WT13.5X51 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT13.5X51", + "kind": "keyword", + "trigger": "WT13.5X51" + }, + { + "contents": "section US2D WT13.5X57 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT13.5X57", + "kind": "keyword", + "trigger": "WT13.5X57" + }, + { + "contents": "section US3D WT13.5X57 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT13.5X57", + "kind": "keyword", + "trigger": "WT13.5X57" + }, + { + "contents": "section US2D WT13.5X64.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT13.5X64.5", + "kind": "keyword", + "trigger": "WT13.5X64.5" + }, + { + "contents": "section US3D WT13.5X64.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT13.5X64.5", + "kind": "keyword", + "trigger": "WT13.5X64.5" + }, + { + "contents": "section US2D WT13.5X73 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT13.5X73", + "kind": "keyword", + "trigger": "WT13.5X73" + }, + { + "contents": "section US3D WT13.5X73 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT13.5X73", + "kind": "keyword", + "trigger": "WT13.5X73" + }, + { + "contents": "section US2D WT13.5X80.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT13.5X80.5", + "kind": "keyword", + "trigger": "WT13.5X80.5" + }, + { + "contents": "section US3D WT13.5X80.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT13.5X80.5", + "kind": "keyword", + "trigger": "WT13.5X80.5" + }, + { + "contents": "section US2D WT13.5X89 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT13.5X89", + "kind": "keyword", + "trigger": "WT13.5X89" + }, + { + "contents": "section US3D WT13.5X89 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT13.5X89", + "kind": "keyword", + "trigger": "WT13.5X89" + }, + { + "contents": "section US2D WT13.5X97 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT13.5X97", + "kind": "keyword", + "trigger": "WT13.5X97" + }, + { + "contents": "section US3D WT13.5X97 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT13.5X97", + "kind": "keyword", + "trigger": "WT13.5X97" + }, + { + "contents": "section US2D WT15X105.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT15X105.5", + "kind": "keyword", + "trigger": "WT15X105.5" + }, + { + "contents": "section US3D WT15X105.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT15X105.5", + "kind": "keyword", + "trigger": "WT15X105.5" + }, + { + "contents": "section US2D WT15X117.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT15X117.5", + "kind": "keyword", + "trigger": "WT15X117.5" + }, + { + "contents": "section US3D WT15X117.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT15X117.5", + "kind": "keyword", + "trigger": "WT15X117.5" + }, + { + "contents": "section US2D WT15X130.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT15X130.5", + "kind": "keyword", + "trigger": "WT15X130.5" + }, + { + "contents": "section US3D WT15X130.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT15X130.5", + "kind": "keyword", + "trigger": "WT15X130.5" + }, + { + "contents": "section US2D WT15X146 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT15X146", + "kind": "keyword", + "trigger": "WT15X146" + }, + { + "contents": "section US3D WT15X146 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT15X146", + "kind": "keyword", + "trigger": "WT15X146" + }, + { + "contents": "section US2D WT15X163 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT15X163", + "kind": "keyword", + "trigger": "WT15X163" + }, + { + "contents": "section US3D WT15X163 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT15X163", + "kind": "keyword", + "trigger": "WT15X163" + }, + { + "contents": "section US2D WT15X178.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT15X178.5", + "kind": "keyword", + "trigger": "WT15X178.5" + }, + { + "contents": "section US3D WT15X178.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT15X178.5", + "kind": "keyword", + "trigger": "WT15X178.5" + }, + { + "contents": "section US2D WT15X195.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT15X195.5", + "kind": "keyword", + "trigger": "WT15X195.5" + }, + { + "contents": "section US3D WT15X195.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT15X195.5", + "kind": "keyword", + "trigger": "WT15X195.5" + }, + { + "contents": "section US2D WT15X45 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT15X45", + "kind": "keyword", + "trigger": "WT15X45" + }, + { + "contents": "section US3D WT15X45 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT15X45", + "kind": "keyword", + "trigger": "WT15X45" + }, + { + "contents": "section US2D WT15X49.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT15X49.5", + "kind": "keyword", + "trigger": "WT15X49.5" + }, + { + "contents": "section US3D WT15X49.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT15X49.5", + "kind": "keyword", + "trigger": "WT15X49.5" + }, + { + "contents": "section US2D WT15X54 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT15X54", + "kind": "keyword", + "trigger": "WT15X54" + }, + { + "contents": "section US3D WT15X54 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT15X54", + "kind": "keyword", + "trigger": "WT15X54" + }, + { + "contents": "section US2D WT15X58 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT15X58", + "kind": "keyword", + "trigger": "WT15X58" + }, + { + "contents": "section US3D WT15X58 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT15X58", + "kind": "keyword", + "trigger": "WT15X58" + }, + { + "contents": "section US2D WT15X62 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT15X62", + "kind": "keyword", + "trigger": "WT15X62" + }, + { + "contents": "section US3D WT15X62 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT15X62", + "kind": "keyword", + "trigger": "WT15X62" + }, + { + "contents": "section US2D WT15X66 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT15X66", + "kind": "keyword", + "trigger": "WT15X66" + }, + { + "contents": "section US3D WT15X66 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT15X66", + "kind": "keyword", + "trigger": "WT15X66" + }, + { + "contents": "section US2D WT15X74 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT15X74", + "kind": "keyword", + "trigger": "WT15X74" + }, + { + "contents": "section US3D WT15X74 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT15X74", + "kind": "keyword", + "trigger": "WT15X74" + }, + { + "contents": "section US2D WT15X86.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT15X86.5", + "kind": "keyword", + "trigger": "WT15X86.5" + }, + { + "contents": "section US3D WT15X86.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT15X86.5", + "kind": "keyword", + "trigger": "WT15X86.5" + }, + { + "contents": "section US2D WT15X95.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT15X95.5", + "kind": "keyword", + "trigger": "WT15X95.5" + }, + { + "contents": "section US3D WT15X95.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT15X95.5", + "kind": "keyword", + "trigger": "WT15X95.5" + }, + { + "contents": "section US2D WT16.5X100.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT16.5X100.5", + "kind": "keyword", + "trigger": "WT16.5X100.5" + }, + { + "contents": "section US3D WT16.5X100.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT16.5X100.5", + "kind": "keyword", + "trigger": "WT16.5X100.5" + }, + { + "contents": "section US2D WT16.5X110.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT16.5X110.5", + "kind": "keyword", + "trigger": "WT16.5X110.5" + }, + { + "contents": "section US3D WT16.5X110.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT16.5X110.5", + "kind": "keyword", + "trigger": "WT16.5X110.5" + }, + { + "contents": "section US2D WT16.5X120.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT16.5X120.5", + "kind": "keyword", + "trigger": "WT16.5X120.5" + }, + { + "contents": "section US3D WT16.5X120.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT16.5X120.5", + "kind": "keyword", + "trigger": "WT16.5X120.5" + }, + { + "contents": "section US2D WT16.5X131.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT16.5X131.5", + "kind": "keyword", + "trigger": "WT16.5X131.5" + }, + { + "contents": "section US3D WT16.5X131.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT16.5X131.5", + "kind": "keyword", + "trigger": "WT16.5X131.5" + }, + { + "contents": "section US2D WT16.5X145.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT16.5X145.5", + "kind": "keyword", + "trigger": "WT16.5X145.5" + }, + { + "contents": "section US3D WT16.5X145.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT16.5X145.5", + "kind": "keyword", + "trigger": "WT16.5X145.5" + }, + { + "contents": "section US2D WT16.5X159 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT16.5X159", + "kind": "keyword", + "trigger": "WT16.5X159" + }, + { + "contents": "section US3D WT16.5X159 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT16.5X159", + "kind": "keyword", + "trigger": "WT16.5X159" + }, + { + "contents": "section US2D WT16.5X177 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT16.5X177", + "kind": "keyword", + "trigger": "WT16.5X177" + }, + { + "contents": "section US3D WT16.5X177 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT16.5X177", + "kind": "keyword", + "trigger": "WT16.5X177" + }, + { + "contents": "section US2D WT16.5X193.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT16.5X193.5", + "kind": "keyword", + "trigger": "WT16.5X193.5" + }, + { + "contents": "section US3D WT16.5X193.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT16.5X193.5", + "kind": "keyword", + "trigger": "WT16.5X193.5" + }, + { + "contents": "section US2D WT16.5X59 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT16.5X59", + "kind": "keyword", + "trigger": "WT16.5X59" + }, + { + "contents": "section US3D WT16.5X59 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT16.5X59", + "kind": "keyword", + "trigger": "WT16.5X59" + }, + { + "contents": "section US2D WT16.5X65 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT16.5X65", + "kind": "keyword", + "trigger": "WT16.5X65" + }, + { + "contents": "section US3D WT16.5X65 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT16.5X65", + "kind": "keyword", + "trigger": "WT16.5X65" + }, + { + "contents": "section US2D WT16.5X70.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT16.5X70.5", + "kind": "keyword", + "trigger": "WT16.5X70.5" + }, + { + "contents": "section US3D WT16.5X70.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT16.5X70.5", + "kind": "keyword", + "trigger": "WT16.5X70.5" + }, + { + "contents": "section US2D WT16.5X76 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT16.5X76", + "kind": "keyword", + "trigger": "WT16.5X76" + }, + { + "contents": "section US3D WT16.5X76 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT16.5X76", + "kind": "keyword", + "trigger": "WT16.5X76" + }, + { + "contents": "section US2D WT16.5X84.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT16.5X84.5", + "kind": "keyword", + "trigger": "WT16.5X84.5" + }, + { + "contents": "section US3D WT16.5X84.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT16.5X84.5", + "kind": "keyword", + "trigger": "WT16.5X84.5" + }, + { + "contents": "section US2D WT18X105 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT18X105", + "kind": "keyword", + "trigger": "WT18X105" + }, + { + "contents": "section US3D WT18X105 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT18X105", + "kind": "keyword", + "trigger": "WT18X105" + }, + { + "contents": "section US2D WT18X115.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT18X115.5", + "kind": "keyword", + "trigger": "WT18X115.5" + }, + { + "contents": "section US3D WT18X115.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT18X115.5", + "kind": "keyword", + "trigger": "WT18X115.5" + }, + { + "contents": "section US2D WT18X116 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT18X116", + "kind": "keyword", + "trigger": "WT18X116" + }, + { + "contents": "section US3D WT18X116 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT18X116", + "kind": "keyword", + "trigger": "WT18X116" + }, + { + "contents": "section US2D WT18X123.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT18X123.5", + "kind": "keyword", + "trigger": "WT18X123.5" + }, + { + "contents": "section US3D WT18X123.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT18X123.5", + "kind": "keyword", + "trigger": "WT18X123.5" + }, + { + "contents": "section US2D WT18X128 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT18X128", + "kind": "keyword", + "trigger": "WT18X128" + }, + { + "contents": "section US3D WT18X128 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT18X128", + "kind": "keyword", + "trigger": "WT18X128" + }, + { + "contents": "section US2D WT18X131 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT18X131", + "kind": "keyword", + "trigger": "WT18X131" + }, + { + "contents": "section US3D WT18X131 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT18X131", + "kind": "keyword", + "trigger": "WT18X131" + }, + { + "contents": "section US2D WT18X141 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT18X141", + "kind": "keyword", + "trigger": "WT18X141" + }, + { + "contents": "section US3D WT18X141 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT18X141", + "kind": "keyword", + "trigger": "WT18X141" + }, + { + "contents": "section US2D WT18X151 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT18X151", + "kind": "keyword", + "trigger": "WT18X151" + }, + { + "contents": "section US3D WT18X151 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT18X151", + "kind": "keyword", + "trigger": "WT18X151" + }, + { + "contents": "section US2D WT18X165 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT18X165", + "kind": "keyword", + "trigger": "WT18X165" + }, + { + "contents": "section US3D WT18X165 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT18X165", + "kind": "keyword", + "trigger": "WT18X165" + }, + { + "contents": "section US2D WT18X180.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT18X180.5", + "kind": "keyword", + "trigger": "WT18X180.5" + }, + { + "contents": "section US3D WT18X180.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT18X180.5", + "kind": "keyword", + "trigger": "WT18X180.5" + }, + { + "contents": "section US2D WT18X197.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT18X197.5", + "kind": "keyword", + "trigger": "WT18X197.5" + }, + { + "contents": "section US3D WT18X197.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT18X197.5", + "kind": "keyword", + "trigger": "WT18X197.5" + }, + { + "contents": "section US2D WT18X220.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT18X220.5", + "kind": "keyword", + "trigger": "WT18X220.5" + }, + { + "contents": "section US3D WT18X220.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT18X220.5", + "kind": "keyword", + "trigger": "WT18X220.5" + }, + { + "contents": "section US2D WT18X243.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT18X243.5", + "kind": "keyword", + "trigger": "WT18X243.5" + }, + { + "contents": "section US3D WT18X243.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT18X243.5", + "kind": "keyword", + "trigger": "WT18X243.5" + }, + { + "contents": "section US2D WT18X264.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT18X264.5", + "kind": "keyword", + "trigger": "WT18X264.5" + }, + { + "contents": "section US3D WT18X264.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT18X264.5", + "kind": "keyword", + "trigger": "WT18X264.5" + }, + { + "contents": "section US2D WT18X326 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT18X326", + "kind": "keyword", + "trigger": "WT18X326" + }, + { + "contents": "section US3D WT18X326 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT18X326", + "kind": "keyword", + "trigger": "WT18X326" + }, + { + "contents": "section US2D WT18X361.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT18X361.5", + "kind": "keyword", + "trigger": "WT18X361.5" + }, + { + "contents": "section US3D WT18X361.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT18X361.5", + "kind": "keyword", + "trigger": "WT18X361.5" + }, + { + "contents": "section US2D WT18X401 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT18X401", + "kind": "keyword", + "trigger": "WT18X401" + }, + { + "contents": "section US3D WT18X401 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT18X401", + "kind": "keyword", + "trigger": "WT18X401" + }, + { + "contents": "section US2D WT18X426.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT18X426.5", + "kind": "keyword", + "trigger": "WT18X426.5" + }, + { + "contents": "section US3D WT18X426.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT18X426.5", + "kind": "keyword", + "trigger": "WT18X426.5" + }, + { + "contents": "section US2D WT18X462.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT18X462.5", + "kind": "keyword", + "trigger": "WT18X462.5" + }, + { + "contents": "section US3D WT18X462.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT18X462.5", + "kind": "keyword", + "trigger": "WT18X462.5" + }, + { + "contents": "section US2D WT18X67.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT18X67.5", + "kind": "keyword", + "trigger": "WT18X67.5" + }, + { + "contents": "section US3D WT18X67.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT18X67.5", + "kind": "keyword", + "trigger": "WT18X67.5" + }, + { + "contents": "section US2D WT18X75 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT18X75", + "kind": "keyword", + "trigger": "WT18X75" + }, + { + "contents": "section US3D WT18X75 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT18X75", + "kind": "keyword", + "trigger": "WT18X75" + }, + { + "contents": "section US2D WT18X80 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT18X80", + "kind": "keyword", + "trigger": "WT18X80" + }, + { + "contents": "section US3D WT18X80 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT18X80", + "kind": "keyword", + "trigger": "WT18X80" + }, + { + "contents": "section US2D WT18X85 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT18X85", + "kind": "keyword", + "trigger": "WT18X85" + }, + { + "contents": "section US3D WT18X85 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT18X85", + "kind": "keyword", + "trigger": "WT18X85" + }, + { + "contents": "section US2D WT18X91 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT18X91", + "kind": "keyword", + "trigger": "WT18X91" + }, + { + "contents": "section US3D WT18X91 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT18X91", + "kind": "keyword", + "trigger": "WT18X91" + }, + { + "contents": "section US2D WT18X97 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT18X97", + "kind": "keyword", + "trigger": "WT18X97" + }, + { + "contents": "section US3D WT18X97 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT18X97", + "kind": "keyword", + "trigger": "WT18X97" + }, + { + "contents": "section US2D WT2.5X8 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT2.5X8", + "kind": "keyword", + "trigger": "WT2.5X8" + }, + { + "contents": "section US3D WT2.5X8 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT2.5X8", + "kind": "keyword", + "trigger": "WT2.5X8" + }, + { + "contents": "section US2D WT2.5X9.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT2.5X9.5", + "kind": "keyword", + "trigger": "WT2.5X9.5" + }, + { + "contents": "section US3D WT2.5X9.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT2.5X9.5", + "kind": "keyword", + "trigger": "WT2.5X9.5" + }, + { + "contents": "section US2D WT20X105.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT20X105.5", + "kind": "keyword", + "trigger": "WT20X105.5" + }, + { + "contents": "section US3D WT20X105.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT20X105.5", + "kind": "keyword", + "trigger": "WT20X105.5" + }, + { + "contents": "section US2D WT20X107.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT20X107.5", + "kind": "keyword", + "trigger": "WT20X107.5" + }, + { + "contents": "section US3D WT20X107.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT20X107.5", + "kind": "keyword", + "trigger": "WT20X107.5" + }, + { + "contents": "section US2D WT20X117.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT20X117.5", + "kind": "keyword", + "trigger": "WT20X117.5" + }, + { + "contents": "section US3D WT20X117.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT20X117.5", + "kind": "keyword", + "trigger": "WT20X117.5" + }, + { + "contents": "section US2D WT20X124.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT20X124.5", + "kind": "keyword", + "trigger": "WT20X124.5" + }, + { + "contents": "section US3D WT20X124.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT20X124.5", + "kind": "keyword", + "trigger": "WT20X124.5" + }, + { + "contents": "section US2D WT20X132 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT20X132", + "kind": "keyword", + "trigger": "WT20X132" + }, + { + "contents": "section US3D WT20X132 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT20X132", + "kind": "keyword", + "trigger": "WT20X132" + }, + { + "contents": "section US2D WT20X138.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT20X138.5", + "kind": "keyword", + "trigger": "WT20X138.5" + }, + { + "contents": "section US3D WT20X138.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT20X138.5", + "kind": "keyword", + "trigger": "WT20X138.5" + }, + { + "contents": "section US2D WT20X139 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT20X139", + "kind": "keyword", + "trigger": "WT20X139" + }, + { + "contents": "section US3D WT20X139 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT20X139", + "kind": "keyword", + "trigger": "WT20X139" + }, + { + "contents": "section US2D WT20X147 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT20X147", + "kind": "keyword", + "trigger": "WT20X147" + }, + { + "contents": "section US3D WT20X147 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT20X147", + "kind": "keyword", + "trigger": "WT20X147" + }, + { + "contents": "section US2D WT20X148.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT20X148.5", + "kind": "keyword", + "trigger": "WT20X148.5" + }, + { + "contents": "section US3D WT20X148.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT20X148.5", + "kind": "keyword", + "trigger": "WT20X148.5" + }, + { + "contents": "section US2D WT20X162 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT20X162", + "kind": "keyword", + "trigger": "WT20X162" + }, + { + "contents": "section US3D WT20X162 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT20X162", + "kind": "keyword", + "trigger": "WT20X162" + }, + { + "contents": "section US2D WT20X163.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT20X163.5", + "kind": "keyword", + "trigger": "WT20X163.5" + }, + { + "contents": "section US3D WT20X163.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT20X163.5", + "kind": "keyword", + "trigger": "WT20X163.5" + }, + { + "contents": "section US2D WT20X165.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT20X165.5", + "kind": "keyword", + "trigger": "WT20X165.5" + }, + { + "contents": "section US3D WT20X165.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT20X165.5", + "kind": "keyword", + "trigger": "WT20X165.5" + }, + { + "contents": "section US2D WT20X181 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT20X181", + "kind": "keyword", + "trigger": "WT20X181" + }, + { + "contents": "section US3D WT20X181 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT20X181", + "kind": "keyword", + "trigger": "WT20X181" + }, + { + "contents": "section US2D WT20X186 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT20X186", + "kind": "keyword", + "trigger": "WT20X186" + }, + { + "contents": "section US3D WT20X186 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT20X186", + "kind": "keyword", + "trigger": "WT20X186" + }, + { + "contents": "section US2D WT20X196 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT20X196", + "kind": "keyword", + "trigger": "WT20X196" + }, + { + "contents": "section US3D WT20X196 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT20X196", + "kind": "keyword", + "trigger": "WT20X196" + }, + { + "contents": "section US2D WT20X198.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT20X198.5", + "kind": "keyword", + "trigger": "WT20X198.5" + }, + { + "contents": "section US3D WT20X198.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT20X198.5", + "kind": "keyword", + "trigger": "WT20X198.5" + }, + { + "contents": "section US2D WT20X215.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT20X215.5", + "kind": "keyword", + "trigger": "WT20X215.5" + }, + { + "contents": "section US3D WT20X215.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT20X215.5", + "kind": "keyword", + "trigger": "WT20X215.5" + }, + { + "contents": "section US2D WT20X251.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT20X251.5", + "kind": "keyword", + "trigger": "WT20X251.5" + }, + { + "contents": "section US3D WT20X251.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT20X251.5", + "kind": "keyword", + "trigger": "WT20X251.5" + }, + { + "contents": "section US2D WT20X296.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT20X296.5", + "kind": "keyword", + "trigger": "WT20X296.5" + }, + { + "contents": "section US3D WT20X296.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT20X296.5", + "kind": "keyword", + "trigger": "WT20X296.5" + }, + { + "contents": "section US2D WT20X327.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT20X327.5", + "kind": "keyword", + "trigger": "WT20X327.5" + }, + { + "contents": "section US3D WT20X327.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT20X327.5", + "kind": "keyword", + "trigger": "WT20X327.5" + }, + { + "contents": "section US2D WT20X74.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT20X74.5", + "kind": "keyword", + "trigger": "WT20X74.5" + }, + { + "contents": "section US3D WT20X74.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT20X74.5", + "kind": "keyword", + "trigger": "WT20X74.5" + }, + { + "contents": "section US2D WT20X83.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT20X83.5", + "kind": "keyword", + "trigger": "WT20X83.5" + }, + { + "contents": "section US3D WT20X83.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT20X83.5", + "kind": "keyword", + "trigger": "WT20X83.5" + }, + { + "contents": "section US2D WT20X91.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT20X91.5", + "kind": "keyword", + "trigger": "WT20X91.5" + }, + { + "contents": "section US3D WT20X91.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT20X91.5", + "kind": "keyword", + "trigger": "WT20X91.5" + }, + { + "contents": "section US2D WT20X99.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT20X99.5", + "kind": "keyword", + "trigger": "WT20X99.5" + }, + { + "contents": "section US3D WT20X99.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT20X99.5", + "kind": "keyword", + "trigger": "WT20X99.5" + }, + { + "contents": "section US2D WT22X115 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT22X115", + "kind": "keyword", + "trigger": "WT22X115" + }, + { + "contents": "section US3D WT22X115 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT22X115", + "kind": "keyword", + "trigger": "WT22X115" + }, + { + "contents": "section US2D WT22X131 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT22X131", + "kind": "keyword", + "trigger": "WT22X131" + }, + { + "contents": "section US3D WT22X131 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT22X131", + "kind": "keyword", + "trigger": "WT22X131" + }, + { + "contents": "section US2D WT22X145 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT22X145", + "kind": "keyword", + "trigger": "WT22X145" + }, + { + "contents": "section US3D WT22X145 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT22X145", + "kind": "keyword", + "trigger": "WT22X145" + }, + { + "contents": "section US2D WT22X167.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT22X167.5", + "kind": "keyword", + "trigger": "WT22X167.5" + }, + { + "contents": "section US3D WT22X167.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT22X167.5", + "kind": "keyword", + "trigger": "WT22X167.5" + }, + { + "contents": "section US2D WT2X6.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT2X6.5", + "kind": "keyword", + "trigger": "WT2X6.5" + }, + { + "contents": "section US3D WT2X6.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT2X6.5", + "kind": "keyword", + "trigger": "WT2X6.5" + }, + { + "contents": "section US2D WT3X10 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT3X10", + "kind": "keyword", + "trigger": "WT3X10" + }, + { + "contents": "section US3D WT3X10 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT3X10", + "kind": "keyword", + "trigger": "WT3X10" + }, + { + "contents": "section US2D WT3X12.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT3X12.5", + "kind": "keyword", + "trigger": "WT3X12.5" + }, + { + "contents": "section US3D WT3X12.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT3X12.5", + "kind": "keyword", + "trigger": "WT3X12.5" + }, + { + "contents": "section US2D WT3X4.25 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT3X4.25", + "kind": "keyword", + "trigger": "WT3X4.25" + }, + { + "contents": "section US3D WT3X4.25 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT3X4.25", + "kind": "keyword", + "trigger": "WT3X4.25" + }, + { + "contents": "section US2D WT3X4.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT3X4.5", + "kind": "keyword", + "trigger": "WT3X4.5" + }, + { + "contents": "section US3D WT3X4.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT3X4.5", + "kind": "keyword", + "trigger": "WT3X4.5" + }, + { + "contents": "section US2D WT3X6 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT3X6", + "kind": "keyword", + "trigger": "WT3X6" + }, + { + "contents": "section US3D WT3X6 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT3X6", + "kind": "keyword", + "trigger": "WT3X6" + }, + { + "contents": "section US2D WT3X7.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT3X7.5", + "kind": "keyword", + "trigger": "WT3X7.5" + }, + { + "contents": "section US3D WT3X7.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT3X7.5", + "kind": "keyword", + "trigger": "WT3X7.5" + }, + { + "contents": "section US2D WT3X8 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT3X8", + "kind": "keyword", + "trigger": "WT3X8" + }, + { + "contents": "section US3D WT3X8 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT3X8", + "kind": "keyword", + "trigger": "WT3X8" + }, + { + "contents": "section US2D WT4X10.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT4X10.5", + "kind": "keyword", + "trigger": "WT4X10.5" + }, + { + "contents": "section US3D WT4X10.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT4X10.5", + "kind": "keyword", + "trigger": "WT4X10.5" + }, + { + "contents": "section US2D WT4X12 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT4X12", + "kind": "keyword", + "trigger": "WT4X12" + }, + { + "contents": "section US3D WT4X12 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT4X12", + "kind": "keyword", + "trigger": "WT4X12" + }, + { + "contents": "section US2D WT4X14 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT4X14", + "kind": "keyword", + "trigger": "WT4X14" + }, + { + "contents": "section US3D WT4X14 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT4X14", + "kind": "keyword", + "trigger": "WT4X14" + }, + { + "contents": "section US2D WT4X15.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT4X15.5", + "kind": "keyword", + "trigger": "WT4X15.5" + }, + { + "contents": "section US3D WT4X15.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT4X15.5", + "kind": "keyword", + "trigger": "WT4X15.5" + }, + { + "contents": "section US2D WT4X17.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT4X17.5", + "kind": "keyword", + "trigger": "WT4X17.5" + }, + { + "contents": "section US3D WT4X17.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT4X17.5", + "kind": "keyword", + "trigger": "WT4X17.5" + }, + { + "contents": "section US2D WT4X20 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT4X20", + "kind": "keyword", + "trigger": "WT4X20" + }, + { + "contents": "section US3D WT4X20 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT4X20", + "kind": "keyword", + "trigger": "WT4X20" + }, + { + "contents": "section US2D WT4X24 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT4X24", + "kind": "keyword", + "trigger": "WT4X24" + }, + { + "contents": "section US3D WT4X24 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT4X24", + "kind": "keyword", + "trigger": "WT4X24" + }, + { + "contents": "section US2D WT4X29 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT4X29", + "kind": "keyword", + "trigger": "WT4X29" + }, + { + "contents": "section US3D WT4X29 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT4X29", + "kind": "keyword", + "trigger": "WT4X29" + }, + { + "contents": "section US2D WT4X33.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT4X33.5", + "kind": "keyword", + "trigger": "WT4X33.5" + }, + { + "contents": "section US3D WT4X33.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT4X33.5", + "kind": "keyword", + "trigger": "WT4X33.5" + }, + { + "contents": "section US2D WT4X5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT4X5", + "kind": "keyword", + "trigger": "WT4X5" + }, + { + "contents": "section US3D WT4X5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT4X5", + "kind": "keyword", + "trigger": "WT4X5" + }, + { + "contents": "section US2D WT4X6.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT4X6.5", + "kind": "keyword", + "trigger": "WT4X6.5" + }, + { + "contents": "section US3D WT4X6.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT4X6.5", + "kind": "keyword", + "trigger": "WT4X6.5" + }, + { + "contents": "section US2D WT4X7.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT4X7.5", + "kind": "keyword", + "trigger": "WT4X7.5" + }, + { + "contents": "section US3D WT4X7.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT4X7.5", + "kind": "keyword", + "trigger": "WT4X7.5" + }, + { + "contents": "section US2D WT4X9 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT4X9", + "kind": "keyword", + "trigger": "WT4X9" + }, + { + "contents": "section US3D WT4X9 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT4X9", + "kind": "keyword", + "trigger": "WT4X9" + }, + { + "contents": "section US2D WT5X11 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT5X11", + "kind": "keyword", + "trigger": "WT5X11" + }, + { + "contents": "section US3D WT5X11 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT5X11", + "kind": "keyword", + "trigger": "WT5X11" + }, + { + "contents": "section US2D WT5X13 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT5X13", + "kind": "keyword", + "trigger": "WT5X13" + }, + { + "contents": "section US3D WT5X13 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT5X13", + "kind": "keyword", + "trigger": "WT5X13" + }, + { + "contents": "section US2D WT5X15 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT5X15", + "kind": "keyword", + "trigger": "WT5X15" + }, + { + "contents": "section US3D WT5X15 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT5X15", + "kind": "keyword", + "trigger": "WT5X15" + }, + { + "contents": "section US2D WT5X16.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT5X16.5", + "kind": "keyword", + "trigger": "WT5X16.5" + }, + { + "contents": "section US3D WT5X16.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT5X16.5", + "kind": "keyword", + "trigger": "WT5X16.5" + }, + { + "contents": "section US2D WT5X19.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT5X19.5", + "kind": "keyword", + "trigger": "WT5X19.5" + }, + { + "contents": "section US3D WT5X19.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT5X19.5", + "kind": "keyword", + "trigger": "WT5X19.5" + }, + { + "contents": "section US2D WT5X22.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT5X22.5", + "kind": "keyword", + "trigger": "WT5X22.5" + }, + { + "contents": "section US3D WT5X22.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT5X22.5", + "kind": "keyword", + "trigger": "WT5X22.5" + }, + { + "contents": "section US2D WT5X24.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT5X24.5", + "kind": "keyword", + "trigger": "WT5X24.5" + }, + { + "contents": "section US3D WT5X24.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT5X24.5", + "kind": "keyword", + "trigger": "WT5X24.5" + }, + { + "contents": "section US2D WT5X27 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT5X27", + "kind": "keyword", + "trigger": "WT5X27" + }, + { + "contents": "section US3D WT5X27 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT5X27", + "kind": "keyword", + "trigger": "WT5X27" + }, + { + "contents": "section US2D WT5X30 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT5X30", + "kind": "keyword", + "trigger": "WT5X30" + }, + { + "contents": "section US3D WT5X30 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT5X30", + "kind": "keyword", + "trigger": "WT5X30" + }, + { + "contents": "section US2D WT5X34 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT5X34", + "kind": "keyword", + "trigger": "WT5X34" + }, + { + "contents": "section US3D WT5X34 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT5X34", + "kind": "keyword", + "trigger": "WT5X34" + }, + { + "contents": "section US2D WT5X38.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT5X38.5", + "kind": "keyword", + "trigger": "WT5X38.5" + }, + { + "contents": "section US3D WT5X38.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT5X38.5", + "kind": "keyword", + "trigger": "WT5X38.5" + }, + { + "contents": "section US2D WT5X44 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT5X44", + "kind": "keyword", + "trigger": "WT5X44" + }, + { + "contents": "section US3D WT5X44 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT5X44", + "kind": "keyword", + "trigger": "WT5X44" + }, + { + "contents": "section US2D WT5X50 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT5X50", + "kind": "keyword", + "trigger": "WT5X50" + }, + { + "contents": "section US3D WT5X50 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT5X50", + "kind": "keyword", + "trigger": "WT5X50" + }, + { + "contents": "section US2D WT5X56 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT5X56", + "kind": "keyword", + "trigger": "WT5X56" + }, + { + "contents": "section US3D WT5X56 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT5X56", + "kind": "keyword", + "trigger": "WT5X56" + }, + { + "contents": "section US2D WT5X6 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT5X6", + "kind": "keyword", + "trigger": "WT5X6" + }, + { + "contents": "section US3D WT5X6 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT5X6", + "kind": "keyword", + "trigger": "WT5X6" + }, + { + "contents": "section US2D WT5X7.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT5X7.5", + "kind": "keyword", + "trigger": "WT5X7.5" + }, + { + "contents": "section US3D WT5X7.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT5X7.5", + "kind": "keyword", + "trigger": "WT5X7.5" + }, + { + "contents": "section US2D WT5X8.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT5X8.5", + "kind": "keyword", + "trigger": "WT5X8.5" + }, + { + "contents": "section US3D WT5X8.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT5X8.5", + "kind": "keyword", + "trigger": "WT5X8.5" + }, + { + "contents": "section US2D WT5X9.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT5X9.5", + "kind": "keyword", + "trigger": "WT5X9.5" + }, + { + "contents": "section US3D WT5X9.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT5X9.5", + "kind": "keyword", + "trigger": "WT5X9.5" + }, + { + "contents": "section US2D WT6X105 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT6X105", + "kind": "keyword", + "trigger": "WT6X105" + }, + { + "contents": "section US3D WT6X105 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT6X105", + "kind": "keyword", + "trigger": "WT6X105" + }, + { + "contents": "section US2D WT6X11 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT6X11", + "kind": "keyword", + "trigger": "WT6X11" + }, + { + "contents": "section US3D WT6X11 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT6X11", + "kind": "keyword", + "trigger": "WT6X11" + }, + { + "contents": "section US2D WT6X115 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT6X115", + "kind": "keyword", + "trigger": "WT6X115" + }, + { + "contents": "section US3D WT6X115 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT6X115", + "kind": "keyword", + "trigger": "WT6X115" + }, + { + "contents": "section US2D WT6X126 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT6X126", + "kind": "keyword", + "trigger": "WT6X126" + }, + { + "contents": "section US3D WT6X126 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT6X126", + "kind": "keyword", + "trigger": "WT6X126" + }, + { + "contents": "section US2D WT6X13 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT6X13", + "kind": "keyword", + "trigger": "WT6X13" + }, + { + "contents": "section US3D WT6X13 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT6X13", + "kind": "keyword", + "trigger": "WT6X13" + }, + { + "contents": "section US2D WT6X139.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT6X139.5", + "kind": "keyword", + "trigger": "WT6X139.5" + }, + { + "contents": "section US3D WT6X139.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT6X139.5", + "kind": "keyword", + "trigger": "WT6X139.5" + }, + { + "contents": "section US2D WT6X15 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT6X15", + "kind": "keyword", + "trigger": "WT6X15" + }, + { + "contents": "section US3D WT6X15 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT6X15", + "kind": "keyword", + "trigger": "WT6X15" + }, + { + "contents": "section US2D WT6X152.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT6X152.5", + "kind": "keyword", + "trigger": "WT6X152.5" + }, + { + "contents": "section US3D WT6X152.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT6X152.5", + "kind": "keyword", + "trigger": "WT6X152.5" + }, + { + "contents": "section US2D WT6X168 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT6X168", + "kind": "keyword", + "trigger": "WT6X168" + }, + { + "contents": "section US3D WT6X168 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT6X168", + "kind": "keyword", + "trigger": "WT6X168" + }, + { + "contents": "section US2D WT6X17.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT6X17.5", + "kind": "keyword", + "trigger": "WT6X17.5" + }, + { + "contents": "section US3D WT6X17.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT6X17.5", + "kind": "keyword", + "trigger": "WT6X17.5" + }, + { + "contents": "section US2D WT6X20 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT6X20", + "kind": "keyword", + "trigger": "WT6X20" + }, + { + "contents": "section US3D WT6X20 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT6X20", + "kind": "keyword", + "trigger": "WT6X20" + }, + { + "contents": "section US2D WT6X22.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT6X22.5", + "kind": "keyword", + "trigger": "WT6X22.5" + }, + { + "contents": "section US3D WT6X22.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT6X22.5", + "kind": "keyword", + "trigger": "WT6X22.5" + }, + { + "contents": "section US2D WT6X25 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT6X25", + "kind": "keyword", + "trigger": "WT6X25" + }, + { + "contents": "section US3D WT6X25 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT6X25", + "kind": "keyword", + "trigger": "WT6X25" + }, + { + "contents": "section US2D WT6X26.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT6X26.5", + "kind": "keyword", + "trigger": "WT6X26.5" + }, + { + "contents": "section US3D WT6X26.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT6X26.5", + "kind": "keyword", + "trigger": "WT6X26.5" + }, + { + "contents": "section US2D WT6X29 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT6X29", + "kind": "keyword", + "trigger": "WT6X29" + }, + { + "contents": "section US3D WT6X29 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT6X29", + "kind": "keyword", + "trigger": "WT6X29" + }, + { + "contents": "section US2D WT6X32.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT6X32.5", + "kind": "keyword", + "trigger": "WT6X32.5" + }, + { + "contents": "section US3D WT6X32.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT6X32.5", + "kind": "keyword", + "trigger": "WT6X32.5" + }, + { + "contents": "section US2D WT6X36 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT6X36", + "kind": "keyword", + "trigger": "WT6X36" + }, + { + "contents": "section US3D WT6X36 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT6X36", + "kind": "keyword", + "trigger": "WT6X36" + }, + { + "contents": "section US2D WT6X39.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT6X39.5", + "kind": "keyword", + "trigger": "WT6X39.5" + }, + { + "contents": "section US3D WT6X39.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT6X39.5", + "kind": "keyword", + "trigger": "WT6X39.5" + }, + { + "contents": "section US2D WT6X43.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT6X43.5", + "kind": "keyword", + "trigger": "WT6X43.5" + }, + { + "contents": "section US3D WT6X43.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT6X43.5", + "kind": "keyword", + "trigger": "WT6X43.5" + }, + { + "contents": "section US2D WT6X48 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT6X48", + "kind": "keyword", + "trigger": "WT6X48" + }, + { + "contents": "section US3D WT6X48 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT6X48", + "kind": "keyword", + "trigger": "WT6X48" + }, + { + "contents": "section US2D WT6X53 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT6X53", + "kind": "keyword", + "trigger": "WT6X53" + }, + { + "contents": "section US3D WT6X53 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT6X53", + "kind": "keyword", + "trigger": "WT6X53" + }, + { + "contents": "section US2D WT6X60 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT6X60", + "kind": "keyword", + "trigger": "WT6X60" + }, + { + "contents": "section US3D WT6X60 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT6X60", + "kind": "keyword", + "trigger": "WT6X60" + }, + { + "contents": "section US2D WT6X68 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT6X68", + "kind": "keyword", + "trigger": "WT6X68" + }, + { + "contents": "section US3D WT6X68 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT6X68", + "kind": "keyword", + "trigger": "WT6X68" + }, + { + "contents": "section US2D WT6X7 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT6X7", + "kind": "keyword", + "trigger": "WT6X7" + }, + { + "contents": "section US3D WT6X7 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT6X7", + "kind": "keyword", + "trigger": "WT6X7" + }, + { + "contents": "section US2D WT6X76 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT6X76", + "kind": "keyword", + "trigger": "WT6X76" + }, + { + "contents": "section US3D WT6X76 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT6X76", + "kind": "keyword", + "trigger": "WT6X76" + }, + { + "contents": "section US2D WT6X8 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT6X8", + "kind": "keyword", + "trigger": "WT6X8" + }, + { + "contents": "section US3D WT6X8 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT6X8", + "kind": "keyword", + "trigger": "WT6X8" + }, + { + "contents": "section US2D WT6X85 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT6X85", + "kind": "keyword", + "trigger": "WT6X85" + }, + { + "contents": "section US3D WT6X85 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT6X85", + "kind": "keyword", + "trigger": "WT6X85" + }, + { + "contents": "section US2D WT6X9.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT6X9.5", + "kind": "keyword", + "trigger": "WT6X9.5" + }, + { + "contents": "section US3D WT6X9.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT6X9.5", + "kind": "keyword", + "trigger": "WT6X9.5" + }, + { + "contents": "section US2D WT6X95 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT6X95", + "kind": "keyword", + "trigger": "WT6X95" + }, + { + "contents": "section US3D WT6X95 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT6X95", + "kind": "keyword", + "trigger": "WT6X95" + }, + { + "contents": "section US2D WT7X105.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT7X105.5", + "kind": "keyword", + "trigger": "WT7X105.5" + }, + { + "contents": "section US3D WT7X105.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT7X105.5", + "kind": "keyword", + "trigger": "WT7X105.5" + }, + { + "contents": "section US2D WT7X11 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT7X11", + "kind": "keyword", + "trigger": "WT7X11" + }, + { + "contents": "section US3D WT7X11 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT7X11", + "kind": "keyword", + "trigger": "WT7X11" + }, + { + "contents": "section US2D WT7X116.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT7X116.5", + "kind": "keyword", + "trigger": "WT7X116.5" + }, + { + "contents": "section US3D WT7X116.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT7X116.5", + "kind": "keyword", + "trigger": "WT7X116.5" + }, + { + "contents": "section US2D WT7X128.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT7X128.5", + "kind": "keyword", + "trigger": "WT7X128.5" + }, + { + "contents": "section US3D WT7X128.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT7X128.5", + "kind": "keyword", + "trigger": "WT7X128.5" + }, + { + "contents": "section US2D WT7X13 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT7X13", + "kind": "keyword", + "trigger": "WT7X13" + }, + { + "contents": "section US3D WT7X13 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT7X13", + "kind": "keyword", + "trigger": "WT7X13" + }, + { + "contents": "section US2D WT7X141.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT7X141.5", + "kind": "keyword", + "trigger": "WT7X141.5" + }, + { + "contents": "section US3D WT7X141.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT7X141.5", + "kind": "keyword", + "trigger": "WT7X141.5" + }, + { + "contents": "section US2D WT7X15 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT7X15", + "kind": "keyword", + "trigger": "WT7X15" + }, + { + "contents": "section US3D WT7X15 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT7X15", + "kind": "keyword", + "trigger": "WT7X15" + }, + { + "contents": "section US2D WT7X155.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT7X155.5", + "kind": "keyword", + "trigger": "WT7X155.5" + }, + { + "contents": "section US3D WT7X155.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT7X155.5", + "kind": "keyword", + "trigger": "WT7X155.5" + }, + { + "contents": "section US2D WT7X17 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT7X17", + "kind": "keyword", + "trigger": "WT7X17" + }, + { + "contents": "section US3D WT7X17 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT7X17", + "kind": "keyword", + "trigger": "WT7X17" + }, + { + "contents": "section US2D WT7X171 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT7X171", + "kind": "keyword", + "trigger": "WT7X171" + }, + { + "contents": "section US3D WT7X171 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT7X171", + "kind": "keyword", + "trigger": "WT7X171" + }, + { + "contents": "section US2D WT7X185 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT7X185", + "kind": "keyword", + "trigger": "WT7X185" + }, + { + "contents": "section US3D WT7X185 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT7X185", + "kind": "keyword", + "trigger": "WT7X185" + }, + { + "contents": "section US2D WT7X19 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT7X19", + "kind": "keyword", + "trigger": "WT7X19" + }, + { + "contents": "section US3D WT7X19 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT7X19", + "kind": "keyword", + "trigger": "WT7X19" + }, + { + "contents": "section US2D WT7X199 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT7X199", + "kind": "keyword", + "trigger": "WT7X199" + }, + { + "contents": "section US3D WT7X199 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT7X199", + "kind": "keyword", + "trigger": "WT7X199" + }, + { + "contents": "section US2D WT7X21.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT7X21.5", + "kind": "keyword", + "trigger": "WT7X21.5" + }, + { + "contents": "section US3D WT7X21.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT7X21.5", + "kind": "keyword", + "trigger": "WT7X21.5" + }, + { + "contents": "section US2D WT7X213 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT7X213", + "kind": "keyword", + "trigger": "WT7X213" + }, + { + "contents": "section US3D WT7X213 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT7X213", + "kind": "keyword", + "trigger": "WT7X213" + }, + { + "contents": "section US2D WT7X227.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT7X227.5", + "kind": "keyword", + "trigger": "WT7X227.5" + }, + { + "contents": "section US3D WT7X227.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT7X227.5", + "kind": "keyword", + "trigger": "WT7X227.5" + }, + { + "contents": "section US2D WT7X24 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT7X24", + "kind": "keyword", + "trigger": "WT7X24" + }, + { + "contents": "section US3D WT7X24 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT7X24", + "kind": "keyword", + "trigger": "WT7X24" + }, + { + "contents": "section US2D WT7X250 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT7X250", + "kind": "keyword", + "trigger": "WT7X250" + }, + { + "contents": "section US3D WT7X250 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT7X250", + "kind": "keyword", + "trigger": "WT7X250" + }, + { + "contents": "section US2D WT7X26.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT7X26.5", + "kind": "keyword", + "trigger": "WT7X26.5" + }, + { + "contents": "section US3D WT7X26.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT7X26.5", + "kind": "keyword", + "trigger": "WT7X26.5" + }, + { + "contents": "section US2D WT7X275 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT7X275", + "kind": "keyword", + "trigger": "WT7X275" + }, + { + "contents": "section US3D WT7X275 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT7X275", + "kind": "keyword", + "trigger": "WT7X275" + }, + { + "contents": "section US2D WT7X30.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT7X30.5", + "kind": "keyword", + "trigger": "WT7X30.5" + }, + { + "contents": "section US3D WT7X30.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT7X30.5", + "kind": "keyword", + "trigger": "WT7X30.5" + }, + { + "contents": "section US2D WT7X302.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT7X302.5", + "kind": "keyword", + "trigger": "WT7X302.5" + }, + { + "contents": "section US3D WT7X302.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT7X302.5", + "kind": "keyword", + "trigger": "WT7X302.5" + }, + { + "contents": "section US2D WT7X332.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT7X332.5", + "kind": "keyword", + "trigger": "WT7X332.5" + }, + { + "contents": "section US3D WT7X332.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT7X332.5", + "kind": "keyword", + "trigger": "WT7X332.5" + }, + { + "contents": "section US2D WT7X34 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT7X34", + "kind": "keyword", + "trigger": "WT7X34" + }, + { + "contents": "section US3D WT7X34 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT7X34", + "kind": "keyword", + "trigger": "WT7X34" + }, + { + "contents": "section US2D WT7X365 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT7X365", + "kind": "keyword", + "trigger": "WT7X365" + }, + { + "contents": "section US3D WT7X365 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT7X365", + "kind": "keyword", + "trigger": "WT7X365" + }, + { + "contents": "section US2D WT7X37 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT7X37", + "kind": "keyword", + "trigger": "WT7X37" + }, + { + "contents": "section US3D WT7X37 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT7X37", + "kind": "keyword", + "trigger": "WT7X37" + }, + { + "contents": "section US2D WT7X404 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT7X404", + "kind": "keyword", + "trigger": "WT7X404" + }, + { + "contents": "section US3D WT7X404 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT7X404", + "kind": "keyword", + "trigger": "WT7X404" + }, + { + "contents": "section US2D WT7X41 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT7X41", + "kind": "keyword", + "trigger": "WT7X41" + }, + { + "contents": "section US3D WT7X41 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT7X41", + "kind": "keyword", + "trigger": "WT7X41" + }, + { + "contents": "section US2D WT7X436.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT7X436.5", + "kind": "keyword", + "trigger": "WT7X436.5" + }, + { + "contents": "section US3D WT7X436.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT7X436.5", + "kind": "keyword", + "trigger": "WT7X436.5" + }, + { + "contents": "section US2D WT7X45 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT7X45", + "kind": "keyword", + "trigger": "WT7X45" + }, + { + "contents": "section US3D WT7X45 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT7X45", + "kind": "keyword", + "trigger": "WT7X45" + }, + { + "contents": "section US2D WT7X49.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT7X49.5", + "kind": "keyword", + "trigger": "WT7X49.5" + }, + { + "contents": "section US3D WT7X49.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT7X49.5", + "kind": "keyword", + "trigger": "WT7X49.5" + }, + { + "contents": "section US2D WT7X54.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT7X54.5", + "kind": "keyword", + "trigger": "WT7X54.5" + }, + { + "contents": "section US3D WT7X54.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT7X54.5", + "kind": "keyword", + "trigger": "WT7X54.5" + }, + { + "contents": "section US2D WT7X60 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT7X60", + "kind": "keyword", + "trigger": "WT7X60" + }, + { + "contents": "section US3D WT7X60 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT7X60", + "kind": "keyword", + "trigger": "WT7X60" + }, + { + "contents": "section US2D WT7X66 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT7X66", + "kind": "keyword", + "trigger": "WT7X66" + }, + { + "contents": "section US3D WT7X66 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT7X66", + "kind": "keyword", + "trigger": "WT7X66" + }, + { + "contents": "section US2D WT7X72.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT7X72.5", + "kind": "keyword", + "trigger": "WT7X72.5" + }, + { + "contents": "section US3D WT7X72.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT7X72.5", + "kind": "keyword", + "trigger": "WT7X72.5" + }, + { + "contents": "section US2D WT7X79.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT7X79.5", + "kind": "keyword", + "trigger": "WT7X79.5" + }, + { + "contents": "section US3D WT7X79.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT7X79.5", + "kind": "keyword", + "trigger": "WT7X79.5" + }, + { + "contents": "section US2D WT7X88 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT7X88", + "kind": "keyword", + "trigger": "WT7X88" + }, + { + "contents": "section US3D WT7X88 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT7X88", + "kind": "keyword", + "trigger": "WT7X88" + }, + { + "contents": "section US2D WT7X96.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT7X96.5", + "kind": "keyword", + "trigger": "WT7X96.5" + }, + { + "contents": "section US3D WT7X96.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT7X96.5", + "kind": "keyword", + "trigger": "WT7X96.5" + }, + { + "contents": "section US2D WT8X13 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT8X13", + "kind": "keyword", + "trigger": "WT8X13" + }, + { + "contents": "section US3D WT8X13 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT8X13", + "kind": "keyword", + "trigger": "WT8X13" + }, + { + "contents": "section US2D WT8X15.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT8X15.5", + "kind": "keyword", + "trigger": "WT8X15.5" + }, + { + "contents": "section US3D WT8X15.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT8X15.5", + "kind": "keyword", + "trigger": "WT8X15.5" + }, + { + "contents": "section US2D WT8X18 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT8X18", + "kind": "keyword", + "trigger": "WT8X18" + }, + { + "contents": "section US3D WT8X18 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT8X18", + "kind": "keyword", + "trigger": "WT8X18" + }, + { + "contents": "section US2D WT8X20 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT8X20", + "kind": "keyword", + "trigger": "WT8X20" + }, + { + "contents": "section US3D WT8X20 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT8X20", + "kind": "keyword", + "trigger": "WT8X20" + }, + { + "contents": "section US2D WT8X22.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT8X22.5", + "kind": "keyword", + "trigger": "WT8X22.5" + }, + { + "contents": "section US3D WT8X22.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT8X22.5", + "kind": "keyword", + "trigger": "WT8X22.5" + }, + { + "contents": "section US2D WT8X25 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT8X25", + "kind": "keyword", + "trigger": "WT8X25" + }, + { + "contents": "section US3D WT8X25 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT8X25", + "kind": "keyword", + "trigger": "WT8X25" + }, + { + "contents": "section US2D WT8X28.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT8X28.5", + "kind": "keyword", + "trigger": "WT8X28.5" + }, + { + "contents": "section US3D WT8X28.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT8X28.5", + "kind": "keyword", + "trigger": "WT8X28.5" + }, + { + "contents": "section US2D WT8X33.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT8X33.5", + "kind": "keyword", + "trigger": "WT8X33.5" + }, + { + "contents": "section US3D WT8X33.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT8X33.5", + "kind": "keyword", + "trigger": "WT8X33.5" + }, + { + "contents": "section US2D WT8X38.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT8X38.5", + "kind": "keyword", + "trigger": "WT8X38.5" + }, + { + "contents": "section US3D WT8X38.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT8X38.5", + "kind": "keyword", + "trigger": "WT8X38.5" + }, + { + "contents": "section US2D WT8X44.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT8X44.5", + "kind": "keyword", + "trigger": "WT8X44.5" + }, + { + "contents": "section US3D WT8X44.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT8X44.5", + "kind": "keyword", + "trigger": "WT8X44.5" + }, + { + "contents": "section US2D WT8X50 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT8X50", + "kind": "keyword", + "trigger": "WT8X50" + }, + { + "contents": "section US3D WT8X50 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT8X50", + "kind": "keyword", + "trigger": "WT8X50" + }, + { + "contents": "section US2D WT9X105.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT9X105.5", + "kind": "keyword", + "trigger": "WT9X105.5" + }, + { + "contents": "section US3D WT9X105.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT9X105.5", + "kind": "keyword", + "trigger": "WT9X105.5" + }, + { + "contents": "section US2D WT9X117 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT9X117", + "kind": "keyword", + "trigger": "WT9X117" + }, + { + "contents": "section US3D WT9X117 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT9X117", + "kind": "keyword", + "trigger": "WT9X117" + }, + { + "contents": "section US2D WT9X129 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT9X129", + "kind": "keyword", + "trigger": "WT9X129" + }, + { + "contents": "section US3D WT9X129 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT9X129", + "kind": "keyword", + "trigger": "WT9X129" + }, + { + "contents": "section US2D WT9X141.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT9X141.5", + "kind": "keyword", + "trigger": "WT9X141.5" + }, + { + "contents": "section US3D WT9X141.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT9X141.5", + "kind": "keyword", + "trigger": "WT9X141.5" + }, + { + "contents": "section US2D WT9X155.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT9X155.5", + "kind": "keyword", + "trigger": "WT9X155.5" + }, + { + "contents": "section US3D WT9X155.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT9X155.5", + "kind": "keyword", + "trigger": "WT9X155.5" + }, + { + "contents": "section US2D WT9X17.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT9X17.5", + "kind": "keyword", + "trigger": "WT9X17.5" + }, + { + "contents": "section US3D WT9X17.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT9X17.5", + "kind": "keyword", + "trigger": "WT9X17.5" + }, + { + "contents": "section US2D WT9X20 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT9X20", + "kind": "keyword", + "trigger": "WT9X20" + }, + { + "contents": "section US3D WT9X20 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT9X20", + "kind": "keyword", + "trigger": "WT9X20" + }, + { + "contents": "section US2D WT9X23 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT9X23", + "kind": "keyword", + "trigger": "WT9X23" + }, + { + "contents": "section US3D WT9X23 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT9X23", + "kind": "keyword", + "trigger": "WT9X23" + }, + { + "contents": "section US2D WT9X25 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT9X25", + "kind": "keyword", + "trigger": "WT9X25" + }, + { + "contents": "section US3D WT9X25 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT9X25", + "kind": "keyword", + "trigger": "WT9X25" + }, + { + "contents": "section US2D WT9X27.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT9X27.5", + "kind": "keyword", + "trigger": "WT9X27.5" + }, + { + "contents": "section US3D WT9X27.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT9X27.5", + "kind": "keyword", + "trigger": "WT9X27.5" + }, + { + "contents": "section US2D WT9X30 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT9X30", + "kind": "keyword", + "trigger": "WT9X30" + }, + { + "contents": "section US3D WT9X30 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT9X30", + "kind": "keyword", + "trigger": "WT9X30" + }, + { + "contents": "section US2D WT9X32.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT9X32.5", + "kind": "keyword", + "trigger": "WT9X32.5" + }, + { + "contents": "section US3D WT9X32.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT9X32.5", + "kind": "keyword", + "trigger": "WT9X32.5" + }, + { + "contents": "section US2D WT9X35.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT9X35.5", + "kind": "keyword", + "trigger": "WT9X35.5" + }, + { + "contents": "section US3D WT9X35.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT9X35.5", + "kind": "keyword", + "trigger": "WT9X35.5" + }, + { + "contents": "section US2D WT9X38 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT9X38", + "kind": "keyword", + "trigger": "WT9X38" + }, + { + "contents": "section US3D WT9X38 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT9X38", + "kind": "keyword", + "trigger": "WT9X38" + }, + { + "contents": "section US2D WT9X43 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT9X43", + "kind": "keyword", + "trigger": "WT9X43" + }, + { + "contents": "section US3D WT9X43 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT9X43", + "kind": "keyword", + "trigger": "WT9X43" }, { - "contents":"domain ${1:(1)}\n# (1) integer, domain tag", - "details":"Switch to Target Domain", - "kind":"type", - "trigger":"domain" + "contents": "section US2D WT9X48.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT9X48.5", + "kind": "keyword", + "trigger": "WT9X48.5" }, { - "contents":"element Allman ${1:(1)} ${2:(2...4)} ${5:(5)} ${6:[6]}\n# (1) int, unique element tag\n# (2...4) int, node i, j, k\n# (5) int, material tag\n# [6] double, element thickness, default: 1.0", - "details":"Allman’s Triangle With Drilling DoFs", - "kind":"type", - "trigger":"Allman" + "contents": "section US3D WT9X48.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT9X48.5", + "kind": "keyword", + "trigger": "WT9X48.5" }, { - "contents":"element B21 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:[5]} ${6:[6]}\n# (1) int, unique element tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, section tag\n# [5] int, number of integration points, default: 6\n# [6] bool string, nonlinear geometry switch, default: false", - "details":"2D Displacement Based Bernoulli Beam", - "kind":"type", - "trigger":"B21" + "contents": "section US2D WT9X53 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT9X53", + "kind": "keyword", + "trigger": "WT9X53" }, { - "contents":"element B21EH ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:[5]} ${6:[6]}\n# (1) int, unique element tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, section tag\n# [5] int, number of integration points, default: 6\n# [6] bool string, nonlinear geometry switch, default: false", - "details":"2D Displacement Based Bernoulli Beam With End Moment Release", - "kind":"type", - "trigger":"B21EH" + "contents": "section US3D WT9X53 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT9X53", + "kind": "keyword", + "trigger": "WT9X53" }, { - "contents":"element B21EL ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:[5]} ${6:[6]}\n# (1) int, unique element tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, section tag\n# [5] int, number of integration points, default: 6\n# [6] bool string, nonlinear geometry switch, default: false", - "details":"2D Displacement Based Bernoulli Beam With End Moment Release", - "kind":"type", - "trigger":"B21EL" + "contents": "section US2D WT9X59.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT9X59.5", + "kind": "keyword", + "trigger": "WT9X59.5" }, { - "contents":"element B21H ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:[5]} ${6:[6]}\n# (1) int, unique element tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, section tag\n# [5] double, normalized length of each end hinge, default: 0.2 \n# [6] bool string, nonlinear geometry switch, default: false", - "details":"2D Displacement Based Bernoulli Beam with Lumped End Hinges", - "kind":"type", - "trigger":"B21H" + "contents": "section US3D WT9X59.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT9X59.5", + "kind": "keyword", + "trigger": "WT9X59.5" }, { - "contents":"element B31 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:[6]} ${7:[7]}\n# (1) int, unique element tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, section tag\n# (5) int, orientation tag\n# [6] int, number of integration points, default: 5\n# [7] bool string, nonlinear geometry switch, default: false", - "details":"3D Displacement Based Bernoulli Beam", - "kind":"type", - "trigger":"B31" + "contents": "section US2D WT9X65 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT9X65", + "kind": "keyword", + "trigger": "WT9X65" }, { - "contents":"element C3D20 ${1:(1)} ${2:(2...21)} ${22:(22)} ${23:[23]} ${24:[24]}\n# (1) int, unique element tag\n# (2...21) int, eight corner nodes with conventional order\n# (22) int, material tag\n# [23] bool string, reduced integration scheme switch, default: true\n# [24] bool string, nonlinear geometry switch, default: false", - "details":"Second Order Cube/Brick", - "kind":"type", - "trigger":"C3D20" + "contents": "section US3D WT9X65 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT9X65", + "kind": "keyword", + "trigger": "WT9X65" }, { - "contents":"element C3D4 ${1:(1)} ${2:(2...5)} ${6:(6)} ${7:[7]}\n# (1) int, unique element tag\n# (2...5) int, four corner nodes with conventional order\n# (6) int, material tag\n# [7] bool string, nonlinear geometry switch, default: false", - "details":"Linear Tetrahedral", - "kind":"type", - "trigger":"C3D4" + "contents": "section US2D WT9X71.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT9X71.5", + "kind": "keyword", + "trigger": "WT9X71.5" }, { - "contents":"element C3D8 ${1:(1)} ${2:(2...9)} ${10:(10)} ${11:[11]} ${12:[12]}\n# (1) int, unique element tag\n# (2...9) int, eight corner nodes with conventional order\n# (10) int, material tag\n# [11] string, integration scheme, default: 'I'\n# [12] bool string, nonlinear geometry switch, default: false", - "details":"Linear Cube/Brick", - "kind":"type", - "trigger":"C3D8" + "contents": "section US3D WT9X71.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT9X71.5", + "kind": "keyword", + "trigger": "WT9X71.5" }, { - "contents":"element C3D8I ${1:(1)} ${2:(2...9)} ${10:(10)}\n# (1) int, unique element tag\n# (2...9) int, eight corner nodes with conventional order\n# (10) int, material tag", - "details":"Linear Cube/Brick with Incompatible Modes", - "kind":"type", - "trigger":"C3D8I" + "contents": "section US2D WT9X79 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT9X79", + "kind": "keyword", + "trigger": "WT9X79" }, { - "contents":"element CAX3 ${1:(1)} ${2:(2...4)} ${5:(5)} ${6:[6]}\n# (1) int, unique element tag\n# (2...4) int, node tags\n# (5) int, material tag\n# [6] bool string, nonlinear geometry switch, default: false", - "details":"Axisymmetric Linear Triangle", - "kind":"type", - "trigger":"CAX3" + "contents": "section US3D WT9X79 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT9X79", + "kind": "keyword", + "trigger": "WT9X79" }, { - "contents":"element CAX4 ${1:(1)} ${2:(2...5)} ${6:(6)}\n# (1) int, unique element tag\n# (2...5) int, node i, j, k, l\n# (6) int, material tag", - "details":"Axisymmetric Linear Quadrilateral", - "kind":"type", - "trigger":"CAX4" + "contents": "section US2D WT9X87.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT9X87.5", + "kind": "keyword", + "trigger": "WT9X87.5" }, { - "contents":"element CAX8 ${1:(1)} ${2:(2...9)} ${10:(10)}\n# (1) int, unique element tag\n# (2...9) int, node tags\n# (10) int, material tag", - "details":"Axisymmetric Quadratic Quadrilateral", - "kind":"type", - "trigger":"CAX8" + "contents": "section US3D WT9X87.5 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT9X87.5", + "kind": "keyword", + "trigger": "WT9X87.5" }, { - "contents":"element CINP4 ${1:(1)} ${2:(2...5)} ${6:(6)} ${7:[7]}\n# (1) int, unique element tag\n# (2...5) int, node i, j, k, l\n# (6) int, material tag\n# [7] double, element thickness, default: 1.0", - "details":"Bilinear Infinite Quadrilateral", - "kind":"type", - "trigger":"CINP4" + "contents": "section US2D WT9X96 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0\n", + "details": "US 2D Section WT9X96", + "kind": "keyword", + "trigger": "WT9X96" }, { - "contents":"element CP3 ${1:(1)} ${2:(2...4)} ${5:(5)} ${6:[6]} ${7:[7]}\n# (1) int, unique element tag\n# (2...4) int, node i, j, k\n# (5) int, material tag\n# [6] double, element thickness, default: 1.0\n# [7] bool string, nonlinear geometry switch, default: false", - "details":"Constant Strain Triangle", - "kind":"type", - "trigger":"CP3" + "contents": "section US3D WT9X96 ${1:(1)} ${2:(2)} ${3:[3]} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) int, material model tag\n# [3] double, scale, default: 1.0\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity of y axis, default: 0.0\n# [6] double, eccentricity of z axis, default: 0.0\n", + "details": "US 3D Section WT9X96", + "kind": "keyword", + "trigger": "WT9X96" }, { - "contents":"element CP4 ${1:(1)} ${2:(2...5)} ${6:(6)} ${7:[7]} ${8:[8]} ${9:[9]}\n# (1) int, unique element tag\n# (2...5) int, node i, j, k, l\n# (6) int, material tag\n# [7] double, element thickness, default: 1.0\n# [8] bool string, reduced integration switch, default: false\n# [9] bool string, nonlinear geometry switch, default: false", - "details":"Bilinear Quadrilateral", - "kind":"type", - "trigger":"CP4" + "contents": "", + "details": "", + "kind": "type", + "trigger": "Width" }, { - "contents":"element CP4I ${1:(1)} ${2:(2...5)} ${6:(6)} ${7:[7]}\n# (1) int, unique element tag\n# (2...5) int, node i, j, k, l\n# (6) int, material tag\n# [7] double, element thickness, default: 1.0", - "details":"Bilinear Incompatible Quadrilateral", - "kind":"type", - "trigger":"CP4I" + "contents": "integrator WilsonPenzienNewmark ${1:(1)} ${2:(2)} ${3:(3)} ${4:[4...]}\n# (1) int, unique integrator tag\n# (2) double, alpha in Newmark algorithm\n# (3) double, beta in Newmark algorithm\n# [4...] double, damping ratios on the first n modes", + "details": "", + "kind": "type", + "trigger": "WilsonPenzienNewmark" }, { - "contents":"element CP5 ${1:(1)} ${2:(2...6)} ${7:(7)} ${8:[8]} ${9:[9]}\n# (1) int, unique element tag\n# (2...6) int, node tags that define the element\n# (7) int, material tag\n# [8] double, element thickness, default: 1.0\n# [9] bool string, nonlinear geometry switch, default: false", - "details":"Five-Point Quadrilateral", - "kind":"type", - "trigger":"CP5" + "contents": "", + "details": "", + "kind": "type", + "trigger": "Yeoh" }, { - "contents":"element CP6 ${1:(1)} ${2:(2...7)} ${8:(8)} ${9:[9]} ${10:[10]}\n# (1) int, unique element tag\n# (2...7) int, node tags that define the element\n# (8) int, material tag\n# [9] double, element thickness, default: 1.0\n# [10] bool string, nonlinear geometry switch, default: false", - "details":"Quadratic Triangle", - "kind":"type", - "trigger":"CP6" + "contents": "", + "details": "", + "kind": "type", + "trigger": "acc" }, { - "contents":"element CP7 ${1:(1)} ${2:(2...8)} ${9:(9)} ${10:[10]} ${11:[11]}\n# (1) int, unique element tag\n# (2...8) int, node tags that define the element\n# (9) int, material tag\n# [10] double, element thickness, default: 1.0\n# [11] bool string, nonlinear geometry switch, default: false", - "details":"Seven-Point Quadrilateral", - "kind":"type", - "trigger":"CP7" + "contents": "", + "details": "", + "kind": "type", + "trigger": "acceleration" }, { - "contents":"element CP8 ${1:(1)} ${2:(2...9)} ${10:(10)} ${11:[11]} ${12:[12]} ${13:[13]}\n# (1) int, unique element tag\n# (2...9) int, node 1 to node 8\n# (10) int, material tag\n# [11] double, element thickness, default: 1.0\n# [12] bool string, reduced integration switch, default: false\n# [13] bool string, nonlinear geometry switch, default: false", - "details":"Second Order Quadrilateral", - "kind":"type", - "trigger":"CP8" + "contents": "", + "details": "", + "kind": "type", + "trigger": "amplitude" }, { - "contents":"element Contact2D ${1:(1)} ${2:(2)} ${3:(3)} ${4:[4]}\n# (1) int, unique element tag\n# (2) int, master group tag\n# (3) int, slave group tag\n# [4] double, penalty factor", - "details":"2D Node${Slave:(Slave)}-Line${Master:(Master)} Contact Element", - "kind":"type", - "trigger":"Contact2D" + "contents": "", + "details": "", + "kind": "type", + "trigger": "analyse" }, { - "contents":"element Contact3D ${1:(1)} ${2:(2)} ${3:(3)} ${4:[4]}\n# (1) int, unique element tag\n# (2) int, master group tag\n# (3) int, slave group tag\n# [4] double, penalty factor", - "details":"3D Node${Slave:(Slave)}-Triangular Facet${Master:(Master)} Contact Element", - "kind":"type", - "trigger":"Contact3D" + "contents": "", + "details": "", + "kind": "type", + "trigger": "analyze" }, { - "contents":"element DCP3 ${1:(1)} ${2:(2...4)} ${5:(5)} ${6:(6)} ${7:(7)} ${8:[8]}\n# (1) int, unique element tag\n# (2...4) int, node i, j, k\n# (5) int, material tag\n# (6) double, characteristic length\n# (7) double, energy release rate\n# [8] double, element thickness, default: 1.0", - "details":"Constant Strain Triangle With Crack Phase", - "kind":"type", - "trigger":"DCP3" + "contents": "", + "details": "", + "kind": "type", + "trigger": "angularvelocity" }, { - "contents":"element DCP4 ${1:(1)} ${2:(2...5)} ${6:(6)} ${7:(7)} ${8:(8)} ${9:[9]}\n# (1) int, unique element tag\n# (2...5) int, node i, j, k, l\n# (6) int, material tag\n# (7) double, characteristic length\n# (8) double, energy release rate\n# [9] double, element thickness, default: 1.0", - "details":"Bilinear Quadrilateral With Crack Phase", - "kind":"type", - "trigger":"DCP4" + "contents": "", + "details": "", + "kind": "type", + "trigger": "avel" }, { - "contents":"element DKT3 ${1:(1)} ${2:(2...4)} ${5:(5)} ${6:(6)} ${7:[7]}\n# (1) int, unique element tag\n# (2...4) int, node i, j, k\n# (5) int, material tag\n# (6) double, thickness\n# [7] int, numer of integration points, default: 3", - "details":"DKT Triangle Plate", - "kind":"type", - "trigger":"DKT3" + "contents": "set band_mat ${1:(1)}\n# (1) bool, true of false", + "details": "Enable/Disable Banded Storage", + "kind": "type", + "trigger": "band_mat" }, { - "contents":"element DKT4 ${1:(1)} ${2:(2...5)} ${6:(6)} ${7:(7)} ${8:[8]}\n# (1) int, unique element tag\n# (2...5) int, node i, j, k, l\n# (6) int, material tag\n# (7) double, thickness\n# [8] int, numer of integration points along thickness, default: 3", - "details":"DKT Quadrilateral Plate", - "kind":"type", - "trigger":"DKT4" + "contents": "", + "details": "", + "kind": "type", + "trigger": "bodyforce" }, { - "contents":"element DKTS3 ${1:(1)} ${2:(2...4)} ${5:(5)} ${6:(6)} ${7:[7]}\n# (1) int, unique element tag\n# (2...4) int, node i, j, k\n# (5) int, material tag\n# (6) double, thickness\n# [7] int, numer of integration points, default: 3", - "details":"DKT Triangle Shell", - "kind":"type", - "trigger":"DKTS3" + "contents": "clear", + "details": "Clear Domain", + "kind": "type", + "trigger": "clear" }, { - "contents":"element DKTS4 ${1:(1)} ${2:(2...5)} ${6:(6)} ${7:(7)} ${8:[8]}\n# (1) int, unique element tag\n# (2...5) int, node i, j, k, l\n# (6) int, material tag\n# (7) double, thickness\n# [8] int, numer of integration points, default: 3", - "details":"DKT Quadrilateral Shell", - "kind":"type", - "trigger":"DKTS4" + "contents": "", + "details": "", + "kind": "type", + "trigger": "cload" }, { - "contents":"element Damper01 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)}\n# (1) int, unique tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, material tag of associated viscosity material", - "details":"2D Viscous Damper", - "kind":"type", - "trigger":"Damper01" + "contents": "set color_model ${1:(1)}\n# (1) string, color algorithm, one of WP, MIS and false", + "details": "Set Coloring Algorithm", + "kind": "type", + "trigger": "color_model" }, { - "contents":"element Damper02 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:[6]} ${7:[7]} ${8:[8]}\n# (1) int, unique tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, damper tag\n# (5) int, spring tag\n# [6] bool string, if to use matrix in iteration, default: true\n# [7] int, the maximum delay number, default: 0\n# [8] double, beta, default: 0.5", - "details":"2D Maxwell Model", - "kind":"type", - "trigger":"Damper02" + "contents": "", + "details": "", + "kind": "type", + "trigger": "command" }, { - "contents":"element Damper03 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)}\n# (1) int, unique tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, material tag of associated viscosity material", - "details":"3D Viscous Damper", - "kind":"type", - "trigger":"Damper03" + "contents": "", + "details": "", + "kind": "type", + "trigger": "constraint" }, { - "contents":"element Damper04 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:[6]} ${7:[7]} ${8:[8]}\n# (1) int, unique tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, damper tag\n# (5) int, spring tag\n# [6] bool string, if to use matrix in iteration, default: true\n# [7] int, the maximum delay number, default: 0\n# [8] double, beta, default: 0.5", - "details":"3D Maxwell Model", - "kind":"type", - "trigger":"Damper04" + "contents": "set constraint_multiplier ${1:(1)}\n# (1) double, multiplier", + "details": "Set Multiplier for Constraint", + "kind": "type", + "trigger": "constraint_multiplier" }, { - "contents":"element EB21 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:(6)} ${7:[7]}\n# (1) int, unique element tag\n# (2) int, node i\n# (3) int, node j\n# (4) double, area\n# (5) double, moment inertia\n# (6) int, material tag\n# [7] bool string, nonlinear geometry switch, default: false", - "details":"2D Elastic Bernoulli Beam", - "kind":"type", - "trigger":"EB21" + "contents": "", + "details": "", + "kind": "type", + "trigger": "converger" }, { - "contents":"element Embedded2D ${1:(1)} ${2:(2)} ${3:(3)} ${4:[4]}\n# (1) int, unique element tag\n# (2) int, host element tag\n# (3) int, slave node tag\n# [4] double, penalty factor, default: 1E4", - "details":"2D Embedded Element", - "kind":"type", - "trigger":"Embedded2D" + "contents": "converger ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:[5]}\n# (1) string, converger type\n# (2) int, unique tag\n# (3) double, tolerance\n# (4) int, maximum iteration\n# [5] bool string, print switch, default: false", + "details": "Convergence Tester", + "kind": "type", + "trigger": "converger" }, { - "contents":"element Embedded3D ${1:(1)} ${2:(2)} ${3:(3)} ${4:[4]}\n# (1) int, unique element tag\n# (2) int, host element tag\n# (3) int, slave node tag\n# [4] double, penalty factor, default: 1E4", - "details":"3D Embedded Element", - "kind":"type", - "trigger":"Embedded3D" + "contents": "", + "details": "", + "kind": "type", + "trigger": "criterion" }, { - "contents":"element F21 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:[5]} ${6:[6]}\n# (1) int, unique element tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, section tag\n# [5] int, number of integration points, default: 6\n# [6] bool string, nonlinear geometry switch, default: false", - "details":"2D Force Based Bernoulli Beam", - "kind":"type", - "trigger":"F21" + "contents": "", + "details": "", + "kind": "type", + "trigger": "deformed" }, { - "contents":"element F21H ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:[5]} ${6:[6]}\n# (1) int, unique element tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, section tag\n# [5] double, normalized length of each end hinge, default: 0.2 \n# [6] bool string, nonlinear geometry switch, default: false", - "details":"2D Force Based Bernoulli Beam With Lumped End Hinges", - "kind":"type", - "trigger":"F21H" + "contents": "", + "details": "", + "kind": "type", + "trigger": "delete" }, { - "contents":"element F31 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:[6]} ${7:[7]}\n# (1) int, unique element tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, section tag\n# (5) int, orientation tag\n# [6] int, number of integration points, default: 5\n# [7] bool string, nonlinear geometry switch, default: false", - "details":"3D Displacement Based Bernoulli Beam", - "kind":"type", - "trigger":"F31" + "contents": "", + "details": "", + "kind": "type", + "trigger": "disable" }, { - "contents":"element GCMQI ${1:(1)} ${2:(2...5)} ${6:(6)} ${7:[7]} ${8:[8]}\nelement GCMQL ${1:(1)} ${2:(2...5)} ${6:(6)} ${7:[7]} ${8:[8]}\nelement GCMQG ${1:(1)} ${2:(2...5)} ${6:(6)} ${7:[7]} ${8:[8]}\n# (1) int, unique element tag\n# (2...5) int, node i, j, k, l\n# (6) int, material tag\n# [7] double, element thickness, default: 1.0", - "details":"Generalized Conforming Mixed Quadrilateral With Drilling DoFs", - "kind":"type", - "trigger":"GCMQ" + "contents": "", + "details": "", + "kind": "type", + "trigger": "disp" }, { - "contents":"element GQ12 ${1:(1)} ${2:(2...5)} ${6:(6)} ${7:[7]}\n# (1) int, unique element tag\n# (2...5) int, node i, j, k, l\n# (6) int, material tag\n# [7] double, element thickness, default: 1.0", - "details":"Quadrilateral With Drilling DoFs", - "kind":"type", - "trigger":"GQ12" + "contents": "", + "details": "", + "kind": "type", + "trigger": "displacement" }, { - "contents":"element Joint ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4...)}\n# (1) int, unique element tag\n# (2) int, node i\n# (3) int, node j\n# (4...) int, material tags", - "details":"Joint Element", - "kind":"type", - "trigger":"Joint" + "contents": "", + "details": "", + "kind": "type", + "trigger": "dispload" }, { - "contents":"element MVLEM ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} (${6:(6)} ${7:(7)} ${8:(8)} ${9:(9)} ${10:(10)}...)\n# (1) int, unique element tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, material tag of shear spring\n# (5) double, height of shear spring, ranges from 0 to 1\n# (6) double, fibre width\n# (7) double, fibre thickness\n# (8) double, reinforcement ratio of target fibre\n# (9) int, concrete material ${host:(host)} tag\n# (10) int, steel material tag", - "details":"Multiple Vertical Line Element Model", - "kind":"type", - "trigger":"MVLEM" + "contents": "domain ${1:(1)}\n# (1) integer, domain tag", + "details": "Switch to Target Domain", + "kind": "type", + "trigger": "domain" }, { - "contents":"element Mindlin ${1:(1)} ${2:(2...5)} ${6:(6)} ${7:(7)} ${8:[8]}\n# (1) int, unique element tag\n# (2...5) int, node i, j, k, l\n# (6) int, material tag\n# (7) double, thickness\n# [8] int, numer of integration points, default: 5", - "details":"Mindlin Plate Element", - "kind":"type", - "trigger":"Mindlin" + "contents": "", + "details": "", + "kind": "type", + "trigger": "double" }, { - "contents":"element NMB21 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:[5]}\n# (1) int, unique element tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, section tag\n# [5] bool string, nonlinear geometry switch, default: false", - "details":"2D Displacement Based Bernoulli Beam with N-M Interaction Sections", - "kind":"type", - "trigger":"NMB21" + "contents": "", + "details": "", + "kind": "type", + "trigger": "eigen_number" }, { - "contents":"element NMB21EH ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:[5]}\n# (1) int, unique element tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, section tag\n# [5] bool string, nonlinear geometry switch, default: false", - "details":"2D Displacement Based Bernoulli Beam with N-M Interaction Sections and High End Moment Release", - "kind":"type", - "trigger":"NMB21EH" + "contents": "", + "details": "", + "kind": "type", + "trigger": "eigenvalue" }, { - "contents":"element NMB21EL ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:[5]}\n# (1) int, unique element tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, section tag\n# [5] bool string, nonlinear geometry switch, default: false", - "details":"2D Displacement Based Bernoulli Beam with N-M Interaction Sections and Low End Moment Release", - "kind":"type", - "trigger":"NMB21EL" + "contents": "", + "details": "", + "kind": "type", + "trigger": "element" }, { - "contents":"element NMB31 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:[6]}\n# (1) int, unique element tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, section tag\n# (5) int, orientation tag\n# [6] bool string, nonlinear geometry switch, default: false", - "details":"3D Displacement Based Bernoulli Beam with N-M Interaction Sections", - "kind":"type", - "trigger":"NMB31" + "contents": "", + "details": "", + "kind": "type", + "trigger": "elementgroup" }, { - "contents":"element PCPE4DC ${1:(1)} ${2:(2...5)} ${6:(6)} ${7:(7)} ${8:(8)} ${9:(9)} ${10:(10)}\n# (1) int, unique element tag\n# (2...5) int, node i, j, k, l\n# (6) int, solid material tag\n# (7) int, fluid material tag\n# (8) double, alpha\n# (9) double, porosity n\n# (10) double, permeability k", - "details":"Bilinear Quadrilateral With Pore Pressure", - "kind":"type", - "trigger":"PCPE4DC" + "contents": "", + "details": "", + "kind": "type", + "trigger": "enable" }, { - "contents":"element PS ${1:(1)} ${2:(2...5)} ${6:(6)} ${7:[7]}\n# (1) int, unique element tag\n# (2...5) int, node i, j, k, l\n# (6) int, material tag\n# [7] double, element thickness, default: 1.0", - "details":"Pian-Sumihara Quadrilateral Element", - "kind":"type", - "trigger":"PS" + "contents": "", + "details": "", + "kind": "type", + "trigger": "erase" }, { - "contents":"element PatchCube ${1:(1)} -node ${2:(2...)} -knotx ${3:(3...)} -knoty ${4:(4...)} -knotz ${5:(5...)} -material ${6:(6)} ${-thickness (7:[-thickness (7)}]\n# (1) int, unique element ${patch:(patch)} tag\n# (2...) int, node tags of control node polygon\n# (3...) double, knot vector along x axis\n# (4...) double, knot vector along y axis\n# (5...) double, knot vector along z axis\n# (6) int, material tag\n# (7) double, thickness", - "details":"Patch of Hexahedron Elements", - "kind":"type", - "trigger":"PatchCube" + "contents": "exit", + "details": "Exit/Quit", + "kind": "type", + "trigger": "exit" }, { - "contents":"element PatchQuad ${1:(1)} -node ${2:(2...)} -knotx ${3:(3...)} -knoty ${4:(4...)} -material ${5:(5)} ${-thickness (6:[-thickness (6)}]\n# (1) int, unique element ${patch:(patch)} tag\n# (2...) int, node tags of control node polygon\n# (3...) double, knot vector along x axis\n# (4...) double, knot vector along y axis\n# (5) int, material tag\n# (6) double, thickness", - "details":"Patch of Quadrilateral Elements", - "kind":"type", - "trigger":"PatchQuad" + "contents": "expression SimpleScalar ${1:(1)} ${2:(2)} ${3:(3)}\n# (1) int, unique expression tag\n# (2) string, variable list, vertical line separated\n# (3) string, expression or name of file containing expression", + "details": "Simple Scalar Valued Maths Expression", + "kind": "type", + "trigger": "expression" }, { - "contents":"element QE2 ${1:(1)} ${2:(2...5)} ${6:(6)} ${7:[7]}\n# (1) int, unique element tag\n# (2...5) int, node i, j, k, l\n# (6) int, material tag\n# [7] double, element thickness, default: 1.0", - "details":"Mixed Four-Node Quadrilateral Element", - "kind":"type", - "trigger":"QE2" + "contents": "file ${1:(1)}\n# (1) string, file name with or without suffix .sp", + "details": "Load external file", + "kind": "type", + "trigger": "file" }, { - "contents":"element S4 ${1:(1)} ${2:(2...5)} ${6:(6)} ${7:(7)}\n# (1) int, unique element tag\n# (2...5) int, node i, j, k, l\n# (6) int, material tag\n# (7) double, thickness", - "details":"Four Node Shell Element", - "kind":"type", - "trigger":"S4" + "contents": "", + "details": "", + "kind": "type", + "trigger": "finiterestitutionwall" }, { - "contents":"element SGCMQI ${1:(1)} ${2:(2...5)} ${6:(6)} ${7:[7]} ${8:[8]}\nelement SGCMQL ${1:(1)} ${2:(2...5)} ${6:(6)} ${7:[7]} ${8:[8]}\nelement SGCMQG ${1:(1)} ${2:(2...5)} ${6:(6)} ${7:[7]} ${8:[8]}\n# (1) int, unique element tag\n# (2...5) int, node i, j, k, l\n# (6) int, material tag\n# [7] double, element thickness, default: 1.0", - "details":"Generalized Conforming Mixed Quadrilateral With Drilling DoFs", - "kind":"type", - "trigger":"SGCMQ" + "contents": "", + "details": "", + "kind": "type", + "trigger": "finiterestitutionwallpenalty" }, { - "contents":"element SGCMS ${1:(1)} ${2:(2...5)} ${6:(6)} ${7:(7)}\n# (1) int, unique element tag\n# (2...5) int, node i, j, k, l\n# (6) int, material tag\n# (7) double, thickness", - "details":"Simplified Generalized Conforming Mixed Shell Element", - "kind":"type", - "trigger":"SGCMS" + "contents": "", + "details": "", + "kind": "type", + "trigger": "finiterigidwall" }, { - "contents":"element SingleSection2D ${1:(1)} ${2:(2)} ${3:(3)}\n# (1) int, unique tag\n# (2) int, node tag\n# (3) int, section tag", - "details":"2D Single Section", - "kind":"type", - "trigger":"SingleSection2D" + "contents": "", + "details": "", + "kind": "type", + "trigger": "finiterigidwallmultiplier" }, { - "contents":"element SingleSection3D ${1:(1)} ${2:(2)} ${3:(3)}\n# (1) int, unique tag\n# (2) int, node tag\n# (3) int, section tag", - "details":"3D Single Section", - "kind":"type", - "trigger":"SingleSection3D" + "contents": "", + "details": "", + "kind": "type", + "trigger": "finiterigidwallpenalty" }, { - "contents":"element Spring01 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)}\n# (1) int, unique tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, tag of associated material", - "details":"", - "kind":"type", - "trigger":"Spring01" + "contents": "", + "details": "", + "kind": "type", + "trigger": "fix" }, { - "contents":"element Spring02 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)}\n# (1) int, unique tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, tag of associated material", - "details":"", - "kind":"type", - "trigger":"Spring02" + "contents": "", + "details": "", + "kind": "type", + "trigger": "fix2" }, { - "contents":"element T2D2 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:[6]} ${7:[7]} ${8:[8]}\n# (1) int, unique element tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, material tag\n# (5) double, cross sectional area\n# [6] bool string, nonlinear geometry switch, default: false\n# [7] bool string, if to update sectional area, default: false\n# [8] bool string, if to use log strain, default: false", - "details":"2D Linear Truss", - "kind":"type", - "trigger":"T2D2" + "contents": "set fixed_step_size ${1:(1)}\n# (1) bool, true or false", + "details": "Set if to use fixed step size or allow automatic adjustment", + "kind": "type", + "trigger": "fixed_step_size" }, { - "contents":"element T2D2S ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${6:[6]} ${7:[7]} ${8:[8]}\n# (1) int, unique element tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, section tag\n# [5] bool string, nonlinear geometry switch, default: false\n# [6] bool string, if to use log strain, default: false", - "details":"2D Linear Truss Using Section", - "kind":"type", - "trigger":"T2D2S" + "contents": "", + "details": "", + "kind": "type", + "trigger": "fixedlength2d" }, { - "contents":"element T3D2 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:[6]} ${7:[7]} ${8:[8]}\n# (1) int, unique element tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, material tag\n# (5) double, cross sectional area\n# [6] bool string, nonlinear geometry switch, default: false\n# [7] bool string, if to update sectional area, default: false\n# [8] bool string, if to use log strain, default: false", - "details":"3D Linear Truss", - "kind":"type", - "trigger":"T3D2" + "contents": "", + "details": "", + "kind": "type", + "trigger": "fixedlength3d" }, { - "contents":"element T3D2S ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${6:[6]} ${7:[7]} ${8:[8]}\n# (1) int, unique element tag\n# (2) int, node i\n# (3) int, node j\n# (4) int, section tag\n# [5] bool string, nonlinear geometry switch, default: false\n# [6] bool string, if to use log strain, default: false", - "details":"3D Linear Truss Using Section", - "kind":"type", - "trigger":"T3D2S" + "contents": "", + "details": "", + "kind": "type", + "trigger": "fontsize" }, { - "contents":"exit", - "details":"Exit/Quit", - "kind":"type", - "trigger":"exit" + "contents": "", + "details": "", + "kind": "type", + "trigger": "full" }, { - "contents":"file ${1:(1)}\n# (1) string, file name with or without suffix .sp", - "details":"Load external file.", - "kind":"type", - "trigger":"file" + "contents": "fullname", + "details": "Print full name (including path) of the executable", + "kind": "type", + "trigger": "fullname" }, { - "contents":"fullname", - "details":"Print full name (including path) of the executable.", - "kind":"type", - "trigger":"fullname" + "contents": "", + "details": "", + "kind": "type", + "trigger": "generate" }, { - "contents":"import ${1:(1)}\n# (1) string, external module name", - "details":"Import External Module", - "kind":"type", - "trigger":"import" + "contents": "", + "details": "", + "kind": "type", + "trigger": "generatebyplane" }, { - "contents":"integrator Tchamwa ${1:(1)} ${2:(2)}\n# (1) int, unique integrator tag\n# [2] double, spectral radius, default: 0.5", - "details":"", - "kind":"type", - "trigger":"Tchamwa" + "contents": "", + "details": "", + "kind": "type", + "trigger": "generatebypoint" }, { - "contents":"integrator BatheTwoStep ${1:(1)} ${2:(2)} ${3:(3)}\n# (1) int, unique integrator tag\n# [2] double, spectral radius, default: 0\n# [3] double, sub-step size, default: 0.5", - "details":"", - "kind":"type", - "trigger":"BatheTwoStep" + "contents": "", + "details": "", + "kind": "type", + "trigger": "generatebyrule" }, { - "contents":"integrator BatheExplicit ${1:(1)} ${2:(2)}\n# (1) int, unique integrator tag\n# [2] double, spectral radius, default: 0.5", - "details":"", - "kind":"type", - "trigger":"BatheExplicit" + "contents": "", + "details": "", + "kind": "type", + "trigger": "group" }, { - "contents":"integrator GSSSSOptimal ${1:(1)} ${2:[2]}\n# (1) int, unique integrator tag\n# [2] double, spectral radius, default: 0.5", - "details":"Optimal scheme for GSSSS", - "kind":"type", - "trigger":"GSSSSOptimal" + "contents": "", + "details": "", + "kind": "type", + "trigger": "groupbodyforce" }, { - "contents":"integrator OALTS ${1:(1)} ${2:[2]}\n# (1) int, unique integrator tag\n# [2] double, spectral radius, default: 0.5", - "details":"OALTS doi:10.1002/nme.6188", - "kind":"type", - "trigger":"OALTS" + "contents": "", + "details": "", + "kind": "type", + "trigger": "groupcload" }, { - "contents":"integrator GSSSSU0 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)}\n# (1) int, unique integrator tag\n# (2-4) double, three spectral radii", - "details":"U0 family scheme for GSSSS", - "kind":"type", - "trigger":"GSSSSU0" + "contents": "", + "details": "", + "kind": "type", + "trigger": "groupdisp" }, { - "contents":"integrator GSSSSV0 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)}\n# (1) int, unique integrator tag\n# (2-4) double, three spectral radii", - "details":"V0 family scheme for GSSSS", - "kind":"type", - "trigger":"GSSSSV0" + "contents": "", + "details": "", + "kind": "type", + "trigger": "groupdisplacement" }, { - "contents":"integrator GeneralisedAlpha ${1:(1)} ${2:[2]}\n# (1) int, unique tag\n# [2] double, spectral radius at infinite frequency, default: 0.5\n\nintegrator GeneralisedAlpha ${1:(1)} ${2:(2)} ${3:(3)}\n# (1) int, unique tag\n# (2) double, \\alpha_f\n# (3) double, \\alpha_m", - "details":"", - "kind":"type", - "trigger":"GeneralisedAlpha" + "contents": "", + "details": "", + "kind": "type", + "trigger": "groupdispload" }, { - "contents":"integrator GeneralisedAlphaExplicit ${1:(1)} ${2:[2]}\n# (1) int, unique tag\n# [2] double, spectral radius at infinite frequency, default: 0.5", - "details":"", - "kind":"type", - "trigger":"GeneralisedAlphaExplicit" + "contents": "", + "details": "", + "kind": "type", + "trigger": "groupgroup" }, { - "contents":"integrator GeneralisedAlpha ${1:(1)} ${2:[2]}\n# (1) int, unique tag\n# [2] double, spectral radius at infinite frequency, default: 0.5\n\nintegrator GeneralisedAlpha ${1:(1)} ${2:(2)} ${3:(3)}\n# (1) int, unique tag\n# (2) double, \\alpha_f\n# (3) double, \\alpha_m", - "details":"", - "kind":"type", - "trigger":"GeneralizedAlpha" + "contents": "", + "details": "", + "kind": "type", + "trigger": "groupmultiplierbc" }, { - "contents":"integrator LeeElementalNewmark ${1:(1)} ${2:(2)} ${3:(3)} (${4:(4)} ${5:(5)}...)\n# (1) int, unique integrator tag\n# (2) double, alpha\n# (3) double, beta\n# (4) double, damping ratio \\zeta_p at the peak of each mode\n# (5) double, circular frequency\\omega_p at the peak of each mode", - "details":"", - "kind":"type", - "trigger":"LeeElementalNewmark" + "contents": "", + "details": "", + "kind": "type", + "trigger": "grouppenaltybc" }, { - "contents":"integrator LeeNewmark ${1:(1)} ${2:(2)} ${3:(3)} (${4:(4)} ${5:(5)}...)\n# (1) int, unique integrator tag\n# (2) double, alpha\n# (3) double, beta\n# (4) double, damping ratio \\zeta_p at the peak of each mode\n# (5) double, circular frequency\\omega_p at the peak of each mode", - "details":"", - "kind":"type", - "trigger":"LeeNewmark" + "contents": "", + "details": "", + "kind": "type", + "trigger": "hdf5recorder" }, { - "contents":"integrator LeeNewmarkFull ${1:(1)} ${2:(2)} ${3:(3)} (${4:(4)} ${5:(5)} ${6:(6)} ${7:[7...]}...)\n# (1) int, unique integrator tag\n# (2) double, alpha in Newmark method\n# (3) double, beta in Newmark method\n# (4) string, type identifier\n# (5) double, \\zeta_p\n# (6) double, \\omega_p\n# (7...) double/int, parameters associated with the mode", - "details":"", - "kind":"type", - "trigger":"LeeNewmarkFull" + "contents": "", + "details": "", + "kind": "type", + "trigger": "help" }, { - "contents":"integrator Newmark ${1:(1)} ${2:[2]} ${3:[3]}\n# (1) int, unique tag\n# [2] double, alpha, default: 0.25\n# [3] double, beta, default: 0.5", - "details":"", - "kind":"type", - "trigger":"Newmark" + "contents": "", + "details": "", + "kind": "type", + "trigger": "history" }, { - "contents":"integrator RayleighNewmark ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:(6)} ${7:(7)}\n# (1) int, unique tag\n# (2) double, alpha (beta in some references) in Newmark method, normally 0.25\n# (3) double, beta (gamma in some references) in Newmark method, normally 0.5\n# (4) double, alpha\n# (5) double, beta\n# (6) double, theta\n# (7) double, eta", - "details":"", - "kind":"type", - "trigger":"RayleighNewmark" + "contents": "import ${1:(1)}\n# (1) string, external module name", + "details": "Import External Module", + "kind": "type", + "trigger": "import" }, { - "contents":"integrator WilsonPenzienNewmark ${1:(1)} ${2:(2)} ${3:(3)} ${4:[4...]}\n# (1) int, unique integrator tag\n# (2) double, alpha in Newmark algorithm\n# (3) double, beta in Newmark algorithm\n# [4...] double, damping ratios on the first n modes", - "details":"", - "kind":"type", - "trigger":"WilsonPenzienNewmark" + "contents": "set ini_step_size ${1:(1)}\n# (1) double, step size", + "details": "Set Initial Step Size", + "kind": "type", + "trigger": "ini_step_size" }, { - "contents":"material AFC01 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:(6)} ${7:(7)} ${8:(8)}\n# (1) int, unique tag\n# (2) double, elastic modulus\n# (3) double, tension yield stress\n# (4) double, tension hardening modulus\n# (5) double, tension unloading modulus\n# (6) double, compression yield stress\n# (7) double, compression hardening modulus\n# (8) double, compression unloading modulus", - "details":"Asymmetrical Friction Connection", - "kind":"type", - "trigger":"AFC01" + "contents": "", + "details": "", + "kind": "type", + "trigger": "initial" }, { - "contents":"material AFC02 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)}\n# (1) int, unique tag\n# (2) double, elastic modulus\n# (3) double, yield stress\n# (4) double, hardening modulus\n# (5) double, unloading modulus", - "details":"Symmetrical Friction Connection", - "kind":"type", - "trigger":"AFC02" + "contents": "", + "details": "", + "kind": "type", + "trigger": "integrator" }, { - "contents":"material AFCN ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:(6)} ${7:(7)} ${8:(8)} ${9:[9]} ${10:[10]}\n# (1) int, unique tag\n# (2) double, elastic modulus\n# (3) double, tension yield stress\n# (4) double, tension hardening modulus\n# (5) double, tension unloading modulus\n# (6) double, compression yield stress\n# (7) double, compression hardening modulus\n# (8) double, compression unloading modulus\n# [9] double, non-negative degradation paramater, default: 0.0\n# [10] double, density, default: 0.0", - "details":"Nonlinear Version of AFC", - "kind":"type", - "trigger":"AFCN" + "contents": "set iterative_refinement ${1:(1)}\n# (1) integer, number of refinement steps", + "details": "Set Iterative Refinement Number", + "kind": "type", + "trigger": "iterative_refinement" }, { - "contents":"material BWBN ${1:(1)} ${2:[2...18]}\n# (1) int, unique material tag\n# [2] double, elastic modulus, default: 2E5\n# [3] double, yield stress, default: 4E2\n# [4] double, hardening ratio, default: 1E-2\n# [5] double, beta (>0), default: 0.5\n# [6] double, exponent n (>0, normally >=1), default: 1.0\n# [7] double, initial \nu (>0), default: 1.0\n# [8] double, slope of \nu (>0), default: 0.0\n# [9] double, initial eta (>0), default: 1.0\n# [10] double, slope of eta (>0), default: 0.0\n# [11] double, initial phi (>0), default: 1.0\n# [12] double, slope of phi (>0), default: 0.0\n# [13] double, zeta ${1>zeta>0:(1>zeta>0)}, default: 0.0\n# [14] double, slope of A (>0), default: 0.0\n# [15] double, p (>0), default: 0.0\n# [16] double, q (>0), default: 0.0\n# [17] double, lambda (>0), default: 1.0\n# [18] double, density, default: 0.0", - "details":"Bouc-Wen-Baber-Noori Model", - "kind":"type", - "trigger":"BWBN" + "contents": "", + "details": "", + "kind": "type", + "trigger": "list" }, { - "contents":"material BilinearElastic1D ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:[5]}\n# (1) int, unique material tag\n# (2) double, elastic modulus\n# (3) double, yield stress\n# (4) double, hardening modulus\n# [5] double, density, default: 0.0", - "details":"Uniaxial Bilinear Elastic Material", - "kind":"type", - "trigger":"BilinearElastic1D" + "contents": "", + "details": "", + "kind": "type", + "trigger": "load" }, { - "contents":"material BilinearOO ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:(6)} ${7:[7]}\n# (1) int, unique material tag\n# (2) double, elastic modulus\n# (3) double, tension yield strain\n# (4) double, tension hardening ratio\n# (5) double, compression yield strain\n# (6) double, compression hardening ratio\n# [7] double, density, default: 0.0", - "details":"Bilinear Origin Oriented Model", - "kind":"type", - "trigger":"BilinearOO" + "contents": "set load_multiplier ${1:(1)}\n# (1) double, multiplier", + "details": "Set Multiplier for Load", + "kind": "type", + "trigger": "load_multiplier" }, { - "contents":"material BilinearPO ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:(6)} ${7:[7]}\n# (1) int, unique material tag\n# (2) double, elastic modulus\n# (3) double, tension yield strain\n# (4) double, tension hardening ratio\n# (5) double, compression yield strain\n# (6) double, compression hardening ratio\n# [7] double, density, default: 0.0", - "details":"Bilinear Peak Oriented Model", - "kind":"type", - "trigger":"BilinearPO" + "contents": "", + "details": "", + "kind": "type", + "trigger": "mass" }, { - "contents":"material BoucWen ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:(6)}\n# (1) int, unique material tag\n# (2) double, elastic modulus\n# (3) double, yield stress\n# (4) double, hardening ratio\n# (5) double, beta, a positive parameter\n# (6) double, n, a positive exponent", - "details":"Bouc-Wen Model", - "kind":"type", - "trigger":"BouncWen" + "contents": "", + "details": "", + "kind": "type", + "trigger": "material" }, { - "contents":"material ConcreteCM ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:(6)} ${7:[7]} ${8:[8]} ${9:[9]} ${10:[10]}\n# (1) int, unique material tag\n# (2) double, elastic modulus\n# (3) double, compression strength, should be negative but sign insensitive\n# (4) double, tension strength, should be positive but sign insensitive\n# (5) double, NC\n# (6) double, NT\n# [7] double, strain at compression strength, default: -2E-3\n# [8] double, strain at tension strength, default: 1E-4\n# [9] bool string, linear transition switch, default: false\n# [10] double, density, default: 0.0", - "details":"Chang-Mander Concrete Model", - "kind":"type", - "trigger":"ConcreteCM" + "contents": "", + "details": "", + "kind": "type", + "trigger": "materialtest1d" }, { - "contents":"material ConcreteExp ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:(6)} ${7:(7)} ${8:(8)} ${9:[9]} ${10:[10]}\n# (1) int, unique tag\n# (2) double, elastic modulus\n# (3) double, f_t\n# (4) double, a_t\n# (5) double, g_t\n# (6) double, f_{c,m}\n# (7) double, a_c\n# (8) double, g_c\n# [9] double, middle point, default: 0.2\n# [10] double, density, default: 0.0", - "details":"Objective Concrete Model", - "kind":"type", - "trigger":"ConcreteExp" + "contents": "", + "details": "", + "kind": "type", + "trigger": "materialtest2d" }, { - "contents":"material ConcreteTsai ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:(6)} ${7:(7)} ${8:[8]} ${9:[9]} ${10:[10]} ${11:[11]}\n# (1) int, unique material tag\n# (2) double, compression strength, should be negative but sign insensitive\n# (3) double, tension strength, should be positive but sign insensitive\n# (4) double, MC\n# (5) double, NC\n# (6) double, MT\n# (7) double, NT\n# [8] double, strain at compression strength, default: -2E-3\n# [9] double, strain at tension strength, default: 1E-4\n# [10] double, middle point, default: 0.2\n# [11] double, density, default: 0.0", - "details":"Uniaxial Concrete Model Using Tsai's Equation", - "kind":"type", - "trigger":"ConcreteTsai" + "contents": "", + "details": "", + "kind": "type", + "trigger": "materialtest3d" }, { - "contents":"material Elastic1D ${1:(1)} ${2:(2)} ${3:[3]}\n# (1) int, unique material tag\n# (2) double, elastic modulus\n# [3] double, density, default: 0.0", - "details":"Uniaxial Elastic Material", - "kind":"type", - "trigger":"Elastic1D" + "contents": "", + "details": "", + "kind": "type", + "trigger": "materialtestbyload1d" }, { - "contents":"material Sinh1D ${1:(1)} ${2:(2)} ${3:[3]}\n# (1) int, unique material tag\n# (2) double, elastic modulus\n# [3] double, density, default: 0.0", - "details":"Uniaxial Nonlinear Elastic Material Using Sinh", - "kind":"type", - "trigger":"Sinh1D" + "contents": "", + "details": "", + "kind": "type", + "trigger": "materialtestbyload2d" }, { - "contents":"material Tanh1D ${1:(1)} ${2:(2)} ${3:[3]}\n# (1) int, unique material tag\n# (2) double, elastic modulus\n# [3] double, density, default: 0.0", - "details":"Uniaxial Nonlinear Elastic Material Using Tanh", - "kind":"type", - "trigger":"Tanh1D" + "contents": "", + "details": "", + "kind": "type", + "trigger": "materialtestbyload3d" }, { - "contents":"material Flag01 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)}\n# (1) int, unique material tag\n# (2) double, elastic modulus\n# (3) double, yield stress, positive\n# (4) double, residual stress, can be either positive or negative\n# (5) double, hardening ratio", - "details":"", - "kind":"type", - "trigger":"Flag01" + "contents": "", + "details": "", + "kind": "type", + "trigger": "materialtestbyloadwithbase3d" }, { - "contents":"material MPF ${1:(1)} ${2:(2)} ${3:(3)} ${4:[4]} ${5:[5]} ${6:[6]} ${7:[7]} ${8:[8]} ${9:[9]} ${10:[10]} ${11:[11]} ${12:[12]}\n# (1) int, unique material tag\n# (2) double, elastic modulus\n# (3) double, initial yield stress\n# [4] double, hardening ratio, default: 0.05\n# [5] double, R0, default: 20.0\n# [6] double, A1, default: 18.5\n# [7] double, A2, default: 0.15\n# [8] double, A3, default: 0.01\n# [9] double, A4, default: 7.0\n# [10] bool string, isotropic hardening switch, default: false\n# [11] bool string, constant radius switch, default: false\n# [12] double, density, default: 0.0", - "details":"Menegotto-Pinto-Filippou Steel Model", - "kind":"type", - "trigger":"MPF" + "contents": "", + "details": "", + "kind": "type", + "trigger": "materialtestbystrainhistory" }, { - "contents":"material MultilinearElastic1D ${1:(1)} ${2:(2 3...)} ${4:[4]}\n# (1) int, unique material tag\n# (2) double, strain of the data point\n# (3) double, stress of the data point\n# [4] double, density, default: 0.0", - "details":"Uniaxial Multilinear Elastic Material", - "kind":"type", - "trigger":"MultilinearElastic1D" + "contents": "", + "details": "", + "kind": "type", + "trigger": "materialtestbystresshistory" }, { - "contents":"material MultilinearOO ${1:(1)} ${2:(2)} ${3:(3)} ${4:[4]}\n# (1) int, unique material tag\n# (2) string, file name of tension backbone\n# (3) string, file name of compression backbone\n# [4] double, density, default: 0.0", - "details":"Multilinear Origin Oriented Hysteresis Model", - "kind":"type", - "trigger":"MultilinearOO" + "contents": "", + "details": "", + "kind": "type", + "trigger": "materialtestwithbase3d" }, { - "contents":"material NLE1D01 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:[5]} ${6:[6]}\n# (1) int, unique material tag\n# (2) double, elastic modulus\n# (3) double, turning stress\n# (4) double, hardening ratio\n# [5] double, radius of transition, default: 20\n# [6] double, density, default: 0.0", - "details":"Nonlinear Elastic 1D Type 01", - "kind":"type", - "trigger":"NLE1D01" + "contents": "set max_iteration ${1:(1)}\n# (1) integer, number of iterations", + "details": "Set Maximum Iteration", + "kind": "type", + "trigger": "max_iteration" }, { - "contents":"material PolyElastic1D ${1:(1)} [${2:(2)}...]\n# (1) int, unique material tag\n# (2) double, polynomial parameters, a_n", - "details":"Polynomial Based Uniaxial Nonlinear Elastic", - "kind":"type", - "trigger":"PolyElastic1D" + "contents": "set max_step_size ${1:(1)}\n# (1) double, step size", + "details": "Set Maximum Step Size", + "kind": "type", + "trigger": "max_step_size" }, { - "contents":"material RambergOsgood ${1:(1)} ${2:(2)} ${3:(3)} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique material tag\n# (2) double, elastic modulus\n# (3) double, initial yield stress\n# [4] double, offset alpha, default: 1.0\n# [5] double, n, default: 4.0\n# [6] double, density, default: 0.0", - "details":"Ramberg-Osgood Steel Model", - "kind":"type", - "trigger":"RambergOsgood" + "contents": "set min_step_size ${1:(1)}\n# (1) double, step size", + "details": "Set Minimum Step Size", + "kind": "type", + "trigger": "min_step_size" }, { - "contents":"material SlipLock ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:[5]} ${6:[6]}\n# (1) int, unique material tag\n# (2) double, elastic modulus\n# (3) double, initial yield strain\n# (4) double, hardening ratio\n# [5] double, radius, default: 20.0\n# [6] double, density, default: 0.0", - "details":"Slip-Lock Material", - "kind":"type", - "trigger":"SlipLock" + "contents": "", + "details": "", + "kind": "type", + "trigger": "mixed" }, { - "contents":"material SteelBRB ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:(6)} ${7:(7)} ${8:(8)} ${9:(9)} ${10:(10)} ${11:[11]}\n# (1) int, unique material tag\n# (2) double, elastic modulus\n# (3) double, yield stress\n# (4) double, plastic modulus\n# (5) double, tension saturated stress\n# (6) double, tension delta_r\n# (7) double, tension alpha\n# (8) double, compression saturated stress\n# (9) double, compression delta_r\n# (10) double, compression alpha\n# [11] double, density, default: 0.0", - "details":"Steel Model For Modelling BRB", - "kind":"type", - "trigger":"SteelBRB" + "contents": "", + "details": "", + "kind": "type", + "trigger": "modifier" }, { - "contents":"node ${1:(1)} ${2:(2...)}\n# (1) integer, unique node tag\n# (2...) double, coordinates", - "details":"Define Node", - "kind":"type", - "trigger":"node" + "contents": "", + "details": "", + "kind": "type", + "trigger": "mpc" }, { - "contents":"node ${1:(1)} ${2:[2...]}\n# (1) int, unique tag\n# [2...] double, coordinates", - "kind":"keyword", - "trigger":"node" + "contents": "", + "details": "", + "kind": "type", + "trigger": "multiplierbc" }, { - "contents":"orientation ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)}\n# (1) int, unique orientation tag\n# (2) string, orientation type\n# (3) double, x component of local z axis\n# (4) double, y component of local z axis\n# (5) double, z component of local z axis", - "details":"Section Orientation For 3D Beams", - "kind":"type", - "trigger":"Orientation" + "contents": "", + "details": "", + "kind": "type", + "trigger": "mute" }, { - "contents":"peek ${1:(1)} ${2:(2...)}\n# (1) string, object type\n# (2...) integer, tags", - "details":"Quick Check", - "kind":"type", - "trigger":"peek" + "contents": "", + "details": "", + "kind": "type", + "trigger": "nobar" }, { - "contents":"precheck", - "details":"Dry-run analysis", - "kind":"type", - "trigger":"precheck" + "contents": "node ${1:(1)} ${2:(2...)}\n# (1) integer, unique node tag\n# (2...) double, coordinates", + "details": "Define Node", + "kind": "type", + "trigger": "node" }, { - "contents":"pwd ${1:[1]}\n# [1] string, path name", - "details":"Print or change current working folder.", - "kind":"type", - "trigger":"pwd" + "contents": "node ${1:(1)} ${2:[2...]}\n# (1) int, unique tag\n# [2...] double, coordinates", + "details": "", + "kind": "keyword", + "trigger": "node" }, { - "contents":"quit", - "details":"Exit/Quit", - "kind":"type", - "trigger":"quit" + "contents": "", + "details": "", + "kind": "type", + "trigger": "nodegroup" }, { - "contents":"reset", - "details":"Reset Domain", - "kind":"type", - "trigger":"reset" + "contents": "set num_threads ${1:(1)}\n# (1) integer, thread number", + "details": "Set Number of Threads Used by OpenMP", + "kind": "type", + "trigger": "num_threads" }, { - "contents":"response_spectrum ${1:(motion_file_name)} ${2:(period_file_name)} ${3:[interval]} ${4:(damping_ratio)}", - "details":"Compute response spectrum of a target ground motion over given periods.", - "kind":"type", - "trigger":"response_spectrum" + "contents": "", + "details": "", + "kind": "type", + "trigger": "output_folder" }, { - "contents":"save recorder ${1:(1...)}\n# (1...) integer, tags of recorders need to be saved", - "details":"Save recorded data to disk", - "kind":"type", - "trigger":"save" + "contents": "", + "details": "", + "kind": "type", + "trigger": "particlecollision2d" }, { - "contents":"sdof_response ${1:(motion_file_name)} ${2:[interval]} ${3:(natural_frequency)} ${4:(damping_ratio)}", - "details":"Perform response history analysis on a SDOF system with target natural frequency and damping ratio.", - "kind":"type", - "trigger":"sdof_response" + "contents": "", + "details": "", + "kind": "type", + "trigger": "particlecollision3d" }, { - "contents":"section Bar2D ${1:(1)} ${2:(2)} ${3:(3)} ${4:[4]}\n# (1) int, unique section tag\n# (2) double, area\n# (3) int, material tag\n# [4] double, eccentricity, default: 0.0", - "details":"2D Reinforcing Bar Section", - "kind":"type", - "trigger":"Bar2D" + "contents": "", + "details": "", + "kind": "type", + "trigger": "peek" }, { - "contents":"section Bar3D ${1:(1)} ${2:(2)} ${3:(3)} ${4:[4]} ${5:[5]}\n# (1) int, unique section tag\n# (2) double, area\n# (3) int, material tag\n# [4] double, eccentricity along y axis, default: 0.0\n# [5] double, eccentricity along z axis, default: 0.0", - "details":"3D Reinforcing Bar Section", - "kind":"type", - "trigger":"Bar3D" + "contents": "peek ${1:(1)} ${2:(2...)}\n# (1) string, object type\n# (2...) integer, tags", + "details": "Quick Check", + "kind": "type", + "trigger": "peek" }, { - "contents":"section Box2D ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:[6]} ${7:[7]}\n# (1) int, unique section tag\n# (2) double, width\n# (3) double, height\n# (4) double, thickness\n# (5) int, material tag\n# [6] int, number of integration points, default: 6\n# [7] double, eccentricity, default: 0.0", - "details":"2D Box Section", - "kind":"type", - "trigger":"Box2D" + "contents": "", + "details": "", + "kind": "type", + "trigger": "penaltybc" }, { - "contents":"section Box3D ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:[6]} ${7:[7]} ${8:[8]}\n# (1) int, unique section tag\n# (2) double, width\n# (3) double, height\n# (4) double, thickness\n# (5) int, material tag\n# [6] int, number of integration points, default: 3\n# [7] double, eccentricity along y axis, default: 0.0\n# [8] double, eccentricity along z axis, default: 0.0", - "details":"3D Box Section", - "kind":"type", - "trigger":"Box3D" + "contents": "", + "details": "", + "kind": "type", + "trigger": "plainrecorder" }, { - "contents":"section Circle1D ${1:(1)} ${2:(2)} ${3:(3)}\n# (1) int, unique section tag\n# (2) double, radius\n# (3) int, material tag", - "details":"1D Circle Section", - "kind":"type", - "trigger":"Circle1D" + "contents": "", + "details": "", + "kind": "type", + "trigger": "plot" }, { - "contents":"section Circle2D ${1:(1)} ${2:(2)} ${3:(3)} ${4:[4]} ${5:[5]}\n# (1) int, unique section tag\n# (2) double, radius\n# (3) int, material tag\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity, default: 0.0", - "details":"2D Circle Section", - "kind":"type", - "trigger":"Circle2D" + "contents": "", + "details": "", + "kind": "type", + "trigger": "precheck" }, { - "contents":"section Circle3D ${1:(1)} ${2:(2)} ${3:(3)} ${4:[4]} ${5:[5]} ${6:[6]}\n# (1) int, unique section tag\n# (2) double, radius\n# (3) int, material tag\n# [4] int, number of integration points, default: 6\n# [5] double, eccentricity along y axis, default: 0.0\n# [6] double, eccentricity along z axis, default: 0.0", - "details":"3D Circle Section", - "kind":"type", - "trigger":"Circle3D" + "contents": "precheck", + "details": "Dry-run analysis", + "kind": "type", + "trigger": "precheck" }, { - "contents":"section CircularHollow2D ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:[5]} ${6:[6]}\n# (1) int, unique section tag\n# (2) double, radius\n# (3) double, thickness\n# (4) int, material tag\n# [5] int, number of integration points, default: 10\n# [6] double, eccentricity, default: 0.0", - "details":"2D Hollow Circular Section", - "kind":"type", - "trigger":"CircularHollow2D" + "contents": "set precision ${1:(1)}\n# (1) string, preconditioner type, full or mixed", + "details": "Set Solving Precision", + "kind": "type", + "trigger": "precision" }, { - "contents":"section CircularHollow3D ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:[5]} ${6:[6]} ${7:[7]}\n# (1) int, unique section tag\n# (2) double, radius\n# (3) double, thickness\n# (4) int, material tag\n# [5] int, number of integration points, default: 10\n# [6] double, eccentricity along y axis, default: 0.0\n# [7] double, eccentricity along z axis, default: 0.0", - "details":"3D Hollow Circle Section", - "kind":"type", - "trigger":"CircleHollow3D" + "contents": "set preconditioner ${1:(1)}\n# (1) string, preconditioner type, one of Jacobi, ILU and None", + "details": "Set Preconditioner Algorithm", + "kind": "type", + "trigger": "preconditioner" }, { - "contents":"section Fibre1D ${1:(1)} [${2:(2)}...]\n# (1) int, unique section tag\n# [(2)...] int, associated section tags", - "details":"1D Fibre Section", - "kind":"type", - "trigger":"Fibre1D" + "contents": "", + "details": "", + "kind": "type", + "trigger": "print" }, { - "contents":"section Fibre2D ${1:(1)} [${2:(2)}...]\n# (1) int, unique section tag\n# [(2)...] int, associated section tags", - "details":"2D Fibre Section", - "kind":"type", - "trigger":"Fibre2D" + "contents": "", + "details": "", + "kind": "type", + "trigger": "protect" }, { - "contents":"section Fibre3D ${1:(1)} [${2:(2)}...]\n# (1) int, unique section tag\n# [(2)...] int, associated section tags", - "details":"3D Fibre Section", - "kind":"type", - "trigger":"Fibre3D" + "contents": "pwd ${1:[1]}\n# [1] string, path name", + "details": "Print or change current working folder", + "kind": "type", + "trigger": "pwd" }, { - "contents":"section HSection2D ${1:(1)} ${2:(2...7)} ${8:(8)} ${9:[9]} ${10:[10]}\n# (1) int, unique tag\n# (2...7) double, section dimensions\n# (8) int, material tag\n# [9] int, number of integration points, default: 6\n# [10] double, eccentricity measured from the centre, default: 0.0", - "details":"2D H-Section", - "kind":"type", - "trigger":"HSection2D" + "contents": "quit", + "details": "Exit/Quit", + "kind": "type", + "trigger": "quit" }, { - "contents":"section ISection2D ${1:(1)} ${2:(2...7)} ${8:(8)} ${9:[9]} ${10:[10]}\n# (1) int, unique tag\n# (2...7) double, section dimensions\n# (8) int, material tag\n# [9] int, number of integration points, default: 6\n# [10] double, eccentricity measured from the centre, default: 0.0", - "details":"2D I-Section", - "kind":"type", - "trigger":"ISection2D" + "contents": "", + "details": "", + "kind": "type", + "trigger": "recorder" }, { - "contents":"section ISection3D ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:(6)} ${7:(7)} ${8:(8)} ${9:[9]} ${10:[10]} ${11:[11]}\n# (1) int, unique section tag\n# (2) double, top flange width\n# (3) double, top flange thickness\n# (4) double, bottom flange width\n# (5) double, bottom flange thickness\n# (6) double, web height\n# (7) double, web thickness\n# (8) int, material tag\n# [9] int, number of integration points, default: 3\n# [10] double, eccentricity along y axis, default: 0.0\n# [11] double, eccentricity along z axis, default: 0.0", - "details":"3D I-Section", - "kind":"type", - "trigger":"ISection3D" + "contents": "", + "details": "", + "kind": "type", + "trigger": "remove" }, { - "contents":"section NM2D1 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)}\n# (1) int, unique section tag\n# (2) double, EA\n# (3) double, EI\n# (4) double, linear density", - "details":"N-M Interaction Elastic Section", - "kind":"type", - "trigger":"NM2D1" + "contents": "reset", + "details": "Reset Domain", + "kind": "type", + "trigger": "reset" }, { - "contents":"section NM2D2 ${1:(1)} ${2:(2...9)} [${10:(10)} ${11:(11)} ${12:(12)}...]\n# (1) int, unique section tag\n# (2) double, EA\n# (3) double, EI\n# (4) double, yielding axial force\n# (5) double, yielding strong axis moment\n# (6) double, d\n# (7) double, isotropic hardening parameter H\n# (8) double, kinematic hardening parameter K\n# (9) double, linear density\n# (10) double, a_i\n# (11) double, b_i\n# (12) double, c_i", - "details":"N-M Interaction Elastic Section", - "kind":"type", - "trigger":"NM2D2" + "contents": "response_spectrum ${1:(motion_file_name)} ${2:(period_file_name)} ${3:[interval]} ${4:(damping_ratio)}", + "details": "Compute response spectrum of a target ground motion over given periods", + "kind": "type", + "trigger": "response_spectrum" }, { - "contents":"section NM3D1 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)}\n# (1) int, unique section tag\n# (2) double, EA\n# (3) double, EI of strong axis\n# (4) double, EI of weak axis\n# (5) double, linear density", - "details":"N-M Interaction Elastic Section", - "kind":"type", - "trigger":"NM3D1" + "contents": "", + "details": "", + "kind": "type", + "trigger": "restitutionwall" }, { - "contents":"section NM3D2 ${1:(1)} ${2:(2...11)}\n# (1) int, unique section tag\n# (2) double, EA\n# (3) double, strong axis EI\n# (4) double, weak axis EI\n# (5) double, yielding axial force\n# (6) double, yielding strong axis moment\n# (7) double, yielding weak axis moment\n# (8) double, c\n# (9) double, isotropic hardening parameter H\n# (10) double, kinematic hardening parameter K\n# (11) double, linear density", - "details":"N-M Interaction Elastic Section", - "kind":"type", - "trigger":"NM3D2" + "contents": "", + "details": "", + "kind": "type", + "trigger": "restitutionwallpenalty" }, { - "contents":"section Rectangle1D ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)}\n# (1) int, unique section tag\n# (2) double, section width\n# (3) double, section height\n# (4) int, material tag", - "details":"1D Rectangle Section", - "kind":"type", - "trigger":"Rectangle1D" + "contents": "", + "details": "", + "kind": "type", + "trigger": "rigidwall" }, { - "contents":"section Rectangle2D ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:[5]} ${6:[6]}\n# (1) int, unique tag\n# (2) double, section width\n# (3) double, section height\n# (4) int, material tag\n# [5] int, number of integration points, default: 6\n# [6] double, eccentricity measured from the centre, default: 0.0", - "details":"2D Rectangle Section", - "kind":"type", - "trigger":"Rectangle2D" + "contents": "", + "details": "", + "kind": "type", + "trigger": "rigidwallmultiplier" }, { - "contents":"section Rectangle3D ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:[5]} ${6:[6]} ${7:[7]}\n# (1) int, unique section tag\n# (2) double, section width\n# (3) double, section height\n# (4) int, material tag\n# [5] int, number of integration points, default: 3\n# [6] double, eccentricity along y axis, default: 0.0\n# [7] double, eccentricity along z axis, default: 0.0", - "details":"3D Rectangle Section", - "kind":"type", - "trigger":"Rectangle3D" + "contents": "", + "details": "", + "kind": "type", + "trigger": "rigidwallpenalty" }, { - "contents":"section TSection2D ${1:(1)} ${2:(2...5)} ${6:(6)} ${7:[7]} ${8:[8]}\n# (1) int, unique tag\n# (2...5) double, section dimensions\n# (6) int, material tag\n# [7] int, number of integration points, default: 6\n# [8] double, eccentricity measured from the centre, default: 0.0", - "details":"2D T-Section", - "kind":"type", - "trigger":"TSection2D" + "contents": "save recorder ${1:(1...)}\n# (1...) integer, tags of recorders need to be saved", + "details": "Save recorded data to disk", + "kind": "type", + "trigger": "save" }, { - "contents":"section TSection3D ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)} ${6:(6)} ${7:[7]} ${8:[8]} ${9:[9]}\n# (1) int, unique section tag\n# (2) double, top flange width\n# (3) double, top flange thickness\n# (4) double, web height\n# (5) double, web thickness\n# (6) int, material tag\n# [7] int, number of integration points, default: 3\n# [8] double, eccentricity along y axis, default: 0.0\n# [9] double, eccentricity along z axis, default: 0.0", - "details":"3D T-Section", - "kind":"type", - "trigger":"TSection3D" + "contents": "", + "details": "", + "kind": "type", + "trigger": "scale" }, { - "contents":"section TrussSection ${1:(1)} ${2:(2)} ${3:(3)}\n# (1) int, unique section tag\n# (2) double, section area\n# (3) int, material tag", - "details":"1D Truss Section", - "kind":"type", - "trigger":"TrussSection" + "contents": "", + "details": "", + "kind": "type", + "trigger": "screen_output" }, { - "contents":"set band_mat ${1:(1)}\n# (1) bool, true of false", - "details":"Enable/Disable Banded Storage", - "kind":"type", - "trigger":"band_mat" + "contents": "sdof_response ${1:(motion_file_name)} ${2:[interval]} ${3:(natural_frequency)} ${4:(damping_ratio)}", + "details": "Perform response history analysis on a SDOF system with target natural frequency and damping ratio", + "kind": "type", + "trigger": "sdof_response" }, { - "contents":"set color_model ${1:(1)}\n# (1) string, color algorithm, one of WP, MIS and false", - "details":"Set Coloring Algorithm", - "kind":"type", - "trigger":"color_model" + "contents": "", + "details": "", + "kind": "type", + "trigger": "section" }, { - "contents":"set constraint_multiplier ${1:(1)}\n# (1) double, multiplier", - "details":"Set Multiplier for Constraint", - "kind":"type", - "trigger":"constraint_multiplier" + "contents": "", + "details": "", + "kind": "type", + "trigger": "set" }, { - "contents":"set fixed_step_size ${1:(1)}\n# (1) bool, true or false", - "details":"Set if to use fixed step size or allow automatic adjustment.", - "kind":"type", - "trigger":"fixed_step_size" + "contents": "", + "details": "", + "kind": "type", + "trigger": "single" }, { - "contents":"set ini_step_size ${1:(1)}\n# (1) double, step size", - "details":"Set Initial Step Size", - "kind":"type", - "trigger":"ini_step_size" + "contents": "", + "details": "", + "kind": "type", + "trigger": "size" }, { - "contents":"set iterative_refinement ${1:(1)}\n# (1) integer, number of refinement steps", - "details":"Set Iterative Refinement Number", - "kind":"type", - "trigger":"iterative_refinement" + "contents": "", + "details": "", + "kind": "type", + "trigger": "solver" }, { - "contents":"set load_multiplier ${1:(1)}\n# (1) double, multiplier", - "details":"Set Multiplier for Load", - "kind":"type", - "trigger":"load_multiplier" + "contents": "", + "details": "", + "kind": "type", + "trigger": "sparse_mat" }, { - "contents":"set max_iteration ${1:(1)}\n# (1) integer, number of iterations", - "details":"Set Maximum Iteration", - "kind":"type", - "trigger":"max_iteration" + "contents": "", + "details": "", + "kind": "type", + "trigger": "step" }, { - "contents":"set max_step_size ${1:(1)}\n# (1) double, step size", - "details":"Set Maximum Step Size", - "kind":"type", - "trigger":"max_step_size" + "contents": "", + "details": "", + "kind": "type", + "trigger": "summary" }, { - "contents":"set min_step_size ${1:(1)}\n# (1) double, step size", - "details":"Set Minimum Step Size", - "kind":"type", - "trigger":"min_step_size" + "contents": "", + "details": "", + "kind": "type", + "trigger": "supportacceleration" }, { - "contents":"set num_threads ${1:(1)}\n# (1) integer, thread number", - "details":"Set Number of Threads Used by OpenMP", - "kind":"type", - "trigger":"num_threads" + "contents": "", + "details": "", + "kind": "type", + "trigger": "supportdisplacement" }, { - "contents":"set precision ${1:(1)}\n# (1) string, preconditioner type, full or mixed", - "details":"Set Solving Precision", - "kind":"type", - "trigger":"precision" + "contents": "", + "details": "", + "kind": "type", + "trigger": "supportvelocity" }, { - "contents":"set preconditioner ${1:(1)}\n# (1) string, preconditioner type, one of Jacobi, ILU and None", - "details":"Set Preconditioner Algorithm", - "kind":"type", - "trigger":"preconditioner" + "contents": "", + "details": "", + "kind": "type", + "trigger": "suspend" }, { - "contents":"set symm_mat ${1:(1)}\n# (1) bool, true of false", - "details":"Enable/Disable Symmetric Storage", - "kind":"type", - "trigger":"symm_mat" + "contents": "set symm_mat ${1:(1)}\n# (1) bool, true of false", + "details": "Enable/Disable Symmetric Storage", + "kind": "type", + "trigger": "symm_mat" }, { - "contents":"set system_solver BICGSTAB", - "details":"Use BICGSTAB Solver", - "kind":"type", - "trigger":"BICGSTAB" + "contents": "", + "details": "", + "kind": "type", + "trigger": "system_solver" }, { - "contents":"set system_solver CUDA", - "details":"Use CUDA Solver", - "kind":"type", - "trigger":"CUDA" + "contents": "", + "details": "", + "kind": "type", + "trigger": "tabularspline" }, { - "contents":"set system_solver FGMRES", - "details":"Use FGMRES Solver", - "kind":"type", - "trigger":"FGMRES" + "contents": "", + "details": "", + "kind": "type", + "trigger": "terminal" }, { - "contents":"set system_solver GMRES", - "details":"Use GMRES Solver", - "kind":"type", - "trigger":"GMRES" + "contents": "", + "details": "", + "kind": "type", + "trigger": "tolerance" }, { - "contents":"set system_solver LAPACK", - "details":"Use LAPACK Solver", - "kind":"type", - "trigger":"LAPACK" + "contents": "", + "details": "", + "kind": "type", + "trigger": "type" }, { - "contents":"set system_solver MUMPS", - "details":"Use MUMPS Solver", - "kind":"type", - "trigger":"MUMPS" + "contents": "", + "details": "", + "kind": "type", + "trigger": "undeformed" }, { - "contents":"set system_solver PARDISO", - "details":"Use PARDISO Solver", - "kind":"type", - "trigger":"PARDISO" + "contents": "upsampling ${1:(1)} ${2:(2)} ${3:(3)}\n# (1) string, file name\n# (2) integer, upsampling ratio\n# (3) string, window type, one of Hamming, Hann, Blackman, BlackmanNuttall, BlackmanHarris and FlatTop", + "details": "Upsample a given ground motion using a specific window type", + "kind": "type", + "trigger": "upsampling" }, { - "contents":"set system_solver Spike", - "details":"Use Spike Solver", - "kind":"type", - "trigger":"Spike" + "contents": "", + "details": "", + "kind": "type", + "trigger": "vel" }, { - "contents":"set system_solver SuperLU", - "details":"Use SuperLU Solver", - "kind":"type", - "trigger":"SuperLU" + "contents": "", + "details": "", + "kind": "type", + "trigger": "velocity" }, { - "contents":"upsampling ${1:(1)} ${2:(2)} ${3:(3)}\n# (1) string, file name\n# (2) integer, upsampling ratio\n# (3) string, window type, one of Hamming, Hann, Blackman, BlackmanNuttall, BlackmanHarris and FlatTop", - "details":"Upsample a given ground motion using a specific window type.", - "kind":"type", - "trigger":"upsampling" + "contents": "", + "details": "", + "kind": "type", + "trigger": "version" } ], "scope":[ diff --git a/Enhancement/suanPan.sublime-syntax b/Enhancement/suanPan.sublime-syntax index 07e16f8df..d8dcebcb0 100644 --- a/Enhancement/suanPan.sublime-syntax +++ b/Enhancement/suanPan.sublime-syntax @@ -12,13 +12,13 @@ contexts: scope: comment.line - match: '\b(?i)(true|yes|on|t|y|false|no|off|f|n|superlu|mumps|cuda|spike|pardiso|(f)gmres|bicgstab|lapack|full|mixed|single|double|iterative_refinement)\b' scope: variable - - match: '^(?i)(acceleration|analyse|analyze|bodyforce|clear|cload|command|converger|criterion|disable|displacement|domain|element|enable|erase|exit|file|fix(2)?|fixedlength[2|3]d|generate|generatebyplane|generatebypoint|generatebyrule|group|groupbodyforce|groupcload|groupdisplacement|groupmultiplierbc|grouppenaltybc|import|initial|integrator|lineudl[2|3]d|material|materialtest(byload)?(withbase)?[1-3]d|modifier|multiplierbc|node|peek|penaltybc|plot|precheck|protect|pwd|qrcode|(hdf5|plain)?recorder|remove|reset|section|set|solver|step|summary|amplitude|(finite)rigidwall(penalty|multiplier)|(finite)restitutionwall|mass|mpc|constraint|nodegroup|elementgroup|save|terminal|materialtestby(strain|stress)history|orientation|upsampling|response_spectrum|sdof_response)\b' + - match: '^(?i)(acceleration|analyse|analyze|bodyforce|clear|cload|command|converger|criterion|disable|displacement|domain|element|expression|enable|erase|exit|file|fix(2)?|fixedlength[2|3]d|generate|generatebyplane|generatebypoint|generatebyrule|group|groupbodyforce|groupcload|groupdisplacement|groupmultiplierbc|grouppenaltybc|import|initial|integrator|lineudl[2|3]d|material|materialtest(byload)?(withbase)?[1-3]d|modifier|multiplierbc|node|peek|penaltybc|plot|precheck|protect|pwd|qrcode|(hdf5|plain)?recorder|remove|reset|section|set|solver|step|summary|amplitude|(finite)rigidwall(penalty|multiplier)|(finite)restitutionwall|mass|mpc|constraint|nodegroup|elementgroup|save|terminal|materialtestby(strain|stress)history|orientation|upsampling|response_spectrum|sdof_response)\b' scope: keyword # element - match: '\b(?i)(Allman|B21|B21EL|B21EH|B21H|B31|NMB21(EL|EH)|NMB31|C3D20|C3D4|C3D8|C3D8I|C3D8R|CAX3|CAX4|CAX8|CIN3D8|CINP4|Contact2D|Contact3D|CP3|CSMT3|CSMT6|CSMQ[4-8]|CP4I|CP[4-8]|Damper0[1-4]|DC3D4|DC3D8|DCP3|DCP4|DKT3|DKT4|DKTS3|DKTS4|EB21|F21|F21H|F31|GCMQ|SGCMQ|GQ12|Joint|Mass(Point)([2-3]D)|Membrane|Mindlin|MVLEM|NodeLine|NodeFacet|PatchCube|PatchQuad|PCPE4DC|PCPE4DI|PCPE8DC|PCPE4UC|PCPE8UC|PS|QE2|S4|SGCMS|SingleSection2D|SingleSection3D|Spring01|Spring02|T[2|3]D2S?|R[2|3]D2|Tie|Embed[2|3]D|S?GCMQ(I|L|G)?|(T|B)[2|3]D(L|C)|Embedded[2|3]D|Sleeve[2|3]D)\b' scope: storage # material - - match: '\b(?i)(AFC0[1-3]|AFCN|ArmstrongFrederick(1D)?|Axisymmetric(Elastic)?|Bilinear([1-2]D|CC|DP|J2|OO|PO|Peric|Hoffman)|BilinearElastic1D|NLE1D01|BilinearMises1D|BlatzKo|BoucWen|BWBN|CDP(M2(NO|ISO|ANISO)?)?|Concrete2[1-2]|Concrete(CM|Tsai|Exp)|CoulombFriction|DafaliasManzari|Degradation|Elastic(1|2)D|Exp(CC|DP|Gurson|Gurson1D|Hoffman|J2|Mises1D)|Flag0(1|2)|Fluid|IsotropicDamage|Isotropic(Nonlinear)?Elastic3D|Kelvin|Laminated|LinearDamage|Maxwell|Metal|Mises1D|MooneyRivlin|MPF|Multilinear((Elastic)?1D|J2|OO|PO)|NLE3D01|OrthotropicElastic3D|ParabolicCC|Parallel|PlaneStrain|PlaneSymmetric(1|2)3|PlaneStress|PolyJ2|RambergOsgood|Rebar[2|3]D|Sequential|SimpleSand|SlipLock|Stacked|SteelBRB|TableCDP|Trivial|Uniaxial|VAFCRP(1D)?|Viscosity0(1|2)|Yeoh|Elastic3D|TrilinearDegradation|TableGurson|Substepping|PolyElastic1D|Rotation[2|3]D|MultilinearMises1D|Gap01|Dhakal|ConcreteTable|BilinearViscosity|Sinh1D|Tanh1D)\b' + - match: '\b(?i)(AFC0[1-3]|AFCN|ArmstrongFrederick(1D)?|Axisymmetric(Elastic)?|Bilinear([1-2]D|CC|DP|J2|OO|PO|Peric|Hoffman)|BilinearElastic1D|NLE1D01|BilinearMises1D|BlatzKo|BoucWen|BWBN|CDP(M2(NO|ISO|ANISO)?)?|Concrete2[1-2]|Concrete(CM|Tsai|Exp)|CoulombFriction|CustomElastic1D|CustomJ2|CustomDP|CustomHoffman|CustomMises1D|CustomCC|DafaliasManzari|Degradation|Elastic(1|2)D|Exp(CC|DP|Gurson|Gurson1D|Hoffman|J2|Mises1D)|Flag0(1|2)|Fluid|IsotropicDamage|Isotropic(Nonlinear)?Elastic3D|Kelvin|Laminated|LinearDamage|Maxwell|Metal|Mises1D|MooneyRivlin|MPF|Multilinear((Elastic)?1D|J2|OO|PO)|NLE3D01|OrthotropicElastic3D|ParabolicCC|Parallel|PlaneStrain|PlaneSymmetric(1|2)3|PlaneStress|PolyJ2|RambergOsgood|Rebar[2|3]D|Sequential|SimpleSand|SlipLock|Stacked|SteelBRB|TableCDP|Trivial|Uniaxial|VAFCRP(1D)?|Viscosity0(1|2)|Yeoh|Elastic3D|TrilinearDegradation|TableGurson|Substepping|PolyElastic1D|Rotation[2|3]D|MultilinearMises1D|Gap01|Dhakal|ConcreteTable|BilinearViscosity|Sinh1D|Tanh1D|SimpleScalar)\b' scope: storage # section - match: '\b(?i)(Bar[2|3]D|Box[2|3]D|Circle[1-3]D|CircularHollow[2|3]D|EU[2|3]D|Fibre[1-3]D|HSection2D|ISection[2|3]D|NM[2|3]D[1-3]|NM[2|3]D3K|NZ[2|3]D|Rectangle[1-3]D|TrussSection|TSection[2-3]D|US[2|3]D)\b' diff --git a/Enhancement/suanpan.nuspec b/Enhancement/suanpan.nuspec index 82143bf3d..00833efd0 100644 --- a/Enhancement/suanpan.nuspec +++ b/Enhancement/suanpan.nuspec @@ -2,18 +2,18 @@ suanpan - 2.7 + 2.8 https://github.com/TLCFEM/suanPan Theodore Chang suanPan Theodore Chang https://github.com/TLCFEM/suanPan https://raw.githubusercontent.com/TLCFEM/suanPan/dev/Resource/suanPan-ua.svg - 2017-2022 Theodore Chang + 2017-2023 Theodore Chang https://www.gnu.org/licenses/gpl-3.0 true https://github.com/TLCFEM/suanPan - https://tlcfem.gitbook.io/suanpan-manual/ + https://tlcfem.github.io/suanPan-manual/latest/ https://github.com/TLCFEM/suanPan/discussions https://github.com/TLCFEM/suanPan/issues FEM HPC IGA diff --git a/Example/Element/B312.supan b/Example/Element/B31NL.supan similarity index 94% rename from Example/Element/B312.supan rename to Example/Element/B31NL.supan index 03d7cb0b2..00d9dd3f3 100644 --- a/Example/Element/B312.supan +++ b/Example/Element/B31NL.supan @@ -7,7 +7,7 @@ node 2 .6 .8 .2 node 3 2 0 0 node 4 2.6 .8 .2 -material Elastic1D 1 10 +material Elastic1D 1 10 1E-3 section Rectangle3D 1 10 12 1 orientation B3DC 1 .1 -.3 1. diff --git a/Example/Element/T2D2E.supan b/Example/Element/T2D2E.supan new file mode 100644 index 000000000..7afd94b1f --- /dev/null +++ b/Example/Element/T2D2E.supan @@ -0,0 +1,28 @@ +# A TEST MODEL FOR T2D2 ELEMENT + +node 1 0 0 +node 2 4 0 + +material MPF 1 100 300 .4 + +element T2D2 1 1 2 1 100 0 0 0 10 + +fix 1 1 1 +fix 2 2 1 2 + +step static 1 +set fixed_step_size 1 + +cload 1 0 -100 1 2 + +converger RelIncreDisp 1 1E-4 10 1 + +analyze + +peek node 2 + +peek element 1 + +reset +clear +exit \ No newline at end of file diff --git a/Example/Material/ArmstrongFrederick.supan b/Example/Material/ArmstrongFrederick.supan index b1b4c10b7..ccb24695f 100644 --- a/Example/Material/ArmstrongFrederick.supan +++ b/Example/Material/ArmstrongFrederick.supan @@ -36,35 +36,17 @@ converger RelIncreDisp 1 1E-12 10 1 analyze -# Node 9: -# 5.0000 -5.0000 20.0000 -# Displacement: -# 0 0 0.5000 -# Resistance: -# -3.6819e-13 4.4548e-12 1.2885e+04 -# -# Node 10: -# 5.0000 5.0000 20.0000 -# Displacement: -# 0 -0.1173 0.5000 -# Resistance: -# 1.4952e-12 5.6687e-13 1.2885e+04 -# -# Node 11: -# -5.0000 5.0000 20.0000 -# Displacement: -# 0.1173 -0.1173 0.5000 -# Resistance: -# 7.3579e-13 1.9320e-12 1.2885e+04 -# # Node 12: -# -5.0000 -5.0000 20.0000 +# Coordinate: +# -5.0000e+00 -5.0000e+00 2.0000e+01 # Displacement: -# 0.1173 0 0.5000 +# 1.1727e-01 0.0000e+00 5.0000e-01 # Resistance: -# -1.4472e-12 -2.8195e-13 1.2885e+04 +# -6.5089e-12 -4.8070e-12 1.2885e+04 peek node 9 10 11 12 +peek element 1 + reset clear exit \ No newline at end of file diff --git a/Example/Material/DP.supan b/Example/Material/BilinearDP.supan similarity index 100% rename from Example/Material/DP.supan rename to Example/Material/BilinearDP.supan diff --git a/Example/Material/BilinearPO.supan b/Example/Material/BilinearPO.supan index 846d56cc7..cc8d37569 100644 --- a/Example/Material/BilinearPO.supan +++ b/Example/Material/BilinearPO.supan @@ -1,5 +1,6 @@ material BilinearPO 1 100 .02 .03 .05 .02 materialTest1D 1 1E-3 100 200 200 +materialTestByLoad1D 1 1E-3 100 200 200 exit \ No newline at end of file diff --git a/Example/Material/Custom.supan b/Example/Material/Custom.supan new file mode 100644 index 000000000..945a9611b --- /dev/null +++ b/Example/Material/Custom.supan @@ -0,0 +1,27 @@ +# A TEST MODEL FOR CUSTOM MATERIAL + +expression SimpleVector 1 x y|6 example +expression SimpleVector 2 x y|3 y:=0 +expression SimpleVector 3 x y y:=x + +material CustomJ2 1 500 0 5 5 +material CustomJ2 2 500 0 2 5 +material CustomJ2 3 500 0 3 5 +material CustomJ2 4 500 0 3 2 + +expression SimpleScalar 4 x .2+.02x +material CustomHoffman 5 1E5 1E5 1E5 1E5 1E5 1E5 .3 .3 .3 400 300 400 300 250 200 200 200 200 5 +material CustomHoffman 6 1E5 1E5 1E5 1E5 1E5 1E5 .3 .3 .3 400 300 400 300 250 200 200 200 200 2 +material CustomHoffman 7 1E5 1E5 1E5 1E5 1E5 1E5 .3 .3 .3 400 300 400 300 250 200 200 200 200 4 + +material CustomDP 8 1E4 .3 .355 .355 .974 5 +material CustomDP 9 1E4 .3 .355 .355 .974 2 + +material CustomCC 10 1E6 .4 .8 .8 20. 5 +material CustomCC 11 1E6 .4 .8 .8 20. 2 + +step static 1 + +precheck + +exit \ No newline at end of file diff --git a/Example/Material/CustomCC.supan b/Example/Material/CustomCC.supan new file mode 100644 index 000000000..b0f18a59f --- /dev/null +++ b/Example/Material/CustomCC.supan @@ -0,0 +1,48 @@ +# A TEST MODEL FOR BILINEARCC MATERIAL + +node 1 5 -5 -5 +node 2 5 5 -5 +node 3 -5 5 -5 +node 4 -5 -5 -5 +node 5 5 -5 5 +node 6 5 5 5 +node 7 -5 5 5 +node 8 -5 -5 5 + +expression SimpleScalar 1 x 100+2e5*x + +material CustomCC 1 1E6 .4 .8 .8 20. 1 + +element C3D8 1 1 2 3 4 5 6 7 8 1 G + +fix2 1 1 1 2 5 6 +fix2 2 2 1 4 5 8 +fix2 3 3 1 2 3 4 + +displacement 1 0 -2E-3 3 5 6 7 8 + +hdf5recorder 1 Node RF 1 2 3 4 + +step static 1 +set fixed_step_size 1 +set ini_step_size 1E-2 +set symm_mat 0 + +converger RelIncreDisp 1 1E-13 50 1 + +analyze + +# Node 6: +# Coordinate: +# 5.0000e+00 5.0000e+00 5.0000e+00 +# Displacement: +# 0.0000e+00 1.4035e-03 -2.0000e-03 +# Resistance: +# -3.4627e-13 -1.6073e-13 -1.8623e+03 +peek node 6 + +peek element 1 + +reset +clear +exit \ No newline at end of file diff --git a/Example/Material/CustomCDP.supan b/Example/Material/CustomCDP.supan new file mode 100644 index 000000000..2eff680fe --- /dev/null +++ b/Example/Material/CustomCDP.supan @@ -0,0 +1,52 @@ +# A TEST MODEL FOR CDP MATERIAL + +node 1 5 -5 0 +node 2 5 5 0 +node 3 -5 5 0 +node 4 -5 -5 0 +node 5 5 -5 10 +node 6 5 5 10 +node 7 -5 5 10 +node 8 -5 -5 10 +node 9 5 -5 20 +node 10 5 5 20 +node 11 -5 5 20 +node 12 -5 -5 20 + +expression SimpleVector 1 x y|6 example + +material CustomCDP 1 1 1 5000 .2 2E-1 2E-1 .23 1.16 .4 2400E-12 + +element C3D8 1 1 2 3 4 5 6 7 8 1 G +element C3D8 2 5 6 7 8 9 10 11 12 1 G + +hdf5recorder 1 Node RF3 9 10 11 12 +hdf5recorder 2 Element KAPPAT 1 + +fix 1 1 1 2 5 6 9 10 +fix 2 2 1 4 5 8 9 12 +fix 3 3 1 2 3 4 + +displacement 1 0 .1 3 9 10 11 12 + +step static 1 +set fixed_step_size 1 +set ini_step_size 1E-2 +set symm_mat 0 + +converger RelIncreDisp 1 1E-9 10 1 + +analyze + +# Node 9: +# Coordinate: +# 5.0000e+00 -5.0000e+00 2.0000e+01 +# Displacement: +# 0.0000e+00 0.0000e+00 1.0000e-01 +# Resistance: +# -1.3864e+01 1.3864e+01 1.7909e+02 +peek node 9 + +save recorder 1 2 + +exit \ No newline at end of file diff --git a/Example/Material/CustomCDP2.supan b/Example/Material/CustomCDP2.supan new file mode 100644 index 000000000..234905e2b --- /dev/null +++ b/Example/Material/CustomCDP2.supan @@ -0,0 +1,15 @@ +# A TEST MODEL FOR CDP MATERIAL + +expression SimpleVector 1 x y|6 example +expression SimpleVector 2 x y|3 y:=0 + +material CustomCDP 1 5 5 +material CustomCDP 2 2 5 +material CustomCDP 3 1 5 +material CustomCDP 4 1 2 + +step static 1 + +precheck + +exit \ No newline at end of file diff --git a/Example/Material/CustomDP.supan b/Example/Material/CustomDP.supan new file mode 100644 index 000000000..72cd4cfa1 --- /dev/null +++ b/Example/Material/CustomDP.supan @@ -0,0 +1,51 @@ +# A TEST MODEL FOR CUSTOMDP MATERIAL + +node 1 5 -5 -5 +node 2 5 5 -5 +node 3 -5 5 -5 +node 4 -5 -5 -5 +node 5 5 -5 5 +node 6 5 5 5 +node 7 -5 5 5 +node 8 -5 -5 5 + +expression SimpleScalar 1 x .5+100x + +material CustomDP 1 1E4 .3 .355 .355 .974 1 + +element C3D8 1 1 2 3 4 5 6 7 8 1 +element C3D8 2 1 2 3 4 5 6 7 8 1 + +fix 1 1 1 2 5 6 +fix 2 2 1 4 5 8 +fix 3 3 1 2 3 4 + +displacement 1 0 -.2 3 5 6 7 8 + +hdf5recorder 1 Node RF 7 + +step static 1 +set fixed_step_size 1 +set ini_step_size 1E-1 +set symm_mat 0 + +converger RelIncreDisp 1 1E-14 50 1 + +analyze + +peek element 1 + +# Node 5: +# Coordinate: +# 5.0000e+00 -5.0000e+00 5.0000e+00 +# Displacement: +# 0.0000e+00 0.0000e+00 -2.0000e-01 +# Resistance: +# -1.0781e-11 1.0775e-11 -4.8162e+02 +peek node 5 + +# save recorder 1 + +reset +clear +exit \ No newline at end of file diff --git a/Example/Material/CustomElastic1D.supan b/Example/Material/CustomElastic1D.supan new file mode 100644 index 000000000..18765abef --- /dev/null +++ b/Example/Material/CustomElastic1D.supan @@ -0,0 +1,7 @@ +expression SimpleScalar 1 x x^3+x + +material CustomElastic1D 1 1 + +materialTest1D 1 1E-2 200 + +exit \ No newline at end of file diff --git a/Example/Material/CustomHoffman.supan b/Example/Material/CustomHoffman.supan new file mode 100644 index 000000000..50a232fae --- /dev/null +++ b/Example/Material/CustomHoffman.supan @@ -0,0 +1,48 @@ +# A TEST MODEL FOR CUSTOMHOFFMAN MATERAIL + +node 1 5 -5 -5 +node 2 5 5 -5 +node 3 -5 5 -5 +node 4 -5 -5 -5 +node 5 5 -5 5 +node 6 5 5 5 +node 7 -5 5 5 +node 8 -5 -5 5 + +expression SimpleScalar 1 x 1+.02x + +material CustomHoffman 1 1E5 1E5 1E5 1E5 1E5 1E5 .3 .3 .3 400 300 400 300 250 200 200 200 200 1 + +element C3D8 1 1 2 3 4 5 6 7 8 1 G + +fix2 1 P 1 2 3 4 + +displacement 2 0 .2 2 5 6 7 8 + +hdf5recorder 1 Node RF 7 + +step static 1 +set fixed_step_size 1 +set ini_step_size 1E-1 +set symm_mat 0 + +converger RelIncreDisp 1 1E-14 50 1 + +analyze + +peek element 1 + +# Node 5: +# Coordinate: +# 5.0000e+00 -5.0000e+00 5.0000e+00 +# Displacement: +# -2.5501e-02 2.0000e-01 6.0123e-02 +# Resistance: +# -6.5614e-13 5.4678e+03 4.3210e-13 +peek node 5 + +# save recorder 1 + +reset +clear +exit \ No newline at end of file diff --git a/Example/Material/CustomJ2.supan b/Example/Material/CustomJ2.supan new file mode 100644 index 000000000..6c193bc66 --- /dev/null +++ b/Example/Material/CustomJ2.supan @@ -0,0 +1,51 @@ +# A TEST MODEL FOR EXPJ2 MATERIAL + +node 1 5 -5 -5 +node 2 5 5 -5 +node 3 -5 5 -5 +node 4 -5 -5 -5 +node 5 5 -5 5 +node 6 5 5 5 +node 7 -5 5 5 +node 8 -5 -5 5 + +expression SimpleScalar 1 x 10+.5x +expression SimpleScalar 2 x 0 + +material CustomJ2 1 500 .0 1 2 + +element C3D8 1 1 2 3 4 5 6 7 8 1 G + +fix2 1 1 1 2 5 6 +fix2 2 2 1 4 5 8 +fix2 3 3 1 2 3 4 + +hdf5recorder 1 Node RF3 5 6 7 8 + +displacement 1 0 5E-1 3 5 6 7 8 + +step static 1 +set fixed_step_size 1 +set ini_step_size 1E-2 +set symm_mat 0 + +converger RelIncreDisp 1 1E-8 50 1 + +analyze + +# Node 5: +# Coordinate: +# 5.0000e+00 -5.0000e+00 5.0000e+00 +# Displacement: +# 0.0000e+00 0.0000e+00 5.0000e-01 +# Resistance: +# 5.6538e-11 -5.6577e-11 2.5037e+02 +peek node 5 6 7 8 + +peek element 1 + +# save recorder 1 + +reset +clear +exit \ No newline at end of file diff --git a/Example/Material/CustomMises1D.supan b/Example/Material/CustomMises1D.supan new file mode 100644 index 000000000..50915961c --- /dev/null +++ b/Example/Material/CustomMises1D.supan @@ -0,0 +1,36 @@ +expression SimpleScalar 1 x 10+.5x +expression SimpleScalar 2 x 0 + +expression SimpleVector 3 x y|2 y[0]:=0;y[1]:=2; + +material CustomMises1D 1 10 5 2 + +materialTest1D 1 1E-2 150 100 200 100 200 + +remove material 1 + +material CustomMises1D 1 10 3 2 + +materialTest1D 1 1E-2 150 100 200 100 200 + +remove material 1 + +material CustomMises1D 1 10 1 5 + +materialTest1D 1 1E-2 150 100 200 100 200 + +remove material 1 + +material CustomMises1D 1 10 1 3 + +materialTest1D 1 1E-2 150 100 200 100 200 + +remove material 1 + +material CustomMises1D 1 10 1 2 + +materialTest1D 1 1E-2 150 100 200 100 200 + +remove material 1 + +exit \ No newline at end of file diff --git a/Example/Material/EHIST b/Example/Material/EHIST new file mode 100644 index 000000000..a79e0295a --- /dev/null +++ b/Example/Material/EHIST @@ -0,0 +1,5 @@ +-1E-5 +-2E-5 +-3E-5 +-4E-5 +-5E-5 \ No newline at end of file diff --git a/Example/Material/ExpGurson.supan b/Example/Material/ExpGurson.supan index 2c7f170a9..9a7c28f29 100644 --- a/Example/Material/ExpGurson.supan +++ b/Example/Material/ExpGurson.supan @@ -37,13 +37,16 @@ converger RelIncreDisp 1 1E-12 10 1 analyze # Node 9: -# 5.0000 -5.0000 20.0000 +# Coordinate: +# 5.0000e+00 -5.0000e+00 2.0000e+01 # Displacement: -# 0 0 0.5000 +# 0.0000e+00 0.0000e+00 5.0000e-01 # Resistance: -# -8.0815e-15 1.1129e-14 1.6991e+01 +# 2.5868e-15 -3.1835e-15 1.6991e+01 peek node 9 +peek element 1 + reset clear exit \ No newline at end of file diff --git a/Example/Material/MaterialTest2D.supan b/Example/Material/MaterialTest2D.supan new file mode 100644 index 000000000..d70e0aef8 --- /dev/null +++ b/Example/Material/MaterialTest2D.supan @@ -0,0 +1,7 @@ +material CDP 2 3E4 .2 4. 40. 2E-3 4E-1 .2 4. .4 .8 .2 1.16 .2 2400E-12 +material PlaneStress 1 2 + +materialTest2D 1 -1E-4 -1E-4 0 10 +materialTestByLoad2D 1 -1E0 -1E0 0 10 + +exit \ No newline at end of file diff --git a/Example/Material/MaterialTest3D.supan b/Example/Material/MaterialTest3D.supan new file mode 100644 index 000000000..1bb7231c4 --- /dev/null +++ b/Example/Material/MaterialTest3D.supan @@ -0,0 +1,6 @@ +material CDP 1 3.17E4 .18 3.48 27.6 1E-2 1E-1 .4 3. .6 .8 .23 1.16 .4 2400E-12 + +materialTest3D 1 -1E-4 -1E-4 -1E-4 0 0 0 10 +materialTestByLoad3D 1 -1E0 -1E0 -1E0 0 0 0 10 + +exit \ No newline at end of file diff --git a/Example/Material/MaterialTestHistory.supan b/Example/Material/MaterialTestHistory.supan new file mode 100644 index 000000000..8336b415b --- /dev/null +++ b/Example/Material/MaterialTestHistory.supan @@ -0,0 +1,6 @@ +material ConcreteExp 1 3E4 3. .6 4E-3 30. 4. 1E-1 .2 + +materialtestbystrainhistory 1 EHIST +materialtestbystresshistory 1 EHIST + +exit \ No newline at end of file diff --git a/Example/Material/VAFCRP.supan b/Example/Material/VAFCRP.supan index 4c1abbb3d..d2f081255 100644 --- a/Example/Material/VAFCRP.supan +++ b/Example/Material/VAFCRP.supan @@ -36,35 +36,17 @@ converger RelIncreDisp 1 1E-12 10 1 analyze -# Node 9: -# 5.0000 -5.0000 20.0000 -# Displacement: -# 0 0 0.5000 -# Resistance: -# 1.0651e-13 -4.8376e-13 1.3199e+04 -# -# Node 10: -# 5.0000 5.0000 20.0000 -# Displacement: -# 0 -0.1171 0.5000 -# Resistance: -# 4.1362e-12 -1.1330e-13 1.3199e+04 -# -# Node 11: -# -5.0000 5.0000 20.0000 -# Displacement: -# 0.1171 -0.1171 0.5000 -# Resistance: -# -4.2658e-13 2.0193e-12 1.3199e+04 -# # Node 12: -# -5.0000 -5.0000 20.0000 +# Coordinate: +# -5.0000e+00 -5.0000e+00 2.0000e+01 # Displacement: -# 0.1171 0 0.5000 +# 1.1708e-01 0.0000e+00 5.0000e-01 # Resistance: -# 2.8548e-12 -1.4391e-12 1.3199e+04 +# -6.2919e-12 3.4706e-13 1.3199e+04 peek node 9 10 11 12 +peek element 1 + reset clear exit \ No newline at end of file diff --git a/Example/Material/example b/Example/Material/example new file mode 100644 index 000000000..f550e8521 --- /dev/null +++ b/Example/Material/example @@ -0,0 +1,6 @@ +y[0]:=x; +y[1]:=10*(1-x); +y[2]:=10; +y[3]:=1; +y[4]:=-10; +y[5]:=0; \ No newline at end of file diff --git a/Example/Misc/DKTS3/DKTS3.supan b/Example/Misc/DKTS3/DKTS3.supan index e494e1a23..539b65fe8 100644 --- a/Example/Misc/DKTS3/DKTS3.supan +++ b/Example/Misc/DKTS3/DKTS3.supan @@ -11,15 +11,39 @@ displacement 1 0 -5 3 2 3 6 175 176 177 178 179 180 181 182 183 682 683 684 685 # hdf5recorder 1 Visualisation U1 width 2 step static 1 -set ini_step_size 1E-1 +set ini_step_size 1E0 set fixed_step_size 1 set symm_mat 1 set sparse_mat 0 +set color_model MIS -converger AbsIncreEnergy 2 1E-8 20 1 +converger AbsIncreDisp 2 1E-8 20 1 # converger FixedNumber 2 1 1 1 analyze +# Node 2: +# Coordinate: +# 0 0 -20.0000 +# Displacement: +# -3.6816 -0.0042 -5.0000 0.0029 0.3897 0.0046 +# Resistance: +# 2.6943e-12 2.7367e-14 -9.6426e+00 -3.0444e-16 1.1203e-13 -5.2097e-14 +# +# Node 3: +# Coordinate: +# 0 -5.0000 -20.0000 +# Displacement: +# -3.6677 0.0002 -5.0000 -0.0852 0.2718 0.0247 +# Resistance: +# 3.7237e-13 1.3743e-14 -4.4882e+00 2.2942e-16 -3.8155e-14 -8.0816e-14 +# +# Node 6: +# Coordinate: +# 0 5.0000 -20.0000 +# Displacement: +# -3.6667 -0.0082 -5.0000 0.0541 0.2731 -0.0222 +# Resistance: +# -7.0122e-13 5.3552e-13 -4.4888e+00 -6.2483e-16 7.4103e-14 -1.9514e-13 peek node 2 3 6 # plot type U3 scale 1 save U.vtk diff --git a/Example/Other/Example.supan b/Example/Other/Example.supan index a6067fdcd..2cd29b47a 100644 --- a/Example/Other/Example.supan +++ b/Example/Other/Example.supan @@ -1,5 +1,19 @@ example +help + +terminal ls + +version + +doesnotexist + +disable print +enable print + +set verbose_output false +set screen_output true + set output_folder result/a/b set output_folder result set output_folder result/a @@ -13,8 +27,17 @@ set output_folder $pwd peek ,output_folder +set num_threads 2 +peek num_threads + pwd +pwd .. + benchmark +command + +qrcode + exit diff --git a/Example/Other/Expression.supan b/Example/Other/Expression.supan new file mode 100644 index 000000000..44d8cdb80 --- /dev/null +++ b/Example/Other/Expression.supan @@ -0,0 +1,14 @@ +# A TEST MODEL FOR EXPRESSION + +expression SimpleScalar 1 x|y x^2+y^2 +expression SimpleVector 2 x|2 y|2 y:=2x + +peek expression 1 2 + +disable expression 1 +enable expression 1 +remove expression 1 + +reset +clear +exit diff --git a/Example/Other/FixedLength.supan b/Example/Other/FixedLength.supan index 10d9a82dd..8da172ed6 100644 --- a/Example/Other/FixedLength.supan +++ b/Example/Other/FixedLength.supan @@ -42,6 +42,11 @@ peek node 2 3 peek element 1 +save stiffness +save mass +save damping +save model + reset clear exit \ No newline at end of file diff --git a/Example/Other/Optimization.supan b/Example/Other/Optimization.supan index 4413342cc..c04347243 100644 --- a/Example/Other/Optimization.supan +++ b/Example/Other/Optimization.supan @@ -859,4 +859,9 @@ criterion StrainEnergyEvolution 1 2 70 2 2 20 analyze +peek nodegroup 1 +peek recorder 1 +peek constraint 1 +peek material 1 + exit \ No newline at end of file diff --git a/Example/Solver/Amplitude.supan b/Example/Solver/Amplitude.supan index 486aeb2ab..72a413f72 100644 --- a/Example/Solver/Amplitude.supan +++ b/Example/Solver/Amplitude.supan @@ -51,6 +51,8 @@ peek node 5 # save recorder 1 2 +peek amplitude 1 2 3 4 5 + reset clear exit \ No newline at end of file diff --git a/Example/Solver/LeeFull.supan b/Example/Solver/LeeFull.supan index 1eced6b98..565b513f2 100644 --- a/Example/Solver/LeeFull.supan +++ b/Example/Solver/LeeFull.supan @@ -67,6 +67,14 @@ peek node 2 peek integrator 1 +list converger +list constraint +list element +list load +list material +list node +list recorder + reset clear exit \ No newline at end of file diff --git a/Include/exprtk/exprtk.hpp b/Include/exprtk/exprtk.hpp new file mode 100644 index 000000000..f489e168d --- /dev/null +++ b/Include/exprtk/exprtk.hpp @@ -0,0 +1,40786 @@ +/* + ****************************************************************** + * C++ Mathematical Expression Toolkit Library * + * * + * Author: Arash Partow (1999-2022) * + * URL: https://www.partow.net/programming/exprtk/index.html * + * * + * Copyright notice: * + * Free use of the C++ Mathematical Expression Toolkit Library is * + * permitted under the guidelines and in accordance with the most * + * current version of the MIT License. * + * https://www.opensource.org/licenses/MIT * + * * + * Example expressions: * + * (00) (y + x / y) * (x - y / x) * + * (01) (x^2 / sin(2 * pi / y)) - x / 2 * + * (02) sqrt(1 - (x^2)) * + * (03) 1 - sin(2 * x) + cos(pi / y) * + * (04) a * exp(2 * t) + c * + * (05) if(((x + 2) == 3) and ((y + 5) <= 9),1 + w, 2 / z) * + * (06) (avg(x,y) <= x + y ? x - y : x * y) + 2 * pi / x * + * (07) z := x + sin(2 * pi / y) * + * (08) u := 2 * (pi * z) / (w := x + cos(y / pi)) * + * (09) clamp(-1,sin(2 * pi * x) + cos(y / 2 * pi),+1) * + * (10) inrange(-2,m,+2) == if(({-2 <= m} and [m <= +2]),1,0) * + * (11) (2sin(x)cos(2y)7 + 1) == (2 * sin(x) * cos(2*y) * 7 + 1) * + * (12) (x ilike 's*ri?g') and [y < (3 z^7 + w)] * + * * + ****************************************************************** +*/ + + +#ifndef INCLUDE_EXPRTK_HPP +#define INCLUDE_EXPRTK_HPP + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +namespace exprtk +{ + #ifdef exprtk_enable_debugging + #define exprtk_debug(params) printf params + #else + #define exprtk_debug(params) (void)0 + #endif + + #define exprtk_error_location \ + "exprtk.hpp:" + details::to_str(__LINE__) \ + + #if defined(__GNUC__) && (__GNUC__ >= 7) + + #define exprtk_disable_fallthrough_begin \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wimplicit-fallthrough\"") \ + + #define exprtk_disable_fallthrough_end \ + _Pragma ("GCC diagnostic pop") \ + + #else + #define exprtk_disable_fallthrough_begin (void)0; + #define exprtk_disable_fallthrough_end (void)0; + #endif + + #if __cplusplus >= 201103L + #define exprtk_override override + #define exprtk_final final + #define exprtk_delete = delete + #else + #define exprtk_override + #define exprtk_final + #define exprtk_delete + #endif + + namespace details + { + typedef char char_t; + typedef char_t* char_ptr; + typedef char_t const* char_cptr; + typedef unsigned char uchar_t; + typedef uchar_t* uchar_ptr; + typedef uchar_t const* uchar_cptr; + typedef unsigned long long int _uint64_t; + typedef long long int _int64_t; + + inline bool is_whitespace(const char_t c) + { + return (' ' == c) || ('\n' == c) || + ('\r' == c) || ('\t' == c) || + ('\b' == c) || ('\v' == c) || + ('\f' == c) ; + } + + inline bool is_operator_char(const char_t c) + { + return ('+' == c) || ('-' == c) || + ('*' == c) || ('/' == c) || + ('^' == c) || ('<' == c) || + ('>' == c) || ('=' == c) || + (',' == c) || ('!' == c) || + ('(' == c) || (')' == c) || + ('[' == c) || (']' == c) || + ('{' == c) || ('}' == c) || + ('%' == c) || (':' == c) || + ('?' == c) || ('&' == c) || + ('|' == c) || (';' == c) ; + } + + inline bool is_letter(const char_t c) + { + return (('a' <= c) && (c <= 'z')) || + (('A' <= c) && (c <= 'Z')) ; + } + + inline bool is_digit(const char_t c) + { + return ('0' <= c) && (c <= '9'); + } + + inline bool is_letter_or_digit(const char_t c) + { + return is_letter(c) || is_digit(c); + } + + inline bool is_left_bracket(const char_t c) + { + return ('(' == c) || ('[' == c) || ('{' == c); + } + + inline bool is_right_bracket(const char_t c) + { + return (')' == c) || (']' == c) || ('}' == c); + } + + inline bool is_bracket(const char_t c) + { + return is_left_bracket(c) || is_right_bracket(c); + } + + inline bool is_sign(const char_t c) + { + return ('+' == c) || ('-' == c); + } + + inline bool is_invalid(const char_t c) + { + return !is_whitespace (c) && + !is_operator_char(c) && + !is_letter (c) && + !is_digit (c) && + ('.' != c) && + ('_' != c) && + ('$' != c) && + ('~' != c) && + ('\'' != c); + } + + inline bool is_valid_string_char(const char_t c) + { + return std::isprint(static_cast(c)) || + is_whitespace(c); + } + + #ifndef exprtk_disable_caseinsensitivity + inline void case_normalise(std::string& s) + { + for (std::size_t i = 0; i < s.size(); ++i) + { + s[i] = static_cast(std::tolower(s[i])); + } + } + + inline bool imatch(const char_t c1, const char_t c2) + { + return std::tolower(c1) == std::tolower(c2); + } + + inline bool imatch(const std::string& s1, const std::string& s2) + { + if (s1.size() == s2.size()) + { + for (std::size_t i = 0; i < s1.size(); ++i) + { + if (std::tolower(s1[i]) != std::tolower(s2[i])) + { + return false; + } + } + + return true; + } + + return false; + } + + struct ilesscompare + { + inline bool operator() (const std::string& s1, const std::string& s2) const + { + const std::size_t length = std::min(s1.size(),s2.size()); + + for (std::size_t i = 0; i < length; ++i) + { + const char_t c1 = static_cast(std::tolower(s1[i])); + const char_t c2 = static_cast(std::tolower(s2[i])); + + if (c1 > c2) + return false; + else if (c1 < c2) + return true; + } + + return s1.size() < s2.size(); + } + }; + + #else + inline void case_normalise(std::string&) + {} + + inline bool imatch(const char_t c1, const char_t c2) + { + return c1 == c2; + } + + inline bool imatch(const std::string& s1, const std::string& s2) + { + return s1 == s2; + } + + struct ilesscompare + { + inline bool operator() (const std::string& s1, const std::string& s2) const + { + return s1 < s2; + } + }; + #endif + + inline bool is_valid_sf_symbol(const std::string& symbol) + { + // Special function: $f12 or $F34 + return (4 == symbol.size()) && + ('$' == symbol[0]) && + imatch('f',symbol[1]) && + is_digit(symbol[2]) && + is_digit(symbol[3]); + } + + inline const char_t& front(const std::string& s) + { + return s[0]; + } + + inline const char_t& back(const std::string& s) + { + return s[s.size() - 1]; + } + + inline std::string to_str(int i) + { + if (0 == i) + return std::string("0"); + + std::string result; + + const int sign = (i < 0) ? -1 : 1; + + for ( ; i; i /= 10) + { + result += '0' + static_cast(sign * (i % 10)); + } + + if (sign < 0) + { + result += '-'; + } + + std::reverse(result.begin(), result.end()); + + + return result; + } + + inline std::string to_str(std::size_t i) + { + return to_str(static_cast(i)); + } + + inline bool is_hex_digit(const uchar_t digit) + { + return (('0' <= digit) && (digit <= '9')) || + (('A' <= digit) && (digit <= 'F')) || + (('a' <= digit) && (digit <= 'f')) ; + } + + inline uchar_t hex_to_bin(uchar_t h) + { + if (('0' <= h) && (h <= '9')) + return (h - '0'); + else + return static_cast(std::toupper(h) - 'A'); + } + + template + inline bool parse_hex(Iterator& itr, Iterator end, + char_t& result) + { + if ( + (end == (itr )) || + (end == (itr + 1)) || + (end == (itr + 2)) || + (end == (itr + 3)) || + ('0' != *(itr )) || + ('X' != std::toupper(*(itr + 1))) || + (!is_hex_digit(*(itr + 2))) || + (!is_hex_digit(*(itr + 3))) + ) + { + return false; + } + + result = hex_to_bin(static_cast(*(itr + 2))) << 4 | + hex_to_bin(static_cast(*(itr + 3))) ; + + return true; + } + + inline bool cleanup_escapes(std::string& s) + { + typedef std::string::iterator str_itr_t; + + str_itr_t itr1 = s.begin(); + str_itr_t itr2 = s.begin(); + str_itr_t end = s.end (); + + std::size_t removal_count = 0; + + while (end != itr1) + { + if ('\\' == (*itr1)) + { + if (end == ++itr1) + { + return false; + } + else if (parse_hex(itr1, end, *itr2)) + { + itr1+= 4; + itr2+= 1; + removal_count +=4; + } + else if ('a' == (*itr1)) { (*itr2++) = '\a'; ++itr1; ++removal_count; } + else if ('b' == (*itr1)) { (*itr2++) = '\b'; ++itr1; ++removal_count; } + else if ('f' == (*itr1)) { (*itr2++) = '\f'; ++itr1; ++removal_count; } + else if ('n' == (*itr1)) { (*itr2++) = '\n'; ++itr1; ++removal_count; } + else if ('r' == (*itr1)) { (*itr2++) = '\r'; ++itr1; ++removal_count; } + else if ('t' == (*itr1)) { (*itr2++) = '\t'; ++itr1; ++removal_count; } + else if ('v' == (*itr1)) { (*itr2++) = '\v'; ++itr1; ++removal_count; } + else if ('0' == (*itr1)) { (*itr2++) = '\0'; ++itr1; ++removal_count; } + else + { + (*itr2++) = (*itr1++); + ++removal_count; + } + continue; + } + else + (*itr2++) = (*itr1++); + } + + if ((removal_count > s.size()) || (0 == removal_count)) + return false; + + s.resize(s.size() - removal_count); + + return true; + } + + class build_string + { + public: + + explicit build_string(const std::size_t& initial_size = 64) + { + data_.reserve(initial_size); + } + + inline build_string& operator << (const std::string& s) + { + data_ += s; + return (*this); + } + + inline build_string& operator << (char_cptr s) + { + data_ += std::string(s); + return (*this); + } + + inline operator std::string () const + { + return data_; + } + + inline std::string as_string() const + { + return data_; + } + + private: + + std::string data_; + }; + + static const std::string reserved_words[] = + { + "break", "case", "continue", "default", "false", "for", + "if", "else", "ilike", "in", "like", "and", "nand", "nor", + "not", "null", "or", "repeat", "return", "shl", "shr", + "swap", "switch", "true", "until", "var", "while", "xnor", + "xor", "&", "|" + }; + + static const std::size_t reserved_words_size = sizeof(reserved_words) / sizeof(std::string); + + static const std::string reserved_symbols[] = + { + "abs", "acos", "acosh", "and", "asin", "asinh", "atan", + "atanh", "atan2", "avg", "break", "case", "ceil", "clamp", + "continue", "cos", "cosh", "cot", "csc", "default", + "deg2grad", "deg2rad", "equal", "erf", "erfc", "exp", + "expm1", "false", "floor", "for", "frac", "grad2deg", + "hypot", "iclamp", "if", "else", "ilike", "in", "inrange", + "like", "log", "log10", "log2", "logn", "log1p", "mand", + "max", "min", "mod", "mor", "mul", "ncdf", "nand", "nor", + "not", "not_equal", "null", "or", "pow", "rad2deg", + "repeat", "return", "root", "round", "roundn", "sec", "sgn", + "shl", "shr", "sin", "sinc", "sinh", "sqrt", "sum", "swap", + "switch", "tan", "tanh", "true", "trunc", "until", "var", + "while", "xnor", "xor", "&", "|" + }; + + static const std::size_t reserved_symbols_size = sizeof(reserved_symbols) / sizeof(std::string); + + static const std::string base_function_list[] = + { + "abs", "acos", "acosh", "asin", "asinh", "atan", "atanh", + "atan2", "avg", "ceil", "clamp", "cos", "cosh", "cot", + "csc", "equal", "erf", "erfc", "exp", "expm1", "floor", + "frac", "hypot", "iclamp", "like", "log", "log10", "log2", + "logn", "log1p", "mand", "max", "min", "mod", "mor", "mul", + "ncdf", "pow", "root", "round", "roundn", "sec", "sgn", + "sin", "sinc", "sinh", "sqrt", "sum", "swap", "tan", "tanh", + "trunc", "not_equal", "inrange", "deg2grad", "deg2rad", + "rad2deg", "grad2deg" + }; + + static const std::size_t base_function_list_size = sizeof(base_function_list) / sizeof(std::string); + + static const std::string logic_ops_list[] = + { + "and", "nand", "nor", "not", "or", "xnor", "xor", "&", "|" + }; + + static const std::size_t logic_ops_list_size = sizeof(logic_ops_list) / sizeof(std::string); + + static const std::string cntrl_struct_list[] = + { + "if", "switch", "for", "while", "repeat", "return" + }; + + static const std::size_t cntrl_struct_list_size = sizeof(cntrl_struct_list) / sizeof(std::string); + + static const std::string arithmetic_ops_list[] = + { + "+", "-", "*", "/", "%", "^" + }; + + static const std::size_t arithmetic_ops_list_size = sizeof(arithmetic_ops_list) / sizeof(std::string); + + static const std::string assignment_ops_list[] = + { + ":=", "+=", "-=", + "*=", "/=", "%=" + }; + + static const std::size_t assignment_ops_list_size = sizeof(assignment_ops_list) / sizeof(std::string); + + static const std::string inequality_ops_list[] = + { + "<", "<=", "==", + "=", "!=", "<>", + ">=", ">" + }; + + static const std::size_t inequality_ops_list_size = sizeof(inequality_ops_list) / sizeof(std::string); + + inline bool is_reserved_word(const std::string& symbol) + { + for (std::size_t i = 0; i < reserved_words_size; ++i) + { + if (imatch(symbol, reserved_words[i])) + { + return true; + } + } + + return false; + } + + inline bool is_reserved_symbol(const std::string& symbol) + { + for (std::size_t i = 0; i < reserved_symbols_size; ++i) + { + if (imatch(symbol, reserved_symbols[i])) + { + return true; + } + } + + return false; + } + + inline bool is_base_function(const std::string& function_name) + { + for (std::size_t i = 0; i < base_function_list_size; ++i) + { + if (imatch(function_name, base_function_list[i])) + { + return true; + } + } + + return false; + } + + inline bool is_control_struct(const std::string& cntrl_strct) + { + for (std::size_t i = 0; i < cntrl_struct_list_size; ++i) + { + if (imatch(cntrl_strct, cntrl_struct_list[i])) + { + return true; + } + } + + return false; + } + + inline bool is_logic_opr(const std::string& lgc_opr) + { + for (std::size_t i = 0; i < logic_ops_list_size; ++i) + { + if (imatch(lgc_opr, logic_ops_list[i])) + { + return true; + } + } + + return false; + } + + struct cs_match + { + static inline bool cmp(const char_t c0, const char_t c1) + { + return (c0 == c1); + } + }; + + struct cis_match + { + static inline bool cmp(const char_t c0, const char_t c1) + { + return (std::tolower(c0) == std::tolower(c1)); + } + }; + + template + inline bool match_impl(const Iterator pattern_begin, + const Iterator pattern_end , + const Iterator data_begin , + const Iterator data_end , + const typename std::iterator_traits::value_type& zero_or_more, + const typename std::iterator_traits::value_type& exactly_one ) + { + typedef typename std::iterator_traits::value_type type; + + const Iterator null_itr(0); + + Iterator p_itr = pattern_begin; + Iterator d_itr = data_begin; + Iterator np_itr = null_itr; + Iterator nd_itr = null_itr; + + for ( ; ; ) + { + if (p_itr != pattern_end) + { + const type c = *(p_itr); + + if ((data_end != d_itr) && (Compare::cmp(c,*(d_itr)) || (exactly_one == c))) + { + ++d_itr; + ++p_itr; + continue; + } + else if (zero_or_more == c) + { + while ((pattern_end != p_itr) && (zero_or_more == *(p_itr))) + { + ++p_itr; + } + + const type d = *(p_itr); + + while ((data_end != d_itr) && !(Compare::cmp(d,*(d_itr)) || (exactly_one == d))) + { + ++d_itr; + } + + // set backtrack iterators + np_itr = p_itr - 1; + nd_itr = d_itr + 1; + + continue; + } + } + else if (data_end == d_itr) + return true; + + if ((data_end == d_itr) || (null_itr == nd_itr)) + return false; + + p_itr = np_itr; + d_itr = nd_itr; + } + + // return true; + } + + inline bool wc_match(const std::string& wild_card, + const std::string& str) + { + return match_impl( + wild_card.data(), + wild_card.data() + wild_card.size(), + str.data(), + str.data() + str.size(), + '*', '?'); + } + + inline bool wc_imatch(const std::string& wild_card, + const std::string& str) + { + return match_impl( + wild_card.data(), + wild_card.data() + wild_card.size(), + str.data(), + str.data() + str.size(), + '*', '?'); + } + + inline bool sequence_match(const std::string& pattern, + const std::string& str, + std::size_t& diff_index, + char_t& diff_value) + { + if (str.empty()) + { + return ("Z" == pattern); + } + else if ('*' == pattern[0]) + return false; + + typedef std::string::const_iterator itr_t; + + itr_t p_itr = pattern.begin(); + itr_t s_itr = str .begin(); + + const itr_t p_end = pattern.end(); + const itr_t s_end = str .end(); + + while ((s_end != s_itr) && (p_end != p_itr)) + { + if ('*' == (*p_itr)) + { + const char_t target = static_cast(std::toupper(*(p_itr - 1))); + + if ('*' == target) + { + diff_index = static_cast(std::distance(str.begin(),s_itr)); + diff_value = static_cast(std::toupper(*p_itr)); + + return false; + } + else + ++p_itr; + + while (s_itr != s_end) + { + if (target != std::toupper(*s_itr)) + break; + else + ++s_itr; + } + + continue; + } + else if ( + ('?' != *p_itr) && + std::toupper(*p_itr) != std::toupper(*s_itr) + ) + { + diff_index = static_cast(std::distance(str.begin(),s_itr)); + diff_value = static_cast(std::toupper(*p_itr)); + + return false; + } + + ++p_itr; + ++s_itr; + } + + return ( + (s_end == s_itr) && + ( + (p_end == p_itr) || + ('*' == *p_itr) + ) + ); + } + + static const double pow10[] = { + 1.0, + 1.0E+001, 1.0E+002, 1.0E+003, 1.0E+004, + 1.0E+005, 1.0E+006, 1.0E+007, 1.0E+008, + 1.0E+009, 1.0E+010, 1.0E+011, 1.0E+012, + 1.0E+013, 1.0E+014, 1.0E+015, 1.0E+016 + }; + + static const std::size_t pow10_size = sizeof(pow10) / sizeof(double); + + namespace numeric + { + namespace constant + { + static const double e = 2.71828182845904523536028747135266249775724709369996; + static const double pi = 3.14159265358979323846264338327950288419716939937510; + static const double pi_2 = 1.57079632679489661923132169163975144209858469968755; + static const double pi_4 = 0.78539816339744830961566084581987572104929234984378; + static const double pi_180 = 0.01745329251994329576923690768488612713442871888542; + static const double _1_pi = 0.31830988618379067153776752674502872406891929148091; + static const double _2_pi = 0.63661977236758134307553505349005744813783858296183; + static const double _180_pi = 57.29577951308232087679815481410517033240547246656443; + static const double log2 = 0.69314718055994530941723212145817656807550013436026; + static const double sqrt2 = 1.41421356237309504880168872420969807856967187537695; + } + + namespace details + { + struct unknown_type_tag { unknown_type_tag() {} }; + struct real_type_tag { real_type_tag () {} }; + struct complex_type_tag { complex_type_tag() {} }; + struct int_type_tag { int_type_tag () {} }; + + template + struct number_type + { + typedef unknown_type_tag type; + number_type() {} + }; + + #define exprtk_register_real_type_tag(T) \ + template <> struct number_type \ + { typedef real_type_tag type; number_type() {} }; \ + + #define exprtk_register_complex_type_tag(T) \ + template <> struct number_type > \ + { typedef complex_type_tag type; number_type() {} }; \ + + #define exprtk_register_int_type_tag(T) \ + template <> struct number_type \ + { typedef int_type_tag type; number_type() {} }; \ + + exprtk_register_real_type_tag(double ) + exprtk_register_real_type_tag(long double) + exprtk_register_real_type_tag(float ) + + exprtk_register_complex_type_tag(double ) + exprtk_register_complex_type_tag(long double) + exprtk_register_complex_type_tag(float ) + + exprtk_register_int_type_tag(short ) + exprtk_register_int_type_tag(int ) + exprtk_register_int_type_tag(_int64_t ) + exprtk_register_int_type_tag(unsigned short) + exprtk_register_int_type_tag(unsigned int ) + exprtk_register_int_type_tag(_uint64_t ) + + #undef exprtk_register_real_type_tag + #undef exprtk_register_int_type_tag + + template + struct epsilon_type {}; + + #define exprtk_define_epsilon_type(Type, Epsilon) \ + template <> struct epsilon_type \ + { \ + static inline Type value() \ + { \ + const Type epsilon = static_cast(Epsilon); \ + return epsilon; \ + } \ + }; \ + + exprtk_define_epsilon_type(float , 0.00000100000f) + exprtk_define_epsilon_type(double , 0.000000000100) + exprtk_define_epsilon_type(long double, 0.000000000001) + + #undef exprtk_define_epsilon_type + + template + inline bool is_nan_impl(const T v, real_type_tag) + { + return std::not_equal_to()(v,v); + } + + template + inline int to_int32_impl(const T v, real_type_tag) + { + return static_cast(v); + } + + template + inline _int64_t to_int64_impl(const T v, real_type_tag) + { + return static_cast<_int64_t>(v); + } + + template + inline bool is_true_impl(const T v) + { + return std::not_equal_to()(T(0),v); + } + + template + inline bool is_false_impl(const T v) + { + return std::equal_to()(T(0),v); + } + + template + inline T abs_impl(const T v, real_type_tag) + { + return ((v < T(0)) ? -v : v); + } + + template + inline T min_impl(const T v0, const T v1, real_type_tag) + { + return std::min(v0,v1); + } + + template + inline T max_impl(const T v0, const T v1, real_type_tag) + { + return std::max(v0,v1); + } + + template + inline T equal_impl(const T v0, const T v1, real_type_tag) + { + const T epsilon = epsilon_type::value(); + return (abs_impl(v0 - v1,real_type_tag()) <= (std::max(T(1),std::max(abs_impl(v0,real_type_tag()),abs_impl(v1,real_type_tag()))) * epsilon)) ? T(1) : T(0); + } + + inline float equal_impl(const float v0, const float v1, real_type_tag) + { + const float epsilon = epsilon_type::value(); + return (abs_impl(v0 - v1,real_type_tag()) <= (std::max(1.0f,std::max(abs_impl(v0,real_type_tag()),abs_impl(v1,real_type_tag()))) * epsilon)) ? 1.0f : 0.0f; + } + + template + inline T equal_impl(const T v0, const T v1, int_type_tag) + { + return (v0 == v1) ? 1 : 0; + } + + template + inline T expm1_impl(const T v, real_type_tag) + { + // return std::expm1(v); + if (abs_impl(v,real_type_tag()) < T(0.00001)) + return v + (T(0.5) * v * v); + else + return std::exp(v) - T(1); + } + + template + inline T expm1_impl(const T v, int_type_tag) + { + return T(std::exp(v)) - T(1); + } + + template + inline T nequal_impl(const T v0, const T v1, real_type_tag) + { + typedef real_type_tag rtg; + const T epsilon = epsilon_type::value(); + return (abs_impl(v0 - v1,rtg()) > (std::max(T(1),std::max(abs_impl(v0,rtg()),abs_impl(v1,rtg()))) * epsilon)) ? T(1) : T(0); + } + + inline float nequal_impl(const float v0, const float v1, real_type_tag) + { + typedef real_type_tag rtg; + const float epsilon = epsilon_type::value(); + return (abs_impl(v0 - v1,rtg()) > (std::max(1.0f,std::max(abs_impl(v0,rtg()),abs_impl(v1,rtg()))) * epsilon)) ? 1.0f : 0.0f; + } + + template + inline T nequal_impl(const T v0, const T v1, int_type_tag) + { + return (v0 != v1) ? 1 : 0; + } + + template + inline T modulus_impl(const T v0, const T v1, real_type_tag) + { + return std::fmod(v0,v1); + } + + template + inline T modulus_impl(const T v0, const T v1, int_type_tag) + { + return v0 % v1; + } + + template + inline T pow_impl(const T v0, const T v1, real_type_tag) + { + return std::pow(v0,v1); + } + + template + inline T pow_impl(const T v0, const T v1, int_type_tag) + { + return std::pow(static_cast(v0),static_cast(v1)); + } + + template + inline T logn_impl(const T v0, const T v1, real_type_tag) + { + return std::log(v0) / std::log(v1); + } + + template + inline T logn_impl(const T v0, const T v1, int_type_tag) + { + return static_cast(logn_impl(static_cast(v0),static_cast(v1),real_type_tag())); + } + + template + inline T log1p_impl(const T v, real_type_tag) + { + if (v > T(-1)) + { + if (abs_impl(v,real_type_tag()) > T(0.0001)) + { + return std::log(T(1) + v); + } + else + return (T(-0.5) * v + T(1)) * v; + } + else + return std::numeric_limits::quiet_NaN(); + } + + template + inline T log1p_impl(const T v, int_type_tag) + { + if (v > T(-1)) + { + return std::log(T(1) + v); + } + else + return std::numeric_limits::quiet_NaN(); + } + + template + inline T root_impl(const T v0, const T v1, real_type_tag) + { + if (v1 < T(0)) + return std::numeric_limits::quiet_NaN(); + + const std::size_t n = static_cast(v1); + + if ((v0 < T(0)) && (0 == (n % 2))) + return std::numeric_limits::quiet_NaN(); + + return std::pow(v0, T(1) / n); + } + + template + inline T root_impl(const T v0, const T v1, int_type_tag) + { + return root_impl(static_cast(v0),static_cast(v1),real_type_tag()); + } + + template + inline T round_impl(const T v, real_type_tag) + { + return ((v < T(0)) ? std::ceil(v - T(0.5)) : std::floor(v + T(0.5))); + } + + template + inline T roundn_impl(const T v0, const T v1, real_type_tag) + { + const int index = std::max(0, std::min(pow10_size - 1, static_cast(std::floor(v1)))); + const T p10 = T(pow10[index]); + + if (v0 < T(0)) + return T(std::ceil ((v0 * p10) - T(0.5)) / p10); + else + return T(std::floor((v0 * p10) + T(0.5)) / p10); + } + + template + inline T roundn_impl(const T v0, const T, int_type_tag) + { + return v0; + } + + template + inline T hypot_impl(const T v0, const T v1, real_type_tag) + { + return std::sqrt((v0 * v0) + (v1 * v1)); + } + + template + inline T hypot_impl(const T v0, const T v1, int_type_tag) + { + return static_cast(std::sqrt(static_cast((v0 * v0) + (v1 * v1)))); + } + + template + inline T atan2_impl(const T v0, const T v1, real_type_tag) + { + return std::atan2(v0,v1); + } + + template + inline T atan2_impl(const T, const T, int_type_tag) + { + return 0; + } + + template + inline T shr_impl(const T v0, const T v1, real_type_tag) + { + return v0 * (T(1) / std::pow(T(2),static_cast(static_cast(v1)))); + } + + template + inline T shr_impl(const T v0, const T v1, int_type_tag) + { + return v0 >> v1; + } + + template + inline T shl_impl(const T v0, const T v1, real_type_tag) + { + return v0 * std::pow(T(2),static_cast(static_cast(v1))); + } + + template + inline T shl_impl(const T v0, const T v1, int_type_tag) + { + return v0 << v1; + } + + template + inline T sgn_impl(const T v, real_type_tag) + { + if (v > T(0)) return T(+1); + else if (v < T(0)) return T(-1); + else return T( 0); + } + + template + inline T sgn_impl(const T v, int_type_tag) + { + if (v > T(0)) return T(+1); + else if (v < T(0)) return T(-1); + else return T( 0); + } + + template + inline T and_impl(const T v0, const T v1, real_type_tag) + { + return (is_true_impl(v0) && is_true_impl(v1)) ? T(1) : T(0); + } + + template + inline T and_impl(const T v0, const T v1, int_type_tag) + { + return v0 && v1; + } + + template + inline T nand_impl(const T v0, const T v1, real_type_tag) + { + return (is_false_impl(v0) || is_false_impl(v1)) ? T(1) : T(0); + } + + template + inline T nand_impl(const T v0, const T v1, int_type_tag) + { + return !(v0 && v1); + } + + template + inline T or_impl(const T v0, const T v1, real_type_tag) + { + return (is_true_impl(v0) || is_true_impl(v1)) ? T(1) : T(0); + } + + template + inline T or_impl(const T v0, const T v1, int_type_tag) + { + return (v0 || v1); + } + + template + inline T nor_impl(const T v0, const T v1, real_type_tag) + { + return (is_false_impl(v0) && is_false_impl(v1)) ? T(1) : T(0); + } + + template + inline T nor_impl(const T v0, const T v1, int_type_tag) + { + return !(v0 || v1); + } + + template + inline T xor_impl(const T v0, const T v1, real_type_tag) + { + return (is_false_impl(v0) != is_false_impl(v1)) ? T(1) : T(0); + } + + template + inline T xor_impl(const T v0, const T v1, int_type_tag) + { + return v0 ^ v1; + } + + template + inline T xnor_impl(const T v0, const T v1, real_type_tag) + { + const bool v0_true = is_true_impl(v0); + const bool v1_true = is_true_impl(v1); + + if ((v0_true && v1_true) || (!v0_true && !v1_true)) + return T(1); + else + return T(0); + } + + template + inline T xnor_impl(const T v0, const T v1, int_type_tag) + { + const bool v0_true = is_true_impl(v0); + const bool v1_true = is_true_impl(v1); + + if ((v0_true && v1_true) || (!v0_true && !v1_true)) + return T(1); + else + return T(0); + } + + #if (defined(_MSC_VER) && (_MSC_VER >= 1900)) || !defined(_MSC_VER) + #define exprtk_define_erf(TT, impl) \ + inline TT erf_impl(const TT v) { return impl(v); } \ + + exprtk_define_erf( float,::erff) + exprtk_define_erf( double,::erf ) + exprtk_define_erf(long double,::erfl) + #undef exprtk_define_erf + #endif + + template + inline T erf_impl(const T v, real_type_tag) + { + #if defined(_MSC_VER) && (_MSC_VER < 1900) + // Credits: Abramowitz & Stegun Equations 7.1.25-28 + static const T c[] = { + T( 1.26551223), T(1.00002368), + T( 0.37409196), T(0.09678418), + T(-0.18628806), T(0.27886807), + T(-1.13520398), T(1.48851587), + T(-0.82215223), T(0.17087277) + }; + + const T t = T(1) / (T(1) + T(0.5) * abs_impl(v,real_type_tag())); + + const T result = T(1) - t * std::exp((-v * v) - + c[0] + t * (c[1] + t * + (c[2] + t * (c[3] + t * + (c[4] + t * (c[5] + t * + (c[6] + t * (c[7] + t * + (c[8] + t * (c[9])))))))))); + + return (v >= T(0)) ? result : -result; + #else + return erf_impl(v); + #endif + } + + template + inline T erf_impl(const T v, int_type_tag) + { + return erf_impl(static_cast(v),real_type_tag()); + } + + #if (defined(_MSC_VER) && (_MSC_VER >= 1900)) || !defined(_MSC_VER) + #define exprtk_define_erfc(TT, impl) \ + inline TT erfc_impl(const TT v) { return impl(v); } \ + + exprtk_define_erfc(float ,::erfcf) + exprtk_define_erfc(double ,::erfc ) + exprtk_define_erfc(long double,::erfcl) + #undef exprtk_define_erfc + #endif + + template + inline T erfc_impl(const T v, real_type_tag) + { + #if defined(_MSC_VER) && (_MSC_VER < 1900) + return T(1) - erf_impl(v,real_type_tag()); + #else + return erfc_impl(v); + #endif + } + + template + inline T erfc_impl(const T v, int_type_tag) + { + return erfc_impl(static_cast(v),real_type_tag()); + } + + template + inline T ncdf_impl(const T v, real_type_tag) + { + const T cnd = T(0.5) * (T(1) + + erf_impl(abs_impl(v,real_type_tag()) / + T(numeric::constant::sqrt2),real_type_tag())); + return (v < T(0)) ? (T(1) - cnd) : cnd; + } + + template + inline T ncdf_impl(const T v, int_type_tag) + { + return ncdf_impl(static_cast(v),real_type_tag()); + } + + template + inline T sinc_impl(const T v, real_type_tag) + { + if (std::abs(v) >= std::numeric_limits::epsilon()) + return(std::sin(v) / v); + else + return T(1); + } + + template + inline T sinc_impl(const T v, int_type_tag) + { + return sinc_impl(static_cast(v),real_type_tag()); + } + + template inline T acos_impl(const T v, real_type_tag) { return std::acos (v); } + template inline T acosh_impl(const T v, real_type_tag) { return std::log(v + std::sqrt((v * v) - T(1))); } + template inline T asin_impl(const T v, real_type_tag) { return std::asin (v); } + template inline T asinh_impl(const T v, real_type_tag) { return std::log(v + std::sqrt((v * v) + T(1))); } + template inline T atan_impl(const T v, real_type_tag) { return std::atan (v); } + template inline T atanh_impl(const T v, real_type_tag) { return (std::log(T(1) + v) - std::log(T(1) - v)) / T(2); } + template inline T ceil_impl(const T v, real_type_tag) { return std::ceil (v); } + template inline T cos_impl(const T v, real_type_tag) { return std::cos (v); } + template inline T cosh_impl(const T v, real_type_tag) { return std::cosh (v); } + template inline T exp_impl(const T v, real_type_tag) { return std::exp (v); } + template inline T floor_impl(const T v, real_type_tag) { return std::floor(v); } + template inline T log_impl(const T v, real_type_tag) { return std::log (v); } + template inline T log10_impl(const T v, real_type_tag) { return std::log10(v); } + template inline T log2_impl(const T v, real_type_tag) { return std::log(v)/T(numeric::constant::log2); } + template inline T neg_impl(const T v, real_type_tag) { return -v; } + template inline T pos_impl(const T v, real_type_tag) { return +v; } + template inline T sin_impl(const T v, real_type_tag) { return std::sin (v); } + template inline T sinh_impl(const T v, real_type_tag) { return std::sinh (v); } + template inline T sqrt_impl(const T v, real_type_tag) { return std::sqrt (v); } + template inline T tan_impl(const T v, real_type_tag) { return std::tan (v); } + template inline T tanh_impl(const T v, real_type_tag) { return std::tanh (v); } + template inline T cot_impl(const T v, real_type_tag) { return T(1) / std::tan(v); } + template inline T sec_impl(const T v, real_type_tag) { return T(1) / std::cos(v); } + template inline T csc_impl(const T v, real_type_tag) { return T(1) / std::sin(v); } + template inline T r2d_impl(const T v, real_type_tag) { return (v * T(numeric::constant::_180_pi)); } + template inline T d2r_impl(const T v, real_type_tag) { return (v * T(numeric::constant::pi_180)); } + template inline T d2g_impl(const T v, real_type_tag) { return (v * T(10.0/9.0)); } + template inline T g2d_impl(const T v, real_type_tag) { return (v * T(9.0/10.0)); } + template inline T notl_impl(const T v, real_type_tag) { return (std::not_equal_to()(T(0),v) ? T(0) : T(1)); } + template inline T frac_impl(const T v, real_type_tag) { return (v - static_cast(v)); } + template inline T trunc_impl(const T v, real_type_tag) { return T(static_cast(v)); } + + template inline T const_pi_impl(real_type_tag) { return T(numeric::constant::pi); } + template inline T const_e_impl(real_type_tag) { return T(numeric::constant::e); } + template inline T const_qnan_impl(real_type_tag) { return std::numeric_limits::quiet_NaN(); } + + template inline T abs_impl(const T v, int_type_tag) { return ((v >= T(0)) ? v : -v); } + template inline T exp_impl(const T v, int_type_tag) { return std::exp (v); } + template inline T log_impl(const T v, int_type_tag) { return std::log (v); } + template inline T log10_impl(const T v, int_type_tag) { return std::log10(v); } + template inline T log2_impl(const T v, int_type_tag) { return std::log(v)/T(numeric::constant::log2); } + template inline T neg_impl(const T v, int_type_tag) { return -v; } + template inline T pos_impl(const T v, int_type_tag) { return +v; } + template inline T ceil_impl(const T v, int_type_tag) { return v; } + template inline T floor_impl(const T v, int_type_tag) { return v; } + template inline T round_impl(const T v, int_type_tag) { return v; } + template inline T notl_impl(const T v, int_type_tag) { return !v; } + template inline T sqrt_impl(const T v, int_type_tag) { return std::sqrt (v); } + template inline T frac_impl(const T , int_type_tag) { return T(0); } + template inline T trunc_impl(const T v, int_type_tag) { return v; } + template inline T acos_impl(const T , int_type_tag) { return std::numeric_limits::quiet_NaN(); } + template inline T acosh_impl(const T , int_type_tag) { return std::numeric_limits::quiet_NaN(); } + template inline T asin_impl(const T , int_type_tag) { return std::numeric_limits::quiet_NaN(); } + template inline T asinh_impl(const T , int_type_tag) { return std::numeric_limits::quiet_NaN(); } + template inline T atan_impl(const T , int_type_tag) { return std::numeric_limits::quiet_NaN(); } + template inline T atanh_impl(const T , int_type_tag) { return std::numeric_limits::quiet_NaN(); } + template inline T cos_impl(const T , int_type_tag) { return std::numeric_limits::quiet_NaN(); } + template inline T cosh_impl(const T , int_type_tag) { return std::numeric_limits::quiet_NaN(); } + template inline T sin_impl(const T , int_type_tag) { return std::numeric_limits::quiet_NaN(); } + template inline T sinh_impl(const T , int_type_tag) { return std::numeric_limits::quiet_NaN(); } + template inline T tan_impl(const T , int_type_tag) { return std::numeric_limits::quiet_NaN(); } + template inline T tanh_impl(const T , int_type_tag) { return std::numeric_limits::quiet_NaN(); } + template inline T cot_impl(const T , int_type_tag) { return std::numeric_limits::quiet_NaN(); } + template inline T sec_impl(const T , int_type_tag) { return std::numeric_limits::quiet_NaN(); } + template inline T csc_impl(const T , int_type_tag) { return std::numeric_limits::quiet_NaN(); } + + template + inline bool is_integer_impl(const T& v, real_type_tag) + { + return std::equal_to()(T(0),std::fmod(v,T(1))); + } + + template + inline bool is_integer_impl(const T&, int_type_tag) + { + return true; + } + } + + template + struct numeric_info { enum { length = 0, size = 32, bound_length = 0, min_exp = 0, max_exp = 0 }; }; + + template <> struct numeric_info { enum { length = 10, size = 16, bound_length = 9 }; }; + template <> struct numeric_info { enum { min_exp = -38, max_exp = +38 }; }; + template <> struct numeric_info { enum { min_exp = -308, max_exp = +308 }; }; + template <> struct numeric_info { enum { min_exp = -308, max_exp = +308 }; }; + + template + inline int to_int32(const T v) + { + const typename details::number_type::type num_type; + return to_int32_impl(v, num_type); + } + + template + inline _int64_t to_int64(const T v) + { + const typename details::number_type::type num_type; + return to_int64_impl(v, num_type); + } + + template + inline bool is_nan(const T v) + { + const typename details::number_type::type num_type; + return is_nan_impl(v, num_type); + } + + template + inline T min(const T v0, const T v1) + { + const typename details::number_type::type num_type; + return min_impl(v0, v1, num_type); + } + + template + inline T max(const T v0, const T v1) + { + const typename details::number_type::type num_type; + return max_impl(v0, v1, num_type); + } + + template + inline T equal(const T v0, const T v1) + { + const typename details::number_type::type num_type; + return equal_impl(v0, v1, num_type); + } + + template + inline T nequal(const T v0, const T v1) + { + const typename details::number_type::type num_type; + return nequal_impl(v0, v1, num_type); + } + + template + inline T modulus(const T v0, const T v1) + { + const typename details::number_type::type num_type; + return modulus_impl(v0, v1, num_type); + } + + template + inline T pow(const T v0, const T v1) + { + const typename details::number_type::type num_type; + return pow_impl(v0, v1, num_type); + } + + template + inline T logn(const T v0, const T v1) + { + const typename details::number_type::type num_type; + return logn_impl(v0, v1, num_type); + } + + template + inline T root(const T v0, const T v1) + { + const typename details::number_type::type num_type; + return root_impl(v0, v1, num_type); + } + + template + inline T roundn(const T v0, const T v1) + { + const typename details::number_type::type num_type; + return roundn_impl(v0, v1, num_type); + } + + template + inline T hypot(const T v0, const T v1) + { + const typename details::number_type::type num_type; + return hypot_impl(v0, v1, num_type); + } + + template + inline T atan2(const T v0, const T v1) + { + const typename details::number_type::type num_type; + return atan2_impl(v0, v1, num_type); + } + + template + inline T shr(const T v0, const T v1) + { + const typename details::number_type::type num_type; + return shr_impl(v0, v1, num_type); + } + + template + inline T shl(const T v0, const T v1) + { + const typename details::number_type::type num_type; + return shl_impl(v0, v1, num_type); + } + + template + inline T and_opr(const T v0, const T v1) + { + const typename details::number_type::type num_type; + return and_impl(v0, v1, num_type); + } + + template + inline T nand_opr(const T v0, const T v1) + { + const typename details::number_type::type num_type; + return nand_impl(v0, v1, num_type); + } + + template + inline T or_opr(const T v0, const T v1) + { + const typename details::number_type::type num_type; + return or_impl(v0, v1, num_type); + } + + template + inline T nor_opr(const T v0, const T v1) + { + const typename details::number_type::type num_type; + return nor_impl(v0, v1, num_type); + } + + template + inline T xor_opr(const T v0, const T v1) + { + const typename details::number_type::type num_type; + return xor_impl(v0, v1, num_type); + } + + template + inline T xnor_opr(const T v0, const T v1) + { + const typename details::number_type::type num_type; + return xnor_impl(v0, v1, num_type); + } + + template + inline bool is_integer(const T v) + { + const typename details::number_type::type num_type; + return is_integer_impl(v, num_type); + } + + template + struct fast_exp + { + static inline T result(T v) + { + unsigned int k = N; + T l = T(1); + + while (k) + { + if (1 == (k % 2)) + { + l *= v; + --k; + } + + v *= v; + k /= 2; + } + + return l; + } + }; + + template struct fast_exp { static inline T result(const T v) { T v_5 = fast_exp::result(v); return v_5 * v_5; } }; + template struct fast_exp { static inline T result(const T v) { return fast_exp::result(v) * v; } }; + template struct fast_exp { static inline T result(const T v) { T v_4 = fast_exp::result(v); return v_4 * v_4; } }; + template struct fast_exp { static inline T result(const T v) { return fast_exp::result(v) * v; } }; + template struct fast_exp { static inline T result(const T v) { T v_3 = fast_exp::result(v); return v_3 * v_3; } }; + template struct fast_exp { static inline T result(const T v) { return fast_exp::result(v) * v; } }; + template struct fast_exp { static inline T result(const T v) { T v_2 = v * v; return v_2 * v_2; } }; + template struct fast_exp { static inline T result(const T v) { return v * v * v; } }; + template struct fast_exp { static inline T result(const T v) { return v * v; } }; + template struct fast_exp { static inline T result(const T v) { return v; } }; + template struct fast_exp { static inline T result(const T ) { return T(1); } }; + + #define exprtk_define_unary_function(FunctionName) \ + template \ + inline T FunctionName (const T v) \ + { \ + const typename details::number_type::type num_type; \ + return FunctionName##_impl(v,num_type); \ + } \ + + exprtk_define_unary_function(abs ) + exprtk_define_unary_function(acos ) + exprtk_define_unary_function(acosh) + exprtk_define_unary_function(asin ) + exprtk_define_unary_function(asinh) + exprtk_define_unary_function(atan ) + exprtk_define_unary_function(atanh) + exprtk_define_unary_function(ceil ) + exprtk_define_unary_function(cos ) + exprtk_define_unary_function(cosh ) + exprtk_define_unary_function(exp ) + exprtk_define_unary_function(expm1) + exprtk_define_unary_function(floor) + exprtk_define_unary_function(log ) + exprtk_define_unary_function(log10) + exprtk_define_unary_function(log2 ) + exprtk_define_unary_function(log1p) + exprtk_define_unary_function(neg ) + exprtk_define_unary_function(pos ) + exprtk_define_unary_function(round) + exprtk_define_unary_function(sin ) + exprtk_define_unary_function(sinc ) + exprtk_define_unary_function(sinh ) + exprtk_define_unary_function(sqrt ) + exprtk_define_unary_function(tan ) + exprtk_define_unary_function(tanh ) + exprtk_define_unary_function(cot ) + exprtk_define_unary_function(sec ) + exprtk_define_unary_function(csc ) + exprtk_define_unary_function(r2d ) + exprtk_define_unary_function(d2r ) + exprtk_define_unary_function(d2g ) + exprtk_define_unary_function(g2d ) + exprtk_define_unary_function(notl ) + exprtk_define_unary_function(sgn ) + exprtk_define_unary_function(erf ) + exprtk_define_unary_function(erfc ) + exprtk_define_unary_function(ncdf ) + exprtk_define_unary_function(frac ) + exprtk_define_unary_function(trunc) + #undef exprtk_define_unary_function + } + + template + inline T compute_pow10(T d, const int exponent) + { + static const double fract10[] = + { + 0.0, + 1.0E+001, 1.0E+002, 1.0E+003, 1.0E+004, 1.0E+005, 1.0E+006, 1.0E+007, 1.0E+008, 1.0E+009, 1.0E+010, + 1.0E+011, 1.0E+012, 1.0E+013, 1.0E+014, 1.0E+015, 1.0E+016, 1.0E+017, 1.0E+018, 1.0E+019, 1.0E+020, + 1.0E+021, 1.0E+022, 1.0E+023, 1.0E+024, 1.0E+025, 1.0E+026, 1.0E+027, 1.0E+028, 1.0E+029, 1.0E+030, + 1.0E+031, 1.0E+032, 1.0E+033, 1.0E+034, 1.0E+035, 1.0E+036, 1.0E+037, 1.0E+038, 1.0E+039, 1.0E+040, + 1.0E+041, 1.0E+042, 1.0E+043, 1.0E+044, 1.0E+045, 1.0E+046, 1.0E+047, 1.0E+048, 1.0E+049, 1.0E+050, + 1.0E+051, 1.0E+052, 1.0E+053, 1.0E+054, 1.0E+055, 1.0E+056, 1.0E+057, 1.0E+058, 1.0E+059, 1.0E+060, + 1.0E+061, 1.0E+062, 1.0E+063, 1.0E+064, 1.0E+065, 1.0E+066, 1.0E+067, 1.0E+068, 1.0E+069, 1.0E+070, + 1.0E+071, 1.0E+072, 1.0E+073, 1.0E+074, 1.0E+075, 1.0E+076, 1.0E+077, 1.0E+078, 1.0E+079, 1.0E+080, + 1.0E+081, 1.0E+082, 1.0E+083, 1.0E+084, 1.0E+085, 1.0E+086, 1.0E+087, 1.0E+088, 1.0E+089, 1.0E+090, + 1.0E+091, 1.0E+092, 1.0E+093, 1.0E+094, 1.0E+095, 1.0E+096, 1.0E+097, 1.0E+098, 1.0E+099, 1.0E+100, + 1.0E+101, 1.0E+102, 1.0E+103, 1.0E+104, 1.0E+105, 1.0E+106, 1.0E+107, 1.0E+108, 1.0E+109, 1.0E+110, + 1.0E+111, 1.0E+112, 1.0E+113, 1.0E+114, 1.0E+115, 1.0E+116, 1.0E+117, 1.0E+118, 1.0E+119, 1.0E+120, + 1.0E+121, 1.0E+122, 1.0E+123, 1.0E+124, 1.0E+125, 1.0E+126, 1.0E+127, 1.0E+128, 1.0E+129, 1.0E+130, + 1.0E+131, 1.0E+132, 1.0E+133, 1.0E+134, 1.0E+135, 1.0E+136, 1.0E+137, 1.0E+138, 1.0E+139, 1.0E+140, + 1.0E+141, 1.0E+142, 1.0E+143, 1.0E+144, 1.0E+145, 1.0E+146, 1.0E+147, 1.0E+148, 1.0E+149, 1.0E+150, + 1.0E+151, 1.0E+152, 1.0E+153, 1.0E+154, 1.0E+155, 1.0E+156, 1.0E+157, 1.0E+158, 1.0E+159, 1.0E+160, + 1.0E+161, 1.0E+162, 1.0E+163, 1.0E+164, 1.0E+165, 1.0E+166, 1.0E+167, 1.0E+168, 1.0E+169, 1.0E+170, + 1.0E+171, 1.0E+172, 1.0E+173, 1.0E+174, 1.0E+175, 1.0E+176, 1.0E+177, 1.0E+178, 1.0E+179, 1.0E+180, + 1.0E+181, 1.0E+182, 1.0E+183, 1.0E+184, 1.0E+185, 1.0E+186, 1.0E+187, 1.0E+188, 1.0E+189, 1.0E+190, + 1.0E+191, 1.0E+192, 1.0E+193, 1.0E+194, 1.0E+195, 1.0E+196, 1.0E+197, 1.0E+198, 1.0E+199, 1.0E+200, + 1.0E+201, 1.0E+202, 1.0E+203, 1.0E+204, 1.0E+205, 1.0E+206, 1.0E+207, 1.0E+208, 1.0E+209, 1.0E+210, + 1.0E+211, 1.0E+212, 1.0E+213, 1.0E+214, 1.0E+215, 1.0E+216, 1.0E+217, 1.0E+218, 1.0E+219, 1.0E+220, + 1.0E+221, 1.0E+222, 1.0E+223, 1.0E+224, 1.0E+225, 1.0E+226, 1.0E+227, 1.0E+228, 1.0E+229, 1.0E+230, + 1.0E+231, 1.0E+232, 1.0E+233, 1.0E+234, 1.0E+235, 1.0E+236, 1.0E+237, 1.0E+238, 1.0E+239, 1.0E+240, + 1.0E+241, 1.0E+242, 1.0E+243, 1.0E+244, 1.0E+245, 1.0E+246, 1.0E+247, 1.0E+248, 1.0E+249, 1.0E+250, + 1.0E+251, 1.0E+252, 1.0E+253, 1.0E+254, 1.0E+255, 1.0E+256, 1.0E+257, 1.0E+258, 1.0E+259, 1.0E+260, + 1.0E+261, 1.0E+262, 1.0E+263, 1.0E+264, 1.0E+265, 1.0E+266, 1.0E+267, 1.0E+268, 1.0E+269, 1.0E+270, + 1.0E+271, 1.0E+272, 1.0E+273, 1.0E+274, 1.0E+275, 1.0E+276, 1.0E+277, 1.0E+278, 1.0E+279, 1.0E+280, + 1.0E+281, 1.0E+282, 1.0E+283, 1.0E+284, 1.0E+285, 1.0E+286, 1.0E+287, 1.0E+288, 1.0E+289, 1.0E+290, + 1.0E+291, 1.0E+292, 1.0E+293, 1.0E+294, 1.0E+295, 1.0E+296, 1.0E+297, 1.0E+298, 1.0E+299, 1.0E+300, + 1.0E+301, 1.0E+302, 1.0E+303, 1.0E+304, 1.0E+305, 1.0E+306, 1.0E+307, 1.0E+308 + }; + + static const int fract10_size = static_cast(sizeof(fract10) / sizeof(double)); + + const int e = std::abs(exponent); + + if (exponent >= std::numeric_limits::min_exponent10) + { + if (e < fract10_size) + { + if (exponent > 0) + return T(d * fract10[e]); + else + return T(d / fract10[e]); + } + else + return T(d * std::pow(10.0, 10.0 * exponent)); + } + else + { + d /= T(fract10[ -std::numeric_limits::min_exponent10]); + return T(d / fract10[-exponent + std::numeric_limits::min_exponent10]); + } + } + + template + inline bool string_to_type_converter_impl_ref(Iterator& itr, const Iterator end, T& result) + { + if (itr == end) + return false; + + const bool negative = ('-' == (*itr)); + + if (negative || ('+' == (*itr))) + { + if (end == ++itr) + return false; + } + + static const uchar_t zero = static_cast('0'); + + while ((end != itr) && (zero == (*itr))) ++itr; + + bool return_result = true; + unsigned int digit = 0; + const std::size_t length = static_cast(std::distance(itr,end)); + + if (length <= 4) + { + exprtk_disable_fallthrough_begin + switch (length) + { + #ifdef exprtk_use_lut + + #define exprtk_process_digit \ + if ((digit = details::digit_table[(int)*itr++]) < 10) \ + result = result * 10 + (digit); \ + else \ + { \ + return_result = false; \ + break; \ + } \ + + #else + + #define exprtk_process_digit \ + if ((digit = (*itr++ - zero)) < 10) \ + result = result * T(10) + digit; \ + else \ + { \ + return_result = false; \ + break; \ + } \ + + #endif + + case 4 : exprtk_process_digit + case 3 : exprtk_process_digit + case 2 : exprtk_process_digit + case 1 : if ((digit = (*itr - zero))>= 10) + { + digit = 0; + return_result = false; + } + + #undef exprtk_process_digit + } + exprtk_disable_fallthrough_end + } + else + return_result = false; + + if (length && return_result) + { + result = result * 10 + static_cast(digit); + ++itr; + } + + result = negative ? -result : result; + return return_result; + } + + template + static inline bool parse_nan(Iterator& itr, const Iterator end, T& t) + { + typedef typename std::iterator_traits::value_type type; + + static const std::size_t nan_length = 3; + + if (std::distance(itr,end) != static_cast(nan_length)) + return false; + + if (static_cast('n') == (*itr)) + { + if ( + (static_cast('a') != *(itr + 1)) || + (static_cast('n') != *(itr + 2)) + ) + { + return false; + } + } + else if ( + (static_cast('A') != *(itr + 1)) || + (static_cast('N') != *(itr + 2)) + ) + { + return false; + } + + t = std::numeric_limits::quiet_NaN(); + + return true; + } + + template + static inline bool parse_inf(Iterator& itr, const Iterator end, T& t, const bool negative) + { + static const char_t inf_uc[] = "INFINITY"; + static const char_t inf_lc[] = "infinity"; + static const std::size_t inf_length = 8; + + const std::size_t length = static_cast(std::distance(itr,end)); + + if ((3 != length) && (inf_length != length)) + return false; + + char_cptr inf_itr = ('i' == (*itr)) ? inf_lc : inf_uc; + + while (end != itr) + { + if (*inf_itr == static_cast(*itr)) + { + ++itr; + ++inf_itr; + continue; + } + else + return false; + } + + if (negative) + t = -std::numeric_limits::infinity(); + else + t = std::numeric_limits::infinity(); + + return true; + } + + template + inline bool valid_exponent(const int exponent, numeric::details::real_type_tag) + { + using namespace details::numeric; + return (numeric_info::min_exp <= exponent) && (exponent <= numeric_info::max_exp); + } + + template + inline bool string_to_real(Iterator& itr_external, const Iterator end, T& t, numeric::details::real_type_tag) + { + if (end == itr_external) return false; + + Iterator itr = itr_external; + + T d = T(0); + + const bool negative = ('-' == (*itr)); + + if (negative || '+' == (*itr)) + { + if (end == ++itr) + return false; + } + + bool instate = false; + + static const char_t zero = static_cast('0'); + + #define parse_digit_1(d) \ + if ((digit = (*itr - zero)) < 10) \ + { d = d * T(10) + digit; } \ + else \ + { break; } \ + if (end == ++itr) break; \ + + #define parse_digit_2(d) \ + if ((digit = (*itr - zero)) < 10) \ + { d = d * T(10) + digit; } \ + else \ + { break; } \ + ++itr; \ + + if ('.' != (*itr)) + { + const Iterator curr = itr; + + while ((end != itr) && (zero == (*itr))) ++itr; + + while (end != itr) + { + unsigned int digit; + parse_digit_1(d) + parse_digit_1(d) + parse_digit_2(d) + } + + if (curr != itr) instate = true; + } + + int exponent = 0; + + if (end != itr) + { + if ('.' == (*itr)) + { + const Iterator curr = ++itr; + T tmp_d = T(0); + + while (end != itr) + { + unsigned int digit; + parse_digit_1(tmp_d) + parse_digit_1(tmp_d) + parse_digit_2(tmp_d) + } + + if (curr != itr) + { + instate = true; + + const int frac_exponent = static_cast(-std::distance(curr, itr)); + + if (!valid_exponent(frac_exponent, numeric::details::real_type_tag())) + return false; + + d += compute_pow10(tmp_d, frac_exponent); + } + + #undef parse_digit_1 + #undef parse_digit_2 + } + + if (end != itr) + { + typename std::iterator_traits::value_type c = (*itr); + + if (('e' == c) || ('E' == c)) + { + int exp = 0; + + if (!details::string_to_type_converter_impl_ref(++itr, end, exp)) + { + if (end == itr) + return false; + else + c = (*itr); + } + + exponent += exp; + } + + if (end != itr) + { + if (('f' == c) || ('F' == c) || ('l' == c) || ('L' == c)) + ++itr; + else if ('#' == c) + { + if (end == ++itr) + return false; + else if (('I' <= (*itr)) && ((*itr) <= 'n')) + { + if (('i' == (*itr)) || ('I' == (*itr))) + { + return parse_inf(itr, end, t, negative); + } + else if (('n' == (*itr)) || ('N' == (*itr))) + { + return parse_nan(itr, end, t); + } + else + return false; + } + else + return false; + } + else if (('I' <= (*itr)) && ((*itr) <= 'n')) + { + if (('i' == (*itr)) || ('I' == (*itr))) + { + return parse_inf(itr, end, t, negative); + } + else if (('n' == (*itr)) || ('N' == (*itr))) + { + return parse_nan(itr, end, t); + } + else + return false; + } + else + return false; + } + } + } + + if ((end != itr) || (!instate)) + return false; + else if (!valid_exponent(exponent, numeric::details::real_type_tag())) + return false; + else if (exponent) + d = compute_pow10(d,exponent); + + t = static_cast((negative) ? -d : d); + return true; + } + + template + inline bool string_to_real(const std::string& s, T& t) + { + const typename numeric::details::number_type::type num_type; + + char_cptr begin = s.data(); + char_cptr end = s.data() + s.size(); + + return string_to_real(begin, end, t, num_type); + } + + template + struct functor_t + { + /* + Note: The following definitions for Type, may require tweaking + based on the compiler and target architecture. The benchmark + should provide enough information to make the right choice. + */ + //typedef T Type; + //typedef const T Type; + typedef const T& Type; + typedef T& RefType; + typedef T (*qfunc_t)(Type t0, Type t1, Type t2, Type t3); + typedef T (*tfunc_t)(Type t0, Type t1, Type t2); + typedef T (*bfunc_t)(Type t0, Type t1); + typedef T (*ufunc_t)(Type t0); + }; + + } // namespace details + + struct loop_runtime_check + { + enum loop_types + { + e_invalid = 0, + e_for_loop = 1, + e_while_loop = 2, + e_repeat_until_loop = 4, + e_all_loops = 7 + }; + + enum violation_type + { + e_unknown = 0, + e_iteration_count = 1, + e_timeout = 2 + }; + + loop_types loop_set; + + loop_runtime_check() + : loop_set(e_invalid) + , max_loop_iterations(0) + {} + + details::_uint64_t max_loop_iterations; + + struct violation_context + { + loop_types loop; + violation_type violation; + details::_uint64_t iteration_count; + }; + + virtual void handle_runtime_violation(const violation_context&) + { + throw std::runtime_error("ExprTk Loop run-time violation."); + } + + virtual ~loop_runtime_check() {} + }; + + typedef loop_runtime_check* loop_runtime_check_ptr; + + namespace lexer + { + struct token + { + enum token_type + { + e_none = 0, e_error = 1, e_err_symbol = 2, + e_err_number = 3, e_err_string = 4, e_err_sfunc = 5, + e_eof = 6, e_number = 7, e_symbol = 8, + e_string = 9, e_assign = 10, e_addass = 11, + e_subass = 12, e_mulass = 13, e_divass = 14, + e_modass = 15, e_shr = 16, e_shl = 17, + e_lte = 18, e_ne = 19, e_gte = 20, + e_swap = 21, e_lt = '<', e_gt = '>', + e_eq = '=', e_rbracket = ')', e_lbracket = '(', + e_rsqrbracket = ']', e_lsqrbracket = '[', e_rcrlbracket = '}', + e_lcrlbracket = '{', e_comma = ',', e_add = '+', + e_sub = '-', e_div = '/', e_mul = '*', + e_mod = '%', e_pow = '^', e_colon = ':', + e_ternary = '?' + }; + + token() + : type(e_none) + , value("") + , position(std::numeric_limits::max()) + {} + + void clear() + { + type = e_none; + value = ""; + position = std::numeric_limits::max(); + } + + template + inline token& set_operator(const token_type tt, + const Iterator begin, const Iterator end, + const Iterator base_begin = Iterator(0)) + { + type = tt; + value.assign(begin,end); + if (base_begin) + position = static_cast(std::distance(base_begin,begin)); + return (*this); + } + + template + inline token& set_symbol(const Iterator begin, const Iterator end, const Iterator base_begin = Iterator(0)) + { + type = e_symbol; + value.assign(begin,end); + if (base_begin) + position = static_cast(std::distance(base_begin,begin)); + return (*this); + } + + template + inline token& set_numeric(const Iterator begin, const Iterator end, const Iterator base_begin = Iterator(0)) + { + type = e_number; + value.assign(begin,end); + if (base_begin) + position = static_cast(std::distance(base_begin,begin)); + return (*this); + } + + template + inline token& set_string(const Iterator begin, const Iterator end, const Iterator base_begin = Iterator(0)) + { + type = e_string; + value.assign(begin,end); + if (base_begin) + position = static_cast(std::distance(base_begin,begin)); + return (*this); + } + + inline token& set_string(const std::string& s, const std::size_t p) + { + type = e_string; + value = s; + position = p; + return (*this); + } + + template + inline token& set_error(const token_type et, + const Iterator begin, const Iterator end, + const Iterator base_begin = Iterator(0)) + { + if ( + (e_error == et) || + (e_err_symbol == et) || + (e_err_number == et) || + (e_err_string == et) || + (e_err_sfunc == et) + ) + { + type = et; + } + else + type = e_error; + + value.assign(begin,end); + + if (base_begin) + position = static_cast(std::distance(base_begin,begin)); + + return (*this); + } + + static inline std::string to_str(token_type t) + { + switch (t) + { + case e_none : return "NONE"; + case e_error : return "ERROR"; + case e_err_symbol : return "ERROR_SYMBOL"; + case e_err_number : return "ERROR_NUMBER"; + case e_err_string : return "ERROR_STRING"; + case e_eof : return "EOF"; + case e_number : return "NUMBER"; + case e_symbol : return "SYMBOL"; + case e_string : return "STRING"; + case e_assign : return ":="; + case e_addass : return "+="; + case e_subass : return "-="; + case e_mulass : return "*="; + case e_divass : return "/="; + case e_modass : return "%="; + case e_shr : return ">>"; + case e_shl : return "<<"; + case e_lte : return "<="; + case e_ne : return "!="; + case e_gte : return ">="; + case e_lt : return "<"; + case e_gt : return ">"; + case e_eq : return "="; + case e_rbracket : return ")"; + case e_lbracket : return "("; + case e_rsqrbracket : return "]"; + case e_lsqrbracket : return "["; + case e_rcrlbracket : return "}"; + case e_lcrlbracket : return "{"; + case e_comma : return ","; + case e_add : return "+"; + case e_sub : return "-"; + case e_div : return "/"; + case e_mul : return "*"; + case e_mod : return "%"; + case e_pow : return "^"; + case e_colon : return ":"; + case e_ternary : return "?"; + case e_swap : return "<=>"; + default : return "UNKNOWN"; + } + } + + inline bool is_error() const + { + return ( + (e_error == type) || + (e_err_symbol == type) || + (e_err_number == type) || + (e_err_string == type) || + (e_err_sfunc == type) + ); + } + + token_type type; + std::string value; + std::size_t position; + }; + + class generator + { + public: + + typedef token token_t; + typedef std::vector token_list_t; + typedef token_list_t::iterator token_list_itr_t; + typedef details::char_t char_t; + + generator() + : base_itr_(0) + , s_itr_ (0) + , s_end_ (0) + { + clear(); + } + + inline void clear() + { + base_itr_ = 0; + s_itr_ = 0; + s_end_ = 0; + token_list_.clear(); + token_itr_ = token_list_.end(); + store_token_itr_ = token_list_.end(); + } + + inline bool process(const std::string& str) + { + base_itr_ = str.data(); + s_itr_ = str.data(); + s_end_ = str.data() + str.size(); + + eof_token_.set_operator(token_t::e_eof,s_end_,s_end_,base_itr_); + token_list_.clear(); + + while (!is_end(s_itr_)) + { + scan_token(); + + if (!token_list_.empty() && token_list_.back().is_error()) + return false; + } + + return true; + } + + inline bool empty() const + { + return token_list_.empty(); + } + + inline std::size_t size() const + { + return token_list_.size(); + } + + inline void begin() + { + token_itr_ = token_list_.begin(); + store_token_itr_ = token_list_.begin(); + } + + inline void store() + { + store_token_itr_ = token_itr_; + } + + inline void restore() + { + token_itr_ = store_token_itr_; + } + + inline token_t& next_token() + { + if (token_list_.end() != token_itr_) + { + return *token_itr_++; + } + else + return eof_token_; + } + + inline token_t& peek_next_token() + { + if (token_list_.end() != token_itr_) + { + return *token_itr_; + } + else + return eof_token_; + } + + inline token_t& operator[](const std::size_t& index) + { + if (index < token_list_.size()) + return token_list_[index]; + else + return eof_token_; + } + + inline token_t operator[](const std::size_t& index) const + { + if (index < token_list_.size()) + return token_list_[index]; + else + return eof_token_; + } + + inline bool finished() const + { + return (token_list_.end() == token_itr_); + } + + inline void insert_front(token_t::token_type tk_type) + { + if ( + !token_list_.empty() && + (token_list_.end() != token_itr_) + ) + { + token_t t = *token_itr_; + + t.type = tk_type; + token_itr_ = token_list_.insert(token_itr_,t); + } + } + + inline std::string substr(const std::size_t& begin, const std::size_t& end) const + { + const details::char_cptr begin_itr = ((base_itr_ + begin) < s_end_) ? (base_itr_ + begin) : s_end_; + const details::char_cptr end_itr = ((base_itr_ + end ) < s_end_) ? (base_itr_ + end ) : s_end_; + + return std::string(begin_itr,end_itr); + } + + inline std::string remaining() const + { + if (finished()) + return ""; + else if (token_list_.begin() != token_itr_) + return std::string(base_itr_ + (token_itr_ - 1)->position, s_end_); + else + return std::string(base_itr_ + token_itr_->position, s_end_); + } + + private: + + inline bool is_end(details::char_cptr itr) const + { + return (s_end_ == itr); + } + + #ifndef exprtk_disable_comments + inline bool is_comment_start(details::char_cptr itr) const + { + const char_t c0 = *(itr + 0); + const char_t c1 = *(itr + 1); + + if ('#' == c0) + return true; + else if (!is_end(itr + 1)) + { + if (('/' == c0) && ('/' == c1)) return true; + if (('/' == c0) && ('*' == c1)) return true; + } + return false; + } + #else + inline bool is_comment_start(details::char_cptr) const + { + return false; + } + #endif + + inline void skip_whitespace() + { + while (!is_end(s_itr_) && details::is_whitespace(*s_itr_)) + { + ++s_itr_; + } + } + + inline void skip_comments() + { + #ifndef exprtk_disable_comments + // The following comment styles are supported: + // 1. // .... \n + // 2. # .... \n + // 3. /* .... */ + struct test + { + static inline bool comment_start(const char_t c0, const char_t c1, int& mode, int& incr) + { + mode = 0; + if ('#' == c0) { mode = 1; incr = 1; } + else if ('/' == c0) + { + if ('/' == c1) { mode = 1; incr = 2; } + else if ('*' == c1) { mode = 2; incr = 2; } + } + return (0 != mode); + } + + static inline bool comment_end(const char_t c0, const char_t c1, int& mode) + { + if ( + ((1 == mode) && ('\n' == c0)) || + ((2 == mode) && ( '*' == c0) && ('/' == c1)) + ) + { + mode = 0; + return true; + } + else + return false; + } + }; + + int mode = 0; + int increment = 0; + + if (is_end(s_itr_)) + return; + else if (!test::comment_start(*s_itr_, *(s_itr_ + 1), mode, increment)) + return; + + details::char_cptr cmt_start = s_itr_; + + s_itr_ += increment; + + while (!is_end(s_itr_)) + { + if ((1 == mode) && test::comment_end(*s_itr_, 0, mode)) + { + ++s_itr_; + return; + } + + if ((2 == mode)) + { + if (!is_end((s_itr_ + 1)) && test::comment_end(*s_itr_, *(s_itr_ + 1), mode)) + { + s_itr_ += 2; + return; + } + } + + ++s_itr_; + } + + if (2 == mode) + { + token_t t; + t.set_error(token::e_error, cmt_start, cmt_start + mode, base_itr_); + token_list_.push_back(t); + } + #endif + } + + inline void scan_token() + { + if (details::is_whitespace(*s_itr_)) + { + skip_whitespace(); + return; + } + else if (is_comment_start(s_itr_)) + { + skip_comments(); + return; + } + else if (details::is_operator_char(*s_itr_)) + { + scan_operator(); + return; + } + else if (details::is_letter(*s_itr_)) + { + scan_symbol(); + return; + } + else if (details::is_digit((*s_itr_)) || ('.' == (*s_itr_))) + { + scan_number(); + return; + } + else if ('$' == (*s_itr_)) + { + scan_special_function(); + return; + } + #ifndef exprtk_disable_string_capabilities + else if ('\'' == (*s_itr_)) + { + scan_string(); + return; + } + #endif + else if ('~' == (*s_itr_)) + { + token_t t; + t.set_symbol(s_itr_, s_itr_ + 1, base_itr_); + token_list_.push_back(t); + ++s_itr_; + return; + } + else + { + token_t t; + t.set_error(token::e_error, s_itr_, s_itr_ + 2, base_itr_); + token_list_.push_back(t); + ++s_itr_; + } + } + + inline void scan_operator() + { + token_t t; + + const char_t c0 = s_itr_[0]; + + if (!is_end(s_itr_ + 1)) + { + const char_t c1 = s_itr_[1]; + + if (!is_end(s_itr_ + 2)) + { + const char_t c2 = s_itr_[2]; + + if ((c0 == '<') && (c1 == '=') && (c2 == '>')) + { + t.set_operator(token_t::e_swap, s_itr_, s_itr_ + 3, base_itr_); + token_list_.push_back(t); + s_itr_ += 3; + return; + } + } + + token_t::token_type ttype = token_t::e_none; + + if ((c0 == '<') && (c1 == '=')) ttype = token_t::e_lte; + else if ((c0 == '>') && (c1 == '=')) ttype = token_t::e_gte; + else if ((c0 == '<') && (c1 == '>')) ttype = token_t::e_ne; + else if ((c0 == '!') && (c1 == '=')) ttype = token_t::e_ne; + else if ((c0 == '=') && (c1 == '=')) ttype = token_t::e_eq; + else if ((c0 == ':') && (c1 == '=')) ttype = token_t::e_assign; + else if ((c0 == '<') && (c1 == '<')) ttype = token_t::e_shl; + else if ((c0 == '>') && (c1 == '>')) ttype = token_t::e_shr; + else if ((c0 == '+') && (c1 == '=')) ttype = token_t::e_addass; + else if ((c0 == '-') && (c1 == '=')) ttype = token_t::e_subass; + else if ((c0 == '*') && (c1 == '=')) ttype = token_t::e_mulass; + else if ((c0 == '/') && (c1 == '=')) ttype = token_t::e_divass; + else if ((c0 == '%') && (c1 == '=')) ttype = token_t::e_modass; + + if (token_t::e_none != ttype) + { + t.set_operator(ttype, s_itr_, s_itr_ + 2, base_itr_); + token_list_.push_back(t); + s_itr_ += 2; + return; + } + } + + if ('<' == c0) + t.set_operator(token_t::e_lt , s_itr_, s_itr_ + 1, base_itr_); + else if ('>' == c0) + t.set_operator(token_t::e_gt , s_itr_, s_itr_ + 1, base_itr_); + else if (';' == c0) + t.set_operator(token_t::e_eof, s_itr_, s_itr_ + 1, base_itr_); + else if ('&' == c0) + t.set_symbol(s_itr_, s_itr_ + 1, base_itr_); + else if ('|' == c0) + t.set_symbol(s_itr_, s_itr_ + 1, base_itr_); + else + t.set_operator(token_t::token_type(c0), s_itr_, s_itr_ + 1, base_itr_); + + token_list_.push_back(t); + ++s_itr_; + } + + inline void scan_symbol() + { + details::char_cptr initial_itr = s_itr_; + + while (!is_end(s_itr_)) + { + if (!details::is_letter_or_digit(*s_itr_) && ('_' != (*s_itr_))) + { + if ('.' != (*s_itr_)) + break; + /* + Permit symbols that contain a 'dot' + Allowed : abc.xyz, a123.xyz, abc.123, abc_.xyz a123_.xyz abc._123 + Disallowed: .abc, abc., abc., abc. + */ + if ( + (s_itr_ != initial_itr) && + !is_end(s_itr_ + 1) && + !details::is_letter_or_digit(*(s_itr_ + 1)) && + ('_' != (*(s_itr_ + 1))) + ) + break; + } + + ++s_itr_; + } + + token_t t; + t.set_symbol(initial_itr,s_itr_,base_itr_); + token_list_.push_back(t); + } + + inline void scan_number() + { + /* + Attempt to match a valid numeric value in one of the following formats: + (01) 123456 + (02) 123456. + (03) 123.456 + (04) 123.456e3 + (05) 123.456E3 + (06) 123.456e+3 + (07) 123.456E+3 + (08) 123.456e-3 + (09) 123.456E-3 + (00) .1234 + (11) .1234e3 + (12) .1234E+3 + (13) .1234e+3 + (14) .1234E-3 + (15) .1234e-3 + */ + + details::char_cptr initial_itr = s_itr_; + bool dot_found = false; + bool e_found = false; + bool post_e_sign_found = false; + bool post_e_digit_found = false; + token_t t; + + while (!is_end(s_itr_)) + { + if ('.' == (*s_itr_)) + { + if (dot_found) + { + t.set_error(token::e_err_number, initial_itr, s_itr_, base_itr_); + token_list_.push_back(t); + + return; + } + + dot_found = true; + ++s_itr_; + + continue; + } + else if ('e' == std::tolower(*s_itr_)) + { + const char_t& c = *(s_itr_ + 1); + + if (is_end(s_itr_ + 1)) + { + t.set_error(token::e_err_number, initial_itr, s_itr_, base_itr_); + token_list_.push_back(t); + + return; + } + else if ( + ('+' != c) && + ('-' != c) && + !details::is_digit(c) + ) + { + t.set_error(token::e_err_number, initial_itr, s_itr_, base_itr_); + token_list_.push_back(t); + + return; + } + + e_found = true; + ++s_itr_; + + continue; + } + else if (e_found && details::is_sign(*s_itr_) && !post_e_digit_found) + { + if (post_e_sign_found) + { + t.set_error(token::e_err_number, initial_itr, s_itr_, base_itr_); + token_list_.push_back(t); + + return; + } + + post_e_sign_found = true; + ++s_itr_; + + continue; + } + else if (e_found && details::is_digit(*s_itr_)) + { + post_e_digit_found = true; + ++s_itr_; + + continue; + } + else if (('.' != (*s_itr_)) && !details::is_digit(*s_itr_)) + break; + else + ++s_itr_; + } + + t.set_numeric(initial_itr, s_itr_, base_itr_); + token_list_.push_back(t); + + return; + } + + inline void scan_special_function() + { + details::char_cptr initial_itr = s_itr_; + token_t t; + + // $fdd(x,x,x) = at least 11 chars + if (std::distance(s_itr_,s_end_) < 11) + { + t.set_error( + token::e_err_sfunc, + initial_itr, std::min(initial_itr + 11, s_end_), + base_itr_); + token_list_.push_back(t); + + return; + } + + if ( + !(('$' == *s_itr_) && + (details::imatch ('f',*(s_itr_ + 1))) && + (details::is_digit(*(s_itr_ + 2))) && + (details::is_digit(*(s_itr_ + 3)))) + ) + { + t.set_error( + token::e_err_sfunc, + initial_itr, std::min(initial_itr + 4, s_end_), + base_itr_); + token_list_.push_back(t); + + return; + } + + s_itr_ += 4; // $fdd = 4chars + + t.set_symbol(initial_itr, s_itr_, base_itr_); + token_list_.push_back(t); + + return; + } + + #ifndef exprtk_disable_string_capabilities + inline void scan_string() + { + details::char_cptr initial_itr = s_itr_ + 1; + token_t t; + + if (std::distance(s_itr_,s_end_) < 2) + { + t.set_error(token::e_err_string, s_itr_, s_end_, base_itr_); + token_list_.push_back(t); + + return; + } + + ++s_itr_; + + bool escaped_found = false; + bool escaped = false; + + while (!is_end(s_itr_)) + { + if (!details::is_valid_string_char(*s_itr_)) + { + t.set_error(token::e_err_string, initial_itr, s_itr_, base_itr_); + token_list_.push_back(t); + + return; + } + else if (!escaped && ('\\' == *s_itr_)) + { + escaped_found = true; + escaped = true; + ++s_itr_; + + continue; + } + else if (!escaped) + { + if ('\'' == *s_itr_) + break; + } + else if (escaped) + { + if ( + !is_end(s_itr_) && ('0' == *(s_itr_)) && + ((s_itr_ + 4) <= s_end_) + ) + { + const bool x_seperator = ('X' == std::toupper(*(s_itr_ + 1))); + + const bool both_digits = details::is_hex_digit(*(s_itr_ + 2)) && + details::is_hex_digit(*(s_itr_ + 3)) ; + + if (!(x_seperator && both_digits)) + { + t.set_error(token::e_err_string, initial_itr, s_itr_, base_itr_); + token_list_.push_back(t); + + return; + } + else + s_itr_ += 3; + } + + escaped = false; + } + + ++s_itr_; + } + + if (is_end(s_itr_)) + { + t.set_error(token::e_err_string, initial_itr, s_itr_, base_itr_); + token_list_.push_back(t); + + return; + } + + if (!escaped_found) + t.set_string(initial_itr, s_itr_, base_itr_); + else + { + std::string parsed_string(initial_itr,s_itr_); + + if (!details::cleanup_escapes(parsed_string)) + { + t.set_error(token::e_err_string, initial_itr, s_itr_, base_itr_); + token_list_.push_back(t); + + return; + } + + t.set_string( + parsed_string, + static_cast(std::distance(base_itr_,initial_itr))); + } + + token_list_.push_back(t); + ++s_itr_; + + return; + } + #endif + + private: + + token_list_t token_list_; + token_list_itr_t token_itr_; + token_list_itr_t store_token_itr_; + token_t eof_token_; + details::char_cptr base_itr_; + details::char_cptr s_itr_; + details::char_cptr s_end_; + + friend class token_scanner; + friend class token_modifier; + friend class token_inserter; + friend class token_joiner; + }; // class generator + + class helper_interface + { + public: + + virtual void init() { } + virtual void reset() { } + virtual bool result() { return true; } + virtual std::size_t process(generator&) { return 0; } + virtual ~helper_interface() { } + }; + + class token_scanner : public helper_interface + { + public: + + virtual ~token_scanner() {} + + explicit token_scanner(const std::size_t& stride) + : stride_(stride) + { + if (stride > 4) + { + throw std::invalid_argument("token_scanner() - Invalid stride value"); + } + } + + inline std::size_t process(generator& g) exprtk_override + { + if (g.token_list_.size() >= stride_) + { + for (std::size_t i = 0; i < (g.token_list_.size() - stride_ + 1); ++i) + { + token t; + + switch (stride_) + { + case 1 : + { + const token& t0 = g.token_list_[i]; + + if (!operator()(t0)) + { + return i; + } + } + break; + + case 2 : + { + const token& t0 = g.token_list_[i ]; + const token& t1 = g.token_list_[i + 1]; + + if (!operator()(t0, t1)) + { + return i; + } + } + break; + + case 3 : + { + const token& t0 = g.token_list_[i ]; + const token& t1 = g.token_list_[i + 1]; + const token& t2 = g.token_list_[i + 2]; + + if (!operator()(t0, t1, t2)) + { + return i; + } + } + break; + + case 4 : + { + const token& t0 = g.token_list_[i ]; + const token& t1 = g.token_list_[i + 1]; + const token& t2 = g.token_list_[i + 2]; + const token& t3 = g.token_list_[i + 3]; + + if (!operator()(t0, t1, t2, t3)) + { + return i; + } + } + break; + } + } + } + + return (g.token_list_.size() - stride_ + 1); + } + + virtual bool operator() (const token&) + { + return false; + } + + virtual bool operator() (const token&, const token&) + { + return false; + } + + virtual bool operator() (const token&, const token&, const token&) + { + return false; + } + + virtual bool operator() (const token&, const token&, const token&, const token&) + { + return false; + } + + private: + + const std::size_t stride_; + }; // class token_scanner + + class token_modifier : public helper_interface + { + public: + + inline std::size_t process(generator& g) exprtk_override + { + std::size_t changes = 0; + + for (std::size_t i = 0; i < g.token_list_.size(); ++i) + { + if (modify(g.token_list_[i])) changes++; + } + + return changes; + } + + virtual bool modify(token& t) = 0; + }; + + class token_inserter : public helper_interface + { + public: + + explicit token_inserter(const std::size_t& stride) + : stride_(stride) + { + if (stride > 5) + { + throw std::invalid_argument("token_inserter() - Invalid stride value"); + } + } + + inline std::size_t process(generator& g) exprtk_override + { + if (g.token_list_.empty()) + return 0; + else if (g.token_list_.size() < stride_) + return 0; + + std::size_t changes = 0; + + typedef std::pair insert_t; + std::vector insert_list; + insert_list.reserve(10000); + + for (std::size_t i = 0; i < (g.token_list_.size() - stride_ + 1); ++i) + { + int insert_index = -1; + token t; + + switch (stride_) + { + case 1 : insert_index = insert(g.token_list_[i],t); + break; + + case 2 : insert_index = insert(g.token_list_[i], g.token_list_[i + 1], t); + break; + + case 3 : insert_index = insert(g.token_list_[i], g.token_list_[i + 1], g.token_list_[i + 2], t); + break; + + case 4 : insert_index = insert(g.token_list_[i], g.token_list_[i + 1], g.token_list_[i + 2], g.token_list_[i + 3], t); + break; + + case 5 : insert_index = insert(g.token_list_[i], g.token_list_[i + 1], g.token_list_[i + 2], g.token_list_[i + 3], g.token_list_[i + 4], t); + break; + } + + if ((insert_index >= 0) && (insert_index <= (static_cast(stride_) + 1))) + { + insert_list.push_back(insert_t(i, t)); + changes++; + } + } + + if (!insert_list.empty()) + { + generator::token_list_t token_list; + + std::size_t insert_index = 0; + + for (std::size_t i = 0; i < g.token_list_.size(); ++i) + { + token_list.push_back(g.token_list_[i]); + + if ( + (insert_index < insert_list.size()) && + (insert_list[insert_index].first == i) + ) + { + token_list.push_back(insert_list[insert_index].second); + insert_index++; + } + } + + std::swap(g.token_list_,token_list); + } + + return changes; + } + + #define token_inserter_empty_body \ + { \ + return -1; \ + } \ + + inline virtual int insert(const token&, token&) + token_inserter_empty_body + + inline virtual int insert(const token&, const token&, token&) + token_inserter_empty_body + + inline virtual int insert(const token&, const token&, const token&, token&) + token_inserter_empty_body + + inline virtual int insert(const token&, const token&, const token&, const token&, token&) + token_inserter_empty_body + + inline virtual int insert(const token&, const token&, const token&, const token&, const token&, token&) + token_inserter_empty_body + + #undef token_inserter_empty_body + + private: + + const std::size_t stride_; + }; + + class token_joiner : public helper_interface + { + public: + + explicit token_joiner(const std::size_t& stride) + : stride_(stride) + {} + + inline std::size_t process(generator& g) exprtk_override + { + if (g.token_list_.empty()) + return 0; + + switch (stride_) + { + case 2 : return process_stride_2(g); + case 3 : return process_stride_3(g); + default : return 0; + } + } + + virtual bool join(const token&, const token&, token&) { return false; } + virtual bool join(const token&, const token&, const token&, token&) { return false; } + + private: + + inline std::size_t process_stride_2(generator& g) + { + if (g.token_list_.size() < 2) + return 0; + + std::size_t changes = 0; + + generator::token_list_t token_list; + token_list.reserve(10000); + + for (int i = 0; i < static_cast(g.token_list_.size() - 1); ++i) + { + token t; + + for ( ; ; ) + { + if (!join(g[i], g[i + 1], t)) + { + token_list.push_back(g[i]); + break; + } + + token_list.push_back(t); + + ++changes; + + i+=2; + + if (static_cast(i) >= (g.token_list_.size() - 1)) + break; + } + } + + token_list.push_back(g.token_list_.back()); + + assert(token_list.size() <= g.token_list_.size()); + + std::swap(token_list, g.token_list_); + + return changes; + } + + inline std::size_t process_stride_3(generator& g) + { + if (g.token_list_.size() < 3) + return 0; + + std::size_t changes = 0; + + generator::token_list_t token_list; + token_list.reserve(10000); + + for (int i = 0; i < static_cast(g.token_list_.size() - 2); ++i) + { + token t; + + for ( ; ; ) + { + if (!join(g[i], g[i + 1], g[i + 2], t)) + { + token_list.push_back(g[i]); + break; + } + + token_list.push_back(t); + + ++changes; + + i+=3; + + if (static_cast(i) >= (g.token_list_.size() - 2)) + break; + } + } + + token_list.push_back(*(g.token_list_.begin() + g.token_list_.size() - 2)); + token_list.push_back(*(g.token_list_.begin() + g.token_list_.size() - 1)); + + assert(token_list.size() <= g.token_list_.size()); + + std::swap(token_list, g.token_list_); + + return changes; + } + + const std::size_t stride_; + }; + + namespace helper + { + + inline void dump(const lexer::generator& generator) + { + for (std::size_t i = 0; i < generator.size(); ++i) + { + const lexer::token& t = generator[i]; + printf("Token[%02d] @ %03d %6s --> '%s'\n", + static_cast(i), + static_cast(t.position), + t.to_str(t.type).c_str(), + t.value.c_str()); + } + } + + class commutative_inserter : public lexer::token_inserter + { + public: + + using lexer::token_inserter::insert; + + commutative_inserter() + : lexer::token_inserter(2) + {} + + inline void ignore_symbol(const std::string& symbol) + { + ignore_set_.insert(symbol); + } + + inline int insert(const lexer::token& t0, const lexer::token& t1, lexer::token& new_token) exprtk_override + { + bool match = false; + new_token.type = lexer::token::e_mul; + new_token.value = "*"; + new_token.position = t1.position; + + if (t0.type == lexer::token::e_symbol) + { + if (ignore_set_.end() != ignore_set_.find(t0.value)) + { + return -1; + } + else if (!t0.value.empty() && ('$' == t0.value[0])) + { + return -1; + } + } + + if (t1.type == lexer::token::e_symbol) + { + if (ignore_set_.end() != ignore_set_.find(t1.value)) + { + return -1; + } + } + if ((t0.type == lexer::token::e_number ) && (t1.type == lexer::token::e_symbol )) match = true; + else if ((t0.type == lexer::token::e_number ) && (t1.type == lexer::token::e_lbracket )) match = true; + else if ((t0.type == lexer::token::e_number ) && (t1.type == lexer::token::e_lcrlbracket)) match = true; + else if ((t0.type == lexer::token::e_number ) && (t1.type == lexer::token::e_lsqrbracket)) match = true; + else if ((t0.type == lexer::token::e_symbol ) && (t1.type == lexer::token::e_number )) match = true; + else if ((t0.type == lexer::token::e_rbracket ) && (t1.type == lexer::token::e_number )) match = true; + else if ((t0.type == lexer::token::e_rcrlbracket) && (t1.type == lexer::token::e_number )) match = true; + else if ((t0.type == lexer::token::e_rsqrbracket) && (t1.type == lexer::token::e_number )) match = true; + else if ((t0.type == lexer::token::e_rbracket ) && (t1.type == lexer::token::e_symbol )) match = true; + else if ((t0.type == lexer::token::e_rcrlbracket) && (t1.type == lexer::token::e_symbol )) match = true; + else if ((t0.type == lexer::token::e_rsqrbracket) && (t1.type == lexer::token::e_symbol )) match = true; + else if ((t0.type == lexer::token::e_symbol ) && (t1.type == lexer::token::e_symbol )) match = true; + + return (match) ? 1 : -1; + } + + private: + + std::set ignore_set_; + }; + + class operator_joiner : public token_joiner + { + public: + + explicit operator_joiner(const std::size_t& stride) + : token_joiner(stride) + {} + + inline bool join(const lexer::token& t0, const lexer::token& t1, lexer::token& t) exprtk_override + { + // ': =' --> ':=' + if ((t0.type == lexer::token::e_colon) && (t1.type == lexer::token::e_eq)) + { + t.type = lexer::token::e_assign; + t.value = ":="; + t.position = t0.position; + + return true; + } + // '+ =' --> '+=' + else if ((t0.type == lexer::token::e_add) && (t1.type == lexer::token::e_eq)) + { + t.type = lexer::token::e_addass; + t.value = "+="; + t.position = t0.position; + + return true; + } + // '- =' --> '-=' + else if ((t0.type == lexer::token::e_sub) && (t1.type == lexer::token::e_eq)) + { + t.type = lexer::token::e_subass; + t.value = "-="; + t.position = t0.position; + + return true; + } + // '* =' --> '*=' + else if ((t0.type == lexer::token::e_mul) && (t1.type == lexer::token::e_eq)) + { + t.type = lexer::token::e_mulass; + t.value = "*="; + t.position = t0.position; + + return true; + } + // '/ =' --> '/=' + else if ((t0.type == lexer::token::e_div) && (t1.type == lexer::token::e_eq)) + { + t.type = lexer::token::e_divass; + t.value = "/="; + t.position = t0.position; + + return true; + } + // '% =' --> '%=' + else if ((t0.type == lexer::token::e_mod) && (t1.type == lexer::token::e_eq)) + { + t.type = lexer::token::e_modass; + t.value = "%="; + t.position = t0.position; + + return true; + } + // '> =' --> '>=' + else if ((t0.type == lexer::token::e_gt) && (t1.type == lexer::token::e_eq)) + { + t.type = lexer::token::e_gte; + t.value = ">="; + t.position = t0.position; + + return true; + } + // '< =' --> '<=' + else if ((t0.type == lexer::token::e_lt) && (t1.type == lexer::token::e_eq)) + { + t.type = lexer::token::e_lte; + t.value = "<="; + t.position = t0.position; + + return true; + } + // '= =' --> '==' + else if ((t0.type == lexer::token::e_eq) && (t1.type == lexer::token::e_eq)) + { + t.type = lexer::token::e_eq; + t.value = "=="; + t.position = t0.position; + + return true; + } + // '! =' --> '!=' + else if ((static_cast(t0.type) == '!') && (t1.type == lexer::token::e_eq)) + { + t.type = lexer::token::e_ne; + t.value = "!="; + t.position = t0.position; + + return true; + } + // '< >' --> '<>' + else if ((t0.type == lexer::token::e_lt) && (t1.type == lexer::token::e_gt)) + { + t.type = lexer::token::e_ne; + t.value = "<>"; + t.position = t0.position; + + return true; + } + // '<= >' --> '<=>' + else if ((t0.type == lexer::token::e_lte) && (t1.type == lexer::token::e_gt)) + { + t.type = lexer::token::e_swap; + t.value = "<=>"; + t.position = t0.position; + + return true; + } + // '+ -' --> '-' + else if ((t0.type == lexer::token::e_add) && (t1.type == lexer::token::e_sub)) + { + t.type = lexer::token::e_sub; + t.value = "-"; + t.position = t0.position; + + return true; + } + // '- +' --> '-' + else if ((t0.type == lexer::token::e_sub) && (t1.type == lexer::token::e_add)) + { + t.type = lexer::token::e_sub; + t.value = "-"; + t.position = t0.position; + + return true; + } + // '- -' --> '+' + else if ((t0.type == lexer::token::e_sub) && (t1.type == lexer::token::e_sub)) + { + /* + Note: May need to reconsider this when wanting to implement + pre/postfix decrement operator + */ + t.type = lexer::token::e_add; + t.value = "+"; + t.position = t0.position; + + return true; + } + else + return false; + } + + inline bool join(const lexer::token& t0, + const lexer::token& t1, + const lexer::token& t2, + lexer::token& t) exprtk_override + { + // '[ * ]' --> '[*]' + if ( + (t0.type == lexer::token::e_lsqrbracket) && + (t1.type == lexer::token::e_mul ) && + (t2.type == lexer::token::e_rsqrbracket) + ) + { + t.type = lexer::token::e_symbol; + t.value = "[*]"; + t.position = t0.position; + + return true; + } + else + return false; + } + }; + + class bracket_checker : public lexer::token_scanner + { + public: + + using lexer::token_scanner::operator(); + + bracket_checker() + : token_scanner(1) + , state_(true) + {} + + bool result() + { + if (!stack_.empty()) + { + lexer::token t; + t.value = stack_.top().first; + t.position = stack_.top().second; + error_token_ = t; + state_ = false; + + return false; + } + else + return state_; + } + + lexer::token error_token() + { + return error_token_; + } + + void reset() + { + // Why? because msvc doesn't support swap properly. + stack_ = std::stack >(); + state_ = true; + error_token_.clear(); + } + + bool operator() (const lexer::token& t) + { + if ( + !t.value.empty() && + (lexer::token::e_string != t.type) && + (lexer::token::e_symbol != t.type) && + exprtk::details::is_bracket(t.value[0]) + ) + { + details::char_t c = t.value[0]; + + if (t.type == lexer::token::e_lbracket ) stack_.push(std::make_pair(')',t.position)); + else if (t.type == lexer::token::e_lcrlbracket) stack_.push(std::make_pair('}',t.position)); + else if (t.type == lexer::token::e_lsqrbracket) stack_.push(std::make_pair(']',t.position)); + else if (exprtk::details::is_right_bracket(c)) + { + if (stack_.empty()) + { + state_ = false; + error_token_ = t; + + return false; + } + else if (c != stack_.top().first) + { + state_ = false; + error_token_ = t; + + return false; + } + else + stack_.pop(); + } + } + + return true; + } + + private: + + bool state_; + std::stack > stack_; + lexer::token error_token_; + }; + + template + class numeric_checker exprtk_final : public lexer::token_scanner + { + public: + + using lexer::token_scanner::operator(); + + numeric_checker() + : token_scanner (1) + , current_index_(0) + {} + + bool result() + { + return error_list_.empty(); + } + + void reset() + { + error_list_.clear(); + current_index_ = 0; + } + + bool operator() (const lexer::token& t) + { + if (token::e_number == t.type) + { + T v; + + if (!exprtk::details::string_to_real(t.value,v)) + { + error_list_.push_back(current_index_); + } + } + + ++current_index_; + + return true; + } + + std::size_t error_count() const + { + return error_list_.size(); + } + + std::size_t error_index(const std::size_t& i) + { + if (i < error_list_.size()) + return error_list_[i]; + else + return std::numeric_limits::max(); + } + + void clear_errors() + { + error_list_.clear(); + } + + private: + + std::size_t current_index_; + std::vector error_list_; + }; + + class symbol_replacer : public lexer::token_modifier + { + private: + + typedef std::map,details::ilesscompare> replace_map_t; + + public: + + bool remove(const std::string& target_symbol) + { + const replace_map_t::iterator itr = replace_map_.find(target_symbol); + + if (replace_map_.end() == itr) + return false; + + replace_map_.erase(itr); + + return true; + } + + bool add_replace(const std::string& target_symbol, + const std::string& replace_symbol, + const lexer::token::token_type token_type = lexer::token::e_symbol) + { + const replace_map_t::iterator itr = replace_map_.find(target_symbol); + + if (replace_map_.end() != itr) + { + return false; + } + + replace_map_[target_symbol] = std::make_pair(replace_symbol,token_type); + + return true; + } + + void clear() + { + replace_map_.clear(); + } + + private: + + bool modify(lexer::token& t) + { + if (lexer::token::e_symbol == t.type) + { + if (replace_map_.empty()) + return false; + + const replace_map_t::iterator itr = replace_map_.find(t.value); + + if (replace_map_.end() != itr) + { + t.value = itr->second.first; + t.type = itr->second.second; + + return true; + } + } + + return false; + } + + replace_map_t replace_map_; + }; + + class sequence_validator exprtk_final : public lexer::token_scanner + { + private: + + typedef std::pair token_pair_t; + typedef std::set set_t; + + public: + + using lexer::token_scanner::operator(); + + sequence_validator() + : lexer::token_scanner(2) + { + add_invalid(lexer::token::e_number, lexer::token::e_number); + add_invalid(lexer::token::e_string, lexer::token::e_string); + add_invalid(lexer::token::e_number, lexer::token::e_string); + add_invalid(lexer::token::e_string, lexer::token::e_number); + + add_invalid_set1(lexer::token::e_assign ); + add_invalid_set1(lexer::token::e_shr ); + add_invalid_set1(lexer::token::e_shl ); + add_invalid_set1(lexer::token::e_lte ); + add_invalid_set1(lexer::token::e_ne ); + add_invalid_set1(lexer::token::e_gte ); + add_invalid_set1(lexer::token::e_lt ); + add_invalid_set1(lexer::token::e_gt ); + add_invalid_set1(lexer::token::e_eq ); + add_invalid_set1(lexer::token::e_comma ); + add_invalid_set1(lexer::token::e_add ); + add_invalid_set1(lexer::token::e_sub ); + add_invalid_set1(lexer::token::e_div ); + add_invalid_set1(lexer::token::e_mul ); + add_invalid_set1(lexer::token::e_mod ); + add_invalid_set1(lexer::token::e_pow ); + add_invalid_set1(lexer::token::e_colon ); + add_invalid_set1(lexer::token::e_ternary); + } + + bool result() + { + return error_list_.empty(); + } + + bool operator() (const lexer::token& t0, const lexer::token& t1) + { + const set_t::value_type p = std::make_pair(t0.type,t1.type); + + if (invalid_bracket_check(t0.type,t1.type)) + { + error_list_.push_back(std::make_pair(t0,t1)); + } + else if (invalid_comb_.find(p) != invalid_comb_.end()) + { + error_list_.push_back(std::make_pair(t0,t1)); + } + + return true; + } + + std::size_t error_count() const + { + return error_list_.size(); + } + + std::pair error(const std::size_t index) + { + if (index < error_list_.size()) + { + return error_list_[index]; + } + else + { + static const lexer::token error_token; + return std::make_pair(error_token,error_token); + } + } + + void clear_errors() + { + error_list_.clear(); + } + + private: + + void add_invalid(const lexer::token::token_type base, const lexer::token::token_type t) + { + invalid_comb_.insert(std::make_pair(base,t)); + } + + void add_invalid_set1(const lexer::token::token_type t) + { + add_invalid(t, lexer::token::e_assign); + add_invalid(t, lexer::token::e_shr ); + add_invalid(t, lexer::token::e_shl ); + add_invalid(t, lexer::token::e_lte ); + add_invalid(t, lexer::token::e_ne ); + add_invalid(t, lexer::token::e_gte ); + add_invalid(t, lexer::token::e_lt ); + add_invalid(t, lexer::token::e_gt ); + add_invalid(t, lexer::token::e_eq ); + add_invalid(t, lexer::token::e_comma ); + add_invalid(t, lexer::token::e_div ); + add_invalid(t, lexer::token::e_mul ); + add_invalid(t, lexer::token::e_mod ); + add_invalid(t, lexer::token::e_pow ); + add_invalid(t, lexer::token::e_colon ); + } + + bool invalid_bracket_check(const lexer::token::token_type base, const lexer::token::token_type t) + { + if (details::is_right_bracket(static_cast(base))) + { + switch (t) + { + case lexer::token::e_assign : return (']' != base); + case lexer::token::e_string : return (')' != base); + default : return false; + } + } + else if (details::is_left_bracket(static_cast(base))) + { + if (details::is_right_bracket(static_cast(t))) + return false; + else if (details::is_left_bracket(static_cast(t))) + return false; + else + { + switch (t) + { + case lexer::token::e_number : return false; + case lexer::token::e_symbol : return false; + case lexer::token::e_string : return false; + case lexer::token::e_add : return false; + case lexer::token::e_sub : return false; + case lexer::token::e_colon : return false; + case lexer::token::e_ternary : return false; + default : return true ; + } + } + } + else if (details::is_right_bracket(static_cast(t))) + { + switch (base) + { + case lexer::token::e_number : return false; + case lexer::token::e_symbol : return false; + case lexer::token::e_string : return false; + case lexer::token::e_eof : return false; + case lexer::token::e_colon : return false; + case lexer::token::e_ternary : return false; + default : return true ; + } + } + else if (details::is_left_bracket(static_cast(t))) + { + switch (base) + { + case lexer::token::e_rbracket : return true; + case lexer::token::e_rsqrbracket : return true; + case lexer::token::e_rcrlbracket : return true; + default : return false; + } + } + + return false; + } + + set_t invalid_comb_; + std::vector > error_list_; + }; + + class sequence_validator_3tokens exprtk_final : public lexer::token_scanner + { + private: + + typedef lexer::token::token_type token_t; + typedef std::pair > token_triplet_t; + typedef std::set set_t; + + public: + + using lexer::token_scanner::operator(); + + sequence_validator_3tokens() + : lexer::token_scanner(3) + { + add_invalid(lexer::token::e_number , lexer::token::e_number , lexer::token::e_number); + add_invalid(lexer::token::e_string , lexer::token::e_string , lexer::token::e_string); + add_invalid(lexer::token::e_comma , lexer::token::e_comma , lexer::token::e_comma ); + + add_invalid(lexer::token::e_add , lexer::token::e_add , lexer::token::e_add ); + add_invalid(lexer::token::e_sub , lexer::token::e_sub , lexer::token::e_sub ); + add_invalid(lexer::token::e_div , lexer::token::e_div , lexer::token::e_div ); + add_invalid(lexer::token::e_mul , lexer::token::e_mul , lexer::token::e_mul ); + add_invalid(lexer::token::e_mod , lexer::token::e_mod , lexer::token::e_mod ); + add_invalid(lexer::token::e_pow , lexer::token::e_pow , lexer::token::e_pow ); + + add_invalid(lexer::token::e_add , lexer::token::e_sub , lexer::token::e_add ); + add_invalid(lexer::token::e_sub , lexer::token::e_add , lexer::token::e_sub ); + add_invalid(lexer::token::e_div , lexer::token::e_mul , lexer::token::e_div ); + add_invalid(lexer::token::e_mul , lexer::token::e_div , lexer::token::e_mul ); + add_invalid(lexer::token::e_mod , lexer::token::e_pow , lexer::token::e_mod ); + add_invalid(lexer::token::e_pow , lexer::token::e_mod , lexer::token::e_pow ); + } + + bool result() + { + return error_list_.empty(); + } + + bool operator() (const lexer::token& t0, const lexer::token& t1, const lexer::token& t2) + { + const set_t::value_type p = std::make_pair(t0.type,std::make_pair(t1.type,t2.type)); + + if (invalid_comb_.find(p) != invalid_comb_.end()) + { + error_list_.push_back(std::make_pair(t0,t1)); + } + + return true; + } + + std::size_t error_count() const + { + return error_list_.size(); + } + + std::pair error(const std::size_t index) + { + if (index < error_list_.size()) + { + return error_list_[index]; + } + else + { + static const lexer::token error_token; + return std::make_pair(error_token,error_token); + } + } + + void clear_errors() + { + error_list_.clear(); + } + + private: + + void add_invalid(const token_t t0, const token_t t1, const token_t t2) + { + invalid_comb_.insert(std::make_pair(t0,std::make_pair(t1,t2))); + } + + set_t invalid_comb_; + std::vector > error_list_; + }; + + struct helper_assembly + { + inline bool register_scanner(lexer::token_scanner* scanner) + { + if (token_scanner_list.end() != std::find(token_scanner_list.begin(), + token_scanner_list.end (), + scanner)) + { + return false; + } + + token_scanner_list.push_back(scanner); + + return true; + } + + inline bool register_modifier(lexer::token_modifier* modifier) + { + if (token_modifier_list.end() != std::find(token_modifier_list.begin(), + token_modifier_list.end (), + modifier)) + { + return false; + } + + token_modifier_list.push_back(modifier); + + return true; + } + + inline bool register_joiner(lexer::token_joiner* joiner) + { + if (token_joiner_list.end() != std::find(token_joiner_list.begin(), + token_joiner_list.end (), + joiner)) + { + return false; + } + + token_joiner_list.push_back(joiner); + + return true; + } + + inline bool register_inserter(lexer::token_inserter* inserter) + { + if (token_inserter_list.end() != std::find(token_inserter_list.begin(), + token_inserter_list.end (), + inserter)) + { + return false; + } + + token_inserter_list.push_back(inserter); + + return true; + } + + inline bool run_modifiers(lexer::generator& g) + { + error_token_modifier = reinterpret_cast(0); + + for (std::size_t i = 0; i < token_modifier_list.size(); ++i) + { + lexer::token_modifier& modifier = (*token_modifier_list[i]); + + modifier.reset(); + modifier.process(g); + + if (!modifier.result()) + { + error_token_modifier = token_modifier_list[i]; + + return false; + } + } + + return true; + } + + inline bool run_joiners(lexer::generator& g) + { + error_token_joiner = reinterpret_cast(0); + + for (std::size_t i = 0; i < token_joiner_list.size(); ++i) + { + lexer::token_joiner& joiner = (*token_joiner_list[i]); + + joiner.reset(); + joiner.process(g); + + if (!joiner.result()) + { + error_token_joiner = token_joiner_list[i]; + + return false; + } + } + + return true; + } + + inline bool run_inserters(lexer::generator& g) + { + error_token_inserter = reinterpret_cast(0); + + for (std::size_t i = 0; i < token_inserter_list.size(); ++i) + { + lexer::token_inserter& inserter = (*token_inserter_list[i]); + + inserter.reset(); + inserter.process(g); + + if (!inserter.result()) + { + error_token_inserter = token_inserter_list[i]; + + return false; + } + } + + return true; + } + + inline bool run_scanners(lexer::generator& g) + { + error_token_scanner = reinterpret_cast(0); + + for (std::size_t i = 0; i < token_scanner_list.size(); ++i) + { + lexer::token_scanner& scanner = (*token_scanner_list[i]); + + scanner.reset(); + scanner.process(g); + + if (!scanner.result()) + { + error_token_scanner = token_scanner_list[i]; + + return false; + } + } + + return true; + } + + std::vector token_scanner_list; + std::vector token_modifier_list; + std::vector token_joiner_list; + std::vector token_inserter_list; + + lexer::token_scanner* error_token_scanner; + lexer::token_modifier* error_token_modifier; + lexer::token_joiner* error_token_joiner; + lexer::token_inserter* error_token_inserter; + }; + } + + class parser_helper + { + public: + + typedef token token_t; + typedef generator generator_t; + + inline bool init(const std::string& str) + { + if (!lexer_.process(str)) + { + return false; + } + + lexer_.begin(); + + next_token(); + + return true; + } + + inline generator_t& lexer() + { + return lexer_; + } + + inline const generator_t& lexer() const + { + return lexer_; + } + + inline void store_token() + { + lexer_.store(); + store_current_token_ = current_token_; + } + + inline void restore_token() + { + lexer_.restore(); + current_token_ = store_current_token_; + } + + inline void next_token() + { + current_token_ = lexer_.next_token(); + } + + inline const token_t& current_token() const + { + return current_token_; + } + + enum token_advance_mode + { + e_hold = 0, + e_advance = 1 + }; + + inline void advance_token(const token_advance_mode mode) + { + if (e_advance == mode) + { + next_token(); + } + } + + inline bool token_is(const token_t::token_type& ttype, const token_advance_mode mode = e_advance) + { + if (current_token().type != ttype) + { + return false; + } + + advance_token(mode); + + return true; + } + + inline bool token_is(const token_t::token_type& ttype, + const std::string& value, + const token_advance_mode mode = e_advance) + { + if ( + (current_token().type != ttype) || + !exprtk::details::imatch(value,current_token().value) + ) + { + return false; + } + + advance_token(mode); + + return true; + } + + inline bool peek_token_is(const token_t::token_type& ttype) + { + return (lexer_.peek_next_token().type == ttype); + } + + inline bool peek_token_is(const std::string& s) + { + return (exprtk::details::imatch(lexer_.peek_next_token().value,s)); + } + + private: + + generator_t lexer_; + token_t current_token_; + token_t store_current_token_; + }; + } + + template + class vector_view + { + public: + + typedef T* data_ptr_t; + + vector_view(data_ptr_t data, const std::size_t& size) + : size_(size) + , data_(data) + , data_ref_(0) + {} + + vector_view(const vector_view& vv) + : size_(vv.size_) + , data_(vv.data_) + , data_ref_(0) + {} + + inline void rebase(data_ptr_t data) + { + data_ = data; + + if (!data_ref_.empty()) + { + for (std::size_t i = 0; i < data_ref_.size(); ++i) + { + (*data_ref_[i]) = data; + } + } + } + + inline data_ptr_t data() const + { + return data_; + } + + inline std::size_t size() const + { + return size_; + } + + inline const T& operator[](const std::size_t index) const + { + return data_[index]; + } + + inline T& operator[](const std::size_t index) + { + return data_[index]; + } + + void set_ref(data_ptr_t* data_ref) + { + data_ref_.push_back(data_ref); + } + + private: + + const std::size_t size_; + data_ptr_t data_; + std::vector data_ref_; + }; + + template + inline vector_view make_vector_view(T* data, + const std::size_t size, const std::size_t offset = 0) + { + return vector_view(data + offset, size); + } + + template + inline vector_view make_vector_view(std::vector& v, + const std::size_t size, const std::size_t offset = 0) + { + return vector_view(v.data() + offset, size); + } + + template class results_context; + + template + struct type_store + { + enum store_type + { + e_unknown, + e_scalar , + e_vector , + e_string + }; + + type_store() + : data(0) + , size(0) + , type(e_unknown) + {} + + union + { + void* data; + T* vec_data; + }; + + std::size_t size; + store_type type; + + class parameter_list + { + public: + + explicit parameter_list(std::vector& pl) + : parameter_list_(pl) + {} + + inline bool empty() const + { + return parameter_list_.empty(); + } + + inline std::size_t size() const + { + return parameter_list_.size(); + } + + inline type_store& operator[](const std::size_t& index) + { + return parameter_list_[index]; + } + + inline const type_store& operator[](const std::size_t& index) const + { + return parameter_list_[index]; + } + + inline type_store& front() + { + return parameter_list_[0]; + } + + inline const type_store& front() const + { + return parameter_list_[0]; + } + + inline type_store& back() + { + return parameter_list_.back(); + } + + inline const type_store& back() const + { + return parameter_list_.back(); + } + + private: + + std::vector& parameter_list_; + + friend class results_context; + }; + + template + struct type_view + { + typedef type_store type_store_t; + typedef ViewType value_t; + + explicit type_view(type_store_t& ts) + : ts_(ts) + , data_(reinterpret_cast(ts_.data)) + {} + + explicit type_view(const type_store_t& ts) + : ts_(const_cast(ts)) + , data_(reinterpret_cast(ts_.data)) + {} + + inline std::size_t size() const + { + return ts_.size; + } + + inline value_t& operator[](const std::size_t& i) + { + return data_[i]; + } + + inline const value_t& operator[](const std::size_t& i) const + { + return data_[i]; + } + + inline const value_t* begin() const { return data_; } + inline value_t* begin() { return data_; } + + inline const value_t* end() const + { + return static_cast(data_ + ts_.size); + } + + inline value_t* end() + { + return static_cast(data_ + ts_.size); + } + + type_store_t& ts_; + value_t* data_; + }; + + typedef type_view vector_view; + typedef type_view string_view; + + struct scalar_view + { + typedef type_store type_store_t; + typedef T value_t; + + explicit scalar_view(type_store_t& ts) + : v_(*reinterpret_cast(ts.data)) + {} + + explicit scalar_view(const type_store_t& ts) + : v_(*reinterpret_cast(const_cast(ts).data)) + {} + + inline value_t& operator() () + { + return v_; + } + + inline const value_t& operator() () const + { + return v_; + } + + template + inline bool to_int(IntType& i) const + { + if (!exprtk::details::numeric::is_integer(v_)) + return false; + + i = static_cast(v_); + + return true; + } + + template + inline bool to_uint(UIntType& u) const + { + if (v_ < T(0)) + return false; + else if (!exprtk::details::numeric::is_integer(v_)) + return false; + + u = static_cast(v_); + + return true; + } + + T& v_; + }; + }; + + template + inline std::string to_str(const StringView& view) + { + return std::string(view.begin(),view.size()); + } + + #ifndef exprtk_disable_return_statement + namespace details + { + template class return_node; + template class return_envelope_node; + } + #endif + + template + class results_context + { + public: + + typedef type_store type_store_t; + + results_context() + : results_available_(false) + {} + + inline std::size_t count() const + { + if (results_available_) + return parameter_list_.size(); + else + return 0; + } + + inline type_store_t& operator[](const std::size_t& index) + { + return parameter_list_[index]; + } + + inline const type_store_t& operator[](const std::size_t& index) const + { + return parameter_list_[index]; + } + + private: + + inline void clear() + { + results_available_ = false; + } + + typedef std::vector ts_list_t; + typedef typename type_store_t::parameter_list parameter_list_t; + + inline void assign(const parameter_list_t& pl) + { + parameter_list_ = pl.parameter_list_; + results_available_ = true; + } + + bool results_available_; + ts_list_t parameter_list_; + + #ifndef exprtk_disable_return_statement + friend class details::return_node; + friend class details::return_envelope_node; + #endif + }; + + namespace details + { + enum operator_type + { + e_default , e_null , e_add , e_sub , + e_mul , e_div , e_mod , e_pow , + e_atan2 , e_min , e_max , e_avg , + e_sum , e_prod , e_lt , e_lte , + e_eq , e_equal , e_ne , e_nequal , + e_gte , e_gt , e_and , e_nand , + e_or , e_nor , e_xor , e_xnor , + e_mand , e_mor , e_scand , e_scor , + e_shr , e_shl , e_abs , e_acos , + e_acosh , e_asin , e_asinh , e_atan , + e_atanh , e_ceil , e_cos , e_cosh , + e_exp , e_expm1 , e_floor , e_log , + e_log10 , e_log2 , e_log1p , e_logn , + e_neg , e_pos , e_round , e_roundn , + e_root , e_sqrt , e_sin , e_sinc , + e_sinh , e_sec , e_csc , e_tan , + e_tanh , e_cot , e_clamp , e_iclamp , + e_inrange , e_sgn , e_r2d , e_d2r , + e_d2g , e_g2d , e_hypot , e_notl , + e_erf , e_erfc , e_ncdf , e_frac , + e_trunc , e_assign , e_addass , e_subass , + e_mulass , e_divass , e_modass , e_in , + e_like , e_ilike , e_multi , e_smulti , + e_swap , + + // Do not add new functions/operators after this point. + e_sf00 = 1000, e_sf01 = 1001, e_sf02 = 1002, e_sf03 = 1003, + e_sf04 = 1004, e_sf05 = 1005, e_sf06 = 1006, e_sf07 = 1007, + e_sf08 = 1008, e_sf09 = 1009, e_sf10 = 1010, e_sf11 = 1011, + e_sf12 = 1012, e_sf13 = 1013, e_sf14 = 1014, e_sf15 = 1015, + e_sf16 = 1016, e_sf17 = 1017, e_sf18 = 1018, e_sf19 = 1019, + e_sf20 = 1020, e_sf21 = 1021, e_sf22 = 1022, e_sf23 = 1023, + e_sf24 = 1024, e_sf25 = 1025, e_sf26 = 1026, e_sf27 = 1027, + e_sf28 = 1028, e_sf29 = 1029, e_sf30 = 1030, e_sf31 = 1031, + e_sf32 = 1032, e_sf33 = 1033, e_sf34 = 1034, e_sf35 = 1035, + e_sf36 = 1036, e_sf37 = 1037, e_sf38 = 1038, e_sf39 = 1039, + e_sf40 = 1040, e_sf41 = 1041, e_sf42 = 1042, e_sf43 = 1043, + e_sf44 = 1044, e_sf45 = 1045, e_sf46 = 1046, e_sf47 = 1047, + e_sf48 = 1048, e_sf49 = 1049, e_sf50 = 1050, e_sf51 = 1051, + e_sf52 = 1052, e_sf53 = 1053, e_sf54 = 1054, e_sf55 = 1055, + e_sf56 = 1056, e_sf57 = 1057, e_sf58 = 1058, e_sf59 = 1059, + e_sf60 = 1060, e_sf61 = 1061, e_sf62 = 1062, e_sf63 = 1063, + e_sf64 = 1064, e_sf65 = 1065, e_sf66 = 1066, e_sf67 = 1067, + e_sf68 = 1068, e_sf69 = 1069, e_sf70 = 1070, e_sf71 = 1071, + e_sf72 = 1072, e_sf73 = 1073, e_sf74 = 1074, e_sf75 = 1075, + e_sf76 = 1076, e_sf77 = 1077, e_sf78 = 1078, e_sf79 = 1079, + e_sf80 = 1080, e_sf81 = 1081, e_sf82 = 1082, e_sf83 = 1083, + e_sf84 = 1084, e_sf85 = 1085, e_sf86 = 1086, e_sf87 = 1087, + e_sf88 = 1088, e_sf89 = 1089, e_sf90 = 1090, e_sf91 = 1091, + e_sf92 = 1092, e_sf93 = 1093, e_sf94 = 1094, e_sf95 = 1095, + e_sf96 = 1096, e_sf97 = 1097, e_sf98 = 1098, e_sf99 = 1099, + e_sffinal = 1100, + e_sf4ext00 = 2000, e_sf4ext01 = 2001, e_sf4ext02 = 2002, e_sf4ext03 = 2003, + e_sf4ext04 = 2004, e_sf4ext05 = 2005, e_sf4ext06 = 2006, e_sf4ext07 = 2007, + e_sf4ext08 = 2008, e_sf4ext09 = 2009, e_sf4ext10 = 2010, e_sf4ext11 = 2011, + e_sf4ext12 = 2012, e_sf4ext13 = 2013, e_sf4ext14 = 2014, e_sf4ext15 = 2015, + e_sf4ext16 = 2016, e_sf4ext17 = 2017, e_sf4ext18 = 2018, e_sf4ext19 = 2019, + e_sf4ext20 = 2020, e_sf4ext21 = 2021, e_sf4ext22 = 2022, e_sf4ext23 = 2023, + e_sf4ext24 = 2024, e_sf4ext25 = 2025, e_sf4ext26 = 2026, e_sf4ext27 = 2027, + e_sf4ext28 = 2028, e_sf4ext29 = 2029, e_sf4ext30 = 2030, e_sf4ext31 = 2031, + e_sf4ext32 = 2032, e_sf4ext33 = 2033, e_sf4ext34 = 2034, e_sf4ext35 = 2035, + e_sf4ext36 = 2036, e_sf4ext37 = 2037, e_sf4ext38 = 2038, e_sf4ext39 = 2039, + e_sf4ext40 = 2040, e_sf4ext41 = 2041, e_sf4ext42 = 2042, e_sf4ext43 = 2043, + e_sf4ext44 = 2044, e_sf4ext45 = 2045, e_sf4ext46 = 2046, e_sf4ext47 = 2047, + e_sf4ext48 = 2048, e_sf4ext49 = 2049, e_sf4ext50 = 2050, e_sf4ext51 = 2051, + e_sf4ext52 = 2052, e_sf4ext53 = 2053, e_sf4ext54 = 2054, e_sf4ext55 = 2055, + e_sf4ext56 = 2056, e_sf4ext57 = 2057, e_sf4ext58 = 2058, e_sf4ext59 = 2059, + e_sf4ext60 = 2060, e_sf4ext61 = 2061 + }; + + inline std::string to_str(const operator_type opr) + { + switch (opr) + { + case e_add : return "+" ; + case e_sub : return "-" ; + case e_mul : return "*" ; + case e_div : return "/" ; + case e_mod : return "%" ; + case e_pow : return "^" ; + case e_assign : return ":=" ; + case e_addass : return "+=" ; + case e_subass : return "-=" ; + case e_mulass : return "*=" ; + case e_divass : return "/=" ; + case e_modass : return "%=" ; + case e_lt : return "<" ; + case e_lte : return "<=" ; + case e_eq : return "==" ; + case e_equal : return "=" ; + case e_ne : return "!=" ; + case e_nequal : return "<>" ; + case e_gte : return ">=" ; + case e_gt : return ">" ; + case e_and : return "and" ; + case e_or : return "or" ; + case e_xor : return "xor" ; + case e_nand : return "nand"; + case e_nor : return "nor" ; + case e_xnor : return "xnor"; + default : return "N/A" ; + } + } + + struct base_operation_t + { + base_operation_t(const operator_type t, const unsigned int& np) + : type(t) + , num_params(np) + {} + + operator_type type; + unsigned int num_params; + }; + + namespace loop_unroll + { + #ifndef exprtk_disable_superscalar_unroll + const unsigned int global_loop_batch_size = 16; + #else + const unsigned int global_loop_batch_size = 4; + #endif + + struct details + { + explicit details(const std::size_t& vsize, + const unsigned int loop_batch_size = global_loop_batch_size) + : batch_size(loop_batch_size ) + , remainder (vsize % batch_size) + , upper_bound(static_cast(vsize - (remainder ? loop_batch_size : 0))) + {} + + unsigned int batch_size; + int remainder; + int upper_bound; + }; + } + + #ifdef exprtk_enable_debugging + inline void dump_ptr(const std::string& s, const void* ptr, const std::size_t size = 0) + { + if (size) + exprtk_debug(("%s - addr: %p size: %d\n", + s.c_str(), + ptr, + static_cast(size))); + else + exprtk_debug(("%s - addr: %p\n",s.c_str(),ptr)); + } + #else + inline void dump_ptr(const std::string&, const void*) {} + inline void dump_ptr(const std::string&, const void*, const std::size_t) {} + #endif + + template + class vec_data_store + { + public: + + typedef vec_data_store type; + typedef T* data_t; + + private: + + struct control_block + { + control_block() + : ref_count(1) + , size (0) + , data (0) + , destruct (true) + {} + + explicit control_block(const std::size_t& dsize) + : ref_count(1 ) + , size (dsize) + , data (0 ) + , destruct (true ) + { create_data(); } + + control_block(const std::size_t& dsize, data_t dptr, bool dstrct = false) + : ref_count(1 ) + , size (dsize ) + , data (dptr ) + , destruct (dstrct) + {} + + ~control_block() + { + if (data && destruct && (0 == ref_count)) + { + dump_ptr("~control_block() data",data); + delete[] data; + data = reinterpret_cast(0); + } + } + + static inline control_block* create(const std::size_t& dsize, data_t data_ptr = data_t(0), bool dstrct = false) + { + if (dsize) + { + if (0 == data_ptr) + return (new control_block(dsize)); + else + return (new control_block(dsize, data_ptr, dstrct)); + } + else + return (new control_block); + } + + static inline void destroy(control_block*& cntrl_blck) + { + if (cntrl_blck) + { + if ( + (0 != cntrl_blck->ref_count) && + (0 == --cntrl_blck->ref_count) + ) + { + delete cntrl_blck; + } + + cntrl_blck = 0; + } + } + + std::size_t ref_count; + std::size_t size; + data_t data; + bool destruct; + + private: + + control_block(const control_block&) exprtk_delete; + control_block& operator=(const control_block&) exprtk_delete; + + inline void create_data() + { + destruct = true; + data = new T[size]; + std::fill_n(data, size, T(0)); + dump_ptr("control_block::create_data() - data", data, size); + } + }; + + public: + + vec_data_store() + : control_block_(control_block::create(0)) + {} + + explicit vec_data_store(const std::size_t& size) + : control_block_(control_block::create(size,reinterpret_cast(0),true)) + {} + + vec_data_store(const std::size_t& size, data_t data, bool dstrct = false) + : control_block_(control_block::create(size, data, dstrct)) + {} + + vec_data_store(const type& vds) + { + control_block_ = vds.control_block_; + control_block_->ref_count++; + } + + ~vec_data_store() + { + control_block::destroy(control_block_); + } + + type& operator=(const type& vds) + { + if (this != &vds) + { + std::size_t final_size = min_size(control_block_, vds.control_block_); + + vds.control_block_->size = final_size; + control_block_->size = final_size; + + if (control_block_->destruct || (0 == control_block_->data)) + { + control_block::destroy(control_block_); + + control_block_ = vds.control_block_; + control_block_->ref_count++; + } + } + + return (*this); + } + + inline data_t data() + { + return control_block_->data; + } + + inline data_t data() const + { + return control_block_->data; + } + + inline std::size_t size() const + { + return control_block_->size; + } + + inline data_t& ref() + { + return control_block_->data; + } + + inline void dump() const + { + #ifdef exprtk_enable_debugging + exprtk_debug(("size: %d\taddress:%p\tdestruct:%c\n", + size(), + data(), + (control_block_->destruct ? 'T' : 'F'))); + + for (std::size_t i = 0; i < size(); ++i) + { + if (5 == i) + exprtk_debug(("\n")); + + exprtk_debug(("%15.10f ",data()[i])); + } + exprtk_debug(("\n")); + #endif + } + + static inline void match_sizes(type& vds0, type& vds1) + { + const std::size_t size = min_size(vds0.control_block_,vds1.control_block_); + vds0.control_block_->size = size; + vds1.control_block_->size = size; + } + + private: + + static inline std::size_t min_size(const control_block* cb0, const control_block* cb1) + { + const std::size_t size0 = cb0->size; + const std::size_t size1 = cb1->size; + + if (size0 && size1) + return std::min(size0,size1); + else + return (size0) ? size0 : size1; + } + + control_block* control_block_; + }; + + namespace numeric + { + namespace details + { + template + inline T process_impl(const operator_type operation, const T arg) + { + switch (operation) + { + case e_abs : return numeric::abs (arg); + case e_acos : return numeric::acos (arg); + case e_acosh : return numeric::acosh(arg); + case e_asin : return numeric::asin (arg); + case e_asinh : return numeric::asinh(arg); + case e_atan : return numeric::atan (arg); + case e_atanh : return numeric::atanh(arg); + case e_ceil : return numeric::ceil (arg); + case e_cos : return numeric::cos (arg); + case e_cosh : return numeric::cosh (arg); + case e_exp : return numeric::exp (arg); + case e_expm1 : return numeric::expm1(arg); + case e_floor : return numeric::floor(arg); + case e_log : return numeric::log (arg); + case e_log10 : return numeric::log10(arg); + case e_log2 : return numeric::log2 (arg); + case e_log1p : return numeric::log1p(arg); + case e_neg : return numeric::neg (arg); + case e_pos : return numeric::pos (arg); + case e_round : return numeric::round(arg); + case e_sin : return numeric::sin (arg); + case e_sinc : return numeric::sinc (arg); + case e_sinh : return numeric::sinh (arg); + case e_sqrt : return numeric::sqrt (arg); + case e_tan : return numeric::tan (arg); + case e_tanh : return numeric::tanh (arg); + case e_cot : return numeric::cot (arg); + case e_sec : return numeric::sec (arg); + case e_csc : return numeric::csc (arg); + case e_r2d : return numeric::r2d (arg); + case e_d2r : return numeric::d2r (arg); + case e_d2g : return numeric::d2g (arg); + case e_g2d : return numeric::g2d (arg); + case e_notl : return numeric::notl (arg); + case e_sgn : return numeric::sgn (arg); + case e_erf : return numeric::erf (arg); + case e_erfc : return numeric::erfc (arg); + case e_ncdf : return numeric::ncdf (arg); + case e_frac : return numeric::frac (arg); + case e_trunc : return numeric::trunc(arg); + + default : exprtk_debug(("numeric::details::process_impl - Invalid unary operation.\n")); + return std::numeric_limits::quiet_NaN(); + } + } + + template + inline T process_impl(const operator_type operation, const T arg0, const T arg1) + { + switch (operation) + { + case e_add : return (arg0 + arg1); + case e_sub : return (arg0 - arg1); + case e_mul : return (arg0 * arg1); + case e_div : return (arg0 / arg1); + case e_mod : return modulus(arg0,arg1); + case e_pow : return pow(arg0,arg1); + case e_atan2 : return atan2(arg0,arg1); + case e_min : return std::min(arg0,arg1); + case e_max : return std::max(arg0,arg1); + case e_logn : return logn(arg0,arg1); + case e_lt : return (arg0 < arg1) ? T(1) : T(0); + case e_lte : return (arg0 <= arg1) ? T(1) : T(0); + case e_eq : return std::equal_to()(arg0,arg1) ? T(1) : T(0); + case e_ne : return std::not_equal_to()(arg0,arg1) ? T(1) : T(0); + case e_gte : return (arg0 >= arg1) ? T(1) : T(0); + case e_gt : return (arg0 > arg1) ? T(1) : T(0); + case e_and : return and_opr (arg0,arg1); + case e_nand : return nand_opr(arg0,arg1); + case e_or : return or_opr (arg0,arg1); + case e_nor : return nor_opr (arg0,arg1); + case e_xor : return xor_opr (arg0,arg1); + case e_xnor : return xnor_opr(arg0,arg1); + case e_root : return root (arg0,arg1); + case e_roundn : return roundn (arg0,arg1); + case e_equal : return equal (arg0,arg1); + case e_nequal : return nequal (arg0,arg1); + case e_hypot : return hypot (arg0,arg1); + case e_shr : return shr (arg0,arg1); + case e_shl : return shl (arg0,arg1); + + default : exprtk_debug(("numeric::details::process_impl - Invalid binary operation.\n")); + return std::numeric_limits::quiet_NaN(); + } + } + + template + inline T process_impl(const operator_type operation, const T arg0, const T arg1, int_type_tag) + { + switch (operation) + { + case e_add : return (arg0 + arg1); + case e_sub : return (arg0 - arg1); + case e_mul : return (arg0 * arg1); + case e_div : return (arg0 / arg1); + case e_mod : return arg0 % arg1; + case e_pow : return pow(arg0,arg1); + case e_min : return std::min(arg0,arg1); + case e_max : return std::max(arg0,arg1); + case e_logn : return logn(arg0,arg1); + case e_lt : return (arg0 < arg1) ? T(1) : T(0); + case e_lte : return (arg0 <= arg1) ? T(1) : T(0); + case e_eq : return (arg0 == arg1) ? T(1) : T(0); + case e_ne : return (arg0 != arg1) ? T(1) : T(0); + case e_gte : return (arg0 >= arg1) ? T(1) : T(0); + case e_gt : return (arg0 > arg1) ? T(1) : T(0); + case e_and : return ((arg0 != T(0)) && (arg1 != T(0))) ? T(1) : T(0); + case e_nand : return ((arg0 != T(0)) && (arg1 != T(0))) ? T(0) : T(1); + case e_or : return ((arg0 != T(0)) || (arg1 != T(0))) ? T(1) : T(0); + case e_nor : return ((arg0 != T(0)) || (arg1 != T(0))) ? T(0) : T(1); + case e_xor : return arg0 ^ arg1; + case e_xnor : return !(arg0 ^ arg1); + case e_root : return root(arg0,arg1); + case e_equal : return arg0 == arg1; + case e_nequal : return arg0 != arg1; + case e_hypot : return hypot(arg0,arg1); + case e_shr : return arg0 >> arg1; + case e_shl : return arg0 << arg1; + + default : exprtk_debug(("numeric::details::process_impl - Invalid binary operation.\n")); + return std::numeric_limits::quiet_NaN(); + } + } + } + + template + inline T process(const operator_type operation, const T arg) + { + return exprtk::details::numeric::details::process_impl(operation,arg); + } + + template + inline T process(const operator_type operation, const T arg0, const T arg1) + { + return exprtk::details::numeric::details::process_impl(operation, arg0, arg1); + } + } + + template + struct node_collector_interface + { + typedef Node* node_ptr_t; + typedef Node** node_pp_t; + typedef std::vector noderef_list_t; + + virtual ~node_collector_interface() {} + + virtual void collect_nodes(noderef_list_t&) {} + }; + + template + struct node_depth_base; + + template + class expression_node : public node_collector_interface >, + public node_depth_base > + { + public: + + enum node_type + { + e_none , e_null , e_constant , e_unary , + e_binary , e_binary_ext , e_trinary , e_quaternary , + e_vararg , e_conditional , e_while , e_repeat , + e_for , e_switch , e_mswitch , e_return , + e_retenv , e_variable , e_stringvar , e_stringconst , + e_stringvarrng , e_cstringvarrng , e_strgenrange , e_strconcat , + e_stringvarsize , e_strswap , e_stringsize , e_stringvararg , + e_function , e_vafunction , e_genfunction , e_strfunction , + e_strcondition , e_strccondition , e_add , e_sub , + e_mul , e_div , e_mod , e_pow , + e_lt , e_lte , e_gt , e_gte , + e_eq , e_ne , e_and , e_nand , + e_or , e_nor , e_xor , e_xnor , + e_in , e_like , e_ilike , e_inranges , + e_ipow , e_ipowinv , e_abs , e_acos , + e_acosh , e_asin , e_asinh , e_atan , + e_atanh , e_ceil , e_cos , e_cosh , + e_exp , e_expm1 , e_floor , e_log , + e_log10 , e_log2 , e_log1p , e_neg , + e_pos , e_round , e_sin , e_sinc , + e_sinh , e_sqrt , e_tan , e_tanh , + e_cot , e_sec , e_csc , e_r2d , + e_d2r , e_d2g , e_g2d , e_notl , + e_sgn , e_erf , e_erfc , e_ncdf , + e_frac , e_trunc , e_uvouv , e_vov , + e_cov , e_voc , e_vob , e_bov , + e_cob , e_boc , e_vovov , e_vovoc , + e_vocov , e_covov , e_covoc , e_vovovov , + e_vovovoc , e_vovocov , e_vocovov , e_covovov , + e_covocov , e_vocovoc , e_covovoc , e_vococov , + e_sf3ext , e_sf4ext , e_nulleq , e_strass , + e_vector , e_vecelem , e_rbvecelem , e_rbveccelem , + e_vecdefass , e_vecvalass , e_vecvecass , e_vecopvalass , + e_vecopvecass , e_vecfunc , e_vecvecswap , e_vecvecineq , + e_vecvalineq , e_valvecineq , e_vecvecarith , e_vecvalarith , + e_valvecarith , e_vecunaryop , e_vecondition , e_break , + e_continue , e_swap + }; + + typedef T value_type; + typedef expression_node* expression_ptr; + typedef node_collector_interface > nci_t; + typedef typename nci_t::noderef_list_t noderef_list_t; + typedef node_depth_base > ndb_t; + + virtual ~expression_node() {} + + inline virtual T value() const + { + return std::numeric_limits::quiet_NaN(); + } + + inline virtual expression_node* branch(const std::size_t& index = 0) const + { + return reinterpret_cast(index * 0); + } + + inline virtual node_type type() const + { + return e_none; + } + }; // class expression_node + + template + inline bool is_generally_string_node(const expression_node* node); + + inline bool is_true(const double v) + { + return std::not_equal_to()(0.0,v); + } + + inline bool is_true(const long double v) + { + return std::not_equal_to()(0.0L,v); + } + + inline bool is_true(const float v) + { + return std::not_equal_to()(0.0f,v); + } + + template + inline bool is_true(const std::complex& v) + { + return std::not_equal_to >()(std::complex(0),v); + } + + template + inline bool is_true(const expression_node* node) + { + return std::not_equal_to()(T(0),node->value()); + } + + template + inline bool is_true(const std::pair*,bool>& node) + { + return std::not_equal_to()(T(0),node.first->value()); + } + + template + inline bool is_false(const expression_node* node) + { + return std::equal_to()(T(0),node->value()); + } + + template + inline bool is_false(const std::pair*,bool>& node) + { + return std::equal_to()(T(0),node.first->value()); + } + + template + inline bool is_unary_node(const expression_node* node) + { + return node && (details::expression_node::e_unary == node->type()); + } + + template + inline bool is_neg_unary_node(const expression_node* node) + { + return node && (details::expression_node::e_neg == node->type()); + } + + template + inline bool is_binary_node(const expression_node* node) + { + return node && (details::expression_node::e_binary == node->type()); + } + + template + inline bool is_variable_node(const expression_node* node) + { + return node && (details::expression_node::e_variable == node->type()); + } + + template + inline bool is_ivariable_node(const expression_node* node) + { + return node && + ( + details::expression_node::e_variable == node->type() || + details::expression_node::e_vecelem == node->type() || + details::expression_node::e_rbvecelem == node->type() || + details::expression_node::e_rbveccelem == node->type() + ); + } + + template + inline bool is_vector_elem_node(const expression_node* node) + { + return node && (details::expression_node::e_vecelem == node->type()); + } + + template + inline bool is_rebasevector_elem_node(const expression_node* node) + { + return node && (details::expression_node::e_rbvecelem == node->type()); + } + + template + inline bool is_rebasevector_celem_node(const expression_node* node) + { + return node && (details::expression_node::e_rbveccelem == node->type()); + } + + template + inline bool is_vector_node(const expression_node* node) + { + return node && (details::expression_node::e_vector == node->type()); + } + + template + inline bool is_ivector_node(const expression_node* node) + { + if (node) + { + switch (node->type()) + { + case details::expression_node::e_vector : + case details::expression_node::e_vecvalass : + case details::expression_node::e_vecvecass : + case details::expression_node::e_vecopvalass : + case details::expression_node::e_vecopvecass : + case details::expression_node::e_vecvecswap : + case details::expression_node::e_vecvecarith : + case details::expression_node::e_vecvalarith : + case details::expression_node::e_valvecarith : + case details::expression_node::e_vecunaryop : + case details::expression_node::e_vecondition : return true; + default : return false; + } + } + else + return false; + } + + template + inline bool is_constant_node(const expression_node* node) + { + return node && + ( + details::expression_node::e_constant == node->type() || + details::expression_node::e_stringconst == node->type() + ); + } + + template + inline bool is_null_node(const expression_node* node) + { + return node && (details::expression_node::e_null == node->type()); + } + + template + inline bool is_break_node(const expression_node* node) + { + return node && (details::expression_node::e_break == node->type()); + } + + template + inline bool is_continue_node(const expression_node* node) + { + return node && (details::expression_node::e_continue == node->type()); + } + + template + inline bool is_swap_node(const expression_node* node) + { + return node && (details::expression_node::e_swap == node->type()); + } + + template + inline bool is_function(const expression_node* node) + { + return node && (details::expression_node::e_function == node->type()); + } + + template + inline bool is_return_node(const expression_node* node) + { + return node && (details::expression_node::e_return == node->type()); + } + + template class unary_node; + + template + inline bool is_negate_node(const expression_node* node) + { + if (node && is_unary_node(node)) + { + return (details::e_neg == static_cast*>(node)->operation()); + } + else + return false; + } + + template + inline bool branch_deletable(expression_node* node) + { + return (0 != node) && + !is_variable_node(node) && + !is_string_node (node) ; + } + + template + inline bool all_nodes_valid(expression_node* (&b)[N]) + { + for (std::size_t i = 0; i < N; ++i) + { + if (0 == b[i]) return false; + } + + return true; + } + + template class Sequence> + inline bool all_nodes_valid(const Sequence*,Allocator>& b) + { + for (std::size_t i = 0; i < b.size(); ++i) + { + if (0 == b[i]) return false; + } + + return true; + } + + template + inline bool all_nodes_variables(expression_node* (&b)[N]) + { + for (std::size_t i = 0; i < N; ++i) + { + if (0 == b[i]) + return false; + else if (!is_variable_node(b[i])) + return false; + } + + return true; + } + + template class Sequence> + inline bool all_nodes_variables(Sequence*,Allocator>& b) + { + for (std::size_t i = 0; i < b.size(); ++i) + { + if (0 == b[i]) + return false; + else if (!is_variable_node(b[i])) + return false; + } + + return true; + } + + template + class node_collection_destructor + { + public: + + typedef node_collector_interface nci_t; + + typedef typename nci_t::node_ptr_t node_ptr_t; + typedef typename nci_t::node_pp_t node_pp_t; + typedef typename nci_t::noderef_list_t noderef_list_t; + + static void delete_nodes(node_ptr_t& root) + { + std::vector node_delete_list; + node_delete_list.reserve(1000); + + collect_nodes(root, node_delete_list); + + for (std::size_t i = 0; i < node_delete_list.size(); ++i) + { + node_ptr_t& node = *node_delete_list[i]; + exprtk_debug(("ncd::delete_nodes() - deleting: %p\n", static_cast(node))); + delete node; + node = reinterpret_cast(0); + } + } + + private: + + static void collect_nodes(node_ptr_t& root, noderef_list_t& node_delete_list) + { + std::deque node_list; + node_list.push_back(root); + node_delete_list.push_back(&root); + + noderef_list_t child_node_delete_list; + child_node_delete_list.reserve(1000); + + while (!node_list.empty()) + { + node_list.front()->collect_nodes(child_node_delete_list); + + if (!child_node_delete_list.empty()) + { + for (std::size_t i = 0; i < child_node_delete_list.size(); ++i) + { + node_pp_t& node = child_node_delete_list[i]; + + if (0 == (*node)) + { + exprtk_debug(("ncd::collect_nodes() - null node encountered.\n")); + } + + node_list.push_back(*node); + } + + node_delete_list.insert( + node_delete_list.end(), + child_node_delete_list.begin(), child_node_delete_list.end()); + + child_node_delete_list.clear(); + } + + node_list.pop_front(); + } + + std::reverse(node_delete_list.begin(), node_delete_list.end()); + } + }; + + template + inline void free_all_nodes(NodeAllocator& node_allocator, expression_node* (&b)[N]) + { + for (std::size_t i = 0; i < N; ++i) + { + free_node(node_allocator,b[i]); + } + } + + template class Sequence> + inline void free_all_nodes(NodeAllocator& node_allocator, Sequence*,Allocator>& b) + { + for (std::size_t i = 0; i < b.size(); ++i) + { + free_node(node_allocator,b[i]); + } + + b.clear(); + } + + template + inline void free_node(NodeAllocator&, expression_node*& node) + { + if ((0 == node) || is_variable_node(node) || is_string_node(node)) + { + return; + } + + node_collection_destructor > + ::delete_nodes(node); + } + + template + inline void destroy_node(expression_node*& node) + { + if (0 != node) + { + node_collection_destructor > + ::delete_nodes(node); + } + } + + template + struct node_depth_base + { + typedef Node* node_ptr_t; + typedef std::pair nb_pair_t; + + node_depth_base() + : depth_set(false) + , depth(0) + {} + + virtual ~node_depth_base() {} + + virtual std::size_t node_depth() const { return 1; } + + std::size_t compute_node_depth(const Node* const& node) const + { + if (!depth_set) + { + depth = 1 + (node ? node->node_depth() : 0); + depth_set = true; + } + + return depth; + } + + std::size_t compute_node_depth(const nb_pair_t& branch) const + { + if (!depth_set) + { + depth = 1 + (branch.first ? branch.first->node_depth() : 0); + depth_set = true; + } + + return depth; + } + + template + std::size_t compute_node_depth(const nb_pair_t (&branch)[N]) const + { + if (!depth_set) + { + depth = 0; + for (std::size_t i = 0; i < N; ++i) + { + if (branch[i].first) + { + depth = std::max(depth,branch[i].first->node_depth()); + } + } + depth += 1; + depth_set = true; + } + + return depth; + } + + template + std::size_t compute_node_depth(const BranchType& n0, const BranchType& n1) const + { + if (!depth_set) + { + depth = 1 + std::max(compute_node_depth(n0), compute_node_depth(n1)); + depth_set = true; + } + + return depth; + } + + template + std::size_t compute_node_depth(const BranchType& n0, const BranchType& n1, + const BranchType& n2) const + { + if (!depth_set) + { + depth = 1 + std::max( + std::max(compute_node_depth(n0), compute_node_depth(n1)), + compute_node_depth(n2)); + depth_set = true; + } + + return depth; + } + + template + std::size_t compute_node_depth(const BranchType& n0, const BranchType& n1, + const BranchType& n2, const BranchType& n3) const + { + if (!depth_set) + { + depth = 1 + std::max( + std::max(compute_node_depth(n0), compute_node_depth(n1)), + std::max(compute_node_depth(n2), compute_node_depth(n3))); + depth_set = true; + } + + return depth; + } + + template class Sequence> + std::size_t compute_node_depth(const Sequence& branch_list) const + { + if (!depth_set) + { + for (std::size_t i = 0; i < branch_list.size(); ++i) + { + if (branch_list[i]) + { + depth = std::max(depth, compute_node_depth(branch_list[i])); + } + } + depth_set = true; + } + + return depth; + } + + template class Sequence> + std::size_t compute_node_depth(const Sequence& branch_list) const + { + if (!depth_set) + { + for (std::size_t i = 0; i < branch_list.size(); ++i) + { + if (branch_list[i].first) + { + depth = std::max(depth, compute_node_depth(branch_list[i].first)); + } + } + depth_set = true; + } + + return depth; + } + + mutable bool depth_set; + mutable std::size_t depth; + + template + void collect(node_ptr_t const& node, + const bool deletable, + NodeSequence& delete_node_list) const + { + if ((0 != node) && deletable) + { + delete_node_list.push_back(const_cast(&node)); + } + } + + template + void collect(const nb_pair_t& branch, + NodeSequence& delete_node_list) const + { + collect(branch.first, branch.second, delete_node_list); + } + + template + void collect(Node*& node, + NodeSequence& delete_node_list) const + { + collect(node, branch_deletable(node), delete_node_list); + } + + template + void collect(const nb_pair_t(&branch)[N], + NodeSequence& delete_node_list) const + { + for (std::size_t i = 0; i < N; ++i) + { + collect(branch[i].first, branch[i].second, delete_node_list); + } + } + + template class Sequence, + typename NodeSequence> + void collect(const Sequence& branch, + NodeSequence& delete_node_list) const + { + for (std::size_t i = 0; i < branch.size(); ++i) + { + collect(branch[i].first, branch[i].second, delete_node_list); + } + } + + template class Sequence, + typename NodeSequence> + void collect(const Sequence& branch_list, + NodeSequence& delete_node_list) const + { + for (std::size_t i = 0; i < branch_list.size(); ++i) + { + collect(branch_list[i], branch_deletable(branch_list[i]), delete_node_list); + } + } + + template class Sequence, + typename NodeSequence> + void collect(const Sequence& branch_list, + const Sequence& branch_deletable_list, + NodeSequence& delete_node_list) const + { + for (std::size_t i = 0; i < branch_list.size(); ++i) + { + collect(branch_list[i], branch_deletable_list[i], delete_node_list); + } + } + }; + + template + class vector_holder + { + private: + + typedef Type value_type; + typedef value_type* value_ptr; + typedef const value_ptr const_value_ptr; + + class vector_holder_base + { + public: + + virtual ~vector_holder_base() {} + + inline value_ptr operator[](const std::size_t& index) const + { + return value_at(index); + } + + inline std::size_t size() const + { + return vector_size(); + } + + inline value_ptr data() const + { + return value_at(0); + } + + virtual inline bool rebaseable() const + { + return false; + } + + virtual void set_ref(value_ptr*) {} + + protected: + + virtual value_ptr value_at(const std::size_t&) const = 0; + virtual std::size_t vector_size() const = 0; + }; + + class array_vector_impl : public vector_holder_base + { + public: + + array_vector_impl(const Type* vec, const std::size_t& vec_size) + : vec_(vec) + , size_(vec_size) + {} + + protected: + + value_ptr value_at(const std::size_t& index) const + { + if (index < size_) + return const_cast(vec_ + index); + else + return const_value_ptr(0); + } + + std::size_t vector_size() const + { + return size_; + } + + private: + + array_vector_impl(const array_vector_impl&) exprtk_delete; + array_vector_impl& operator=(const array_vector_impl&) exprtk_delete; + + const Type* vec_; + const std::size_t size_; + }; + + template class Sequence> + class sequence_vector_impl : public vector_holder_base + { + public: + + typedef Sequence sequence_t; + + sequence_vector_impl(sequence_t& seq) + : sequence_(seq) + {} + + protected: + + value_ptr value_at(const std::size_t& index) const + { + return (index < sequence_.size()) ? (&sequence_[index]) : const_value_ptr(0); + } + + std::size_t vector_size() const + { + return sequence_.size(); + } + + private: + + sequence_vector_impl(const sequence_vector_impl&) exprtk_delete; + sequence_vector_impl& operator=(const sequence_vector_impl&) exprtk_delete; + + sequence_t& sequence_; + }; + + class vector_view_impl : public vector_holder_base + { + public: + + typedef exprtk::vector_view vector_view_t; + + vector_view_impl(vector_view_t& vec_view) + : vec_view_(vec_view) + {} + + void set_ref(value_ptr* ref) + { + vec_view_.set_ref(ref); + } + + virtual inline bool rebaseable() const + { + return true; + } + + protected: + + value_ptr value_at(const std::size_t& index) const + { + return (index < vec_view_.size()) ? (&vec_view_[index]) : const_value_ptr(0); + } + + std::size_t vector_size() const + { + return vec_view_.size(); + } + + private: + + vector_view_impl(const vector_view_impl&) exprtk_delete; + vector_view_impl& operator=(const vector_view_impl&) exprtk_delete; + + vector_view_t& vec_view_; + }; + + public: + + typedef typename details::vec_data_store vds_t; + + vector_holder(Type* vec, const std::size_t& vec_size) + : vector_holder_base_(new(buffer)array_vector_impl(vec,vec_size)) + {} + + explicit vector_holder(const vds_t& vds) + : vector_holder_base_(new(buffer)array_vector_impl(vds.data(),vds.size())) + {} + + template + explicit vector_holder(std::vector& vec) + : vector_holder_base_(new(buffer)sequence_vector_impl(vec)) + {} + + explicit vector_holder(exprtk::vector_view& vec) + : vector_holder_base_(new(buffer)vector_view_impl(vec)) + {} + + inline value_ptr operator[](const std::size_t& index) const + { + return (*vector_holder_base_)[index]; + } + + inline std::size_t size() const + { + return vector_holder_base_->size(); + } + + inline value_ptr data() const + { + return vector_holder_base_->data(); + } + + void set_ref(value_ptr* ref) + { + vector_holder_base_->set_ref(ref); + } + + bool rebaseable() const + { + return vector_holder_base_->rebaseable(); + } + + private: + + mutable vector_holder_base* vector_holder_base_; + uchar_t buffer[64]; + }; + + template + class null_node exprtk_final : public expression_node + { + public: + + inline T value() const exprtk_override + { + return std::numeric_limits::quiet_NaN(); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_null; + } + }; + + template + inline void construct_branch_pair(std::pair*,bool> (&branch)[N], + expression_node* b, + const std::size_t& index) + { + if (b && (index < N)) + { + branch[index] = std::make_pair(b,branch_deletable(b)); + } + } + + template + inline void construct_branch_pair(std::pair*,bool>& branch, expression_node* b) + { + if (b) + { + branch = std::make_pair(b,branch_deletable(b)); + } + } + + template + inline void init_branches(std::pair*,bool> (&branch)[N], + expression_node* b0, + expression_node* b1 = reinterpret_cast*>(0), + expression_node* b2 = reinterpret_cast*>(0), + expression_node* b3 = reinterpret_cast*>(0), + expression_node* b4 = reinterpret_cast*>(0), + expression_node* b5 = reinterpret_cast*>(0), + expression_node* b6 = reinterpret_cast*>(0), + expression_node* b7 = reinterpret_cast*>(0), + expression_node* b8 = reinterpret_cast*>(0), + expression_node* b9 = reinterpret_cast*>(0)) + { + construct_branch_pair(branch, b0, 0); + construct_branch_pair(branch, b1, 1); + construct_branch_pair(branch, b2, 2); + construct_branch_pair(branch, b3, 3); + construct_branch_pair(branch, b4, 4); + construct_branch_pair(branch, b5, 5); + construct_branch_pair(branch, b6, 6); + construct_branch_pair(branch, b7, 7); + construct_branch_pair(branch, b8, 8); + construct_branch_pair(branch, b9, 9); + } + + template + class null_eq_node exprtk_final : public expression_node + { + public: + + typedef expression_node* expression_ptr; + typedef std::pair branch_t; + + explicit null_eq_node(expression_ptr branch, const bool equality = true) + : equality_(equality) + { + construct_branch_pair(branch_, branch); + } + + inline T value() const exprtk_override + { + assert(branch_.first); + + const T v = branch_.first->value(); + const bool result = details::numeric::is_nan(v); + + if (result) + return equality_ ? T(1) : T(0); + else + return equality_ ? T(0) : T(1); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_nulleq; + } + + inline expression_node* branch(const std::size_t&) const exprtk_override + { + return branch_.first; + } + + void collect_nodes(typename expression_node::noderef_list_t& node_delete_list) exprtk_override + { + expression_node::ndb_t::collect(branch_, node_delete_list); + } + + std::size_t node_depth() const exprtk_override + { + return expression_node::ndb_t::compute_node_depth(branch_); + } + + private: + + bool equality_; + branch_t branch_; + }; + + template + class literal_node exprtk_final : public expression_node + { + public: + + explicit literal_node(const T& v) + : value_(v) + {} + + inline T value() const exprtk_override + { + return value_; + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_constant; + } + + inline expression_node* branch(const std::size_t&) const exprtk_override + { + return reinterpret_cast*>(0); + } + + private: + + literal_node(const literal_node&) exprtk_delete; + literal_node& operator=(const literal_node&) exprtk_delete; + + const T value_; + }; + + template + struct range_pack; + + template + struct range_data_type; + + template + class range_interface + { + public: + + typedef range_pack range_t; + + virtual ~range_interface() {} + + virtual range_t& range_ref() = 0; + + virtual const range_t& range_ref() const = 0; + }; + + #ifndef exprtk_disable_string_capabilities + template + class string_base_node + { + public: + + typedef range_data_type range_data_type_t; + + virtual ~string_base_node() {} + + virtual std::string str () const = 0; + + virtual char_cptr base() const = 0; + + virtual std::size_t size() const = 0; + }; + + template + class string_literal_node exprtk_final + : public expression_node , + public string_base_node, + public range_interface + { + public: + + typedef range_pack range_t; + + explicit string_literal_node(const std::string& v) + : value_(v) + { + rp_.n0_c = std::make_pair(true,0); + rp_.n1_c = std::make_pair(true,v.size() - 1); + rp_.cache.first = rp_.n0_c.second; + rp_.cache.second = rp_.n1_c.second; + } + + inline T value() const exprtk_override + { + return std::numeric_limits::quiet_NaN(); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_stringconst; + } + + inline expression_node* branch(const std::size_t&) const exprtk_override + { + return reinterpret_cast*>(0); + } + + std::string str() const exprtk_override + { + return value_; + } + + char_cptr base() const exprtk_override + { + return value_.data(); + } + + std::size_t size() const exprtk_override + { + return value_.size(); + } + + range_t& range_ref() exprtk_override + { + return rp_; + } + + const range_t& range_ref() const exprtk_override + { + return rp_; + } + + private: + + string_literal_node(const string_literal_node&) exprtk_delete; + string_literal_node& operator=(const string_literal_node&) exprtk_delete; + + const std::string value_; + range_t rp_; + }; + #endif + + template + class unary_node : public expression_node + { + public: + + typedef expression_node* expression_ptr; + typedef std::pair branch_t; + + unary_node(const operator_type& opr, expression_ptr branch) + : operation_(opr) + { + construct_branch_pair(branch_,branch); + } + + inline T value() const exprtk_override + { + assert(branch_.first); + const T arg = branch_.first->value(); + return numeric::process(operation_,arg); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_unary; + } + + inline operator_type operation() + { + return operation_; + } + + inline expression_node* branch(const std::size_t&) const exprtk_override + { + return branch_.first; + } + + inline void release() + { + branch_.second = false; + } + + void collect_nodes(typename expression_node::noderef_list_t& node_delete_list) exprtk_override + { + expression_node::ndb_t::collect(branch_, node_delete_list); + } + + std::size_t node_depth() const exprtk_final + { + return expression_node::ndb_t::compute_node_depth(branch_); + } + + private: + + operator_type operation_; + branch_t branch_; + }; + + template + class binary_node : public expression_node + { + public: + + typedef expression_node* expression_ptr; + typedef std::pair branch_t; + + binary_node(const operator_type& opr, + expression_ptr branch0, + expression_ptr branch1) + : operation_(opr) + { + init_branches<2>(branch_, branch0, branch1); + } + + inline T value() const exprtk_override + { + assert(branch_[0].first); + assert(branch_[1].first); + + const T arg0 = branch_[0].first->value(); + const T arg1 = branch_[1].first->value(); + + return numeric::process(operation_, arg0, arg1); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_binary; + } + + inline operator_type operation() + { + return operation_; + } + + inline expression_node* branch(const std::size_t& index = 0) const exprtk_override + { + if (0 == index) + return branch_[0].first; + else if (1 == index) + return branch_[1].first; + else + return reinterpret_cast(0); + } + + void collect_nodes(typename expression_node::noderef_list_t& node_delete_list) exprtk_override + { + expression_node::ndb_t::template collect(branch_, node_delete_list); + } + + std::size_t node_depth() const exprtk_final + { + return expression_node::ndb_t::template compute_node_depth<2>(branch_); + } + + private: + + operator_type operation_; + branch_t branch_[2]; + }; + + template + class binary_ext_node exprtk_final : public expression_node + { + public: + + typedef expression_node* expression_ptr; + typedef std::pair branch_t; + + binary_ext_node(expression_ptr branch0, expression_ptr branch1) + { + init_branches<2>(branch_, branch0, branch1); + } + + inline T value() const exprtk_override + { + assert(branch_[0].first); + assert(branch_[1].first); + + const T arg0 = branch_[0].first->value(); + const T arg1 = branch_[1].first->value(); + + return Operation::process(arg0,arg1); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_binary_ext; + } + + inline operator_type operation() + { + return Operation::operation(); + } + + inline expression_node* branch(const std::size_t& index = 0) const exprtk_override + { + if (0 == index) + return branch_[0].first; + else if (1 == index) + return branch_[1].first; + else + return reinterpret_cast(0); + } + + void collect_nodes(typename expression_node::noderef_list_t& node_delete_list) exprtk_override + { + expression_node::ndb_t::template collect(branch_, node_delete_list); + } + + std::size_t node_depth() const exprtk_override + { + return expression_node::ndb_t::template compute_node_depth<2>(branch_); + } + + protected: + + branch_t branch_[2]; + }; + + template + class trinary_node : public expression_node + { + public: + + typedef expression_node* expression_ptr; + typedef std::pair branch_t; + + trinary_node(const operator_type& opr, + expression_ptr branch0, + expression_ptr branch1, + expression_ptr branch2) + : operation_(opr) + { + init_branches<3>(branch_, branch0, branch1, branch2); + } + + inline T value() const exprtk_override + { + assert(branch_[0].first); + assert(branch_[1].first); + assert(branch_[2].first); + + const T arg0 = branch_[0].first->value(); + const T arg1 = branch_[1].first->value(); + const T arg2 = branch_[2].first->value(); + + switch (operation_) + { + case e_inrange : return (arg1 < arg0) ? T(0) : ((arg1 > arg2) ? T(0) : T(1)); + + case e_clamp : return (arg1 < arg0) ? arg0 : (arg1 > arg2 ? arg2 : arg1); + + case e_iclamp : if ((arg1 <= arg0) || (arg1 >= arg2)) + return arg1; + else + return ((T(2) * arg1 <= (arg2 + arg0)) ? arg0 : arg2); + + default : exprtk_debug(("trinary_node::value() - Error: Invalid operation\n")); + return std::numeric_limits::quiet_NaN(); + } + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_trinary; + } + + void collect_nodes(typename expression_node::noderef_list_t& node_delete_list) exprtk_override + { + expression_node::ndb_t::template collect(branch_, node_delete_list); + } + + std::size_t node_depth() const exprtk_override exprtk_final + { + return expression_node::ndb_t::template compute_node_depth<3>(branch_); + } + + protected: + + operator_type operation_; + branch_t branch_[3]; + }; + + template + class quaternary_node : public expression_node + { + public: + + typedef expression_node* expression_ptr; + typedef std::pair branch_t; + + quaternary_node(const operator_type& opr, + expression_ptr branch0, + expression_ptr branch1, + expression_ptr branch2, + expression_ptr branch3) + : operation_(opr) + { + init_branches<4>(branch_, branch0, branch1, branch2, branch3); + } + + inline T value() const exprtk_override + { + return std::numeric_limits::quiet_NaN(); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_quaternary; + } + + void collect_nodes(typename expression_node::noderef_list_t& node_delete_list) exprtk_override + { + expression_node::ndb_t::template collect(branch_, node_delete_list); + } + + std::size_t node_depth() const exprtk_override exprtk_final + { + return expression_node::ndb_t::template compute_node_depth<4>(branch_); + } + + protected: + + operator_type operation_; + branch_t branch_[4]; + }; + + template + class conditional_node exprtk_final : public expression_node + { + public: + + typedef expression_node* expression_ptr; + typedef std::pair branch_t; + + conditional_node(expression_ptr condition, + expression_ptr consequent, + expression_ptr alternative) + { + construct_branch_pair(condition_ , condition ); + construct_branch_pair(consequent_ , consequent ); + construct_branch_pair(alternative_, alternative); + } + + inline T value() const exprtk_override + { + assert(condition_ .first); + assert(consequent_ .first); + assert(alternative_.first); + + if (is_true(condition_)) + return consequent_.first->value(); + else + return alternative_.first->value(); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_conditional; + } + + void collect_nodes(typename expression_node::noderef_list_t& node_delete_list) exprtk_override + { + expression_node::ndb_t::collect(condition_ , node_delete_list); + expression_node::ndb_t::collect(consequent_ , node_delete_list); + expression_node::ndb_t::collect(alternative_ , node_delete_list); + } + + std::size_t node_depth() const exprtk_override + { + return expression_node::ndb_t::compute_node_depth + (condition_, consequent_, alternative_); + } + + private: + + branch_t condition_; + branch_t consequent_; + branch_t alternative_; + }; + + template + class cons_conditional_node exprtk_final : public expression_node + { + public: + + // Consequent only conditional statement node + typedef expression_node* expression_ptr; + typedef std::pair branch_t; + + cons_conditional_node(expression_ptr condition, + expression_ptr consequent) + { + construct_branch_pair(condition_ , condition ); + construct_branch_pair(consequent_, consequent); + } + + inline T value() const exprtk_override + { + assert(condition_ .first); + assert(consequent_.first); + + if (is_true(condition_)) + return consequent_.first->value(); + else + return std::numeric_limits::quiet_NaN(); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_conditional; + } + + void collect_nodes(typename expression_node::noderef_list_t& node_delete_list) exprtk_override + { + expression_node::ndb_t::collect(condition_ , node_delete_list); + expression_node::ndb_t::collect(consequent_ , node_delete_list); + } + + std::size_t node_depth() const exprtk_override + { + return expression_node::ndb_t:: + compute_node_depth(condition_, consequent_); + } + + private: + + branch_t condition_; + branch_t consequent_; + }; + + #ifndef exprtk_disable_break_continue + template + class break_exception + { + public: + + explicit break_exception(const T& v) + : value(v) + {} + + T value; + }; + + class continue_exception {}; + + template + class break_node exprtk_final : public expression_node + { + public: + + typedef expression_node* expression_ptr; + typedef std::pair branch_t; + + break_node(expression_ptr ret = expression_ptr(0)) + { + construct_branch_pair(return_, ret); + } + + inline T value() const exprtk_override + { + const T result = return_.first ? + return_.first->value() : + std::numeric_limits::quiet_NaN(); + + throw break_exception(result); + + #ifndef _MSC_VER + return std::numeric_limits::quiet_NaN(); + #endif + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_break; + } + + void collect_nodes(typename expression_node::noderef_list_t& node_delete_list) exprtk_override + { + expression_node::ndb_t::collect(return_, node_delete_list); + } + + std::size_t node_depth() const exprtk_override + { + return expression_node::ndb_t::compute_node_depth(return_); + } + + private: + + branch_t return_; + }; + + template + class continue_node exprtk_final : public expression_node + { + public: + + inline T value() const exprtk_override + { + throw continue_exception(); + #ifndef _MSC_VER + return std::numeric_limits::quiet_NaN(); + #endif + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_break; + } + }; + #endif + + struct loop_runtime_checker + { + loop_runtime_checker(loop_runtime_check_ptr loop_runtime_check, + loop_runtime_check::loop_types lp_typ = loop_runtime_check::e_invalid) + : iteration_count_(0) + , loop_runtime_check_(loop_runtime_check) + , max_loop_iterations_(loop_runtime_check_->max_loop_iterations) + , loop_type_(lp_typ) + { + assert(loop_runtime_check_); + } + + inline void reset(const _uint64_t initial_value = 0) const + { + iteration_count_ = initial_value; + } + + inline bool check() const + { + if ( + (0 == loop_runtime_check_) || + (++iteration_count_ <= max_loop_iterations_) + ) + { + return true; + } + + loop_runtime_check::violation_context ctxt; + ctxt.loop = loop_type_; + ctxt.violation = loop_runtime_check::e_iteration_count; + + loop_runtime_check_->handle_runtime_violation(ctxt); + + return false; + } + + mutable _uint64_t iteration_count_; + mutable loop_runtime_check_ptr loop_runtime_check_; + const details::_uint64_t& max_loop_iterations_; + loop_runtime_check::loop_types loop_type_; + }; + + template + class while_loop_node : public expression_node + { + public: + + typedef expression_node* expression_ptr; + typedef std::pair branch_t; + + while_loop_node(expression_ptr condition, + expression_ptr loop_body) + { + construct_branch_pair(condition_, condition); + construct_branch_pair(loop_body_, loop_body); + } + + inline T value() const exprtk_override + { + assert(condition_.first); + assert(loop_body_.first); + + T result = T(0); + + while (is_true(condition_)) + { + result = loop_body_.first->value(); + } + + return result; + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_while; + } + + void collect_nodes(typename expression_node::noderef_list_t& node_delete_list) exprtk_override + { + expression_node::ndb_t::collect(condition_ , node_delete_list); + expression_node::ndb_t::collect(loop_body_ , node_delete_list); + } + + std::size_t node_depth() const exprtk_override + { + return expression_node::ndb_t::compute_node_depth(condition_, loop_body_); + } + + protected: + + branch_t condition_; + branch_t loop_body_; + }; + + template + class while_loop_rtc_node exprtk_final + : public while_loop_node + , public loop_runtime_checker + { + public: + + typedef while_loop_node parent_t; + typedef expression_node* expression_ptr; + + while_loop_rtc_node(expression_ptr condition, + expression_ptr loop_body, + loop_runtime_check_ptr loop_rt_chk) + : parent_t(condition, loop_body) + , loop_runtime_checker(loop_rt_chk, loop_runtime_check::e_while_loop) + {} + + inline T value() const exprtk_override + { + assert(parent_t::condition_.first); + assert(parent_t::loop_body_.first); + + T result = T(0); + + loop_runtime_checker::reset(); + + while (is_true(parent_t::condition_) && loop_runtime_checker::check()) + { + result = parent_t::loop_body_.first->value(); + } + + return result; + } + }; + + template + class repeat_until_loop_node : public expression_node + { + public: + + typedef expression_node* expression_ptr; + typedef std::pair branch_t; + + repeat_until_loop_node(expression_ptr condition, + expression_ptr loop_body) + { + construct_branch_pair(condition_, condition); + construct_branch_pair(loop_body_, loop_body); + } + + inline T value() const exprtk_override + { + assert(condition_.first); + assert(loop_body_.first); + + T result = T(0); + + do + { + result = loop_body_.first->value(); + } + while (is_false(condition_.first)); + + return result; + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_repeat; + } + + void collect_nodes(typename expression_node::noderef_list_t& node_delete_list) exprtk_override + { + expression_node::ndb_t::collect(condition_ , node_delete_list); + expression_node::ndb_t::collect(loop_body_ , node_delete_list); + } + + std::size_t node_depth() const exprtk_override + { + return expression_node::ndb_t::compute_node_depth(condition_, loop_body_); + } + + protected: + + branch_t condition_; + branch_t loop_body_; + }; + + template + class repeat_until_loop_rtc_node exprtk_final + : public repeat_until_loop_node + , public loop_runtime_checker + { + public: + + typedef repeat_until_loop_node parent_t; + typedef expression_node* expression_ptr; + + repeat_until_loop_rtc_node(expression_ptr condition, + expression_ptr loop_body, + loop_runtime_check_ptr loop_rt_chk) + : parent_t(condition, loop_body) + , loop_runtime_checker(loop_rt_chk, loop_runtime_check::e_repeat_until_loop) + {} + + inline T value() const exprtk_override + { + assert(parent_t::condition_.first); + assert(parent_t::loop_body_.first); + + T result = T(0); + + loop_runtime_checker::reset(1); + + do + { + result = parent_t::loop_body_.first->value(); + } + while (is_false(parent_t::condition_.first) && loop_runtime_checker::check()); + + return result; + } + }; + + template + class for_loop_node : public expression_node + { + public: + + typedef expression_node* expression_ptr; + typedef std::pair branch_t; + + for_loop_node(expression_ptr initialiser, + expression_ptr condition, + expression_ptr incrementor, + expression_ptr loop_body) + { + construct_branch_pair(initialiser_, initialiser); + construct_branch_pair(condition_ , condition ); + construct_branch_pair(incrementor_, incrementor); + construct_branch_pair(loop_body_ , loop_body ); + } + + inline T value() const exprtk_override + { + assert(condition_.first); + assert(loop_body_.first); + + T result = T(0); + + if (initialiser_.first) + initialiser_.first->value(); + + if (incrementor_.first) + { + while (is_true(condition_)) + { + result = loop_body_.first->value(); + incrementor_.first->value(); + } + } + else + { + while (is_true(condition_)) + { + result = loop_body_.first->value(); + } + } + + return result; + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_for; + } + + void collect_nodes(typename expression_node::noderef_list_t& node_delete_list) exprtk_override + { + expression_node::ndb_t::collect(initialiser_ , node_delete_list); + expression_node::ndb_t::collect(condition_ , node_delete_list); + expression_node::ndb_t::collect(incrementor_ , node_delete_list); + expression_node::ndb_t::collect(loop_body_ , node_delete_list); + } + + std::size_t node_depth() const exprtk_override + { + return expression_node::ndb_t::compute_node_depth + (initialiser_, condition_, incrementor_, loop_body_); + } + + protected: + + branch_t initialiser_; + branch_t condition_ ; + branch_t incrementor_; + branch_t loop_body_ ; + }; + + template + class for_loop_rtc_node exprtk_final + : public for_loop_node + , public loop_runtime_checker + { + public: + + typedef for_loop_node parent_t; + typedef expression_node* expression_ptr; + + for_loop_rtc_node(expression_ptr initialiser, + expression_ptr condition, + expression_ptr incrementor, + expression_ptr loop_body, + loop_runtime_check_ptr loop_rt_chk) + : parent_t(initialiser, condition, incrementor, loop_body) + , loop_runtime_checker(loop_rt_chk, loop_runtime_check::e_for_loop) + {} + + inline T value() const exprtk_override + { + assert(parent_t::condition_.first); + assert(parent_t::loop_body_.first); + + T result = T(0); + + loop_runtime_checker::reset(); + + if (parent_t::initialiser_.first) + parent_t::initialiser_.first->value(); + + if (parent_t::incrementor_.first) + { + while (is_true(parent_t::condition_) && loop_runtime_checker::check()) + { + result = parent_t::loop_body_.first->value(); + parent_t::incrementor_.first->value(); + } + } + else + { + while (is_true(parent_t::condition_) && loop_runtime_checker::check()) + { + result = parent_t::loop_body_.first->value(); + } + } + + return result; + } + }; + + #ifndef exprtk_disable_break_continue + template + class while_loop_bc_node : public while_loop_node + { + public: + + typedef while_loop_node parent_t; + typedef expression_node* expression_ptr; + + while_loop_bc_node(expression_ptr condition, + expression_ptr loop_body) + : parent_t(condition, loop_body) + {} + + inline T value() const exprtk_override + { + assert(parent_t::condition_.first); + assert(parent_t::loop_body_.first); + + T result = T(0); + + while (is_true(parent_t::condition_)) + { + try + { + result = parent_t::loop_body_.first->value(); + } + catch(const break_exception& e) + { + return e.value; + } + catch(const continue_exception&) + {} + } + + return result; + } + }; + + template + class while_loop_bc_rtc_node exprtk_final + : public while_loop_bc_node + , public loop_runtime_checker + { + public: + + typedef while_loop_bc_node parent_t; + typedef expression_node* expression_ptr; + + while_loop_bc_rtc_node(expression_ptr condition, + expression_ptr loop_body, + loop_runtime_check_ptr loop_rt_chk) + : parent_t(condition, loop_body) + , loop_runtime_checker(loop_rt_chk, loop_runtime_check::e_while_loop) + {} + + inline T value() const exprtk_override + { + assert(parent_t::condition_.first); + assert(parent_t::loop_body_.first); + + T result = T(0); + + loop_runtime_checker::reset(); + + while (is_true(parent_t::condition_) && loop_runtime_checker::check()) + { + try + { + result = parent_t::loop_body_.first->value(); + } + catch(const break_exception& e) + { + return e.value; + } + catch(const continue_exception&) + {} + } + + return result; + } + }; + + template + class repeat_until_loop_bc_node : public repeat_until_loop_node + { + public: + + typedef repeat_until_loop_node parent_t; + typedef expression_node* expression_ptr; + + repeat_until_loop_bc_node(expression_ptr condition, + expression_ptr loop_body) + : parent_t(condition, loop_body) + {} + + inline T value() const exprtk_override + { + assert(parent_t::condition_.first); + assert(parent_t::loop_body_.first); + + T result = T(0); + + do + { + try + { + result = parent_t::loop_body_.first->value(); + } + catch(const break_exception& e) + { + return e.value; + } + catch(const continue_exception&) + {} + } + while (is_false(parent_t::condition_.first)); + + return result; + } + }; + + template + class repeat_until_loop_bc_rtc_node exprtk_final + : public repeat_until_loop_bc_node, + public loop_runtime_checker + { + public: + + typedef repeat_until_loop_bc_node parent_t; + typedef expression_node* expression_ptr; + + repeat_until_loop_bc_rtc_node(expression_ptr condition, + expression_ptr loop_body, + loop_runtime_check_ptr loop_rt_chk) + : parent_t(condition, loop_body) + , loop_runtime_checker(loop_rt_chk, loop_runtime_check::e_repeat_until_loop) + {} + + inline T value() const exprtk_override + { + assert(parent_t::condition_.first); + assert(parent_t::loop_body_.first); + + T result = T(0); + + loop_runtime_checker::reset(); + + do + { + try + { + result = parent_t::loop_body_.first->value(); + } + catch(const break_exception& e) + { + return e.value; + } + catch(const continue_exception&) + {} + } + while (is_false(parent_t::condition_.first) && loop_runtime_checker::check()); + + return result; + } + }; + + template + class for_loop_bc_node : public for_loop_node + { + public: + + typedef for_loop_node parent_t; + typedef expression_node* expression_ptr; + + for_loop_bc_node(expression_ptr initialiser, + expression_ptr condition, + expression_ptr incrementor, + expression_ptr loop_body) + : parent_t(initialiser, condition, incrementor, loop_body) + {} + + inline T value() const exprtk_override + { + assert(parent_t::condition_.first); + assert(parent_t::loop_body_.first); + + T result = T(0); + + if (parent_t::initialiser_.first) + parent_t::initialiser_.first->value(); + + if (parent_t::incrementor_.first) + { + while (is_true(parent_t::condition_)) + { + try + { + result = parent_t::loop_body_.first->value(); + } + catch(const break_exception& e) + { + return e.value; + } + catch(const continue_exception&) + {} + + parent_t::incrementor_.first->value(); + } + } + else + { + while (is_true(parent_t::condition_)) + { + try + { + result = parent_t::loop_body_.first->value(); + } + catch(const break_exception& e) + { + return e.value; + } + catch(const continue_exception&) + {} + } + } + + return result; + } + }; + + template + class for_loop_bc_rtc_node exprtk_final + : public for_loop_bc_node + , public loop_runtime_checker + { + public: + + typedef for_loop_bc_node parent_t; + typedef expression_node* expression_ptr; + + for_loop_bc_rtc_node(expression_ptr initialiser, + expression_ptr condition, + expression_ptr incrementor, + expression_ptr loop_body, + loop_runtime_check_ptr loop_rt_chk) + : parent_t(initialiser, condition, incrementor, loop_body) + , loop_runtime_checker(loop_rt_chk, loop_runtime_check::e_for_loop) + {} + + inline T value() const exprtk_override + { + assert(parent_t::condition_.first); + assert(parent_t::loop_body_.first); + + T result = T(0); + + loop_runtime_checker::reset(); + + if (parent_t::initialiser_.first) + parent_t::initialiser_.first->value(); + + if (parent_t::incrementor_.first) + { + while (is_true(parent_t::condition_) && loop_runtime_checker::check()) + { + try + { + result = parent_t::loop_body_.first->value(); + } + catch(const break_exception& e) + { + return e.value; + } + catch(const continue_exception&) + {} + + parent_t::incrementor_.first->value(); + } + } + else + { + while (is_true(parent_t::condition_) && loop_runtime_checker::check()) + { + try + { + result = parent_t::loop_body_.first->value(); + } + catch(const break_exception& e) + { + return e.value; + } + catch(const continue_exception&) + {} + } + } + + return result; + } + }; + #endif + + template + class switch_node : public expression_node + { + public: + + typedef expression_node* expression_ptr; + typedef std::pair branch_t; + + template class Sequence> + explicit switch_node(const Sequence& arg_list) + { + if (1 != (arg_list.size() & 1)) + return; + + arg_list_.resize(arg_list.size()); + + for (std::size_t i = 0; i < arg_list.size(); ++i) + { + if (arg_list[i]) + { + construct_branch_pair(arg_list_[i], arg_list[i]); + } + else + { + arg_list_.clear(); + return; + } + } + } + + inline T value() const exprtk_override + { + if (!arg_list_.empty()) + { + const std::size_t upper_bound = (arg_list_.size() - 1); + + for (std::size_t i = 0; i < upper_bound; i += 2) + { + expression_ptr condition = arg_list_[i ].first; + expression_ptr consequent = arg_list_[i + 1].first; + + if (is_true(condition)) + { + return consequent->value(); + } + } + + return arg_list_[upper_bound].first->value(); + } + else + return std::numeric_limits::quiet_NaN(); + } + + inline typename expression_node::node_type type() const exprtk_override exprtk_final + { + return expression_node::e_switch; + } + + void collect_nodes(typename expression_node::noderef_list_t& node_delete_list) exprtk_override + { + expression_node::ndb_t::collect(arg_list_, node_delete_list); + } + + std::size_t node_depth() const exprtk_override exprtk_final + { + return expression_node::ndb_t::compute_node_depth(arg_list_); + } + + protected: + + std::vector arg_list_; + }; + + template + class switch_n_node exprtk_final : public switch_node + { + public: + + typedef expression_node* expression_ptr; + + template class Sequence> + explicit switch_n_node(const Sequence& arg_list) + : switch_node(arg_list) + {} + + inline T value() const exprtk_override + { + return Switch_N::process(switch_node::arg_list_); + } + }; + + template + class multi_switch_node exprtk_final : public expression_node + { + public: + + typedef expression_node* expression_ptr; + typedef std::pair branch_t; + + template class Sequence> + explicit multi_switch_node(const Sequence& arg_list) + { + if (0 != (arg_list.size() & 1)) + return; + + arg_list_.resize(arg_list.size()); + + for (std::size_t i = 0; i < arg_list.size(); ++i) + { + if (arg_list[i]) + { + construct_branch_pair(arg_list_[i], arg_list[i]); + } + else + { + arg_list_.clear(); + return; + } + } + } + + inline T value() const exprtk_override + { + T result = T(0); + + if (arg_list_.empty()) + { + return std::numeric_limits::quiet_NaN(); + } + + const std::size_t upper_bound = (arg_list_.size() - 1); + + for (std::size_t i = 0; i < upper_bound; i += 2) + { + expression_ptr condition = arg_list_[i ].first; + expression_ptr consequent = arg_list_[i + 1].first; + + if (is_true(condition)) + { + result = consequent->value(); + } + } + + return result; + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_mswitch; + } + + void collect_nodes(typename expression_node::noderef_list_t& node_delete_list) exprtk_override + { + expression_node::ndb_t::collect(arg_list_, node_delete_list); + } + + std::size_t node_depth() const exprtk_override exprtk_final + { + return expression_node::ndb_t::compute_node_depth(arg_list_); + } + + private: + + std::vector arg_list_; + }; + + template + class ivariable + { + public: + + virtual ~ivariable() {} + + virtual T& ref() = 0; + virtual const T& ref() const = 0; + }; + + template + class variable_node exprtk_final + : public expression_node, + public ivariable + { + public: + + static T null_value; + + explicit variable_node() + : value_(&null_value) + {} + + explicit variable_node(T& v) + : value_(&v) + {} + + inline bool operator <(const variable_node& v) const + { + return this < (&v); + } + + inline T value() const exprtk_override + { + return (*value_); + } + + inline T& ref() exprtk_override + { + return (*value_); + } + + inline const T& ref() const exprtk_override + { + return (*value_); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_variable; + } + + private: + + T* value_; + }; + + template + T variable_node::null_value = T(std::numeric_limits::quiet_NaN()); + + template + struct range_pack + { + typedef expression_node* expression_node_ptr; + typedef std::pair cached_range_t; + + range_pack() + : n0_e (std::make_pair(false,expression_node_ptr(0))) + , n1_e (std::make_pair(false,expression_node_ptr(0))) + , n0_c (std::make_pair(false,0)) + , n1_c (std::make_pair(false,0)) + , cache(std::make_pair(0,0)) + {} + + void clear() + { + n0_e = std::make_pair(false,expression_node_ptr(0)); + n1_e = std::make_pair(false,expression_node_ptr(0)); + n0_c = std::make_pair(false,0); + n1_c = std::make_pair(false,0); + cache = std::make_pair(0,0); + } + + void free() + { + if (n0_e.first && n0_e.second) + { + n0_e.first = false; + + if ( + !is_variable_node(n0_e.second) && + !is_string_node (n0_e.second) + ) + { + destroy_node(n0_e.second); + } + } + + if (n1_e.first && n1_e.second) + { + n1_e.first = false; + + if ( + !is_variable_node(n1_e.second) && + !is_string_node (n1_e.second) + ) + { + destroy_node(n1_e.second); + } + } + } + + bool const_range() const + { + return ( n0_c.first && n1_c.first) && + (!n0_e.first && !n1_e.first); + } + + bool var_range() const + { + return ( n0_e.first && n1_e.first) && + (!n0_c.first && !n1_c.first); + } + + bool operator() (std::size_t& r0, std::size_t& r1, + const std::size_t& size = std::numeric_limits::max()) const + { + if (n0_c.first) + r0 = n0_c.second; + else if (n0_e.first) + { + r0 = static_cast(details::numeric::to_int64(n0_e.second->value())); + } + else + return false; + + if (n1_c.first) + r1 = n1_c.second; + else if (n1_e.first) + { + r1 = static_cast(details::numeric::to_int64(n1_e.second->value())); + } + else + return false; + + if ( + (std::numeric_limits::max() != size) && + (std::numeric_limits::max() == r1 ) + ) + { + r1 = size - 1; + } + + cache.first = r0; + cache.second = r1; + + #ifndef exprtk_enable_range_runtime_checks + return (r0 <= r1); + #else + return range_runtime_check(r0, r1, size); + #endif + } + + inline std::size_t const_size() const + { + return (n1_c.second - n0_c.second + 1); + } + + inline std::size_t cache_size() const + { + return (cache.second - cache.first + 1); + } + + std::pair n0_e; + std::pair n1_e; + std::pair n0_c; + std::pair n1_c; + mutable cached_range_t cache; + + #ifdef exprtk_enable_range_runtime_checks + bool range_runtime_check(const std::size_t r0, + const std::size_t r1, + const std::size_t size) const + { + if (r0 >= size) + { + throw std::runtime_error("range error: (r0 < 0) || (r0 >= size)"); + return false; + } + + if (r1 >= size) + { + throw std::runtime_error("range error: (r1 < 0) || (r1 >= size)"); + return false; + } + + return (r0 <= r1); + } + #endif + }; + + template + class string_base_node; + + template + struct range_data_type + { + typedef range_pack range_t; + typedef string_base_node* strbase_ptr_t; + + range_data_type() + : range(0) + , data (0) + , size (0) + , type_size(0) + , str_node (0) + {} + + range_t* range; + void* data; + std::size_t size; + std::size_t type_size; + strbase_ptr_t str_node; + }; + + template class vector_node; + + template + class vector_interface + { + public: + + typedef vector_node* vector_node_ptr; + typedef vec_data_store vds_t; + + virtual ~vector_interface() {} + + virtual std::size_t size () const = 0; + + virtual vector_node_ptr vec() const = 0; + + virtual vector_node_ptr vec() = 0; + + virtual vds_t& vds () = 0; + + virtual const vds_t& vds () const = 0; + + virtual bool side_effect () const { return false; } + }; + + template + class vector_node exprtk_final + : public expression_node + , public vector_interface + { + public: + + typedef expression_node* expression_ptr; + typedef vector_holder vector_holder_t; + typedef vector_node* vector_node_ptr; + typedef vec_data_store vds_t; + + explicit vector_node(vector_holder_t* vh) + : vector_holder_(vh) + , vds_((*vector_holder_).size(),(*vector_holder_)[0]) + { + vector_holder_->set_ref(&vds_.ref()); + } + + vector_node(const vds_t& vds, vector_holder_t* vh) + : vector_holder_(vh) + , vds_(vds) + {} + + inline T value() const exprtk_override + { + return vds().data()[0]; + } + + vector_node_ptr vec() const exprtk_override + { + return const_cast(this); + } + + vector_node_ptr vec() exprtk_override + { + return this; + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_vector; + } + + std::size_t size() const exprtk_override + { + return vds().size(); + } + + vds_t& vds() exprtk_override + { + return vds_; + } + + const vds_t& vds() const exprtk_override + { + return vds_; + } + + inline vector_holder_t& vec_holder() + { + return (*vector_holder_); + } + + private: + + vector_holder_t* vector_holder_; + vds_t vds_; + }; + + template + class vector_elem_node exprtk_final + : public expression_node, + public ivariable + { + public: + + typedef expression_node* expression_ptr; + typedef vector_holder vector_holder_t; + typedef vector_holder_t* vector_holder_ptr; + typedef std::pair branch_t; + + vector_elem_node(expression_ptr index, vector_holder_ptr vec_holder) + : vec_holder_(vec_holder) + , vector_base_((*vec_holder)[0]) + { + construct_branch_pair(index_, index); + } + + inline T value() const exprtk_override + { + return *(vector_base_ + static_cast(details::numeric::to_int64(index_.first->value()))); + } + + inline T& ref() exprtk_override + { + return *(vector_base_ + static_cast(details::numeric::to_int64(index_.first->value()))); + } + + inline const T& ref() const exprtk_override + { + return *(vector_base_ + static_cast(details::numeric::to_int64(index_.first->value()))); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_vecelem; + } + + inline vector_holder_t& vec_holder() + { + return (*vec_holder_); + } + + void collect_nodes(typename expression_node::noderef_list_t& node_delete_list) exprtk_override + { + expression_node::ndb_t::collect(index_, node_delete_list); + } + + std::size_t node_depth() const exprtk_override + { + return expression_node::ndb_t::compute_node_depth(index_); + } + + private: + + vector_holder_ptr vec_holder_; + T* vector_base_; + branch_t index_; + }; + + template + class rebasevector_elem_node exprtk_final + : public expression_node, + public ivariable + { + public: + + typedef expression_node* expression_ptr; + typedef vector_holder vector_holder_t; + typedef vector_holder_t* vector_holder_ptr; + typedef vec_data_store vds_t; + typedef std::pair branch_t; + + rebasevector_elem_node(expression_ptr index, vector_holder_ptr vec_holder) + : vector_holder_(vec_holder) + , vds_((*vector_holder_).size(),(*vector_holder_)[0]) + { + vector_holder_->set_ref(&vds_.ref()); + construct_branch_pair(index_, index); + } + + inline T value() const exprtk_override + { + return *(vds_.data() + static_cast(details::numeric::to_int64(index_.first->value()))); + } + + inline T& ref() exprtk_override + { + return *(vds_.data() + static_cast(details::numeric::to_int64(index_.first->value()))); + } + + inline const T& ref() const exprtk_override + { + return *(vds_.data() + static_cast(details::numeric::to_int64(index_.first->value()))); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_rbvecelem; + } + + inline vector_holder_t& vec_holder() + { + return (*vector_holder_); + } + + void collect_nodes(typename expression_node::noderef_list_t& node_delete_list) exprtk_override + { + expression_node::ndb_t::template collect(index_, node_delete_list); + } + + std::size_t node_depth() const exprtk_override + { + return expression_node::ndb_t::compute_node_depth(index_); + } + + private: + + vector_holder_ptr vector_holder_; + vds_t vds_; + branch_t index_; + }; + + template + class rebasevector_celem_node exprtk_final + : public expression_node, + public ivariable + { + public: + + typedef expression_node* expression_ptr; + typedef vector_holder vector_holder_t; + typedef vector_holder_t* vector_holder_ptr; + typedef vec_data_store vds_t; + + rebasevector_celem_node(const std::size_t index, vector_holder_ptr vec_holder) + : index_(index) + , vector_holder_(vec_holder) + , vds_((*vector_holder_).size(),(*vector_holder_)[0]) + { + vector_holder_->set_ref(&vds_.ref()); + } + + inline T value() const exprtk_override + { + return *(vds_.data() + index_); + } + + inline T& ref() exprtk_override + { + return *(vds_.data() + index_); + } + + inline const T& ref() const exprtk_override + { + return *(vds_.data() + index_); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_rbveccelem; + } + + inline vector_holder_t& vec_holder() + { + return (*vector_holder_); + } + + private: + + const std::size_t index_; + vector_holder_ptr vector_holder_; + vds_t vds_; + }; + + template + class vector_assignment_node exprtk_final : public expression_node + { + public: + + typedef expression_node* expression_ptr; + + vector_assignment_node(T* vector_base, + const std::size_t& size, + const std::vector& initialiser_list, + const bool single_value_initialse) + : vector_base_(vector_base) + , initialiser_list_(initialiser_list) + , size_(size) + , single_value_initialse_(single_value_initialse) + {} + + inline T value() const exprtk_override + { + if (single_value_initialse_) + { + for (std::size_t i = 0; i < size_; ++i) + { + *(vector_base_ + i) = initialiser_list_[0]->value(); + } + } + else + { + const std::size_t initialiser_list_size = initialiser_list_.size(); + + for (std::size_t i = 0; i < initialiser_list_size; ++i) + { + *(vector_base_ + i) = initialiser_list_[i]->value(); + } + + if (initialiser_list_size < size_) + { + for (std::size_t i = initialiser_list_size; i < size_; ++i) + { + *(vector_base_ + i) = T(0); + } + } + } + + return *(vector_base_); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_vecdefass; + } + + void collect_nodes(typename expression_node::noderef_list_t& node_delete_list) exprtk_override + { + expression_node::ndb_t::collect(initialiser_list_, node_delete_list); + } + + std::size_t node_depth() const exprtk_override + { + return expression_node::ndb_t::compute_node_depth(initialiser_list_); + } + + private: + + vector_assignment_node(const vector_assignment_node&) exprtk_delete; + vector_assignment_node& operator=(const vector_assignment_node&) exprtk_delete; + + mutable T* vector_base_; + std::vector initialiser_list_; + const std::size_t size_; + const bool single_value_initialse_; + }; + + template + class swap_node exprtk_final : public expression_node + { + public: + + typedef expression_node* expression_ptr; + typedef variable_node* variable_node_ptr; + + swap_node(variable_node_ptr var0, variable_node_ptr var1) + : var0_(var0) + , var1_(var1) + {} + + inline T value() const exprtk_override + { + std::swap(var0_->ref(),var1_->ref()); + return var1_->ref(); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_swap; + } + + private: + + variable_node_ptr var0_; + variable_node_ptr var1_; + }; + + template + class swap_generic_node exprtk_final : public binary_node + { + public: + + typedef expression_node* expression_ptr; + typedef ivariable* ivariable_ptr; + + swap_generic_node(expression_ptr var0, expression_ptr var1) + : binary_node(details::e_swap, var0, var1) + , var0_(dynamic_cast(var0)) + , var1_(dynamic_cast(var1)) + {} + + inline T value() const exprtk_override + { + std::swap(var0_->ref(),var1_->ref()); + return var1_->ref(); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_swap; + } + + private: + + ivariable_ptr var0_; + ivariable_ptr var1_; + }; + + template + class swap_vecvec_node exprtk_final + : public binary_node + , public vector_interface + { + public: + + typedef expression_node* expression_ptr; + typedef vector_node * vector_node_ptr; + typedef vec_data_store vds_t; + + using binary_node::branch; + + swap_vecvec_node(expression_ptr branch0, + expression_ptr branch1) + : binary_node(details::e_swap, branch0, branch1) + , vec0_node_ptr_(0) + , vec1_node_ptr_(0) + , vec_size_ (0) + , initialised_ (false) + { + if (is_ivector_node(branch(0))) + { + vector_interface* vi = reinterpret_cast*>(0); + + if (0 != (vi = dynamic_cast*>(branch(0)))) + { + vec0_node_ptr_ = vi->vec(); + vds() = vi->vds(); + } + } + + if (is_ivector_node(branch(1))) + { + vector_interface* vi = reinterpret_cast*>(0); + + if (0 != (vi = dynamic_cast*>(branch(1)))) + { + vec1_node_ptr_ = vi->vec(); + } + } + + if (vec0_node_ptr_ && vec1_node_ptr_) + { + vec_size_ = std::min(vec0_node_ptr_->vds().size(), + vec1_node_ptr_->vds().size()); + + initialised_ = true; + } + + assert(initialised_); + } + + inline T value() const exprtk_override + { + if (initialised_) + { + assert(branch(0)); + assert(branch(1)); + + binary_node::branch(0)->value(); + binary_node::branch(1)->value(); + + T* vec0 = vec0_node_ptr_->vds().data(); + T* vec1 = vec1_node_ptr_->vds().data(); + + for (std::size_t i = 0; i < vec_size_; ++i) + { + std::swap(vec0[i],vec1[i]); + } + + return vec1_node_ptr_->value(); + } + else + return std::numeric_limits::quiet_NaN(); + } + + vector_node_ptr vec() const exprtk_override + { + return vec0_node_ptr_; + } + + vector_node_ptr vec() exprtk_override + { + return vec0_node_ptr_; + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_vecvecswap; + } + + std::size_t size() const exprtk_override + { + return vec_size_; + } + + vds_t& vds() exprtk_override + { + return vds_; + } + + const vds_t& vds() const exprtk_override + { + return vds_; + } + + private: + + vector_node* vec0_node_ptr_; + vector_node* vec1_node_ptr_; + std::size_t vec_size_; + bool initialised_; + vds_t vds_; + }; + + #ifndef exprtk_disable_string_capabilities + template + class stringvar_node exprtk_final + : public expression_node , + public string_base_node, + public range_interface + { + public: + + typedef typename range_interface::range_t range_t; + + static std::string null_value; + + explicit stringvar_node() + : value_(&null_value) + {} + + explicit stringvar_node(std::string& v) + : value_(&v) + { + rp_.n0_c = std::make_pair(true,0); + rp_.n1_c = std::make_pair(true,v.size() - 1); + rp_.cache.first = rp_.n0_c.second; + rp_.cache.second = rp_.n1_c.second; + } + + inline bool operator <(const stringvar_node& v) const + { + return this < (&v); + } + + inline T value() const exprtk_override + { + rp_.n1_c.second = (*value_).size() - 1; + rp_.cache.second = rp_.n1_c.second; + + return std::numeric_limits::quiet_NaN(); + } + + std::string str() const exprtk_override + { + return ref(); + } + + char_cptr base() const exprtk_override + { + return &(*value_)[0]; + } + + std::size_t size() const exprtk_override + { + return ref().size(); + } + + std::string& ref() + { + return (*value_); + } + + const std::string& ref() const + { + return (*value_); + } + + range_t& range_ref() exprtk_override + { + return rp_; + } + + const range_t& range_ref() const exprtk_override + { + return rp_; + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_stringvar; + } + + void rebase(std::string& s) + { + value_ = &s; + rp_.n0_c = std::make_pair(true,0); + rp_.n1_c = std::make_pair(true,value_->size() - 1); + rp_.cache.first = rp_.n0_c.second; + rp_.cache.second = rp_.n1_c.second; + } + + private: + + std::string* value_; + mutable range_t rp_; + }; + + template + std::string stringvar_node::null_value = std::string(""); + + template + class string_range_node exprtk_final + : public expression_node , + public string_base_node, + public range_interface + { + public: + + typedef typename range_interface::range_t range_t; + + static std::string null_value; + + explicit string_range_node(std::string& v, const range_t& rp) + : value_(&v) + , rp_(rp) + {} + + virtual ~string_range_node() + { + rp_.free(); + } + + inline bool operator <(const string_range_node& v) const + { + return this < (&v); + } + + inline T value() const exprtk_override + { + return std::numeric_limits::quiet_NaN(); + } + + inline std::string str() const exprtk_override + { + return (*value_); + } + + char_cptr base() const exprtk_override + { + return &(*value_)[0]; + } + + std::size_t size() const exprtk_override + { + return ref().size(); + } + + inline range_t range() const + { + return rp_; + } + + inline virtual std::string& ref() + { + return (*value_); + } + + inline virtual const std::string& ref() const + { + return (*value_); + } + + inline range_t& range_ref() exprtk_override + { + return rp_; + } + + inline const range_t& range_ref() const exprtk_override + { + return rp_; + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_stringvarrng; + } + + private: + + std::string* value_; + range_t rp_; + }; + + template + std::string string_range_node::null_value = std::string(""); + + template + class const_string_range_node exprtk_final + : public expression_node , + public string_base_node, + public range_interface + { + public: + + typedef typename range_interface::range_t range_t; + + explicit const_string_range_node(const std::string& v, const range_t& rp) + : value_(v) + , rp_(rp) + {} + + ~const_string_range_node() + { + rp_.free(); + } + + inline T value() const exprtk_override + { + return std::numeric_limits::quiet_NaN(); + } + + std::string str() const exprtk_override + { + return value_; + } + + char_cptr base() const exprtk_override + { + return value_.data(); + } + + std::size_t size() const exprtk_override + { + return value_.size(); + } + + range_t range() const + { + return rp_; + } + + range_t& range_ref() exprtk_override + { + return rp_; + } + + const range_t& range_ref() const exprtk_override + { + return rp_; + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_cstringvarrng; + } + + private: + + const_string_range_node(const const_string_range_node&) exprtk_delete; + const_string_range_node& operator=(const const_string_range_node&) exprtk_delete; + + const std::string value_; + range_t rp_; + }; + + template + class generic_string_range_node exprtk_final + : public expression_node , + public string_base_node, + public range_interface + { + public: + + typedef expression_node * expression_ptr; + typedef stringvar_node * strvar_node_ptr; + typedef string_base_node* str_base_ptr; + typedef typename range_interface::range_t range_t; + typedef range_t* range_ptr; + typedef range_interface irange_t; + typedef irange_t* irange_ptr; + typedef std::pair branch_t; + + generic_string_range_node(expression_ptr str_branch, const range_t& brange) + : initialised_(false) + , str_base_ptr_ (0) + , str_range_ptr_(0) + , base_range_(brange) + { + range_.n0_c = std::make_pair(true,0); + range_.n1_c = std::make_pair(true,0); + range_.cache.first = range_.n0_c.second; + range_.cache.second = range_.n1_c.second; + + construct_branch_pair(branch_, str_branch); + + if (is_generally_string_node(branch_.first)) + { + str_base_ptr_ = dynamic_cast(branch_.first); + + if (0 == str_base_ptr_) + return; + + str_range_ptr_ = dynamic_cast(branch_.first); + + if (0 == str_range_ptr_) + return; + } + + initialised_ = (str_base_ptr_ && str_range_ptr_); + + assert(initialised_); + } + + ~generic_string_range_node() + { + base_range_.free(); + } + + inline T value() const exprtk_override + { + if (initialised_) + { + assert(branch_.first); + + branch_.first->value(); + + std::size_t str_r0 = 0; + std::size_t str_r1 = 0; + + std::size_t r0 = 0; + std::size_t r1 = 0; + + const range_t& range = str_range_ptr_->range_ref(); + + const std::size_t base_str_size = str_base_ptr_->size(); + + if ( + range (str_r0, str_r1, base_str_size) && + base_range_( r0, r1, base_str_size - str_r0) + ) + { + const std::size_t size = (r1 - r0) + 1; + + range_.n1_c.second = size - 1; + range_.cache.second = range_.n1_c.second; + + value_.assign(str_base_ptr_->base() + str_r0 + r0, size); + } + } + + return std::numeric_limits::quiet_NaN(); + } + + std::string str() const exprtk_override + { + return value_; + } + + char_cptr base() const exprtk_override + { + return &value_[0]; + } + + std::size_t size() const exprtk_override + { + return value_.size(); + } + + range_t& range_ref() exprtk_override + { + return range_; + } + + const range_t& range_ref() const exprtk_override + { + return range_; + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_strgenrange; + } + + void collect_nodes(typename expression_node::noderef_list_t& node_delete_list) exprtk_override + { + expression_node::ndb_t::collect(branch_, node_delete_list); + } + + std::size_t node_depth() const exprtk_override + { + return expression_node::ndb_t::compute_node_depth(branch_); + } + + private: + + bool initialised_; + branch_t branch_; + str_base_ptr str_base_ptr_; + irange_ptr str_range_ptr_; + mutable range_t base_range_; + mutable range_t range_; + mutable std::string value_; + }; + + template + class string_concat_node exprtk_final + : public binary_node , + public string_base_node, + public range_interface + { + public: + + typedef typename range_interface::range_t range_t; + typedef range_interface irange_t; + typedef irange_t* irange_ptr; + typedef range_t* range_ptr; + typedef expression_node * expression_ptr; + typedef string_base_node* str_base_ptr; + + using binary_node::branch; + + string_concat_node(const operator_type& opr, + expression_ptr branch0, + expression_ptr branch1) + : binary_node(opr, branch0, branch1) + , initialised_(false) + , str0_base_ptr_ (0) + , str1_base_ptr_ (0) + , str0_range_ptr_(0) + , str1_range_ptr_(0) + { + range_.n0_c = std::make_pair(true,0); + range_.n1_c = std::make_pair(true,0); + + range_.cache.first = range_.n0_c.second; + range_.cache.second = range_.n1_c.second; + + if (is_generally_string_node(branch(0))) + { + str0_base_ptr_ = dynamic_cast(branch(0)); + + if (0 == str0_base_ptr_) + return; + + str0_range_ptr_ = dynamic_cast(branch(0)); + + if (0 == str0_range_ptr_) + return; + } + + if (is_generally_string_node(branch(1))) + { + str1_base_ptr_ = dynamic_cast(branch(1)); + + if (0 == str1_base_ptr_) + return; + + str1_range_ptr_ = dynamic_cast(branch(1)); + + if (0 == str1_range_ptr_) + return; + } + + initialised_ = str0_base_ptr_ && + str1_base_ptr_ && + str0_range_ptr_ && + str1_range_ptr_ ; + + assert(initialised_); + } + + inline T value() const exprtk_override + { + if (initialised_) + { + assert(branch(0)); + assert(branch(1)); + + branch(0)->value(); + branch(1)->value(); + + std::size_t str0_r0 = 0; + std::size_t str0_r1 = 0; + + std::size_t str1_r0 = 0; + std::size_t str1_r1 = 0; + + const range_t& range0 = str0_range_ptr_->range_ref(); + const range_t& range1 = str1_range_ptr_->range_ref(); + + if ( + range0(str0_r0, str0_r1, str0_base_ptr_->size()) && + range1(str1_r0, str1_r1, str1_base_ptr_->size()) + ) + { + const std::size_t size0 = (str0_r1 - str0_r0) + 1; + const std::size_t size1 = (str1_r1 - str1_r0) + 1; + + value_.assign(str0_base_ptr_->base() + str0_r0, size0); + value_.append(str1_base_ptr_->base() + str1_r0, size1); + + range_.n1_c.second = value_.size() - 1; + range_.cache.second = range_.n1_c.second; + } + } + + return std::numeric_limits::quiet_NaN(); + } + + std::string str() const exprtk_override + { + return value_; + } + + char_cptr base() const exprtk_override + { + return &value_[0]; + } + + std::size_t size() const exprtk_override + { + return value_.size(); + } + + range_t& range_ref() exprtk_override + { + return range_; + } + + const range_t& range_ref() const exprtk_override + { + return range_; + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_strconcat; + } + + private: + + bool initialised_; + str_base_ptr str0_base_ptr_; + str_base_ptr str1_base_ptr_; + irange_ptr str0_range_ptr_; + irange_ptr str1_range_ptr_; + mutable range_t range_; + mutable std::string value_; + }; + + template + class swap_string_node exprtk_final + : public binary_node , + public string_base_node, + public range_interface + { + public: + + typedef typename range_interface::range_t range_t; + typedef range_t* range_ptr; + typedef range_interface irange_t; + typedef irange_t* irange_ptr; + typedef expression_node * expression_ptr; + typedef stringvar_node * strvar_node_ptr; + typedef string_base_node* str_base_ptr; + + using binary_node::branch; + + swap_string_node(expression_ptr branch0, expression_ptr branch1) + : binary_node(details::e_swap, branch0, branch1), + initialised_(false), + str0_node_ptr_(0), + str1_node_ptr_(0) + { + if (is_string_node(branch(0))) + { + str0_node_ptr_ = static_cast(branch(0)); + } + + if (is_string_node(branch(1))) + { + str1_node_ptr_ = static_cast(branch(1)); + } + + initialised_ = (str0_node_ptr_ && str1_node_ptr_); + + assert(initialised_); + } + + inline T value() const exprtk_override + { + if (initialised_) + { + assert(branch(0)); + assert(branch(1)); + + branch(0)->value(); + branch(1)->value(); + + std::swap(str0_node_ptr_->ref(), str1_node_ptr_->ref()); + } + + return std::numeric_limits::quiet_NaN(); + } + + std::string str() const exprtk_override + { + return str0_node_ptr_->str(); + } + + char_cptr base() const exprtk_override + { + return str0_node_ptr_->base(); + } + + std::size_t size() const exprtk_override + { + return str0_node_ptr_->size(); + } + + range_t& range_ref() exprtk_override + { + return str0_node_ptr_->range_ref(); + } + + const range_t& range_ref() const exprtk_override + { + return str0_node_ptr_->range_ref(); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_strswap; + } + + private: + + bool initialised_; + strvar_node_ptr str0_node_ptr_; + strvar_node_ptr str1_node_ptr_; + }; + + template + class swap_genstrings_node exprtk_final : public binary_node + { + public: + + typedef typename range_interface::range_t range_t; + typedef range_t* range_ptr; + typedef range_interface irange_t; + typedef irange_t* irange_ptr; + typedef expression_node * expression_ptr; + typedef string_base_node* str_base_ptr; + + using binary_node::branch; + + swap_genstrings_node(expression_ptr branch0, + expression_ptr branch1) + : binary_node(details::e_default, branch0, branch1) + , str0_base_ptr_ (0) + , str1_base_ptr_ (0) + , str0_range_ptr_(0) + , str1_range_ptr_(0) + , initialised_(false) + { + if (is_generally_string_node(branch(0))) + { + str0_base_ptr_ = dynamic_cast(branch(0)); + + if (0 == str0_base_ptr_) + return; + + irange_ptr range = dynamic_cast(branch(0)); + + if (0 == range) + return; + + str0_range_ptr_ = &(range->range_ref()); + } + + if (is_generally_string_node(branch(1))) + { + str1_base_ptr_ = dynamic_cast(branch(1)); + + if (0 == str1_base_ptr_) + return; + + irange_ptr range = dynamic_cast(branch(1)); + + if (0 == range) + return; + + str1_range_ptr_ = &(range->range_ref()); + } + + initialised_ = str0_base_ptr_ && + str1_base_ptr_ && + str0_range_ptr_ && + str1_range_ptr_ ; + + assert(initialised_); + } + + inline T value() const exprtk_override + { + if (initialised_) + { + assert(branch(0)); + assert(branch(1)); + + branch(0)->value(); + branch(1)->value(); + + std::size_t str0_r0 = 0; + std::size_t str0_r1 = 0; + + std::size_t str1_r0 = 0; + std::size_t str1_r1 = 0; + + const range_t& range0 = (*str0_range_ptr_); + const range_t& range1 = (*str1_range_ptr_); + + if ( + range0(str0_r0, str0_r1, str0_base_ptr_->size()) && + range1(str1_r0, str1_r1, str1_base_ptr_->size()) + ) + { + const std::size_t size0 = range0.cache_size(); + const std::size_t size1 = range1.cache_size(); + const std::size_t max_size = std::min(size0,size1); + + char_ptr s0 = const_cast(str0_base_ptr_->base() + str0_r0); + char_ptr s1 = const_cast(str1_base_ptr_->base() + str1_r0); + + loop_unroll::details lud(max_size); + char_cptr upper_bound = s0 + lud.upper_bound; + + while (s0 < upper_bound) + { + #define exprtk_loop(N) \ + std::swap(s0[N], s1[N]); \ + + exprtk_loop( 0) exprtk_loop( 1) + exprtk_loop( 2) exprtk_loop( 3) + #ifndef exprtk_disable_superscalar_unroll + exprtk_loop( 4) exprtk_loop( 5) + exprtk_loop( 6) exprtk_loop( 7) + exprtk_loop( 8) exprtk_loop( 9) + exprtk_loop(10) exprtk_loop(11) + exprtk_loop(12) exprtk_loop(13) + exprtk_loop(14) exprtk_loop(15) + #endif + + s0 += lud.batch_size; + s1 += lud.batch_size; + } + + int i = 0; + + exprtk_disable_fallthrough_begin + switch (lud.remainder) + { + #define case_stmt(N) \ + case N : { std::swap(s0[i], s1[i]); ++i; } \ + + #ifndef exprtk_disable_superscalar_unroll + case_stmt(15) case_stmt(14) + case_stmt(13) case_stmt(12) + case_stmt(11) case_stmt(10) + case_stmt( 9) case_stmt( 8) + case_stmt( 7) case_stmt( 6) + case_stmt( 5) case_stmt( 4) + #endif + case_stmt( 3) case_stmt( 2) + case_stmt( 1) + } + exprtk_disable_fallthrough_end + + #undef exprtk_loop + #undef case_stmt + } + } + + return std::numeric_limits::quiet_NaN(); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_strswap; + } + + private: + + swap_genstrings_node(const swap_genstrings_node&) exprtk_delete; + swap_genstrings_node& operator=(const swap_genstrings_node&) exprtk_delete; + + str_base_ptr str0_base_ptr_; + str_base_ptr str1_base_ptr_; + range_ptr str0_range_ptr_; + range_ptr str1_range_ptr_; + bool initialised_; + }; + + template + class stringvar_size_node exprtk_final : public expression_node + { + public: + + static std::string null_value; + + explicit stringvar_size_node() + : value_(&null_value) + {} + + explicit stringvar_size_node(std::string& v) + : value_(&v) + {} + + inline T value() const exprtk_override + { + return T((*value_).size()); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_stringvarsize; + } + + private: + + std::string* value_; + }; + + template + std::string stringvar_size_node::null_value = std::string(""); + + template + class string_size_node exprtk_final : public expression_node + { + public: + + typedef expression_node * expression_ptr; + typedef string_base_node* str_base_ptr; + typedef std::pair branch_t; + + explicit string_size_node(expression_ptr branch) + : str_base_ptr_(0) + { + construct_branch_pair(branch_, branch); + + if (is_generally_string_node(branch_.first)) + { + str_base_ptr_ = dynamic_cast(branch_.first); + + if (0 == str_base_ptr_) + return; + } + } + + inline T value() const exprtk_override + { + T result = std::numeric_limits::quiet_NaN(); + + if (str_base_ptr_) + { + branch_.first->value(); + result = T(str_base_ptr_->size()); + } + + return result; + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_stringsize; + } + + void collect_nodes(typename expression_node::noderef_list_t& node_delete_list) exprtk_override + { + expression_node::ndb_t::collect(branch_, node_delete_list); + } + + std::size_t node_depth() const exprtk_override + { + return expression_node::ndb_t::compute_node_depth(branch_); + } + + private: + + branch_t branch_; + str_base_ptr str_base_ptr_; + }; + + struct asn_assignment + { + static inline void execute(std::string& s, char_cptr data, const std::size_t size) + { s.assign(data,size); } + }; + + struct asn_addassignment + { + static inline void execute(std::string& s, char_cptr data, const std::size_t size) + { s.append(data,size); } + }; + + template + class assignment_string_node exprtk_final + : public binary_node , + public string_base_node, + public range_interface + { + public: + + typedef typename range_interface::range_t range_t; + typedef range_t* range_ptr; + typedef range_interface irange_t; + typedef irange_t* irange_ptr; + typedef expression_node * expression_ptr; + typedef stringvar_node * strvar_node_ptr; + typedef string_base_node* str_base_ptr; + + using binary_node::branch; + + assignment_string_node(const operator_type& opr, + expression_ptr branch0, + expression_ptr branch1) + : binary_node(opr, branch0, branch1) + , initialised_(false) + , str0_base_ptr_ (0) + , str1_base_ptr_ (0) + , str0_node_ptr_ (0) + , str1_range_ptr_(0) + { + if (is_string_node(branch(0))) + { + str0_node_ptr_ = static_cast(branch(0)); + str0_base_ptr_ = dynamic_cast(branch(0)); + } + + if (is_generally_string_node(branch(1))) + { + str1_base_ptr_ = dynamic_cast(branch(1)); + + if (0 == str1_base_ptr_) + return; + + irange_ptr range = dynamic_cast(branch(1)); + + if (0 == range) + return; + + str1_range_ptr_ = &(range->range_ref()); + } + + initialised_ = str0_base_ptr_ && + str1_base_ptr_ && + str0_node_ptr_ && + str1_range_ptr_ ; + + assert(initialised_); + } + + inline T value() const exprtk_override + { + if (initialised_) + { + assert(branch(0)); + assert(branch(1)); + + branch(1)->value(); + + std::size_t r0 = 0; + std::size_t r1 = 0; + + const range_t& range = (*str1_range_ptr_); + + if (range(r0, r1, str1_base_ptr_->size())) + { + AssignmentProcess::execute(str0_node_ptr_->ref(), + str1_base_ptr_->base() + r0, + (r1 - r0) + 1); + + branch(0)->value(); + } + } + + return std::numeric_limits::quiet_NaN(); + } + + std::string str() const exprtk_override + { + return str0_node_ptr_->str(); + } + + char_cptr base() const exprtk_override + { + return str0_node_ptr_->base(); + } + + std::size_t size() const exprtk_override + { + return str0_node_ptr_->size(); + } + + range_t& range_ref() exprtk_override + { + return str0_node_ptr_->range_ref(); + } + + const range_t& range_ref() const exprtk_override + { + return str0_node_ptr_->range_ref(); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_strass; + } + + private: + + bool initialised_; + str_base_ptr str0_base_ptr_; + str_base_ptr str1_base_ptr_; + strvar_node_ptr str0_node_ptr_; + range_ptr str1_range_ptr_; + }; + + template + class assignment_string_range_node exprtk_final + : public binary_node , + public string_base_node, + public range_interface + { + public: + + typedef typename range_interface::range_t range_t; + typedef range_t* range_ptr; + typedef range_interface irange_t; + typedef irange_t* irange_ptr; + typedef expression_node * expression_ptr; + typedef stringvar_node * strvar_node_ptr; + typedef string_range_node* str_rng_node_ptr; + typedef string_base_node * str_base_ptr; + + using binary_node::branch; + + assignment_string_range_node(const operator_type& opr, + expression_ptr branch0, + expression_ptr branch1) + : binary_node(opr, branch0, branch1) + , initialised_(false) + , str0_base_ptr_ (0) + , str1_base_ptr_ (0) + , str0_rng_node_ptr_(0) + , str0_range_ptr_ (0) + , str1_range_ptr_ (0) + { + if (is_string_range_node(branch(0))) + { + str0_rng_node_ptr_ = static_cast(branch(0)); + str0_base_ptr_ = dynamic_cast(branch(0)); + irange_ptr range = dynamic_cast(branch(0)); + + if (0 == range) + return; + + str0_range_ptr_ = &(range->range_ref()); + } + + if (is_generally_string_node(branch(1))) + { + str1_base_ptr_ = dynamic_cast(branch(1)); + + if (0 == str1_base_ptr_) + return; + + irange_ptr range = dynamic_cast(branch(1)); + + if (0 == range) + return; + + str1_range_ptr_ = &(range->range_ref()); + } + + initialised_ = str0_base_ptr_ && + str1_base_ptr_ && + str0_rng_node_ptr_ && + str0_range_ptr_ && + str1_range_ptr_ ; + + assert(initialised_); + } + + inline T value() const exprtk_override + { + if (initialised_) + { + assert(branch(0)); + assert(branch(1)); + + branch(0)->value(); + branch(1)->value(); + + std::size_t s0_r0 = 0; + std::size_t s0_r1 = 0; + + std::size_t s1_r0 = 0; + std::size_t s1_r1 = 0; + + const range_t& range0 = (*str0_range_ptr_); + const range_t& range1 = (*str1_range_ptr_); + + if ( + range0(s0_r0, s0_r1, str0_base_ptr_->size()) && + range1(s1_r0, s1_r1, str1_base_ptr_->size()) + ) + { + const std::size_t size = std::min((s0_r1 - s0_r0), (s1_r1 - s1_r0)) + 1; + + std::copy(str1_base_ptr_->base() + s1_r0, + str1_base_ptr_->base() + s1_r0 + size, + const_cast(base() + s0_r0)); + } + } + + return std::numeric_limits::quiet_NaN(); + } + + std::string str() const exprtk_override + { + return str0_base_ptr_->str(); + } + + char_cptr base() const exprtk_override + { + return str0_base_ptr_->base(); + } + + std::size_t size() const exprtk_override + { + return str0_base_ptr_->size(); + } + + range_t& range_ref() exprtk_override + { + return str0_rng_node_ptr_->range_ref(); + } + + const range_t& range_ref() const exprtk_override + { + return str0_rng_node_ptr_->range_ref(); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_strass; + } + + private: + + bool initialised_; + str_base_ptr str0_base_ptr_; + str_base_ptr str1_base_ptr_; + str_rng_node_ptr str0_rng_node_ptr_; + range_ptr str0_range_ptr_; + range_ptr str1_range_ptr_; + }; + + template + class conditional_string_node exprtk_final + : public trinary_node , + public string_base_node, + public range_interface + { + public: + + typedef typename range_interface::range_t range_t; + typedef range_t* range_ptr; + typedef range_interface irange_t; + typedef irange_t* irange_ptr; + typedef expression_node * expression_ptr; + typedef string_base_node* str_base_ptr; + + conditional_string_node(expression_ptr condition, + expression_ptr consequent, + expression_ptr alternative) + : trinary_node(details::e_default, consequent, alternative, condition) + , initialised_(false) + , str0_base_ptr_ (0) + , str1_base_ptr_ (0) + , str0_range_ptr_(0) + , str1_range_ptr_(0) + , condition_ (condition ) + , consequent_ (consequent ) + , alternative_(alternative) + { + range_.n0_c = std::make_pair(true,0); + range_.n1_c = std::make_pair(true,0); + + range_.cache.first = range_.n0_c.second; + range_.cache.second = range_.n1_c.second; + + if (is_generally_string_node(trinary_node::branch_[0].first)) + { + str0_base_ptr_ = dynamic_cast(trinary_node::branch_[0].first); + + if (0 == str0_base_ptr_) + return; + + str0_range_ptr_ = dynamic_cast(trinary_node::branch_[0].first); + + if (0 == str0_range_ptr_) + return; + } + + if (is_generally_string_node(trinary_node::branch_[1].first)) + { + str1_base_ptr_ = dynamic_cast(trinary_node::branch_[1].first); + + if (0 == str1_base_ptr_) + return; + + str1_range_ptr_ = dynamic_cast(trinary_node::branch_[1].first); + + if (0 == str1_range_ptr_) + return; + } + + initialised_ = str0_base_ptr_ && + str1_base_ptr_ && + str0_range_ptr_ && + str1_range_ptr_ ; + + assert(initialised_); + } + + inline T value() const exprtk_override + { + if (initialised_) + { + assert(condition_ ); + assert(consequent_ ); + assert(alternative_); + + std::size_t r0 = 0; + std::size_t r1 = 0; + + if (is_true(condition_)) + { + consequent_->value(); + + const range_t& range = str0_range_ptr_->range_ref(); + + if (range(r0, r1, str0_base_ptr_->size())) + { + const std::size_t size = (r1 - r0) + 1; + + value_.assign(str0_base_ptr_->base() + r0, size); + + range_.n1_c.second = value_.size() - 1; + range_.cache.second = range_.n1_c.second; + + return T(1); + } + } + else + { + alternative_->value(); + + const range_t& range = str1_range_ptr_->range_ref(); + + if (range(r0, r1, str1_base_ptr_->size())) + { + const std::size_t size = (r1 - r0) + 1; + + value_.assign(str1_base_ptr_->base() + r0, size); + + range_.n1_c.second = value_.size() - 1; + range_.cache.second = range_.n1_c.second; + + return T(0); + } + } + } + + return std::numeric_limits::quiet_NaN(); + } + + std::string str() const exprtk_override + { + return value_; + } + + char_cptr base() const exprtk_override + { + return &value_[0]; + } + + std::size_t size() const exprtk_override + { + return value_.size(); + } + + range_t& range_ref() exprtk_override + { + return range_; + } + + const range_t& range_ref() const exprtk_override + { + return range_; + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_strcondition; + } + + private: + + bool initialised_; + str_base_ptr str0_base_ptr_; + str_base_ptr str1_base_ptr_; + irange_ptr str0_range_ptr_; + irange_ptr str1_range_ptr_; + mutable range_t range_; + mutable std::string value_; + + expression_ptr condition_; + expression_ptr consequent_; + expression_ptr alternative_; + }; + + template + class cons_conditional_str_node exprtk_final + : public binary_node , + public string_base_node, + public range_interface + { + public: + + typedef typename range_interface::range_t range_t; + typedef range_t* range_ptr; + typedef range_interface irange_t; + typedef irange_t* irange_ptr; + typedef expression_node * expression_ptr; + typedef string_base_node* str_base_ptr; + + using binary_node::branch; + + cons_conditional_str_node(expression_ptr condition, + expression_ptr consequent) + : binary_node(details::e_default, consequent, condition) + , initialised_(false) + , str0_base_ptr_ (0) + , str0_range_ptr_(0) + , condition_ (condition ) + , consequent_(consequent) + { + range_.n0_c = std::make_pair(true,0); + range_.n1_c = std::make_pair(true,0); + + range_.cache.first = range_.n0_c.second; + range_.cache.second = range_.n1_c.second; + + if (is_generally_string_node(branch(0))) + { + str0_base_ptr_ = dynamic_cast(branch(0)); + + if (0 == str0_base_ptr_) + return; + + str0_range_ptr_ = dynamic_cast(branch(0)); + + if (0 == str0_range_ptr_) + return; + } + + initialised_ = str0_base_ptr_ && str0_range_ptr_ ; + + assert(initialised_); + } + + inline T value() const exprtk_override + { + if (initialised_) + { + assert(condition_ ); + assert(consequent_); + + if (is_true(condition_)) + { + consequent_->value(); + + const range_t& range = str0_range_ptr_->range_ref(); + + std::size_t r0 = 0; + std::size_t r1 = 0; + + if (range(r0, r1, str0_base_ptr_->size())) + { + const std::size_t size = (r1 - r0) + 1; + + value_.assign(str0_base_ptr_->base() + r0, size); + + range_.n1_c.second = value_.size() - 1; + range_.cache.second = range_.n1_c.second; + + return T(1); + } + } + } + + return std::numeric_limits::quiet_NaN(); + } + + std::string str() const + { + return value_; + } + + char_cptr base() const + { + return &value_[0]; + } + + std::size_t size() const + { + return value_.size(); + } + + range_t& range_ref() + { + return range_; + } + + const range_t& range_ref() const + { + return range_; + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_strccondition; + } + + private: + + bool initialised_; + str_base_ptr str0_base_ptr_; + irange_ptr str0_range_ptr_; + mutable range_t range_; + mutable std::string value_; + + expression_ptr condition_; + expression_ptr consequent_; + }; + + template + class str_vararg_node exprtk_final + : public expression_node , + public string_base_node, + public range_interface + { + public: + + typedef typename range_interface::range_t range_t; + typedef range_t* range_ptr; + typedef range_interface irange_t; + typedef irange_t* irange_ptr; + typedef expression_node * expression_ptr; + typedef string_base_node* str_base_ptr; + typedef std::pair branch_t; + + template class Sequence> + explicit str_vararg_node(const Sequence& arg_list) + : initialised_(false) + , str_base_ptr_ (0) + , str_range_ptr_(0) + { + construct_branch_pair(final_node_, const_cast(arg_list.back())); + + if (0 == final_node_.first) + return; + else if (!is_generally_string_node(final_node_.first)) + return; + + str_base_ptr_ = dynamic_cast(final_node_.first); + + if (0 == str_base_ptr_) + return; + + str_range_ptr_ = dynamic_cast(final_node_.first); + + if (0 == str_range_ptr_) + return; + + initialised_ = str_base_ptr_ && str_range_ptr_; + + if (arg_list.size() > 1) + { + const std::size_t arg_list_size = arg_list.size() - 1; + + arg_list_.resize(arg_list_size); + + for (std::size_t i = 0; i < arg_list_size; ++i) + { + if (arg_list[i]) + { + construct_branch_pair(arg_list_[i], arg_list[i]); + } + else + { + arg_list_.clear(); + return; + } + } + } + } + + inline T value() const exprtk_override + { + if (!arg_list_.empty()) + { + VarArgFunction::process(arg_list_); + } + + final_node_.first->value(); + + return std::numeric_limits::quiet_NaN(); + } + + std::string str() const exprtk_override + { + return str_base_ptr_->str(); + } + + char_cptr base() const exprtk_override + { + return str_base_ptr_->base(); + } + + std::size_t size() const exprtk_override + { + return str_base_ptr_->size(); + } + + range_t& range_ref() exprtk_override + { + return str_range_ptr_->range_ref(); + } + + const range_t& range_ref() const exprtk_override + { + return str_range_ptr_->range_ref(); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_stringvararg; + } + + void collect_nodes(typename expression_node::noderef_list_t& node_delete_list) exprtk_override + { + expression_node::ndb_t::collect(final_node_ , node_delete_list); + expression_node::ndb_t::collect(arg_list_ , node_delete_list); + } + + std::size_t node_depth() const exprtk_override + { + return std::max( + expression_node::ndb_t::compute_node_depth(final_node_), + expression_node::ndb_t::compute_node_depth(arg_list_ )); + } + + private: + + bool initialised_; + branch_t final_node_; + str_base_ptr str_base_ptr_; + irange_ptr str_range_ptr_; + std::vector arg_list_; + }; + #endif + + template + inline T axn(const T a, const T x) + { + // a*x^n + return a * exprtk::details::numeric::fast_exp::result(x); + } + + template + inline T axnb(const T a, const T x, const T b) + { + // a*x^n+b + return a * exprtk::details::numeric::fast_exp::result(x) + b; + } + + template + struct sf_base + { + typedef typename details::functor_t::Type Type; + typedef typename details::functor_t functor_t; + typedef typename functor_t::qfunc_t quaternary_functor_t; + typedef typename functor_t::tfunc_t trinary_functor_t; + typedef typename functor_t::bfunc_t binary_functor_t; + typedef typename functor_t::ufunc_t unary_functor_t; + }; + + #define define_sfop3(NN, OP0, OP1) \ + template \ + struct sf##NN##_op : public sf_base \ + { \ + typedef typename sf_base::Type const Type; \ + static inline T process(Type x, Type y, Type z) \ + { \ + return (OP0); \ + } \ + static inline std::string id() \ + { \ + return (OP1); \ + } \ + }; \ + + define_sfop3(00,(x + y) / z ,"(t+t)/t") + define_sfop3(01,(x + y) * z ,"(t+t)*t") + define_sfop3(02,(x + y) - z ,"(t+t)-t") + define_sfop3(03,(x + y) + z ,"(t+t)+t") + define_sfop3(04,(x - y) + z ,"(t-t)+t") + define_sfop3(05,(x - y) / z ,"(t-t)/t") + define_sfop3(06,(x - y) * z ,"(t-t)*t") + define_sfop3(07,(x * y) + z ,"(t*t)+t") + define_sfop3(08,(x * y) - z ,"(t*t)-t") + define_sfop3(09,(x * y) / z ,"(t*t)/t") + define_sfop3(10,(x * y) * z ,"(t*t)*t") + define_sfop3(11,(x / y) + z ,"(t/t)+t") + define_sfop3(12,(x / y) - z ,"(t/t)-t") + define_sfop3(13,(x / y) / z ,"(t/t)/t") + define_sfop3(14,(x / y) * z ,"(t/t)*t") + define_sfop3(15,x / (y + z) ,"t/(t+t)") + define_sfop3(16,x / (y - z) ,"t/(t-t)") + define_sfop3(17,x / (y * z) ,"t/(t*t)") + define_sfop3(18,x / (y / z) ,"t/(t/t)") + define_sfop3(19,x * (y + z) ,"t*(t+t)") + define_sfop3(20,x * (y - z) ,"t*(t-t)") + define_sfop3(21,x * (y * z) ,"t*(t*t)") + define_sfop3(22,x * (y / z) ,"t*(t/t)") + define_sfop3(23,x - (y + z) ,"t-(t+t)") + define_sfop3(24,x - (y - z) ,"t-(t-t)") + define_sfop3(25,x - (y / z) ,"t-(t/t)") + define_sfop3(26,x - (y * z) ,"t-(t*t)") + define_sfop3(27,x + (y * z) ,"t+(t*t)") + define_sfop3(28,x + (y / z) ,"t+(t/t)") + define_sfop3(29,x + (y + z) ,"t+(t+t)") + define_sfop3(30,x + (y - z) ,"t+(t-t)") + define_sfop3(31,(axnb(x,y,z))," ") + define_sfop3(32,(axnb(x,y,z))," ") + define_sfop3(33,(axnb(x,y,z))," ") + define_sfop3(34,(axnb(x,y,z))," ") + define_sfop3(35,(axnb(x,y,z))," ") + define_sfop3(36,(axnb(x,y,z))," ") + define_sfop3(37,(axnb(x,y,z))," ") + define_sfop3(38,(axnb(x,y,z))," ") + define_sfop3(39,x * numeric::log(y) + z,"") + define_sfop3(40,x * numeric::log(y) - z,"") + define_sfop3(41,x * numeric::log10(y) + z,"") + define_sfop3(42,x * numeric::log10(y) - z,"") + define_sfop3(43,x * numeric::sin(y) + z ,"") + define_sfop3(44,x * numeric::sin(y) - z ,"") + define_sfop3(45,x * numeric::cos(y) + z ,"") + define_sfop3(46,x * numeric::cos(y) - z ,"") + define_sfop3(47,details::is_true(x) ? y : z,"") + + #define define_sfop4(NN, OP0, OP1) \ + template \ + struct sf##NN##_op : public sf_base \ + { \ + typedef typename sf_base::Type const Type; \ + static inline T process(Type x, Type y, Type z, Type w) \ + { \ + return (OP0); \ + } \ + static inline std::string id() \ + { \ + return (OP1); \ + } \ + }; \ + + define_sfop4(48,(x + ((y + z) / w)),"t+((t+t)/t)") + define_sfop4(49,(x + ((y + z) * w)),"t+((t+t)*t)") + define_sfop4(50,(x + ((y - z) / w)),"t+((t-t)/t)") + define_sfop4(51,(x + ((y - z) * w)),"t+((t-t)*t)") + define_sfop4(52,(x + ((y * z) / w)),"t+((t*t)/t)") + define_sfop4(53,(x + ((y * z) * w)),"t+((t*t)*t)") + define_sfop4(54,(x + ((y / z) + w)),"t+((t/t)+t)") + define_sfop4(55,(x + ((y / z) / w)),"t+((t/t)/t)") + define_sfop4(56,(x + ((y / z) * w)),"t+((t/t)*t)") + define_sfop4(57,(x - ((y + z) / w)),"t-((t+t)/t)") + define_sfop4(58,(x - ((y + z) * w)),"t-((t+t)*t)") + define_sfop4(59,(x - ((y - z) / w)),"t-((t-t)/t)") + define_sfop4(60,(x - ((y - z) * w)),"t-((t-t)*t)") + define_sfop4(61,(x - ((y * z) / w)),"t-((t*t)/t)") + define_sfop4(62,(x - ((y * z) * w)),"t-((t*t)*t)") + define_sfop4(63,(x - ((y / z) / w)),"t-((t/t)/t)") + define_sfop4(64,(x - ((y / z) * w)),"t-((t/t)*t)") + define_sfop4(65,(((x + y) * z) - w),"((t+t)*t)-t") + define_sfop4(66,(((x - y) * z) - w),"((t-t)*t)-t") + define_sfop4(67,(((x * y) * z) - w),"((t*t)*t)-t") + define_sfop4(68,(((x / y) * z) - w),"((t/t)*t)-t") + define_sfop4(69,(((x + y) / z) - w),"((t+t)/t)-t") + define_sfop4(70,(((x - y) / z) - w),"((t-t)/t)-t") + define_sfop4(71,(((x * y) / z) - w),"((t*t)/t)-t") + define_sfop4(72,(((x / y) / z) - w),"((t/t)/t)-t") + define_sfop4(73,((x * y) + (z * w)),"(t*t)+(t*t)") + define_sfop4(74,((x * y) - (z * w)),"(t*t)-(t*t)") + define_sfop4(75,((x * y) + (z / w)),"(t*t)+(t/t)") + define_sfop4(76,((x * y) - (z / w)),"(t*t)-(t/t)") + define_sfop4(77,((x / y) + (z / w)),"(t/t)+(t/t)") + define_sfop4(78,((x / y) - (z / w)),"(t/t)-(t/t)") + define_sfop4(79,((x / y) - (z * w)),"(t/t)-(t*t)") + define_sfop4(80,(x / (y + (z * w))),"t/(t+(t*t))") + define_sfop4(81,(x / (y - (z * w))),"t/(t-(t*t))") + define_sfop4(82,(x * (y + (z * w))),"t*(t+(t*t))") + define_sfop4(83,(x * (y - (z * w))),"t*(t-(t*t))") + + define_sfop4(84,(axn(x,y) + axn(z,w)),"") + define_sfop4(85,(axn(x,y) + axn(z,w)),"") + define_sfop4(86,(axn(x,y) + axn(z,w)),"") + define_sfop4(87,(axn(x,y) + axn(z,w)),"") + define_sfop4(88,(axn(x,y) + axn(z,w)),"") + define_sfop4(89,(axn(x,y) + axn(z,w)),"") + define_sfop4(90,(axn(x,y) + axn(z,w)),"") + define_sfop4(91,(axn(x,y) + axn(z,w)),"") + define_sfop4(92,((details::is_true(x) && details::is_true(y)) ? z : w),"") + define_sfop4(93,((details::is_true(x) || details::is_true(y)) ? z : w),"") + define_sfop4(94,((x < y) ? z : w),"") + define_sfop4(95,((x <= y) ? z : w),"") + define_sfop4(96,((x > y) ? z : w),"") + define_sfop4(97,((x >= y) ? z : w),"") + define_sfop4(98,(details::is_true(numeric::equal(x,y)) ? z : w),"") + define_sfop4(99,(x * numeric::sin(y) + z * numeric::cos(w)),"") + + define_sfop4(ext00,((x + y) - (z * w)),"(t+t)-(t*t)") + define_sfop4(ext01,((x + y) - (z / w)),"(t+t)-(t/t)") + define_sfop4(ext02,((x + y) + (z * w)),"(t+t)+(t*t)") + define_sfop4(ext03,((x + y) + (z / w)),"(t+t)+(t/t)") + define_sfop4(ext04,((x - y) + (z * w)),"(t-t)+(t*t)") + define_sfop4(ext05,((x - y) + (z / w)),"(t-t)+(t/t)") + define_sfop4(ext06,((x - y) - (z * w)),"(t-t)-(t*t)") + define_sfop4(ext07,((x - y) - (z / w)),"(t-t)-(t/t)") + define_sfop4(ext08,((x + y) - (z - w)),"(t+t)-(t-t)") + define_sfop4(ext09,((x + y) + (z - w)),"(t+t)+(t-t)") + define_sfop4(ext10,((x + y) + (z + w)),"(t+t)+(t+t)") + define_sfop4(ext11,((x + y) * (z - w)),"(t+t)*(t-t)") + define_sfop4(ext12,((x + y) / (z - w)),"(t+t)/(t-t)") + define_sfop4(ext13,((x - y) - (z + w)),"(t-t)-(t+t)") + define_sfop4(ext14,((x - y) + (z + w)),"(t-t)+(t+t)") + define_sfop4(ext15,((x - y) * (z + w)),"(t-t)*(t+t)") + define_sfop4(ext16,((x - y) / (z + w)),"(t-t)/(t+t)") + define_sfop4(ext17,((x * y) - (z + w)),"(t*t)-(t+t)") + define_sfop4(ext18,((x / y) - (z + w)),"(t/t)-(t+t)") + define_sfop4(ext19,((x * y) + (z + w)),"(t*t)+(t+t)") + define_sfop4(ext20,((x / y) + (z + w)),"(t/t)+(t+t)") + define_sfop4(ext21,((x * y) + (z - w)),"(t*t)+(t-t)") + define_sfop4(ext22,((x / y) + (z - w)),"(t/t)+(t-t)") + define_sfop4(ext23,((x * y) - (z - w)),"(t*t)-(t-t)") + define_sfop4(ext24,((x / y) - (z - w)),"(t/t)-(t-t)") + define_sfop4(ext25,((x + y) * (z * w)),"(t+t)*(t*t)") + define_sfop4(ext26,((x + y) * (z / w)),"(t+t)*(t/t)") + define_sfop4(ext27,((x + y) / (z * w)),"(t+t)/(t*t)") + define_sfop4(ext28,((x + y) / (z / w)),"(t+t)/(t/t)") + define_sfop4(ext29,((x - y) / (z * w)),"(t-t)/(t*t)") + define_sfop4(ext30,((x - y) / (z / w)),"(t-t)/(t/t)") + define_sfop4(ext31,((x - y) * (z * w)),"(t-t)*(t*t)") + define_sfop4(ext32,((x - y) * (z / w)),"(t-t)*(t/t)") + define_sfop4(ext33,((x * y) * (z + w)),"(t*t)*(t+t)") + define_sfop4(ext34,((x / y) * (z + w)),"(t/t)*(t+t)") + define_sfop4(ext35,((x * y) / (z + w)),"(t*t)/(t+t)") + define_sfop4(ext36,((x / y) / (z + w)),"(t/t)/(t+t)") + define_sfop4(ext37,((x * y) / (z - w)),"(t*t)/(t-t)") + define_sfop4(ext38,((x / y) / (z - w)),"(t/t)/(t-t)") + define_sfop4(ext39,((x * y) * (z - w)),"(t*t)*(t-t)") + define_sfop4(ext40,((x * y) / (z * w)),"(t*t)/(t*t)") + define_sfop4(ext41,((x / y) * (z / w)),"(t/t)*(t/t)") + define_sfop4(ext42,((x / y) * (z - w)),"(t/t)*(t-t)") + define_sfop4(ext43,((x * y) * (z * w)),"(t*t)*(t*t)") + define_sfop4(ext44,(x + (y * (z / w))),"t+(t*(t/t))") + define_sfop4(ext45,(x - (y * (z / w))),"t-(t*(t/t))") + define_sfop4(ext46,(x + (y / (z * w))),"t+(t/(t*t))") + define_sfop4(ext47,(x - (y / (z * w))),"t-(t/(t*t))") + define_sfop4(ext48,(((x - y) - z) * w),"((t-t)-t)*t") + define_sfop4(ext49,(((x - y) - z) / w),"((t-t)-t)/t") + define_sfop4(ext50,(((x - y) + z) * w),"((t-t)+t)*t") + define_sfop4(ext51,(((x - y) + z) / w),"((t-t)+t)/t") + define_sfop4(ext52,((x + (y - z)) * w),"(t+(t-t))*t") + define_sfop4(ext53,((x + (y - z)) / w),"(t+(t-t))/t") + define_sfop4(ext54,((x + y) / (z + w)),"(t+t)/(t+t)") + define_sfop4(ext55,((x - y) / (z - w)),"(t-t)/(t-t)") + define_sfop4(ext56,((x + y) * (z + w)),"(t+t)*(t+t)") + define_sfop4(ext57,((x - y) * (z - w)),"(t-t)*(t-t)") + define_sfop4(ext58,((x - y) + (z - w)),"(t-t)+(t-t)") + define_sfop4(ext59,((x - y) - (z - w)),"(t-t)-(t-t)") + define_sfop4(ext60,((x / y) + (z * w)),"(t/t)+(t*t)") + define_sfop4(ext61,(((x * y) * z) / w),"((t*t)*t)/t") + + #undef define_sfop3 + #undef define_sfop4 + + template + class sf3_node exprtk_final : public trinary_node + { + public: + + typedef expression_node* expression_ptr; + + sf3_node(const operator_type& opr, + expression_ptr branch0, + expression_ptr branch1, + expression_ptr branch2) + : trinary_node(opr, branch0, branch1, branch2) + {} + + inline T value() const exprtk_override + { + assert(trinary_node::branch_[0].first); + assert(trinary_node::branch_[1].first); + assert(trinary_node::branch_[2].first); + + const T x = trinary_node::branch_[0].first->value(); + const T y = trinary_node::branch_[1].first->value(); + const T z = trinary_node::branch_[2].first->value(); + + return SpecialFunction::process(x, y, z); + } + }; + + template + class sf4_node exprtk_final : public quaternary_node + { + public: + + typedef expression_node* expression_ptr; + + sf4_node(const operator_type& opr, + expression_ptr branch0, + expression_ptr branch1, + expression_ptr branch2, + expression_ptr branch3) + : quaternary_node(opr, branch0, branch1, branch2, branch3) + {} + + inline T value() const exprtk_override + { + assert(quaternary_node::branch_[0].first); + assert(quaternary_node::branch_[1].first); + assert(quaternary_node::branch_[2].first); + assert(quaternary_node::branch_[3].first); + + const T x = quaternary_node::branch_[0].first->value(); + const T y = quaternary_node::branch_[1].first->value(); + const T z = quaternary_node::branch_[2].first->value(); + const T w = quaternary_node::branch_[3].first->value(); + + return SpecialFunction::process(x, y, z, w); + } + }; + + template + class sf3_var_node exprtk_final : public expression_node + { + public: + + typedef expression_node* expression_ptr; + + sf3_var_node(const T& v0, const T& v1, const T& v2) + : v0_(v0) + , v1_(v1) + , v2_(v2) + {} + + inline T value() const exprtk_override + { + return SpecialFunction::process(v0_, v1_, v2_); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_trinary; + } + + private: + + sf3_var_node(const sf3_var_node&) exprtk_delete; + sf3_var_node& operator=(const sf3_var_node&) exprtk_delete; + + const T& v0_; + const T& v1_; + const T& v2_; + }; + + template + class sf4_var_node exprtk_final : public expression_node + { + public: + + typedef expression_node* expression_ptr; + + sf4_var_node(const T& v0, const T& v1, const T& v2, const T& v3) + : v0_(v0) + , v1_(v1) + , v2_(v2) + , v3_(v3) + {} + + inline T value() const exprtk_override + { + return SpecialFunction::process(v0_, v1_, v2_, v3_); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_trinary; + } + + private: + + sf4_var_node(const sf4_var_node&) exprtk_delete; + sf4_var_node& operator=(const sf4_var_node&) exprtk_delete; + + const T& v0_; + const T& v1_; + const T& v2_; + const T& v3_; + }; + + template + class vararg_node exprtk_final : public expression_node + { + public: + + typedef expression_node* expression_ptr; + typedef std::pair branch_t; + + template class Sequence> + explicit vararg_node(const Sequence& arg_list) + { + arg_list_.resize(arg_list.size()); + + for (std::size_t i = 0; i < arg_list.size(); ++i) + { + if (arg_list[i]) + { + construct_branch_pair(arg_list_[i],arg_list[i]); + } + else + { + arg_list_.clear(); + return; + } + } + } + + inline T value() const exprtk_override + { + return VarArgFunction::process(arg_list_); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_vararg; + } + + void collect_nodes(typename expression_node::noderef_list_t& node_delete_list) exprtk_override + { + expression_node::ndb_t::collect(arg_list_, node_delete_list); + } + + std::size_t node_depth() const exprtk_override + { + return expression_node::ndb_t::compute_node_depth(arg_list_); + } + + private: + + std::vector arg_list_; + }; + + template + class vararg_varnode exprtk_final : public expression_node + { + public: + + typedef expression_node* expression_ptr; + + template class Sequence> + explicit vararg_varnode(const Sequence& arg_list) + { + arg_list_.resize(arg_list.size()); + + for (std::size_t i = 0; i < arg_list.size(); ++i) + { + if (arg_list[i] && is_variable_node(arg_list[i])) + { + variable_node* var_node_ptr = static_cast*>(arg_list[i]); + arg_list_[i] = (&var_node_ptr->ref()); + } + else + { + arg_list_.clear(); + return; + } + } + } + + inline T value() const exprtk_override + { + if (!arg_list_.empty()) + return VarArgFunction::process(arg_list_); + else + return std::numeric_limits::quiet_NaN(); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_vararg; + } + + private: + + std::vector arg_list_; + }; + + template + class vectorize_node exprtk_final : public expression_node + { + public: + + typedef expression_node* expression_ptr; + typedef std::pair branch_t; + + explicit vectorize_node(const expression_ptr v) + : ivec_ptr_(0) + { + construct_branch_pair(v_, v); + + if (is_ivector_node(v_.first)) + { + ivec_ptr_ = dynamic_cast*>(v_.first); + } + else + ivec_ptr_ = 0; + } + + inline T value() const exprtk_override + { + if (ivec_ptr_) + { + assert(v_.first); + + v_.first->value(); + + return VecFunction::process(ivec_ptr_); + } + else + return std::numeric_limits::quiet_NaN(); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_vecfunc; + } + + void collect_nodes(typename expression_node::noderef_list_t& node_delete_list) exprtk_override + { + expression_node::ndb_t::collect(v_, node_delete_list); + } + + std::size_t node_depth() const exprtk_override + { + return expression_node::ndb_t::compute_node_depth(v_); + } + + private: + + vector_interface* ivec_ptr_; + branch_t v_; + }; + + template + class assignment_node exprtk_final : public binary_node + { + public: + + typedef expression_node* expression_ptr; + using binary_node::branch; + + assignment_node(const operator_type& opr, + expression_ptr branch0, + expression_ptr branch1) + : binary_node(opr, branch0, branch1) + , var_node_ptr_(0) + { + if (is_variable_node(branch(0))) + { + var_node_ptr_ = static_cast*>(branch(0)); + } + } + + inline T value() const exprtk_override + { + if (var_node_ptr_) + { + assert(branch(1)); + + T& result = var_node_ptr_->ref(); + result = branch(1)->value(); + + return result; + } + else + return std::numeric_limits::quiet_NaN(); + } + + private: + + variable_node* var_node_ptr_; + }; + + template + class assignment_vec_elem_node exprtk_final : public binary_node + { + public: + + typedef expression_node* expression_ptr; + using binary_node::branch; + + assignment_vec_elem_node(const operator_type& opr, + expression_ptr branch0, + expression_ptr branch1) + : binary_node(opr, branch0, branch1) + , vec_node_ptr_(0) + { + if (is_vector_elem_node(branch(0))) + { + vec_node_ptr_ = static_cast*>(branch(0)); + } + } + + inline T value() const exprtk_override + { + if (vec_node_ptr_) + { + assert(branch(1)); + + T& result = vec_node_ptr_->ref(); + result = branch(1)->value(); + + return result; + } + else + return std::numeric_limits::quiet_NaN(); + } + + private: + + vector_elem_node* vec_node_ptr_; + }; + + template + class assignment_rebasevec_elem_node exprtk_final : public binary_node + { + public: + + typedef expression_node* expression_ptr; + using expression_node::branch; + + assignment_rebasevec_elem_node(const operator_type& opr, + expression_ptr branch0, + expression_ptr branch1) + : binary_node(opr, branch0, branch1) + , rbvec_node_ptr_(0) + { + if (is_rebasevector_elem_node(branch(0))) + { + rbvec_node_ptr_ = static_cast*>(branch(0)); + } + } + + inline T value() const exprtk_override + { + if (rbvec_node_ptr_) + { + assert(branch(1)); + + T& result = rbvec_node_ptr_->ref(); + + result = branch(1)->value(); + + return result; + } + else + return std::numeric_limits::quiet_NaN(); + } + + private: + + rebasevector_elem_node* rbvec_node_ptr_; + }; + + template + class assignment_rebasevec_celem_node exprtk_final : public binary_node + { + public: + + typedef expression_node* expression_ptr; + using binary_node::branch; + + assignment_rebasevec_celem_node(const operator_type& opr, + expression_ptr branch0, + expression_ptr branch1) + : binary_node(opr, branch0, branch1) + , rbvec_node_ptr_(0) + { + if (is_rebasevector_celem_node(branch(0))) + { + rbvec_node_ptr_ = static_cast*>(branch(0)); + } + } + + inline T value() const exprtk_override + { + if (rbvec_node_ptr_) + { + assert(branch(1)); + + T& result = rbvec_node_ptr_->ref(); + result = branch(1)->value(); + + return result; + } + else + return std::numeric_limits::quiet_NaN(); + } + + private: + + rebasevector_celem_node* rbvec_node_ptr_; + }; + + template + class assignment_vec_node exprtk_final + : public binary_node + , public vector_interface + { + public: + + typedef expression_node* expression_ptr; + typedef vector_node* vector_node_ptr; + typedef vec_data_store vds_t; + + using binary_node::branch; + + assignment_vec_node(const operator_type& opr, + expression_ptr branch0, + expression_ptr branch1) + : binary_node(opr, branch0, branch1) + , vec_node_ptr_(0) + { + if (is_vector_node(branch(0))) + { + vec_node_ptr_ = static_cast*>(branch(0)); + vds() = vec_node_ptr_->vds(); + } + } + + inline T value() const exprtk_override + { + if (vec_node_ptr_) + { + assert(branch(1)); + + const T v = branch(1)->value(); + + T* vec = vds().data(); + + loop_unroll::details lud(size()); + const T* upper_bound = vec + lud.upper_bound; + + while (vec < upper_bound) + { + #define exprtk_loop(N) \ + vec[N] = v; \ + + exprtk_loop( 0) exprtk_loop( 1) + exprtk_loop( 2) exprtk_loop( 3) + #ifndef exprtk_disable_superscalar_unroll + exprtk_loop( 4) exprtk_loop( 5) + exprtk_loop( 6) exprtk_loop( 7) + exprtk_loop( 8) exprtk_loop( 9) + exprtk_loop(10) exprtk_loop(11) + exprtk_loop(12) exprtk_loop(13) + exprtk_loop(14) exprtk_loop(15) + #endif + + vec += lud.batch_size; + } + + exprtk_disable_fallthrough_begin + switch (lud.remainder) + { + #define case_stmt(N) \ + case N : *vec++ = v; \ + + #ifndef exprtk_disable_superscalar_unroll + case_stmt(15) case_stmt(14) + case_stmt(13) case_stmt(12) + case_stmt(11) case_stmt(10) + case_stmt( 9) case_stmt( 8) + case_stmt( 7) case_stmt( 6) + case_stmt( 5) case_stmt( 4) + #endif + case_stmt( 3) case_stmt( 2) + case_stmt( 1) + } + exprtk_disable_fallthrough_end + + #undef exprtk_loop + #undef case_stmt + + return vec_node_ptr_->value(); + } + else + return std::numeric_limits::quiet_NaN(); + } + + vector_node_ptr vec() const exprtk_override + { + return vec_node_ptr_; + } + + vector_node_ptr vec() exprtk_override + { + return vec_node_ptr_; + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_vecvalass; + } + + std::size_t size() const exprtk_override + { + return vds().size(); + } + + vds_t& vds() exprtk_override + { + return vds_; + } + + const vds_t& vds() const exprtk_override + { + return vds_; + } + + private: + + vector_node* vec_node_ptr_; + vds_t vds_; + }; + + template + class assignment_vecvec_node exprtk_final + : public binary_node + , public vector_interface + { + public: + + typedef expression_node* expression_ptr; + typedef vector_node* vector_node_ptr; + typedef vec_data_store vds_t; + + using binary_node::branch; + + assignment_vecvec_node(const operator_type& opr, + expression_ptr branch0, + expression_ptr branch1) + : binary_node(opr, branch0, branch1) + , vec0_node_ptr_(0) + , vec1_node_ptr_(0) + , initialised_(false) + , src_is_ivec_(false) + { + if (is_vector_node(branch(0))) + { + vec0_node_ptr_ = static_cast*>(branch(0)); + vds() = vec0_node_ptr_->vds(); + } + + if (is_vector_node(branch(1))) + { + vec1_node_ptr_ = static_cast*>(branch(1)); + vds_t::match_sizes(vds(),vec1_node_ptr_->vds()); + } + else if (is_ivector_node(branch(1))) + { + vector_interface* vi = reinterpret_cast*>(0); + + if (0 != (vi = dynamic_cast*>(branch(1)))) + { + vec1_node_ptr_ = vi->vec(); + + if (!vi->side_effect()) + { + vi->vds() = vds(); + src_is_ivec_ = true; + } + else + vds_t::match_sizes(vds(),vi->vds()); + } + } + + initialised_ = (vec0_node_ptr_ && vec1_node_ptr_); + + assert(initialised_); + } + + inline T value() const exprtk_override + { + if (initialised_) + { + assert(branch(1)); + + branch(1)->value(); + + if (src_is_ivec_) + return vec0_node_ptr_->value(); + + T* vec0 = vec0_node_ptr_->vds().data(); + T* vec1 = vec1_node_ptr_->vds().data(); + + loop_unroll::details lud(size()); + const T* upper_bound = vec0 + lud.upper_bound; + + while (vec0 < upper_bound) + { + #define exprtk_loop(N) \ + vec0[N] = vec1[N]; \ + + exprtk_loop( 0) exprtk_loop( 1) + exprtk_loop( 2) exprtk_loop( 3) + #ifndef exprtk_disable_superscalar_unroll + exprtk_loop( 4) exprtk_loop( 5) + exprtk_loop( 6) exprtk_loop( 7) + exprtk_loop( 8) exprtk_loop( 9) + exprtk_loop(10) exprtk_loop(11) + exprtk_loop(12) exprtk_loop(13) + exprtk_loop(14) exprtk_loop(15) + #endif + + vec0 += lud.batch_size; + vec1 += lud.batch_size; + } + + exprtk_disable_fallthrough_begin + switch (lud.remainder) + { + #define case_stmt(N) \ + case N : *vec0++ = *vec1++; \ + + #ifndef exprtk_disable_superscalar_unroll + case_stmt(15) case_stmt(14) + case_stmt(13) case_stmt(12) + case_stmt(11) case_stmt(10) + case_stmt( 9) case_stmt( 8) + case_stmt( 7) case_stmt( 6) + case_stmt( 5) case_stmt( 4) + #endif + case_stmt( 3) case_stmt( 2) + case_stmt( 1) + } + exprtk_disable_fallthrough_end + + #undef exprtk_loop + #undef case_stmt + + return vec0_node_ptr_->value(); + } + else + return std::numeric_limits::quiet_NaN(); + } + + vector_node_ptr vec() exprtk_override + { + return vec0_node_ptr_; + } + + vector_node_ptr vec() const exprtk_override + { + return vec0_node_ptr_; + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_vecvecass; + } + + std::size_t size() const exprtk_override + { + return vds().size(); + } + + vds_t& vds() exprtk_override + { + return vds_; + } + + const vds_t& vds() const exprtk_override + { + return vds_; + } + + private: + + vector_node* vec0_node_ptr_; + vector_node* vec1_node_ptr_; + bool initialised_; + bool src_is_ivec_; + vds_t vds_; + }; + + template + class assignment_op_node exprtk_final : public binary_node + { + public: + + typedef expression_node* expression_ptr; + using binary_node::branch; + + assignment_op_node(const operator_type& opr, + expression_ptr branch0, + expression_ptr branch1) + : binary_node(opr, branch0, branch1) + , var_node_ptr_(0) + { + if (is_variable_node(branch(0))) + { + var_node_ptr_ = static_cast*>(branch(0)); + } + } + + inline T value() const exprtk_override + { + if (var_node_ptr_) + { + assert(branch(1)); + + T& v = var_node_ptr_->ref(); + v = Operation::process(v,branch(1)->value()); + + return v; + } + else + return std::numeric_limits::quiet_NaN(); + } + + private: + + variable_node* var_node_ptr_; + }; + + template + class assignment_vec_elem_op_node exprtk_final : public binary_node + { + public: + + typedef expression_node* expression_ptr; + using binary_node::branch; + + assignment_vec_elem_op_node(const operator_type& opr, + expression_ptr branch0, + expression_ptr branch1) + : binary_node(opr, branch0, branch1) + , vec_node_ptr_(0) + { + if (is_vector_elem_node(branch(0))) + { + vec_node_ptr_ = static_cast*>(branch(0)); + } + } + + inline T value() const exprtk_override + { + if (vec_node_ptr_) + { + assert(branch(1)); + + T& v = vec_node_ptr_->ref(); + v = Operation::process(v,branch(1)->value()); + + return v; + } + else + return std::numeric_limits::quiet_NaN(); + } + + private: + + vector_elem_node* vec_node_ptr_; + }; + + template + class assignment_rebasevec_elem_op_node exprtk_final : public binary_node + { + public: + + typedef expression_node* expression_ptr; + using binary_node::branch; + + assignment_rebasevec_elem_op_node(const operator_type& opr, + expression_ptr branch0, + expression_ptr branch1) + : binary_node(opr, branch0, branch1) + , rbvec_node_ptr_(0) + { + if (is_rebasevector_elem_node(branch(0))) + { + rbvec_node_ptr_ = static_cast*>(branch(0)); + } + } + + inline T value() const exprtk_override + { + if (rbvec_node_ptr_) + { + assert(branch(1)); + + T& v = rbvec_node_ptr_->ref(); + v = Operation::process(v,branch(1)->value()); + + return v; + } + else + return std::numeric_limits::quiet_NaN(); + } + + private: + + rebasevector_elem_node* rbvec_node_ptr_; + }; + + template + class assignment_rebasevec_celem_op_node exprtk_final : public binary_node + { + public: + + typedef expression_node* expression_ptr; + using binary_node::branch; + + assignment_rebasevec_celem_op_node(const operator_type& opr, + expression_ptr branch0, + expression_ptr branch1) + : binary_node(opr, branch0, branch1) + , rbvec_node_ptr_(0) + { + if (is_rebasevector_celem_node(branch(0))) + { + rbvec_node_ptr_ = static_cast*>(branch(0)); + } + } + + inline T value() const exprtk_override + { + if (rbvec_node_ptr_) + { + assert(branch(1)); + + T& v = rbvec_node_ptr_->ref(); + v = Operation::process(v,branch(1)->value()); + + return v; + } + else + return std::numeric_limits::quiet_NaN(); + } + + private: + + rebasevector_celem_node* rbvec_node_ptr_; + }; + + template + class assignment_vec_op_node exprtk_final + : public binary_node + , public vector_interface + { + public: + + typedef expression_node* expression_ptr; + typedef vector_node* vector_node_ptr; + typedef vec_data_store vds_t; + + using binary_node::branch; + + assignment_vec_op_node(const operator_type& opr, + expression_ptr branch0, + expression_ptr branch1) + : binary_node(opr, branch0, branch1) + , vec_node_ptr_(0) + { + if (is_vector_node(branch(0))) + { + vec_node_ptr_ = static_cast*>(branch(0)); + vds() = vec_node_ptr_->vds(); + } + } + + inline T value() const exprtk_override + { + if (vec_node_ptr_) + { + assert(branch(1)); + + const T v = branch(1)->value(); + + T* vec = vds().data(); + + loop_unroll::details lud(size()); + const T* upper_bound = vec + lud.upper_bound; + + while (vec < upper_bound) + { + #define exprtk_loop(N) \ + Operation::assign(vec[N],v); \ + + exprtk_loop( 0) exprtk_loop( 1) + exprtk_loop( 2) exprtk_loop( 3) + #ifndef exprtk_disable_superscalar_unroll + exprtk_loop( 4) exprtk_loop( 5) + exprtk_loop( 6) exprtk_loop( 7) + exprtk_loop( 8) exprtk_loop( 9) + exprtk_loop(10) exprtk_loop(11) + exprtk_loop(12) exprtk_loop(13) + exprtk_loop(14) exprtk_loop(15) + #endif + + vec += lud.batch_size; + } + + exprtk_disable_fallthrough_begin + switch (lud.remainder) + { + #define case_stmt(N) \ + case N : Operation::assign(*vec++,v); \ + + #ifndef exprtk_disable_superscalar_unroll + case_stmt(15) case_stmt(14) + case_stmt(13) case_stmt(12) + case_stmt(11) case_stmt(10) + case_stmt( 9) case_stmt( 8) + case_stmt( 7) case_stmt( 6) + case_stmt( 5) case_stmt( 4) + #endif + case_stmt( 3) case_stmt( 2) + case_stmt( 1) + } + exprtk_disable_fallthrough_end + + #undef exprtk_loop + #undef case_stmt + + return vec_node_ptr_->value(); + } + else + return std::numeric_limits::quiet_NaN(); + } + + vector_node_ptr vec() const exprtk_override + { + return vec_node_ptr_; + } + + vector_node_ptr vec() exprtk_override + { + return vec_node_ptr_; + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_vecopvalass; + } + + std::size_t size() const exprtk_override + { + return vds().size(); + } + + vds_t& vds() exprtk_override + { + return vds_; + } + + const vds_t& vds() const exprtk_override + { + return vds_; + } + + bool side_effect() const exprtk_override + { + return true; + } + + private: + + vector_node* vec_node_ptr_; + vds_t vds_; + }; + + template + class assignment_vecvec_op_node exprtk_final + : public binary_node + , public vector_interface + { + public: + + typedef expression_node* expression_ptr; + typedef vector_node* vector_node_ptr; + typedef vec_data_store vds_t; + + using binary_node::branch; + + assignment_vecvec_op_node(const operator_type& opr, + expression_ptr branch0, + expression_ptr branch1) + : binary_node(opr, branch0, branch1) + , vec0_node_ptr_(0) + , vec1_node_ptr_(0) + , initialised_(false) + { + if (is_vector_node(branch(0))) + { + vec0_node_ptr_ = static_cast*>(branch(0)); + vds() = vec0_node_ptr_->vds(); + } + + if (is_vector_node(branch(1))) + { + vec1_node_ptr_ = static_cast*>(branch(1)); + vec1_node_ptr_->vds() = vds(); + } + else if (is_ivector_node(branch(1))) + { + vector_interface* vi = reinterpret_cast*>(0); + + if (0 != (vi = dynamic_cast*>(branch(1)))) + { + vec1_node_ptr_ = vi->vec(); + vec1_node_ptr_->vds() = vds(); + } + else + vds_t::match_sizes(vds(),vec1_node_ptr_->vds()); + } + + initialised_ = (vec0_node_ptr_ && vec1_node_ptr_); + + assert(initialised_); + } + + inline T value() const exprtk_override + { + if (initialised_) + { + assert(branch(0)); + assert(branch(1)); + + branch(0)->value(); + branch(1)->value(); + + T* vec0 = vec0_node_ptr_->vds().data(); + const T* vec1 = vec1_node_ptr_->vds().data(); + + loop_unroll::details lud(size()); + const T* upper_bound = vec0 + lud.upper_bound; + + while (vec0 < upper_bound) + { + #define exprtk_loop(N) \ + vec0[N] = Operation::process(vec0[N], vec1[N]); \ + + exprtk_loop( 0) exprtk_loop( 1) + exprtk_loop( 2) exprtk_loop( 3) + #ifndef exprtk_disable_superscalar_unroll + exprtk_loop( 4) exprtk_loop( 5) + exprtk_loop( 6) exprtk_loop( 7) + exprtk_loop( 8) exprtk_loop( 9) + exprtk_loop(10) exprtk_loop(11) + exprtk_loop(12) exprtk_loop(13) + exprtk_loop(14) exprtk_loop(15) + #endif + + vec0 += lud.batch_size; + vec1 += lud.batch_size; + } + + int i = 0; + + exprtk_disable_fallthrough_begin + switch (lud.remainder) + { + #define case_stmt(N) \ + case N : { vec0[i] = Operation::process(vec0[i], vec1[i]); ++i; } \ + + #ifndef exprtk_disable_superscalar_unroll + case_stmt(15) case_stmt(14) + case_stmt(13) case_stmt(12) + case_stmt(11) case_stmt(10) + case_stmt( 9) case_stmt( 8) + case_stmt( 7) case_stmt( 6) + case_stmt( 5) case_stmt( 4) + #endif + case_stmt( 3) case_stmt( 2) + case_stmt( 1) + } + exprtk_disable_fallthrough_end + + #undef exprtk_loop + #undef case_stmt + + return vec0_node_ptr_->value(); + } + else + return std::numeric_limits::quiet_NaN(); + } + + vector_node_ptr vec() const exprtk_override + { + return vec0_node_ptr_; + } + + vector_node_ptr vec() exprtk_override + { + return vec0_node_ptr_; + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_vecopvecass; + } + + std::size_t size() const exprtk_override + { + return vds().size(); + } + + vds_t& vds() exprtk_override + { + return vds_; + } + + const vds_t& vds() const exprtk_override + { + return vds_; + } + + bool side_effect() const exprtk_override + { + return true; + } + + private: + + vector_node* vec0_node_ptr_; + vector_node* vec1_node_ptr_; + bool initialised_; + vds_t vds_; + }; + + template + class vec_binop_vecvec_node exprtk_final + : public binary_node + , public vector_interface + { + public: + + typedef expression_node* expression_ptr; + typedef vector_node* vector_node_ptr; + typedef vector_holder* vector_holder_ptr; + typedef vec_data_store vds_t; + + using binary_node::branch; + + vec_binop_vecvec_node(const operator_type& opr, + expression_ptr branch0, + expression_ptr branch1) + : binary_node(opr, branch0, branch1) + , vec0_node_ptr_(0) + , vec1_node_ptr_(0) + , temp_ (0) + , temp_vec_node_(0) + , initialised_(false) + { + bool v0_is_ivec = false; + bool v1_is_ivec = false; + + if (is_vector_node(branch(0))) + { + vec0_node_ptr_ = static_cast(branch(0)); + } + else if (is_ivector_node(branch(0))) + { + vector_interface* vi = reinterpret_cast*>(0); + + if (0 != (vi = dynamic_cast*>(branch(0)))) + { + vec0_node_ptr_ = vi->vec(); + v0_is_ivec = true; + } + } + + if (is_vector_node(branch(1))) + { + vec1_node_ptr_ = static_cast(branch(1)); + } + else if (is_ivector_node(branch(1))) + { + vector_interface* vi = reinterpret_cast*>(0); + + if (0 != (vi = dynamic_cast*>(branch(1)))) + { + vec1_node_ptr_ = vi->vec(); + v1_is_ivec = true; + } + } + + if (vec0_node_ptr_ && vec1_node_ptr_) + { + vector_holder& vec0 = vec0_node_ptr_->vec_holder(); + vector_holder& vec1 = vec1_node_ptr_->vec_holder(); + + if (v0_is_ivec && (vec0.size() <= vec1.size())) + vds_ = vds_t(vec0_node_ptr_->vds()); + else if (v1_is_ivec && (vec1.size() <= vec0.size())) + vds_ = vds_t(vec1_node_ptr_->vds()); + else + vds_ = vds_t(std::min(vec0.size(),vec1.size())); + + temp_ = new vector_holder(vds().data(),vds().size()); + temp_vec_node_ = new vector_node (vds(),temp_); + + initialised_ = true; + } + + assert(initialised_); + } + + ~vec_binop_vecvec_node() + { + delete temp_; + delete temp_vec_node_; + } + + inline T value() const exprtk_override + { + if (initialised_) + { + assert(branch(0)); + assert(branch(1)); + + branch(0)->value(); + branch(1)->value(); + + const T* vec0 = vec0_node_ptr_->vds().data(); + const T* vec1 = vec1_node_ptr_->vds().data(); + T* vec2 = vds().data(); + + loop_unroll::details lud(size()); + const T* upper_bound = vec2 + lud.upper_bound; + + while (vec2 < upper_bound) + { + #define exprtk_loop(N) \ + vec2[N] = Operation::process(vec0[N], vec1[N]); \ + + exprtk_loop( 0) exprtk_loop( 1) + exprtk_loop( 2) exprtk_loop( 3) + #ifndef exprtk_disable_superscalar_unroll + exprtk_loop( 4) exprtk_loop( 5) + exprtk_loop( 6) exprtk_loop( 7) + exprtk_loop( 8) exprtk_loop( 9) + exprtk_loop(10) exprtk_loop(11) + exprtk_loop(12) exprtk_loop(13) + exprtk_loop(14) exprtk_loop(15) + #endif + + vec0 += lud.batch_size; + vec1 += lud.batch_size; + vec2 += lud.batch_size; + } + + int i = 0; + + exprtk_disable_fallthrough_begin + switch (lud.remainder) + { + #define case_stmt(N) \ + case N : { vec2[i] = Operation::process(vec0[i], vec1[i]); ++i; } \ + + #ifndef exprtk_disable_superscalar_unroll + case_stmt(15) case_stmt(14) + case_stmt(13) case_stmt(12) + case_stmt(11) case_stmt(10) + case_stmt( 9) case_stmt( 8) + case_stmt( 7) case_stmt( 6) + case_stmt( 5) case_stmt( 4) + #endif + case_stmt( 3) case_stmt( 2) + case_stmt( 1) + } + exprtk_disable_fallthrough_end + + #undef exprtk_loop + #undef case_stmt + + return (vds().data())[0]; + } + else + return std::numeric_limits::quiet_NaN(); + } + + vector_node_ptr vec() const exprtk_override + { + return temp_vec_node_; + } + + vector_node_ptr vec() exprtk_override + { + return temp_vec_node_; + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_vecvecarith; + } + + std::size_t size() const exprtk_override + { + return vds_.size(); + } + + vds_t& vds() exprtk_override + { + return vds_; + } + + const vds_t& vds() const exprtk_override + { + return vds_; + } + + private: + + vector_node_ptr vec0_node_ptr_; + vector_node_ptr vec1_node_ptr_; + vector_holder_ptr temp_; + vector_node_ptr temp_vec_node_; + bool initialised_; + vds_t vds_; + }; + + template + class vec_binop_vecval_node exprtk_final + : public binary_node + , public vector_interface + { + public: + + typedef expression_node* expression_ptr; + typedef vector_node* vector_node_ptr; + typedef vector_holder* vector_holder_ptr; + typedef vec_data_store vds_t; + + using binary_node::branch; + + vec_binop_vecval_node(const operator_type& opr, + expression_ptr branch0, + expression_ptr branch1) + : binary_node(opr, branch0, branch1) + , vec0_node_ptr_(0) + , temp_ (0) + , temp_vec_node_(0) + { + bool v0_is_ivec = false; + + if (is_vector_node(branch(0))) + { + vec0_node_ptr_ = static_cast(branch(0)); + } + else if (is_ivector_node(branch(0))) + { + vector_interface* vi = reinterpret_cast*>(0); + + if (0 != (vi = dynamic_cast*>(branch(0)))) + { + vec0_node_ptr_ = vi->vec(); + v0_is_ivec = true; + } + } + + if (vec0_node_ptr_) + { + if (v0_is_ivec) + vds() = vec0_node_ptr_->vds(); + else + vds() = vds_t(vec0_node_ptr_->size()); + + temp_ = new vector_holder(vds()); + temp_vec_node_ = new vector_node (vds(),temp_); + } + } + + ~vec_binop_vecval_node() + { + delete temp_; + delete temp_vec_node_; + } + + inline T value() const exprtk_override + { + if (vec0_node_ptr_) + { + assert(branch(0)); + assert(branch(1)); + + branch(0)->value(); + const T v = branch(1)->value(); + + const T* vec0 = vec0_node_ptr_->vds().data(); + T* vec1 = vds().data(); + + loop_unroll::details lud(size()); + const T* upper_bound = vec0 + lud.upper_bound; + + while (vec0 < upper_bound) + { + #define exprtk_loop(N) \ + vec1[N] = Operation::process(vec0[N], v); \ + + exprtk_loop( 0) exprtk_loop( 1) + exprtk_loop( 2) exprtk_loop( 3) + #ifndef exprtk_disable_superscalar_unroll + exprtk_loop( 4) exprtk_loop( 5) + exprtk_loop( 6) exprtk_loop( 7) + exprtk_loop( 8) exprtk_loop( 9) + exprtk_loop(10) exprtk_loop(11) + exprtk_loop(12) exprtk_loop(13) + exprtk_loop(14) exprtk_loop(15) + #endif + + vec0 += lud.batch_size; + vec1 += lud.batch_size; + } + + int i = 0; + + exprtk_disable_fallthrough_begin + switch (lud.remainder) + { + #define case_stmt(N) \ + case N : { vec1[i] = Operation::process(vec0[i], v); ++i; } \ + + #ifndef exprtk_disable_superscalar_unroll + case_stmt(15) case_stmt(14) + case_stmt(13) case_stmt(12) + case_stmt(11) case_stmt(10) + case_stmt( 9) case_stmt( 8) + case_stmt( 7) case_stmt( 6) + case_stmt( 5) case_stmt( 4) + #endif + case_stmt( 3) case_stmt( 2) + case_stmt( 1) + } + exprtk_disable_fallthrough_end + + #undef exprtk_loop + #undef case_stmt + + return (vds().data())[0]; + } + else + return std::numeric_limits::quiet_NaN(); + } + + vector_node_ptr vec() const exprtk_override + { + return temp_vec_node_; + } + + vector_node_ptr vec() exprtk_override + { + return temp_vec_node_; + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_vecvalarith; + } + + std::size_t size() const exprtk_override + { + return vds().size(); + } + + vds_t& vds() exprtk_override + { + return vds_; + } + + const vds_t& vds() const exprtk_override + { + return vds_; + } + + private: + + vector_node_ptr vec0_node_ptr_; + vector_holder_ptr temp_; + vector_node_ptr temp_vec_node_; + vds_t vds_; + }; + + template + class vec_binop_valvec_node exprtk_final + : public binary_node + , public vector_interface + { + public: + + typedef expression_node* expression_ptr; + typedef vector_node* vector_node_ptr; + typedef vector_holder* vector_holder_ptr; + typedef vec_data_store vds_t; + + using binary_node::branch; + + vec_binop_valvec_node(const operator_type& opr, + expression_ptr branch0, + expression_ptr branch1) + : binary_node(opr, branch0, branch1) + , vec1_node_ptr_(0) + , temp_ (0) + , temp_vec_node_(0) + { + bool v1_is_ivec = false; + + if (is_vector_node(branch(1))) + { + vec1_node_ptr_ = static_cast(branch(1)); + } + else if (is_ivector_node(branch(1))) + { + vector_interface* vi = reinterpret_cast*>(0); + + if (0 != (vi = dynamic_cast*>(branch(1)))) + { + vec1_node_ptr_ = vi->vec(); + v1_is_ivec = true; + } + } + + if (vec1_node_ptr_) + { + if (v1_is_ivec) + vds() = vec1_node_ptr_->vds(); + else + vds() = vds_t(vec1_node_ptr_->size()); + + temp_ = new vector_holder(vds()); + temp_vec_node_ = new vector_node (vds(),temp_); + } + } + + ~vec_binop_valvec_node() + { + delete temp_; + delete temp_vec_node_; + } + + inline T value() const exprtk_override + { + if (vec1_node_ptr_) + { + assert(branch(0)); + assert(branch(1)); + + const T v = branch(0)->value(); + branch(1)->value(); + + T* vec0 = vds().data(); + const T* vec1 = vec1_node_ptr_->vds().data(); + + loop_unroll::details lud(size()); + const T* upper_bound = vec0 + lud.upper_bound; + + while (vec0 < upper_bound) + { + #define exprtk_loop(N) \ + vec0[N] = Operation::process(v, vec1[N]); \ + + exprtk_loop( 0) exprtk_loop( 1) + exprtk_loop( 2) exprtk_loop( 3) + #ifndef exprtk_disable_superscalar_unroll + exprtk_loop( 4) exprtk_loop( 5) + exprtk_loop( 6) exprtk_loop( 7) + exprtk_loop( 8) exprtk_loop( 9) + exprtk_loop(10) exprtk_loop(11) + exprtk_loop(12) exprtk_loop(13) + exprtk_loop(14) exprtk_loop(15) + #endif + + vec0 += lud.batch_size; + vec1 += lud.batch_size; + } + + int i = 0; + + exprtk_disable_fallthrough_begin + switch (lud.remainder) + { + #define case_stmt(N) \ + case N : { vec0[i] = Operation::process(v, vec1[i]); ++i; } \ + + #ifndef exprtk_disable_superscalar_unroll + case_stmt(15) case_stmt(14) + case_stmt(13) case_stmt(12) + case_stmt(11) case_stmt(10) + case_stmt( 9) case_stmt( 8) + case_stmt( 7) case_stmt( 6) + case_stmt( 5) case_stmt( 4) + #endif + case_stmt( 3) case_stmt( 2) + case_stmt( 1) + } + exprtk_disable_fallthrough_end + + #undef exprtk_loop + #undef case_stmt + + return (vds().data())[0]; + } + else + return std::numeric_limits::quiet_NaN(); + } + + vector_node_ptr vec() const exprtk_override + { + return temp_vec_node_; + } + + vector_node_ptr vec() exprtk_override + { + return temp_vec_node_; + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_vecvalarith; + } + + std::size_t size() const exprtk_override + { + return vds().size(); + } + + vds_t& vds() exprtk_override + { + return vds_; + } + + const vds_t& vds() const exprtk_override + { + return vds_; + } + + private: + + vector_node_ptr vec1_node_ptr_; + vector_holder_ptr temp_; + vector_node_ptr temp_vec_node_; + vds_t vds_; + }; + + template + class unary_vector_node exprtk_final + : public unary_node + , public vector_interface + { + public: + + typedef expression_node* expression_ptr; + typedef vector_node* vector_node_ptr; + typedef vector_holder* vector_holder_ptr; + typedef vec_data_store vds_t; + + using expression_node::branch; + + unary_vector_node(const operator_type& opr, expression_ptr branch0) + : unary_node(opr, branch0) + , vec0_node_ptr_(0) + , temp_ (0) + , temp_vec_node_(0) + { + bool vec0_is_ivec = false; + + if (is_vector_node(branch())) + { + vec0_node_ptr_ = static_cast(branch()); + } + else if (is_ivector_node(branch())) + { + vector_interface* vi = reinterpret_cast*>(0); + + if (0 != (vi = dynamic_cast*>(branch()))) + { + vec0_node_ptr_ = vi->vec(); + vec0_is_ivec = true; + } + } + + if (vec0_node_ptr_) + { + if (vec0_is_ivec) + vds_ = vec0_node_ptr_->vds(); + else + vds_ = vds_t(vec0_node_ptr_->size()); + + temp_ = new vector_holder(vds()); + temp_vec_node_ = new vector_node (vds(),temp_); + } + } + + ~unary_vector_node() + { + delete temp_; + delete temp_vec_node_; + } + + inline T value() const exprtk_override + { + assert(branch()); + + branch()->value(); + + if (vec0_node_ptr_) + { + const T* vec0 = vec0_node_ptr_->vds().data(); + T* vec1 = vds().data(); + + loop_unroll::details lud(size()); + const T* upper_bound = vec0 + lud.upper_bound; + + while (vec0 < upper_bound) + { + #define exprtk_loop(N) \ + vec1[N] = Operation::process(vec0[N]); \ + + exprtk_loop( 0) exprtk_loop( 1) + exprtk_loop( 2) exprtk_loop( 3) + #ifndef exprtk_disable_superscalar_unroll + exprtk_loop( 4) exprtk_loop( 5) + exprtk_loop( 6) exprtk_loop( 7) + exprtk_loop( 8) exprtk_loop( 9) + exprtk_loop(10) exprtk_loop(11) + exprtk_loop(12) exprtk_loop(13) + exprtk_loop(14) exprtk_loop(15) + #endif + + vec0 += lud.batch_size; + vec1 += lud.batch_size; + } + + int i = 0; + + exprtk_disable_fallthrough_begin + switch (lud.remainder) + { + #define case_stmt(N) \ + case N : { vec1[i] = Operation::process(vec0[i]); ++i; } \ + + #ifndef exprtk_disable_superscalar_unroll + case_stmt(15) case_stmt(14) + case_stmt(13) case_stmt(12) + case_stmt(11) case_stmt(10) + case_stmt( 9) case_stmt( 8) + case_stmt( 7) case_stmt( 6) + case_stmt( 5) case_stmt( 4) + #endif + case_stmt( 3) case_stmt( 2) + case_stmt( 1) + } + exprtk_disable_fallthrough_end + + #undef exprtk_loop + #undef case_stmt + + return (vds().data())[0]; + } + else + return std::numeric_limits::quiet_NaN(); + } + + vector_node_ptr vec() const exprtk_override + { + return temp_vec_node_; + } + + vector_node_ptr vec() exprtk_override + { + return temp_vec_node_; + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_vecunaryop; + } + + std::size_t size() const exprtk_override + { + return vds().size(); + } + + vds_t& vds() exprtk_override + { + return vds_; + } + + const vds_t& vds() const exprtk_override + { + return vds_; + } + + private: + + vector_node_ptr vec0_node_ptr_; + vector_holder_ptr temp_; + vector_node_ptr temp_vec_node_; + vds_t vds_; + }; + + template + class conditional_vector_node exprtk_final + : public expression_node + , public vector_interface + { + public: + + typedef expression_node * expression_ptr; + typedef vector_interface* vec_interface_ptr; + typedef vector_node * vector_node_ptr; + typedef vector_holder * vector_holder_ptr; + typedef vec_data_store vds_t; + typedef std::pair branch_t; + + conditional_vector_node(expression_ptr condition, + expression_ptr consequent, + expression_ptr alternative) + : consequent_node_ptr_ (0) + , alternative_node_ptr_(0) + , temp_vec_node_ (0) + , temp_ (0) + , vec_size_ (0) + , initialised_ (false) + { + construct_branch_pair(condition_ , condition ); + construct_branch_pair(consequent_ , consequent ); + construct_branch_pair(alternative_, alternative); + + if (details::is_ivector_node(consequent_.first)) + { + vec_interface_ptr ivec_ptr = dynamic_cast(consequent_.first); + + if (0 != ivec_ptr) + { + consequent_node_ptr_ = ivec_ptr->vec(); + } + } + + if (details::is_ivector_node(alternative_.first)) + { + vec_interface_ptr ivec_ptr = dynamic_cast(alternative_.first); + + if (0 != ivec_ptr) + { + alternative_node_ptr_ = ivec_ptr->vec(); + } + } + + if (consequent_node_ptr_ && alternative_node_ptr_) + { + vec_size_ = std::min(consequent_node_ptr_ ->vds().size(), + alternative_node_ptr_->vds().size()); + + vds_ = vds_t(vec_size_); + temp_ = new vector_holder(vds_); + temp_vec_node_ = new vector_node (vds(),temp_); + + initialised_ = true; + } + + assert(initialised_ && (vec_size_ > 0)); + } + + ~conditional_vector_node() + { + delete temp_; + delete temp_vec_node_; + } + + inline T value() const exprtk_override + { + if (initialised_) + { + assert(condition_ .first); + assert(consequent_ .first); + assert(alternative_.first); + + T result = T(0); + T* source_vector = 0; + T* result_vector = vds().data(); + + if (is_true(condition_)) + { + result = consequent_.first->value(); + source_vector = consequent_node_ptr_->vds().data(); + } + else + { + result = alternative_.first->value(); + source_vector = alternative_node_ptr_->vds().data(); + } + + for (std::size_t i = 0; i < vec_size_; ++i) + { + result_vector[i] = source_vector[i]; + } + + return result; + } + + return std::numeric_limits::quiet_NaN(); + } + + vector_node_ptr vec() const exprtk_override + { + return temp_vec_node_; + } + + vector_node_ptr vec() exprtk_override + { + return temp_vec_node_; + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_vecondition; + } + + std::size_t size() const exprtk_override + { + return vec_size_; + } + + vds_t& vds() exprtk_override + { + return vds_; + } + + const vds_t& vds() const exprtk_override + { + return vds_; + } + + void collect_nodes(typename expression_node::noderef_list_t& node_delete_list) exprtk_override + { + expression_node::ndb_t::collect(condition_ , node_delete_list); + expression_node::ndb_t::collect(consequent_ , node_delete_list); + expression_node::ndb_t::collect(alternative_ , node_delete_list); + } + + std::size_t node_depth() const exprtk_override + { + return expression_node::ndb_t::compute_node_depth + (condition_, consequent_, alternative_); + } + + private: + + branch_t condition_; + branch_t consequent_; + branch_t alternative_; + vector_node_ptr consequent_node_ptr_; + vector_node_ptr alternative_node_ptr_; + vector_node_ptr temp_vec_node_; + vector_holder_ptr temp_; + vds_t vds_; + std::size_t vec_size_; + bool initialised_; + }; + + template + class scand_node exprtk_final : public binary_node + { + public: + + typedef expression_node* expression_ptr; + using binary_node::branch; + + scand_node(const operator_type& opr, + expression_ptr branch0, + expression_ptr branch1) + : binary_node(opr, branch0, branch1) + {} + + inline T value() const exprtk_override + { + assert(branch(0)); + assert(branch(1)); + + return ( + std::not_equal_to() + (T(0),branch(0)->value()) && + std::not_equal_to() + (T(0),branch(1)->value()) + ) ? T(1) : T(0); + } + }; + + template + class scor_node exprtk_final : public binary_node + { + public: + + typedef expression_node* expression_ptr; + using binary_node::branch; + + scor_node(const operator_type& opr, + expression_ptr branch0, + expression_ptr branch1) + : binary_node(opr, branch0, branch1) + {} + + inline T value() const exprtk_override + { + assert(branch(0)); + assert(branch(1)); + + return ( + std::not_equal_to() + (T(0),branch(0)->value()) || + std::not_equal_to() + (T(0),branch(1)->value()) + ) ? T(1) : T(0); + } + }; + + template + class function_N_node exprtk_final : public expression_node + { + public: + + // Function of N paramters. + typedef expression_node* expression_ptr; + typedef std::pair branch_t; + typedef IFunction ifunction; + + explicit function_N_node(ifunction* func) + : function_((N == func->param_count) ? func : reinterpret_cast(0)) + , parameter_count_(func->param_count) + {} + + template + bool init_branches(expression_ptr (&b)[NumBranches]) + { + // Needed for incompetent and broken msvc compiler versions + #ifdef _MSC_VER + #pragma warning(push) + #pragma warning(disable: 4127) + #endif + if (N != NumBranches) + return false; + else + { + for (std::size_t i = 0; i < NumBranches; ++i) + { + if (b[i]) + branch_[i] = std::make_pair(b[i],branch_deletable(b[i])); + else + return false; + } + return true; + } + #ifdef _MSC_VER + #pragma warning(pop) + #endif + } + + inline bool operator <(const function_N_node& fn) const + { + return this < (&fn); + } + + inline T value() const exprtk_override + { + // Needed for incompetent and broken msvc compiler versions + #ifdef _MSC_VER + #pragma warning(push) + #pragma warning(disable: 4127) + #endif + if ((0 == function_) || (0 == N)) + return std::numeric_limits::quiet_NaN(); + else + { + T v[N]; + evaluate_branches::execute(v,branch_); + return invoke::execute(*function_,v); + } + #ifdef _MSC_VER + #pragma warning(pop) + #endif + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_function; + } + + void collect_nodes(typename expression_node::noderef_list_t& node_delete_list) exprtk_override + { + expression_node::ndb_t::template collect(branch_, node_delete_list); + } + + std::size_t node_depth() const exprtk_override + { + return expression_node::ndb_t::template compute_node_depth(branch_); + } + + template + struct evaluate_branches + { + static inline void execute(T_ (&v)[BranchCount], const branch_t (&b)[BranchCount]) + { + for (std::size_t i = 0; i < BranchCount; ++i) + { + v[i] = b[i].first->value(); + } + } + }; + + template + struct evaluate_branches + { + static inline void execute(T_ (&v)[5], const branch_t (&b)[5]) + { + v[0] = b[0].first->value(); + v[1] = b[1].first->value(); + v[2] = b[2].first->value(); + v[3] = b[3].first->value(); + v[4] = b[4].first->value(); + } + }; + + template + struct evaluate_branches + { + static inline void execute(T_ (&v)[4], const branch_t (&b)[4]) + { + v[0] = b[0].first->value(); + v[1] = b[1].first->value(); + v[2] = b[2].first->value(); + v[3] = b[3].first->value(); + } + }; + + template + struct evaluate_branches + { + static inline void execute(T_ (&v)[3], const branch_t (&b)[3]) + { + v[0] = b[0].first->value(); + v[1] = b[1].first->value(); + v[2] = b[2].first->value(); + } + }; + + template + struct evaluate_branches + { + static inline void execute(T_ (&v)[2], const branch_t (&b)[2]) + { + v[0] = b[0].first->value(); + v[1] = b[1].first->value(); + } + }; + + template + struct evaluate_branches + { + static inline void execute(T_ (&v)[1], const branch_t (&b)[1]) + { + v[0] = b[0].first->value(); + } + }; + + template + struct invoke { static inline T execute(ifunction&, branch_t (&)[ParamCount]) { return std::numeric_limits::quiet_NaN(); } }; + + template + struct invoke + { + static inline T_ execute(ifunction& f, T_ (&v)[20]) + { return f(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7],v[8],v[9],v[10],v[11],v[12],v[13],v[14],v[15],v[16],v[17],v[18],v[19]); } + }; + + template + struct invoke + { + static inline T_ execute(ifunction& f, T_ (&v)[19]) + { return f(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7],v[8],v[9],v[10],v[11],v[12],v[13],v[14],v[15],v[16],v[17],v[18]); } + }; + + template + struct invoke + { + static inline T_ execute(ifunction& f, T_ (&v)[18]) + { return f(v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15], v[16], v[17]); } + }; + + template + struct invoke + { + static inline T_ execute(ifunction& f, T_ (&v)[17]) + { return f(v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15], v[16]); } + }; + + template + struct invoke + { + static inline T_ execute(ifunction& f, T_ (&v)[16]) + { return f(v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15]); } + }; + + template + struct invoke + { + static inline T_ execute(ifunction& f, T_ (&v)[15]) + { return f(v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14]); } + }; + + template + struct invoke + { + static inline T_ execute(ifunction& f, T_ (&v)[14]) + { return f(v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13]); } + }; + + template + struct invoke + { + static inline T_ execute(ifunction& f, T_ (&v)[13]) + { return f(v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12]); } + }; + + template + struct invoke + { + static inline T_ execute(ifunction& f, T_ (&v)[12]) + { return f(v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11]); } + }; + + template + struct invoke + { + static inline T_ execute(ifunction& f, T_ (&v)[11]) + { return f(v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10]); } + }; + + template + struct invoke + { + static inline T_ execute(ifunction& f, T_ (&v)[10]) + { return f(v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9]); } + }; + + template + struct invoke + { + static inline T_ execute(ifunction& f, T_ (&v)[9]) + { return f(v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8]); } + }; + + template + struct invoke + { + static inline T_ execute(ifunction& f, T_ (&v)[8]) + { return f(v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7]); } + }; + + template + struct invoke + { + static inline T_ execute(ifunction& f, T_ (&v)[7]) + { return f(v[0], v[1], v[2], v[3], v[4], v[5], v[6]); } + }; + + template + struct invoke + { + static inline T_ execute(ifunction& f, T_ (&v)[6]) + { return f(v[0], v[1], v[2], v[3], v[4], v[5]); } + }; + + template + struct invoke + { + static inline T_ execute(ifunction& f, T_ (&v)[5]) + { return f(v[0], v[1], v[2], v[3], v[4]); } + }; + + template + struct invoke + { + static inline T_ execute(ifunction& f, T_ (&v)[4]) + { return f(v[0], v[1], v[2], v[3]); } + }; + + template + struct invoke + { + static inline T_ execute(ifunction& f, T_ (&v)[3]) + { return f(v[0], v[1], v[2]); } + }; + + template + struct invoke + { + static inline T_ execute(ifunction& f, T_ (&v)[2]) + { return f(v[0], v[1]); } + }; + + template + struct invoke + { + static inline T_ execute(ifunction& f, T_ (&v)[1]) + { return f(v[0]); } + }; + + private: + + ifunction* function_; + std::size_t parameter_count_; + branch_t branch_[N]; + }; + + template + class function_N_node exprtk_final : public expression_node + { + public: + + typedef expression_node* expression_ptr; + typedef IFunction ifunction; + + explicit function_N_node(ifunction* func) + : function_((0 == func->param_count) ? func : reinterpret_cast(0)) + {} + + inline bool operator <(const function_N_node& fn) const + { + return this < (&fn); + } + + inline T value() const exprtk_override + { + if (function_) + return (*function_)(); + else + return std::numeric_limits::quiet_NaN(); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_function; + } + + private: + + ifunction* function_; + }; + + template + class vararg_function_node exprtk_final : public expression_node + { + public: + + typedef expression_node* expression_ptr; + + vararg_function_node(VarArgFunction* func, + const std::vector& arg_list) + : function_(func) + , arg_list_(arg_list) + { + value_list_.resize(arg_list.size(),std::numeric_limits::quiet_NaN()); + } + + inline bool operator <(const vararg_function_node& fn) const + { + return this < (&fn); + } + + inline T value() const exprtk_override + { + if (function_) + { + populate_value_list(); + return (*function_)(value_list_); + } + else + return std::numeric_limits::quiet_NaN(); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_vafunction; + } + + void collect_nodes(typename expression_node::noderef_list_t& node_delete_list) exprtk_override + { + for (std::size_t i = 0; i < arg_list_.size(); ++i) + { + if (arg_list_[i] && !details::is_variable_node(arg_list_[i])) + { + node_delete_list.push_back(&arg_list_[i]); + } + } + } + + std::size_t node_depth() const exprtk_override + { + return expression_node::ndb_t::compute_node_depth(arg_list_); + } + + private: + + inline void populate_value_list() const + { + for (std::size_t i = 0; i < arg_list_.size(); ++i) + { + value_list_[i] = arg_list_[i]->value(); + } + } + + VarArgFunction* function_; + std::vector arg_list_; + mutable std::vector value_list_; + }; + + template + class generic_function_node : public expression_node + { + public: + + typedef type_store type_store_t; + typedef expression_node* expression_ptr; + typedef variable_node variable_node_t; + typedef vector_node vector_node_t; + typedef variable_node_t* variable_node_ptr_t; + typedef vector_node_t* vector_node_ptr_t; + typedef range_interface range_interface_t; + typedef range_data_type range_data_type_t; + typedef typename range_interface::range_t range_t; + + typedef std::pair branch_t; + typedef std::pair void_t; + + typedef std::vector tmp_vs_t; + typedef std::vector typestore_list_t; + typedef std::vector range_list_t; + + explicit generic_function_node(const std::vector& arg_list, + GenericFunction* func = reinterpret_cast(0)) + : function_(func) + , arg_list_(arg_list) + {} + + virtual ~generic_function_node() {} + + void collect_nodes(typename expression_node::noderef_list_t& node_delete_list) exprtk_override + { + expression_node::ndb_t::collect(branch_, node_delete_list); + } + + std::size_t node_depth() const exprtk_override exprtk_final + { + return expression_node::ndb_t::compute_node_depth(branch_); + } + + virtual bool init_branches() + { + expr_as_vec1_store_.resize(arg_list_.size(),T(0) ); + typestore_list_ .resize(arg_list_.size(),type_store_t() ); + range_list_ .resize(arg_list_.size(),range_data_type_t()); + branch_ .resize(arg_list_.size(),branch_t(reinterpret_cast(0),false)); + + for (std::size_t i = 0; i < arg_list_.size(); ++i) + { + type_store_t& ts = typestore_list_[i]; + + if (0 == arg_list_[i]) + return false; + else if (is_ivector_node(arg_list_[i])) + { + vector_interface* vi = reinterpret_cast*>(0); + + if (0 == (vi = dynamic_cast*>(arg_list_[i]))) + return false; + + ts.size = vi->size(); + ts.data = vi->vds().data(); + ts.type = type_store_t::e_vector; + vi->vec()->vec_holder().set_ref(&ts.vec_data); + } + #ifndef exprtk_disable_string_capabilities + else if (is_generally_string_node(arg_list_[i])) + { + string_base_node* sbn = reinterpret_cast*>(0); + + if (0 == (sbn = dynamic_cast*>(arg_list_[i]))) + return false; + + ts.size = sbn->size(); + ts.data = reinterpret_cast(const_cast(sbn->base())); + ts.type = type_store_t::e_string; + + range_list_[i].data = ts.data; + range_list_[i].size = ts.size; + range_list_[i].type_size = sizeof(char); + range_list_[i].str_node = sbn; + + range_interface_t* ri = reinterpret_cast(0); + + if (0 == (ri = dynamic_cast(arg_list_[i]))) + return false; + + const range_t& rp = ri->range_ref(); + + if ( + rp.const_range() && + is_const_string_range_node(arg_list_[i]) + ) + { + ts.size = rp.const_size(); + ts.data = static_cast(ts.data) + rp.n0_c.second; + range_list_[i].range = reinterpret_cast(0); + } + else + range_list_[i].range = &(ri->range_ref()); + } + #endif + else if (is_variable_node(arg_list_[i])) + { + variable_node_ptr_t var = variable_node_ptr_t(0); + + if (0 == (var = dynamic_cast(arg_list_[i]))) + return false; + + ts.size = 1; + ts.data = &var->ref(); + ts.type = type_store_t::e_scalar; + } + else + { + ts.size = 1; + ts.data = reinterpret_cast(&expr_as_vec1_store_[i]); + ts.type = type_store_t::e_scalar; + } + + branch_[i] = std::make_pair(arg_list_[i],branch_deletable(arg_list_[i])); + } + + return true; + } + + inline bool operator <(const generic_function_node& fn) const + { + return this < (&fn); + } + + inline T value() const exprtk_override + { + if (function_) + { + if (populate_value_list()) + { + typedef typename GenericFunction::parameter_list_t parameter_list_t; + + return (*function_)(parameter_list_t(typestore_list_)); + } + } + + return std::numeric_limits::quiet_NaN(); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_genfunction; + } + + protected: + + inline virtual bool populate_value_list() const + { + for (std::size_t i = 0; i < branch_.size(); ++i) + { + expr_as_vec1_store_[i] = branch_[i].first->value(); + } + + for (std::size_t i = 0; i < branch_.size(); ++i) + { + range_data_type_t& rdt = range_list_[i]; + + if (rdt.range) + { + const range_t& rp = (*rdt.range); + std::size_t r0 = 0; + std::size_t r1 = 0; + + if (rp(r0, r1, rdt.size)) + { + type_store_t& ts = typestore_list_[i]; + + ts.size = rp.cache_size(); + #ifndef exprtk_disable_string_capabilities + if (ts.type == type_store_t::e_string) + ts.data = const_cast(rdt.str_node->base()) + rp.cache.first; + else + #endif + ts.data = static_cast(rdt.data) + (rp.cache.first * rdt.type_size); + } + else + return false; + } + } + + return true; + } + + GenericFunction* function_; + mutable typestore_list_t typestore_list_; + + private: + + std::vector arg_list_; + std::vector branch_; + mutable tmp_vs_t expr_as_vec1_store_; + mutable range_list_t range_list_; + }; + + #ifndef exprtk_disable_string_capabilities + template + class string_function_node : public generic_function_node, + public string_base_node, + public range_interface + { + public: + + typedef generic_function_node gen_function_t; + typedef typename range_interface::range_t range_t; + + string_function_node(StringFunction* func, + const std::vector& arg_list) + : gen_function_t(arg_list,func) + { + range_.n0_c = std::make_pair(true,0); + range_.n1_c = std::make_pair(true,0); + range_.cache.first = range_.n0_c.second; + range_.cache.second = range_.n1_c.second; + } + + inline bool operator <(const string_function_node& fn) const + { + return this < (&fn); + } + + inline T value() const exprtk_override + { + if (gen_function_t::function_) + { + if (gen_function_t::populate_value_list()) + { + typedef typename StringFunction::parameter_list_t parameter_list_t; + + const T result = (*gen_function_t::function_) + ( + ret_string_, + parameter_list_t(gen_function_t::typestore_list_) + ); + + range_.n1_c.second = ret_string_.size() - 1; + range_.cache.second = range_.n1_c.second; + + return result; + } + } + + return std::numeric_limits::quiet_NaN(); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_strfunction; + } + + std::string str() const exprtk_override + { + return ret_string_; + } + + char_cptr base() const exprtk_override + { + return &ret_string_[0]; + } + + std::size_t size() const exprtk_override + { + return ret_string_.size(); + } + + range_t& range_ref() exprtk_override + { + return range_; + } + + const range_t& range_ref() const exprtk_override + { + return range_; + } + + protected: + + mutable range_t range_; + mutable std::string ret_string_; + }; + #endif + + template + class multimode_genfunction_node : public generic_function_node + { + public: + + typedef generic_function_node gen_function_t; + typedef typename gen_function_t::range_t range_t; + + multimode_genfunction_node(GenericFunction* func, + const std::size_t& param_seq_index, + const std::vector& arg_list) + : gen_function_t(arg_list,func) + , param_seq_index_(param_seq_index) + {} + + inline T value() const exprtk_override + { + if (gen_function_t::function_) + { + if (gen_function_t::populate_value_list()) + { + typedef typename GenericFunction::parameter_list_t parameter_list_t; + + return (*gen_function_t::function_) + ( + param_seq_index_, + parameter_list_t(gen_function_t::typestore_list_) + ); + } + } + + return std::numeric_limits::quiet_NaN(); + } + + inline typename expression_node::node_type type() const exprtk_override exprtk_final + { + return expression_node::e_genfunction; + } + + private: + + std::size_t param_seq_index_; + }; + + #ifndef exprtk_disable_string_capabilities + template + class multimode_strfunction_node exprtk_final : public string_function_node + { + public: + + typedef string_function_node str_function_t; + typedef typename str_function_t::range_t range_t; + + multimode_strfunction_node(StringFunction* func, + const std::size_t& param_seq_index, + const std::vector& arg_list) + : str_function_t(func,arg_list) + , param_seq_index_(param_seq_index) + {} + + inline T value() const exprtk_override + { + if (str_function_t::function_) + { + if (str_function_t::populate_value_list()) + { + typedef typename StringFunction::parameter_list_t parameter_list_t; + + const T result = (*str_function_t::function_) + ( + param_seq_index_, + str_function_t::ret_string_, + parameter_list_t(str_function_t::typestore_list_) + ); + + str_function_t::range_.n1_c.second = str_function_t::ret_string_.size() - 1; + str_function_t::range_.cache.second = str_function_t::range_.n1_c.second; + + return result; + } + } + + return std::numeric_limits::quiet_NaN(); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_strfunction; + } + + private: + + const std::size_t param_seq_index_; + }; + #endif + + class return_exception + {}; + + template + class null_igenfunc + { + public: + + virtual ~null_igenfunc() {} + + typedef type_store generic_type; + typedef typename generic_type::parameter_list parameter_list_t; + + inline virtual T operator() (parameter_list_t) + { + return std::numeric_limits::quiet_NaN(); + } + }; + + #ifndef exprtk_disable_return_statement + template + class return_node exprtk_final : public generic_function_node > + { + public: + + typedef results_context results_context_t; + typedef null_igenfunc igeneric_function_t; + typedef igeneric_function_t* igeneric_function_ptr; + typedef generic_function_node gen_function_t; + + return_node(const std::vector& arg_list, + results_context_t& rc) + : gen_function_t (arg_list) + , results_context_(&rc) + {} + + inline T value() const exprtk_override + { + if ( + (0 != results_context_) && + gen_function_t::populate_value_list() + ) + { + typedef typename type_store::parameter_list parameter_list_t; + + results_context_-> + assign(parameter_list_t(gen_function_t::typestore_list_)); + + throw return_exception(); + } + + return std::numeric_limits::quiet_NaN(); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_return; + } + + private: + + results_context_t* results_context_; + }; + + template + class return_envelope_node exprtk_final : public expression_node + { + public: + + typedef expression_node* expression_ptr; + typedef results_context results_context_t; + typedef std::pair branch_t; + + return_envelope_node(expression_ptr body, results_context_t& rc) + : results_context_(&rc ) + , return_invoked_ (false) + { + construct_branch_pair(body_, body); + } + + inline T value() const exprtk_override + { + assert(body_.first); + + try + { + return_invoked_ = false; + results_context_->clear(); + + return body_.first->value(); + } + catch(const return_exception&) + { + return_invoked_ = true; + return std::numeric_limits::quiet_NaN(); + } + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_retenv; + } + + inline bool* retinvk_ptr() + { + return &return_invoked_; + } + + void collect_nodes(typename expression_node::noderef_list_t& node_delete_list) exprtk_override + { + expression_node::ndb_t::collect(body_, node_delete_list); + } + + std::size_t node_depth() const exprtk_override + { + return expression_node::ndb_t::compute_node_depth(body_); + } + + private: + + results_context_t* results_context_; + mutable bool return_invoked_; + branch_t body_; + }; + #endif + + #define exprtk_define_unary_op(OpName) \ + template \ + struct OpName##_op \ + { \ + typedef typename functor_t::Type Type; \ + typedef typename expression_node::node_type node_t; \ + \ + static inline T process(Type v) \ + { \ + return numeric:: OpName (v); \ + } \ + \ + static inline node_t type() \ + { \ + return expression_node::e_##OpName; \ + } \ + \ + static inline details::operator_type operation() \ + { \ + return details::e_##OpName; \ + } \ + }; \ + + exprtk_define_unary_op(abs ) + exprtk_define_unary_op(acos ) + exprtk_define_unary_op(acosh) + exprtk_define_unary_op(asin ) + exprtk_define_unary_op(asinh) + exprtk_define_unary_op(atan ) + exprtk_define_unary_op(atanh) + exprtk_define_unary_op(ceil ) + exprtk_define_unary_op(cos ) + exprtk_define_unary_op(cosh ) + exprtk_define_unary_op(cot ) + exprtk_define_unary_op(csc ) + exprtk_define_unary_op(d2g ) + exprtk_define_unary_op(d2r ) + exprtk_define_unary_op(erf ) + exprtk_define_unary_op(erfc ) + exprtk_define_unary_op(exp ) + exprtk_define_unary_op(expm1) + exprtk_define_unary_op(floor) + exprtk_define_unary_op(frac ) + exprtk_define_unary_op(g2d ) + exprtk_define_unary_op(log ) + exprtk_define_unary_op(log10) + exprtk_define_unary_op(log2 ) + exprtk_define_unary_op(log1p) + exprtk_define_unary_op(ncdf ) + exprtk_define_unary_op(neg ) + exprtk_define_unary_op(notl ) + exprtk_define_unary_op(pos ) + exprtk_define_unary_op(r2d ) + exprtk_define_unary_op(round) + exprtk_define_unary_op(sec ) + exprtk_define_unary_op(sgn ) + exprtk_define_unary_op(sin ) + exprtk_define_unary_op(sinc ) + exprtk_define_unary_op(sinh ) + exprtk_define_unary_op(sqrt ) + exprtk_define_unary_op(tan ) + exprtk_define_unary_op(tanh ) + exprtk_define_unary_op(trunc) + #undef exprtk_define_unary_op + + template + struct opr_base + { + typedef typename details::functor_t::Type Type; + typedef typename details::functor_t::RefType RefType; + typedef typename details::functor_t functor_t; + typedef typename functor_t::qfunc_t quaternary_functor_t; + typedef typename functor_t::tfunc_t trinary_functor_t; + typedef typename functor_t::bfunc_t binary_functor_t; + typedef typename functor_t::ufunc_t unary_functor_t; + }; + + template + struct add_op : public opr_base + { + typedef typename opr_base::Type Type; + typedef typename opr_base::RefType RefType; + + static inline T process(Type t1, Type t2) { return t1 + t2; } + static inline T process(Type t1, Type t2, Type t3) { return t1 + t2 + t3; } + static inline void assign(RefType t1, Type t2) { t1 += t2; } + static inline typename expression_node::node_type type() { return expression_node::e_add; } + static inline details::operator_type operation() { return details::e_add; } + }; + + template + struct mul_op : public opr_base + { + typedef typename opr_base::Type Type; + typedef typename opr_base::RefType RefType; + + static inline T process(Type t1, Type t2) { return t1 * t2; } + static inline T process(Type t1, Type t2, Type t3) { return t1 * t2 * t3; } + static inline void assign(RefType t1, Type t2) { t1 *= t2; } + static inline typename expression_node::node_type type() { return expression_node::e_mul; } + static inline details::operator_type operation() { return details::e_mul; } + }; + + template + struct sub_op : public opr_base + { + typedef typename opr_base::Type Type; + typedef typename opr_base::RefType RefType; + + static inline T process(Type t1, Type t2) { return t1 - t2; } + static inline T process(Type t1, Type t2, Type t3) { return t1 - t2 - t3; } + static inline void assign(RefType t1, Type t2) { t1 -= t2; } + static inline typename expression_node::node_type type() { return expression_node::e_sub; } + static inline details::operator_type operation() { return details::e_sub; } + }; + + template + struct div_op : public opr_base + { + typedef typename opr_base::Type Type; + typedef typename opr_base::RefType RefType; + + static inline T process(Type t1, Type t2) { return t1 / t2; } + static inline T process(Type t1, Type t2, Type t3) { return t1 / t2 / t3; } + static inline void assign(RefType t1, Type t2) { t1 /= t2; } + static inline typename expression_node::node_type type() { return expression_node::e_div; } + static inline details::operator_type operation() { return details::e_div; } + }; + + template + struct mod_op : public opr_base + { + typedef typename opr_base::Type Type; + typedef typename opr_base::RefType RefType; + + static inline T process(Type t1, Type t2) { return numeric::modulus(t1,t2); } + static inline void assign(RefType t1, Type t2) { t1 = numeric::modulus(t1,t2); } + static inline typename expression_node::node_type type() { return expression_node::e_mod; } + static inline details::operator_type operation() { return details::e_mod; } + }; + + template + struct pow_op : public opr_base + { + typedef typename opr_base::Type Type; + typedef typename opr_base::RefType RefType; + + static inline T process(Type t1, Type t2) { return numeric::pow(t1,t2); } + static inline void assign(RefType t1, Type t2) { t1 = numeric::pow(t1,t2); } + static inline typename expression_node::node_type type() { return expression_node::e_pow; } + static inline details::operator_type operation() { return details::e_pow; } + }; + + template + struct lt_op : public opr_base + { + typedef typename opr_base::Type Type; + + static inline T process(Type t1, Type t2) { return ((t1 < t2) ? T(1) : T(0)); } + static inline T process(const std::string& t1, const std::string& t2) { return ((t1 < t2) ? T(1) : T(0)); } + static inline typename expression_node::node_type type() { return expression_node::e_lt; } + static inline details::operator_type operation() { return details::e_lt; } + }; + + template + struct lte_op : public opr_base + { + typedef typename opr_base::Type Type; + + static inline T process(Type t1, Type t2) { return ((t1 <= t2) ? T(1) : T(0)); } + static inline T process(const std::string& t1, const std::string& t2) { return ((t1 <= t2) ? T(1) : T(0)); } + static inline typename expression_node::node_type type() { return expression_node::e_lte; } + static inline details::operator_type operation() { return details::e_lte; } + }; + + template + struct gt_op : public opr_base + { + typedef typename opr_base::Type Type; + + static inline T process(Type t1, Type t2) { return ((t1 > t2) ? T(1) : T(0)); } + static inline T process(const std::string& t1, const std::string& t2) { return ((t1 > t2) ? T(1) : T(0)); } + static inline typename expression_node::node_type type() { return expression_node::e_gt; } + static inline details::operator_type operation() { return details::e_gt; } + }; + + template + struct gte_op : public opr_base + { + typedef typename opr_base::Type Type; + + static inline T process(Type t1, Type t2) { return ((t1 >= t2) ? T(1) : T(0)); } + static inline T process(const std::string& t1, const std::string& t2) { return ((t1 >= t2) ? T(1) : T(0)); } + static inline typename expression_node::node_type type() { return expression_node::e_gte; } + static inline details::operator_type operation() { return details::e_gte; } + }; + + template + struct eq_op : public opr_base + { + typedef typename opr_base::Type Type; + static inline T process(Type t1, Type t2) { return (std::equal_to()(t1,t2) ? T(1) : T(0)); } + static inline T process(const std::string& t1, const std::string& t2) { return ((t1 == t2) ? T(1) : T(0)); } + static inline typename expression_node::node_type type() { return expression_node::e_eq; } + static inline details::operator_type operation() { return details::e_eq; } + }; + + template + struct equal_op : public opr_base + { + typedef typename opr_base::Type Type; + + static inline T process(Type t1, Type t2) { return numeric::equal(t1,t2); } + static inline T process(const std::string& t1, const std::string& t2) { return ((t1 == t2) ? T(1) : T(0)); } + static inline typename expression_node::node_type type() { return expression_node::e_eq; } + static inline details::operator_type operation() { return details::e_equal; } + }; + + template + struct ne_op : public opr_base + { + typedef typename opr_base::Type Type; + + static inline T process(Type t1, Type t2) { return (std::not_equal_to()(t1,t2) ? T(1) : T(0)); } + static inline T process(const std::string& t1, const std::string& t2) { return ((t1 != t2) ? T(1) : T(0)); } + static inline typename expression_node::node_type type() { return expression_node::e_ne; } + static inline details::operator_type operation() { return details::e_ne; } + }; + + template + struct and_op : public opr_base + { + typedef typename opr_base::Type Type; + + static inline T process(Type t1, Type t2) { return (details::is_true(t1) && details::is_true(t2)) ? T(1) : T(0); } + static inline typename expression_node::node_type type() { return expression_node::e_and; } + static inline details::operator_type operation() { return details::e_and; } + }; + + template + struct nand_op : public opr_base + { + typedef typename opr_base::Type Type; + + static inline T process(Type t1, Type t2) { return (details::is_true(t1) && details::is_true(t2)) ? T(0) : T(1); } + static inline typename expression_node::node_type type() { return expression_node::e_nand; } + static inline details::operator_type operation() { return details::e_nand; } + }; + + template + struct or_op : public opr_base + { + typedef typename opr_base::Type Type; + + static inline T process(Type t1, Type t2) { return (details::is_true(t1) || details::is_true(t2)) ? T(1) : T(0); } + static inline typename expression_node::node_type type() { return expression_node::e_or; } + static inline details::operator_type operation() { return details::e_or; } + }; + + template + struct nor_op : public opr_base + { + typedef typename opr_base::Type Type; + + static inline T process(Type t1, Type t2) { return (details::is_true(t1) || details::is_true(t2)) ? T(0) : T(1); } + static inline typename expression_node::node_type type() { return expression_node::e_nor; } + static inline details::operator_type operation() { return details::e_nor; } + }; + + template + struct xor_op : public opr_base + { + typedef typename opr_base::Type Type; + + static inline T process(Type t1, Type t2) { return numeric::xor_opr(t1,t2); } + static inline typename expression_node::node_type type() { return expression_node::e_nor; } + static inline details::operator_type operation() { return details::e_xor; } + }; + + template + struct xnor_op : public opr_base + { + typedef typename opr_base::Type Type; + + static inline T process(Type t1, Type t2) { return numeric::xnor_opr(t1,t2); } + static inline typename expression_node::node_type type() { return expression_node::e_nor; } + static inline details::operator_type operation() { return details::e_xnor; } + }; + + template + struct in_op : public opr_base + { + typedef typename opr_base::Type Type; + + static inline T process(const T&, const T&) { return std::numeric_limits::quiet_NaN(); } + static inline T process(const std::string& t1, const std::string& t2) { return ((std::string::npos != t2.find(t1)) ? T(1) : T(0)); } + static inline typename expression_node::node_type type() { return expression_node::e_in; } + static inline details::operator_type operation() { return details::e_in; } + }; + + template + struct like_op : public opr_base + { + typedef typename opr_base::Type Type; + + static inline T process(const T&, const T&) { return std::numeric_limits::quiet_NaN(); } + static inline T process(const std::string& t1, const std::string& t2) { return (details::wc_match(t2,t1) ? T(1) : T(0)); } + static inline typename expression_node::node_type type() { return expression_node::e_like; } + static inline details::operator_type operation() { return details::e_like; } + }; + + template + struct ilike_op : public opr_base + { + typedef typename opr_base::Type Type; + + static inline T process(const T&, const T&) { return std::numeric_limits::quiet_NaN(); } + static inline T process(const std::string& t1, const std::string& t2) { return (details::wc_imatch(t2,t1) ? T(1) : T(0)); } + static inline typename expression_node::node_type type() { return expression_node::e_ilike; } + static inline details::operator_type operation() { return details::e_ilike; } + }; + + template + struct inrange_op : public opr_base + { + typedef typename opr_base::Type Type; + + static inline T process(const T& t0, const T& t1, const T& t2) { return ((t0 <= t1) && (t1 <= t2)) ? T(1) : T(0); } + static inline T process(const std::string& t0, const std::string& t1, const std::string& t2) + { + return ((t0 <= t1) && (t1 <= t2)) ? T(1) : T(0); + } + static inline typename expression_node::node_type type() { return expression_node::e_inranges; } + static inline details::operator_type operation() { return details::e_inrange; } + }; + + template + inline T value(details::expression_node* n) + { + return n->value(); + } + + template + inline T value(std::pair*,bool> n) + { + return n.first->value(); + } + + template + inline T value(const T* t) + { + return (*t); + } + + template + inline T value(const T& t) + { + return t; + } + + template + struct vararg_add_op : public opr_base + { + typedef typename opr_base::Type Type; + + template class Sequence> + static inline T process(const Sequence& arg_list) + { + switch (arg_list.size()) + { + case 0 : return T(0); + case 1 : return process_1(arg_list); + case 2 : return process_2(arg_list); + case 3 : return process_3(arg_list); + case 4 : return process_4(arg_list); + case 5 : return process_5(arg_list); + default : + { + T result = T(0); + + for (std::size_t i = 0; i < arg_list.size(); ++i) + { + result += value(arg_list[i]); + } + + return result; + } + } + } + + template + static inline T process_1(const Sequence& arg_list) + { + return value(arg_list[0]); + } + + template + static inline T process_2(const Sequence& arg_list) + { + return value(arg_list[0]) + value(arg_list[1]); + } + + template + static inline T process_3(const Sequence& arg_list) + { + return value(arg_list[0]) + value(arg_list[1]) + + value(arg_list[2]) ; + } + + template + static inline T process_4(const Sequence& arg_list) + { + return value(arg_list[0]) + value(arg_list[1]) + + value(arg_list[2]) + value(arg_list[3]) ; + } + + template + static inline T process_5(const Sequence& arg_list) + { + return value(arg_list[0]) + value(arg_list[1]) + + value(arg_list[2]) + value(arg_list[3]) + + value(arg_list[4]) ; + } + }; + + template + struct vararg_mul_op : public opr_base + { + typedef typename opr_base::Type Type; + + template class Sequence> + static inline T process(const Sequence& arg_list) + { + switch (arg_list.size()) + { + case 0 : return T(0); + case 1 : return process_1(arg_list); + case 2 : return process_2(arg_list); + case 3 : return process_3(arg_list); + case 4 : return process_4(arg_list); + case 5 : return process_5(arg_list); + default : + { + T result = T(value(arg_list[0])); + + for (std::size_t i = 1; i < arg_list.size(); ++i) + { + result *= value(arg_list[i]); + } + + return result; + } + } + } + + template + static inline T process_1(const Sequence& arg_list) + { + return value(arg_list[0]); + } + + template + static inline T process_2(const Sequence& arg_list) + { + return value(arg_list[0]) * value(arg_list[1]); + } + + template + static inline T process_3(const Sequence& arg_list) + { + return value(arg_list[0]) * value(arg_list[1]) * + value(arg_list[2]) ; + } + + template + static inline T process_4(const Sequence& arg_list) + { + return value(arg_list[0]) * value(arg_list[1]) * + value(arg_list[2]) * value(arg_list[3]) ; + } + + template + static inline T process_5(const Sequence& arg_list) + { + return value(arg_list[0]) * value(arg_list[1]) * + value(arg_list[2]) * value(arg_list[3]) * + value(arg_list[4]) ; + } + }; + + template + struct vararg_avg_op : public opr_base + { + typedef typename opr_base::Type Type; + + template class Sequence> + static inline T process(const Sequence& arg_list) + { + switch (arg_list.size()) + { + case 0 : return T(0); + case 1 : return process_1(arg_list); + case 2 : return process_2(arg_list); + case 3 : return process_3(arg_list); + case 4 : return process_4(arg_list); + case 5 : return process_5(arg_list); + default : return vararg_add_op::process(arg_list) / arg_list.size(); + } + } + + template + static inline T process_1(const Sequence& arg_list) + { + return value(arg_list[0]); + } + + template + static inline T process_2(const Sequence& arg_list) + { + return (value(arg_list[0]) + value(arg_list[1])) / T(2); + } + + template + static inline T process_3(const Sequence& arg_list) + { + return (value(arg_list[0]) + value(arg_list[1]) + value(arg_list[2])) / T(3); + } + + template + static inline T process_4(const Sequence& arg_list) + { + return (value(arg_list[0]) + value(arg_list[1]) + + value(arg_list[2]) + value(arg_list[3])) / T(4); + } + + template + static inline T process_5(const Sequence& arg_list) + { + return (value(arg_list[0]) + value(arg_list[1]) + + value(arg_list[2]) + value(arg_list[3]) + + value(arg_list[4])) / T(5); + } + }; + + template + struct vararg_min_op : public opr_base + { + typedef typename opr_base::Type Type; + + template class Sequence> + static inline T process(const Sequence& arg_list) + { + switch (arg_list.size()) + { + case 0 : return T(0); + case 1 : return process_1(arg_list); + case 2 : return process_2(arg_list); + case 3 : return process_3(arg_list); + case 4 : return process_4(arg_list); + case 5 : return process_5(arg_list); + default : + { + T result = T(value(arg_list[0])); + + for (std::size_t i = 1; i < arg_list.size(); ++i) + { + const T v = value(arg_list[i]); + + if (v < result) + result = v; + } + + return result; + } + } + } + + template + static inline T process_1(const Sequence& arg_list) + { + return value(arg_list[0]); + } + + template + static inline T process_2(const Sequence& arg_list) + { + return std::min(value(arg_list[0]),value(arg_list[1])); + } + + template + static inline T process_3(const Sequence& arg_list) + { + return std::min(std::min(value(arg_list[0]),value(arg_list[1])),value(arg_list[2])); + } + + template + static inline T process_4(const Sequence& arg_list) + { + return std::min( + std::min(value(arg_list[0]), value(arg_list[1])), + std::min(value(arg_list[2]), value(arg_list[3]))); + } + + template + static inline T process_5(const Sequence& arg_list) + { + return std::min( + std::min(std::min(value(arg_list[0]), value(arg_list[1])), + std::min(value(arg_list[2]), value(arg_list[3]))), + value(arg_list[4])); + } + }; + + template + struct vararg_max_op : public opr_base + { + typedef typename opr_base::Type Type; + + template class Sequence> + static inline T process(const Sequence& arg_list) + { + switch (arg_list.size()) + { + case 0 : return T(0); + case 1 : return process_1(arg_list); + case 2 : return process_2(arg_list); + case 3 : return process_3(arg_list); + case 4 : return process_4(arg_list); + case 5 : return process_5(arg_list); + default : + { + T result = T(value(arg_list[0])); + + for (std::size_t i = 1; i < arg_list.size(); ++i) + { + const T v = value(arg_list[i]); + + if (v > result) + result = v; + } + + return result; + } + } + } + + template + static inline T process_1(const Sequence& arg_list) + { + return value(arg_list[0]); + } + + template + static inline T process_2(const Sequence& arg_list) + { + return std::max(value(arg_list[0]),value(arg_list[1])); + } + + template + static inline T process_3(const Sequence& arg_list) + { + return std::max(std::max(value(arg_list[0]),value(arg_list[1])),value(arg_list[2])); + } + + template + static inline T process_4(const Sequence& arg_list) + { + return std::max( + std::max(value(arg_list[0]), value(arg_list[1])), + std::max(value(arg_list[2]), value(arg_list[3]))); + } + + template + static inline T process_5(const Sequence& arg_list) + { + return std::max( + std::max(std::max(value(arg_list[0]), value(arg_list[1])), + std::max(value(arg_list[2]), value(arg_list[3]))), + value(arg_list[4])); + } + }; + + template + struct vararg_mand_op : public opr_base + { + typedef typename opr_base::Type Type; + + template class Sequence> + static inline T process(const Sequence& arg_list) + { + switch (arg_list.size()) + { + case 1 : return process_1(arg_list); + case 2 : return process_2(arg_list); + case 3 : return process_3(arg_list); + case 4 : return process_4(arg_list); + case 5 : return process_5(arg_list); + default : + { + for (std::size_t i = 0; i < arg_list.size(); ++i) + { + if (std::equal_to()(T(0), value(arg_list[i]))) + return T(0); + } + + return T(1); + } + } + } + + template + static inline T process_1(const Sequence& arg_list) + { + return std::not_equal_to() + (T(0), value(arg_list[0])) ? T(1) : T(0); + } + + template + static inline T process_2(const Sequence& arg_list) + { + return ( + std::not_equal_to()(T(0), value(arg_list[0])) && + std::not_equal_to()(T(0), value(arg_list[1])) + ) ? T(1) : T(0); + } + + template + static inline T process_3(const Sequence& arg_list) + { + return ( + std::not_equal_to()(T(0), value(arg_list[0])) && + std::not_equal_to()(T(0), value(arg_list[1])) && + std::not_equal_to()(T(0), value(arg_list[2])) + ) ? T(1) : T(0); + } + + template + static inline T process_4(const Sequence& arg_list) + { + return ( + std::not_equal_to()(T(0), value(arg_list[0])) && + std::not_equal_to()(T(0), value(arg_list[1])) && + std::not_equal_to()(T(0), value(arg_list[2])) && + std::not_equal_to()(T(0), value(arg_list[3])) + ) ? T(1) : T(0); + } + + template + static inline T process_5(const Sequence& arg_list) + { + return ( + std::not_equal_to()(T(0), value(arg_list[0])) && + std::not_equal_to()(T(0), value(arg_list[1])) && + std::not_equal_to()(T(0), value(arg_list[2])) && + std::not_equal_to()(T(0), value(arg_list[3])) && + std::not_equal_to()(T(0), value(arg_list[4])) + ) ? T(1) : T(0); + } + }; + + template + struct vararg_mor_op : public opr_base + { + typedef typename opr_base::Type Type; + + template class Sequence> + static inline T process(const Sequence& arg_list) + { + switch (arg_list.size()) + { + case 1 : return process_1(arg_list); + case 2 : return process_2(arg_list); + case 3 : return process_3(arg_list); + case 4 : return process_4(arg_list); + case 5 : return process_5(arg_list); + default : + { + for (std::size_t i = 0; i < arg_list.size(); ++i) + { + if (std::not_equal_to()(T(0), value(arg_list[i]))) + return T(1); + } + + return T(0); + } + } + } + + template + static inline T process_1(const Sequence& arg_list) + { + return std::not_equal_to() + (T(0), value(arg_list[0])) ? T(1) : T(0); + } + + template + static inline T process_2(const Sequence& arg_list) + { + return ( + std::not_equal_to()(T(0), value(arg_list[0])) || + std::not_equal_to()(T(0), value(arg_list[1])) + ) ? T(1) : T(0); + } + + template + static inline T process_3(const Sequence& arg_list) + { + return ( + std::not_equal_to()(T(0), value(arg_list[0])) || + std::not_equal_to()(T(0), value(arg_list[1])) || + std::not_equal_to()(T(0), value(arg_list[2])) + ) ? T(1) : T(0); + } + + template + static inline T process_4(const Sequence& arg_list) + { + return ( + std::not_equal_to()(T(0), value(arg_list[0])) || + std::not_equal_to()(T(0), value(arg_list[1])) || + std::not_equal_to()(T(0), value(arg_list[2])) || + std::not_equal_to()(T(0), value(arg_list[3])) + ) ? T(1) : T(0); + } + + template + static inline T process_5(const Sequence& arg_list) + { + return ( + std::not_equal_to()(T(0), value(arg_list[0])) || + std::not_equal_to()(T(0), value(arg_list[1])) || + std::not_equal_to()(T(0), value(arg_list[2])) || + std::not_equal_to()(T(0), value(arg_list[3])) || + std::not_equal_to()(T(0), value(arg_list[4])) + ) ? T(1) : T(0); + } + }; + + template + struct vararg_multi_op : public opr_base + { + typedef typename opr_base::Type Type; + + template class Sequence> + static inline T process(const Sequence& arg_list) + { + switch (arg_list.size()) + { + case 0 : return std::numeric_limits::quiet_NaN(); + case 1 : return process_1(arg_list); + case 2 : return process_2(arg_list); + case 3 : return process_3(arg_list); + case 4 : return process_4(arg_list); + case 5 : return process_5(arg_list); + case 6 : return process_6(arg_list); + case 7 : return process_7(arg_list); + case 8 : return process_8(arg_list); + default : + { + for (std::size_t i = 0; i < (arg_list.size() - 1); ++i) + { + value(arg_list[i]); + } + + return value(arg_list.back()); + } + } + } + + template + static inline T process_1(const Sequence& arg_list) + { + return value(arg_list[0]); + } + + template + static inline T process_2(const Sequence& arg_list) + { + value(arg_list[0]); + return value(arg_list[1]); + } + + template + static inline T process_3(const Sequence& arg_list) + { + value(arg_list[0]); + value(arg_list[1]); + return value(arg_list[2]); + } + + template + static inline T process_4(const Sequence& arg_list) + { + value(arg_list[0]); + value(arg_list[1]); + value(arg_list[2]); + return value(arg_list[3]); + } + + template + static inline T process_5(const Sequence& arg_list) + { + value(arg_list[0]); + value(arg_list[1]); + value(arg_list[2]); + value(arg_list[3]); + return value(arg_list[4]); + } + + template + static inline T process_6(const Sequence& arg_list) + { + value(arg_list[0]); + value(arg_list[1]); + value(arg_list[2]); + value(arg_list[3]); + value(arg_list[4]); + return value(arg_list[5]); + } + + template + static inline T process_7(const Sequence& arg_list) + { + value(arg_list[0]); + value(arg_list[1]); + value(arg_list[2]); + value(arg_list[3]); + value(arg_list[4]); + value(arg_list[5]); + return value(arg_list[6]); + } + + template + static inline T process_8(const Sequence& arg_list) + { + value(arg_list[0]); + value(arg_list[1]); + value(arg_list[2]); + value(arg_list[3]); + value(arg_list[4]); + value(arg_list[5]); + value(arg_list[6]); + return value(arg_list[7]); + } + }; + + template + struct vec_add_op + { + typedef vector_interface* ivector_ptr; + + static inline T process(const ivector_ptr v) + { + const T* vec = v->vec()->vds().data(); + const std::size_t vec_size = v->vec()->vds().size(); + + loop_unroll::details lud(vec_size); + + if (vec_size <= static_cast(lud.batch_size)) + { + T result = T(0); + int i = 0; + + exprtk_disable_fallthrough_begin + switch (vec_size) + { + #define case_stmt(N) \ + case N : result += vec[i++]; \ + + #ifndef exprtk_disable_superscalar_unroll + case_stmt(16) case_stmt(15) + case_stmt(14) case_stmt(13) + case_stmt(12) case_stmt(11) + case_stmt(10) case_stmt( 9) + case_stmt( 8) case_stmt( 7) + case_stmt( 6) case_stmt( 5) + #endif + case_stmt( 4) case_stmt( 3) + case_stmt( 2) case_stmt( 1) + } + exprtk_disable_fallthrough_end + + #undef case_stmt + + return result; + } + + T r[] = { + T(0), T(0), T(0), T(0), T(0), T(0), T(0), T(0), + T(0), T(0), T(0), T(0), T(0), T(0), T(0), T(0) + }; + + const T* upper_bound = vec + lud.upper_bound; + + while (vec < upper_bound) + { + #define exprtk_loop(N) \ + r[N] += vec[N]; \ + + exprtk_loop( 0) exprtk_loop( 1) + exprtk_loop( 2) exprtk_loop( 3) + #ifndef exprtk_disable_superscalar_unroll + exprtk_loop( 4) exprtk_loop( 5) + exprtk_loop( 6) exprtk_loop( 7) + exprtk_loop( 8) exprtk_loop( 9) + exprtk_loop(10) exprtk_loop(11) + exprtk_loop(12) exprtk_loop(13) + exprtk_loop(14) exprtk_loop(15) + #endif + + vec += lud.batch_size; + } + + int i = 0; + + exprtk_disable_fallthrough_begin + switch (lud.remainder) + { + #define case_stmt(N) \ + case N : r[0] += vec[i++]; \ + + #ifndef exprtk_disable_superscalar_unroll + case_stmt(15) case_stmt(14) + case_stmt(13) case_stmt(12) + case_stmt(11) case_stmt(10) + case_stmt( 9) case_stmt( 8) + case_stmt( 7) case_stmt( 6) + case_stmt( 5) case_stmt( 4) + #endif + case_stmt( 3) case_stmt( 2) + case_stmt( 1) + } + exprtk_disable_fallthrough_end + + #undef exprtk_loop + #undef case_stmt + + return (r[ 0] + r[ 1] + r[ 2] + r[ 3]) + #ifndef exprtk_disable_superscalar_unroll + + (r[ 4] + r[ 5] + r[ 6] + r[ 7]) + + (r[ 8] + r[ 9] + r[10] + r[11]) + + (r[12] + r[13] + r[14] + r[15]) + #endif + ; + } + }; + + template + struct vec_mul_op + { + typedef vector_interface* ivector_ptr; + + static inline T process(const ivector_ptr v) + { + const T* vec = v->vec()->vds().data(); + const std::size_t vec_size = v->vec()->vds().size(); + + loop_unroll::details lud(vec_size); + + if (vec_size <= static_cast(lud.batch_size)) + { + T result = T(1); + int i = 0; + + exprtk_disable_fallthrough_begin + switch (vec_size) + { + #define case_stmt(N) \ + case N : result *= vec[i++]; \ + + #ifndef exprtk_disable_superscalar_unroll + case_stmt(16) case_stmt(15) + case_stmt(14) case_stmt(13) + case_stmt(12) case_stmt(11) + case_stmt(10) case_stmt( 9) + case_stmt( 8) case_stmt( 7) + case_stmt( 6) case_stmt( 5) + #endif + case_stmt( 4) case_stmt( 3) + case_stmt( 2) case_stmt( 1) + } + exprtk_disable_fallthrough_end + + #undef case_stmt + + return result; + } + + T r[] = { + T(1), T(1), T(1), T(1), T(1), T(1), T(1), T(1), + T(1), T(1), T(1), T(1), T(1), T(1), T(1), T(1) + }; + + const T* upper_bound = vec + lud.upper_bound; + + while (vec < upper_bound) + { + #define exprtk_loop(N) \ + r[N] *= vec[N]; \ + + exprtk_loop( 0) exprtk_loop( 1) + exprtk_loop( 2) exprtk_loop( 3) + #ifndef exprtk_disable_superscalar_unroll + exprtk_loop( 4) exprtk_loop( 5) + exprtk_loop( 6) exprtk_loop( 7) + exprtk_loop( 8) exprtk_loop( 9) + exprtk_loop(10) exprtk_loop(11) + exprtk_loop(12) exprtk_loop(13) + exprtk_loop(14) exprtk_loop(15) + #endif + + vec += lud.batch_size; + } + + int i = 0; + + exprtk_disable_fallthrough_begin + switch (lud.remainder) + { + #define case_stmt(N) \ + case N : r[0] *= vec[i++]; \ + + #ifndef exprtk_disable_superscalar_unroll + case_stmt(15) case_stmt(14) + case_stmt(13) case_stmt(12) + case_stmt(11) case_stmt(10) + case_stmt( 9) case_stmt( 8) + case_stmt( 7) case_stmt( 6) + case_stmt( 5) case_stmt( 4) + #endif + case_stmt( 3) case_stmt( 2) + case_stmt( 1) + } + exprtk_disable_fallthrough_end + + #undef exprtk_loop + #undef case_stmt + + return (r[ 0] * r[ 1] * r[ 2] * r[ 3]) + #ifndef exprtk_disable_superscalar_unroll + + (r[ 4] * r[ 5] * r[ 6] * r[ 7]) + + (r[ 8] * r[ 9] * r[10] * r[11]) + + (r[12] * r[13] * r[14] * r[15]) + #endif + ; + } + }; + + template + struct vec_avg_op + { + typedef vector_interface* ivector_ptr; + + static inline T process(const ivector_ptr v) + { + const std::size_t vec_size = v->vec()->vds().size(); + + return vec_add_op::process(v) / vec_size; + } + }; + + template + struct vec_min_op + { + typedef vector_interface* ivector_ptr; + + static inline T process(const ivector_ptr v) + { + const T* vec = v->vec()->vds().data(); + const std::size_t vec_size = v->vec()->vds().size(); + + T result = vec[0]; + + for (std::size_t i = 1; i < vec_size; ++i) + { + const T v_i = vec[i]; + + if (v_i < result) + result = v_i; + } + + return result; + } + }; + + template + struct vec_max_op + { + typedef vector_interface* ivector_ptr; + + static inline T process(const ivector_ptr v) + { + const T* vec = v->vec()->vds().data(); + const std::size_t vec_size = v->vec()->vds().size(); + + T result = vec[0]; + + for (std::size_t i = 1; i < vec_size; ++i) + { + const T v_i = vec[i]; + + if (v_i > result) + result = v_i; + } + + return result; + } + }; + + template + class vov_base_node : public expression_node + { + public: + + virtual ~vov_base_node() {} + + inline virtual operator_type operation() const + { + return details::e_default; + } + + virtual const T& v0() const = 0; + + virtual const T& v1() const = 0; + }; + + template + class cov_base_node : public expression_node + { + public: + + virtual ~cov_base_node() {} + + inline virtual operator_type operation() const + { + return details::e_default; + } + + virtual const T c() const = 0; + + virtual const T& v() const = 0; + }; + + template + class voc_base_node : public expression_node + { + public: + + virtual ~voc_base_node() {} + + inline virtual operator_type operation() const + { + return details::e_default; + } + + virtual const T c() const = 0; + + virtual const T& v() const = 0; + }; + + template + class vob_base_node : public expression_node + { + public: + + virtual ~vob_base_node() {} + + virtual const T& v() const = 0; + }; + + template + class bov_base_node : public expression_node + { + public: + + virtual ~bov_base_node() {} + + virtual const T& v() const = 0; + }; + + template + class cob_base_node : public expression_node + { + public: + + virtual ~cob_base_node() {} + + inline virtual operator_type operation() const + { + return details::e_default; + } + + virtual const T c() const = 0; + + virtual void set_c(const T) = 0; + + virtual expression_node* move_branch(const std::size_t& index) = 0; + }; + + template + class boc_base_node : public expression_node + { + public: + + virtual ~boc_base_node() {} + + inline virtual operator_type operation() const + { + return details::e_default; + } + + virtual const T c() const = 0; + + virtual void set_c(const T) = 0; + + virtual expression_node* move_branch(const std::size_t& index) = 0; + }; + + template + class uv_base_node : public expression_node + { + public: + + virtual ~uv_base_node() {} + + inline virtual operator_type operation() const + { + return details::e_default; + } + + virtual const T& v() const = 0; + }; + + template + class sos_base_node : public expression_node + { + public: + + virtual ~sos_base_node() {} + + inline virtual operator_type operation() const + { + return details::e_default; + } + }; + + template + class sosos_base_node : public expression_node + { + public: + + virtual ~sosos_base_node() {} + + inline virtual operator_type operation() const + { + return details::e_default; + } + }; + + template + class T0oT1oT2_base_node : public expression_node + { + public: + + virtual ~T0oT1oT2_base_node() {} + + virtual std::string type_id() const = 0; + }; + + template + class T0oT1oT2oT3_base_node : public expression_node + { + public: + + virtual ~T0oT1oT2oT3_base_node() {} + + virtual std::string type_id() const = 0; + }; + + template + class unary_variable_node exprtk_final : public uv_base_node + { + public: + + typedef expression_node* expression_ptr; + typedef Operation operation_t; + + explicit unary_variable_node(const T& var) + : v_(var) + {} + + inline T value() const exprtk_override + { + return Operation::process(v_); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return Operation::type(); + } + + inline operator_type operation() const exprtk_override + { + return Operation::operation(); + } + + inline const T& v() const exprtk_override + { + return v_; + } + + private: + + unary_variable_node(const unary_variable_node&) exprtk_delete; + unary_variable_node& operator=(const unary_variable_node&) exprtk_delete; + + const T& v_; + }; + + template + class uvouv_node exprtk_final : public expression_node + { + public: + + // UOpr1(v0) Op UOpr2(v1) + typedef typename details::functor_t functor_t; + typedef typename functor_t::bfunc_t bfunc_t; + typedef typename functor_t::ufunc_t ufunc_t; + typedef expression_node* expression_ptr; + + explicit uvouv_node(const T& var0,const T& var1, + ufunc_t uf0, ufunc_t uf1, bfunc_t bf) + : v0_(var0) + , v1_(var1) + , u0_(uf0 ) + , u1_(uf1 ) + , f_ (bf ) + {} + + inline T value() const exprtk_override + { + return f_(u0_(v0_),u1_(v1_)); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_uvouv; + } + + inline const T& v0() + { + return v0_; + } + + inline const T& v1() + { + return v1_; + } + + inline ufunc_t u0() + { + return u0_; + } + + inline ufunc_t u1() + { + return u1_; + } + + inline ufunc_t f() + { + return f_; + } + + private: + + uvouv_node(const uvouv_node&) exprtk_delete; + uvouv_node& operator=(const uvouv_node&) exprtk_delete; + + const T& v0_; + const T& v1_; + const ufunc_t u0_; + const ufunc_t u1_; + const bfunc_t f_; + }; + + template + class unary_branch_node exprtk_final : public expression_node + { + public: + + typedef Operation operation_t; + typedef expression_node* expression_ptr; + typedef std::pair branch_t; + + explicit unary_branch_node(expression_ptr branch) + { + construct_branch_pair(branch_, branch); + } + + inline T value() const exprtk_override + { + return Operation::process(branch_.first->value()); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return Operation::type(); + } + + inline operator_type operation() + { + return Operation::operation(); + } + + inline expression_node* branch(const std::size_t&) const exprtk_override + { + return branch_.first; + } + + inline void release() + { + branch_.second = false; + } + + void collect_nodes(typename expression_node::noderef_list_t& node_delete_list) exprtk_override + { + expression_node::ndb_t::collect(branch_, node_delete_list); + } + + std::size_t node_depth() const exprtk_override + { + return expression_node::ndb_t::compute_node_depth(branch_); + } + + private: + + unary_branch_node(const unary_branch_node&) exprtk_delete; + unary_branch_node& operator=(const unary_branch_node&) exprtk_delete; + + branch_t branch_; + }; + + template struct is_const { enum {result = 0}; }; + template struct is_const { enum {result = 1}; }; + template struct is_const_ref { enum {result = 0}; }; + template struct is_const_ref { enum {result = 1}; }; + template struct is_ref { enum {result = 0}; }; + template struct is_ref { enum {result = 1}; }; + template struct is_ref { enum {result = 0}; }; + + template + struct param_to_str { static std::string result() { static const std::string r("v"); return r; } }; + + template <> + struct param_to_str<0> { static std::string result() { static const std::string r("c"); return r; } }; + + #define exprtk_crtype(Type) \ + param_to_str::result>::result() \ + + template + struct T0oT1oT2process + { + typedef typename details::functor_t functor_t; + typedef typename functor_t::bfunc_t bfunc_t; + + struct mode0 + { + static inline T process(const T& t0, const T& t1, const T& t2, const bfunc_t bf0, const bfunc_t bf1) + { + // (T0 o0 T1) o1 T2 + return bf1(bf0(t0,t1),t2); + } + + template + static inline std::string id() + { + static const std::string result = "(" + exprtk_crtype(T0) + "o" + + exprtk_crtype(T1) + ")o(" + + exprtk_crtype(T2) + ")" ; + return result; + } + }; + + struct mode1 + { + static inline T process(const T& t0, const T& t1, const T& t2, const bfunc_t bf0, const bfunc_t bf1) + { + // T0 o0 (T1 o1 T2) + return bf0(t0,bf1(t1,t2)); + } + + template + static inline std::string id() + { + static const std::string result = "(" + exprtk_crtype(T0) + ")o(" + + exprtk_crtype(T1) + "o" + + exprtk_crtype(T2) + ")" ; + return result; + } + }; + }; + + template + struct T0oT1oT20T3process + { + typedef typename details::functor_t functor_t; + typedef typename functor_t::bfunc_t bfunc_t; + + struct mode0 + { + static inline T process(const T& t0, const T& t1, + const T& t2, const T& t3, + const bfunc_t bf0, const bfunc_t bf1, const bfunc_t bf2) + { + // (T0 o0 T1) o1 (T2 o2 T3) + return bf1(bf0(t0,t1),bf2(t2,t3)); + } + + template + static inline std::string id() + { + static const std::string result = "(" + exprtk_crtype(T0) + "o" + + exprtk_crtype(T1) + ")o" + + "(" + exprtk_crtype(T2) + "o" + + exprtk_crtype(T3) + ")" ; + return result; + } + }; + + struct mode1 + { + static inline T process(const T& t0, const T& t1, + const T& t2, const T& t3, + const bfunc_t bf0, const bfunc_t bf1, const bfunc_t bf2) + { + // (T0 o0 (T1 o1 (T2 o2 T3)) + return bf0(t0,bf1(t1,bf2(t2,t3))); + } + template + static inline std::string id() + { + static const std::string result = "(" + exprtk_crtype(T0) + ")o((" + + exprtk_crtype(T1) + ")o(" + + exprtk_crtype(T2) + "o" + + exprtk_crtype(T3) + "))" ; + return result; + } + }; + + struct mode2 + { + static inline T process(const T& t0, const T& t1, + const T& t2, const T& t3, + const bfunc_t bf0, const bfunc_t bf1, const bfunc_t bf2) + { + // (T0 o0 ((T1 o1 T2) o2 T3) + return bf0(t0,bf2(bf1(t1,t2),t3)); + } + + template + static inline std::string id() + { + static const std::string result = "(" + exprtk_crtype(T0) + ")o((" + + exprtk_crtype(T1) + "o" + + exprtk_crtype(T2) + ")o(" + + exprtk_crtype(T3) + "))" ; + return result; + } + }; + + struct mode3 + { + static inline T process(const T& t0, const T& t1, + const T& t2, const T& t3, + const bfunc_t bf0, const bfunc_t bf1, const bfunc_t bf2) + { + // (((T0 o0 T1) o1 T2) o2 T3) + return bf2(bf1(bf0(t0,t1),t2),t3); + } + + template + static inline std::string id() + { + static const std::string result = "((" + exprtk_crtype(T0) + "o" + + exprtk_crtype(T1) + ")o(" + + exprtk_crtype(T2) + "))o(" + + exprtk_crtype(T3) + ")"; + return result; + } + }; + + struct mode4 + { + static inline T process(const T& t0, const T& t1, + const T& t2, const T& t3, + const bfunc_t bf0, const bfunc_t bf1, const bfunc_t bf2) + { + // ((T0 o0 (T1 o1 T2)) o2 T3 + return bf2(bf0(t0,bf1(t1,t2)),t3); + } + + template + static inline std::string id() + { + static const std::string result = "((" + exprtk_crtype(T0) + ")o(" + + exprtk_crtype(T1) + "o" + + exprtk_crtype(T2) + "))o(" + + exprtk_crtype(T3) + ")" ; + return result; + } + }; + }; + + #undef exprtk_crtype + + template + struct nodetype_T0oT1 { static const typename expression_node::node_type result; }; + template + const typename expression_node::node_type nodetype_T0oT1::result = expression_node::e_none; + + #define synthesis_node_type_define(T0_, T1_, v_) \ + template \ + struct nodetype_T0oT1 { static const typename expression_node::node_type result; }; \ + template \ + const typename expression_node::node_type nodetype_T0oT1::result = expression_node:: v_; \ + + synthesis_node_type_define(const T0&, const T1&, e_vov) + synthesis_node_type_define(const T0&, const T1 , e_voc) + synthesis_node_type_define(const T0 , const T1&, e_cov) + synthesis_node_type_define( T0&, T1&, e_none) + synthesis_node_type_define(const T0 , const T1 , e_none) + synthesis_node_type_define( T0&, const T1 , e_none) + synthesis_node_type_define(const T0 , T1&, e_none) + synthesis_node_type_define(const T0&, T1&, e_none) + synthesis_node_type_define( T0&, const T1&, e_none) + #undef synthesis_node_type_define + + template + struct nodetype_T0oT1oT2 { static const typename expression_node::node_type result; }; + template + const typename expression_node::node_type nodetype_T0oT1oT2::result = expression_node::e_none; + + #define synthesis_node_type_define(T0_, T1_, T2_, v_) \ + template \ + struct nodetype_T0oT1oT2 { static const typename expression_node::node_type result; }; \ + template \ + const typename expression_node::node_type nodetype_T0oT1oT2::result = expression_node:: v_; \ + + synthesis_node_type_define(const T0&, const T1&, const T2&, e_vovov) + synthesis_node_type_define(const T0&, const T1&, const T2 , e_vovoc) + synthesis_node_type_define(const T0&, const T1 , const T2&, e_vocov) + synthesis_node_type_define(const T0 , const T1&, const T2&, e_covov) + synthesis_node_type_define(const T0 , const T1&, const T2 , e_covoc) + synthesis_node_type_define(const T0 , const T1 , const T2 , e_none ) + synthesis_node_type_define(const T0 , const T1 , const T2&, e_none ) + synthesis_node_type_define(const T0&, const T1 , const T2 , e_none ) + synthesis_node_type_define( T0&, T1&, T2&, e_none ) + #undef synthesis_node_type_define + + template + struct nodetype_T0oT1oT2oT3 { static const typename expression_node::node_type result; }; + template + const typename expression_node::node_type nodetype_T0oT1oT2oT3::result = expression_node::e_none; + + #define synthesis_node_type_define(T0_, T1_, T2_, T3_, v_) \ + template \ + struct nodetype_T0oT1oT2oT3 { static const typename expression_node::node_type result; }; \ + template \ + const typename expression_node::node_type nodetype_T0oT1oT2oT3::result = expression_node:: v_; \ + + synthesis_node_type_define(const T0&, const T1&, const T2&, const T3&, e_vovovov) + synthesis_node_type_define(const T0&, const T1&, const T2&, const T3 , e_vovovoc) + synthesis_node_type_define(const T0&, const T1&, const T2 , const T3&, e_vovocov) + synthesis_node_type_define(const T0&, const T1 , const T2&, const T3&, e_vocovov) + synthesis_node_type_define(const T0 , const T1&, const T2&, const T3&, e_covovov) + synthesis_node_type_define(const T0 , const T1&, const T2 , const T3&, e_covocov) + synthesis_node_type_define(const T0&, const T1 , const T2&, const T3 , e_vocovoc) + synthesis_node_type_define(const T0 , const T1&, const T2&, const T3 , e_covovoc) + synthesis_node_type_define(const T0&, const T1 , const T2 , const T3&, e_vococov) + synthesis_node_type_define(const T0 , const T1 , const T2 , const T3 , e_none ) + synthesis_node_type_define(const T0 , const T1 , const T2 , const T3&, e_none ) + synthesis_node_type_define(const T0 , const T1 , const T2&, const T3 , e_none ) + synthesis_node_type_define(const T0 , const T1&, const T2 , const T3 , e_none ) + synthesis_node_type_define(const T0&, const T1 , const T2 , const T3 , e_none ) + synthesis_node_type_define(const T0 , const T1 , const T2&, const T3&, e_none ) + synthesis_node_type_define(const T0&, const T1&, const T2 , const T3 , e_none ) + #undef synthesis_node_type_define + + template + class T0oT1 exprtk_final : public expression_node + { + public: + + typedef typename details::functor_t functor_t; + typedef typename functor_t::bfunc_t bfunc_t; + typedef T value_type; + typedef T0oT1 node_type; + + T0oT1(T0 p0, T1 p1, const bfunc_t p2) + : t0_(p0) + , t1_(p1) + , f_ (p2) + {} + + inline typename expression_node::node_type type() const exprtk_override + { + static const typename expression_node::node_type result = nodetype_T0oT1::result; + return result; + } + + inline operator_type operation() const exprtk_override + { + return e_default; + } + + inline T value() const exprtk_override + { + return f_(t0_,t1_); + } + + inline T0 t0() const + { + return t0_; + } + + inline T1 t1() const + { + return t1_; + } + + inline bfunc_t f() const + { + return f_; + } + + template + static inline expression_node* allocate(Allocator& allocator, + T0 p0, T1 p1, + bfunc_t p2) + { + return allocator + .template allocate_type + (p0, p1, p2); + } + + private: + + T0oT1(const T0oT1&) exprtk_delete; + T0oT1& operator=(const T0oT1&) { return (*this); } + + T0 t0_; + T1 t1_; + const bfunc_t f_; + }; + + template + class T0oT1oT2 exprtk_final : public T0oT1oT2_base_node + { + public: + + typedef typename details::functor_t functor_t; + typedef typename functor_t::bfunc_t bfunc_t; + typedef T value_type; + typedef T0oT1oT2 node_type; + typedef ProcessMode process_mode_t; + + T0oT1oT2(T0 p0, T1 p1, T2 p2, const bfunc_t p3, const bfunc_t p4) + : t0_(p0) + , t1_(p1) + , t2_(p2) + , f0_(p3) + , f1_(p4) + {} + + inline typename expression_node::node_type type() const exprtk_override + { + static const typename expression_node::node_type result = nodetype_T0oT1oT2::result; + return result; + } + + inline operator_type operation() + { + return e_default; + } + + inline T value() const exprtk_override + { + return ProcessMode::process(t0_, t1_, t2_, f0_, f1_); + } + + inline T0 t0() const + { + return t0_; + } + + inline T1 t1() const + { + return t1_; + } + + inline T2 t2() const + { + return t2_; + } + + bfunc_t f0() const + { + return f0_; + } + + bfunc_t f1() const + { + return f1_; + } + + std::string type_id() const exprtk_override + { + return id(); + } + + static inline std::string id() + { + return process_mode_t::template id(); + } + + template + static inline expression_node* allocate(Allocator& allocator, T0 p0, T1 p1, T2 p2, bfunc_t p3, bfunc_t p4) + { + return allocator + .template allocate_type + (p0, p1, p2, p3, p4); + } + + private: + + T0oT1oT2(const node_type&) exprtk_delete; + node_type& operator=(const node_type&) exprtk_delete; + + T0 t0_; + T1 t1_; + T2 t2_; + const bfunc_t f0_; + const bfunc_t f1_; + }; + + template + class T0oT1oT2oT3 exprtk_final : public T0oT1oT2oT3_base_node + { + public: + + typedef typename details::functor_t functor_t; + typedef typename functor_t::bfunc_t bfunc_t; + typedef T value_type; + typedef T0_ T0; + typedef T1_ T1; + typedef T2_ T2; + typedef T3_ T3; + typedef T0oT1oT2oT3 node_type; + typedef ProcessMode process_mode_t; + + T0oT1oT2oT3(T0 p0, T1 p1, T2 p2, T3 p3, bfunc_t p4, bfunc_t p5, bfunc_t p6) + : t0_(p0) + , t1_(p1) + , t2_(p2) + , t3_(p3) + , f0_(p4) + , f1_(p5) + , f2_(p6) + {} + + inline T value() const exprtk_override + { + return ProcessMode::process(t0_, t1_, t2_, t3_, f0_, f1_, f2_); + } + + inline T0 t0() const + { + return t0_; + } + + inline T1 t1() const + { + return t1_; + } + + inline T2 t2() const + { + return t2_; + } + + inline T3 t3() const + { + return t3_; + } + + inline bfunc_t f0() const + { + return f0_; + } + + inline bfunc_t f1() const + { + return f1_; + } + + inline bfunc_t f2() const + { + return f2_; + } + + inline std::string type_id() const exprtk_override + { + return id(); + } + + static inline std::string id() + { + return process_mode_t::template id(); + } + + template + static inline expression_node* allocate(Allocator& allocator, + T0 p0, T1 p1, T2 p2, T3 p3, + bfunc_t p4, bfunc_t p5, bfunc_t p6) + { + return allocator + .template allocate_type + (p0, p1, p2, p3, p4, p5, p6); + } + + private: + + T0oT1oT2oT3(const node_type&) exprtk_delete; + node_type& operator=(const node_type&) exprtk_delete; + + T0 t0_; + T1 t1_; + T2 t2_; + T3 t3_; + const bfunc_t f0_; + const bfunc_t f1_; + const bfunc_t f2_; + }; + + template + class T0oT1oT2_sf3 exprtk_final : public T0oT1oT2_base_node + { + public: + + typedef typename details::functor_t functor_t; + typedef typename functor_t::tfunc_t tfunc_t; + typedef T value_type; + typedef T0oT1oT2_sf3 node_type; + + T0oT1oT2_sf3(T0 p0, T1 p1, T2 p2, const tfunc_t p3) + : t0_(p0) + , t1_(p1) + , t2_(p2) + , f_ (p3) + {} + + inline typename expression_node::node_type type() const exprtk_override + { + static const typename expression_node::node_type result = nodetype_T0oT1oT2::result; + return result; + } + + inline operator_type operation() const exprtk_override + { + return e_default; + } + + inline T value() const exprtk_override + { + return f_(t0_, t1_, t2_); + } + + inline T0 t0() const + { + return t0_; + } + + inline T1 t1() const + { + return t1_; + } + + inline T2 t2() const + { + return t2_; + } + + tfunc_t f() const + { + return f_; + } + + std::string type_id() const + { + return id(); + } + + static inline std::string id() + { + return "sf3"; + } + + template + static inline expression_node* allocate(Allocator& allocator, T0 p0, T1 p1, T2 p2, tfunc_t p3) + { + return allocator + .template allocate_type + (p0, p1, p2, p3); + } + + private: + + T0oT1oT2_sf3(const node_type&) exprtk_delete; + node_type& operator=(const node_type&) exprtk_delete; + + T0 t0_; + T1 t1_; + T2 t2_; + const tfunc_t f_; + }; + + template + class sf3ext_type_node : public T0oT1oT2_base_node + { + public: + + virtual ~sf3ext_type_node() {} + + virtual T0 t0() const = 0; + + virtual T1 t1() const = 0; + + virtual T2 t2() const = 0; + }; + + template + class T0oT1oT2_sf3ext exprtk_final : public sf3ext_type_node + { + public: + + typedef T value_type; + typedef T0oT1oT2_sf3ext node_type; + + T0oT1oT2_sf3ext(T0 p0, T1 p1, T2 p2) + : t0_(p0) + , t1_(p1) + , t2_(p2) + {} + + inline typename expression_node::node_type type() const exprtk_override + { + static const typename expression_node::node_type result = nodetype_T0oT1oT2::result; + return result; + } + + inline operator_type operation() + { + return e_default; + } + + inline T value() const exprtk_override + { + return SF3Operation::process(t0_, t1_, t2_); + } + + T0 t0() const exprtk_override + { + return t0_; + } + + T1 t1() const exprtk_override + { + return t1_; + } + + T2 t2() const exprtk_override + { + return t2_; + } + + std::string type_id() const exprtk_override + { + return id(); + } + + static inline std::string id() + { + return SF3Operation::id(); + } + + template + static inline expression_node* allocate(Allocator& allocator, T0 p0, T1 p1, T2 p2) + { + return allocator + .template allocate_type + (p0, p1, p2); + } + + private: + + T0oT1oT2_sf3ext(const node_type&) exprtk_delete; + node_type& operator=(const node_type&) exprtk_delete; + + T0 t0_; + T1 t1_; + T2 t2_; + }; + + template + inline bool is_sf3ext_node(const expression_node* n) + { + switch (n->type()) + { + case expression_node::e_vovov : return true; + case expression_node::e_vovoc : return true; + case expression_node::e_vocov : return true; + case expression_node::e_covov : return true; + case expression_node::e_covoc : return true; + default : return false; + } + } + + template + class T0oT1oT2oT3_sf4 exprtk_final : public T0oT1oT2_base_node + { + public: + + typedef typename details::functor_t functor_t; + typedef typename functor_t::qfunc_t qfunc_t; + typedef T value_type; + typedef T0oT1oT2oT3_sf4 node_type; + + T0oT1oT2oT3_sf4(T0 p0, T1 p1, T2 p2, T3 p3, const qfunc_t p4) + : t0_(p0) + , t1_(p1) + , t2_(p2) + , t3_(p3) + , f_ (p4) + {} + + inline typename expression_node::node_type type() const exprtk_override + { + static const typename expression_node::node_type result = nodetype_T0oT1oT2oT3::result; + return result; + } + + inline operator_type operation() const exprtk_override + { + return e_default; + } + + inline T value() const exprtk_override + { + return f_(t0_, t1_, t2_, t3_); + } + + inline T0 t0() const + { + return t0_; + } + + inline T1 t1() const + { + return t1_; + } + + inline T2 t2() const + { + return t2_; + } + + inline T3 t3() const + { + return t3_; + } + + qfunc_t f() const + { + return f_; + } + + std::string type_id() const + { + return id(); + } + + static inline std::string id() + { + return "sf4"; + } + + template + static inline expression_node* allocate(Allocator& allocator, T0 p0, T1 p1, T2 p2, T3 p3, qfunc_t p4) + { + return allocator + .template allocate_type + (p0, p1, p2, p3, p4); + } + + private: + + T0oT1oT2oT3_sf4(const node_type&) exprtk_delete; + node_type& operator=(const node_type&) exprtk_delete; + + T0 t0_; + T1 t1_; + T2 t2_; + T3 t3_; + const qfunc_t f_; + }; + + template + class T0oT1oT2oT3_sf4ext exprtk_final : public T0oT1oT2oT3_base_node + { + public: + + typedef T value_type; + typedef T0oT1oT2oT3_sf4ext node_type; + + T0oT1oT2oT3_sf4ext(T0 p0, T1 p1, T2 p2, T3 p3) + : t0_(p0) + , t1_(p1) + , t2_(p2) + , t3_(p3) + {} + + inline typename expression_node::node_type type() const exprtk_override + { + static const typename expression_node::node_type result = nodetype_T0oT1oT2oT3::result; + return result; + } + + inline T value() const exprtk_override + { + return SF4Operation::process(t0_, t1_, t2_, t3_); + } + + inline T0 t0() const + { + return t0_; + } + + inline T1 t1() const + { + return t1_; + } + + inline T2 t2() const + { + return t2_; + } + + inline T3 t3() const + { + return t3_; + } + + std::string type_id() const exprtk_override + { + return id(); + } + + static inline std::string id() + { + return SF4Operation::id(); + } + + template + static inline expression_node* allocate(Allocator& allocator, T0 p0, T1 p1, T2 p2, T3 p3) + { + return allocator + .template allocate_type + (p0, p1, p2, p3); + } + + private: + + T0oT1oT2oT3_sf4ext(const node_type&) exprtk_delete; + node_type& operator=(const node_type&) exprtk_delete; + + T0 t0_; + T1 t1_; + T2 t2_; + T3 t3_; + }; + + template + inline bool is_sf4ext_node(const expression_node* n) + { + switch (n->type()) + { + case expression_node::e_vovovov : return true; + case expression_node::e_vovovoc : return true; + case expression_node::e_vovocov : return true; + case expression_node::e_vocovov : return true; + case expression_node::e_covovov : return true; + case expression_node::e_covocov : return true; + case expression_node::e_vocovoc : return true; + case expression_node::e_covovoc : return true; + case expression_node::e_vococov : return true; + default : return false; + } + } + + template + struct T0oT1_define + { + typedef details::T0oT1 type0; + }; + + template + struct T0oT1oT2_define + { + typedef details::T0oT1oT2::mode0> type0; + typedef details::T0oT1oT2::mode1> type1; + typedef details::T0oT1oT2_sf3 sf3_type; + typedef details::sf3ext_type_node sf3_type_node; + }; + + template + struct T0oT1oT2oT3_define + { + typedef details::T0oT1oT2oT3::mode0> type0; + typedef details::T0oT1oT2oT3::mode1> type1; + typedef details::T0oT1oT2oT3::mode2> type2; + typedef details::T0oT1oT2oT3::mode3> type3; + typedef details::T0oT1oT2oT3::mode4> type4; + typedef details::T0oT1oT2oT3_sf4 sf4_type; + }; + + template + class vov_node exprtk_final : public vov_base_node + { + public: + + typedef expression_node* expression_ptr; + typedef Operation operation_t; + + // variable op variable node + explicit vov_node(const T& var0, const T& var1) + : v0_(var0) + , v1_(var1) + {} + + inline T value() const exprtk_override + { + return Operation::process(v0_,v1_); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return Operation::type(); + } + + inline operator_type operation() const exprtk_override + { + return Operation::operation(); + } + + inline const T& v0() const exprtk_override + { + return v0_; + } + + inline const T& v1() const exprtk_override + { + return v1_; + } + + protected: + + const T& v0_; + const T& v1_; + + private: + + vov_node(const vov_node&) exprtk_delete; + vov_node& operator=(const vov_node&) exprtk_delete; + }; + + template + class cov_node exprtk_final : public cov_base_node + { + public: + + typedef expression_node* expression_ptr; + typedef Operation operation_t; + + // constant op variable node + explicit cov_node(const T& const_var, const T& var) + : c_(const_var) + , v_(var) + {} + + inline T value() const exprtk_override + { + return Operation::process(c_,v_); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return Operation::type(); + } + + inline operator_type operation() const exprtk_override + { + return Operation::operation(); + } + + inline const T c() const exprtk_override + { + return c_; + } + + inline const T& v() const exprtk_override + { + return v_; + } + + protected: + + const T c_; + const T& v_; + + private: + + cov_node(const cov_node&) exprtk_delete; + cov_node& operator=(const cov_node&) exprtk_delete; + }; + + template + class voc_node exprtk_final : public voc_base_node + { + public: + + typedef expression_node* expression_ptr; + typedef Operation operation_t; + + // variable op constant node + explicit voc_node(const T& var, const T& const_var) + : v_(var) + , c_(const_var) + {} + + inline T value() const exprtk_override + { + return Operation::process(v_,c_); + } + + inline operator_type operation() const exprtk_override + { + return Operation::operation(); + } + + inline const T c() const exprtk_override + { + return c_; + } + + inline const T& v() const exprtk_override + { + return v_; + } + + protected: + + const T& v_; + const T c_; + + private: + + voc_node(const voc_node&) exprtk_delete; + voc_node& operator=(const voc_node&) exprtk_delete; + }; + + template + class vob_node exprtk_final : public vob_base_node + { + public: + + typedef expression_node* expression_ptr; + typedef std::pair branch_t; + typedef Operation operation_t; + + // variable op constant node + explicit vob_node(const T& var, const expression_ptr branch) + : v_(var) + { + construct_branch_pair(branch_, branch); + } + + inline T value() const exprtk_override + { + assert(branch_.first); + return Operation::process(v_,branch_.first->value()); + } + + inline const T& v() const exprtk_override + { + return v_; + } + + inline expression_node* branch(const std::size_t&) const exprtk_override + { + return branch_.first; + } + + void collect_nodes(typename expression_node::noderef_list_t& node_delete_list) exprtk_override + { + expression_node::ndb_t::template collect(branch_, node_delete_list); + } + + std::size_t node_depth() const exprtk_override + { + return expression_node::ndb_t::compute_node_depth(branch_); + } + + private: + + vob_node(const vob_node&) exprtk_delete; + vob_node& operator=(const vob_node&) exprtk_delete; + + const T& v_; + branch_t branch_; + }; + + template + class bov_node exprtk_final : public bov_base_node + { + public: + + typedef expression_node* expression_ptr; + typedef std::pair branch_t; + typedef Operation operation_t; + + // variable op constant node + explicit bov_node(const expression_ptr branch, const T& var) + : v_(var) + { + construct_branch_pair(branch_, branch); + } + + inline T value() const exprtk_override + { + assert(branch_.first); + return Operation::process(branch_.first->value(),v_); + } + + inline const T& v() const exprtk_override + { + return v_; + } + + inline expression_node* branch(const std::size_t&) const exprtk_override + { + return branch_.first; + } + + void collect_nodes(typename expression_node::noderef_list_t& node_delete_list) exprtk_override + { + expression_node::ndb_t::template collect(branch_, node_delete_list); + } + + std::size_t node_depth() const exprtk_override + { + return expression_node::ndb_t::compute_node_depth(branch_); + } + + private: + + bov_node(const bov_node&) exprtk_delete; + bov_node& operator=(const bov_node&) exprtk_delete; + + const T& v_; + branch_t branch_; + }; + + template + class cob_node exprtk_final : public cob_base_node + { + public: + + typedef expression_node* expression_ptr; + typedef std::pair branch_t; + typedef Operation operation_t; + + // variable op constant node + explicit cob_node(const T const_var, const expression_ptr branch) + : c_(const_var) + { + construct_branch_pair(branch_, branch); + } + + inline T value() const exprtk_override + { + assert(branch_.first); + return Operation::process(c_,branch_.first->value()); + } + + inline operator_type operation() const exprtk_override + { + return Operation::operation(); + } + + inline const T c() const exprtk_override + { + return c_; + } + + inline void set_c(const T new_c) exprtk_override + { + (*const_cast(&c_)) = new_c; + } + + inline expression_node* branch(const std::size_t&) const exprtk_override + { + return branch_.first; + } + + inline expression_node* move_branch(const std::size_t&) exprtk_override + { + branch_.second = false; + return branch_.first; + } + + void collect_nodes(typename expression_node::noderef_list_t& node_delete_list) exprtk_override + { + expression_node::ndb_t::template collect(branch_, node_delete_list); + } + + std::size_t node_depth() const exprtk_override + { + return expression_node::ndb_t::compute_node_depth(branch_); + } + + private: + + cob_node(const cob_node&) exprtk_delete; + cob_node& operator=(const cob_node&) exprtk_delete; + + const T c_; + branch_t branch_; + }; + + template + class boc_node exprtk_final : public boc_base_node + { + public: + + typedef expression_node* expression_ptr; + typedef std::pair branch_t; + typedef Operation operation_t; + + // variable op constant node + explicit boc_node(const expression_ptr branch, const T const_var) + : c_(const_var) + { + construct_branch_pair(branch_, branch); + } + + inline T value() const exprtk_override + { + assert(branch_.first); + return Operation::process(branch_.first->value(),c_); + } + + inline operator_type operation() const exprtk_override + { + return Operation::operation(); + } + + inline const T c() const exprtk_override + { + return c_; + } + + inline void set_c(const T new_c) exprtk_override + { + (*const_cast(&c_)) = new_c; + } + + inline expression_node* branch(const std::size_t&) const exprtk_override + { + return branch_.first; + } + + inline expression_node* move_branch(const std::size_t&) exprtk_override + { + branch_.second = false; + return branch_.first; + } + + void collect_nodes(typename expression_node::noderef_list_t& node_delete_list) exprtk_override + { + expression_node::ndb_t::template collect(branch_, node_delete_list); + } + + std::size_t node_depth() const exprtk_override + { + return expression_node::ndb_t::compute_node_depth(branch_); + } + + private: + + boc_node(const boc_node&) exprtk_delete; + boc_node& operator=(const boc_node&) exprtk_delete; + + const T c_; + branch_t branch_; + }; + + #ifndef exprtk_disable_string_capabilities + template + class sos_node exprtk_final : public sos_base_node + { + public: + + typedef expression_node* expression_ptr; + typedef Operation operation_t; + + // string op string node + explicit sos_node(SType0 p0, SType1 p1) + : s0_(p0) + , s1_(p1) + {} + + inline T value() const exprtk_override + { + return Operation::process(s0_,s1_); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return Operation::type(); + } + + inline operator_type operation() const exprtk_override + { + return Operation::operation(); + } + + inline std::string& s0() + { + return s0_; + } + + inline std::string& s1() + { + return s1_; + } + + protected: + + SType0 s0_; + SType1 s1_; + + private: + + sos_node(const sos_node&) exprtk_delete; + sos_node& operator=(const sos_node&) exprtk_delete; + }; + + template + class str_xrox_node exprtk_final : public sos_base_node + { + public: + + typedef expression_node* expression_ptr; + typedef Operation operation_t; + typedef str_xrox_node node_type; + + // string-range op string node + explicit str_xrox_node(SType0 p0, SType1 p1, RangePack rp0) + : s0_ (p0 ) + , s1_ (p1 ) + , rp0_(rp0) + {} + + ~str_xrox_node() + { + rp0_.free(); + } + + inline T value() const exprtk_override + { + std::size_t r0 = 0; + std::size_t r1 = 0; + + if (rp0_(r0, r1, s0_.size())) + return Operation::process(s0_.substr(r0, (r1 - r0) + 1), s1_); + else + return T(0); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return Operation::type(); + } + + inline operator_type operation() const exprtk_override + { + return Operation::operation(); + } + + inline std::string& s0() + { + return s0_; + } + + inline std::string& s1() + { + return s1_; + } + + protected: + + SType0 s0_; + SType1 s1_; + RangePack rp0_; + + private: + + str_xrox_node(const node_type&) exprtk_delete; + node_type& operator=(const node_type&) exprtk_delete; + }; + + template + class str_xoxr_node exprtk_final : public sos_base_node + { + public: + + typedef expression_node* expression_ptr; + typedef Operation operation_t; + typedef str_xoxr_node node_type; + + // string op string range node + explicit str_xoxr_node(SType0 p0, SType1 p1, RangePack rp1) + : s0_ (p0 ) + , s1_ (p1 ) + , rp1_(rp1) + {} + + ~str_xoxr_node() + { + rp1_.free(); + } + + inline T value() const exprtk_override + { + std::size_t r0 = 0; + std::size_t r1 = 0; + + if (rp1_(r0, r1, s1_.size())) + return Operation::process(s0_, s1_.substr(r0, (r1 - r0) + 1)); + else + return T(0); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return Operation::type(); + } + + inline operator_type operation() const exprtk_override + { + return Operation::operation(); + } + + inline std::string& s0() + { + return s0_; + } + + inline std::string& s1() + { + return s1_; + } + + protected: + + SType0 s0_; + SType1 s1_; + RangePack rp1_; + + private: + + str_xoxr_node(const node_type&) exprtk_delete; + node_type& operator=(const node_type&) exprtk_delete; + }; + + template + class str_xroxr_node exprtk_final : public sos_base_node + { + public: + + typedef expression_node* expression_ptr; + typedef Operation operation_t; + typedef str_xroxr_node node_type; + + // string-range op string-range node + explicit str_xroxr_node(SType0 p0, SType1 p1, RangePack rp0, RangePack rp1) + : s0_ (p0 ) + , s1_ (p1 ) + , rp0_(rp0) + , rp1_(rp1) + {} + + ~str_xroxr_node() + { + rp0_.free(); + rp1_.free(); + } + + inline T value() const exprtk_override + { + std::size_t r0_0 = 0; + std::size_t r0_1 = 0; + std::size_t r1_0 = 0; + std::size_t r1_1 = 0; + + if ( + rp0_(r0_0, r1_0, s0_.size()) && + rp1_(r0_1, r1_1, s1_.size()) + ) + { + return Operation::process( + s0_.substr(r0_0, (r1_0 - r0_0) + 1), + s1_.substr(r0_1, (r1_1 - r0_1) + 1) + ); + } + else + return T(0); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return Operation::type(); + } + + inline operator_type operation() const exprtk_override + { + return Operation::operation(); + } + + inline std::string& s0() + { + return s0_; + } + + inline std::string& s1() + { + return s1_; + } + + protected: + + SType0 s0_; + SType1 s1_; + RangePack rp0_; + RangePack rp1_; + + private: + + str_xroxr_node(const node_type&) exprtk_delete; + node_type& operator=(const node_type&) exprtk_delete; + }; + + template + class str_sogens_node exprtk_final : public binary_node + { + public: + + typedef expression_node * expression_ptr; + typedef string_base_node* str_base_ptr; + typedef range_pack range_t; + typedef range_t* range_ptr; + typedef range_interface irange_t; + typedef irange_t* irange_ptr; + + using binary_node::branch; + + str_sogens_node(const operator_type& opr, + expression_ptr branch0, + expression_ptr branch1) + : binary_node(opr, branch0, branch1) + , str0_base_ptr_ (0) + , str1_base_ptr_ (0) + , str0_range_ptr_(0) + , str1_range_ptr_(0) + { + if (is_generally_string_node(branch(0))) + { + str0_base_ptr_ = dynamic_cast(branch(0)); + + if (0 == str0_base_ptr_) + return; + + irange_ptr range = dynamic_cast(branch(0)); + + if (0 == range) + return; + + str0_range_ptr_ = &(range->range_ref()); + } + + if (is_generally_string_node(branch(1))) + { + str1_base_ptr_ = dynamic_cast(branch(1)); + + if (0 == str1_base_ptr_) + return; + + irange_ptr range = dynamic_cast(branch(1)); + + if (0 == range) + return; + + str1_range_ptr_ = &(range->range_ref()); + } + } + + inline T value() const exprtk_override + { + if ( + str0_base_ptr_ && + str1_base_ptr_ && + str0_range_ptr_ && + str1_range_ptr_ + ) + { + branch(0)->value(); + branch(1)->value(); + + std::size_t str0_r0 = 0; + std::size_t str0_r1 = 0; + + std::size_t str1_r0 = 0; + std::size_t str1_r1 = 0; + + const range_t& range0 = (*str0_range_ptr_); + const range_t& range1 = (*str1_range_ptr_); + + if ( + range0(str0_r0, str0_r1, str0_base_ptr_->size()) && + range1(str1_r0, str1_r1, str1_base_ptr_->size()) + ) + { + return Operation::process( + str0_base_ptr_->str().substr(str0_r0,(str0_r1 - str0_r0) + 1), + str1_base_ptr_->str().substr(str1_r0,(str1_r1 - str1_r0) + 1) + ); + } + } + + return std::numeric_limits::quiet_NaN(); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return Operation::type(); + } + + private: + + str_sogens_node(const str_sogens_node&) exprtk_delete; + str_sogens_node& operator=(const str_sogens_node&) exprtk_delete; + + str_base_ptr str0_base_ptr_; + str_base_ptr str1_base_ptr_; + range_ptr str0_range_ptr_; + range_ptr str1_range_ptr_; + }; + + template + class sosos_node exprtk_final : public sosos_base_node + { + public: + + typedef expression_node* expression_ptr; + typedef Operation operation_t; + typedef sosos_node node_type; + + // variable op variable node + explicit sosos_node(SType0 p0, SType1 p1, SType2 p2) + : s0_(p0) + , s1_(p1) + , s2_(p2) + {} + + inline T value() const exprtk_override + { + return Operation::process(s0_, s1_, s2_); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return Operation::type(); + } + + inline operator_type operation() const exprtk_override + { + return Operation::operation(); + } + + inline std::string& s0() + { + return s0_; + } + + inline std::string& s1() + { + return s1_; + } + + inline std::string& s2() + { + return s2_; + } + + protected: + + SType0 s0_; + SType1 s1_; + SType2 s2_; + + private: + + sosos_node(const node_type&) exprtk_delete; + node_type& operator=(const node_type&) exprtk_delete; + }; + #endif + + template + class ipow_node exprtk_final: public expression_node + { + public: + + typedef expression_node* expression_ptr; + typedef PowOp operation_t; + + explicit ipow_node(const T& v) + : v_(v) + {} + + inline T value() const exprtk_override + { + return PowOp::result(v_); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_ipow; + } + + private: + + ipow_node(const ipow_node&) exprtk_delete; + ipow_node& operator=(const ipow_node&) exprtk_delete; + + const T& v_; + }; + + template + class bipow_node exprtk_final : public expression_node + { + public: + + typedef expression_node* expression_ptr; + typedef std::pair branch_t; + typedef PowOp operation_t; + + explicit bipow_node(expression_ptr branch) + { + construct_branch_pair(branch_, branch); + } + + inline T value() const exprtk_override + { + assert(branch_.first); + return PowOp::result(branch_.first->value()); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_ipow; + } + + void collect_nodes(typename expression_node::noderef_list_t& node_delete_list) exprtk_override + { + expression_node::ndb_t::collect(branch_, node_delete_list); + } + + std::size_t node_depth() const exprtk_override + { + return expression_node::ndb_t::compute_node_depth(branch_); + } + + private: + + bipow_node(const bipow_node&) exprtk_delete; + bipow_node& operator=(const bipow_node&) exprtk_delete; + + branch_t branch_; + }; + + template + class ipowinv_node exprtk_final : public expression_node + { + public: + + typedef expression_node* expression_ptr; + typedef PowOp operation_t; + + explicit ipowinv_node(const T& v) + : v_(v) + {} + + inline T value() const exprtk_override + { + return (T(1) / PowOp::result(v_)); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_ipowinv; + } + + private: + + ipowinv_node(const ipowinv_node&) exprtk_delete; + ipowinv_node& operator=(const ipowinv_node&) exprtk_delete; + + const T& v_; + }; + + template + class bipowninv_node exprtk_final : public expression_node + { + public: + + typedef expression_node* expression_ptr; + typedef std::pair branch_t; + typedef PowOp operation_t; + + explicit bipowninv_node(expression_ptr branch) + { + construct_branch_pair(branch_, branch); + } + + inline T value() const exprtk_override + { + assert(branch_.first); + return (T(1) / PowOp::result(branch_.first->value())); + } + + inline typename expression_node::node_type type() const exprtk_override + { + return expression_node::e_ipowinv; + } + + void collect_nodes(typename expression_node::noderef_list_t& node_delete_list) exprtk_override + { + expression_node::ndb_t::template collect(branch_, node_delete_list); + } + + std::size_t node_depth() const exprtk_override + { + return expression_node::ndb_t::compute_node_depth(branch_); + } + + private: + + bipowninv_node(const bipowninv_node&) exprtk_delete; + bipowninv_node& operator=(const bipowninv_node&) exprtk_delete; + + branch_t branch_; + }; + + template + inline bool is_vov_node(const expression_node* node) + { + return (0 != dynamic_cast*>(node)); + } + + template + inline bool is_cov_node(const expression_node* node) + { + return (0 != dynamic_cast*>(node)); + } + + template + inline bool is_voc_node(const expression_node* node) + { + return (0 != dynamic_cast*>(node)); + } + + template + inline bool is_cob_node(const expression_node* node) + { + return (0 != dynamic_cast*>(node)); + } + + template + inline bool is_boc_node(const expression_node* node) + { + return (0 != dynamic_cast*>(node)); + } + + template + inline bool is_t0ot1ot2_node(const expression_node* node) + { + return (0 != dynamic_cast*>(node)); + } + + template + inline bool is_t0ot1ot2ot3_node(const expression_node* node) + { + return (0 != dynamic_cast*>(node)); + } + + template + inline bool is_uv_node(const expression_node* node) + { + return (0 != dynamic_cast*>(node)); + } + + template + inline bool is_string_node(const expression_node* node) + { + return node && (expression_node::e_stringvar == node->type()); + } + + template + inline bool is_string_range_node(const expression_node* node) + { + return node && (expression_node::e_stringvarrng == node->type()); + } + + template + inline bool is_const_string_node(const expression_node* node) + { + return node && (expression_node::e_stringconst == node->type()); + } + + template + inline bool is_const_string_range_node(const expression_node* node) + { + return node && (expression_node::e_cstringvarrng == node->type()); + } + + template + inline bool is_string_assignment_node(const expression_node* node) + { + return node && (expression_node::e_strass == node->type()); + } + + template + inline bool is_string_concat_node(const expression_node* node) + { + return node && (expression_node::e_strconcat == node->type()); + } + + template + inline bool is_string_function_node(const expression_node* node) + { + return node && (expression_node::e_strfunction == node->type()); + } + + template + inline bool is_string_condition_node(const expression_node* node) + { + return node && (expression_node::e_strcondition == node->type()); + } + + template + inline bool is_string_ccondition_node(const expression_node* node) + { + return node && (expression_node::e_strccondition == node->type()); + } + + template + inline bool is_string_vararg_node(const expression_node* node) + { + return node && (expression_node::e_stringvararg == node->type()); + } + + template + inline bool is_genricstring_range_node(const expression_node* node) + { + return node && (expression_node::e_strgenrange == node->type()); + } + + template + inline bool is_generally_string_node(const expression_node* node) + { + if (node) + { + switch (node->type()) + { + case expression_node::e_stringvar : + case expression_node::e_stringconst : + case expression_node::e_stringvarrng : + case expression_node::e_cstringvarrng : + case expression_node::e_strgenrange : + case expression_node::e_strass : + case expression_node::e_strconcat : + case expression_node::e_strfunction : + case expression_node::e_strcondition : + case expression_node::e_strccondition : + case expression_node::e_stringvararg : return true; + default : return false; + } + } + + return false; + } + + class node_allocator + { + public: + + template + inline expression_node* allocate(OpType& operation, ExprNode (&branch)[1]) + { + expression_node* result = + allocate(operation, branch[0]); + result->node_depth(); + return result; + } + + template + inline expression_node* allocate(OpType& operation, ExprNode (&branch)[2]) + { + expression_node* result = + allocate(operation, branch[0], branch[1]); + result->node_depth(); + return result; + } + + template + inline expression_node* allocate(OpType& operation, ExprNode (&branch)[3]) + { + expression_node* result = + allocate(operation, branch[0], branch[1], branch[2]); + result->node_depth(); + return result; + } + + template + inline expression_node* allocate(OpType& operation, ExprNode (&branch)[4]) + { + expression_node* result = + allocate(operation, branch[0], branch[1], branch[2], branch[3]); + result->node_depth(); + return result; + } + + template + inline expression_node* allocate(OpType& operation, ExprNode (&branch)[5]) + { + expression_node* result = + allocate(operation, branch[0],branch[1], branch[2], branch[3], branch[4]); + result->node_depth(); + return result; + } + + template + inline expression_node* allocate(OpType& operation, ExprNode (&branch)[6]) + { + expression_node* result = + allocate(operation, branch[0], branch[1], branch[2], branch[3], branch[4], branch[5]); + result->node_depth(); + return result; + } + + template + inline expression_node* allocate() const + { + return (new node_type()); + } + + template class Sequence> + inline expression_node* allocate(const Sequence& seq) const + { + expression_node* + result = (new node_type(seq)); + result->node_depth(); + return result; + } + + template + inline expression_node* allocate(T1& t1) const + { + expression_node* + result = (new node_type(t1)); + result->node_depth(); + return result; + } + + template + inline expression_node* allocate_c(const T1& t1) const + { + expression_node* + result = (new node_type(t1)); + result->node_depth(); + return result; + } + + template + inline expression_node* allocate(const T1& t1, const T2& t2) const + { + expression_node* + result = (new node_type(t1, t2)); + result->node_depth(); + return result; + } + + template + inline expression_node* allocate_cr(const T1& t1, T2& t2) const + { + expression_node* + result = (new node_type(t1, t2)); + result->node_depth(); + return result; + } + + template + inline expression_node* allocate_rc(T1& t1, const T2& t2) const + { + expression_node* + result = (new node_type(t1, t2)); + result->node_depth(); + return result; + } + + template + inline expression_node* allocate_rr(T1& t1, T2& t2) const + { + expression_node* + result = (new node_type(t1, t2)); + result->node_depth(); + return result; + } + + template + inline expression_node* allocate_tt(T1 t1, T2 t2) const + { + expression_node* + result = (new node_type(t1, t2)); + result->node_depth(); + return result; + } + + template + inline expression_node* allocate_ttt(T1 t1, T2 t2, T3 t3) const + { + expression_node* + result = (new node_type(t1, t2, t3)); + result->node_depth(); + return result; + } + + template + inline expression_node* allocate_tttt(T1 t1, T2 t2, T3 t3, T4 t4) const + { + expression_node* + result = (new node_type(t1, t2, t3, t4)); + result->node_depth(); + return result; + } + + template + inline expression_node* allocate_rrr(T1& t1, T2& t2, T3& t3) const + { + expression_node* + result = (new node_type(t1, t2, t3)); + result->node_depth(); + return result; + } + + template + inline expression_node* allocate_rrrr(T1& t1, T2& t2, T3& t3, T4& t4) const + { + expression_node* + result = (new node_type(t1, t2, t3, t4)); + result->node_depth(); + return result; + } + + template + inline expression_node* allocate_rrrrr(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5) const + { + expression_node* + result = (new node_type(t1, t2, t3, t4, t5)); + result->node_depth(); + return result; + } + + template + inline expression_node* allocate(const T1& t1, const T2& t2, + const T3& t3) const + { + expression_node* + result = (new node_type(t1, t2, t3)); + result->node_depth(); + return result; + } + + template + inline expression_node* allocate(const T1& t1, const T2& t2, + const T3& t3, const T4& t4) const + { + expression_node* + result = (new node_type(t1, t2, t3, t4)); + result->node_depth(); + return result; + } + + template + inline expression_node* allocate(const T1& t1, const T2& t2, + const T3& t3, const T4& t4, + const T5& t5) const + { + expression_node* + result = (new node_type(t1, t2, t3, t4, t5)); + result->node_depth(); + return result; + } + + template + inline expression_node* allocate(const T1& t1, const T2& t2, + const T3& t3, const T4& t4, + const T5& t5, const T6& t6) const + { + expression_node* + result = (new node_type(t1, t2, t3, t4, t5, t6)); + result->node_depth(); + return result; + } + + template + inline expression_node* allocate(const T1& t1, const T2& t2, + const T3& t3, const T4& t4, + const T5& t5, const T6& t6, + const T7& t7) const + { + expression_node* + result = (new node_type(t1, t2, t3, t4, t5, t6, t7)); + result->node_depth(); + return result; + } + + template + inline expression_node* allocate(const T1& t1, const T2& t2, + const T3& t3, const T4& t4, + const T5& t5, const T6& t6, + const T7& t7, const T8& t8) const + { + expression_node* + result = (new node_type(t1, t2, t3, t4, t5, t6, t7, t8)); + result->node_depth(); + return result; + } + + template + inline expression_node* allocate(const T1& t1, const T2& t2, + const T3& t3, const T4& t4, + const T5& t5, const T6& t6, + const T7& t7, const T8& t8, + const T9& t9) const + { + expression_node* + result = (new node_type(t1, t2, t3, t4, t5, t6, t7, t8, t9)); + result->node_depth(); + return result; + } + + template + inline expression_node* allocate(const T1& t1, const T2& t2, + const T3& t3, const T4& t4, + const T5& t5, const T6& t6, + const T7& t7, const T8& t8, + const T9& t9, const T10& t10) const + { + expression_node* + result = (new node_type(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10)); + result->node_depth(); + return result; + } + + template + inline expression_node* allocate_type(T1 t1, T2 t2, T3 t3) const + { + expression_node* + result = (new node_type(t1, t2, t3)); + result->node_depth(); + return result; + } + + template + inline expression_node* allocate_type(T1 t1, T2 t2, + T3 t3, T4 t4) const + { + expression_node* + result = (new node_type(t1, t2, t3, t4)); + result->node_depth(); + return result; + } + + template + inline expression_node* allocate_type(T1 t1, T2 t2, + T3 t3, T4 t4, + T5 t5) const + { + expression_node* + result = (new node_type(t1, t2, t3, t4, t5)); + result->node_depth(); + return result; + } + + template + inline expression_node* allocate_type(T1 t1, T2 t2, + T3 t3, T4 t4, + T5 t5, T6 t6) const + { + expression_node* + result = (new node_type(t1, t2, t3, t4, t5, t6)); + result->node_depth(); + return result; + } + + template + inline expression_node* allocate_type(T1 t1, T2 t2, + T3 t3, T4 t4, + T5 t5, T6 t6, + T7 t7) const + { + expression_node* + result = (new node_type(t1, t2, t3, t4, t5, t6, t7)); + result->node_depth(); + return result; + } + + template + void inline free(expression_node*& e) const + { + exprtk_debug(("node_allocator::free() - deleting expression_node " + "type: %03d addr: %p\n", + static_cast(e->type()), + reinterpret_cast(e))); + delete e; + e = 0; + } + }; + + inline void load_operations_map(std::multimap& m) + { + #define register_op(Symbol, Type, Args) \ + m.insert(std::make_pair(std::string(Symbol),details::base_operation_t(Type,Args))); \ + + register_op("abs" , e_abs , 1) + register_op("acos" , e_acos , 1) + register_op("acosh" , e_acosh , 1) + register_op("asin" , e_asin , 1) + register_op("asinh" , e_asinh , 1) + register_op("atan" , e_atan , 1) + register_op("atanh" , e_atanh , 1) + register_op("ceil" , e_ceil , 1) + register_op("cos" , e_cos , 1) + register_op("cosh" , e_cosh , 1) + register_op("exp" , e_exp , 1) + register_op("expm1" , e_expm1 , 1) + register_op("floor" , e_floor , 1) + register_op("log" , e_log , 1) + register_op("log10" , e_log10 , 1) + register_op("log2" , e_log2 , 1) + register_op("log1p" , e_log1p , 1) + register_op("round" , e_round , 1) + register_op("sin" , e_sin , 1) + register_op("sinc" , e_sinc , 1) + register_op("sinh" , e_sinh , 1) + register_op("sec" , e_sec , 1) + register_op("csc" , e_csc , 1) + register_op("sqrt" , e_sqrt , 1) + register_op("tan" , e_tan , 1) + register_op("tanh" , e_tanh , 1) + register_op("cot" , e_cot , 1) + register_op("rad2deg" , e_r2d , 1) + register_op("deg2rad" , e_d2r , 1) + register_op("deg2grad" , e_d2g , 1) + register_op("grad2deg" , e_g2d , 1) + register_op("sgn" , e_sgn , 1) + register_op("not" , e_notl , 1) + register_op("erf" , e_erf , 1) + register_op("erfc" , e_erfc , 1) + register_op("ncdf" , e_ncdf , 1) + register_op("frac" , e_frac , 1) + register_op("trunc" , e_trunc , 1) + register_op("atan2" , e_atan2 , 2) + register_op("mod" , e_mod , 2) + register_op("logn" , e_logn , 2) + register_op("pow" , e_pow , 2) + register_op("root" , e_root , 2) + register_op("roundn" , e_roundn , 2) + register_op("equal" , e_equal , 2) + register_op("not_equal" , e_nequal , 2) + register_op("hypot" , e_hypot , 2) + register_op("shr" , e_shr , 2) + register_op("shl" , e_shl , 2) + register_op("clamp" , e_clamp , 3) + register_op("iclamp" , e_iclamp , 3) + register_op("inrange" , e_inrange , 3) + #undef register_op + } + + } // namespace details + + class function_traits + { + public: + + function_traits() + : allow_zero_parameters_(false) + , has_side_effects_(true) + , min_num_args_(0) + , max_num_args_(std::numeric_limits::max()) + {} + + inline bool& allow_zero_parameters() + { + return allow_zero_parameters_; + } + + inline bool& has_side_effects() + { + return has_side_effects_; + } + + std::size_t& min_num_args() + { + return min_num_args_; + } + + std::size_t& max_num_args() + { + return max_num_args_; + } + + private: + + bool allow_zero_parameters_; + bool has_side_effects_; + std::size_t min_num_args_; + std::size_t max_num_args_; + }; + + template + void enable_zero_parameters(FunctionType& func) + { + func.allow_zero_parameters() = true; + + if (0 != func.min_num_args()) + { + func.min_num_args() = 0; + } + } + + template + void disable_zero_parameters(FunctionType& func) + { + func.allow_zero_parameters() = false; + } + + template + void enable_has_side_effects(FunctionType& func) + { + func.has_side_effects() = true; + } + + template + void disable_has_side_effects(FunctionType& func) + { + func.has_side_effects() = false; + } + + template + void set_min_num_args(FunctionType& func, const std::size_t& num_args) + { + func.min_num_args() = num_args; + + if ((0 != func.min_num_args()) && func.allow_zero_parameters()) + func.allow_zero_parameters() = false; + } + + template + void set_max_num_args(FunctionType& func, const std::size_t& num_args) + { + func.max_num_args() = num_args; + } + + template + class ifunction : public function_traits + { + public: + + explicit ifunction(const std::size_t& pc) + : param_count(pc) + {} + + virtual ~ifunction() {} + + #define empty_method_body(N) \ + { \ + exprtk_debug(("ifunction::operator() - Operator(" #N ") has not been overridden\n")); \ + return std::numeric_limits::quiet_NaN(); \ + } \ + + inline virtual T operator() () + empty_method_body(0) + + inline virtual T operator() (const T&) + empty_method_body(1) + + inline virtual T operator() (const T&,const T&) + empty_method_body(2) + + inline virtual T operator() (const T&, const T&, const T&) + empty_method_body(3) + + inline virtual T operator() (const T&, const T&, const T&, const T&) + empty_method_body(4) + + inline virtual T operator() (const T&, const T&, const T&, const T&, const T&) + empty_method_body(5) + + inline virtual T operator() (const T&, const T&, const T&, const T&, const T&, const T&) + empty_method_body(6) + + inline virtual T operator() (const T&, const T&, const T&, const T&, const T&, const T&, const T&) + empty_method_body(7) + + inline virtual T operator() (const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&) + empty_method_body(8) + + inline virtual T operator() (const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&) + empty_method_body(9) + + inline virtual T operator() (const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&) + empty_method_body(10) + + inline virtual T operator() (const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, + const T&) + empty_method_body(11) + + inline virtual T operator() (const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, + const T&, const T&) + empty_method_body(12) + + inline virtual T operator() (const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, + const T&, const T&, const T&) + empty_method_body(13) + + inline virtual T operator() (const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, + const T&, const T&, const T&, const T&) + empty_method_body(14) + + inline virtual T operator() (const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, + const T&, const T&, const T&, const T&, const T&) + empty_method_body(15) + + inline virtual T operator() (const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, + const T&, const T&, const T&, const T&, const T&, const T&) + empty_method_body(16) + + inline virtual T operator() (const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, + const T&, const T&, const T&, const T&, const T&, const T&, const T&) + empty_method_body(17) + + inline virtual T operator() (const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, + const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&) + empty_method_body(18) + + inline virtual T operator() (const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, + const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&) + empty_method_body(19) + + inline virtual T operator() (const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, + const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&) + empty_method_body(20) + + #undef empty_method_body + + std::size_t param_count; + }; + + template + class ivararg_function : public function_traits + { + public: + + virtual ~ivararg_function() {} + + inline virtual T operator() (const std::vector&) + { + exprtk_debug(("ivararg_function::operator() - Operator has not been overridden\n")); + return std::numeric_limits::quiet_NaN(); + } + }; + + template + class igeneric_function : public function_traits + { + public: + + enum return_type + { + e_rtrn_scalar = 0, + e_rtrn_string = 1, + e_rtrn_overload = 2 + }; + + typedef T type; + typedef type_store generic_type; + typedef typename generic_type::parameter_list parameter_list_t; + + igeneric_function(const std::string& param_seq = "", const return_type rtr_type = e_rtrn_scalar) + : parameter_sequence(param_seq) + , rtrn_type(rtr_type) + {} + + virtual ~igeneric_function() {} + + #define igeneric_function_empty_body(N) \ + { \ + exprtk_debug(("igeneric_function::operator() - Operator(" #N ") has not been overridden\n")); \ + return std::numeric_limits::quiet_NaN(); \ + } \ + + // f(i_0,i_1,....,i_N) --> Scalar + inline virtual T operator() (parameter_list_t) + igeneric_function_empty_body(1) + + // f(i_0,i_1,....,i_N) --> String + inline virtual T operator() (std::string&, parameter_list_t) + igeneric_function_empty_body(2) + + // f(psi,i_0,i_1,....,i_N) --> Scalar + inline virtual T operator() (const std::size_t&, parameter_list_t) + igeneric_function_empty_body(3) + + // f(psi,i_0,i_1,....,i_N) --> String + inline virtual T operator() (const std::size_t&, std::string&, parameter_list_t) + igeneric_function_empty_body(4) + + std::string parameter_sequence; + return_type rtrn_type; + }; + + #ifndef exprtk_disable_string_capabilities + template + class stringvar_base + { + public: + + typedef typename details::stringvar_node stringvar_node_t; + + stringvar_base(const std::string& name, stringvar_node_t* svn) + : name_(name) + , string_varnode_(svn) + {} + + bool valid() const + { + return !name_.empty() && (0 != string_varnode_); + } + + std::string name() const + { + assert(string_varnode_); + return name_; + } + + void rebase(std::string& s) + { + assert(string_varnode_); + string_varnode_->rebase(s); + } + + private: + + std::string name_; + stringvar_node_t* string_varnode_; + }; + #endif + + template class parser; + template class expression_helper; + + template + class symbol_table + { + public: + + typedef T (*ff00_functor)(); + typedef T (*ff01_functor)(T); + typedef T (*ff02_functor)(T, T); + typedef T (*ff03_functor)(T, T, T); + typedef T (*ff04_functor)(T, T, T, T); + typedef T (*ff05_functor)(T, T, T, T, T); + typedef T (*ff06_functor)(T, T, T, T, T, T); + typedef T (*ff07_functor)(T, T, T, T, T, T, T); + typedef T (*ff08_functor)(T, T, T, T, T, T, T, T); + typedef T (*ff09_functor)(T, T, T, T, T, T, T, T, T); + typedef T (*ff10_functor)(T, T, T, T, T, T, T, T, T, T); + typedef T (*ff11_functor)(T, T, T, T, T, T, T, T, T, T, T); + typedef T (*ff12_functor)(T, T, T, T, T, T, T, T, T, T, T, T); + typedef T (*ff13_functor)(T, T, T, T, T, T, T, T, T, T, T, T, T); + typedef T (*ff14_functor)(T, T, T, T, T, T, T, T, T, T, T, T, T, T); + typedef T (*ff15_functor)(T, T, T, T, T, T, T, T, T, T, T, T, T, T, T); + + protected: + + struct freefunc00 : public exprtk::ifunction + { + using exprtk::ifunction::operator(); + + explicit freefunc00(ff00_functor ff) : exprtk::ifunction(0), f(ff) {} + inline T operator() () + { return f(); } + ff00_functor f; + }; + + struct freefunc01 : public exprtk::ifunction + { + using exprtk::ifunction::operator(); + + explicit freefunc01(ff01_functor ff) : exprtk::ifunction(1), f(ff) {} + inline T operator() (const T& v0) + { return f(v0); } + ff01_functor f; + }; + + struct freefunc02 : public exprtk::ifunction + { + using exprtk::ifunction::operator(); + + explicit freefunc02(ff02_functor ff) : exprtk::ifunction(2), f(ff) {} + inline T operator() (const T& v0, const T& v1) + { return f(v0, v1); } + ff02_functor f; + }; + + struct freefunc03 : public exprtk::ifunction + { + using exprtk::ifunction::operator(); + + explicit freefunc03(ff03_functor ff) : exprtk::ifunction(3), f(ff) {} + inline T operator() (const T& v0, const T& v1, const T& v2) + { return f(v0, v1, v2); } + ff03_functor f; + }; + + struct freefunc04 : public exprtk::ifunction + { + using exprtk::ifunction::operator(); + + explicit freefunc04(ff04_functor ff) : exprtk::ifunction(4), f(ff) {} + inline T operator() (const T& v0, const T& v1, const T& v2, const T& v3) + { return f(v0, v1, v2, v3); } + ff04_functor f; + }; + + struct freefunc05 : public exprtk::ifunction + { + using exprtk::ifunction::operator(); + + explicit freefunc05(ff05_functor ff) : exprtk::ifunction(5), f(ff) {} + inline T operator() (const T& v0, const T& v1, const T& v2, const T& v3, const T& v4) + { return f(v0, v1, v2, v3, v4); } + ff05_functor f; + }; + + struct freefunc06 : public exprtk::ifunction + { + using exprtk::ifunction::operator(); + + explicit freefunc06(ff06_functor ff) : exprtk::ifunction(6), f(ff) {} + inline T operator() (const T& v0, const T& v1, const T& v2, const T& v3, const T& v4, const T& v5) + { return f(v0, v1, v2, v3, v4, v5); } + ff06_functor f; + }; + + struct freefunc07 : public exprtk::ifunction + { + using exprtk::ifunction::operator(); + + explicit freefunc07(ff07_functor ff) : exprtk::ifunction(7), f(ff) {} + inline T operator() (const T& v0, const T& v1, const T& v2, const T& v3, const T& v4, + const T& v5, const T& v6) + { return f(v0, v1, v2, v3, v4, v5, v6); } + ff07_functor f; + }; + + struct freefunc08 : public exprtk::ifunction + { + using exprtk::ifunction::operator(); + + explicit freefunc08(ff08_functor ff) : exprtk::ifunction(8), f(ff) {} + inline T operator() (const T& v0, const T& v1, const T& v2, const T& v3, const T& v4, + const T& v5, const T& v6, const T& v7) + { return f(v0, v1, v2, v3, v4, v5, v6, v7); } + ff08_functor f; + }; + + struct freefunc09 : public exprtk::ifunction + { + using exprtk::ifunction::operator(); + + explicit freefunc09(ff09_functor ff) : exprtk::ifunction(9), f(ff) {} + inline T operator() (const T& v0, const T& v1, const T& v2, const T& v3, const T& v4, + const T& v5, const T& v6, const T& v7, const T& v8) + { return f(v0, v1, v2, v3, v4, v5, v6, v7, v8); } + ff09_functor f; + }; + + struct freefunc10 : public exprtk::ifunction + { + using exprtk::ifunction::operator(); + + explicit freefunc10(ff10_functor ff) : exprtk::ifunction(10), f(ff) {} + inline T operator() (const T& v0, const T& v1, const T& v2, const T& v3, const T& v4, + const T& v5, const T& v6, const T& v7, const T& v8, const T& v9) + { return f(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9); } + ff10_functor f; + }; + + struct freefunc11 : public exprtk::ifunction + { + using exprtk::ifunction::operator(); + + explicit freefunc11(ff11_functor ff) : exprtk::ifunction(11), f(ff) {} + inline T operator() (const T& v0, const T& v1, const T& v2, const T& v3, const T& v4, + const T& v5, const T& v6, const T& v7, const T& v8, const T& v9, const T& v10) + { return f(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10); } + ff11_functor f; + }; + + struct freefunc12 : public exprtk::ifunction + { + using exprtk::ifunction::operator(); + + explicit freefunc12(ff12_functor ff) : exprtk::ifunction(12), f(ff) {} + inline T operator() (const T& v00, const T& v01, const T& v02, const T& v03, const T& v04, + const T& v05, const T& v06, const T& v07, const T& v08, const T& v09, + const T& v10, const T& v11) + { return f(v00, v01, v02, v03, v04, v05, v06, v07, v08, v09, v10, v11); } + ff12_functor f; + }; + + struct freefunc13 : public exprtk::ifunction + { + using exprtk::ifunction::operator(); + + explicit freefunc13(ff13_functor ff) : exprtk::ifunction(13), f(ff) {} + inline T operator() (const T& v00, const T& v01, const T& v02, const T& v03, const T& v04, + const T& v05, const T& v06, const T& v07, const T& v08, const T& v09, + const T& v10, const T& v11, const T& v12) + { return f(v00, v01, v02, v03, v04, v05, v06, v07, v08, v09, v10, v11, v12); } + ff13_functor f; + }; + + struct freefunc14 : public exprtk::ifunction + { + using exprtk::ifunction::operator(); + + explicit freefunc14(ff14_functor ff) : exprtk::ifunction(14), f(ff) {} + inline T operator() (const T& v00, const T& v01, const T& v02, const T& v03, const T& v04, + const T& v05, const T& v06, const T& v07, const T& v08, const T& v09, + const T& v10, const T& v11, const T& v12, const T& v13) + { return f(v00, v01, v02, v03, v04, v05, v06, v07, v08, v09, v10, v11, v12, v13); } + ff14_functor f; + }; + + struct freefunc15 : public exprtk::ifunction + { + using exprtk::ifunction::operator(); + + explicit freefunc15(ff15_functor ff) : exprtk::ifunction(15), f(ff) {} + inline T operator() (const T& v00, const T& v01, const T& v02, const T& v03, const T& v04, + const T& v05, const T& v06, const T& v07, const T& v08, const T& v09, + const T& v10, const T& v11, const T& v12, const T& v13, const T& v14) + { return f(v00, v01, v02, v03, v04, v05, v06, v07, v08, v09, v10, v11, v12, v13, v14); } + ff15_functor f; + }; + + template + struct type_store + { + typedef details::expression_node* expression_ptr; + typedef typename details::variable_node variable_node_t; + typedef ifunction ifunction_t; + typedef ivararg_function ivararg_function_t; + typedef igeneric_function igeneric_function_t; + typedef details::vector_holder vector_t; + #ifndef exprtk_disable_string_capabilities + typedef typename details::stringvar_node stringvar_node_t; + #endif + + typedef Type type_t; + typedef type_t* type_ptr; + typedef std::pair type_pair_t; + typedef std::map type_map_t; + typedef typename type_map_t::iterator tm_itr_t; + typedef typename type_map_t::const_iterator tm_const_itr_t; + + enum { lut_size = 256 }; + + type_map_t map; + std::size_t size; + + type_store() + : size(0) + {} + + struct deleter + { + #define exprtk_define_process(Type) \ + static inline void process(std::pair& n) \ + { \ + delete n.second; \ + } \ + + exprtk_define_process(variable_node_t ) + exprtk_define_process(vector_t ) + #ifndef exprtk_disable_string_capabilities + exprtk_define_process(stringvar_node_t) + #endif + + #undef exprtk_define_process + + template + static inline void process(std::pair&) + {} + }; + + inline bool symbol_exists(const std::string& symbol_name) const + { + if (symbol_name.empty()) + return false; + else if (map.end() != map.find(symbol_name)) + return true; + else + return false; + } + + template + inline std::string entity_name(const PtrType& ptr) const + { + if (map.empty()) + return std::string(); + + tm_const_itr_t itr = map.begin(); + + while (map.end() != itr) + { + if (itr->second.second == ptr) + { + return itr->first; + } + else + ++itr; + } + + return std::string(); + } + + inline bool is_constant(const std::string& symbol_name) const + { + if (symbol_name.empty()) + return false; + else + { + const tm_const_itr_t itr = map.find(symbol_name); + + if (map.end() == itr) + return false; + else + return (*itr).second.first; + } + } + + template + inline bool add_impl(const std::string& symbol_name, RType t, const bool is_const) + { + if (symbol_name.size() > 1) + { + for (std::size_t i = 0; i < details::reserved_symbols_size; ++i) + { + if (details::imatch(symbol_name, details::reserved_symbols[i])) + { + return false; + } + } + } + + const tm_itr_t itr = map.find(symbol_name); + + if (map.end() == itr) + { + map[symbol_name] = Tie::make(t,is_const); + ++size; + } + + return true; + } + + struct tie_array + { + static inline std::pair make(std::pair v, const bool is_const = false) + { + return std::make_pair(is_const, new vector_t(v.first, v.second)); + } + }; + + struct tie_stdvec + { + template + static inline std::pair make(std::vector& v, const bool is_const = false) + { + return std::make_pair(is_const, new vector_t(v)); + } + }; + + struct tie_vecview + { + static inline std::pair make(exprtk::vector_view& v, const bool is_const = false) + { + return std::make_pair(is_const, new vector_t(v)); + } + }; + + struct tie_stddeq + { + template + static inline std::pair make(std::deque& v, const bool is_const = false) + { + return std::make_pair(is_const, new vector_t(v)); + } + }; + + template + inline bool add(const std::string& symbol_name, T (&v)[v_size], const bool is_const = false) + { + return add_impl > + (symbol_name, std::make_pair(v,v_size), is_const); + } + + inline bool add(const std::string& symbol_name, T* v, const std::size_t v_size, const bool is_const = false) + { + return add_impl > + (symbol_name, std::make_pair(v,v_size), is_const); + } + + template + inline bool add(const std::string& symbol_name, std::vector& v, const bool is_const = false) + { + return add_impl&> + (symbol_name, v, is_const); + } + + inline bool add(const std::string& symbol_name, exprtk::vector_view& v, const bool is_const = false) + { + return add_impl&> + (symbol_name, v, is_const); + } + + template + inline bool add(const std::string& symbol_name, std::deque& v, const bool is_const = false) + { + return add_impl&> + (symbol_name, v, is_const); + } + + inline bool add(const std::string& symbol_name, RawType& t_, const bool is_const = false) + { + struct tie + { + static inline std::pair make(T& t, const bool is_constant = false) + { + return std::make_pair(is_constant, new variable_node_t(t)); + } + + #ifndef exprtk_disable_string_capabilities + static inline std::pair make(std::string& t, const bool is_constant = false) + { + return std::make_pair(is_constant, new stringvar_node_t(t)); + } + #endif + + static inline std::pair make(function_t& t, const bool is_constant = false) + { + return std::make_pair(is_constant,&t); + } + + static inline std::pair make(vararg_function_t& t, const bool is_constant = false) + { + return std::make_pair(is_constant,&t); + } + + static inline std::pair make(generic_function_t& t, const bool is_constant = false) + { + return std::make_pair(is_constant,&t); + } + }; + + const tm_itr_t itr = map.find(symbol_name); + + if (map.end() == itr) + { + map[symbol_name] = tie::make(t_,is_const); + ++size; + } + + return true; + } + + inline type_ptr get(const std::string& symbol_name) const + { + const tm_const_itr_t itr = map.find(symbol_name); + + if (map.end() == itr) + return reinterpret_cast(0); + else + return itr->second.second; + } + + template + struct ptr_match + { + static inline bool test(const PtrType, const void*) + { + return false; + } + }; + + template + struct ptr_match + { + static inline bool test(const variable_node_t* p, const void* ptr) + { + exprtk_debug(("ptr_match::test() - %p <--> %p\n",(void*)(&(p->ref())),ptr)); + return (&(p->ref()) == ptr); + } + }; + + inline type_ptr get_from_varptr(const void* ptr) const + { + tm_const_itr_t itr = map.begin(); + + while (map.end() != itr) + { + type_ptr ret_ptr = itr->second.second; + + if (ptr_match::test(ret_ptr,ptr)) + { + return ret_ptr; + } + + ++itr; + } + + return type_ptr(0); + } + + inline bool remove(const std::string& symbol_name, const bool delete_node = true) + { + const tm_itr_t itr = map.find(symbol_name); + + if (map.end() != itr) + { + if (delete_node) + { + deleter::process((*itr).second); + } + + map.erase(itr); + --size; + + return true; + } + else + return false; + } + + inline RawType& type_ref(const std::string& symbol_name) + { + struct init_type + { + static inline double set(double) { return (0.0); } + static inline double set(long double) { return (0.0); } + static inline float set(float) { return (0.0f); } + static inline std::string set(std::string) { return std::string(""); } + }; + + static RawType null_type = init_type::set(RawType()); + + const tm_const_itr_t itr = map.find(symbol_name); + + if (map.end() == itr) + return null_type; + else + return itr->second.second->ref(); + } + + inline void clear(const bool delete_node = true) + { + if (!map.empty()) + { + if (delete_node) + { + tm_itr_t itr = map.begin(); + tm_itr_t end = map.end (); + + while (end != itr) + { + deleter::process((*itr).second); + ++itr; + } + } + + map.clear(); + } + + size = 0; + } + + template class Sequence> + inline std::size_t get_list(Sequence,Allocator>& list) const + { + std::size_t count = 0; + + if (!map.empty()) + { + tm_const_itr_t itr = map.begin(); + tm_const_itr_t end = map.end (); + + while (end != itr) + { + list.push_back(std::make_pair((*itr).first,itr->second.second->ref())); + ++itr; + ++count; + } + } + + return count; + } + + template class Sequence> + inline std::size_t get_list(Sequence& vlist) const + { + std::size_t count = 0; + + if (!map.empty()) + { + tm_const_itr_t itr = map.begin(); + tm_const_itr_t end = map.end (); + + while (end != itr) + { + vlist.push_back((*itr).first); + ++itr; + ++count; + } + } + + return count; + } + }; + + typedef details::expression_node* expression_ptr; + typedef typename details::variable_node variable_t; + typedef typename details::vector_holder vector_holder_t; + typedef variable_t* variable_ptr; + #ifndef exprtk_disable_string_capabilities + typedef typename details::stringvar_node stringvar_t; + typedef stringvar_t* stringvar_ptr; + #endif + typedef ifunction function_t; + typedef ivararg_function vararg_function_t; + typedef igeneric_function generic_function_t; + typedef function_t* function_ptr; + typedef vararg_function_t* vararg_function_ptr; + typedef generic_function_t* generic_function_ptr; + + static const std::size_t lut_size = 256; + + // Symbol Table Holder + struct control_block + { + struct st_data + { + type_store variable_store; + type_store function_store; + type_store vararg_function_store; + type_store generic_function_store; + type_store string_function_store; + type_store overload_function_store; + type_store vector_store; + #ifndef exprtk_disable_string_capabilities + type_store stringvar_store; + #endif + + st_data() + { + for (std::size_t i = 0; i < details::reserved_words_size; ++i) + { + reserved_symbol_table_.insert(details::reserved_words[i]); + } + + for (std::size_t i = 0; i < details::reserved_symbols_size; ++i) + { + reserved_symbol_table_.insert(details::reserved_symbols[i]); + } + } + + ~st_data() + { + for (std::size_t i = 0; i < free_function_list_.size(); ++i) + { + delete free_function_list_[i]; + } + } + + inline bool is_reserved_symbol(const std::string& symbol) const + { + return (reserved_symbol_table_.end() != reserved_symbol_table_.find(symbol)); + } + + static inline st_data* create() + { + return (new st_data); + } + + static inline void destroy(st_data*& sd) + { + delete sd; + sd = reinterpret_cast(0); + } + + std::list local_symbol_list_; + std::list local_stringvar_list_; + std::set reserved_symbol_table_; + std::vector*> free_function_list_; + }; + + control_block() + : ref_count(1) + , data_(st_data::create()) + {} + + explicit control_block(st_data* data) + : ref_count(1) + , data_(data) + {} + + ~control_block() + { + if (data_ && (0 == ref_count)) + { + st_data::destroy(data_); + } + } + + static inline control_block* create() + { + return (new control_block); + } + + template + static inline void destroy(control_block*& cntrl_blck, SymTab* sym_tab) + { + if (cntrl_blck) + { + if ( + (0 != cntrl_blck->ref_count) && + (0 == --cntrl_blck->ref_count) + ) + { + if (sym_tab) + sym_tab->clear(); + + delete cntrl_blck; + } + + cntrl_blck = 0; + } + } + + std::size_t ref_count; + st_data* data_; + }; + + public: + + symbol_table() + : control_block_(control_block::create()) + { + clear(); + } + + ~symbol_table() + { + exprtk::details::dump_ptr("~symbol_table", this); + control_block::destroy(control_block_, this); + } + + symbol_table(const symbol_table& st) + { + control_block_ = st.control_block_; + control_block_->ref_count++; + } + + inline symbol_table& operator=(const symbol_table& st) + { + if (this != &st) + { + control_block::destroy(control_block_,reinterpret_cast*>(0)); + + control_block_ = st.control_block_; + control_block_->ref_count++; + } + + return (*this); + } + + inline bool operator==(const symbol_table& st) const + { + return (this == &st) || (control_block_ == st.control_block_); + } + + inline void clear_variables(const bool delete_node = true) + { + local_data().variable_store.clear(delete_node); + } + + inline void clear_functions() + { + local_data().function_store.clear(); + } + + inline void clear_strings() + { + #ifndef exprtk_disable_string_capabilities + local_data().stringvar_store.clear(); + #endif + } + + inline void clear_vectors() + { + local_data().vector_store.clear(); + } + + inline void clear_local_constants() + { + local_data().local_symbol_list_.clear(); + } + + inline void clear() + { + if (!valid()) return; + clear_variables (); + clear_functions (); + clear_strings (); + clear_vectors (); + clear_local_constants(); + } + + inline std::size_t variable_count() const + { + if (valid()) + return local_data().variable_store.size; + else + return 0; + } + + #ifndef exprtk_disable_string_capabilities + inline std::size_t stringvar_count() const + { + if (valid()) + return local_data().stringvar_store.size; + else + return 0; + } + #endif + + inline std::size_t function_count() const + { + if (valid()) + return local_data().function_store.size; + else + return 0; + } + + inline std::size_t vector_count() const + { + if (valid()) + return local_data().vector_store.size; + else + return 0; + } + + inline variable_ptr get_variable(const std::string& variable_name) const + { + if (!valid()) + return reinterpret_cast(0); + else if (!valid_symbol(variable_name)) + return reinterpret_cast(0); + else + return local_data().variable_store.get(variable_name); + } + + inline variable_ptr get_variable(const T& var_ref) const + { + if (!valid()) + return reinterpret_cast(0); + else + return local_data().variable_store.get_from_varptr( + reinterpret_cast(&var_ref)); + } + + #ifndef exprtk_disable_string_capabilities + inline stringvar_ptr get_stringvar(const std::string& string_name) const + { + if (!valid()) + return reinterpret_cast(0); + else if (!valid_symbol(string_name)) + return reinterpret_cast(0); + else + return local_data().stringvar_store.get(string_name); + } + + inline stringvar_base get_stringvar_base(const std::string& string_name) const + { + static stringvar_base null_stringvar_base("",reinterpret_cast(0)); + if (!valid()) + return null_stringvar_base; + else if (!valid_symbol(string_name)) + return null_stringvar_base; + + stringvar_ptr stringvar = local_data().stringvar_store.get(string_name); + + if (0 == stringvar) + { + return null_stringvar_base; + } + + return stringvar_base(string_name,stringvar); + } + #endif + + inline function_ptr get_function(const std::string& function_name) const + { + if (!valid()) + return reinterpret_cast(0); + else if (!valid_symbol(function_name)) + return reinterpret_cast(0); + else + return local_data().function_store.get(function_name); + } + + inline vararg_function_ptr get_vararg_function(const std::string& vararg_function_name) const + { + if (!valid()) + return reinterpret_cast(0); + else if (!valid_symbol(vararg_function_name)) + return reinterpret_cast(0); + else + return local_data().vararg_function_store.get(vararg_function_name); + } + + inline generic_function_ptr get_generic_function(const std::string& function_name) const + { + if (!valid()) + return reinterpret_cast(0); + else if (!valid_symbol(function_name)) + return reinterpret_cast(0); + else + return local_data().generic_function_store.get(function_name); + } + + inline generic_function_ptr get_string_function(const std::string& function_name) const + { + if (!valid()) + return reinterpret_cast(0); + else if (!valid_symbol(function_name)) + return reinterpret_cast(0); + else + return local_data().string_function_store.get(function_name); + } + + inline generic_function_ptr get_overload_function(const std::string& function_name) const + { + if (!valid()) + return reinterpret_cast(0); + else if (!valid_symbol(function_name)) + return reinterpret_cast(0); + else + return local_data().overload_function_store.get(function_name); + } + + typedef vector_holder_t* vector_holder_ptr; + + inline vector_holder_ptr get_vector(const std::string& vector_name) const + { + if (!valid()) + return reinterpret_cast(0); + else if (!valid_symbol(vector_name)) + return reinterpret_cast(0); + else + return local_data().vector_store.get(vector_name); + } + + inline T& variable_ref(const std::string& symbol_name) + { + static T null_var = T(0); + if (!valid()) + return null_var; + else if (!valid_symbol(symbol_name)) + return null_var; + else + return local_data().variable_store.type_ref(symbol_name); + } + + #ifndef exprtk_disable_string_capabilities + inline std::string& stringvar_ref(const std::string& symbol_name) + { + static std::string null_stringvar; + if (!valid()) + return null_stringvar; + else if (!valid_symbol(symbol_name)) + return null_stringvar; + else + return local_data().stringvar_store.type_ref(symbol_name); + } + #endif + + inline bool is_constant_node(const std::string& symbol_name) const + { + if (!valid()) + return false; + else if (!valid_symbol(symbol_name)) + return false; + else + return local_data().variable_store.is_constant(symbol_name); + } + + #ifndef exprtk_disable_string_capabilities + inline bool is_constant_string(const std::string& symbol_name) const + { + if (!valid()) + return false; + else if (!valid_symbol(symbol_name)) + return false; + else if (!local_data().stringvar_store.symbol_exists(symbol_name)) + return false; + else + return local_data().stringvar_store.is_constant(symbol_name); + } + #endif + + inline bool create_variable(const std::string& variable_name, const T& value = T(0)) + { + if (!valid()) + return false; + else if (!valid_symbol(variable_name)) + return false; + else if (symbol_exists(variable_name)) + return false; + + local_data().local_symbol_list_.push_back(value); + T& t = local_data().local_symbol_list_.back(); + + return add_variable(variable_name,t); + } + + #ifndef exprtk_disable_string_capabilities + inline bool create_stringvar(const std::string& stringvar_name, const std::string& value = std::string("")) + { + if (!valid()) + return false; + else if (!valid_symbol(stringvar_name)) + return false; + else if (symbol_exists(stringvar_name)) + return false; + + local_data().local_stringvar_list_.push_back(value); + std::string& s = local_data().local_stringvar_list_.back(); + + return add_stringvar(stringvar_name,s); + } + #endif + + inline bool add_variable(const std::string& variable_name, T& t, const bool is_constant = false) + { + if (!valid()) + return false; + else if (!valid_symbol(variable_name)) + return false; + else if (symbol_exists(variable_name)) + return false; + else + return local_data().variable_store.add(variable_name, t, is_constant); + } + + inline bool add_constant(const std::string& constant_name, const T& value) + { + if (!valid()) + return false; + else if (!valid_symbol(constant_name)) + return false; + else if (symbol_exists(constant_name)) + return false; + + local_data().local_symbol_list_.push_back(value); + T& t = local_data().local_symbol_list_.back(); + + return add_variable(constant_name, t, true); + } + + #ifndef exprtk_disable_string_capabilities + inline bool add_stringvar(const std::string& stringvar_name, std::string& s, const bool is_constant = false) + { + if (!valid()) + return false; + else if (!valid_symbol(stringvar_name)) + return false; + else if (symbol_exists(stringvar_name)) + return false; + else + return local_data().stringvar_store.add(stringvar_name, s, is_constant); + } + #endif + + inline bool add_function(const std::string& function_name, function_t& function) + { + if (!valid()) + return false; + else if (!valid_symbol(function_name)) + return false; + else if (symbol_exists(function_name)) + return false; + else + return local_data().function_store.add(function_name,function); + } + + inline bool add_function(const std::string& vararg_function_name, vararg_function_t& vararg_function) + { + if (!valid()) + return false; + else if (!valid_symbol(vararg_function_name)) + return false; + else if (symbol_exists(vararg_function_name)) + return false; + else + return local_data().vararg_function_store.add(vararg_function_name,vararg_function); + } + + inline bool add_function(const std::string& function_name, generic_function_t& function) + { + if (!valid()) + return false; + else if (!valid_symbol(function_name)) + return false; + else if (symbol_exists(function_name)) + return false; + else + { + switch (function.rtrn_type) + { + case generic_function_t::e_rtrn_scalar : + return (std::string::npos == function.parameter_sequence.find_first_not_of("STVZ*?|")) ? + local_data().generic_function_store.add(function_name,function) : false; + + case generic_function_t::e_rtrn_string : + return (std::string::npos == function.parameter_sequence.find_first_not_of("STVZ*?|")) ? + local_data().string_function_store.add(function_name,function) : false; + + case generic_function_t::e_rtrn_overload : + return (std::string::npos == function.parameter_sequence.find_first_not_of("STVZ*?|:")) ? + local_data().overload_function_store.add(function_name,function) : false; + } + } + + return false; + } + + #define exprtk_define_freefunction(NN) \ + inline bool add_function(const std::string& function_name, ff##NN##_functor function) \ + { \ + if (!valid()) \ + { return false; } \ + if (!valid_symbol(function_name)) \ + { return false; } \ + if (symbol_exists(function_name)) \ + { return false; } \ + \ + exprtk::ifunction* ifunc = new freefunc##NN(function); \ + \ + local_data().free_function_list_.push_back(ifunc); \ + \ + return add_function(function_name,(*local_data().free_function_list_.back())); \ + } \ + + exprtk_define_freefunction(00) exprtk_define_freefunction(01) + exprtk_define_freefunction(02) exprtk_define_freefunction(03) + exprtk_define_freefunction(04) exprtk_define_freefunction(05) + exprtk_define_freefunction(06) exprtk_define_freefunction(07) + exprtk_define_freefunction(08) exprtk_define_freefunction(09) + exprtk_define_freefunction(10) exprtk_define_freefunction(11) + exprtk_define_freefunction(12) exprtk_define_freefunction(13) + exprtk_define_freefunction(14) exprtk_define_freefunction(15) + + #undef exprtk_define_freefunction + + inline bool add_reserved_function(const std::string& function_name, function_t& function) + { + if (!valid()) + return false; + else if (!valid_symbol(function_name,false)) + return false; + else if (symbol_exists(function_name,false)) + return false; + else + return local_data().function_store.add(function_name,function); + } + + inline bool add_reserved_function(const std::string& vararg_function_name, vararg_function_t& vararg_function) + { + if (!valid()) + return false; + else if (!valid_symbol(vararg_function_name,false)) + return false; + else if (symbol_exists(vararg_function_name,false)) + return false; + else + return local_data().vararg_function_store.add(vararg_function_name,vararg_function); + } + + inline bool add_reserved_function(const std::string& function_name, generic_function_t& function) + { + if (!valid()) + return false; + else if (!valid_symbol(function_name,false)) + return false; + else if (symbol_exists(function_name,false)) + return false; + else + { + switch (function.rtrn_type) + { + case generic_function_t::e_rtrn_scalar : + return (std::string::npos == function.parameter_sequence.find_first_not_of("STVZ*?|")) ? + local_data().generic_function_store.add(function_name,function) : false; + + case generic_function_t::e_rtrn_string : + return (std::string::npos == function.parameter_sequence.find_first_not_of("STVZ*?|")) ? + local_data().string_function_store.add(function_name,function) : false; + + case generic_function_t::e_rtrn_overload : + return (std::string::npos == function.parameter_sequence.find_first_not_of("STVZ*?|:")) ? + local_data().overload_function_store.add(function_name,function) : false; + } + } + + return false; + } + + template + inline bool add_vector(const std::string& vector_name, T (&v)[N]) + { + if (!valid()) + return false; + else if (!valid_symbol(vector_name)) + return false; + else if (symbol_exists(vector_name)) + return false; + else + return local_data().vector_store.add(vector_name,v); + } + + inline bool add_vector(const std::string& vector_name, T* v, const std::size_t& v_size) + { + if (!valid()) + return false; + else if (!valid_symbol(vector_name)) + return false; + else if (symbol_exists(vector_name)) + return false; + else if (0 == v_size) + return false; + else + return local_data().vector_store.add(vector_name, v, v_size); + } + + template + inline bool add_vector(const std::string& vector_name, std::vector& v) + { + if (!valid()) + return false; + else if (!valid_symbol(vector_name)) + return false; + else if (symbol_exists(vector_name)) + return false; + else if (0 == v.size()) + return false; + else + return local_data().vector_store.add(vector_name,v); + } + + inline bool add_vector(const std::string& vector_name, exprtk::vector_view& v) + { + if (!valid()) + return false; + else if (!valid_symbol(vector_name)) + return false; + else if (symbol_exists(vector_name)) + return false; + else if (0 == v.size()) + return false; + else + return local_data().vector_store.add(vector_name,v); + } + + inline bool remove_variable(const std::string& variable_name, const bool delete_node = true) + { + if (!valid()) + return false; + else + return local_data().variable_store.remove(variable_name, delete_node); + } + + #ifndef exprtk_disable_string_capabilities + inline bool remove_stringvar(const std::string& string_name) + { + if (!valid()) + return false; + else + return local_data().stringvar_store.remove(string_name); + } + #endif + + inline bool remove_function(const std::string& function_name) + { + if (!valid()) + return false; + else + return local_data().function_store.remove(function_name); + } + + inline bool remove_vararg_function(const std::string& vararg_function_name) + { + if (!valid()) + return false; + else + return local_data().vararg_function_store.remove(vararg_function_name); + } + + inline bool remove_vector(const std::string& vector_name) + { + if (!valid()) + return false; + else + return local_data().vector_store.remove(vector_name); + } + + inline bool add_constants() + { + return add_pi () && + add_epsilon () && + add_infinity() ; + } + + inline bool add_pi() + { + const typename details::numeric::details::number_type::type num_type; + static const T local_pi = details::numeric::details::const_pi_impl(num_type); + return add_constant("pi",local_pi); + } + + inline bool add_epsilon() + { + static const T local_epsilon = details::numeric::details::epsilon_type::value(); + return add_constant("epsilon",local_epsilon); + } + + inline bool add_infinity() + { + static const T local_infinity = std::numeric_limits::infinity(); + return add_constant("inf",local_infinity); + } + + template + inline bool add_package(Package& package) + { + return package.register_package(*this); + } + + template class Sequence> + inline std::size_t get_variable_list(Sequence,Allocator>& vlist) const + { + if (!valid()) + return 0; + else + return local_data().variable_store.get_list(vlist); + } + + template class Sequence> + inline std::size_t get_variable_list(Sequence& vlist) const + { + if (!valid()) + return 0; + else + return local_data().variable_store.get_list(vlist); + } + + #ifndef exprtk_disable_string_capabilities + template class Sequence> + inline std::size_t get_stringvar_list(Sequence,Allocator>& svlist) const + { + if (!valid()) + return 0; + else + return local_data().stringvar_store.get_list(svlist); + } + + template class Sequence> + inline std::size_t get_stringvar_list(Sequence& svlist) const + { + if (!valid()) + return 0; + else + return local_data().stringvar_store.get_list(svlist); + } + #endif + + template class Sequence> + inline std::size_t get_vector_list(Sequence& vlist) const + { + if (!valid()) + return 0; + else + return local_data().vector_store.get_list(vlist); + } + + inline bool symbol_exists(const std::string& symbol_name, const bool check_reserved_symb = true) const + { + /* + Function will return true if symbol_name exists as either a + reserved symbol, variable, stringvar, vector or function name + in any of the type stores. + */ + if (!valid()) + return false; + else if (local_data().variable_store.symbol_exists(symbol_name)) + return true; + #ifndef exprtk_disable_string_capabilities + else if (local_data().stringvar_store.symbol_exists(symbol_name)) + return true; + #endif + else if (local_data().vector_store.symbol_exists(symbol_name)) + return true; + else if (local_data().function_store.symbol_exists(symbol_name)) + return true; + else if (check_reserved_symb && local_data().is_reserved_symbol(symbol_name)) + return true; + else + return false; + } + + inline bool is_variable(const std::string& variable_name) const + { + if (!valid()) + return false; + else + return local_data().variable_store.symbol_exists(variable_name); + } + + #ifndef exprtk_disable_string_capabilities + inline bool is_stringvar(const std::string& stringvar_name) const + { + if (!valid()) + return false; + else + return local_data().stringvar_store.symbol_exists(stringvar_name); + } + + inline bool is_conststr_stringvar(const std::string& symbol_name) const + { + if (!valid()) + return false; + else if (!valid_symbol(symbol_name)) + return false; + else if (!local_data().stringvar_store.symbol_exists(symbol_name)) + return false; + + return ( + local_data().stringvar_store.symbol_exists(symbol_name) || + local_data().stringvar_store.is_constant (symbol_name) + ); + } + #endif + + inline bool is_function(const std::string& function_name) const + { + if (!valid()) + return false; + else + return local_data().function_store.symbol_exists(function_name); + } + + inline bool is_vararg_function(const std::string& vararg_function_name) const + { + if (!valid()) + return false; + else + return local_data().vararg_function_store.symbol_exists(vararg_function_name); + } + + inline bool is_vector(const std::string& vector_name) const + { + if (!valid()) + return false; + else + return local_data().vector_store.symbol_exists(vector_name); + } + + inline std::string get_variable_name(const expression_ptr& ptr) const + { + return local_data().variable_store.entity_name(ptr); + } + + inline std::string get_vector_name(const vector_holder_ptr& ptr) const + { + return local_data().vector_store.entity_name(ptr); + } + + #ifndef exprtk_disable_string_capabilities + inline std::string get_stringvar_name(const expression_ptr& ptr) const + { + return local_data().stringvar_store.entity_name(ptr); + } + + inline std::string get_conststr_stringvar_name(const expression_ptr& ptr) const + { + return local_data().stringvar_store.entity_name(ptr); + } + #endif + + inline bool valid() const + { + // Symbol table sanity check. + return control_block_ && control_block_->data_; + } + + inline void load_from(const symbol_table& st) + { + { + std::vector name_list; + + st.local_data().function_store.get_list(name_list); + + if (!name_list.empty()) + { + for (std::size_t i = 0; i < name_list.size(); ++i) + { + exprtk::ifunction& ifunc = *st.get_function(name_list[i]); + add_function(name_list[i],ifunc); + } + } + } + + { + std::vector name_list; + + st.local_data().vararg_function_store.get_list(name_list); + + if (!name_list.empty()) + { + for (std::size_t i = 0; i < name_list.size(); ++i) + { + exprtk::ivararg_function& ivafunc = *st.get_vararg_function(name_list[i]); + add_function(name_list[i],ivafunc); + } + } + } + + { + std::vector name_list; + + st.local_data().generic_function_store.get_list(name_list); + + if (!name_list.empty()) + { + for (std::size_t i = 0; i < name_list.size(); ++i) + { + exprtk::igeneric_function& ifunc = *st.get_generic_function(name_list[i]); + add_function(name_list[i],ifunc); + } + } + } + + { + std::vector name_list; + + st.local_data().string_function_store.get_list(name_list); + + if (!name_list.empty()) + { + for (std::size_t i = 0; i < name_list.size(); ++i) + { + exprtk::igeneric_function& ifunc = *st.get_string_function(name_list[i]); + add_function(name_list[i],ifunc); + } + } + } + + { + std::vector name_list; + + st.local_data().overload_function_store.get_list(name_list); + + if (!name_list.empty()) + { + for (std::size_t i = 0; i < name_list.size(); ++i) + { + exprtk::igeneric_function& ifunc = *st.get_overload_function(name_list[i]); + add_function(name_list[i],ifunc); + } + } + } + } + + private: + + inline bool valid_symbol(const std::string& symbol, const bool check_reserved_symb = true) const + { + if (symbol.empty()) + return false; + else if (!details::is_letter(symbol[0])) + return false; + else if (symbol.size() > 1) + { + for (std::size_t i = 1; i < symbol.size(); ++i) + { + if ( + !details::is_letter_or_digit(symbol[i]) && + ('_' != symbol[i]) + ) + { + if ((i < (symbol.size() - 1)) && ('.' == symbol[i])) + continue; + else + return false; + } + } + } + + return (check_reserved_symb) ? (!local_data().is_reserved_symbol(symbol)) : true; + } + + inline bool valid_function(const std::string& symbol) const + { + if (symbol.empty()) + return false; + else if (!details::is_letter(symbol[0])) + return false; + else if (symbol.size() > 1) + { + for (std::size_t i = 1; i < symbol.size(); ++i) + { + if ( + !details::is_letter_or_digit(symbol[i]) && + ('_' != symbol[i]) + ) + { + if ((i < (symbol.size() - 1)) && ('.' == symbol[i])) + continue; + else + return false; + } + } + } + + return true; + } + + typedef typename control_block::st_data local_data_t; + + inline local_data_t& local_data() + { + return *(control_block_->data_); + } + + inline const local_data_t& local_data() const + { + return *(control_block_->data_); + } + + control_block* control_block_; + + friend class parser; + }; // class symbol_table + + template + class function_compositor; + + template + class expression + { + private: + + typedef details::expression_node* expression_ptr; + typedef details::vector_holder* vector_holder_ptr; + typedef std::vector > symtab_list_t; + + struct control_block + { + enum data_type + { + e_unknown , + e_expr , + e_vecholder, + e_data , + e_vecdata , + e_string + }; + + struct data_pack + { + data_pack() + : pointer(0) + , type(e_unknown) + , size(0) + {} + + data_pack(void* ptr, const data_type dt, const std::size_t sz = 0) + : pointer(ptr) + , type(dt) + , size(sz) + {} + + void* pointer; + data_type type; + std::size_t size; + }; + + typedef std::vector local_data_list_t; + typedef results_context results_context_t; + typedef control_block* cntrl_blck_ptr_t; + + control_block() + : ref_count(0) + , expr (0) + , results (0) + , retinv_null(false) + , return_invoked(&retinv_null) + {} + + explicit control_block(expression_ptr e) + : ref_count(1) + , expr (e) + , results (0) + , retinv_null(false) + , return_invoked(&retinv_null) + {} + + ~control_block() + { + if (expr && details::branch_deletable(expr)) + { + destroy_node(expr); + } + + if (!local_data_list.empty()) + { + for (std::size_t i = 0; i < local_data_list.size(); ++i) + { + switch (local_data_list[i].type) + { + case e_expr : delete reinterpret_cast(local_data_list[i].pointer); + break; + + case e_vecholder : delete reinterpret_cast(local_data_list[i].pointer); + break; + + case e_data : delete reinterpret_cast(local_data_list[i].pointer); + break; + + case e_vecdata : delete [] reinterpret_cast(local_data_list[i].pointer); + break; + + case e_string : delete reinterpret_cast(local_data_list[i].pointer); + break; + + default : break; + } + } + } + + if (results) + { + delete results; + } + } + + static inline cntrl_blck_ptr_t create(expression_ptr e) + { + return new control_block(e); + } + + static inline void destroy(cntrl_blck_ptr_t& cntrl_blck) + { + if (cntrl_blck) + { + if ( + (0 != cntrl_blck->ref_count) && + (0 == --cntrl_blck->ref_count) + ) + { + delete cntrl_blck; + } + + cntrl_blck = 0; + } + } + + std::size_t ref_count; + expression_ptr expr; + local_data_list_t local_data_list; + results_context_t* results; + bool retinv_null; + bool* return_invoked; + + friend class function_compositor; + }; + + public: + + expression() + : control_block_(0) + { + set_expression(new details::null_node()); + } + + expression(const expression& e) + : control_block_ (e.control_block_ ) + , symbol_table_list_(e.symbol_table_list_) + { + control_block_->ref_count++; + } + + explicit expression(const symbol_table& symbol_table) + : control_block_(0) + { + set_expression(new details::null_node()); + symbol_table_list_.push_back(symbol_table); + } + + inline expression& operator=(const expression& e) + { + if (this != &e) + { + if (control_block_) + { + if ( + (0 != control_block_->ref_count) && + (0 == --control_block_->ref_count) + ) + { + delete control_block_; + } + + control_block_ = 0; + } + + control_block_ = e.control_block_; + control_block_->ref_count++; + symbol_table_list_ = e.symbol_table_list_; + } + + return *this; + } + + inline bool operator==(const expression& e) const + { + return (this == &e); + } + + inline bool operator!() const + { + return ( + (0 == control_block_ ) || + (0 == control_block_->expr) + ); + } + + inline expression& release() + { + exprtk::details::dump_ptr("expression::release", this); + control_block::destroy(control_block_); + + return (*this); + } + + ~expression() + { + control_block::destroy(control_block_); + } + + inline T value() const + { + assert(control_block_ ); + assert(control_block_->expr); + + return control_block_->expr->value(); + } + + inline T operator() () const + { + return value(); + } + + inline operator T() const + { + return value(); + } + + inline operator bool() const + { + return details::is_true(value()); + } + + inline void register_symbol_table(symbol_table& st) + { + for (std::size_t i = 0; i < symbol_table_list_.size(); ++i) + { + if (&st == &symbol_table_list_[i]) + { + return; + } + } + + symbol_table_list_.push_back(st); + } + + inline const symbol_table& get_symbol_table(const std::size_t& index = 0) const + { + return symbol_table_list_[index]; + } + + inline symbol_table& get_symbol_table(const std::size_t& index = 0) + { + return symbol_table_list_[index]; + } + + typedef results_context results_context_t; + + inline const results_context_t& results() const + { + if (control_block_->results) + return (*control_block_->results); + else + { + static const results_context_t null_results; + return null_results; + } + } + + inline bool return_invoked() const + { + return (*control_block_->return_invoked); + } + + private: + + inline symtab_list_t get_symbol_table_list() const + { + return symbol_table_list_; + } + + inline void set_expression(const expression_ptr expr) + { + if (expr) + { + if (control_block_) + { + if (0 == --control_block_->ref_count) + { + delete control_block_; + } + } + + control_block_ = control_block::create(expr); + } + } + + inline void register_local_var(expression_ptr expr) + { + if (expr) + { + if (control_block_) + { + control_block_-> + local_data_list.push_back( + typename expression::control_block:: + data_pack(reinterpret_cast(expr), + control_block::e_expr)); + } + } + } + + inline void register_local_var(vector_holder_ptr vec_holder) + { + if (vec_holder) + { + if (control_block_) + { + control_block_-> + local_data_list.push_back( + typename expression::control_block:: + data_pack(reinterpret_cast(vec_holder), + control_block::e_vecholder)); + } + } + } + + inline void register_local_data(void* data, const std::size_t& size = 0, const std::size_t data_mode = 0) + { + if (data) + { + if (control_block_) + { + typename control_block::data_type dt = control_block::e_data; + + switch (data_mode) + { + case 0 : dt = control_block::e_data; break; + case 1 : dt = control_block::e_vecdata; break; + case 2 : dt = control_block::e_string; break; + } + + control_block_-> + local_data_list.push_back( + typename expression::control_block:: + data_pack(reinterpret_cast(data), dt, size)); + } + } + } + + inline const typename control_block::local_data_list_t& local_data_list() + { + if (control_block_) + { + return control_block_->local_data_list; + } + else + { + static typename control_block::local_data_list_t null_local_data_list; + return null_local_data_list; + } + } + + inline void register_return_results(results_context_t* rc) + { + if (control_block_ && rc) + { + control_block_->results = rc; + } + } + + inline void set_retinvk(bool* retinvk_ptr) + { + if (control_block_) + { + control_block_->return_invoked = retinvk_ptr; + } + } + + control_block* control_block_; + symtab_list_t symbol_table_list_; + + friend class parser; + friend class expression_helper; + friend class function_compositor; + }; // class expression + + template + class expression_helper + { + public: + + static inline bool is_constant(const expression& expr) + { + return details::is_constant_node(expr.control_block_->expr); + } + + static inline bool is_variable(const expression& expr) + { + return details::is_variable_node(expr.control_block_->expr); + } + + static inline bool is_unary(const expression& expr) + { + return details::is_unary_node(expr.control_block_->expr); + } + + static inline bool is_binary(const expression& expr) + { + return details::is_binary_node(expr.control_block_->expr); + } + + static inline bool is_function(const expression& expr) + { + return details::is_function(expr.control_block_->expr); + } + + static inline bool is_null(const expression& expr) + { + return details::is_null_node(expr.control_block_->expr); + } + }; + + template + inline bool is_valid(const expression& expr) + { + return !expression_helper::is_null(expr); + } + + namespace parser_error + { + enum error_mode + { + e_unknown = 0, + e_syntax = 1, + e_token = 2, + e_numeric = 4, + e_symtab = 5, + e_lexer = 6, + e_helper = 7, + e_parser = 8 + }; + + struct type + { + type() + : mode(parser_error::e_unknown) + , line_no (0) + , column_no(0) + {} + + lexer::token token; + error_mode mode; + std::string diagnostic; + std::string src_location; + std::string error_line; + std::size_t line_no; + std::size_t column_no; + }; + + inline type make_error(const error_mode mode, + const std::string& diagnostic = "", + const std::string& src_location = "") + { + type t; + t.mode = mode; + t.token.type = lexer::token::e_error; + t.diagnostic = diagnostic; + t.src_location = src_location; + exprtk_debug(("%s\n",diagnostic .c_str())); + return t; + } + + inline type make_error(const error_mode mode, + const lexer::token& tk, + const std::string& diagnostic = "", + const std::string& src_location = "") + { + type t; + t.mode = mode; + t.token = tk; + t.diagnostic = diagnostic; + t.src_location = src_location; + exprtk_debug(("%s\n",diagnostic .c_str())); + return t; + } + + inline std::string to_str(error_mode mode) + { + switch (mode) + { + case e_unknown : return std::string("Unknown Error"); + case e_syntax : return std::string("Syntax Error" ); + case e_token : return std::string("Token Error" ); + case e_numeric : return std::string("Numeric Error"); + case e_symtab : return std::string("Symbol Error" ); + case e_lexer : return std::string("Lexer Error" ); + case e_helper : return std::string("Helper Error" ); + case e_parser : return std::string("Parser Error" ); + default : return std::string("Unknown Error"); + } + } + + inline bool update_error(type& error, const std::string& expression) + { + if ( + expression.empty() || + (error.token.position > expression.size()) || + (std::numeric_limits::max() == error.token.position) + ) + { + return false; + } + + std::size_t error_line_start = 0; + + for (std::size_t i = error.token.position; i > 0; --i) + { + const details::char_t c = expression[i]; + + if (('\n' == c) || ('\r' == c)) + { + error_line_start = i + 1; + break; + } + } + + std::size_t next_nl_position = std::min(expression.size(), + expression.find_first_of('\n',error.token.position + 1)); + + error.column_no = error.token.position - error_line_start; + error.error_line = expression.substr(error_line_start, + next_nl_position - error_line_start); + + error.line_no = 0; + + for (std::size_t i = 0; i < next_nl_position; ++i) + { + if ('\n' == expression[i]) + ++error.line_no; + } + + return true; + } + + inline void dump_error(const type& error) + { + printf("Position: %02d Type: [%s] Msg: %s\n", + static_cast(error.token.position), + exprtk::parser_error::to_str(error.mode).c_str(), + error.diagnostic.c_str()); + } + } + + namespace details + { + template + inline void disable_type_checking(Parser& p) + { + p.state_.type_check_enabled = false; + } + } + + template + class parser : public lexer::parser_helper + { + private: + + enum precedence_level + { + e_level00, e_level01, e_level02, e_level03, e_level04, + e_level05, e_level06, e_level07, e_level08, e_level09, + e_level10, e_level11, e_level12, e_level13, e_level14 + }; + + typedef const T& cref_t; + typedef const T const_t; + typedef ifunction F; + typedef ivararg_function VAF; + typedef igeneric_function GF; + typedef ifunction ifunction_t; + typedef ivararg_function ivararg_function_t; + typedef igeneric_function igeneric_function_t; + typedef details::expression_node expression_node_t; + typedef details::literal_node literal_node_t; + typedef details::unary_node unary_node_t; + typedef details::binary_node binary_node_t; + typedef details::trinary_node trinary_node_t; + typedef details::quaternary_node quaternary_node_t; + typedef details::conditional_node conditional_node_t; + typedef details::cons_conditional_node cons_conditional_node_t; + typedef details::while_loop_node while_loop_node_t; + typedef details::repeat_until_loop_node repeat_until_loop_node_t; + typedef details::for_loop_node for_loop_node_t; + typedef details::while_loop_rtc_node while_loop_rtc_node_t; + typedef details::repeat_until_loop_rtc_node repeat_until_loop_rtc_node_t; + typedef details::for_loop_rtc_node for_loop_rtc_node_t; + #ifndef exprtk_disable_break_continue + typedef details::while_loop_bc_node while_loop_bc_node_t; + typedef details::repeat_until_loop_bc_node repeat_until_loop_bc_node_t; + typedef details::for_loop_bc_node for_loop_bc_node_t; + typedef details::while_loop_bc_rtc_node while_loop_bc_rtc_node_t; + typedef details::repeat_until_loop_bc_rtc_node repeat_until_loop_bc_rtc_node_t; + typedef details::for_loop_bc_rtc_node for_loop_bc_rtc_node_t; + #endif + typedef details::switch_node switch_node_t; + typedef details::variable_node variable_node_t; + typedef details::vector_elem_node vector_elem_node_t; + typedef details::rebasevector_elem_node rebasevector_elem_node_t; + typedef details::rebasevector_celem_node rebasevector_celem_node_t; + typedef details::vector_node vector_node_t; + typedef details::range_pack range_t; + #ifndef exprtk_disable_string_capabilities + typedef details::stringvar_node stringvar_node_t; + typedef details::string_literal_node string_literal_node_t; + typedef details::string_range_node string_range_node_t; + typedef details::const_string_range_node const_string_range_node_t; + typedef details::generic_string_range_node generic_string_range_node_t; + typedef details::string_concat_node string_concat_node_t; + typedef details::assignment_string_node assignment_string_node_t; + typedef details::assignment_string_range_node assignment_string_range_node_t; + typedef details::conditional_string_node conditional_string_node_t; + typedef details::cons_conditional_str_node cons_conditional_str_node_t; + #endif + typedef details::assignment_node assignment_node_t; + typedef details::assignment_vec_elem_node assignment_vec_elem_node_t; + typedef details::assignment_rebasevec_elem_node assignment_rebasevec_elem_node_t; + typedef details::assignment_rebasevec_celem_node assignment_rebasevec_celem_node_t; + typedef details::assignment_vec_node assignment_vec_node_t; + typedef details::assignment_vecvec_node assignment_vecvec_node_t; + typedef details::conditional_vector_node conditional_vector_node_t; + typedef details::scand_node scand_node_t; + typedef details::scor_node scor_node_t; + typedef lexer::token token_t; + typedef expression_node_t* expression_node_ptr; + typedef expression expression_t; + typedef symbol_table symbol_table_t; + typedef typename expression::symtab_list_t symbol_table_list_t; + typedef details::vector_holder* vector_holder_ptr; + + typedef typename details::functor_t functor_t; + typedef typename functor_t::qfunc_t quaternary_functor_t; + typedef typename functor_t::tfunc_t trinary_functor_t; + typedef typename functor_t::bfunc_t binary_functor_t; + typedef typename functor_t::ufunc_t unary_functor_t; + + typedef details::operator_type operator_t; + + typedef std::map unary_op_map_t; + typedef std::map binary_op_map_t; + typedef std::map trinary_op_map_t; + + typedef std::map > sf3_map_t; + typedef std::map > sf4_map_t; + + typedef std::map inv_binary_op_map_t; + typedef std::multimap base_ops_map_t; + typedef std::set disabled_func_set_t; + + typedef details::T0oT1_define vov_t; + typedef details::T0oT1_define cov_t; + typedef details::T0oT1_define voc_t; + + typedef details::T0oT1oT2_define vovov_t; + typedef details::T0oT1oT2_define vovoc_t; + typedef details::T0oT1oT2_define vocov_t; + typedef details::T0oT1oT2_define covov_t; + typedef details::T0oT1oT2_define covoc_t; + typedef details::T0oT1oT2_define cocov_t; + typedef details::T0oT1oT2_define vococ_t; + + typedef details::T0oT1oT2oT3_define vovovov_t; + typedef details::T0oT1oT2oT3_define vovovoc_t; + typedef details::T0oT1oT2oT3_define vovocov_t; + typedef details::T0oT1oT2oT3_define vocovov_t; + typedef details::T0oT1oT2oT3_define covovov_t; + + typedef details::T0oT1oT2oT3_define covocov_t; + typedef details::T0oT1oT2oT3_define vocovoc_t; + typedef details::T0oT1oT2oT3_define covovoc_t; + typedef details::T0oT1oT2oT3_define vococov_t; + + typedef results_context results_context_t; + + typedef parser_helper prsrhlpr_t; + + struct scope_element + { + enum element_type + { + e_none , + e_variable, + e_vector , + e_vecelem , + e_string + }; + + typedef details::vector_holder vector_holder_t; + typedef variable_node_t* variable_node_ptr; + typedef vector_holder_t* vector_holder_ptr; + typedef expression_node_t* expression_node_ptr; + #ifndef exprtk_disable_string_capabilities + typedef stringvar_node_t* stringvar_node_ptr; + #endif + + scope_element() + : name("???") + , size (std::numeric_limits::max()) + , index(std::numeric_limits::max()) + , depth(std::numeric_limits::max()) + , ref_count(0) + , ip_index (0) + , type (e_none) + , active(false) + , data (0) + , var_node (0) + , vec_node (0) + #ifndef exprtk_disable_string_capabilities + , str_node(0) + #endif + {} + + bool operator < (const scope_element& se) const + { + if (ip_index < se.ip_index) + return true; + else if (ip_index > se.ip_index) + return false; + else if (depth < se.depth) + return true; + else if (depth > se.depth) + return false; + else if (index < se.index) + return true; + else if (index > se.index) + return false; + else + return (name < se.name); + } + + void clear() + { + name = "???"; + size = std::numeric_limits::max(); + index = std::numeric_limits::max(); + depth = std::numeric_limits::max(); + type = e_none; + active = false; + ref_count = 0; + ip_index = 0; + data = 0; + var_node = 0; + vec_node = 0; + #ifndef exprtk_disable_string_capabilities + str_node = 0; + #endif + } + + std::string name; + std::size_t size; + std::size_t index; + std::size_t depth; + std::size_t ref_count; + std::size_t ip_index; + element_type type; + bool active; + void* data; + expression_node_ptr var_node; + vector_holder_ptr vec_node; + #ifndef exprtk_disable_string_capabilities + stringvar_node_ptr str_node; + #endif + }; + + class scope_element_manager + { + public: + + typedef expression_node_t* expression_node_ptr; + typedef variable_node_t* variable_node_ptr; + typedef parser parser_t; + + explicit scope_element_manager(parser& p) + : parser_(p) + , input_param_cnt_(0) + {} + + inline std::size_t size() const + { + return element_.size(); + } + + inline bool empty() const + { + return element_.empty(); + } + + inline scope_element& get_element(const std::size_t& index) + { + if (index < element_.size()) + return element_[index]; + else + return null_element_; + } + + inline scope_element& get_element(const std::string& var_name, + const std::size_t index = std::numeric_limits::max()) + { + const std::size_t current_depth = parser_.state_.scope_depth; + + for (std::size_t i = 0; i < element_.size(); ++i) + { + scope_element& se = element_[i]; + + if (se.depth > current_depth) + continue; + else if ( + details::imatch(se.name, var_name) && + (se.index == index) + ) + return se; + } + + return null_element_; + } + + inline scope_element& get_active_element(const std::string& var_name, + const std::size_t index = std::numeric_limits::max()) + { + const std::size_t current_depth = parser_.state_.scope_depth; + + for (std::size_t i = 0; i < element_.size(); ++i) + { + scope_element& se = element_[i]; + + if (se.depth > current_depth) + continue; + else if ( + details::imatch(se.name, var_name) && + (se.index == index) && + (se.active) + ) + return se; + } + + return null_element_; + } + + inline bool add_element(const scope_element& se) + { + for (std::size_t i = 0; i < element_.size(); ++i) + { + scope_element& cse = element_[i]; + + if ( + details::imatch(cse.name, se.name) && + (cse.depth <= se.depth) && + (cse.index == se.index) && + (cse.size == se.size ) && + (cse.type == se.type ) && + (cse.active) + ) + return false; + } + + element_.push_back(se); + std::sort(element_.begin(),element_.end()); + + return true; + } + + inline void deactivate(const std::size_t& scope_depth) + { + exprtk_debug(("deactivate() - Scope depth: %d\n", + static_cast(parser_.state_.scope_depth))); + + for (std::size_t i = 0; i < element_.size(); ++i) + { + scope_element& se = element_[i]; + + if (se.active && (se.depth >= scope_depth)) + { + exprtk_debug(("deactivate() - element[%02d] '%s'\n", + static_cast(i), + se.name.c_str())); + + se.active = false; + } + } + } + + inline void free_element(scope_element& se) + { + exprtk_debug(("free_element() - se[%s]\n", se.name.c_str())); + + switch (se.type) + { + case scope_element::e_variable : delete reinterpret_cast(se.data); + delete se.var_node; + break; + + case scope_element::e_vector : delete[] reinterpret_cast(se.data); + delete se.vec_node; + break; + + case scope_element::e_vecelem : delete se.var_node; + break; + + #ifndef exprtk_disable_string_capabilities + case scope_element::e_string : delete reinterpret_cast(se.data); + delete se.str_node; + break; + #endif + + default : return; + } + + se.clear(); + } + + inline void cleanup() + { + for (std::size_t i = 0; i < element_.size(); ++i) + { + free_element(element_[i]); + } + + element_.clear(); + + input_param_cnt_ = 0; + } + + inline std::size_t next_ip_index() + { + return ++input_param_cnt_; + } + + inline expression_node_ptr get_variable(const T& v) + { + for (std::size_t i = 0; i < element_.size(); ++i) + { + scope_element& se = element_[i]; + + if ( + se.active && + se.var_node && + details::is_variable_node(se.var_node) + ) + { + variable_node_ptr vn = reinterpret_cast(se.var_node); + + if (&(vn->ref()) == (&v)) + { + return se.var_node; + } + } + } + + return expression_node_ptr(0); + } + + private: + + scope_element_manager(const scope_element_manager&) exprtk_delete; + scope_element_manager& operator=(const scope_element_manager&) exprtk_delete; + + parser_t& parser_; + std::vector element_; + scope_element null_element_; + std::size_t input_param_cnt_; + }; + + class scope_handler + { + public: + + typedef parser parser_t; + + explicit scope_handler(parser& p) + : parser_(p) + { + parser_.state_.scope_depth++; + #ifdef exprtk_enable_debugging + const std::string depth(2 * parser_.state_.scope_depth,'-'); + exprtk_debug(("%s> Scope Depth: %02d\n", + depth.c_str(), + static_cast(parser_.state_.scope_depth))); + #endif + } + + ~scope_handler() + { + parser_.sem_.deactivate(parser_.state_.scope_depth); + parser_.state_.scope_depth--; + #ifdef exprtk_enable_debugging + const std::string depth(2 * parser_.state_.scope_depth,'-'); + exprtk_debug(("<%s Scope Depth: %02d\n", + depth.c_str(), + static_cast(parser_.state_.scope_depth))); + #endif + } + + private: + + scope_handler(const scope_handler&) exprtk_delete; + scope_handler& operator=(const scope_handler&) exprtk_delete; + + parser_t& parser_; + }; + + class stack_limit_handler + { + public: + + typedef parser parser_t; + + explicit stack_limit_handler(parser& p) + : parser_(p) + , limit_exceeded_(false) + { + if (++parser_.state_.stack_depth > parser_.settings_.max_stack_depth_) + { + limit_exceeded_ = true; + parser_.set_error( + make_error(parser_error::e_parser, + "ERR000 - Current stack depth " + details::to_str(parser_.state_.stack_depth) + + " exceeds maximum allowed stack depth of " + details::to_str(parser_.settings_.max_stack_depth_), + exprtk_error_location)); + } + } + + ~stack_limit_handler() + { + parser_.state_.stack_depth--; + } + + bool operator!() + { + return limit_exceeded_; + } + + private: + + stack_limit_handler(const stack_limit_handler&) exprtk_delete; + stack_limit_handler& operator=(const stack_limit_handler&) exprtk_delete; + + parser_t& parser_; + bool limit_exceeded_; + }; + + struct symtab_store + { + symbol_table_list_t symtab_list_; + + typedef typename symbol_table_t::local_data_t local_data_t; + typedef typename symbol_table_t::variable_ptr variable_ptr; + typedef typename symbol_table_t::function_ptr function_ptr; + #ifndef exprtk_disable_string_capabilities + typedef typename symbol_table_t::stringvar_ptr stringvar_ptr; + #endif + typedef typename symbol_table_t::vector_holder_ptr vector_holder_ptr; + typedef typename symbol_table_t::vararg_function_ptr vararg_function_ptr; + typedef typename symbol_table_t::generic_function_ptr generic_function_ptr; + + inline bool empty() const + { + return symtab_list_.empty(); + } + + inline void clear() + { + symtab_list_.clear(); + } + + inline bool valid() const + { + if (!empty()) + { + for (std::size_t i = 0; i < symtab_list_.size(); ++i) + { + if (symtab_list_[i].valid()) + return true; + } + } + + return false; + } + + inline bool valid_symbol(const std::string& symbol) const + { + if (!symtab_list_.empty()) + return symtab_list_[0].valid_symbol(symbol); + else + return false; + } + + inline bool valid_function_name(const std::string& symbol) const + { + if (!symtab_list_.empty()) + return symtab_list_[0].valid_function(symbol); + else + return false; + } + + inline variable_ptr get_variable(const std::string& variable_name) const + { + if (!valid_symbol(variable_name)) + return reinterpret_cast(0); + + variable_ptr result = reinterpret_cast(0); + + for (std::size_t i = 0; i < symtab_list_.size(); ++i) + { + if (!symtab_list_[i].valid()) + continue; + else + result = local_data(i) + .variable_store.get(variable_name); + + if (result) break; + } + + return result; + } + + inline variable_ptr get_variable(const T& var_ref) const + { + variable_ptr result = reinterpret_cast(0); + + for (std::size_t i = 0; i < symtab_list_.size(); ++i) + { + if (!symtab_list_[i].valid()) + continue; + else + result = local_data(i).variable_store + .get_from_varptr(reinterpret_cast(&var_ref)); + + if (result) break; + } + + return result; + } + + #ifndef exprtk_disable_string_capabilities + inline stringvar_ptr get_stringvar(const std::string& string_name) const + { + if (!valid_symbol(string_name)) + return reinterpret_cast(0); + + stringvar_ptr result = reinterpret_cast(0); + + for (std::size_t i = 0; i < symtab_list_.size(); ++i) + { + if (!symtab_list_[i].valid()) + continue; + else + result = local_data(i) + .stringvar_store.get(string_name); + + if (result) break; + } + + return result; + } + #endif + + inline function_ptr get_function(const std::string& function_name) const + { + if (!valid_function_name(function_name)) + return reinterpret_cast(0); + + function_ptr result = reinterpret_cast(0); + + for (std::size_t i = 0; i < symtab_list_.size(); ++i) + { + if (!symtab_list_[i].valid()) + continue; + else + result = local_data(i) + .function_store.get(function_name); + + if (result) break; + } + + return result; + } + + inline vararg_function_ptr get_vararg_function(const std::string& vararg_function_name) const + { + if (!valid_function_name(vararg_function_name)) + return reinterpret_cast(0); + + vararg_function_ptr result = reinterpret_cast(0); + + for (std::size_t i = 0; i < symtab_list_.size(); ++i) + { + if (!symtab_list_[i].valid()) + continue; + else + result = local_data(i) + .vararg_function_store.get(vararg_function_name); + + if (result) break; + } + + return result; + } + + inline generic_function_ptr get_generic_function(const std::string& function_name) const + { + if (!valid_function_name(function_name)) + return reinterpret_cast(0); + + generic_function_ptr result = reinterpret_cast(0); + + for (std::size_t i = 0; i < symtab_list_.size(); ++i) + { + if (!symtab_list_[i].valid()) + continue; + else + result = local_data(i) + .generic_function_store.get(function_name); + + if (result) break; + } + + return result; + } + + inline generic_function_ptr get_string_function(const std::string& function_name) const + { + if (!valid_function_name(function_name)) + return reinterpret_cast(0); + + generic_function_ptr result = reinterpret_cast(0); + + for (std::size_t i = 0; i < symtab_list_.size(); ++i) + { + if (!symtab_list_[i].valid()) + continue; + else + result = + local_data(i).string_function_store.get(function_name); + + if (result) break; + } + + return result; + } + + inline generic_function_ptr get_overload_function(const std::string& function_name) const + { + if (!valid_function_name(function_name)) + return reinterpret_cast(0); + + generic_function_ptr result = reinterpret_cast(0); + + for (std::size_t i = 0; i < symtab_list_.size(); ++i) + { + if (!symtab_list_[i].valid()) + continue; + else + result = + local_data(i).overload_function_store.get(function_name); + + if (result) break; + } + + return result; + } + + inline vector_holder_ptr get_vector(const std::string& vector_name) const + { + if (!valid_symbol(vector_name)) + return reinterpret_cast(0); + + vector_holder_ptr result = reinterpret_cast(0); + + for (std::size_t i = 0; i < symtab_list_.size(); ++i) + { + if (!symtab_list_[i].valid()) + continue; + else + result = + local_data(i).vector_store.get(vector_name); + + if (result) break; + } + + return result; + } + + inline bool is_constant_node(const std::string& symbol_name) const + { + if (!valid_symbol(symbol_name)) + return false; + + for (std::size_t i = 0; i < symtab_list_.size(); ++i) + { + if (!symtab_list_[i].valid()) + continue; + else if (local_data(i).variable_store.is_constant(symbol_name)) + return true; + } + + return false; + } + + #ifndef exprtk_disable_string_capabilities + inline bool is_constant_string(const std::string& symbol_name) const + { + if (!valid_symbol(symbol_name)) + return false; + + for (std::size_t i = 0; i < symtab_list_.size(); ++i) + { + if (!symtab_list_[i].valid()) + continue; + else if (!local_data(i).stringvar_store.symbol_exists(symbol_name)) + continue; + else if (local_data(i).stringvar_store.is_constant(symbol_name)) + return true; + } + + return false; + } + #endif + + inline bool symbol_exists(const std::string& symbol) const + { + for (std::size_t i = 0; i < symtab_list_.size(); ++i) + { + if (!symtab_list_[i].valid()) + continue; + else if (symtab_list_[i].symbol_exists(symbol)) + return true; + } + + return false; + } + + inline bool is_variable(const std::string& variable_name) const + { + for (std::size_t i = 0; i < symtab_list_.size(); ++i) + { + if (!symtab_list_[i].valid()) + continue; + else if ( + symtab_list_[i].local_data().variable_store + .symbol_exists(variable_name) + ) + return true; + } + + return false; + } + + #ifndef exprtk_disable_string_capabilities + inline bool is_stringvar(const std::string& stringvar_name) const + { + for (std::size_t i = 0; i < symtab_list_.size(); ++i) + { + if (!symtab_list_[i].valid()) + continue; + else if ( + symtab_list_[i].local_data().stringvar_store + .symbol_exists(stringvar_name) + ) + return true; + } + + return false; + } + + inline bool is_conststr_stringvar(const std::string& symbol_name) const + { + for (std::size_t i = 0; i < symtab_list_.size(); ++i) + { + if (!symtab_list_[i].valid()) + continue; + else if ( + symtab_list_[i].local_data().stringvar_store + .symbol_exists(symbol_name) + ) + { + return ( + local_data(i).stringvar_store.symbol_exists(symbol_name) || + local_data(i).stringvar_store.is_constant (symbol_name) + ); + + } + } + + return false; + } + #endif + + inline bool is_function(const std::string& function_name) const + { + for (std::size_t i = 0; i < symtab_list_.size(); ++i) + { + if (!symtab_list_[i].valid()) + continue; + else if ( + local_data(i).vararg_function_store + .symbol_exists(function_name) + ) + return true; + } + + return false; + } + + inline bool is_vararg_function(const std::string& vararg_function_name) const + { + for (std::size_t i = 0; i < symtab_list_.size(); ++i) + { + if (!symtab_list_[i].valid()) + continue; + else if ( + local_data(i).vararg_function_store + .symbol_exists(vararg_function_name) + ) + return true; + } + + return false; + } + + inline bool is_vector(const std::string& vector_name) const + { + for (std::size_t i = 0; i < symtab_list_.size(); ++i) + { + if (!symtab_list_[i].valid()) + continue; + else if ( + local_data(i).vector_store + .symbol_exists(vector_name) + ) + return true; + } + + return false; + } + + inline std::string get_variable_name(const expression_node_ptr& ptr) const + { + return local_data().variable_store.entity_name(ptr); + } + + inline std::string get_vector_name(const vector_holder_ptr& ptr) const + { + return local_data().vector_store.entity_name(ptr); + } + + #ifndef exprtk_disable_string_capabilities + inline std::string get_stringvar_name(const expression_node_ptr& ptr) const + { + return local_data().stringvar_store.entity_name(ptr); + } + + inline std::string get_conststr_stringvar_name(const expression_node_ptr& ptr) const + { + return local_data().stringvar_store.entity_name(ptr); + } + #endif + + inline local_data_t& local_data(const std::size_t& index = 0) + { + return symtab_list_[index].local_data(); + } + + inline const local_data_t& local_data(const std::size_t& index = 0) const + { + return symtab_list_[index].local_data(); + } + + inline symbol_table_t& get_symbol_table(const std::size_t& index = 0) + { + return symtab_list_[index]; + } + }; + + struct parser_state + { + parser_state() + : type_check_enabled(true) + { + reset(); + } + + void reset() + { + parsing_return_stmt = false; + parsing_break_stmt = false; + return_stmt_present = false; + side_effect_present = false; + scope_depth = 0; + stack_depth = 0; + parsing_loop_stmt_count = 0; + } + + #ifndef exprtk_enable_debugging + void activate_side_effect(const std::string&) + #else + void activate_side_effect(const std::string& source) + #endif + { + if (!side_effect_present) + { + side_effect_present = true; + + exprtk_debug(("activate_side_effect() - caller: %s\n",source.c_str())); + } + } + + bool parsing_return_stmt; + bool parsing_break_stmt; + bool return_stmt_present; + bool side_effect_present; + bool type_check_enabled; + std::size_t scope_depth; + std::size_t stack_depth; + std::size_t parsing_loop_stmt_count; + }; + + public: + + struct unknown_symbol_resolver + { + + enum usr_symbol_type + { + e_usr_unknown_type = 0, + e_usr_variable_type = 1, + e_usr_constant_type = 2 + }; + + enum usr_mode + { + e_usrmode_default = 0, + e_usrmode_extended = 1 + }; + + usr_mode mode; + + unknown_symbol_resolver(const usr_mode m = e_usrmode_default) + : mode(m) + {} + + virtual ~unknown_symbol_resolver() {} + + virtual bool process(const std::string& /*unknown_symbol*/, + usr_symbol_type& st, + T& default_value, + std::string& error_message) + { + if (e_usrmode_default != mode) + return false; + + st = e_usr_variable_type; + default_value = T(0); + error_message.clear(); + + return true; + } + + virtual bool process(const std::string& /* unknown_symbol */, + symbol_table_t& /* symbol_table */, + std::string& /* error_message */) + { + return false; + } + }; + + enum collect_type + { + e_ct_none = 0, + e_ct_variables = 1, + e_ct_functions = 2, + e_ct_assignments = 4 + }; + + enum symbol_type + { + e_st_unknown = 0, + e_st_variable = 1, + e_st_vector = 2, + e_st_vecelem = 3, + e_st_string = 4, + e_st_function = 5, + e_st_local_variable = 6, + e_st_local_vector = 7, + e_st_local_string = 8 + }; + + class dependent_entity_collector + { + public: + + typedef std::pair symbol_t; + typedef std::vector symbol_list_t; + + dependent_entity_collector(const std::size_t options = e_ct_none) + : options_(options) + , collect_variables_ ((options_ & e_ct_variables ) == e_ct_variables ) + , collect_functions_ ((options_ & e_ct_functions ) == e_ct_functions ) + , collect_assignments_((options_ & e_ct_assignments) == e_ct_assignments) + , return_present_ (false) + , final_stmt_return_(false) + {} + + template class Sequence> + inline std::size_t symbols(Sequence& symbols_list) + { + if (!collect_variables_ && !collect_functions_) + return 0; + else if (symbol_name_list_.empty()) + return 0; + + for (std::size_t i = 0; i < symbol_name_list_.size(); ++i) + { + details::case_normalise(symbol_name_list_[i].first); + } + + std::sort(symbol_name_list_.begin(),symbol_name_list_.end()); + + std::unique_copy(symbol_name_list_.begin(), + symbol_name_list_.end (), + std::back_inserter(symbols_list)); + + return symbols_list.size(); + } + + template class Sequence> + inline std::size_t assignment_symbols(Sequence& assignment_list) + { + if (!collect_assignments_) + return 0; + else if (assignment_name_list_.empty()) + return 0; + + for (std::size_t i = 0; i < assignment_name_list_.size(); ++i) + { + details::case_normalise(assignment_name_list_[i].first); + } + + std::sort(assignment_name_list_.begin(),assignment_name_list_.end()); + + std::unique_copy(assignment_name_list_.begin(), + assignment_name_list_.end (), + std::back_inserter(assignment_list)); + + return assignment_list.size(); + } + + void clear() + { + symbol_name_list_ .clear(); + assignment_name_list_.clear(); + retparam_list_ .clear(); + return_present_ = false; + final_stmt_return_ = false; + } + + bool& collect_variables() + { + return collect_variables_; + } + + bool& collect_functions() + { + return collect_functions_; + } + + bool& collect_assignments() + { + return collect_assignments_; + } + + bool return_present() const + { + return return_present_; + } + + bool final_stmt_return() const + { + return final_stmt_return_; + } + + typedef std::vector retparam_list_t; + + retparam_list_t return_param_type_list() const + { + return retparam_list_; + } + + private: + + inline void add_symbol(const std::string& symbol, const symbol_type st) + { + switch (st) + { + case e_st_variable : + case e_st_vector : + case e_st_string : + case e_st_local_variable : + case e_st_local_vector : + case e_st_local_string : if (collect_variables_) + symbol_name_list_ + .push_back(std::make_pair(symbol, st)); + break; + + case e_st_function : if (collect_functions_) + symbol_name_list_ + .push_back(std::make_pair(symbol, st)); + break; + + default : return; + } + } + + inline void add_assignment(const std::string& symbol, const symbol_type st) + { + switch (st) + { + case e_st_variable : + case e_st_vector : + case e_st_string : if (collect_assignments_) + assignment_name_list_ + .push_back(std::make_pair(symbol, st)); + break; + + default : return; + } + } + + std::size_t options_; + bool collect_variables_; + bool collect_functions_; + bool collect_assignments_; + bool return_present_; + bool final_stmt_return_; + symbol_list_t symbol_name_list_; + symbol_list_t assignment_name_list_; + retparam_list_t retparam_list_; + + friend class parser; + }; + + class settings_store + { + private: + + typedef std::set disabled_entity_set_t; + typedef disabled_entity_set_t::iterator des_itr_t; + + public: + + enum settings_compilation_options + { + e_unknown = 0, + e_replacer = 1, + e_joiner = 2, + e_numeric_check = 4, + e_bracket_check = 8, + e_sequence_check = 16, + e_commutative_check = 32, + e_strength_reduction = 64, + e_disable_vardef = 128, + e_collect_vars = 256, + e_collect_funcs = 512, + e_collect_assings = 1024, + e_disable_usr_on_rsrvd = 2048, + e_disable_zero_return = 4096 + }; + + enum settings_base_funcs + { + e_bf_unknown = 0, + e_bf_abs , e_bf_acos , e_bf_acosh , e_bf_asin , + e_bf_asinh , e_bf_atan , e_bf_atan2 , e_bf_atanh , + e_bf_avg , e_bf_ceil , e_bf_clamp , e_bf_cos , + e_bf_cosh , e_bf_cot , e_bf_csc , e_bf_equal , + e_bf_erf , e_bf_erfc , e_bf_exp , e_bf_expm1 , + e_bf_floor , e_bf_frac , e_bf_hypot , e_bf_iclamp , + e_bf_like , e_bf_log , e_bf_log10 , e_bf_log1p , + e_bf_log2 , e_bf_logn , e_bf_mand , e_bf_max , + e_bf_min , e_bf_mod , e_bf_mor , e_bf_mul , + e_bf_ncdf , e_bf_pow , e_bf_root , e_bf_round , + e_bf_roundn , e_bf_sec , e_bf_sgn , e_bf_sin , + e_bf_sinc , e_bf_sinh , e_bf_sqrt , e_bf_sum , + e_bf_swap , e_bf_tan , e_bf_tanh , e_bf_trunc , + e_bf_not_equal , e_bf_inrange , e_bf_deg2grad , e_bf_deg2rad , + e_bf_rad2deg , e_bf_grad2deg + }; + + enum settings_control_structs + { + e_ctrl_unknown = 0, + e_ctrl_ifelse, + e_ctrl_switch, + e_ctrl_for_loop, + e_ctrl_while_loop, + e_ctrl_repeat_loop, + e_ctrl_return + }; + + enum settings_logic_opr + { + e_logic_unknown = 0, + e_logic_and, e_logic_nand , e_logic_nor , + e_logic_not, e_logic_or , e_logic_xnor, + e_logic_xor, e_logic_scand, e_logic_scor + }; + + enum settings_arithmetic_opr + { + e_arith_unknown = 0, + e_arith_add, e_arith_sub, e_arith_mul, + e_arith_div, e_arith_mod, e_arith_pow + }; + + enum settings_assignment_opr + { + e_assign_unknown = 0, + e_assign_assign, e_assign_addass, e_assign_subass, + e_assign_mulass, e_assign_divass, e_assign_modass + }; + + enum settings_inequality_opr + { + e_ineq_unknown = 0, + e_ineq_lt , e_ineq_lte, e_ineq_eq , + e_ineq_equal, e_ineq_ne , e_ineq_nequal, + e_ineq_gte , e_ineq_gt + }; + + static const std::size_t compile_all_opts = + e_replacer + + e_joiner + + e_numeric_check + + e_bracket_check + + e_sequence_check + + e_commutative_check + + e_strength_reduction; + + settings_store(const std::size_t compile_options = compile_all_opts) + : max_stack_depth_(400) + , max_node_depth_(10000) + { + load_compile_options(compile_options); + } + + settings_store& enable_all_base_functions() + { + disabled_func_set_.clear(); + return (*this); + } + + settings_store& enable_all_control_structures() + { + disabled_ctrl_set_.clear(); + return (*this); + } + + settings_store& enable_all_logic_ops() + { + disabled_logic_set_.clear(); + return (*this); + } + + settings_store& enable_all_arithmetic_ops() + { + disabled_arithmetic_set_.clear(); + return (*this); + } + + settings_store& enable_all_assignment_ops() + { + disabled_assignment_set_.clear(); + return (*this); + } + + settings_store& enable_all_inequality_ops() + { + disabled_inequality_set_.clear(); + return (*this); + } + + settings_store& enable_local_vardef() + { + disable_vardef_ = false; + return (*this); + } + + settings_store& disable_all_base_functions() + { + std::copy(details::base_function_list, + details::base_function_list + details::base_function_list_size, + std::insert_iterator + (disabled_func_set_, disabled_func_set_.begin())); + return (*this); + } + + settings_store& disable_all_control_structures() + { + std::copy(details::cntrl_struct_list, + details::cntrl_struct_list + details::cntrl_struct_list_size, + std::insert_iterator + (disabled_ctrl_set_, disabled_ctrl_set_.begin())); + return (*this); + } + + settings_store& disable_all_logic_ops() + { + std::copy(details::logic_ops_list, + details::logic_ops_list + details::logic_ops_list_size, + std::insert_iterator + (disabled_logic_set_, disabled_logic_set_.begin())); + return (*this); + } + + settings_store& disable_all_arithmetic_ops() + { + std::copy(details::arithmetic_ops_list, + details::arithmetic_ops_list + details::arithmetic_ops_list_size, + std::insert_iterator + (disabled_arithmetic_set_, disabled_arithmetic_set_.begin())); + return (*this); + } + + settings_store& disable_all_assignment_ops() + { + std::copy(details::assignment_ops_list, + details::assignment_ops_list + details::assignment_ops_list_size, + std::insert_iterator + (disabled_assignment_set_, disabled_assignment_set_.begin())); + return (*this); + } + + settings_store& disable_all_inequality_ops() + { + std::copy(details::inequality_ops_list, + details::inequality_ops_list + details::inequality_ops_list_size, + std::insert_iterator + (disabled_inequality_set_, disabled_inequality_set_.begin())); + return (*this); + } + + settings_store& disable_local_vardef() + { + disable_vardef_ = true; + return (*this); + } + + bool replacer_enabled () const { return enable_replacer_; } + bool commutative_check_enabled () const { return enable_commutative_check_; } + bool joiner_enabled () const { return enable_joiner_; } + bool numeric_check_enabled () const { return enable_numeric_check_; } + bool bracket_check_enabled () const { return enable_bracket_check_; } + bool sequence_check_enabled () const { return enable_sequence_check_; } + bool strength_reduction_enabled () const { return enable_strength_reduction_; } + bool collect_variables_enabled () const { return enable_collect_vars_; } + bool collect_functions_enabled () const { return enable_collect_funcs_; } + bool collect_assignments_enabled() const { return enable_collect_assings_; } + bool vardef_disabled () const { return disable_vardef_; } + bool rsrvd_sym_usr_disabled () const { return disable_rsrvd_sym_usr_; } + bool zero_return_disabled () const { return disable_zero_return_; } + + bool function_enabled(const std::string& function_name) const + { + if (disabled_func_set_.empty()) + return true; + else + return (disabled_func_set_.end() == disabled_func_set_.find(function_name)); + } + + bool control_struct_enabled(const std::string& control_struct) const + { + if (disabled_ctrl_set_.empty()) + return true; + else + return (disabled_ctrl_set_.end() == disabled_ctrl_set_.find(control_struct)); + } + + bool logic_enabled(const std::string& logic_operation) const + { + if (disabled_logic_set_.empty()) + return true; + else + return (disabled_logic_set_.end() == disabled_logic_set_.find(logic_operation)); + } + + bool arithmetic_enabled(const details::operator_type& arithmetic_operation) const + { + if (disabled_logic_set_.empty()) + return true; + else + return disabled_arithmetic_set_.end() == disabled_arithmetic_set_ + .find(arith_opr_to_string(arithmetic_operation)); + } + + bool assignment_enabled(const details::operator_type& assignment) const + { + if (disabled_assignment_set_.empty()) + return true; + else + return disabled_assignment_set_.end() == disabled_assignment_set_ + .find(assign_opr_to_string(assignment)); + } + + bool inequality_enabled(const details::operator_type& inequality) const + { + if (disabled_inequality_set_.empty()) + return true; + else + return disabled_inequality_set_.end() == disabled_inequality_set_ + .find(inequality_opr_to_string(inequality)); + } + + bool function_disabled(const std::string& function_name) const + { + if (disabled_func_set_.empty()) + return false; + else + return (disabled_func_set_.end() != disabled_func_set_.find(function_name)); + } + + bool control_struct_disabled(const std::string& control_struct) const + { + if (disabled_ctrl_set_.empty()) + return false; + else + return (disabled_ctrl_set_.end() != disabled_ctrl_set_.find(control_struct)); + } + + bool logic_disabled(const std::string& logic_operation) const + { + if (disabled_logic_set_.empty()) + return false; + else + return (disabled_logic_set_.end() != disabled_logic_set_.find(logic_operation)); + } + + bool assignment_disabled(const details::operator_type assignment_operation) const + { + if (disabled_assignment_set_.empty()) + return false; + else + return disabled_assignment_set_.end() != disabled_assignment_set_ + .find(assign_opr_to_string(assignment_operation)); + } + + bool logic_disabled(const details::operator_type logic_operation) const + { + if (disabled_logic_set_.empty()) + return false; + else + return disabled_logic_set_.end() != disabled_logic_set_ + .find(logic_opr_to_string(logic_operation)); + } + + bool arithmetic_disabled(const details::operator_type arithmetic_operation) const + { + if (disabled_arithmetic_set_.empty()) + return false; + else + return disabled_arithmetic_set_.end() != disabled_arithmetic_set_ + .find(arith_opr_to_string(arithmetic_operation)); + } + + bool inequality_disabled(const details::operator_type& inequality) const + { + if (disabled_inequality_set_.empty()) + return false; + else + return disabled_inequality_set_.end() != disabled_inequality_set_ + .find(inequality_opr_to_string(inequality)); + } + + settings_store& disable_base_function(settings_base_funcs bf) + { + if ( + (e_bf_unknown != bf) && + (static_cast(bf) < (details::base_function_list_size + 1)) + ) + { + disabled_func_set_.insert(details::base_function_list[bf - 1]); + } + + return (*this); + } + + settings_store& disable_control_structure(settings_control_structs ctrl_struct) + { + if ( + (e_ctrl_unknown != ctrl_struct) && + (static_cast(ctrl_struct) < (details::cntrl_struct_list_size + 1)) + ) + { + disabled_ctrl_set_.insert(details::cntrl_struct_list[ctrl_struct - 1]); + } + + return (*this); + } + + settings_store& disable_logic_operation(settings_logic_opr logic) + { + if ( + (e_logic_unknown != logic) && + (static_cast(logic) < (details::logic_ops_list_size + 1)) + ) + { + disabled_logic_set_.insert(details::logic_ops_list[logic - 1]); + } + + return (*this); + } + + settings_store& disable_arithmetic_operation(settings_arithmetic_opr arithmetic) + { + if ( + (e_arith_unknown != arithmetic) && + (static_cast(arithmetic) < (details::arithmetic_ops_list_size + 1)) + ) + { + disabled_arithmetic_set_.insert(details::arithmetic_ops_list[arithmetic - 1]); + } + + return (*this); + } + + settings_store& disable_assignment_operation(settings_assignment_opr assignment) + { + if ( + (e_assign_unknown != assignment) && + (static_cast(assignment) < (details::assignment_ops_list_size + 1)) + ) + { + disabled_assignment_set_.insert(details::assignment_ops_list[assignment - 1]); + } + + return (*this); + } + + settings_store& disable_inequality_operation(settings_inequality_opr inequality) + { + if ( + (e_ineq_unknown != inequality) && + (static_cast(inequality) < (details::inequality_ops_list_size + 1)) + ) + { + disabled_inequality_set_.insert(details::inequality_ops_list[inequality - 1]); + } + + return (*this); + } + + settings_store& enable_base_function(settings_base_funcs bf) + { + if ( + (e_bf_unknown != bf) && + (static_cast(bf) < (details::base_function_list_size + 1)) + ) + { + const des_itr_t itr = disabled_func_set_.find(details::base_function_list[bf - 1]); + + if (disabled_func_set_.end() != itr) + { + disabled_func_set_.erase(itr); + } + } + + return (*this); + } + + settings_store& enable_control_structure(settings_control_structs ctrl_struct) + { + if ( + (e_ctrl_unknown != ctrl_struct) && + (static_cast(ctrl_struct) < (details::cntrl_struct_list_size + 1)) + ) + { + const des_itr_t itr = disabled_ctrl_set_.find(details::cntrl_struct_list[ctrl_struct - 1]); + + if (disabled_ctrl_set_.end() != itr) + { + disabled_ctrl_set_.erase(itr); + } + } + + return (*this); + } + + settings_store& enable_logic_operation(settings_logic_opr logic) + { + if ( + (e_logic_unknown != logic) && + (static_cast(logic) < (details::logic_ops_list_size + 1)) + ) + { + const des_itr_t itr = disabled_logic_set_.find(details::logic_ops_list[logic - 1]); + + if (disabled_logic_set_.end() != itr) + { + disabled_logic_set_.erase(itr); + } + } + + return (*this); + } + + settings_store& enable_arithmetic_operation(settings_arithmetic_opr arithmetic) + { + if ( + (e_arith_unknown != arithmetic) && + (static_cast(arithmetic) < (details::arithmetic_ops_list_size + 1)) + ) + { + const des_itr_t itr = disabled_arithmetic_set_.find(details::arithmetic_ops_list[arithmetic - 1]); + + if (disabled_arithmetic_set_.end() != itr) + { + disabled_arithmetic_set_.erase(itr); + } + } + + return (*this); + } + + settings_store& enable_assignment_operation(settings_assignment_opr assignment) + { + if ( + (e_assign_unknown != assignment) && + (static_cast(assignment) < (details::assignment_ops_list_size + 1)) + ) + { + const des_itr_t itr = disabled_assignment_set_.find(details::assignment_ops_list[assignment - 1]); + + if (disabled_assignment_set_.end() != itr) + { + disabled_assignment_set_.erase(itr); + } + } + + return (*this); + } + + settings_store& enable_inequality_operation(settings_inequality_opr inequality) + { + if ( + (e_ineq_unknown != inequality) && + (static_cast(inequality) < (details::inequality_ops_list_size + 1)) + ) + { + const des_itr_t itr = disabled_inequality_set_.find(details::inequality_ops_list[inequality - 1]); + + if (disabled_inequality_set_.end() != itr) + { + disabled_inequality_set_.erase(itr); + } + } + + return (*this); + } + + void set_max_stack_depth(const std::size_t max_stack_depth) + { + max_stack_depth_ = max_stack_depth; + } + + void set_max_node_depth(const std::size_t max_node_depth) + { + max_node_depth_ = max_node_depth; + } + + private: + + void load_compile_options(const std::size_t compile_options) + { + enable_replacer_ = (compile_options & e_replacer ) == e_replacer; + enable_joiner_ = (compile_options & e_joiner ) == e_joiner; + enable_numeric_check_ = (compile_options & e_numeric_check ) == e_numeric_check; + enable_bracket_check_ = (compile_options & e_bracket_check ) == e_bracket_check; + enable_sequence_check_ = (compile_options & e_sequence_check ) == e_sequence_check; + enable_commutative_check_ = (compile_options & e_commutative_check ) == e_commutative_check; + enable_strength_reduction_ = (compile_options & e_strength_reduction ) == e_strength_reduction; + enable_collect_vars_ = (compile_options & e_collect_vars ) == e_collect_vars; + enable_collect_funcs_ = (compile_options & e_collect_funcs ) == e_collect_funcs; + enable_collect_assings_ = (compile_options & e_collect_assings ) == e_collect_assings; + disable_vardef_ = (compile_options & e_disable_vardef ) == e_disable_vardef; + disable_rsrvd_sym_usr_ = (compile_options & e_disable_usr_on_rsrvd) == e_disable_usr_on_rsrvd; + disable_zero_return_ = (compile_options & e_disable_zero_return ) == e_disable_zero_return; + } + + std::string assign_opr_to_string(details::operator_type opr) const + { + switch (opr) + { + case details::e_assign : return ":="; + case details::e_addass : return "+="; + case details::e_subass : return "-="; + case details::e_mulass : return "*="; + case details::e_divass : return "/="; + case details::e_modass : return "%="; + default : return "" ; + } + } + + std::string arith_opr_to_string(details::operator_type opr) const + { + switch (opr) + { + case details::e_add : return "+"; + case details::e_sub : return "-"; + case details::e_mul : return "*"; + case details::e_div : return "/"; + case details::e_mod : return "%"; + default : return "" ; + } + } + + std::string inequality_opr_to_string(details::operator_type opr) const + { + switch (opr) + { + case details::e_lt : return "<" ; + case details::e_lte : return "<="; + case details::e_eq : return "=="; + case details::e_equal : return "=" ; + case details::e_ne : return "!="; + case details::e_nequal: return "<>"; + case details::e_gte : return ">="; + case details::e_gt : return ">" ; + default : return "" ; + } + } + + std::string logic_opr_to_string(details::operator_type opr) const + { + switch (opr) + { + case details::e_and : return "and" ; + case details::e_or : return "or" ; + case details::e_xor : return "xor" ; + case details::e_nand : return "nand"; + case details::e_nor : return "nor" ; + case details::e_xnor : return "xnor"; + case details::e_notl : return "not" ; + default : return "" ; + } + } + + bool enable_replacer_; + bool enable_joiner_; + bool enable_numeric_check_; + bool enable_bracket_check_; + bool enable_sequence_check_; + bool enable_commutative_check_; + bool enable_strength_reduction_; + bool enable_collect_vars_; + bool enable_collect_funcs_; + bool enable_collect_assings_; + bool disable_vardef_; + bool disable_rsrvd_sym_usr_; + bool disable_zero_return_; + + disabled_entity_set_t disabled_func_set_ ; + disabled_entity_set_t disabled_ctrl_set_ ; + disabled_entity_set_t disabled_logic_set_; + disabled_entity_set_t disabled_arithmetic_set_; + disabled_entity_set_t disabled_assignment_set_; + disabled_entity_set_t disabled_inequality_set_; + + std::size_t max_stack_depth_; + std::size_t max_node_depth_; + + friend class parser; + }; + + typedef settings_store settings_t; + + parser(const settings_t& settings = settings_t()) + : settings_(settings) + , resolve_unknown_symbol_(false) + , results_context_(0) + , unknown_symbol_resolver_(reinterpret_cast(0)) + #ifdef _MSC_VER + #pragma warning(push) + #pragma warning (disable:4355) + #endif + , sem_(*this) + #ifdef _MSC_VER + #pragma warning(pop) + #endif + , operator_joiner_2_(2) + , operator_joiner_3_(3) + , loop_runtime_check_(0) + { + init_precompilation(); + + load_operations_map (base_ops_map_ ); + load_unary_operations_map (unary_op_map_ ); + load_binary_operations_map (binary_op_map_ ); + load_inv_binary_operations_map(inv_binary_op_map_); + load_sf3_map (sf3_map_ ); + load_sf4_map (sf4_map_ ); + + expression_generator_.init_synthesize_map(); + expression_generator_.set_parser(*this); + expression_generator_.set_uom(unary_op_map_); + expression_generator_.set_bom(binary_op_map_); + expression_generator_.set_ibom(inv_binary_op_map_); + expression_generator_.set_sf3m(sf3_map_); + expression_generator_.set_sf4m(sf4_map_); + expression_generator_.set_strength_reduction_state(settings_.strength_reduction_enabled()); + } + + ~parser() {} + + inline void init_precompilation() + { + dec_.collect_variables() = + settings_.collect_variables_enabled(); + + dec_.collect_functions() = + settings_.collect_functions_enabled(); + + dec_.collect_assignments() = + settings_.collect_assignments_enabled(); + + if (settings_.replacer_enabled()) + { + symbol_replacer_.clear(); + symbol_replacer_.add_replace("true" , "1", lexer::token::e_number); + symbol_replacer_.add_replace("false", "0", lexer::token::e_number); + helper_assembly_.token_modifier_list.clear(); + helper_assembly_.register_modifier(&symbol_replacer_); + } + + if (settings_.commutative_check_enabled()) + { + for (std::size_t i = 0; i < details::reserved_words_size; ++i) + { + commutative_inserter_.ignore_symbol(details::reserved_words[i]); + } + + helper_assembly_.token_inserter_list.clear(); + helper_assembly_.register_inserter(&commutative_inserter_); + } + + if (settings_.joiner_enabled()) + { + helper_assembly_.token_joiner_list.clear(); + helper_assembly_.register_joiner(&operator_joiner_2_); + helper_assembly_.register_joiner(&operator_joiner_3_); + } + + if ( + settings_.numeric_check_enabled () || + settings_.bracket_check_enabled () || + settings_.sequence_check_enabled() + ) + { + helper_assembly_.token_scanner_list.clear(); + + if (settings_.numeric_check_enabled()) + { + helper_assembly_.register_scanner(&numeric_checker_); + } + + if (settings_.bracket_check_enabled()) + { + helper_assembly_.register_scanner(&bracket_checker_); + } + + if (settings_.sequence_check_enabled()) + { + helper_assembly_.register_scanner(&sequence_validator_ ); + helper_assembly_.register_scanner(&sequence_validator_3tkns_); + } + } + } + + inline bool compile(const std::string& expression_string, expression& expr) + { + state_ .reset(); + error_list_ .clear(); + brkcnt_list_ .clear(); + synthesis_error_.clear(); + sem_ .cleanup(); + + return_cleanup(); + + expression_generator_.set_allocator(node_allocator_); + + if (expression_string.empty()) + { + set_error( + make_error(parser_error::e_syntax, + "ERR001 - Empty expression!", + exprtk_error_location)); + + return false; + } + + if (!init(expression_string)) + { + process_lexer_errors(); + return false; + } + + if (lexer().empty()) + { + set_error( + make_error(parser_error::e_syntax, + "ERR002 - Empty expression!", + exprtk_error_location)); + + return false; + } + + if (!run_assemblies()) + { + return false; + } + + symtab_store_.symtab_list_ = expr.get_symbol_table_list(); + dec_.clear(); + + lexer().begin(); + + next_token(); + + expression_node_ptr e = parse_corpus(); + + if ((0 != e) && (token_t::e_eof == current_token().type)) + { + bool* retinvk_ptr = 0; + + if (state_.return_stmt_present) + { + dec_.return_present_ = true; + + e = expression_generator_ + .return_envelope(e, results_context_, retinvk_ptr); + } + + expr.set_expression(e); + expr.set_retinvk(retinvk_ptr); + + register_local_vars(expr); + register_return_results(expr); + + return !(!expr); + } + else + { + if (error_list_.empty()) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR003 - Invalid expression encountered", + exprtk_error_location)); + } + + if ((0 != e) && branch_deletable(e)) + { + destroy_node(e); + } + + dec_.clear (); + sem_.cleanup (); + return_cleanup(); + + return false; + } + } + + inline expression_t compile(const std::string& expression_string, symbol_table_t& symtab) + { + expression_t expression; + expression.register_symbol_table(symtab); + compile(expression_string,expression); + return expression; + } + + void process_lexer_errors() + { + for (std::size_t i = 0; i < lexer().size(); ++i) + { + if (lexer()[i].is_error()) + { + std::string diagnostic = "ERR004 - "; + + switch (lexer()[i].type) + { + case lexer::token::e_error : diagnostic += "General token error"; + break; + + case lexer::token::e_err_symbol : diagnostic += "Symbol error"; + break; + + case lexer::token::e_err_number : diagnostic += "Invalid numeric token"; + break; + + case lexer::token::e_err_string : diagnostic += "Invalid string token"; + break; + + case lexer::token::e_err_sfunc : diagnostic += "Invalid special function token"; + break; + + default : diagnostic += "Unknown compiler error"; + } + + set_error( + make_error(parser_error::e_lexer, + lexer()[i], + diagnostic + ": " + lexer()[i].value, + exprtk_error_location)); + } + } + } + + inline bool run_assemblies() + { + if (settings_.commutative_check_enabled()) + { + helper_assembly_.run_inserters(lexer()); + } + + if (settings_.joiner_enabled()) + { + helper_assembly_.run_joiners(lexer()); + } + + if (settings_.replacer_enabled()) + { + helper_assembly_.run_modifiers(lexer()); + } + + if ( + settings_.numeric_check_enabled () || + settings_.bracket_check_enabled () || + settings_.sequence_check_enabled() + ) + { + if (!helper_assembly_.run_scanners(lexer())) + { + if (helper_assembly_.error_token_scanner) + { + lexer::helper::bracket_checker* bracket_checker_ptr = 0; + lexer::helper::numeric_checker* numeric_checker_ptr = 0; + lexer::helper::sequence_validator* sequence_validator_ptr = 0; + lexer::helper::sequence_validator_3tokens* sequence_validator3_ptr = 0; + + if (0 != (bracket_checker_ptr = dynamic_cast(helper_assembly_.error_token_scanner))) + { + set_error( + make_error(parser_error::e_token, + bracket_checker_ptr->error_token(), + "ERR005 - Mismatched brackets: '" + bracket_checker_ptr->error_token().value + "'", + exprtk_error_location)); + } + else if (0 != (numeric_checker_ptr = dynamic_cast*>(helper_assembly_.error_token_scanner))) + { + for (std::size_t i = 0; i < numeric_checker_ptr->error_count(); ++i) + { + lexer::token error_token = lexer()[numeric_checker_ptr->error_index(i)]; + + set_error( + make_error(parser_error::e_token, + error_token, + "ERR006 - Invalid numeric token: '" + error_token.value + "'", + exprtk_error_location)); + } + + if (numeric_checker_ptr->error_count()) + { + numeric_checker_ptr->clear_errors(); + } + } + else if (0 != (sequence_validator_ptr = dynamic_cast(helper_assembly_.error_token_scanner))) + { + for (std::size_t i = 0; i < sequence_validator_ptr->error_count(); ++i) + { + std::pair error_token = sequence_validator_ptr->error(i); + + set_error( + make_error(parser_error::e_token, + error_token.first, + "ERR007 - Invalid token sequence: '" + + error_token.first.value + "' and '" + + error_token.second.value + "'", + exprtk_error_location)); + } + + if (sequence_validator_ptr->error_count()) + { + sequence_validator_ptr->clear_errors(); + } + } + else if (0 != (sequence_validator3_ptr = dynamic_cast(helper_assembly_.error_token_scanner))) + { + for (std::size_t i = 0; i < sequence_validator3_ptr->error_count(); ++i) + { + std::pair error_token = sequence_validator3_ptr->error(i); + + set_error( + make_error(parser_error::e_token, + error_token.first, + "ERR008 - Invalid token sequence: '" + + error_token.first.value + "' and '" + + error_token.second.value + "'", + exprtk_error_location)); + } + + if (sequence_validator3_ptr->error_count()) + { + sequence_validator3_ptr->clear_errors(); + } + } + } + + return false; + } + } + + return true; + } + + inline settings_store& settings() + { + return settings_; + } + + inline parser_error::type get_error(const std::size_t& index) const + { + if (index < error_list_.size()) + return error_list_[index]; + else + throw std::invalid_argument("parser::get_error() - Invalid error index specificed"); + } + + inline std::string error() const + { + if (!error_list_.empty()) + { + return error_list_[0].diagnostic; + } + else + return std::string("No Error"); + } + + inline std::size_t error_count() const + { + return error_list_.size(); + } + + inline dependent_entity_collector& dec() + { + return dec_; + } + + inline bool replace_symbol(const std::string& old_symbol, const std::string& new_symbol) + { + if (!settings_.replacer_enabled()) + return false; + else if (details::is_reserved_word(old_symbol)) + return false; + else + return symbol_replacer_.add_replace(old_symbol,new_symbol,lexer::token::e_symbol); + } + + inline bool remove_replace_symbol(const std::string& symbol) + { + if (!settings_.replacer_enabled()) + return false; + else if (details::is_reserved_word(symbol)) + return false; + else + return symbol_replacer_.remove(symbol); + } + + inline void enable_unknown_symbol_resolver(unknown_symbol_resolver* usr = reinterpret_cast(0)) + { + resolve_unknown_symbol_ = true; + + if (usr) + unknown_symbol_resolver_ = usr; + else + unknown_symbol_resolver_ = &default_usr_; + } + + inline void enable_unknown_symbol_resolver(unknown_symbol_resolver& usr) + { + enable_unknown_symbol_resolver(&usr); + } + + inline void disable_unknown_symbol_resolver() + { + resolve_unknown_symbol_ = false; + unknown_symbol_resolver_ = &default_usr_; + } + + inline void register_loop_runtime_check(loop_runtime_check& lrtchk) + { + loop_runtime_check_ = &lrtchk; + } + + inline void clear_loop_runtime_check() + { + loop_runtime_check_ = loop_runtime_check_ptr(0); + } + + private: + + inline bool valid_base_operation(const std::string& symbol) const + { + const std::size_t length = symbol.size(); + + if ( + (length < 3) || // Shortest base op symbol length + (length > 9) // Longest base op symbol length + ) + return false; + else + return settings_.function_enabled(symbol) && + (base_ops_map_.end() != base_ops_map_.find(symbol)); + } + + inline bool valid_vararg_operation(const std::string& symbol) const + { + static const std::string s_sum = "sum" ; + static const std::string s_mul = "mul" ; + static const std::string s_avg = "avg" ; + static const std::string s_min = "min" ; + static const std::string s_max = "max" ; + static const std::string s_mand = "mand"; + static const std::string s_mor = "mor" ; + static const std::string s_multi = "~" ; + static const std::string s_mswitch = "[*]" ; + + return + ( + details::imatch(symbol,s_sum ) || + details::imatch(symbol,s_mul ) || + details::imatch(symbol,s_avg ) || + details::imatch(symbol,s_min ) || + details::imatch(symbol,s_max ) || + details::imatch(symbol,s_mand ) || + details::imatch(symbol,s_mor ) || + details::imatch(symbol,s_multi ) || + details::imatch(symbol,s_mswitch) + ) && + settings_.function_enabled(symbol); + } + + bool is_invalid_logic_operation(const details::operator_type operation) const + { + return settings_.logic_disabled(operation); + } + + bool is_invalid_arithmetic_operation(const details::operator_type operation) const + { + return settings_.arithmetic_disabled(operation); + } + + bool is_invalid_assignment_operation(const details::operator_type operation) const + { + return settings_.assignment_disabled(operation); + } + + bool is_invalid_inequality_operation(const details::operator_type operation) const + { + return settings_.inequality_disabled(operation); + } + + #ifdef exprtk_enable_debugging + inline void next_token() + { + const std::string ct_str = current_token().value; + const std::size_t ct_pos = current_token().position; + parser_helper::next_token(); + const std::string depth(2 * state_.scope_depth,' '); + exprtk_debug(("%s" + "prev[%s | %04d] --> curr[%s | %04d] stack_level: %3d\n", + depth.c_str(), + ct_str.c_str(), + static_cast(ct_pos), + current_token().value.c_str(), + static_cast(current_token().position), + static_cast(state_.stack_depth))); + } + #endif + + inline expression_node_ptr parse_corpus() + { + std::vector arg_list; + std::vector side_effect_list; + + scoped_vec_delete sdd((*this),arg_list); + + lexer::token begin_token; + lexer::token end_token; + + for ( ; ; ) + { + state_.side_effect_present = false; + + begin_token = current_token(); + + expression_node_ptr arg = parse_expression(); + + if (0 == arg) + { + if (error_list_.empty()) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR009 - Invalid expression encountered", + exprtk_error_location)); + } + + return error_node(); + } + else + { + arg_list.push_back(arg); + + side_effect_list.push_back(state_.side_effect_present); + + end_token = current_token(); + + const std::string sub_expr = construct_subexpr(begin_token, end_token); + + exprtk_debug(("parse_corpus(%02d) Subexpr: %s\n", + static_cast(arg_list.size() - 1), + sub_expr.c_str())); + + exprtk_debug(("parse_corpus(%02d) - Side effect present: %s\n", + static_cast(arg_list.size() - 1), + state_.side_effect_present ? "true" : "false")); + + exprtk_debug(("-------------------------------------------------\n")); + } + + if (lexer().finished()) + break; + else if (token_is(token_t::e_eof,prsrhlpr_t::e_hold)) + { + if (lexer().finished()) + break; + else + next_token(); + } + } + + if ( + !arg_list.empty() && + is_return_node(arg_list.back()) + ) + { + dec_.final_stmt_return_ = true; + } + + const expression_node_ptr result = simplify(arg_list,side_effect_list); + + sdd.delete_ptr = (0 == result); + + return result; + } + + std::string construct_subexpr(lexer::token& begin_token, lexer::token& end_token) + { + std::string result = lexer().substr(begin_token.position,end_token.position); + + for (std::size_t i = 0; i < result.size(); ++i) + { + if (details::is_whitespace(result[i])) result[i] = ' '; + } + + return result; + } + + static const precedence_level default_precedence = e_level00; + + struct state_t + { + inline void set(const precedence_level& l, + const precedence_level& r, + const details::operator_type& o) + { + left = l; + right = r; + operation = o; + } + + inline void reset() + { + left = e_level00; + right = e_level00; + operation = details::e_default; + } + + precedence_level left; + precedence_level right; + details::operator_type operation; + }; + + inline expression_node_ptr parse_expression(precedence_level precedence = e_level00) + { + stack_limit_handler slh(*this); + + if (!slh) + { + return error_node(); + } + + expression_node_ptr expression = parse_branch(precedence); + + if (0 == expression) + { + return error_node(); + } + + bool break_loop = false; + + state_t current_state; + + for ( ; ; ) + { + current_state.reset(); + + switch (current_token().type) + { + case token_t::e_assign : current_state.set(e_level00, e_level00, details::e_assign); break; + case token_t::e_addass : current_state.set(e_level00, e_level00, details::e_addass); break; + case token_t::e_subass : current_state.set(e_level00, e_level00, details::e_subass); break; + case token_t::e_mulass : current_state.set(e_level00, e_level00, details::e_mulass); break; + case token_t::e_divass : current_state.set(e_level00, e_level00, details::e_divass); break; + case token_t::e_modass : current_state.set(e_level00, e_level00, details::e_modass); break; + case token_t::e_swap : current_state.set(e_level00, e_level00, details::e_swap ); break; + case token_t::e_lt : current_state.set(e_level05, e_level06, details::e_lt ); break; + case token_t::e_lte : current_state.set(e_level05, e_level06, details::e_lte ); break; + case token_t::e_eq : current_state.set(e_level05, e_level06, details::e_eq ); break; + case token_t::e_ne : current_state.set(e_level05, e_level06, details::e_ne ); break; + case token_t::e_gte : current_state.set(e_level05, e_level06, details::e_gte ); break; + case token_t::e_gt : current_state.set(e_level05, e_level06, details::e_gt ); break; + case token_t::e_add : current_state.set(e_level07, e_level08, details::e_add ); break; + case token_t::e_sub : current_state.set(e_level07, e_level08, details::e_sub ); break; + case token_t::e_div : current_state.set(e_level10, e_level11, details::e_div ); break; + case token_t::e_mul : current_state.set(e_level10, e_level11, details::e_mul ); break; + case token_t::e_mod : current_state.set(e_level10, e_level11, details::e_mod ); break; + case token_t::e_pow : current_state.set(e_level12, e_level12, details::e_pow ); break; + default : if (token_t::e_symbol == current_token().type) + { + static const std::string s_and = "and" ; + static const std::string s_nand = "nand" ; + static const std::string s_or = "or" ; + static const std::string s_nor = "nor" ; + static const std::string s_xor = "xor" ; + static const std::string s_xnor = "xnor" ; + static const std::string s_in = "in" ; + static const std::string s_like = "like" ; + static const std::string s_ilike = "ilike"; + static const std::string s_and1 = "&" ; + static const std::string s_or1 = "|" ; + static const std::string s_not = "not" ; + + if (details::imatch(current_token().value,s_and)) + { + current_state.set(e_level03, e_level04, details::e_and); + break; + } + else if (details::imatch(current_token().value,s_and1)) + { + #ifndef exprtk_disable_sc_andor + current_state.set(e_level03, e_level04, details::e_scand); + #else + current_state.set(e_level03, e_level04, details::e_and); + #endif + break; + } + else if (details::imatch(current_token().value,s_nand)) + { + current_state.set(e_level03, e_level04, details::e_nand); + break; + } + else if (details::imatch(current_token().value,s_or)) + { + current_state.set(e_level01, e_level02, details::e_or); + break; + } + else if (details::imatch(current_token().value,s_or1)) + { + #ifndef exprtk_disable_sc_andor + current_state.set(e_level01, e_level02, details::e_scor); + #else + current_state.set(e_level01, e_level02, details::e_or); + #endif + break; + } + else if (details::imatch(current_token().value,s_nor)) + { + current_state.set(e_level01, e_level02, details::e_nor); + break; + } + else if (details::imatch(current_token().value,s_xor)) + { + current_state.set(e_level01, e_level02, details::e_xor); + break; + } + else if (details::imatch(current_token().value,s_xnor)) + { + current_state.set(e_level01, e_level02, details::e_xnor); + break; + } + else if (details::imatch(current_token().value,s_in)) + { + current_state.set(e_level04, e_level04, details::e_in); + break; + } + else if (details::imatch(current_token().value,s_like)) + { + current_state.set(e_level04, e_level04, details::e_like); + break; + } + else if (details::imatch(current_token().value,s_ilike)) + { + current_state.set(e_level04, e_level04, details::e_ilike); + break; + } + else if (details::imatch(current_token().value,s_not)) + { + break; + } + } + + break_loop = true; + } + + if (break_loop) + { + parse_pending_string_rangesize(expression); + break; + } + else if (current_state.left < precedence) + break; + + const lexer::token prev_token = current_token(); + + next_token(); + + expression_node_ptr right_branch = error_node(); + expression_node_ptr new_expression = error_node(); + + if (is_invalid_logic_operation(current_state.operation)) + { + free_node(node_allocator_,expression); + + set_error( + make_error(parser_error::e_syntax, + prev_token, + "ERR010 - Invalid or disabled logic operation '" + details::to_str(current_state.operation) + "'", + exprtk_error_location)); + + return error_node(); + } + else if (is_invalid_arithmetic_operation(current_state.operation)) + { + free_node(node_allocator_,expression); + + set_error( + make_error(parser_error::e_syntax, + prev_token, + "ERR011 - Invalid or disabled arithmetic operation '" + details::to_str(current_state.operation) + "'", + exprtk_error_location)); + + return error_node(); + } + else if (is_invalid_inequality_operation(current_state.operation)) + { + free_node(node_allocator_,expression); + + set_error( + make_error(parser_error::e_syntax, + prev_token, + "ERR012 - Invalid inequality operation '" + details::to_str(current_state.operation) + "'", + exprtk_error_location)); + + return error_node(); + } + else if (is_invalid_assignment_operation(current_state.operation)) + { + free_node(node_allocator_,expression); + + set_error( + make_error(parser_error::e_syntax, + prev_token, + "ERR013 - Invalid or disabled assignment operation '" + details::to_str(current_state.operation) + "'", + exprtk_error_location)); + + return error_node(); + } + + if (0 != (right_branch = parse_expression(current_state.right))) + { + if ( + details::is_return_node(expression ) || + details::is_return_node(right_branch) + ) + { + free_node(node_allocator_, expression ); + free_node(node_allocator_, right_branch); + + set_error( + make_error(parser_error::e_syntax, + prev_token, + "ERR014 - Return statements cannot be part of sub-expressions", + exprtk_error_location)); + + return error_node(); + } + + new_expression = expression_generator_ + ( + current_state.operation, + expression, + right_branch + ); + } + + if (0 == new_expression) + { + if (error_list_.empty()) + { + set_error( + make_error(parser_error::e_syntax, + prev_token, + !synthesis_error_.empty() ? + synthesis_error_ : + "ERR015 - General parsing error at token: '" + prev_token.value + "'", + exprtk_error_location)); + } + + free_node(node_allocator_, expression ); + free_node(node_allocator_, right_branch); + + return error_node(); + } + else + { + if ( + token_is(token_t::e_ternary,prsrhlpr_t::e_hold) && + (e_level00 == precedence) + ) + { + expression = parse_ternary_conditional_statement(new_expression); + } + else + expression = new_expression; + + parse_pending_string_rangesize(expression); + } + } + + if ((0 != expression) && (expression->node_depth() > settings_.max_node_depth_)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR016 - Expression depth of " + details::to_str(static_cast(expression->node_depth())) + + " exceeds maximum allowed expression depth of " + details::to_str(static_cast(settings_.max_node_depth_)), + exprtk_error_location)); + + free_node(node_allocator_,expression); + + return error_node(); + } + + return expression; + } + + bool simplify_unary_negation_branch(expression_node_ptr& node) + { + { + typedef details::unary_branch_node > ubn_t; + ubn_t* n = dynamic_cast(node); + + if (n) + { + expression_node_ptr un_r = n->branch(0); + n->release(); + free_node(node_allocator_,node); + node = un_r; + + return true; + } + } + + { + typedef details::unary_variable_node > uvn_t; + + uvn_t* n = dynamic_cast(node); + + if (n) + { + const T& v = n->v(); + expression_node_ptr return_node = error_node(); + + if ( + (0 != (return_node = symtab_store_.get_variable(v))) || + (0 != (return_node = sem_ .get_variable(v))) + ) + { + free_node(node_allocator_,node); + node = return_node; + + return true; + } + else + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR017 - Failed to find variable node in symbol table", + exprtk_error_location)); + + free_node(node_allocator_,node); + + return false; + } + } + } + + return false; + } + + static inline expression_node_ptr error_node() + { + return reinterpret_cast(0); + } + + struct scoped_expression_delete + { + scoped_expression_delete(parser& pr, expression_node_ptr& expression) + : delete_ptr(true) + , parser_(pr) + , expression_(expression) + {} + + ~scoped_expression_delete() + { + if (delete_ptr) + { + free_node(parser_.node_allocator_, expression_); + } + } + + bool delete_ptr; + parser& parser_; + expression_node_ptr& expression_; + + private: + + scoped_expression_delete(const scoped_expression_delete&) exprtk_delete; + scoped_expression_delete& operator=(const scoped_expression_delete&) exprtk_delete; + }; + + template + struct scoped_delete + { + typedef Type* ptr_t; + + scoped_delete(parser& pr, ptr_t& p) + : delete_ptr(true) + , parser_(pr) + , p_(&p) + {} + + scoped_delete(parser& pr, ptr_t (&p)[N]) + : delete_ptr(true) + , parser_(pr) + , p_(&p[0]) + {} + + ~scoped_delete() + { + if (delete_ptr) + { + for (std::size_t i = 0; i < N; ++i) + { + free_node(parser_.node_allocator_, p_[i]); + } + } + } + + bool delete_ptr; + parser& parser_; + ptr_t* p_; + + private: + + scoped_delete(const scoped_delete&) exprtk_delete; + scoped_delete& operator=(const scoped_delete&) exprtk_delete; + }; + + template + struct scoped_deq_delete + { + typedef Type* ptr_t; + + scoped_deq_delete(parser& pr, std::deque& deq) + : delete_ptr(true) + , parser_(pr) + , deq_(deq) + {} + + ~scoped_deq_delete() + { + if (delete_ptr && !deq_.empty()) + { + for (std::size_t i = 0; i < deq_.size(); ++i) + { + free_node(parser_.node_allocator_,deq_[i]); + } + + deq_.clear(); + } + } + + bool delete_ptr; + parser& parser_; + std::deque& deq_; + + private: + + scoped_deq_delete(const scoped_deq_delete&) exprtk_delete; + scoped_deq_delete& operator=(const scoped_deq_delete&) exprtk_delete; + }; + + template + struct scoped_vec_delete + { + typedef Type* ptr_t; + + scoped_vec_delete(parser& pr, std::vector& vec) + : delete_ptr(true) + , parser_(pr) + , vec_(vec) + {} + + ~scoped_vec_delete() + { + if (delete_ptr && !vec_.empty()) + { + for (std::size_t i = 0; i < vec_.size(); ++i) + { + free_node(parser_.node_allocator_,vec_[i]); + } + + vec_.clear(); + } + } + + bool delete_ptr; + parser& parser_; + std::vector& vec_; + + private: + + scoped_vec_delete(const scoped_vec_delete&) exprtk_delete; + scoped_vec_delete& operator=(const scoped_vec_delete&) exprtk_delete; + }; + + struct scoped_bool_negator + { + explicit scoped_bool_negator(bool& bb) + : b(bb) + { b = !b; } + + ~scoped_bool_negator() + { b = !b; } + + bool& b; + }; + + struct scoped_bool_or_restorer + { + explicit scoped_bool_or_restorer(bool& bb) + : b(bb) + , original_value_(bb) + {} + + ~scoped_bool_or_restorer() + { + b = b || original_value_; + } + + bool& b; + bool original_value_; + }; + + struct scoped_inc_dec + { + explicit scoped_inc_dec(std::size_t& v) + : v_(v) + { ++v_; } + + ~scoped_inc_dec() + { + assert(v_ > 0); + --v_; + } + + std::size_t& v_; + }; + + inline expression_node_ptr parse_function_invocation(ifunction* function, const std::string& function_name) + { + expression_node_ptr func_node = reinterpret_cast(0); + + switch (function->param_count) + { + case 0 : func_node = parse_function_call_0 (function,function_name); break; + case 1 : func_node = parse_function_call< 1>(function,function_name); break; + case 2 : func_node = parse_function_call< 2>(function,function_name); break; + case 3 : func_node = parse_function_call< 3>(function,function_name); break; + case 4 : func_node = parse_function_call< 4>(function,function_name); break; + case 5 : func_node = parse_function_call< 5>(function,function_name); break; + case 6 : func_node = parse_function_call< 6>(function,function_name); break; + case 7 : func_node = parse_function_call< 7>(function,function_name); break; + case 8 : func_node = parse_function_call< 8>(function,function_name); break; + case 9 : func_node = parse_function_call< 9>(function,function_name); break; + case 10 : func_node = parse_function_call<10>(function,function_name); break; + case 11 : func_node = parse_function_call<11>(function,function_name); break; + case 12 : func_node = parse_function_call<12>(function,function_name); break; + case 13 : func_node = parse_function_call<13>(function,function_name); break; + case 14 : func_node = parse_function_call<14>(function,function_name); break; + case 15 : func_node = parse_function_call<15>(function,function_name); break; + case 16 : func_node = parse_function_call<16>(function,function_name); break; + case 17 : func_node = parse_function_call<17>(function,function_name); break; + case 18 : func_node = parse_function_call<18>(function,function_name); break; + case 19 : func_node = parse_function_call<19>(function,function_name); break; + case 20 : func_node = parse_function_call<20>(function,function_name); break; + default : { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR018 - Invalid number of parameters for function: '" + function_name + "'", + exprtk_error_location)); + + return error_node(); + } + } + + if (func_node) + return func_node; + else + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR019 - Failed to generate call to function: '" + function_name + "'", + exprtk_error_location)); + + return error_node(); + } + } + + template + inline expression_node_ptr parse_function_call(ifunction* function, const std::string& function_name) + { + #ifdef _MSC_VER + #pragma warning(push) + #pragma warning(disable: 4127) + #endif + if (0 == NumberofParameters) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR020 - Expecting ifunction '" + function_name + "' to have non-zero parameter count", + exprtk_error_location)); + + return error_node(); + } + #ifdef _MSC_VER + #pragma warning(pop) + #endif + + expression_node_ptr branch[NumberofParameters]; + expression_node_ptr result = error_node(); + + std::fill_n(branch, NumberofParameters, reinterpret_cast(0)); + + scoped_delete sd((*this),branch); + + next_token(); + + if (!token_is(token_t::e_lbracket)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR021 - Expecting argument list for function: '" + function_name + "'", + exprtk_error_location)); + + return error_node(); + } + + for (int i = 0; i < static_cast(NumberofParameters); ++i) + { + branch[i] = parse_expression(); + + if (0 == branch[i]) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR022 - Failed to parse argument " + details::to_str(i) + " for function: '" + function_name + "'", + exprtk_error_location)); + + return error_node(); + } + else if (i < static_cast(NumberofParameters - 1)) + { + if (!token_is(token_t::e_comma)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR023 - Invalid number of arguments for function: '" + function_name + "'", + exprtk_error_location)); + + return error_node(); + } + } + } + + if (!token_is(token_t::e_rbracket)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR024 - Invalid number of arguments for function: '" + function_name + "'", + exprtk_error_location)); + + return error_node(); + } + else + result = expression_generator_.function(function,branch); + + sd.delete_ptr = (0 == result); + + return result; + } + + inline expression_node_ptr parse_function_call_0(ifunction* function, const std::string& function_name) + { + expression_node_ptr result = expression_generator_.function(function); + + state_.side_effect_present = function->has_side_effects(); + + next_token(); + + if ( + token_is(token_t::e_lbracket) && + !token_is(token_t::e_rbracket) + ) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR025 - Expecting '()' to proceed call to function: '" + function_name + "'", + exprtk_error_location)); + + free_node(node_allocator_,result); + + return error_node(); + } + else + return result; + } + + template + inline std::size_t parse_base_function_call(expression_node_ptr (¶m_list)[MaxNumberofParameters], const std::string& function_name = "") + { + std::fill_n(param_list, MaxNumberofParameters, reinterpret_cast(0)); + + scoped_delete sd((*this),param_list); + + next_token(); + + if (!token_is(token_t::e_lbracket)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR026 - Expected a '(' at start of function call to '" + function_name + + "', instead got: '" + current_token().value + "'", + exprtk_error_location)); + + return 0; + } + + if (token_is(token_t::e_rbracket, e_hold)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR027 - Expected at least one input parameter for function call '" + function_name + "'", + exprtk_error_location)); + + return 0; + } + + std::size_t param_index = 0; + + for (; param_index < MaxNumberofParameters; ++param_index) + { + param_list[param_index] = parse_expression(); + + if (0 == param_list[param_index]) + return 0; + else if (token_is(token_t::e_rbracket)) + { + sd.delete_ptr = false; + break; + } + else if (token_is(token_t::e_comma)) + continue; + else + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR028 - Expected a ',' between function input parameters, instead got: '" + current_token().value + "'", + exprtk_error_location)); + + return 0; + } + } + + if (sd.delete_ptr) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR029 - Invalid number of input parameters passed to function '" + function_name + "'", + exprtk_error_location)); + + return 0; + } + + return (param_index + 1); + } + + inline expression_node_ptr parse_base_operation() + { + typedef std::pair map_range_t; + + const std::string operation_name = current_token().value; + const token_t diagnostic_token = current_token(); + + map_range_t itr_range = base_ops_map_.equal_range(operation_name); + + if (0 == std::distance(itr_range.first,itr_range.second)) + { + set_error( + make_error(parser_error::e_syntax, + diagnostic_token, + "ERR030 - No entry found for base operation: " + operation_name, + exprtk_error_location)); + + return error_node(); + } + + static const std::size_t MaxNumberofParameters = 4; + expression_node_ptr param_list[MaxNumberofParameters] = {0}; + + const std::size_t parameter_count = parse_base_function_call(param_list, operation_name); + + if ((parameter_count > 0) && (parameter_count <= MaxNumberofParameters)) + { + for (base_ops_map_t::iterator itr = itr_range.first; itr != itr_range.second; ++itr) + { + const details::base_operation_t& operation = itr->second; + + if (operation.num_params == parameter_count) + { + switch (parameter_count) + { + #define base_opr_case(N) \ + case N : { \ + expression_node_ptr pl##N[N] = {0}; \ + std::copy(param_list, param_list + N, pl##N); \ + lodge_symbol(operation_name, e_st_function); \ + return expression_generator_(operation.type, pl##N); \ + } \ + + base_opr_case(1) + base_opr_case(2) + base_opr_case(3) + base_opr_case(4) + #undef base_opr_case + } + } + } + } + + for (std::size_t i = 0; i < MaxNumberofParameters; ++i) + { + free_node(node_allocator_, param_list[i]); + } + + set_error( + make_error(parser_error::e_syntax, + diagnostic_token, + "ERR031 - Invalid number of input parameters for call to function: '" + operation_name + "'", + exprtk_error_location)); + + return error_node(); + } + + inline expression_node_ptr parse_conditional_statement_01(expression_node_ptr condition) + { + // Parse: [if][(][condition][,][consequent][,][alternative][)] + + expression_node_ptr consequent = error_node(); + expression_node_ptr alternative = error_node(); + + bool result = true; + + if (!token_is(token_t::e_comma)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR032 - Expected ',' between if-statement condition and consequent", + exprtk_error_location)); + result = false; + } + else if (0 == (consequent = parse_expression())) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR033 - Failed to parse consequent for if-statement", + exprtk_error_location)); + result = false; + } + else if (!token_is(token_t::e_comma)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR034 - Expected ',' between if-statement consequent and alternative", + exprtk_error_location)); + result = false; + } + else if (0 == (alternative = parse_expression())) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR035 - Failed to parse alternative for if-statement", + exprtk_error_location)); + result = false; + } + else if (!token_is(token_t::e_rbracket)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR036 - Expected ')' at the end of if-statement", + exprtk_error_location)); + result = false; + } + + #ifndef exprtk_disable_string_capabilities + if (result) + { + const bool consq_is_str = is_generally_string_node(consequent ); + const bool alter_is_str = is_generally_string_node(alternative); + + if (consq_is_str || alter_is_str) + { + if (consq_is_str && alter_is_str) + { + return expression_generator_ + .conditional_string(condition, consequent, alternative); + } + + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR037 - Return types of if-statement differ: string/non-string", + exprtk_error_location)); + + result = false; + } + } + #endif + + if (result) + { + const bool consq_is_vec = is_ivector_node(consequent ); + const bool alter_is_vec = is_ivector_node(alternative); + + if (consq_is_vec || alter_is_vec) + { + if (consq_is_vec && alter_is_vec) + { + return expression_generator_ + .conditional_vector(condition, consequent, alternative); + } + + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR038 - Return types of if-statement differ: vector/non-vector", + exprtk_error_location)); + + result = false; + } + } + + if (!result) + { + free_node(node_allocator_, condition ); + free_node(node_allocator_, consequent ); + free_node(node_allocator_, alternative); + + return error_node(); + } + else + return expression_generator_ + .conditional(condition, consequent, alternative); + } + + inline expression_node_ptr parse_conditional_statement_02(expression_node_ptr condition) + { + expression_node_ptr consequent = error_node(); + expression_node_ptr alternative = error_node(); + + bool result = true; + + if (token_is(token_t::e_lcrlbracket,prsrhlpr_t::e_hold)) + { + if (0 == (consequent = parse_multi_sequence("if-statement-01"))) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR039 - Failed to parse body of consequent for if-statement", + exprtk_error_location)); + + result = false; + } + } + else + { + if ( + settings_.commutative_check_enabled() && + token_is(token_t::e_mul,prsrhlpr_t::e_hold) + ) + { + next_token(); + } + + if (0 != (consequent = parse_expression())) + { + if (!token_is(token_t::e_eof)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR040 - Expected ';' at the end of the consequent for if-statement", + exprtk_error_location)); + + result = false; + } + } + else + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR041 - Failed to parse body of consequent for if-statement", + exprtk_error_location)); + + result = false; + } + } + + if (result) + { + if (details::imatch(current_token().value,"else")) + { + next_token(); + + if (token_is(token_t::e_lcrlbracket,prsrhlpr_t::e_hold)) + { + if (0 == (alternative = parse_multi_sequence("else-statement-01"))) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR042 - Failed to parse body of the 'else' for if-statement", + exprtk_error_location)); + + result = false; + } + } + else if (details::imatch(current_token().value,"if")) + { + if (0 == (alternative = parse_conditional_statement())) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR043 - Failed to parse body of if-else statement", + exprtk_error_location)); + + result = false; + } + } + else if (0 != (alternative = parse_expression())) + { + if (!token_is(token_t::e_eof)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR044 - Expected ';' at the end of the 'else-if' for the if-statement", + exprtk_error_location)); + + result = false; + } + } + else + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR045 - Failed to parse body of the 'else' for if-statement", + exprtk_error_location)); + + result = false; + } + } + } + + #ifndef exprtk_disable_string_capabilities + if (result) + { + const bool consq_is_str = is_generally_string_node(consequent ); + const bool alter_is_str = is_generally_string_node(alternative); + + if (consq_is_str || alter_is_str) + { + if (consq_is_str && alter_is_str) + { + return expression_generator_ + .conditional_string(condition, consequent, alternative); + } + + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR046 - Return types of if-statement differ: string/non-string", + exprtk_error_location)); + + result = false; + } + } + #endif + + if (result) + { + const bool consq_is_vec = is_ivector_node(consequent ); + const bool alter_is_vec = is_ivector_node(alternative); + + if (consq_is_vec || alter_is_vec) + { + if (consq_is_vec && alter_is_vec) + { + return expression_generator_ + .conditional_vector(condition, consequent, alternative); + } + + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR047 - Return types of if-statement differ: vector/non-vector", + exprtk_error_location)); + + result = false; + } + } + + if (!result) + { + free_node(node_allocator_, condition ); + free_node(node_allocator_, consequent ); + free_node(node_allocator_, alternative); + + return error_node(); + } + else + return expression_generator_ + .conditional(condition, consequent, alternative); + } + + inline expression_node_ptr parse_conditional_statement() + { + expression_node_ptr condition = error_node(); + + next_token(); + + if (!token_is(token_t::e_lbracket)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR048 - Expected '(' at start of if-statement, instead got: '" + current_token().value + "'", + exprtk_error_location)); + + return error_node(); + } + else if (0 == (condition = parse_expression())) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR049 - Failed to parse condition for if-statement", + exprtk_error_location)); + + return error_node(); + } + else if (token_is(token_t::e_comma,prsrhlpr_t::e_hold)) + { + // if (x,y,z) + return parse_conditional_statement_01(condition); + } + else if (token_is(token_t::e_rbracket)) + { + /* + 00. if (x) y; + 01. if (x) y; else z; + 02. if (x) y; else {z0; ... zn;} + 03. if (x) y; else if (z) w; + 04. if (x) y; else if (z) w; else u; + 05. if (x) y; else if (z) w; else {u0; ... un;} + 06. if (x) y; else if (z) {w0; ... wn;} + 07. if (x) {y0; ... yn;} + 08. if (x) {y0; ... yn;} else z; + 09. if (x) {y0; ... yn;} else {z0; ... zn;}; + 10. if (x) {y0; ... yn;} else if (z) w; + 11. if (x) {y0; ... yn;} else if (z) w; else u; + 12. if (x) {y0; ... nex;} else if (z) w; else {u0 ... un;} + 13. if (x) {y0; ... yn;} else if (z) {w0; ... wn;} + */ + return parse_conditional_statement_02(condition); + } + + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR050 - Invalid if-statement", + exprtk_error_location)); + + free_node(node_allocator_,condition); + + return error_node(); + } + + inline expression_node_ptr parse_ternary_conditional_statement(expression_node_ptr condition) + { + // Parse: [condition][?][consequent][:][alternative] + expression_node_ptr consequent = error_node(); + expression_node_ptr alternative = error_node(); + + bool result = true; + + if (0 == condition) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR051 - Encountered invalid condition branch for ternary if-statement", + exprtk_error_location)); + + return error_node(); + } + else if (!token_is(token_t::e_ternary)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR052 - Expected '?' after condition of ternary if-statement", + exprtk_error_location)); + + result = false; + } + else if (0 == (consequent = parse_expression())) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR053 - Failed to parse consequent for ternary if-statement", + exprtk_error_location)); + + result = false; + } + else if (!token_is(token_t::e_colon)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR054 - Expected ':' between ternary if-statement consequent and alternative", + exprtk_error_location)); + + result = false; + } + else if (0 == (alternative = parse_expression())) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR055 - Failed to parse alternative for ternary if-statement", + exprtk_error_location)); + + result = false; + } + + #ifndef exprtk_disable_string_capabilities + if (result) + { + const bool consq_is_str = is_generally_string_node(consequent ); + const bool alter_is_str = is_generally_string_node(alternative); + + if (consq_is_str || alter_is_str) + { + if (consq_is_str && alter_is_str) + { + return expression_generator_ + .conditional_string(condition, consequent, alternative); + } + + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR056 - Return types of ternary differ: string/non-string", + exprtk_error_location)); + + result = false; + } + } + #endif + + if (result) + { + const bool consq_is_vec = is_ivector_node(consequent ); + const bool alter_is_vec = is_ivector_node(alternative); + + if (consq_is_vec || alter_is_vec) + { + if (consq_is_vec && alter_is_vec) + { + return expression_generator_ + .conditional_vector(condition, consequent, alternative); + } + + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR057 - Return types of ternary differ: vector/non-vector", + exprtk_error_location)); + + result = false; + } + } + + if (!result) + { + free_node(node_allocator_, condition ); + free_node(node_allocator_, consequent ); + free_node(node_allocator_, alternative); + + return error_node(); + } + else + return expression_generator_ + .conditional(condition, consequent, alternative); + } + + inline expression_node_ptr parse_not_statement() + { + if (settings_.logic_disabled("not")) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR058 - Invalid or disabled logic operation 'not'", + exprtk_error_location)); + + return error_node(); + } + + return parse_base_operation(); + } + + void handle_brkcnt_scope_exit() + { + assert(!brkcnt_list_.empty()); + brkcnt_list_.pop_front(); + } + + inline expression_node_ptr parse_while_loop() + { + // Parse: [while][(][test expr][)][{][expression][}] + expression_node_ptr condition = error_node(); + expression_node_ptr branch = error_node(); + expression_node_ptr result_node = error_node(); + + bool result = true; + + next_token(); + + if (!token_is(token_t::e_lbracket)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR059 - Expected '(' at start of while-loop condition statement", + exprtk_error_location)); + + return error_node(); + } + else if (0 == (condition = parse_expression())) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR060 - Failed to parse condition for while-loop", + exprtk_error_location)); + + return error_node(); + } + else if (!token_is(token_t::e_rbracket)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR061 - Expected ')' at end of while-loop condition statement", + exprtk_error_location)); + + result = false; + } + + brkcnt_list_.push_front(false); + + if (result) + { + scoped_inc_dec sid(state_.parsing_loop_stmt_count); + + if (0 == (branch = parse_multi_sequence("while-loop", true))) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR062 - Failed to parse body of while-loop")); + result = false; + } + else if (0 == (result_node = expression_generator_.while_loop(condition, + branch, + brkcnt_list_.front()))) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR063 - Failed to synthesize while-loop", + exprtk_error_location)); + + result = false; + } + } + + handle_brkcnt_scope_exit(); + + if (!result) + { + free_node(node_allocator_, branch ); + free_node(node_allocator_, condition ); + free_node(node_allocator_, result_node); + + return error_node(); + } + + return result_node; + } + + inline expression_node_ptr parse_repeat_until_loop() + { + // Parse: [repeat][{][expression][}][until][(][test expr][)] + expression_node_ptr condition = error_node(); + expression_node_ptr branch = error_node(); + next_token(); + + std::vector arg_list; + std::vector side_effect_list; + + scoped_vec_delete sdd((*this),arg_list); + + brkcnt_list_.push_front(false); + + if (details::imatch(current_token().value,"until")) + { + next_token(); + branch = node_allocator_.allocate >(); + } + else + { + const token_t::token_type seperator = token_t::e_eof; + + scope_handler sh(*this); + + scoped_bool_or_restorer sbr(state_.side_effect_present); + + scoped_inc_dec sid(state_.parsing_loop_stmt_count); + + for ( ; ; ) + { + state_.side_effect_present = false; + + expression_node_ptr arg = parse_expression(); + + if (0 == arg) + return error_node(); + else + { + arg_list.push_back(arg); + side_effect_list.push_back(state_.side_effect_present); + } + + if (details::imatch(current_token().value,"until")) + { + next_token(); + break; + } + + const bool is_next_until = peek_token_is(token_t::e_symbol) && + peek_token_is("until"); + + if (!token_is(seperator) && is_next_until) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR064 - Expected '" + token_t::to_str(seperator) + "' in body of repeat until loop", + exprtk_error_location)); + + return error_node(); + } + + if (details::imatch(current_token().value,"until")) + { + next_token(); + break; + } + } + + branch = simplify(arg_list,side_effect_list); + + sdd.delete_ptr = (0 == branch); + + if (sdd.delete_ptr) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR065 - Failed to parse body of repeat until loop", + exprtk_error_location)); + + return error_node(); + } + } + + if (!token_is(token_t::e_lbracket)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR066 - Expected '(' before condition statement of repeat until loop", + exprtk_error_location)); + + free_node(node_allocator_,branch); + return error_node(); + } + else if (0 == (condition = parse_expression())) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR067 - Failed to parse condition for repeat until loop", + exprtk_error_location)); + + free_node(node_allocator_,branch); + return error_node(); + } + else if (!token_is(token_t::e_rbracket)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR068 - Expected ')' after condition of repeat until loop", + exprtk_error_location)); + + free_node(node_allocator_, branch ); + free_node(node_allocator_, condition); + + return error_node(); + } + + expression_node_ptr result; + + result = expression_generator_ + .repeat_until_loop(condition, branch, brkcnt_list_.front()); + + if (0 == result) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR069 - Failed to synthesize repeat until loop", + exprtk_error_location)); + + free_node(node_allocator_,condition); + + return error_node(); + } + + handle_brkcnt_scope_exit(); + + return result; + } + + inline expression_node_ptr parse_for_loop() + { + expression_node_ptr initialiser = error_node(); + expression_node_ptr condition = error_node(); + expression_node_ptr incrementor = error_node(); + expression_node_ptr loop_body = error_node(); + + scope_element* se = 0; + bool result = true; + + next_token(); + + scope_handler sh(*this); + + if (!token_is(token_t::e_lbracket)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR070 - Expected '(' at start of for-loop", + exprtk_error_location)); + + return error_node(); + } + + if (!token_is(token_t::e_eof)) + { + if ( + !token_is(token_t::e_symbol,prsrhlpr_t::e_hold) && + details::imatch(current_token().value,"var") + ) + { + next_token(); + + if (!token_is(token_t::e_symbol,prsrhlpr_t::e_hold)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR071 - Expected a variable at the start of initialiser section of for-loop", + exprtk_error_location)); + + return error_node(); + } + else if (!peek_token_is(token_t::e_assign)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR072 - Expected variable assignment of initialiser section of for-loop", + exprtk_error_location)); + + return error_node(); + } + + const std::string loop_counter_symbol = current_token().value; + + se = &sem_.get_element(loop_counter_symbol); + + if ((se->name == loop_counter_symbol) && se->active) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR073 - For-loop variable '" + loop_counter_symbol+ "' is being shadowed by a previous declaration", + exprtk_error_location)); + + return error_node(); + } + else if (!symtab_store_.is_variable(loop_counter_symbol)) + { + if ( + !se->active && + (se->name == loop_counter_symbol) && + (se->type == scope_element::e_variable) + ) + { + se->active = true; + se->ref_count++; + } + else + { + scope_element nse; + nse.name = loop_counter_symbol; + nse.active = true; + nse.ref_count = 1; + nse.type = scope_element::e_variable; + nse.depth = state_.scope_depth; + nse.data = new T(T(0)); + nse.var_node = node_allocator_.allocate(*reinterpret_cast(nse.data)); + + if (!sem_.add_element(nse)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR074 - Failed to add new local variable '" + loop_counter_symbol + "' to SEM", + exprtk_error_location)); + + sem_.free_element(nse); + + result = false; + } + else + { + exprtk_debug(("parse_for_loop() - INFO - Added new local variable: %s\n",nse.name.c_str())); + + state_.activate_side_effect("parse_for_loop()"); + } + } + } + } + + if (0 == (initialiser = parse_expression())) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR075 - Failed to parse initialiser of for-loop", + exprtk_error_location)); + + result = false; + } + else if (!token_is(token_t::e_eof)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR076 - Expected ';' after initialiser of for-loop", + exprtk_error_location)); + + result = false; + } + } + + if (!token_is(token_t::e_eof)) + { + if (0 == (condition = parse_expression())) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR077 - Failed to parse condition of for-loop", + exprtk_error_location)); + + result = false; + } + else if (!token_is(token_t::e_eof)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR078 - Expected ';' after condition section of for-loop", + exprtk_error_location)); + + result = false; + } + } + + if (!token_is(token_t::e_rbracket)) + { + if (0 == (incrementor = parse_expression())) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR079 - Failed to parse incrementor of for-loop", + exprtk_error_location)); + + result = false; + } + else if (!token_is(token_t::e_rbracket)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR080 - Expected ')' after incrementor section of for-loop", + exprtk_error_location)); + + result = false; + } + } + + if (result) + { + brkcnt_list_.push_front(false); + + scoped_inc_dec sid(state_.parsing_loop_stmt_count); + + if (0 == (loop_body = parse_multi_sequence("for-loop", true))) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR081 - Failed to parse body of for-loop", + exprtk_error_location)); + + result = false; + } + } + + if (!result) + { + if (se) + { + se->ref_count--; + } + + free_node(node_allocator_, initialiser); + free_node(node_allocator_, condition ); + free_node(node_allocator_, incrementor); + free_node(node_allocator_, loop_body ); + return error_node(); + } + + expression_node_ptr result_node = + expression_generator_.for_loop(initialiser, + condition, + incrementor, + loop_body, + brkcnt_list_.front()); + handle_brkcnt_scope_exit(); + + return result_node; + } + + inline expression_node_ptr parse_switch_statement() + { + std::vector arg_list; + expression_node_ptr result = error_node(); + + if (!details::imatch(current_token().value,"switch")) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR082 - Expected keyword 'switch'", + exprtk_error_location)); + + return error_node(); + } + + scoped_vec_delete svd((*this),arg_list); + + next_token(); + + if (!token_is(token_t::e_lcrlbracket)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR083 - Expected '{' for call to switch statement", + exprtk_error_location)); + + return error_node(); + } + + expression_node_ptr default_statement = error_node(); + + scoped_expression_delete defstmt_delete((*this), default_statement); + + for ( ; ; ) + { + if (details::imatch("case",current_token().value)) + { + next_token(); + + expression_node_ptr condition = parse_expression(); + + if (0 == condition) + return error_node(); + else if (!token_is(token_t::e_colon)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR084 - Expected ':' for case of switch statement", + exprtk_error_location)); + + free_node(node_allocator_, condition); + + return error_node(); + } + + expression_node_ptr consequent = parse_expression(); + + if (0 == consequent) + { + free_node(node_allocator_, condition); + + return error_node(); + } + else if (!token_is(token_t::e_eof)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR085 - Expected ';' at end of case for switch statement", + exprtk_error_location)); + + free_node(node_allocator_, condition ); + free_node(node_allocator_, consequent); + + return error_node(); + } + + // Can we optimise away the case statement? + if (is_constant_node(condition) && is_false(condition)) + { + free_node(node_allocator_, condition ); + free_node(node_allocator_, consequent); + } + else + { + arg_list.push_back(condition ); + arg_list.push_back(consequent); + } + + } + else if (details::imatch("default",current_token().value)) + { + if (0 != default_statement) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR086 - Multiple default cases for switch statement", + exprtk_error_location)); + + return error_node(); + } + + next_token(); + + if (!token_is(token_t::e_colon)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR087 - Expected ':' for default of switch statement", + exprtk_error_location)); + + return error_node(); + } + + if (token_is(token_t::e_lcrlbracket,prsrhlpr_t::e_hold)) + default_statement = parse_multi_sequence("switch-default"); + else + default_statement = parse_expression(); + + if (0 == default_statement) + return error_node(); + else if (!token_is(token_t::e_eof)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR088 - Expected ';' at end of default for switch statement", + exprtk_error_location)); + + return error_node(); + } + } + else if (token_is(token_t::e_rcrlbracket)) + break; + else + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR089 - Expected '}' at end of switch statement", + exprtk_error_location)); + + return error_node(); + } + } + + const bool default_statement_present = (0 != default_statement); + + if (default_statement_present) + { + arg_list.push_back(default_statement); + } + + result = expression_generator_.switch_statement(arg_list, (0 != default_statement)); + + svd.delete_ptr = (0 == result); + defstmt_delete.delete_ptr = (0 == result); + + return result; + } + + inline expression_node_ptr parse_multi_switch_statement() + { + std::vector arg_list; + + if (!details::imatch(current_token().value,"[*]")) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR090 - Expected token '[*]'", + exprtk_error_location)); + + return error_node(); + } + + scoped_vec_delete svd((*this),arg_list); + + next_token(); + + if (!token_is(token_t::e_lcrlbracket)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR091 - Expected '{' for call to [*] statement", + exprtk_error_location)); + + return error_node(); + } + + for ( ; ; ) + { + if (!details::imatch("case",current_token().value)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR092 - Expected a 'case' statement for multi-switch", + exprtk_error_location)); + + return error_node(); + } + + next_token(); + + expression_node_ptr condition = parse_expression(); + + if (0 == condition) + return error_node(); + + if (!token_is(token_t::e_colon)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR093 - Expected ':' for case of [*] statement", + exprtk_error_location)); + + return error_node(); + } + + expression_node_ptr consequent = parse_expression(); + + if (0 == consequent) + return error_node(); + + if (!token_is(token_t::e_eof)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR094 - Expected ';' at end of case for [*] statement", + exprtk_error_location)); + + return error_node(); + } + + // Can we optimise away the case statement? + if (is_constant_node(condition) && is_false(condition)) + { + free_node(node_allocator_, condition ); + free_node(node_allocator_, consequent); + } + else + { + arg_list.push_back(condition ); + arg_list.push_back(consequent); + } + + if (token_is(token_t::e_rcrlbracket,prsrhlpr_t::e_hold)) + { + break; + } + } + + if (!token_is(token_t::e_rcrlbracket)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR095 - Expected '}' at end of [*] statement", + exprtk_error_location)); + + return error_node(); + } + + const expression_node_ptr result = expression_generator_.multi_switch_statement(arg_list); + + svd.delete_ptr = (0 == result); + + return result; + } + + inline expression_node_ptr parse_vararg_function() + { + std::vector arg_list; + + details::operator_type opt_type = details::e_default; + const std::string symbol = current_token().value; + + if (details::imatch(symbol,"~")) + { + next_token(); + return parse_multi_sequence(); + } + else if (details::imatch(symbol,"[*]")) + { + return parse_multi_switch_statement(); + } + else if (details::imatch(symbol, "avg" )) opt_type = details::e_avg ; + else if (details::imatch(symbol, "mand")) opt_type = details::e_mand; + else if (details::imatch(symbol, "max" )) opt_type = details::e_max ; + else if (details::imatch(symbol, "min" )) opt_type = details::e_min ; + else if (details::imatch(symbol, "mor" )) opt_type = details::e_mor ; + else if (details::imatch(symbol, "mul" )) opt_type = details::e_prod; + else if (details::imatch(symbol, "sum" )) opt_type = details::e_sum ; + else + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR096 - Unsupported vararg function: " + symbol, + exprtk_error_location)); + + return error_node(); + } + + scoped_vec_delete sdd((*this),arg_list); + + lodge_symbol(symbol, e_st_function); + + next_token(); + + if (!token_is(token_t::e_lbracket)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR097 - Expected '(' for call to vararg function: " + symbol, + exprtk_error_location)); + + return error_node(); + } + + for ( ; ; ) + { + expression_node_ptr arg = parse_expression(); + + if (0 == arg) + return error_node(); + else + arg_list.push_back(arg); + + if (token_is(token_t::e_rbracket)) + break; + else if (!token_is(token_t::e_comma)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR098 - Expected ',' for call to vararg function: " + symbol, + exprtk_error_location)); + + return error_node(); + } + } + + const expression_node_ptr result = expression_generator_.vararg_function(opt_type,arg_list); + + sdd.delete_ptr = (0 == result); + return result; + } + + #ifndef exprtk_disable_string_capabilities + inline expression_node_ptr parse_string_range_statement(expression_node_ptr& expression) + { + if (!token_is(token_t::e_lsqrbracket)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR099 - Expected '[' as start of string range definition", + exprtk_error_location)); + + free_node(node_allocator_,expression); + + return error_node(); + } + else if (token_is(token_t::e_rsqrbracket)) + { + return node_allocator_.allocate >(expression); + } + + range_t rp; + + if (!parse_range(rp,true)) + { + free_node(node_allocator_,expression); + + return error_node(); + } + + expression_node_ptr result = expression_generator_(expression,rp); + + if (0 == result) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR100 - Failed to generate string range node", + exprtk_error_location)); + + free_node(node_allocator_,expression); + rp.free(); + } + + rp.clear(); + + return result; + } + #else + inline expression_node_ptr parse_string_range_statement(expression_node_ptr&) + { + return error_node(); + } + #endif + + inline void parse_pending_string_rangesize(expression_node_ptr& expression) + { + // Allow no more than 100 range calls, eg: s[][][]...[][] + const std::size_t max_rangesize_parses = 100; + + std::size_t i = 0; + + while + ( + (0 != expression) && + (i++ < max_rangesize_parses) && + error_list_.empty() && + is_generally_string_node(expression) && + token_is(token_t::e_lsqrbracket,prsrhlpr_t::e_hold) + ) + { + expression = parse_string_range_statement(expression); + } + } + + template class Sequence> + inline expression_node_ptr simplify(Sequence& expression_list, + Sequence& side_effect_list, + const bool specialise_on_final_type = false) + { + if (expression_list.empty()) + return error_node(); + else if (1 == expression_list.size()) + return expression_list[0]; + + Sequence tmp_expression_list; + + bool return_node_present = false; + + for (std::size_t i = 0; i < (expression_list.size() - 1); ++i) + { + if (is_variable_node(expression_list[i])) + continue; + else if ( + is_return_node (expression_list[i]) || + is_break_node (expression_list[i]) || + is_continue_node(expression_list[i]) + ) + { + tmp_expression_list.push_back(expression_list[i]); + + // Remove all subexpressions after first short-circuit + // node has been encountered. + + for (std::size_t j = i + 1; j < expression_list.size(); ++j) + { + free_node(node_allocator_,expression_list[j]); + } + + return_node_present = true; + + break; + } + else if ( + is_constant_node(expression_list[i]) || + is_null_node (expression_list[i]) || + !side_effect_list[i] + ) + { + free_node(node_allocator_,expression_list[i]); + continue; + } + else + tmp_expression_list.push_back(expression_list[i]); + } + + if (!return_node_present) + { + tmp_expression_list.push_back(expression_list.back()); + } + + expression_list.swap(tmp_expression_list); + + if (tmp_expression_list.size() > expression_list.size()) + { + exprtk_debug(("simplify() - Reduced subexpressions from %d to %d\n", + static_cast(tmp_expression_list.size()), + static_cast(expression_list .size()))); + } + + if ( + return_node_present || + side_effect_list.back() || + (expression_list.size() > 1) + ) + state_.activate_side_effect("simplify()"); + + if (1 == expression_list.size()) + return expression_list[0]; + else if (specialise_on_final_type && is_generally_string_node(expression_list.back())) + return expression_generator_.vararg_function(details::e_smulti,expression_list); + else + return expression_generator_.vararg_function(details::e_multi,expression_list); + } + + inline expression_node_ptr parse_multi_sequence(const std::string& source = "", + const bool enforce_crlbrackets = false) + { + token_t::token_type open_bracket = token_t::e_lcrlbracket; + token_t::token_type close_bracket = token_t::e_rcrlbracket; + token_t::token_type seperator = token_t::e_eof; + + if (!token_is(open_bracket)) + { + if (!enforce_crlbrackets && token_is(token_t::e_lbracket)) + { + open_bracket = token_t::e_lbracket; + close_bracket = token_t::e_rbracket; + seperator = token_t::e_comma; + } + else + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR101 - Expected '" + token_t::to_str(open_bracket) + "' for call to multi-sequence" + + ((!source.empty()) ? std::string(" section of " + source): ""), + exprtk_error_location)); + + return error_node(); + } + } + else if (token_is(close_bracket)) + { + return node_allocator_.allocate >(); + } + + std::vector arg_list; + std::vector side_effect_list; + + expression_node_ptr result = error_node(); + + scoped_vec_delete sdd((*this),arg_list); + + scope_handler sh(*this); + + scoped_bool_or_restorer sbr(state_.side_effect_present); + + for ( ; ; ) + { + state_.side_effect_present = false; + + expression_node_ptr arg = parse_expression(); + + if (0 == arg) + return error_node(); + else + { + arg_list.push_back(arg); + side_effect_list.push_back(state_.side_effect_present); + } + + if (token_is(close_bracket)) + break; + + const bool is_next_close = peek_token_is(close_bracket); + + if (!token_is(seperator) && is_next_close) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR102 - Expected '" + details::to_str(seperator) + "' for call to multi-sequence section of " + source, + exprtk_error_location)); + + return error_node(); + } + + if (token_is(close_bracket)) + break; + } + + result = simplify(arg_list, side_effect_list, source.empty()); + + sdd.delete_ptr = (0 == result); + return result; + } + + inline bool parse_range(range_t& rp, const bool skip_lsqr = false) + { + // Examples of valid ranges: + // 1. [1:5] -> 1..5 + // 2. [ :5] -> 0..5 + // 3. [1: ] -> 1..end + // 4. [x:y] -> x..y where x <= y + // 5. [x+1:y/2] -> x+1..y/2 where x+1 <= y/2 + // 6. [ :y] -> 0..y where 0 <= y + // 7. [x: ] -> x..end where x <= end + + rp.clear(); + + if (!skip_lsqr && !token_is(token_t::e_lsqrbracket)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR103 - Expected '[' for start of range", + exprtk_error_location)); + + return false; + } + + if (token_is(token_t::e_colon)) + { + rp.n0_c.first = true; + rp.n0_c.second = 0; + rp.cache.first = 0; + } + else + { + expression_node_ptr r0 = parse_expression(); + + if (0 == r0) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR104 - Failed parse begin section of range", + exprtk_error_location)); + + return false; + } + else if (is_constant_node(r0)) + { + const T r0_value = r0->value(); + + if (r0_value >= T(0)) + { + rp.n0_c.first = true; + rp.n0_c.second = static_cast(details::numeric::to_int64(r0_value)); + rp.cache.first = rp.n0_c.second; + } + + free_node(node_allocator_,r0); + + if (r0_value < T(0)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR105 - Range lower bound less than zero! Constraint: r0 >= 0", + exprtk_error_location)); + + return false; + } + } + else + { + rp.n0_e.first = true; + rp.n0_e.second = r0; + } + + if (!token_is(token_t::e_colon)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR106 - Expected ':' for break in range", + exprtk_error_location)); + + rp.free(); + + return false; + } + } + + if (token_is(token_t::e_rsqrbracket)) + { + rp.n1_c.first = true; + rp.n1_c.second = std::numeric_limits::max(); + } + else + { + expression_node_ptr r1 = parse_expression(); + + if (0 == r1) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR107 - Failed parse end section of range", + exprtk_error_location)); + + rp.free(); + + return false; + } + else if (is_constant_node(r1)) + { + const T r1_value = r1->value(); + + if (r1_value >= T(0)) + { + rp.n1_c.first = true; + rp.n1_c.second = static_cast(details::numeric::to_int64(r1_value)); + rp.cache.second = rp.n1_c.second; + } + + free_node(node_allocator_,r1); + + if (r1_value < T(0)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR108 - Range upper bound less than zero! Constraint: r1 >= 0", + exprtk_error_location)); + + rp.free(); + + return false; + } + } + else + { + rp.n1_e.first = true; + rp.n1_e.second = r1; + } + + if (!token_is(token_t::e_rsqrbracket)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR109 - Expected ']' for start of range", + exprtk_error_location)); + + rp.free(); + + return false; + } + } + + if (rp.const_range()) + { + std::size_t r0 = 0; + std::size_t r1 = 0; + + bool rp_result = false; + + try + { + rp_result = rp(r0, r1); + } + catch (std::runtime_error&) + {} + + if (!rp_result || (r0 > r1)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR110 - Invalid range, Constraint: r0 <= r1", + exprtk_error_location)); + + return false; + } + } + + return true; + } + + inline void lodge_symbol(const std::string& symbol, + const symbol_type st) + { + dec_.add_symbol(symbol,st); + } + + #ifndef exprtk_disable_string_capabilities + inline expression_node_ptr parse_string() + { + const std::string symbol = current_token().value; + + typedef details::stringvar_node* strvar_node_t; + + expression_node_ptr result = error_node(); + strvar_node_t const_str_node = static_cast(0); + + scope_element& se = sem_.get_active_element(symbol); + + if (scope_element::e_string == se.type) + { + se.active = true; + result = se.str_node; + lodge_symbol(symbol, e_st_local_string); + } + else + { + if (!symtab_store_.is_conststr_stringvar(symbol)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR111 - Unknown string symbol", + exprtk_error_location)); + + return error_node(); + } + + result = symtab_store_.get_stringvar(symbol); + + if (symtab_store_.is_constant_string(symbol)) + { + const_str_node = static_cast(result); + result = expression_generator_(const_str_node->str()); + } + + lodge_symbol(symbol, e_st_string); + } + + if (peek_token_is(token_t::e_lsqrbracket)) + { + next_token(); + + if (peek_token_is(token_t::e_rsqrbracket)) + { + next_token(); + next_token(); + + if (const_str_node) + { + free_node(node_allocator_,result); + + return expression_generator_(T(const_str_node->size())); + } + else + return node_allocator_.allocate > + (static_cast*>(result)->ref()); + } + + range_t rp; + + if (!parse_range(rp)) + { + free_node(node_allocator_,result); + + return error_node(); + } + else if (const_str_node) + { + free_node(node_allocator_,result); + result = expression_generator_(const_str_node->ref(),rp); + } + else + result = expression_generator_(static_cast*> + (result)->ref(), rp); + + if (result) + rp.clear(); + } + else + next_token(); + + return result; + } + #else + inline expression_node_ptr parse_string() + { + return error_node(); + } + #endif + + #ifndef exprtk_disable_string_capabilities + inline expression_node_ptr parse_const_string() + { + const std::string const_str = current_token().value; + expression_node_ptr result = expression_generator_(const_str); + + if (peek_token_is(token_t::e_lsqrbracket)) + { + next_token(); + + if (peek_token_is(token_t::e_rsqrbracket)) + { + next_token(); + next_token(); + + free_node(node_allocator_,result); + + return expression_generator_(T(const_str.size())); + } + + range_t rp; + + if (!parse_range(rp)) + { + free_node(node_allocator_,result); + rp.free(); + + return error_node(); + } + + free_node(node_allocator_,result); + + if (rp.n1_c.first && (rp.n1_c.second == std::numeric_limits::max())) + { + rp.n1_c.second = const_str.size() - 1; + rp.cache.second = rp.n1_c.second; + } + + if ( + (rp.n0_c.first && (rp.n0_c.second >= const_str.size())) || + (rp.n1_c.first && (rp.n1_c.second >= const_str.size())) + ) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR112 - Overflow in range for string: '" + const_str + "'[" + + (rp.n0_c.first ? details::to_str(static_cast(rp.n0_c.second)) : "?") + ":" + + (rp.n1_c.first ? details::to_str(static_cast(rp.n1_c.second)) : "?") + "]", + exprtk_error_location)); + + rp.free(); + + return error_node(); + } + + result = expression_generator_(const_str,rp); + + if (result) + rp.clear(); + } + else + next_token(); + + return result; + } + #else + inline expression_node_ptr parse_const_string() + { + return error_node(); + } + #endif + + inline expression_node_ptr parse_vector() + { + const std::string symbol = current_token().value; + + vector_holder_ptr vec = vector_holder_ptr(0); + + const scope_element& se = sem_.get_active_element(symbol); + + if ( + !details::imatch(se.name, symbol) || + (se.depth > state_.scope_depth) || + (scope_element::e_vector != se.type) + ) + { + if (0 == (vec = symtab_store_.get_vector(symbol))) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR113 - Symbol '" + symbol+ " not a vector", + exprtk_error_location)); + + return error_node(); + } + } + else + vec = se.vec_node; + + expression_node_ptr index_expr = error_node(); + + next_token(); + + if (!token_is(token_t::e_lsqrbracket)) + { + return node_allocator_.allocate(vec); + } + else if (token_is(token_t::e_rsqrbracket)) + { + return expression_generator_(T(vec->size())); + } + else if (0 == (index_expr = parse_expression())) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR114 - Failed to parse index for vector: '" + symbol + "'", + exprtk_error_location)); + + return error_node(); + } + else if (!token_is(token_t::e_rsqrbracket)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR115 - Expected ']' for index of vector: '" + symbol + "'", + exprtk_error_location)); + + free_node(node_allocator_,index_expr); + + return error_node(); + } + + // Perform compile-time range check + if (details::is_constant_node(index_expr)) + { + const std::size_t index = static_cast(details::numeric::to_int32(index_expr->value())); + const std::size_t vec_size = vec->size(); + + if (index >= vec_size) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR116 - Index of " + details::to_str(index) + " out of range for " + "vector '" + symbol + "' of size " + details::to_str(vec_size), + exprtk_error_location)); + + free_node(node_allocator_,index_expr); + + return error_node(); + } + } + + return expression_generator_.vector_element(symbol, vec, index_expr); + } + + inline expression_node_ptr parse_vararg_function_call(ivararg_function* vararg_function, const std::string& vararg_function_name) + { + std::vector arg_list; + + expression_node_ptr result = error_node(); + + scoped_vec_delete sdd((*this),arg_list); + + next_token(); + + if (token_is(token_t::e_lbracket)) + { + if (token_is(token_t::e_rbracket)) + { + if (!vararg_function->allow_zero_parameters()) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR117 - Zero parameter call to vararg function: " + + vararg_function_name + " not allowed", + exprtk_error_location)); + + return error_node(); + } + } + else + { + for ( ; ; ) + { + expression_node_ptr arg = parse_expression(); + + if (0 == arg) + return error_node(); + else + arg_list.push_back(arg); + + if (token_is(token_t::e_rbracket)) + break; + else if (!token_is(token_t::e_comma)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR118 - Expected ',' for call to vararg function: " + + vararg_function_name, + exprtk_error_location)); + + return error_node(); + } + } + } + } + else if (!vararg_function->allow_zero_parameters()) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR119 - Zero parameter call to vararg function: " + + vararg_function_name + " not allowed", + exprtk_error_location)); + + return error_node(); + } + + if (arg_list.size() < vararg_function->min_num_args()) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR120 - Invalid number of parameters to call to vararg function: " + + vararg_function_name + ", require at least " + + details::to_str(static_cast(vararg_function->min_num_args())) + " parameters", + exprtk_error_location)); + + return error_node(); + } + else if (arg_list.size() > vararg_function->max_num_args()) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR121 - Invalid number of parameters to call to vararg function: " + + vararg_function_name + ", require no more than " + + details::to_str(static_cast(vararg_function->max_num_args())) + " parameters", + exprtk_error_location)); + + return error_node(); + } + + result = expression_generator_.vararg_function_call(vararg_function,arg_list); + + sdd.delete_ptr = (0 == result); + + return result; + } + + class type_checker + { + public: + + enum return_type_t + { + e_overload = ' ', + e_numeric = 'T', + e_string = 'S' + }; + + struct function_prototype_t + { + return_type_t return_type; + std::string param_seq; + }; + + typedef parser parser_t; + typedef std::vector function_definition_list_t; + + type_checker(parser_t& p, + const std::string& func_name, + const std::string& func_prototypes, + const return_type_t default_return_type) + : invalid_state_(true) + , parser_(p) + , function_name_(func_name) + , default_return_type_(default_return_type) + { + parse_function_prototypes(func_prototypes); + } + + bool verify(const std::string& param_seq, std::size_t& pseq_index) + { + if (function_definition_list_.empty()) + return true; + + std::vector > error_list; + + for (std::size_t i = 0; i < function_definition_list_.size(); ++i) + { + details::char_t diff_value = 0; + std::size_t diff_index = 0; + + const bool result = details::sequence_match(function_definition_list_[i].param_seq, + param_seq, + diff_index, diff_value); + + if (result) + { + pseq_index = i; + return true; + } + else + error_list.push_back(std::make_pair(diff_index, diff_value)); + } + + if (1 == error_list.size()) + { + parser_. + set_error( + make_error(parser_error::e_syntax, + parser_.current_token(), + "ERR122 - Failed parameter type check for function '" + function_name_ + "', " + "Expected '" + function_definition_list_[0].param_seq + + "' call set: '" + param_seq + "'", + exprtk_error_location)); + } + else + { + // find first with largest diff_index; + std::size_t max_diff_index = 0; + + for (std::size_t i = 1; i < error_list.size(); ++i) + { + if (error_list[i].first > error_list[max_diff_index].first) + { + max_diff_index = i; + } + } + + parser_. + set_error( + make_error(parser_error::e_syntax, + parser_.current_token(), + "ERR123 - Failed parameter type check for function '" + function_name_ + "', " + "Best match: '" + function_definition_list_[max_diff_index].param_seq + + "' call set: '" + param_seq + "'", + exprtk_error_location)); + } + + return false; + } + + std::size_t paramseq_count() const + { + return function_definition_list_.size(); + } + + std::string paramseq(const std::size_t& index) const + { + return function_definition_list_[index].param_seq; + } + + return_type_t return_type(const std::size_t& index) const + { + return function_definition_list_[index].return_type; + } + + bool invalid() const + { + return !invalid_state_; + } + + bool allow_zero_parameters() const + { + + for (std::size_t i = 0; i < function_definition_list_.size(); ++i) + { + if (std::string::npos != function_definition_list_[i].param_seq.find("Z")) + { + return true; + } + } + + return false; + } + + private: + + std::vector split_param_seq(const std::string& param_seq, const details::char_t delimiter = '|') const + { + std::string::const_iterator current_begin = param_seq.begin(); + std::string::const_iterator iter = param_seq.begin(); + + std::vector result; + + while (iter != param_seq.end()) + { + if (*iter == delimiter) + { + result.push_back(std::string(current_begin, iter)); + current_begin = ++iter; + } + else + ++iter; + } + + if (current_begin != iter) + { + result.push_back(std::string(current_begin, iter)); + } + + return result; + } + + inline bool is_valid_token(std::string param_seq, + function_prototype_t& funcproto) const + { + // Determine return type + funcproto.return_type = default_return_type_; + + if (param_seq.size() > 2) + { + if (':' == param_seq[1]) + { + // Note: Only overloaded igeneric functions can have return + // type definitions. + if (type_checker::e_overload != default_return_type_) + return false; + + switch (param_seq[0]) + { + case 'T' : funcproto.return_type = type_checker::e_numeric; + break; + + case 'S' : funcproto.return_type = type_checker::e_string; + break; + + default : return false; + } + + param_seq.erase(0,2); + } + } + + if ( + (std::string::npos != param_seq.find("?*")) || + (std::string::npos != param_seq.find("**")) + ) + { + return false; + } + else if ( + (std::string::npos == param_seq.find_first_not_of("STV*?|")) || + ("Z" == param_seq) + ) + { + funcproto.param_seq = param_seq; + return true; + } + + return false; + } + + void parse_function_prototypes(const std::string& func_prototypes) + { + if (func_prototypes.empty()) + return; + + std::vector param_seq_list = split_param_seq(func_prototypes); + + typedef std::map param_seq_map_t; + param_seq_map_t param_seq_map; + + for (std::size_t i = 0; i < param_seq_list.size(); ++i) + { + function_prototype_t func_proto; + + if (!is_valid_token(param_seq_list[i], func_proto)) + { + invalid_state_ = false; + + parser_. + set_error( + make_error(parser_error::e_syntax, + parser_.current_token(), + "ERR124 - Invalid parameter sequence of '" + param_seq_list[i] + + "' for function: " + function_name_, + exprtk_error_location)); + return; + } + + param_seq_map_t::const_iterator seq_itr = param_seq_map.find(param_seq_list[i]); + + if (param_seq_map.end() != seq_itr) + { + invalid_state_ = false; + + parser_. + set_error( + make_error(parser_error::e_syntax, + parser_.current_token(), + "ERR125 - Function '" + function_name_ + "' has a parameter sequence conflict between " + + "pseq_idx[" + details::to_str(seq_itr->second) + "] and" + + "pseq_idx[" + details::to_str(i) + "] " + + "param seq: " + param_seq_list[i], + exprtk_error_location)); + return; + } + + function_definition_list_.push_back(func_proto); + } + } + + type_checker(const type_checker&) exprtk_delete; + type_checker& operator=(const type_checker&) exprtk_delete; + + bool invalid_state_; + parser_t& parser_; + std::string function_name_; + const return_type_t default_return_type_; + function_definition_list_t function_definition_list_; + }; + + inline expression_node_ptr parse_generic_function_call(igeneric_function* function, const std::string& function_name) + { + std::vector arg_list; + + scoped_vec_delete sdd((*this),arg_list); + + next_token(); + + std::string param_type_list; + + type_checker tc( + (*this), + function_name, + function->parameter_sequence, + type_checker::e_string); + + if (tc.invalid()) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR126 - Type checker instantiation failure for generic function: " + function_name, + exprtk_error_location)); + + return error_node(); + } + + if (token_is(token_t::e_lbracket)) + { + if (token_is(token_t::e_rbracket)) + { + if ( + !function->allow_zero_parameters() && + !tc .allow_zero_parameters() + ) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR127 - Zero parameter call to generic function: " + + function_name + " not allowed", + exprtk_error_location)); + + return error_node(); + } + } + else + { + for ( ; ; ) + { + expression_node_ptr arg = parse_expression(); + + if (0 == arg) + return error_node(); + + if (is_ivector_node(arg)) + param_type_list += 'V'; + else if (is_generally_string_node(arg)) + param_type_list += 'S'; + else // Everything else is assumed to be a scalar returning expression + param_type_list += 'T'; + + arg_list.push_back(arg); + + if (token_is(token_t::e_rbracket)) + break; + else if (!token_is(token_t::e_comma)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR128 - Expected ',' for call to generic function: " + function_name, + exprtk_error_location)); + + return error_node(); + } + } + } + } + else if ( + !function->parameter_sequence.empty() && + function->allow_zero_parameters () && + !tc .allow_zero_parameters () + ) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR129 - Zero parameter call to generic function: " + + function_name + " not allowed", + exprtk_error_location)); + + return error_node(); + } + + std::size_t param_seq_index = 0; + + if ( + state_.type_check_enabled && + !tc.verify(param_type_list, param_seq_index) + ) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR130 - Invalid input parameter sequence for call to generic function: " + function_name, + exprtk_error_location)); + + return error_node(); + } + + expression_node_ptr result = error_node(); + + if (tc.paramseq_count() <= 1) + result = expression_generator_ + .generic_function_call(function, arg_list); + else + result = expression_generator_ + .generic_function_call(function, arg_list, param_seq_index); + + sdd.delete_ptr = (0 == result); + + return result; + } + + inline bool parse_igeneric_function_params(std::string& param_type_list, + std::vector& arg_list, + const std::string& function_name, + igeneric_function* function, + const type_checker& tc) + { + if (token_is(token_t::e_lbracket)) + { + if (token_is(token_t::e_rbracket)) + { + if ( + !function->allow_zero_parameters() && + !tc .allow_zero_parameters() + ) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR131 - Zero parameter call to generic function: " + + function_name + " not allowed", + exprtk_error_location)); + + return false; + } + } + else + { + for ( ; ; ) + { + expression_node_ptr arg = parse_expression(); + + if (0 == arg) + return false; + + if (is_ivector_node(arg)) + param_type_list += 'V'; + else if (is_generally_string_node(arg)) + param_type_list += 'S'; + else // Everything else is a scalar returning expression + param_type_list += 'T'; + + arg_list.push_back(arg); + + if (token_is(token_t::e_rbracket)) + break; + else if (!token_is(token_t::e_comma)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR132 - Expected ',' for call to string function: " + function_name, + exprtk_error_location)); + + return false; + } + } + } + + return true; + } + else + return false; + } + + #ifndef exprtk_disable_string_capabilities + inline expression_node_ptr parse_string_function_call(igeneric_function* function, const std::string& function_name) + { + // Move pass the function name + next_token(); + + std::string param_type_list; + + type_checker tc((*this), function_name, function->parameter_sequence, type_checker::e_string); + + if ( + (!function->parameter_sequence.empty()) && + (0 == tc.paramseq_count()) + ) + { + return error_node(); + } + + std::vector arg_list; + scoped_vec_delete sdd((*this),arg_list); + + if (!parse_igeneric_function_params(param_type_list, arg_list, function_name, function, tc)) + { + return error_node(); + } + + std::size_t param_seq_index = 0; + + if (!tc.verify(param_type_list, param_seq_index)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR133 - Invalid input parameter sequence for call to string function: " + function_name, + exprtk_error_location)); + + return error_node(); + } + + expression_node_ptr result = error_node(); + + if (tc.paramseq_count() <= 1) + result = expression_generator_ + .string_function_call(function, arg_list); + else + result = expression_generator_ + .string_function_call(function, arg_list, param_seq_index); + + sdd.delete_ptr = (0 == result); + + return result; + } + + inline expression_node_ptr parse_overload_function_call(igeneric_function* function, const std::string& function_name) + { + // Move pass the function name + next_token(); + + std::string param_type_list; + + type_checker tc((*this), function_name, function->parameter_sequence, type_checker::e_overload); + + if ( + (!function->parameter_sequence.empty()) && + (0 == tc.paramseq_count()) + ) + { + return error_node(); + } + + std::vector arg_list; + scoped_vec_delete sdd((*this),arg_list); + + if (!parse_igeneric_function_params(param_type_list, arg_list, function_name, function, tc)) + { + return error_node(); + } + + std::size_t param_seq_index = 0; + + if (!tc.verify(param_type_list, param_seq_index)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR134 - Invalid input parameter sequence for call to overloaded function: " + function_name, + exprtk_error_location)); + + return error_node(); + } + + expression_node_ptr result = error_node(); + + if (type_checker::e_numeric == tc.return_type(param_seq_index)) + { + if (tc.paramseq_count() <= 1) + result = expression_generator_ + .generic_function_call(function, arg_list); + else + result = expression_generator_ + .generic_function_call(function, arg_list, param_seq_index); + } + else if (type_checker::e_string == tc.return_type(param_seq_index)) + { + if (tc.paramseq_count() <= 1) + result = expression_generator_ + .string_function_call(function, arg_list); + else + result = expression_generator_ + .string_function_call(function, arg_list, param_seq_index); + } + else + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR135 - Invalid return type for call to overloaded function: " + function_name, + exprtk_error_location)); + } + + sdd.delete_ptr = (0 == result); + return result; + } + #endif + + template + struct parse_special_function_impl + { + static inline expression_node_ptr process(parser& p, const details::operator_type opt_type, const std::string& sf_name) + { + expression_node_ptr branch[NumberOfParameters]; + expression_node_ptr result = error_node(); + + std::fill_n(branch, NumberOfParameters, reinterpret_cast(0)); + + scoped_delete sd(p,branch); + + p.next_token(); + + if (!p.token_is(token_t::e_lbracket)) + { + p.set_error( + make_error(parser_error::e_syntax, + p.current_token(), + "ERR136 - Expected '(' for special function '" + sf_name + "'", + exprtk_error_location)); + + return error_node(); + } + + for (std::size_t i = 0; i < NumberOfParameters; ++i) + { + branch[i] = p.parse_expression(); + + if (0 == branch[i]) + { + return p.error_node(); + } + else if (i < (NumberOfParameters - 1)) + { + if (!p.token_is(token_t::e_comma)) + { + p.set_error( + make_error(parser_error::e_syntax, + p.current_token(), + "ERR137 - Expected ',' before next parameter of special function '" + sf_name + "'", + exprtk_error_location)); + + return p.error_node(); + } + } + } + + if (!p.token_is(token_t::e_rbracket)) + { + p.set_error( + make_error(parser_error::e_syntax, + p.current_token(), + "ERR138 - Invalid number of parameters for special function '" + sf_name + "'", + exprtk_error_location)); + + return p.error_node(); + } + else + result = p.expression_generator_.special_function(opt_type,branch); + + sd.delete_ptr = (0 == result); + + return result; + } + }; + + inline expression_node_ptr parse_special_function() + { + const std::string sf_name = current_token().value; + + // Expect: $fDD(expr0,expr1,expr2) or $fDD(expr0,expr1,expr2,expr3) + if ( + !details::is_digit(sf_name[2]) || + !details::is_digit(sf_name[3]) + ) + { + set_error( + make_error(parser_error::e_token, + current_token(), + "ERR139 - Invalid special function[1]: " + sf_name, + exprtk_error_location)); + + return error_node(); + } + + const int id = (sf_name[2] - '0') * 10 + + (sf_name[3] - '0'); + + if (id >= details::e_sffinal) + { + set_error( + make_error(parser_error::e_token, + current_token(), + "ERR140 - Invalid special function[2]: " + sf_name, + exprtk_error_location)); + + return error_node(); + } + + const int sf_3_to_4 = details::e_sf48; + const details::operator_type opt_type = details::operator_type(id + 1000); + const std::size_t NumberOfParameters = (id < (sf_3_to_4 - 1000)) ? 3U : 4U; + + switch (NumberOfParameters) + { + case 3 : return parse_special_function_impl::process((*this), opt_type, sf_name); + case 4 : return parse_special_function_impl::process((*this), opt_type, sf_name); + default : return error_node(); + } + } + + inline expression_node_ptr parse_null_statement() + { + next_token(); + return node_allocator_.allocate >(); + } + + #ifndef exprtk_disable_break_continue + inline expression_node_ptr parse_break_statement() + { + if (state_.parsing_break_stmt) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR141 - Invoking 'break' within a break call is not allowed", + exprtk_error_location)); + + return error_node(); + } + else if (0 == state_.parsing_loop_stmt_count) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR142 - Invalid use of 'break', allowed only in the scope of a loop", + exprtk_error_location)); + + return error_node(); + } + + scoped_bool_negator sbn(state_.parsing_break_stmt); + + if (!brkcnt_list_.empty()) + { + next_token(); + + brkcnt_list_.front() = true; + + expression_node_ptr return_expr = error_node(); + + if (token_is(token_t::e_lsqrbracket)) + { + if (0 == (return_expr = parse_expression())) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR143 - Failed to parse return expression for 'break' statement", + exprtk_error_location)); + + return error_node(); + } + else if (!token_is(token_t::e_rsqrbracket)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR144 - Expected ']' at the completion of break's return expression", + exprtk_error_location)); + + free_node(node_allocator_,return_expr); + + return error_node(); + } + } + + state_.activate_side_effect("parse_break_statement()"); + + return node_allocator_.allocate >(return_expr); + } + else + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR145 - Invalid use of 'break', allowed only in the scope of a loop", + exprtk_error_location)); + } + + return error_node(); + } + + inline expression_node_ptr parse_continue_statement() + { + if (0 == state_.parsing_loop_stmt_count) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR146 - Invalid use of 'continue', allowed only in the scope of a loop", + exprtk_error_location)); + + return error_node(); + } + else + { + next_token(); + + brkcnt_list_.front() = true; + state_.activate_side_effect("parse_continue_statement()"); + + return node_allocator_.allocate >(); + } + } + #endif + + inline expression_node_ptr parse_define_vector_statement(const std::string& vec_name) + { + expression_node_ptr size_expr = error_node(); + + if (!token_is(token_t::e_lsqrbracket)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR147 - Expected '[' as part of vector size definition", + exprtk_error_location)); + + return error_node(); + } + else if (0 == (size_expr = parse_expression())) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR148 - Failed to determine size of vector '" + vec_name + "'", + exprtk_error_location)); + + return error_node(); + } + else if (!is_constant_node(size_expr)) + { + free_node(node_allocator_,size_expr); + + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR149 - Expected a literal number as size of vector '" + vec_name + "'", + exprtk_error_location)); + + return error_node(); + } + + const T vector_size = size_expr->value(); + + free_node(node_allocator_,size_expr); + + const T max_vector_size = T(2000000000.0); + + if ( + (vector_size <= T(0)) || + std::not_equal_to() + (T(0),vector_size - details::numeric::trunc(vector_size)) || + (vector_size > max_vector_size) + ) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR150 - Invalid vector size. Must be an integer in the range [0,2e9], size: " + + details::to_str(details::numeric::to_int32(vector_size)), + exprtk_error_location)); + + return error_node(); + } + + std::vector vec_initilizer_list; + + scoped_vec_delete svd((*this),vec_initilizer_list); + + bool single_value_initialiser = false; + bool vec_to_vec_initialiser = false; + bool null_initialisation = false; + + if (!token_is(token_t::e_rsqrbracket)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR151 - Expected ']' as part of vector size definition", + exprtk_error_location)); + + return error_node(); + } + else if (!token_is(token_t::e_eof)) + { + if (!token_is(token_t::e_assign)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR152 - Expected ':=' as part of vector definition", + exprtk_error_location)); + + return error_node(); + } + else if (token_is(token_t::e_lsqrbracket)) + { + expression_node_ptr initialiser = parse_expression(); + + if (0 == initialiser) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR153 - Failed to parse single vector initialiser", + exprtk_error_location)); + + return error_node(); + } + + vec_initilizer_list.push_back(initialiser); + + if (!token_is(token_t::e_rsqrbracket)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR154 - Expected ']' to close single value vector initialiser", + exprtk_error_location)); + + return error_node(); + } + + single_value_initialiser = true; + } + else if (!token_is(token_t::e_lcrlbracket)) + { + expression_node_ptr initialiser = error_node(); + + // Is this a vector to vector assignment and initialisation? + if (token_t::e_symbol == current_token().type) + { + // Is it a locally defined vector? + const scope_element& se = sem_.get_active_element(current_token().value); + + if (scope_element::e_vector == se.type) + { + if (0 != (initialiser = parse_expression())) + vec_initilizer_list.push_back(initialiser); + else + return error_node(); + } + // Are we dealing with a user defined vector? + else if (symtab_store_.is_vector(current_token().value)) + { + lodge_symbol(current_token().value, e_st_vector); + + if (0 != (initialiser = parse_expression())) + vec_initilizer_list.push_back(initialiser); + else + return error_node(); + } + // Are we dealing with a null initialisation vector definition? + else if (token_is(token_t::e_symbol,"null")) + null_initialisation = true; + } + + if (!null_initialisation) + { + if (0 == initialiser) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR155 - Expected '{' as part of vector initialiser list", + exprtk_error_location)); + + return error_node(); + } + else + vec_to_vec_initialiser = true; + } + } + else if (!token_is(token_t::e_rcrlbracket)) + { + for ( ; ; ) + { + expression_node_ptr initialiser = parse_expression(); + + if (0 == initialiser) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR156 - Expected '{' as part of vector initialiser list", + exprtk_error_location)); + + return error_node(); + } + else + vec_initilizer_list.push_back(initialiser); + + if (token_is(token_t::e_rcrlbracket)) + break; + + const bool is_next_close = peek_token_is(token_t::e_rcrlbracket); + + if (!token_is(token_t::e_comma) && is_next_close) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR157 - Expected ',' between vector initialisers", + exprtk_error_location)); + + return error_node(); + } + + if (token_is(token_t::e_rcrlbracket)) + break; + } + } + + if ( + !token_is(token_t::e_rbracket , prsrhlpr_t::e_hold) && + !token_is(token_t::e_rcrlbracket, prsrhlpr_t::e_hold) && + !token_is(token_t::e_rsqrbracket, prsrhlpr_t::e_hold) + ) + { + if (!token_is(token_t::e_eof)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR158 - Expected ';' at end of vector definition", + exprtk_error_location)); + + return error_node(); + } + } + + if (vec_initilizer_list.size() > vector_size) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR159 - Initialiser list larger than the number of elements in the vector: '" + vec_name + "'", + exprtk_error_location)); + + return error_node(); + } + } + + typename symbol_table_t::vector_holder_ptr vec_holder = typename symbol_table_t::vector_holder_ptr(0); + + const std::size_t vec_size = static_cast(details::numeric::to_int32(vector_size)); + + scope_element& se = sem_.get_element(vec_name); + + if (se.name == vec_name) + { + if (se.active) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR160 - Illegal redefinition of local vector: '" + vec_name + "'", + exprtk_error_location)); + + return error_node(); + } + else if ( + (se.size == vec_size) && + (scope_element::e_vector == se.type) + ) + { + vec_holder = se.vec_node; + se.active = true; + se.depth = state_.scope_depth; + se.ref_count++; + } + } + + if (0 == vec_holder) + { + scope_element nse; + nse.name = vec_name; + nse.active = true; + nse.ref_count = 1; + nse.type = scope_element::e_vector; + nse.depth = state_.scope_depth; + nse.size = vec_size; + nse.data = new T[vec_size]; + nse.vec_node = new typename scope_element::vector_holder_t(reinterpret_cast(nse.data),nse.size); + + if (!sem_.add_element(nse)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR161 - Failed to add new local vector '" + vec_name + "' to SEM", + exprtk_error_location)); + + sem_.free_element(nse); + + return error_node(); + } + + vec_holder = nse.vec_node; + + exprtk_debug(("parse_define_vector_statement() - INFO - Added new local vector: %s[%d]\n", + nse.name.c_str(), + static_cast(nse.size))); + } + + state_.activate_side_effect("parse_define_vector_statement()"); + + lodge_symbol(vec_name, e_st_local_vector); + + expression_node_ptr result = error_node(); + + if (null_initialisation) + result = expression_generator_(T(0.0)); + else if (vec_to_vec_initialiser) + { + expression_node_ptr vec_node = node_allocator_.allocate(vec_holder); + + result = expression_generator_( + details::e_assign, + vec_node, + vec_initilizer_list[0]); + } + else + result = node_allocator_ + .allocate >( + (*vec_holder)[0], + vec_size, + vec_initilizer_list, + single_value_initialiser); + + svd.delete_ptr = (0 == result); + + return result; + } + + #ifndef exprtk_disable_string_capabilities + inline expression_node_ptr parse_define_string_statement(const std::string& str_name, expression_node_ptr initialisation_expression) + { + stringvar_node_t* str_node = reinterpret_cast(0); + + scope_element& se = sem_.get_element(str_name); + + if (se.name == str_name) + { + if (se.active) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR162 - Illegal redefinition of local variable: '" + str_name + "'", + exprtk_error_location)); + + free_node(node_allocator_,initialisation_expression); + + return error_node(); + } + else if (scope_element::e_string == se.type) + { + str_node = se.str_node; + se.active = true; + se.depth = state_.scope_depth; + se.ref_count++; + } + } + + if (0 == str_node) + { + scope_element nse; + nse.name = str_name; + nse.active = true; + nse.ref_count = 1; + nse.type = scope_element::e_string; + nse.depth = state_.scope_depth; + nse.data = new std::string; + nse.str_node = new stringvar_node_t(*reinterpret_cast(nse.data)); + + if (!sem_.add_element(nse)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR163 - Failed to add new local string variable '" + str_name + "' to SEM", + exprtk_error_location)); + + free_node(node_allocator_,initialisation_expression); + + sem_.free_element(nse); + + return error_node(); + } + + str_node = nse.str_node; + + exprtk_debug(("parse_define_string_statement() - INFO - Added new local string variable: %s\n",nse.name.c_str())); + } + + lodge_symbol(str_name, e_st_local_string); + + state_.activate_side_effect("parse_define_string_statement()"); + + expression_node_ptr branch[2] = {0}; + + branch[0] = str_node; + branch[1] = initialisation_expression; + + return expression_generator_(details::e_assign,branch); + } + #else + inline expression_node_ptr parse_define_string_statement(const std::string&, expression_node_ptr) + { + return error_node(); + } + #endif + + inline bool local_variable_is_shadowed(const std::string& symbol) + { + const scope_element& se = sem_.get_element(symbol); + return (se.name == symbol) && se.active; + } + + inline expression_node_ptr parse_define_var_statement() + { + if (settings_.vardef_disabled()) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR164 - Illegal variable definition", + exprtk_error_location)); + + return error_node(); + } + else if (!details::imatch(current_token().value,"var")) + { + return error_node(); + } + else + next_token(); + + const std::string var_name = current_token().value; + + expression_node_ptr initialisation_expression = error_node(); + + if (!token_is(token_t::e_symbol)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR165 - Expected a symbol for variable definition", + exprtk_error_location)); + + return error_node(); + } + else if (details::is_reserved_symbol(var_name)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR166 - Illegal redefinition of reserved keyword: '" + var_name + "'", + exprtk_error_location)); + + return error_node(); + } + else if (symtab_store_.symbol_exists(var_name)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR167 - Illegal redefinition of variable '" + var_name + "'", + exprtk_error_location)); + + return error_node(); + } + else if (local_variable_is_shadowed(var_name)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR168 - Illegal redefinition of local variable: '" + var_name + "'", + exprtk_error_location)); + + return error_node(); + } + else if (token_is(token_t::e_lsqrbracket,prsrhlpr_t::e_hold)) + { + return parse_define_vector_statement(var_name); + } + else if (token_is(token_t::e_lcrlbracket,prsrhlpr_t::e_hold)) + { + return parse_uninitialised_var_statement(var_name); + } + else if (token_is(token_t::e_assign)) + { + if (0 == (initialisation_expression = parse_expression())) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR169 - Failed to parse initialisation expression", + exprtk_error_location)); + + return error_node(); + } + } + + if ( + !token_is(token_t::e_rbracket , prsrhlpr_t::e_hold) && + !token_is(token_t::e_rcrlbracket, prsrhlpr_t::e_hold) && + !token_is(token_t::e_rsqrbracket, prsrhlpr_t::e_hold) + ) + { + if (!token_is(token_t::e_eof,prsrhlpr_t::e_hold)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR170 - Expected ';' after variable definition", + exprtk_error_location)); + + free_node(node_allocator_,initialisation_expression); + + return error_node(); + } + } + + if ( + (0 != initialisation_expression) && + details::is_generally_string_node(initialisation_expression) + ) + { + return parse_define_string_statement(var_name,initialisation_expression); + } + + expression_node_ptr var_node = reinterpret_cast(0); + + scope_element& se = sem_.get_element(var_name); + + if (se.name == var_name) + { + if (se.active) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR171 - Illegal redefinition of local variable: '" + var_name + "'", + exprtk_error_location)); + + free_node(node_allocator_, initialisation_expression); + + return error_node(); + } + else if (scope_element::e_variable == se.type) + { + var_node = se.var_node; + se.active = true; + se.depth = state_.scope_depth; + se.ref_count++; + } + } + + if (0 == var_node) + { + scope_element nse; + nse.name = var_name; + nse.active = true; + nse.ref_count = 1; + nse.type = scope_element::e_variable; + nse.depth = state_.scope_depth; + nse.data = new T(T(0)); + nse.var_node = node_allocator_.allocate(*reinterpret_cast(nse.data)); + + if (!sem_.add_element(nse)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR172 - Failed to add new local variable '" + var_name + "' to SEM", + exprtk_error_location)); + + free_node(node_allocator_, initialisation_expression); + + sem_.free_element(nse); + + return error_node(); + } + + var_node = nse.var_node; + + exprtk_debug(("parse_define_var_statement() - INFO - Added new local variable: %s\n",nse.name.c_str())); + } + + state_.activate_side_effect("parse_define_var_statement()"); + + lodge_symbol(var_name, e_st_local_variable); + + expression_node_ptr branch[2] = {0}; + + branch[0] = var_node; + branch[1] = initialisation_expression ? initialisation_expression : expression_generator_(T(0)); + + return expression_generator_(details::e_assign,branch); + } + + inline expression_node_ptr parse_uninitialised_var_statement(const std::string& var_name) + { + if ( + !token_is(token_t::e_lcrlbracket) || + !token_is(token_t::e_rcrlbracket) + ) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR173 - Expected a '{}' for uninitialised var definition", + exprtk_error_location)); + + return error_node(); + } + else if (!token_is(token_t::e_eof,prsrhlpr_t::e_hold)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR174 - Expected ';' after uninitialised variable definition", + exprtk_error_location)); + + return error_node(); + } + + expression_node_ptr var_node = reinterpret_cast(0); + + scope_element& se = sem_.get_element(var_name); + + if (se.name == var_name) + { + if (se.active) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR175 - Illegal redefinition of local variable: '" + var_name + "'", + exprtk_error_location)); + + return error_node(); + } + else if (scope_element::e_variable == se.type) + { + var_node = se.var_node; + se.active = true; + se.ref_count++; + } + } + + if (0 == var_node) + { + scope_element nse; + nse.name = var_name; + nse.active = true; + nse.ref_count = 1; + nse.type = scope_element::e_variable; + nse.depth = state_.scope_depth; + nse.ip_index = sem_.next_ip_index(); + nse.data = new T(T(0)); + nse.var_node = node_allocator_.allocate(*reinterpret_cast(nse.data)); + + if (!sem_.add_element(nse)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR176 - Failed to add new local variable '" + var_name + "' to SEM", + exprtk_error_location)); + + sem_.free_element(nse); + + return error_node(); + } + + exprtk_debug(("parse_uninitialised_var_statement() - INFO - Added new local variable: %s\n", + nse.name.c_str())); + } + + lodge_symbol(var_name, e_st_local_variable); + + state_.activate_side_effect("parse_uninitialised_var_statement()"); + + return expression_generator_(T(0)); + } + + inline expression_node_ptr parse_swap_statement() + { + if (!details::imatch(current_token().value,"swap")) + { + return error_node(); + } + else + next_token(); + + if (!token_is(token_t::e_lbracket)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR177 - Expected '(' at start of swap statement", + exprtk_error_location)); + + return error_node(); + } + + expression_node_ptr variable0 = error_node(); + expression_node_ptr variable1 = error_node(); + + bool variable0_generated = false; + bool variable1_generated = false; + + const std::string var0_name = current_token().value; + + if (!token_is(token_t::e_symbol,prsrhlpr_t::e_hold)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR178 - Expected a symbol for variable or vector element definition", + exprtk_error_location)); + + return error_node(); + } + else if (peek_token_is(token_t::e_lsqrbracket)) + { + if (0 == (variable0 = parse_vector())) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR179 - First parameter to swap is an invalid vector element: '" + var0_name + "'", + exprtk_error_location)); + + return error_node(); + } + + variable0_generated = true; + } + else + { + if (symtab_store_.is_variable(var0_name)) + { + variable0 = symtab_store_.get_variable(var0_name); + } + + const scope_element& se = sem_.get_element(var0_name); + + if ( + (se.active) && + (se.name == var0_name) && + (scope_element::e_variable == se.type) + ) + { + variable0 = se.var_node; + } + + lodge_symbol(var0_name, e_st_variable); + + if (0 == variable0) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR180 - First parameter to swap is an invalid variable: '" + var0_name + "'", + exprtk_error_location)); + + return error_node(); + } + else + next_token(); + } + + if (!token_is(token_t::e_comma)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR181 - Expected ',' between parameters to swap", + exprtk_error_location)); + + if (variable0_generated) + { + free_node(node_allocator_,variable0); + } + + return error_node(); + } + + const std::string var1_name = current_token().value; + + if (!token_is(token_t::e_symbol,prsrhlpr_t::e_hold)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR182 - Expected a symbol for variable or vector element definition", + exprtk_error_location)); + + if (variable0_generated) + { + free_node(node_allocator_,variable0); + } + + return error_node(); + } + else if (peek_token_is(token_t::e_lsqrbracket)) + { + if (0 == (variable1 = parse_vector())) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR183 - Second parameter to swap is an invalid vector element: '" + var1_name + "'", + exprtk_error_location)); + + if (variable0_generated) + { + free_node(node_allocator_,variable0); + } + + return error_node(); + } + + variable1_generated = true; + } + else + { + if (symtab_store_.is_variable(var1_name)) + { + variable1 = symtab_store_.get_variable(var1_name); + } + + const scope_element& se = sem_.get_element(var1_name); + + if ( + (se.active) && + (se.name == var1_name) && + (scope_element::e_variable == se.type) + ) + { + variable1 = se.var_node; + } + + lodge_symbol(var1_name, e_st_variable); + + if (0 == variable1) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR184 - Second parameter to swap is an invalid variable: '" + var1_name + "'", + exprtk_error_location)); + + if (variable0_generated) + { + free_node(node_allocator_,variable0); + } + + return error_node(); + } + else + next_token(); + } + + if (!token_is(token_t::e_rbracket)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR185 - Expected ')' at end of swap statement", + exprtk_error_location)); + + if (variable0_generated) + { + free_node(node_allocator_,variable0); + } + + if (variable1_generated) + { + free_node(node_allocator_,variable1); + } + + return error_node(); + } + + typedef details::variable_node* variable_node_ptr; + + variable_node_ptr v0 = variable_node_ptr(0); + variable_node_ptr v1 = variable_node_ptr(0); + + expression_node_ptr result = error_node(); + + if ( + (0 != (v0 = dynamic_cast(variable0))) && + (0 != (v1 = dynamic_cast(variable1))) + ) + { + result = node_allocator_.allocate >(v0, v1); + + if (variable0_generated) + { + free_node(node_allocator_,variable0); + } + + if (variable1_generated) + { + free_node(node_allocator_,variable1); + } + } + else + result = node_allocator_.allocate > + (variable0, variable1); + + state_.activate_side_effect("parse_swap_statement()"); + + return result; + } + + #ifndef exprtk_disable_return_statement + inline expression_node_ptr parse_return_statement() + { + if (state_.parsing_return_stmt) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR186 - Return call within a return call is not allowed", + exprtk_error_location)); + + return error_node(); + } + + scoped_bool_negator sbn(state_.parsing_return_stmt); + + std::vector arg_list; + + scoped_vec_delete sdd((*this),arg_list); + + if (!details::imatch(current_token().value,"return")) + { + return error_node(); + } + else + next_token(); + + if (!token_is(token_t::e_lsqrbracket)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR187 - Expected '[' at start of return statement", + exprtk_error_location)); + + return error_node(); + } + else if (!token_is(token_t::e_rsqrbracket)) + { + for ( ; ; ) + { + expression_node_ptr arg = parse_expression(); + + if (0 == arg) + return error_node(); + + arg_list.push_back(arg); + + if (token_is(token_t::e_rsqrbracket)) + break; + else if (!token_is(token_t::e_comma)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR188 - Expected ',' between values during call to return", + exprtk_error_location)); + + return error_node(); + } + } + } + else if (settings_.zero_return_disabled()) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR189 - Zero parameter return statement not allowed", + exprtk_error_location)); + + return error_node(); + } + + const lexer::token prev_token = current_token(); + + if (token_is(token_t::e_rsqrbracket)) + { + if (!arg_list.empty()) + { + set_error( + make_error(parser_error::e_syntax, + prev_token, + "ERR190 - Invalid ']' found during return call", + exprtk_error_location)); + + return error_node(); + } + } + + std::string ret_param_type_list; + + for (std::size_t i = 0; i < arg_list.size(); ++i) + { + if (0 == arg_list[i]) + return error_node(); + else if (is_ivector_node(arg_list[i])) + ret_param_type_list += 'V'; + else if (is_generally_string_node(arg_list[i])) + ret_param_type_list += 'S'; + else + ret_param_type_list += 'T'; + } + + dec_.retparam_list_.push_back(ret_param_type_list); + + expression_node_ptr result = expression_generator_.return_call(arg_list); + + sdd.delete_ptr = (0 == result); + + state_.return_stmt_present = true; + + state_.activate_side_effect("parse_return_statement()"); + + return result; + } + #else + inline expression_node_ptr parse_return_statement() + { + return error_node(); + } + #endif + + inline bool post_variable_process(const std::string& symbol) + { + if ( + peek_token_is(token_t::e_lbracket ) || + peek_token_is(token_t::e_lcrlbracket) || + peek_token_is(token_t::e_lsqrbracket) + ) + { + if (!settings_.commutative_check_enabled()) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR191 - Invalid sequence of variable '"+ symbol + "' and bracket", + exprtk_error_location)); + + return false; + } + + lexer().insert_front(token_t::e_mul); + } + + return true; + } + + inline bool post_bracket_process(const typename token_t::token_type& token, expression_node_ptr& branch) + { + bool implied_mul = false; + + if (details::is_generally_string_node(branch)) + return true; + + const lexer::parser_helper::token_advance_mode hold = prsrhlpr_t::e_hold; + + switch (token) + { + case token_t::e_lcrlbracket : implied_mul = token_is(token_t::e_lbracket ,hold) || + token_is(token_t::e_lcrlbracket,hold) || + token_is(token_t::e_lsqrbracket,hold) ; + break; + + case token_t::e_lbracket : implied_mul = token_is(token_t::e_lbracket ,hold) || + token_is(token_t::e_lcrlbracket,hold) || + token_is(token_t::e_lsqrbracket,hold) ; + break; + + case token_t::e_lsqrbracket : implied_mul = token_is(token_t::e_lbracket ,hold) || + token_is(token_t::e_lcrlbracket,hold) || + token_is(token_t::e_lsqrbracket,hold) ; + break; + + default : return true; + } + + if (implied_mul) + { + if (!settings_.commutative_check_enabled()) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR192 - Invalid sequence of brackets", + exprtk_error_location)); + + return false; + } + else if (token_t::e_eof != current_token().type) + { + lexer().insert_front(current_token().type); + lexer().insert_front(token_t::e_mul); + next_token(); + } + } + + return true; + } + + inline expression_node_ptr parse_symtab_symbol() + { + const std::string symbol = current_token().value; + + // Are we dealing with a variable or a special constant? + expression_node_ptr variable = symtab_store_.get_variable(symbol); + + if (variable) + { + if (symtab_store_.is_constant_node(symbol)) + { + variable = expression_generator_(variable->value()); + } + + if (!post_variable_process(symbol)) + return error_node(); + + lodge_symbol(symbol, e_st_variable); + next_token(); + + return variable; + } + + // Are we dealing with a locally defined variable, vector or string? + if (!sem_.empty()) + { + scope_element& se = sem_.get_active_element(symbol); + + if (se.active && details::imatch(se.name, symbol)) + { + if (scope_element::e_variable == se.type) + { + se.active = true; + lodge_symbol(symbol, e_st_local_variable); + + if (!post_variable_process(symbol)) + return error_node(); + + next_token(); + + return se.var_node; + } + else if (scope_element::e_vector == se.type) + { + return parse_vector(); + } + #ifndef exprtk_disable_string_capabilities + else if (scope_element::e_string == se.type) + { + return parse_string(); + } + #endif + } + } + + #ifndef exprtk_disable_string_capabilities + // Are we dealing with a string variable? + if (symtab_store_.is_stringvar(symbol)) + { + return parse_string(); + } + #endif + + { + // Are we dealing with a function? + ifunction* function = symtab_store_.get_function(symbol); + + if (function) + { + lodge_symbol(symbol, e_st_function); + + expression_node_ptr func_node = + parse_function_invocation(function,symbol); + + if (func_node) + return func_node; + else + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR193 - Failed to generate node for function: '" + symbol + "'", + exprtk_error_location)); + + return error_node(); + } + } + } + + { + // Are we dealing with a vararg function? + ivararg_function* vararg_function = symtab_store_.get_vararg_function(symbol); + + if (vararg_function) + { + lodge_symbol(symbol, e_st_function); + + expression_node_ptr vararg_func_node = + parse_vararg_function_call(vararg_function, symbol); + + if (vararg_func_node) + return vararg_func_node; + else + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR194 - Failed to generate node for vararg function: '" + symbol + "'", + exprtk_error_location)); + + return error_node(); + } + } + } + + { + // Are we dealing with a vararg generic function? + igeneric_function* generic_function = symtab_store_.get_generic_function(symbol); + + if (generic_function) + { + lodge_symbol(symbol, e_st_function); + + expression_node_ptr genericfunc_node = + parse_generic_function_call(generic_function, symbol); + + if (genericfunc_node) + return genericfunc_node; + else + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR195 - Failed to generate node for generic function: '" + symbol + "'", + exprtk_error_location)); + + return error_node(); + } + } + } + + #ifndef exprtk_disable_string_capabilities + { + // Are we dealing with a vararg string returning function? + igeneric_function* string_function = symtab_store_.get_string_function(symbol); + + if (string_function) + { + lodge_symbol(symbol, e_st_function); + + expression_node_ptr stringfunc_node = + parse_string_function_call(string_function, symbol); + + if (stringfunc_node) + return stringfunc_node; + else + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR196 - Failed to generate node for string function: '" + symbol + "'", + exprtk_error_location)); + + return error_node(); + } + } + } + + { + // Are we dealing with a vararg overloaded scalar/string returning function? + igeneric_function* overload_function = symtab_store_.get_overload_function(symbol); + + if (overload_function) + { + lodge_symbol(symbol, e_st_function); + + expression_node_ptr overloadfunc_node = + parse_overload_function_call(overload_function, symbol); + + if (overloadfunc_node) + return overloadfunc_node; + else + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR197 - Failed to generate node for overload function: '" + symbol + "'", + exprtk_error_location)); + + return error_node(); + } + } + } + #endif + + // Are we dealing with a vector? + if (symtab_store_.is_vector(symbol)) + { + lodge_symbol(symbol, e_st_vector); + return parse_vector(); + } + + if (details::is_reserved_symbol(symbol)) + { + if ( + settings_.function_enabled(symbol) || + !details::is_base_function(symbol) + ) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR198 - Invalid use of reserved symbol '" + symbol + "'", + exprtk_error_location)); + + return error_node(); + } + } + + // Should we handle unknown symbols? + if (resolve_unknown_symbol_ && unknown_symbol_resolver_) + { + if (!(settings_.rsrvd_sym_usr_disabled() && details::is_reserved_symbol(symbol))) + { + symbol_table_t& symtab = symtab_store_.get_symbol_table(); + + std::string error_message; + + if (unknown_symbol_resolver::e_usrmode_default == unknown_symbol_resolver_->mode) + { + T default_value = T(0); + + typename unknown_symbol_resolver::usr_symbol_type usr_symbol_type = unknown_symbol_resolver::e_usr_unknown_type; + + if (unknown_symbol_resolver_->process(symbol, usr_symbol_type, default_value, error_message)) + { + bool create_result = false; + + switch (usr_symbol_type) + { + case unknown_symbol_resolver::e_usr_variable_type : create_result = symtab.create_variable(symbol, default_value); + break; + + case unknown_symbol_resolver::e_usr_constant_type : create_result = symtab.add_constant(symbol, default_value); + break; + + default : create_result = false; + } + + if (create_result) + { + expression_node_ptr var = symtab_store_.get_variable(symbol); + + if (var) + { + if (symtab_store_.is_constant_node(symbol)) + { + var = expression_generator_(var->value()); + } + + lodge_symbol(symbol, e_st_variable); + + if (!post_variable_process(symbol)) + return error_node(); + + next_token(); + + return var; + } + } + } + + set_error( + make_error(parser_error::e_symtab, + current_token(), + "ERR199 - Failed to create variable: '" + symbol + "'" + + (error_message.empty() ? "" : " - " + error_message), + exprtk_error_location)); + + } + else if (unknown_symbol_resolver::e_usrmode_extended == unknown_symbol_resolver_->mode) + { + if (unknown_symbol_resolver_->process(symbol, symtab, error_message)) + { + expression_node_ptr result = parse_symtab_symbol(); + + if (result) + { + return result; + } + } + + set_error( + make_error(parser_error::e_symtab, + current_token(), + "ERR200 - Failed to resolve symbol: '" + symbol + "'" + + (error_message.empty() ? "" : " - " + error_message), + exprtk_error_location)); + } + + return error_node(); + } + } + + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR201 - Undefined symbol: '" + symbol + "'", + exprtk_error_location)); + + return error_node(); + } + + inline expression_node_ptr parse_symbol() + { + static const std::string symbol_if = "if" ; + static const std::string symbol_while = "while" ; + static const std::string symbol_repeat = "repeat" ; + static const std::string symbol_for = "for" ; + static const std::string symbol_switch = "switch" ; + static const std::string symbol_null = "null" ; + static const std::string symbol_break = "break" ; + static const std::string symbol_continue = "continue"; + static const std::string symbol_var = "var" ; + static const std::string symbol_swap = "swap" ; + static const std::string symbol_return = "return" ; + static const std::string symbol_not = "not" ; + + const std::string symbol = current_token().value; + + if (valid_vararg_operation(symbol)) + { + return parse_vararg_function(); + } + else if (details::imatch(symbol, symbol_not)) + { + return parse_not_statement(); + } + else if (valid_base_operation(symbol)) + { + return parse_base_operation(); + } + else if ( + details::imatch(symbol, symbol_if) && + settings_.control_struct_enabled(symbol) + ) + { + return parse_conditional_statement(); + } + else if ( + details::imatch(symbol, symbol_while) && + settings_.control_struct_enabled(symbol) + ) + { + return parse_while_loop(); + } + else if ( + details::imatch(symbol, symbol_repeat) && + settings_.control_struct_enabled(symbol) + ) + { + return parse_repeat_until_loop(); + } + else if ( + details::imatch(symbol, symbol_for) && + settings_.control_struct_enabled(symbol) + ) + { + return parse_for_loop(); + } + else if ( + details::imatch(symbol, symbol_switch) && + settings_.control_struct_enabled(symbol) + ) + { + return parse_switch_statement(); + } + else if (details::is_valid_sf_symbol(symbol)) + { + return parse_special_function(); + } + else if (details::imatch(symbol, symbol_null)) + { + return parse_null_statement(); + } + #ifndef exprtk_disable_break_continue + else if (details::imatch(symbol, symbol_break)) + { + return parse_break_statement(); + } + else if (details::imatch(symbol, symbol_continue)) + { + return parse_continue_statement(); + } + #endif + else if (details::imatch(symbol, symbol_var)) + { + return parse_define_var_statement(); + } + else if (details::imatch(symbol, symbol_swap)) + { + return parse_swap_statement(); + } + #ifndef exprtk_disable_return_statement + else if ( + details::imatch(symbol, symbol_return) && + settings_.control_struct_enabled(symbol) + ) + { + return parse_return_statement(); + } + #endif + else if (symtab_store_.valid() || !sem_.empty()) + { + return parse_symtab_symbol(); + } + else + { + set_error( + make_error(parser_error::e_symtab, + current_token(), + "ERR202 - Variable or function detected, yet symbol-table is invalid, Symbol: " + symbol, + exprtk_error_location)); + + return error_node(); + } + } + + inline expression_node_ptr parse_branch(precedence_level precedence = e_level00) + { + stack_limit_handler slh(*this); + + if (!slh) + { + return error_node(); + } + + expression_node_ptr branch = error_node(); + + if (token_t::e_number == current_token().type) + { + T numeric_value = T(0); + + if (details::string_to_real(current_token().value, numeric_value)) + { + expression_node_ptr literal_exp = expression_generator_(numeric_value); + + if (0 == literal_exp) + { + set_error( + make_error(parser_error::e_numeric, + current_token(), + "ERR203 - Failed generate node for scalar: '" + current_token().value + "'", + exprtk_error_location)); + + return error_node(); + } + + next_token(); + branch = literal_exp; + } + else + { + set_error( + make_error(parser_error::e_numeric, + current_token(), + "ERR204 - Failed to convert '" + current_token().value + "' to a number", + exprtk_error_location)); + + return error_node(); + } + } + else if (token_t::e_symbol == current_token().type) + { + branch = parse_symbol(); + } + #ifndef exprtk_disable_string_capabilities + else if (token_t::e_string == current_token().type) + { + branch = parse_const_string(); + } + #endif + else if (token_t::e_lbracket == current_token().type) + { + next_token(); + + if (0 == (branch = parse_expression())) + return error_node(); + else if (!token_is(token_t::e_rbracket)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR205 - Expected ')' instead of: '" + current_token().value + "'", + exprtk_error_location)); + + details::free_node(node_allocator_,branch); + + return error_node(); + } + else if (!post_bracket_process(token_t::e_lbracket,branch)) + { + details::free_node(node_allocator_,branch); + + return error_node(); + } + } + else if (token_t::e_lsqrbracket == current_token().type) + { + next_token(); + + if (0 == (branch = parse_expression())) + return error_node(); + else if (!token_is(token_t::e_rsqrbracket)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR206 - Expected ']' instead of: '" + current_token().value + "'", + exprtk_error_location)); + + details::free_node(node_allocator_,branch); + + return error_node(); + } + else if (!post_bracket_process(token_t::e_lsqrbracket,branch)) + { + details::free_node(node_allocator_,branch); + + return error_node(); + } + } + else if (token_t::e_lcrlbracket == current_token().type) + { + next_token(); + + if (0 == (branch = parse_expression())) + return error_node(); + else if (!token_is(token_t::e_rcrlbracket)) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR207 - Expected '}' instead of: '" + current_token().value + "'", + exprtk_error_location)); + + details::free_node(node_allocator_,branch); + + return error_node(); + } + else if (!post_bracket_process(token_t::e_lcrlbracket,branch)) + { + details::free_node(node_allocator_,branch); + + return error_node(); + } + } + else if (token_t::e_sub == current_token().type) + { + next_token(); + branch = parse_expression(e_level11); + + if ( + branch && + !( + details::is_neg_unary_node (branch) && + simplify_unary_negation_branch(branch) + ) + ) + { + expression_node_ptr result = expression_generator_(details::e_neg,branch); + + if (0 == result) + { + details::free_node(node_allocator_,branch); + + return error_node(); + } + else + branch = result; + } + } + else if (token_t::e_add == current_token().type) + { + next_token(); + branch = parse_expression(e_level13); + } + else if (token_t::e_eof == current_token().type) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR208 - Premature end of expression[1]", + exprtk_error_location)); + + return error_node(); + } + else + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR209 - Premature end of expression[2]", + exprtk_error_location)); + + return error_node(); + } + + if ( + branch && + (e_level00 == precedence) && + token_is(token_t::e_ternary,prsrhlpr_t::e_hold) + ) + { + branch = parse_ternary_conditional_statement(branch); + } + + parse_pending_string_rangesize(branch); + + return branch; + } + + template + class expression_generator + { + public: + + typedef details::expression_node* expression_node_ptr; + typedef expression_node_ptr (*synthesize_functor_t)(expression_generator&, const details::operator_type& operation, expression_node_ptr (&branch)[2]); + typedef std::map synthesize_map_t; + typedef typename exprtk::parser parser_t; + typedef const Type& vtype; + typedef const Type ctype; + + inline void init_synthesize_map() + { + #ifndef exprtk_disable_enhanced_features + synthesize_map_["(v)o(v)"] = synthesize_vov_expression::process; + synthesize_map_["(c)o(v)"] = synthesize_cov_expression::process; + synthesize_map_["(v)o(c)"] = synthesize_voc_expression::process; + + #define register_synthezier(S) \ + synthesize_map_[S ::node_type::id()] = S ::process; \ + + register_synthezier(synthesize_vovov_expression0) + register_synthezier(synthesize_vovov_expression1) + register_synthezier(synthesize_vovoc_expression0) + register_synthezier(synthesize_vovoc_expression1) + register_synthezier(synthesize_vocov_expression0) + register_synthezier(synthesize_vocov_expression1) + register_synthezier(synthesize_covov_expression0) + register_synthezier(synthesize_covov_expression1) + register_synthezier(synthesize_covoc_expression0) + register_synthezier(synthesize_covoc_expression1) + register_synthezier(synthesize_cocov_expression1) + register_synthezier(synthesize_vococ_expression0) + + register_synthezier(synthesize_vovovov_expression0) + register_synthezier(synthesize_vovovoc_expression0) + register_synthezier(synthesize_vovocov_expression0) + register_synthezier(synthesize_vocovov_expression0) + register_synthezier(synthesize_covovov_expression0) + register_synthezier(synthesize_covocov_expression0) + register_synthezier(synthesize_vocovoc_expression0) + register_synthezier(synthesize_covovoc_expression0) + register_synthezier(synthesize_vococov_expression0) + + register_synthezier(synthesize_vovovov_expression1) + register_synthezier(synthesize_vovovoc_expression1) + register_synthezier(synthesize_vovocov_expression1) + register_synthezier(synthesize_vocovov_expression1) + register_synthezier(synthesize_covovov_expression1) + register_synthezier(synthesize_covocov_expression1) + register_synthezier(synthesize_vocovoc_expression1) + register_synthezier(synthesize_covovoc_expression1) + register_synthezier(synthesize_vococov_expression1) + + register_synthezier(synthesize_vovovov_expression2) + register_synthezier(synthesize_vovovoc_expression2) + register_synthezier(synthesize_vovocov_expression2) + register_synthezier(synthesize_vocovov_expression2) + register_synthezier(synthesize_covovov_expression2) + register_synthezier(synthesize_covocov_expression2) + register_synthezier(synthesize_vocovoc_expression2) + register_synthezier(synthesize_covovoc_expression2) + + register_synthezier(synthesize_vovovov_expression3) + register_synthezier(synthesize_vovovoc_expression3) + register_synthezier(synthesize_vovocov_expression3) + register_synthezier(synthesize_vocovov_expression3) + register_synthezier(synthesize_covovov_expression3) + register_synthezier(synthesize_covocov_expression3) + register_synthezier(synthesize_vocovoc_expression3) + register_synthezier(synthesize_covovoc_expression3) + register_synthezier(synthesize_vococov_expression3) + + register_synthezier(synthesize_vovovov_expression4) + register_synthezier(synthesize_vovovoc_expression4) + register_synthezier(synthesize_vovocov_expression4) + register_synthezier(synthesize_vocovov_expression4) + register_synthezier(synthesize_covovov_expression4) + register_synthezier(synthesize_covocov_expression4) + register_synthezier(synthesize_vocovoc_expression4) + register_synthezier(synthesize_covovoc_expression4) + #endif + } + + inline void set_parser(parser_t& p) + { + parser_ = &p; + } + + inline void set_uom(unary_op_map_t& unary_op_map) + { + unary_op_map_ = &unary_op_map; + } + + inline void set_bom(binary_op_map_t& binary_op_map) + { + binary_op_map_ = &binary_op_map; + } + + inline void set_ibom(inv_binary_op_map_t& inv_binary_op_map) + { + inv_binary_op_map_ = &inv_binary_op_map; + } + + inline void set_sf3m(sf3_map_t& sf3_map) + { + sf3_map_ = &sf3_map; + } + + inline void set_sf4m(sf4_map_t& sf4_map) + { + sf4_map_ = &sf4_map; + } + + inline void set_allocator(details::node_allocator& na) + { + node_allocator_ = &na; + } + + inline void set_strength_reduction_state(const bool enabled) + { + strength_reduction_enabled_ = enabled; + } + + inline bool strength_reduction_enabled() const + { + return strength_reduction_enabled_; + } + + inline bool valid_operator(const details::operator_type& operation, binary_functor_t& bop) + { + typename binary_op_map_t::iterator bop_itr = binary_op_map_->find(operation); + + if ((*binary_op_map_).end() == bop_itr) + return false; + + bop = bop_itr->second; + + return true; + } + + inline bool valid_operator(const details::operator_type& operation, unary_functor_t& uop) + { + typename unary_op_map_t::iterator uop_itr = unary_op_map_->find(operation); + + if ((*unary_op_map_).end() == uop_itr) + return false; + + uop = uop_itr->second; + + return true; + } + + inline details::operator_type get_operator(const binary_functor_t& bop) const + { + return (*inv_binary_op_map_).find(bop)->second; + } + + inline expression_node_ptr operator() (const Type& v) const + { + return node_allocator_->allocate(v); + } + + #ifndef exprtk_disable_string_capabilities + inline expression_node_ptr operator() (const std::string& s) const + { + return node_allocator_->allocate(s); + } + + inline expression_node_ptr operator() (std::string& s, range_t& rp) const + { + return node_allocator_->allocate_rr(s,rp); + } + + inline expression_node_ptr operator() (const std::string& s, range_t& rp) const + { + return node_allocator_->allocate_tt(s,rp); + } + + inline expression_node_ptr operator() (expression_node_ptr branch, range_t& rp) const + { + if (is_generally_string_node(branch)) + return node_allocator_->allocate_tt(branch,rp); + else + return error_node(); + } + #endif + + inline bool unary_optimisable(const details::operator_type& operation) const + { + return (details::e_abs == operation) || (details::e_acos == operation) || + (details::e_acosh == operation) || (details::e_asin == operation) || + (details::e_asinh == operation) || (details::e_atan == operation) || + (details::e_atanh == operation) || (details::e_ceil == operation) || + (details::e_cos == operation) || (details::e_cosh == operation) || + (details::e_exp == operation) || (details::e_expm1 == operation) || + (details::e_floor == operation) || (details::e_log == operation) || + (details::e_log10 == operation) || (details::e_log2 == operation) || + (details::e_log1p == operation) || (details::e_neg == operation) || + (details::e_pos == operation) || (details::e_round == operation) || + (details::e_sin == operation) || (details::e_sinc == operation) || + (details::e_sinh == operation) || (details::e_sqrt == operation) || + (details::e_tan == operation) || (details::e_tanh == operation) || + (details::e_cot == operation) || (details::e_sec == operation) || + (details::e_csc == operation) || (details::e_r2d == operation) || + (details::e_d2r == operation) || (details::e_d2g == operation) || + (details::e_g2d == operation) || (details::e_notl == operation) || + (details::e_sgn == operation) || (details::e_erf == operation) || + (details::e_erfc == operation) || (details::e_ncdf == operation) || + (details::e_frac == operation) || (details::e_trunc == operation) ; + } + + inline bool sf3_optimisable(const std::string& sf3id, trinary_functor_t& tfunc) const + { + typename sf3_map_t::const_iterator itr = sf3_map_->find(sf3id); + + if (sf3_map_->end() == itr) + return false; + else + tfunc = itr->second.first; + + return true; + } + + inline bool sf4_optimisable(const std::string& sf4id, quaternary_functor_t& qfunc) const + { + typename sf4_map_t::const_iterator itr = sf4_map_->find(sf4id); + + if (sf4_map_->end() == itr) + return false; + else + qfunc = itr->second.first; + + return true; + } + + inline bool sf3_optimisable(const std::string& sf3id, details::operator_type& operation) const + { + typename sf3_map_t::const_iterator itr = sf3_map_->find(sf3id); + + if (sf3_map_->end() == itr) + return false; + else + operation = itr->second.second; + + return true; + } + + inline bool sf4_optimisable(const std::string& sf4id, details::operator_type& operation) const + { + typename sf4_map_t::const_iterator itr = sf4_map_->find(sf4id); + + if (sf4_map_->end() == itr) + return false; + else + operation = itr->second.second; + + return true; + } + + inline expression_node_ptr operator() (const details::operator_type& operation, expression_node_ptr (&branch)[1]) + { + if (0 == branch[0]) + { + return error_node(); + } + else if (details::is_null_node(branch[0])) + { + return branch[0]; + } + else if (details::is_break_node(branch[0])) + { + return error_node(); + } + else if (details::is_continue_node(branch[0])) + { + return error_node(); + } + else if (details::is_constant_node(branch[0])) + { + return synthesize_expression(operation,branch); + } + else if (unary_optimisable(operation) && details::is_variable_node(branch[0])) + { + return synthesize_uv_expression(operation,branch); + } + else if (unary_optimisable(operation) && details::is_ivector_node(branch[0])) + { + return synthesize_uvec_expression(operation,branch); + } + else + return synthesize_unary_expression(operation,branch); + } + + inline bool is_assignment_operation(const details::operator_type& operation) const + { + return ( + (details::e_addass == operation) || + (details::e_subass == operation) || + (details::e_mulass == operation) || + (details::e_divass == operation) || + (details::e_modass == operation) + ) && + parser_->settings_.assignment_enabled(operation); + } + + #ifndef exprtk_disable_string_capabilities + inline bool valid_string_operation(const details::operator_type& operation) const + { + return (details::e_add == operation) || + (details::e_lt == operation) || + (details::e_lte == operation) || + (details::e_gt == operation) || + (details::e_gte == operation) || + (details::e_eq == operation) || + (details::e_ne == operation) || + (details::e_in == operation) || + (details::e_like == operation) || + (details::e_ilike == operation) || + (details::e_assign == operation) || + (details::e_addass == operation) || + (details::e_swap == operation) ; + } + #else + inline bool valid_string_operation(const details::operator_type&) const + { + return false; + } + #endif + + inline std::string to_str(const details::operator_type& operation) const + { + switch (operation) + { + case details::e_add : return "+" ; + case details::e_sub : return "-" ; + case details::e_mul : return "*" ; + case details::e_div : return "/" ; + case details::e_mod : return "%" ; + case details::e_pow : return "^" ; + case details::e_lt : return "<" ; + case details::e_lte : return "<=" ; + case details::e_gt : return ">" ; + case details::e_gte : return ">=" ; + case details::e_eq : return "==" ; + case details::e_ne : return "!=" ; + case details::e_and : return "and" ; + case details::e_nand : return "nand" ; + case details::e_or : return "or" ; + case details::e_nor : return "nor" ; + case details::e_xor : return "xor" ; + case details::e_xnor : return "xnor" ; + default : return "UNKNOWN"; + } + } + + inline bool operation_optimisable(const details::operator_type& operation) const + { + return (details::e_add == operation) || + (details::e_sub == operation) || + (details::e_mul == operation) || + (details::e_div == operation) || + (details::e_mod == operation) || + (details::e_pow == operation) || + (details::e_lt == operation) || + (details::e_lte == operation) || + (details::e_gt == operation) || + (details::e_gte == operation) || + (details::e_eq == operation) || + (details::e_ne == operation) || + (details::e_and == operation) || + (details::e_nand == operation) || + (details::e_or == operation) || + (details::e_nor == operation) || + (details::e_xor == operation) || + (details::e_xnor == operation) ; + } + + inline std::string branch_to_id(expression_node_ptr branch) const + { + static const std::string null_str ("(null)" ); + static const std::string const_str ("(c)" ); + static const std::string var_str ("(v)" ); + static const std::string vov_str ("(vov)" ); + static const std::string cov_str ("(cov)" ); + static const std::string voc_str ("(voc)" ); + static const std::string str_str ("(s)" ); + static const std::string strrng_str ("(rngs)" ); + static const std::string cs_str ("(cs)" ); + static const std::string cstrrng_str("(crngs)"); + + if (details::is_null_node(branch)) + return null_str; + else if (details::is_constant_node(branch)) + return const_str; + else if (details::is_variable_node(branch)) + return var_str; + else if (details::is_vov_node(branch)) + return vov_str; + else if (details::is_cov_node(branch)) + return cov_str; + else if (details::is_voc_node(branch)) + return voc_str; + else if (details::is_string_node(branch)) + return str_str; + else if (details::is_const_string_node(branch)) + return cs_str; + else if (details::is_string_range_node(branch)) + return strrng_str; + else if (details::is_const_string_range_node(branch)) + return cstrrng_str; + else if (details::is_t0ot1ot2_node(branch)) + return "(" + dynamic_cast*>(branch)->type_id() + ")"; + else if (details::is_t0ot1ot2ot3_node(branch)) + return "(" + dynamic_cast*>(branch)->type_id() + ")"; + else + return "ERROR"; + } + + inline std::string branch_to_id(expression_node_ptr (&branch)[2]) const + { + return branch_to_id(branch[0]) + std::string("o") + branch_to_id(branch[1]); + } + + inline bool cov_optimisable(const details::operator_type& operation, expression_node_ptr (&branch)[2]) const + { + if (!operation_optimisable(operation)) + return false; + else + return details::is_constant_node(branch[0]) && + details::is_variable_node(branch[1]) ; + } + + inline bool voc_optimisable(const details::operator_type& operation, expression_node_ptr (&branch)[2]) const + { + if (!operation_optimisable(operation)) + return false; + else + return details::is_variable_node(branch[0]) && + details::is_constant_node(branch[1]) ; + } + + inline bool vov_optimisable(const details::operator_type& operation, expression_node_ptr (&branch)[2]) const + { + if (!operation_optimisable(operation)) + return false; + else + return details::is_variable_node(branch[0]) && + details::is_variable_node(branch[1]) ; + } + + inline bool cob_optimisable(const details::operator_type& operation, expression_node_ptr (&branch)[2]) const + { + if (!operation_optimisable(operation)) + return false; + else + return details::is_constant_node(branch[0]) && + !details::is_constant_node(branch[1]) ; + } + + inline bool boc_optimisable(const details::operator_type& operation, expression_node_ptr (&branch)[2]) const + { + if (!operation_optimisable(operation)) + return false; + else + return !details::is_constant_node(branch[0]) && + details::is_constant_node(branch[1]) ; + } + + inline bool cocob_optimisable(const details::operator_type& operation, expression_node_ptr (&branch)[2]) const + { + if ( + (details::e_add == operation) || + (details::e_sub == operation) || + (details::e_mul == operation) || + (details::e_div == operation) + ) + { + return (details::is_constant_node(branch[0]) && details::is_cob_node(branch[1])) || + (details::is_constant_node(branch[1]) && details::is_cob_node(branch[0])) ; + } + else + return false; + } + + inline bool coboc_optimisable(const details::operator_type& operation, expression_node_ptr (&branch)[2]) const + { + if ( + (details::e_add == operation) || + (details::e_sub == operation) || + (details::e_mul == operation) || + (details::e_div == operation) + ) + { + return (details::is_constant_node(branch[0]) && details::is_boc_node(branch[1])) || + (details::is_constant_node(branch[1]) && details::is_boc_node(branch[0])) ; + } + else + return false; + } + + inline bool uvouv_optimisable(const details::operator_type& operation, expression_node_ptr (&branch)[2]) const + { + if (!operation_optimisable(operation)) + return false; + else + return details::is_uv_node(branch[0]) && + details::is_uv_node(branch[1]) ; + } + + inline bool vob_optimisable(const details::operator_type& operation, expression_node_ptr (&branch)[2]) const + { + if (!operation_optimisable(operation)) + return false; + else + return details::is_variable_node(branch[0]) && + !details::is_variable_node(branch[1]) ; + } + + inline bool bov_optimisable(const details::operator_type& operation, expression_node_ptr (&branch)[2]) const + { + if (!operation_optimisable(operation)) + return false; + else + return !details::is_variable_node(branch[0]) && + details::is_variable_node(branch[1]) ; + } + + inline bool binext_optimisable(const details::operator_type& operation, expression_node_ptr (&branch)[2]) const + { + if (!operation_optimisable(operation)) + return false; + else + return !details::is_constant_node(branch[0]) || + !details::is_constant_node(branch[1]) ; + } + + inline bool is_invalid_assignment_op(const details::operator_type& operation, expression_node_ptr (&branch)[2]) const + { + if (is_assignment_operation(operation)) + { + const bool b1_is_genstring = details::is_generally_string_node(branch[1]); + + if (details::is_string_node(branch[0])) + return !b1_is_genstring; + else + return ( + !details::is_variable_node (branch[0]) && + !details::is_vector_elem_node (branch[0]) && + !details::is_rebasevector_elem_node (branch[0]) && + !details::is_rebasevector_celem_node(branch[0]) && + !details::is_vector_node (branch[0]) + ) + || b1_is_genstring; + } + else + return false; + } + + inline bool is_constpow_operation(const details::operator_type& operation, expression_node_ptr(&branch)[2]) const + { + if ( + !details::is_constant_node(branch[1]) || + details::is_constant_node(branch[0]) || + details::is_variable_node(branch[0]) || + details::is_vector_node (branch[0]) || + details::is_generally_string_node(branch[0]) + ) + return false; + + const Type c = static_cast*>(branch[1])->value(); + + return cardinal_pow_optimisable(operation, c); + } + + inline bool is_invalid_break_continue_op(expression_node_ptr (&branch)[2]) const + { + return ( + details::is_break_node (branch[0]) || + details::is_break_node (branch[1]) || + details::is_continue_node(branch[0]) || + details::is_continue_node(branch[1]) + ); + } + + inline bool is_invalid_string_op(const details::operator_type& operation, expression_node_ptr (&branch)[2]) const + { + const bool b0_string = is_generally_string_node(branch[0]); + const bool b1_string = is_generally_string_node(branch[1]); + + bool result = false; + + if (b0_string != b1_string) + result = true; + else if (!valid_string_operation(operation) && b0_string && b1_string) + result = true; + + if (result) + { + parser_->set_synthesis_error("Invalid string operation"); + } + + return result; + } + + inline bool is_invalid_string_op(const details::operator_type& operation, expression_node_ptr (&branch)[3]) const + { + const bool b0_string = is_generally_string_node(branch[0]); + const bool b1_string = is_generally_string_node(branch[1]); + const bool b2_string = is_generally_string_node(branch[2]); + + bool result = false; + + if ((b0_string != b1_string) || (b1_string != b2_string)) + result = true; + else if ((details::e_inrange != operation) && b0_string && b1_string && b2_string) + result = true; + + if (result) + { + parser_->set_synthesis_error("Invalid string operation"); + } + + return result; + } + + inline bool is_string_operation(const details::operator_type& operation, expression_node_ptr (&branch)[2]) const + { + const bool b0_string = is_generally_string_node(branch[0]); + const bool b1_string = is_generally_string_node(branch[1]); + + return (b0_string && b1_string && valid_string_operation(operation)); + } + + inline bool is_string_operation(const details::operator_type& operation, expression_node_ptr (&branch)[3]) const + { + const bool b0_string = is_generally_string_node(branch[0]); + const bool b1_string = is_generally_string_node(branch[1]); + const bool b2_string = is_generally_string_node(branch[2]); + + return (b0_string && b1_string && b2_string && (details::e_inrange == operation)); + } + + #ifndef exprtk_disable_sc_andor + inline bool is_shortcircuit_expression(const details::operator_type& operation) const + { + return ( + (details::e_scand == operation) || + (details::e_scor == operation) + ); + } + #else + inline bool is_shortcircuit_expression(const details::operator_type&) const + { + return false; + } + #endif + + inline bool is_null_present(expression_node_ptr (&branch)[2]) const + { + return ( + details::is_null_node(branch[0]) || + details::is_null_node(branch[1]) + ); + } + + inline bool is_vector_eqineq_logic_operation(const details::operator_type& operation, expression_node_ptr (&branch)[2]) const + { + if (!is_ivector_node(branch[0]) && !is_ivector_node(branch[1])) + return false; + else + return ( + (details::e_lt == operation) || + (details::e_lte == operation) || + (details::e_gt == operation) || + (details::e_gte == operation) || + (details::e_eq == operation) || + (details::e_ne == operation) || + (details::e_equal == operation) || + (details::e_and == operation) || + (details::e_nand == operation) || + (details::e_or == operation) || + (details::e_nor == operation) || + (details::e_xor == operation) || + (details::e_xnor == operation) + ); + } + + inline bool is_vector_arithmetic_operation(const details::operator_type& operation, expression_node_ptr (&branch)[2]) const + { + if (!is_ivector_node(branch[0]) && !is_ivector_node(branch[1])) + return false; + else + return ( + (details::e_add == operation) || + (details::e_sub == operation) || + (details::e_mul == operation) || + (details::e_div == operation) || + (details::e_pow == operation) + ); + } + + inline expression_node_ptr operator() (const details::operator_type& operation, expression_node_ptr (&branch)[2]) + { + if ((0 == branch[0]) || (0 == branch[1])) + { + return error_node(); + } + else if (is_invalid_string_op(operation,branch)) + { + return error_node(); + } + else if (is_invalid_assignment_op(operation,branch)) + { + return error_node(); + } + else if (is_invalid_break_continue_op(branch)) + { + return error_node(); + } + else if (details::e_assign == operation) + { + return synthesize_assignment_expression(operation, branch); + } + else if (details::e_swap == operation) + { + return synthesize_swap_expression(branch); + } + else if (is_assignment_operation(operation)) + { + return synthesize_assignment_operation_expression(operation, branch); + } + else if (is_vector_eqineq_logic_operation(operation, branch)) + { + return synthesize_veceqineqlogic_operation_expression(operation, branch); + } + else if (is_vector_arithmetic_operation(operation, branch)) + { + return synthesize_vecarithmetic_operation_expression(operation, branch); + } + else if (is_shortcircuit_expression(operation)) + { + return synthesize_shortcircuit_expression(operation, branch); + } + else if (is_string_operation(operation, branch)) + { + return synthesize_string_expression(operation, branch); + } + else if (is_null_present(branch)) + { + return synthesize_null_expression(operation, branch); + } + #ifndef exprtk_disable_cardinal_pow_optimisation + else if (is_constpow_operation(operation, branch)) + { + return cardinal_pow_optimisation(branch); + } + #endif + + expression_node_ptr result = error_node(); + + #ifndef exprtk_disable_enhanced_features + if (synthesize_expression(operation, branch, result)) + { + return result; + } + else + #endif + + { + /* + Possible reductions: + 1. c o cob -> cob + 2. cob o c -> cob + 3. c o boc -> boc + 4. boc o c -> boc + */ + result = error_node(); + + if (cocob_optimisable(operation, branch)) + { + result = synthesize_cocob_expression::process((*this), operation, branch); + } + else if (coboc_optimisable(operation, branch) && (0 == result)) + { + result = synthesize_coboc_expression::process((*this), operation, branch); + } + + if (result) + return result; + } + + if (uvouv_optimisable(operation, branch)) + { + return synthesize_uvouv_expression(operation, branch); + } + else if (vob_optimisable(operation, branch)) + { + return synthesize_vob_expression::process((*this), operation, branch); + } + else if (bov_optimisable(operation, branch)) + { + return synthesize_bov_expression::process((*this), operation, branch); + } + else if (cob_optimisable(operation, branch)) + { + return synthesize_cob_expression::process((*this), operation, branch); + } + else if (boc_optimisable(operation, branch)) + { + return synthesize_boc_expression::process((*this), operation, branch); + } + #ifndef exprtk_disable_enhanced_features + else if (cov_optimisable(operation, branch)) + { + return synthesize_cov_expression::process((*this), operation, branch); + } + #endif + else if (binext_optimisable(operation, branch)) + { + return synthesize_binary_ext_expression::process((*this), operation, branch); + } + else + return synthesize_expression(operation, branch); + } + + inline expression_node_ptr operator() (const details::operator_type& operation, expression_node_ptr (&branch)[3]) + { + if ( + (0 == branch[0]) || + (0 == branch[1]) || + (0 == branch[2]) + ) + { + details::free_all_nodes(*node_allocator_,branch); + + return error_node(); + } + else if (is_invalid_string_op(operation, branch)) + { + return error_node(); + } + else if (is_string_operation(operation, branch)) + { + return synthesize_string_expression(operation, branch); + } + else + return synthesize_expression(operation, branch); + } + + inline expression_node_ptr operator() (const details::operator_type& operation, expression_node_ptr (&branch)[4]) + { + return synthesize_expression(operation,branch); + } + + inline expression_node_ptr operator() (const details::operator_type& operation, expression_node_ptr b0) + { + expression_node_ptr branch[1] = { b0 }; + return (*this)(operation,branch); + } + + inline expression_node_ptr operator() (const details::operator_type& operation, expression_node_ptr& b0, expression_node_ptr& b1) + { + expression_node_ptr result = error_node(); + + if ((0 != b0) && (0 != b1)) + { + expression_node_ptr branch[2] = { b0, b1 }; + result = expression_generator::operator()(operation, branch); + b0 = branch[0]; + b1 = branch[1]; + } + + return result; + } + + inline expression_node_ptr conditional(expression_node_ptr condition, + expression_node_ptr consequent, + expression_node_ptr alternative) const + { + if ((0 == condition) || (0 == consequent)) + { + details::free_node(*node_allocator_, condition ); + details::free_node(*node_allocator_, consequent ); + details::free_node(*node_allocator_, alternative); + + return error_node(); + } + // Can the condition be immediately evaluated? if so optimise. + else if (details::is_constant_node(condition)) + { + // True branch + if (details::is_true(condition)) + { + details::free_node(*node_allocator_, condition ); + details::free_node(*node_allocator_, alternative); + + return consequent; + } + // False branch + else + { + details::free_node(*node_allocator_, condition ); + details::free_node(*node_allocator_, consequent); + + if (alternative) + return alternative; + else + return node_allocator_->allocate >(); + } + } + else if ((0 != consequent) && (0 != alternative)) + { + return node_allocator_-> + allocate(condition, consequent, alternative); + } + else + return node_allocator_-> + allocate(condition, consequent); + } + + #ifndef exprtk_disable_string_capabilities + inline expression_node_ptr conditional_string(expression_node_ptr condition, + expression_node_ptr consequent, + expression_node_ptr alternative) const + { + if ((0 == condition) || (0 == consequent)) + { + details::free_node(*node_allocator_, condition ); + details::free_node(*node_allocator_, consequent ); + details::free_node(*node_allocator_, alternative); + + return error_node(); + } + // Can the condition be immediately evaluated? if so optimise. + else if (details::is_constant_node(condition)) + { + // True branch + if (details::is_true(condition)) + { + details::free_node(*node_allocator_, condition ); + details::free_node(*node_allocator_, alternative); + + return consequent; + } + // False branch + else + { + details::free_node(*node_allocator_, condition ); + details::free_node(*node_allocator_, consequent); + + if (alternative) + return alternative; + else + return node_allocator_-> + allocate_c >(""); + } + } + else if ((0 != consequent) && (0 != alternative)) + return node_allocator_-> + allocate(condition, consequent, alternative); + else + return error_node(); + } + #else + inline expression_node_ptr conditional_string(expression_node_ptr, + expression_node_ptr, + expression_node_ptr) const + { + return error_node(); + } + #endif + + inline expression_node_ptr conditional_vector(expression_node_ptr condition, + expression_node_ptr consequent, + expression_node_ptr alternative) const + { + if ((0 == condition) || (0 == consequent)) + { + details::free_node(*node_allocator_, condition ); + details::free_node(*node_allocator_, consequent ); + details::free_node(*node_allocator_, alternative); + + return error_node(); + } + // Can the condition be immediately evaluated? if so optimise. + else if (details::is_constant_node(condition)) + { + // True branch + if (details::is_true(condition)) + { + details::free_node(*node_allocator_, condition ); + details::free_node(*node_allocator_, alternative); + + return consequent; + } + // False branch + else + { + details::free_node(*node_allocator_, condition ); + details::free_node(*node_allocator_, consequent); + + if (alternative) + return alternative; + else + return node_allocator_->allocate >(); + + } + } + else if ((0 != consequent) && (0 != alternative)) + { + return node_allocator_-> + allocate(condition, consequent, alternative); + } + else + return error_node(); + } + + inline loop_runtime_check_ptr get_loop_runtime_check(const loop_runtime_check::loop_types loop_type) const + { + if ( + parser_->loop_runtime_check_ && + (loop_type == (parser_->loop_runtime_check_->loop_set & loop_type)) + ) + { + return parser_->loop_runtime_check_; + } + + return loop_runtime_check_ptr(0); + } + + inline expression_node_ptr while_loop(expression_node_ptr& condition, + expression_node_ptr& branch, + const bool break_continue_present = false) const + { + if (!break_continue_present && details::is_constant_node(condition)) + { + expression_node_ptr result = error_node(); + if (details::is_true(condition)) + // Infinite loops are not allowed. + result = error_node(); + else + result = node_allocator_->allocate >(); + + details::free_node(*node_allocator_, condition); + details::free_node(*node_allocator_, branch ); + + return result; + } + else if (details::is_null_node(condition)) + { + details::free_node(*node_allocator_,condition); + + return branch; + } + + loop_runtime_check_ptr rtc = get_loop_runtime_check(loop_runtime_check::e_while_loop); + + if (!break_continue_present) + { + if (rtc) + return node_allocator_->allocate + (condition, branch, rtc); + else + return node_allocator_->allocate + (condition, branch); + } + #ifndef exprtk_disable_break_continue + else + { + if (rtc) + return node_allocator_->allocate + (condition, branch, rtc); + else + return node_allocator_->allocate + (condition, branch); + } + #else + return error_node(); + #endif + } + + inline expression_node_ptr repeat_until_loop(expression_node_ptr& condition, + expression_node_ptr& branch, + const bool break_continue_present = false) const + { + if (!break_continue_present && details::is_constant_node(condition)) + { + if ( + details::is_true(condition) && + details::is_constant_node(branch) + ) + { + free_node(*node_allocator_,condition); + + return branch; + } + + details::free_node(*node_allocator_, condition); + details::free_node(*node_allocator_, branch ); + + return error_node(); + } + else if (details::is_null_node(condition)) + { + details::free_node(*node_allocator_,condition); + + return branch; + } + + loop_runtime_check_ptr rtc = get_loop_runtime_check(loop_runtime_check::e_repeat_until_loop); + + if (!break_continue_present) + { + if (rtc) + return node_allocator_->allocate + (condition, branch, rtc); + else + return node_allocator_->allocate + (condition, branch); + } + #ifndef exprtk_disable_break_continue + else + { + if (rtc) + return node_allocator_->allocate + (condition, branch, rtc); + else + return node_allocator_->allocate + (condition, branch); + } + #else + return error_node(); + #endif + } + + inline expression_node_ptr for_loop(expression_node_ptr& initialiser, + expression_node_ptr& condition, + expression_node_ptr& incrementor, + expression_node_ptr& loop_body, + bool break_continue_present = false) const + { + if (!break_continue_present && details::is_constant_node(condition)) + { + expression_node_ptr result = error_node(); + + if (details::is_true(condition)) + // Infinite loops are not allowed. + result = error_node(); + else + result = node_allocator_->allocate >(); + + details::free_node(*node_allocator_, initialiser); + details::free_node(*node_allocator_, condition ); + details::free_node(*node_allocator_, incrementor); + details::free_node(*node_allocator_, loop_body ); + + return result; + } + else if (details::is_null_node(condition) || (0 == condition)) + { + details::free_node(*node_allocator_, initialiser); + details::free_node(*node_allocator_, condition ); + details::free_node(*node_allocator_, incrementor); + + return loop_body; + } + + loop_runtime_check_ptr rtc = get_loop_runtime_check(loop_runtime_check::e_for_loop); + + if (!break_continue_present) + { + if (rtc) + return node_allocator_->allocate + ( + initialiser, + condition, + incrementor, + loop_body, + rtc + ); + else + return node_allocator_->allocate + ( + initialiser, + condition, + incrementor, + loop_body + ); + } + #ifndef exprtk_disable_break_continue + else + { + if (rtc) + return node_allocator_->allocate + ( + initialiser, + condition, + incrementor, + loop_body, + rtc + ); + else + return node_allocator_->allocate + ( + initialiser, + condition, + incrementor, + loop_body + ); + } + #else + return error_node(); + #endif + } + + template class Sequence> + inline expression_node_ptr const_optimise_switch(Sequence& arg_list) + { + expression_node_ptr result = error_node(); + + for (std::size_t i = 0; i < (arg_list.size() / 2); ++i) + { + expression_node_ptr condition = arg_list[(2 * i) ]; + expression_node_ptr consequent = arg_list[(2 * i) + 1]; + + if ((0 == result) && details::is_true(condition)) + { + result = consequent; + break; + } + } + + if (0 == result) + { + result = arg_list.back(); + } + + for (std::size_t i = 0; i < arg_list.size(); ++i) + { + expression_node_ptr current_expr = arg_list[i]; + + if (current_expr && (current_expr != result)) + { + free_node(*node_allocator_,current_expr); + } + } + + return result; + } + + template class Sequence> + inline expression_node_ptr const_optimise_mswitch(Sequence& arg_list) + { + expression_node_ptr result = error_node(); + + for (std::size_t i = 0; i < (arg_list.size() / 2); ++i) + { + expression_node_ptr condition = arg_list[(2 * i) ]; + expression_node_ptr consequent = arg_list[(2 * i) + 1]; + + if (details::is_true(condition)) + { + result = consequent; + } + } + + if (0 == result) + { + T zero = T(0); + result = node_allocator_->allocate(zero); + } + + for (std::size_t i = 0; i < arg_list.size(); ++i) + { + expression_node_ptr& current_expr = arg_list[i]; + + if (current_expr && (current_expr != result)) + { + details::free_node(*node_allocator_,current_expr); + } + } + + return result; + } + + struct switch_nodes + { + typedef std::vector > arg_list_t; + + #define case_stmt(N) \ + if (is_true(arg[(2 * N)].first)) { return arg[(2 * N) + 1].first->value(); } \ + + struct switch_impl_1 + { + static inline T process(const arg_list_t& arg) + { + case_stmt(0) + + assert(arg.size() == ((2 * 1) + 1)); + + return arg.back().first->value(); + } + }; + + struct switch_impl_2 + { + static inline T process(const arg_list_t& arg) + { + case_stmt(0) case_stmt(1) + + assert(arg.size() == ((2 * 2) + 1)); + + return arg.back().first->value(); + } + }; + + struct switch_impl_3 + { + static inline T process(const arg_list_t& arg) + { + case_stmt(0) case_stmt(1) + case_stmt(2) + + assert(arg.size() == ((2 * 3) + 1)); + + return arg.back().first->value(); + } + }; + + struct switch_impl_4 + { + static inline T process(const arg_list_t& arg) + { + case_stmt(0) case_stmt(1) + case_stmt(2) case_stmt(3) + + assert(arg.size() == ((2 * 4) + 1)); + + return arg.back().first->value(); + } + }; + + struct switch_impl_5 + { + static inline T process(const arg_list_t& arg) + { + case_stmt(0) case_stmt(1) + case_stmt(2) case_stmt(3) + case_stmt(4) + + assert(arg.size() == ((2 * 5) + 1)); + + return arg.back().first->value(); + } + }; + + struct switch_impl_6 + { + static inline T process(const arg_list_t& arg) + { + case_stmt(0) case_stmt(1) + case_stmt(2) case_stmt(3) + case_stmt(4) case_stmt(5) + + assert(arg.size() == ((2 * 6) + 1)); + + return arg.back().first->value(); + } + }; + + struct switch_impl_7 + { + static inline T process(const arg_list_t& arg) + { + case_stmt(0) case_stmt(1) + case_stmt(2) case_stmt(3) + case_stmt(4) case_stmt(5) + case_stmt(6) + + assert(arg.size() == ((2 * 7) + 1)); + + return arg.back().first->value(); + } + }; + + #undef case_stmt + }; + + template class Sequence> + inline expression_node_ptr switch_statement(Sequence& arg_list, const bool default_statement_present) + { + if (arg_list.empty()) + return error_node(); + else if ( + !all_nodes_valid(arg_list) || + (!default_statement_present && (arg_list.size() < 2)) + ) + { + details::free_all_nodes(*node_allocator_,arg_list); + + return error_node(); + } + else if (is_constant_foldable(arg_list)) + return const_optimise_switch(arg_list); + + switch ((arg_list.size() - 1) / 2) + { + #define case_stmt(N) \ + case N : \ + return node_allocator_-> \ + allocate >(arg_list); \ + + case_stmt(1) + case_stmt(2) + case_stmt(3) + case_stmt(4) + case_stmt(5) + case_stmt(6) + case_stmt(7) + #undef case_stmt + + default : return node_allocator_->allocate >(arg_list); + } + } + + template class Sequence> + inline expression_node_ptr multi_switch_statement(Sequence& arg_list) + { + if (!all_nodes_valid(arg_list)) + { + details::free_all_nodes(*node_allocator_,arg_list); + + return error_node(); + } + else if (is_constant_foldable(arg_list)) + return const_optimise_mswitch(arg_list); + else + return node_allocator_->allocate >(arg_list); + } + + #define unary_opr_switch_statements \ + case_stmt(details::e_abs , details::abs_op ) \ + case_stmt(details::e_acos , details::acos_op ) \ + case_stmt(details::e_acosh , details::acosh_op) \ + case_stmt(details::e_asin , details::asin_op ) \ + case_stmt(details::e_asinh , details::asinh_op) \ + case_stmt(details::e_atan , details::atan_op ) \ + case_stmt(details::e_atanh , details::atanh_op) \ + case_stmt(details::e_ceil , details::ceil_op ) \ + case_stmt(details::e_cos , details::cos_op ) \ + case_stmt(details::e_cosh , details::cosh_op ) \ + case_stmt(details::e_exp , details::exp_op ) \ + case_stmt(details::e_expm1 , details::expm1_op) \ + case_stmt(details::e_floor , details::floor_op) \ + case_stmt(details::e_log , details::log_op ) \ + case_stmt(details::e_log10 , details::log10_op) \ + case_stmt(details::e_log2 , details::log2_op ) \ + case_stmt(details::e_log1p , details::log1p_op) \ + case_stmt(details::e_neg , details::neg_op ) \ + case_stmt(details::e_pos , details::pos_op ) \ + case_stmt(details::e_round , details::round_op) \ + case_stmt(details::e_sin , details::sin_op ) \ + case_stmt(details::e_sinc , details::sinc_op ) \ + case_stmt(details::e_sinh , details::sinh_op ) \ + case_stmt(details::e_sqrt , details::sqrt_op ) \ + case_stmt(details::e_tan , details::tan_op ) \ + case_stmt(details::e_tanh , details::tanh_op ) \ + case_stmt(details::e_cot , details::cot_op ) \ + case_stmt(details::e_sec , details::sec_op ) \ + case_stmt(details::e_csc , details::csc_op ) \ + case_stmt(details::e_r2d , details::r2d_op ) \ + case_stmt(details::e_d2r , details::d2r_op ) \ + case_stmt(details::e_d2g , details::d2g_op ) \ + case_stmt(details::e_g2d , details::g2d_op ) \ + case_stmt(details::e_notl , details::notl_op ) \ + case_stmt(details::e_sgn , details::sgn_op ) \ + case_stmt(details::e_erf , details::erf_op ) \ + case_stmt(details::e_erfc , details::erfc_op ) \ + case_stmt(details::e_ncdf , details::ncdf_op ) \ + case_stmt(details::e_frac , details::frac_op ) \ + case_stmt(details::e_trunc , details::trunc_op) \ + + inline expression_node_ptr synthesize_uv_expression(const details::operator_type& operation, + expression_node_ptr (&branch)[1]) + { + T& v = static_cast*>(branch[0])->ref(); + + switch (operation) + { + #define case_stmt(op0, op1) \ + case op0 : return node_allocator_-> \ + allocate > >(v); \ + + unary_opr_switch_statements + #undef case_stmt + default : return error_node(); + } + } + + inline expression_node_ptr synthesize_uvec_expression(const details::operator_type& operation, + expression_node_ptr (&branch)[1]) + { + switch (operation) + { + #define case_stmt(op0, op1) \ + case op0 : return node_allocator_-> \ + allocate > > \ + (operation, branch[0]); \ + + unary_opr_switch_statements + #undef case_stmt + default : return error_node(); + } + } + + inline expression_node_ptr synthesize_unary_expression(const details::operator_type& operation, + expression_node_ptr (&branch)[1]) + { + switch (operation) + { + #define case_stmt(op0, op1) \ + case op0 : return node_allocator_-> \ + allocate > >(branch[0]); \ + + unary_opr_switch_statements + #undef case_stmt + default : return error_node(); + } + } + + inline expression_node_ptr const_optimise_sf3(const details::operator_type& operation, + expression_node_ptr (&branch)[3]) + { + expression_node_ptr temp_node = error_node(); + + switch (operation) + { + #define case_stmt(op) \ + case details::e_sf##op : temp_node = node_allocator_-> \ + allocate > > \ + (operation, branch); \ + break; \ + + case_stmt(00) case_stmt(01) case_stmt(02) case_stmt(03) + case_stmt(04) case_stmt(05) case_stmt(06) case_stmt(07) + case_stmt(08) case_stmt(09) case_stmt(10) case_stmt(11) + case_stmt(12) case_stmt(13) case_stmt(14) case_stmt(15) + case_stmt(16) case_stmt(17) case_stmt(18) case_stmt(19) + case_stmt(20) case_stmt(21) case_stmt(22) case_stmt(23) + case_stmt(24) case_stmt(25) case_stmt(26) case_stmt(27) + case_stmt(28) case_stmt(29) case_stmt(30) case_stmt(31) + case_stmt(32) case_stmt(33) case_stmt(34) case_stmt(35) + case_stmt(36) case_stmt(37) case_stmt(38) case_stmt(39) + case_stmt(40) case_stmt(41) case_stmt(42) case_stmt(43) + case_stmt(44) case_stmt(45) case_stmt(46) case_stmt(47) + #undef case_stmt + default : return error_node(); + } + + const T v = temp_node->value(); + + details::free_node(*node_allocator_,temp_node); + + return node_allocator_->allocate(v); + } + + inline expression_node_ptr varnode_optimise_sf3(const details::operator_type& operation, expression_node_ptr (&branch)[3]) + { + typedef details::variable_node* variable_ptr; + + const Type& v0 = static_cast(branch[0])->ref(); + const Type& v1 = static_cast(branch[1])->ref(); + const Type& v2 = static_cast(branch[2])->ref(); + + switch (operation) + { + #define case_stmt(op) \ + case details::e_sf##op : return node_allocator_-> \ + allocate_rrr > > \ + (v0, v1, v2); \ + + case_stmt(00) case_stmt(01) case_stmt(02) case_stmt(03) + case_stmt(04) case_stmt(05) case_stmt(06) case_stmt(07) + case_stmt(08) case_stmt(09) case_stmt(10) case_stmt(11) + case_stmt(12) case_stmt(13) case_stmt(14) case_stmt(15) + case_stmt(16) case_stmt(17) case_stmt(18) case_stmt(19) + case_stmt(20) case_stmt(21) case_stmt(22) case_stmt(23) + case_stmt(24) case_stmt(25) case_stmt(26) case_stmt(27) + case_stmt(28) case_stmt(29) case_stmt(30) case_stmt(31) + case_stmt(32) case_stmt(33) case_stmt(34) case_stmt(35) + case_stmt(36) case_stmt(37) case_stmt(38) case_stmt(39) + case_stmt(40) case_stmt(41) case_stmt(42) case_stmt(43) + case_stmt(44) case_stmt(45) case_stmt(46) case_stmt(47) + #undef case_stmt + default : return error_node(); + } + } + + inline expression_node_ptr special_function(const details::operator_type& operation, expression_node_ptr (&branch)[3]) + { + if (!all_nodes_valid(branch)) + return error_node(); + else if (is_constant_foldable(branch)) + return const_optimise_sf3(operation,branch); + else if (all_nodes_variables(branch)) + return varnode_optimise_sf3(operation,branch); + else + { + switch (operation) + { + #define case_stmt(op) \ + case details::e_sf##op : return node_allocator_-> \ + allocate > > \ + (operation, branch); \ + + case_stmt(00) case_stmt(01) case_stmt(02) case_stmt(03) + case_stmt(04) case_stmt(05) case_stmt(06) case_stmt(07) + case_stmt(08) case_stmt(09) case_stmt(10) case_stmt(11) + case_stmt(12) case_stmt(13) case_stmt(14) case_stmt(15) + case_stmt(16) case_stmt(17) case_stmt(18) case_stmt(19) + case_stmt(20) case_stmt(21) case_stmt(22) case_stmt(23) + case_stmt(24) case_stmt(25) case_stmt(26) case_stmt(27) + case_stmt(28) case_stmt(29) case_stmt(30) case_stmt(31) + case_stmt(32) case_stmt(33) case_stmt(34) case_stmt(35) + case_stmt(36) case_stmt(37) case_stmt(38) case_stmt(39) + case_stmt(40) case_stmt(41) case_stmt(42) case_stmt(43) + case_stmt(44) case_stmt(45) case_stmt(46) case_stmt(47) + #undef case_stmt + default : return error_node(); + } + } + } + + inline expression_node_ptr const_optimise_sf4(const details::operator_type& operation, expression_node_ptr (&branch)[4]) + { + expression_node_ptr temp_node = error_node(); + + switch (operation) + { + #define case_stmt(op) \ + case details::e_sf##op : temp_node = node_allocator_-> \ + allocate > > \ + (operation, branch); \ + break; \ + + case_stmt(48) case_stmt(49) case_stmt(50) case_stmt(51) + case_stmt(52) case_stmt(53) case_stmt(54) case_stmt(55) + case_stmt(56) case_stmt(57) case_stmt(58) case_stmt(59) + case_stmt(60) case_stmt(61) case_stmt(62) case_stmt(63) + case_stmt(64) case_stmt(65) case_stmt(66) case_stmt(67) + case_stmt(68) case_stmt(69) case_stmt(70) case_stmt(71) + case_stmt(72) case_stmt(73) case_stmt(74) case_stmt(75) + case_stmt(76) case_stmt(77) case_stmt(78) case_stmt(79) + case_stmt(80) case_stmt(81) case_stmt(82) case_stmt(83) + case_stmt(84) case_stmt(85) case_stmt(86) case_stmt(87) + case_stmt(88) case_stmt(89) case_stmt(90) case_stmt(91) + case_stmt(92) case_stmt(93) case_stmt(94) case_stmt(95) + case_stmt(96) case_stmt(97) case_stmt(98) case_stmt(99) + #undef case_stmt + default : return error_node(); + } + + const T v = temp_node->value(); + + details::free_node(*node_allocator_,temp_node); + + return node_allocator_->allocate(v); + } + + inline expression_node_ptr varnode_optimise_sf4(const details::operator_type& operation, expression_node_ptr (&branch)[4]) + { + typedef details::variable_node* variable_ptr; + + const Type& v0 = static_cast(branch[0])->ref(); + const Type& v1 = static_cast(branch[1])->ref(); + const Type& v2 = static_cast(branch[2])->ref(); + const Type& v3 = static_cast(branch[3])->ref(); + + switch (operation) + { + #define case_stmt(op) \ + case details::e_sf##op : return node_allocator_-> \ + allocate_rrrr > > \ + (v0, v1, v2, v3); \ + + case_stmt(48) case_stmt(49) case_stmt(50) case_stmt(51) + case_stmt(52) case_stmt(53) case_stmt(54) case_stmt(55) + case_stmt(56) case_stmt(57) case_stmt(58) case_stmt(59) + case_stmt(60) case_stmt(61) case_stmt(62) case_stmt(63) + case_stmt(64) case_stmt(65) case_stmt(66) case_stmt(67) + case_stmt(68) case_stmt(69) case_stmt(70) case_stmt(71) + case_stmt(72) case_stmt(73) case_stmt(74) case_stmt(75) + case_stmt(76) case_stmt(77) case_stmt(78) case_stmt(79) + case_stmt(80) case_stmt(81) case_stmt(82) case_stmt(83) + case_stmt(84) case_stmt(85) case_stmt(86) case_stmt(87) + case_stmt(88) case_stmt(89) case_stmt(90) case_stmt(91) + case_stmt(92) case_stmt(93) case_stmt(94) case_stmt(95) + case_stmt(96) case_stmt(97) case_stmt(98) case_stmt(99) + #undef case_stmt + default : return error_node(); + } + } + + inline expression_node_ptr special_function(const details::operator_type& operation, expression_node_ptr (&branch)[4]) + { + if (!all_nodes_valid(branch)) + return error_node(); + else if (is_constant_foldable(branch)) + return const_optimise_sf4(operation,branch); + else if (all_nodes_variables(branch)) + return varnode_optimise_sf4(operation,branch); + switch (operation) + { + #define case_stmt(op) \ + case details::e_sf##op : return node_allocator_-> \ + allocate > > \ + (operation, branch); \ + + case_stmt(48) case_stmt(49) case_stmt(50) case_stmt(51) + case_stmt(52) case_stmt(53) case_stmt(54) case_stmt(55) + case_stmt(56) case_stmt(57) case_stmt(58) case_stmt(59) + case_stmt(60) case_stmt(61) case_stmt(62) case_stmt(63) + case_stmt(64) case_stmt(65) case_stmt(66) case_stmt(67) + case_stmt(68) case_stmt(69) case_stmt(70) case_stmt(71) + case_stmt(72) case_stmt(73) case_stmt(74) case_stmt(75) + case_stmt(76) case_stmt(77) case_stmt(78) case_stmt(79) + case_stmt(80) case_stmt(81) case_stmt(82) case_stmt(83) + case_stmt(84) case_stmt(85) case_stmt(86) case_stmt(87) + case_stmt(88) case_stmt(89) case_stmt(90) case_stmt(91) + case_stmt(92) case_stmt(93) case_stmt(94) case_stmt(95) + case_stmt(96) case_stmt(97) case_stmt(98) case_stmt(99) + #undef case_stmt + default : return error_node(); + } + } + + template class Sequence> + inline expression_node_ptr const_optimise_varargfunc(const details::operator_type& operation, Sequence& arg_list) + { + expression_node_ptr temp_node = error_node(); + + switch (operation) + { + #define case_stmt(op0, op1) \ + case op0 : temp_node = node_allocator_-> \ + allocate > > \ + (arg_list); \ + break; \ + + case_stmt(details::e_sum , details::vararg_add_op ) + case_stmt(details::e_prod , details::vararg_mul_op ) + case_stmt(details::e_avg , details::vararg_avg_op ) + case_stmt(details::e_min , details::vararg_min_op ) + case_stmt(details::e_max , details::vararg_max_op ) + case_stmt(details::e_mand , details::vararg_mand_op ) + case_stmt(details::e_mor , details::vararg_mor_op ) + case_stmt(details::e_multi , details::vararg_multi_op) + #undef case_stmt + default : return error_node(); + } + + const T v = temp_node->value(); + + details::free_node(*node_allocator_,temp_node); + + return node_allocator_->allocate(v); + } + + inline bool special_one_parameter_vararg(const details::operator_type& operation) const + { + return ( + (details::e_sum == operation) || + (details::e_prod == operation) || + (details::e_avg == operation) || + (details::e_min == operation) || + (details::e_max == operation) + ); + } + + template class Sequence> + inline expression_node_ptr varnode_optimise_varargfunc(const details::operator_type& operation, Sequence& arg_list) + { + switch (operation) + { + #define case_stmt(op0, op1) \ + case op0 : return node_allocator_-> \ + allocate > >(arg_list); \ + + case_stmt(details::e_sum , details::vararg_add_op ) + case_stmt(details::e_prod , details::vararg_mul_op ) + case_stmt(details::e_avg , details::vararg_avg_op ) + case_stmt(details::e_min , details::vararg_min_op ) + case_stmt(details::e_max , details::vararg_max_op ) + case_stmt(details::e_mand , details::vararg_mand_op ) + case_stmt(details::e_mor , details::vararg_mor_op ) + case_stmt(details::e_multi , details::vararg_multi_op) + #undef case_stmt + default : return error_node(); + } + } + + template class Sequence> + inline expression_node_ptr vectorize_func(const details::operator_type& operation, Sequence& arg_list) + { + if (1 == arg_list.size()) + { + switch (operation) + { + #define case_stmt(op0, op1) \ + case op0 : return node_allocator_-> \ + allocate > >(arg_list[0]); \ + + case_stmt(details::e_sum , details::vec_add_op) + case_stmt(details::e_prod , details::vec_mul_op) + case_stmt(details::e_avg , details::vec_avg_op) + case_stmt(details::e_min , details::vec_min_op) + case_stmt(details::e_max , details::vec_max_op) + #undef case_stmt + default : return error_node(); + } + } + else + return error_node(); + } + + template class Sequence> + inline expression_node_ptr vararg_function(const details::operator_type& operation, Sequence& arg_list) + { + if (!all_nodes_valid(arg_list)) + { + details::free_all_nodes(*node_allocator_,arg_list); + + return error_node(); + } + else if (is_constant_foldable(arg_list)) + return const_optimise_varargfunc(operation,arg_list); + else if ((arg_list.size() == 1) && details::is_ivector_node(arg_list[0])) + return vectorize_func(operation,arg_list); + else if ((arg_list.size() == 1) && special_one_parameter_vararg(operation)) + return arg_list[0]; + else if (all_nodes_variables(arg_list)) + return varnode_optimise_varargfunc(operation,arg_list); + + #ifndef exprtk_disable_string_capabilities + if (details::e_smulti == operation) + { + return node_allocator_-> + allocate > >(arg_list); + } + else + #endif + { + switch (operation) + { + #define case_stmt(op0, op1) \ + case op0 : return node_allocator_-> \ + allocate > >(arg_list); \ + + case_stmt(details::e_sum , details::vararg_add_op ) + case_stmt(details::e_prod , details::vararg_mul_op ) + case_stmt(details::e_avg , details::vararg_avg_op ) + case_stmt(details::e_min , details::vararg_min_op ) + case_stmt(details::e_max , details::vararg_max_op ) + case_stmt(details::e_mand , details::vararg_mand_op ) + case_stmt(details::e_mor , details::vararg_mor_op ) + case_stmt(details::e_multi , details::vararg_multi_op) + #undef case_stmt + default : return error_node(); + } + } + } + + template + inline expression_node_ptr function(ifunction_t* f, expression_node_ptr (&b)[N]) + { + typedef typename details::function_N_node function_N_node_t; + expression_node_ptr result = synthesize_expression(f,b); + + if (0 == result) + return error_node(); + else + { + // Can the function call be completely optimised? + if (details::is_constant_node(result)) + return result; + else if (!all_nodes_valid(b)) + { + details::free_node(*node_allocator_,result); + std::fill_n(b, N, reinterpret_cast(0)); + + return error_node(); + } + else if (N != f->param_count) + { + details::free_node(*node_allocator_,result); + std::fill_n(b, N, reinterpret_cast(0)); + + return error_node(); + } + + function_N_node_t* func_node_ptr = reinterpret_cast(result); + + if (!func_node_ptr->init_branches(b)) + { + details::free_node(*node_allocator_,result); + std::fill_n(b, N, reinterpret_cast(0)); + + return error_node(); + } + + return result; + } + } + + inline expression_node_ptr function(ifunction_t* f) + { + typedef typename details::function_N_node function_N_node_t; + return node_allocator_->allocate(f); + } + + inline expression_node_ptr vararg_function_call(ivararg_function_t* vaf, + std::vector& arg_list) + { + if (!all_nodes_valid(arg_list)) + { + details::free_all_nodes(*node_allocator_,arg_list); + + return error_node(); + } + + typedef details::vararg_function_node alloc_type; + + expression_node_ptr result = node_allocator_->allocate(vaf,arg_list); + + if ( + !arg_list.empty() && + !vaf->has_side_effects() && + is_constant_foldable(arg_list) + ) + { + const Type v = result->value(); + details::free_node(*node_allocator_,result); + result = node_allocator_->allocate(v); + } + + parser_->state_.activate_side_effect("vararg_function_call()"); + + return result; + } + + inline expression_node_ptr generic_function_call(igeneric_function_t* gf, + std::vector& arg_list, + const std::size_t& param_seq_index = std::numeric_limits::max()) + { + if (!all_nodes_valid(arg_list)) + { + details::free_all_nodes(*node_allocator_,arg_list); + return error_node(); + } + + typedef details::generic_function_node alloc_type1; + typedef details::multimode_genfunction_node alloc_type2; + + const std::size_t no_psi = std::numeric_limits::max(); + + expression_node_ptr result = error_node(); + + if (no_psi == param_seq_index) + result = node_allocator_->allocate(arg_list,gf); + else + result = node_allocator_->allocate(gf, param_seq_index, arg_list); + + alloc_type1* genfunc_node_ptr = static_cast(result); + + if ( + !arg_list.empty() && + !gf->has_side_effects() && + parser_->state_.type_check_enabled && + is_constant_foldable(arg_list) + ) + { + genfunc_node_ptr->init_branches(); + + const Type v = result->value(); + + details::free_node(*node_allocator_,result); + + return node_allocator_->allocate(v); + } + else if (genfunc_node_ptr->init_branches()) + { + parser_->state_.activate_side_effect("generic_function_call()"); + + return result; + } + else + { + details::free_node(*node_allocator_, result); + details::free_all_nodes(*node_allocator_, arg_list); + + return error_node(); + } + } + + #ifndef exprtk_disable_string_capabilities + inline expression_node_ptr string_function_call(igeneric_function_t* gf, + std::vector& arg_list, + const std::size_t& param_seq_index = std::numeric_limits::max()) + { + if (!all_nodes_valid(arg_list)) + { + details::free_all_nodes(*node_allocator_,arg_list); + return error_node(); + } + + typedef details::string_function_node alloc_type1; + typedef details::multimode_strfunction_node alloc_type2; + + const std::size_t no_psi = std::numeric_limits::max(); + + expression_node_ptr result = error_node(); + + if (no_psi == param_seq_index) + result = node_allocator_->allocate(gf,arg_list); + else + result = node_allocator_->allocate(gf, param_seq_index, arg_list); + + alloc_type1* strfunc_node_ptr = static_cast(result); + + if ( + !arg_list.empty() && + !gf->has_side_effects() && + is_constant_foldable(arg_list) + ) + { + strfunc_node_ptr->init_branches(); + + const Type v = result->value(); + + details::free_node(*node_allocator_,result); + + return node_allocator_->allocate(v); + } + else if (strfunc_node_ptr->init_branches()) + { + parser_->state_.activate_side_effect("string_function_call()"); + + return result; + } + else + { + details::free_node (*node_allocator_,result ); + details::free_all_nodes(*node_allocator_,arg_list); + + return error_node(); + } + } + #endif + + #ifndef exprtk_disable_return_statement + inline expression_node_ptr return_call(std::vector& arg_list) + { + if (!all_nodes_valid(arg_list)) + { + details::free_all_nodes(*node_allocator_,arg_list); + return error_node(); + } + + typedef details::return_node alloc_type; + + expression_node_ptr result = node_allocator_-> + allocate_rr(arg_list,parser_->results_ctx()); + + alloc_type* return_node_ptr = static_cast(result); + + if (return_node_ptr->init_branches()) + { + parser_->state_.activate_side_effect("return_call()"); + + return result; + } + else + { + details::free_node (*node_allocator_, result ); + details::free_all_nodes(*node_allocator_, arg_list); + + return error_node(); + } + } + + inline expression_node_ptr return_envelope(expression_node_ptr body, + results_context_t* rc, + bool*& return_invoked) + { + typedef details::return_envelope_node alloc_type; + + expression_node_ptr result = node_allocator_-> + allocate_cr(body,(*rc)); + + return_invoked = static_cast(result)->retinvk_ptr(); + + return result; + } + #else + inline expression_node_ptr return_call(std::vector&) + { + return error_node(); + } + + inline expression_node_ptr return_envelope(expression_node_ptr, + results_context_t*, + bool*&) + { + return error_node(); + } + #endif + + inline expression_node_ptr vector_element(const std::string& symbol, + vector_holder_ptr vector_base, + expression_node_ptr index) + { + expression_node_ptr result = error_node(); + + if (details::is_constant_node(index)) + { + std::size_t i = static_cast(details::numeric::to_int64(index->value())); + + details::free_node(*node_allocator_,index); + + if (vector_base->rebaseable()) + { + return node_allocator_->allocate(i,vector_base); + } + + const scope_element& se = parser_->sem_.get_element(symbol,i); + + if (se.index == i) + { + result = se.var_node; + } + else + { + scope_element nse; + nse.name = symbol; + nse.active = true; + nse.ref_count = 1; + nse.type = scope_element::e_vecelem; + nse.index = i; + nse.depth = parser_->state_.scope_depth; + nse.data = 0; + nse.var_node = node_allocator_->allocate((*(*vector_base)[i])); + + if (!parser_->sem_.add_element(nse)) + { + parser_->set_synthesis_error("Failed to add new local vector element to SEM [1]"); + + parser_->sem_.free_element(nse); + + result = error_node(); + } + + exprtk_debug(("vector_element() - INFO - Added new local vector element: %s\n",nse.name.c_str())); + + parser_->state_.activate_side_effect("vector_element()"); + + result = nse.var_node; + } + } + else if (vector_base->rebaseable()) + result = node_allocator_->allocate(index,vector_base); + else + result = node_allocator_->allocate(index,vector_base); + + return result; + } + + private: + + template + inline bool is_constant_foldable(NodePtr (&b)[N]) const + { + for (std::size_t i = 0; i < N; ++i) + { + if (0 == b[i]) + return false; + else if (!details::is_constant_node(b[i])) + return false; + } + + return true; + } + + template class Sequence> + inline bool is_constant_foldable(const Sequence& b) const + { + for (std::size_t i = 0; i < b.size(); ++i) + { + if (0 == b[i]) + return false; + else if (!details::is_constant_node(b[i])) + return false; + } + + return true; + } + + void lodge_assignment(symbol_type cst, expression_node_ptr node) + { + parser_->state_.activate_side_effect("lodge_assignment()"); + + if (!parser_->dec_.collect_assignments()) + return; + + std::string symbol_name; + + switch (cst) + { + case e_st_variable : symbol_name = parser_->symtab_store_ + .get_variable_name(node); + break; + + #ifndef exprtk_disable_string_capabilities + case e_st_string : symbol_name = parser_->symtab_store_ + .get_stringvar_name(node); + break; + #endif + + case e_st_vector : { + typedef details::vector_holder vector_holder_t; + + vector_holder_t& vh = static_cast(node)->vec_holder(); + + symbol_name = parser_->symtab_store_.get_vector_name(&vh); + } + break; + + case e_st_vecelem : { + typedef details::vector_holder vector_holder_t; + + vector_holder_t& vh = static_cast(node)->vec_holder(); + + symbol_name = parser_->symtab_store_.get_vector_name(&vh); + + cst = e_st_vector; + } + break; + + default : return; + } + + if (!symbol_name.empty()) + { + parser_->dec_.add_assignment(symbol_name,cst); + } + } + + inline expression_node_ptr synthesize_assignment_expression(const details::operator_type& operation, expression_node_ptr (&branch)[2]) + { + if (details::is_variable_node(branch[0])) + { + lodge_assignment(e_st_variable,branch[0]); + + return synthesize_expression(operation,branch); + } + else if (details::is_vector_elem_node(branch[0])) + { + lodge_assignment(e_st_vecelem,branch[0]); + + return synthesize_expression(operation, branch); + } + else if (details::is_rebasevector_elem_node(branch[0])) + { + lodge_assignment(e_st_vecelem,branch[0]); + + return synthesize_expression(operation, branch); + } + else if (details::is_rebasevector_celem_node(branch[0])) + { + lodge_assignment(e_st_vecelem,branch[0]); + + return synthesize_expression(operation, branch); + } + #ifndef exprtk_disable_string_capabilities + else if (details::is_string_node(branch[0])) + { + lodge_assignment(e_st_string,branch[0]); + + return synthesize_expression(operation, branch); + } + else if (details::is_string_range_node(branch[0])) + { + lodge_assignment(e_st_string,branch[0]); + + return synthesize_expression(operation, branch); + } + #endif + else if (details::is_vector_node(branch[0])) + { + lodge_assignment(e_st_vector,branch[0]); + + if (details::is_ivector_node(branch[1])) + return synthesize_expression(operation, branch); + else + return synthesize_expression(operation, branch); + } + else + { + parser_->set_synthesis_error("Invalid assignment operation.[1]"); + + return error_node(); + } + } + + inline expression_node_ptr synthesize_assignment_operation_expression(const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + if (details::is_variable_node(branch[0])) + { + lodge_assignment(e_st_variable,branch[0]); + + switch (operation) + { + #define case_stmt(op0, op1) \ + case op0 : return node_allocator_-> \ + template allocate_rrr > > \ + (operation, branch[0], branch[1]); \ + + case_stmt(details::e_addass , details::add_op) + case_stmt(details::e_subass , details::sub_op) + case_stmt(details::e_mulass , details::mul_op) + case_stmt(details::e_divass , details::div_op) + case_stmt(details::e_modass , details::mod_op) + #undef case_stmt + default : return error_node(); + } + } + else if (details::is_vector_elem_node(branch[0])) + { + lodge_assignment(e_st_vecelem,branch[0]); + + switch (operation) + { + #define case_stmt(op0, op1) \ + case op0 : return node_allocator_-> \ + template allocate_rrr > > \ + (operation, branch[0], branch[1]); \ + + case_stmt(details::e_addass , details::add_op) + case_stmt(details::e_subass , details::sub_op) + case_stmt(details::e_mulass , details::mul_op) + case_stmt(details::e_divass , details::div_op) + case_stmt(details::e_modass , details::mod_op) + #undef case_stmt + default : return error_node(); + } + } + else if (details::is_rebasevector_elem_node(branch[0])) + { + lodge_assignment(e_st_vecelem,branch[0]); + + switch (operation) + { + #define case_stmt(op0, op1) \ + case op0 : return node_allocator_-> \ + template allocate_rrr > > \ + (operation, branch[0], branch[1]); \ + + case_stmt(details::e_addass , details::add_op) + case_stmt(details::e_subass , details::sub_op) + case_stmt(details::e_mulass , details::mul_op) + case_stmt(details::e_divass , details::div_op) + case_stmt(details::e_modass , details::mod_op) + #undef case_stmt + default : return error_node(); + } + } + else if (details::is_rebasevector_celem_node(branch[0])) + { + lodge_assignment(e_st_vecelem,branch[0]); + + switch (operation) + { + #define case_stmt(op0, op1) \ + case op0 : return node_allocator_-> \ + template allocate_rrr > > \ + (operation, branch[0], branch[1]); \ + + case_stmt(details::e_addass , details::add_op) + case_stmt(details::e_subass , details::sub_op) + case_stmt(details::e_mulass , details::mul_op) + case_stmt(details::e_divass , details::div_op) + case_stmt(details::e_modass , details::mod_op) + #undef case_stmt + default : return error_node(); + } + } + else if (details::is_vector_node(branch[0])) + { + lodge_assignment(e_st_vector,branch[0]); + + if (details::is_ivector_node(branch[1])) + { + switch (operation) + { + #define case_stmt(op0, op1) \ + case op0 : return node_allocator_-> \ + template allocate_rrr > > \ + (operation, branch[0], branch[1]); \ + + case_stmt(details::e_addass , details::add_op) + case_stmt(details::e_subass , details::sub_op) + case_stmt(details::e_mulass , details::mul_op) + case_stmt(details::e_divass , details::div_op) + case_stmt(details::e_modass , details::mod_op) + #undef case_stmt + default : return error_node(); + } + } + else + { + switch (operation) + { + #define case_stmt(op0, op1) \ + case op0 : return node_allocator_-> \ + template allocate_rrr > > \ + (operation, branch[0], branch[1]); \ + + case_stmt(details::e_addass , details::add_op) + case_stmt(details::e_subass , details::sub_op) + case_stmt(details::e_mulass , details::mul_op) + case_stmt(details::e_divass , details::div_op) + case_stmt(details::e_modass , details::mod_op) + #undef case_stmt + default : return error_node(); + } + } + } + #ifndef exprtk_disable_string_capabilities + else if ( + (details::e_addass == operation) && + details::is_string_node(branch[0]) + ) + { + typedef details::assignment_string_node addass_t; + + lodge_assignment(e_st_string,branch[0]); + + return synthesize_expression(operation,branch); + } + #endif + else + { + parser_->set_synthesis_error("Invalid assignment operation[2]"); + + return error_node(); + } + } + + inline expression_node_ptr synthesize_veceqineqlogic_operation_expression(const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + const bool is_b0_ivec = details::is_ivector_node(branch[0]); + const bool is_b1_ivec = details::is_ivector_node(branch[1]); + + #define batch_eqineq_logic_case \ + case_stmt(details::e_lt , details::lt_op ) \ + case_stmt(details::e_lte , details::lte_op ) \ + case_stmt(details::e_gt , details::gt_op ) \ + case_stmt(details::e_gte , details::gte_op ) \ + case_stmt(details::e_eq , details::eq_op ) \ + case_stmt(details::e_ne , details::ne_op ) \ + case_stmt(details::e_equal , details::equal_op) \ + case_stmt(details::e_and , details::and_op ) \ + case_stmt(details::e_nand , details::nand_op ) \ + case_stmt(details::e_or , details::or_op ) \ + case_stmt(details::e_nor , details::nor_op ) \ + case_stmt(details::e_xor , details::xor_op ) \ + case_stmt(details::e_xnor , details::xnor_op ) \ + + if (is_b0_ivec && is_b1_ivec) + { + switch (operation) + { + #define case_stmt(op0, op1) \ + case op0 : return node_allocator_-> \ + template allocate_rrr > > \ + (operation, branch[0], branch[1]); \ + + batch_eqineq_logic_case + #undef case_stmt + default : return error_node(); + } + } + else if (is_b0_ivec && !is_b1_ivec) + { + switch (operation) + { + #define case_stmt(op0, op1) \ + case op0 : return node_allocator_-> \ + template allocate_rrr > > \ + (operation, branch[0], branch[1]); \ + + batch_eqineq_logic_case + #undef case_stmt + default : return error_node(); + } + } + else if (!is_b0_ivec && is_b1_ivec) + { + switch (operation) + { + #define case_stmt(op0, op1) \ + case op0 : return node_allocator_-> \ + template allocate_rrr > > \ + (operation, branch[0], branch[1]); \ + + batch_eqineq_logic_case + #undef case_stmt + default : return error_node(); + } + } + else + return error_node(); + + #undef batch_eqineq_logic_case + } + + inline expression_node_ptr synthesize_vecarithmetic_operation_expression(const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + const bool is_b0_ivec = details::is_ivector_node(branch[0]); + const bool is_b1_ivec = details::is_ivector_node(branch[1]); + + #define vector_ops \ + case_stmt(details::e_add , details::add_op) \ + case_stmt(details::e_sub , details::sub_op) \ + case_stmt(details::e_mul , details::mul_op) \ + case_stmt(details::e_div , details::div_op) \ + case_stmt(details::e_mod , details::mod_op) \ + + if (is_b0_ivec && is_b1_ivec) + { + switch (operation) + { + #define case_stmt(op0, op1) \ + case op0 : return node_allocator_-> \ + template allocate_rrr > > \ + (operation, branch[0], branch[1]); \ + + vector_ops + case_stmt(details::e_pow,details:: pow_op) + #undef case_stmt + default : return error_node(); + } + } + else if (is_b0_ivec && !is_b1_ivec) + { + switch (operation) + { + #define case_stmt(op0, op1) \ + case op0 : return node_allocator_-> \ + template allocate_rrr > > \ + (operation, branch[0], branch[1]); \ + + vector_ops + case_stmt(details::e_pow,details:: pow_op) + #undef case_stmt + default : return error_node(); + } + } + else if (!is_b0_ivec && is_b1_ivec) + { + switch (operation) + { + #define case_stmt(op0, op1) \ + case op0 : return node_allocator_-> \ + template allocate_rrr > > \ + (operation, branch[0], branch[1]); \ + + vector_ops + #undef case_stmt + default : return error_node(); + } + } + else + return error_node(); + + #undef vector_ops + } + + inline expression_node_ptr synthesize_swap_expression(expression_node_ptr (&branch)[2]) + { + const bool v0_is_ivar = details::is_ivariable_node(branch[0]); + const bool v1_is_ivar = details::is_ivariable_node(branch[1]); + + const bool v0_is_ivec = details::is_ivector_node (branch[0]); + const bool v1_is_ivec = details::is_ivector_node (branch[1]); + + #ifndef exprtk_disable_string_capabilities + const bool v0_is_str = details::is_generally_string_node(branch[0]); + const bool v1_is_str = details::is_generally_string_node(branch[1]); + #endif + + expression_node_ptr result = error_node(); + + if (v0_is_ivar && v1_is_ivar) + { + typedef details::variable_node* variable_node_ptr; + + variable_node_ptr v0 = variable_node_ptr(0); + variable_node_ptr v1 = variable_node_ptr(0); + + if ( + (0 != (v0 = dynamic_cast(branch[0]))) && + (0 != (v1 = dynamic_cast(branch[1]))) + ) + { + result = node_allocator_->allocate >(v0,v1); + } + else + result = node_allocator_->allocate >(branch[0],branch[1]); + } + else if (v0_is_ivec && v1_is_ivec) + { + result = node_allocator_->allocate >(branch[0],branch[1]); + } + #ifndef exprtk_disable_string_capabilities + else if (v0_is_str && v1_is_str) + { + if (is_string_node(branch[0]) && is_string_node(branch[1])) + result = node_allocator_->allocate > + (branch[0], branch[1]); + else + result = node_allocator_->allocate > + (branch[0], branch[1]); + } + #endif + else + { + parser_->set_synthesis_error("Only variables, strings, vectors or vector elements can be swapped"); + + return error_node(); + } + + parser_->state_.activate_side_effect("synthesize_swap_expression()"); + + return result; + } + + #ifndef exprtk_disable_sc_andor + inline expression_node_ptr synthesize_shortcircuit_expression(const details::operator_type& operation, expression_node_ptr (&branch)[2]) + { + expression_node_ptr result = error_node(); + + if (details::is_constant_node(branch[0])) + { + if ( + (details::e_scand == operation) && + std::equal_to()(T(0),branch[0]->value()) + ) + result = node_allocator_->allocate_c(T(0)); + else if ( + (details::e_scor == operation) && + std::not_equal_to()(T(0),branch[0]->value()) + ) + result = node_allocator_->allocate_c(T(1)); + } + + if (details::is_constant_node(branch[1]) && (0 == result)) + { + if ( + (details::e_scand == operation) && + std::equal_to()(T(0),branch[1]->value()) + ) + result = node_allocator_->allocate_c(T(0)); + else if ( + (details::e_scor == operation) && + std::not_equal_to()(T(0),branch[1]->value()) + ) + result = node_allocator_->allocate_c(T(1)); + } + + if (result) + { + details::free_node(*node_allocator_, branch[0]); + details::free_node(*node_allocator_, branch[1]); + + return result; + } + else if (details::e_scand == operation) + { + return synthesize_expression(operation, branch); + } + else if (details::e_scor == operation) + { + return synthesize_expression(operation, branch); + } + else + return error_node(); + } + #else + inline expression_node_ptr synthesize_shortcircuit_expression(const details::operator_type&, expression_node_ptr (&)[2]) + { + return error_node(); + } + #endif + + #define basic_opr_switch_statements \ + case_stmt(details::e_add , details::add_op) \ + case_stmt(details::e_sub , details::sub_op) \ + case_stmt(details::e_mul , details::mul_op) \ + case_stmt(details::e_div , details::div_op) \ + case_stmt(details::e_mod , details::mod_op) \ + case_stmt(details::e_pow , details::pow_op) \ + + #define extended_opr_switch_statements \ + case_stmt(details::e_lt , details::lt_op ) \ + case_stmt(details::e_lte , details::lte_op ) \ + case_stmt(details::e_gt , details::gt_op ) \ + case_stmt(details::e_gte , details::gte_op ) \ + case_stmt(details::e_eq , details::eq_op ) \ + case_stmt(details::e_ne , details::ne_op ) \ + case_stmt(details::e_and , details::and_op ) \ + case_stmt(details::e_nand , details::nand_op) \ + case_stmt(details::e_or , details::or_op ) \ + case_stmt(details::e_nor , details::nor_op ) \ + case_stmt(details::e_xor , details::xor_op ) \ + case_stmt(details::e_xnor , details::xnor_op) \ + + #ifndef exprtk_disable_cardinal_pow_optimisation + template class IPowNode> + inline expression_node_ptr cardinal_pow_optimisation_impl(const TType& v, const unsigned int& p) + { + switch (p) + { + #define case_stmt(cp) \ + case cp : return node_allocator_-> \ + allocate > >(v); \ + + case_stmt( 1) case_stmt( 2) case_stmt( 3) case_stmt( 4) + case_stmt( 5) case_stmt( 6) case_stmt( 7) case_stmt( 8) + case_stmt( 9) case_stmt(10) case_stmt(11) case_stmt(12) + case_stmt(13) case_stmt(14) case_stmt(15) case_stmt(16) + case_stmt(17) case_stmt(18) case_stmt(19) case_stmt(20) + case_stmt(21) case_stmt(22) case_stmt(23) case_stmt(24) + case_stmt(25) case_stmt(26) case_stmt(27) case_stmt(28) + case_stmt(29) case_stmt(30) case_stmt(31) case_stmt(32) + case_stmt(33) case_stmt(34) case_stmt(35) case_stmt(36) + case_stmt(37) case_stmt(38) case_stmt(39) case_stmt(40) + case_stmt(41) case_stmt(42) case_stmt(43) case_stmt(44) + case_stmt(45) case_stmt(46) case_stmt(47) case_stmt(48) + case_stmt(49) case_stmt(50) case_stmt(51) case_stmt(52) + case_stmt(53) case_stmt(54) case_stmt(55) case_stmt(56) + case_stmt(57) case_stmt(58) case_stmt(59) case_stmt(60) + #undef case_stmt + default : return error_node(); + } + } + + inline expression_node_ptr cardinal_pow_optimisation(const T& v, const T& c) + { + const bool not_recipricol = (c >= T(0)); + const unsigned int p = static_cast(details::numeric::to_int32(details::numeric::abs(c))); + + if (0 == p) + return node_allocator_->allocate_c(T(1)); + else if (std::equal_to()(T(2),c)) + { + return node_allocator_-> + template allocate_rr > >(v,v); + } + else + { + if (not_recipricol) + return cardinal_pow_optimisation_impl(v,p); + else + return cardinal_pow_optimisation_impl(v,p); + } + } + + inline bool cardinal_pow_optimisable(const details::operator_type& operation, const T& c) const + { + return (details::e_pow == operation) && (details::numeric::abs(c) <= T(60)) && details::numeric::is_integer(c); + } + + inline expression_node_ptr cardinal_pow_optimisation(expression_node_ptr (&branch)[2]) + { + const Type c = static_cast*>(branch[1])->value(); + const bool not_recipricol = (c >= T(0)); + const unsigned int p = static_cast(details::numeric::to_int32(details::numeric::abs(c))); + + node_allocator_->free(branch[1]); + + if (0 == p) + { + details::free_all_nodes(*node_allocator_, branch); + + return node_allocator_->allocate_c(T(1)); + } + else if (not_recipricol) + return cardinal_pow_optimisation_impl(branch[0],p); + else + return cardinal_pow_optimisation_impl(branch[0],p); + } + #else + inline expression_node_ptr cardinal_pow_optimisation(T&, const T&) + { + return error_node(); + } + + inline bool cardinal_pow_optimisable(const details::operator_type&, const T&) + { + return false; + } + + inline expression_node_ptr cardinal_pow_optimisation(expression_node_ptr(&)[2]) + { + return error_node(); + } + #endif + + struct synthesize_binary_ext_expression + { + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + const bool left_neg = is_neg_unary_node(branch[0]); + const bool right_neg = is_neg_unary_node(branch[1]); + + if (left_neg && right_neg) + { + if ( + (details::e_add == operation) || + (details::e_sub == operation) || + (details::e_mul == operation) || + (details::e_div == operation) + ) + { + if ( + !expr_gen.parser_->simplify_unary_negation_branch(branch[0]) || + !expr_gen.parser_->simplify_unary_negation_branch(branch[1]) + ) + { + details::free_all_nodes(*expr_gen.node_allocator_,branch); + + return error_node(); + } + } + + switch (operation) + { + // -f(x + 1) + -g(y + 1) --> -(f(x + 1) + g(y + 1)) + case details::e_add : return expr_gen(details::e_neg, + expr_gen.node_allocator_-> + template allocate > > + (branch[0],branch[1])); + + // -f(x + 1) - -g(y + 1) --> g(y + 1) - f(x + 1) + case details::e_sub : return expr_gen.node_allocator_-> + template allocate > > + (branch[1],branch[0]); + + default : break; + } + } + else if (left_neg && !right_neg) + { + if ( + (details::e_add == operation) || + (details::e_sub == operation) || + (details::e_mul == operation) || + (details::e_div == operation) + ) + { + if (!expr_gen.parser_->simplify_unary_negation_branch(branch[0])) + { + details::free_all_nodes(*expr_gen.node_allocator_,branch); + + return error_node(); + } + + switch (operation) + { + // -f(x + 1) + g(y + 1) --> g(y + 1) - f(x + 1) + case details::e_add : return expr_gen.node_allocator_-> + template allocate > > + (branch[1], branch[0]); + + // -f(x + 1) - g(y + 1) --> -(f(x + 1) + g(y + 1)) + case details::e_sub : return expr_gen(details::e_neg, + expr_gen.node_allocator_-> + template allocate > > + (branch[0], branch[1])); + + // -f(x + 1) * g(y + 1) --> -(f(x + 1) * g(y + 1)) + case details::e_mul : return expr_gen(details::e_neg, + expr_gen.node_allocator_-> + template allocate > > + (branch[0], branch[1])); + + // -f(x + 1) / g(y + 1) --> -(f(x + 1) / g(y + 1)) + case details::e_div : return expr_gen(details::e_neg, + expr_gen.node_allocator_-> + template allocate > > + (branch[0], branch[1])); + + default : return error_node(); + } + } + } + else if (!left_neg && right_neg) + { + if ( + (details::e_add == operation) || + (details::e_sub == operation) || + (details::e_mul == operation) || + (details::e_div == operation) + ) + { + if (!expr_gen.parser_->simplify_unary_negation_branch(branch[1])) + { + details::free_all_nodes(*expr_gen.node_allocator_,branch); + + return error_node(); + } + + switch (operation) + { + // f(x + 1) + -g(y + 1) --> f(x + 1) - g(y + 1) + case details::e_add : return expr_gen.node_allocator_-> + template allocate > > + (branch[0], branch[1]); + + // f(x + 1) - - g(y + 1) --> f(x + 1) + g(y + 1) + case details::e_sub : return expr_gen.node_allocator_-> + template allocate > > + (branch[0], branch[1]); + + // f(x + 1) * -g(y + 1) --> -(f(x + 1) * g(y + 1)) + case details::e_mul : return expr_gen(details::e_neg, + expr_gen.node_allocator_-> + template allocate > > + (branch[0], branch[1])); + + // f(x + 1) / -g(y + 1) --> -(f(x + 1) / g(y + 1)) + case details::e_div : return expr_gen(details::e_neg, + expr_gen.node_allocator_-> + template allocate > > + (branch[0], branch[1])); + + default : return error_node(); + } + } + } + + switch (operation) + { + #define case_stmt(op0, op1) \ + case op0 : return expr_gen.node_allocator_-> \ + template allocate > > \ + (branch[0], branch[1]); \ + + basic_opr_switch_statements + extended_opr_switch_statements + #undef case_stmt + default : return error_node(); + } + } + }; + + struct synthesize_vob_expression + { + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + const Type& v = static_cast*>(branch[0])->ref(); + + #ifndef exprtk_disable_enhanced_features + if (details::is_sf3ext_node(branch[1])) + { + expression_node_ptr result = error_node(); + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile_right + (expr_gen, v, operation, branch[1], result); + + if (synthesis_result) + { + details::free_node(*expr_gen.node_allocator_,branch[1]); + return result; + } + } + #endif + + if ( + (details::e_mul == operation) || + (details::e_div == operation) + ) + { + if (details::is_uv_node(branch[1])) + { + typedef details::uv_base_node* uvbn_ptr_t; + + details::operator_type o = static_cast(branch[1])->operation(); + + if (details::e_neg == o) + { + const Type& v1 = static_cast(branch[1])->v(); + + details::free_node(*expr_gen.node_allocator_,branch[1]); + + switch (operation) + { + case details::e_mul : return expr_gen(details::e_neg, + expr_gen.node_allocator_-> + template allocate_rr > >(v,v1)); + + case details::e_div : return expr_gen(details::e_neg, + expr_gen.node_allocator_-> + template allocate_rr > >(v,v1)); + + default : break; + } + } + } + } + + switch (operation) + { + #define case_stmt(op0, op1) \ + case op0 : return expr_gen.node_allocator_-> \ + template allocate_rc > > \ + (v, branch[1]); \ + + basic_opr_switch_statements + extended_opr_switch_statements + #undef case_stmt + default : return error_node(); + } + } + }; + + struct synthesize_bov_expression + { + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + const Type& v = static_cast*>(branch[1])->ref(); + + #ifndef exprtk_disable_enhanced_features + if (details::is_sf3ext_node(branch[0])) + { + expression_node_ptr result = error_node(); + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile_left + (expr_gen, v, operation, branch[0], result); + + if (synthesis_result) + { + details::free_node(*expr_gen.node_allocator_, branch[0]); + + return result; + } + } + #endif + + if ( + (details::e_add == operation) || + (details::e_sub == operation) || + (details::e_mul == operation) || + (details::e_div == operation) + ) + { + if (details::is_uv_node(branch[0])) + { + typedef details::uv_base_node* uvbn_ptr_t; + + details::operator_type o = static_cast(branch[0])->operation(); + + if (details::e_neg == o) + { + const Type& v0 = static_cast(branch[0])->v(); + + details::free_node(*expr_gen.node_allocator_,branch[0]); + + switch (operation) + { + case details::e_add : return expr_gen.node_allocator_-> + template allocate_rr > >(v,v0); + + case details::e_sub : return expr_gen(details::e_neg, + expr_gen.node_allocator_-> + template allocate_rr > >(v0,v)); + + case details::e_mul : return expr_gen(details::e_neg, + expr_gen.node_allocator_-> + template allocate_rr > >(v0,v)); + + case details::e_div : return expr_gen(details::e_neg, + expr_gen.node_allocator_-> + template allocate_rr > >(v0,v)); + default : break; + } + } + } + } + + switch (operation) + { + #define case_stmt(op0, op1) \ + case op0 : return expr_gen.node_allocator_-> \ + template allocate_cr > > \ + (branch[0], v); \ + + basic_opr_switch_statements + extended_opr_switch_statements + #undef case_stmt + default : return error_node(); + } + } + }; + + struct synthesize_cob_expression + { + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + const Type c = static_cast*>(branch[0])->value(); + + details::free_node(*expr_gen.node_allocator_,branch[0]); + + if (std::equal_to()(T(0),c) && (details::e_mul == operation)) + { + details::free_node(*expr_gen.node_allocator_,branch[1]); + + return expr_gen(T(0)); + } + else if (std::equal_to()(T(0),c) && (details::e_div == operation)) + { + details::free_node(*expr_gen.node_allocator_, branch[1]); + + return expr_gen(T(0)); + } + else if (std::equal_to()(T(0),c) && (details::e_add == operation)) + return branch[1]; + else if (std::equal_to()(T(1),c) && (details::e_mul == operation)) + return branch[1]; + + if (details::is_cob_node(branch[1])) + { + // Simplify expressions of the form: + // 1. (1 * (2 * (3 * (4 * (5 * (6 * (7 * (8 * (9 + x))))))))) --> 40320 * (9 + x) + // 2. (1 + (2 + (3 + (4 + (5 + (6 + (7 + (8 + (9 + x))))))))) --> 45 + x + if ( + (details::e_mul == operation) || + (details::e_add == operation) + ) + { + details::cob_base_node* cobnode = static_cast*>(branch[1]); + + if (operation == cobnode->operation()) + { + switch (operation) + { + case details::e_add : cobnode->set_c(c + cobnode->c()); break; + case details::e_mul : cobnode->set_c(c * cobnode->c()); break; + default : return error_node(); + } + + return cobnode; + } + } + + if (operation == details::e_mul) + { + details::cob_base_node* cobnode = static_cast*>(branch[1]); + details::operator_type cob_opr = cobnode->operation(); + + if ( + (details::e_div == cob_opr) || + (details::e_mul == cob_opr) + ) + { + switch (cob_opr) + { + case details::e_div : cobnode->set_c(c * cobnode->c()); break; + case details::e_mul : cobnode->set_c(cobnode->c() / c); break; + default : return error_node(); + } + + return cobnode; + } + } + else if (operation == details::e_div) + { + details::cob_base_node* cobnode = static_cast*>(branch[1]); + details::operator_type cob_opr = cobnode->operation(); + + if ( + (details::e_div == cob_opr) || + (details::e_mul == cob_opr) + ) + { + details::expression_node* new_cobnode = error_node(); + + switch (cob_opr) + { + case details::e_div : new_cobnode = expr_gen.node_allocator_-> + template allocate_tt > > + (c / cobnode->c(), cobnode->move_branch(0)); + break; + + case details::e_mul : new_cobnode = expr_gen.node_allocator_-> + template allocate_tt > > + (c / cobnode->c(), cobnode->move_branch(0)); + break; + + default : return error_node(); + } + + details::free_node(*expr_gen.node_allocator_,branch[1]); + + return new_cobnode; + } + } + } + #ifndef exprtk_disable_enhanced_features + else if (details::is_sf3ext_node(branch[1])) + { + expression_node_ptr result = error_node(); + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile_right + (expr_gen, c, operation, branch[1], result); + + if (synthesis_result) + { + details::free_node(*expr_gen.node_allocator_,branch[1]); + + return result; + } + } + #endif + + switch (operation) + { + #define case_stmt(op0, op1) \ + case op0 : return expr_gen.node_allocator_-> \ + template allocate_tt > > \ + (c, branch[1]); \ + + basic_opr_switch_statements + extended_opr_switch_statements + #undef case_stmt + default : return error_node(); + } + } + }; + + struct synthesize_boc_expression + { + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + const Type c = static_cast*>(branch[1])->value(); + + details::free_node(*(expr_gen.node_allocator_), branch[1]); + + if (std::equal_to()(T(0),c) && (details::e_mul == operation)) + { + details::free_node(*expr_gen.node_allocator_, branch[0]); + + return expr_gen(T(0)); + } + else if (std::equal_to()(T(0),c) && (details::e_div == operation)) + { + details::free_node(*expr_gen.node_allocator_, branch[0]); + + return expr_gen(std::numeric_limits::quiet_NaN()); + } + else if (std::equal_to()(T(0),c) && (details::e_add == operation)) + return branch[0]; + else if (std::equal_to()(T(1),c) && (details::e_mul == operation)) + return branch[0]; + + if (details::is_boc_node(branch[0])) + { + // Simplify expressions of the form: + // 1. (((((((((x + 9) * 8) * 7) * 6) * 5) * 4) * 3) * 2) * 1) --> (x + 9) * 40320 + // 2. (((((((((x + 9) + 8) + 7) + 6) + 5) + 4) + 3) + 2) + 1) --> x + 45 + if ( + (details::e_mul == operation) || + (details::e_add == operation) + ) + { + details::boc_base_node* bocnode = static_cast*>(branch[0]); + + if (operation == bocnode->operation()) + { + switch (operation) + { + case details::e_add : bocnode->set_c(c + bocnode->c()); break; + case details::e_mul : bocnode->set_c(c * bocnode->c()); break; + default : return error_node(); + } + + return bocnode; + } + } + else if (operation == details::e_div) + { + details::boc_base_node* bocnode = static_cast*>(branch[0]); + details::operator_type boc_opr = bocnode->operation(); + + if ( + (details::e_div == boc_opr) || + (details::e_mul == boc_opr) + ) + { + switch (boc_opr) + { + case details::e_div : bocnode->set_c(c * bocnode->c()); break; + case details::e_mul : bocnode->set_c(bocnode->c() / c); break; + default : return error_node(); + } + + return bocnode; + } + } + else if (operation == details::e_pow) + { + // (v ^ c0) ^ c1 --> v ^(c0 * c1) + details::boc_base_node* bocnode = static_cast*>(branch[0]); + details::operator_type boc_opr = bocnode->operation(); + + if (details::e_pow == boc_opr) + { + bocnode->set_c(bocnode->c() * c); + + return bocnode; + } + } + } + + #ifndef exprtk_disable_enhanced_features + if (details::is_sf3ext_node(branch[0])) + { + expression_node_ptr result = error_node(); + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile_left + (expr_gen, c, operation, branch[0], result); + + if (synthesis_result) + { + free_node(*expr_gen.node_allocator_, branch[0]); + + return result; + } + } + #endif + + switch (operation) + { + #define case_stmt(op0, op1) \ + case op0 : return expr_gen.node_allocator_-> \ + template allocate_cr > > \ + (branch[0], c); \ + + basic_opr_switch_statements + extended_opr_switch_statements + #undef case_stmt + default : return error_node(); + } + } + }; + + struct synthesize_cocob_expression + { + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + expression_node_ptr result = error_node(); + + // (cob) o c --> cob + if (details::is_cob_node(branch[0])) + { + details::cob_base_node* cobnode = static_cast*>(branch[0]); + + const Type c = static_cast*>(branch[1])->value(); + + if (std::equal_to()(T(0),c) && (details::e_mul == operation)) + { + details::free_node(*expr_gen.node_allocator_, branch[0]); + details::free_node(*expr_gen.node_allocator_, branch[1]); + + return expr_gen(T(0)); + } + else if (std::equal_to()(T(0),c) && (details::e_div == operation)) + { + details::free_node(*expr_gen.node_allocator_, branch[0]); + details::free_node(*expr_gen.node_allocator_, branch[1]); + + return expr_gen(T(std::numeric_limits::quiet_NaN())); + } + else if (std::equal_to()(T(0),c) && (details::e_add == operation)) + { + details::free_node(*expr_gen.node_allocator_, branch[1]); + + return branch[0]; + } + else if (std::equal_to()(T(1),c) && (details::e_mul == operation)) + { + details::free_node(*expr_gen.node_allocator_, branch[1]); + + return branch[0]; + } + else if (std::equal_to()(T(1),c) && (details::e_div == operation)) + { + details::free_node(*expr_gen.node_allocator_, branch[1]); + + return branch[0]; + } + + const bool op_addsub = (details::e_add == cobnode->operation()) || + (details::e_sub == cobnode->operation()) ; + + if (op_addsub) + { + switch (operation) + { + case details::e_add : cobnode->set_c(cobnode->c() + c); break; + case details::e_sub : cobnode->set_c(cobnode->c() - c); break; + default : return error_node(); + } + + result = cobnode; + } + else if (details::e_mul == cobnode->operation()) + { + switch (operation) + { + case details::e_mul : cobnode->set_c(cobnode->c() * c); break; + case details::e_div : cobnode->set_c(cobnode->c() / c); break; + default : return error_node(); + } + + result = cobnode; + } + else if (details::e_div == cobnode->operation()) + { + if (details::e_mul == operation) + { + cobnode->set_c(cobnode->c() * c); + result = cobnode; + } + else if (details::e_div == operation) + { + result = expr_gen.node_allocator_-> + template allocate_tt > > + (cobnode->c() / c, cobnode->move_branch(0)); + + details::free_node(*expr_gen.node_allocator_, branch[0]); + } + } + + if (result) + { + details::free_node(*expr_gen.node_allocator_,branch[1]); + } + } + + // c o (cob) --> cob + else if (details::is_cob_node(branch[1])) + { + details::cob_base_node* cobnode = static_cast*>(branch[1]); + + const Type c = static_cast*>(branch[0])->value(); + + if (std::equal_to()(T(0),c) && (details::e_mul == operation)) + { + details::free_node(*expr_gen.node_allocator_, branch[0]); + details::free_node(*expr_gen.node_allocator_, branch[1]); + + return expr_gen(T(0)); + } + else if (std::equal_to()(T(0),c) && (details::e_div == operation)) + { + details::free_node(*expr_gen.node_allocator_, branch[0]); + details::free_node(*expr_gen.node_allocator_, branch[1]); + + return expr_gen(T(0)); + } + else if (std::equal_to()(T(0),c) && (details::e_add == operation)) + { + details::free_node(*expr_gen.node_allocator_, branch[0]); + + return branch[1]; + } + else if (std::equal_to()(T(1),c) && (details::e_mul == operation)) + { + details::free_node(*expr_gen.node_allocator_, branch[0]); + + return branch[1]; + } + + if (details::e_add == cobnode->operation()) + { + if (details::e_add == operation) + { + cobnode->set_c(c + cobnode->c()); + result = cobnode; + } + else if (details::e_sub == operation) + { + result = expr_gen.node_allocator_-> + template allocate_tt > > + (c - cobnode->c(), cobnode->move_branch(0)); + + details::free_node(*expr_gen.node_allocator_,branch[1]); + } + } + else if (details::e_sub == cobnode->operation()) + { + if (details::e_add == operation) + { + cobnode->set_c(c + cobnode->c()); + result = cobnode; + } + else if (details::e_sub == operation) + { + result = expr_gen.node_allocator_-> + template allocate_tt > > + (c - cobnode->c(), cobnode->move_branch(0)); + + details::free_node(*expr_gen.node_allocator_,branch[1]); + } + } + else if (details::e_mul == cobnode->operation()) + { + if (details::e_mul == operation) + { + cobnode->set_c(c * cobnode->c()); + result = cobnode; + } + else if (details::e_div == operation) + { + result = expr_gen.node_allocator_-> + template allocate_tt > > + (c / cobnode->c(), cobnode->move_branch(0)); + + details::free_node(*expr_gen.node_allocator_,branch[1]); + } + } + else if (details::e_div == cobnode->operation()) + { + if (details::e_mul == operation) + { + cobnode->set_c(c * cobnode->c()); + result = cobnode; + } + else if (details::e_div == operation) + { + result = expr_gen.node_allocator_-> + template allocate_tt > > + (c / cobnode->c(), cobnode->move_branch(0)); + + details::free_node(*expr_gen.node_allocator_,branch[1]); + } + } + + if (result) + { + details::free_node(*expr_gen.node_allocator_,branch[0]); + } + } + + return result; + } + }; + + struct synthesize_coboc_expression + { + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + expression_node_ptr result = error_node(); + + // (boc) o c --> boc + if (details::is_boc_node(branch[0])) + { + details::boc_base_node* bocnode = static_cast*>(branch[0]); + + const Type c = static_cast*>(branch[1])->value(); + + if (details::e_add == bocnode->operation()) + { + switch (operation) + { + case details::e_add : bocnode->set_c(bocnode->c() + c); break; + case details::e_sub : bocnode->set_c(bocnode->c() - c); break; + default : return error_node(); + } + + result = bocnode; + } + else if (details::e_mul == bocnode->operation()) + { + switch (operation) + { + case details::e_mul : bocnode->set_c(bocnode->c() * c); break; + case details::e_div : bocnode->set_c(bocnode->c() / c); break; + default : return error_node(); + } + + result = bocnode; + } + else if (details::e_sub == bocnode->operation()) + { + if (details::e_add == operation) + { + result = expr_gen.node_allocator_-> + template allocate_tt > > + (bocnode->move_branch(0), c - bocnode->c()); + + details::free_node(*expr_gen.node_allocator_,branch[0]); + } + else if (details::e_sub == operation) + { + bocnode->set_c(bocnode->c() + c); + result = bocnode; + } + } + else if (details::e_div == bocnode->operation()) + { + switch (operation) + { + case details::e_div : bocnode->set_c(bocnode->c() * c); break; + case details::e_mul : bocnode->set_c(bocnode->c() / c); break; + default : return error_node(); + } + + result = bocnode; + } + + if (result) + { + details::free_node(*expr_gen.node_allocator_, branch[1]); + } + } + + // c o (boc) --> boc + else if (details::is_boc_node(branch[1])) + { + details::boc_base_node* bocnode = static_cast*>(branch[1]); + + const Type c = static_cast*>(branch[0])->value(); + + if (details::e_add == bocnode->operation()) + { + if (details::e_add == operation) + { + bocnode->set_c(c + bocnode->c()); + result = bocnode; + } + else if (details::e_sub == operation) + { + result = expr_gen.node_allocator_-> + template allocate_tt > > + (c - bocnode->c(), bocnode->move_branch(0)); + + details::free_node(*expr_gen.node_allocator_,branch[1]); + } + } + else if (details::e_sub == bocnode->operation()) + { + if (details::e_add == operation) + { + result = expr_gen.node_allocator_-> + template allocate_tt > > + (bocnode->move_branch(0), c - bocnode->c()); + + details::free_node(*expr_gen.node_allocator_,branch[1]); + } + else if (details::e_sub == operation) + { + result = expr_gen.node_allocator_-> + template allocate_tt > > + (c + bocnode->c(), bocnode->move_branch(0)); + + details::free_node(*expr_gen.node_allocator_,branch[1]); + } + } + else if (details::e_mul == bocnode->operation()) + { + if (details::e_mul == operation) + { + bocnode->set_c(c * bocnode->c()); + result = bocnode; + } + else if (details::e_div == operation) + { + result = expr_gen.node_allocator_-> + template allocate_tt > > + (c / bocnode->c(), bocnode->move_branch(0)); + + details::free_node(*expr_gen.node_allocator_,branch[1]); + } + } + else if (details::e_div == bocnode->operation()) + { + if (details::e_mul == operation) + { + bocnode->set_c(bocnode->c() / c); + result = bocnode; + } + else if (details::e_div == operation) + { + result = expr_gen.node_allocator_-> + template allocate_tt > > + (c * bocnode->c(), bocnode->move_branch(0)); + + details::free_node(*expr_gen.node_allocator_,branch[1]); + } + } + + if (result) + { + details::free_node(*expr_gen.node_allocator_,branch[0]); + } + } + + return result; + } + }; + + #ifndef exprtk_disable_enhanced_features + inline bool synthesize_expression(const details::operator_type& operation, + expression_node_ptr (&branch)[2], + expression_node_ptr& result) + { + result = error_node(); + + if (!operation_optimisable(operation)) + return false; + + const std::string node_id = branch_to_id(branch); + + const typename synthesize_map_t::iterator itr = synthesize_map_.find(node_id); + + if (synthesize_map_.end() != itr) + { + result = itr->second((*this), operation, branch); + + return true; + } + else + return false; + } + + struct synthesize_vov_expression + { + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + const Type& v1 = static_cast*>(branch[0])->ref(); + const Type& v2 = static_cast*>(branch[1])->ref(); + + switch (operation) + { + #define case_stmt(op0, op1) \ + case op0 : return expr_gen.node_allocator_-> \ + template allocate_rr > > \ + (v1, v2); \ + + basic_opr_switch_statements + extended_opr_switch_statements + #undef case_stmt + default : return error_node(); + } + } + }; + + struct synthesize_cov_expression + { + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + const Type c = static_cast*> (branch[0])->value(); + const Type& v = static_cast*>(branch[1])->ref (); + + details::free_node(*(expr_gen.node_allocator_),branch[0]); + + if (std::equal_to()(T(0),c) && (details::e_mul == operation)) + return expr_gen(T(0)); + else if (std::equal_to()(T(0),c) && (details::e_div == operation)) + return expr_gen(T(0)); + else if (std::equal_to()(T(0),c) && (details::e_add == operation)) + return static_cast*>(branch[1]); + else if (std::equal_to()(T(1),c) && (details::e_mul == operation)) + return static_cast*>(branch[1]); + + switch (operation) + { + #define case_stmt(op0, op1) \ + case op0 : return expr_gen.node_allocator_-> \ + template allocate_cr > > \ + (c, v); \ + + basic_opr_switch_statements + extended_opr_switch_statements + #undef case_stmt + default : return error_node(); + } + } + }; + + struct synthesize_voc_expression + { + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + const Type& v = static_cast*>(branch[0])->ref (); + const Type c = static_cast*> (branch[1])->value(); + + details::free_node(*(expr_gen.node_allocator_), branch[1]); + + if (expr_gen.cardinal_pow_optimisable(operation,c)) + { + if (std::equal_to()(T(1),c)) + return branch[0]; + else + return expr_gen.cardinal_pow_optimisation(v,c); + } + else if (std::equal_to()(T(0),c) && (details::e_mul == operation)) + return expr_gen(T(0)); + else if (std::equal_to()(T(0),c) && (details::e_div == operation)) + return expr_gen(std::numeric_limits::quiet_NaN()); + else if (std::equal_to()(T(0),c) && (details::e_add == operation)) + return static_cast*>(branch[0]); + else if (std::equal_to()(T(1),c) && (details::e_mul == operation)) + return static_cast*>(branch[0]); + else if (std::equal_to()(T(1),c) && (details::e_div == operation)) + return static_cast*>(branch[0]); + + switch (operation) + { + #define case_stmt(op0, op1) \ + case op0 : return expr_gen.node_allocator_-> \ + template allocate_rc > > \ + (v, c); \ + + basic_opr_switch_statements + extended_opr_switch_statements + #undef case_stmt + default : return error_node(); + } + } + }; + + struct synthesize_sf3ext_expression + { + template + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& sf3opr, + T0 t0, T1 t1, T2 t2) + { + switch (sf3opr) + { + #define case_stmt(op) \ + case details::e_sf##op : return details::T0oT1oT2_sf3ext >:: \ + allocate(*(expr_gen.node_allocator_), t0, t1, t2); \ + + case_stmt(00) case_stmt(01) case_stmt(02) case_stmt(03) + case_stmt(04) case_stmt(05) case_stmt(06) case_stmt(07) + case_stmt(08) case_stmt(09) case_stmt(10) case_stmt(11) + case_stmt(12) case_stmt(13) case_stmt(14) case_stmt(15) + case_stmt(16) case_stmt(17) case_stmt(18) case_stmt(19) + case_stmt(20) case_stmt(21) case_stmt(22) case_stmt(23) + case_stmt(24) case_stmt(25) case_stmt(26) case_stmt(27) + case_stmt(28) case_stmt(29) case_stmt(30) + #undef case_stmt + default : return error_node(); + } + } + + template + static inline bool compile(expression_generator& expr_gen, const std::string& id, + T0 t0, T1 t1, T2 t2, + expression_node_ptr& result) + { + details::operator_type sf3opr; + + if (!expr_gen.sf3_optimisable(id,sf3opr)) + return false; + else + result = synthesize_sf3ext_expression::template process + (expr_gen, sf3opr, t0, t1, t2); + + return true; + } + }; + + struct synthesize_sf4ext_expression + { + template + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& sf4opr, + T0 t0, T1 t1, T2 t2, T3 t3) + { + switch (sf4opr) + { + #define case_stmt0(op) \ + case details::e_sf##op : return details::T0oT1oT2oT3_sf4ext >:: \ + allocate(*(expr_gen.node_allocator_), t0, t1, t2, t3); \ + + #define case_stmt1(op) \ + case details::e_sf4ext##op : return details::T0oT1oT2oT3_sf4ext >:: \ + allocate(*(expr_gen.node_allocator_), t0, t1, t2, t3); \ + + case_stmt0(48) case_stmt0(49) case_stmt0(50) case_stmt0(51) + case_stmt0(52) case_stmt0(53) case_stmt0(54) case_stmt0(55) + case_stmt0(56) case_stmt0(57) case_stmt0(58) case_stmt0(59) + case_stmt0(60) case_stmt0(61) case_stmt0(62) case_stmt0(63) + case_stmt0(64) case_stmt0(65) case_stmt0(66) case_stmt0(67) + case_stmt0(68) case_stmt0(69) case_stmt0(70) case_stmt0(71) + case_stmt0(72) case_stmt0(73) case_stmt0(74) case_stmt0(75) + case_stmt0(76) case_stmt0(77) case_stmt0(78) case_stmt0(79) + case_stmt0(80) case_stmt0(81) case_stmt0(82) case_stmt0(83) + + case_stmt1(00) case_stmt1(01) case_stmt1(02) case_stmt1(03) + case_stmt1(04) case_stmt1(05) case_stmt1(06) case_stmt1(07) + case_stmt1(08) case_stmt1(09) case_stmt1(10) case_stmt1(11) + case_stmt1(12) case_stmt1(13) case_stmt1(14) case_stmt1(15) + case_stmt1(16) case_stmt1(17) case_stmt1(18) case_stmt1(19) + case_stmt1(20) case_stmt1(21) case_stmt1(22) case_stmt1(23) + case_stmt1(24) case_stmt1(25) case_stmt1(26) case_stmt1(27) + case_stmt1(28) case_stmt1(29) case_stmt1(30) case_stmt1(31) + case_stmt1(32) case_stmt1(33) case_stmt1(34) case_stmt1(35) + case_stmt1(36) case_stmt1(37) case_stmt1(38) case_stmt1(39) + case_stmt1(40) case_stmt1(41) case_stmt1(42) case_stmt1(43) + case_stmt1(44) case_stmt1(45) case_stmt1(46) case_stmt1(47) + case_stmt1(48) case_stmt1(49) case_stmt1(50) case_stmt1(51) + case_stmt1(52) case_stmt1(53) case_stmt1(54) case_stmt1(55) + case_stmt1(56) case_stmt1(57) case_stmt1(58) case_stmt1(59) + case_stmt1(60) case_stmt1(61) + + #undef case_stmt0 + #undef case_stmt1 + default : return error_node(); + } + } + + template + static inline bool compile(expression_generator& expr_gen, const std::string& id, + T0 t0, T1 t1, T2 t2, T3 t3, + expression_node_ptr& result) + { + details::operator_type sf4opr; + + if (!expr_gen.sf4_optimisable(id,sf4opr)) + return false; + else + result = synthesize_sf4ext_expression::template process + (expr_gen, sf4opr, t0, t1, t2, t3); + + return true; + } + + // T o (sf3ext) + template + static inline bool compile_right(expression_generator& expr_gen, + ExternalType t, + const details::operator_type& operation, + expression_node_ptr& sf3node, + expression_node_ptr& result) + { + if (!details::is_sf3ext_node(sf3node)) + return false; + + typedef details::T0oT1oT2_base_node* sf3ext_base_ptr; + + sf3ext_base_ptr n = static_cast(sf3node); + const std::string id = "t" + expr_gen.to_str(operation) + "(" + n->type_id() + ")"; + + switch (n->type()) + { + case details::expression_node::e_covoc : return compile_right_impl + + (expr_gen, id, t, sf3node, result); + + case details::expression_node::e_covov : return compile_right_impl + + (expr_gen, id, t, sf3node, result); + + case details::expression_node::e_vocov : return compile_right_impl + + (expr_gen, id, t, sf3node, result); + + case details::expression_node::e_vovoc : return compile_right_impl + + (expr_gen, id, t, sf3node, result); + + case details::expression_node::e_vovov : return compile_right_impl + + (expr_gen, id, t, sf3node, result); + + default : return false; + } + } + + // (sf3ext) o T + template + static inline bool compile_left(expression_generator& expr_gen, + ExternalType t, + const details::operator_type& operation, + expression_node_ptr& sf3node, + expression_node_ptr& result) + { + if (!details::is_sf3ext_node(sf3node)) + return false; + + typedef details::T0oT1oT2_base_node* sf3ext_base_ptr; + + sf3ext_base_ptr n = static_cast(sf3node); + + const std::string id = "(" + n->type_id() + ")" + expr_gen.to_str(operation) + "t"; + + switch (n->type()) + { + case details::expression_node::e_covoc : return compile_left_impl + + (expr_gen, id, t, sf3node, result); + + case details::expression_node::e_covov : return compile_left_impl + + (expr_gen, id, t, sf3node, result); + + case details::expression_node::e_vocov : return compile_left_impl + + (expr_gen, id, t, sf3node, result); + + case details::expression_node::e_vovoc : return compile_left_impl + + (expr_gen, id, t, sf3node, result); + + case details::expression_node::e_vovov : return compile_left_impl + + (expr_gen, id, t, sf3node, result); + + default : return false; + } + } + + template + static inline bool compile_right_impl(expression_generator& expr_gen, + const std::string& id, + ExternalType t, + expression_node_ptr& node, + expression_node_ptr& result) + { + SF3TypeNode* n = dynamic_cast(node); + + if (n) + { + T0 t0 = n->t0(); + T1 t1 = n->t1(); + T2 t2 = n->t2(); + + return synthesize_sf4ext_expression::template compile + (expr_gen, id, t, t0, t1, t2, result); + } + else + return false; + } + + template + static inline bool compile_left_impl(expression_generator& expr_gen, + const std::string& id, + ExternalType t, + expression_node_ptr& node, + expression_node_ptr& result) + { + SF3TypeNode* n = dynamic_cast(node); + + if (n) + { + T0 t0 = n->t0(); + T1 t1 = n->t1(); + T2 t2 = n->t2(); + + return synthesize_sf4ext_expression::template compile + (expr_gen, id, t0, t1, t2, t, result); + } + else + return false; + } + }; + + struct synthesize_vovov_expression0 + { + typedef typename vovov_t::type0 node_type; + typedef typename vovov_t::sf3_type sf3_type; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // (v0 o0 v1) o1 (v2) + const details::vov_base_node* vov = static_cast*>(branch[0]); + const Type& v0 = vov->v0(); + const Type& v1 = vov->v1(); + const Type& v2 = static_cast*>(branch[1])->ref(); + const details::operator_type o0 = vov->operation(); + const details::operator_type o1 = operation; + + details::free_node(*(expr_gen.node_allocator_),branch[0]); + + expression_node_ptr result = error_node(); + + if (expr_gen.parser_->settings_.strength_reduction_enabled()) + { + // (v0 / v1) / v2 --> (vovov) v0 / (v1 * v2) + if ((details::e_div == o0) && (details::e_div == o1)) + { + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, "t/(t*t)", v0, v1, v2, result); + + exprtk_debug(("(v0 / v1) / v2 --> (vovov) v0 / (v1 * v2)\n")); + + return (synthesis_result) ? result : error_node(); + } + } + + const bool synthesis_result = + synthesize_sf3ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1), v0, v1, v2, result); + + if (synthesis_result) + return result; + + binary_functor_t f0 = reinterpret_cast(0); + binary_functor_t f1 = reinterpret_cast(0); + + if (!expr_gen.valid_operator(o0,f0)) + return error_node(); + else if (!expr_gen.valid_operator(o1,f1)) + return error_node(); + else + return node_type::allocate(*(expr_gen.node_allocator_), v0, v1, v2, f0, f1); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1) + { + return details::build_string() + << "(t" << expr_gen.to_str(o0) + << "t)" << expr_gen.to_str(o1) + << "t"; + } + }; + + struct synthesize_vovov_expression1 + { + typedef typename vovov_t::type1 node_type; + typedef typename vovov_t::sf3_type sf3_type; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // (v0) o0 (v1 o1 v2) + const details::vov_base_node* vov = static_cast*>(branch[1]); + const Type& v0 = static_cast*>(branch[0])->ref(); + const Type& v1 = vov->v0(); + const Type& v2 = vov->v1(); + const details::operator_type o0 = operation; + const details::operator_type o1 = vov->operation(); + + details::free_node(*(expr_gen.node_allocator_),branch[1]); + + expression_node_ptr result = error_node(); + + if (expr_gen.parser_->settings_.strength_reduction_enabled()) + { + // v0 / (v1 / v2) --> (vovov) (v0 * v2) / v1 + if ((details::e_div == o0) && (details::e_div == o1)) + { + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, "(t*t)/t", v0, v2, v1, result); + + exprtk_debug(("v0 / (v1 / v2) --> (vovov) (v0 * v2) / v1\n")); + + return (synthesis_result) ? result : error_node(); + } + } + + const bool synthesis_result = + synthesize_sf3ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1), v0, v1, v2, result); + + if (synthesis_result) + return result; + + binary_functor_t f0 = reinterpret_cast(0); + binary_functor_t f1 = reinterpret_cast(0); + + if (!expr_gen.valid_operator(o0,f0)) + return error_node(); + else if (!expr_gen.valid_operator(o1,f1)) + return error_node(); + else + return node_type::allocate(*(expr_gen.node_allocator_), v0, v1, v2, f0, f1); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1) + { + return details::build_string() + << "t" << expr_gen.to_str(o0) + << "(t" << expr_gen.to_str(o1) + << "t)"; + } + }; + + struct synthesize_vovoc_expression0 + { + typedef typename vovoc_t::type0 node_type; + typedef typename vovoc_t::sf3_type sf3_type; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // (v0 o0 v1) o1 (c) + const details::vov_base_node* vov = static_cast*>(branch[0]); + const Type& v0 = vov->v0(); + const Type& v1 = vov->v1(); + const Type c = static_cast*>(branch[1])->value(); + const details::operator_type o0 = vov->operation(); + const details::operator_type o1 = operation; + + details::free_node(*(expr_gen.node_allocator_),branch[0]); + details::free_node(*(expr_gen.node_allocator_),branch[1]); + + expression_node_ptr result = error_node(); + + if (expr_gen.parser_->settings_.strength_reduction_enabled()) + { + // (v0 / v1) / c --> (vovoc) v0 / (v1 * c) + if ((details::e_div == o0) && (details::e_div == o1)) + { + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, "t/(t*t)", v0, v1, c, result); + + exprtk_debug(("(v0 / v1) / c --> (vovoc) v0 / (v1 * c)\n")); + + return (synthesis_result) ? result : error_node(); + } + } + + const bool synthesis_result = + synthesize_sf3ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1), v0, v1, c, result); + + if (synthesis_result) + return result; + + binary_functor_t f0 = reinterpret_cast(0); + binary_functor_t f1 = reinterpret_cast(0); + + if (!expr_gen.valid_operator(o0,f0)) + return error_node(); + else if (!expr_gen.valid_operator(o1,f1)) + return error_node(); + else + return node_type::allocate(*(expr_gen.node_allocator_), v0, v1, c, f0, f1); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1) + { + return details::build_string() + << "(t" << expr_gen.to_str(o0) + << "t)" << expr_gen.to_str(o1) + << "t"; + } + }; + + struct synthesize_vovoc_expression1 + { + typedef typename vovoc_t::type1 node_type; + typedef typename vovoc_t::sf3_type sf3_type; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // (v0) o0 (v1 o1 c) + const details::voc_base_node* voc = static_cast*>(branch[1]); + const Type& v0 = static_cast*>(branch[0])->ref(); + const Type& v1 = voc->v(); + const Type c = voc->c(); + const details::operator_type o0 = operation; + const details::operator_type o1 = voc->operation(); + + details::free_node(*(expr_gen.node_allocator_),branch[1]); + + expression_node_ptr result = error_node(); + + if (expr_gen.parser_->settings_.strength_reduction_enabled()) + { + // v0 / (v1 / c) --> (vocov) (v0 * c) / v1 + if ((details::e_div == o0) && (details::e_div == o1)) + { + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, "(t*t)/t", v0, c, v1, result); + + exprtk_debug(("v0 / (v1 / c) --> (vocov) (v0 * c) / v1\n")); + + return (synthesis_result) ? result : error_node(); + } + } + + const bool synthesis_result = + synthesize_sf3ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1), v0, v1, c, result); + + if (synthesis_result) + return result; + + binary_functor_t f0 = reinterpret_cast(0); + binary_functor_t f1 = reinterpret_cast(0); + + if (!expr_gen.valid_operator(o0,f0)) + return error_node(); + else if (!expr_gen.valid_operator(o1,f1)) + return error_node(); + else + return node_type::allocate(*(expr_gen.node_allocator_), v0, v1, c, f0, f1); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1) + { + return details::build_string() + << "t" << expr_gen.to_str(o0) + << "(t" << expr_gen.to_str(o1) + << "t)"; + } + }; + + struct synthesize_vocov_expression0 + { + typedef typename vocov_t::type0 node_type; + typedef typename vocov_t::sf3_type sf3_type; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // (v0 o0 c) o1 (v1) + const details::voc_base_node* voc = static_cast*>(branch[0]); + const Type& v0 = voc->v(); + const Type c = voc->c(); + const Type& v1 = static_cast*>(branch[1])->ref(); + const details::operator_type o0 = voc->operation(); + const details::operator_type o1 = operation; + + details::free_node(*(expr_gen.node_allocator_),branch[0]); + + expression_node_ptr result = error_node(); + + if (expr_gen.parser_->settings_.strength_reduction_enabled()) + { + // (v0 / c) / v1 --> (vovoc) v0 / (v1 * c) + if ((details::e_div == o0) && (details::e_div == o1)) + { + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, "t/(t*t)", v0, v1, c, result); + + exprtk_debug(("(v0 / c) / v1 --> (vovoc) v0 / (v1 * c)\n")); + + return (synthesis_result) ? result : error_node(); + } + } + + const bool synthesis_result = + synthesize_sf3ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1), v0, c, v1, result); + + if (synthesis_result) + return result; + + binary_functor_t f0 = reinterpret_cast(0); + binary_functor_t f1 = reinterpret_cast(0); + + if (!expr_gen.valid_operator(o0,f0)) + return error_node(); + else if (!expr_gen.valid_operator(o1,f1)) + return error_node(); + else + return node_type::allocate(*(expr_gen.node_allocator_), v0, c, v1, f0, f1); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1) + { + return details::build_string() + << "(t" << expr_gen.to_str(o0) + << "t)" << expr_gen.to_str(o1) + << "t"; + } + }; + + struct synthesize_vocov_expression1 + { + typedef typename vocov_t::type1 node_type; + typedef typename vocov_t::sf3_type sf3_type; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // (v0) o0 (c o1 v1) + const details::cov_base_node* cov = static_cast*>(branch[1]); + const Type& v0 = static_cast*>(branch[0])->ref(); + const Type c = cov->c(); + const Type& v1 = cov->v(); + const details::operator_type o0 = operation; + const details::operator_type o1 = cov->operation(); + + details::free_node(*(expr_gen.node_allocator_),branch[1]); + + expression_node_ptr result = error_node(); + + if (expr_gen.parser_->settings_.strength_reduction_enabled()) + { + // v0 / (c / v1) --> (vovoc) (v0 * v1) / c + if ((details::e_div == o0) && (details::e_div == o1)) + { + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, "(t*t)/t", v0, v1, c, result); + + exprtk_debug(("v0 / (c / v1) --> (vovoc) (v0 * v1) / c\n")); + + return (synthesis_result) ? result : error_node(); + } + } + + const bool synthesis_result = + synthesize_sf3ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1), v0, c, v1, result); + + if (synthesis_result) + return result; + + binary_functor_t f0 = reinterpret_cast(0); + binary_functor_t f1 = reinterpret_cast(0); + + if (!expr_gen.valid_operator(o0,f0)) + return error_node(); + else if (!expr_gen.valid_operator(o1,f1)) + return error_node(); + else + return node_type::allocate(*(expr_gen.node_allocator_), v0, c, v1, f0, f1); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1) + { + return details::build_string() + << "t" << expr_gen.to_str(o0) + << "(t" << expr_gen.to_str(o1) + << "t)"; + } + }; + + struct synthesize_covov_expression0 + { + typedef typename covov_t::type0 node_type; + typedef typename covov_t::sf3_type sf3_type; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // (c o0 v0) o1 (v1) + const details::cov_base_node* cov = static_cast*>(branch[0]); + const Type c = cov->c(); + const Type& v0 = cov->v(); + const Type& v1 = static_cast*>(branch[1])->ref(); + const details::operator_type o0 = cov->operation(); + const details::operator_type o1 = operation; + + details::free_node(*(expr_gen.node_allocator_),branch[0]); + + expression_node_ptr result = error_node(); + + if (expr_gen.parser_->settings_.strength_reduction_enabled()) + { + // (c / v0) / v1 --> (covov) c / (v0 * v1) + if ((details::e_div == o0) && (details::e_div == o1)) + { + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, "t/(t*t)", c, v0, v1, result); + + exprtk_debug(("(c / v0) / v1 --> (covov) c / (v0 * v1)\n")); + + return (synthesis_result) ? result : error_node(); + } + } + + const bool synthesis_result = + synthesize_sf3ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1), c, v0, v1, result); + + if (synthesis_result) + return result; + + binary_functor_t f0 = reinterpret_cast(0); + binary_functor_t f1 = reinterpret_cast(0); + + if (!expr_gen.valid_operator(o0,f0)) + return error_node(); + else if (!expr_gen.valid_operator(o1,f1)) + return error_node(); + else + return node_type::allocate(*(expr_gen.node_allocator_), c, v0, v1, f0, f1); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1) + { + return details::build_string() + << "(t" << expr_gen.to_str(o0) + << "t)" << expr_gen.to_str(o1) + << "t"; + } + }; + + struct synthesize_covov_expression1 + { + typedef typename covov_t::type1 node_type; + typedef typename covov_t::sf3_type sf3_type; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // (c) o0 (v0 o1 v1) + const details::vov_base_node* vov = static_cast*>(branch[1]); + const Type c = static_cast*>(branch[0])->value(); + const Type& v0 = vov->v0(); + const Type& v1 = vov->v1(); + const details::operator_type o0 = operation; + const details::operator_type o1 = vov->operation(); + + details::free_node(*(expr_gen.node_allocator_),branch[0]); + details::free_node(*(expr_gen.node_allocator_),branch[1]); + + expression_node_ptr result = error_node(); + + if (expr_gen.parser_->settings_.strength_reduction_enabled()) + { + // c / (v0 / v1) --> (covov) (c * v1) / v0 + if ((details::e_div == o0) && (details::e_div == o1)) + { + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, "(t*t)/t", c, v1, v0, result); + + exprtk_debug(("c / (v0 / v1) --> (covov) (c * v1) / v0\n")); + + return (synthesis_result) ? result : error_node(); + } + } + + const bool synthesis_result = + synthesize_sf3ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1), c, v0, v1, result); + + if (synthesis_result) + return result; + + binary_functor_t f0 = reinterpret_cast(0); + binary_functor_t f1 = reinterpret_cast(0); + + if (!expr_gen.valid_operator(o0,f0)) + return error_node(); + else if (!expr_gen.valid_operator(o1,f1)) + return error_node(); + else + return node_type::allocate(*(expr_gen.node_allocator_), c, v0, v1, f0, f1); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1) + { + return details::build_string() + << "t" << expr_gen.to_str(o0) + << "(t" << expr_gen.to_str(o1) + << "t)"; + } + }; + + struct synthesize_covoc_expression0 + { + typedef typename covoc_t::type0 node_type; + typedef typename covoc_t::sf3_type sf3_type; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // (c0 o0 v) o1 (c1) + const details::cov_base_node* cov = static_cast*>(branch[0]); + const Type c0 = cov->c(); + const Type& v = cov->v(); + const Type c1 = static_cast*>(branch[1])->value(); + const details::operator_type o0 = cov->operation(); + const details::operator_type o1 = operation; + + details::free_node(*(expr_gen.node_allocator_),branch[0]); + details::free_node(*(expr_gen.node_allocator_),branch[1]); + + expression_node_ptr result = error_node(); + + if (expr_gen.parser_->settings_.strength_reduction_enabled()) + { + // (c0 + v) + c1 --> (cov) (c0 + c1) + v + if ((details::e_add == o0) && (details::e_add == o1)) + { + exprtk_debug(("(c0 + v) + c1 --> (cov) (c0 + c1) + v\n")); + + return expr_gen.node_allocator_-> + template allocate_cr > >(c0 + c1, v); + } + // (c0 + v) - c1 --> (cov) (c0 - c1) + v + else if ((details::e_add == o0) && (details::e_sub == o1)) + { + exprtk_debug(("(c0 + v) - c1 --> (cov) (c0 - c1) + v\n")); + + return expr_gen.node_allocator_-> + template allocate_cr > >(c0 - c1, v); + } + // (c0 - v) + c1 --> (cov) (c0 + c1) - v + else if ((details::e_sub == o0) && (details::e_add == o1)) + { + exprtk_debug(("(c0 - v) + c1 --> (cov) (c0 + c1) - v\n")); + + return expr_gen.node_allocator_-> + template allocate_cr > >(c0 + c1, v); + } + // (c0 - v) - c1 --> (cov) (c0 - c1) - v + else if ((details::e_sub == o0) && (details::e_sub == o1)) + { + exprtk_debug(("(c0 - v) - c1 --> (cov) (c0 - c1) - v\n")); + + return expr_gen.node_allocator_-> + template allocate_cr > >(c0 - c1, v); + } + // (c0 * v) * c1 --> (cov) (c0 * c1) * v + else if ((details::e_mul == o0) && (details::e_mul == o1)) + { + exprtk_debug(("(c0 * v) * c1 --> (cov) (c0 * c1) * v\n")); + + return expr_gen.node_allocator_-> + template allocate_cr > >(c0 * c1, v); + } + // (c0 * v) / c1 --> (cov) (c0 / c1) * v + else if ((details::e_mul == o0) && (details::e_div == o1)) + { + exprtk_debug(("(c0 * v) / c1 --> (cov) (c0 / c1) * v\n")); + + return expr_gen.node_allocator_-> + template allocate_cr > >(c0 / c1, v); + } + // (c0 / v) * c1 --> (cov) (c0 * c1) / v + else if ((details::e_div == o0) && (details::e_mul == o1)) + { + exprtk_debug(("(c0 / v) * c1 --> (cov) (c0 * c1) / v\n")); + + return expr_gen.node_allocator_-> + template allocate_cr > >(c0 * c1, v); + } + // (c0 / v) / c1 --> (cov) (c0 / c1) / v + else if ((details::e_div == o0) && (details::e_div == o1)) + { + exprtk_debug(("(c0 / v) / c1 --> (cov) (c0 / c1) / v\n")); + + return expr_gen.node_allocator_-> + template allocate_cr > >(c0 / c1, v); + } + } + + const bool synthesis_result = + synthesize_sf3ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1), c0, v, c1, result); + + if (synthesis_result) + return result; + + binary_functor_t f0 = reinterpret_cast(0); + binary_functor_t f1 = reinterpret_cast(0); + + if (!expr_gen.valid_operator(o0,f0)) + return error_node(); + else if (!expr_gen.valid_operator(o1,f1)) + return error_node(); + else + return node_type::allocate(*(expr_gen.node_allocator_), c0, v, c1, f0, f1); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1) + { + return details::build_string() + << "(t" << expr_gen.to_str(o0) + << "t)" << expr_gen.to_str(o1) + << "t"; + } + }; + + struct synthesize_covoc_expression1 + { + typedef typename covoc_t::type1 node_type; + typedef typename covoc_t::sf3_type sf3_type; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // (c0) o0 (v o1 c1) + const details::voc_base_node* voc = static_cast*>(branch[1]); + const Type c0 = static_cast*>(branch[0])->value(); + const Type& v = voc->v(); + const Type c1 = voc->c(); + const details::operator_type o0 = operation; + const details::operator_type o1 = voc->operation(); + + details::free_node(*(expr_gen.node_allocator_),branch[0]); + details::free_node(*(expr_gen.node_allocator_),branch[1]); + + expression_node_ptr result = error_node(); + + if (expr_gen.parser_->settings_.strength_reduction_enabled()) + { + // (c0) + (v + c1) --> (cov) (c0 + c1) + v + if ((details::e_add == o0) && (details::e_add == o1)) + { + exprtk_debug(("(c0) + (v + c1) --> (cov) (c0 + c1) + v\n")); + + return expr_gen.node_allocator_-> + template allocate_cr > >(c0 + c1, v); + } + // (c0) + (v - c1) --> (cov) (c0 - c1) + v + else if ((details::e_add == o0) && (details::e_sub == o1)) + { + exprtk_debug(("(c0) + (v - c1) --> (cov) (c0 - c1) + v\n")); + + return expr_gen.node_allocator_-> + template allocate_cr > >(c0 - c1, v); + } + // (c0) - (v + c1) --> (cov) (c0 - c1) - v + else if ((details::e_sub == o0) && (details::e_add == o1)) + { + exprtk_debug(("(c0) - (v + c1) --> (cov) (c0 - c1) - v\n")); + + return expr_gen.node_allocator_-> + template allocate_cr > >(c0 - c1, v); + } + // (c0) - (v - c1) --> (cov) (c0 + c1) - v + else if ((details::e_sub == o0) && (details::e_sub == o1)) + { + exprtk_debug(("(c0) - (v - c1) --> (cov) (c0 + c1) - v\n")); + + return expr_gen.node_allocator_-> + template allocate_cr > >(c0 + c1, v); + } + // (c0) * (v * c1) --> (voc) v * (c0 * c1) + else if ((details::e_mul == o0) && (details::e_mul == o1)) + { + exprtk_debug(("(c0) * (v * c1) --> (voc) v * (c0 * c1)\n")); + + return expr_gen.node_allocator_-> + template allocate_cr > >(c0 * c1, v); + } + // (c0) * (v / c1) --> (cov) (c0 / c1) * v + else if ((details::e_mul == o0) && (details::e_div == o1)) + { + exprtk_debug(("(c0) * (v / c1) --> (cov) (c0 / c1) * v\n")); + + return expr_gen.node_allocator_-> + template allocate_cr > >(c0 / c1, v); + } + // (c0) / (v * c1) --> (cov) (c0 / c1) / v + else if ((details::e_div == o0) && (details::e_mul == o1)) + { + exprtk_debug(("(c0) / (v * c1) --> (cov) (c0 / c1) / v\n")); + + return expr_gen.node_allocator_-> + template allocate_cr > >(c0 / c1, v); + } + // (c0) / (v / c1) --> (cov) (c0 * c1) / v + else if ((details::e_div == o0) && (details::e_div == o1)) + { + exprtk_debug(("(c0) / (v / c1) --> (cov) (c0 * c1) / v\n")); + + return expr_gen.node_allocator_-> + template allocate_cr > >(c0 * c1, v); + } + } + + const bool synthesis_result = + synthesize_sf3ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1), c0, v, c1, result); + + if (synthesis_result) + return result; + + binary_functor_t f0 = reinterpret_cast(0); + binary_functor_t f1 = reinterpret_cast(0); + + if (!expr_gen.valid_operator(o0,f0)) + return error_node(); + else if (!expr_gen.valid_operator(o1,f1)) + return error_node(); + else + return node_type::allocate(*(expr_gen.node_allocator_), c0, v, c1, f0, f1); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1) + { + return details::build_string() + << "t" << expr_gen.to_str(o0) + << "(t" << expr_gen.to_str(o1) + << "t)"; + } + }; + + struct synthesize_cocov_expression0 + { + typedef typename cocov_t::type0 node_type; + static inline expression_node_ptr process(expression_generator&, + const details::operator_type&, + expression_node_ptr (&)[2]) + { + // (c0 o0 c1) o1 (v) - Not possible. + return error_node(); + } + }; + + struct synthesize_cocov_expression1 + { + typedef typename cocov_t::type1 node_type; + typedef typename cocov_t::sf3_type sf3_type; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // (c0) o0 (c1 o1 v) + const details::cov_base_node* cov = static_cast*>(branch[1]); + const Type c0 = static_cast*>(branch[0])->value(); + const Type c1 = cov->c(); + const Type& v = cov->v(); + const details::operator_type o0 = operation; + const details::operator_type o1 = cov->operation(); + + details::free_node(*(expr_gen.node_allocator_),branch[0]); + details::free_node(*(expr_gen.node_allocator_),branch[1]); + + expression_node_ptr result = error_node(); + + if (expr_gen.parser_->settings_.strength_reduction_enabled()) + { + // (c0) + (c1 + v) --> (cov) (c0 + c1) + v + if ((details::e_add == o0) && (details::e_add == o1)) + { + exprtk_debug(("(c0) + (c1 + v) --> (cov) (c0 + c1) + v\n")); + + return expr_gen.node_allocator_-> + template allocate_cr > >(c0 + c1, v); + } + // (c0) + (c1 - v) --> (cov) (c0 + c1) - v + else if ((details::e_add == o0) && (details::e_sub == o1)) + { + exprtk_debug(("(c0) + (c1 - v) --> (cov) (c0 + c1) - v\n")); + + return expr_gen.node_allocator_-> + template allocate_cr > >(c0 + c1, v); + } + // (c0) - (c1 + v) --> (cov) (c0 - c1) - v + else if ((details::e_sub == o0) && (details::e_add == o1)) + { + exprtk_debug(("(c0) - (c1 + v) --> (cov) (c0 - c1) - v\n")); + + return expr_gen.node_allocator_-> + template allocate_cr > >(c0 - c1, v); + } + // (c0) - (c1 - v) --> (cov) (c0 - c1) + v + else if ((details::e_sub == o0) && (details::e_sub == o1)) + { + exprtk_debug(("(c0) - (c1 - v) --> (cov) (c0 - c1) + v\n")); + + return expr_gen.node_allocator_-> + template allocate_cr > >(c0 - c1, v); + } + // (c0) * (c1 * v) --> (cov) (c0 * c1) * v + else if ((details::e_mul == o0) && (details::e_mul == o1)) + { + exprtk_debug(("(c0) * (c1 * v) --> (cov) (c0 * c1) * v\n")); + + return expr_gen.node_allocator_-> + template allocate_cr > >(c0 * c1, v); + } + // (c0) * (c1 / v) --> (cov) (c0 * c1) / v + else if ((details::e_mul == o0) && (details::e_div == o1)) + { + exprtk_debug(("(c0) * (c1 / v) --> (cov) (c0 * c1) / v\n")); + + return expr_gen.node_allocator_-> + template allocate_cr > >(c0 * c1, v); + } + // (c0) / (c1 * v) --> (cov) (c0 / c1) / v + else if ((details::e_div == o0) && (details::e_mul == o1)) + { + exprtk_debug(("(c0) / (c1 * v) --> (cov) (c0 / c1) / v\n")); + + return expr_gen.node_allocator_-> + template allocate_cr > >(c0 / c1, v); + } + // (c0) / (c1 / v) --> (cov) (c0 / c1) * v + else if ((details::e_div == o0) && (details::e_div == o1)) + { + exprtk_debug(("(c0) / (c1 / v) --> (cov) (c0 / c1) * v\n")); + + return expr_gen.node_allocator_-> + template allocate_cr > >(c0 / c1, v); + } + } + + const bool synthesis_result = + synthesize_sf3ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1), c0, c1, v, result); + + if (synthesis_result) + return result; + + binary_functor_t f0 = reinterpret_cast(0); + binary_functor_t f1 = reinterpret_cast(0); + + if (!expr_gen.valid_operator(o0,f0)) + return error_node(); + else if (!expr_gen.valid_operator(o1,f1)) + return error_node(); + else + return node_type::allocate(*(expr_gen.node_allocator_), c0, c1, v, f0, f1); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1) + { + return details::build_string() + << "t" << expr_gen.to_str(o0) + << "(t" << expr_gen.to_str(o1) + << "t)"; + } + }; + + struct synthesize_vococ_expression0 + { + typedef typename vococ_t::type0 node_type; + typedef typename vococ_t::sf3_type sf3_type; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // (v o0 c0) o1 (c1) + const details::voc_base_node* voc = static_cast*>(branch[0]); + const Type& v = voc->v(); + const Type& c0 = voc->c(); + const Type& c1 = static_cast*>(branch[1])->value(); + const details::operator_type o0 = voc->operation(); + const details::operator_type o1 = operation; + + details::free_node(*(expr_gen.node_allocator_),branch[0]); + details::free_node(*(expr_gen.node_allocator_),branch[1]); + + expression_node_ptr result = error_node(); + + if (expr_gen.parser_->settings_.strength_reduction_enabled()) + { + // (v + c0) + c1 --> (voc) v + (c0 + c1) + if ((details::e_add == o0) && (details::e_add == o1)) + { + exprtk_debug(("(v + c0) + c1 --> (voc) v + (c0 + c1)\n")); + + return expr_gen.node_allocator_-> + template allocate_rc > >(v, c0 + c1); + } + // (v + c0) - c1 --> (voc) v + (c0 - c1) + else if ((details::e_add == o0) && (details::e_sub == o1)) + { + exprtk_debug(("(v + c0) - c1 --> (voc) v + (c0 - c1)\n")); + + return expr_gen.node_allocator_-> + template allocate_rc > >(v, c0 - c1); + } + // (v - c0) + c1 --> (voc) v - (c0 + c1) + else if ((details::e_sub == o0) && (details::e_add == o1)) + { + exprtk_debug(("(v - c0) + c1 --> (voc) v - (c0 + c1)\n")); + + return expr_gen.node_allocator_-> + template allocate_rc > >(v, c1 - c0); + } + // (v - c0) - c1 --> (voc) v - (c0 + c1) + else if ((details::e_sub == o0) && (details::e_sub == o1)) + { + exprtk_debug(("(v - c0) - c1 --> (voc) v - (c0 + c1)\n")); + + return expr_gen.node_allocator_-> + template allocate_rc > >(v, c0 + c1); + } + // (v * c0) * c1 --> (voc) v * (c0 * c1) + else if ((details::e_mul == o0) && (details::e_mul == o1)) + { + exprtk_debug(("(v * c0) * c1 --> (voc) v * (c0 * c1)\n")); + + return expr_gen.node_allocator_-> + template allocate_rc > >(v, c0 * c1); + } + // (v * c0) / c1 --> (voc) v * (c0 / c1) + else if ((details::e_mul == o0) && (details::e_div == o1)) + { + exprtk_debug(("(v * c0) / c1 --> (voc) v * (c0 / c1)\n")); + + return expr_gen.node_allocator_-> + template allocate_rc > >(v, c0 / c1); + } + // (v / c0) * c1 --> (voc) v * (c1 / c0) + else if ((details::e_div == o0) && (details::e_mul == o1)) + { + exprtk_debug(("(v / c0) * c1 --> (voc) v * (c1 / c0)\n")); + + return expr_gen.node_allocator_-> + template allocate_rc > >(v, c1 / c0); + } + // (v / c0) / c1 --> (voc) v / (c0 * c1) + else if ((details::e_div == o0) && (details::e_div == o1)) + { + exprtk_debug(("(v / c0) / c1 --> (voc) v / (c0 * c1)\n")); + + return expr_gen.node_allocator_-> + template allocate_rc > >(v, c0 * c1); + } + // (v ^ c0) ^ c1 --> (voc) v ^ (c0 * c1) + else if ((details::e_pow == o0) && (details::e_pow == o1)) + { + exprtk_debug(("(v ^ c0) ^ c1 --> (voc) v ^ (c0 * c1)\n")); + + return expr_gen.node_allocator_-> + template allocate_rc > >(v, c0 * c1); + } + } + + const bool synthesis_result = + synthesize_sf3ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1), v, c0, c1, result); + + if (synthesis_result) + return result; + + binary_functor_t f0 = reinterpret_cast(0); + binary_functor_t f1 = reinterpret_cast(0); + + if (!expr_gen.valid_operator(o0,f0)) + return error_node(); + else if (!expr_gen.valid_operator(o1,f1)) + return error_node(); + else + return node_type::allocate(*(expr_gen.node_allocator_), v, c0, c1, f0, f1); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1) + { + return details::build_string() + << "(t" << expr_gen.to_str(o0) + << "t)" << expr_gen.to_str(o1) + << "t"; + } + }; + + struct synthesize_vococ_expression1 + { + typedef typename vococ_t::type0 node_type; + + static inline expression_node_ptr process(expression_generator&, + const details::operator_type&, + expression_node_ptr (&)[2]) + { + // (v) o0 (c0 o1 c1) - Not possible. + exprtk_debug(("(v) o0 (c0 o1 c1) - Not possible.\n")); + return error_node(); + } + }; + + struct synthesize_vovovov_expression0 + { + typedef typename vovovov_t::type0 node_type; + typedef typename vovovov_t::sf4_type sf4_type; + typedef typename node_type::T0 T0; + typedef typename node_type::T1 T1; + typedef typename node_type::T2 T2; + typedef typename node_type::T3 T3; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // (v0 o0 v1) o1 (v2 o2 v3) + const details::vov_base_node* vov0 = static_cast*>(branch[0]); + const details::vov_base_node* vov1 = static_cast*>(branch[1]); + const Type& v0 = vov0->v0(); + const Type& v1 = vov0->v1(); + const Type& v2 = vov1->v0(); + const Type& v3 = vov1->v1(); + const details::operator_type o0 = vov0->operation(); + const details::operator_type o1 = operation; + const details::operator_type o2 = vov1->operation(); + + details::free_node(*(expr_gen.node_allocator_),branch[0]); + details::free_node(*(expr_gen.node_allocator_),branch[1]); + + expression_node_ptr result = error_node(); + + if (expr_gen.parser_->settings_.strength_reduction_enabled()) + { + // (v0 / v1) * (v2 / v3) --> (vovovov) (v0 * v2) / (v1 * v3) + if ((details::e_div == o0) && (details::e_mul == o1) && (details::e_div == o2)) + { + const bool synthesis_result = + synthesize_sf4ext_expression:: + template compile(expr_gen, "(t*t)/(t*t)", v0, v2, v1, v3, result); + + exprtk_debug(("(v0 / v1) * (v2 / v3) --> (vovovov) (v0 * v2) / (v1 * v3)\n")); + + return (synthesis_result) ? result : error_node(); + } + // (v0 / v1) / (v2 / v3) --> (vovovov) (v0 * v3) / (v1 * v2) + else if ((details::e_div == o0) && (details::e_div == o1) && (details::e_div == o2)) + { + const bool synthesis_result = + synthesize_sf4ext_expression:: + template compile(expr_gen, "(t*t)/(t*t)", v0, v3, v1, v2, result); + + exprtk_debug(("(v0 / v1) / (v2 / v3) --> (vovovov) (v0 * v3) / (v1 * v2)\n")); + + return (synthesis_result) ? result : error_node(); + } + // (v0 + v1) / (v2 / v3) --> (vovovov) (v0 + v1) * (v3 / v2) + else if ((details::e_add == o0) && (details::e_div == o1) && (details::e_div == o2)) + { + const bool synthesis_result = + synthesize_sf4ext_expression:: + template compile(expr_gen, "(t+t)*(t/t)", v0, v1, v3, v2, result); + + exprtk_debug(("(v0 + v1) / (v2 / v3) --> (vovovov) (v0 + v1) * (v3 / v2)\n")); + + return (synthesis_result) ? result : error_node(); + } + // (v0 - v1) / (v2 / v3) --> (vovovov) (v0 + v1) * (v3 / v2) + else if ((details::e_sub == o0) && (details::e_div == o1) && (details::e_div == o2)) + { + const bool synthesis_result = + synthesize_sf4ext_expression:: + template compile(expr_gen, "(t-t)*(t/t)", v0, v1, v3, v2, result); + + exprtk_debug(("(v0 - v1) / (v2 / v3) --> (vovovov) (v0 - v1) * (v3 / v2)\n")); + + return (synthesis_result) ? result : error_node(); + } + // (v0 * v1) / (v2 / v3) --> (vovovov) ((v0 * v1) * v3) / v2 + else if ((details::e_mul == o0) && (details::e_div == o1) && (details::e_div == o2)) + { + const bool synthesis_result = + synthesize_sf4ext_expression:: + template compile(expr_gen, "((t*t)*t)/t", v0, v1, v3, v2, result); + + exprtk_debug(("(v0 * v1) / (v2 / v3) --> (vovovov) ((v0 * v1) * v3) / v2\n")); + + return (synthesis_result) ? result : error_node(); + } + } + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1, o2), v0, v1, v2, v3, result); + + if (synthesis_result) + return result; + + binary_functor_t f0 = reinterpret_cast(0); + binary_functor_t f1 = reinterpret_cast(0); + binary_functor_t f2 = reinterpret_cast(0); + + if (!expr_gen.valid_operator(o0,f0)) + return error_node(); + else if (!expr_gen.valid_operator(o1,f1)) + return error_node(); + else if (!expr_gen.valid_operator(o2,f2)) + return error_node(); + else + return node_type::allocate(*(expr_gen.node_allocator_), v0, v1, v2, v3, f0, f1, f2); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1, + const details::operator_type o2) + { + return details::build_string() + << "(t" << expr_gen.to_str(o0) + << "t)" << expr_gen.to_str(o1) + << "(t" << expr_gen.to_str(o2) + << "t)"; + } + }; + + struct synthesize_vovovoc_expression0 + { + typedef typename vovovoc_t::type0 node_type; + typedef typename vovovoc_t::sf4_type sf4_type; + typedef typename node_type::T0 T0; + typedef typename node_type::T1 T1; + typedef typename node_type::T2 T2; + typedef typename node_type::T3 T3; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // (v0 o0 v1) o1 (v2 o2 c) + const details::vov_base_node* vov = static_cast*>(branch[0]); + const details::voc_base_node* voc = static_cast*>(branch[1]); + const Type& v0 = vov->v0(); + const Type& v1 = vov->v1(); + const Type& v2 = voc->v (); + const Type c = voc->c (); + const details::operator_type o0 = vov->operation(); + const details::operator_type o1 = operation; + const details::operator_type o2 = voc->operation(); + + details::free_node(*(expr_gen.node_allocator_),branch[0]); + details::free_node(*(expr_gen.node_allocator_),branch[1]); + + expression_node_ptr result = error_node(); + + if (expr_gen.parser_->settings_.strength_reduction_enabled()) + { + // (v0 / v1) * (v2 / c) --> (vovovoc) (v0 * v2) / (v1 * c) + if ((details::e_div == o0) && (details::e_mul == o1) && (details::e_div == o2)) + { + const bool synthesis_result = + synthesize_sf4ext_expression:: + template compile(expr_gen, "(t*t)/(t*t)", v0, v2, v1, c, result); + + exprtk_debug(("(v0 / v1) * (v2 / c) --> (vovovoc) (v0 * v2) / (v1 * c)\n")); + + return (synthesis_result) ? result : error_node(); + } + // (v0 / v1) / (v2 / c) --> (vocovov) (v0 * c) / (v1 * v2) + if ((details::e_div == o0) && (details::e_div == o1) && (details::e_div == o2)) + { + const bool synthesis_result = + synthesize_sf4ext_expression:: + template compile(expr_gen, "(t*t)/(t*t)", v0, c, v1, v2, result); + + exprtk_debug(("(v0 / v1) / (v2 / c) --> (vocovov) (v0 * c) / (v1 * v2)\n")); + + return (synthesis_result) ? result : error_node(); + } + } + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1, o2), v0, v1, v2, c, result); + + if (synthesis_result) + return result; + + binary_functor_t f0 = reinterpret_cast(0); + binary_functor_t f1 = reinterpret_cast(0); + binary_functor_t f2 = reinterpret_cast(0); + + if (!expr_gen.valid_operator(o0,f0)) + return error_node(); + else if (!expr_gen.valid_operator(o1,f1)) + return error_node(); + else if (!expr_gen.valid_operator(o2,f2)) + return error_node(); + else + return node_type::allocate(*(expr_gen.node_allocator_), v0, v1, v2, c, f0, f1, f2); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1, + const details::operator_type o2) + { + return details::build_string() + << "(t" << expr_gen.to_str(o0) + << "t)" << expr_gen.to_str(o1) + << "(t" << expr_gen.to_str(o2) + << "t)"; + } + }; + + struct synthesize_vovocov_expression0 + { + typedef typename vovocov_t::type0 node_type; + typedef typename vovocov_t::sf4_type sf4_type; + typedef typename node_type::T0 T0; + typedef typename node_type::T1 T1; + typedef typename node_type::T2 T2; + typedef typename node_type::T3 T3; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // (v0 o0 v1) o1 (c o2 v2) + const details::vov_base_node* vov = static_cast*>(branch[0]); + const details::cov_base_node* cov = static_cast*>(branch[1]); + const Type& v0 = vov->v0(); + const Type& v1 = vov->v1(); + const Type& v2 = cov->v (); + const Type c = cov->c (); + const details::operator_type o0 = vov->operation(); + const details::operator_type o1 = operation; + const details::operator_type o2 = cov->operation(); + + details::free_node(*(expr_gen.node_allocator_),branch[0]); + details::free_node(*(expr_gen.node_allocator_),branch[1]); + + expression_node_ptr result = error_node(); + + if (expr_gen.parser_->settings_.strength_reduction_enabled()) + { + // (v0 / v1) * (c / v2) --> (vocovov) (v0 * c) / (v1 * v2) + if ((details::e_div == o0) && (details::e_mul == o1) && (details::e_div == o2)) + { + const bool synthesis_result = + synthesize_sf4ext_expression:: + template compile(expr_gen, "(t*t)/(t*t)", v0, c, v1, v2, result); + + exprtk_debug(("(v0 / v1) * (c / v2) --> (vocovov) (v0 * c) / (v1 * v2)\n")); + + return (synthesis_result) ? result : error_node(); + } + // (v0 / v1) / (c / v2) --> (vovovoc) (v0 * v2) / (v1 * c) + if ((details::e_div == o0) && (details::e_div == o1) && (details::e_div == o2)) + { + const bool synthesis_result = + synthesize_sf4ext_expression:: + template compile(expr_gen, "(t*t)/(t*t)", v0, v2, v1, c, result); + + exprtk_debug(("(v0 / v1) / (c / v2) --> (vovovoc) (v0 * v2) / (v1 * c)\n")); + + return (synthesis_result) ? result : error_node(); + } + } + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1, o2), v0, v1, c, v2, result); + + if (synthesis_result) + return result; + + binary_functor_t f0 = reinterpret_cast(0); + binary_functor_t f1 = reinterpret_cast(0); + binary_functor_t f2 = reinterpret_cast(0); + + if (!expr_gen.valid_operator(o0,f0)) + return error_node(); + else if (!expr_gen.valid_operator(o1,f1)) + return error_node(); + else if (!expr_gen.valid_operator(o2,f2)) + return error_node(); + else + return node_type::allocate(*(expr_gen.node_allocator_), v0, v1, c, v2, f0, f1, f2); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1, + const details::operator_type o2) + { + return details::build_string() + << "(t" << expr_gen.to_str(o0) + << "t)" << expr_gen.to_str(o1) + << "(t" << expr_gen.to_str(o2) + << "t)"; + } + }; + + struct synthesize_vocovov_expression0 + { + typedef typename vocovov_t::type0 node_type; + typedef typename vocovov_t::sf4_type sf4_type; + typedef typename node_type::T0 T0; + typedef typename node_type::T1 T1; + typedef typename node_type::T2 T2; + typedef typename node_type::T3 T3; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // (v0 o0 c) o1 (v1 o2 v2) + const details::voc_base_node* voc = static_cast*>(branch[0]); + const details::vov_base_node* vov = static_cast*>(branch[1]); + const Type c = voc->c (); + const Type& v0 = voc->v (); + const Type& v1 = vov->v0(); + const Type& v2 = vov->v1(); + const details::operator_type o0 = voc->operation(); + const details::operator_type o1 = operation; + const details::operator_type o2 = vov->operation(); + + details::free_node(*(expr_gen.node_allocator_),branch[0]); + details::free_node(*(expr_gen.node_allocator_),branch[1]); + + expression_node_ptr result = error_node(); + + if (expr_gen.parser_->settings_.strength_reduction_enabled()) + { + // (v0 / c) * (v1 / v2) --> (vovocov) (v0 * v1) / (c * v2) + if ((details::e_div == o0) && (details::e_mul == o1) && (details::e_div == o2)) + { + const bool synthesis_result = + synthesize_sf4ext_expression:: + template compile(expr_gen, "(t*t)/(t*t)", v0, v1, c, v2, result); + + exprtk_debug(("(v0 / c) * (v1 / v2) --> (vovocov) (v0 * v1) / (c * v2)\n")); + + return (synthesis_result) ? result : error_node(); + } + // (v0 / c) / (v1 / v2) --> (vovocov) (v0 * v2) / (c * v1) + if ((details::e_div == o0) && (details::e_div == o1) && (details::e_div == o2)) + { + const bool synthesis_result = + synthesize_sf4ext_expression:: + template compile(expr_gen, "(t*t)/(t*t)", v0, v2, c, v1, result); + + exprtk_debug(("(v0 / c) / (v1 / v2) --> (vovocov) (v0 * v2) / (c * v1)\n")); + + return (synthesis_result) ? result : error_node(); + } + } + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1, o2), v0, c, v1, v2, result); + + if (synthesis_result) + return result; + + binary_functor_t f0 = reinterpret_cast(0); + binary_functor_t f1 = reinterpret_cast(0); + binary_functor_t f2 = reinterpret_cast(0); + + if (!expr_gen.valid_operator(o0,f0)) + return error_node(); + else if (!expr_gen.valid_operator(o1,f1)) + return error_node(); + else if (!expr_gen.valid_operator(o2,f2)) + return error_node(); + else + return node_type::allocate(*(expr_gen.node_allocator_), v0, c, v1, v2, f0, f1, f2); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1, + const details::operator_type o2) + { + return details::build_string() + << "(t" << expr_gen.to_str(o0) + << "t)" << expr_gen.to_str(o1) + << "(t" << expr_gen.to_str(o2) + << "t)"; + } + }; + + struct synthesize_covovov_expression0 + { + typedef typename covovov_t::type0 node_type; + typedef typename covovov_t::sf4_type sf4_type; + typedef typename node_type::T0 T0; + typedef typename node_type::T1 T1; + typedef typename node_type::T2 T2; + typedef typename node_type::T3 T3; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // (c o0 v0) o1 (v1 o2 v2) + const details::cov_base_node* cov = static_cast*>(branch[0]); + const details::vov_base_node* vov = static_cast*>(branch[1]); + const Type c = cov->c (); + const Type& v0 = cov->v (); + const Type& v1 = vov->v0(); + const Type& v2 = vov->v1(); + const details::operator_type o0 = cov->operation(); + const details::operator_type o1 = operation; + const details::operator_type o2 = vov->operation(); + + details::free_node(*(expr_gen.node_allocator_),branch[0]); + details::free_node(*(expr_gen.node_allocator_),branch[1]); + + expression_node_ptr result = error_node(); + + if (expr_gen.parser_->settings_.strength_reduction_enabled()) + { + // (c / v0) * (v1 / v2) --> (covovov) (c * v1) / (v0 * v2) + if ((details::e_div == o0) && (details::e_mul == o1) && (details::e_div == o2)) + { + const bool synthesis_result = + synthesize_sf4ext_expression:: + template compile(expr_gen, "(t*t)/(t*t)", c, v1, v0, v2, result); + + exprtk_debug(("(c / v0) * (v1 / v2) --> (covovov) (c * v1) / (v0 * v2)\n")); + + return (synthesis_result) ? result : error_node(); + } + // (c / v0) / (v1 / v2) --> (covovov) (c * v2) / (v0 * v1) + if ((details::e_div == o0) && (details::e_div == o1) && (details::e_div == o2)) + { + const bool synthesis_result = + synthesize_sf4ext_expression:: + template compile(expr_gen, "(t*t)/(t*t)", c, v2, v0, v1, result); + + exprtk_debug(("(c / v0) / (v1 / v2) --> (covovov) (c * v2) / (v0 * v1)\n")); + + return (synthesis_result) ? result : error_node(); + } + } + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1, o2), c, v0, v1, v2, result); + + if (synthesis_result) + return result; + + binary_functor_t f0 = reinterpret_cast(0); + binary_functor_t f1 = reinterpret_cast(0); + binary_functor_t f2 = reinterpret_cast(0); + + if (!expr_gen.valid_operator(o0,f0)) + return error_node(); + else if (!expr_gen.valid_operator(o1,f1)) + return error_node(); + else if (!expr_gen.valid_operator(o2,f2)) + return error_node(); + else + return node_type::allocate(*(expr_gen.node_allocator_), c, v0, v1, v2, f0, f1, f2); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1, + const details::operator_type o2) + { + return details::build_string() + << "(t" << expr_gen.to_str(o0) + << "t)" << expr_gen.to_str(o1) + << "(t" << expr_gen.to_str(o2) + << "t)"; + } + }; + + struct synthesize_covocov_expression0 + { + typedef typename covocov_t::type0 node_type; + typedef typename covocov_t::sf4_type sf4_type; + typedef typename node_type::T0 T0; + typedef typename node_type::T1 T1; + typedef typename node_type::T2 T2; + typedef typename node_type::T3 T3; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // (c0 o0 v0) o1 (c1 o2 v1) + const details::cov_base_node* cov0 = static_cast*>(branch[0]); + const details::cov_base_node* cov1 = static_cast*>(branch[1]); + const Type c0 = cov0->c(); + const Type& v0 = cov0->v(); + const Type c1 = cov1->c(); + const Type& v1 = cov1->v(); + const details::operator_type o0 = cov0->operation(); + const details::operator_type o1 = operation; + const details::operator_type o2 = cov1->operation(); + + details::free_node(*(expr_gen.node_allocator_),branch[0]); + details::free_node(*(expr_gen.node_allocator_),branch[1]); + + expression_node_ptr result = error_node(); + + if (expr_gen.parser_->settings_.strength_reduction_enabled()) + { + // (c0 + v0) + (c1 + v1) --> (covov) (c0 + c1) + v0 + v1 + if ((details::e_add == o0) && (details::e_add == o1) && (details::e_add == o2)) + { + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, "(t+t)+t", (c0 + c1), v0, v1, result); + + exprtk_debug(("(c0 + v0) + (c1 + v1) --> (covov) (c0 + c1) + v0 + v1\n")); + + return (synthesis_result) ? result : error_node(); + } + // (c0 + v0) - (c1 + v1) --> (covov) (c0 - c1) + v0 - v1 + else if ((details::e_add == o0) && (details::e_sub == o1) && (details::e_add == o2)) + { + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, "(t+t)-t", (c0 - c1), v0, v1, result); + + exprtk_debug(("(c0 + v0) - (c1 + v1) --> (covov) (c0 - c1) + v0 - v1\n")); + + return (synthesis_result) ? result : error_node(); + } + // (c0 - v0) - (c1 - v1) --> (covov) (c0 - c1) - v0 + v1 + else if ((details::e_sub == o0) && (details::e_sub == o1) && (details::e_sub == o2)) + { + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, "(t-t)+t", (c0 - c1), v0, v1, result); + + exprtk_debug(("(c0 - v0) - (c1 - v1) --> (covov) (c0 - c1) - v0 + v1\n")); + + return (synthesis_result) ? result : error_node(); + } + // (c0 * v0) * (c1 * v1) --> (covov) (c0 * c1) * v0 * v1 + else if ((details::e_mul == o0) && (details::e_mul == o1) && (details::e_mul == o2)) + { + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, "(t*t)*t", (c0 * c1), v0, v1, result); + + exprtk_debug(("(c0 * v0) * (c1 * v1) --> (covov) (c0 * c1) * v0 * v1\n")); + + return (synthesis_result) ? result : error_node(); + } + // (c0 * v0) / (c1 * v1) --> (covov) (c0 / c1) * (v0 / v1) + else if ((details::e_mul == o0) && (details::e_div == o1) && (details::e_mul == o2)) + { + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, "(t*t)/t", (c0 / c1), v0, v1, result); + + exprtk_debug(("(c0 * v0) / (c1 * v1) --> (covov) (c0 / c1) * (v0 / v1)\n")); + + return (synthesis_result) ? result : error_node(); + } + // (c0 / v0) * (c1 / v1) --> (covov) (c0 * c1) / (v0 * v1) + else if ((details::e_div == o0) && (details::e_mul == o1) && (details::e_div == o2)) + { + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, "t/(t*t)", (c0 * c1), v0, v1, result); + + exprtk_debug(("(c0 / v0) * (c1 / v1) --> (covov) (c0 * c1) / (v0 * v1)\n")); + + return (synthesis_result) ? result : error_node(); + } + // (c0 / v0) / (c1 / v1) --> (covov) ((c0 / c1) * v1) / v0 + else if ((details::e_div == o0) && (details::e_div == o1) && (details::e_div == o2)) + { + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, "(t*t)/t", (c0 / c1), v1, v0, result); + + exprtk_debug(("(c0 / v0) / (c1 / v1) --> (covov) ((c0 / c1) * v1) / v0\n")); + + return (synthesis_result) ? result : error_node(); + } + // (c0 * v0) / (c1 / v1) --> (covov) (c0 / c1) * (v0 * v1) + else if ((details::e_mul == o0) && (details::e_div == o1) && (details::e_div == o2)) + { + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, "t*(t*t)", (c0 / c1), v0, v1, result); + + exprtk_debug(("(c0 * v0) / (c1 / v1) --> (covov) (c0 / c1) * (v0 * v1)\n")); + + return (synthesis_result) ? result : error_node(); + } + // (c0 / v0) / (c1 * v1) --> (covov) (c0 / c1) / (v0 * v1) + else if ((details::e_div == o0) && (details::e_div == o1) && (details::e_mul == o2)) + { + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, "t/(t*t)", (c0 / c1), v0, v1, result); + + exprtk_debug(("(c0 / v0) / (c1 * v1) --> (covov) (c0 / c1) / (v0 * v1)\n")); + + return (synthesis_result) ? result : error_node(); + } + // (c * v0) +/- (c * v1) --> (covov) c * (v0 +/- v1) + else if ( + (std::equal_to()(c0,c1)) && + (details::e_mul == o0) && + (details::e_mul == o2) && + ( + (details::e_add == o1) || + (details::e_sub == o1) + ) + ) + { + std::string specfunc; + + switch (o1) + { + case details::e_add : specfunc = "t*(t+t)"; break; + case details::e_sub : specfunc = "t*(t-t)"; break; + default : return error_node(); + } + + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, specfunc, c0, v0, v1, result); + + exprtk_debug(("(c * v0) +/- (c * v1) --> (covov) c * (v0 +/- v1)\n")); + + return (synthesis_result) ? result : error_node(); + } + } + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1, o2), c0, v0, c1, v1, result); + + if (synthesis_result) + return result; + + binary_functor_t f0 = reinterpret_cast(0); + binary_functor_t f1 = reinterpret_cast(0); + binary_functor_t f2 = reinterpret_cast(0); + + if (!expr_gen.valid_operator(o0,f0)) + return error_node(); + else if (!expr_gen.valid_operator(o1,f1)) + return error_node(); + else if (!expr_gen.valid_operator(o2,f2)) + return error_node(); + else + return node_type::allocate(*(expr_gen.node_allocator_), c0, v0, c1, v1, f0, f1, f2); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1, + const details::operator_type o2) + { + return details::build_string() + << "(t" << expr_gen.to_str(o0) + << "t)" << expr_gen.to_str(o1) + << "(t" << expr_gen.to_str(o2) + << "t)"; + } + }; + + struct synthesize_vocovoc_expression0 + { + typedef typename vocovoc_t::type0 node_type; + typedef typename vocovoc_t::sf4_type sf4_type; + typedef typename node_type::T0 T0; + typedef typename node_type::T1 T1; + typedef typename node_type::T2 T2; + typedef typename node_type::T3 T3; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // (v0 o0 c0) o1 (v1 o2 c1) + const details::voc_base_node* voc0 = static_cast*>(branch[0]); + const details::voc_base_node* voc1 = static_cast*>(branch[1]); + const Type c0 = voc0->c(); + const Type& v0 = voc0->v(); + const Type c1 = voc1->c(); + const Type& v1 = voc1->v(); + const details::operator_type o0 = voc0->operation(); + const details::operator_type o1 = operation; + const details::operator_type o2 = voc1->operation(); + + details::free_node(*(expr_gen.node_allocator_),branch[0]); + details::free_node(*(expr_gen.node_allocator_),branch[1]); + + expression_node_ptr result = error_node(); + + if (expr_gen.parser_->settings_.strength_reduction_enabled()) + { + // (v0 + c0) + (v1 + c1) --> (covov) (c0 + c1) + v0 + v1 + if ((details::e_add == o0) && (details::e_add == o1) && (details::e_add == o2)) + { + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, "(t+t)+t", (c0 + c1), v0, v1, result); + + exprtk_debug(("(v0 + c0) + (v1 + c1) --> (covov) (c0 + c1) + v0 + v1\n")); + + return (synthesis_result) ? result : error_node(); + } + // (v0 + c0) - (v1 + c1) --> (covov) (c0 - c1) + v0 - v1 + else if ((details::e_add == o0) && (details::e_sub == o1) && (details::e_add == o2)) + { + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, "(t+t)-t", (c0 - c1), v0, v1, result); + + exprtk_debug(("(v0 + c0) - (v1 + c1) --> (covov) (c0 - c1) + v0 - v1\n")); + + return (synthesis_result) ? result : error_node(); + } + // (v0 - c0) - (v1 - c1) --> (covov) (c1 - c0) + v0 - v1 + else if ((details::e_sub == o0) && (details::e_sub == o1) && (details::e_sub == o2)) + { + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, "(t+t)-t", (c1 - c0), v0, v1, result); + + exprtk_debug(("(v0 - c0) - (v1 - c1) --> (covov) (c1 - c0) + v0 - v1\n")); + + return (synthesis_result) ? result : error_node(); + } + // (v0 * c0) * (v1 * c1) --> (covov) (c0 * c1) * v0 * v1 + else if ((details::e_mul == o0) && (details::e_mul == o1) && (details::e_mul == o2)) + { + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, "(t*t)*t", (c0 * c1), v0, v1, result); + + exprtk_debug(("(v0 * c0) * (v1 * c1) --> (covov) (c0 * c1) * v0 * v1\n")); + + return (synthesis_result) ? result : error_node(); + } + // (v0 * c0) / (v1 * c1) --> (covov) (c0 / c1) * (v0 / v1) + else if ((details::e_mul == o0) && (details::e_div == o1) && (details::e_mul == o2)) + { + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, "(t*t)/t", (c0 / c1), v0, v1, result); + + exprtk_debug(("(v0 * c0) / (v1 * c1) --> (covov) (c0 / c1) * (v0 / v1)\n")); + + return (synthesis_result) ? result : error_node(); + } + // (v0 / c0) * (v1 / c1) --> (covov) (1 / (c0 * c1)) * v0 * v1 + else if ((details::e_div == o0) && (details::e_mul == o1) && (details::e_div == o2)) + { + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, "(t*t)*t", Type(1) / (c0 * c1), v0, v1, result); + + exprtk_debug(("(v0 / c0) * (v1 / c1) --> (covov) (1 / (c0 * c1)) * v0 * v1\n")); + + return (synthesis_result) ? result : error_node(); + } + // (v0 / c0) / (v1 / c1) --> (covov) ((c1 / c0) * v0) / v1 + else if ((details::e_div == o0) && (details::e_div == o1) && (details::e_div == o2)) + { + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, "(t*t)/t", (c1 / c0), v0, v1, result); + + exprtk_debug(("(v0 / c0) / (v1 / c1) --> (covov) ((c1 / c0) * v0) / v1\n")); + + return (synthesis_result) ? result : error_node(); + } + // (v0 * c0) / (v1 / c1) --> (covov) (c0 * c1) * (v0 / v1) + else if ((details::e_mul == o0) && (details::e_div == o1) && (details::e_div == o2)) + { + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, "t*(t/t)", (c0 * c1), v0, v1, result); + + exprtk_debug(("(v0 * c0) / (v1 / c1) --> (covov) (c0 * c1) * (v0 / v1)\n")); + + return (synthesis_result) ? result : error_node(); + } + // (v0 / c0) / (v1 * c1) --> (covov) (1 / (c0 * c1)) * v0 / v1 + else if ((details::e_div == o0) && (details::e_div == o1) && (details::e_mul == o2)) + { + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, "t*(t/t)", Type(1) / (c0 * c1), v0, v1, result); + + exprtk_debug(("(v0 / c0) / (v1 * c1) --> (covov) (1 / (c0 * c1)) * v0 / v1\n")); + + return (synthesis_result) ? result : error_node(); + } + // (v0 / c0) * (v1 + c1) --> (vocovoc) (v0 * (1 / c0)) * (v1 + c1) + else if ((details::e_div == o0) && (details::e_mul == o1) && (details::e_add == o2)) + { + const bool synthesis_result = + synthesize_sf4ext_expression:: + template compile(expr_gen, "(t*t)*(t+t)", v0, T(1) / c0, v1, c1, result); + + exprtk_debug(("(v0 / c0) * (v1 + c1) --> (vocovoc) (v0 * (1 / c0)) * (v1 + c1)\n")); + + return (synthesis_result) ? result : error_node(); + } + // (v0 / c0) * (v1 - c1) --> (vocovoc) (v0 * (1 / c0)) * (v1 - c1) + else if ((details::e_div == o0) && (details::e_mul == o1) && (details::e_sub == o2)) + { + const bool synthesis_result = + synthesize_sf4ext_expression:: + template compile(expr_gen, "(t*t)*(t-t)", v0, T(1) / c0, v1, c1, result); + + exprtk_debug(("(v0 / c0) * (v1 - c1) --> (vocovoc) (v0 * (1 / c0)) * (v1 - c1)\n")); + + return (synthesis_result) ? result : error_node(); + } + // (v0 * c) +/- (v1 * c) --> (covov) c * (v0 +/- v1) + else if ( + (std::equal_to()(c0,c1)) && + (details::e_mul == o0) && + (details::e_mul == o2) && + ( + (details::e_add == o1) || + (details::e_sub == o1) + ) + ) + { + std::string specfunc; + + switch (o1) + { + case details::e_add : specfunc = "t*(t+t)"; break; + case details::e_sub : specfunc = "t*(t-t)"; break; + default : return error_node(); + } + + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, specfunc, c0, v0, v1, result); + + exprtk_debug(("(v0 * c) +/- (v1 * c) --> (covov) c * (v0 +/- v1)\n")); + + return (synthesis_result) ? result : error_node(); + } + // (v0 / c) +/- (v1 / c) --> (vovoc) (v0 +/- v1) / c + else if ( + (std::equal_to()(c0,c1)) && + (details::e_div == o0) && + (details::e_div == o2) && + ( + (details::e_add == o1) || + (details::e_sub == o1) + ) + ) + { + std::string specfunc; + + switch (o1) + { + case details::e_add : specfunc = "(t+t)/t"; break; + case details::e_sub : specfunc = "(t-t)/t"; break; + default : return error_node(); + } + + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, specfunc, v0, v1, c0, result); + + exprtk_debug(("(v0 / c) +/- (v1 / c) --> (vovoc) (v0 +/- v1) / c\n")); + + return (synthesis_result) ? result : error_node(); + } + } + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1, o2), v0, c0, v1, c1, result); + + if (synthesis_result) + return result; + + binary_functor_t f0 = reinterpret_cast(0); + binary_functor_t f1 = reinterpret_cast(0); + binary_functor_t f2 = reinterpret_cast(0); + + if (!expr_gen.valid_operator(o0,f0)) + return error_node(); + else if (!expr_gen.valid_operator(o1,f1)) + return error_node(); + else if (!expr_gen.valid_operator(o2,f2)) + return error_node(); + else + return node_type::allocate(*(expr_gen.node_allocator_), v0, c0, v1, c1, f0, f1, f2); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1, + const details::operator_type o2) + { + return details::build_string() + << "(t" << expr_gen.to_str(o0) + << "t)" << expr_gen.to_str(o1) + << "(t" << expr_gen.to_str(o2) + << "t)"; + } + }; + + struct synthesize_covovoc_expression0 + { + typedef typename covovoc_t::type0 node_type; + typedef typename covovoc_t::sf4_type sf4_type; + typedef typename node_type::T0 T0; + typedef typename node_type::T1 T1; + typedef typename node_type::T2 T2; + typedef typename node_type::T3 T3; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // (c0 o0 v0) o1 (v1 o2 c1) + const details::cov_base_node* cov = static_cast*>(branch[0]); + const details::voc_base_node* voc = static_cast*>(branch[1]); + const Type c0 = cov->c(); + const Type& v0 = cov->v(); + const Type c1 = voc->c(); + const Type& v1 = voc->v(); + const details::operator_type o0 = cov->operation(); + const details::operator_type o1 = operation; + const details::operator_type o2 = voc->operation(); + + details::free_node(*(expr_gen.node_allocator_),branch[0]); + details::free_node(*(expr_gen.node_allocator_),branch[1]); + + expression_node_ptr result = error_node(); + + if (expr_gen.parser_->settings_.strength_reduction_enabled()) + { + // (c0 + v0) + (v1 + c1) --> (covov) (c0 + c1) + v0 + v1 + if ((details::e_add == o0) && (details::e_add == o1) && (details::e_add == o2)) + { + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, "(t+t)+t", (c0 + c1), v0, v1, result); + + exprtk_debug(("(c0 + v0) + (v1 + c1) --> (covov) (c0 + c1) + v0 + v1\n")); + + return (synthesis_result) ? result : error_node(); + } + // (c0 + v0) - (v1 + c1) --> (covov) (c0 - c1) + v0 - v1 + else if ((details::e_add == o0) && (details::e_sub == o1) && (details::e_add == o2)) + { + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, "(t+t)-t", (c0 - c1), v0, v1, result); + + exprtk_debug(("(c0 + v0) - (v1 + c1) --> (covov) (c0 - c1) + v0 - v1\n")); + + return (synthesis_result) ? result : error_node(); + } + // (c0 - v0) - (v1 - c1) --> (covov) (c0 + c1) - v0 - v1 + else if ((details::e_sub == o0) && (details::e_sub == o1) && (details::e_sub == o2)) + { + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, "t-(t+t)", (c0 + c1), v0, v1, result); + + exprtk_debug(("(c0 - v0) - (v1 - c1) --> (covov) (c0 + c1) - v0 - v1\n")); + + return (synthesis_result) ? result : error_node(); + } + // (c0 * v0) * (v1 * c1) --> (covov) (c0 * c1) * v0 * v1 + else if ((details::e_mul == o0) && (details::e_mul == o1) && (details::e_mul == o2)) + { + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, "(t*t)*t", (c0 * c1), v0, v1, result); + + exprtk_debug(("(c0 * v0) * (v1 * c1) --> (covov) (c0 * c1) * v0 * v1\n")); + + return (synthesis_result) ? result : error_node(); + } + // (c0 * v0) / (v1 * c1) --> (covov) (c0 / c1) * (v0 / v1) + else if ((details::e_mul == o0) && (details::e_div == o1) && (details::e_mul == o2)) + { + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, "(t*t)/t", (c0 / c1), v0, v1, result); + + exprtk_debug(("(c0 * v0) / (v1 * c1) --> (covov) (c0 / c1) * (v0 / v1)\n")); + + return (synthesis_result) ? result : error_node(); + } + // (c0 / v0) * (v1 / c1) --> (covov) (c0 / c1) * (v1 / v0) + else if ((details::e_div == o0) && (details::e_mul == o1) && (details::e_div == o2)) + { + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, "t*(t/t)", (c0 / c1), v1, v0, result); + + exprtk_debug(("(c0 / v0) * (v1 / c1) --> (covov) (c0 / c1) * (v1 / v0)\n")); + + return (synthesis_result) ? result : error_node(); + } + // (c0 / v0) / (v1 / c1) --> (covov) (c0 * c1) / (v0 * v1) + else if ((details::e_div == o0) && (details::e_div == o1) && (details::e_div == o2)) + { + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, "t/(t*t)", (c0 * c1), v0, v1, result); + + exprtk_debug(("(c0 / v0) / (v1 / c1) --> (covov) (c0 * c1) / (v0 * v1)\n")); + + return (synthesis_result) ? result : error_node(); + } + // (c0 * v0) / (v1 / c1) --> (covov) (c0 * c1) * (v0 / v1) + else if ((details::e_mul == o0) && (details::e_div == o1) && (details::e_div == o2)) + { + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, "(t*t)/t", (c0 * c1), v0, v1, result); + + exprtk_debug(("(c0 * v0) / (v1 / c1) --> (covov) (c0 * c1) * (v0 / v1)\n")); + + return (synthesis_result) ? result : error_node(); + } + // (c0 / v0) / (v1 * c1) --> (covov) (c0 / c1) / (v0 * v1) + else if ((details::e_div == o0) && (details::e_div == o1) && (details::e_mul == o2)) + { + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, "t/(t*t)", (c0 / c1), v0, v1, result); + + exprtk_debug(("(c0 / v0) / (v1 * c1) --> (covov) (c0 / c1) / (v0 * v1)\n")); + + return (synthesis_result) ? result : error_node(); + } + // (c * v0) +/- (v1 * c) --> (covov) c * (v0 +/- v1) + else if ( + (std::equal_to()(c0,c1)) && + (details::e_mul == o0) && + (details::e_mul == o2) && + ( + (details::e_add == o1) || + (details::e_sub == o1) + ) + ) + { + std::string specfunc; + + switch (o1) + { + case details::e_add : specfunc = "t*(t+t)"; break; + case details::e_sub : specfunc = "t*(t-t)"; break; + default : return error_node(); + } + + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, specfunc, c0, v0, v1, result); + + exprtk_debug(("(c * v0) +/- (v1 * c) --> (covov) c * (v0 +/- v1)\n")); + + return (synthesis_result) ? result : error_node(); + } + } + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1, o2), c0, v0, v1, c1, result); + + if (synthesis_result) + return result; + + binary_functor_t f0 = reinterpret_cast(0); + binary_functor_t f1 = reinterpret_cast(0); + binary_functor_t f2 = reinterpret_cast(0); + + if (!expr_gen.valid_operator(o0,f0)) + return error_node(); + else if (!expr_gen.valid_operator(o1,f1)) + return error_node(); + else if (!expr_gen.valid_operator(o2,f2)) + return error_node(); + else + return node_type::allocate(*(expr_gen.node_allocator_), c0, v0, v1, c1, f0, f1, f2); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1, + const details::operator_type o2) + { + return details::build_string() + << "(t" << expr_gen.to_str(o0) + << "t)" << expr_gen.to_str(o1) + << "(t" << expr_gen.to_str(o2) + << "t)"; + } + }; + + struct synthesize_vococov_expression0 + { + typedef typename vococov_t::type0 node_type; + typedef typename vococov_t::sf4_type sf4_type; + typedef typename node_type::T0 T0; + typedef typename node_type::T1 T1; + typedef typename node_type::T2 T2; + typedef typename node_type::T3 T3; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // (v0 o0 c0) o1 (c1 o2 v1) + const details::voc_base_node* voc = static_cast*>(branch[0]); + const details::cov_base_node* cov = static_cast*>(branch[1]); + const Type c0 = voc->c(); + const Type& v0 = voc->v(); + const Type c1 = cov->c(); + const Type& v1 = cov->v(); + const details::operator_type o0 = voc->operation(); + const details::operator_type o1 = operation; + const details::operator_type o2 = cov->operation(); + + details::free_node(*(expr_gen.node_allocator_),branch[0]); + details::free_node(*(expr_gen.node_allocator_),branch[1]); + + expression_node_ptr result = error_node(); + + if (expr_gen.parser_->settings_.strength_reduction_enabled()) + { + // (v0 + c0) + (c1 + v1) --> (covov) (c0 + c1) + v0 + v1 + if ((details::e_add == o0) && (details::e_add == o1) && (details::e_add == o2)) + { + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, "(t+t)+t", (c0 + c1), v0, v1, result); + + exprtk_debug(("(v0 + c0) + (c1 + v1) --> (covov) (c0 + c1) + v0 + v1\n")); + + return (synthesis_result) ? result : error_node(); + } + // (v0 + c0) - (c1 + v1) --> (covov) (c0 - c1) + v0 - v1 + else if ((details::e_add == o0) && (details::e_sub == o1) && (details::e_add == o2)) + { + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, "(t+t)-t", (c0 - c1), v0, v1, result); + + exprtk_debug(("(v0 + c0) - (c1 + v1) --> (covov) (c0 - c1) + v0 - v1\n")); + + return (synthesis_result) ? result : error_node(); + } + // (v0 - c0) - (c1 - v1) --> (vovoc) v0 + v1 - (c1 + c0) + else if ((details::e_sub == o0) && (details::e_sub == o1) && (details::e_sub == o2)) + { + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, "(t+t)-t", v0, v1, (c1 + c0), result); + + exprtk_debug(("(v0 - c0) - (c1 - v1) --> (vovoc) v0 + v1 - (c1 + c0)\n")); + + return (synthesis_result) ? result : error_node(); + } + // (v0 * c0) * (c1 * v1) --> (covov) (c0 * c1) * v0 * v1 + else if ((details::e_mul == o0) && (details::e_mul == o1) && (details::e_mul == o2)) + { + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, "(t*t)*t", (c0 * c1), v0, v1, result); + + exprtk_debug(("(v0 * c0) * (c1 * v1) --> (covov) (c0 * c1) * v0 * v1\n")); + + return (synthesis_result) ? result : error_node(); + } + // (v0 * c0) / (c1 * v1) --> (covov) (c0 / c1) * (v0 * v1) + else if ((details::e_mul == o0) && (details::e_div == o1) && (details::e_mul == o2)) + { + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, "(t*t)/t", (c0 / c1), v0, v1, result); + + exprtk_debug(("(v0 * c0) / (c1 * v1) --> (covov) (c0 / c1) * (v0 * v1)\n")); + + return (synthesis_result) ? result : error_node(); + } + // (v0 / c0) * (c1 / v1) --> (covov) (c1 / c0) * (v0 / v1) + else if ((details::e_div == o0) && (details::e_mul == o1) && (details::e_div == o2)) + { + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, "(t*t)/t", (c1 / c0), v0, v1, result); + + exprtk_debug(("(v0 / c0) * (c1 / v1) --> (covov) (c1 / c0) * (v0 / v1)\n")); + + return (synthesis_result) ? result : error_node(); + } + // (v0 * c0) / (c1 / v1) --> (covov) (c0 / c1) * (v0 * v1) + else if ((details::e_mul == o0) && (details::e_div == o1) && (details::e_div == o2)) + { + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, "(t*t)*t", (c0 / c1), v0, v1, result); + + exprtk_debug(("(v0 * c0) / (c1 / v1) --> (covov) (c0 / c1) * (v0 * v1)\n")); + + return (synthesis_result) ? result : error_node(); + } + // (v0 / c0) / (c1 * v1) --> (covov) (1 / (c0 * c1)) * (v0 / v1) + else if ((details::e_div == o0) && (details::e_div == o1) && (details::e_mul == o2)) + { + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, "(t*t)/t", Type(1) / (c0 * c1), v0, v1, result); + + exprtk_debug(("(v0 / c0) / (c1 * v1) --> (covov) (1 / (c0 * c1)) * (v0 / v1)\n")); + + return (synthesis_result) ? result : error_node(); + } + // (v0 / c0) / (c1 / v1) --> (vovoc) (v0 * v1) * (1 / (c0 * c1)) + else if ((details::e_div == o0) && (details::e_div == o1) && (details::e_div == o2)) + { + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, "(t*t)*t", v0, v1, Type(1) / (c0 * c1), result); + + exprtk_debug(("(v0 / c0) / (c1 / v1) --> (vovoc) (v0 * v1) * (1 / (c0 * c1))\n")); + + return (synthesis_result) ? result : error_node(); + } + // (v0 * c) +/- (c * v1) --> (covov) c * (v0 +/- v1) + else if ( + (std::equal_to()(c0,c1)) && + (details::e_mul == o0) && + (details::e_mul == o2) && + ( + (details::e_add == o1) || (details::e_sub == o1) + ) + ) + { + std::string specfunc; + + switch (o1) + { + case details::e_add : specfunc = "t*(t+t)"; break; + case details::e_sub : specfunc = "t*(t-t)"; break; + default : return error_node(); + } + + const bool synthesis_result = + synthesize_sf3ext_expression:: + template compile(expr_gen, specfunc, c0, v0, v1, result); + + exprtk_debug(("(v0 * c) +/- (c * v1) --> (covov) c * (v0 +/- v1)\n")); + + return (synthesis_result) ? result : error_node(); + } + } + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1, o2), v0, c0, c1, v1, result); + + if (synthesis_result) + return result; + + binary_functor_t f0 = reinterpret_cast(0); + binary_functor_t f1 = reinterpret_cast(0); + binary_functor_t f2 = reinterpret_cast(0); + + if (!expr_gen.valid_operator(o0,f0)) + return error_node(); + else if (!expr_gen.valid_operator(o1,f1)) + return error_node(); + else if (!expr_gen.valid_operator(o2,f2)) + return error_node(); + else + return node_type::allocate(*(expr_gen.node_allocator_), v0, c0, c1, v1, f0, f1, f2); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1, + const details::operator_type o2) + { + return details::build_string() + << "(t" << expr_gen.to_str(o0) + << "t)" << expr_gen.to_str(o1) + << "(t" << expr_gen.to_str(o2) + << "t)"; + } + }; + + struct synthesize_vovovov_expression1 + { + typedef typename vovovov_t::type1 node_type; + typedef typename vovovov_t::sf4_type sf4_type; + typedef typename node_type::T0 T0; + typedef typename node_type::T1 T1; + typedef typename node_type::T2 T2; + typedef typename node_type::T3 T3; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // v0 o0 (v1 o1 (v2 o2 v3)) + typedef typename synthesize_vovov_expression1::node_type lcl_vovov_t; + + const lcl_vovov_t* vovov = static_cast(branch[1]); + const Type& v0 = static_cast*>(branch[0])->ref(); + const Type& v1 = vovov->t0(); + const Type& v2 = vovov->t1(); + const Type& v3 = vovov->t2(); + const details::operator_type o0 = operation; + const details::operator_type o1 = expr_gen.get_operator(vovov->f0()); + const details::operator_type o2 = expr_gen.get_operator(vovov->f1()); + + binary_functor_t f0 = reinterpret_cast(0); + binary_functor_t f1 = vovov->f0(); + binary_functor_t f2 = vovov->f1(); + + details::free_node(*(expr_gen.node_allocator_),branch[1]); + + expression_node_ptr result = error_node(); + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile + (expr_gen,id(expr_gen, o0, o1, o2), v0, v1, v2, v3, result); + + if (synthesis_result) + return result; + else if (!expr_gen.valid_operator(o0,f0)) + return error_node(); + + exprtk_debug(("v0 o0 (v1 o1 (v2 o2 v3))\n")); + + return node_type::allocate(*(expr_gen.node_allocator_), v0, v1, v2, v3, f0, f1, f2); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1, + const details::operator_type o2) + { + return details::build_string() + << "t" << expr_gen.to_str(o0) + << "(t" << expr_gen.to_str(o1) + << "(t" << expr_gen.to_str(o2) + << "t))"; + } + }; + + struct synthesize_vovovoc_expression1 + { + typedef typename vovovoc_t::type1 node_type; + typedef typename vovovoc_t::sf4_type sf4_type; + typedef typename node_type::T0 T0; + typedef typename node_type::T1 T1; + typedef typename node_type::T2 T2; + typedef typename node_type::T3 T3; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // v0 o0 (v1 o1 (v2 o2 c)) + typedef typename synthesize_vovoc_expression1::node_type lcl_vovoc_t; + + const lcl_vovoc_t* vovoc = static_cast(branch[1]); + const Type& v0 = static_cast*>(branch[0])->ref(); + const Type& v1 = vovoc->t0(); + const Type& v2 = vovoc->t1(); + const Type c = vovoc->t2(); + const details::operator_type o0 = operation; + const details::operator_type o1 = expr_gen.get_operator(vovoc->f0()); + const details::operator_type o2 = expr_gen.get_operator(vovoc->f1()); + + binary_functor_t f0 = reinterpret_cast(0); + binary_functor_t f1 = vovoc->f0(); + binary_functor_t f2 = vovoc->f1(); + + details::free_node(*(expr_gen.node_allocator_),branch[1]); + + expression_node_ptr result = error_node(); + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1, o2), v0, v1, v2, c, result); + + if (synthesis_result) + return result; + else if (!expr_gen.valid_operator(o0,f0)) + return error_node(); + + exprtk_debug(("v0 o0 (v1 o1 (v2 o2 c))\n")); + + return node_type::allocate(*(expr_gen.node_allocator_), v0, v1, v2, c, f0, f1, f2); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1, + const details::operator_type o2) + { + return details::build_string() + << "t" << expr_gen.to_str(o0) + << "(t" << expr_gen.to_str(o1) + << "(t" << expr_gen.to_str(o2) + << "t))"; + } + }; + + struct synthesize_vovocov_expression1 + { + typedef typename vovocov_t::type1 node_type; + typedef typename vovocov_t::sf4_type sf4_type; + typedef typename node_type::T0 T0; + typedef typename node_type::T1 T1; + typedef typename node_type::T2 T2; + typedef typename node_type::T3 T3; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // v0 o0 (v1 o1 (c o2 v2)) + typedef typename synthesize_vocov_expression1::node_type lcl_vocov_t; + + const lcl_vocov_t* vocov = static_cast(branch[1]); + const Type& v0 = static_cast*>(branch[0])->ref(); + const Type& v1 = vocov->t0(); + const Type c = vocov->t1(); + const Type& v2 = vocov->t2(); + const details::operator_type o0 = operation; + const details::operator_type o1 = expr_gen.get_operator(vocov->f0()); + const details::operator_type o2 = expr_gen.get_operator(vocov->f1()); + + binary_functor_t f0 = reinterpret_cast(0); + binary_functor_t f1 = vocov->f0(); + binary_functor_t f2 = vocov->f1(); + + details::free_node(*(expr_gen.node_allocator_),branch[1]); + + expression_node_ptr result = error_node(); + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1, o2), v0, v1, c, v2, result); + + if (synthesis_result) + return result; + if (!expr_gen.valid_operator(o0,f0)) + return error_node(); + + exprtk_debug(("v0 o0 (v1 o1 (c o2 v2))\n")); + + return node_type::allocate(*(expr_gen.node_allocator_), v0, v1, c, v2, f0, f1, f2); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1, + const details::operator_type o2) + { + return details::build_string() + << "t" << expr_gen.to_str(o0) + << "(t" << expr_gen.to_str(o1) + << "(t" << expr_gen.to_str(o2) + << "t))"; + } + }; + + struct synthesize_vocovov_expression1 + { + typedef typename vocovov_t::type1 node_type; + typedef typename vocovov_t::sf4_type sf4_type; + typedef typename node_type::T0 T0; + typedef typename node_type::T1 T1; + typedef typename node_type::T2 T2; + typedef typename node_type::T3 T3; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // v0 o0 (c o1 (v1 o2 v2)) + typedef typename synthesize_covov_expression1::node_type lcl_covov_t; + + const lcl_covov_t* covov = static_cast(branch[1]); + const Type& v0 = static_cast*>(branch[0])->ref(); + const Type c = covov->t0(); + const Type& v1 = covov->t1(); + const Type& v2 = covov->t2(); + const details::operator_type o0 = operation; + const details::operator_type o1 = expr_gen.get_operator(covov->f0()); + const details::operator_type o2 = expr_gen.get_operator(covov->f1()); + + binary_functor_t f0 = reinterpret_cast(0); + binary_functor_t f1 = covov->f0(); + binary_functor_t f2 = covov->f1(); + + details::free_node(*(expr_gen.node_allocator_),branch[1]); + + expression_node_ptr result = error_node(); + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1, o2), v0, c, v1, v2, result); + + if (synthesis_result) + return result; + else if (!expr_gen.valid_operator(o0,f0)) + return error_node(); + + exprtk_debug(("v0 o0 (c o1 (v1 o2 v2))\n")); + + return node_type::allocate(*(expr_gen.node_allocator_), v0, c, v1, v2, f0, f1, f2); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1, + const details::operator_type o2) + { + return details::build_string() + << "t" << expr_gen.to_str(o0) + << "(t" << expr_gen.to_str(o1) + << "(t" << expr_gen.to_str(o2) + << "t))"; + } + }; + + struct synthesize_covovov_expression1 + { + typedef typename covovov_t::type1 node_type; + typedef typename covovov_t::sf4_type sf4_type; + typedef typename node_type::T0 T0; + typedef typename node_type::T1 T1; + typedef typename node_type::T2 T2; + typedef typename node_type::T3 T3; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // c o0 (v0 o1 (v1 o2 v2)) + typedef typename synthesize_vovov_expression1::node_type lcl_vovov_t; + + const lcl_vovov_t* vovov = static_cast(branch[1]); + const Type c = static_cast*>(branch[0])->value(); + const Type& v0 = vovov->t0(); + const Type& v1 = vovov->t1(); + const Type& v2 = vovov->t2(); + const details::operator_type o0 = operation; + const details::operator_type o1 = expr_gen.get_operator(vovov->f0()); + const details::operator_type o2 = expr_gen.get_operator(vovov->f1()); + + binary_functor_t f0 = reinterpret_cast(0); + binary_functor_t f1 = vovov->f0(); + binary_functor_t f2 = vovov->f1(); + + details::free_node(*(expr_gen.node_allocator_),branch[0]); + details::free_node(*(expr_gen.node_allocator_),branch[1]); + + expression_node_ptr result = error_node(); + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1, o2), c, v0, v1, v2, result); + + if (synthesis_result) + return result; + if (!expr_gen.valid_operator(o0,f0)) + return error_node(); + + exprtk_debug(("c o0 (v0 o1 (v1 o2 v2))\n")); + + return node_type::allocate(*(expr_gen.node_allocator_), c, v0, v1, v2, f0, f1, f2); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1, + const details::operator_type o2) + { + return details::build_string() + << "t" << expr_gen.to_str(o0) + << "(t" << expr_gen.to_str(o1) + << "(t" << expr_gen.to_str(o2) + << "t))"; + } + }; + + struct synthesize_covocov_expression1 + { + typedef typename covocov_t::type1 node_type; + typedef typename covocov_t::sf4_type sf4_type; + typedef typename node_type::T0 T0; + typedef typename node_type::T1 T1; + typedef typename node_type::T2 T2; + typedef typename node_type::T3 T3; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // c0 o0 (v0 o1 (c1 o2 v1)) + typedef typename synthesize_vocov_expression1::node_type lcl_vocov_t; + + const lcl_vocov_t* vocov = static_cast(branch[1]); + const Type c0 = static_cast*>(branch[0])->value(); + const Type& v0 = vocov->t0(); + const Type c1 = vocov->t1(); + const Type& v1 = vocov->t2(); + const details::operator_type o0 = operation; + const details::operator_type o1 = expr_gen.get_operator(vocov->f0()); + const details::operator_type o2 = expr_gen.get_operator(vocov->f1()); + + binary_functor_t f0 = reinterpret_cast(0); + binary_functor_t f1 = vocov->f0(); + binary_functor_t f2 = vocov->f1(); + + details::free_node(*(expr_gen.node_allocator_),branch[0]); + details::free_node(*(expr_gen.node_allocator_),branch[1]); + + expression_node_ptr result = error_node(); + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1, o2), c0, v0, c1, v1, result); + + if (synthesis_result) + return result; + else if (!expr_gen.valid_operator(o0,f0)) + return error_node(); + + exprtk_debug(("c0 o0 (v0 o1 (c1 o2 v1))\n")); + + return node_type::allocate(*(expr_gen.node_allocator_), c0, v0, c1, v1, f0, f1, f2); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1, + const details::operator_type o2) + { + return details::build_string() + << "t" << expr_gen.to_str(o0) + << "(t" << expr_gen.to_str(o1) + << "(t" << expr_gen.to_str(o2) + << "t))"; + } + }; + + struct synthesize_vocovoc_expression1 + { + typedef typename vocovoc_t::type1 node_type; + typedef typename vocovoc_t::sf4_type sf4_type; + typedef typename node_type::T0 T0; + typedef typename node_type::T1 T1; + typedef typename node_type::T2 T2; + typedef typename node_type::T3 T3; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // v0 o0 (c0 o1 (v1 o2 c2)) + typedef typename synthesize_covoc_expression1::node_type lcl_covoc_t; + + const lcl_covoc_t* covoc = static_cast(branch[1]); + const Type& v0 = static_cast*>(branch[0])->ref(); + const Type c0 = covoc->t0(); + const Type& v1 = covoc->t1(); + const Type c1 = covoc->t2(); + const details::operator_type o0 = operation; + const details::operator_type o1 = expr_gen.get_operator(covoc->f0()); + const details::operator_type o2 = expr_gen.get_operator(covoc->f1()); + + binary_functor_t f0 = reinterpret_cast(0); + binary_functor_t f1 = covoc->f0(); + binary_functor_t f2 = covoc->f1(); + + details::free_node(*(expr_gen.node_allocator_),branch[1]); + + expression_node_ptr result = error_node(); + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1, o2), v0, c0, v1, c1, result); + + if (synthesis_result) + return result; + else if (!expr_gen.valid_operator(o0,f0)) + return error_node(); + + exprtk_debug(("v0 o0 (c0 o1 (v1 o2 c2))\n")); + + return node_type::allocate(*(expr_gen.node_allocator_), v0, c0, v1, c1, f0, f1, f2); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1, + const details::operator_type o2) + { + return details::build_string() + << "t" << expr_gen.to_str(o0) + << "(t" << expr_gen.to_str(o1) + << "(t" << expr_gen.to_str(o2) + << "t))"; + } + }; + + struct synthesize_covovoc_expression1 + { + typedef typename covovoc_t::type1 node_type; + typedef typename covovoc_t::sf4_type sf4_type; + typedef typename node_type::T0 T0; + typedef typename node_type::T1 T1; + typedef typename node_type::T2 T2; + typedef typename node_type::T3 T3; + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // c0 o0 (v0 o1 (v1 o2 c1)) + typedef typename synthesize_vovoc_expression1::node_type lcl_vovoc_t; + + const lcl_vovoc_t* vovoc = static_cast(branch[1]); + const Type c0 = static_cast*>(branch[0])->value(); + const Type& v0 = vovoc->t0(); + const Type& v1 = vovoc->t1(); + const Type c1 = vovoc->t2(); + const details::operator_type o0 = operation; + const details::operator_type o1 = expr_gen.get_operator(vovoc->f0()); + const details::operator_type o2 = expr_gen.get_operator(vovoc->f1()); + + binary_functor_t f0 = reinterpret_cast(0); + binary_functor_t f1 = vovoc->f0(); + binary_functor_t f2 = vovoc->f1(); + + details::free_node(*(expr_gen.node_allocator_),branch[0]); + details::free_node(*(expr_gen.node_allocator_),branch[1]); + + expression_node_ptr result = error_node(); + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1, o2), c0, v0, v1, c1, result); + + if (synthesis_result) + return result; + else if (!expr_gen.valid_operator(o0,f0)) + return error_node(); + + exprtk_debug(("c0 o0 (v0 o1 (v1 o2 c1))\n")); + + return node_type::allocate(*(expr_gen.node_allocator_), c0, v0, v1, c1, f0, f1, f2); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1, + const details::operator_type o2) + { + return details::build_string() + << "t" << expr_gen.to_str(o0) + << "(t" << expr_gen.to_str(o1) + << "(t" << expr_gen.to_str(o2) + << "t))"; + } + }; + + struct synthesize_vococov_expression1 + { + typedef typename vococov_t::type1 node_type; + typedef typename vococov_t::sf4_type sf4_type; + typedef typename node_type::T0 T0; + typedef typename node_type::T1 T1; + typedef typename node_type::T2 T2; + typedef typename node_type::T3 T3; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // v0 o0 (c0 o1 (c1 o2 v1)) + typedef typename synthesize_cocov_expression1::node_type lcl_cocov_t; + + const lcl_cocov_t* cocov = static_cast(branch[1]); + const Type& v0 = static_cast*>(branch[0])->ref(); + const Type c0 = cocov->t0(); + const Type c1 = cocov->t1(); + const Type& v1 = cocov->t2(); + const details::operator_type o0 = operation; + const details::operator_type o1 = expr_gen.get_operator(cocov->f0()); + const details::operator_type o2 = expr_gen.get_operator(cocov->f1()); + + binary_functor_t f0 = reinterpret_cast(0); + binary_functor_t f1 = cocov->f0(); + binary_functor_t f2 = cocov->f1(); + + details::free_node(*(expr_gen.node_allocator_),branch[1]); + + expression_node_ptr result = error_node(); + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1, o2), v0, c0, c1, v1, result); + + if (synthesis_result) + return result; + else if (!expr_gen.valid_operator(o0,f0)) + return error_node(); + + exprtk_debug(("v0 o0 (c0 o1 (c1 o2 v1))\n")); + + return node_type::allocate(*(expr_gen.node_allocator_), v0, c0, c1, v1, f0, f1, f2); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1, + const details::operator_type o2) + { + return details::build_string() + << "t" << expr_gen.to_str(o0) + << "(t" << expr_gen.to_str(o1) + << "(t" << expr_gen.to_str(o2) + << "t))"; + } + }; + + struct synthesize_vovovov_expression2 + { + typedef typename vovovov_t::type2 node_type; + typedef typename vovovov_t::sf4_type sf4_type; + typedef typename node_type::T0 T0; + typedef typename node_type::T1 T1; + typedef typename node_type::T2 T2; + typedef typename node_type::T3 T3; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // v0 o0 ((v1 o1 v2) o2 v3) + typedef typename synthesize_vovov_expression0::node_type lcl_vovov_t; + + const lcl_vovov_t* vovov = static_cast(branch[1]); + const Type& v0 = static_cast*>(branch[0])->ref(); + const Type& v1 = vovov->t0(); + const Type& v2 = vovov->t1(); + const Type& v3 = vovov->t2(); + const details::operator_type o0 = operation; + const details::operator_type o1 = expr_gen.get_operator(vovov->f0()); + const details::operator_type o2 = expr_gen.get_operator(vovov->f1()); + + binary_functor_t f0 = reinterpret_cast(0); + binary_functor_t f1 = vovov->f0(); + binary_functor_t f2 = vovov->f1(); + + details::free_node(*(expr_gen.node_allocator_),branch[1]); + + expression_node_ptr result = error_node(); + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1, o2), v0, v1, v2, v3, result); + + if (synthesis_result) + return result; + else if (!expr_gen.valid_operator(o0,f0)) + return error_node(); + + exprtk_debug(("v0 o0 ((v1 o1 v2) o2 v3)\n")); + + return node_type::allocate(*(expr_gen.node_allocator_), v0, v1, v2, v3, f0, f1, f2); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1, + const details::operator_type o2) + { + return details::build_string() + << "t" << expr_gen.to_str(o0) + << "((t" << expr_gen.to_str(o1) + << "t)" << expr_gen.to_str(o2) + << "t)"; + } + }; + + struct synthesize_vovovoc_expression2 + { + typedef typename vovovoc_t::type2 node_type; + typedef typename vovovoc_t::sf4_type sf4_type; + typedef typename node_type::T0 T0; + typedef typename node_type::T1 T1; + typedef typename node_type::T2 T2; + typedef typename node_type::T3 T3; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // v0 o0 ((v1 o1 v2) o2 c) + typedef typename synthesize_vovoc_expression0::node_type lcl_vovoc_t; + + const lcl_vovoc_t* vovoc = static_cast(branch[1]); + const Type& v0 = static_cast*>(branch[0])->ref(); + const Type& v1 = vovoc->t0(); + const Type& v2 = vovoc->t1(); + const Type c = vovoc->t2(); + const details::operator_type o0 = operation; + const details::operator_type o1 = expr_gen.get_operator(vovoc->f0()); + const details::operator_type o2 = expr_gen.get_operator(vovoc->f1()); + + binary_functor_t f0 = reinterpret_cast(0); + binary_functor_t f1 = vovoc->f0(); + binary_functor_t f2 = vovoc->f1(); + + details::free_node(*(expr_gen.node_allocator_),branch[1]); + + expression_node_ptr result = error_node(); + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1, o2), v0, v1, v2, c, result); + + if (synthesis_result) + return result; + else if (!expr_gen.valid_operator(o0,f0)) + return error_node(); + + exprtk_debug(("v0 o0 ((v1 o1 v2) o2 c)\n")); + + return node_type::allocate(*(expr_gen.node_allocator_), v0, v1, v2, c, f0, f1, f2); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1, + const details::operator_type o2) + { + return details::build_string() + << "t" << expr_gen.to_str(o0) + << "((t" << expr_gen.to_str(o1) + << "t)" << expr_gen.to_str(o2) + << "t)"; + } + }; + + struct synthesize_vovocov_expression2 + { + typedef typename vovocov_t::type2 node_type; + typedef typename vovocov_t::sf4_type sf4_type; + typedef typename node_type::T0 T0; + typedef typename node_type::T1 T1; + typedef typename node_type::T2 T2; + typedef typename node_type::T3 T3; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // v0 o0 ((v1 o1 c) o2 v2) + typedef typename synthesize_vocov_expression0::node_type lcl_vocov_t; + + const lcl_vocov_t* vocov = static_cast(branch[1]); + const Type& v0 = static_cast*>(branch[0])->ref(); + const Type& v1 = vocov->t0(); + const Type c = vocov->t1(); + const Type& v2 = vocov->t2(); + const details::operator_type o0 = operation; + const details::operator_type o1 = expr_gen.get_operator(vocov->f0()); + const details::operator_type o2 = expr_gen.get_operator(vocov->f1()); + + binary_functor_t f0 = reinterpret_cast(0); + binary_functor_t f1 = vocov->f0(); + binary_functor_t f2 = vocov->f1(); + + details::free_node(*(expr_gen.node_allocator_),branch[1]); + + expression_node_ptr result = error_node(); + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1, o2), v0, v1, c, v2, result); + + if (synthesis_result) + return result; + else if (!expr_gen.valid_operator(o0,f0)) + return error_node(); + + exprtk_debug(("v0 o0 ((v1 o1 c) o2 v2)\n")); + + return node_type::allocate(*(expr_gen.node_allocator_), v0, v1, c, v2, f0, f1, f2); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1, + const details::operator_type o2) + { + return details::build_string() + << "t" << expr_gen.to_str(o0) + << "((t" << expr_gen.to_str(o1) + << "t)" << expr_gen.to_str(o2) + << "t)"; + } + }; + + struct synthesize_vocovov_expression2 + { + typedef typename vocovov_t::type2 node_type; + typedef typename vocovov_t::sf4_type sf4_type; + typedef typename node_type::T0 T0; + typedef typename node_type::T1 T1; + typedef typename node_type::T2 T2; + typedef typename node_type::T3 T3; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // v0 o0 ((c o1 v1) o2 v2) + typedef typename synthesize_covov_expression0::node_type lcl_covov_t; + + const lcl_covov_t* covov = static_cast(branch[1]); + const Type& v0 = static_cast*>(branch[0])->ref(); + const Type c = covov->t0(); + const Type& v1 = covov->t1(); + const Type& v2 = covov->t2(); + const details::operator_type o0 = operation; + const details::operator_type o1 = expr_gen.get_operator(covov->f0()); + const details::operator_type o2 = expr_gen.get_operator(covov->f1()); + + binary_functor_t f0 = reinterpret_cast(0); + binary_functor_t f1 = covov->f0(); + binary_functor_t f2 = covov->f1(); + + details::free_node(*(expr_gen.node_allocator_),branch[1]); + + expression_node_ptr result = error_node(); + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1, o2), v0, c, v1, v2, result); + + if (synthesis_result) + return result; + else if (!expr_gen.valid_operator(o0,f0)) + return error_node(); + + exprtk_debug(("v0 o0 ((c o1 v1) o2 v2)\n")); + + return node_type::allocate(*(expr_gen.node_allocator_), v0, c, v1, v2, f0, f1, f2); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1, + const details::operator_type o2) + { + return details::build_string() + << "t" << expr_gen.to_str(o0) + << "((t" << expr_gen.to_str(o1) + << "t)" << expr_gen.to_str(o2) + << "t)"; + } + }; + + struct synthesize_covovov_expression2 + { + typedef typename covovov_t::type2 node_type; + typedef typename covovov_t::sf4_type sf4_type; + typedef typename node_type::T0 T0; + typedef typename node_type::T1 T1; + typedef typename node_type::T2 T2; + typedef typename node_type::T3 T3; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // c o0 ((v1 o1 v2) o2 v3) + typedef typename synthesize_vovov_expression0::node_type lcl_vovov_t; + + const lcl_vovov_t* vovov = static_cast(branch[1]); + const Type c = static_cast*>(branch[0])->value(); + const Type& v0 = vovov->t0(); + const Type& v1 = vovov->t1(); + const Type& v2 = vovov->t2(); + const details::operator_type o0 = operation; + const details::operator_type o1 = expr_gen.get_operator(vovov->f0()); + const details::operator_type o2 = expr_gen.get_operator(vovov->f1()); + + binary_functor_t f0 = reinterpret_cast(0); + binary_functor_t f1 = vovov->f0(); + binary_functor_t f2 = vovov->f1(); + + details::free_node(*(expr_gen.node_allocator_),branch[0]); + details::free_node(*(expr_gen.node_allocator_),branch[1]); + + expression_node_ptr result = error_node(); + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1, o2), c, v0, v1, v2, result); + + if (synthesis_result) + return result; + else if (!expr_gen.valid_operator(o0,f0)) + return error_node(); + + exprtk_debug(("c o0 ((v1 o1 v2) o2 v3)\n")); + + return node_type::allocate(*(expr_gen.node_allocator_), c, v0, v1, v2, f0, f1, f2); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1, + const details::operator_type o2) + { + return details::build_string() + << "t" << expr_gen.to_str(o0) + << "((t" << expr_gen.to_str(o1) + << "t)" << expr_gen.to_str(o2) + << "t)"; + } + }; + + struct synthesize_covocov_expression2 + { + typedef typename covocov_t::type2 node_type; + typedef typename covocov_t::sf4_type sf4_type; + typedef typename node_type::T0 T0; + typedef typename node_type::T1 T1; + typedef typename node_type::T2 T2; + typedef typename node_type::T3 T3; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // c0 o0 ((v0 o1 c1) o2 v1) + typedef typename synthesize_vocov_expression0::node_type lcl_vocov_t; + + const lcl_vocov_t* vocov = static_cast(branch[1]); + const Type c0 = static_cast*>(branch[0])->value(); + const Type& v0 = vocov->t0(); + const Type c1 = vocov->t1(); + const Type& v1 = vocov->t2(); + const details::operator_type o0 = operation; + const details::operator_type o1 = expr_gen.get_operator(vocov->f0()); + const details::operator_type o2 = expr_gen.get_operator(vocov->f1()); + + binary_functor_t f0 = reinterpret_cast(0); + binary_functor_t f1 = vocov->f0(); + binary_functor_t f2 = vocov->f1(); + + details::free_node(*(expr_gen.node_allocator_),branch[0]); + details::free_node(*(expr_gen.node_allocator_),branch[1]); + + expression_node_ptr result = error_node(); + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1, o2), c0, v0, c1, v1, result); + + if (synthesis_result) + return result; + else if (!expr_gen.valid_operator(o0,f0)) + return error_node(); + + exprtk_debug(("c0 o0 ((v0 o1 c1) o2 v1)\n")); + + return node_type::allocate(*(expr_gen.node_allocator_), c0, v0, c1, v1, f0, f1, f2); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1, + const details::operator_type o2) + { + return details::build_string() + << "t" << expr_gen.to_str(o0) + << "((t" << expr_gen.to_str(o1) + << "t)" << expr_gen.to_str(o2) + << "t)"; + } + }; + + struct synthesize_vocovoc_expression2 + { + typedef typename vocovoc_t::type2 node_type; + typedef typename vocovoc_t::sf4_type sf4_type; + typedef typename node_type::T0 T0; + typedef typename node_type::T1 T1; + typedef typename node_type::T2 T2; + typedef typename node_type::T3 T3; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // v0 o0 ((c0 o1 v1) o2 c1) + typedef typename synthesize_covoc_expression0::node_type lcl_covoc_t; + + const lcl_covoc_t* covoc = static_cast(branch[1]); + const Type& v0 = static_cast*>(branch[0])->ref(); + const Type c0 = covoc->t0(); + const Type& v1 = covoc->t1(); + const Type c1 = covoc->t2(); + const details::operator_type o0 = operation; + const details::operator_type o1 = expr_gen.get_operator(covoc->f0()); + const details::operator_type o2 = expr_gen.get_operator(covoc->f1()); + + binary_functor_t f0 = reinterpret_cast(0); + binary_functor_t f1 = covoc->f0(); + binary_functor_t f2 = covoc->f1(); + + details::free_node(*(expr_gen.node_allocator_),branch[1]); + + expression_node_ptr result = error_node(); + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1, o2), v0, c0, v1, c1, result); + + if (synthesis_result) + return result; + else if (!expr_gen.valid_operator(o0,f0)) + return error_node(); + + exprtk_debug(("v0 o0 ((c0 o1 v1) o2 c1)\n")); + + return node_type::allocate(*(expr_gen.node_allocator_), v0, c0, v1, c1, f0, f1, f2); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1, + const details::operator_type o2) + { + return details::build_string() + << "t" << expr_gen.to_str(o0) + << "((t" << expr_gen.to_str(o1) + << "t)" << expr_gen.to_str(o2) + << "t)"; + } + }; + + struct synthesize_covovoc_expression2 + { + typedef typename covovoc_t::type2 node_type; + typedef typename covovoc_t::sf4_type sf4_type; + typedef typename node_type::T0 T0; + typedef typename node_type::T1 T1; + typedef typename node_type::T2 T2; + typedef typename node_type::T3 T3; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // c0 o0 ((v0 o1 v1) o2 c1) + typedef typename synthesize_vovoc_expression0::node_type lcl_vovoc_t; + + const lcl_vovoc_t* vovoc = static_cast(branch[1]); + const Type c0 = static_cast*>(branch[0])->value(); + const Type& v0 = vovoc->t0(); + const Type& v1 = vovoc->t1(); + const Type c1 = vovoc->t2(); + const details::operator_type o0 = operation; + const details::operator_type o1 = expr_gen.get_operator(vovoc->f0()); + const details::operator_type o2 = expr_gen.get_operator(vovoc->f1()); + + binary_functor_t f0 = reinterpret_cast(0); + binary_functor_t f1 = vovoc->f0(); + binary_functor_t f2 = vovoc->f1(); + + details::free_node(*(expr_gen.node_allocator_),branch[0]); + details::free_node(*(expr_gen.node_allocator_),branch[1]); + + expression_node_ptr result = error_node(); + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1, o2), c0, v0, v1, c1, result); + + if (synthesis_result) + return result; + else if (!expr_gen.valid_operator(o0,f0)) + return error_node(); + + exprtk_debug(("c0 o0 ((v0 o1 v1) o2 c1)\n")); + + return node_type::allocate(*(expr_gen.node_allocator_), c0, v0, v1, c1, f0, f1, f2); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1, + const details::operator_type o2) + { + return details::build_string() + << "t" << expr_gen.to_str(o0) + << "((t" << expr_gen.to_str(o1) + << "t)" << expr_gen.to_str(o2) + << "t)"; + } + }; + + struct synthesize_vococov_expression2 + { + typedef typename vococov_t::type2 node_type; + static inline expression_node_ptr process(expression_generator&, + const details::operator_type&, + expression_node_ptr (&)[2]) + { + // v0 o0 ((c0 o1 c1) o2 v1) - Not possible + exprtk_debug(("v0 o0 ((c0 o1 c1) o2 v1) - Not possible\n")); + return error_node(); + } + + static inline std::string id(expression_generator&, + const details::operator_type, + const details::operator_type, + const details::operator_type) + { + return "INVALID"; + } + }; + + struct synthesize_vovovov_expression3 + { + typedef typename vovovov_t::type3 node_type; + typedef typename vovovov_t::sf4_type sf4_type; + typedef typename node_type::T0 T0; + typedef typename node_type::T1 T1; + typedef typename node_type::T2 T2; + typedef typename node_type::T3 T3; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // ((v0 o0 v1) o1 v2) o2 v3 + typedef typename synthesize_vovov_expression0::node_type lcl_vovov_t; + + const lcl_vovov_t* vovov = static_cast(branch[0]); + const Type& v0 = vovov->t0(); + const Type& v1 = vovov->t1(); + const Type& v2 = vovov->t2(); + const Type& v3 = static_cast*>(branch[1])->ref(); + const details::operator_type o0 = expr_gen.get_operator(vovov->f0()); + const details::operator_type o1 = expr_gen.get_operator(vovov->f1()); + const details::operator_type o2 = operation; + + binary_functor_t f0 = vovov->f0(); + binary_functor_t f1 = vovov->f1(); + binary_functor_t f2 = reinterpret_cast(0); + + details::free_node(*(expr_gen.node_allocator_),branch[0]); + + expression_node_ptr result = error_node(); + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1, o2), v0, v1, v2, v3, result); + + if (synthesis_result) + return result; + else if (!expr_gen.valid_operator(o2,f2)) + return error_node(); + + exprtk_debug(("((v0 o0 v1) o1 v2) o2 v3\n")); + + return node_type::allocate(*(expr_gen.node_allocator_), v0, v1, v2, v3, f0, f1, f2); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1, + const details::operator_type o2) + { + return details::build_string() + << "((t" << expr_gen.to_str(o0) + << "t)" << expr_gen.to_str(o1) + << "t)" << expr_gen.to_str(o2) + << "t"; + } + }; + + struct synthesize_vovovoc_expression3 + { + typedef typename vovovoc_t::type3 node_type; + typedef typename vovovoc_t::sf4_type sf4_type; + typedef typename node_type::T0 T0; + typedef typename node_type::T1 T1; + typedef typename node_type::T2 T2; + typedef typename node_type::T3 T3; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // ((v0 o0 v1) o1 v2) o2 c + typedef typename synthesize_vovov_expression0::node_type lcl_vovov_t; + + const lcl_vovov_t* vovov = static_cast(branch[0]); + const Type& v0 = vovov->t0(); + const Type& v1 = vovov->t1(); + const Type& v2 = vovov->t2(); + const Type c = static_cast*>(branch[1])->value(); + const details::operator_type o0 = expr_gen.get_operator(vovov->f0()); + const details::operator_type o1 = expr_gen.get_operator(vovov->f1()); + const details::operator_type o2 = operation; + + binary_functor_t f0 = vovov->f0(); + binary_functor_t f1 = vovov->f1(); + binary_functor_t f2 = reinterpret_cast(0); + + details::free_node(*(expr_gen.node_allocator_),branch[0]); + details::free_node(*(expr_gen.node_allocator_),branch[1]); + + expression_node_ptr result = error_node(); + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1, o2), v0, v1, v2, c, result); + + if (synthesis_result) + return result; + else if (!expr_gen.valid_operator(o2,f2)) + return error_node(); + + exprtk_debug(("((v0 o0 v1) o1 v2) o2 c\n")); + + return node_type::allocate(*(expr_gen.node_allocator_), v0, v1, v2, c, f0, f1, f2); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1, + const details::operator_type o2) + { + return details::build_string() + << "((t" << expr_gen.to_str(o0) + << "t)" << expr_gen.to_str(o1) + << "t)" << expr_gen.to_str(o2) + << "t"; + } + }; + + struct synthesize_vovocov_expression3 + { + typedef typename vovocov_t::type3 node_type; + typedef typename vovocov_t::sf4_type sf4_type; + typedef typename node_type::T0 T0; + typedef typename node_type::T1 T1; + typedef typename node_type::T2 T2; + typedef typename node_type::T3 T3; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // ((v0 o0 v1) o1 c) o2 v2 + typedef typename synthesize_vovoc_expression0::node_type lcl_vovoc_t; + + const lcl_vovoc_t* vovoc = static_cast(branch[0]); + const Type& v0 = vovoc->t0(); + const Type& v1 = vovoc->t1(); + const Type c = vovoc->t2(); + const Type& v2 = static_cast*>(branch[1])->ref(); + const details::operator_type o0 = expr_gen.get_operator(vovoc->f0()); + const details::operator_type o1 = expr_gen.get_operator(vovoc->f1()); + const details::operator_type o2 = operation; + + binary_functor_t f0 = vovoc->f0(); + binary_functor_t f1 = vovoc->f1(); + binary_functor_t f2 = reinterpret_cast(0); + + details::free_node(*(expr_gen.node_allocator_),branch[0]); + + expression_node_ptr result = error_node(); + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1, o2), v0, v1, c, v2, result); + + if (synthesis_result) + return result; + else if (!expr_gen.valid_operator(o2,f2)) + return error_node(); + + exprtk_debug(("((v0 o0 v1) o1 c) o2 v2\n")); + + return node_type::allocate(*(expr_gen.node_allocator_), v0, v1, c, v2, f0, f1, f2); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1, + const details::operator_type o2) + { + return details::build_string() + << "((t" << expr_gen.to_str(o0) + << "t)" << expr_gen.to_str(o1) + << "t)" << expr_gen.to_str(o2) + << "t"; + } + }; + + struct synthesize_vocovov_expression3 + { + typedef typename vocovov_t::type3 node_type; + typedef typename vocovov_t::sf4_type sf4_type; + typedef typename node_type::T0 T0; + typedef typename node_type::T1 T1; + typedef typename node_type::T2 T2; + typedef typename node_type::T3 T3; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // ((v0 o0 c) o1 v1) o2 v2 + typedef typename synthesize_vocov_expression0::node_type lcl_vocov_t; + + const lcl_vocov_t* vocov = static_cast(branch[0]); + const Type& v0 = vocov->t0(); + const Type c = vocov->t1(); + const Type& v1 = vocov->t2(); + const Type& v2 = static_cast*>(branch[1])->ref(); + const details::operator_type o0 = expr_gen.get_operator(vocov->f0()); + const details::operator_type o1 = expr_gen.get_operator(vocov->f1()); + const details::operator_type o2 = operation; + + binary_functor_t f0 = vocov->f0(); + binary_functor_t f1 = vocov->f1(); + binary_functor_t f2 = reinterpret_cast(0); + + details::free_node(*(expr_gen.node_allocator_),branch[0]); + + expression_node_ptr result = error_node(); + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1, o2), v0, c, v1, v2, result); + + if (synthesis_result) + return result; + else if (!expr_gen.valid_operator(o2,f2)) + return error_node(); + + exprtk_debug(("((v0 o0 c) o1 v1) o2 v2\n")); + + return node_type::allocate(*(expr_gen.node_allocator_), v0, c, v1, v2, f0, f1, f2); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1, + const details::operator_type o2) + { + return details::build_string() + << "((t" << expr_gen.to_str(o0) + << "t)" << expr_gen.to_str(o1) + << "t)" << expr_gen.to_str(o2) + << "t"; + } + }; + + struct synthesize_covovov_expression3 + { + typedef typename covovov_t::type3 node_type; + typedef typename covovov_t::sf4_type sf4_type; + typedef typename node_type::T0 T0; + typedef typename node_type::T1 T1; + typedef typename node_type::T2 T2; + typedef typename node_type::T3 T3; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // ((c o0 v0) o1 v1) o2 v2 + typedef typename synthesize_covov_expression0::node_type lcl_covov_t; + + const lcl_covov_t* covov = static_cast(branch[0]); + const Type c = covov->t0(); + const Type& v0 = covov->t1(); + const Type& v1 = covov->t2(); + const Type& v2 = static_cast*>(branch[1])->ref(); + const details::operator_type o0 = expr_gen.get_operator(covov->f0()); + const details::operator_type o1 = expr_gen.get_operator(covov->f1()); + const details::operator_type o2 = operation; + + binary_functor_t f0 = covov->f0(); + binary_functor_t f1 = covov->f1(); + binary_functor_t f2 = reinterpret_cast(0); + + details::free_node(*(expr_gen.node_allocator_),branch[0]); + + expression_node_ptr result = error_node(); + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1, o2), c, v0, v1, v2, result); + + if (synthesis_result) + return result; + else if (!expr_gen.valid_operator(o2,f2)) + return error_node(); + + exprtk_debug(("((c o0 v0) o1 v1) o2 v2\n")); + + return node_type::allocate(*(expr_gen.node_allocator_), c, v0, v1, v2, f0, f1, f2); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1, + const details::operator_type o2) + { + return details::build_string() + << "((t" << expr_gen.to_str(o0) + << "t)" << expr_gen.to_str(o1) + << "t)" << expr_gen.to_str(o2) + << "t"; + } + }; + + struct synthesize_covocov_expression3 + { + typedef typename covocov_t::type3 node_type; + typedef typename covocov_t::sf4_type sf4_type; + typedef typename node_type::T0 T0; + typedef typename node_type::T1 T1; + typedef typename node_type::T2 T2; + typedef typename node_type::T3 T3; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // ((c0 o0 v0) o1 c1) o2 v1 + typedef typename synthesize_covoc_expression0::node_type lcl_covoc_t; + + const lcl_covoc_t* covoc = static_cast(branch[0]); + const Type c0 = covoc->t0(); + const Type& v0 = covoc->t1(); + const Type c1 = covoc->t2(); + const Type& v1 = static_cast*>(branch[1])->ref(); + const details::operator_type o0 = expr_gen.get_operator(covoc->f0()); + const details::operator_type o1 = expr_gen.get_operator(covoc->f1()); + const details::operator_type o2 = operation; + + binary_functor_t f0 = covoc->f0(); + binary_functor_t f1 = covoc->f1(); + binary_functor_t f2 = reinterpret_cast(0); + + details::free_node(*(expr_gen.node_allocator_),branch[0]); + + expression_node_ptr result = error_node(); + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1, o2), c0, v0, c1, v1, result); + + if (synthesis_result) + return result; + else if (!expr_gen.valid_operator(o2,f2)) + return error_node(); + + exprtk_debug(("((c0 o0 v0) o1 c1) o2 v1\n")); + + return node_type::allocate(*(expr_gen.node_allocator_), c0, v0, c1, v1, f0, f1, f2); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1, + const details::operator_type o2) + { + return details::build_string() + << "((t" << expr_gen.to_str(o0) + << "t)" << expr_gen.to_str(o1) + << "t)" << expr_gen.to_str(o2) + << "t"; + } + }; + + struct synthesize_vocovoc_expression3 + { + typedef typename vocovoc_t::type3 node_type; + typedef typename vocovoc_t::sf4_type sf4_type; + typedef typename node_type::T0 T0; + typedef typename node_type::T1 T1; + typedef typename node_type::T2 T2; + typedef typename node_type::T3 T3; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // ((v0 o0 c0) o1 v1) o2 c1 + typedef typename synthesize_vocov_expression0::node_type lcl_vocov_t; + + const lcl_vocov_t* vocov = static_cast(branch[0]); + const Type& v0 = vocov->t0(); + const Type c0 = vocov->t1(); + const Type& v1 = vocov->t2(); + const Type c1 = static_cast*>(branch[1])->value(); + const details::operator_type o0 = expr_gen.get_operator(vocov->f0()); + const details::operator_type o1 = expr_gen.get_operator(vocov->f1()); + const details::operator_type o2 = operation; + + binary_functor_t f0 = vocov->f0(); + binary_functor_t f1 = vocov->f1(); + binary_functor_t f2 = reinterpret_cast(0); + + details::free_node(*(expr_gen.node_allocator_),branch[0]); + details::free_node(*(expr_gen.node_allocator_),branch[1]); + + expression_node_ptr result = error_node(); + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1, o2), v0, c0, v1, c1, result); + + if (synthesis_result) + return result; + else if (!expr_gen.valid_operator(o2,f2)) + return error_node(); + + exprtk_debug(("((v0 o0 c0) o1 v1) o2 c1\n")); + + return node_type::allocate(*(expr_gen.node_allocator_), v0, c0, v1, c1, f0, f1, f2); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1, + const details::operator_type o2) + { + return details::build_string() + << "((t" << expr_gen.to_str(o0) + << "t)" << expr_gen.to_str(o1) + << "t)" << expr_gen.to_str(o2) + << "t"; + } + }; + + struct synthesize_covovoc_expression3 + { + typedef typename covovoc_t::type3 node_type; + typedef typename covovoc_t::sf4_type sf4_type; + typedef typename node_type::T0 T0; + typedef typename node_type::T1 T1; + typedef typename node_type::T2 T2; + typedef typename node_type::T3 T3; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // ((c0 o0 v0) o1 v1) o2 c1 + typedef typename synthesize_covov_expression0::node_type lcl_covov_t; + + const lcl_covov_t* covov = static_cast(branch[0]); + const Type c0 = covov->t0(); + const Type& v0 = covov->t1(); + const Type& v1 = covov->t2(); + const Type c1 = static_cast*>(branch[1])->value(); + const details::operator_type o0 = expr_gen.get_operator(covov->f0()); + const details::operator_type o1 = expr_gen.get_operator(covov->f1()); + const details::operator_type o2 = operation; + + binary_functor_t f0 = covov->f0(); + binary_functor_t f1 = covov->f1(); + binary_functor_t f2 = reinterpret_cast(0); + + details::free_node(*(expr_gen.node_allocator_),branch[0]); + details::free_node(*(expr_gen.node_allocator_),branch[1]); + + expression_node_ptr result = error_node(); + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1, o2), c0, v0, v1, c1, result); + + if (synthesis_result) + return result; + else if (!expr_gen.valid_operator(o2,f2)) + return error_node(); + + exprtk_debug(("((c0 o0 v0) o1 v1) o2 c1\n")); + + return node_type::allocate(*(expr_gen.node_allocator_), c0, v0, v1, c1, f0, f1, f2); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1, + const details::operator_type o2) + { + return details::build_string() + << "((t" << expr_gen.to_str(o0) + << "t)" << expr_gen.to_str(o1) + << "t)" << expr_gen.to_str(o2) + << "t"; + } + }; + + struct synthesize_vococov_expression3 + { + typedef typename vococov_t::type3 node_type; + typedef typename vococov_t::sf4_type sf4_type; + typedef typename node_type::T0 T0; + typedef typename node_type::T1 T1; + typedef typename node_type::T2 T2; + typedef typename node_type::T3 T3; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // ((v0 o0 c0) o1 c1) o2 v1 + typedef typename synthesize_vococ_expression0::node_type lcl_vococ_t; + + const lcl_vococ_t* vococ = static_cast(branch[0]); + const Type& v0 = vococ->t0(); + const Type c0 = vococ->t1(); + const Type c1 = vococ->t2(); + const Type& v1 = static_cast*>(branch[1])->ref(); + const details::operator_type o0 = expr_gen.get_operator(vococ->f0()); + const details::operator_type o1 = expr_gen.get_operator(vococ->f1()); + const details::operator_type o2 = operation; + + binary_functor_t f0 = vococ->f0(); + binary_functor_t f1 = vococ->f1(); + binary_functor_t f2 = reinterpret_cast(0); + + details::free_node(*(expr_gen.node_allocator_),branch[0]); + + expression_node_ptr result = error_node(); + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1, o2), v0, c0, c1, v1, result); + + if (synthesis_result) + return result; + else if (!expr_gen.valid_operator(o2,f2)) + return error_node(); + + exprtk_debug(("((v0 o0 c0) o1 c1) o2 v1\n")); + + return node_type::allocate(*(expr_gen.node_allocator_), v0, c0, c1, v1, f0, f1, f2); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1, + const details::operator_type o2) + { + return details::build_string() + << "((t" << expr_gen.to_str(o0) + << "t)" << expr_gen.to_str(o1) + << "t)" << expr_gen.to_str(o2) + << "t"; + } + }; + + struct synthesize_vovovov_expression4 + { + typedef typename vovovov_t::type4 node_type; + typedef typename vovovov_t::sf4_type sf4_type; + typedef typename node_type::T0 T0; + typedef typename node_type::T1 T1; + typedef typename node_type::T2 T2; + typedef typename node_type::T3 T3; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // (v0 o0 (v1 o1 v2)) o2 v3 + typedef typename synthesize_vovov_expression1::node_type lcl_vovov_t; + + const lcl_vovov_t* vovov = static_cast(branch[0]); + const Type& v0 = vovov->t0(); + const Type& v1 = vovov->t1(); + const Type& v2 = vovov->t2(); + const Type& v3 = static_cast*>(branch[1])->ref(); + const details::operator_type o0 = expr_gen.get_operator(vovov->f0()); + const details::operator_type o1 = expr_gen.get_operator(vovov->f1()); + const details::operator_type o2 = operation; + + binary_functor_t f0 = vovov->f0(); + binary_functor_t f1 = vovov->f1(); + binary_functor_t f2 = reinterpret_cast(0); + + details::free_node(*(expr_gen.node_allocator_),branch[0]); + + expression_node_ptr result = error_node(); + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1, o2), v0, v1, v2, v3, result); + + if (synthesis_result) + return result; + else if (!expr_gen.valid_operator(o2,f2)) + return error_node(); + + exprtk_debug(("(v0 o0 (v1 o1 v2)) o2 v3\n")); + + return node_type::allocate(*(expr_gen.node_allocator_), v0, v1, v2, v3, f0, f1, f2); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1, + const details::operator_type o2) + { + return details::build_string() + << "(t" << expr_gen.to_str(o0) + << "(t" << expr_gen.to_str(o1) + << "t)" << expr_gen.to_str(o2) + << "t"; + } + }; + + struct synthesize_vovovoc_expression4 + { + typedef typename vovovoc_t::type4 node_type; + typedef typename vovovoc_t::sf4_type sf4_type; + typedef typename node_type::T0 T0; + typedef typename node_type::T1 T1; + typedef typename node_type::T2 T2; + typedef typename node_type::T3 T3; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // ((v0 o0 (v1 o1 v2)) o2 c) + typedef typename synthesize_vovov_expression1::node_type lcl_vovov_t; + + const lcl_vovov_t* vovov = static_cast(branch[0]); + const Type& v0 = vovov->t0(); + const Type& v1 = vovov->t1(); + const Type& v2 = vovov->t2(); + const Type c = static_cast*>(branch[1])->value(); + const details::operator_type o0 = expr_gen.get_operator(vovov->f0()); + const details::operator_type o1 = expr_gen.get_operator(vovov->f1()); + const details::operator_type o2 = operation; + + binary_functor_t f0 = vovov->f0(); + binary_functor_t f1 = vovov->f1(); + binary_functor_t f2 = reinterpret_cast(0); + + details::free_node(*(expr_gen.node_allocator_),branch[0]); + details::free_node(*(expr_gen.node_allocator_),branch[1]); + + expression_node_ptr result = error_node(); + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1, o2), v0, v1, v2, c, result); + + if (synthesis_result) + return result; + else if (!expr_gen.valid_operator(o2,f2)) + return error_node(); + + exprtk_debug(("((v0 o0 (v1 o1 v2)) o2 c)\n")); + + return node_type::allocate(*(expr_gen.node_allocator_), v0, v1, v2, c, f0, f1, f2); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1, + const details::operator_type o2) + { + return details::build_string() + << "(t" << expr_gen.to_str(o0) + << "(t" << expr_gen.to_str(o1) + << "t)" << expr_gen.to_str(o2) + << "t"; + } + }; + + struct synthesize_vovocov_expression4 + { + typedef typename vovocov_t::type4 node_type; + typedef typename vovocov_t::sf4_type sf4_type; + typedef typename node_type::T0 T0; + typedef typename node_type::T1 T1; + typedef typename node_type::T2 T2; + typedef typename node_type::T3 T3; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // ((v0 o0 (v1 o1 c)) o2 v1) + typedef typename synthesize_vovoc_expression1::node_type lcl_vovoc_t; + + const lcl_vovoc_t* vovoc = static_cast(branch[0]); + const Type& v0 = vovoc->t0(); + const Type& v1 = vovoc->t1(); + const Type c = vovoc->t2(); + const Type& v2 = static_cast*>(branch[1])->ref(); + const details::operator_type o0 = expr_gen.get_operator(vovoc->f0()); + const details::operator_type o1 = expr_gen.get_operator(vovoc->f1()); + const details::operator_type o2 = operation; + + binary_functor_t f0 = vovoc->f0(); + binary_functor_t f1 = vovoc->f1(); + binary_functor_t f2 = reinterpret_cast(0); + + details::free_node(*(expr_gen.node_allocator_),branch[0]); + + expression_node_ptr result = error_node(); + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1, o2), v0, v1, c, v2, result); + + if (synthesis_result) + return result; + else if (!expr_gen.valid_operator(o2,f2)) + return error_node(); + + exprtk_debug(("((v0 o0 (v1 o1 c)) o2 v1)\n")); + + return node_type::allocate(*(expr_gen.node_allocator_), v0, v1, c, v2, f0, f1, f2); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1, + const details::operator_type o2) + { + return details::build_string() + << "(t" << expr_gen.to_str(o0) + << "(t" << expr_gen.to_str(o1) + << "t)" << expr_gen.to_str(o2) + << "t"; + } + }; + + struct synthesize_vocovov_expression4 + { + typedef typename vocovov_t::type4 node_type; + typedef typename vocovov_t::sf4_type sf4_type; + typedef typename node_type::T0 T0; + typedef typename node_type::T1 T1; + typedef typename node_type::T2 T2; + typedef typename node_type::T3 T3; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // ((v0 o0 (c o1 v1)) o2 v2) + typedef typename synthesize_vocov_expression1::node_type lcl_vocov_t; + + const lcl_vocov_t* vocov = static_cast(branch[0]); + const Type& v0 = vocov->t0(); + const Type c = vocov->t1(); + const Type& v1 = vocov->t2(); + const Type& v2 = static_cast*>(branch[1])->ref(); + const details::operator_type o0 = expr_gen.get_operator(vocov->f0()); + const details::operator_type o1 = expr_gen.get_operator(vocov->f1()); + const details::operator_type o2 = operation; + + binary_functor_t f0 = vocov->f0(); + binary_functor_t f1 = vocov->f1(); + binary_functor_t f2 = reinterpret_cast(0); + + details::free_node(*(expr_gen.node_allocator_),branch[0]); + expression_node_ptr result = error_node(); + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1, o2), v0, c, v1, v2, result); + + if (synthesis_result) + return result; + else if (!expr_gen.valid_operator(o2,f2)) + return error_node(); + + exprtk_debug(("((v0 o0 (c o1 v1)) o2 v2)\n")); + + return node_type::allocate(*(expr_gen.node_allocator_), v0, c, v1, v2, f0, f1, f2); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1, + const details::operator_type o2) + { + return details::build_string() + << "(t" << expr_gen.to_str(o0) + << "(t" << expr_gen.to_str(o1) + << "t)" << expr_gen.to_str(o2) + << "t"; + } + }; + + struct synthesize_covovov_expression4 + { + typedef typename covovov_t::type4 node_type; + typedef typename covovov_t::sf4_type sf4_type; + typedef typename node_type::T0 T0; + typedef typename node_type::T1 T1; + typedef typename node_type::T2 T2; + typedef typename node_type::T3 T3; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // ((c o0 (v0 o1 v1)) o2 v2) + typedef typename synthesize_covov_expression1::node_type lcl_covov_t; + + const lcl_covov_t* covov = static_cast(branch[0]); + const Type c = covov->t0(); + const Type& v0 = covov->t1(); + const Type& v1 = covov->t2(); + const Type& v2 = static_cast*>(branch[1])->ref(); + const details::operator_type o0 = expr_gen.get_operator(covov->f0()); + const details::operator_type o1 = expr_gen.get_operator(covov->f1()); + const details::operator_type o2 = operation; + + binary_functor_t f0 = covov->f0(); + binary_functor_t f1 = covov->f1(); + binary_functor_t f2 = reinterpret_cast(0); + + details::free_node(*(expr_gen.node_allocator_),branch[0]); + + expression_node_ptr result = error_node(); + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1, o2), c, v0, v1, v2, result); + + if (synthesis_result) + return result; + else if (!expr_gen.valid_operator(o2,f2)) + return error_node(); + + exprtk_debug(("((c o0 (v0 o1 v1)) o2 v2)\n")); + + return node_type::allocate(*(expr_gen.node_allocator_), c, v0, v1, v2, f0, f1, f2); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1, + const details::operator_type o2) + { + return details::build_string() + << "(t" << expr_gen.to_str(o0) + << "(t" << expr_gen.to_str(o1) + << "t)" << expr_gen.to_str(o2) + << "t"; + } + }; + + struct synthesize_covocov_expression4 + { + typedef typename covocov_t::type4 node_type; + typedef typename covocov_t::sf4_type sf4_type; + typedef typename node_type::T0 T0; + typedef typename node_type::T1 T1; + typedef typename node_type::T2 T2; + typedef typename node_type::T3 T3; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // ((c0 o0 (v0 o1 c1)) o2 v1) + typedef typename synthesize_covoc_expression1::node_type lcl_covoc_t; + + const lcl_covoc_t* covoc = static_cast(branch[0]); + const Type c0 = covoc->t0(); + const Type& v0 = covoc->t1(); + const Type c1 = covoc->t2(); + const Type& v1 = static_cast*>(branch[1])->ref(); + const details::operator_type o0 = expr_gen.get_operator(covoc->f0()); + const details::operator_type o1 = expr_gen.get_operator(covoc->f1()); + const details::operator_type o2 = operation; + + binary_functor_t f0 = covoc->f0(); + binary_functor_t f1 = covoc->f1(); + binary_functor_t f2 = reinterpret_cast(0); + + details::free_node(*(expr_gen.node_allocator_),branch[0]); + + expression_node_ptr result = error_node(); + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1, o2), c0, v0, c1, v1, result); + + if (synthesis_result) + return result; + else if (!expr_gen.valid_operator(o2,f2)) + return error_node(); + + exprtk_debug(("((c0 o0 (v0 o1 c1)) o2 v1)\n")); + + return node_type::allocate(*(expr_gen.node_allocator_), c0, v0, c1, v1, f0, f1, f2); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1, + const details::operator_type o2) + { + return details::build_string() + << "(t" << expr_gen.to_str(o0) + << "(t" << expr_gen.to_str(o1) + << "t)" << expr_gen.to_str(o2) + << "t"; + } + }; + + struct synthesize_vocovoc_expression4 + { + typedef typename vocovoc_t::type4 node_type; + typedef typename vocovoc_t::sf4_type sf4_type; + typedef typename node_type::T0 T0; + typedef typename node_type::T1 T1; + typedef typename node_type::T2 T2; + typedef typename node_type::T3 T3; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // ((v0 o0 (c0 o1 v1)) o2 c1) + typedef typename synthesize_vocov_expression1::node_type lcl_vocov_t; + + const lcl_vocov_t* vocov = static_cast(branch[0]); + const Type& v0 = vocov->t0(); + const Type c0 = vocov->t1(); + const Type& v1 = vocov->t2(); + const Type c1 = static_cast*>(branch[1])->value(); + const details::operator_type o0 = expr_gen.get_operator(vocov->f0()); + const details::operator_type o1 = expr_gen.get_operator(vocov->f1()); + const details::operator_type o2 = operation; + + binary_functor_t f0 = vocov->f0(); + binary_functor_t f1 = vocov->f1(); + binary_functor_t f2 = reinterpret_cast(0); + + details::free_node(*(expr_gen.node_allocator_),branch[0]); + details::free_node(*(expr_gen.node_allocator_),branch[1]); + + expression_node_ptr result = error_node(); + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1, o2), v0, c0, v1, c1, result); + + if (synthesis_result) + return result; + else if (!expr_gen.valid_operator(o2,f2)) + return error_node(); + + exprtk_debug(("((v0 o0 (c0 o1 v1)) o2 c1)\n")); + + return node_type::allocate(*(expr_gen.node_allocator_), v0, c0, v1, c1, f0, f1, f2); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1, + const details::operator_type o2) + { + return details::build_string() + << "(t" << expr_gen.to_str(o0) + << "(t" << expr_gen.to_str(o1) + << "t)" << expr_gen.to_str(o2) + << "t"; + } + }; + + struct synthesize_covovoc_expression4 + { + typedef typename covovoc_t::type4 node_type; + typedef typename covovoc_t::sf4_type sf4_type; + typedef typename node_type::T0 T0; + typedef typename node_type::T1 T1; + typedef typename node_type::T2 T2; + typedef typename node_type::T3 T3; + + static inline expression_node_ptr process(expression_generator& expr_gen, + const details::operator_type& operation, + expression_node_ptr (&branch)[2]) + { + // ((c0 o0 (v0 o1 v1)) o2 c1) + typedef typename synthesize_covov_expression1::node_type lcl_covov_t; + + const lcl_covov_t* covov = static_cast(branch[0]); + const Type c0 = covov->t0(); + const Type& v0 = covov->t1(); + const Type& v1 = covov->t2(); + const Type c1 = static_cast*>(branch[1])->value(); + const details::operator_type o0 = expr_gen.get_operator(covov->f0()); + const details::operator_type o1 = expr_gen.get_operator(covov->f1()); + const details::operator_type o2 = operation; + + binary_functor_t f0 = covov->f0(); + binary_functor_t f1 = covov->f1(); + binary_functor_t f2 = reinterpret_cast(0); + + details::free_node(*(expr_gen.node_allocator_),branch[0]); + details::free_node(*(expr_gen.node_allocator_),branch[1]); + + expression_node_ptr result = error_node(); + + const bool synthesis_result = + synthesize_sf4ext_expression::template compile + (expr_gen, id(expr_gen, o0, o1, o2), c0, v0, v1, c1, result); + + if (synthesis_result) + return result; + else if (!expr_gen.valid_operator(o2,f2)) + return error_node(); + + exprtk_debug(("((c0 o0 (v0 o1 v1)) o2 c1)\n")); + + return node_type::allocate(*(expr_gen.node_allocator_), c0, v0, v1, c1, f0, f1, f2); + } + + static inline std::string id(expression_generator& expr_gen, + const details::operator_type o0, + const details::operator_type o1, + const details::operator_type o2) + { + return details::build_string() + << "(t" << expr_gen.to_str(o0) + << "(t" << expr_gen.to_str(o1) + << "t)" << expr_gen.to_str(o2) + << "t"; + } + }; + + struct synthesize_vococov_expression4 + { + typedef typename vococov_t::type4 node_type; + static inline expression_node_ptr process(expression_generator&, + const details::operator_type&, + expression_node_ptr (&)[2]) + { + // ((v0 o0 (c0 o1 c1)) o2 v1) - Not possible + exprtk_debug(("((v0 o0 (c0 o1 c1)) o2 v1) - Not possible\n")); + return error_node(); + } + + static inline std::string id(expression_generator&, + const details::operator_type, + const details::operator_type, + const details::operator_type) + { + return "INVALID"; + } + }; + #endif + + inline expression_node_ptr synthesize_uvouv_expression(const details::operator_type& operation, expression_node_ptr (&branch)[2]) + { + // Definition: uv o uv + details::operator_type o0 = static_cast*>(branch[0])->operation(); + details::operator_type o1 = static_cast*>(branch[1])->operation(); + const Type& v0 = static_cast*>(branch[0])->v(); + const Type& v1 = static_cast*>(branch[1])->v(); + unary_functor_t u0 = reinterpret_cast (0); + unary_functor_t u1 = reinterpret_cast (0); + binary_functor_t f = reinterpret_cast(0); + + if (!valid_operator(o0,u0)) + return error_node(); + else if (!valid_operator(o1,u1)) + return error_node(); + else if (!valid_operator(operation,f)) + return error_node(); + + expression_node_ptr result = error_node(); + + if ( + (details::e_neg == o0) && + (details::e_neg == o1) + ) + { + switch (operation) + { + // (-v0 + -v1) --> -(v0 + v1) + case details::e_add : result = (*this)(details::e_neg, + node_allocator_-> + allocate_rr > >(v0, v1)); + exprtk_debug(("(-v0 + -v1) --> -(v0 + v1)\n")); + break; + + // (-v0 - -v1) --> (v1 - v0) + case details::e_sub : result = node_allocator_-> + allocate_rr > >(v1, v0); + exprtk_debug(("(-v0 - -v1) --> (v1 - v0)\n")); + break; + + // (-v0 * -v1) --> (v0 * v1) + case details::e_mul : result = node_allocator_-> + allocate_rr > >(v0, v1); + exprtk_debug(("(-v0 * -v1) --> (v0 * v1)\n")); + break; + + // (-v0 / -v1) --> (v0 / v1) + case details::e_div : result = node_allocator_-> + allocate_rr > >(v0, v1); + exprtk_debug(("(-v0 / -v1) --> (v0 / v1)\n")); + break; + + default : break; + } + } + + if (0 == result) + { + result = node_allocator_-> + allocate_rrrrr >(v0, v1, u0, u1, f); + } + + details::free_all_nodes(*node_allocator_,branch); + return result; + } + + #undef basic_opr_switch_statements + #undef extended_opr_switch_statements + #undef unary_opr_switch_statements + + #ifndef exprtk_disable_string_capabilities + + #define string_opr_switch_statements \ + case_stmt(details::e_lt , details::lt_op ) \ + case_stmt(details::e_lte , details::lte_op ) \ + case_stmt(details::e_gt , details::gt_op ) \ + case_stmt(details::e_gte , details::gte_op ) \ + case_stmt(details::e_eq , details::eq_op ) \ + case_stmt(details::e_ne , details::ne_op ) \ + case_stmt(details::e_in , details::in_op ) \ + case_stmt(details::e_like , details::like_op ) \ + case_stmt(details::e_ilike , details::ilike_op) \ + + template + inline expression_node_ptr synthesize_str_xrox_expression_impl(const details::operator_type& opr, + T0 s0, T1 s1, + range_t rp0) + { + switch (opr) + { + #define case_stmt(op0, op1) \ + case op0 : return node_allocator_-> \ + allocate_ttt >,T0,T1> \ + (s0, s1, rp0); \ + + string_opr_switch_statements + #undef case_stmt + default : return error_node(); + } + } + + template + inline expression_node_ptr synthesize_str_xoxr_expression_impl(const details::operator_type& opr, + T0 s0, T1 s1, + range_t rp1) + { + switch (opr) + { + #define case_stmt(op0, op1) \ + case op0 : return node_allocator_-> \ + allocate_ttt >,T0,T1> \ + (s0, s1, rp1); \ + + string_opr_switch_statements + #undef case_stmt + default : return error_node(); + } + } + + template + inline expression_node_ptr synthesize_str_xroxr_expression_impl(const details::operator_type& opr, + T0 s0, T1 s1, + range_t rp0, range_t rp1) + { + switch (opr) + { + #define case_stmt(op0, op1) \ + case op0 : return node_allocator_-> \ + allocate_tttt >,T0,T1> \ + (s0, s1, rp0, rp1); \ + + string_opr_switch_statements + #undef case_stmt + default : return error_node(); + } + } + + template + inline expression_node_ptr synthesize_sos_expression_impl(const details::operator_type& opr, T0 s0, T1 s1) + { + switch (opr) + { + #define case_stmt(op0, op1) \ + case op0 : return node_allocator_-> \ + allocate_tt >,T0,T1>(s0, s1); \ + + string_opr_switch_statements + #undef case_stmt + default : return error_node(); + } + } + + inline expression_node_ptr synthesize_sos_expression(const details::operator_type& opr, expression_node_ptr (&branch)[2]) + { + std::string& s0 = static_cast*>(branch[0])->ref(); + std::string& s1 = static_cast*>(branch[1])->ref(); + + return synthesize_sos_expression_impl(opr, s0, s1); + } + + inline expression_node_ptr synthesize_sros_expression(const details::operator_type& opr, expression_node_ptr (&branch)[2]) + { + std::string& s0 = static_cast*>(branch[0])->ref (); + std::string& s1 = static_cast*> (branch[1])->ref (); + range_t rp0 = static_cast*>(branch[0])->range(); + + static_cast*>(branch[0])->range_ref().clear(); + + details::free_node(*node_allocator_,branch[0]); + + return synthesize_str_xrox_expression_impl(opr, s0, s1, rp0); + } + + inline expression_node_ptr synthesize_sosr_expression(const details::operator_type& opr, expression_node_ptr (&branch)[2]) + { + std::string& s0 = static_cast*> (branch[0])->ref (); + std::string& s1 = static_cast*>(branch[1])->ref (); + range_t rp1 = static_cast*>(branch[1])->range(); + + static_cast*>(branch[1])->range_ref().clear(); + + details::free_node(*node_allocator_,branch[1]); + + return synthesize_str_xoxr_expression_impl(opr, s0, s1, rp1); + } + + inline expression_node_ptr synthesize_socsr_expression(const details::operator_type& opr, expression_node_ptr (&branch)[2]) + { + std::string& s0 = static_cast*> (branch[0])->ref (); + std::string s1 = static_cast*>(branch[1])->str (); + range_t rp1 = static_cast*>(branch[1])->range(); + + static_cast*>(branch[1])->range_ref().clear(); + + details::free_node(*node_allocator_,branch[1]); + + return synthesize_str_xoxr_expression_impl(opr, s0, s1, rp1); + } + + inline expression_node_ptr synthesize_srosr_expression(const details::operator_type& opr, expression_node_ptr (&branch)[2]) + { + std::string& s0 = static_cast*>(branch[0])->ref (); + std::string& s1 = static_cast*>(branch[1])->ref (); + range_t rp0 = static_cast*>(branch[0])->range(); + range_t rp1 = static_cast*>(branch[1])->range(); + + static_cast*>(branch[0])->range_ref().clear(); + static_cast*>(branch[1])->range_ref().clear(); + + details::free_node(*node_allocator_,branch[0]); + details::free_node(*node_allocator_,branch[1]); + + return synthesize_str_xroxr_expression_impl(opr, s0, s1, rp0, rp1); + } + + inline expression_node_ptr synthesize_socs_expression(const details::operator_type& opr, expression_node_ptr (&branch)[2]) + { + std::string& s0 = static_cast< details::stringvar_node*>(branch[0])->ref(); + std::string s1 = static_cast*>(branch[1])->str(); + + details::free_node(*node_allocator_,branch[1]); + + return synthesize_sos_expression_impl(opr, s0, s1); + } + + inline expression_node_ptr synthesize_csos_expression(const details::operator_type& opr, expression_node_ptr (&branch)[2]) + { + std::string s0 = static_cast*>(branch[0])->str(); + std::string& s1 = static_cast* >(branch[1])->ref(); + + details::free_node(*node_allocator_,branch[0]); + + return synthesize_sos_expression_impl(opr, s0, s1); + } + + inline expression_node_ptr synthesize_csosr_expression(const details::operator_type& opr, expression_node_ptr (&branch)[2]) + { + std::string s0 = static_cast*>(branch[0])->str (); + std::string& s1 = static_cast* >(branch[1])->ref (); + range_t rp1 = static_cast* >(branch[1])->range(); + + static_cast*>(branch[1])->range_ref().clear(); + + details::free_node(*node_allocator_,branch[0]); + details::free_node(*node_allocator_,branch[1]); + + return synthesize_str_xoxr_expression_impl(opr, s0, s1, rp1); + } + + inline expression_node_ptr synthesize_srocs_expression(const details::operator_type& opr, expression_node_ptr (&branch)[2]) + { + std::string& s0 = static_cast* >(branch[0])->ref (); + std::string s1 = static_cast*>(branch[1])->str (); + range_t rp0 = static_cast* >(branch[0])->range(); + + static_cast*>(branch[0])->range_ref().clear(); + + details::free_node(*node_allocator_,branch[0]); + details::free_node(*node_allocator_,branch[1]); + + return synthesize_str_xrox_expression_impl(opr, s0, s1, rp0); + } + + inline expression_node_ptr synthesize_srocsr_expression(const details::operator_type& opr, expression_node_ptr (&branch)[2]) + { + std::string& s0 = static_cast* >(branch[0])->ref (); + std::string s1 = static_cast*>(branch[1])->str (); + range_t rp0 = static_cast* >(branch[0])->range(); + range_t rp1 = static_cast*>(branch[1])->range(); + + static_cast*> (branch[0])->range_ref().clear(); + static_cast*>(branch[1])->range_ref().clear(); + + details::free_node(*node_allocator_,branch[0]); + details::free_node(*node_allocator_,branch[1]); + + return synthesize_str_xroxr_expression_impl(opr, s0, s1, rp0, rp1); + } + + inline expression_node_ptr synthesize_csocs_expression(const details::operator_type& opr, expression_node_ptr (&branch)[2]) + { + const std::string s0 = static_cast*>(branch[0])->str(); + const std::string s1 = static_cast*>(branch[1])->str(); + + expression_node_ptr result = error_node(); + + if (details::e_add == opr) + result = node_allocator_->allocate_c >(s0 + s1); + else if (details::e_in == opr) + result = node_allocator_->allocate_c >(details::in_op ::process(s0,s1)); + else if (details::e_like == opr) + result = node_allocator_->allocate_c >(details::like_op ::process(s0,s1)); + else if (details::e_ilike == opr) + result = node_allocator_->allocate_c >(details::ilike_op::process(s0,s1)); + else + { + expression_node_ptr temp = synthesize_sos_expression_impl(opr, s0, s1); + + const Type v = temp->value(); + + details::free_node(*node_allocator_,temp); + + result = node_allocator_->allocate(v); + } + + details::free_all_nodes(*node_allocator_,branch); + + return result; + } + + inline expression_node_ptr synthesize_csocsr_expression(const details::operator_type& opr, expression_node_ptr (&branch)[2]) + { + const std::string s0 = static_cast* >(branch[0])->str (); + std::string s1 = static_cast*>(branch[1])->str (); + range_t rp1 = static_cast*>(branch[1])->range(); + + static_cast*>(branch[1])->range_ref().clear(); + + details::free_node(*node_allocator_,branch[0]); + details::free_node(*node_allocator_,branch[1]); + + return synthesize_str_xoxr_expression_impl(opr, s0, s1, rp1); + } + + inline expression_node_ptr synthesize_csros_expression(const details::operator_type& opr, expression_node_ptr (&branch)[2]) + { + std::string s0 = static_cast*>(branch[0])->str (); + std::string& s1 = static_cast* >(branch[1])->ref (); + range_t rp0 = static_cast*>(branch[0])->range(); + + static_cast*>(branch[0])->range_ref().clear(); + + details::free_node(*node_allocator_,branch[0]); + + return synthesize_str_xrox_expression_impl(opr, s0, s1, rp0); + } + + inline expression_node_ptr synthesize_csrosr_expression(const details::operator_type& opr, expression_node_ptr (&branch)[2]) + { + const std::string s0 = static_cast*>(branch[0])->str (); + std::string& s1 = static_cast* >(branch[1])->ref (); + const range_t rp0 = static_cast*>(branch[0])->range(); + const range_t rp1 = static_cast* >(branch[1])->range(); + + static_cast*>(branch[0])->range_ref().clear(); + static_cast*> (branch[1])->range_ref().clear(); + + details::free_node(*node_allocator_,branch[0]); + details::free_node(*node_allocator_,branch[1]); + + return synthesize_str_xroxr_expression_impl(opr, s0, s1, rp0, rp1); + } + + inline expression_node_ptr synthesize_csrocs_expression(const details::operator_type& opr, expression_node_ptr (&branch)[2]) + { + const std::string s0 = static_cast*>(branch[0])->str (); + const std::string s1 = static_cast* >(branch[1])->str (); + const range_t rp0 = static_cast*>(branch[0])->range(); + + static_cast*>(branch[0])->range_ref().clear(); + + details::free_all_nodes(*node_allocator_,branch); + + return synthesize_str_xrox_expression_impl(opr, s0, s1, rp0); + } + + inline expression_node_ptr synthesize_csrocsr_expression(const details::operator_type& opr, expression_node_ptr (&branch)[2]) + { + const std::string s0 = static_cast*>(branch[0])->str (); + const std::string s1 = static_cast*>(branch[1])->str (); + const range_t rp0 = static_cast*>(branch[0])->range(); + const range_t rp1 = static_cast*>(branch[1])->range(); + + static_cast*>(branch[0])->range_ref().clear(); + static_cast*>(branch[1])->range_ref().clear(); + + details::free_all_nodes(*node_allocator_,branch); + + return synthesize_str_xroxr_expression_impl(opr, s0, s1, rp0, rp1); + } + + inline expression_node_ptr synthesize_strogen_expression(const details::operator_type& opr, expression_node_ptr (&branch)[2]) + { + switch (opr) + { + #define case_stmt(op0, op1) \ + case op0 : return node_allocator_-> \ + allocate_ttt > > \ + (opr, branch[0], branch[1]); \ + + string_opr_switch_statements + #undef case_stmt + default : return error_node(); + } + } + #endif + + #ifndef exprtk_disable_string_capabilities + inline expression_node_ptr synthesize_string_expression(const details::operator_type& opr, expression_node_ptr (&branch)[2]) + { + if ((0 == branch[0]) || (0 == branch[1])) + { + details::free_all_nodes(*node_allocator_,branch); + + return error_node(); + } + + const bool b0_is_s = details::is_string_node (branch[0]); + const bool b0_is_cs = details::is_const_string_node (branch[0]); + const bool b0_is_sr = details::is_string_range_node (branch[0]); + const bool b0_is_csr = details::is_const_string_range_node(branch[0]); + + const bool b1_is_s = details::is_string_node (branch[1]); + const bool b1_is_cs = details::is_const_string_node (branch[1]); + const bool b1_is_sr = details::is_string_range_node (branch[1]); + const bool b1_is_csr = details::is_const_string_range_node(branch[1]); + + const bool b0_is_gen = details::is_string_assignment_node (branch[0]) || + details::is_genricstring_range_node(branch[0]) || + details::is_string_concat_node (branch[0]) || + details::is_string_function_node (branch[0]) || + details::is_string_condition_node (branch[0]) || + details::is_string_ccondition_node (branch[0]) || + details::is_string_vararg_node (branch[0]) ; + + const bool b1_is_gen = details::is_string_assignment_node (branch[1]) || + details::is_genricstring_range_node(branch[1]) || + details::is_string_concat_node (branch[1]) || + details::is_string_function_node (branch[1]) || + details::is_string_condition_node (branch[1]) || + details::is_string_ccondition_node (branch[1]) || + details::is_string_vararg_node (branch[1]) ; + + if (details::e_add == opr) + { + if (!b0_is_cs || !b1_is_cs) + { + return synthesize_expression(opr,branch); + } + } + + if (b0_is_gen || b1_is_gen) + { + return synthesize_strogen_expression(opr,branch); + } + else if (b0_is_s) + { + if (b1_is_s ) return synthesize_sos_expression (opr,branch); + else if (b1_is_cs ) return synthesize_socs_expression (opr,branch); + else if (b1_is_sr ) return synthesize_sosr_expression (opr,branch); + else if (b1_is_csr) return synthesize_socsr_expression (opr,branch); + } + else if (b0_is_cs) + { + if (b1_is_s ) return synthesize_csos_expression (opr,branch); + else if (b1_is_cs ) return synthesize_csocs_expression (opr,branch); + else if (b1_is_sr ) return synthesize_csosr_expression (opr,branch); + else if (b1_is_csr) return synthesize_csocsr_expression(opr,branch); + } + else if (b0_is_sr) + { + if (b1_is_s ) return synthesize_sros_expression (opr,branch); + else if (b1_is_sr ) return synthesize_srosr_expression (opr,branch); + else if (b1_is_cs ) return synthesize_srocs_expression (opr,branch); + else if (b1_is_csr) return synthesize_srocsr_expression(opr,branch); + } + else if (b0_is_csr) + { + if (b1_is_s ) return synthesize_csros_expression (opr,branch); + else if (b1_is_sr ) return synthesize_csrosr_expression (opr,branch); + else if (b1_is_cs ) return synthesize_csrocs_expression (opr,branch); + else if (b1_is_csr) return synthesize_csrocsr_expression(opr,branch); + } + + return error_node(); + } + #else + inline expression_node_ptr synthesize_string_expression(const details::operator_type&, expression_node_ptr (&branch)[2]) + { + details::free_all_nodes(*node_allocator_,branch); + return error_node(); + } + #endif + + #ifndef exprtk_disable_string_capabilities + inline expression_node_ptr synthesize_string_expression(const details::operator_type& opr, expression_node_ptr (&branch)[3]) + { + if (details::e_inrange != opr) + return error_node(); + else if ((0 == branch[0]) || (0 == branch[1]) || (0 == branch[2])) + { + details::free_all_nodes(*node_allocator_,branch); + + return error_node(); + } + else if ( + details::is_const_string_node(branch[0]) && + details::is_const_string_node(branch[1]) && + details::is_const_string_node(branch[2]) + ) + { + const std::string s0 = static_cast*>(branch[0])->str(); + const std::string s1 = static_cast*>(branch[1])->str(); + const std::string s2 = static_cast*>(branch[2])->str(); + + const Type v = (((s0 <= s1) && (s1 <= s2)) ? Type(1) : Type(0)); + + details::free_all_nodes(*node_allocator_,branch); + + return node_allocator_->allocate_c >(v); + } + else if ( + details::is_string_node(branch[0]) && + details::is_string_node(branch[1]) && + details::is_string_node(branch[2]) + ) + { + std::string& s0 = static_cast*>(branch[0])->ref(); + std::string& s1 = static_cast*>(branch[1])->ref(); + std::string& s2 = static_cast*>(branch[2])->ref(); + + typedef typename details::sosos_node > inrange_t; + + return node_allocator_->allocate_type(s0, s1, s2); + } + else if ( + details::is_const_string_node(branch[0]) && + details::is_string_node(branch[1]) && + details::is_const_string_node(branch[2]) + ) + { + std::string s0 = static_cast*>(branch[0])->str(); + std::string& s1 = static_cast* >(branch[1])->ref(); + std::string s2 = static_cast*>(branch[2])->str(); + + typedef typename details::sosos_node > inrange_t; + + details::free_node(*node_allocator_,branch[0]); + details::free_node(*node_allocator_,branch[2]); + + return node_allocator_->allocate_type(s0, s1, s2); + } + else if ( + details::is_string_node(branch[0]) && + details::is_const_string_node(branch[1]) && + details::is_string_node(branch[2]) + ) + { + std::string& s0 = static_cast* >(branch[0])->ref(); + std::string s1 = static_cast*>(branch[1])->str(); + std::string& s2 = static_cast* >(branch[2])->ref(); + + typedef typename details::sosos_node > inrange_t; + + details::free_node(*node_allocator_,branch[1]); + + return node_allocator_->allocate_type(s0, s1, s2); + } + else if ( + details::is_string_node(branch[0]) && + details::is_string_node(branch[1]) && + details::is_const_string_node(branch[2]) + ) + { + std::string& s0 = static_cast* >(branch[0])->ref(); + std::string& s1 = static_cast* >(branch[1])->ref(); + std::string s2 = static_cast*>(branch[2])->str(); + + typedef typename details::sosos_node > inrange_t; + + details::free_node(*node_allocator_,branch[2]); + + return node_allocator_->allocate_type(s0, s1, s2); + } + else if ( + details::is_const_string_node(branch[0]) && + details:: is_string_node(branch[1]) && + details:: is_string_node(branch[2]) + ) + { + std::string s0 = static_cast*>(branch[0])->str(); + std::string& s1 = static_cast* >(branch[1])->ref(); + std::string& s2 = static_cast* >(branch[2])->ref(); + + typedef typename details::sosos_node > inrange_t; + + details::free_node(*node_allocator_,branch[0]); + + return node_allocator_->allocate_type(s0, s1, s2); + } + else + return error_node(); + } + #else + inline expression_node_ptr synthesize_string_expression(const details::operator_type&, expression_node_ptr (&branch)[3]) + { + details::free_all_nodes(*node_allocator_,branch); + return error_node(); + } + #endif + + inline expression_node_ptr synthesize_null_expression(const details::operator_type& operation, expression_node_ptr (&branch)[2]) + { + /* + Note: The following are the type promotion rules + that relate to operations that include 'null': + 0. null ==/!= null --> true false + 1. null operation null --> null + 2. x ==/!= null --> true/false + 3. null ==/!= x --> true/false + 4. x operation null --> x + 5. null operation x --> x + */ + + typedef typename details::null_eq_node nulleq_node_t; + + const bool b0_null = details::is_null_node(branch[0]); + const bool b1_null = details::is_null_node(branch[1]); + + if (b0_null && b1_null) + { + expression_node_ptr result = error_node(); + + if (details::e_eq == operation) + result = node_allocator_->allocate_c(T(1)); + else if (details::e_ne == operation) + result = node_allocator_->allocate_c(T(0)); + + if (result) + { + details::free_node(*node_allocator_,branch[0]); + details::free_node(*node_allocator_,branch[1]); + + return result; + } + + details::free_node(*node_allocator_,branch[1]); + + return branch[0]; + } + else if (details::e_eq == operation) + { + expression_node_ptr result = node_allocator_-> + allocate_rc(branch[b0_null ? 0 : 1],true); + + details::free_node(*node_allocator_,branch[b0_null ? 1 : 0]); + + return result; + } + else if (details::e_ne == operation) + { + expression_node_ptr result = node_allocator_-> + allocate_rc(branch[b0_null ? 0 : 1],false); + + details::free_node(*node_allocator_,branch[b0_null ? 1 : 0]); + + return result; + } + else if (b0_null) + { + details::free_node(*node_allocator_,branch[0]); + branch[0] = branch[1]; + branch[1] = error_node(); + } + else if (b1_null) + { + details::free_node(*node_allocator_,branch[1]); + branch[1] = error_node(); + } + + if ( + (details::e_add == operation) || (details::e_sub == operation) || + (details::e_mul == operation) || (details::e_div == operation) || + (details::e_mod == operation) || (details::e_pow == operation) + ) + { + return branch[0]; + } + + details::free_node(*node_allocator_, branch[0]); + + if ( + (details::e_lt == operation) || (details::e_lte == operation) || + (details::e_gt == operation) || (details::e_gte == operation) || + (details::e_and == operation) || (details::e_nand == operation) || + (details::e_or == operation) || (details::e_nor == operation) || + (details::e_xor == operation) || (details::e_xnor == operation) || + (details::e_in == operation) || (details::e_like == operation) || + (details::e_ilike == operation) + ) + { + return node_allocator_->allocate_c(T(0)); + } + + return node_allocator_->allocate >(); + } + + template + inline expression_node_ptr synthesize_expression(const details::operator_type& operation, expression_node_ptr (&branch)[N]) + { + if ( + (details::e_in == operation) || + (details::e_like == operation) || + (details::e_ilike == operation) + ) + { + free_all_nodes(*node_allocator_,branch); + + return error_node(); + } + else if (!details::all_nodes_valid(branch)) + { + free_all_nodes(*node_allocator_,branch); + + return error_node(); + } + else if ((details::e_default != operation)) + { + // Attempt simple constant folding optimisation. + expression_node_ptr expression_point = node_allocator_->allocate(operation,branch); + + if (is_constant_foldable(branch)) + { + const Type v = expression_point->value(); + details::free_node(*node_allocator_,expression_point); + + return node_allocator_->allocate(v); + } + else + return expression_point; + } + else + return error_node(); + } + + template + inline expression_node_ptr synthesize_expression(F* f, expression_node_ptr (&branch)[N]) + { + if (!details::all_nodes_valid(branch)) + { + free_all_nodes(*node_allocator_,branch); + + return error_node(); + } + + typedef typename details::function_N_node function_N_node_t; + + // Attempt simple constant folding optimisation. + + expression_node_ptr expression_point = node_allocator_->allocate(f); + function_N_node_t* func_node_ptr = dynamic_cast(expression_point); + + if (0 == func_node_ptr) + { + free_all_nodes(*node_allocator_,branch); + + return error_node(); + } + else + func_node_ptr->init_branches(branch); + + if (is_constant_foldable(branch) && !f->has_side_effects()) + { + Type v = expression_point->value(); + details::free_node(*node_allocator_,expression_point); + + return node_allocator_->allocate(v); + } + + parser_->state_.activate_side_effect("synthesize_expression(function)"); + + return expression_point; + } + + bool strength_reduction_enabled_; + details::node_allocator* node_allocator_; + synthesize_map_t synthesize_map_; + unary_op_map_t* unary_op_map_; + binary_op_map_t* binary_op_map_; + inv_binary_op_map_t* inv_binary_op_map_; + sf3_map_t* sf3_map_; + sf4_map_t* sf4_map_; + parser_t* parser_; + }; // class expression_generator + + inline void set_error(const parser_error::type& error_type) + { + error_list_.push_back(error_type); + } + + inline void remove_last_error() + { + if (!error_list_.empty()) + { + error_list_.pop_back(); + } + } + + inline void set_synthesis_error(const std::string& synthesis_error_message) + { + if (synthesis_error_.empty()) + { + synthesis_error_ = synthesis_error_message; + } + } + + inline void register_local_vars(expression& e) + { + for (std::size_t i = 0; i < sem_.size(); ++i) + { + scope_element& se = sem_.get_element(i); + + if ( + (scope_element::e_variable == se.type) || + (scope_element::e_vecelem == se.type) + ) + { + if (se.var_node) + { + e.register_local_var(se.var_node); + } + + if (se.data) + { + e.register_local_data(se.data, 1, 0); + } + } + else if (scope_element::e_vector == se.type) + { + if (se.vec_node) + { + e.register_local_var(se.vec_node); + } + + if (se.data) + { + e.register_local_data(se.data, se.size, 1); + } + } + #ifndef exprtk_disable_string_capabilities + else if (scope_element::e_string == se.type) + { + if (se.str_node) + { + e.register_local_var(se.str_node); + } + + if (se.data) + { + e.register_local_data(se.data, se.size, 2); + } + } + #endif + + se.var_node = 0; + se.vec_node = 0; + #ifndef exprtk_disable_string_capabilities + se.str_node = 0; + #endif + se.data = 0; + se.ref_count = 0; + se.active = false; + } + } + + inline void register_return_results(expression& e) + { + e.register_return_results(results_context_); + results_context_ = 0; + } + + inline void load_unary_operations_map(unary_op_map_t& m) + { + #define register_unary_op(Op, UnaryFunctor) \ + m.insert(std::make_pair(Op,UnaryFunctor::process)); \ + + register_unary_op(details::e_abs , details::abs_op ) + register_unary_op(details::e_acos , details::acos_op ) + register_unary_op(details::e_acosh , details::acosh_op) + register_unary_op(details::e_asin , details::asin_op ) + register_unary_op(details::e_asinh , details::asinh_op) + register_unary_op(details::e_atanh , details::atanh_op) + register_unary_op(details::e_ceil , details::ceil_op ) + register_unary_op(details::e_cos , details::cos_op ) + register_unary_op(details::e_cosh , details::cosh_op ) + register_unary_op(details::e_exp , details::exp_op ) + register_unary_op(details::e_expm1 , details::expm1_op) + register_unary_op(details::e_floor , details::floor_op) + register_unary_op(details::e_log , details::log_op ) + register_unary_op(details::e_log10 , details::log10_op) + register_unary_op(details::e_log2 , details::log2_op ) + register_unary_op(details::e_log1p , details::log1p_op) + register_unary_op(details::e_neg , details::neg_op ) + register_unary_op(details::e_pos , details::pos_op ) + register_unary_op(details::e_round , details::round_op) + register_unary_op(details::e_sin , details::sin_op ) + register_unary_op(details::e_sinc , details::sinc_op ) + register_unary_op(details::e_sinh , details::sinh_op ) + register_unary_op(details::e_sqrt , details::sqrt_op ) + register_unary_op(details::e_tan , details::tan_op ) + register_unary_op(details::e_tanh , details::tanh_op ) + register_unary_op(details::e_cot , details::cot_op ) + register_unary_op(details::e_sec , details::sec_op ) + register_unary_op(details::e_csc , details::csc_op ) + register_unary_op(details::e_r2d , details::r2d_op ) + register_unary_op(details::e_d2r , details::d2r_op ) + register_unary_op(details::e_d2g , details::d2g_op ) + register_unary_op(details::e_g2d , details::g2d_op ) + register_unary_op(details::e_notl , details::notl_op ) + register_unary_op(details::e_sgn , details::sgn_op ) + register_unary_op(details::e_erf , details::erf_op ) + register_unary_op(details::e_erfc , details::erfc_op ) + register_unary_op(details::e_ncdf , details::ncdf_op ) + register_unary_op(details::e_frac , details::frac_op ) + register_unary_op(details::e_trunc , details::trunc_op) + #undef register_unary_op + } + + inline void load_binary_operations_map(binary_op_map_t& m) + { + typedef typename binary_op_map_t::value_type value_type; + + #define register_binary_op(Op, BinaryFunctor) \ + m.insert(value_type(Op,BinaryFunctor::process)); \ + + register_binary_op(details::e_add , details::add_op ) + register_binary_op(details::e_sub , details::sub_op ) + register_binary_op(details::e_mul , details::mul_op ) + register_binary_op(details::e_div , details::div_op ) + register_binary_op(details::e_mod , details::mod_op ) + register_binary_op(details::e_pow , details::pow_op ) + register_binary_op(details::e_lt , details::lt_op ) + register_binary_op(details::e_lte , details::lte_op ) + register_binary_op(details::e_gt , details::gt_op ) + register_binary_op(details::e_gte , details::gte_op ) + register_binary_op(details::e_eq , details::eq_op ) + register_binary_op(details::e_ne , details::ne_op ) + register_binary_op(details::e_and , details::and_op ) + register_binary_op(details::e_nand , details::nand_op) + register_binary_op(details::e_or , details::or_op ) + register_binary_op(details::e_nor , details::nor_op ) + register_binary_op(details::e_xor , details::xor_op ) + register_binary_op(details::e_xnor , details::xnor_op) + #undef register_binary_op + } + + inline void load_inv_binary_operations_map(inv_binary_op_map_t& m) + { + typedef typename inv_binary_op_map_t::value_type value_type; + + #define register_binary_op(Op, BinaryFunctor) \ + m.insert(value_type(BinaryFunctor::process,Op)); \ + + register_binary_op(details::e_add , details::add_op ) + register_binary_op(details::e_sub , details::sub_op ) + register_binary_op(details::e_mul , details::mul_op ) + register_binary_op(details::e_div , details::div_op ) + register_binary_op(details::e_mod , details::mod_op ) + register_binary_op(details::e_pow , details::pow_op ) + register_binary_op(details::e_lt , details::lt_op ) + register_binary_op(details::e_lte , details::lte_op ) + register_binary_op(details::e_gt , details::gt_op ) + register_binary_op(details::e_gte , details::gte_op ) + register_binary_op(details::e_eq , details::eq_op ) + register_binary_op(details::e_ne , details::ne_op ) + register_binary_op(details::e_and , details::and_op ) + register_binary_op(details::e_nand , details::nand_op) + register_binary_op(details::e_or , details::or_op ) + register_binary_op(details::e_nor , details::nor_op ) + register_binary_op(details::e_xor , details::xor_op ) + register_binary_op(details::e_xnor , details::xnor_op) + #undef register_binary_op + } + + inline void load_sf3_map(sf3_map_t& sf3_map) + { + typedef std::pair pair_t; + + #define register_sf3(Op) \ + sf3_map[details::sf##Op##_op::id()] = pair_t(details::sf##Op##_op::process,details::e_sf##Op); \ + + register_sf3(00) register_sf3(01) register_sf3(02) register_sf3(03) + register_sf3(04) register_sf3(05) register_sf3(06) register_sf3(07) + register_sf3(08) register_sf3(09) register_sf3(10) register_sf3(11) + register_sf3(12) register_sf3(13) register_sf3(14) register_sf3(15) + register_sf3(16) register_sf3(17) register_sf3(18) register_sf3(19) + register_sf3(20) register_sf3(21) register_sf3(22) register_sf3(23) + register_sf3(24) register_sf3(25) register_sf3(26) register_sf3(27) + register_sf3(28) register_sf3(29) register_sf3(30) + #undef register_sf3 + + #define register_sf3_extid(Id, Op) \ + sf3_map[Id] = pair_t(details::sf##Op##_op::process,details::e_sf##Op); \ + + register_sf3_extid("(t-t)-t",23) // (t-t)-t --> t-(t+t) + #undef register_sf3_extid + } + + inline void load_sf4_map(sf4_map_t& sf4_map) + { + typedef std::pair pair_t; + + #define register_sf4(Op) \ + sf4_map[details::sf##Op##_op::id()] = pair_t(details::sf##Op##_op::process,details::e_sf##Op); \ + + register_sf4(48) register_sf4(49) register_sf4(50) register_sf4(51) + register_sf4(52) register_sf4(53) register_sf4(54) register_sf4(55) + register_sf4(56) register_sf4(57) register_sf4(58) register_sf4(59) + register_sf4(60) register_sf4(61) register_sf4(62) register_sf4(63) + register_sf4(64) register_sf4(65) register_sf4(66) register_sf4(67) + register_sf4(68) register_sf4(69) register_sf4(70) register_sf4(71) + register_sf4(72) register_sf4(73) register_sf4(74) register_sf4(75) + register_sf4(76) register_sf4(77) register_sf4(78) register_sf4(79) + register_sf4(80) register_sf4(81) register_sf4(82) register_sf4(83) + #undef register_sf4 + + #define register_sf4ext(Op) \ + sf4_map[details::sfext##Op##_op::id()] = pair_t(details::sfext##Op##_op::process,details::e_sf4ext##Op); \ + + register_sf4ext(00) register_sf4ext(01) register_sf4ext(02) register_sf4ext(03) + register_sf4ext(04) register_sf4ext(05) register_sf4ext(06) register_sf4ext(07) + register_sf4ext(08) register_sf4ext(09) register_sf4ext(10) register_sf4ext(11) + register_sf4ext(12) register_sf4ext(13) register_sf4ext(14) register_sf4ext(15) + register_sf4ext(16) register_sf4ext(17) register_sf4ext(18) register_sf4ext(19) + register_sf4ext(20) register_sf4ext(21) register_sf4ext(22) register_sf4ext(23) + register_sf4ext(24) register_sf4ext(25) register_sf4ext(26) register_sf4ext(27) + register_sf4ext(28) register_sf4ext(29) register_sf4ext(30) register_sf4ext(31) + register_sf4ext(32) register_sf4ext(33) register_sf4ext(34) register_sf4ext(35) + register_sf4ext(36) register_sf4ext(36) register_sf4ext(38) register_sf4ext(39) + register_sf4ext(40) register_sf4ext(41) register_sf4ext(42) register_sf4ext(43) + register_sf4ext(44) register_sf4ext(45) register_sf4ext(46) register_sf4ext(47) + register_sf4ext(48) register_sf4ext(49) register_sf4ext(50) register_sf4ext(51) + register_sf4ext(52) register_sf4ext(53) register_sf4ext(54) register_sf4ext(55) + register_sf4ext(56) register_sf4ext(57) register_sf4ext(58) register_sf4ext(59) + register_sf4ext(60) register_sf4ext(61) + #undef register_sf4ext + } + + inline results_context_t& results_ctx() + { + if (0 == results_context_) + { + results_context_ = new results_context_t(); + } + + return (*results_context_); + } + + inline void return_cleanup() + { + #ifndef exprtk_disable_return_statement + if (results_context_) + { + delete results_context_; + results_context_ = 0; + } + + state_.return_stmt_present = false; + #endif + } + + private: + + parser(const parser&) exprtk_delete; + parser& operator=(const parser&) exprtk_delete; + + settings_store settings_; + expression_generator expression_generator_; + details::node_allocator node_allocator_; + symtab_store symtab_store_; + dependent_entity_collector dec_; + std::deque error_list_; + std::deque brkcnt_list_; + parser_state state_; + bool resolve_unknown_symbol_; + results_context_t* results_context_; + unknown_symbol_resolver* unknown_symbol_resolver_; + unknown_symbol_resolver default_usr_; + base_ops_map_t base_ops_map_; + unary_op_map_t unary_op_map_; + binary_op_map_t binary_op_map_; + inv_binary_op_map_t inv_binary_op_map_; + sf3_map_t sf3_map_; + sf4_map_t sf4_map_; + std::string synthesis_error_; + scope_element_manager sem_; + + lexer::helper::helper_assembly helper_assembly_; + + lexer::helper::commutative_inserter commutative_inserter_; + lexer::helper::operator_joiner operator_joiner_2_; + lexer::helper::operator_joiner operator_joiner_3_; + lexer::helper::symbol_replacer symbol_replacer_; + lexer::helper::bracket_checker bracket_checker_; + lexer::helper::numeric_checker numeric_checker_; + lexer::helper::sequence_validator sequence_validator_; + lexer::helper::sequence_validator_3tokens sequence_validator_3tkns_; + + loop_runtime_check_ptr loop_runtime_check_; + + template + friend void details::disable_type_checking(ParserType& p); + }; // class parser + + namespace details + { + template + struct collector_helper + { + typedef exprtk::symbol_table symbol_table_t; + typedef exprtk::expression expression_t; + typedef exprtk::parser parser_t; + typedef typename parser_t::dependent_entity_collector::symbol_t symbol_t; + typedef typename parser_t::unknown_symbol_resolver usr_t; + + struct resolve_as_vector : public parser_t::unknown_symbol_resolver + { + typedef exprtk::parser parser_t; + + resolve_as_vector() + : usr_t(usr_t::e_usrmode_extended) + {} + + virtual bool process(const std::string& unknown_symbol, + symbol_table_t& symbol_table, + std::string&) + { + static T v[1]; + symbol_table.add_vector(unknown_symbol,v); + return true; + } + }; + + static inline bool collection_pass(const std::string& expression_string, + std::set& symbol_set, + const bool collect_variables, + const bool collect_functions, + const bool vector_pass, + symbol_table_t& ext_symbol_table) + { + symbol_table_t symbol_table; + expression_t expression; + parser_t parser; + + resolve_as_vector vect_resolver; + + expression.register_symbol_table(symbol_table ); + expression.register_symbol_table(ext_symbol_table); + + if (vector_pass) + parser.enable_unknown_symbol_resolver(&vect_resolver); + else + parser.enable_unknown_symbol_resolver(); + + if (collect_variables) + parser.dec().collect_variables() = true; + + if (collect_functions) + parser.dec().collect_functions() = true; + + bool pass_result = false; + + details::disable_type_checking(parser); + + if (parser.compile(expression_string, expression)) + { + pass_result = true; + + std::deque symb_list; + parser.dec().symbols(symb_list); + + for (std::size_t i = 0; i < symb_list.size(); ++i) + { + symbol_set.insert(symb_list[i].first); + } + } + + return pass_result; + } + }; + } + + template class Sequence> + inline bool collect_variables(const std::string& expression, + Sequence& symbol_list) + { + typedef double T; + typedef details::collector_helper collect_t; + + collect_t::symbol_table_t null_symbol_table; + + std::set symbol_set; + + const bool variable_pass = collect_t::collection_pass + (expression, symbol_set, true, false, false, null_symbol_table); + const bool vector_pass = collect_t::collection_pass + (expression, symbol_set, true, false, true, null_symbol_table); + + if (!variable_pass && !vector_pass) + return false; + + std::set::iterator itr = symbol_set.begin(); + + while (symbol_set.end() != itr) + { + symbol_list.push_back(*itr); + ++itr; + } + + return true; + } + + template class Sequence> + inline bool collect_variables(const std::string& expression, + exprtk::symbol_table& extrnl_symbol_table, + Sequence& symbol_list) + { + typedef details::collector_helper collect_t; + + std::set symbol_set; + + const bool variable_pass = collect_t::collection_pass + (expression, symbol_set, true, false, false, extrnl_symbol_table); + const bool vector_pass = collect_t::collection_pass + (expression, symbol_set, true, false, true, extrnl_symbol_table); + + if (!variable_pass && !vector_pass) + return false; + + std::set::iterator itr = symbol_set.begin(); + + while (symbol_set.end() != itr) + { + symbol_list.push_back(*itr); + ++itr; + } + + return true; + } + + template class Sequence> + inline bool collect_functions(const std::string& expression, + Sequence& symbol_list) + { + typedef double T; + typedef details::collector_helper collect_t; + + collect_t::symbol_table_t null_symbol_table; + + std::set symbol_set; + + const bool variable_pass = collect_t::collection_pass + (expression, symbol_set, false, true, false, null_symbol_table); + const bool vector_pass = collect_t::collection_pass + (expression, symbol_set, false, true, true, null_symbol_table); + + if (!variable_pass && !vector_pass) + return false; + + std::set::iterator itr = symbol_set.begin(); + + while (symbol_set.end() != itr) + { + symbol_list.push_back(*itr); + ++itr; + } + + return true; + } + + template class Sequence> + inline bool collect_functions(const std::string& expression, + exprtk::symbol_table& extrnl_symbol_table, + Sequence& symbol_list) + { + typedef details::collector_helper collect_t; + + std::set symbol_set; + + const bool variable_pass = collect_t::collection_pass + (expression, symbol_set, false, true, false, extrnl_symbol_table); + const bool vector_pass = collect_t::collection_pass + (expression, symbol_set, false, true, true, extrnl_symbol_table); + + if (!variable_pass && !vector_pass) + return false; + + std::set::iterator itr = symbol_set.begin(); + + while (symbol_set.end() != itr) + { + symbol_list.push_back(*itr); + ++itr; + } + + return true; + } + + template + inline T integrate(const expression& e, + T& x, + const T& r0, const T& r1, + const std::size_t number_of_intervals = 1000000) + { + if (r0 > r1) + return T(0); + + const T h = (r1 - r0) / (T(2) * number_of_intervals); + T total_area = T(0); + + for (std::size_t i = 0; i < number_of_intervals; ++i) + { + x = r0 + T(2) * i * h; + const T y0 = e.value(); x += h; + const T y1 = e.value(); x += h; + const T y2 = e.value(); x += h; + total_area += h * (y0 + T(4) * y1 + y2) / T(3); + } + + return total_area; + } + + template + inline T integrate(const expression& e, + const std::string& variable_name, + const T& r0, const T& r1, + const std::size_t number_of_intervals = 1000000) + { + const symbol_table& sym_table = e.get_symbol_table(); + + if (!sym_table.valid()) + return std::numeric_limits::quiet_NaN(); + + details::variable_node* var = sym_table.get_variable(variable_name); + + if (var) + { + T& x = var->ref(); + const T x_original = x; + const T result = integrate(e, x, r0, r1, number_of_intervals); + x = x_original; + + return result; + } + else + return std::numeric_limits::quiet_NaN(); + } + + template + inline T derivative(const expression& e, + T& x, + const T& h = T(0.00000001)) + { + const T x_init = x; + const T _2h = T(2) * h; + + x = x_init + _2h; + const T y0 = e.value(); + x = x_init + h; + const T y1 = e.value(); + x = x_init - h; + const T y2 = e.value(); + x = x_init - _2h; + const T y3 = e.value(); + x = x_init; + + return (-y0 + T(8) * (y1 - y2) + y3) / (T(12) * h); + } + + template + inline T second_derivative(const expression& e, + T& x, + const T& h = T(0.00001)) + { + const T x_init = x; + const T _2h = T(2) * h; + + const T y = e.value(); + x = x_init + _2h; + const T y0 = e.value(); + x = x_init + h; + const T y1 = e.value(); + x = x_init - h; + const T y2 = e.value(); + x = x_init - _2h; + const T y3 = e.value(); + x = x_init; + + return (-y0 + T(16) * (y1 + y2) - T(30) * y - y3) / (T(12) * h * h); + } + + template + inline T third_derivative(const expression& e, + T& x, + const T& h = T(0.0001)) + { + const T x_init = x; + const T _2h = T(2) * h; + + x = x_init + _2h; + const T y0 = e.value(); + x = x_init + h; + const T y1 = e.value(); + x = x_init - h; + const T y2 = e.value(); + x = x_init - _2h; + const T y3 = e.value(); + x = x_init; + + return (y0 + T(2) * (y2 - y1) - y3) / (T(2) * h * h * h); + } + + template + inline T derivative(const expression& e, + const std::string& variable_name, + const T& h = T(0.00000001)) + { + const symbol_table& sym_table = e.get_symbol_table(); + + if (!sym_table.valid()) + { + return std::numeric_limits::quiet_NaN(); + } + + details::variable_node* var = sym_table.get_variable(variable_name); + + if (var) + { + T& x = var->ref(); + const T x_original = x; + const T result = derivative(e, x, h); + x = x_original; + + return result; + } + else + return std::numeric_limits::quiet_NaN(); + } + + template + inline T second_derivative(const expression& e, + const std::string& variable_name, + const T& h = T(0.00001)) + { + const symbol_table& sym_table = e.get_symbol_table(); + + if (!sym_table.valid()) + { + return std::numeric_limits::quiet_NaN(); + } + + details::variable_node* var = sym_table.get_variable(variable_name); + + if (var) + { + T& x = var->ref(); + const T x_original = x; + const T result = second_derivative(e, x, h); + x = x_original; + + return result; + } + else + return std::numeric_limits::quiet_NaN(); + } + + template + inline T third_derivative(const expression& e, + const std::string& variable_name, + const T& h = T(0.0001)) + { + const symbol_table& sym_table = e.get_symbol_table(); + + if (!sym_table.valid()) + { + return std::numeric_limits::quiet_NaN(); + } + + details::variable_node* var = sym_table.get_variable(variable_name); + + if (var) + { + T& x = var->ref(); + const T x_original = x; + const T result = third_derivative(e, x, h); + x = x_original; + + return result; + } + else + return std::numeric_limits::quiet_NaN(); + } + + /* + Note: The following 'compute' routines are simple helpers, + for quickly setting up the required pieces of code in order + to evaluate an expression. By virtue of how they operate + there will be an overhead with regards to their setup and + teardown and hence should not be used in time critical + sections of code. + Furthermore they only assume a small sub set of variables, + no string variables or user defined functions. + */ + template + inline bool compute(const std::string& expression_string, T& result) + { + // No variables + symbol_table symbol_table; + symbol_table.add_constants(); + + expression expression; + expression.register_symbol_table(symbol_table); + + parser parser; + + if (parser.compile(expression_string,expression)) + { + result = expression.value(); + + return true; + } + else + return false; + } + + template + inline bool compute(const std::string& expression_string, + const T& x, + T& result) + { + // Only 'x' + static const std::string x_var("x"); + + symbol_table symbol_table; + symbol_table.add_constants(); + symbol_table.add_constant(x_var,x); + + expression expression; + expression.register_symbol_table(symbol_table); + + parser parser; + + if (parser.compile(expression_string,expression)) + { + result = expression.value(); + + return true; + } + else + return false; + } + + template + inline bool compute(const std::string& expression_string, + const T&x, const T& y, + T& result) + { + // Only 'x' and 'y' + static const std::string x_var("x"); + static const std::string y_var("y"); + + symbol_table symbol_table; + symbol_table.add_constants(); + symbol_table.add_constant(x_var,x); + symbol_table.add_constant(y_var,y); + + expression expression; + expression.register_symbol_table(symbol_table); + + parser parser; + + if (parser.compile(expression_string,expression)) + { + result = expression.value(); + + return true; + } + else + return false; + } + + template + inline bool compute(const std::string& expression_string, + const T& x, const T& y, const T& z, + T& result) + { + // Only 'x', 'y' or 'z' + static const std::string x_var("x"); + static const std::string y_var("y"); + static const std::string z_var("z"); + + symbol_table symbol_table; + symbol_table.add_constants(); + symbol_table.add_constant(x_var,x); + symbol_table.add_constant(y_var,y); + symbol_table.add_constant(z_var,z); + + expression expression; + expression.register_symbol_table(symbol_table); + + parser parser; + + if (parser.compile(expression_string,expression)) + { + result = expression.value(); + + return true; + } + else + return false; + } + + template + class polynomial : public ifunction + { + private: + + template + struct poly_impl { }; + + template + struct poly_impl + { + static inline T evaluate(const Type x, + const Type c12, const Type c11, const Type c10, const Type c9, const Type c8, + const Type c7, const Type c6, const Type c5, const Type c4, const Type c3, + const Type c2, const Type c1, const Type c0) + { + // p(x) = c_12x^12 + c_11x^11 + c_10x^10 + c_9x^9 + c_8x^8 + c_7x^7 + c_6x^6 + c_5x^5 + c_4x^4 + c_3x^3 + c_2x^2 + c_1x^1 + c_0x^0 + return ((((((((((((c12 * x + c11) * x + c10) * x + c9) * x + c8) * x + c7) * x + c6) * x + c5) * x + c4) * x + c3) * x + c2) * x + c1) * x + c0); + } + }; + + template + struct poly_impl + { + static inline T evaluate(const Type x, + const Type c11, const Type c10, const Type c9, const Type c8, const Type c7, + const Type c6, const Type c5, const Type c4, const Type c3, const Type c2, + const Type c1, const Type c0) + { + // p(x) = c_11x^11 + c_10x^10 + c_9x^9 + c_8x^8 + c_7x^7 + c_6x^6 + c_5x^5 + c_4x^4 + c_3x^3 + c_2x^2 + c_1x^1 + c_0x^0 + return (((((((((((c11 * x + c10) * x + c9) * x + c8) * x + c7) * x + c6) * x + c5) * x + c4) * x + c3) * x + c2) * x + c1) * x + c0); + } + }; + + template + struct poly_impl + { + static inline T evaluate(const Type x, + const Type c10, const Type c9, const Type c8, const Type c7, const Type c6, + const Type c5, const Type c4, const Type c3, const Type c2, const Type c1, + const Type c0) + { + // p(x) = c_10x^10 + c_9x^9 + c_8x^8 + c_7x^7 + c_6x^6 + c_5x^5 + c_4x^4 + c_3x^3 + c_2x^2 + c_1x^1 + c_0x^0 + return ((((((((((c10 * x + c9) * x + c8) * x + c7) * x + c6) * x + c5) * x + c4) * x + c3) * x + c2) * x + c1) * x + c0); + } + }; + + template + struct poly_impl + { + static inline T evaluate(const Type x, + const Type c9, const Type c8, const Type c7, const Type c6, const Type c5, + const Type c4, const Type c3, const Type c2, const Type c1, const Type c0) + { + // p(x) = c_9x^9 + c_8x^8 + c_7x^7 + c_6x^6 + c_5x^5 + c_4x^4 + c_3x^3 + c_2x^2 + c_1x^1 + c_0x^0 + return (((((((((c9 * x + c8) * x + c7) * x + c6) * x + c5) * x + c4) * x + c3) * x + c2) * x + c1) * x + c0); + } + }; + + template + struct poly_impl + { + static inline T evaluate(const Type x, + const Type c8, const Type c7, const Type c6, const Type c5, const Type c4, + const Type c3, const Type c2, const Type c1, const Type c0) + { + // p(x) = c_8x^8 + c_7x^7 + c_6x^6 + c_5x^5 + c_4x^4 + c_3x^3 + c_2x^2 + c_1x^1 + c_0x^0 + return ((((((((c8 * x + c7) * x + c6) * x + c5) * x + c4) * x + c3) * x + c2) * x + c1) * x + c0); + } + }; + + template + struct poly_impl + { + static inline T evaluate(const Type x, + const Type c7, const Type c6, const Type c5, const Type c4, const Type c3, + const Type c2, const Type c1, const Type c0) + { + // p(x) = c_7x^7 + c_6x^6 + c_5x^5 + c_4x^4 + c_3x^3 + c_2x^2 + c_1x^1 + c_0x^0 + return (((((((c7 * x + c6) * x + c5) * x + c4) * x + c3) * x + c2) * x + c1) * x + c0); + } + }; + + template + struct poly_impl + { + static inline T evaluate(const Type x, + const Type c6, const Type c5, const Type c4, const Type c3, const Type c2, + const Type c1, const Type c0) + { + // p(x) = c_6x^6 + c_5x^5 + c_4x^4 + c_3x^3 + c_2x^2 + c_1x^1 + c_0x^0 + return ((((((c6 * x + c5) * x + c4) * x + c3) * x + c2) * x + c1) * x + c0); + } + }; + + template + struct poly_impl + { + static inline T evaluate(const Type x, + const Type c5, const Type c4, const Type c3, const Type c2, + const Type c1, const Type c0) + { + // p(x) = c_5x^5 + c_4x^4 + c_3x^3 + c_2x^2 + c_1x^1 + c_0x^0 + return (((((c5 * x + c4) * x + c3) * x + c2) * x + c1) * x + c0); + } + }; + + template + struct poly_impl + { + static inline T evaluate(const Type x, const Type c4, const Type c3, const Type c2, const Type c1, const Type c0) + { + // p(x) = c_4x^4 + c_3x^3 + c_2x^2 + c_1x^1 + c_0x^0 + return ((((c4 * x + c3) * x + c2) * x + c1) * x + c0); + } + }; + + template + struct poly_impl + { + static inline T evaluate(const Type x, const Type c3, const Type c2, const Type c1, const Type c0) + { + // p(x) = c_3x^3 + c_2x^2 + c_1x^1 + c_0x^0 + return (((c3 * x + c2) * x + c1) * x + c0); + } + }; + + template + struct poly_impl + { + static inline T evaluate(const Type x, const Type c2, const Type c1, const Type c0) + { + // p(x) = c_2x^2 + c_1x^1 + c_0x^0 + return ((c2 * x + c1) * x + c0); + } + }; + + template + struct poly_impl + { + static inline T evaluate(const Type x, const Type c1, const Type c0) + { + // p(x) = c_1x^1 + c_0x^0 + return (c1 * x + c0); + } + }; + + public: + + using ifunction::operator(); + + polynomial() + : ifunction((N+2 <= 20) ? (N + 2) : std::numeric_limits::max()) + { + disable_has_side_effects(*this); + } + + virtual ~polynomial() {} + + #define poly_rtrn(NN) \ + return (NN != N) ? std::numeric_limits::quiet_NaN() : + + inline virtual T operator() (const T& x, const T& c1, const T& c0) + { + poly_rtrn(1) (poly_impl::evaluate(x, c1, c0)); + } + + inline virtual T operator() (const T& x, const T& c2, const T& c1, const T& c0) + { + poly_rtrn(2) (poly_impl::evaluate(x, c2, c1, c0)); + } + + inline virtual T operator() (const T& x, const T& c3, const T& c2, const T& c1, const T& c0) + { + poly_rtrn(3) (poly_impl::evaluate(x, c3, c2, c1, c0)); + } + + inline virtual T operator() (const T& x, const T& c4, const T& c3, const T& c2, const T& c1, + const T& c0) + { + poly_rtrn(4) (poly_impl::evaluate(x, c4, c3, c2, c1, c0)); + } + + inline virtual T operator() (const T& x, const T& c5, const T& c4, const T& c3, const T& c2, + const T& c1, const T& c0) + { + poly_rtrn(5) (poly_impl::evaluate(x, c5, c4, c3, c2, c1, c0)); + } + + inline virtual T operator() (const T& x, const T& c6, const T& c5, const T& c4, const T& c3, + const T& c2, const T& c1, const T& c0) + { + poly_rtrn(6) (poly_impl::evaluate(x, c6, c5, c4, c3, c2, c1, c0)); + } + + inline virtual T operator() (const T& x, const T& c7, const T& c6, const T& c5, const T& c4, + const T& c3, const T& c2, const T& c1, const T& c0) + { + poly_rtrn(7) (poly_impl::evaluate(x, c7, c6, c5, c4, c3, c2, c1, c0)); + } + + inline virtual T operator() (const T& x, const T& c8, const T& c7, const T& c6, const T& c5, + const T& c4, const T& c3, const T& c2, const T& c1, const T& c0) + { + poly_rtrn(8) (poly_impl::evaluate(x, c8, c7, c6, c5, c4, c3, c2, c1, c0)); + } + + inline virtual T operator() (const T& x, const T& c9, const T& c8, const T& c7, const T& c6, + const T& c5, const T& c4, const T& c3, const T& c2, const T& c1, + const T& c0) + { + poly_rtrn(9) (poly_impl::evaluate(x, c9, c8, c7, c6, c5, c4, c3, c2, c1, c0)); + } + + inline virtual T operator() (const T& x, const T& c10, const T& c9, const T& c8, const T& c7, + const T& c6, const T& c5, const T& c4, const T& c3, const T& c2, + const T& c1, const T& c0) + { + poly_rtrn(10) (poly_impl::evaluate(x, c10, c9, c8, c7, c6, c5, c4, c3, c2, c1, c0)); + } + + inline virtual T operator() (const T& x, const T& c11, const T& c10, const T& c9, const T& c8, + const T& c7, const T& c6, const T& c5, const T& c4, const T& c3, + const T& c2, const T& c1, const T& c0) + { + poly_rtrn(11) (poly_impl::evaluate(x, c11, c10, c9, c8, c7, c6, c5, c4, c3, c2, c1, c0)); + } + + inline virtual T operator() (const T& x, const T& c12, const T& c11, const T& c10, const T& c9, + const T& c8, const T& c7, const T& c6, const T& c5, const T& c4, + const T& c3, const T& c2, const T& c1, const T& c0) + { + poly_rtrn(12) (poly_impl::evaluate(x, c12, c11, c10, c9, c8, c7, c6, c5, c4, c3, c2, c1, c0)); + } + + #undef poly_rtrn + + inline virtual T operator() () + { + return std::numeric_limits::quiet_NaN(); + } + + inline virtual T operator() (const T&) + { + return std::numeric_limits::quiet_NaN(); + } + + inline virtual T operator() (const T&, const T&) + { + return std::numeric_limits::quiet_NaN(); + } + }; + + template + class function_compositor + { + public: + + typedef exprtk::expression expression_t; + typedef exprtk::symbol_table symbol_table_t; + typedef exprtk::parser parser_t; + typedef typename parser_t::settings_store settings_t; + + struct function + { + function() + {} + + function(const std::string& n) + : name_(n) + {} + + function(const std::string& name, + const std::string& expression) + : name_(name) + , expression_(expression) + {} + + function(const std::string& name, + const std::string& expression, + const std::string& v0) + : name_(name) + , expression_(expression) + { + v_.push_back(v0); + } + + function(const std::string& name, + const std::string& expression, + const std::string& v0, const std::string& v1) + : name_(name) + , expression_(expression) + { + v_.push_back(v0); v_.push_back(v1); + } + + function(const std::string& name, + const std::string& expression, + const std::string& v0, const std::string& v1, + const std::string& v2) + : name_(name) + , expression_(expression) + { + v_.push_back(v0); v_.push_back(v1); + v_.push_back(v2); + } + + function(const std::string& name, + const std::string& expression, + const std::string& v0, const std::string& v1, + const std::string& v2, const std::string& v3) + : name_(name) + , expression_(expression) + { + v_.push_back(v0); v_.push_back(v1); + v_.push_back(v2); v_.push_back(v3); + } + + function(const std::string& name, + const std::string& expression, + const std::string& v0, const std::string& v1, + const std::string& v2, const std::string& v3, + const std::string& v4) + : name_(name) + , expression_(expression) + { + v_.push_back(v0); v_.push_back(v1); + v_.push_back(v2); v_.push_back(v3); + v_.push_back(v4); + } + + inline function& name(const std::string& n) + { + name_ = n; + return (*this); + } + + inline function& expression(const std::string& e) + { + expression_ = e; + return (*this); + } + + inline function& var(const std::string& v) + { + v_.push_back(v); + return (*this); + } + + std::string name_; + std::string expression_; + std::deque v_; + }; + + private: + + struct base_func : public exprtk::ifunction + { + typedef const T& type; + typedef exprtk::ifunction function_t; + typedef std::vector varref_t; + typedef std::vector var_t; + typedef std::pair lvarref_t; + typedef std::vector lvr_vec_t; + + using exprtk::ifunction::operator(); + + base_func(const std::size_t& pc = 0) + : exprtk::ifunction(pc) + , local_var_stack_size(0) + , stack_depth(0) + { + v.resize(pc); + } + + virtual ~base_func() {} + + #define exprtk_assign(Index) \ + (*v[Index]) = v##Index; \ + + inline void update(const T& v0) + { + exprtk_assign(0) + } + + inline void update(const T& v0, const T& v1) + { + exprtk_assign(0) exprtk_assign(1) + } + + inline void update(const T& v0, const T& v1, const T& v2) + { + exprtk_assign(0) exprtk_assign(1) + exprtk_assign(2) + } + + inline void update(const T& v0, const T& v1, const T& v2, const T& v3) + { + exprtk_assign(0) exprtk_assign(1) + exprtk_assign(2) exprtk_assign(3) + } + + inline void update(const T& v0, const T& v1, const T& v2, const T& v3, const T& v4) + { + exprtk_assign(0) exprtk_assign(1) + exprtk_assign(2) exprtk_assign(3) + exprtk_assign(4) + } + + inline void update(const T& v0, const T& v1, const T& v2, const T& v3, const T& v4, const T& v5) + { + exprtk_assign(0) exprtk_assign(1) + exprtk_assign(2) exprtk_assign(3) + exprtk_assign(4) exprtk_assign(5) + } + + #ifdef exprtk_assign + #undef exprtk_assign + #endif + + inline function_t& setup(expression_t& expr) + { + expression = expr; + + typedef typename expression_t::control_block::local_data_list_t ldl_t; + + const ldl_t ldl = expr.local_data_list(); + + std::vector index_list; + + for (std::size_t i = 0; i < ldl.size(); ++i) + { + if (ldl[i].size) + { + index_list.push_back(i); + } + } + + std::size_t input_param_count = 0; + + for (std::size_t i = 0; i < index_list.size(); ++i) + { + const std::size_t index = index_list[i]; + + if (i < (index_list.size() - v.size())) + { + lv.push_back( + std::make_pair( + reinterpret_cast(ldl[index].pointer), + ldl[index].size)); + + local_var_stack_size += ldl[index].size; + } + else + v[input_param_count++] = reinterpret_cast(ldl[index].pointer); + } + + clear_stack(); + + return (*this); + } + + inline void pre() + { + if (stack_depth++) + { + if (!v.empty()) + { + var_t var_stack(v.size(),T(0)); + copy(v,var_stack); + param_stack.push_back(var_stack); + } + + if (!lv.empty()) + { + var_t local_var_stack(local_var_stack_size,T(0)); + copy(lv,local_var_stack); + local_stack.push_back(local_var_stack); + } + } + } + + inline void post() + { + if (--stack_depth) + { + if (!v.empty()) + { + copy(param_stack.back(),v); + param_stack.pop_back(); + } + + if (!lv.empty()) + { + copy(local_stack.back(),lv); + local_stack.pop_back(); + } + } + } + + void copy(const varref_t& src_v, var_t& dest_v) + { + for (std::size_t i = 0; i < src_v.size(); ++i) + { + dest_v[i] = (*src_v[i]); + } + } + + void copy(const var_t& src_v, varref_t& dest_v) + { + for (std::size_t i = 0; i < src_v.size(); ++i) + { + (*dest_v[i]) = src_v[i]; + } + } + + void copy(const lvr_vec_t& src_v, var_t& dest_v) + { + typename var_t::iterator itr = dest_v.begin(); + typedef typename std::iterator_traits::difference_type diff_t; + + for (std::size_t i = 0; i < src_v.size(); ++i) + { + lvarref_t vr = src_v[i]; + + if (1 == vr.second) + *itr++ = (*vr.first); + else + { + std::copy(vr.first, vr.first + vr.second, itr); + itr += static_cast(vr.second); + } + } + } + + void copy(const var_t& src_v, lvr_vec_t& dest_v) + { + typename var_t::const_iterator itr = src_v.begin(); + typedef typename std::iterator_traits::difference_type diff_t; + + for (std::size_t i = 0; i < src_v.size(); ++i) + { + lvarref_t vr = dest_v[i]; + + if (1 == vr.second) + (*vr.first) = *itr++; + else + { + std::copy(itr, itr + static_cast(vr.second), vr.first); + itr += static_cast(vr.second); + } + } + } + + inline void clear_stack() + { + for (std::size_t i = 0; i < v.size(); ++i) + { + (*v[i]) = 0; + } + } + + inline virtual T value(expression_t& e) + { + return e.value(); + } + + expression_t expression; + varref_t v; + lvr_vec_t lv; + std::size_t local_var_stack_size; + std::size_t stack_depth; + std::deque param_stack; + std::deque local_stack; + }; + + typedef std::map funcparam_t; + + struct func_0param : public base_func + { + using exprtk::ifunction::operator(); + + func_0param() : base_func(0) {} + + inline T operator() () + { + return this->value(base_func::expression); + } + }; + + typedef const T& type; + + template + struct scoped_bft + { + explicit scoped_bft(BaseFuncType& bft) + : bft_(bft) + { + bft_.pre (); + } + + ~scoped_bft() + { + bft_.post(); + } + + BaseFuncType& bft_; + + private: + + scoped_bft(const scoped_bft&) exprtk_delete; + scoped_bft& operator=(const scoped_bft&) exprtk_delete; + }; + + struct func_1param : public base_func + { + using exprtk::ifunction::operator(); + + func_1param() : base_func(1) {} + + inline T operator() (type v0) + { + scoped_bft sb(*this); + base_func::update(v0); + return this->value(base_func::expression); + } + }; + + struct func_2param : public base_func + { + using exprtk::ifunction::operator(); + + func_2param() : base_func(2) {} + + inline T operator() (type v0, type v1) + { + scoped_bft sb(*this); + base_func::update(v0, v1); + return this->value(base_func::expression); + } + }; + + struct func_3param : public base_func + { + using exprtk::ifunction::operator(); + + func_3param() : base_func(3) {} + + inline T operator() (type v0, type v1, type v2) + { + scoped_bft sb(*this); + base_func::update(v0, v1, v2); + return this->value(base_func::expression); + } + }; + + struct func_4param : public base_func + { + using exprtk::ifunction::operator(); + + func_4param() : base_func(4) {} + + inline T operator() (type v0, type v1, type v2, type v3) + { + scoped_bft sb(*this); + base_func::update(v0, v1, v2, v3); + return this->value(base_func::expression); + } + }; + + struct func_5param : public base_func + { + using exprtk::ifunction::operator(); + + func_5param() : base_func(5) {} + + inline T operator() (type v0, type v1, type v2, type v3, type v4) + { + scoped_bft sb(*this); + base_func::update(v0, v1, v2, v3, v4); + return this->value(base_func::expression); + } + }; + + struct func_6param : public base_func + { + using exprtk::ifunction::operator(); + + func_6param() : base_func(6) {} + + inline T operator() (type v0, type v1, type v2, type v3, type v4, type v5) + { + scoped_bft sb(*this); + base_func::update(v0, v1, v2, v3, v4, v5); + return this->value(base_func::expression); + } + }; + + static T return_value(expression_t& e) + { + typedef exprtk::results_context results_context_t; + typedef typename results_context_t::type_store_t type_t; + typedef typename type_t::scalar_view scalar_t; + + const T result = e.value(); + + if (e.return_invoked()) + { + // Due to the post compilation checks, it can be safely + // assumed that there will be at least one parameter + // and that the first parameter will always be scalar. + return scalar_t(e.results()[0])(); + } + + return result; + } + + #define def_fp_retval(N) \ + struct func_##N##param_retval : public func_##N##param \ + { \ + inline T value(expression_t& e) \ + { \ + return return_value(e); \ + } \ + }; \ + + def_fp_retval(0) + def_fp_retval(1) + def_fp_retval(2) + def_fp_retval(3) + def_fp_retval(4) + def_fp_retval(5) + def_fp_retval(6) + + template class Sequence> + inline bool add(const std::string& name, + const std::string& expression, + const Sequence& var_list, + const bool override = false) + { + const typename std::map::iterator itr = expr_map_.find(name); + + if (expr_map_.end() != itr) + { + if (!override) + { + exprtk_debug(("Compositor error(add): function '%s' already defined\n", + name.c_str())); + + return false; + } + + remove(name, var_list.size()); + } + + if (compile_expression(name, expression, var_list)) + { + const std::size_t n = var_list.size(); + + fp_map_[n][name]->setup(expr_map_[name]); + + return true; + } + else + { + exprtk_debug(("Compositor error(add): Failed to compile function '%s'\n", + name.c_str())); + + return false; + } + } + + public: + + function_compositor() + : parser_(settings_t::compile_all_opts + + settings_t::e_disable_zero_return) + , fp_map_(7) + {} + + function_compositor(const symbol_table_t& st) + : symbol_table_(st) + , parser_(settings_t::compile_all_opts + + settings_t::e_disable_zero_return) + , fp_map_(7) + {} + + ~function_compositor() + { + clear(); + } + + inline symbol_table_t& symbol_table() + { + return symbol_table_; + } + + inline const symbol_table_t& symbol_table() const + { + return symbol_table_; + } + + inline void add_auxiliary_symtab(symbol_table_t& symtab) + { + auxiliary_symtab_list_.push_back(&symtab); + } + + void clear() + { + symbol_table_.clear(); + expr_map_ .clear(); + + for (std::size_t i = 0; i < fp_map_.size(); ++i) + { + typename funcparam_t::iterator itr = fp_map_[i].begin(); + typename funcparam_t::iterator end = fp_map_[i].end (); + + while (itr != end) + { + delete itr->second; + ++itr; + } + + fp_map_[i].clear(); + } + } + + inline bool add(const function& f, const bool override = false) + { + return add(f.name_, f.expression_, f.v_,override); + } + + private: + + template class Sequence> + bool compile_expression(const std::string& name, + const std::string& expression, + const Sequence& input_var_list, + bool return_present = false) + { + expression_t compiled_expression; + symbol_table_t local_symbol_table; + + local_symbol_table.load_from(symbol_table_); + local_symbol_table.add_constants(); + + if (!valid(name,input_var_list.size())) + return false; + + if (!forward(name, + input_var_list.size(), + local_symbol_table, + return_present)) + return false; + + compiled_expression.register_symbol_table(local_symbol_table); + + for (std::size_t i = 0; i < auxiliary_symtab_list_.size(); ++i) + { + compiled_expression.register_symbol_table((*auxiliary_symtab_list_[i])); + } + + std::string mod_expression; + + for (std::size_t i = 0; i < input_var_list.size(); ++i) + { + mod_expression += " var " + input_var_list[i] + "{};\n"; + } + + if ( + ('{' == details::front(expression)) && + ('}' == details::back (expression)) + ) + mod_expression += "~" + expression + ";"; + else + mod_expression += "~{" + expression + "};"; + + if (!parser_.compile(mod_expression,compiled_expression)) + { + exprtk_debug(("Compositor Error: %s\n",parser_.error().c_str())); + exprtk_debug(("Compositor modified expression: \n%s\n",mod_expression.c_str())); + + remove(name,input_var_list.size()); + + return false; + } + + if (!return_present && parser_.dec().return_present()) + { + remove(name,input_var_list.size()); + + return compile_expression(name, expression, input_var_list, true); + } + + // Make sure every return point has a scalar as its first parameter + if (parser_.dec().return_present()) + { + typedef std::vector str_list_t; + + str_list_t ret_param_list = parser_.dec().return_param_type_list(); + + for (std::size_t i = 0; i < ret_param_list.size(); ++i) + { + const std::string& params = ret_param_list[i]; + + if (params.empty() || ('T' != params[0])) + { + exprtk_debug(("Compositor Error: Return statement in function '%s' is invalid\n", + name.c_str())); + + remove(name,input_var_list.size()); + + return false; + } + } + } + + expr_map_[name] = compiled_expression; + + exprtk::ifunction& ifunc = (*(fp_map_[input_var_list.size()])[name]); + + if (symbol_table_.add_function(name,ifunc)) + return true; + else + { + exprtk_debug(("Compositor Error: Failed to add function '%s' to symbol table\n", + name.c_str())); + return false; + } + } + + inline bool symbol_used(const std::string& symbol) const + { + return ( + symbol_table_.is_variable (symbol) || + symbol_table_.is_stringvar (symbol) || + symbol_table_.is_function (symbol) || + symbol_table_.is_vector (symbol) || + symbol_table_.is_vararg_function(symbol) + ); + } + + inline bool valid(const std::string& name, + const std::size_t& arg_count) const + { + if (arg_count > 6) + return false; + else if (symbol_used(name)) + return false; + else if (fp_map_[arg_count].end() != fp_map_[arg_count].find(name)) + return false; + else + return true; + } + + inline bool forward(const std::string& name, + const std::size_t& arg_count, + symbol_table_t& sym_table, + const bool ret_present = false) + { + switch (arg_count) + { + #define case_stmt(N) \ + case N : (fp_map_[arg_count])[name] = \ + (!ret_present) ? static_cast \ + (new func_##N##param) : \ + static_cast \ + (new func_##N##param_retval) ; \ + break; \ + + case_stmt(0) case_stmt(1) case_stmt(2) + case_stmt(3) case_stmt(4) case_stmt(5) + case_stmt(6) + #undef case_stmt + } + + exprtk::ifunction& ifunc = (*(fp_map_[arg_count])[name]); + + return sym_table.add_function(name,ifunc); + } + + inline void remove(const std::string& name, const std::size_t& arg_count) + { + if (arg_count > 6) + return; + + const typename std::map::iterator em_itr = expr_map_.find(name); + + if (expr_map_.end() != em_itr) + { + expr_map_.erase(em_itr); + } + + const typename funcparam_t::iterator fp_itr = fp_map_[arg_count].find(name); + + if (fp_map_[arg_count].end() != fp_itr) + { + delete fp_itr->second; + fp_map_[arg_count].erase(fp_itr); + } + + symbol_table_.remove_function(name); + } + + private: + + symbol_table_t symbol_table_; + parser_t parser_; + std::map expr_map_; + std::vector fp_map_; + std::vector auxiliary_symtab_list_; + }; // class function_compositor + + template + inline bool pgo_primer() + { + static const std::string expression_list[] = + { + "(y + x)", + "2 * (y + x)", + "(2 * y + 2 * x)", + "(y + x / y) * (x - y / x)", + "x / ((x + y) * (x - y)) / y", + "1 - ((x * y) + (y / x)) - 3", + "sin(2 * x) + cos(pi / y)", + "1 - sin(2 * x) + cos(pi / y)", + "sqrt(1 - sin(2 * x) + cos(pi / y) / 3)", + "(x^2 / sin(2 * pi / y)) -x / 2", + "x + (cos(y - sin(2 / x * pi)) - sin(x - cos(2 * y / pi))) - y", + "clamp(-1.0, sin(2 * pi * x) + cos(y / 2 * pi), +1.0)", + "iclamp(-1.0, sin(2 * pi * x) + cos(y / 2 * pi), +1.0)", + "max(3.33, min(sqrt(1 - sin(2 * x) + cos(pi / y) / 3), 1.11))", + "if(avg(x,y) <= x + y, x - y, x * y) + 2 * pi / x", + "1.1x^1 + 2.2y^2 - 3.3x^3 + 4.4y^4 - 5.5x^5 + 6.6y^6 - 7.7x^27 + 8.8y^55", + "(yy + xx)", + "2 * (yy + xx)", + "(2 * yy + 2 * xx)", + "(yy + xx / yy) * (xx - yy / xx)", + "xx / ((xx + yy) * (xx - yy)) / yy", + "1 - ((xx * yy) + (yy / xx)) - 3", + "sin(2 * xx) + cos(pi / yy)", + "1 - sin(2 * xx) + cos(pi / yy)", + "sqrt(1 - sin(2 * xx) + cos(pi / yy) / 3)", + "(xx^2 / sin(2 * pi / yy)) -xx / 2", + "xx + (cos(yy - sin(2 / xx * pi)) - sin(xx - cos(2 * yy / pi))) - yy", + "clamp(-1.0, sin(2 * pi * xx) + cos(yy / 2 * pi), +1.0)", + "max(3.33, min(sqrt(1 - sin(2 * xx) + cos(pi / yy) / 3), 1.11))", + "if(avg(xx,yy) <= xx + yy, xx - yy, xx * yy) + 2 * pi / xx", + "1.1xx^1 + 2.2yy^2 - 3.3xx^3 + 4.4yy^4 - 5.5xx^5 + 6.6yy^6 - 7.7xx^27 + 8.8yy^55", + "(1.1*(2.2*(3.3*(4.4*(5.5*(6.6*(7.7*(8.8*(9.9+x)))))))))", + "(((((((((x+9.9)*8.8)*7.7)*6.6)*5.5)*4.4)*3.3)*2.2)*1.1)", + "(x + y) * z", "x + (y * z)", "(x + y) * 7", "x + (y * 7)", + "(x + 7) * y", "x + (7 * y)", "(7 + x) * y", "7 + (x * y)", + "(2 + x) * 3", "2 + (x * 3)", "(2 + 3) * x", "2 + (3 * x)", + "(x + 2) * 3", "x + (2 * 3)", + "(x + y) * (z / w)", "(x + y) * (z / 7)", "(x + y) * (7 / z)", "(x + 7) * (y / z)", + "(7 + x) * (y / z)", "(2 + x) * (y / z)", "(x + 2) * (y / 3)", "(2 + x) * (y / 3)", + "(x + 2) * (3 / y)", "x + (y * (z / w))", "x + (y * (z / 7))", "x + (y * (7 / z))", + "x + (7 * (y / z))", "7 + (x * (y / z))", "2 + (x * (3 / y))", "x + (2 * (y / 4))", + "2 + (x * (y / 3))", "x + (2 * (3 / y))", + "x + ((y * z) / w)", "x + ((y * z) / 7)", "x + ((y * 7) / z)", "x + ((7 * y) / z)", + "7 + ((y * z) / w)", "2 + ((x * 3) / y)", "x + ((2 * y) / 3)", "2 + ((x * y) / 3)", + "x + ((2 * 3) / y)", "(((x + y) * z) / w)", + "(((x + y) * z) / 7)", "(((x + y) * 7) / z)", "(((x + 7) * y) / z)", "(((7 + x) * y) / z)", + "(((2 + x) * 3) / y)", "(((x + 2) * y) / 3)", "(((2 + x) * y) / 3)", "(((x + 2) * 3) / y)", + "((x + (y * z)) / w)", "((x + (y * z)) / 7)", "((x + (y * 7)) / y)", "((x + (7 * y)) / z)", + "((7 + (x * y)) / z)", "((2 + (x * 3)) / y)", "((x + (2 * y)) / 3)", "((2 + (x * y)) / 3)", + "((x + (2 * 3)) / y)", + "(xx + yy) * zz", "xx + (yy * zz)", + "(xx + yy) * 7", "xx + (yy * 7)", + "(xx + 7) * yy", "xx + (7 * yy)", + "(7 + xx) * yy", "7 + (xx * yy)", + "(2 + x) * 3", "2 + (x * 3)", + "(2 + 3) * x", "2 + (3 * x)", + "(x + 2) * 3", "x + (2 * 3)", + "(xx + yy) * (zz / ww)", "(xx + yy) * (zz / 7)", + "(xx + yy) * (7 / zz)", "(xx + 7) * (yy / zz)", + "(7 + xx) * (yy / zz)", "(2 + xx) * (yy / zz)", + "(xx + 2) * (yy / 3)", "(2 + xx) * (yy / 3)", + "(xx + 2) * (3 / yy)", "xx + (yy * (zz / ww))", + "xx + (yy * (zz / 7))", "xx + (yy * (7 / zz))", + "xx + (7 * (yy / zz))", "7 + (xx * (yy / zz))", + "2 + (xx * (3 / yy))", "xx + (2 * (yy / 4))", + "2 + (xx * (yy / 3))", "xx + (2 * (3 / yy))", + "xx + ((yy * zz) / ww)", "xx + ((yy * zz) / 7)", + "xx + ((yy * 7) / zz)", "xx + ((7 * yy) / zz)", + "7 + ((yy * zz) / ww)", "2 + ((xx * 3) / yy)", + "xx + ((2 * yy) / 3)", "2 + ((xx * yy) / 3)", + "xx + ((2 * 3) / yy)", "(((xx + yy) * zz) / ww)", + "(((xx + yy) * zz) / 7)", "(((xx + yy) * 7) / zz)", + "(((xx + 7) * yy) / zz)", "(((7 + xx) * yy) / zz)", + "(((2 + xx) * 3) / yy)", "(((xx + 2) * yy) / 3)", + "(((2 + xx) * yy) / 3)", "(((xx + 2) * 3) / yy)", + "((xx + (yy * zz)) / ww)", "((xx + (yy * zz)) / 7)", + "((xx + (yy * 7)) / yy)", "((xx + (7 * yy)) / zz)", + "((7 + (xx * yy)) / zz)", "((2 + (xx * 3)) / yy)", + "((xx + (2 * yy)) / 3)", "((2 + (xx * yy)) / 3)", + "((xx + (2 * 3)) / yy)" + }; + + static const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string); + + T x = T(0); + T y = T(0); + T z = T(0); + T w = T(0); + T xx = T(0); + T yy = T(0); + T zz = T(0); + T ww = T(0); + + exprtk::symbol_table symbol_table; + symbol_table.add_constants(); + symbol_table.add_variable( "x", x); + symbol_table.add_variable( "y", y); + symbol_table.add_variable( "z", z); + symbol_table.add_variable( "w", w); + symbol_table.add_variable("xx",xx); + symbol_table.add_variable("yy",yy); + symbol_table.add_variable("zz",zz); + symbol_table.add_variable("ww",ww); + + typedef typename std::deque > expr_list_t; + expr_list_t expr_list; + + const std::size_t rounds = 50; + + { + for (std::size_t r = 0; r < rounds; ++r) + { + expr_list.clear(); + exprtk::parser parser; + + for (std::size_t i = 0; i < expression_list_size; ++i) + { + exprtk::expression expression; + expression.register_symbol_table(symbol_table); + + if (!parser.compile(expression_list[i],expression)) + { + return false; + } + + expr_list.push_back(expression); + } + } + } + + struct execute + { + static inline T process(T& x, T& y, expression& expression) + { + static const T lower_bound = T(-20); + static const T upper_bound = T(+20); + static const T delta = T(0.1); + + T total = T(0); + + for (x = lower_bound; x <= upper_bound; x += delta) + { + for (y = lower_bound; y <= upper_bound; y += delta) + { + total += expression.value(); + } + } + + return total; + } + }; + + for (std::size_t i = 0; i < expr_list.size(); ++i) + { + execute::process( x, y, expr_list[i]); + execute::process(xx, yy, expr_list[i]); + } + + { + for (std::size_t i = 0; i < 10000; ++i) + { + const T v = T(123.456 + i); + + if (details::is_true(details::numeric::nequal(details::numeric::fast_exp::result(v),details::numeric::pow(v,T(1))))) + return false; + + #define else_stmt(N) \ + else if (details::is_true(details::numeric::nequal(details::numeric::fast_exp::result(v),details::numeric::pow(v,T(N))))) \ + return false; \ + + else_stmt( 2) else_stmt( 3) else_stmt( 4) else_stmt( 5) + else_stmt( 6) else_stmt( 7) else_stmt( 8) else_stmt( 9) + else_stmt(10) else_stmt(11) else_stmt(12) else_stmt(13) + else_stmt(14) else_stmt(15) else_stmt(16) else_stmt(17) + else_stmt(18) else_stmt(19) else_stmt(20) else_stmt(21) + else_stmt(22) else_stmt(23) else_stmt(24) else_stmt(25) + else_stmt(26) else_stmt(27) else_stmt(28) else_stmt(29) + else_stmt(30) else_stmt(31) else_stmt(32) else_stmt(33) + else_stmt(34) else_stmt(35) else_stmt(36) else_stmt(37) + else_stmt(38) else_stmt(39) else_stmt(40) else_stmt(41) + else_stmt(42) else_stmt(43) else_stmt(44) else_stmt(45) + else_stmt(46) else_stmt(47) else_stmt(48) else_stmt(49) + else_stmt(50) else_stmt(51) else_stmt(52) else_stmt(53) + else_stmt(54) else_stmt(55) else_stmt(56) else_stmt(57) + else_stmt(58) else_stmt(59) else_stmt(60) else_stmt(61) + } + } + + return true; + } +} + +#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# ifndef NOMINMAX +# define NOMINMAX +# endif +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +# endif +# include +# include +#else +# include +# include +# include +#endif + +namespace exprtk +{ + class timer + { + public: + + #if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) + timer() + : in_use_(false) + { + QueryPerformanceFrequency(&clock_frequency_); + } + + inline void start() + { + in_use_ = true; + QueryPerformanceCounter(&start_time_); + } + + inline void stop() + { + QueryPerformanceCounter(&stop_time_); + in_use_ = false; + } + + inline double time() const + { + return (1.0 * (stop_time_.QuadPart - start_time_.QuadPart)) / (1.0 * clock_frequency_.QuadPart); + } + + #else + + timer() + : in_use_(false) + { + start_time_.tv_sec = 0; + start_time_.tv_usec = 0; + + stop_time_.tv_sec = 0; + stop_time_.tv_usec = 0; + } + + inline void start() + { + in_use_ = true; + gettimeofday(&start_time_,0); + } + + inline void stop() + { + gettimeofday(&stop_time_, 0); + in_use_ = false; + } + + inline unsigned long long int usec_time() const + { + if (!in_use_) + { + if (stop_time_.tv_sec >= start_time_.tv_sec) + { + return 1000000LLU * static_cast(stop_time_.tv_sec - start_time_.tv_sec ) + + static_cast(stop_time_.tv_usec - start_time_.tv_usec) ; + } + else + return std::numeric_limits::max(); + } + else + return std::numeric_limits::max(); + } + + inline double time() const + { + return usec_time() * 0.000001; + } + + #endif + + inline bool in_use() const + { + return in_use_; + } + + private: + + bool in_use_; + + #if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) + LARGE_INTEGER start_time_; + LARGE_INTEGER stop_time_; + LARGE_INTEGER clock_frequency_; + #else + struct timeval start_time_; + struct timeval stop_time_; + #endif + }; + + template + struct type_defs + { + typedef symbol_table symbol_table_t; + typedef expression expression_t; + typedef parser parser_t; + typedef parser_error::type error_t; + typedef function_compositor compositor_t; + typedef typename compositor_t::function function_t; + }; + +} // namespace exprtk + +#ifndef exprtk_disable_rtl_io +namespace exprtk +{ + namespace rtl { namespace io { namespace details + { + template + inline void print_type(const std::string& fmt, + const T v, + exprtk::details::numeric::details::real_type_tag) + { + printf(fmt.c_str(),v); + } + + template + struct print_impl + { + typedef typename igeneric_function::generic_type generic_type; + typedef typename igeneric_function::parameter_list_t parameter_list_t; + typedef typename generic_type::scalar_view scalar_t; + typedef typename generic_type::vector_view vector_t; + typedef typename generic_type::string_view string_t; + typedef typename exprtk::details::numeric::details::number_type::type num_type; + + static void process(const std::string& scalar_format, parameter_list_t parameters) + { + for (std::size_t i = 0; i < parameters.size(); ++i) + { + generic_type& gt = parameters[i]; + + switch (gt.type) + { + case generic_type::e_scalar : print(scalar_format,scalar_t(gt)); + break; + + case generic_type::e_vector : print(scalar_format,vector_t(gt)); + break; + + case generic_type::e_string : print(string_t(gt)); + break; + + default : continue; + } + } + } + + static inline void print(const std::string& scalar_format, const scalar_t& s) + { + print_type(scalar_format,s(),num_type()); + } + + static inline void print(const std::string& scalar_format, const vector_t& v) + { + for (std::size_t i = 0; i < v.size(); ++i) + { + print_type(scalar_format,v[i],num_type()); + + if ((i + 1) < v.size()) + printf(" "); + } + } + + static inline void print(const string_t& s) + { + printf("%s",to_str(s).c_str()); + } + }; + + } // namespace exprtk::rtl::io::details + + template + struct print : public exprtk::igeneric_function + { + typedef typename igeneric_function::parameter_list_t parameter_list_t; + + using exprtk::igeneric_function::operator(); + + print(const std::string& scalar_format = "%10.5f") + : scalar_format_(scalar_format) + { + exprtk::enable_zero_parameters(*this); + } + + inline T operator() (parameter_list_t parameters) + { + details::print_impl::process(scalar_format_,parameters); + return T(0); + } + + std::string scalar_format_; + }; + + template + struct println : public exprtk::igeneric_function + { + typedef typename igeneric_function::parameter_list_t parameter_list_t; + + using exprtk::igeneric_function::operator(); + + println(const std::string& scalar_format = "%10.5f") + : scalar_format_(scalar_format) + { + exprtk::enable_zero_parameters(*this); + } + + inline T operator() (parameter_list_t parameters) + { + details::print_impl::process(scalar_format_,parameters); + printf("\n"); + return T(0); + } + + std::string scalar_format_; + }; + + template + struct package + { + print p; + println pl; + + bool register_package(exprtk::symbol_table& symtab) + { + #define exprtk_register_function(FunctionName, FunctionType) \ + if (!symtab.add_function(FunctionName,FunctionType)) \ + { \ + exprtk_debug(( \ + "exprtk::rtl::io::register_package - Failed to add function: %s\n", \ + FunctionName)); \ + return false; \ + } \ + + exprtk_register_function("print" , p ) + exprtk_register_function("println", pl) + #undef exprtk_register_function + + return true; + } + }; + + } // namespace exprtk::rtl::io + } // namespace exprtk::rtl +} // namespace exprtk +#endif + +#ifndef exprtk_disable_rtl_io_file +#include +namespace exprtk +{ + namespace rtl { namespace io { namespace file { namespace details + { + using ::exprtk::details::char_ptr; + using ::exprtk::details::char_cptr; + + enum file_mode + { + e_error = 0, + e_read = 1, + e_write = 2, + e_rdwrt = 4 + }; + + struct file_descriptor + { + file_descriptor(const std::string& fname, const std::string& access) + : stream_ptr(0) + , mode(get_file_mode(access)) + , file_name(fname) + {} + + void* stream_ptr; + file_mode mode; + std::string file_name; + + bool open() + { + if (e_read == mode) + { + std::ifstream* stream = new std::ifstream(file_name.c_str(),std::ios::binary); + + if (!(*stream)) + { + file_name.clear(); + delete stream; + + return false; + } + else + stream_ptr = stream; + + return true; + } + else if (e_write == mode) + { + std::ofstream* stream = new std::ofstream(file_name.c_str(),std::ios::binary); + + if (!(*stream)) + { + file_name.clear(); + delete stream; + + return false; + } + else + stream_ptr = stream; + + return true; + } + else if (e_rdwrt == mode) + { + std::fstream* stream = new std::fstream(file_name.c_str(),std::ios::binary); + + if (!(*stream)) + { + file_name.clear(); + delete stream; + + return false; + } + else + stream_ptr = stream; + + return true; + } + else + return false; + } + + template + void close(Ptr& p) + { + Stream* stream = reinterpret_cast(p); + stream->close(); + delete stream; + p = reinterpret_cast(0); + } + + bool close() + { + switch (mode) + { + case e_read : close(stream_ptr); + break; + + case e_write : close(stream_ptr); + break; + + case e_rdwrt : close (stream_ptr); + break; + + default : return false; + } + + return true; + } + + template + bool write(const View& view, const std::size_t amount, const std::size_t offset = 0) + { + switch (mode) + { + case e_write : reinterpret_cast(stream_ptr)-> + write(reinterpret_cast(view.begin() + offset), amount * sizeof(typename View::value_t)); + break; + + case e_rdwrt : reinterpret_cast(stream_ptr)-> + write(reinterpret_cast(view.begin() + offset) , amount * sizeof(typename View::value_t)); + break; + + default : return false; + } + + return true; + } + + template + bool read(View& view, const std::size_t amount, const std::size_t offset = 0) + { + switch (mode) + { + case e_read : reinterpret_cast(stream_ptr)-> + read(reinterpret_cast(view.begin() + offset), amount * sizeof(typename View::value_t)); + break; + + case e_rdwrt : reinterpret_cast(stream_ptr)-> + read(reinterpret_cast(view.begin() + offset) , amount * sizeof(typename View::value_t)); + break; + + default : return false; + } + + return true; + } + + bool getline(std::string& s) + { + switch (mode) + { + case e_read : return (!!std::getline(*reinterpret_cast(stream_ptr),s)); + case e_rdwrt : return (!!std::getline(*reinterpret_cast(stream_ptr),s)); + default : return false; + } + } + + bool eof() const + { + switch (mode) + { + case e_read : return reinterpret_cast(stream_ptr)->eof(); + case e_write : return reinterpret_cast(stream_ptr)->eof(); + case e_rdwrt : return reinterpret_cast(stream_ptr)->eof(); + default : return true; + } + } + + file_mode get_file_mode(const std::string& access) const + { + if (access.empty() || access.size() > 2) + return e_error; + + std::size_t w_cnt = 0; + std::size_t r_cnt = 0; + + for (std::size_t i = 0; i < access.size(); ++i) + { + switch (std::tolower(access[i])) + { + case 'r' : r_cnt++; break; + case 'w' : w_cnt++; break; + default : return e_error; + } + } + + if ((0 == r_cnt) && (0 == w_cnt)) + return e_error; + else if ((r_cnt > 1) || (w_cnt > 1)) + return e_error; + else if ((1 == r_cnt) && (1 == w_cnt)) + return e_rdwrt; + else if (1 == r_cnt) + return e_read; + else + return e_write; + } + }; + + template + file_descriptor* make_handle(T v) + { + const std::size_t fd_size = sizeof(details::file_descriptor*); + details::file_descriptor* fd = reinterpret_cast(0); + + std::memcpy(reinterpret_cast(&fd), + reinterpret_cast(&v ), + fd_size); + return fd; + } + + template + void perform_check() + { + #ifdef _MSC_VER + #pragma warning(push) + #pragma warning(disable: 4127) + #endif + if (sizeof(T) < sizeof(void*)) + { + throw std::runtime_error("exprtk::rtl::io::file - Error - pointer size larger than holder."); + } + #ifdef _MSC_VER + #pragma warning(pop) + #endif + } + + } // namespace exprtk::rtl::io::file::details + + template + class open : public exprtk::igeneric_function + { + public: + + typedef typename exprtk::igeneric_function igfun_t; + typedef typename igfun_t::parameter_list_t parameter_list_t; + typedef typename igfun_t::generic_type generic_type; + typedef typename generic_type::string_view string_t; + + using exprtk::igeneric_function::operator(); + + open() + : exprtk::igeneric_function("S|SS") + { details::perform_check(); } + + inline T operator() (const std::size_t& ps_index, parameter_list_t parameters) + { + const std::string file_name = to_str(string_t(parameters[0])); + + if (file_name.empty()) + return T(0); + + if ((1 == ps_index) && (0 == string_t(parameters[1]).size())) + { + return T(0); + } + + const std::string access = + (0 == ps_index) ? "r" : to_str(string_t(parameters[1])); + + details::file_descriptor* fd = new details::file_descriptor(file_name,access); + + if (fd->open()) + { + T t = T(0); + + const std::size_t fd_size = sizeof(details::file_descriptor*); + + std::memcpy(reinterpret_cast(&t ), + reinterpret_cast(&fd), + fd_size); + return t; + } + else + { + delete fd; + return T(0); + } + } + }; + + template + struct close : public exprtk::ifunction + { + using exprtk::ifunction::operator(); + + close() + : exprtk::ifunction(1) + { details::perform_check(); } + + inline T operator() (const T& v) + { + details::file_descriptor* fd = details::make_handle(v); + + if (!fd->close()) + return T(0); + + delete fd; + + return T(1); + } + }; + + template + class write : public exprtk::igeneric_function + { + public: + + typedef typename exprtk::igeneric_function igfun_t; + typedef typename igfun_t::parameter_list_t parameter_list_t; + typedef typename igfun_t::generic_type generic_type; + typedef typename generic_type::string_view string_t; + typedef typename generic_type::scalar_view scalar_t; + typedef typename generic_type::vector_view vector_t; + + using exprtk::igeneric_function::operator(); + + write() + : igfun_t("TS|TST|TV|TVT") + { details::perform_check(); } + + inline T operator() (const std::size_t& ps_index, parameter_list_t parameters) + { + details::file_descriptor* fd = details::make_handle(scalar_t(parameters[0])()); + + switch (ps_index) + { + case 0 : { + const string_t buffer(parameters[1]); + const std::size_t amount = buffer.size(); + return T(fd->write(buffer, amount) ? 1 : 0); + } + + case 1 : { + const string_t buffer(parameters[1]); + const std::size_t amount = + std::min(buffer.size(), + static_cast(scalar_t(parameters[2])())); + return T(fd->write(buffer, amount) ? 1 : 0); + } + + case 2 : { + const vector_t vec(parameters[1]); + const std::size_t amount = vec.size(); + return T(fd->write(vec, amount) ? 1 : 0); + } + + case 3 : { + const vector_t vec(parameters[1]); + const std::size_t amount = + std::min(vec.size(), + static_cast(scalar_t(parameters[2])())); + return T(fd->write(vec, amount) ? 1 : 0); + } + } + + return T(0); + } + }; + + template + class read : public exprtk::igeneric_function + { + public: + + typedef typename exprtk::igeneric_function igfun_t; + typedef typename igfun_t::parameter_list_t parameter_list_t; + typedef typename igfun_t::generic_type generic_type; + typedef typename generic_type::string_view string_t; + typedef typename generic_type::scalar_view scalar_t; + typedef typename generic_type::vector_view vector_t; + + using exprtk::igeneric_function::operator(); + + read() + : igfun_t("TS|TST|TV|TVT") + { details::perform_check(); } + + inline T operator() (const std::size_t& ps_index, parameter_list_t parameters) + { + details::file_descriptor* fd = details::make_handle(scalar_t(parameters[0])()); + + switch (ps_index) + { + case 0 : { + string_t buffer(parameters[1]); + const std::size_t amount = buffer.size(); + return T(fd->read(buffer,amount) ? 1 : 0); + } + + case 1 : { + string_t buffer(parameters[1]); + const std::size_t amount = + std::min(buffer.size(), + static_cast(scalar_t(parameters[2])())); + return T(fd->read(buffer,amount) ? 1 : 0); + } + + case 2 : { + vector_t vec(parameters[1]); + const std::size_t amount = vec.size(); + return T(fd->read(vec,amount) ? 1 : 0); + } + + case 3 : { + vector_t vec(parameters[1]); + const std::size_t amount = + std::min(vec.size(), + static_cast(scalar_t(parameters[2])())); + return T(fd->read(vec,amount) ? 1 : 0); + } + } + + return T(0); + } + }; + + template + class getline : public exprtk::igeneric_function + { + public: + + typedef typename exprtk::igeneric_function igfun_t; + typedef typename igfun_t::parameter_list_t parameter_list_t; + typedef typename igfun_t::generic_type generic_type; + typedef typename generic_type::string_view string_t; + typedef typename generic_type::scalar_view scalar_t; + + using exprtk::igeneric_function::operator(); + + getline() + : igfun_t("T",igfun_t::e_rtrn_string) + { details::perform_check(); } + + inline T operator() (std::string& result, + parameter_list_t parameters) + { + details::file_descriptor* fd = details::make_handle(scalar_t(parameters[0])()); + return T(fd->getline(result) ? 1 : 0); + } + }; + + template + struct eof : public exprtk::ifunction + { + using exprtk::ifunction::operator(); + + eof() + : exprtk::ifunction(1) + { details::perform_check(); } + + inline T operator() (const T& v) + { + details::file_descriptor* fd = details::make_handle(v); + + return (fd->eof() ? T(1) : T(0)); + } + }; + + template + struct package + { + open o; + close c; + write w; + read r; + getline g; + eof e; + + bool register_package(exprtk::symbol_table& symtab) + { + #define exprtk_register_function(FunctionName, FunctionType) \ + if (!symtab.add_function(FunctionName,FunctionType)) \ + { \ + exprtk_debug(( \ + "exprtk::rtl::io::file::register_package - Failed to add function: %s\n", \ + FunctionName)); \ + return false; \ + } \ + + exprtk_register_function("open" , o) + exprtk_register_function("close" , c) + exprtk_register_function("write" , w) + exprtk_register_function("read" , r) + exprtk_register_function("getline" , g) + exprtk_register_function("eof" , e) + #undef exprtk_register_function + + return true; + } + }; + + } // namespace exprtk::rtl::io::file + } // namespace exprtk::rtl::io + } // namespace exprtk::rtl +} // namespace exprtk +#endif + +#ifndef exprtk_disable_rtl_vecops +namespace exprtk +{ + namespace rtl { namespace vecops { + + namespace helper + { + template + inline bool invalid_range(const Vector& v, const std::size_t r0, const std::size_t r1) + { + if (r0 > (v.size() - 1)) + return true; + else if (r1 > (v.size() - 1)) + return true; + else if (r1 < r0) + return true; + else + return false; + } + + template + struct load_vector_range + { + typedef typename exprtk::igeneric_function igfun_t; + typedef typename igfun_t::parameter_list_t parameter_list_t; + typedef typename igfun_t::generic_type generic_type; + typedef typename generic_type::scalar_view scalar_t; + typedef typename generic_type::vector_view vector_t; + + static inline bool process(parameter_list_t& parameters, + std::size_t& r0, std::size_t& r1, + const std::size_t& r0_prmidx, + const std::size_t& r1_prmidx, + const std::size_t vec_idx = 0) + { + if (r0_prmidx >= parameters.size()) + return false; + + if (r1_prmidx >= parameters.size()) + return false; + + if (!scalar_t(parameters[r0_prmidx]).to_uint(r0)) + return false; + + if (!scalar_t(parameters[r1_prmidx]).to_uint(r1)) + return false; + + return !invalid_range(vector_t(parameters[vec_idx]), r0, r1); + } + }; + } + + namespace details + { + template + inline void kahan_sum(T& sum, T& error, const T v) + { + const T x = v - error; + const T y = sum + x; + error = (y - sum) - x; + sum = y; + } + + } // namespace exprtk::rtl::details + + template + class all_true : public exprtk::igeneric_function + { + public: + + typedef typename exprtk::igeneric_function igfun_t; + typedef typename igfun_t::parameter_list_t parameter_list_t; + typedef typename igfun_t::generic_type generic_type; + typedef typename generic_type::vector_view vector_t; + + using exprtk::igeneric_function::operator(); + + all_true() + : exprtk::igeneric_function("V|VTT") + /* + Overloads: + 0. V - vector + 1. VTT - vector, r0, r1 + */ + {} + + inline T operator() (const std::size_t& ps_index, parameter_list_t parameters) + { + const vector_t vec(parameters[0]); + + std::size_t r0 = 0; + std::size_t r1 = vec.size() - 1; + + if ( + (1 == ps_index) && + !helper::load_vector_range::process(parameters, r0, r1, 1, 2, 0) + ) + return std::numeric_limits::quiet_NaN(); + + for (std::size_t i = r0; i <= r1; ++i) + { + if (vec[i] == T(0)) + { + return T(0); + } + } + + return T(1); + } + }; + + template + class all_false : public exprtk::igeneric_function + { + public: + + typedef typename exprtk::igeneric_function igfun_t; + typedef typename igfun_t::parameter_list_t parameter_list_t; + typedef typename igfun_t::generic_type generic_type; + typedef typename generic_type::vector_view vector_t; + + using exprtk::igeneric_function::operator(); + + all_false() + : exprtk::igeneric_function("V|VTT") + /* + Overloads: + 0. V - vector + 1. VTT - vector, r0, r1 + */ + {} + + inline T operator() (const std::size_t& ps_index, parameter_list_t parameters) + { + const vector_t vec(parameters[0]); + + std::size_t r0 = 0; + std::size_t r1 = vec.size() - 1; + + if ( + (1 == ps_index) && + !helper::load_vector_range::process(parameters, r0, r1, 1, 2, 0) + ) + return std::numeric_limits::quiet_NaN(); + + for (std::size_t i = r0; i <= r1; ++i) + { + if (vec[i] != T(0)) + { + return T(0); + } + } + + return T(1); + } + }; + + template + class any_true : public exprtk::igeneric_function + { + public: + + typedef typename exprtk::igeneric_function igfun_t; + typedef typename igfun_t::parameter_list_t parameter_list_t; + typedef typename igfun_t::generic_type generic_type; + typedef typename generic_type::vector_view vector_t; + + using exprtk::igeneric_function::operator(); + + any_true() + : exprtk::igeneric_function("V|VTT") + /* + Overloads: + 0. V - vector + 1. VTT - vector, r0, r1 + */ + {} + + inline T operator() (const std::size_t& ps_index, parameter_list_t parameters) + { + const vector_t vec(parameters[0]); + + std::size_t r0 = 0; + std::size_t r1 = vec.size() - 1; + + if ( + (1 == ps_index) && + !helper::load_vector_range::process(parameters, r0, r1, 1, 2, 0) + ) + return std::numeric_limits::quiet_NaN(); + + for (std::size_t i = r0; i <= r1; ++i) + { + if (vec[i] != T(0)) + { + return T(1); + } + } + + return T(0); + } + }; + + template + class any_false : public exprtk::igeneric_function + { + public: + + typedef typename exprtk::igeneric_function igfun_t; + typedef typename igfun_t::parameter_list_t parameter_list_t; + typedef typename igfun_t::generic_type generic_type; + typedef typename generic_type::vector_view vector_t; + + using exprtk::igeneric_function::operator(); + + any_false() + : exprtk::igeneric_function("V|VTT") + /* + Overloads: + 0. V - vector + 1. VTT - vector, r0, r1 + */ + {} + + inline T operator() (const std::size_t& ps_index, parameter_list_t parameters) + { + const vector_t vec(parameters[0]); + + std::size_t r0 = 0; + std::size_t r1 = vec.size() - 1; + + if ( + (1 == ps_index) && + !helper::load_vector_range::process(parameters, r0, r1, 1, 2, 0) + ) + return std::numeric_limits::quiet_NaN(); + + for (std::size_t i = r0; i <= r1; ++i) + { + if (vec[i] == T(0)) + { + return T(1); + } + } + + return T(0); + } + }; + + template + class count : public exprtk::igeneric_function + { + public: + + typedef typename exprtk::igeneric_function igfun_t; + typedef typename igfun_t::parameter_list_t parameter_list_t; + typedef typename igfun_t::generic_type generic_type; + typedef typename generic_type::vector_view vector_t; + + using exprtk::igeneric_function::operator(); + + count() + : exprtk::igeneric_function("V|VTT") + /* + Overloads: + 0. V - vector + 1. VTT - vector, r0, r1 + */ + {} + + inline T operator() (const std::size_t& ps_index, parameter_list_t parameters) + { + const vector_t vec(parameters[0]); + + std::size_t r0 = 0; + std::size_t r1 = vec.size() - 1; + + if ( + (1 == ps_index) && + !helper::load_vector_range::process(parameters, r0, r1, 1, 2, 0) + ) + return std::numeric_limits::quiet_NaN(); + + std::size_t cnt = 0; + + for (std::size_t i = r0; i <= r1; ++i) + { + if (vec[i] != T(0)) ++cnt; + } + + return T(cnt); + } + }; + + template + class copy : public exprtk::igeneric_function + { + public: + + typedef typename exprtk::igeneric_function igfun_t; + typedef typename igfun_t::parameter_list_t parameter_list_t; + typedef typename igfun_t::generic_type generic_type; + typedef typename generic_type::scalar_view scalar_t; + typedef typename generic_type::vector_view vector_t; + + using exprtk::igeneric_function::operator(); + + copy() + : exprtk::igeneric_function("VV|VTTVTT") + /* + Overloads: + 0. VV - x(vector), y(vector) + 1. VTTVTT - x(vector), xr0, xr1, y(vector), yr0, yr1, + */ + {} + + inline T operator() (const std::size_t& ps_index, parameter_list_t parameters) + { + const vector_t x(parameters[0]); + vector_t y(parameters[(0 == ps_index) ? 1 : 3]); + + std::size_t xr0 = 0; + std::size_t xr1 = x.size() - 1; + + std::size_t yr0 = 0; + std::size_t yr1 = y.size() - 1; + + if (1 == ps_index) + { + if ( + !helper::load_vector_range::process(parameters, xr0, xr1, 1, 2, 0) || + !helper::load_vector_range::process(parameters, yr0, yr1, 4, 5, 3) + ) + return T(0); + } + + const std::size_t n = std::min(xr1 - xr0 + 1, yr1 - yr0 + 1); + + std::copy( + x.begin() + xr0, + x.begin() + xr0 + n, + y.begin() + yr0); + + return T(n); + } + }; + + template + class rol : public exprtk::igeneric_function + { + public: + + typedef typename exprtk::igeneric_function igfun_t; + typedef typename igfun_t::parameter_list_t parameter_list_t; + typedef typename igfun_t::generic_type generic_type; + typedef typename generic_type::scalar_view scalar_t; + typedef typename generic_type::vector_view vector_t; + + using exprtk::igeneric_function::operator(); + + rol() + : exprtk::igeneric_function("VT|VTTT") + /* + Overloads: + 0. VT - vector, N + 1. VTTT - vector, N, r0, r1 + */ + {} + + inline T operator() (const std::size_t& ps_index, parameter_list_t parameters) + { + vector_t vec(parameters[0]); + + std::size_t n = 0; + std::size_t r0 = 0; + std::size_t r1 = vec.size() - 1; + + if (!scalar_t(parameters[1]).to_uint(n)) + return T(0); + + if ( + (1 == ps_index) && + !helper::load_vector_range::process(parameters, r0, r1, 2, 3, 0) + ) + return T(0); + + const std::size_t dist = r1 - r0 + 1; + const std::size_t shift = n % dist; + + std::rotate( + vec.begin() + r0, + vec.begin() + r0 + shift, + vec.begin() + r1 + 1); + + return T(1); + } + }; + + template + class ror : public exprtk::igeneric_function + { + public: + + typedef typename exprtk::igeneric_function igfun_t; + typedef typename igfun_t::parameter_list_t parameter_list_t; + typedef typename igfun_t::generic_type generic_type; + typedef typename generic_type::scalar_view scalar_t; + typedef typename generic_type::vector_view vector_t; + + using exprtk::igeneric_function::operator(); + + ror() + : exprtk::igeneric_function("VT|VTTT") + /* + Overloads: + 0. VT - vector, N + 1. VTTT - vector, N, r0, r1 + */ + {} + + inline T operator() (const std::size_t& ps_index, parameter_list_t parameters) + { + vector_t vec(parameters[0]); + + std::size_t n = 0; + std::size_t r0 = 0; + std::size_t r1 = vec.size() - 1; + + if (!scalar_t(parameters[1]).to_uint(n)) + return T(0); + + if ( + (1 == ps_index) && + !helper::load_vector_range::process(parameters, r0, r1, 2, 3, 0) + ) + return T(0); + + std::size_t dist = r1 - r0 + 1; + std::size_t shift = (dist - (n % dist)) % dist; + + std::rotate( + vec.begin() + r0, + vec.begin() + r0 + shift, + vec.begin() + r1 + 1); + + return T(1); + } + }; + + template + class shift_left : public exprtk::igeneric_function + { + public: + + typedef typename exprtk::igeneric_function igfun_t; + typedef typename igfun_t::parameter_list_t parameter_list_t; + typedef typename igfun_t::generic_type generic_type; + typedef typename generic_type::scalar_view scalar_t; + typedef typename generic_type::vector_view vector_t; + + using exprtk::igeneric_function::operator(); + + shift_left() + : exprtk::igeneric_function("VT|VTTT") + /* + Overloads: + 0. VT - vector, N + 1. VTTT - vector, N, r0, r1 + */ + {} + + inline T operator() (const std::size_t& ps_index, parameter_list_t parameters) + { + vector_t vec(parameters[0]); + + std::size_t n = 0; + std::size_t r0 = 0; + std::size_t r1 = vec.size() - 1; + + if (!scalar_t(parameters[1]).to_uint(n)) + return T(0); + + if ( + (1 == ps_index) && + !helper::load_vector_range::process(parameters, r0, r1, 2, 3, 0) + ) + return T(0); + + const std::size_t dist = r1 - r0 + 1; + + if (n > dist) + return T(0); + + std::rotate( + vec.begin() + r0, + vec.begin() + r0 + n, + vec.begin() + r1 + 1); + + for (std::size_t i = r1 - n + 1; i <= r1; ++i) + { + vec[i] = T(0); + } + + return T(1); + } + }; + + template + class shift_right : public exprtk::igeneric_function + { + public: + + typedef typename exprtk::igeneric_function igfun_t; + typedef typename igfun_t::parameter_list_t parameter_list_t; + typedef typename igfun_t::generic_type generic_type; + typedef typename generic_type::scalar_view scalar_t; + typedef typename generic_type::vector_view vector_t; + + using exprtk::igeneric_function::operator(); + + shift_right() + : exprtk::igeneric_function("VT|VTTT") + /* + Overloads: + 0. VT - vector, N + 1. VTTT - vector, N, r0, r1 + */ + {} + + inline T operator() (const std::size_t& ps_index, parameter_list_t parameters) + { + vector_t vec(parameters[0]); + + std::size_t n = 0; + std::size_t r0 = 0; + std::size_t r1 = vec.size() - 1; + + if (!scalar_t(parameters[1]).to_uint(n)) + return T(0); + + if ( + (1 == ps_index) && + !helper::load_vector_range::process(parameters, r0, r1, 2, 3, 0) + ) + return T(0); + + const std::size_t dist = r1 - r0 + 1; + + if (n > dist) + return T(0); + + const std::size_t shift = (dist - (n % dist)) % dist; + + std::rotate( + vec.begin() + r0, + vec.begin() + r0 + shift, + vec.begin() + r1 + 1); + + for (std::size_t i = r0; i < r0 + n; ++i) + { + vec[i] = T(0); + } + + return T(1); + } + }; + + template + class sort : public exprtk::igeneric_function + { + public: + + typedef typename exprtk::igeneric_function igfun_t; + typedef typename igfun_t::parameter_list_t parameter_list_t; + typedef typename igfun_t::generic_type generic_type; + typedef typename generic_type::string_view string_t; + typedef typename generic_type::vector_view vector_t; + + using exprtk::igeneric_function::operator(); + + sort() + : exprtk::igeneric_function("V|VTT|VS|VSTT") + /* + Overloads: + 0. V - vector + 1. VTT - vector, r0, r1 + 2. VS - vector, string + 3. VSTT - vector, string, r0, r1 + */ + {} + + inline T operator() (const std::size_t& ps_index, parameter_list_t parameters) + { + vector_t vec(parameters[0]); + + std::size_t r0 = 0; + std::size_t r1 = vec.size() - 1; + + if ((1 == ps_index) && !helper::load_vector_range::process(parameters, r0, r1, 1, 2, 0)) + return T(0); + if ((3 == ps_index) && !helper::load_vector_range::process(parameters, r0, r1, 2, 3, 0)) + return T(0); + + bool ascending = true; + + if ((2 == ps_index) || (3 == ps_index)) + { + if (exprtk::details::imatch(to_str(string_t(parameters[1])),"ascending")) + ascending = true; + else if (exprtk::details::imatch(to_str(string_t(parameters[1])),"descending")) + ascending = false; + else + return T(0); + } + + if (ascending) + std::sort( + vec.begin() + r0, + vec.begin() + r1 + 1, + std::less()); + else + std::sort( + vec.begin() + r0, + vec.begin() + r1 + 1, + std::greater()); + + return T(1); + } + }; + + template + class nthelement : public exprtk::igeneric_function + { + public: + + typedef typename exprtk::igeneric_function igfun_t; + typedef typename igfun_t::parameter_list_t parameter_list_t; + typedef typename igfun_t::generic_type generic_type; + typedef typename generic_type::scalar_view scalar_t; + typedef typename generic_type::vector_view vector_t; + + using exprtk::igeneric_function::operator(); + + nthelement() + : exprtk::igeneric_function("VT|VTTT") + /* + Overloads: + 0. VT - vector, nth-element + 1. VTTT - vector, nth-element, r0, r1 + */ + {} + + inline T operator() (const std::size_t& ps_index, parameter_list_t parameters) + { + vector_t vec(parameters[0]); + + std::size_t n = 0; + std::size_t r0 = 0; + std::size_t r1 = vec.size() - 1; + + if (!scalar_t(parameters[1]).to_uint(n)) + return T(0); + + if ((1 == ps_index) && !helper::load_vector_range::process(parameters, r0, r1, 2, 3, 0)) + return std::numeric_limits::quiet_NaN(); + + std::nth_element( + vec.begin() + r0, + vec.begin() + r0 + n , + vec.begin() + r1 + 1); + + return T(1); + } + }; + + template + class iota : public exprtk::igeneric_function + { + public: + + typedef typename exprtk::igeneric_function igfun_t; + typedef typename igfun_t::parameter_list_t parameter_list_t; + typedef typename igfun_t::generic_type generic_type; + typedef typename generic_type::scalar_view scalar_t; + typedef typename generic_type::vector_view vector_t; + + using exprtk::igeneric_function::operator(); + + iota() + : exprtk::igeneric_function("VT|VTT|VTTT|VTTTT") + /* + Overloads: + 0. VT - vector, increment + 1. VTT - vector, increment, base + 2. VTTTT - vector, increment, r0, r1 + 3. VTTTT - vector, increment, base, r0, r1 + */ + {} + + inline T operator() (const std::size_t& ps_index, parameter_list_t parameters) + { + vector_t vec(parameters[0]); + + T increment = scalar_t(parameters[1])(); + T base = ((1 == ps_index) || (3 == ps_index)) ? scalar_t(parameters[2])() : T(0); + + std::size_t r0 = 0; + std::size_t r1 = vec.size() - 1; + + if ((2 == ps_index) && !helper::load_vector_range::process(parameters, r0, r1, 2, 3, 0)) + return std::numeric_limits::quiet_NaN(); + else if ((3 == ps_index) && !helper::load_vector_range::process(parameters, r0, r1, 3, 4, 0)) + return std::numeric_limits::quiet_NaN(); + else + { + long long j = 0; + + for (std::size_t i = r0; i <= r1; ++i, ++j) + { + vec[i] = base + (increment * j); + } + } + + return T(1); + } + }; + + template + class sumk : public exprtk::igeneric_function + { + public: + + typedef typename exprtk::igeneric_function igfun_t; + typedef typename igfun_t::parameter_list_t parameter_list_t; + typedef typename igfun_t::generic_type generic_type; + typedef typename generic_type::vector_view vector_t; + + using exprtk::igeneric_function::operator(); + + sumk() + : exprtk::igeneric_function("V|VTT") + /* + Overloads: + 0. V - vector + 1. VTT - vector, r0, r1 + */ + {} + + inline T operator() (const std::size_t& ps_index, parameter_list_t parameters) + { + const vector_t vec(parameters[0]); + + std::size_t r0 = 0; + std::size_t r1 = vec.size() - 1; + + if ((1 == ps_index) && !helper::load_vector_range::process(parameters, r0, r1, 1, 2, 0)) + return std::numeric_limits::quiet_NaN(); + + T result = T(0); + T error = T(0); + + for (std::size_t i = r0; i <= r1; ++i) + { + details::kahan_sum(result, error, vec[i]); + } + + return result; + } + }; + + template + class axpy : public exprtk::igeneric_function + { + public: + + typedef typename exprtk::igeneric_function igfun_t; + typedef typename igfun_t::parameter_list_t parameter_list_t; + typedef typename igfun_t::generic_type generic_type; + typedef typename generic_type::scalar_view scalar_t; + typedef typename generic_type::vector_view vector_t; + + using exprtk::igeneric_function::operator(); + + axpy() + : exprtk::igeneric_function("TVV|TVVTT") + /* + y <- ax + y + Overloads: + 0. TVV - a, x(vector), y(vector) + 1. TVVTT - a, x(vector), y(vector), r0, r1 + */ + {} + + inline T operator() (const std::size_t& ps_index, parameter_list_t parameters) + { + const vector_t x(parameters[1]); + vector_t y(parameters[2]); + + std::size_t r0 = 0; + std::size_t r1 = std::min(x.size(),y.size()) - 1; + + if ((1 == ps_index) && !helper::load_vector_range::process(parameters, r0, r1, 3, 4, 1)) + return std::numeric_limits::quiet_NaN(); + else if (helper::invalid_range(y, r0, r1)) + return std::numeric_limits::quiet_NaN(); + + const T a = scalar_t(parameters[0])(); + + for (std::size_t i = r0; i <= r1; ++i) + { + y[i] = (a * x[i]) + y[i]; + } + + return T(1); + } + }; + + template + class axpby : public exprtk::igeneric_function + { + public: + + typedef typename exprtk::igeneric_function igfun_t; + typedef typename igfun_t::parameter_list_t parameter_list_t; + typedef typename igfun_t::generic_type generic_type; + typedef typename generic_type::scalar_view scalar_t; + typedef typename generic_type::vector_view vector_t; + + using exprtk::igeneric_function::operator(); + + axpby() + : exprtk::igeneric_function("TVTV|TVTVTT") + /* + y <- ax + by + Overloads: + 0. TVTV - a, x(vector), b, y(vector) + 1. TVTVTT - a, x(vector), b, y(vector), r0, r1 + */ + {} + + inline T operator() (const std::size_t& ps_index, parameter_list_t parameters) + { + const vector_t x(parameters[1]); + vector_t y(parameters[3]); + + std::size_t r0 = 0; + std::size_t r1 = std::min(x.size(),y.size()) - 1; + + if ((1 == ps_index) && !helper::load_vector_range::process(parameters, r0, r1, 4, 5, 1)) + return std::numeric_limits::quiet_NaN(); + else if (helper::invalid_range(y, r0, r1)) + return std::numeric_limits::quiet_NaN(); + + const T a = scalar_t(parameters[0])(); + const T b = scalar_t(parameters[2])(); + + for (std::size_t i = r0; i <= r1; ++i) + { + y[i] = (a * x[i]) + (b * y[i]); + } + + return T(1); + } + }; + + template + class axpyz : public exprtk::igeneric_function + { + public: + + typedef typename exprtk::igeneric_function igfun_t; + typedef typename igfun_t::parameter_list_t parameter_list_t; + typedef typename igfun_t::generic_type generic_type; + typedef typename generic_type::scalar_view scalar_t; + typedef typename generic_type::vector_view vector_t; + + using exprtk::igeneric_function::operator(); + + axpyz() + : exprtk::igeneric_function("TVVV|TVVVTT") + /* + z <- ax + y + Overloads: + 0. TVVV - a, x(vector), y(vector), z(vector) + 1. TVVVTT - a, x(vector), y(vector), z(vector), r0, r1 + */ + {} + + inline T operator() (const std::size_t& ps_index, parameter_list_t parameters) + { + const vector_t x(parameters[1]); + const vector_t y(parameters[2]); + vector_t z(parameters[3]); + + std::size_t r0 = 0; + std::size_t r1 = std::min(x.size(),y.size()) - 1; + + if ((1 == ps_index) && !helper::load_vector_range::process(parameters, r0, r1, 3, 4, 1)) + return std::numeric_limits::quiet_NaN(); + else if (helper::invalid_range(y, r0, r1)) + return std::numeric_limits::quiet_NaN(); + else if (helper::invalid_range(z, r0, r1)) + return std::numeric_limits::quiet_NaN(); + + const T a = scalar_t(parameters[0])(); + + for (std::size_t i = r0; i <= r1; ++i) + { + z[i] = (a * x[i]) + y[i]; + } + + return T(1); + } + }; + + template + class axpbyz : public exprtk::igeneric_function + { + public: + + typedef typename exprtk::igeneric_function igfun_t; + typedef typename igfun_t::parameter_list_t parameter_list_t; + typedef typename igfun_t::generic_type generic_type; + typedef typename generic_type::scalar_view scalar_t; + typedef typename generic_type::vector_view vector_t; + + using exprtk::igeneric_function::operator(); + + axpbyz() + : exprtk::igeneric_function("TVTVV|TVTVVTT") + /* + z <- ax + by + Overloads: + 0. TVTVV - a, x(vector), b, y(vector), z(vector) + 1. TVTVVTT - a, x(vector), b, y(vector), z(vector), r0, r1 + */ + {} + + inline T operator() (const std::size_t& ps_index, parameter_list_t parameters) + { + const vector_t x(parameters[1]); + const vector_t y(parameters[3]); + vector_t z(parameters[4]); + + std::size_t r0 = 0; + std::size_t r1 = std::min(x.size(),y.size()) - 1; + + if ((1 == ps_index) && !helper::load_vector_range::process(parameters, r0, r1, 4, 5, 1)) + return std::numeric_limits::quiet_NaN(); + else if (helper::invalid_range(y, r0, r1)) + return std::numeric_limits::quiet_NaN(); + else if (helper::invalid_range(z, r0, r1)) + return std::numeric_limits::quiet_NaN(); + + const T a = scalar_t(parameters[0])(); + const T b = scalar_t(parameters[2])(); + + for (std::size_t i = r0; i <= r1; ++i) + { + z[i] = (a * x[i]) + (b * y[i]); + } + + return T(1); + } + }; + + template + class axpbz : public exprtk::igeneric_function + { + public: + + typedef typename exprtk::igeneric_function igfun_t; + typedef typename igfun_t::parameter_list_t parameter_list_t; + typedef typename igfun_t::generic_type generic_type; + typedef typename generic_type::scalar_view scalar_t; + typedef typename generic_type::vector_view vector_t; + + using exprtk::igeneric_function::operator(); + + axpbz() + : exprtk::igeneric_function("TVTV|TVTVTT") + /* + z <- ax + b + Overloads: + 0. TVTV - a, x(vector), b, z(vector) + 1. TVTVTT - a, x(vector), b, z(vector), r0, r1 + */ + {} + + inline T operator() (const std::size_t& ps_index, parameter_list_t parameters) + { + const vector_t x(parameters[1]); + vector_t z(parameters[3]); + + std::size_t r0 = 0; + std::size_t r1 = x.size() - 1; + + if ((1 == ps_index) && !helper::load_vector_range::process(parameters, r0, r1, 4, 5, 1)) + return std::numeric_limits::quiet_NaN(); + else if (helper::invalid_range(z, r0, r1)) + return std::numeric_limits::quiet_NaN(); + + const T a = scalar_t(parameters[0])(); + const T b = scalar_t(parameters[2])(); + + for (std::size_t i = r0; i <= r1; ++i) + { + z[i] = (a * x[i]) + b; + } + + return T(1); + } + }; + + template + class dot : public exprtk::igeneric_function + { + public: + + typedef typename exprtk::igeneric_function igfun_t; + typedef typename igfun_t::parameter_list_t parameter_list_t; + typedef typename igfun_t::generic_type generic_type; + typedef typename generic_type::scalar_view scalar_t; + typedef typename generic_type::vector_view vector_t; + + using exprtk::igeneric_function::operator(); + + dot() + : exprtk::igeneric_function("VV|VVTT") + /* + Overloads: + 0. VV - x(vector), y(vector) + 1. VVTT - x(vector), y(vector), r0, r1 + */ + {} + + inline T operator() (const std::size_t& ps_index, parameter_list_t parameters) + { + const vector_t x(parameters[0]); + const vector_t y(parameters[1]); + + std::size_t r0 = 0; + std::size_t r1 = std::min(x.size(),y.size()) - 1; + + if ((1 == ps_index) && !helper::load_vector_range::process(parameters, r0, r1, 2, 3, 0)) + return std::numeric_limits::quiet_NaN(); + else if (helper::invalid_range(y, r0, r1)) + return std::numeric_limits::quiet_NaN(); + + T result = T(0); + + for (std::size_t i = r0; i <= r1; ++i) + { + result += (x[i] * y[i]); + } + + return result; + } + }; + + template + class dotk : public exprtk::igeneric_function + { + public: + + typedef typename exprtk::igeneric_function igfun_t; + typedef typename igfun_t::parameter_list_t parameter_list_t; + typedef typename igfun_t::generic_type generic_type; + typedef typename generic_type::scalar_view scalar_t; + typedef typename generic_type::vector_view vector_t; + + using exprtk::igeneric_function::operator(); + + dotk() + : exprtk::igeneric_function("VV|VVTT") + /* + Overloads: + 0. VV - x(vector), y(vector) + 1. VVTT - x(vector), y(vector), r0, r1 + */ + {} + + inline T operator() (const std::size_t& ps_index, parameter_list_t parameters) + { + const vector_t x(parameters[0]); + const vector_t y(parameters[1]); + + std::size_t r0 = 0; + std::size_t r1 = std::min(x.size(),y.size()) - 1; + + if ((1 == ps_index) && !helper::load_vector_range::process(parameters, r0, r1, 2, 3, 0)) + return std::numeric_limits::quiet_NaN(); + else if (helper::invalid_range(y, r0, r1)) + return std::numeric_limits::quiet_NaN(); + + T result = T(0); + T error = T(0); + + for (std::size_t i = r0; i <= r1; ++i) + { + details::kahan_sum(result, error, (x[i] * y[i])); + } + + return result; + } + }; + + template + struct package + { + all_true at; + all_false af; + any_true nt; + any_false nf; + count c; + copy cp; + rol rl; + ror rr; + shift_left sl; + shift_right sr; + sort st; + nthelement ne; + iota ia; + sumk sk; + axpy b1_axpy; + axpby b1_axpby; + axpyz b1_axpyz; + axpbyz b1_axpbyz; + axpbz b1_axpbz; + dot dt; + dotk dtk; + + bool register_package(exprtk::symbol_table& symtab) + { + #define exprtk_register_function(FunctionName, FunctionType) \ + if (!symtab.add_function(FunctionName,FunctionType)) \ + { \ + exprtk_debug(( \ + "exprtk::rtl::vecops::register_package - Failed to add function: %s\n", \ + FunctionName)); \ + return false; \ + } \ + + exprtk_register_function("all_true" , at ) + exprtk_register_function("all_false" , af ) + exprtk_register_function("any_true" , nt ) + exprtk_register_function("any_false" , nf ) + exprtk_register_function("count" , c ) + exprtk_register_function("copy" , cp ) + exprtk_register_function("rotate_left" , rl ) + exprtk_register_function("rol" , rl ) + exprtk_register_function("rotate_right" , rr ) + exprtk_register_function("ror" , rr ) + exprtk_register_function("shftl" , sl ) + exprtk_register_function("shftr" , sr ) + exprtk_register_function("sort" , st ) + exprtk_register_function("nth_element" , ne ) + exprtk_register_function("iota" , ia ) + exprtk_register_function("sumk" , sk ) + exprtk_register_function("axpy" , b1_axpy ) + exprtk_register_function("axpby" , b1_axpby ) + exprtk_register_function("axpyz" , b1_axpyz ) + exprtk_register_function("axpbyz" , b1_axpbyz) + exprtk_register_function("axpbz" , b1_axpbz ) + exprtk_register_function("dot" , dt ) + exprtk_register_function("dotk" , dtk ) + #undef exprtk_register_function + + return true; + } + }; + + } // namespace exprtk::rtl::vecops + } // namespace exprtk::rtl +} // namespace exprtk +#endif + +namespace exprtk +{ + namespace information + { + using ::exprtk::details::char_cptr; + + static char_cptr library = "Mathematical Expression Toolkit"; + static char_cptr version = "2.7182818284590452353602874713526" + "624977572470936999595749669676277" + "240766303535475945713821785251664" + "274274663919320030599218174135966"; + static char_cptr date = "20220101"; + static char_cptr min_cpp = "199711L"; + + static inline std::string data() + { + static const std::string info_str = std::string(library) + + std::string(" v") + std::string(version) + + std::string(" (") + date + std::string(")") + + std::string(" (") + min_cpp + std::string(")"); + return info_str; + } + + } // namespace information + + #ifdef exprtk_debug + #undef exprtk_debug + #endif + + #ifdef exprtk_error_location + #undef exprtk_error_location + #endif + + #ifdef exprtk_disable_fallthrough_begin + #undef exprtk_disable_fallthrough_begin + #endif + + #ifdef exprtk_disable_fallthrough_end + #undef exprtk_disable_fallthrough_end + #endif + + #ifdef exprtk_override + #undef exprtk_override + #endif + + #ifdef exprtk_final + #undef exprtk_final + #endif + + #ifdef exprtk_delete + #undef exprtk_delete + #endif + +} // namespace exprtk + +#endif diff --git a/Include/feast/spike.h b/Include/feast/spike.h index f118990c2..50e63498b 100644 --- a/Include/feast/spike.h +++ b/Include/feast/spike.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017-2022 Theodore Chang + * Copyright (C) 2017-2023 Theodore Chang * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/Include/fmt/include/fmt/color.h b/Include/fmt/include/fmt/color.h new file mode 100644 index 000000000..4c163277e --- /dev/null +++ b/Include/fmt/include/fmt/color.h @@ -0,0 +1,651 @@ +// Formatting library for C++ - color support +// +// Copyright (c) 2018 - present, Victor Zverovich and fmt contributors +// All rights reserved. +// +// For the license information refer to format.h. + +#ifndef FMT_COLOR_H_ +#define FMT_COLOR_H_ + +#include "format.h" + +FMT_BEGIN_NAMESPACE +FMT_MODULE_EXPORT_BEGIN + +enum class color : uint32_t { + alice_blue = 0xF0F8FF, // rgb(240,248,255) + antique_white = 0xFAEBD7, // rgb(250,235,215) + aqua = 0x00FFFF, // rgb(0,255,255) + aquamarine = 0x7FFFD4, // rgb(127,255,212) + azure = 0xF0FFFF, // rgb(240,255,255) + beige = 0xF5F5DC, // rgb(245,245,220) + bisque = 0xFFE4C4, // rgb(255,228,196) + black = 0x000000, // rgb(0,0,0) + blanched_almond = 0xFFEBCD, // rgb(255,235,205) + blue = 0x0000FF, // rgb(0,0,255) + blue_violet = 0x8A2BE2, // rgb(138,43,226) + brown = 0xA52A2A, // rgb(165,42,42) + burly_wood = 0xDEB887, // rgb(222,184,135) + cadet_blue = 0x5F9EA0, // rgb(95,158,160) + chartreuse = 0x7FFF00, // rgb(127,255,0) + chocolate = 0xD2691E, // rgb(210,105,30) + coral = 0xFF7F50, // rgb(255,127,80) + cornflower_blue = 0x6495ED, // rgb(100,149,237) + cornsilk = 0xFFF8DC, // rgb(255,248,220) + crimson = 0xDC143C, // rgb(220,20,60) + cyan = 0x00FFFF, // rgb(0,255,255) + dark_blue = 0x00008B, // rgb(0,0,139) + dark_cyan = 0x008B8B, // rgb(0,139,139) + dark_golden_rod = 0xB8860B, // rgb(184,134,11) + dark_gray = 0xA9A9A9, // rgb(169,169,169) + dark_green = 0x006400, // rgb(0,100,0) + dark_khaki = 0xBDB76B, // rgb(189,183,107) + dark_magenta = 0x8B008B, // rgb(139,0,139) + dark_olive_green = 0x556B2F, // rgb(85,107,47) + dark_orange = 0xFF8C00, // rgb(255,140,0) + dark_orchid = 0x9932CC, // rgb(153,50,204) + dark_red = 0x8B0000, // rgb(139,0,0) + dark_salmon = 0xE9967A, // rgb(233,150,122) + dark_sea_green = 0x8FBC8F, // rgb(143,188,143) + dark_slate_blue = 0x483D8B, // rgb(72,61,139) + dark_slate_gray = 0x2F4F4F, // rgb(47,79,79) + dark_turquoise = 0x00CED1, // rgb(0,206,209) + dark_violet = 0x9400D3, // rgb(148,0,211) + deep_pink = 0xFF1493, // rgb(255,20,147) + deep_sky_blue = 0x00BFFF, // rgb(0,191,255) + dim_gray = 0x696969, // rgb(105,105,105) + dodger_blue = 0x1E90FF, // rgb(30,144,255) + fire_brick = 0xB22222, // rgb(178,34,34) + floral_white = 0xFFFAF0, // rgb(255,250,240) + forest_green = 0x228B22, // rgb(34,139,34) + fuchsia = 0xFF00FF, // rgb(255,0,255) + gainsboro = 0xDCDCDC, // rgb(220,220,220) + ghost_white = 0xF8F8FF, // rgb(248,248,255) + gold = 0xFFD700, // rgb(255,215,0) + golden_rod = 0xDAA520, // rgb(218,165,32) + gray = 0x808080, // rgb(128,128,128) + green = 0x008000, // rgb(0,128,0) + green_yellow = 0xADFF2F, // rgb(173,255,47) + honey_dew = 0xF0FFF0, // rgb(240,255,240) + hot_pink = 0xFF69B4, // rgb(255,105,180) + indian_red = 0xCD5C5C, // rgb(205,92,92) + indigo = 0x4B0082, // rgb(75,0,130) + ivory = 0xFFFFF0, // rgb(255,255,240) + khaki = 0xF0E68C, // rgb(240,230,140) + lavender = 0xE6E6FA, // rgb(230,230,250) + lavender_blush = 0xFFF0F5, // rgb(255,240,245) + lawn_green = 0x7CFC00, // rgb(124,252,0) + lemon_chiffon = 0xFFFACD, // rgb(255,250,205) + light_blue = 0xADD8E6, // rgb(173,216,230) + light_coral = 0xF08080, // rgb(240,128,128) + light_cyan = 0xE0FFFF, // rgb(224,255,255) + light_golden_rod_yellow = 0xFAFAD2, // rgb(250,250,210) + light_gray = 0xD3D3D3, // rgb(211,211,211) + light_green = 0x90EE90, // rgb(144,238,144) + light_pink = 0xFFB6C1, // rgb(255,182,193) + light_salmon = 0xFFA07A, // rgb(255,160,122) + light_sea_green = 0x20B2AA, // rgb(32,178,170) + light_sky_blue = 0x87CEFA, // rgb(135,206,250) + light_slate_gray = 0x778899, // rgb(119,136,153) + light_steel_blue = 0xB0C4DE, // rgb(176,196,222) + light_yellow = 0xFFFFE0, // rgb(255,255,224) + lime = 0x00FF00, // rgb(0,255,0) + lime_green = 0x32CD32, // rgb(50,205,50) + linen = 0xFAF0E6, // rgb(250,240,230) + magenta = 0xFF00FF, // rgb(255,0,255) + maroon = 0x800000, // rgb(128,0,0) + medium_aquamarine = 0x66CDAA, // rgb(102,205,170) + medium_blue = 0x0000CD, // rgb(0,0,205) + medium_orchid = 0xBA55D3, // rgb(186,85,211) + medium_purple = 0x9370DB, // rgb(147,112,219) + medium_sea_green = 0x3CB371, // rgb(60,179,113) + medium_slate_blue = 0x7B68EE, // rgb(123,104,238) + medium_spring_green = 0x00FA9A, // rgb(0,250,154) + medium_turquoise = 0x48D1CC, // rgb(72,209,204) + medium_violet_red = 0xC71585, // rgb(199,21,133) + midnight_blue = 0x191970, // rgb(25,25,112) + mint_cream = 0xF5FFFA, // rgb(245,255,250) + misty_rose = 0xFFE4E1, // rgb(255,228,225) + moccasin = 0xFFE4B5, // rgb(255,228,181) + navajo_white = 0xFFDEAD, // rgb(255,222,173) + navy = 0x000080, // rgb(0,0,128) + old_lace = 0xFDF5E6, // rgb(253,245,230) + olive = 0x808000, // rgb(128,128,0) + olive_drab = 0x6B8E23, // rgb(107,142,35) + orange = 0xFFA500, // rgb(255,165,0) + orange_red = 0xFF4500, // rgb(255,69,0) + orchid = 0xDA70D6, // rgb(218,112,214) + pale_golden_rod = 0xEEE8AA, // rgb(238,232,170) + pale_green = 0x98FB98, // rgb(152,251,152) + pale_turquoise = 0xAFEEEE, // rgb(175,238,238) + pale_violet_red = 0xDB7093, // rgb(219,112,147) + papaya_whip = 0xFFEFD5, // rgb(255,239,213) + peach_puff = 0xFFDAB9, // rgb(255,218,185) + peru = 0xCD853F, // rgb(205,133,63) + pink = 0xFFC0CB, // rgb(255,192,203) + plum = 0xDDA0DD, // rgb(221,160,221) + powder_blue = 0xB0E0E6, // rgb(176,224,230) + purple = 0x800080, // rgb(128,0,128) + rebecca_purple = 0x663399, // rgb(102,51,153) + red = 0xFF0000, // rgb(255,0,0) + rosy_brown = 0xBC8F8F, // rgb(188,143,143) + royal_blue = 0x4169E1, // rgb(65,105,225) + saddle_brown = 0x8B4513, // rgb(139,69,19) + salmon = 0xFA8072, // rgb(250,128,114) + sandy_brown = 0xF4A460, // rgb(244,164,96) + sea_green = 0x2E8B57, // rgb(46,139,87) + sea_shell = 0xFFF5EE, // rgb(255,245,238) + sienna = 0xA0522D, // rgb(160,82,45) + silver = 0xC0C0C0, // rgb(192,192,192) + sky_blue = 0x87CEEB, // rgb(135,206,235) + slate_blue = 0x6A5ACD, // rgb(106,90,205) + slate_gray = 0x708090, // rgb(112,128,144) + snow = 0xFFFAFA, // rgb(255,250,250) + spring_green = 0x00FF7F, // rgb(0,255,127) + steel_blue = 0x4682B4, // rgb(70,130,180) + tan = 0xD2B48C, // rgb(210,180,140) + teal = 0x008080, // rgb(0,128,128) + thistle = 0xD8BFD8, // rgb(216,191,216) + tomato = 0xFF6347, // rgb(255,99,71) + turquoise = 0x40E0D0, // rgb(64,224,208) + violet = 0xEE82EE, // rgb(238,130,238) + wheat = 0xF5DEB3, // rgb(245,222,179) + white = 0xFFFFFF, // rgb(255,255,255) + white_smoke = 0xF5F5F5, // rgb(245,245,245) + yellow = 0xFFFF00, // rgb(255,255,0) + yellow_green = 0x9ACD32 // rgb(154,205,50) +}; // enum class color + +enum class terminal_color : uint8_t { + black = 30, + red, + green, + yellow, + blue, + magenta, + cyan, + white, + bright_black = 90, + bright_red, + bright_green, + bright_yellow, + bright_blue, + bright_magenta, + bright_cyan, + bright_white +}; + +enum class emphasis : uint8_t { + bold = 1, + faint = 1 << 1, + italic = 1 << 2, + underline = 1 << 3, + blink = 1 << 4, + reverse = 1 << 5, + conceal = 1 << 6, + strikethrough = 1 << 7, +}; + +// rgb is a struct for red, green and blue colors. +// Using the name "rgb" makes some editors show the color in a tooltip. +struct rgb { + FMT_CONSTEXPR rgb() : r(0), g(0), b(0) {} + FMT_CONSTEXPR rgb(uint8_t r_, uint8_t g_, uint8_t b_) : r(r_), g(g_), b(b_) {} + FMT_CONSTEXPR rgb(uint32_t hex) + : r((hex >> 16) & 0xFF), g((hex >> 8) & 0xFF), b(hex & 0xFF) {} + FMT_CONSTEXPR rgb(color hex) + : r((uint32_t(hex) >> 16) & 0xFF), + g((uint32_t(hex) >> 8) & 0xFF), + b(uint32_t(hex) & 0xFF) {} + uint8_t r; + uint8_t g; + uint8_t b; +}; + +FMT_BEGIN_DETAIL_NAMESPACE + +// color is a struct of either a rgb color or a terminal color. +struct color_type { + FMT_CONSTEXPR color_type() noexcept : is_rgb(), value{} {} + FMT_CONSTEXPR color_type(color rgb_color) noexcept : is_rgb(true), value{} { + value.rgb_color = static_cast(rgb_color); + } + FMT_CONSTEXPR color_type(rgb rgb_color) noexcept : is_rgb(true), value{} { + value.rgb_color = (static_cast(rgb_color.r) << 16) | + (static_cast(rgb_color.g) << 8) | rgb_color.b; + } + FMT_CONSTEXPR color_type(terminal_color term_color) noexcept + : is_rgb(), value{} { + value.term_color = static_cast(term_color); + } + bool is_rgb; + union color_union { + uint8_t term_color; + uint32_t rgb_color; + } value; +}; + +FMT_END_DETAIL_NAMESPACE + +/** A text style consisting of foreground and background colors and emphasis. */ +class text_style { + public: + FMT_CONSTEXPR text_style(emphasis em = emphasis()) noexcept + : set_foreground_color(), set_background_color(), ems(em) {} + + FMT_CONSTEXPR text_style& operator|=(const text_style& rhs) { + if (!set_foreground_color) { + set_foreground_color = rhs.set_foreground_color; + foreground_color = rhs.foreground_color; + } else if (rhs.set_foreground_color) { + if (!foreground_color.is_rgb || !rhs.foreground_color.is_rgb) + FMT_THROW(format_error("can't OR a terminal color")); + foreground_color.value.rgb_color |= rhs.foreground_color.value.rgb_color; + } + + if (!set_background_color) { + set_background_color = rhs.set_background_color; + background_color = rhs.background_color; + } else if (rhs.set_background_color) { + if (!background_color.is_rgb || !rhs.background_color.is_rgb) + FMT_THROW(format_error("can't OR a terminal color")); + background_color.value.rgb_color |= rhs.background_color.value.rgb_color; + } + + ems = static_cast(static_cast(ems) | + static_cast(rhs.ems)); + return *this; + } + + friend FMT_CONSTEXPR text_style operator|(text_style lhs, + const text_style& rhs) { + return lhs |= rhs; + } + + FMT_CONSTEXPR bool has_foreground() const noexcept { + return set_foreground_color; + } + FMT_CONSTEXPR bool has_background() const noexcept { + return set_background_color; + } + FMT_CONSTEXPR bool has_emphasis() const noexcept { + return static_cast(ems) != 0; + } + FMT_CONSTEXPR detail::color_type get_foreground() const noexcept { + FMT_ASSERT(has_foreground(), "no foreground specified for this style"); + return foreground_color; + } + FMT_CONSTEXPR detail::color_type get_background() const noexcept { + FMT_ASSERT(has_background(), "no background specified for this style"); + return background_color; + } + FMT_CONSTEXPR emphasis get_emphasis() const noexcept { + FMT_ASSERT(has_emphasis(), "no emphasis specified for this style"); + return ems; + } + + private: + FMT_CONSTEXPR text_style(bool is_foreground, + detail::color_type text_color) noexcept + : set_foreground_color(), set_background_color(), ems() { + if (is_foreground) { + foreground_color = text_color; + set_foreground_color = true; + } else { + background_color = text_color; + set_background_color = true; + } + } + + friend FMT_CONSTEXPR text_style fg(detail::color_type foreground) noexcept; + + friend FMT_CONSTEXPR text_style bg(detail::color_type background) noexcept; + + detail::color_type foreground_color; + detail::color_type background_color; + bool set_foreground_color; + bool set_background_color; + emphasis ems; +}; + +/** Creates a text style from the foreground (text) color. */ +FMT_CONSTEXPR inline text_style fg(detail::color_type foreground) noexcept { + return text_style(true, foreground); +} + +/** Creates a text style from the background color. */ +FMT_CONSTEXPR inline text_style bg(detail::color_type background) noexcept { + return text_style(false, background); +} + +FMT_CONSTEXPR inline text_style operator|(emphasis lhs, emphasis rhs) noexcept { + return text_style(lhs) | rhs; +} + +FMT_BEGIN_DETAIL_NAMESPACE + +template struct ansi_color_escape { + FMT_CONSTEXPR ansi_color_escape(detail::color_type text_color, + const char* esc) noexcept { + // If we have a terminal color, we need to output another escape code + // sequence. + if (!text_color.is_rgb) { + bool is_background = esc == string_view("\x1b[48;2;"); + uint32_t value = text_color.value.term_color; + // Background ASCII codes are the same as the foreground ones but with + // 10 more. + if (is_background) value += 10u; + + size_t index = 0; + buffer[index++] = static_cast('\x1b'); + buffer[index++] = static_cast('['); + + if (value >= 100u) { + buffer[index++] = static_cast('1'); + value %= 100u; + } + buffer[index++] = static_cast('0' + value / 10u); + buffer[index++] = static_cast('0' + value % 10u); + + buffer[index++] = static_cast('m'); + buffer[index++] = static_cast('\0'); + return; + } + + for (int i = 0; i < 7; i++) { + buffer[i] = static_cast(esc[i]); + } + rgb color(text_color.value.rgb_color); + to_esc(color.r, buffer + 7, ';'); + to_esc(color.g, buffer + 11, ';'); + to_esc(color.b, buffer + 15, 'm'); + buffer[19] = static_cast(0); + } + FMT_CONSTEXPR ansi_color_escape(emphasis em) noexcept { + uint8_t em_codes[num_emphases] = {}; + if (has_emphasis(em, emphasis::bold)) em_codes[0] = 1; + if (has_emphasis(em, emphasis::faint)) em_codes[1] = 2; + if (has_emphasis(em, emphasis::italic)) em_codes[2] = 3; + if (has_emphasis(em, emphasis::underline)) em_codes[3] = 4; + if (has_emphasis(em, emphasis::blink)) em_codes[4] = 5; + if (has_emphasis(em, emphasis::reverse)) em_codes[5] = 7; + if (has_emphasis(em, emphasis::conceal)) em_codes[6] = 8; + if (has_emphasis(em, emphasis::strikethrough)) em_codes[7] = 9; + + size_t index = 0; + for (size_t i = 0; i < num_emphases; ++i) { + if (!em_codes[i]) continue; + buffer[index++] = static_cast('\x1b'); + buffer[index++] = static_cast('['); + buffer[index++] = static_cast('0' + em_codes[i]); + buffer[index++] = static_cast('m'); + } + buffer[index++] = static_cast(0); + } + FMT_CONSTEXPR operator const Char*() const noexcept { return buffer; } + + FMT_CONSTEXPR const Char* begin() const noexcept { return buffer; } + FMT_CONSTEXPR_CHAR_TRAITS const Char* end() const noexcept { + return buffer + std::char_traits::length(buffer); + } + + private: + static constexpr size_t num_emphases = 8; + Char buffer[7u + 3u * num_emphases + 1u]; + + static FMT_CONSTEXPR void to_esc(uint8_t c, Char* out, + char delimiter) noexcept { + out[0] = static_cast('0' + c / 100); + out[1] = static_cast('0' + c / 10 % 10); + out[2] = static_cast('0' + c % 10); + out[3] = static_cast(delimiter); + } + static FMT_CONSTEXPR bool has_emphasis(emphasis em, emphasis mask) noexcept { + return static_cast(em) & static_cast(mask); + } +}; + +template +FMT_CONSTEXPR ansi_color_escape make_foreground_color( + detail::color_type foreground) noexcept { + return ansi_color_escape(foreground, "\x1b[38;2;"); +} + +template +FMT_CONSTEXPR ansi_color_escape make_background_color( + detail::color_type background) noexcept { + return ansi_color_escape(background, "\x1b[48;2;"); +} + +template +FMT_CONSTEXPR ansi_color_escape make_emphasis(emphasis em) noexcept { + return ansi_color_escape(em); +} + +template inline void fputs(const Char* chars, FILE* stream) { + int result = std::fputs(chars, stream); + if (result < 0) + FMT_THROW(system_error(errno, FMT_STRING("cannot write to file"))); +} + +template <> inline void fputs(const wchar_t* chars, FILE* stream) { + int result = std::fputws(chars, stream); + if (result < 0) + FMT_THROW(system_error(errno, FMT_STRING("cannot write to file"))); +} + +template inline void reset_color(FILE* stream) { + fputs("\x1b[0m", stream); +} + +template <> inline void reset_color(FILE* stream) { + fputs(L"\x1b[0m", stream); +} + +template inline void reset_color(buffer& buffer) { + auto reset_color = string_view("\x1b[0m"); + buffer.append(reset_color.begin(), reset_color.end()); +} + +template struct styled_arg { + const T& value; + text_style style; +}; + +template +void vformat_to(buffer& buf, const text_style& ts, + basic_string_view format_str, + basic_format_args>> args) { + bool has_style = false; + if (ts.has_emphasis()) { + has_style = true; + auto emphasis = detail::make_emphasis(ts.get_emphasis()); + buf.append(emphasis.begin(), emphasis.end()); + } + if (ts.has_foreground()) { + has_style = true; + auto foreground = detail::make_foreground_color(ts.get_foreground()); + buf.append(foreground.begin(), foreground.end()); + } + if (ts.has_background()) { + has_style = true; + auto background = detail::make_background_color(ts.get_background()); + buf.append(background.begin(), background.end()); + } + detail::vformat_to(buf, format_str, args, {}); + if (has_style) detail::reset_color(buf); +} + +FMT_END_DETAIL_NAMESPACE + +template > +void vprint(std::FILE* f, const text_style& ts, const S& format, + basic_format_args>> args) { + basic_memory_buffer buf; + detail::vformat_to(buf, ts, detail::to_string_view(format), args); + if (detail::is_utf8()) { + detail::print(f, basic_string_view(buf.begin(), buf.size())); + } else { + buf.push_back(Char(0)); + detail::fputs(buf.data(), f); + } +} + +/** + \rst + Formats a string and prints it to the specified file stream using ANSI + escape sequences to specify text formatting. + + **Example**:: + + fmt::print(fmt::emphasis::bold | fg(fmt::color::red), + "Elapsed time: {0:.2f} seconds", 1.23); + \endrst + */ +template ::value)> +void print(std::FILE* f, const text_style& ts, const S& format_str, + const Args&... args) { + vprint(f, ts, format_str, + fmt::make_format_args>>(args...)); +} + +/** + \rst + Formats a string and prints it to stdout using ANSI escape sequences to + specify text formatting. + + **Example**:: + + fmt::print(fmt::emphasis::bold | fg(fmt::color::red), + "Elapsed time: {0:.2f} seconds", 1.23); + \endrst + */ +template ::value)> +void print(const text_style& ts, const S& format_str, const Args&... args) { + return print(stdout, ts, format_str, args...); +} + +template > +inline std::basic_string vformat( + const text_style& ts, const S& format_str, + basic_format_args>> args) { + basic_memory_buffer buf; + detail::vformat_to(buf, ts, detail::to_string_view(format_str), args); + return fmt::to_string(buf); +} + +/** + \rst + Formats arguments and returns the result as a string using ANSI + escape sequences to specify text formatting. + + **Example**:: + + #include + std::string message = fmt::format(fmt::emphasis::bold | fg(fmt::color::red), + "The answer is {}", 42); + \endrst +*/ +template > +inline std::basic_string format(const text_style& ts, const S& format_str, + const Args&... args) { + return fmt::vformat(ts, detail::to_string_view(format_str), + fmt::make_format_args>(args...)); +} + +/** + Formats a string with the given text_style and writes the output to ``out``. + */ +template ::value)> +OutputIt vformat_to( + OutputIt out, const text_style& ts, basic_string_view format_str, + basic_format_args>> args) { + auto&& buf = detail::get_buffer(out); + detail::vformat_to(buf, ts, format_str, args); + return detail::get_iterator(buf); +} + +/** + \rst + Formats arguments with the given text_style, writes the result to the output + iterator ``out`` and returns the iterator past the end of the output range. + + **Example**:: + + std::vector out; + fmt::format_to(std::back_inserter(out), + fmt::emphasis::bold | fg(fmt::color::red), "{}", 42); + \endrst +*/ +template >::value&& + detail::is_string::value> +inline auto format_to(OutputIt out, const text_style& ts, const S& format_str, + Args&&... args) -> + typename std::enable_if::type { + return vformat_to(out, ts, detail::to_string_view(format_str), + fmt::make_format_args>>(args...)); +} + +template +struct formatter, Char> : formatter { + template + auto format(const detail::styled_arg& arg, FormatContext& ctx) const + -> decltype(ctx.out()) { + const auto& ts = arg.style; + const auto& value = arg.value; + auto out = ctx.out(); + + bool has_style = false; + if (ts.has_emphasis()) { + has_style = true; + auto emphasis = detail::make_emphasis(ts.get_emphasis()); + out = std::copy(emphasis.begin(), emphasis.end(), out); + } + if (ts.has_foreground()) { + has_style = true; + auto foreground = + detail::make_foreground_color(ts.get_foreground()); + out = std::copy(foreground.begin(), foreground.end(), out); + } + if (ts.has_background()) { + has_style = true; + auto background = + detail::make_background_color(ts.get_background()); + out = std::copy(background.begin(), background.end(), out); + } + out = formatter::format(value, ctx); + if (has_style) { + auto reset_color = string_view("\x1b[0m"); + out = std::copy(reset_color.begin(), reset_color.end(), out); + } + return out; + } +}; + +/** + \rst + Returns an argument that will be formatted using ANSI escape sequences, + to be used in a formatting function. + + **Example**:: + + fmt::print("Elapsed time: {0:.2f} seconds", + fmt::styled(1.23, fmt::fg(fmt::color::green) | + fmt::bg(fmt::color::blue))); + \endrst + */ +template +FMT_CONSTEXPR auto styled(const T& value, text_style ts) + -> detail::styled_arg> { + return detail::styled_arg>{value, ts}; +} + +FMT_MODULE_EXPORT_END +FMT_END_NAMESPACE + +#endif // FMT_COLOR_H_ diff --git a/Include/fmt/include/fmt/core.h b/Include/fmt/include/fmt/core.h new file mode 100644 index 000000000..f6a37af9e --- /dev/null +++ b/Include/fmt/include/fmt/core.h @@ -0,0 +1,3323 @@ +// Formatting library for C++ - the core API for char/UTF-8 +// +// Copyright (c) 2012 - present, Victor Zverovich +// All rights reserved. +// +// For the license information refer to format.h. + +#ifndef FMT_CORE_H_ +#define FMT_CORE_H_ + +#include // std::byte +#include // std::FILE +#include // std::strlen +#include +#include +#include +#include + +// The fmt library version in the form major * 10000 + minor * 100 + patch. +#define FMT_VERSION 90100 + +#if defined(__clang__) && !defined(__ibmxl__) +# define FMT_CLANG_VERSION (__clang_major__ * 100 + __clang_minor__) +#else +# define FMT_CLANG_VERSION 0 +#endif + +#if defined(__GNUC__) && !defined(__clang__) && !defined(__INTEL_COMPILER) && \ + !defined(__NVCOMPILER) +# define FMT_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__) +#else +# define FMT_GCC_VERSION 0 +#endif + +#ifndef FMT_GCC_PRAGMA +// Workaround _Pragma bug https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59884. +# if FMT_GCC_VERSION >= 504 +# define FMT_GCC_PRAGMA(arg) _Pragma(arg) +# else +# define FMT_GCC_PRAGMA(arg) +# endif +#endif + +#ifdef __ICL +# define FMT_ICC_VERSION __ICL +#elif defined(__INTEL_COMPILER) +# define FMT_ICC_VERSION __INTEL_COMPILER +#else +# define FMT_ICC_VERSION 0 +#endif + +#ifdef _MSC_VER +# define FMT_MSC_VERSION _MSC_VER +# define FMT_MSC_WARNING(...) __pragma(warning(__VA_ARGS__)) +#else +# define FMT_MSC_VERSION 0 +# define FMT_MSC_WARNING(...) +#endif + +#ifdef _MSVC_LANG +# define FMT_CPLUSPLUS _MSVC_LANG +#else +# define FMT_CPLUSPLUS __cplusplus +#endif + +#ifdef __has_feature +# define FMT_HAS_FEATURE(x) __has_feature(x) +#else +# define FMT_HAS_FEATURE(x) 0 +#endif + +#if (defined(__has_include) || FMT_ICC_VERSION >= 1600 || \ + FMT_MSC_VERSION > 1900) && \ + !defined(__INTELLISENSE__) +# define FMT_HAS_INCLUDE(x) __has_include(x) +#else +# define FMT_HAS_INCLUDE(x) 0 +#endif + +#ifdef __has_cpp_attribute +# define FMT_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x) +#else +# define FMT_HAS_CPP_ATTRIBUTE(x) 0 +#endif + +#define FMT_HAS_CPP14_ATTRIBUTE(attribute) \ + (FMT_CPLUSPLUS >= 201402L && FMT_HAS_CPP_ATTRIBUTE(attribute)) + +#define FMT_HAS_CPP17_ATTRIBUTE(attribute) \ + (FMT_CPLUSPLUS >= 201703L && FMT_HAS_CPP_ATTRIBUTE(attribute)) + +// Check if relaxed C++14 constexpr is supported. +// GCC doesn't allow throw in constexpr until version 6 (bug 67371). +#ifndef FMT_USE_CONSTEXPR +# if (FMT_HAS_FEATURE(cxx_relaxed_constexpr) || FMT_MSC_VERSION >= 1912 || \ + (FMT_GCC_VERSION >= 600 && FMT_CPLUSPLUS >= 201402L)) && \ + !FMT_ICC_VERSION && !defined(__NVCC__) +# define FMT_USE_CONSTEXPR 1 +# else +# define FMT_USE_CONSTEXPR 0 +# endif +#endif +#if FMT_USE_CONSTEXPR +# define FMT_CONSTEXPR constexpr +#else +# define FMT_CONSTEXPR +#endif + +#if ((FMT_CPLUSPLUS >= 202002L) && \ + (!defined(_GLIBCXX_RELEASE) || _GLIBCXX_RELEASE > 9)) || \ + (FMT_CPLUSPLUS >= 201709L && FMT_GCC_VERSION >= 1002) +# define FMT_CONSTEXPR20 constexpr +#else +# define FMT_CONSTEXPR20 +#endif + +// Check if constexpr std::char_traits<>::{compare,length} are supported. +#if defined(__GLIBCXX__) +# if FMT_CPLUSPLUS >= 201703L && defined(_GLIBCXX_RELEASE) && \ + _GLIBCXX_RELEASE >= 7 // GCC 7+ libstdc++ has _GLIBCXX_RELEASE. +# define FMT_CONSTEXPR_CHAR_TRAITS constexpr +# endif +#elif defined(_LIBCPP_VERSION) && FMT_CPLUSPLUS >= 201703L && \ + _LIBCPP_VERSION >= 4000 +# define FMT_CONSTEXPR_CHAR_TRAITS constexpr +#elif FMT_MSC_VERSION >= 1914 && FMT_CPLUSPLUS >= 201703L +# define FMT_CONSTEXPR_CHAR_TRAITS constexpr +#endif +#ifndef FMT_CONSTEXPR_CHAR_TRAITS +# define FMT_CONSTEXPR_CHAR_TRAITS +#endif + +// Check if exceptions are disabled. +#ifndef FMT_EXCEPTIONS +# if (defined(__GNUC__) && !defined(__EXCEPTIONS)) || \ + (FMT_MSC_VERSION && !_HAS_EXCEPTIONS) +# define FMT_EXCEPTIONS 0 +# else +# define FMT_EXCEPTIONS 1 +# endif +#endif + +#ifndef FMT_DEPRECATED +# if FMT_HAS_CPP14_ATTRIBUTE(deprecated) || FMT_MSC_VERSION >= 1900 +# define FMT_DEPRECATED [[deprecated]] +# else +# if (defined(__GNUC__) && !defined(__LCC__)) || defined(__clang__) +# define FMT_DEPRECATED __attribute__((deprecated)) +# elif FMT_MSC_VERSION +# define FMT_DEPRECATED __declspec(deprecated) +# else +# define FMT_DEPRECATED /* deprecated */ +# endif +# endif +#endif + +// [[noreturn]] is disabled on MSVC and NVCC because of bogus unreachable code +// warnings. +#if FMT_EXCEPTIONS && FMT_HAS_CPP_ATTRIBUTE(noreturn) && !FMT_MSC_VERSION && \ + !defined(__NVCC__) +# define FMT_NORETURN [[noreturn]] +#else +# define FMT_NORETURN +#endif + +#if FMT_HAS_CPP17_ATTRIBUTE(fallthrough) +# define FMT_FALLTHROUGH [[fallthrough]] +#elif defined(__clang__) +# define FMT_FALLTHROUGH [[clang::fallthrough]] +#elif FMT_GCC_VERSION >= 700 && \ + (!defined(__EDG_VERSION__) || __EDG_VERSION__ >= 520) +# define FMT_FALLTHROUGH [[gnu::fallthrough]] +#else +# define FMT_FALLTHROUGH +#endif + +#ifndef FMT_NODISCARD +# if FMT_HAS_CPP17_ATTRIBUTE(nodiscard) +# define FMT_NODISCARD [[nodiscard]] +# else +# define FMT_NODISCARD +# endif +#endif + +#ifndef FMT_USE_FLOAT +# define FMT_USE_FLOAT 1 +#endif +#ifndef FMT_USE_DOUBLE +# define FMT_USE_DOUBLE 1 +#endif +#ifndef FMT_USE_LONG_DOUBLE +# define FMT_USE_LONG_DOUBLE 1 +#endif + +#ifndef FMT_INLINE +# if FMT_GCC_VERSION || FMT_CLANG_VERSION +# define FMT_INLINE inline __attribute__((always_inline)) +# else +# define FMT_INLINE inline +# endif +#endif + +// An inline std::forward replacement. +#define FMT_FORWARD(...) static_cast(__VA_ARGS__) + +#ifdef _MSC_VER +# define FMT_UNCHECKED_ITERATOR(It) \ + using _Unchecked_type = It // Mark iterator as checked. +#else +# define FMT_UNCHECKED_ITERATOR(It) using unchecked_type = It +#endif + +#ifndef FMT_BEGIN_NAMESPACE +# define FMT_BEGIN_NAMESPACE \ + namespace fmt { \ + inline namespace v9 { +# define FMT_END_NAMESPACE \ + } \ + } +#endif + +#ifndef FMT_MODULE_EXPORT +# define FMT_MODULE_EXPORT +# define FMT_MODULE_EXPORT_BEGIN +# define FMT_MODULE_EXPORT_END +# define FMT_BEGIN_DETAIL_NAMESPACE namespace detail { +# define FMT_END_DETAIL_NAMESPACE } +#endif + +#if !defined(FMT_HEADER_ONLY) && defined(_WIN32) +# define FMT_CLASS_API FMT_MSC_WARNING(suppress : 4275) +# ifdef FMT_EXPORT +# define FMT_API __declspec(dllexport) +# elif defined(FMT_SHARED) +# define FMT_API __declspec(dllimport) +# endif +#else +# define FMT_CLASS_API +# if defined(FMT_EXPORT) || defined(FMT_SHARED) +# if defined(__GNUC__) || defined(__clang__) +# define FMT_API __attribute__((visibility("default"))) +# endif +# endif +#endif +#ifndef FMT_API +# define FMT_API +#endif + +// libc++ supports string_view in pre-c++17. +#if FMT_HAS_INCLUDE() && \ + (FMT_CPLUSPLUS >= 201703L || defined(_LIBCPP_VERSION)) +# include +# define FMT_USE_STRING_VIEW +#elif FMT_HAS_INCLUDE("experimental/string_view") && FMT_CPLUSPLUS >= 201402L +# include +# define FMT_USE_EXPERIMENTAL_STRING_VIEW +#endif + +#ifndef FMT_UNICODE +# define FMT_UNICODE !FMT_MSC_VERSION +#endif + +#ifndef FMT_CONSTEVAL +# if ((FMT_GCC_VERSION >= 1000 || FMT_CLANG_VERSION >= 1101) && \ + FMT_CPLUSPLUS >= 202002L && !defined(__apple_build_version__)) || \ + (defined(__cpp_consteval) && \ + (!FMT_MSC_VERSION || _MSC_FULL_VER >= 193030704)) +// consteval is broken in MSVC before VS2022 and Apple clang 13. +# define FMT_CONSTEVAL consteval +# define FMT_HAS_CONSTEVAL +# else +# define FMT_CONSTEVAL +# endif +#endif + +#ifndef FMT_USE_NONTYPE_TEMPLATE_ARGS +# if defined(__cpp_nontype_template_args) && \ + ((FMT_GCC_VERSION >= 903 && FMT_CPLUSPLUS >= 201709L) || \ + __cpp_nontype_template_args >= 201911L) && \ + !defined(__NVCOMPILER) +# define FMT_USE_NONTYPE_TEMPLATE_ARGS 1 +# else +# define FMT_USE_NONTYPE_TEMPLATE_ARGS 0 +# endif +#endif + +// Enable minimal optimizations for more compact code in debug mode. +FMT_GCC_PRAGMA("GCC push_options") +#if !defined(__OPTIMIZE__) && !defined(__NVCOMPILER) +FMT_GCC_PRAGMA("GCC optimize(\"Og\")") +#endif + +FMT_BEGIN_NAMESPACE +FMT_MODULE_EXPORT_BEGIN + +// Implementations of enable_if_t and other metafunctions for older systems. +template +using enable_if_t = typename std::enable_if::type; +template +using conditional_t = typename std::conditional::type; +template using bool_constant = std::integral_constant; +template +using remove_reference_t = typename std::remove_reference::type; +template +using remove_const_t = typename std::remove_const::type; +template +using remove_cvref_t = typename std::remove_cv>::type; +template struct type_identity { using type = T; }; +template using type_identity_t = typename type_identity::type; +template +using underlying_t = typename std::underlying_type::type; + +template struct disjunction : std::false_type {}; +template struct disjunction

: P {}; +template +struct disjunction + : conditional_t> {}; + +template struct conjunction : std::true_type {}; +template struct conjunction

: P {}; +template +struct conjunction + : conditional_t, P1> {}; + +struct monostate { + constexpr monostate() {} +}; + +// An enable_if helper to be used in template parameters which results in much +// shorter symbols: https://godbolt.org/z/sWw4vP. Extra parentheses are needed +// to workaround a bug in MSVC 2019 (see #1140 and #1186). +#ifdef FMT_DOC +# define FMT_ENABLE_IF(...) +#else +# define FMT_ENABLE_IF(...) enable_if_t<(__VA_ARGS__), int> = 0 +#endif + +FMT_BEGIN_DETAIL_NAMESPACE + +// Suppresses "unused variable" warnings with the method described in +// https://herbsutter.com/2009/10/18/mailbag-shutting-up-compiler-warnings/. +// (void)var does not work on many Intel compilers. +template FMT_CONSTEXPR void ignore_unused(const T&...) {} + +constexpr FMT_INLINE auto is_constant_evaluated( + bool default_value = false) noexcept -> bool { +#ifdef __cpp_lib_is_constant_evaluated + ignore_unused(default_value); + return std::is_constant_evaluated(); +#else + return default_value; +#endif +} + +// Suppresses "conditional expression is constant" warnings. +template constexpr FMT_INLINE auto const_check(T value) -> T { + return value; +} + +FMT_NORETURN FMT_API void assert_fail(const char* file, int line, + const char* message); + +#ifndef FMT_ASSERT +# ifdef NDEBUG +// FMT_ASSERT is not empty to avoid -Wempty-body. +# define FMT_ASSERT(condition, message) \ + ::fmt::detail::ignore_unused((condition), (message)) +# else +# define FMT_ASSERT(condition, message) \ + ((condition) /* void() fails with -Winvalid-constexpr on clang 4.0.1 */ \ + ? (void)0 \ + : ::fmt::detail::assert_fail(__FILE__, __LINE__, (message))) +# endif +#endif + +#if defined(FMT_USE_STRING_VIEW) +template using std_string_view = std::basic_string_view; +#elif defined(FMT_USE_EXPERIMENTAL_STRING_VIEW) +template +using std_string_view = std::experimental::basic_string_view; +#else +template struct std_string_view {}; +#endif + +#ifdef FMT_USE_INT128 +// Do nothing. +#elif defined(__SIZEOF_INT128__) && !defined(__NVCC__) && \ + !(FMT_CLANG_VERSION && FMT_MSC_VERSION) +# define FMT_USE_INT128 1 +using int128_opt = __int128_t; // An optional native 128-bit integer. +using uint128_opt = __uint128_t; +template inline auto convert_for_visit(T value) -> T { + return value; +} +#else +# define FMT_USE_INT128 0 +#endif +#if !FMT_USE_INT128 +enum class int128_opt {}; +enum class uint128_opt {}; +// Reduce template instantiations. +template auto convert_for_visit(T) -> monostate { return {}; } +#endif + +// Casts a nonnegative integer to unsigned. +template +FMT_CONSTEXPR auto to_unsigned(Int value) -> + typename std::make_unsigned::type { + FMT_ASSERT(std::is_unsigned::value || value >= 0, "negative value"); + return static_cast::type>(value); +} + +FMT_MSC_WARNING(suppress : 4566) constexpr unsigned char micro[] = "\u00B5"; + +constexpr auto is_utf8() -> bool { + // Avoid buggy sign extensions in MSVC's constant evaluation mode (#2297). + using uchar = unsigned char; + return FMT_UNICODE || (sizeof(micro) == 3 && uchar(micro[0]) == 0xC2 && + uchar(micro[1]) == 0xB5); +} +FMT_END_DETAIL_NAMESPACE + +/** + An implementation of ``std::basic_string_view`` for pre-C++17. It provides a + subset of the API. ``fmt::basic_string_view`` is used for format strings even + if ``std::string_view`` is available to prevent issues when a library is + compiled with a different ``-std`` option than the client code (which is not + recommended). + */ +template class basic_string_view { + private: + const Char* data_; + size_t size_; + + public: + using value_type = Char; + using iterator = const Char*; + + constexpr basic_string_view() noexcept : data_(nullptr), size_(0) {} + + /** Constructs a string reference object from a C string and a size. */ + constexpr basic_string_view(const Char* s, size_t count) noexcept + : data_(s), size_(count) {} + + /** + \rst + Constructs a string reference object from a C string computing + the size with ``std::char_traits::length``. + \endrst + */ + FMT_CONSTEXPR_CHAR_TRAITS + FMT_INLINE + basic_string_view(const Char* s) + : data_(s), + size_(detail::const_check(std::is_same::value && + !detail::is_constant_evaluated(true)) + ? std::strlen(reinterpret_cast(s)) + : std::char_traits::length(s)) {} + + /** Constructs a string reference from a ``std::basic_string`` object. */ + template + FMT_CONSTEXPR basic_string_view( + const std::basic_string& s) noexcept + : data_(s.data()), size_(s.size()) {} + + template >::value)> + FMT_CONSTEXPR basic_string_view(S s) noexcept + : data_(s.data()), size_(s.size()) {} + + /** Returns a pointer to the string data. */ + constexpr auto data() const noexcept -> const Char* { return data_; } + + /** Returns the string size. */ + constexpr auto size() const noexcept -> size_t { return size_; } + + constexpr auto begin() const noexcept -> iterator { return data_; } + constexpr auto end() const noexcept -> iterator { return data_ + size_; } + + constexpr auto operator[](size_t pos) const noexcept -> const Char& { + return data_[pos]; + } + + FMT_CONSTEXPR void remove_prefix(size_t n) noexcept { + data_ += n; + size_ -= n; + } + + // Lexicographically compare this string reference to other. + FMT_CONSTEXPR_CHAR_TRAITS auto compare(basic_string_view other) const -> int { + size_t str_size = size_ < other.size_ ? size_ : other.size_; + int result = std::char_traits::compare(data_, other.data_, str_size); + if (result == 0) + result = size_ == other.size_ ? 0 : (size_ < other.size_ ? -1 : 1); + return result; + } + + FMT_CONSTEXPR_CHAR_TRAITS friend auto operator==(basic_string_view lhs, + basic_string_view rhs) + -> bool { + return lhs.compare(rhs) == 0; + } + friend auto operator!=(basic_string_view lhs, basic_string_view rhs) -> bool { + return lhs.compare(rhs) != 0; + } + friend auto operator<(basic_string_view lhs, basic_string_view rhs) -> bool { + return lhs.compare(rhs) < 0; + } + friend auto operator<=(basic_string_view lhs, basic_string_view rhs) -> bool { + return lhs.compare(rhs) <= 0; + } + friend auto operator>(basic_string_view lhs, basic_string_view rhs) -> bool { + return lhs.compare(rhs) > 0; + } + friend auto operator>=(basic_string_view lhs, basic_string_view rhs) -> bool { + return lhs.compare(rhs) >= 0; + } +}; + +using string_view = basic_string_view; + +/** Specifies if ``T`` is a character type. Can be specialized by users. */ +template struct is_char : std::false_type {}; +template <> struct is_char : std::true_type {}; + +FMT_BEGIN_DETAIL_NAMESPACE + +// A base class for compile-time strings. +struct compile_string {}; + +template +struct is_compile_string : std::is_base_of {}; + +// Returns a string view of `s`. +template ::value)> +FMT_INLINE auto to_string_view(const Char* s) -> basic_string_view { + return s; +} +template +inline auto to_string_view(const std::basic_string& s) + -> basic_string_view { + return s; +} +template +constexpr auto to_string_view(basic_string_view s) + -> basic_string_view { + return s; +} +template >::value)> +inline auto to_string_view(std_string_view s) -> basic_string_view { + return s; +} +template ::value)> +constexpr auto to_string_view(const S& s) + -> basic_string_view { + return basic_string_view(s); +} +void to_string_view(...); + +// Specifies whether S is a string type convertible to fmt::basic_string_view. +// It should be a constexpr function but MSVC 2017 fails to compile it in +// enable_if and MSVC 2015 fails to compile it as an alias template. +// ADL invocation of to_string_view is DEPRECATED! +template +struct is_string : std::is_class()))> { +}; + +template struct char_t_impl {}; +template struct char_t_impl::value>> { + using result = decltype(to_string_view(std::declval())); + using type = typename result::value_type; +}; + +enum class type { + none_type, + // Integer types should go first, + int_type, + uint_type, + long_long_type, + ulong_long_type, + int128_type, + uint128_type, + bool_type, + char_type, + last_integer_type = char_type, + // followed by floating-point types. + float_type, + double_type, + long_double_type, + last_numeric_type = long_double_type, + cstring_type, + string_type, + pointer_type, + custom_type +}; + +// Maps core type T to the corresponding type enum constant. +template +struct type_constant : std::integral_constant {}; + +#define FMT_TYPE_CONSTANT(Type, constant) \ + template \ + struct type_constant \ + : std::integral_constant {} + +FMT_TYPE_CONSTANT(int, int_type); +FMT_TYPE_CONSTANT(unsigned, uint_type); +FMT_TYPE_CONSTANT(long long, long_long_type); +FMT_TYPE_CONSTANT(unsigned long long, ulong_long_type); +FMT_TYPE_CONSTANT(int128_opt, int128_type); +FMT_TYPE_CONSTANT(uint128_opt, uint128_type); +FMT_TYPE_CONSTANT(bool, bool_type); +FMT_TYPE_CONSTANT(Char, char_type); +FMT_TYPE_CONSTANT(float, float_type); +FMT_TYPE_CONSTANT(double, double_type); +FMT_TYPE_CONSTANT(long double, long_double_type); +FMT_TYPE_CONSTANT(const Char*, cstring_type); +FMT_TYPE_CONSTANT(basic_string_view, string_type); +FMT_TYPE_CONSTANT(const void*, pointer_type); + +constexpr bool is_integral_type(type t) { + return t > type::none_type && t <= type::last_integer_type; +} + +constexpr bool is_arithmetic_type(type t) { + return t > type::none_type && t <= type::last_numeric_type; +} + +FMT_NORETURN FMT_API void throw_format_error(const char* message); + +struct error_handler { + constexpr error_handler() = default; + constexpr error_handler(const error_handler&) = default; + + // This function is intentionally not constexpr to give a compile-time error. + FMT_NORETURN void on_error(const char* message) { + throw_format_error(message); + } +}; +FMT_END_DETAIL_NAMESPACE + +/** String's character type. */ +template using char_t = typename detail::char_t_impl::type; + +/** + \rst + Parsing context consisting of a format string range being parsed and an + argument counter for automatic indexing. + You can use the ``format_parse_context`` type alias for ``char`` instead. + \endrst + */ +template +class basic_format_parse_context : private ErrorHandler { + private: + basic_string_view format_str_; + int next_arg_id_; + + FMT_CONSTEXPR void do_check_arg_id(int id); + + public: + using char_type = Char; + using iterator = typename basic_string_view::iterator; + + explicit constexpr basic_format_parse_context( + basic_string_view format_str, ErrorHandler eh = {}, + int next_arg_id = 0) + : ErrorHandler(eh), format_str_(format_str), next_arg_id_(next_arg_id) {} + + /** + Returns an iterator to the beginning of the format string range being + parsed. + */ + constexpr auto begin() const noexcept -> iterator { + return format_str_.begin(); + } + + /** + Returns an iterator past the end of the format string range being parsed. + */ + constexpr auto end() const noexcept -> iterator { return format_str_.end(); } + + /** Advances the begin iterator to ``it``. */ + FMT_CONSTEXPR void advance_to(iterator it) { + format_str_.remove_prefix(detail::to_unsigned(it - begin())); + } + + /** + Reports an error if using the manual argument indexing; otherwise returns + the next argument index and switches to the automatic indexing. + */ + FMT_CONSTEXPR auto next_arg_id() -> int { + if (next_arg_id_ < 0) { + on_error("cannot switch from manual to automatic argument indexing"); + return 0; + } + int id = next_arg_id_++; + do_check_arg_id(id); + return id; + } + + /** + Reports an error if using the automatic argument indexing; otherwise + switches to the manual indexing. + */ + FMT_CONSTEXPR void check_arg_id(int id) { + if (next_arg_id_ > 0) { + on_error("cannot switch from automatic to manual argument indexing"); + return; + } + next_arg_id_ = -1; + do_check_arg_id(id); + } + FMT_CONSTEXPR void check_arg_id(basic_string_view) {} + FMT_CONSTEXPR void check_dynamic_spec(int arg_id); + + FMT_CONSTEXPR void on_error(const char* message) { + ErrorHandler::on_error(message); + } + + constexpr auto error_handler() const -> ErrorHandler { return *this; } +}; + +using format_parse_context = basic_format_parse_context; + +FMT_BEGIN_DETAIL_NAMESPACE +// A parse context with extra data used only in compile-time checks. +template +class compile_parse_context + : public basic_format_parse_context { + private: + int num_args_; + const type* types_; + using base = basic_format_parse_context; + + public: + explicit FMT_CONSTEXPR compile_parse_context( + basic_string_view format_str, int num_args, const type* types, + ErrorHandler eh = {}, int next_arg_id = 0) + : base(format_str, eh, next_arg_id), num_args_(num_args), types_(types) {} + + constexpr auto num_args() const -> int { return num_args_; } + constexpr auto arg_type(int id) const -> type { return types_[id]; } + + FMT_CONSTEXPR auto next_arg_id() -> int { + int id = base::next_arg_id(); + if (id >= num_args_) this->on_error("argument not found"); + return id; + } + + FMT_CONSTEXPR void check_arg_id(int id) { + base::check_arg_id(id); + if (id >= num_args_) this->on_error("argument not found"); + } + using base::check_arg_id; + + FMT_CONSTEXPR void check_dynamic_spec(int arg_id) { + if (arg_id < num_args_ && types_ && !is_integral_type(types_[arg_id])) + this->on_error("width/precision is not integer"); + } +}; +FMT_END_DETAIL_NAMESPACE + +template +FMT_CONSTEXPR void +basic_format_parse_context::do_check_arg_id(int id) { + // Argument id is only checked at compile-time during parsing because + // formatting has its own validation. + if (detail::is_constant_evaluated() && FMT_GCC_VERSION >= 1200) { + using context = detail::compile_parse_context; + if (id >= static_cast(this)->num_args()) + on_error("argument not found"); + } +} + +template +FMT_CONSTEXPR void +basic_format_parse_context::check_dynamic_spec(int arg_id) { + if (detail::is_constant_evaluated()) { + using context = detail::compile_parse_context; + static_cast(this)->check_dynamic_spec(arg_id); + } +} + +template class basic_format_arg; +template class basic_format_args; +template class dynamic_format_arg_store; + +// A formatter for objects of type T. +template +struct formatter { + // A deleted default constructor indicates a disabled formatter. + formatter() = delete; +}; + +// Specifies if T has an enabled formatter specialization. A type can be +// formattable even if it doesn't have a formatter e.g. via a conversion. +template +using has_formatter = + std::is_constructible>; + +// Checks whether T is a container with contiguous storage. +template struct is_contiguous : std::false_type {}; +template +struct is_contiguous> : std::true_type {}; + +class appender; + +FMT_BEGIN_DETAIL_NAMESPACE + +template +constexpr auto has_const_formatter_impl(T*) + -> decltype(typename Context::template formatter_type().format( + std::declval(), std::declval()), + true) { + return true; +} +template +constexpr auto has_const_formatter_impl(...) -> bool { + return false; +} +template +constexpr auto has_const_formatter() -> bool { + return has_const_formatter_impl(static_cast(nullptr)); +} + +// Extracts a reference to the container from back_insert_iterator. +template +inline auto get_container(std::back_insert_iterator it) + -> Container& { + using base = std::back_insert_iterator; + struct accessor : base { + accessor(base b) : base(b) {} + using base::container; + }; + return *accessor(it).container; +} + +template +FMT_CONSTEXPR auto copy_str(InputIt begin, InputIt end, OutputIt out) + -> OutputIt { + while (begin != end) *out++ = static_cast(*begin++); + return out; +} + +template , U>::value&& is_char::value)> +FMT_CONSTEXPR auto copy_str(T* begin, T* end, U* out) -> U* { + if (is_constant_evaluated()) return copy_str(begin, end, out); + auto size = to_unsigned(end - begin); + memcpy(out, begin, size * sizeof(U)); + return out + size; +} + +/** + \rst + A contiguous memory buffer with an optional growing ability. It is an internal + class and shouldn't be used directly, only via `~fmt::basic_memory_buffer`. + \endrst + */ +template class buffer { + private: + T* ptr_; + size_t size_; + size_t capacity_; + + protected: + // Don't initialize ptr_ since it is not accessed to save a few cycles. + FMT_MSC_WARNING(suppress : 26495) + buffer(size_t sz) noexcept : size_(sz), capacity_(sz) {} + + FMT_CONSTEXPR20 buffer(T* p = nullptr, size_t sz = 0, size_t cap = 0) noexcept + : ptr_(p), size_(sz), capacity_(cap) {} + + FMT_CONSTEXPR20 ~buffer() = default; + buffer(buffer&&) = default; + + /** Sets the buffer data and capacity. */ + FMT_CONSTEXPR void set(T* buf_data, size_t buf_capacity) noexcept { + ptr_ = buf_data; + capacity_ = buf_capacity; + } + + /** Increases the buffer capacity to hold at least *capacity* elements. */ + virtual FMT_CONSTEXPR20 void grow(size_t capacity) = 0; + + public: + using value_type = T; + using const_reference = const T&; + + buffer(const buffer&) = delete; + void operator=(const buffer&) = delete; + + auto begin() noexcept -> T* { return ptr_; } + auto end() noexcept -> T* { return ptr_ + size_; } + + auto begin() const noexcept -> const T* { return ptr_; } + auto end() const noexcept -> const T* { return ptr_ + size_; } + + /** Returns the size of this buffer. */ + constexpr auto size() const noexcept -> size_t { return size_; } + + /** Returns the capacity of this buffer. */ + constexpr auto capacity() const noexcept -> size_t { return capacity_; } + + /** Returns a pointer to the buffer data. */ + FMT_CONSTEXPR auto data() noexcept -> T* { return ptr_; } + + /** Returns a pointer to the buffer data. */ + FMT_CONSTEXPR auto data() const noexcept -> const T* { return ptr_; } + + /** Clears this buffer. */ + void clear() { size_ = 0; } + + // Tries resizing the buffer to contain *count* elements. If T is a POD type + // the new elements may not be initialized. + FMT_CONSTEXPR20 void try_resize(size_t count) { + try_reserve(count); + size_ = count <= capacity_ ? count : capacity_; + } + + // Tries increasing the buffer capacity to *new_capacity*. It can increase the + // capacity by a smaller amount than requested but guarantees there is space + // for at least one additional element either by increasing the capacity or by + // flushing the buffer if it is full. + FMT_CONSTEXPR20 void try_reserve(size_t new_capacity) { + if (new_capacity > capacity_) grow(new_capacity); + } + + FMT_CONSTEXPR20 void push_back(const T& value) { + try_reserve(size_ + 1); + ptr_[size_++] = value; + } + + /** Appends data to the end of the buffer. */ + template void append(const U* begin, const U* end); + + template FMT_CONSTEXPR auto operator[](Idx index) -> T& { + return ptr_[index]; + } + template + FMT_CONSTEXPR auto operator[](Idx index) const -> const T& { + return ptr_[index]; + } +}; + +struct buffer_traits { + explicit buffer_traits(size_t) {} + auto count() const -> size_t { return 0; } + auto limit(size_t size) -> size_t { return size; } +}; + +class fixed_buffer_traits { + private: + size_t count_ = 0; + size_t limit_; + + public: + explicit fixed_buffer_traits(size_t limit) : limit_(limit) {} + auto count() const -> size_t { return count_; } + auto limit(size_t size) -> size_t { + size_t n = limit_ > count_ ? limit_ - count_ : 0; + count_ += size; + return size < n ? size : n; + } +}; + +// A buffer that writes to an output iterator when flushed. +template +class iterator_buffer final : public Traits, public buffer { + private: + OutputIt out_; + enum { buffer_size = 256 }; + T data_[buffer_size]; + + protected: + FMT_CONSTEXPR20 void grow(size_t) override { + if (this->size() == buffer_size) flush(); + } + + void flush() { + auto size = this->size(); + this->clear(); + out_ = copy_str(data_, data_ + this->limit(size), out_); + } + + public: + explicit iterator_buffer(OutputIt out, size_t n = buffer_size) + : Traits(n), buffer(data_, 0, buffer_size), out_(out) {} + iterator_buffer(iterator_buffer&& other) + : Traits(other), buffer(data_, 0, buffer_size), out_(other.out_) {} + ~iterator_buffer() { flush(); } + + auto out() -> OutputIt { + flush(); + return out_; + } + auto count() const -> size_t { return Traits::count() + this->size(); } +}; + +template +class iterator_buffer final + : public fixed_buffer_traits, + public buffer { + private: + T* out_; + enum { buffer_size = 256 }; + T data_[buffer_size]; + + protected: + FMT_CONSTEXPR20 void grow(size_t) override { + if (this->size() == this->capacity()) flush(); + } + + void flush() { + size_t n = this->limit(this->size()); + if (this->data() == out_) { + out_ += n; + this->set(data_, buffer_size); + } + this->clear(); + } + + public: + explicit iterator_buffer(T* out, size_t n = buffer_size) + : fixed_buffer_traits(n), buffer(out, 0, n), out_(out) {} + iterator_buffer(iterator_buffer&& other) + : fixed_buffer_traits(other), + buffer(std::move(other)), + out_(other.out_) { + if (this->data() != out_) { + this->set(data_, buffer_size); + this->clear(); + } + } + ~iterator_buffer() { flush(); } + + auto out() -> T* { + flush(); + return out_; + } + auto count() const -> size_t { + return fixed_buffer_traits::count() + this->size(); + } +}; + +template class iterator_buffer final : public buffer { + protected: + FMT_CONSTEXPR20 void grow(size_t) override {} + + public: + explicit iterator_buffer(T* out, size_t = 0) : buffer(out, 0, ~size_t()) {} + + auto out() -> T* { return &*this->end(); } +}; + +// A buffer that writes to a container with the contiguous storage. +template +class iterator_buffer, + enable_if_t::value, + typename Container::value_type>> + final : public buffer { + private: + Container& container_; + + protected: + FMT_CONSTEXPR20 void grow(size_t capacity) override { + container_.resize(capacity); + this->set(&container_[0], capacity); + } + + public: + explicit iterator_buffer(Container& c) + : buffer(c.size()), container_(c) {} + explicit iterator_buffer(std::back_insert_iterator out, size_t = 0) + : iterator_buffer(get_container(out)) {} + + auto out() -> std::back_insert_iterator { + return std::back_inserter(container_); + } +}; + +// A buffer that counts the number of code units written discarding the output. +template class counting_buffer final : public buffer { + private: + enum { buffer_size = 256 }; + T data_[buffer_size]; + size_t count_ = 0; + + protected: + FMT_CONSTEXPR20 void grow(size_t) override { + if (this->size() != buffer_size) return; + count_ += this->size(); + this->clear(); + } + + public: + counting_buffer() : buffer(data_, 0, buffer_size) {} + + auto count() -> size_t { return count_ + this->size(); } +}; + +template +using buffer_appender = conditional_t::value, appender, + std::back_insert_iterator>>; + +// Maps an output iterator to a buffer. +template +auto get_buffer(OutputIt out) -> iterator_buffer { + return iterator_buffer(out); +} + +template +auto get_iterator(Buffer& buf) -> decltype(buf.out()) { + return buf.out(); +} +template auto get_iterator(buffer& buf) -> buffer_appender { + return buffer_appender(buf); +} + +template +struct fallback_formatter { + fallback_formatter() = delete; +}; + +// Specifies if T has an enabled fallback_formatter specialization. +template +using has_fallback_formatter = +#ifdef FMT_DEPRECATED_OSTREAM + std::is_constructible>; +#else + std::false_type; +#endif + +struct view {}; + +template struct named_arg : view { + const Char* name; + const T& value; + named_arg(const Char* n, const T& v) : name(n), value(v) {} +}; + +template struct named_arg_info { + const Char* name; + int id; +}; + +template +struct arg_data { + // args_[0].named_args points to named_args_ to avoid bloating format_args. + // +1 to workaround a bug in gcc 7.5 that causes duplicated-branches warning. + T args_[1 + (NUM_ARGS != 0 ? NUM_ARGS : +1)]; + named_arg_info named_args_[NUM_NAMED_ARGS]; + + template + arg_data(const U&... init) : args_{T(named_args_, NUM_NAMED_ARGS), init...} {} + arg_data(const arg_data& other) = delete; + auto args() const -> const T* { return args_ + 1; } + auto named_args() -> named_arg_info* { return named_args_; } +}; + +template +struct arg_data { + // +1 to workaround a bug in gcc 7.5 that causes duplicated-branches warning. + T args_[NUM_ARGS != 0 ? NUM_ARGS : +1]; + + template + FMT_CONSTEXPR FMT_INLINE arg_data(const U&... init) : args_{init...} {} + FMT_CONSTEXPR FMT_INLINE auto args() const -> const T* { return args_; } + FMT_CONSTEXPR FMT_INLINE auto named_args() -> std::nullptr_t { + return nullptr; + } +}; + +template +inline void init_named_args(named_arg_info*, int, int) {} + +template struct is_named_arg : std::false_type {}; +template struct is_statically_named_arg : std::false_type {}; + +template +struct is_named_arg> : std::true_type {}; + +template ::value)> +void init_named_args(named_arg_info* named_args, int arg_count, + int named_arg_count, const T&, const Tail&... args) { + init_named_args(named_args, arg_count + 1, named_arg_count, args...); +} + +template ::value)> +void init_named_args(named_arg_info* named_args, int arg_count, + int named_arg_count, const T& arg, const Tail&... args) { + named_args[named_arg_count++] = {arg.name, arg_count}; + init_named_args(named_args, arg_count + 1, named_arg_count, args...); +} + +template +FMT_CONSTEXPR FMT_INLINE void init_named_args(std::nullptr_t, int, int, + const Args&...) {} + +template constexpr auto count() -> size_t { return B ? 1 : 0; } +template constexpr auto count() -> size_t { + return (B1 ? 1 : 0) + count(); +} + +template constexpr auto count_named_args() -> size_t { + return count::value...>(); +} + +template +constexpr auto count_statically_named_args() -> size_t { + return count::value...>(); +} + +struct unformattable {}; +struct unformattable_char : unformattable {}; +struct unformattable_const : unformattable {}; +struct unformattable_pointer : unformattable {}; + +template struct string_value { + const Char* data; + size_t size; +}; + +template struct named_arg_value { + const named_arg_info* data; + size_t size; +}; + +template struct custom_value { + using parse_context = typename Context::parse_context_type; + void* value; + void (*format)(void* arg, parse_context& parse_ctx, Context& ctx); +}; + +// A formatting argument value. +template class value { + public: + using char_type = typename Context::char_type; + + union { + monostate no_value; + int int_value; + unsigned uint_value; + long long long_long_value; + unsigned long long ulong_long_value; + int128_opt int128_value; + uint128_opt uint128_value; + bool bool_value; + char_type char_value; + float float_value; + double double_value; + long double long_double_value; + const void* pointer; + string_value string; + custom_value custom; + named_arg_value named_args; + }; + + constexpr FMT_INLINE value() : no_value() {} + constexpr FMT_INLINE value(int val) : int_value(val) {} + constexpr FMT_INLINE value(unsigned val) : uint_value(val) {} + constexpr FMT_INLINE value(long long val) : long_long_value(val) {} + constexpr FMT_INLINE value(unsigned long long val) : ulong_long_value(val) {} + FMT_INLINE value(int128_opt val) : int128_value(val) {} + FMT_INLINE value(uint128_opt val) : uint128_value(val) {} + constexpr FMT_INLINE value(float val) : float_value(val) {} + constexpr FMT_INLINE value(double val) : double_value(val) {} + FMT_INLINE value(long double val) : long_double_value(val) {} + constexpr FMT_INLINE value(bool val) : bool_value(val) {} + constexpr FMT_INLINE value(char_type val) : char_value(val) {} + FMT_CONSTEXPR FMT_INLINE value(const char_type* val) { + string.data = val; + if (is_constant_evaluated()) string.size = {}; + } + FMT_CONSTEXPR FMT_INLINE value(basic_string_view val) { + string.data = val.data(); + string.size = val.size(); + } + FMT_INLINE value(const void* val) : pointer(val) {} + FMT_INLINE value(const named_arg_info* args, size_t size) + : named_args{args, size} {} + + template FMT_CONSTEXPR FMT_INLINE value(T& val) { + using value_type = remove_cvref_t; + custom.value = const_cast(&val); + // Get the formatter type through the context to allow different contexts + // have different extension points, e.g. `formatter` for `format` and + // `printf_formatter` for `printf`. + custom.format = format_custom_arg< + value_type, + conditional_t::value, + typename Context::template formatter_type, + fallback_formatter>>; + } + value(unformattable); + value(unformattable_char); + value(unformattable_const); + value(unformattable_pointer); + + private: + // Formats an argument of a custom type, such as a user-defined class. + template + static void format_custom_arg(void* arg, + typename Context::parse_context_type& parse_ctx, + Context& ctx) { + auto f = Formatter(); + parse_ctx.advance_to(f.parse(parse_ctx)); + using qualified_type = + conditional_t(), const T, T>; + ctx.advance_to(f.format(*static_cast(arg), ctx)); + } +}; + +template +FMT_CONSTEXPR auto make_arg(T&& value) -> basic_format_arg; + +// To minimize the number of types we need to deal with, long is translated +// either to int or to long long depending on its size. +enum { long_short = sizeof(long) == sizeof(int) }; +using long_type = conditional_t; +using ulong_type = conditional_t; + +#ifdef __cpp_lib_byte +inline auto format_as(std::byte b) -> unsigned char { + return static_cast(b); +} +#endif + +template struct has_format_as { + template ::value&& std::is_integral::value)> + static auto check(U*) -> std::true_type; + static auto check(...) -> std::false_type; + + enum { value = decltype(check(static_cast(nullptr)))::value }; +}; + +// Maps formatting arguments to core types. +// arg_mapper reports errors by returning unformattable instead of using +// static_assert because it's used in the is_formattable trait. +template struct arg_mapper { + using char_type = typename Context::char_type; + + FMT_CONSTEXPR FMT_INLINE auto map(signed char val) -> int { return val; } + FMT_CONSTEXPR FMT_INLINE auto map(unsigned char val) -> unsigned { + return val; + } + FMT_CONSTEXPR FMT_INLINE auto map(short val) -> int { return val; } + FMT_CONSTEXPR FMT_INLINE auto map(unsigned short val) -> unsigned { + return val; + } + FMT_CONSTEXPR FMT_INLINE auto map(int val) -> int { return val; } + FMT_CONSTEXPR FMT_INLINE auto map(unsigned val) -> unsigned { return val; } + FMT_CONSTEXPR FMT_INLINE auto map(long val) -> long_type { return val; } + FMT_CONSTEXPR FMT_INLINE auto map(unsigned long val) -> ulong_type { + return val; + } + FMT_CONSTEXPR FMT_INLINE auto map(long long val) -> long long { return val; } + FMT_CONSTEXPR FMT_INLINE auto map(unsigned long long val) + -> unsigned long long { + return val; + } + FMT_CONSTEXPR FMT_INLINE auto map(int128_opt val) -> int128_opt { + return val; + } + FMT_CONSTEXPR FMT_INLINE auto map(uint128_opt val) -> uint128_opt { + return val; + } + FMT_CONSTEXPR FMT_INLINE auto map(bool val) -> bool { return val; } + + template ::value || + std::is_same::value)> + FMT_CONSTEXPR FMT_INLINE auto map(T val) -> char_type { + return val; + } + template ::value || +#ifdef __cpp_char8_t + std::is_same::value || +#endif + std::is_same::value || + std::is_same::value) && + !std::is_same::value, + int> = 0> + FMT_CONSTEXPR FMT_INLINE auto map(T) -> unformattable_char { + return {}; + } + + FMT_CONSTEXPR FMT_INLINE auto map(float val) -> float { return val; } + FMT_CONSTEXPR FMT_INLINE auto map(double val) -> double { return val; } + FMT_CONSTEXPR FMT_INLINE auto map(long double val) -> long double { + return val; + } + + FMT_CONSTEXPR FMT_INLINE auto map(char_type* val) -> const char_type* { + return val; + } + FMT_CONSTEXPR FMT_INLINE auto map(const char_type* val) -> const char_type* { + return val; + } + template ::value && !std::is_pointer::value && + std::is_same>::value)> + FMT_CONSTEXPR FMT_INLINE auto map(const T& val) + -> basic_string_view { + return to_string_view(val); + } + template ::value && !std::is_pointer::value && + !std::is_same>::value)> + FMT_CONSTEXPR FMT_INLINE auto map(const T&) -> unformattable_char { + return {}; + } + template >::value && + !is_string::value && !has_formatter::value && + !has_fallback_formatter::value)> + FMT_CONSTEXPR FMT_INLINE auto map(const T& val) + -> basic_string_view { + return basic_string_view(val); + } + template >::value && + !std::is_convertible>::value && + !is_string::value && !has_formatter::value && + !has_fallback_formatter::value)> + FMT_CONSTEXPR FMT_INLINE auto map(const T& val) + -> basic_string_view { + return std_string_view(val); + } + + FMT_CONSTEXPR FMT_INLINE auto map(void* val) -> const void* { return val; } + FMT_CONSTEXPR FMT_INLINE auto map(const void* val) -> const void* { + return val; + } + FMT_CONSTEXPR FMT_INLINE auto map(std::nullptr_t val) -> const void* { + return val; + } + + // We use SFINAE instead of a const T* parameter to avoid conflicting with + // the C array overload. + template < + typename T, + FMT_ENABLE_IF( + std::is_pointer::value || std::is_member_pointer::value || + std::is_function::type>::value || + (std::is_convertible::value && + !std::is_convertible::value && + !has_formatter::value))> + FMT_CONSTEXPR auto map(const T&) -> unformattable_pointer { + return {}; + } + + template ::value)> + FMT_CONSTEXPR FMT_INLINE auto map(const T (&values)[N]) -> const T (&)[N] { + return values; + } + + template ::value&& std::is_convertible::value && + !has_format_as::value && !has_formatter::value && + !has_fallback_formatter::value)> + FMT_DEPRECATED FMT_CONSTEXPR FMT_INLINE auto map(const T& val) + -> decltype(std::declval().map( + static_cast>(val))) { + return map(static_cast>(val)); + } + + template ::value && + !has_formatter::value)> + FMT_CONSTEXPR FMT_INLINE auto map(const T& val) + -> decltype(std::declval().map(format_as(T()))) { + return map(format_as(val)); + } + + template > + struct formattable + : bool_constant() || + !std::is_const>::value || + has_fallback_formatter::value> {}; + +#if (FMT_MSC_VERSION != 0 && FMT_MSC_VERSION < 1910) || \ + FMT_ICC_VERSION != 0 || defined(__NVCC__) + // Workaround a bug in MSVC and Intel (Issue 2746). + template FMT_CONSTEXPR FMT_INLINE auto do_map(T&& val) -> T& { + return val; + } +#else + template ::value)> + FMT_CONSTEXPR FMT_INLINE auto do_map(T&& val) -> T& { + return val; + } + template ::value)> + FMT_CONSTEXPR FMT_INLINE auto do_map(T&&) -> unformattable_const { + return {}; + } +#endif + + template , + FMT_ENABLE_IF(!is_string::value && !is_char::value && + !std::is_array::value && + !std::is_pointer::value && + !has_format_as::value && + (has_formatter::value || + has_fallback_formatter::value))> + FMT_CONSTEXPR FMT_INLINE auto map(T&& val) + -> decltype(this->do_map(std::forward(val))) { + return do_map(std::forward(val)); + } + + template ::value)> + FMT_CONSTEXPR FMT_INLINE auto map(const T& named_arg) + -> decltype(std::declval().map(named_arg.value)) { + return map(named_arg.value); + } + + auto map(...) -> unformattable { return {}; } +}; + +// A type constant after applying arg_mapper. +template +using mapped_type_constant = + type_constant().map(std::declval())), + typename Context::char_type>; + +enum { packed_arg_bits = 4 }; +// Maximum number of arguments with packed types. +enum { max_packed_args = 62 / packed_arg_bits }; +enum : unsigned long long { is_unpacked_bit = 1ULL << 63 }; +enum : unsigned long long { has_named_args_bit = 1ULL << 62 }; + +FMT_END_DETAIL_NAMESPACE + +// An output iterator that appends to a buffer. +// It is used to reduce symbol sizes for the common case. +class appender : public std::back_insert_iterator> { + using base = std::back_insert_iterator>; + + template + friend auto get_buffer(appender out) -> detail::buffer& { + return detail::get_container(out); + } + + public: + using std::back_insert_iterator>::back_insert_iterator; + appender(base it) noexcept : base(it) {} + FMT_UNCHECKED_ITERATOR(appender); + + auto operator++() noexcept -> appender& { return *this; } + auto operator++(int) noexcept -> appender { return *this; } +}; + +// A formatting argument. It is a trivially copyable/constructible type to +// allow storage in basic_memory_buffer. +template class basic_format_arg { + private: + detail::value value_; + detail::type type_; + + template + friend FMT_CONSTEXPR auto detail::make_arg(T&& value) + -> basic_format_arg; + + template + friend FMT_CONSTEXPR auto visit_format_arg(Visitor&& vis, + const basic_format_arg& arg) + -> decltype(vis(0)); + + friend class basic_format_args; + friend class dynamic_format_arg_store; + + using char_type = typename Context::char_type; + + template + friend struct detail::arg_data; + + basic_format_arg(const detail::named_arg_info* args, size_t size) + : value_(args, size) {} + + public: + class handle { + public: + explicit handle(detail::custom_value custom) : custom_(custom) {} + + void format(typename Context::parse_context_type& parse_ctx, + Context& ctx) const { + custom_.format(custom_.value, parse_ctx, ctx); + } + + private: + detail::custom_value custom_; + }; + + constexpr basic_format_arg() : type_(detail::type::none_type) {} + + constexpr explicit operator bool() const noexcept { + return type_ != detail::type::none_type; + } + + auto type() const -> detail::type { return type_; } + + auto is_integral() const -> bool { return detail::is_integral_type(type_); } + auto is_arithmetic() const -> bool { + return detail::is_arithmetic_type(type_); + } +}; + +/** + \rst + Visits an argument dispatching to the appropriate visit method based on + the argument type. For example, if the argument type is ``double`` then + ``vis(value)`` will be called with the value of type ``double``. + \endrst + */ +template +FMT_CONSTEXPR FMT_INLINE auto visit_format_arg( + Visitor&& vis, const basic_format_arg& arg) -> decltype(vis(0)) { + switch (arg.type_) { + case detail::type::none_type: + break; + case detail::type::int_type: + return vis(arg.value_.int_value); + case detail::type::uint_type: + return vis(arg.value_.uint_value); + case detail::type::long_long_type: + return vis(arg.value_.long_long_value); + case detail::type::ulong_long_type: + return vis(arg.value_.ulong_long_value); + case detail::type::int128_type: + return vis(detail::convert_for_visit(arg.value_.int128_value)); + case detail::type::uint128_type: + return vis(detail::convert_for_visit(arg.value_.uint128_value)); + case detail::type::bool_type: + return vis(arg.value_.bool_value); + case detail::type::char_type: + return vis(arg.value_.char_value); + case detail::type::float_type: + return vis(arg.value_.float_value); + case detail::type::double_type: + return vis(arg.value_.double_value); + case detail::type::long_double_type: + return vis(arg.value_.long_double_value); + case detail::type::cstring_type: + return vis(arg.value_.string.data); + case detail::type::string_type: + using sv = basic_string_view; + return vis(sv(arg.value_.string.data, arg.value_.string.size)); + case detail::type::pointer_type: + return vis(arg.value_.pointer); + case detail::type::custom_type: + return vis(typename basic_format_arg::handle(arg.value_.custom)); + } + return vis(monostate()); +} + +FMT_BEGIN_DETAIL_NAMESPACE + +template +auto copy_str(InputIt begin, InputIt end, appender out) -> appender { + get_container(out).append(begin, end); + return out; +} + +template +FMT_CONSTEXPR auto copy_str(R&& rng, OutputIt out) -> OutputIt { + return detail::copy_str(rng.begin(), rng.end(), out); +} + +#if FMT_GCC_VERSION && FMT_GCC_VERSION < 500 +// A workaround for gcc 4.8 to make void_t work in a SFINAE context. +template struct void_t_impl { using type = void; }; +template +using void_t = typename detail::void_t_impl::type; +#else +template using void_t = void; +#endif + +template +struct is_output_iterator : std::false_type {}; + +template +struct is_output_iterator< + It, T, + void_t::iterator_category, + decltype(*std::declval() = std::declval())>> + : std::true_type {}; + +template +struct is_back_insert_iterator : std::false_type {}; +template +struct is_back_insert_iterator> + : std::true_type {}; + +template +struct is_contiguous_back_insert_iterator : std::false_type {}; +template +struct is_contiguous_back_insert_iterator> + : is_contiguous {}; +template <> +struct is_contiguous_back_insert_iterator : std::true_type {}; + +// A type-erased reference to an std::locale to avoid a heavy include. +class locale_ref { + private: + const void* locale_; // A type-erased pointer to std::locale. + + public: + constexpr locale_ref() : locale_(nullptr) {} + template explicit locale_ref(const Locale& loc); + + explicit operator bool() const noexcept { return locale_ != nullptr; } + + template auto get() const -> Locale; +}; + +template constexpr auto encode_types() -> unsigned long long { + return 0; +} + +template +constexpr auto encode_types() -> unsigned long long { + return static_cast(mapped_type_constant::value) | + (encode_types() << packed_arg_bits); +} + +template +FMT_CONSTEXPR FMT_INLINE auto make_value(T&& val) -> value { + const auto& arg = arg_mapper().map(FMT_FORWARD(val)); + + constexpr bool formattable_char = + !std::is_same::value; + static_assert(formattable_char, "Mixing character types is disallowed."); + + constexpr bool formattable_const = + !std::is_same::value; + static_assert(formattable_const, "Cannot format a const argument."); + + // Formatting of arbitrary pointers is disallowed. If you want to output + // a pointer cast it to "void *" or "const void *". In particular, this + // forbids formatting of "[const] volatile char *" which is printed as bool + // by iostreams. + constexpr bool formattable_pointer = + !std::is_same::value; + static_assert(formattable_pointer, + "Formatting of non-void pointers is disallowed."); + + constexpr bool formattable = + !std::is_same::value; + static_assert( + formattable, + "Cannot format an argument. To make type T formattable provide a " + "formatter specialization: https://fmt.dev/latest/api.html#udt"); + return {arg}; +} + +template +FMT_CONSTEXPR auto make_arg(T&& value) -> basic_format_arg { + basic_format_arg arg; + arg.type_ = mapped_type_constant::value; + arg.value_ = make_value(value); + return arg; +} + +// The type template parameter is there to avoid an ODR violation when using +// a fallback formatter in one translation unit and an implicit conversion in +// another (not recommended). +template +FMT_CONSTEXPR FMT_INLINE auto make_arg(T&& val) -> value { + return make_value(val); +} + +template +FMT_CONSTEXPR inline auto make_arg(T&& value) -> basic_format_arg { + return make_arg(value); +} +FMT_END_DETAIL_NAMESPACE + +// Formatting context. +template class basic_format_context { + public: + /** The character type for the output. */ + using char_type = Char; + + private: + OutputIt out_; + basic_format_args args_; + detail::locale_ref loc_; + + public: + using iterator = OutputIt; + using format_arg = basic_format_arg; + using parse_context_type = basic_format_parse_context; + template using formatter_type = formatter; + + basic_format_context(basic_format_context&&) = default; + basic_format_context(const basic_format_context&) = delete; + void operator=(const basic_format_context&) = delete; + /** + Constructs a ``basic_format_context`` object. References to the arguments are + stored in the object so make sure they have appropriate lifetimes. + */ + constexpr basic_format_context( + OutputIt out, basic_format_args ctx_args, + detail::locale_ref loc = detail::locale_ref()) + : out_(out), args_(ctx_args), loc_(loc) {} + + constexpr auto arg(int id) const -> format_arg { return args_.get(id); } + FMT_CONSTEXPR auto arg(basic_string_view name) -> format_arg { + return args_.get(name); + } + FMT_CONSTEXPR auto arg_id(basic_string_view name) -> int { + return args_.get_id(name); + } + auto args() const -> const basic_format_args& { + return args_; + } + + FMT_CONSTEXPR auto error_handler() -> detail::error_handler { return {}; } + void on_error(const char* message) { error_handler().on_error(message); } + + // Returns an iterator to the beginning of the output range. + FMT_CONSTEXPR auto out() -> iterator { return out_; } + + // Advances the begin iterator to ``it``. + void advance_to(iterator it) { + if (!detail::is_back_insert_iterator()) out_ = it; + } + + FMT_CONSTEXPR auto locale() -> detail::locale_ref { return loc_; } +}; + +template +using buffer_context = + basic_format_context, Char>; +using format_context = buffer_context; + +// Workaround an alias issue: https://stackoverflow.com/q/62767544/471164. +#define FMT_BUFFER_CONTEXT(Char) \ + basic_format_context, Char> + +template +using is_formattable = bool_constant< + !std::is_base_of>().map( + std::declval()))>::value && + !detail::has_fallback_formatter::value>; + +/** + \rst + An array of references to arguments. It can be implicitly converted into + `~fmt::basic_format_args` for passing into type-erased formatting functions + such as `~fmt::vformat`. + \endrst + */ +template +class format_arg_store +#if FMT_GCC_VERSION && FMT_GCC_VERSION < 409 + // Workaround a GCC template argument substitution bug. + : public basic_format_args +#endif +{ + private: + static const size_t num_args = sizeof...(Args); + static const size_t num_named_args = detail::count_named_args(); + static const bool is_packed = num_args <= detail::max_packed_args; + + using value_type = conditional_t, + basic_format_arg>; + + detail::arg_data + data_; + + friend class basic_format_args; + + static constexpr unsigned long long desc = + (is_packed ? detail::encode_types() + : detail::is_unpacked_bit | num_args) | + (num_named_args != 0 + ? static_cast(detail::has_named_args_bit) + : 0); + + public: + template + FMT_CONSTEXPR FMT_INLINE format_arg_store(T&&... args) + : +#if FMT_GCC_VERSION && FMT_GCC_VERSION < 409 + basic_format_args(*this), +#endif + data_{detail::make_arg< + is_packed, Context, + detail::mapped_type_constant, Context>::value>( + FMT_FORWARD(args))...} { + detail::init_named_args(data_.named_args(), 0, 0, args...); + } +}; + +/** + \rst + Constructs a `~fmt::format_arg_store` object that contains references to + arguments and can be implicitly converted to `~fmt::format_args`. `Context` + can be omitted in which case it defaults to `~fmt::context`. + See `~fmt::arg` for lifetime considerations. + \endrst + */ +template +constexpr auto make_format_args(Args&&... args) + -> format_arg_store...> { + return {FMT_FORWARD(args)...}; +} + +/** + \rst + Returns a named argument to be used in a formatting function. + It should only be used in a call to a formatting function or + `dynamic_format_arg_store::push_back`. + + **Example**:: + + fmt::print("Elapsed time: {s:.2f} seconds", fmt::arg("s", 1.23)); + \endrst + */ +template +inline auto arg(const Char* name, const T& arg) -> detail::named_arg { + static_assert(!detail::is_named_arg(), "nested named arguments"); + return {name, arg}; +} + +/** + \rst + A view of a collection of formatting arguments. To avoid lifetime issues it + should only be used as a parameter type in type-erased functions such as + ``vformat``:: + + void vlog(string_view format_str, format_args args); // OK + format_args args = make_format_args(42); // Error: dangling reference + \endrst + */ +template class basic_format_args { + public: + using size_type = int; + using format_arg = basic_format_arg; + + private: + // A descriptor that contains information about formatting arguments. + // If the number of arguments is less or equal to max_packed_args then + // argument types are passed in the descriptor. This reduces binary code size + // per formatting function call. + unsigned long long desc_; + union { + // If is_packed() returns true then argument values are stored in values_; + // otherwise they are stored in args_. This is done to improve cache + // locality and reduce compiled code size since storing larger objects + // may require more code (at least on x86-64) even if the same amount of + // data is actually copied to stack. It saves ~10% on the bloat test. + const detail::value* values_; + const format_arg* args_; + }; + + constexpr auto is_packed() const -> bool { + return (desc_ & detail::is_unpacked_bit) == 0; + } + auto has_named_args() const -> bool { + return (desc_ & detail::has_named_args_bit) != 0; + } + + FMT_CONSTEXPR auto type(int index) const -> detail::type { + int shift = index * detail::packed_arg_bits; + unsigned int mask = (1 << detail::packed_arg_bits) - 1; + return static_cast((desc_ >> shift) & mask); + } + + constexpr FMT_INLINE basic_format_args(unsigned long long desc, + const detail::value* values) + : desc_(desc), values_(values) {} + constexpr basic_format_args(unsigned long long desc, const format_arg* args) + : desc_(desc), args_(args) {} + + public: + constexpr basic_format_args() : desc_(0), args_(nullptr) {} + + /** + \rst + Constructs a `basic_format_args` object from `~fmt::format_arg_store`. + \endrst + */ + template + constexpr FMT_INLINE basic_format_args( + const format_arg_store& store) + : basic_format_args(format_arg_store::desc, + store.data_.args()) {} + + /** + \rst + Constructs a `basic_format_args` object from + `~fmt::dynamic_format_arg_store`. + \endrst + */ + constexpr FMT_INLINE basic_format_args( + const dynamic_format_arg_store& store) + : basic_format_args(store.get_types(), store.data()) {} + + /** + \rst + Constructs a `basic_format_args` object from a dynamic set of arguments. + \endrst + */ + constexpr basic_format_args(const format_arg* args, int count) + : basic_format_args(detail::is_unpacked_bit | detail::to_unsigned(count), + args) {} + + /** Returns the argument with the specified id. */ + FMT_CONSTEXPR auto get(int id) const -> format_arg { + format_arg arg; + if (!is_packed()) { + if (id < max_size()) arg = args_[id]; + return arg; + } + if (id >= detail::max_packed_args) return arg; + arg.type_ = type(id); + if (arg.type_ == detail::type::none_type) return arg; + arg.value_ = values_[id]; + return arg; + } + + template + auto get(basic_string_view name) const -> format_arg { + int id = get_id(name); + return id >= 0 ? get(id) : format_arg(); + } + + template + auto get_id(basic_string_view name) const -> int { + if (!has_named_args()) return -1; + const auto& named_args = + (is_packed() ? values_[-1] : args_[-1].value_).named_args; + for (size_t i = 0; i < named_args.size; ++i) { + if (named_args.data[i].name == name) return named_args.data[i].id; + } + return -1; + } + + auto max_size() const -> int { + unsigned long long max_packed = detail::max_packed_args; + return static_cast(is_packed() ? max_packed + : desc_ & ~detail::is_unpacked_bit); + } +}; + +/** An alias to ``basic_format_args``. */ +// A separate type would result in shorter symbols but break ABI compatibility +// between clang and gcc on ARM (#1919). +using format_args = basic_format_args; + +// We cannot use enum classes as bit fields because of a gcc bug, so we put them +// in namespaces instead (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61414). +// Additionally, if an underlying type is specified, older gcc incorrectly warns +// that the type is too small. Both bugs are fixed in gcc 9.3. +#if FMT_GCC_VERSION && FMT_GCC_VERSION < 903 +# define FMT_ENUM_UNDERLYING_TYPE(type) +#else +# define FMT_ENUM_UNDERLYING_TYPE(type) : type +#endif +namespace align { +enum type FMT_ENUM_UNDERLYING_TYPE(unsigned char){none, left, right, center, + numeric}; +} +using align_t = align::type; +namespace sign { +enum type FMT_ENUM_UNDERLYING_TYPE(unsigned char){none, minus, plus, space}; +} +using sign_t = sign::type; + +FMT_BEGIN_DETAIL_NAMESPACE + +// Workaround an array initialization issue in gcc 4.8. +template struct fill_t { + private: + enum { max_size = 4 }; + Char data_[max_size] = {Char(' '), Char(0), Char(0), Char(0)}; + unsigned char size_ = 1; + + public: + FMT_CONSTEXPR void operator=(basic_string_view s) { + auto size = s.size(); + if (size > max_size) return throw_format_error("invalid fill"); + for (size_t i = 0; i < size; ++i) data_[i] = s[i]; + size_ = static_cast(size); + } + + constexpr auto size() const -> size_t { return size_; } + constexpr auto data() const -> const Char* { return data_; } + + FMT_CONSTEXPR auto operator[](size_t index) -> Char& { return data_[index]; } + FMT_CONSTEXPR auto operator[](size_t index) const -> const Char& { + return data_[index]; + } +}; +FMT_END_DETAIL_NAMESPACE + +enum class presentation_type : unsigned char { + none, + // Integer types should go first, + dec, // 'd' + oct, // 'o' + hex_lower, // 'x' + hex_upper, // 'X' + bin_lower, // 'b' + bin_upper, // 'B' + hexfloat_lower, // 'a' + hexfloat_upper, // 'A' + exp_lower, // 'e' + exp_upper, // 'E' + fixed_lower, // 'f' + fixed_upper, // 'F' + general_lower, // 'g' + general_upper, // 'G' + chr, // 'c' + string, // 's' + pointer, // 'p' + debug // '?' +}; + +// Format specifiers for built-in and string types. +template struct basic_format_specs { + int width; + int precision; + presentation_type type; + align_t align : 4; + sign_t sign : 3; + bool alt : 1; // Alternate form ('#'). + bool localized : 1; + detail::fill_t fill; + + constexpr basic_format_specs() + : width(0), + precision(-1), + type(presentation_type::none), + align(align::none), + sign(sign::none), + alt(false), + localized(false) {} +}; + +using format_specs = basic_format_specs; + +FMT_BEGIN_DETAIL_NAMESPACE + +enum class arg_id_kind { none, index, name }; + +// An argument reference. +template struct arg_ref { + FMT_CONSTEXPR arg_ref() : kind(arg_id_kind::none), val() {} + + FMT_CONSTEXPR explicit arg_ref(int index) + : kind(arg_id_kind::index), val(index) {} + FMT_CONSTEXPR explicit arg_ref(basic_string_view name) + : kind(arg_id_kind::name), val(name) {} + + FMT_CONSTEXPR auto operator=(int idx) -> arg_ref& { + kind = arg_id_kind::index; + val.index = idx; + return *this; + } + + arg_id_kind kind; + union value { + FMT_CONSTEXPR value(int id = 0) : index{id} {} + FMT_CONSTEXPR value(basic_string_view n) : name(n) {} + + int index; + basic_string_view name; + } val; +}; + +// Format specifiers with width and precision resolved at formatting rather +// than parsing time to allow re-using the same parsed specifiers with +// different sets of arguments (precompilation of format strings). +template +struct dynamic_format_specs : basic_format_specs { + arg_ref width_ref; + arg_ref precision_ref; +}; + +struct auto_id {}; + +// A format specifier handler that sets fields in basic_format_specs. +template class specs_setter { + protected: + basic_format_specs& specs_; + + public: + explicit FMT_CONSTEXPR specs_setter(basic_format_specs& specs) + : specs_(specs) {} + + FMT_CONSTEXPR specs_setter(const specs_setter& other) + : specs_(other.specs_) {} + + FMT_CONSTEXPR void on_align(align_t align) { specs_.align = align; } + FMT_CONSTEXPR void on_fill(basic_string_view fill) { + specs_.fill = fill; + } + FMT_CONSTEXPR void on_sign(sign_t s) { specs_.sign = s; } + FMT_CONSTEXPR void on_hash() { specs_.alt = true; } + FMT_CONSTEXPR void on_localized() { specs_.localized = true; } + + FMT_CONSTEXPR void on_zero() { + if (specs_.align == align::none) specs_.align = align::numeric; + specs_.fill[0] = Char('0'); + } + + FMT_CONSTEXPR void on_width(int width) { specs_.width = width; } + FMT_CONSTEXPR void on_precision(int precision) { + specs_.precision = precision; + } + FMT_CONSTEXPR void end_precision() {} + + FMT_CONSTEXPR void on_type(presentation_type type) { specs_.type = type; } +}; + +// Format spec handler that saves references to arguments representing dynamic +// width and precision to be resolved at formatting time. +template +class dynamic_specs_handler + : public specs_setter { + public: + using char_type = typename ParseContext::char_type; + + FMT_CONSTEXPR dynamic_specs_handler(dynamic_format_specs& specs, + ParseContext& ctx) + : specs_setter(specs), specs_(specs), context_(ctx) {} + + FMT_CONSTEXPR dynamic_specs_handler(const dynamic_specs_handler& other) + : specs_setter(other), + specs_(other.specs_), + context_(other.context_) {} + + template FMT_CONSTEXPR void on_dynamic_width(Id arg_id) { + specs_.width_ref = make_arg_ref(arg_id); + } + + template FMT_CONSTEXPR void on_dynamic_precision(Id arg_id) { + specs_.precision_ref = make_arg_ref(arg_id); + } + + FMT_CONSTEXPR void on_error(const char* message) { + context_.on_error(message); + } + + private: + dynamic_format_specs& specs_; + ParseContext& context_; + + using arg_ref_type = arg_ref; + + FMT_CONSTEXPR auto make_arg_ref(int arg_id) -> arg_ref_type { + context_.check_arg_id(arg_id); + context_.check_dynamic_spec(arg_id); + return arg_ref_type(arg_id); + } + + FMT_CONSTEXPR auto make_arg_ref(auto_id) -> arg_ref_type { + int arg_id = context_.next_arg_id(); + context_.check_dynamic_spec(arg_id); + return arg_ref_type(arg_id); + } + + FMT_CONSTEXPR auto make_arg_ref(basic_string_view arg_id) + -> arg_ref_type { + context_.check_arg_id(arg_id); + basic_string_view format_str( + context_.begin(), to_unsigned(context_.end() - context_.begin())); + return arg_ref_type(arg_id); + } +}; + +template constexpr bool is_ascii_letter(Char c) { + return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); +} + +// Converts a character to ASCII. Returns a number > 127 on conversion failure. +template ::value)> +constexpr auto to_ascii(Char c) -> Char { + return c; +} +template ::value)> +constexpr auto to_ascii(Char c) -> underlying_t { + return c; +} + +FMT_CONSTEXPR inline auto code_point_length_impl(char c) -> int { + return "\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\0\0\0\0\0\0\0\0\2\2\2\2\3\3\4" + [static_cast(c) >> 3]; +} + +template +FMT_CONSTEXPR auto code_point_length(const Char* begin) -> int { + if (const_check(sizeof(Char) != 1)) return 1; + int len = code_point_length_impl(static_cast(*begin)); + + // Compute the pointer to the next character early so that the next + // iteration can start working on the next character. Neither Clang + // nor GCC figure out this reordering on their own. + return len + !len; +} + +// Return the result via the out param to workaround gcc bug 77539. +template +FMT_CONSTEXPR auto find(Ptr first, Ptr last, T value, Ptr& out) -> bool { + for (out = first; out != last; ++out) { + if (*out == value) return true; + } + return false; +} + +template <> +inline auto find(const char* first, const char* last, char value, + const char*& out) -> bool { + out = static_cast( + std::memchr(first, value, to_unsigned(last - first))); + return out != nullptr; +} + +// Parses the range [begin, end) as an unsigned integer. This function assumes +// that the range is non-empty and the first character is a digit. +template +FMT_CONSTEXPR auto parse_nonnegative_int(const Char*& begin, const Char* end, + int error_value) noexcept -> int { + FMT_ASSERT(begin != end && '0' <= *begin && *begin <= '9', ""); + unsigned value = 0, prev = 0; + auto p = begin; + do { + prev = value; + value = value * 10 + unsigned(*p - '0'); + ++p; + } while (p != end && '0' <= *p && *p <= '9'); + auto num_digits = p - begin; + begin = p; + if (num_digits <= std::numeric_limits::digits10) + return static_cast(value); + // Check for overflow. + const unsigned max = to_unsigned((std::numeric_limits::max)()); + return num_digits == std::numeric_limits::digits10 + 1 && + prev * 10ull + unsigned(p[-1] - '0') <= max + ? static_cast(value) + : error_value; +} + +// Parses fill and alignment. +template +FMT_CONSTEXPR auto parse_align(const Char* begin, const Char* end, + Handler&& handler) -> const Char* { + FMT_ASSERT(begin != end, ""); + auto align = align::none; + auto p = begin + code_point_length(begin); + if (end - p <= 0) p = begin; + for (;;) { + switch (to_ascii(*p)) { + case '<': + align = align::left; + break; + case '>': + align = align::right; + break; + case '^': + align = align::center; + break; + default: + break; + } + if (align != align::none) { + if (p != begin) { + auto c = *begin; + if (c == '{') + return handler.on_error("invalid fill character '{'"), begin; + handler.on_fill(basic_string_view(begin, to_unsigned(p - begin))); + begin = p + 1; + } else + ++begin; + handler.on_align(align); + break; + } else if (p == begin) { + break; + } + p = begin; + } + return begin; +} + +template FMT_CONSTEXPR bool is_name_start(Char c) { + return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || '_' == c; +} + +template +FMT_CONSTEXPR auto do_parse_arg_id(const Char* begin, const Char* end, + IDHandler&& handler) -> const Char* { + FMT_ASSERT(begin != end, ""); + Char c = *begin; + if (c >= '0' && c <= '9') { + int index = 0; + if (c != '0') + index = + parse_nonnegative_int(begin, end, (std::numeric_limits::max)()); + else + ++begin; + if (begin == end || (*begin != '}' && *begin != ':')) + handler.on_error("invalid format string"); + else + handler(index); + return begin; + } + if (!is_name_start(c)) { + handler.on_error("invalid format string"); + return begin; + } + auto it = begin; + do { + ++it; + } while (it != end && (is_name_start(c = *it) || ('0' <= c && c <= '9'))); + handler(basic_string_view(begin, to_unsigned(it - begin))); + return it; +} + +template +FMT_CONSTEXPR FMT_INLINE auto parse_arg_id(const Char* begin, const Char* end, + IDHandler&& handler) -> const Char* { + Char c = *begin; + if (c != '}' && c != ':') return do_parse_arg_id(begin, end, handler); + handler(); + return begin; +} + +template +FMT_CONSTEXPR auto parse_width(const Char* begin, const Char* end, + Handler&& handler) -> const Char* { + using detail::auto_id; + struct width_adapter { + Handler& handler; + + FMT_CONSTEXPR void operator()() { handler.on_dynamic_width(auto_id()); } + FMT_CONSTEXPR void operator()(int id) { handler.on_dynamic_width(id); } + FMT_CONSTEXPR void operator()(basic_string_view id) { + handler.on_dynamic_width(id); + } + FMT_CONSTEXPR void on_error(const char* message) { + if (message) handler.on_error(message); + } + }; + + FMT_ASSERT(begin != end, ""); + if ('0' <= *begin && *begin <= '9') { + int width = parse_nonnegative_int(begin, end, -1); + if (width != -1) + handler.on_width(width); + else + handler.on_error("number is too big"); + } else if (*begin == '{') { + ++begin; + if (begin != end) begin = parse_arg_id(begin, end, width_adapter{handler}); + if (begin == end || *begin != '}') + return handler.on_error("invalid format string"), begin; + ++begin; + } + return begin; +} + +template +FMT_CONSTEXPR auto parse_precision(const Char* begin, const Char* end, + Handler&& handler) -> const Char* { + using detail::auto_id; + struct precision_adapter { + Handler& handler; + + FMT_CONSTEXPR void operator()() { handler.on_dynamic_precision(auto_id()); } + FMT_CONSTEXPR void operator()(int id) { handler.on_dynamic_precision(id); } + FMT_CONSTEXPR void operator()(basic_string_view id) { + handler.on_dynamic_precision(id); + } + FMT_CONSTEXPR void on_error(const char* message) { + if (message) handler.on_error(message); + } + }; + + ++begin; + auto c = begin != end ? *begin : Char(); + if ('0' <= c && c <= '9') { + auto precision = parse_nonnegative_int(begin, end, -1); + if (precision != -1) + handler.on_precision(precision); + else + handler.on_error("number is too big"); + } else if (c == '{') { + ++begin; + if (begin != end) + begin = parse_arg_id(begin, end, precision_adapter{handler}); + if (begin == end || *begin++ != '}') + return handler.on_error("invalid format string"), begin; + } else { + return handler.on_error("missing precision specifier"), begin; + } + handler.end_precision(); + return begin; +} + +template +FMT_CONSTEXPR auto parse_presentation_type(Char type) -> presentation_type { + switch (to_ascii(type)) { + case 'd': + return presentation_type::dec; + case 'o': + return presentation_type::oct; + case 'x': + return presentation_type::hex_lower; + case 'X': + return presentation_type::hex_upper; + case 'b': + return presentation_type::bin_lower; + case 'B': + return presentation_type::bin_upper; + case 'a': + return presentation_type::hexfloat_lower; + case 'A': + return presentation_type::hexfloat_upper; + case 'e': + return presentation_type::exp_lower; + case 'E': + return presentation_type::exp_upper; + case 'f': + return presentation_type::fixed_lower; + case 'F': + return presentation_type::fixed_upper; + case 'g': + return presentation_type::general_lower; + case 'G': + return presentation_type::general_upper; + case 'c': + return presentation_type::chr; + case 's': + return presentation_type::string; + case 'p': + return presentation_type::pointer; + case '?': + return presentation_type::debug; + default: + return presentation_type::none; + } +} + +// Parses standard format specifiers and sends notifications about parsed +// components to handler. +template +FMT_CONSTEXPR FMT_INLINE auto parse_format_specs(const Char* begin, + const Char* end, + SpecHandler&& handler) + -> const Char* { + if (1 < end - begin && begin[1] == '}' && is_ascii_letter(*begin) && + *begin != 'L') { + presentation_type type = parse_presentation_type(*begin++); + if (type == presentation_type::none) + handler.on_error("invalid type specifier"); + handler.on_type(type); + return begin; + } + + if (begin == end) return begin; + + begin = parse_align(begin, end, handler); + if (begin == end) return begin; + + // Parse sign. + switch (to_ascii(*begin)) { + case '+': + handler.on_sign(sign::plus); + ++begin; + break; + case '-': + handler.on_sign(sign::minus); + ++begin; + break; + case ' ': + handler.on_sign(sign::space); + ++begin; + break; + default: + break; + } + if (begin == end) return begin; + + if (*begin == '#') { + handler.on_hash(); + if (++begin == end) return begin; + } + + // Parse zero flag. + if (*begin == '0') { + handler.on_zero(); + if (++begin == end) return begin; + } + + begin = parse_width(begin, end, handler); + if (begin == end) return begin; + + // Parse precision. + if (*begin == '.') { + begin = parse_precision(begin, end, handler); + if (begin == end) return begin; + } + + if (*begin == 'L') { + handler.on_localized(); + ++begin; + } + + // Parse type. + if (begin != end && *begin != '}') { + presentation_type type = parse_presentation_type(*begin++); + if (type == presentation_type::none) + handler.on_error("invalid type specifier"); + handler.on_type(type); + } + return begin; +} + +template +FMT_CONSTEXPR auto parse_replacement_field(const Char* begin, const Char* end, + Handler&& handler) -> const Char* { + struct id_adapter { + Handler& handler; + int arg_id; + + FMT_CONSTEXPR void operator()() { arg_id = handler.on_arg_id(); } + FMT_CONSTEXPR void operator()(int id) { arg_id = handler.on_arg_id(id); } + FMT_CONSTEXPR void operator()(basic_string_view id) { + arg_id = handler.on_arg_id(id); + } + FMT_CONSTEXPR void on_error(const char* message) { + if (message) handler.on_error(message); + } + }; + + ++begin; + if (begin == end) return handler.on_error("invalid format string"), end; + if (*begin == '}') { + handler.on_replacement_field(handler.on_arg_id(), begin); + } else if (*begin == '{') { + handler.on_text(begin, begin + 1); + } else { + auto adapter = id_adapter{handler, 0}; + begin = parse_arg_id(begin, end, adapter); + Char c = begin != end ? *begin : Char(); + if (c == '}') { + handler.on_replacement_field(adapter.arg_id, begin); + } else if (c == ':') { + begin = handler.on_format_specs(adapter.arg_id, begin + 1, end); + if (begin == end || *begin != '}') + return handler.on_error("unknown format specifier"), end; + } else { + return handler.on_error("missing '}' in format string"), end; + } + } + return begin + 1; +} + +template +FMT_CONSTEXPR FMT_INLINE void parse_format_string( + basic_string_view format_str, Handler&& handler) { + // Workaround a name-lookup bug in MSVC's modules implementation. + using detail::find; + + auto begin = format_str.data(); + auto end = begin + format_str.size(); + if (end - begin < 32) { + // Use a simple loop instead of memchr for small strings. + const Char* p = begin; + while (p != end) { + auto c = *p++; + if (c == '{') { + handler.on_text(begin, p - 1); + begin = p = parse_replacement_field(p - 1, end, handler); + } else if (c == '}') { + if (p == end || *p != '}') + return handler.on_error("unmatched '}' in format string"); + handler.on_text(begin, p); + begin = ++p; + } + } + handler.on_text(begin, end); + return; + } + struct writer { + FMT_CONSTEXPR void operator()(const Char* from, const Char* to) { + if (from == to) return; + for (;;) { + const Char* p = nullptr; + if (!find(from, to, Char('}'), p)) + return handler_.on_text(from, to); + ++p; + if (p == to || *p != '}') + return handler_.on_error("unmatched '}' in format string"); + handler_.on_text(from, p); + from = p + 1; + } + } + Handler& handler_; + } write = {handler}; + while (begin != end) { + // Doing two passes with memchr (one for '{' and another for '}') is up to + // 2.5x faster than the naive one-pass implementation on big format strings. + const Char* p = begin; + if (*begin != '{' && !find(begin + 1, end, Char('{'), p)) + return write(begin, end); + write(begin, p); + begin = parse_replacement_field(p, end, handler); + } +} + +template ::value> struct strip_named_arg { + using type = T; +}; +template struct strip_named_arg { + using type = remove_cvref_t; +}; + +template +FMT_CONSTEXPR auto parse_format_specs(ParseContext& ctx) + -> decltype(ctx.begin()) { + using char_type = typename ParseContext::char_type; + using context = buffer_context; + using stripped_type = typename strip_named_arg::type; + using mapped_type = conditional_t< + mapped_type_constant::value != type::custom_type, + decltype(arg_mapper().map(std::declval())), + stripped_type>; + auto f = conditional_t::value, + formatter, + fallback_formatter>(); + return f.parse(ctx); +} + +template +FMT_CONSTEXPR void check_int_type_spec(presentation_type type, + ErrorHandler&& eh) { + if (type > presentation_type::bin_upper && type != presentation_type::chr) + eh.on_error("invalid type specifier"); +} + +// Checks char specs and returns true if the type spec is char (and not int). +template +FMT_CONSTEXPR auto check_char_specs(const basic_format_specs& specs, + ErrorHandler&& eh = {}) -> bool { + if (specs.type != presentation_type::none && + specs.type != presentation_type::chr && + specs.type != presentation_type::debug) { + check_int_type_spec(specs.type, eh); + return false; + } + if (specs.align == align::numeric || specs.sign != sign::none || specs.alt) + eh.on_error("invalid format specifier for char"); + return true; +} + +// A floating-point presentation format. +enum class float_format : unsigned char { + general, // General: exponent notation or fixed point based on magnitude. + exp, // Exponent notation with the default precision of 6, e.g. 1.2e-3. + fixed, // Fixed point with the default precision of 6, e.g. 0.0012. + hex +}; + +struct float_specs { + int precision; + float_format format : 8; + sign_t sign : 8; + bool upper : 1; + bool locale : 1; + bool binary32 : 1; + bool showpoint : 1; +}; + +template +FMT_CONSTEXPR auto parse_float_type_spec(const basic_format_specs& specs, + ErrorHandler&& eh = {}) + -> float_specs { + auto result = float_specs(); + result.showpoint = specs.alt; + result.locale = specs.localized; + switch (specs.type) { + case presentation_type::none: + result.format = float_format::general; + break; + case presentation_type::general_upper: + result.upper = true; + FMT_FALLTHROUGH; + case presentation_type::general_lower: + result.format = float_format::general; + break; + case presentation_type::exp_upper: + result.upper = true; + FMT_FALLTHROUGH; + case presentation_type::exp_lower: + result.format = float_format::exp; + result.showpoint |= specs.precision != 0; + break; + case presentation_type::fixed_upper: + result.upper = true; + FMT_FALLTHROUGH; + case presentation_type::fixed_lower: + result.format = float_format::fixed; + result.showpoint |= specs.precision != 0; + break; + case presentation_type::hexfloat_upper: + result.upper = true; + FMT_FALLTHROUGH; + case presentation_type::hexfloat_lower: + result.format = float_format::hex; + break; + default: + eh.on_error("invalid type specifier"); + break; + } + return result; +} + +template +FMT_CONSTEXPR auto check_cstring_type_spec(presentation_type type, + ErrorHandler&& eh = {}) -> bool { + if (type == presentation_type::none || type == presentation_type::string || + type == presentation_type::debug) + return true; + if (type != presentation_type::pointer) eh.on_error("invalid type specifier"); + return false; +} + +template +FMT_CONSTEXPR void check_string_type_spec(presentation_type type, + ErrorHandler&& eh = {}) { + if (type != presentation_type::none && type != presentation_type::string && + type != presentation_type::debug) + eh.on_error("invalid type specifier"); +} + +template +FMT_CONSTEXPR void check_pointer_type_spec(presentation_type type, + ErrorHandler&& eh) { + if (type != presentation_type::none && type != presentation_type::pointer) + eh.on_error("invalid type specifier"); +} + +// A parse_format_specs handler that checks if specifiers are consistent with +// the argument type. +template class specs_checker : public Handler { + private: + detail::type arg_type_; + + FMT_CONSTEXPR void require_numeric_argument() { + if (!is_arithmetic_type(arg_type_)) + this->on_error("format specifier requires numeric argument"); + } + + public: + FMT_CONSTEXPR specs_checker(const Handler& handler, detail::type arg_type) + : Handler(handler), arg_type_(arg_type) {} + + FMT_CONSTEXPR void on_align(align_t align) { + if (align == align::numeric) require_numeric_argument(); + Handler::on_align(align); + } + + FMT_CONSTEXPR void on_sign(sign_t s) { + require_numeric_argument(); + if (is_integral_type(arg_type_) && arg_type_ != type::int_type && + arg_type_ != type::long_long_type && arg_type_ != type::int128_type && + arg_type_ != type::char_type) { + this->on_error("format specifier requires signed argument"); + } + Handler::on_sign(s); + } + + FMT_CONSTEXPR void on_hash() { + require_numeric_argument(); + Handler::on_hash(); + } + + FMT_CONSTEXPR void on_localized() { + require_numeric_argument(); + Handler::on_localized(); + } + + FMT_CONSTEXPR void on_zero() { + require_numeric_argument(); + Handler::on_zero(); + } + + FMT_CONSTEXPR void end_precision() { + if (is_integral_type(arg_type_) || arg_type_ == type::pointer_type) + this->on_error("precision not allowed for this argument type"); + } +}; + +constexpr int invalid_arg_index = -1; + +#if FMT_USE_NONTYPE_TEMPLATE_ARGS +template +constexpr auto get_arg_index_by_name(basic_string_view name) -> int { + if constexpr (detail::is_statically_named_arg()) { + if (name == T::name) return N; + } + if constexpr (sizeof...(Args) > 0) + return get_arg_index_by_name(name); + (void)name; // Workaround an MSVC bug about "unused" parameter. + return invalid_arg_index; +} +#endif + +template +FMT_CONSTEXPR auto get_arg_index_by_name(basic_string_view name) -> int { +#if FMT_USE_NONTYPE_TEMPLATE_ARGS + if constexpr (sizeof...(Args) > 0) + return get_arg_index_by_name<0, Args...>(name); +#endif + (void)name; + return invalid_arg_index; +} + +template +class format_string_checker { + private: + // In the future basic_format_parse_context will replace compile_parse_context + // here and will use is_constant_evaluated and downcasting to access the data + // needed for compile-time checks: https://godbolt.org/z/GvWzcTjh1. + using parse_context_type = compile_parse_context; + static constexpr int num_args = sizeof...(Args); + + // Format specifier parsing function. + using parse_func = const Char* (*)(parse_context_type&); + + parse_context_type context_; + parse_func parse_funcs_[num_args > 0 ? static_cast(num_args) : 1]; + type types_[num_args > 0 ? static_cast(num_args) : 1]; + + public: + explicit FMT_CONSTEXPR format_string_checker( + basic_string_view format_str, ErrorHandler eh) + : context_(format_str, num_args, types_, eh), + parse_funcs_{&parse_format_specs...}, + types_{ + mapped_type_constant>::value...} { + } + + FMT_CONSTEXPR void on_text(const Char*, const Char*) {} + + FMT_CONSTEXPR auto on_arg_id() -> int { return context_.next_arg_id(); } + FMT_CONSTEXPR auto on_arg_id(int id) -> int { + return context_.check_arg_id(id), id; + } + FMT_CONSTEXPR auto on_arg_id(basic_string_view id) -> int { +#if FMT_USE_NONTYPE_TEMPLATE_ARGS + auto index = get_arg_index_by_name(id); + if (index == invalid_arg_index) on_error("named argument is not found"); + return context_.check_arg_id(index), index; +#else + (void)id; + on_error("compile-time checks for named arguments require C++20 support"); + return 0; +#endif + } + + FMT_CONSTEXPR void on_replacement_field(int, const Char*) {} + + FMT_CONSTEXPR auto on_format_specs(int id, const Char* begin, const Char*) + -> const Char* { + context_.advance_to(context_.begin() + (begin - &*context_.begin())); + // id >= 0 check is a workaround for gcc 10 bug (#2065). + return id >= 0 && id < num_args ? parse_funcs_[id](context_) : begin; + } + + FMT_CONSTEXPR void on_error(const char* message) { + context_.on_error(message); + } +}; + +// Reports a compile-time error if S is not a valid format string. +template ::value)> +FMT_INLINE void check_format_string(const S&) { +#ifdef FMT_ENFORCE_COMPILE_STRING + static_assert(is_compile_string::value, + "FMT_ENFORCE_COMPILE_STRING requires all format strings to use " + "FMT_STRING."); +#endif +} +template ::value)> +void check_format_string(S format_str) { + FMT_CONSTEXPR auto s = basic_string_view(format_str); + using checker = format_string_checker...>; + FMT_CONSTEXPR bool invalid_format = + (parse_format_string(s, checker(s, {})), true); + ignore_unused(invalid_format); +} + +template +void vformat_to( + buffer& buf, basic_string_view fmt, + basic_format_args)> args, + locale_ref loc = {}); + +FMT_API void vprint_mojibake(std::FILE*, string_view, format_args); +#ifndef _WIN32 +inline void vprint_mojibake(std::FILE*, string_view, format_args) {} +#endif +FMT_END_DETAIL_NAMESPACE + +// A formatter specialization for the core types corresponding to detail::type +// constants. +template +struct formatter::value != + detail::type::custom_type>> { + private: + detail::dynamic_format_specs specs_; + + public: + // Parses format specifiers stopping either at the end of the range or at the + // terminating '}'. + template + FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) { + auto begin = ctx.begin(), end = ctx.end(); + if (begin == end) return begin; + using handler_type = detail::dynamic_specs_handler; + auto type = detail::type_constant::value; + auto checker = + detail::specs_checker(handler_type(specs_, ctx), type); + auto it = detail::parse_format_specs(begin, end, checker); + auto eh = ctx.error_handler(); + switch (type) { + case detail::type::none_type: + FMT_ASSERT(false, "invalid argument type"); + break; + case detail::type::bool_type: + if (specs_.type == presentation_type::none || + specs_.type == presentation_type::string) { + break; + } + FMT_FALLTHROUGH; + case detail::type::int_type: + case detail::type::uint_type: + case detail::type::long_long_type: + case detail::type::ulong_long_type: + case detail::type::int128_type: + case detail::type::uint128_type: + detail::check_int_type_spec(specs_.type, eh); + break; + case detail::type::char_type: + detail::check_char_specs(specs_, eh); + break; + case detail::type::float_type: + if (detail::const_check(FMT_USE_FLOAT)) + detail::parse_float_type_spec(specs_, eh); + else + FMT_ASSERT(false, "float support disabled"); + break; + case detail::type::double_type: + if (detail::const_check(FMT_USE_DOUBLE)) + detail::parse_float_type_spec(specs_, eh); + else + FMT_ASSERT(false, "double support disabled"); + break; + case detail::type::long_double_type: + if (detail::const_check(FMT_USE_LONG_DOUBLE)) + detail::parse_float_type_spec(specs_, eh); + else + FMT_ASSERT(false, "long double support disabled"); + break; + case detail::type::cstring_type: + detail::check_cstring_type_spec(specs_.type, eh); + break; + case detail::type::string_type: + detail::check_string_type_spec(specs_.type, eh); + break; + case detail::type::pointer_type: + detail::check_pointer_type_spec(specs_.type, eh); + break; + case detail::type::custom_type: + // Custom format specifiers are checked in parse functions of + // formatter specializations. + break; + } + return it; + } + + template ::value, + enable_if_t<(U == detail::type::string_type || + U == detail::type::cstring_type || + U == detail::type::char_type), + int> = 0> + FMT_CONSTEXPR void set_debug_format() { + specs_.type = presentation_type::debug; + } + + template + FMT_CONSTEXPR auto format(const T& val, FormatContext& ctx) const + -> decltype(ctx.out()); +}; + +#define FMT_FORMAT_AS(Type, Base) \ + template \ + struct formatter : formatter { \ + template \ + auto format(Type const& val, FormatContext& ctx) const \ + -> decltype(ctx.out()) { \ + return formatter::format(static_cast(val), ctx); \ + } \ + } + +FMT_FORMAT_AS(signed char, int); +FMT_FORMAT_AS(unsigned char, unsigned); +FMT_FORMAT_AS(short, int); +FMT_FORMAT_AS(unsigned short, unsigned); +FMT_FORMAT_AS(long, long long); +FMT_FORMAT_AS(unsigned long, unsigned long long); +FMT_FORMAT_AS(Char*, const Char*); +FMT_FORMAT_AS(std::basic_string, basic_string_view); +FMT_FORMAT_AS(std::nullptr_t, const void*); +FMT_FORMAT_AS(detail::std_string_view, basic_string_view); + +template struct basic_runtime { basic_string_view str; }; + +/** A compile-time format string. */ +template class basic_format_string { + private: + basic_string_view str_; + + public: + template >::value)> + FMT_CONSTEVAL FMT_INLINE basic_format_string(const S& s) : str_(s) { + static_assert( + detail::count< + (std::is_base_of>::value && + std::is_reference::value)...>() == 0, + "passing views as lvalues is disallowed"); +#ifdef FMT_HAS_CONSTEVAL + if constexpr (detail::count_named_args() == + detail::count_statically_named_args()) { + using checker = detail::format_string_checker...>; + detail::parse_format_string(str_, checker(s, {})); + } +#else + detail::check_format_string(s); +#endif + } + basic_format_string(basic_runtime r) : str_(r.str) {} + + FMT_INLINE operator basic_string_view() const { return str_; } +}; + +#if FMT_GCC_VERSION && FMT_GCC_VERSION < 409 +// Workaround broken conversion on older gcc. +template using format_string = string_view; +inline auto runtime(string_view s) -> string_view { return s; } +#else +template +using format_string = basic_format_string...>; +/** + \rst + Creates a runtime format string. + + **Example**:: + + // Check format string at runtime instead of compile-time. + fmt::print(fmt::runtime("{:d}"), "I am not a number"); + \endrst + */ +inline auto runtime(string_view s) -> basic_runtime { return {{s}}; } +#endif + +FMT_API auto vformat(string_view fmt, format_args args) -> std::string; + +/** + \rst + Formats ``args`` according to specifications in ``fmt`` and returns the result + as a string. + + **Example**:: + + #include + std::string message = fmt::format("The answer is {}.", 42); + \endrst +*/ +template +FMT_NODISCARD FMT_INLINE auto format(format_string fmt, T&&... args) + -> std::string { + return vformat(fmt, fmt::make_format_args(args...)); +} + +/** Formats a string and writes the output to ``out``. */ +template ::value)> +auto vformat_to(OutputIt out, string_view fmt, format_args args) -> OutputIt { + using detail::get_buffer; + auto&& buf = get_buffer(out); + detail::vformat_to(buf, fmt, args, {}); + return detail::get_iterator(buf); +} + +/** + \rst + Formats ``args`` according to specifications in ``fmt``, writes the result to + the output iterator ``out`` and returns the iterator past the end of the output + range. `format_to` does not append a terminating null character. + + **Example**:: + + auto out = std::vector(); + fmt::format_to(std::back_inserter(out), "{}", 42); + \endrst + */ +template ::value)> +FMT_INLINE auto format_to(OutputIt out, format_string fmt, T&&... args) + -> OutputIt { + return vformat_to(out, fmt, fmt::make_format_args(args...)); +} + +template struct format_to_n_result { + /** Iterator past the end of the output range. */ + OutputIt out; + /** Total (not truncated) output size. */ + size_t size; +}; + +template ::value)> +auto vformat_to_n(OutputIt out, size_t n, string_view fmt, format_args args) + -> format_to_n_result { + using traits = detail::fixed_buffer_traits; + auto buf = detail::iterator_buffer(out, n); + detail::vformat_to(buf, fmt, args, {}); + return {buf.out(), buf.count()}; +} + +/** + \rst + Formats ``args`` according to specifications in ``fmt``, writes up to ``n`` + characters of the result to the output iterator ``out`` and returns the total + (not truncated) output size and the iterator past the end of the output range. + `format_to_n` does not append a terminating null character. + \endrst + */ +template ::value)> +FMT_INLINE auto format_to_n(OutputIt out, size_t n, format_string fmt, + T&&... args) -> format_to_n_result { + return vformat_to_n(out, n, fmt, fmt::make_format_args(args...)); +} + +/** Returns the number of chars in the output of ``format(fmt, args...)``. */ +template +FMT_NODISCARD FMT_INLINE auto formatted_size(format_string fmt, + T&&... args) -> size_t { + auto buf = detail::counting_buffer<>(); + detail::vformat_to(buf, string_view(fmt), fmt::make_format_args(args...), {}); + return buf.count(); +} + +FMT_API void vprint(string_view fmt, format_args args); +FMT_API void vprint(std::FILE* f, string_view fmt, format_args args); + +/** + \rst + Formats ``args`` according to specifications in ``fmt`` and writes the output + to ``stdout``. + + **Example**:: + + fmt::print("Elapsed time: {0:.2f} seconds", 1.23); + \endrst + */ +template +FMT_INLINE void print(format_string fmt, T&&... args) { + const auto& vargs = fmt::make_format_args(args...); + return detail::is_utf8() ? vprint(fmt, vargs) + : detail::vprint_mojibake(stdout, fmt, vargs); +} + +/** + \rst + Formats ``args`` according to specifications in ``fmt`` and writes the + output to the file ``f``. + + **Example**:: + + fmt::print(stderr, "Don't {}!", "panic"); + \endrst + */ +template +FMT_INLINE void print(std::FILE* f, format_string fmt, T&&... args) { + const auto& vargs = fmt::make_format_args(args...); + return detail::is_utf8() ? vprint(f, fmt, vargs) + : detail::vprint_mojibake(f, fmt, vargs); +} + +FMT_MODULE_EXPORT_END +FMT_GCC_PRAGMA("GCC pop_options") +FMT_END_NAMESPACE + +#ifdef FMT_HEADER_ONLY +# include "format.h" +#endif +#endif // FMT_CORE_H_ diff --git a/Include/fmt/include/fmt/format-inl.h b/Include/fmt/include/fmt/format-inl.h new file mode 100644 index 000000000..22b1ec8df --- /dev/null +++ b/Include/fmt/include/fmt/format-inl.h @@ -0,0 +1,1723 @@ +// Formatting library for C++ - implementation +// +// Copyright (c) 2012 - 2016, Victor Zverovich +// All rights reserved. +// +// For the license information refer to format.h. + +#ifndef FMT_FORMAT_INL_H_ +#define FMT_FORMAT_INL_H_ + +#include +#include +#include // errno +#include +#include +#include +#include // std::memmove +#include +#include + +#ifndef FMT_STATIC_THOUSANDS_SEPARATOR +# include +#endif + +#ifdef _WIN32 +# include // _isatty +#endif + +#include "format.h" + +FMT_BEGIN_NAMESPACE +namespace detail { + +FMT_FUNC void assert_fail(const char* file, int line, const char* message) { + // Use unchecked std::fprintf to avoid triggering another assertion when + // writing to stderr fails + std::fprintf(stderr, "%s:%d: assertion failed: %s", file, line, message); + // Chosen instead of std::abort to satisfy Clang in CUDA mode during device + // code pass. + std::terminate(); +} + +FMT_FUNC void throw_format_error(const char* message) { + FMT_THROW(format_error(message)); +} + +FMT_FUNC void format_error_code(detail::buffer& out, int error_code, + string_view message) noexcept { + // Report error code making sure that the output fits into + // inline_buffer_size to avoid dynamic memory allocation and potential + // bad_alloc. + out.try_resize(0); + static const char SEP[] = ": "; + static const char ERROR_STR[] = "error "; + // Subtract 2 to account for terminating null characters in SEP and ERROR_STR. + size_t error_code_size = sizeof(SEP) + sizeof(ERROR_STR) - 2; + auto abs_value = static_cast>(error_code); + if (detail::is_negative(error_code)) { + abs_value = 0 - abs_value; + ++error_code_size; + } + error_code_size += detail::to_unsigned(detail::count_digits(abs_value)); + auto it = buffer_appender(out); + if (message.size() <= inline_buffer_size - error_code_size) + format_to(it, FMT_STRING("{}{}"), message, SEP); + format_to(it, FMT_STRING("{}{}"), ERROR_STR, error_code); + FMT_ASSERT(out.size() <= inline_buffer_size, ""); +} + +FMT_FUNC void report_error(format_func func, int error_code, + const char* message) noexcept { + memory_buffer full_message; + func(full_message, error_code, message); + // Don't use fwrite_fully because the latter may throw. + if (std::fwrite(full_message.data(), full_message.size(), 1, stderr) > 0) + std::fputc('\n', stderr); +} + +// A wrapper around fwrite that throws on error. +inline void fwrite_fully(const void* ptr, size_t size, size_t count, + FILE* stream) { + size_t written = std::fwrite(ptr, size, count, stream); + if (written < count) + FMT_THROW(system_error(errno, FMT_STRING("cannot write to file"))); +} + +#ifndef FMT_STATIC_THOUSANDS_SEPARATOR +template +locale_ref::locale_ref(const Locale& loc) : locale_(&loc) { + static_assert(std::is_same::value, ""); +} + +template Locale locale_ref::get() const { + static_assert(std::is_same::value, ""); + return locale_ ? *static_cast(locale_) : std::locale(); +} + +template +FMT_FUNC auto thousands_sep_impl(locale_ref loc) -> thousands_sep_result { + auto& facet = std::use_facet>(loc.get()); + auto grouping = facet.grouping(); + auto thousands_sep = grouping.empty() ? Char() : facet.thousands_sep(); + return {std::move(grouping), thousands_sep}; +} +template FMT_FUNC Char decimal_point_impl(locale_ref loc) { + return std::use_facet>(loc.get()) + .decimal_point(); +} +#else +template +FMT_FUNC auto thousands_sep_impl(locale_ref) -> thousands_sep_result { + return {"\03", FMT_STATIC_THOUSANDS_SEPARATOR}; +} +template FMT_FUNC Char decimal_point_impl(locale_ref) { + return '.'; +} +#endif +} // namespace detail + +#if !FMT_MSC_VERSION +FMT_API FMT_FUNC format_error::~format_error() noexcept = default; +#endif + +FMT_FUNC std::system_error vsystem_error(int error_code, string_view format_str, + format_args args) { + auto ec = std::error_code(error_code, std::generic_category()); + return std::system_error(ec, vformat(format_str, args)); +} + +namespace detail { + +template inline bool operator==(basic_fp x, basic_fp y) { + return x.f == y.f && x.e == y.e; +} + +// Compilers should be able to optimize this into the ror instruction. +FMT_CONSTEXPR inline uint32_t rotr(uint32_t n, uint32_t r) noexcept { + r &= 31; + return (n >> r) | (n << (32 - r)); +} +FMT_CONSTEXPR inline uint64_t rotr(uint64_t n, uint32_t r) noexcept { + r &= 63; + return (n >> r) | (n << (64 - r)); +} + +// Computes 128-bit result of multiplication of two 64-bit unsigned integers. +inline uint128_fallback umul128(uint64_t x, uint64_t y) noexcept { +#if FMT_USE_INT128 + auto p = static_cast(x) * static_cast(y); + return {static_cast(p >> 64), static_cast(p)}; +#elif defined(_MSC_VER) && defined(_M_X64) + auto result = uint128_fallback(); + result.lo_ = _umul128(x, y, &result.hi_); + return result; +#else + const uint64_t mask = static_cast(max_value()); + + uint64_t a = x >> 32; + uint64_t b = x & mask; + uint64_t c = y >> 32; + uint64_t d = y & mask; + + uint64_t ac = a * c; + uint64_t bc = b * c; + uint64_t ad = a * d; + uint64_t bd = b * d; + + uint64_t intermediate = (bd >> 32) + (ad & mask) + (bc & mask); + + return {ac + (intermediate >> 32) + (ad >> 32) + (bc >> 32), + (intermediate << 32) + (bd & mask)}; +#endif +} + +// Implementation of Dragonbox algorithm: https://github.com/jk-jeon/dragonbox. +namespace dragonbox { +// Computes upper 64 bits of multiplication of two 64-bit unsigned integers. +inline uint64_t umul128_upper64(uint64_t x, uint64_t y) noexcept { +#if FMT_USE_INT128 + auto p = static_cast(x) * static_cast(y); + return static_cast(p >> 64); +#elif defined(_MSC_VER) && defined(_M_X64) + return __umulh(x, y); +#else + return umul128(x, y).high(); +#endif +} + +// Computes upper 128 bits of multiplication of a 64-bit unsigned integer and a +// 128-bit unsigned integer. +inline uint128_fallback umul192_upper128(uint64_t x, + uint128_fallback y) noexcept { + uint128_fallback r = umul128(x, y.high()); + r += umul128_upper64(x, y.low()); + return r; +} + +// Computes upper 64 bits of multiplication of a 32-bit unsigned integer and a +// 64-bit unsigned integer. +inline uint64_t umul96_upper64(uint32_t x, uint64_t y) noexcept { + return umul128_upper64(static_cast(x) << 32, y); +} + +// Computes lower 128 bits of multiplication of a 64-bit unsigned integer and a +// 128-bit unsigned integer. +inline uint128_fallback umul192_lower128(uint64_t x, + uint128_fallback y) noexcept { + uint64_t high = x * y.high(); + uint128_fallback high_low = umul128(x, y.low()); + return {high + high_low.high(), high_low.low()}; +} + +// Computes lower 64 bits of multiplication of a 32-bit unsigned integer and a +// 64-bit unsigned integer. +inline uint64_t umul96_lower64(uint32_t x, uint64_t y) noexcept { + return x * y; +} + +// Computes floor(log10(pow(2, e))) for e in [-2620, 2620] using the method from +// https://fmt.dev/papers/Dragonbox.pdf#page=28, section 6.1. +inline int floor_log10_pow2(int e) noexcept { + FMT_ASSERT(e <= 2620 && e >= -2620, "too large exponent"); + static_assert((-1 >> 1) == -1, "right shift is not arithmetic"); + return (e * 315653) >> 20; +} + +// Various fast log computations. +inline int floor_log2_pow10(int e) noexcept { + FMT_ASSERT(e <= 1233 && e >= -1233, "too large exponent"); + return (e * 1741647) >> 19; +} +inline int floor_log10_pow2_minus_log10_4_over_3(int e) noexcept { + FMT_ASSERT(e <= 2936 && e >= -2985, "too large exponent"); + return (e * 631305 - 261663) >> 21; +} + +static constexpr struct { + uint32_t divisor; + int shift_amount; +} div_small_pow10_infos[] = {{10, 16}, {100, 16}}; + +// Replaces n by floor(n / pow(10, N)) returning true if and only if n is +// divisible by pow(10, N). +// Precondition: n <= pow(10, N + 1). +template +bool check_divisibility_and_divide_by_pow10(uint32_t& n) noexcept { + // The numbers below are chosen such that: + // 1. floor(n/d) = floor(nm / 2^k) where d=10 or d=100, + // 2. nm mod 2^k < m if and only if n is divisible by d, + // where m is magic_number, k is shift_amount + // and d is divisor. + // + // Item 1 is a common technique of replacing division by a constant with + // multiplication, see e.g. "Division by Invariant Integers Using + // Multiplication" by Granlund and Montgomery (1994). magic_number (m) is set + // to ceil(2^k/d) for large enough k. + // The idea for item 2 originates from Schubfach. + constexpr auto info = div_small_pow10_infos[N - 1]; + FMT_ASSERT(n <= info.divisor * 10, "n is too large"); + constexpr uint32_t magic_number = + (1u << info.shift_amount) / info.divisor + 1; + n *= magic_number; + const uint32_t comparison_mask = (1u << info.shift_amount) - 1; + bool result = (n & comparison_mask) < magic_number; + n >>= info.shift_amount; + return result; +} + +// Computes floor(n / pow(10, N)) for small n and N. +// Precondition: n <= pow(10, N + 1). +template uint32_t small_division_by_pow10(uint32_t n) noexcept { + constexpr auto info = div_small_pow10_infos[N - 1]; + FMT_ASSERT(n <= info.divisor * 10, "n is too large"); + constexpr uint32_t magic_number = + (1u << info.shift_amount) / info.divisor + 1; + return (n * magic_number) >> info.shift_amount; +} + +// Computes floor(n / 10^(kappa + 1)) (float) +inline uint32_t divide_by_10_to_kappa_plus_1(uint32_t n) noexcept { + // 1374389535 = ceil(2^37/100) + return static_cast((static_cast(n) * 1374389535) >> 37); +} +// Computes floor(n / 10^(kappa + 1)) (double) +inline uint64_t divide_by_10_to_kappa_plus_1(uint64_t n) noexcept { + // 2361183241434822607 = ceil(2^(64+7)/1000) + return umul128_upper64(n, 2361183241434822607ull) >> 7; +} + +// Various subroutines using pow10 cache +template struct cache_accessor; + +template <> struct cache_accessor { + using carrier_uint = float_info::carrier_uint; + using cache_entry_type = uint64_t; + + static uint64_t get_cached_power(int k) noexcept { + FMT_ASSERT(k >= float_info::min_k && k <= float_info::max_k, + "k is out of range"); + static constexpr const uint64_t pow10_significands[] = { + 0x81ceb32c4b43fcf5, 0xa2425ff75e14fc32, 0xcad2f7f5359a3b3f, + 0xfd87b5f28300ca0e, 0x9e74d1b791e07e49, 0xc612062576589ddb, + 0xf79687aed3eec552, 0x9abe14cd44753b53, 0xc16d9a0095928a28, + 0xf1c90080baf72cb2, 0x971da05074da7bef, 0xbce5086492111aeb, + 0xec1e4a7db69561a6, 0x9392ee8e921d5d08, 0xb877aa3236a4b44a, + 0xe69594bec44de15c, 0x901d7cf73ab0acda, 0xb424dc35095cd810, + 0xe12e13424bb40e14, 0x8cbccc096f5088cc, 0xafebff0bcb24aaff, + 0xdbe6fecebdedd5bf, 0x89705f4136b4a598, 0xabcc77118461cefd, + 0xd6bf94d5e57a42bd, 0x8637bd05af6c69b6, 0xa7c5ac471b478424, + 0xd1b71758e219652c, 0x83126e978d4fdf3c, 0xa3d70a3d70a3d70b, + 0xcccccccccccccccd, 0x8000000000000000, 0xa000000000000000, + 0xc800000000000000, 0xfa00000000000000, 0x9c40000000000000, + 0xc350000000000000, 0xf424000000000000, 0x9896800000000000, + 0xbebc200000000000, 0xee6b280000000000, 0x9502f90000000000, + 0xba43b74000000000, 0xe8d4a51000000000, 0x9184e72a00000000, + 0xb5e620f480000000, 0xe35fa931a0000000, 0x8e1bc9bf04000000, + 0xb1a2bc2ec5000000, 0xde0b6b3a76400000, 0x8ac7230489e80000, + 0xad78ebc5ac620000, 0xd8d726b7177a8000, 0x878678326eac9000, + 0xa968163f0a57b400, 0xd3c21bcecceda100, 0x84595161401484a0, + 0xa56fa5b99019a5c8, 0xcecb8f27f4200f3a, 0x813f3978f8940985, + 0xa18f07d736b90be6, 0xc9f2c9cd04674edf, 0xfc6f7c4045812297, + 0x9dc5ada82b70b59e, 0xc5371912364ce306, 0xf684df56c3e01bc7, + 0x9a130b963a6c115d, 0xc097ce7bc90715b4, 0xf0bdc21abb48db21, + 0x96769950b50d88f5, 0xbc143fa4e250eb32, 0xeb194f8e1ae525fe, + 0x92efd1b8d0cf37bf, 0xb7abc627050305ae, 0xe596b7b0c643c71a, + 0x8f7e32ce7bea5c70, 0xb35dbf821ae4f38c, 0xe0352f62a19e306f}; + return pow10_significands[k - float_info::min_k]; + } + + struct compute_mul_result { + carrier_uint result; + bool is_integer; + }; + struct compute_mul_parity_result { + bool parity; + bool is_integer; + }; + + static compute_mul_result compute_mul( + carrier_uint u, const cache_entry_type& cache) noexcept { + auto r = umul96_upper64(u, cache); + return {static_cast(r >> 32), + static_cast(r) == 0}; + } + + static uint32_t compute_delta(const cache_entry_type& cache, + int beta) noexcept { + return static_cast(cache >> (64 - 1 - beta)); + } + + static compute_mul_parity_result compute_mul_parity( + carrier_uint two_f, const cache_entry_type& cache, int beta) noexcept { + FMT_ASSERT(beta >= 1, ""); + FMT_ASSERT(beta < 64, ""); + + auto r = umul96_lower64(two_f, cache); + return {((r >> (64 - beta)) & 1) != 0, + static_cast(r >> (32 - beta)) == 0}; + } + + static carrier_uint compute_left_endpoint_for_shorter_interval_case( + const cache_entry_type& cache, int beta) noexcept { + return static_cast( + (cache - (cache >> (num_significand_bits() + 2))) >> + (64 - num_significand_bits() - 1 - beta)); + } + + static carrier_uint compute_right_endpoint_for_shorter_interval_case( + const cache_entry_type& cache, int beta) noexcept { + return static_cast( + (cache + (cache >> (num_significand_bits() + 1))) >> + (64 - num_significand_bits() - 1 - beta)); + } + + static carrier_uint compute_round_up_for_shorter_interval_case( + const cache_entry_type& cache, int beta) noexcept { + return (static_cast( + cache >> (64 - num_significand_bits() - 2 - beta)) + + 1) / + 2; + } +}; + +template <> struct cache_accessor { + using carrier_uint = float_info::carrier_uint; + using cache_entry_type = uint128_fallback; + + static uint128_fallback get_cached_power(int k) noexcept { + FMT_ASSERT(k >= float_info::min_k && k <= float_info::max_k, + "k is out of range"); + + static constexpr const uint128_fallback pow10_significands[] = { +#if FMT_USE_FULL_CACHE_DRAGONBOX + {0xff77b1fcbebcdc4f, 0x25e8e89c13bb0f7b}, + {0x9faacf3df73609b1, 0x77b191618c54e9ad}, + {0xc795830d75038c1d, 0xd59df5b9ef6a2418}, + {0xf97ae3d0d2446f25, 0x4b0573286b44ad1e}, + {0x9becce62836ac577, 0x4ee367f9430aec33}, + {0xc2e801fb244576d5, 0x229c41f793cda740}, + {0xf3a20279ed56d48a, 0x6b43527578c11110}, + {0x9845418c345644d6, 0x830a13896b78aaaa}, + {0xbe5691ef416bd60c, 0x23cc986bc656d554}, + {0xedec366b11c6cb8f, 0x2cbfbe86b7ec8aa9}, + {0x94b3a202eb1c3f39, 0x7bf7d71432f3d6aa}, + {0xb9e08a83a5e34f07, 0xdaf5ccd93fb0cc54}, + {0xe858ad248f5c22c9, 0xd1b3400f8f9cff69}, + {0x91376c36d99995be, 0x23100809b9c21fa2}, + {0xb58547448ffffb2d, 0xabd40a0c2832a78b}, + {0xe2e69915b3fff9f9, 0x16c90c8f323f516d}, + {0x8dd01fad907ffc3b, 0xae3da7d97f6792e4}, + {0xb1442798f49ffb4a, 0x99cd11cfdf41779d}, + {0xdd95317f31c7fa1d, 0x40405643d711d584}, + {0x8a7d3eef7f1cfc52, 0x482835ea666b2573}, + {0xad1c8eab5ee43b66, 0xda3243650005eed0}, + {0xd863b256369d4a40, 0x90bed43e40076a83}, + {0x873e4f75e2224e68, 0x5a7744a6e804a292}, + {0xa90de3535aaae202, 0x711515d0a205cb37}, + {0xd3515c2831559a83, 0x0d5a5b44ca873e04}, + {0x8412d9991ed58091, 0xe858790afe9486c3}, + {0xa5178fff668ae0b6, 0x626e974dbe39a873}, + {0xce5d73ff402d98e3, 0xfb0a3d212dc81290}, + {0x80fa687f881c7f8e, 0x7ce66634bc9d0b9a}, + {0xa139029f6a239f72, 0x1c1fffc1ebc44e81}, + {0xc987434744ac874e, 0xa327ffb266b56221}, + {0xfbe9141915d7a922, 0x4bf1ff9f0062baa9}, + {0x9d71ac8fada6c9b5, 0x6f773fc3603db4aa}, + {0xc4ce17b399107c22, 0xcb550fb4384d21d4}, + {0xf6019da07f549b2b, 0x7e2a53a146606a49}, + {0x99c102844f94e0fb, 0x2eda7444cbfc426e}, + {0xc0314325637a1939, 0xfa911155fefb5309}, + {0xf03d93eebc589f88, 0x793555ab7eba27cb}, + {0x96267c7535b763b5, 0x4bc1558b2f3458df}, + {0xbbb01b9283253ca2, 0x9eb1aaedfb016f17}, + {0xea9c227723ee8bcb, 0x465e15a979c1cadd}, + {0x92a1958a7675175f, 0x0bfacd89ec191eca}, + {0xb749faed14125d36, 0xcef980ec671f667c}, + {0xe51c79a85916f484, 0x82b7e12780e7401b}, + {0x8f31cc0937ae58d2, 0xd1b2ecb8b0908811}, + {0xb2fe3f0b8599ef07, 0x861fa7e6dcb4aa16}, + {0xdfbdcece67006ac9, 0x67a791e093e1d49b}, + {0x8bd6a141006042bd, 0xe0c8bb2c5c6d24e1}, + {0xaecc49914078536d, 0x58fae9f773886e19}, + {0xda7f5bf590966848, 0xaf39a475506a899f}, + {0x888f99797a5e012d, 0x6d8406c952429604}, + {0xaab37fd7d8f58178, 0xc8e5087ba6d33b84}, + {0xd5605fcdcf32e1d6, 0xfb1e4a9a90880a65}, + {0x855c3be0a17fcd26, 0x5cf2eea09a550680}, + {0xa6b34ad8c9dfc06f, 0xf42faa48c0ea481f}, + {0xd0601d8efc57b08b, 0xf13b94daf124da27}, + {0x823c12795db6ce57, 0x76c53d08d6b70859}, + {0xa2cb1717b52481ed, 0x54768c4b0c64ca6f}, + {0xcb7ddcdda26da268, 0xa9942f5dcf7dfd0a}, + {0xfe5d54150b090b02, 0xd3f93b35435d7c4d}, + {0x9efa548d26e5a6e1, 0xc47bc5014a1a6db0}, + {0xc6b8e9b0709f109a, 0x359ab6419ca1091c}, + {0xf867241c8cc6d4c0, 0xc30163d203c94b63}, + {0x9b407691d7fc44f8, 0x79e0de63425dcf1e}, + {0xc21094364dfb5636, 0x985915fc12f542e5}, + {0xf294b943e17a2bc4, 0x3e6f5b7b17b2939e}, + {0x979cf3ca6cec5b5a, 0xa705992ceecf9c43}, + {0xbd8430bd08277231, 0x50c6ff782a838354}, + {0xece53cec4a314ebd, 0xa4f8bf5635246429}, + {0x940f4613ae5ed136, 0x871b7795e136be9a}, + {0xb913179899f68584, 0x28e2557b59846e40}, + {0xe757dd7ec07426e5, 0x331aeada2fe589d0}, + {0x9096ea6f3848984f, 0x3ff0d2c85def7622}, + {0xb4bca50b065abe63, 0x0fed077a756b53aa}, + {0xe1ebce4dc7f16dfb, 0xd3e8495912c62895}, + {0x8d3360f09cf6e4bd, 0x64712dd7abbbd95d}, + {0xb080392cc4349dec, 0xbd8d794d96aacfb4}, + {0xdca04777f541c567, 0xecf0d7a0fc5583a1}, + {0x89e42caaf9491b60, 0xf41686c49db57245}, + {0xac5d37d5b79b6239, 0x311c2875c522ced6}, + {0xd77485cb25823ac7, 0x7d633293366b828c}, + {0x86a8d39ef77164bc, 0xae5dff9c02033198}, + {0xa8530886b54dbdeb, 0xd9f57f830283fdfd}, + {0xd267caa862a12d66, 0xd072df63c324fd7c}, + {0x8380dea93da4bc60, 0x4247cb9e59f71e6e}, + {0xa46116538d0deb78, 0x52d9be85f074e609}, + {0xcd795be870516656, 0x67902e276c921f8c}, + {0x806bd9714632dff6, 0x00ba1cd8a3db53b7}, + {0xa086cfcd97bf97f3, 0x80e8a40eccd228a5}, + {0xc8a883c0fdaf7df0, 0x6122cd128006b2ce}, + {0xfad2a4b13d1b5d6c, 0x796b805720085f82}, + {0x9cc3a6eec6311a63, 0xcbe3303674053bb1}, + {0xc3f490aa77bd60fc, 0xbedbfc4411068a9d}, + {0xf4f1b4d515acb93b, 0xee92fb5515482d45}, + {0x991711052d8bf3c5, 0x751bdd152d4d1c4b}, + {0xbf5cd54678eef0b6, 0xd262d45a78a0635e}, + {0xef340a98172aace4, 0x86fb897116c87c35}, + {0x9580869f0e7aac0e, 0xd45d35e6ae3d4da1}, + {0xbae0a846d2195712, 0x8974836059cca10a}, + {0xe998d258869facd7, 0x2bd1a438703fc94c}, + {0x91ff83775423cc06, 0x7b6306a34627ddd0}, + {0xb67f6455292cbf08, 0x1a3bc84c17b1d543}, + {0xe41f3d6a7377eeca, 0x20caba5f1d9e4a94}, + {0x8e938662882af53e, 0x547eb47b7282ee9d}, + {0xb23867fb2a35b28d, 0xe99e619a4f23aa44}, + {0xdec681f9f4c31f31, 0x6405fa00e2ec94d5}, + {0x8b3c113c38f9f37e, 0xde83bc408dd3dd05}, + {0xae0b158b4738705e, 0x9624ab50b148d446}, + {0xd98ddaee19068c76, 0x3badd624dd9b0958}, + {0x87f8a8d4cfa417c9, 0xe54ca5d70a80e5d7}, + {0xa9f6d30a038d1dbc, 0x5e9fcf4ccd211f4d}, + {0xd47487cc8470652b, 0x7647c32000696720}, + {0x84c8d4dfd2c63f3b, 0x29ecd9f40041e074}, + {0xa5fb0a17c777cf09, 0xf468107100525891}, + {0xcf79cc9db955c2cc, 0x7182148d4066eeb5}, + {0x81ac1fe293d599bf, 0xc6f14cd848405531}, + {0xa21727db38cb002f, 0xb8ada00e5a506a7d}, + {0xca9cf1d206fdc03b, 0xa6d90811f0e4851d}, + {0xfd442e4688bd304a, 0x908f4a166d1da664}, + {0x9e4a9cec15763e2e, 0x9a598e4e043287ff}, + {0xc5dd44271ad3cdba, 0x40eff1e1853f29fe}, + {0xf7549530e188c128, 0xd12bee59e68ef47d}, + {0x9a94dd3e8cf578b9, 0x82bb74f8301958cf}, + {0xc13a148e3032d6e7, 0xe36a52363c1faf02}, + {0xf18899b1bc3f8ca1, 0xdc44e6c3cb279ac2}, + {0x96f5600f15a7b7e5, 0x29ab103a5ef8c0ba}, + {0xbcb2b812db11a5de, 0x7415d448f6b6f0e8}, + {0xebdf661791d60f56, 0x111b495b3464ad22}, + {0x936b9fcebb25c995, 0xcab10dd900beec35}, + {0xb84687c269ef3bfb, 0x3d5d514f40eea743}, + {0xe65829b3046b0afa, 0x0cb4a5a3112a5113}, + {0x8ff71a0fe2c2e6dc, 0x47f0e785eaba72ac}, + {0xb3f4e093db73a093, 0x59ed216765690f57}, + {0xe0f218b8d25088b8, 0x306869c13ec3532d}, + {0x8c974f7383725573, 0x1e414218c73a13fc}, + {0xafbd2350644eeacf, 0xe5d1929ef90898fb}, + {0xdbac6c247d62a583, 0xdf45f746b74abf3a}, + {0x894bc396ce5da772, 0x6b8bba8c328eb784}, + {0xab9eb47c81f5114f, 0x066ea92f3f326565}, + {0xd686619ba27255a2, 0xc80a537b0efefebe}, + {0x8613fd0145877585, 0xbd06742ce95f5f37}, + {0xa798fc4196e952e7, 0x2c48113823b73705}, + {0xd17f3b51fca3a7a0, 0xf75a15862ca504c6}, + {0x82ef85133de648c4, 0x9a984d73dbe722fc}, + {0xa3ab66580d5fdaf5, 0xc13e60d0d2e0ebbb}, + {0xcc963fee10b7d1b3, 0x318df905079926a9}, + {0xffbbcfe994e5c61f, 0xfdf17746497f7053}, + {0x9fd561f1fd0f9bd3, 0xfeb6ea8bedefa634}, + {0xc7caba6e7c5382c8, 0xfe64a52ee96b8fc1}, + {0xf9bd690a1b68637b, 0x3dfdce7aa3c673b1}, + {0x9c1661a651213e2d, 0x06bea10ca65c084f}, + {0xc31bfa0fe5698db8, 0x486e494fcff30a63}, + {0xf3e2f893dec3f126, 0x5a89dba3c3efccfb}, + {0x986ddb5c6b3a76b7, 0xf89629465a75e01d}, + {0xbe89523386091465, 0xf6bbb397f1135824}, + {0xee2ba6c0678b597f, 0x746aa07ded582e2d}, + {0x94db483840b717ef, 0xa8c2a44eb4571cdd}, + {0xba121a4650e4ddeb, 0x92f34d62616ce414}, + {0xe896a0d7e51e1566, 0x77b020baf9c81d18}, + {0x915e2486ef32cd60, 0x0ace1474dc1d122f}, + {0xb5b5ada8aaff80b8, 0x0d819992132456bb}, + {0xe3231912d5bf60e6, 0x10e1fff697ed6c6a}, + {0x8df5efabc5979c8f, 0xca8d3ffa1ef463c2}, + {0xb1736b96b6fd83b3, 0xbd308ff8a6b17cb3}, + {0xddd0467c64bce4a0, 0xac7cb3f6d05ddbdf}, + {0x8aa22c0dbef60ee4, 0x6bcdf07a423aa96c}, + {0xad4ab7112eb3929d, 0x86c16c98d2c953c7}, + {0xd89d64d57a607744, 0xe871c7bf077ba8b8}, + {0x87625f056c7c4a8b, 0x11471cd764ad4973}, + {0xa93af6c6c79b5d2d, 0xd598e40d3dd89bd0}, + {0xd389b47879823479, 0x4aff1d108d4ec2c4}, + {0x843610cb4bf160cb, 0xcedf722a585139bb}, + {0xa54394fe1eedb8fe, 0xc2974eb4ee658829}, + {0xce947a3da6a9273e, 0x733d226229feea33}, + {0x811ccc668829b887, 0x0806357d5a3f5260}, + {0xa163ff802a3426a8, 0xca07c2dcb0cf26f8}, + {0xc9bcff6034c13052, 0xfc89b393dd02f0b6}, + {0xfc2c3f3841f17c67, 0xbbac2078d443ace3}, + {0x9d9ba7832936edc0, 0xd54b944b84aa4c0e}, + {0xc5029163f384a931, 0x0a9e795e65d4df12}, + {0xf64335bcf065d37d, 0x4d4617b5ff4a16d6}, + {0x99ea0196163fa42e, 0x504bced1bf8e4e46}, + {0xc06481fb9bcf8d39, 0xe45ec2862f71e1d7}, + {0xf07da27a82c37088, 0x5d767327bb4e5a4d}, + {0x964e858c91ba2655, 0x3a6a07f8d510f870}, + {0xbbe226efb628afea, 0x890489f70a55368c}, + {0xeadab0aba3b2dbe5, 0x2b45ac74ccea842f}, + {0x92c8ae6b464fc96f, 0x3b0b8bc90012929e}, + {0xb77ada0617e3bbcb, 0x09ce6ebb40173745}, + {0xe55990879ddcaabd, 0xcc420a6a101d0516}, + {0x8f57fa54c2a9eab6, 0x9fa946824a12232e}, + {0xb32df8e9f3546564, 0x47939822dc96abfa}, + {0xdff9772470297ebd, 0x59787e2b93bc56f8}, + {0x8bfbea76c619ef36, 0x57eb4edb3c55b65b}, + {0xaefae51477a06b03, 0xede622920b6b23f2}, + {0xdab99e59958885c4, 0xe95fab368e45ecee}, + {0x88b402f7fd75539b, 0x11dbcb0218ebb415}, + {0xaae103b5fcd2a881, 0xd652bdc29f26a11a}, + {0xd59944a37c0752a2, 0x4be76d3346f04960}, + {0x857fcae62d8493a5, 0x6f70a4400c562ddc}, + {0xa6dfbd9fb8e5b88e, 0xcb4ccd500f6bb953}, + {0xd097ad07a71f26b2, 0x7e2000a41346a7a8}, + {0x825ecc24c873782f, 0x8ed400668c0c28c9}, + {0xa2f67f2dfa90563b, 0x728900802f0f32fb}, + {0xcbb41ef979346bca, 0x4f2b40a03ad2ffba}, + {0xfea126b7d78186bc, 0xe2f610c84987bfa9}, + {0x9f24b832e6b0f436, 0x0dd9ca7d2df4d7ca}, + {0xc6ede63fa05d3143, 0x91503d1c79720dbc}, + {0xf8a95fcf88747d94, 0x75a44c6397ce912b}, + {0x9b69dbe1b548ce7c, 0xc986afbe3ee11abb}, + {0xc24452da229b021b, 0xfbe85badce996169}, + {0xf2d56790ab41c2a2, 0xfae27299423fb9c4}, + {0x97c560ba6b0919a5, 0xdccd879fc967d41b}, + {0xbdb6b8e905cb600f, 0x5400e987bbc1c921}, + {0xed246723473e3813, 0x290123e9aab23b69}, + {0x9436c0760c86e30b, 0xf9a0b6720aaf6522}, + {0xb94470938fa89bce, 0xf808e40e8d5b3e6a}, + {0xe7958cb87392c2c2, 0xb60b1d1230b20e05}, + {0x90bd77f3483bb9b9, 0xb1c6f22b5e6f48c3}, + {0xb4ecd5f01a4aa828, 0x1e38aeb6360b1af4}, + {0xe2280b6c20dd5232, 0x25c6da63c38de1b1}, + {0x8d590723948a535f, 0x579c487e5a38ad0f}, + {0xb0af48ec79ace837, 0x2d835a9df0c6d852}, + {0xdcdb1b2798182244, 0xf8e431456cf88e66}, + {0x8a08f0f8bf0f156b, 0x1b8e9ecb641b5900}, + {0xac8b2d36eed2dac5, 0xe272467e3d222f40}, + {0xd7adf884aa879177, 0x5b0ed81dcc6abb10}, + {0x86ccbb52ea94baea, 0x98e947129fc2b4ea}, + {0xa87fea27a539e9a5, 0x3f2398d747b36225}, + {0xd29fe4b18e88640e, 0x8eec7f0d19a03aae}, + {0x83a3eeeef9153e89, 0x1953cf68300424ad}, + {0xa48ceaaab75a8e2b, 0x5fa8c3423c052dd8}, + {0xcdb02555653131b6, 0x3792f412cb06794e}, + {0x808e17555f3ebf11, 0xe2bbd88bbee40bd1}, + {0xa0b19d2ab70e6ed6, 0x5b6aceaeae9d0ec5}, + {0xc8de047564d20a8b, 0xf245825a5a445276}, + {0xfb158592be068d2e, 0xeed6e2f0f0d56713}, + {0x9ced737bb6c4183d, 0x55464dd69685606c}, + {0xc428d05aa4751e4c, 0xaa97e14c3c26b887}, + {0xf53304714d9265df, 0xd53dd99f4b3066a9}, + {0x993fe2c6d07b7fab, 0xe546a8038efe402a}, + {0xbf8fdb78849a5f96, 0xde98520472bdd034}, + {0xef73d256a5c0f77c, 0x963e66858f6d4441}, + {0x95a8637627989aad, 0xdde7001379a44aa9}, + {0xbb127c53b17ec159, 0x5560c018580d5d53}, + {0xe9d71b689dde71af, 0xaab8f01e6e10b4a7}, + {0x9226712162ab070d, 0xcab3961304ca70e9}, + {0xb6b00d69bb55c8d1, 0x3d607b97c5fd0d23}, + {0xe45c10c42a2b3b05, 0x8cb89a7db77c506b}, + {0x8eb98a7a9a5b04e3, 0x77f3608e92adb243}, + {0xb267ed1940f1c61c, 0x55f038b237591ed4}, + {0xdf01e85f912e37a3, 0x6b6c46dec52f6689}, + {0x8b61313bbabce2c6, 0x2323ac4b3b3da016}, + {0xae397d8aa96c1b77, 0xabec975e0a0d081b}, + {0xd9c7dced53c72255, 0x96e7bd358c904a22}, + {0x881cea14545c7575, 0x7e50d64177da2e55}, + {0xaa242499697392d2, 0xdde50bd1d5d0b9ea}, + {0xd4ad2dbfc3d07787, 0x955e4ec64b44e865}, + {0x84ec3c97da624ab4, 0xbd5af13bef0b113f}, + {0xa6274bbdd0fadd61, 0xecb1ad8aeacdd58f}, + {0xcfb11ead453994ba, 0x67de18eda5814af3}, + {0x81ceb32c4b43fcf4, 0x80eacf948770ced8}, + {0xa2425ff75e14fc31, 0xa1258379a94d028e}, + {0xcad2f7f5359a3b3e, 0x096ee45813a04331}, + {0xfd87b5f28300ca0d, 0x8bca9d6e188853fd}, + {0x9e74d1b791e07e48, 0x775ea264cf55347e}, + {0xc612062576589dda, 0x95364afe032a819e}, + {0xf79687aed3eec551, 0x3a83ddbd83f52205}, + {0x9abe14cd44753b52, 0xc4926a9672793543}, + {0xc16d9a0095928a27, 0x75b7053c0f178294}, + {0xf1c90080baf72cb1, 0x5324c68b12dd6339}, + {0x971da05074da7bee, 0xd3f6fc16ebca5e04}, + {0xbce5086492111aea, 0x88f4bb1ca6bcf585}, + {0xec1e4a7db69561a5, 0x2b31e9e3d06c32e6}, + {0x9392ee8e921d5d07, 0x3aff322e62439fd0}, + {0xb877aa3236a4b449, 0x09befeb9fad487c3}, + {0xe69594bec44de15b, 0x4c2ebe687989a9b4}, + {0x901d7cf73ab0acd9, 0x0f9d37014bf60a11}, + {0xb424dc35095cd80f, 0x538484c19ef38c95}, + {0xe12e13424bb40e13, 0x2865a5f206b06fba}, + {0x8cbccc096f5088cb, 0xf93f87b7442e45d4}, + {0xafebff0bcb24aafe, 0xf78f69a51539d749}, + {0xdbe6fecebdedd5be, 0xb573440e5a884d1c}, + {0x89705f4136b4a597, 0x31680a88f8953031}, + {0xabcc77118461cefc, 0xfdc20d2b36ba7c3e}, + {0xd6bf94d5e57a42bc, 0x3d32907604691b4d}, + {0x8637bd05af6c69b5, 0xa63f9a49c2c1b110}, + {0xa7c5ac471b478423, 0x0fcf80dc33721d54}, + {0xd1b71758e219652b, 0xd3c36113404ea4a9}, + {0x83126e978d4fdf3b, 0x645a1cac083126ea}, + {0xa3d70a3d70a3d70a, 0x3d70a3d70a3d70a4}, + {0xcccccccccccccccc, 0xcccccccccccccccd}, + {0x8000000000000000, 0x0000000000000000}, + {0xa000000000000000, 0x0000000000000000}, + {0xc800000000000000, 0x0000000000000000}, + {0xfa00000000000000, 0x0000000000000000}, + {0x9c40000000000000, 0x0000000000000000}, + {0xc350000000000000, 0x0000000000000000}, + {0xf424000000000000, 0x0000000000000000}, + {0x9896800000000000, 0x0000000000000000}, + {0xbebc200000000000, 0x0000000000000000}, + {0xee6b280000000000, 0x0000000000000000}, + {0x9502f90000000000, 0x0000000000000000}, + {0xba43b74000000000, 0x0000000000000000}, + {0xe8d4a51000000000, 0x0000000000000000}, + {0x9184e72a00000000, 0x0000000000000000}, + {0xb5e620f480000000, 0x0000000000000000}, + {0xe35fa931a0000000, 0x0000000000000000}, + {0x8e1bc9bf04000000, 0x0000000000000000}, + {0xb1a2bc2ec5000000, 0x0000000000000000}, + {0xde0b6b3a76400000, 0x0000000000000000}, + {0x8ac7230489e80000, 0x0000000000000000}, + {0xad78ebc5ac620000, 0x0000000000000000}, + {0xd8d726b7177a8000, 0x0000000000000000}, + {0x878678326eac9000, 0x0000000000000000}, + {0xa968163f0a57b400, 0x0000000000000000}, + {0xd3c21bcecceda100, 0x0000000000000000}, + {0x84595161401484a0, 0x0000000000000000}, + {0xa56fa5b99019a5c8, 0x0000000000000000}, + {0xcecb8f27f4200f3a, 0x0000000000000000}, + {0x813f3978f8940984, 0x4000000000000000}, + {0xa18f07d736b90be5, 0x5000000000000000}, + {0xc9f2c9cd04674ede, 0xa400000000000000}, + {0xfc6f7c4045812296, 0x4d00000000000000}, + {0x9dc5ada82b70b59d, 0xf020000000000000}, + {0xc5371912364ce305, 0x6c28000000000000}, + {0xf684df56c3e01bc6, 0xc732000000000000}, + {0x9a130b963a6c115c, 0x3c7f400000000000}, + {0xc097ce7bc90715b3, 0x4b9f100000000000}, + {0xf0bdc21abb48db20, 0x1e86d40000000000}, + {0x96769950b50d88f4, 0x1314448000000000}, + {0xbc143fa4e250eb31, 0x17d955a000000000}, + {0xeb194f8e1ae525fd, 0x5dcfab0800000000}, + {0x92efd1b8d0cf37be, 0x5aa1cae500000000}, + {0xb7abc627050305ad, 0xf14a3d9e40000000}, + {0xe596b7b0c643c719, 0x6d9ccd05d0000000}, + {0x8f7e32ce7bea5c6f, 0xe4820023a2000000}, + {0xb35dbf821ae4f38b, 0xdda2802c8a800000}, + {0xe0352f62a19e306e, 0xd50b2037ad200000}, + {0x8c213d9da502de45, 0x4526f422cc340000}, + {0xaf298d050e4395d6, 0x9670b12b7f410000}, + {0xdaf3f04651d47b4c, 0x3c0cdd765f114000}, + {0x88d8762bf324cd0f, 0xa5880a69fb6ac800}, + {0xab0e93b6efee0053, 0x8eea0d047a457a00}, + {0xd5d238a4abe98068, 0x72a4904598d6d880}, + {0x85a36366eb71f041, 0x47a6da2b7f864750}, + {0xa70c3c40a64e6c51, 0x999090b65f67d924}, + {0xd0cf4b50cfe20765, 0xfff4b4e3f741cf6d}, + {0x82818f1281ed449f, 0xbff8f10e7a8921a5}, + {0xa321f2d7226895c7, 0xaff72d52192b6a0e}, + {0xcbea6f8ceb02bb39, 0x9bf4f8a69f764491}, + {0xfee50b7025c36a08, 0x02f236d04753d5b5}, + {0x9f4f2726179a2245, 0x01d762422c946591}, + {0xc722f0ef9d80aad6, 0x424d3ad2b7b97ef6}, + {0xf8ebad2b84e0d58b, 0xd2e0898765a7deb3}, + {0x9b934c3b330c8577, 0x63cc55f49f88eb30}, + {0xc2781f49ffcfa6d5, 0x3cbf6b71c76b25fc}, + {0xf316271c7fc3908a, 0x8bef464e3945ef7b}, + {0x97edd871cfda3a56, 0x97758bf0e3cbb5ad}, + {0xbde94e8e43d0c8ec, 0x3d52eeed1cbea318}, + {0xed63a231d4c4fb27, 0x4ca7aaa863ee4bde}, + {0x945e455f24fb1cf8, 0x8fe8caa93e74ef6b}, + {0xb975d6b6ee39e436, 0xb3e2fd538e122b45}, + {0xe7d34c64a9c85d44, 0x60dbbca87196b617}, + {0x90e40fbeea1d3a4a, 0xbc8955e946fe31ce}, + {0xb51d13aea4a488dd, 0x6babab6398bdbe42}, + {0xe264589a4dcdab14, 0xc696963c7eed2dd2}, + {0x8d7eb76070a08aec, 0xfc1e1de5cf543ca3}, + {0xb0de65388cc8ada8, 0x3b25a55f43294bcc}, + {0xdd15fe86affad912, 0x49ef0eb713f39ebf}, + {0x8a2dbf142dfcc7ab, 0x6e3569326c784338}, + {0xacb92ed9397bf996, 0x49c2c37f07965405}, + {0xd7e77a8f87daf7fb, 0xdc33745ec97be907}, + {0x86f0ac99b4e8dafd, 0x69a028bb3ded71a4}, + {0xa8acd7c0222311bc, 0xc40832ea0d68ce0d}, + {0xd2d80db02aabd62b, 0xf50a3fa490c30191}, + {0x83c7088e1aab65db, 0x792667c6da79e0fb}, + {0xa4b8cab1a1563f52, 0x577001b891185939}, + {0xcde6fd5e09abcf26, 0xed4c0226b55e6f87}, + {0x80b05e5ac60b6178, 0x544f8158315b05b5}, + {0xa0dc75f1778e39d6, 0x696361ae3db1c722}, + {0xc913936dd571c84c, 0x03bc3a19cd1e38ea}, + {0xfb5878494ace3a5f, 0x04ab48a04065c724}, + {0x9d174b2dcec0e47b, 0x62eb0d64283f9c77}, + {0xc45d1df942711d9a, 0x3ba5d0bd324f8395}, + {0xf5746577930d6500, 0xca8f44ec7ee3647a}, + {0x9968bf6abbe85f20, 0x7e998b13cf4e1ecc}, + {0xbfc2ef456ae276e8, 0x9e3fedd8c321a67f}, + {0xefb3ab16c59b14a2, 0xc5cfe94ef3ea101f}, + {0x95d04aee3b80ece5, 0xbba1f1d158724a13}, + {0xbb445da9ca61281f, 0x2a8a6e45ae8edc98}, + {0xea1575143cf97226, 0xf52d09d71a3293be}, + {0x924d692ca61be758, 0x593c2626705f9c57}, + {0xb6e0c377cfa2e12e, 0x6f8b2fb00c77836d}, + {0xe498f455c38b997a, 0x0b6dfb9c0f956448}, + {0x8edf98b59a373fec, 0x4724bd4189bd5ead}, + {0xb2977ee300c50fe7, 0x58edec91ec2cb658}, + {0xdf3d5e9bc0f653e1, 0x2f2967b66737e3ee}, + {0x8b865b215899f46c, 0xbd79e0d20082ee75}, + {0xae67f1e9aec07187, 0xecd8590680a3aa12}, + {0xda01ee641a708de9, 0xe80e6f4820cc9496}, + {0x884134fe908658b2, 0x3109058d147fdcde}, + {0xaa51823e34a7eede, 0xbd4b46f0599fd416}, + {0xd4e5e2cdc1d1ea96, 0x6c9e18ac7007c91b}, + {0x850fadc09923329e, 0x03e2cf6bc604ddb1}, + {0xa6539930bf6bff45, 0x84db8346b786151d}, + {0xcfe87f7cef46ff16, 0xe612641865679a64}, + {0x81f14fae158c5f6e, 0x4fcb7e8f3f60c07f}, + {0xa26da3999aef7749, 0xe3be5e330f38f09e}, + {0xcb090c8001ab551c, 0x5cadf5bfd3072cc6}, + {0xfdcb4fa002162a63, 0x73d9732fc7c8f7f7}, + {0x9e9f11c4014dda7e, 0x2867e7fddcdd9afb}, + {0xc646d63501a1511d, 0xb281e1fd541501b9}, + {0xf7d88bc24209a565, 0x1f225a7ca91a4227}, + {0x9ae757596946075f, 0x3375788de9b06959}, + {0xc1a12d2fc3978937, 0x0052d6b1641c83af}, + {0xf209787bb47d6b84, 0xc0678c5dbd23a49b}, + {0x9745eb4d50ce6332, 0xf840b7ba963646e1}, + {0xbd176620a501fbff, 0xb650e5a93bc3d899}, + {0xec5d3fa8ce427aff, 0xa3e51f138ab4cebf}, + {0x93ba47c980e98cdf, 0xc66f336c36b10138}, + {0xb8a8d9bbe123f017, 0xb80b0047445d4185}, + {0xe6d3102ad96cec1d, 0xa60dc059157491e6}, + {0x9043ea1ac7e41392, 0x87c89837ad68db30}, + {0xb454e4a179dd1877, 0x29babe4598c311fc}, + {0xe16a1dc9d8545e94, 0xf4296dd6fef3d67b}, + {0x8ce2529e2734bb1d, 0x1899e4a65f58660d}, + {0xb01ae745b101e9e4, 0x5ec05dcff72e7f90}, + {0xdc21a1171d42645d, 0x76707543f4fa1f74}, + {0x899504ae72497eba, 0x6a06494a791c53a9}, + {0xabfa45da0edbde69, 0x0487db9d17636893}, + {0xd6f8d7509292d603, 0x45a9d2845d3c42b7}, + {0x865b86925b9bc5c2, 0x0b8a2392ba45a9b3}, + {0xa7f26836f282b732, 0x8e6cac7768d7141f}, + {0xd1ef0244af2364ff, 0x3207d795430cd927}, + {0x8335616aed761f1f, 0x7f44e6bd49e807b9}, + {0xa402b9c5a8d3a6e7, 0x5f16206c9c6209a7}, + {0xcd036837130890a1, 0x36dba887c37a8c10}, + {0x802221226be55a64, 0xc2494954da2c978a}, + {0xa02aa96b06deb0fd, 0xf2db9baa10b7bd6d}, + {0xc83553c5c8965d3d, 0x6f92829494e5acc8}, + {0xfa42a8b73abbf48c, 0xcb772339ba1f17fa}, + {0x9c69a97284b578d7, 0xff2a760414536efc}, + {0xc38413cf25e2d70d, 0xfef5138519684abb}, + {0xf46518c2ef5b8cd1, 0x7eb258665fc25d6a}, + {0x98bf2f79d5993802, 0xef2f773ffbd97a62}, + {0xbeeefb584aff8603, 0xaafb550ffacfd8fb}, + {0xeeaaba2e5dbf6784, 0x95ba2a53f983cf39}, + {0x952ab45cfa97a0b2, 0xdd945a747bf26184}, + {0xba756174393d88df, 0x94f971119aeef9e5}, + {0xe912b9d1478ceb17, 0x7a37cd5601aab85e}, + {0x91abb422ccb812ee, 0xac62e055c10ab33b}, + {0xb616a12b7fe617aa, 0x577b986b314d600a}, + {0xe39c49765fdf9d94, 0xed5a7e85fda0b80c}, + {0x8e41ade9fbebc27d, 0x14588f13be847308}, + {0xb1d219647ae6b31c, 0x596eb2d8ae258fc9}, + {0xde469fbd99a05fe3, 0x6fca5f8ed9aef3bc}, + {0x8aec23d680043bee, 0x25de7bb9480d5855}, + {0xada72ccc20054ae9, 0xaf561aa79a10ae6b}, + {0xd910f7ff28069da4, 0x1b2ba1518094da05}, + {0x87aa9aff79042286, 0x90fb44d2f05d0843}, + {0xa99541bf57452b28, 0x353a1607ac744a54}, + {0xd3fa922f2d1675f2, 0x42889b8997915ce9}, + {0x847c9b5d7c2e09b7, 0x69956135febada12}, + {0xa59bc234db398c25, 0x43fab9837e699096}, + {0xcf02b2c21207ef2e, 0x94f967e45e03f4bc}, + {0x8161afb94b44f57d, 0x1d1be0eebac278f6}, + {0xa1ba1ba79e1632dc, 0x6462d92a69731733}, + {0xca28a291859bbf93, 0x7d7b8f7503cfdcff}, + {0xfcb2cb35e702af78, 0x5cda735244c3d43f}, + {0x9defbf01b061adab, 0x3a0888136afa64a8}, + {0xc56baec21c7a1916, 0x088aaa1845b8fdd1}, + {0xf6c69a72a3989f5b, 0x8aad549e57273d46}, + {0x9a3c2087a63f6399, 0x36ac54e2f678864c}, + {0xc0cb28a98fcf3c7f, 0x84576a1bb416a7de}, + {0xf0fdf2d3f3c30b9f, 0x656d44a2a11c51d6}, + {0x969eb7c47859e743, 0x9f644ae5a4b1b326}, + {0xbc4665b596706114, 0x873d5d9f0dde1fef}, + {0xeb57ff22fc0c7959, 0xa90cb506d155a7eb}, + {0x9316ff75dd87cbd8, 0x09a7f12442d588f3}, + {0xb7dcbf5354e9bece, 0x0c11ed6d538aeb30}, + {0xe5d3ef282a242e81, 0x8f1668c8a86da5fb}, + {0x8fa475791a569d10, 0xf96e017d694487bd}, + {0xb38d92d760ec4455, 0x37c981dcc395a9ad}, + {0xe070f78d3927556a, 0x85bbe253f47b1418}, + {0x8c469ab843b89562, 0x93956d7478ccec8f}, + {0xaf58416654a6babb, 0x387ac8d1970027b3}, + {0xdb2e51bfe9d0696a, 0x06997b05fcc0319f}, + {0x88fcf317f22241e2, 0x441fece3bdf81f04}, + {0xab3c2fddeeaad25a, 0xd527e81cad7626c4}, + {0xd60b3bd56a5586f1, 0x8a71e223d8d3b075}, + {0x85c7056562757456, 0xf6872d5667844e4a}, + {0xa738c6bebb12d16c, 0xb428f8ac016561dc}, + {0xd106f86e69d785c7, 0xe13336d701beba53}, + {0x82a45b450226b39c, 0xecc0024661173474}, + {0xa34d721642b06084, 0x27f002d7f95d0191}, + {0xcc20ce9bd35c78a5, 0x31ec038df7b441f5}, + {0xff290242c83396ce, 0x7e67047175a15272}, + {0x9f79a169bd203e41, 0x0f0062c6e984d387}, + {0xc75809c42c684dd1, 0x52c07b78a3e60869}, + {0xf92e0c3537826145, 0xa7709a56ccdf8a83}, + {0x9bbcc7a142b17ccb, 0x88a66076400bb692}, + {0xc2abf989935ddbfe, 0x6acff893d00ea436}, + {0xf356f7ebf83552fe, 0x0583f6b8c4124d44}, + {0x98165af37b2153de, 0xc3727a337a8b704b}, + {0xbe1bf1b059e9a8d6, 0x744f18c0592e4c5d}, + {0xeda2ee1c7064130c, 0x1162def06f79df74}, + {0x9485d4d1c63e8be7, 0x8addcb5645ac2ba9}, + {0xb9a74a0637ce2ee1, 0x6d953e2bd7173693}, + {0xe8111c87c5c1ba99, 0xc8fa8db6ccdd0438}, + {0x910ab1d4db9914a0, 0x1d9c9892400a22a3}, + {0xb54d5e4a127f59c8, 0x2503beb6d00cab4c}, + {0xe2a0b5dc971f303a, 0x2e44ae64840fd61e}, + {0x8da471a9de737e24, 0x5ceaecfed289e5d3}, + {0xb10d8e1456105dad, 0x7425a83e872c5f48}, + {0xdd50f1996b947518, 0xd12f124e28f7771a}, + {0x8a5296ffe33cc92f, 0x82bd6b70d99aaa70}, + {0xace73cbfdc0bfb7b, 0x636cc64d1001550c}, + {0xd8210befd30efa5a, 0x3c47f7e05401aa4f}, + {0x8714a775e3e95c78, 0x65acfaec34810a72}, + {0xa8d9d1535ce3b396, 0x7f1839a741a14d0e}, + {0xd31045a8341ca07c, 0x1ede48111209a051}, + {0x83ea2b892091e44d, 0x934aed0aab460433}, + {0xa4e4b66b68b65d60, 0xf81da84d56178540}, + {0xce1de40642e3f4b9, 0x36251260ab9d668f}, + {0x80d2ae83e9ce78f3, 0xc1d72b7c6b42601a}, + {0xa1075a24e4421730, 0xb24cf65b8612f820}, + {0xc94930ae1d529cfc, 0xdee033f26797b628}, + {0xfb9b7cd9a4a7443c, 0x169840ef017da3b2}, + {0x9d412e0806e88aa5, 0x8e1f289560ee864f}, + {0xc491798a08a2ad4e, 0xf1a6f2bab92a27e3}, + {0xf5b5d7ec8acb58a2, 0xae10af696774b1dc}, + {0x9991a6f3d6bf1765, 0xacca6da1e0a8ef2a}, + {0xbff610b0cc6edd3f, 0x17fd090a58d32af4}, + {0xeff394dcff8a948e, 0xddfc4b4cef07f5b1}, + {0x95f83d0a1fb69cd9, 0x4abdaf101564f98f}, + {0xbb764c4ca7a4440f, 0x9d6d1ad41abe37f2}, + {0xea53df5fd18d5513, 0x84c86189216dc5ee}, + {0x92746b9be2f8552c, 0x32fd3cf5b4e49bb5}, + {0xb7118682dbb66a77, 0x3fbc8c33221dc2a2}, + {0xe4d5e82392a40515, 0x0fabaf3feaa5334b}, + {0x8f05b1163ba6832d, 0x29cb4d87f2a7400f}, + {0xb2c71d5bca9023f8, 0x743e20e9ef511013}, + {0xdf78e4b2bd342cf6, 0x914da9246b255417}, + {0x8bab8eefb6409c1a, 0x1ad089b6c2f7548f}, + {0xae9672aba3d0c320, 0xa184ac2473b529b2}, + {0xda3c0f568cc4f3e8, 0xc9e5d72d90a2741f}, + {0x8865899617fb1871, 0x7e2fa67c7a658893}, + {0xaa7eebfb9df9de8d, 0xddbb901b98feeab8}, + {0xd51ea6fa85785631, 0x552a74227f3ea566}, + {0x8533285c936b35de, 0xd53a88958f872760}, + {0xa67ff273b8460356, 0x8a892abaf368f138}, + {0xd01fef10a657842c, 0x2d2b7569b0432d86}, + {0x8213f56a67f6b29b, 0x9c3b29620e29fc74}, + {0xa298f2c501f45f42, 0x8349f3ba91b47b90}, + {0xcb3f2f7642717713, 0x241c70a936219a74}, + {0xfe0efb53d30dd4d7, 0xed238cd383aa0111}, + {0x9ec95d1463e8a506, 0xf4363804324a40ab}, + {0xc67bb4597ce2ce48, 0xb143c6053edcd0d6}, + {0xf81aa16fdc1b81da, 0xdd94b7868e94050b}, + {0x9b10a4e5e9913128, 0xca7cf2b4191c8327}, + {0xc1d4ce1f63f57d72, 0xfd1c2f611f63a3f1}, + {0xf24a01a73cf2dccf, 0xbc633b39673c8ced}, + {0x976e41088617ca01, 0xd5be0503e085d814}, + {0xbd49d14aa79dbc82, 0x4b2d8644d8a74e19}, + {0xec9c459d51852ba2, 0xddf8e7d60ed1219f}, + {0x93e1ab8252f33b45, 0xcabb90e5c942b504}, + {0xb8da1662e7b00a17, 0x3d6a751f3b936244}, + {0xe7109bfba19c0c9d, 0x0cc512670a783ad5}, + {0x906a617d450187e2, 0x27fb2b80668b24c6}, + {0xb484f9dc9641e9da, 0xb1f9f660802dedf7}, + {0xe1a63853bbd26451, 0x5e7873f8a0396974}, + {0x8d07e33455637eb2, 0xdb0b487b6423e1e9}, + {0xb049dc016abc5e5f, 0x91ce1a9a3d2cda63}, + {0xdc5c5301c56b75f7, 0x7641a140cc7810fc}, + {0x89b9b3e11b6329ba, 0xa9e904c87fcb0a9e}, + {0xac2820d9623bf429, 0x546345fa9fbdcd45}, + {0xd732290fbacaf133, 0xa97c177947ad4096}, + {0x867f59a9d4bed6c0, 0x49ed8eabcccc485e}, + {0xa81f301449ee8c70, 0x5c68f256bfff5a75}, + {0xd226fc195c6a2f8c, 0x73832eec6fff3112}, + {0x83585d8fd9c25db7, 0xc831fd53c5ff7eac}, + {0xa42e74f3d032f525, 0xba3e7ca8b77f5e56}, + {0xcd3a1230c43fb26f, 0x28ce1bd2e55f35ec}, + {0x80444b5e7aa7cf85, 0x7980d163cf5b81b4}, + {0xa0555e361951c366, 0xd7e105bcc3326220}, + {0xc86ab5c39fa63440, 0x8dd9472bf3fefaa8}, + {0xfa856334878fc150, 0xb14f98f6f0feb952}, + {0x9c935e00d4b9d8d2, 0x6ed1bf9a569f33d4}, + {0xc3b8358109e84f07, 0x0a862f80ec4700c9}, + {0xf4a642e14c6262c8, 0xcd27bb612758c0fb}, + {0x98e7e9cccfbd7dbd, 0x8038d51cb897789d}, + {0xbf21e44003acdd2c, 0xe0470a63e6bd56c4}, + {0xeeea5d5004981478, 0x1858ccfce06cac75}, + {0x95527a5202df0ccb, 0x0f37801e0c43ebc9}, + {0xbaa718e68396cffd, 0xd30560258f54e6bb}, + {0xe950df20247c83fd, 0x47c6b82ef32a206a}, + {0x91d28b7416cdd27e, 0x4cdc331d57fa5442}, + {0xb6472e511c81471d, 0xe0133fe4adf8e953}, + {0xe3d8f9e563a198e5, 0x58180fddd97723a7}, + {0x8e679c2f5e44ff8f, 0x570f09eaa7ea7649}, + {0xb201833b35d63f73, 0x2cd2cc6551e513db}, + {0xde81e40a034bcf4f, 0xf8077f7ea65e58d2}, + {0x8b112e86420f6191, 0xfb04afaf27faf783}, + {0xadd57a27d29339f6, 0x79c5db9af1f9b564}, + {0xd94ad8b1c7380874, 0x18375281ae7822bd}, + {0x87cec76f1c830548, 0x8f2293910d0b15b6}, + {0xa9c2794ae3a3c69a, 0xb2eb3875504ddb23}, + {0xd433179d9c8cb841, 0x5fa60692a46151ec}, + {0x849feec281d7f328, 0xdbc7c41ba6bcd334}, + {0xa5c7ea73224deff3, 0x12b9b522906c0801}, + {0xcf39e50feae16bef, 0xd768226b34870a01}, + {0x81842f29f2cce375, 0xe6a1158300d46641}, + {0xa1e53af46f801c53, 0x60495ae3c1097fd1}, + {0xca5e89b18b602368, 0x385bb19cb14bdfc5}, + {0xfcf62c1dee382c42, 0x46729e03dd9ed7b6}, + {0x9e19db92b4e31ba9, 0x6c07a2c26a8346d2}, + {0xc5a05277621be293, 0xc7098b7305241886}, + { 0xf70867153aa2db38, + 0xb8cbee4fc66d1ea8 } +#else + {0xff77b1fcbebcdc4f, 0x25e8e89c13bb0f7b}, + {0xce5d73ff402d98e3, 0xfb0a3d212dc81290}, + {0xa6b34ad8c9dfc06f, 0xf42faa48c0ea481f}, + {0x86a8d39ef77164bc, 0xae5dff9c02033198}, + {0xd98ddaee19068c76, 0x3badd624dd9b0958}, + {0xafbd2350644eeacf, 0xe5d1929ef90898fb}, + {0x8df5efabc5979c8f, 0xca8d3ffa1ef463c2}, + {0xe55990879ddcaabd, 0xcc420a6a101d0516}, + {0xb94470938fa89bce, 0xf808e40e8d5b3e6a}, + {0x95a8637627989aad, 0xdde7001379a44aa9}, + {0xf1c90080baf72cb1, 0x5324c68b12dd6339}, + {0xc350000000000000, 0x0000000000000000}, + {0x9dc5ada82b70b59d, 0xf020000000000000}, + {0xfee50b7025c36a08, 0x02f236d04753d5b5}, + {0xcde6fd5e09abcf26, 0xed4c0226b55e6f87}, + {0xa6539930bf6bff45, 0x84db8346b786151d}, + {0x865b86925b9bc5c2, 0x0b8a2392ba45a9b3}, + {0xd910f7ff28069da4, 0x1b2ba1518094da05}, + {0xaf58416654a6babb, 0x387ac8d1970027b3}, + {0x8da471a9de737e24, 0x5ceaecfed289e5d3}, + {0xe4d5e82392a40515, 0x0fabaf3feaa5334b}, + {0xb8da1662e7b00a17, 0x3d6a751f3b936244}, + { 0x95527a5202df0ccb, + 0x0f37801e0c43ebc9 } +#endif + }; + +#if FMT_USE_FULL_CACHE_DRAGONBOX + return pow10_significands[k - float_info::min_k]; +#else + static constexpr const uint64_t powers_of_5_64[] = { + 0x0000000000000001, 0x0000000000000005, 0x0000000000000019, + 0x000000000000007d, 0x0000000000000271, 0x0000000000000c35, + 0x0000000000003d09, 0x000000000001312d, 0x000000000005f5e1, + 0x00000000001dcd65, 0x00000000009502f9, 0x0000000002e90edd, + 0x000000000e8d4a51, 0x0000000048c27395, 0x000000016bcc41e9, + 0x000000071afd498d, 0x0000002386f26fc1, 0x000000b1a2bc2ec5, + 0x000003782dace9d9, 0x00001158e460913d, 0x000056bc75e2d631, + 0x0001b1ae4d6e2ef5, 0x000878678326eac9, 0x002a5a058fc295ed, + 0x00d3c21bcecceda1, 0x0422ca8b0a00a425, 0x14adf4b7320334b9}; + + static const int compression_ratio = 27; + + // Compute base index. + int cache_index = (k - float_info::min_k) / compression_ratio; + int kb = cache_index * compression_ratio + float_info::min_k; + int offset = k - kb; + + // Get base cache. + uint128_fallback base_cache = pow10_significands[cache_index]; + if (offset == 0) return base_cache; + + // Compute the required amount of bit-shift. + int alpha = floor_log2_pow10(kb + offset) - floor_log2_pow10(kb) - offset; + FMT_ASSERT(alpha > 0 && alpha < 64, "shifting error detected"); + + // Try to recover the real cache. + uint64_t pow5 = powers_of_5_64[offset]; + uint128_fallback recovered_cache = umul128(base_cache.high(), pow5); + uint128_fallback middle_low = umul128(base_cache.low(), pow5); + + recovered_cache += middle_low.high(); + + uint64_t high_to_middle = recovered_cache.high() << (64 - alpha); + uint64_t middle_to_low = recovered_cache.low() << (64 - alpha); + + recovered_cache = + uint128_fallback{(recovered_cache.low() >> alpha) | high_to_middle, + ((middle_low.low() >> alpha) | middle_to_low)}; + FMT_ASSERT(recovered_cache.low() + 1 != 0, ""); + return {recovered_cache.high(), recovered_cache.low() + 1}; +#endif + } + + struct compute_mul_result { + carrier_uint result; + bool is_integer; + }; + struct compute_mul_parity_result { + bool parity; + bool is_integer; + }; + + static compute_mul_result compute_mul( + carrier_uint u, const cache_entry_type& cache) noexcept { + auto r = umul192_upper128(u, cache); + return {r.high(), r.low() == 0}; + } + + static uint32_t compute_delta(cache_entry_type const& cache, + int beta) noexcept { + return static_cast(cache.high() >> (64 - 1 - beta)); + } + + static compute_mul_parity_result compute_mul_parity( + carrier_uint two_f, const cache_entry_type& cache, int beta) noexcept { + FMT_ASSERT(beta >= 1, ""); + FMT_ASSERT(beta < 64, ""); + + auto r = umul192_lower128(two_f, cache); + return {((r.high() >> (64 - beta)) & 1) != 0, + ((r.high() << beta) | (r.low() >> (64 - beta))) == 0}; + } + + static carrier_uint compute_left_endpoint_for_shorter_interval_case( + const cache_entry_type& cache, int beta) noexcept { + return (cache.high() - + (cache.high() >> (num_significand_bits() + 2))) >> + (64 - num_significand_bits() - 1 - beta); + } + + static carrier_uint compute_right_endpoint_for_shorter_interval_case( + const cache_entry_type& cache, int beta) noexcept { + return (cache.high() + + (cache.high() >> (num_significand_bits() + 1))) >> + (64 - num_significand_bits() - 1 - beta); + } + + static carrier_uint compute_round_up_for_shorter_interval_case( + const cache_entry_type& cache, int beta) noexcept { + return ((cache.high() >> (64 - num_significand_bits() - 2 - beta)) + + 1) / + 2; + } +}; + +// Various integer checks +template +bool is_left_endpoint_integer_shorter_interval(int exponent) noexcept { + const int case_shorter_interval_left_endpoint_lower_threshold = 2; + const int case_shorter_interval_left_endpoint_upper_threshold = 3; + return exponent >= case_shorter_interval_left_endpoint_lower_threshold && + exponent <= case_shorter_interval_left_endpoint_upper_threshold; +} + +// Remove trailing zeros from n and return the number of zeros removed (float) +FMT_INLINE int remove_trailing_zeros(uint32_t& n) noexcept { + FMT_ASSERT(n != 0, ""); + const uint32_t mod_inv_5 = 0xcccccccd; + const uint32_t mod_inv_25 = mod_inv_5 * mod_inv_5; + + int s = 0; + while (true) { + auto q = rotr(n * mod_inv_25, 2); + if (q > max_value() / 100) break; + n = q; + s += 2; + } + auto q = rotr(n * mod_inv_5, 1); + if (q <= max_value() / 10) { + n = q; + s |= 1; + } + + return s; +} + +// Removes trailing zeros and returns the number of zeros removed (double) +FMT_INLINE int remove_trailing_zeros(uint64_t& n) noexcept { + FMT_ASSERT(n != 0, ""); + + // This magic number is ceil(2^90 / 10^8). + constexpr uint64_t magic_number = 12379400392853802749ull; + auto nm = umul128(n, magic_number); + + // Is n is divisible by 10^8? + if ((nm.high() & ((1ull << (90 - 64)) - 1)) == 0 && nm.low() < magic_number) { + // If yes, work with the quotient. + auto n32 = static_cast(nm.high() >> (90 - 64)); + + const uint32_t mod_inv_5 = 0xcccccccd; + const uint32_t mod_inv_25 = mod_inv_5 * mod_inv_5; + + int s = 8; + while (true) { + auto q = rotr(n32 * mod_inv_25, 2); + if (q > max_value() / 100) break; + n32 = q; + s += 2; + } + auto q = rotr(n32 * mod_inv_5, 1); + if (q <= max_value() / 10) { + n32 = q; + s |= 1; + } + + n = n32; + return s; + } + + // If n is not divisible by 10^8, work with n itself. + const uint64_t mod_inv_5 = 0xcccccccccccccccd; + const uint64_t mod_inv_25 = mod_inv_5 * mod_inv_5; + + int s = 0; + while (true) { + auto q = rotr(n * mod_inv_25, 2); + if (q > max_value() / 100) break; + n = q; + s += 2; + } + auto q = rotr(n * mod_inv_5, 1); + if (q <= max_value() / 10) { + n = q; + s |= 1; + } + + return s; +} + +// The main algorithm for shorter interval case +template +FMT_INLINE decimal_fp shorter_interval_case(int exponent) noexcept { + decimal_fp ret_value; + // Compute k and beta + const int minus_k = floor_log10_pow2_minus_log10_4_over_3(exponent); + const int beta = exponent + floor_log2_pow10(-minus_k); + + // Compute xi and zi + using cache_entry_type = typename cache_accessor::cache_entry_type; + const cache_entry_type cache = cache_accessor::get_cached_power(-minus_k); + + auto xi = cache_accessor::compute_left_endpoint_for_shorter_interval_case( + cache, beta); + auto zi = cache_accessor::compute_right_endpoint_for_shorter_interval_case( + cache, beta); + + // If the left endpoint is not an integer, increase it + if (!is_left_endpoint_integer_shorter_interval(exponent)) ++xi; + + // Try bigger divisor + ret_value.significand = zi / 10; + + // If succeed, remove trailing zeros if necessary and return + if (ret_value.significand * 10 >= xi) { + ret_value.exponent = minus_k + 1; + ret_value.exponent += remove_trailing_zeros(ret_value.significand); + return ret_value; + } + + // Otherwise, compute the round-up of y + ret_value.significand = + cache_accessor::compute_round_up_for_shorter_interval_case(cache, + beta); + ret_value.exponent = minus_k; + + // When tie occurs, choose one of them according to the rule + if (exponent >= float_info::shorter_interval_tie_lower_threshold && + exponent <= float_info::shorter_interval_tie_upper_threshold) { + ret_value.significand = ret_value.significand % 2 == 0 + ? ret_value.significand + : ret_value.significand - 1; + } else if (ret_value.significand < xi) { + ++ret_value.significand; + } + return ret_value; +} + +template decimal_fp to_decimal(T x) noexcept { + // Step 1: integer promotion & Schubfach multiplier calculation. + + using carrier_uint = typename float_info::carrier_uint; + using cache_entry_type = typename cache_accessor::cache_entry_type; + auto br = bit_cast(x); + + // Extract significand bits and exponent bits. + const carrier_uint significand_mask = + (static_cast(1) << num_significand_bits()) - 1; + carrier_uint significand = (br & significand_mask); + int exponent = + static_cast((br & exponent_mask()) >> num_significand_bits()); + + if (exponent != 0) { // Check if normal. + exponent -= exponent_bias() + num_significand_bits(); + + // Shorter interval case; proceed like Schubfach. + // In fact, when exponent == 1 and significand == 0, the interval is + // regular. However, it can be shown that the end-results are anyway same. + if (significand == 0) return shorter_interval_case(exponent); + + significand |= (static_cast(1) << num_significand_bits()); + } else { + // Subnormal case; the interval is always regular. + if (significand == 0) return {0, 0}; + exponent = + std::numeric_limits::min_exponent - num_significand_bits() - 1; + } + + const bool include_left_endpoint = (significand % 2 == 0); + const bool include_right_endpoint = include_left_endpoint; + + // Compute k and beta. + const int minus_k = floor_log10_pow2(exponent) - float_info::kappa; + const cache_entry_type cache = cache_accessor::get_cached_power(-minus_k); + const int beta = exponent + floor_log2_pow10(-minus_k); + + // Compute zi and deltai. + // 10^kappa <= deltai < 10^(kappa + 1) + const uint32_t deltai = cache_accessor::compute_delta(cache, beta); + const carrier_uint two_fc = significand << 1; + + // For the case of binary32, the result of integer check is not correct for + // 29711844 * 2^-82 + // = 6.1442653300000000008655037797566933477355632930994033813476... * 10^-18 + // and 29711844 * 2^-81 + // = 1.2288530660000000001731007559513386695471126586198806762695... * 10^-17, + // and they are the unique counterexamples. However, since 29711844 is even, + // this does not cause any problem for the endpoints calculations; it can only + // cause a problem when we need to perform integer check for the center. + // Fortunately, with these inputs, that branch is never executed, so we are + // fine. + const typename cache_accessor::compute_mul_result z_mul = + cache_accessor::compute_mul((two_fc | 1) << beta, cache); + + // Step 2: Try larger divisor; remove trailing zeros if necessary. + + // Using an upper bound on zi, we might be able to optimize the division + // better than the compiler; we are computing zi / big_divisor here. + decimal_fp ret_value; + ret_value.significand = divide_by_10_to_kappa_plus_1(z_mul.result); + uint32_t r = static_cast(z_mul.result - float_info::big_divisor * + ret_value.significand); + + if (r < deltai) { + // Exclude the right endpoint if necessary. + if (r == 0 && (z_mul.is_integer & !include_right_endpoint)) { + --ret_value.significand; + r = float_info::big_divisor; + goto small_divisor_case_label; + } + } else if (r > deltai) { + goto small_divisor_case_label; + } else { + // r == deltai; compare fractional parts. + const typename cache_accessor::compute_mul_parity_result x_mul = + cache_accessor::compute_mul_parity(two_fc - 1, cache, beta); + + if (!(x_mul.parity | (x_mul.is_integer & include_left_endpoint))) + goto small_divisor_case_label; + } + ret_value.exponent = minus_k + float_info::kappa + 1; + + // We may need to remove trailing zeros. + ret_value.exponent += remove_trailing_zeros(ret_value.significand); + return ret_value; + + // Step 3: Find the significand with the smaller divisor. + +small_divisor_case_label: + ret_value.significand *= 10; + ret_value.exponent = minus_k + float_info::kappa; + + uint32_t dist = r - (deltai / 2) + (float_info::small_divisor / 2); + const bool approx_y_parity = + ((dist ^ (float_info::small_divisor / 2)) & 1) != 0; + + // Is dist divisible by 10^kappa? + const bool divisible_by_small_divisor = + check_divisibility_and_divide_by_pow10::kappa>(dist); + + // Add dist / 10^kappa to the significand. + ret_value.significand += dist; + + if (!divisible_by_small_divisor) return ret_value; + + // Check z^(f) >= epsilon^(f). + // We have either yi == zi - epsiloni or yi == (zi - epsiloni) - 1, + // where yi == zi - epsiloni if and only if z^(f) >= epsilon^(f). + // Since there are only 2 possibilities, we only need to care about the + // parity. Also, zi and r should have the same parity since the divisor + // is an even number. + const auto y_mul = cache_accessor::compute_mul_parity(two_fc, cache, beta); + + // If z^(f) >= epsilon^(f), we might have a tie when z^(f) == epsilon^(f), + // or equivalently, when y is an integer. + if (y_mul.parity != approx_y_parity) + --ret_value.significand; + else if (y_mul.is_integer & (ret_value.significand % 2 != 0)) + --ret_value.significand; + return ret_value; +} +} // namespace dragonbox + +#ifdef _MSC_VER +FMT_FUNC auto fmt_snprintf(char* buf, size_t size, const char* fmt, ...) + -> int { + auto args = va_list(); + va_start(args, fmt); + int result = vsnprintf_s(buf, size, _TRUNCATE, fmt, args); + va_end(args); + return result; +} +#endif +} // namespace detail + +template <> struct formatter { + FMT_CONSTEXPR auto parse(format_parse_context& ctx) + -> format_parse_context::iterator { + return ctx.begin(); + } + + template + auto format(const detail::bigint& n, FormatContext& ctx) const -> + typename FormatContext::iterator { + auto out = ctx.out(); + bool first = true; + for (auto i = n.bigits_.size(); i > 0; --i) { + auto value = n.bigits_[i - 1u]; + if (first) { + out = format_to(out, FMT_STRING("{:x}"), value); + first = false; + continue; + } + out = format_to(out, FMT_STRING("{:08x}"), value); + } + if (n.exp_ > 0) + out = format_to(out, FMT_STRING("p{}"), + n.exp_ * detail::bigint::bigit_bits); + return out; + } +}; + +FMT_FUNC detail::utf8_to_utf16::utf8_to_utf16(string_view s) { + for_each_codepoint(s, [this](uint32_t cp, string_view) { + if (cp == invalid_code_point) FMT_THROW(std::runtime_error("invalid utf8")); + if (cp <= 0xFFFF) { + buffer_.push_back(static_cast(cp)); + } else { + cp -= 0x10000; + buffer_.push_back(static_cast(0xD800 + (cp >> 10))); + buffer_.push_back(static_cast(0xDC00 + (cp & 0x3FF))); + } + return true; + }); + buffer_.push_back(0); +} + +FMT_FUNC void format_system_error(detail::buffer& out, int error_code, + const char* message) noexcept { + FMT_TRY { + auto ec = std::error_code(error_code, std::generic_category()); + write(std::back_inserter(out), std::system_error(ec, message).what()); + return; + } + FMT_CATCH(...) {} + format_error_code(out, error_code, message); +} + +FMT_FUNC void report_system_error(int error_code, + const char* message) noexcept { + report_error(format_system_error, error_code, message); +} + +FMT_FUNC std::string vformat(string_view fmt, format_args args) { + // Don't optimize the "{}" case to keep the binary size small and because it + // can be better optimized in fmt::format anyway. + auto buffer = memory_buffer(); + detail::vformat_to(buffer, fmt, args); + return to_string(buffer); +} + +namespace detail { +#ifdef _WIN32 +using dword = conditional_t; +extern "C" __declspec(dllimport) int __stdcall WriteConsoleW( // + void*, const void*, dword, dword*, void*); + +FMT_FUNC bool write_console(std::FILE* f, string_view text) { + auto fd = _fileno(f); + if (_isatty(fd)) { + detail::utf8_to_utf16 u16(string_view(text.data(), text.size())); + auto written = detail::dword(); + if (detail::WriteConsoleW(reinterpret_cast(_get_osfhandle(fd)), + u16.c_str(), static_cast(u16.size()), + &written, nullptr)) { + return true; + } + } + // We return false if the file descriptor was not TTY, or it was but + // SetConsoleW failed which can happen if the output has been redirected to + // NUL. In both cases when we return false, we should attempt to do regular + // write via fwrite or std::ostream::write. + return false; +} +#endif + +FMT_FUNC void print(std::FILE* f, string_view text) { +#ifdef _WIN32 + if (write_console(f, text)) return; +#endif + detail::fwrite_fully(text.data(), 1, text.size(), f); +} +} // namespace detail + +FMT_FUNC void vprint(std::FILE* f, string_view format_str, format_args args) { + memory_buffer buffer; + detail::vformat_to(buffer, format_str, args); + detail::print(f, {buffer.data(), buffer.size()}); +} + +#ifdef _WIN32 +// Print assuming legacy (non-Unicode) encoding. +FMT_FUNC void detail::vprint_mojibake(std::FILE* f, string_view format_str, + format_args args) { + memory_buffer buffer; + detail::vformat_to(buffer, format_str, + basic_format_args>(args)); + fwrite_fully(buffer.data(), 1, buffer.size(), f); +} +#endif + +FMT_FUNC void vprint(string_view format_str, format_args args) { + vprint(stdout, format_str, args); +} + +namespace detail { + +struct singleton { + unsigned char upper; + unsigned char lower_count; +}; + +inline auto is_printable(uint16_t x, const singleton* singletons, + size_t singletons_size, + const unsigned char* singleton_lowers, + const unsigned char* normal, size_t normal_size) + -> bool { + auto upper = x >> 8; + auto lower_start = 0; + for (size_t i = 0; i < singletons_size; ++i) { + auto s = singletons[i]; + auto lower_end = lower_start + s.lower_count; + if (upper < s.upper) break; + if (upper == s.upper) { + for (auto j = lower_start; j < lower_end; ++j) { + if (singleton_lowers[j] == (x & 0xff)) return false; + } + } + lower_start = lower_end; + } + + auto xsigned = static_cast(x); + auto current = true; + for (size_t i = 0; i < normal_size; ++i) { + auto v = static_cast(normal[i]); + auto len = (v & 0x80) != 0 ? (v & 0x7f) << 8 | normal[++i] : v; + xsigned -= len; + if (xsigned < 0) break; + current = !current; + } + return current; +} + +// This code is generated by support/printable.py. +FMT_FUNC auto is_printable(uint32_t cp) -> bool { + static constexpr singleton singletons0[] = { + {0x00, 1}, {0x03, 5}, {0x05, 6}, {0x06, 3}, {0x07, 6}, {0x08, 8}, + {0x09, 17}, {0x0a, 28}, {0x0b, 25}, {0x0c, 20}, {0x0d, 16}, {0x0e, 13}, + {0x0f, 4}, {0x10, 3}, {0x12, 18}, {0x13, 9}, {0x16, 1}, {0x17, 5}, + {0x18, 2}, {0x19, 3}, {0x1a, 7}, {0x1c, 2}, {0x1d, 1}, {0x1f, 22}, + {0x20, 3}, {0x2b, 3}, {0x2c, 2}, {0x2d, 11}, {0x2e, 1}, {0x30, 3}, + {0x31, 2}, {0x32, 1}, {0xa7, 2}, {0xa9, 2}, {0xaa, 4}, {0xab, 8}, + {0xfa, 2}, {0xfb, 5}, {0xfd, 4}, {0xfe, 3}, {0xff, 9}, + }; + static constexpr unsigned char singletons0_lower[] = { + 0xad, 0x78, 0x79, 0x8b, 0x8d, 0xa2, 0x30, 0x57, 0x58, 0x8b, 0x8c, 0x90, + 0x1c, 0x1d, 0xdd, 0x0e, 0x0f, 0x4b, 0x4c, 0xfb, 0xfc, 0x2e, 0x2f, 0x3f, + 0x5c, 0x5d, 0x5f, 0xb5, 0xe2, 0x84, 0x8d, 0x8e, 0x91, 0x92, 0xa9, 0xb1, + 0xba, 0xbb, 0xc5, 0xc6, 0xc9, 0xca, 0xde, 0xe4, 0xe5, 0xff, 0x00, 0x04, + 0x11, 0x12, 0x29, 0x31, 0x34, 0x37, 0x3a, 0x3b, 0x3d, 0x49, 0x4a, 0x5d, + 0x84, 0x8e, 0x92, 0xa9, 0xb1, 0xb4, 0xba, 0xbb, 0xc6, 0xca, 0xce, 0xcf, + 0xe4, 0xe5, 0x00, 0x04, 0x0d, 0x0e, 0x11, 0x12, 0x29, 0x31, 0x34, 0x3a, + 0x3b, 0x45, 0x46, 0x49, 0x4a, 0x5e, 0x64, 0x65, 0x84, 0x91, 0x9b, 0x9d, + 0xc9, 0xce, 0xcf, 0x0d, 0x11, 0x29, 0x45, 0x49, 0x57, 0x64, 0x65, 0x8d, + 0x91, 0xa9, 0xb4, 0xba, 0xbb, 0xc5, 0xc9, 0xdf, 0xe4, 0xe5, 0xf0, 0x0d, + 0x11, 0x45, 0x49, 0x64, 0x65, 0x80, 0x84, 0xb2, 0xbc, 0xbe, 0xbf, 0xd5, + 0xd7, 0xf0, 0xf1, 0x83, 0x85, 0x8b, 0xa4, 0xa6, 0xbe, 0xbf, 0xc5, 0xc7, + 0xce, 0xcf, 0xda, 0xdb, 0x48, 0x98, 0xbd, 0xcd, 0xc6, 0xce, 0xcf, 0x49, + 0x4e, 0x4f, 0x57, 0x59, 0x5e, 0x5f, 0x89, 0x8e, 0x8f, 0xb1, 0xb6, 0xb7, + 0xbf, 0xc1, 0xc6, 0xc7, 0xd7, 0x11, 0x16, 0x17, 0x5b, 0x5c, 0xf6, 0xf7, + 0xfe, 0xff, 0x80, 0x0d, 0x6d, 0x71, 0xde, 0xdf, 0x0e, 0x0f, 0x1f, 0x6e, + 0x6f, 0x1c, 0x1d, 0x5f, 0x7d, 0x7e, 0xae, 0xaf, 0xbb, 0xbc, 0xfa, 0x16, + 0x17, 0x1e, 0x1f, 0x46, 0x47, 0x4e, 0x4f, 0x58, 0x5a, 0x5c, 0x5e, 0x7e, + 0x7f, 0xb5, 0xc5, 0xd4, 0xd5, 0xdc, 0xf0, 0xf1, 0xf5, 0x72, 0x73, 0x8f, + 0x74, 0x75, 0x96, 0x2f, 0x5f, 0x26, 0x2e, 0x2f, 0xa7, 0xaf, 0xb7, 0xbf, + 0xc7, 0xcf, 0xd7, 0xdf, 0x9a, 0x40, 0x97, 0x98, 0x30, 0x8f, 0x1f, 0xc0, + 0xc1, 0xce, 0xff, 0x4e, 0x4f, 0x5a, 0x5b, 0x07, 0x08, 0x0f, 0x10, 0x27, + 0x2f, 0xee, 0xef, 0x6e, 0x6f, 0x37, 0x3d, 0x3f, 0x42, 0x45, 0x90, 0x91, + 0xfe, 0xff, 0x53, 0x67, 0x75, 0xc8, 0xc9, 0xd0, 0xd1, 0xd8, 0xd9, 0xe7, + 0xfe, 0xff, + }; + static constexpr singleton singletons1[] = { + {0x00, 6}, {0x01, 1}, {0x03, 1}, {0x04, 2}, {0x08, 8}, {0x09, 2}, + {0x0a, 5}, {0x0b, 2}, {0x0e, 4}, {0x10, 1}, {0x11, 2}, {0x12, 5}, + {0x13, 17}, {0x14, 1}, {0x15, 2}, {0x17, 2}, {0x19, 13}, {0x1c, 5}, + {0x1d, 8}, {0x24, 1}, {0x6a, 3}, {0x6b, 2}, {0xbc, 2}, {0xd1, 2}, + {0xd4, 12}, {0xd5, 9}, {0xd6, 2}, {0xd7, 2}, {0xda, 1}, {0xe0, 5}, + {0xe1, 2}, {0xe8, 2}, {0xee, 32}, {0xf0, 4}, {0xf8, 2}, {0xf9, 2}, + {0xfa, 2}, {0xfb, 1}, + }; + static constexpr unsigned char singletons1_lower[] = { + 0x0c, 0x27, 0x3b, 0x3e, 0x4e, 0x4f, 0x8f, 0x9e, 0x9e, 0x9f, 0x06, 0x07, + 0x09, 0x36, 0x3d, 0x3e, 0x56, 0xf3, 0xd0, 0xd1, 0x04, 0x14, 0x18, 0x36, + 0x37, 0x56, 0x57, 0x7f, 0xaa, 0xae, 0xaf, 0xbd, 0x35, 0xe0, 0x12, 0x87, + 0x89, 0x8e, 0x9e, 0x04, 0x0d, 0x0e, 0x11, 0x12, 0x29, 0x31, 0x34, 0x3a, + 0x45, 0x46, 0x49, 0x4a, 0x4e, 0x4f, 0x64, 0x65, 0x5c, 0xb6, 0xb7, 0x1b, + 0x1c, 0x07, 0x08, 0x0a, 0x0b, 0x14, 0x17, 0x36, 0x39, 0x3a, 0xa8, 0xa9, + 0xd8, 0xd9, 0x09, 0x37, 0x90, 0x91, 0xa8, 0x07, 0x0a, 0x3b, 0x3e, 0x66, + 0x69, 0x8f, 0x92, 0x6f, 0x5f, 0xee, 0xef, 0x5a, 0x62, 0x9a, 0x9b, 0x27, + 0x28, 0x55, 0x9d, 0xa0, 0xa1, 0xa3, 0xa4, 0xa7, 0xa8, 0xad, 0xba, 0xbc, + 0xc4, 0x06, 0x0b, 0x0c, 0x15, 0x1d, 0x3a, 0x3f, 0x45, 0x51, 0xa6, 0xa7, + 0xcc, 0xcd, 0xa0, 0x07, 0x19, 0x1a, 0x22, 0x25, 0x3e, 0x3f, 0xc5, 0xc6, + 0x04, 0x20, 0x23, 0x25, 0x26, 0x28, 0x33, 0x38, 0x3a, 0x48, 0x4a, 0x4c, + 0x50, 0x53, 0x55, 0x56, 0x58, 0x5a, 0x5c, 0x5e, 0x60, 0x63, 0x65, 0x66, + 0x6b, 0x73, 0x78, 0x7d, 0x7f, 0x8a, 0xa4, 0xaa, 0xaf, 0xb0, 0xc0, 0xd0, + 0xae, 0xaf, 0x79, 0xcc, 0x6e, 0x6f, 0x93, + }; + static constexpr unsigned char normal0[] = { + 0x00, 0x20, 0x5f, 0x22, 0x82, 0xdf, 0x04, 0x82, 0x44, 0x08, 0x1b, 0x04, + 0x06, 0x11, 0x81, 0xac, 0x0e, 0x80, 0xab, 0x35, 0x28, 0x0b, 0x80, 0xe0, + 0x03, 0x19, 0x08, 0x01, 0x04, 0x2f, 0x04, 0x34, 0x04, 0x07, 0x03, 0x01, + 0x07, 0x06, 0x07, 0x11, 0x0a, 0x50, 0x0f, 0x12, 0x07, 0x55, 0x07, 0x03, + 0x04, 0x1c, 0x0a, 0x09, 0x03, 0x08, 0x03, 0x07, 0x03, 0x02, 0x03, 0x03, + 0x03, 0x0c, 0x04, 0x05, 0x03, 0x0b, 0x06, 0x01, 0x0e, 0x15, 0x05, 0x3a, + 0x03, 0x11, 0x07, 0x06, 0x05, 0x10, 0x07, 0x57, 0x07, 0x02, 0x07, 0x15, + 0x0d, 0x50, 0x04, 0x43, 0x03, 0x2d, 0x03, 0x01, 0x04, 0x11, 0x06, 0x0f, + 0x0c, 0x3a, 0x04, 0x1d, 0x25, 0x5f, 0x20, 0x6d, 0x04, 0x6a, 0x25, 0x80, + 0xc8, 0x05, 0x82, 0xb0, 0x03, 0x1a, 0x06, 0x82, 0xfd, 0x03, 0x59, 0x07, + 0x15, 0x0b, 0x17, 0x09, 0x14, 0x0c, 0x14, 0x0c, 0x6a, 0x06, 0x0a, 0x06, + 0x1a, 0x06, 0x59, 0x07, 0x2b, 0x05, 0x46, 0x0a, 0x2c, 0x04, 0x0c, 0x04, + 0x01, 0x03, 0x31, 0x0b, 0x2c, 0x04, 0x1a, 0x06, 0x0b, 0x03, 0x80, 0xac, + 0x06, 0x0a, 0x06, 0x21, 0x3f, 0x4c, 0x04, 0x2d, 0x03, 0x74, 0x08, 0x3c, + 0x03, 0x0f, 0x03, 0x3c, 0x07, 0x38, 0x08, 0x2b, 0x05, 0x82, 0xff, 0x11, + 0x18, 0x08, 0x2f, 0x11, 0x2d, 0x03, 0x20, 0x10, 0x21, 0x0f, 0x80, 0x8c, + 0x04, 0x82, 0x97, 0x19, 0x0b, 0x15, 0x88, 0x94, 0x05, 0x2f, 0x05, 0x3b, + 0x07, 0x02, 0x0e, 0x18, 0x09, 0x80, 0xb3, 0x2d, 0x74, 0x0c, 0x80, 0xd6, + 0x1a, 0x0c, 0x05, 0x80, 0xff, 0x05, 0x80, 0xdf, 0x0c, 0xee, 0x0d, 0x03, + 0x84, 0x8d, 0x03, 0x37, 0x09, 0x81, 0x5c, 0x14, 0x80, 0xb8, 0x08, 0x80, + 0xcb, 0x2a, 0x38, 0x03, 0x0a, 0x06, 0x38, 0x08, 0x46, 0x08, 0x0c, 0x06, + 0x74, 0x0b, 0x1e, 0x03, 0x5a, 0x04, 0x59, 0x09, 0x80, 0x83, 0x18, 0x1c, + 0x0a, 0x16, 0x09, 0x4c, 0x04, 0x80, 0x8a, 0x06, 0xab, 0xa4, 0x0c, 0x17, + 0x04, 0x31, 0xa1, 0x04, 0x81, 0xda, 0x26, 0x07, 0x0c, 0x05, 0x05, 0x80, + 0xa5, 0x11, 0x81, 0x6d, 0x10, 0x78, 0x28, 0x2a, 0x06, 0x4c, 0x04, 0x80, + 0x8d, 0x04, 0x80, 0xbe, 0x03, 0x1b, 0x03, 0x0f, 0x0d, + }; + static constexpr unsigned char normal1[] = { + 0x5e, 0x22, 0x7b, 0x05, 0x03, 0x04, 0x2d, 0x03, 0x66, 0x03, 0x01, 0x2f, + 0x2e, 0x80, 0x82, 0x1d, 0x03, 0x31, 0x0f, 0x1c, 0x04, 0x24, 0x09, 0x1e, + 0x05, 0x2b, 0x05, 0x44, 0x04, 0x0e, 0x2a, 0x80, 0xaa, 0x06, 0x24, 0x04, + 0x24, 0x04, 0x28, 0x08, 0x34, 0x0b, 0x01, 0x80, 0x90, 0x81, 0x37, 0x09, + 0x16, 0x0a, 0x08, 0x80, 0x98, 0x39, 0x03, 0x63, 0x08, 0x09, 0x30, 0x16, + 0x05, 0x21, 0x03, 0x1b, 0x05, 0x01, 0x40, 0x38, 0x04, 0x4b, 0x05, 0x2f, + 0x04, 0x0a, 0x07, 0x09, 0x07, 0x40, 0x20, 0x27, 0x04, 0x0c, 0x09, 0x36, + 0x03, 0x3a, 0x05, 0x1a, 0x07, 0x04, 0x0c, 0x07, 0x50, 0x49, 0x37, 0x33, + 0x0d, 0x33, 0x07, 0x2e, 0x08, 0x0a, 0x81, 0x26, 0x52, 0x4e, 0x28, 0x08, + 0x2a, 0x56, 0x1c, 0x14, 0x17, 0x09, 0x4e, 0x04, 0x1e, 0x0f, 0x43, 0x0e, + 0x19, 0x07, 0x0a, 0x06, 0x48, 0x08, 0x27, 0x09, 0x75, 0x0b, 0x3f, 0x41, + 0x2a, 0x06, 0x3b, 0x05, 0x0a, 0x06, 0x51, 0x06, 0x01, 0x05, 0x10, 0x03, + 0x05, 0x80, 0x8b, 0x62, 0x1e, 0x48, 0x08, 0x0a, 0x80, 0xa6, 0x5e, 0x22, + 0x45, 0x0b, 0x0a, 0x06, 0x0d, 0x13, 0x39, 0x07, 0x0a, 0x36, 0x2c, 0x04, + 0x10, 0x80, 0xc0, 0x3c, 0x64, 0x53, 0x0c, 0x48, 0x09, 0x0a, 0x46, 0x45, + 0x1b, 0x48, 0x08, 0x53, 0x1d, 0x39, 0x81, 0x07, 0x46, 0x0a, 0x1d, 0x03, + 0x47, 0x49, 0x37, 0x03, 0x0e, 0x08, 0x0a, 0x06, 0x39, 0x07, 0x0a, 0x81, + 0x36, 0x19, 0x80, 0xb7, 0x01, 0x0f, 0x32, 0x0d, 0x83, 0x9b, 0x66, 0x75, + 0x0b, 0x80, 0xc4, 0x8a, 0xbc, 0x84, 0x2f, 0x8f, 0xd1, 0x82, 0x47, 0xa1, + 0xb9, 0x82, 0x39, 0x07, 0x2a, 0x04, 0x02, 0x60, 0x26, 0x0a, 0x46, 0x0a, + 0x28, 0x05, 0x13, 0x82, 0xb0, 0x5b, 0x65, 0x4b, 0x04, 0x39, 0x07, 0x11, + 0x40, 0x05, 0x0b, 0x02, 0x0e, 0x97, 0xf8, 0x08, 0x84, 0xd6, 0x2a, 0x09, + 0xa2, 0xf7, 0x81, 0x1f, 0x31, 0x03, 0x11, 0x04, 0x08, 0x81, 0x8c, 0x89, + 0x04, 0x6b, 0x05, 0x0d, 0x03, 0x09, 0x07, 0x10, 0x93, 0x60, 0x80, 0xf6, + 0x0a, 0x73, 0x08, 0x6e, 0x17, 0x46, 0x80, 0x9a, 0x14, 0x0c, 0x57, 0x09, + 0x19, 0x80, 0x87, 0x81, 0x47, 0x03, 0x85, 0x42, 0x0f, 0x15, 0x85, 0x50, + 0x2b, 0x80, 0xd5, 0x2d, 0x03, 0x1a, 0x04, 0x02, 0x81, 0x70, 0x3a, 0x05, + 0x01, 0x85, 0x00, 0x80, 0xd7, 0x29, 0x4c, 0x04, 0x0a, 0x04, 0x02, 0x83, + 0x11, 0x44, 0x4c, 0x3d, 0x80, 0xc2, 0x3c, 0x06, 0x01, 0x04, 0x55, 0x05, + 0x1b, 0x34, 0x02, 0x81, 0x0e, 0x2c, 0x04, 0x64, 0x0c, 0x56, 0x0a, 0x80, + 0xae, 0x38, 0x1d, 0x0d, 0x2c, 0x04, 0x09, 0x07, 0x02, 0x0e, 0x06, 0x80, + 0x9a, 0x83, 0xd8, 0x08, 0x0d, 0x03, 0x0d, 0x03, 0x74, 0x0c, 0x59, 0x07, + 0x0c, 0x14, 0x0c, 0x04, 0x38, 0x08, 0x0a, 0x06, 0x28, 0x08, 0x22, 0x4e, + 0x81, 0x54, 0x0c, 0x15, 0x03, 0x03, 0x05, 0x07, 0x09, 0x19, 0x07, 0x07, + 0x09, 0x03, 0x0d, 0x07, 0x29, 0x80, 0xcb, 0x25, 0x0a, 0x84, 0x06, + }; + auto lower = static_cast(cp); + if (cp < 0x10000) { + return is_printable(lower, singletons0, + sizeof(singletons0) / sizeof(*singletons0), + singletons0_lower, normal0, sizeof(normal0)); + } + if (cp < 0x20000) { + return is_printable(lower, singletons1, + sizeof(singletons1) / sizeof(*singletons1), + singletons1_lower, normal1, sizeof(normal1)); + } + if (0x2a6de <= cp && cp < 0x2a700) return false; + if (0x2b735 <= cp && cp < 0x2b740) return false; + if (0x2b81e <= cp && cp < 0x2b820) return false; + if (0x2cea2 <= cp && cp < 0x2ceb0) return false; + if (0x2ebe1 <= cp && cp < 0x2f800) return false; + if (0x2fa1e <= cp && cp < 0x30000) return false; + if (0x3134b <= cp && cp < 0xe0100) return false; + if (0xe01f0 <= cp && cp < 0x110000) return false; + return cp < 0x110000; +} + +} // namespace detail + +FMT_END_NAMESPACE + +#endif // FMT_FORMAT_INL_H_ diff --git a/Include/fmt/include/fmt/format.h b/Include/fmt/include/fmt/format.h new file mode 100644 index 000000000..7c607dbd3 --- /dev/null +++ b/Include/fmt/include/fmt/format.h @@ -0,0 +1,4217 @@ +/* + Formatting library for C++ + + Copyright (c) 2012 - present, Victor Zverovich + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + --- Optional exception to the license --- + + As an exception, if, as a result of your compiling your source code, portions + of this Software are embedded into a machine-executable object form of such + source code, you may redistribute such embedded portions in such object form + without including the above copyright and permission notices. + */ + +#ifndef FMT_FORMAT_H_ +#define FMT_FORMAT_H_ + +#include // std::signbit +#include // uint32_t +#include // std::memcpy +#include // std::numeric_limits +#include // std::uninitialized_copy +#include // std::runtime_error +#include // std::system_error + +#ifdef __cpp_lib_bit_cast +# include // std::bitcast +#endif + +#include "core.h" + +#if FMT_GCC_VERSION +# define FMT_GCC_VISIBILITY_HIDDEN __attribute__((visibility("hidden"))) +#else +# define FMT_GCC_VISIBILITY_HIDDEN +#endif + +#ifdef __NVCC__ +# define FMT_CUDA_VERSION (__CUDACC_VER_MAJOR__ * 100 + __CUDACC_VER_MINOR__) +#else +# define FMT_CUDA_VERSION 0 +#endif + +#ifdef __has_builtin +# define FMT_HAS_BUILTIN(x) __has_builtin(x) +#else +# define FMT_HAS_BUILTIN(x) 0 +#endif + +#if FMT_GCC_VERSION || FMT_CLANG_VERSION +# define FMT_NOINLINE __attribute__((noinline)) +#else +# define FMT_NOINLINE +#endif + +#if FMT_MSC_VERSION +# define FMT_MSC_DEFAULT = default +#else +# define FMT_MSC_DEFAULT +#endif + +#ifndef FMT_THROW +# if FMT_EXCEPTIONS +# if FMT_MSC_VERSION || defined(__NVCC__) +FMT_BEGIN_NAMESPACE +namespace detail { +template inline void do_throw(const Exception& x) { + // Silence unreachable code warnings in MSVC and NVCC because these + // are nearly impossible to fix in a generic code. + volatile bool b = true; + if (b) throw x; +} +} // namespace detail +FMT_END_NAMESPACE +# define FMT_THROW(x) detail::do_throw(x) +# else +# define FMT_THROW(x) throw x +# endif +# else +# define FMT_THROW(x) \ + do { \ + FMT_ASSERT(false, (x).what()); \ + } while (false) +# endif +#endif + +#if FMT_EXCEPTIONS +# define FMT_TRY try +# define FMT_CATCH(x) catch (x) +#else +# define FMT_TRY if (true) +# define FMT_CATCH(x) if (false) +#endif + +#ifndef FMT_MAYBE_UNUSED +# if FMT_HAS_CPP17_ATTRIBUTE(maybe_unused) +# define FMT_MAYBE_UNUSED [[maybe_unused]] +# else +# define FMT_MAYBE_UNUSED +# endif +#endif + +#ifndef FMT_USE_USER_DEFINED_LITERALS +// EDG based compilers (Intel, NVIDIA, Elbrus, etc), GCC and MSVC support UDLs. +# if (FMT_HAS_FEATURE(cxx_user_literals) || FMT_GCC_VERSION >= 407 || \ + FMT_MSC_VERSION >= 1900) && \ + (!defined(__EDG_VERSION__) || __EDG_VERSION__ >= /* UDL feature */ 480) +# define FMT_USE_USER_DEFINED_LITERALS 1 +# else +# define FMT_USE_USER_DEFINED_LITERALS 0 +# endif +#endif + +// Defining FMT_REDUCE_INT_INSTANTIATIONS to 1, will reduce the number of +// integer formatter template instantiations to just one by only using the +// largest integer type. This results in a reduction in binary size but will +// cause a decrease in integer formatting performance. +#if !defined(FMT_REDUCE_INT_INSTANTIATIONS) +# define FMT_REDUCE_INT_INSTANTIATIONS 0 +#endif + +// __builtin_clz is broken in clang with Microsoft CodeGen: +// https://github.com/fmtlib/fmt/issues/519. +#if !FMT_MSC_VERSION +# if FMT_HAS_BUILTIN(__builtin_clz) || FMT_GCC_VERSION || FMT_ICC_VERSION +# define FMT_BUILTIN_CLZ(n) __builtin_clz(n) +# endif +# if FMT_HAS_BUILTIN(__builtin_clzll) || FMT_GCC_VERSION || FMT_ICC_VERSION +# define FMT_BUILTIN_CLZLL(n) __builtin_clzll(n) +# endif +#endif + +// __builtin_ctz is broken in Intel Compiler Classic on Windows: +// https://github.com/fmtlib/fmt/issues/2510. +#ifndef __ICL +# if FMT_HAS_BUILTIN(__builtin_ctz) || FMT_GCC_VERSION || FMT_ICC_VERSION || \ + defined(__NVCOMPILER) +# define FMT_BUILTIN_CTZ(n) __builtin_ctz(n) +# endif +# if FMT_HAS_BUILTIN(__builtin_ctzll) || FMT_GCC_VERSION || \ + FMT_ICC_VERSION || defined(__NVCOMPILER) +# define FMT_BUILTIN_CTZLL(n) __builtin_ctzll(n) +# endif +#endif + +#if FMT_MSC_VERSION +# include // _BitScanReverse[64], _BitScanForward[64], _umul128 +#endif + +// Some compilers masquerade as both MSVC and GCC-likes or otherwise support +// __builtin_clz and __builtin_clzll, so only define FMT_BUILTIN_CLZ using the +// MSVC intrinsics if the clz and clzll builtins are not available. +#if FMT_MSC_VERSION && !defined(FMT_BUILTIN_CLZLL) && \ + !defined(FMT_BUILTIN_CTZLL) +FMT_BEGIN_NAMESPACE +namespace detail { +// Avoid Clang with Microsoft CodeGen's -Wunknown-pragmas warning. +# if !defined(__clang__) +# pragma intrinsic(_BitScanForward) +# pragma intrinsic(_BitScanReverse) +# if defined(_WIN64) +# pragma intrinsic(_BitScanForward64) +# pragma intrinsic(_BitScanReverse64) +# endif +# endif + +inline auto clz(uint32_t x) -> int { + unsigned long r = 0; + _BitScanReverse(&r, x); + FMT_ASSERT(x != 0, ""); + // Static analysis complains about using uninitialized data + // "r", but the only way that can happen is if "x" is 0, + // which the callers guarantee to not happen. + FMT_MSC_WARNING(suppress : 6102) + return 31 ^ static_cast(r); +} +# define FMT_BUILTIN_CLZ(n) detail::clz(n) + +inline auto clzll(uint64_t x) -> int { + unsigned long r = 0; +# ifdef _WIN64 + _BitScanReverse64(&r, x); +# else + // Scan the high 32 bits. + if (_BitScanReverse(&r, static_cast(x >> 32))) return 63 ^ (r + 32); + // Scan the low 32 bits. + _BitScanReverse(&r, static_cast(x)); +# endif + FMT_ASSERT(x != 0, ""); + FMT_MSC_WARNING(suppress : 6102) // Suppress a bogus static analysis warning. + return 63 ^ static_cast(r); +} +# define FMT_BUILTIN_CLZLL(n) detail::clzll(n) + +inline auto ctz(uint32_t x) -> int { + unsigned long r = 0; + _BitScanForward(&r, x); + FMT_ASSERT(x != 0, ""); + FMT_MSC_WARNING(suppress : 6102) // Suppress a bogus static analysis warning. + return static_cast(r); +} +# define FMT_BUILTIN_CTZ(n) detail::ctz(n) + +inline auto ctzll(uint64_t x) -> int { + unsigned long r = 0; + FMT_ASSERT(x != 0, ""); + FMT_MSC_WARNING(suppress : 6102) // Suppress a bogus static analysis warning. +# ifdef _WIN64 + _BitScanForward64(&r, x); +# else + // Scan the low 32 bits. + if (_BitScanForward(&r, static_cast(x))) return static_cast(r); + // Scan the high 32 bits. + _BitScanForward(&r, static_cast(x >> 32)); + r += 32; +# endif + return static_cast(r); +} +# define FMT_BUILTIN_CTZLL(n) detail::ctzll(n) +} // namespace detail +FMT_END_NAMESPACE +#endif + +FMT_BEGIN_NAMESPACE +namespace detail { + +FMT_CONSTEXPR inline void abort_fuzzing_if(bool condition) { + ignore_unused(condition); +#ifdef FMT_FUZZ + if (condition) throw std::runtime_error("fuzzing limit reached"); +#endif +} + +template struct string_literal { + static constexpr CharT value[sizeof...(C)] = {C...}; + constexpr operator basic_string_view() const { + return {value, sizeof...(C)}; + } +}; + +#if FMT_CPLUSPLUS < 201703L +template +constexpr CharT string_literal::value[sizeof...(C)]; +#endif + +template class formatbuf : public Streambuf { + private: + using char_type = typename Streambuf::char_type; + using streamsize = decltype(std::declval().sputn(nullptr, 0)); + using int_type = typename Streambuf::int_type; + using traits_type = typename Streambuf::traits_type; + + buffer& buffer_; + + public: + explicit formatbuf(buffer& buf) : buffer_(buf) {} + + protected: + // The put area is always empty. This makes the implementation simpler and has + // the advantage that the streambuf and the buffer are always in sync and + // sputc never writes into uninitialized memory. A disadvantage is that each + // call to sputc always results in a (virtual) call to overflow. There is no + // disadvantage here for sputn since this always results in a call to xsputn. + + auto overflow(int_type ch) -> int_type override { + if (!traits_type::eq_int_type(ch, traits_type::eof())) + buffer_.push_back(static_cast(ch)); + return ch; + } + + auto xsputn(const char_type* s, streamsize count) -> streamsize override { + buffer_.append(s, s + count); + return count; + } +}; + +// Implementation of std::bit_cast for pre-C++20. +template +FMT_CONSTEXPR20 auto bit_cast(const From& from) -> To { +#ifdef __cpp_lib_bit_cast + if (is_constant_evaluated()) return std::bit_cast(from); +#endif + auto to = To(); + // The cast suppresses a bogus -Wclass-memaccess on GCC. + std::memcpy(static_cast(&to), &from, sizeof(to)); + return to; +} + +inline auto is_big_endian() -> bool { +#ifdef _WIN32 + return false; +#elif defined(__BIG_ENDIAN__) + return true; +#elif defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) + return __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__; +#else + struct bytes { + char data[sizeof(int)]; + }; + return bit_cast(1).data[0] == 0; +#endif +} + +class uint128_fallback { + private: + uint64_t lo_, hi_; + + friend uint128_fallback umul128(uint64_t x, uint64_t y) noexcept; + + public: + constexpr uint128_fallback(uint64_t hi, uint64_t lo) : lo_(lo), hi_(hi) {} + constexpr uint128_fallback(uint64_t value = 0) : lo_(value), hi_(0) {} + + constexpr uint64_t high() const noexcept { return hi_; } + constexpr uint64_t low() const noexcept { return lo_; } + + template ::value)> + constexpr explicit operator T() const { + return static_cast(lo_); + } + + friend constexpr auto operator==(const uint128_fallback& lhs, + const uint128_fallback& rhs) -> bool { + return lhs.hi_ == rhs.hi_ && lhs.lo_ == rhs.lo_; + } + friend constexpr auto operator!=(const uint128_fallback& lhs, + const uint128_fallback& rhs) -> bool { + return !(lhs == rhs); + } + friend constexpr auto operator>(const uint128_fallback& lhs, + const uint128_fallback& rhs) -> bool { + return lhs.hi_ != rhs.hi_ ? lhs.hi_ > rhs.hi_ : lhs.lo_ > rhs.lo_; + } + friend constexpr auto operator|(const uint128_fallback& lhs, + const uint128_fallback& rhs) + -> uint128_fallback { + return {lhs.hi_ | rhs.hi_, lhs.lo_ | rhs.lo_}; + } + friend constexpr auto operator&(const uint128_fallback& lhs, + const uint128_fallback& rhs) + -> uint128_fallback { + return {lhs.hi_ & rhs.hi_, lhs.lo_ & rhs.lo_}; + } + friend auto operator+(const uint128_fallback& lhs, + const uint128_fallback& rhs) -> uint128_fallback { + auto result = uint128_fallback(lhs); + result += rhs; + return result; + } + friend auto operator*(const uint128_fallback& lhs, uint32_t rhs) + -> uint128_fallback { + FMT_ASSERT(lhs.hi_ == 0, ""); + uint64_t hi = (lhs.lo_ >> 32) * rhs; + uint64_t lo = (lhs.lo_ & ~uint32_t()) * rhs; + uint64_t new_lo = (hi << 32) + lo; + return {(hi >> 32) + (new_lo < lo ? 1 : 0), new_lo}; + } + friend auto operator-(const uint128_fallback& lhs, uint64_t rhs) + -> uint128_fallback { + return {lhs.hi_ - (lhs.lo_ < rhs ? 1 : 0), lhs.lo_ - rhs}; + } + FMT_CONSTEXPR auto operator>>(int shift) const -> uint128_fallback { + if (shift == 64) return {0, hi_}; + if (shift > 64) return uint128_fallback(0, hi_) >> (shift - 64); + return {hi_ >> shift, (hi_ << (64 - shift)) | (lo_ >> shift)}; + } + FMT_CONSTEXPR auto operator<<(int shift) const -> uint128_fallback { + if (shift == 64) return {lo_, 0}; + if (shift > 64) return uint128_fallback(lo_, 0) << (shift - 64); + return {hi_ << shift | (lo_ >> (64 - shift)), (lo_ << shift)}; + } + FMT_CONSTEXPR auto operator>>=(int shift) -> uint128_fallback& { + return *this = *this >> shift; + } + FMT_CONSTEXPR void operator+=(uint128_fallback n) { + uint64_t new_lo = lo_ + n.lo_; + uint64_t new_hi = hi_ + n.hi_ + (new_lo < lo_ ? 1 : 0); + FMT_ASSERT(new_hi >= hi_, ""); + lo_ = new_lo; + hi_ = new_hi; + } + + FMT_CONSTEXPR20 uint128_fallback& operator+=(uint64_t n) noexcept { + if (is_constant_evaluated()) { + lo_ += n; + hi_ += (lo_ < n ? 1 : 0); + return *this; + } +#if FMT_HAS_BUILTIN(__builtin_addcll) && !defined(__ibmxl__) + unsigned long long carry; + lo_ = __builtin_addcll(lo_, n, 0, &carry); + hi_ += carry; +#elif FMT_HAS_BUILTIN(__builtin_ia32_addcarryx_u64) && !defined(__ibmxl__) + unsigned long long result; + auto carry = __builtin_ia32_addcarryx_u64(0, lo_, n, &result); + lo_ = result; + hi_ += carry; +#elif defined(_MSC_VER) && defined(_M_X64) + auto carry = _addcarry_u64(0, lo_, n, &lo_); + _addcarry_u64(carry, hi_, 0, &hi_); +#else + lo_ += n; + hi_ += (lo_ < n ? 1 : 0); +#endif + return *this; + } +}; + +using uint128_t = conditional_t; + +#ifdef UINTPTR_MAX +using uintptr_t = ::uintptr_t; +#else +using uintptr_t = uint128_t; +#endif + +// Returns the largest possible value for type T. Same as +// std::numeric_limits::max() but shorter and not affected by the max macro. +template constexpr auto max_value() -> T { + return (std::numeric_limits::max)(); +} +template constexpr auto num_bits() -> int { + return std::numeric_limits::digits; +} +// std::numeric_limits::digits may return 0 for 128-bit ints. +template <> constexpr auto num_bits() -> int { return 128; } +template <> constexpr auto num_bits() -> int { return 128; } + +// A heterogeneous bit_cast used for converting 96-bit long double to uint128_t +// and 128-bit pointers to uint128_fallback. +template sizeof(From))> +inline auto bit_cast(const From& from) -> To { + constexpr auto size = static_cast(sizeof(From) / sizeof(unsigned)); + struct data_t { + unsigned value[static_cast(size)]; + } data = bit_cast(from); + auto result = To(); + if (const_check(is_big_endian())) { + for (int i = 0; i < size; ++i) + result = (result << num_bits()) | data.value[i]; + } else { + for (int i = size - 1; i >= 0; --i) + result = (result << num_bits()) | data.value[i]; + } + return result; +} + +FMT_INLINE void assume(bool condition) { + (void)condition; +#if FMT_HAS_BUILTIN(__builtin_assume) && !FMT_ICC_VERSION + __builtin_assume(condition); +#endif +} + +// An approximation of iterator_t for pre-C++20 systems. +template +using iterator_t = decltype(std::begin(std::declval())); +template using sentinel_t = decltype(std::end(std::declval())); + +// A workaround for std::string not having mutable data() until C++17. +template +inline auto get_data(std::basic_string& s) -> Char* { + return &s[0]; +} +template +inline auto get_data(Container& c) -> typename Container::value_type* { + return c.data(); +} + +#if defined(_SECURE_SCL) && _SECURE_SCL +// Make a checked iterator to avoid MSVC warnings. +template using checked_ptr = stdext::checked_array_iterator; +template +constexpr auto make_checked(T* p, size_t size) -> checked_ptr { + return {p, size}; +} +#else +template using checked_ptr = T*; +template constexpr auto make_checked(T* p, size_t) -> T* { + return p; +} +#endif + +// Attempts to reserve space for n extra characters in the output range. +// Returns a pointer to the reserved range or a reference to it. +template ::value)> +#if FMT_CLANG_VERSION >= 307 && !FMT_ICC_VERSION +__attribute__((no_sanitize("undefined"))) +#endif +inline auto +reserve(std::back_insert_iterator it, size_t n) + -> checked_ptr { + Container& c = get_container(it); + size_t size = c.size(); + c.resize(size + n); + return make_checked(get_data(c) + size, n); +} + +template +inline auto reserve(buffer_appender it, size_t n) -> buffer_appender { + buffer& buf = get_container(it); + buf.try_reserve(buf.size() + n); + return it; +} + +template +constexpr auto reserve(Iterator& it, size_t) -> Iterator& { + return it; +} + +template +using reserve_iterator = + remove_reference_t(), 0))>; + +template +constexpr auto to_pointer(OutputIt, size_t) -> T* { + return nullptr; +} +template auto to_pointer(buffer_appender it, size_t n) -> T* { + buffer& buf = get_container(it); + auto size = buf.size(); + if (buf.capacity() < size + n) return nullptr; + buf.try_resize(size + n); + return buf.data() + size; +} + +template ::value)> +inline auto base_iterator(std::back_insert_iterator& it, + checked_ptr) + -> std::back_insert_iterator { + return it; +} + +template +constexpr auto base_iterator(Iterator, Iterator it) -> Iterator { + return it; +} + +// is spectacularly slow to compile in C++20 so use a simple fill_n +// instead (#1998). +template +FMT_CONSTEXPR auto fill_n(OutputIt out, Size count, const T& value) + -> OutputIt { + for (Size i = 0; i < count; ++i) *out++ = value; + return out; +} +template +FMT_CONSTEXPR20 auto fill_n(T* out, Size count, char value) -> T* { + if (is_constant_evaluated()) { + return fill_n(out, count, value); + } + std::memset(out, value, to_unsigned(count)); + return out + count; +} + +#ifdef __cpp_char8_t +using char8_type = char8_t; +#else +enum char8_type : unsigned char {}; +#endif + +template +FMT_CONSTEXPR FMT_NOINLINE auto copy_str_noinline(InputIt begin, InputIt end, + OutputIt out) -> OutputIt { + return copy_str(begin, end, out); +} + +// A public domain branchless UTF-8 decoder by Christopher Wellons: +// https://github.com/skeeto/branchless-utf8 +/* Decode the next character, c, from s, reporting errors in e. + * + * Since this is a branchless decoder, four bytes will be read from the + * buffer regardless of the actual length of the next character. This + * means the buffer _must_ have at least three bytes of zero padding + * following the end of the data stream. + * + * Errors are reported in e, which will be non-zero if the parsed + * character was somehow invalid: invalid byte sequence, non-canonical + * encoding, or a surrogate half. + * + * The function returns a pointer to the next character. When an error + * occurs, this pointer will be a guess that depends on the particular + * error, but it will always advance at least one byte. + */ +FMT_CONSTEXPR inline auto utf8_decode(const char* s, uint32_t* c, int* e) + -> const char* { + constexpr const int masks[] = {0x00, 0x7f, 0x1f, 0x0f, 0x07}; + constexpr const uint32_t mins[] = {4194304, 0, 128, 2048, 65536}; + constexpr const int shiftc[] = {0, 18, 12, 6, 0}; + constexpr const int shifte[] = {0, 6, 4, 2, 0}; + + int len = code_point_length_impl(*s); + // Compute the pointer to the next character early so that the next + // iteration can start working on the next character. Neither Clang + // nor GCC figure out this reordering on their own. + const char* next = s + len + !len; + + using uchar = unsigned char; + + // Assume a four-byte character and load four bytes. Unused bits are + // shifted out. + *c = uint32_t(uchar(s[0]) & masks[len]) << 18; + *c |= uint32_t(uchar(s[1]) & 0x3f) << 12; + *c |= uint32_t(uchar(s[2]) & 0x3f) << 6; + *c |= uint32_t(uchar(s[3]) & 0x3f) << 0; + *c >>= shiftc[len]; + + // Accumulate the various error conditions. + *e = (*c < mins[len]) << 6; // non-canonical encoding + *e |= ((*c >> 11) == 0x1b) << 7; // surrogate half? + *e |= (*c > 0x10FFFF) << 8; // out of range? + *e |= (uchar(s[1]) & 0xc0) >> 2; + *e |= (uchar(s[2]) & 0xc0) >> 4; + *e |= uchar(s[3]) >> 6; + *e ^= 0x2a; // top two bits of each tail byte correct? + *e >>= shifte[len]; + + return next; +} + +constexpr uint32_t invalid_code_point = ~uint32_t(); + +// Invokes f(cp, sv) for every code point cp in s with sv being the string view +// corresponding to the code point. cp is invalid_code_point on error. +template +FMT_CONSTEXPR void for_each_codepoint(string_view s, F f) { + auto decode = [f](const char* buf_ptr, const char* ptr) { + auto cp = uint32_t(); + auto error = 0; + auto end = utf8_decode(buf_ptr, &cp, &error); + bool result = f(error ? invalid_code_point : cp, + string_view(ptr, error ? 1 : to_unsigned(end - buf_ptr))); + return result ? (error ? buf_ptr + 1 : end) : nullptr; + }; + auto p = s.data(); + const size_t block_size = 4; // utf8_decode always reads blocks of 4 chars. + if (s.size() >= block_size) { + for (auto end = p + s.size() - block_size + 1; p < end;) { + p = decode(p, p); + if (!p) return; + } + } + if (auto num_chars_left = s.data() + s.size() - p) { + char buf[2 * block_size - 1] = {}; + copy_str(p, p + num_chars_left, buf); + const char* buf_ptr = buf; + do { + auto end = decode(buf_ptr, p); + if (!end) return; + p += end - buf_ptr; + buf_ptr = end; + } while (buf_ptr - buf < num_chars_left); + } +} + +template +inline auto compute_width(basic_string_view s) -> size_t { + return s.size(); +} + +// Computes approximate display width of a UTF-8 string. +FMT_CONSTEXPR inline size_t compute_width(string_view s) { + size_t num_code_points = 0; + // It is not a lambda for compatibility with C++14. + struct count_code_points { + size_t* count; + FMT_CONSTEXPR auto operator()(uint32_t cp, string_view) const -> bool { + *count += detail::to_unsigned( + 1 + + (cp >= 0x1100 && + (cp <= 0x115f || // Hangul Jamo init. consonants + cp == 0x2329 || // LEFT-POINTING ANGLE BRACKET + cp == 0x232a || // RIGHT-POINTING ANGLE BRACKET + // CJK ... Yi except IDEOGRAPHIC HALF FILL SPACE: + (cp >= 0x2e80 && cp <= 0xa4cf && cp != 0x303f) || + (cp >= 0xac00 && cp <= 0xd7a3) || // Hangul Syllables + (cp >= 0xf900 && cp <= 0xfaff) || // CJK Compatibility Ideographs + (cp >= 0xfe10 && cp <= 0xfe19) || // Vertical Forms + (cp >= 0xfe30 && cp <= 0xfe6f) || // CJK Compatibility Forms + (cp >= 0xff00 && cp <= 0xff60) || // Fullwidth Forms + (cp >= 0xffe0 && cp <= 0xffe6) || // Fullwidth Forms + (cp >= 0x20000 && cp <= 0x2fffd) || // CJK + (cp >= 0x30000 && cp <= 0x3fffd) || + // Miscellaneous Symbols and Pictographs + Emoticons: + (cp >= 0x1f300 && cp <= 0x1f64f) || + // Supplemental Symbols and Pictographs: + (cp >= 0x1f900 && cp <= 0x1f9ff)))); + return true; + } + }; + for_each_codepoint(s, count_code_points{&num_code_points}); + return num_code_points; +} + +inline auto compute_width(basic_string_view s) -> size_t { + return compute_width( + string_view(reinterpret_cast(s.data()), s.size())); +} + +template +inline auto code_point_index(basic_string_view s, size_t n) -> size_t { + size_t size = s.size(); + return n < size ? n : size; +} + +// Calculates the index of the nth code point in a UTF-8 string. +inline auto code_point_index(string_view s, size_t n) -> size_t { + const char* data = s.data(); + size_t num_code_points = 0; + for (size_t i = 0, size = s.size(); i != size; ++i) { + if ((data[i] & 0xc0) != 0x80 && ++num_code_points > n) return i; + } + return s.size(); +} + +inline auto code_point_index(basic_string_view s, size_t n) + -> size_t { + return code_point_index( + string_view(reinterpret_cast(s.data()), s.size()), n); +} + +#ifndef FMT_USE_FLOAT128 +# ifdef __SIZEOF_FLOAT128__ +# define FMT_USE_FLOAT128 1 +# else +# define FMT_USE_FLOAT128 0 +# endif +#endif +#if FMT_USE_FLOAT128 +using float128 = __float128; +#else +using float128 = void; +#endif +template using is_float128 = std::is_same; + +template +using is_floating_point = + bool_constant::value || is_float128::value>; + +template ::value> +struct is_fast_float : bool_constant::is_iec559 && + sizeof(T) <= sizeof(double)> {}; +template struct is_fast_float : std::false_type {}; + +template +using is_double_double = bool_constant::digits == 106>; + +#ifndef FMT_USE_FULL_CACHE_DRAGONBOX +# define FMT_USE_FULL_CACHE_DRAGONBOX 0 +#endif + +template +template +void buffer::append(const U* begin, const U* end) { + while (begin != end) { + auto count = to_unsigned(end - begin); + try_reserve(size_ + count); + auto free_cap = capacity_ - size_; + if (free_cap < count) count = free_cap; + std::uninitialized_copy_n(begin, count, make_checked(ptr_ + size_, count)); + size_ += count; + begin += count; + } +} + +template +struct is_locale : std::false_type {}; +template +struct is_locale> : std::true_type {}; +} // namespace detail + +FMT_MODULE_EXPORT_BEGIN + +// The number of characters to store in the basic_memory_buffer object itself +// to avoid dynamic memory allocation. +enum { inline_buffer_size = 500 }; + +/** + \rst + A dynamically growing memory buffer for trivially copyable/constructible types + with the first ``SIZE`` elements stored in the object itself. + + You can use the ``memory_buffer`` type alias for ``char`` instead. + + **Example**:: + + auto out = fmt::memory_buffer(); + format_to(std::back_inserter(out), "The answer is {}.", 42); + + This will append the following output to the ``out`` object: + + .. code-block:: none + + The answer is 42. + + The output can be converted to an ``std::string`` with ``to_string(out)``. + \endrst + */ +template > +class basic_memory_buffer final : public detail::buffer { + private: + T store_[SIZE]; + + // Don't inherit from Allocator avoid generating type_info for it. + Allocator alloc_; + + // Deallocate memory allocated by the buffer. + FMT_CONSTEXPR20 void deallocate() { + T* data = this->data(); + if (data != store_) alloc_.deallocate(data, this->capacity()); + } + + protected: + FMT_CONSTEXPR20 void grow(size_t size) override; + + public: + using value_type = T; + using const_reference = const T&; + + FMT_CONSTEXPR20 explicit basic_memory_buffer( + const Allocator& alloc = Allocator()) + : alloc_(alloc) { + this->set(store_, SIZE); + if (detail::is_constant_evaluated()) detail::fill_n(store_, SIZE, T()); + } + FMT_CONSTEXPR20 ~basic_memory_buffer() { deallocate(); } + + private: + // Move data from other to this buffer. + FMT_CONSTEXPR20 void move(basic_memory_buffer& other) { + alloc_ = std::move(other.alloc_); + T* data = other.data(); + size_t size = other.size(), capacity = other.capacity(); + if (data == other.store_) { + this->set(store_, capacity); + detail::copy_str(other.store_, other.store_ + size, + detail::make_checked(store_, capacity)); + } else { + this->set(data, capacity); + // Set pointer to the inline array so that delete is not called + // when deallocating. + other.set(other.store_, 0); + other.clear(); + } + this->resize(size); + } + + public: + /** + \rst + Constructs a :class:`fmt::basic_memory_buffer` object moving the content + of the other object to it. + \endrst + */ + FMT_CONSTEXPR20 basic_memory_buffer(basic_memory_buffer&& other) noexcept { + move(other); + } + + /** + \rst + Moves the content of the other ``basic_memory_buffer`` object to this one. + \endrst + */ + auto operator=(basic_memory_buffer&& other) noexcept -> basic_memory_buffer& { + FMT_ASSERT(this != &other, ""); + deallocate(); + move(other); + return *this; + } + + // Returns a copy of the allocator associated with this buffer. + auto get_allocator() const -> Allocator { return alloc_; } + + /** + Resizes the buffer to contain *count* elements. If T is a POD type new + elements may not be initialized. + */ + FMT_CONSTEXPR20 void resize(size_t count) { this->try_resize(count); } + + /** Increases the buffer capacity to *new_capacity*. */ + void reserve(size_t new_capacity) { this->try_reserve(new_capacity); } + + // Directly append data into the buffer + using detail::buffer::append; + template + void append(const ContiguousRange& range) { + append(range.data(), range.data() + range.size()); + } +}; + +template +FMT_CONSTEXPR20 void basic_memory_buffer::grow( + size_t size) { + detail::abort_fuzzing_if(size > 5000); + const size_t max_size = std::allocator_traits::max_size(alloc_); + size_t old_capacity = this->capacity(); + size_t new_capacity = old_capacity + old_capacity / 2; + if (size > new_capacity) + new_capacity = size; + else if (new_capacity > max_size) + new_capacity = size > max_size ? size : max_size; + T* old_data = this->data(); + T* new_data = + std::allocator_traits::allocate(alloc_, new_capacity); + // The following code doesn't throw, so the raw pointer above doesn't leak. + std::uninitialized_copy(old_data, old_data + this->size(), + detail::make_checked(new_data, new_capacity)); + this->set(new_data, new_capacity); + // deallocate must not throw according to the standard, but even if it does, + // the buffer already uses the new storage and will deallocate it in + // destructor. + if (old_data != store_) alloc_.deallocate(old_data, old_capacity); +} + +using memory_buffer = basic_memory_buffer; + +template +struct is_contiguous> : std::true_type { +}; + +namespace detail { +#ifdef _WIN32 +FMT_API bool write_console(std::FILE* f, string_view text); +#endif +FMT_API void print(std::FILE*, string_view); +} // namespace detail + +/** A formatting error such as invalid format string. */ +FMT_CLASS_API +class FMT_API format_error : public std::runtime_error { + public: + explicit format_error(const char* message) : std::runtime_error(message) {} + explicit format_error(const std::string& message) + : std::runtime_error(message) {} + format_error(const format_error&) = default; + format_error& operator=(const format_error&) = default; + format_error(format_error&&) = default; + format_error& operator=(format_error&&) = default; + ~format_error() noexcept override FMT_MSC_DEFAULT; +}; + +namespace detail_exported { +#if FMT_USE_NONTYPE_TEMPLATE_ARGS +template struct fixed_string { + constexpr fixed_string(const Char (&str)[N]) { + detail::copy_str(static_cast(str), + str + N, data); + } + Char data[N] = {}; +}; +#endif + +// Converts a compile-time string to basic_string_view. +template +constexpr auto compile_string_to_view(const Char (&s)[N]) + -> basic_string_view { + // Remove trailing NUL character if needed. Won't be present if this is used + // with a raw character array (i.e. not defined as a string). + return {s, N - (std::char_traits::to_int_type(s[N - 1]) == 0 ? 1 : 0)}; +} +template +constexpr auto compile_string_to_view(detail::std_string_view s) + -> basic_string_view { + return {s.data(), s.size()}; +} +} // namespace detail_exported + +FMT_BEGIN_DETAIL_NAMESPACE + +template struct is_integral : std::is_integral {}; +template <> struct is_integral : std::true_type {}; +template <> struct is_integral : std::true_type {}; + +template +using is_signed = + std::integral_constant::is_signed || + std::is_same::value>; + +// Returns true if value is negative, false otherwise. +// Same as `value < 0` but doesn't produce warnings if T is an unsigned type. +template ::value)> +constexpr auto is_negative(T value) -> bool { + return value < 0; +} +template ::value)> +constexpr auto is_negative(T) -> bool { + return false; +} + +template +FMT_CONSTEXPR auto is_supported_floating_point(T) -> bool { + if (std::is_same()) return FMT_USE_FLOAT; + if (std::is_same()) return FMT_USE_DOUBLE; + if (std::is_same()) return FMT_USE_LONG_DOUBLE; + return true; +} + +// Smallest of uint32_t, uint64_t, uint128_t that is large enough to +// represent all values of an integral type T. +template +using uint32_or_64_or_128_t = + conditional_t() <= 32 && !FMT_REDUCE_INT_INSTANTIATIONS, + uint32_t, + conditional_t() <= 64, uint64_t, uint128_t>>; +template +using uint64_or_128_t = conditional_t() <= 64, uint64_t, uint128_t>; + +#define FMT_POWERS_OF_10(factor) \ + factor * 10, (factor)*100, (factor)*1000, (factor)*10000, (factor)*100000, \ + (factor)*1000000, (factor)*10000000, (factor)*100000000, \ + (factor)*1000000000 + +// Converts value in the range [0, 100) to a string. +constexpr const char* digits2(size_t value) { + // GCC generates slightly better code when value is pointer-size. + return &"0001020304050607080910111213141516171819" + "2021222324252627282930313233343536373839" + "4041424344454647484950515253545556575859" + "6061626364656667686970717273747576777879" + "8081828384858687888990919293949596979899"[value * 2]; +} + +// Sign is a template parameter to workaround a bug in gcc 4.8. +template constexpr Char sign(Sign s) { +#if !FMT_GCC_VERSION || FMT_GCC_VERSION >= 604 + static_assert(std::is_same::value, ""); +#endif + return static_cast("\0-+ "[s]); +} + +template FMT_CONSTEXPR auto count_digits_fallback(T n) -> int { + int count = 1; + for (;;) { + // Integer division is slow so do it for a group of four digits instead + // of for every digit. The idea comes from the talk by Alexandrescu + // "Three Optimization Tips for C++". See speed-test for a comparison. + if (n < 10) return count; + if (n < 100) return count + 1; + if (n < 1000) return count + 2; + if (n < 10000) return count + 3; + n /= 10000u; + count += 4; + } +} +#if FMT_USE_INT128 +FMT_CONSTEXPR inline auto count_digits(uint128_opt n) -> int { + return count_digits_fallback(n); +} +#endif + +#ifdef FMT_BUILTIN_CLZLL +// It is a separate function rather than a part of count_digits to workaround +// the lack of static constexpr in constexpr functions. +inline auto do_count_digits(uint64_t n) -> int { + // This has comparable performance to the version by Kendall Willets + // (https://github.com/fmtlib/format-benchmark/blob/master/digits10) + // but uses smaller tables. + // Maps bsr(n) to ceil(log10(pow(2, bsr(n) + 1) - 1)). + static constexpr uint8_t bsr2log10[] = { + 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, + 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, + 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 15, 15, + 15, 16, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 19, 20}; + auto t = bsr2log10[FMT_BUILTIN_CLZLL(n | 1) ^ 63]; + static constexpr const uint64_t zero_or_powers_of_10[] = { + 0, 0, FMT_POWERS_OF_10(1U), FMT_POWERS_OF_10(1000000000ULL), + 10000000000000000000ULL}; + return t - (n < zero_or_powers_of_10[t]); +} +#endif + +// Returns the number of decimal digits in n. Leading zeros are not counted +// except for n == 0 in which case count_digits returns 1. +FMT_CONSTEXPR20 inline auto count_digits(uint64_t n) -> int { +#ifdef FMT_BUILTIN_CLZLL + if (!is_constant_evaluated()) { + return do_count_digits(n); + } +#endif + return count_digits_fallback(n); +} + +// Counts the number of digits in n. BITS = log2(radix). +template +FMT_CONSTEXPR auto count_digits(UInt n) -> int { +#ifdef FMT_BUILTIN_CLZ + if (!is_constant_evaluated() && num_bits() == 32) + return (FMT_BUILTIN_CLZ(static_cast(n) | 1) ^ 31) / BITS + 1; +#endif + // Lambda avoids unreachable code warnings from NVHPC. + return [](UInt m) { + int num_digits = 0; + do { + ++num_digits; + } while ((m >>= BITS) != 0); + return num_digits; + }(n); +} + +#ifdef FMT_BUILTIN_CLZ +// It is a separate function rather than a part of count_digits to workaround +// the lack of static constexpr in constexpr functions. +FMT_INLINE auto do_count_digits(uint32_t n) -> int { +// An optimization by Kendall Willets from https://bit.ly/3uOIQrB. +// This increments the upper 32 bits (log10(T) - 1) when >= T is added. +# define FMT_INC(T) (((sizeof(# T) - 1ull) << 32) - T) + static constexpr uint64_t table[] = { + FMT_INC(0), FMT_INC(0), FMT_INC(0), // 8 + FMT_INC(10), FMT_INC(10), FMT_INC(10), // 64 + FMT_INC(100), FMT_INC(100), FMT_INC(100), // 512 + FMT_INC(1000), FMT_INC(1000), FMT_INC(1000), // 4096 + FMT_INC(10000), FMT_INC(10000), FMT_INC(10000), // 32k + FMT_INC(100000), FMT_INC(100000), FMT_INC(100000), // 256k + FMT_INC(1000000), FMT_INC(1000000), FMT_INC(1000000), // 2048k + FMT_INC(10000000), FMT_INC(10000000), FMT_INC(10000000), // 16M + FMT_INC(100000000), FMT_INC(100000000), FMT_INC(100000000), // 128M + FMT_INC(1000000000), FMT_INC(1000000000), FMT_INC(1000000000), // 1024M + FMT_INC(1000000000), FMT_INC(1000000000) // 4B + }; + auto inc = table[FMT_BUILTIN_CLZ(n | 1) ^ 31]; + return static_cast((n + inc) >> 32); +} +#endif + +// Optional version of count_digits for better performance on 32-bit platforms. +FMT_CONSTEXPR20 inline auto count_digits(uint32_t n) -> int { +#ifdef FMT_BUILTIN_CLZ + if (!is_constant_evaluated()) { + return do_count_digits(n); + } +#endif + return count_digits_fallback(n); +} + +template constexpr auto digits10() noexcept -> int { + return std::numeric_limits::digits10; +} +template <> constexpr auto digits10() noexcept -> int { return 38; } +template <> constexpr auto digits10() noexcept -> int { return 38; } + +template struct thousands_sep_result { + std::string grouping; + Char thousands_sep; +}; + +template +FMT_API auto thousands_sep_impl(locale_ref loc) -> thousands_sep_result; +template +inline auto thousands_sep(locale_ref loc) -> thousands_sep_result { + auto result = thousands_sep_impl(loc); + return {result.grouping, Char(result.thousands_sep)}; +} +template <> +inline auto thousands_sep(locale_ref loc) -> thousands_sep_result { + return thousands_sep_impl(loc); +} + +template +FMT_API auto decimal_point_impl(locale_ref loc) -> Char; +template inline auto decimal_point(locale_ref loc) -> Char { + return Char(decimal_point_impl(loc)); +} +template <> inline auto decimal_point(locale_ref loc) -> wchar_t { + return decimal_point_impl(loc); +} + +// Compares two characters for equality. +template auto equal2(const Char* lhs, const char* rhs) -> bool { + return lhs[0] == Char(rhs[0]) && lhs[1] == Char(rhs[1]); +} +inline auto equal2(const char* lhs, const char* rhs) -> bool { + return memcmp(lhs, rhs, 2) == 0; +} + +// Copies two characters from src to dst. +template +FMT_CONSTEXPR20 FMT_INLINE void copy2(Char* dst, const char* src) { + if (!is_constant_evaluated() && sizeof(Char) == sizeof(char)) { + memcpy(dst, src, 2); + return; + } + *dst++ = static_cast(*src++); + *dst = static_cast(*src); +} + +template struct format_decimal_result { + Iterator begin; + Iterator end; +}; + +// Formats a decimal unsigned integer value writing into out pointing to a +// buffer of specified size. The caller must ensure that the buffer is large +// enough. +template +FMT_CONSTEXPR20 auto format_decimal(Char* out, UInt value, int size) + -> format_decimal_result { + FMT_ASSERT(size >= count_digits(value), "invalid digit count"); + out += size; + Char* end = out; + while (value >= 100) { + // Integer division is slow so do it for a group of two digits instead + // of for every digit. The idea comes from the talk by Alexandrescu + // "Three Optimization Tips for C++". See speed-test for a comparison. + out -= 2; + copy2(out, digits2(static_cast(value % 100))); + value /= 100; + } + if (value < 10) { + *--out = static_cast('0' + value); + return {out, end}; + } + out -= 2; + copy2(out, digits2(static_cast(value))); + return {out, end}; +} + +template >::value)> +FMT_CONSTEXPR inline auto format_decimal(Iterator out, UInt value, int size) + -> format_decimal_result { + // Buffer is large enough to hold all digits (digits10 + 1). + Char buffer[digits10() + 1]; + auto end = format_decimal(buffer, value, size).end; + return {out, detail::copy_str_noinline(buffer, end, out)}; +} + +template +FMT_CONSTEXPR auto format_uint(Char* buffer, UInt value, int num_digits, + bool upper = false) -> Char* { + buffer += num_digits; + Char* end = buffer; + do { + const char* digits = upper ? "0123456789ABCDEF" : "0123456789abcdef"; + unsigned digit = static_cast(value & ((1 << BASE_BITS) - 1)); + *--buffer = static_cast(BASE_BITS < 4 ? static_cast('0' + digit) + : digits[digit]); + } while ((value >>= BASE_BITS) != 0); + return end; +} + +template +inline auto format_uint(It out, UInt value, int num_digits, bool upper = false) + -> It { + if (auto ptr = to_pointer(out, to_unsigned(num_digits))) { + format_uint(ptr, value, num_digits, upper); + return out; + } + // Buffer should be large enough to hold all digits (digits / BASE_BITS + 1). + char buffer[num_bits() / BASE_BITS + 1]; + format_uint(buffer, value, num_digits, upper); + return detail::copy_str_noinline(buffer, buffer + num_digits, out); +} + +// A converter from UTF-8 to UTF-16. +class utf8_to_utf16 { + private: + basic_memory_buffer buffer_; + + public: + FMT_API explicit utf8_to_utf16(string_view s); + operator basic_string_view() const { return {&buffer_[0], size()}; } + auto size() const -> size_t { return buffer_.size() - 1; } + auto c_str() const -> const wchar_t* { return &buffer_[0]; } + auto str() const -> std::wstring { return {&buffer_[0], size()}; } +}; + +namespace dragonbox { + +// Type-specific information that Dragonbox uses. +template struct float_info; + +template <> struct float_info { + using carrier_uint = uint32_t; + static const int exponent_bits = 8; + static const int kappa = 1; + static const int big_divisor = 100; + static const int small_divisor = 10; + static const int min_k = -31; + static const int max_k = 46; + static const int shorter_interval_tie_lower_threshold = -35; + static const int shorter_interval_tie_upper_threshold = -35; +}; + +template <> struct float_info { + using carrier_uint = uint64_t; + static const int exponent_bits = 11; + static const int kappa = 2; + static const int big_divisor = 1000; + static const int small_divisor = 100; + static const int min_k = -292; + static const int max_k = 326; + static const int shorter_interval_tie_lower_threshold = -77; + static const int shorter_interval_tie_upper_threshold = -77; +}; + +// An 80- or 128-bit floating point number. +template +struct float_info::digits == 64 || + std::numeric_limits::digits == 113 || + is_float128::value>> { + using carrier_uint = detail::uint128_t; + static const int exponent_bits = 15; +}; + +// A double-double floating point number. +template +struct float_info::value>> { + using carrier_uint = detail::uint128_t; +}; + +template struct decimal_fp { + using significand_type = typename float_info::carrier_uint; + significand_type significand; + int exponent; +}; + +template FMT_API auto to_decimal(T x) noexcept -> decimal_fp; +} // namespace dragonbox + +// Returns true iff Float has the implicit bit which is not stored. +template constexpr bool has_implicit_bit() { + // An 80-bit FP number has a 64-bit significand an no implicit bit. + return std::numeric_limits::digits != 64; +} + +// Returns the number of significand bits stored in Float. The implicit bit is +// not counted since it is not stored. +template constexpr int num_significand_bits() { + // std::numeric_limits may not support __float128. + return is_float128() ? 112 + : (std::numeric_limits::digits - + (has_implicit_bit() ? 1 : 0)); +} + +template +constexpr auto exponent_mask() -> + typename dragonbox::float_info::carrier_uint { + using uint = typename dragonbox::float_info::carrier_uint; + return ((uint(1) << dragonbox::float_info::exponent_bits) - 1) + << num_significand_bits(); +} +template constexpr auto exponent_bias() -> int { + // std::numeric_limits may not support __float128. + return is_float128() ? 16383 + : std::numeric_limits::max_exponent - 1; +} + +// Writes the exponent exp in the form "[+-]d{2,3}" to buffer. +template +FMT_CONSTEXPR auto write_exponent(int exp, It it) -> It { + FMT_ASSERT(-10000 < exp && exp < 10000, "exponent out of range"); + if (exp < 0) { + *it++ = static_cast('-'); + exp = -exp; + } else { + *it++ = static_cast('+'); + } + if (exp >= 100) { + const char* top = digits2(to_unsigned(exp / 100)); + if (exp >= 1000) *it++ = static_cast(top[0]); + *it++ = static_cast(top[1]); + exp %= 100; + } + const char* d = digits2(to_unsigned(exp)); + *it++ = static_cast(d[0]); + *it++ = static_cast(d[1]); + return it; +} + +// A floating-point number f * pow(2, e) where F is an unsigned type. +template struct basic_fp { + F f; + int e; + + static constexpr const int num_significand_bits = + static_cast(sizeof(F) * num_bits()); + + constexpr basic_fp() : f(0), e(0) {} + constexpr basic_fp(uint64_t f_val, int e_val) : f(f_val), e(e_val) {} + + // Constructs fp from an IEEE754 floating-point number. + template FMT_CONSTEXPR basic_fp(Float n) { assign(n); } + + // Assigns n to this and return true iff predecessor is closer than successor. + template ::value)> + FMT_CONSTEXPR auto assign(Float n) -> bool { + static_assert(std::numeric_limits::digits <= 113, "unsupported FP"); + // Assume Float is in the format [sign][exponent][significand]. + using carrier_uint = typename dragonbox::float_info::carrier_uint; + const auto num_float_significand_bits = + detail::num_significand_bits(); + const auto implicit_bit = carrier_uint(1) << num_float_significand_bits; + const auto significand_mask = implicit_bit - 1; + auto u = bit_cast(n); + f = static_cast(u & significand_mask); + auto biased_e = static_cast((u & exponent_mask()) >> + num_float_significand_bits); + // The predecessor is closer if n is a normalized power of 2 (f == 0) + // other than the smallest normalized number (biased_e > 1). + auto is_predecessor_closer = f == 0 && biased_e > 1; + if (biased_e == 0) + biased_e = 1; // Subnormals use biased exponent 1 (min exponent). + else if (has_implicit_bit()) + f += static_cast(implicit_bit); + e = biased_e - exponent_bias() - num_float_significand_bits; + if (!has_implicit_bit()) ++e; + return is_predecessor_closer; + } + + template ::value)> + FMT_CONSTEXPR auto assign(Float n) -> bool { + static_assert(std::numeric_limits::is_iec559, "unsupported FP"); + return assign(static_cast(n)); + } +}; + +using fp = basic_fp; + +// Normalizes the value converted from double and multiplied by (1 << SHIFT). +template +FMT_CONSTEXPR basic_fp normalize(basic_fp value) { + // Handle subnormals. + const auto implicit_bit = F(1) << num_significand_bits(); + const auto shifted_implicit_bit = implicit_bit << SHIFT; + while ((value.f & shifted_implicit_bit) == 0) { + value.f <<= 1; + --value.e; + } + // Subtract 1 to account for hidden bit. + const auto offset = basic_fp::num_significand_bits - + num_significand_bits() - SHIFT - 1; + value.f <<= offset; + value.e -= offset; + return value; +} + +// Computes lhs * rhs / pow(2, 64) rounded to nearest with half-up tie breaking. +FMT_CONSTEXPR inline uint64_t multiply(uint64_t lhs, uint64_t rhs) { +#if FMT_USE_INT128 + auto product = static_cast<__uint128_t>(lhs) * rhs; + auto f = static_cast(product >> 64); + return (static_cast(product) & (1ULL << 63)) != 0 ? f + 1 : f; +#else + // Multiply 32-bit parts of significands. + uint64_t mask = (1ULL << 32) - 1; + uint64_t a = lhs >> 32, b = lhs & mask; + uint64_t c = rhs >> 32, d = rhs & mask; + uint64_t ac = a * c, bc = b * c, ad = a * d, bd = b * d; + // Compute mid 64-bit of result and round. + uint64_t mid = (bd >> 32) + (ad & mask) + (bc & mask) + (1U << 31); + return ac + (ad >> 32) + (bc >> 32) + (mid >> 32); +#endif +} + +FMT_CONSTEXPR inline fp operator*(fp x, fp y) { + return {multiply(x.f, y.f), x.e + y.e + 64}; +} + +template struct basic_data { + // Normalized 64-bit significands of pow(10, k), for k = -348, -340, ..., 340. + // These are generated by support/compute-powers.py. + static constexpr uint64_t pow10_significands[87] = { + 0xfa8fd5a0081c0288, 0xbaaee17fa23ebf76, 0x8b16fb203055ac76, + 0xcf42894a5dce35ea, 0x9a6bb0aa55653b2d, 0xe61acf033d1a45df, + 0xab70fe17c79ac6ca, 0xff77b1fcbebcdc4f, 0xbe5691ef416bd60c, + 0x8dd01fad907ffc3c, 0xd3515c2831559a83, 0x9d71ac8fada6c9b5, + 0xea9c227723ee8bcb, 0xaecc49914078536d, 0x823c12795db6ce57, + 0xc21094364dfb5637, 0x9096ea6f3848984f, 0xd77485cb25823ac7, + 0xa086cfcd97bf97f4, 0xef340a98172aace5, 0xb23867fb2a35b28e, + 0x84c8d4dfd2c63f3b, 0xc5dd44271ad3cdba, 0x936b9fcebb25c996, + 0xdbac6c247d62a584, 0xa3ab66580d5fdaf6, 0xf3e2f893dec3f126, + 0xb5b5ada8aaff80b8, 0x87625f056c7c4a8b, 0xc9bcff6034c13053, + 0x964e858c91ba2655, 0xdff9772470297ebd, 0xa6dfbd9fb8e5b88f, + 0xf8a95fcf88747d94, 0xb94470938fa89bcf, 0x8a08f0f8bf0f156b, + 0xcdb02555653131b6, 0x993fe2c6d07b7fac, 0xe45c10c42a2b3b06, + 0xaa242499697392d3, 0xfd87b5f28300ca0e, 0xbce5086492111aeb, + 0x8cbccc096f5088cc, 0xd1b71758e219652c, 0x9c40000000000000, + 0xe8d4a51000000000, 0xad78ebc5ac620000, 0x813f3978f8940984, + 0xc097ce7bc90715b3, 0x8f7e32ce7bea5c70, 0xd5d238a4abe98068, + 0x9f4f2726179a2245, 0xed63a231d4c4fb27, 0xb0de65388cc8ada8, + 0x83c7088e1aab65db, 0xc45d1df942711d9a, 0x924d692ca61be758, + 0xda01ee641a708dea, 0xa26da3999aef774a, 0xf209787bb47d6b85, + 0xb454e4a179dd1877, 0x865b86925b9bc5c2, 0xc83553c5c8965d3d, + 0x952ab45cfa97a0b3, 0xde469fbd99a05fe3, 0xa59bc234db398c25, + 0xf6c69a72a3989f5c, 0xb7dcbf5354e9bece, 0x88fcf317f22241e2, + 0xcc20ce9bd35c78a5, 0x98165af37b2153df, 0xe2a0b5dc971f303a, + 0xa8d9d1535ce3b396, 0xfb9b7cd9a4a7443c, 0xbb764c4ca7a44410, + 0x8bab8eefb6409c1a, 0xd01fef10a657842c, 0x9b10a4e5e9913129, + 0xe7109bfba19c0c9d, 0xac2820d9623bf429, 0x80444b5e7aa7cf85, + 0xbf21e44003acdd2d, 0x8e679c2f5e44ff8f, 0xd433179d9c8cb841, + 0x9e19db92b4e31ba9, 0xeb96bf6ebadf77d9, 0xaf87023b9bf0ee6b, + }; + +#if FMT_GCC_VERSION && FMT_GCC_VERSION < 409 +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wnarrowing" +#endif + // Binary exponents of pow(10, k), for k = -348, -340, ..., 340, corresponding + // to significands above. + static constexpr int16_t pow10_exponents[87] = { + -1220, -1193, -1166, -1140, -1113, -1087, -1060, -1034, -1007, -980, -954, + -927, -901, -874, -847, -821, -794, -768, -741, -715, -688, -661, + -635, -608, -582, -555, -529, -502, -475, -449, -422, -396, -369, + -343, -316, -289, -263, -236, -210, -183, -157, -130, -103, -77, + -50, -24, 3, 30, 56, 83, 109, 136, 162, 189, 216, + 242, 269, 295, 322, 348, 375, 402, 428, 455, 481, 508, + 534, 561, 588, 614, 641, 667, 694, 720, 747, 774, 800, + 827, 853, 880, 907, 933, 960, 986, 1013, 1039, 1066}; +#if FMT_GCC_VERSION && FMT_GCC_VERSION < 409 +# pragma GCC diagnostic pop +#endif + + static constexpr uint64_t power_of_10_64[20] = { + 1, FMT_POWERS_OF_10(1ULL), FMT_POWERS_OF_10(1000000000ULL), + 10000000000000000000ULL}; +}; + +#if FMT_CPLUSPLUS < 201703L +template constexpr uint64_t basic_data::pow10_significands[]; +template constexpr int16_t basic_data::pow10_exponents[]; +template constexpr uint64_t basic_data::power_of_10_64[]; +#endif + +// This is a struct rather than an alias to avoid shadowing warnings in gcc. +struct data : basic_data<> {}; + +// Returns a cached power of 10 `c_k = c_k.f * pow(2, c_k.e)` such that its +// (binary) exponent satisfies `min_exponent <= c_k.e <= min_exponent + 28`. +FMT_CONSTEXPR inline fp get_cached_power(int min_exponent, + int& pow10_exponent) { + const int shift = 32; + // log10(2) = 0x0.4d104d427de7fbcc... + const int64_t significand = 0x4d104d427de7fbcc; + int index = static_cast( + ((min_exponent + fp::num_significand_bits - 1) * (significand >> shift) + + ((int64_t(1) << shift) - 1)) // ceil + >> 32 // arithmetic shift + ); + // Decimal exponent of the first (smallest) cached power of 10. + const int first_dec_exp = -348; + // Difference between 2 consecutive decimal exponents in cached powers of 10. + const int dec_exp_step = 8; + index = (index - first_dec_exp - 1) / dec_exp_step + 1; + pow10_exponent = first_dec_exp + index * dec_exp_step; + // Using *(x + index) instead of x[index] avoids an issue with some compilers + // using the EDG frontend (e.g. nvhpc/22.3 in C++17 mode). + return {*(data::pow10_significands + index), + *(data::pow10_exponents + index)}; +} + +#ifndef _MSC_VER +# define FMT_SNPRINTF snprintf +#else +FMT_API auto fmt_snprintf(char* buf, size_t size, const char* fmt, ...) -> int; +# define FMT_SNPRINTF fmt_snprintf +#endif // _MSC_VER + +// Formats a floating-point number with snprintf using the hexfloat format. +template +auto snprintf_float(T value, int precision, float_specs specs, + buffer& buf) -> int { + // Buffer capacity must be non-zero, otherwise MSVC's vsnprintf_s will fail. + FMT_ASSERT(buf.capacity() > buf.size(), "empty buffer"); + FMT_ASSERT(specs.format == float_format::hex, ""); + static_assert(!std::is_same::value, ""); + + // Build the format string. + char format[7]; // The longest format is "%#.*Le". + char* format_ptr = format; + *format_ptr++ = '%'; + if (specs.showpoint) *format_ptr++ = '#'; + if (precision >= 0) { + *format_ptr++ = '.'; + *format_ptr++ = '*'; + } + if (std::is_same()) *format_ptr++ = 'L'; + *format_ptr++ = specs.upper ? 'A' : 'a'; + *format_ptr = '\0'; + + // Format using snprintf. + auto offset = buf.size(); + for (;;) { + auto begin = buf.data() + offset; + auto capacity = buf.capacity() - offset; + abort_fuzzing_if(precision > 100000); + // Suppress the warning about a nonliteral format string. + // Cannot use auto because of a bug in MinGW (#1532). + int (*snprintf_ptr)(char*, size_t, const char*, ...) = FMT_SNPRINTF; + int result = precision >= 0 + ? snprintf_ptr(begin, capacity, format, precision, value) + : snprintf_ptr(begin, capacity, format, value); + if (result < 0) { + // The buffer will grow exponentially. + buf.try_reserve(buf.capacity() + 1); + continue; + } + auto size = to_unsigned(result); + // Size equal to capacity means that the last character was truncated. + if (size < capacity) { + buf.try_resize(size + offset); + return 0; + } + buf.try_reserve(size + offset + 1); // Add 1 for the terminating '\0'. + } +} + +template +using convert_float_result = + conditional_t::value || sizeof(T) == sizeof(double), + double, T>; + +template +constexpr auto convert_float(T value) -> convert_float_result { + return static_cast>(value); +} + +template +FMT_NOINLINE FMT_CONSTEXPR auto fill(OutputIt it, size_t n, + const fill_t& fill) -> OutputIt { + auto fill_size = fill.size(); + if (fill_size == 1) return detail::fill_n(it, n, fill[0]); + auto data = fill.data(); + for (size_t i = 0; i < n; ++i) + it = copy_str(data, data + fill_size, it); + return it; +} + +// Writes the output of f, padded according to format specifications in specs. +// size: output size in code units. +// width: output display width in (terminal) column positions. +template +FMT_CONSTEXPR auto write_padded(OutputIt out, + const basic_format_specs& specs, + size_t size, size_t width, F&& f) -> OutputIt { + static_assert(align == align::left || align == align::right, ""); + unsigned spec_width = to_unsigned(specs.width); + size_t padding = spec_width > width ? spec_width - width : 0; + // Shifts are encoded as string literals because static constexpr is not + // supported in constexpr functions. + auto* shifts = align == align::left ? "\x1f\x1f\x00\x01" : "\x00\x1f\x00\x01"; + size_t left_padding = padding >> shifts[specs.align]; + size_t right_padding = padding - left_padding; + auto it = reserve(out, size + padding * specs.fill.size()); + if (left_padding != 0) it = fill(it, left_padding, specs.fill); + it = f(it); + if (right_padding != 0) it = fill(it, right_padding, specs.fill); + return base_iterator(out, it); +} + +template +constexpr auto write_padded(OutputIt out, const basic_format_specs& specs, + size_t size, F&& f) -> OutputIt { + return write_padded(out, specs, size, size, f); +} + +template +FMT_CONSTEXPR auto write_bytes(OutputIt out, string_view bytes, + const basic_format_specs& specs) + -> OutputIt { + return write_padded( + out, specs, bytes.size(), [bytes](reserve_iterator it) { + const char* data = bytes.data(); + return copy_str(data, data + bytes.size(), it); + }); +} + +template +auto write_ptr(OutputIt out, UIntPtr value, + const basic_format_specs* specs) -> OutputIt { + int num_digits = count_digits<4>(value); + auto size = to_unsigned(num_digits) + size_t(2); + auto write = [=](reserve_iterator it) { + *it++ = static_cast('0'); + *it++ = static_cast('x'); + return format_uint<4, Char>(it, value, num_digits); + }; + return specs ? write_padded(out, *specs, size, write) + : base_iterator(out, write(reserve(out, size))); +} + +// Returns true iff the code point cp is printable. +FMT_API auto is_printable(uint32_t cp) -> bool; + +inline auto needs_escape(uint32_t cp) -> bool { + return cp < 0x20 || cp == 0x7f || cp == '"' || cp == '\\' || + !is_printable(cp); +} + +template struct find_escape_result { + const Char* begin; + const Char* end; + uint32_t cp; +}; + +template +using make_unsigned_char = + typename conditional_t::value, + std::make_unsigned, + type_identity>::type; + +template +auto find_escape(const Char* begin, const Char* end) + -> find_escape_result { + for (; begin != end; ++begin) { + uint32_t cp = static_cast>(*begin); + if (const_check(sizeof(Char) == 1) && cp >= 0x80) continue; + if (needs_escape(cp)) return {begin, begin + 1, cp}; + } + return {begin, nullptr, 0}; +} + +inline auto find_escape(const char* begin, const char* end) + -> find_escape_result { + if (!is_utf8()) return find_escape(begin, end); + auto result = find_escape_result{end, nullptr, 0}; + for_each_codepoint(string_view(begin, to_unsigned(end - begin)), + [&](uint32_t cp, string_view sv) { + if (needs_escape(cp)) { + result = {sv.begin(), sv.end(), cp}; + return false; + } + return true; + }); + return result; +} + +#define FMT_STRING_IMPL(s, base, explicit) \ + [] { \ + /* Use the hidden visibility as a workaround for a GCC bug (#1973). */ \ + /* Use a macro-like name to avoid shadowing warnings. */ \ + struct FMT_GCC_VISIBILITY_HIDDEN FMT_COMPILE_STRING : base { \ + using char_type FMT_MAYBE_UNUSED = fmt::remove_cvref_t; \ + FMT_MAYBE_UNUSED FMT_CONSTEXPR explicit \ + operator fmt::basic_string_view() const { \ + return fmt::detail_exported::compile_string_to_view(s); \ + } \ + }; \ + return FMT_COMPILE_STRING(); \ + }() + +/** + \rst + Constructs a compile-time format string from a string literal *s*. + + **Example**:: + + // A compile-time error because 'd' is an invalid specifier for strings. + std::string s = fmt::format(FMT_STRING("{:d}"), "foo"); + \endrst + */ +#define FMT_STRING(s) FMT_STRING_IMPL(s, fmt::detail::compile_string, ) + +template +auto write_codepoint(OutputIt out, char prefix, uint32_t cp) -> OutputIt { + *out++ = static_cast('\\'); + *out++ = static_cast(prefix); + Char buf[width]; + fill_n(buf, width, static_cast('0')); + format_uint<4>(buf, cp, width); + return copy_str(buf, buf + width, out); +} + +template +auto write_escaped_cp(OutputIt out, const find_escape_result& escape) + -> OutputIt { + auto c = static_cast(escape.cp); + switch (escape.cp) { + case '\n': + *out++ = static_cast('\\'); + c = static_cast('n'); + break; + case '\r': + *out++ = static_cast('\\'); + c = static_cast('r'); + break; + case '\t': + *out++ = static_cast('\\'); + c = static_cast('t'); + break; + case '"': + FMT_FALLTHROUGH; + case '\'': + FMT_FALLTHROUGH; + case '\\': + *out++ = static_cast('\\'); + break; + default: + if (is_utf8()) { + if (escape.cp < 0x100) { + return write_codepoint<2, Char>(out, 'x', escape.cp); + } + if (escape.cp < 0x10000) { + return write_codepoint<4, Char>(out, 'u', escape.cp); + } + if (escape.cp < 0x110000) { + return write_codepoint<8, Char>(out, 'U', escape.cp); + } + } + for (Char escape_char : basic_string_view( + escape.begin, to_unsigned(escape.end - escape.begin))) { + out = write_codepoint<2, Char>(out, 'x', + static_cast(escape_char) & 0xFF); + } + return out; + } + *out++ = c; + return out; +} + +template +auto write_escaped_string(OutputIt out, basic_string_view str) + -> OutputIt { + *out++ = static_cast('"'); + auto begin = str.begin(), end = str.end(); + do { + auto escape = find_escape(begin, end); + out = copy_str(begin, escape.begin, out); + begin = escape.end; + if (!begin) break; + out = write_escaped_cp(out, escape); + } while (begin != end); + *out++ = static_cast('"'); + return out; +} + +template +auto write_escaped_char(OutputIt out, Char v) -> OutputIt { + *out++ = static_cast('\''); + if ((needs_escape(static_cast(v)) && v != static_cast('"')) || + v == static_cast('\'')) { + out = write_escaped_cp( + out, find_escape_result{&v, &v + 1, static_cast(v)}); + } else { + *out++ = v; + } + *out++ = static_cast('\''); + return out; +} + +template +FMT_CONSTEXPR auto write_char(OutputIt out, Char value, + const basic_format_specs& specs) + -> OutputIt { + bool is_debug = specs.type == presentation_type::debug; + return write_padded(out, specs, 1, [=](reserve_iterator it) { + if (is_debug) return write_escaped_char(it, value); + *it++ = value; + return it; + }); +} +template +FMT_CONSTEXPR auto write(OutputIt out, Char value, + const basic_format_specs& specs, + locale_ref loc = {}) -> OutputIt { + return check_char_specs(specs) + ? write_char(out, value, specs) + : write(out, static_cast(value), specs, loc); +} + +// Data for write_int that doesn't depend on output iterator type. It is used to +// avoid template code bloat. +template struct write_int_data { + size_t size; + size_t padding; + + FMT_CONSTEXPR write_int_data(int num_digits, unsigned prefix, + const basic_format_specs& specs) + : size((prefix >> 24) + to_unsigned(num_digits)), padding(0) { + if (specs.align == align::numeric) { + auto width = to_unsigned(specs.width); + if (width > size) { + padding = width - size; + size = width; + } + } else if (specs.precision > num_digits) { + size = (prefix >> 24) + to_unsigned(specs.precision); + padding = to_unsigned(specs.precision - num_digits); + } + } +}; + +// Writes an integer in the format +// +// where are written by write_digits(it). +// prefix contains chars in three lower bytes and the size in the fourth byte. +template +FMT_CONSTEXPR FMT_INLINE auto write_int(OutputIt out, int num_digits, + unsigned prefix, + const basic_format_specs& specs, + W write_digits) -> OutputIt { + // Slightly faster check for specs.width == 0 && specs.precision == -1. + if ((specs.width | (specs.precision + 1)) == 0) { + auto it = reserve(out, to_unsigned(num_digits) + (prefix >> 24)); + if (prefix != 0) { + for (unsigned p = prefix & 0xffffff; p != 0; p >>= 8) + *it++ = static_cast(p & 0xff); + } + return base_iterator(out, write_digits(it)); + } + auto data = write_int_data(num_digits, prefix, specs); + return write_padded( + out, specs, data.size, [=](reserve_iterator it) { + for (unsigned p = prefix & 0xffffff; p != 0; p >>= 8) + *it++ = static_cast(p & 0xff); + it = detail::fill_n(it, data.padding, static_cast('0')); + return write_digits(it); + }); +} + +template class digit_grouping { + private: + thousands_sep_result sep_; + + struct next_state { + std::string::const_iterator group; + int pos; + }; + next_state initial_state() const { return {sep_.grouping.begin(), 0}; } + + // Returns the next digit group separator position. + int next(next_state& state) const { + if (!sep_.thousands_sep) return max_value(); + if (state.group == sep_.grouping.end()) + return state.pos += sep_.grouping.back(); + if (*state.group <= 0 || *state.group == max_value()) + return max_value(); + state.pos += *state.group++; + return state.pos; + } + + public: + explicit digit_grouping(locale_ref loc, bool localized = true) { + if (localized) + sep_ = thousands_sep(loc); + else + sep_.thousands_sep = Char(); + } + explicit digit_grouping(thousands_sep_result sep) : sep_(sep) {} + + Char separator() const { return sep_.thousands_sep; } + + int count_separators(int num_digits) const { + int count = 0; + auto state = initial_state(); + while (num_digits > next(state)) ++count; + return count; + } + + // Applies grouping to digits and write the output to out. + template + Out apply(Out out, basic_string_view digits) const { + auto num_digits = static_cast(digits.size()); + auto separators = basic_memory_buffer(); + separators.push_back(0); + auto state = initial_state(); + while (int i = next(state)) { + if (i >= num_digits) break; + separators.push_back(i); + } + for (int i = 0, sep_index = static_cast(separators.size() - 1); + i < num_digits; ++i) { + if (num_digits - i == separators[sep_index]) { + *out++ = separator(); + --sep_index; + } + *out++ = static_cast(digits[to_unsigned(i)]); + } + return out; + } +}; + +template +auto write_int_localized(OutputIt out, UInt value, unsigned prefix, + const basic_format_specs& specs, + const digit_grouping& grouping) -> OutputIt { + static_assert(std::is_same, UInt>::value, ""); + int num_digits = count_digits(value); + char digits[40]; + format_decimal(digits, value, num_digits); + unsigned size = to_unsigned((prefix != 0 ? 1 : 0) + num_digits + + grouping.count_separators(num_digits)); + return write_padded( + out, specs, size, size, [&](reserve_iterator it) { + if (prefix != 0) { + char sign = static_cast(prefix); + *it++ = static_cast(sign); + } + return grouping.apply(it, string_view(digits, to_unsigned(num_digits))); + }); +} + +template +auto write_int_localized(OutputIt& out, UInt value, unsigned prefix, + const basic_format_specs& specs, locale_ref loc) + -> bool { + auto grouping = digit_grouping(loc); + out = write_int_localized(out, value, prefix, specs, grouping); + return true; +} + +FMT_CONSTEXPR inline void prefix_append(unsigned& prefix, unsigned value) { + prefix |= prefix != 0 ? value << 8 : value; + prefix += (1u + (value > 0xff ? 1 : 0)) << 24; +} + +template struct write_int_arg { + UInt abs_value; + unsigned prefix; +}; + +template +FMT_CONSTEXPR auto make_write_int_arg(T value, sign_t sign) + -> write_int_arg> { + auto prefix = 0u; + auto abs_value = static_cast>(value); + if (is_negative(value)) { + prefix = 0x01000000 | '-'; + abs_value = 0 - abs_value; + } else { + constexpr const unsigned prefixes[4] = {0, 0, 0x1000000u | '+', + 0x1000000u | ' '}; + prefix = prefixes[sign]; + } + return {abs_value, prefix}; +} + +template +FMT_CONSTEXPR FMT_INLINE auto write_int(OutputIt out, write_int_arg arg, + const basic_format_specs& specs, + locale_ref loc) -> OutputIt { + static_assert(std::is_same>::value, ""); + auto abs_value = arg.abs_value; + auto prefix = arg.prefix; + switch (specs.type) { + case presentation_type::none: + case presentation_type::dec: { + if (specs.localized && + write_int_localized(out, static_cast>(abs_value), + prefix, specs, loc)) { + return out; + } + auto num_digits = count_digits(abs_value); + return write_int( + out, num_digits, prefix, specs, [=](reserve_iterator it) { + return format_decimal(it, abs_value, num_digits).end; + }); + } + case presentation_type::hex_lower: + case presentation_type::hex_upper: { + bool upper = specs.type == presentation_type::hex_upper; + if (specs.alt) + prefix_append(prefix, unsigned(upper ? 'X' : 'x') << 8 | '0'); + int num_digits = count_digits<4>(abs_value); + return write_int( + out, num_digits, prefix, specs, [=](reserve_iterator it) { + return format_uint<4, Char>(it, abs_value, num_digits, upper); + }); + } + case presentation_type::bin_lower: + case presentation_type::bin_upper: { + bool upper = specs.type == presentation_type::bin_upper; + if (specs.alt) + prefix_append(prefix, unsigned(upper ? 'B' : 'b') << 8 | '0'); + int num_digits = count_digits<1>(abs_value); + return write_int(out, num_digits, prefix, specs, + [=](reserve_iterator it) { + return format_uint<1, Char>(it, abs_value, num_digits); + }); + } + case presentation_type::oct: { + int num_digits = count_digits<3>(abs_value); + // Octal prefix '0' is counted as a digit, so only add it if precision + // is not greater than the number of digits. + if (specs.alt && specs.precision <= num_digits && abs_value != 0) + prefix_append(prefix, '0'); + return write_int(out, num_digits, prefix, specs, + [=](reserve_iterator it) { + return format_uint<3, Char>(it, abs_value, num_digits); + }); + } + case presentation_type::chr: + return write_char(out, static_cast(abs_value), specs); + default: + throw_format_error("invalid type specifier"); + } + return out; +} +template +FMT_CONSTEXPR FMT_NOINLINE auto write_int_noinline( + OutputIt out, write_int_arg arg, const basic_format_specs& specs, + locale_ref loc) -> OutputIt { + return write_int(out, arg, specs, loc); +} +template ::value && + !std::is_same::value && + std::is_same>::value)> +FMT_CONSTEXPR FMT_INLINE auto write(OutputIt out, T value, + const basic_format_specs& specs, + locale_ref loc) -> OutputIt { + return write_int_noinline(out, make_write_int_arg(value, specs.sign), specs, + loc); +} +// An inlined version of write used in format string compilation. +template ::value && + !std::is_same::value && + !std::is_same>::value)> +FMT_CONSTEXPR FMT_INLINE auto write(OutputIt out, T value, + const basic_format_specs& specs, + locale_ref loc) -> OutputIt { + return write_int(out, make_write_int_arg(value, specs.sign), specs, loc); +} + +// An output iterator that counts the number of objects written to it and +// discards them. +class counting_iterator { + private: + size_t count_; + + public: + using iterator_category = std::output_iterator_tag; + using difference_type = std::ptrdiff_t; + using pointer = void; + using reference = void; + FMT_UNCHECKED_ITERATOR(counting_iterator); + + struct value_type { + template FMT_CONSTEXPR void operator=(const T&) {} + }; + + FMT_CONSTEXPR counting_iterator() : count_(0) {} + + FMT_CONSTEXPR size_t count() const { return count_; } + + FMT_CONSTEXPR counting_iterator& operator++() { + ++count_; + return *this; + } + FMT_CONSTEXPR counting_iterator operator++(int) { + auto it = *this; + ++*this; + return it; + } + + FMT_CONSTEXPR friend counting_iterator operator+(counting_iterator it, + difference_type n) { + it.count_ += static_cast(n); + return it; + } + + FMT_CONSTEXPR value_type operator*() const { return {}; } +}; + +template +FMT_CONSTEXPR auto write(OutputIt out, basic_string_view s, + const basic_format_specs& specs) -> OutputIt { + auto data = s.data(); + auto size = s.size(); + if (specs.precision >= 0 && to_unsigned(specs.precision) < size) + size = code_point_index(s, to_unsigned(specs.precision)); + bool is_debug = specs.type == presentation_type::debug; + size_t width = 0; + if (specs.width != 0) { + if (is_debug) + width = write_escaped_string(counting_iterator{}, s).count(); + else + width = compute_width(basic_string_view(data, size)); + } + return write_padded(out, specs, size, width, + [=](reserve_iterator it) { + if (is_debug) return write_escaped_string(it, s); + return copy_str(data, data + size, it); + }); +} +template +FMT_CONSTEXPR auto write(OutputIt out, + basic_string_view> s, + const basic_format_specs& specs, locale_ref) + -> OutputIt { + check_string_type_spec(specs.type); + return write(out, s, specs); +} +template +FMT_CONSTEXPR auto write(OutputIt out, const Char* s, + const basic_format_specs& specs, locale_ref) + -> OutputIt { + return check_cstring_type_spec(specs.type) + ? write(out, basic_string_view(s), specs, {}) + : write_ptr(out, bit_cast(s), &specs); +} + +template ::value && + !std::is_same::value && + !std::is_same::value)> +FMT_CONSTEXPR auto write(OutputIt out, T value) -> OutputIt { + auto abs_value = static_cast>(value); + bool negative = is_negative(value); + // Don't do -abs_value since it trips unsigned-integer-overflow sanitizer. + if (negative) abs_value = ~abs_value + 1; + int num_digits = count_digits(abs_value); + auto size = (negative ? 1 : 0) + static_cast(num_digits); + auto it = reserve(out, size); + if (auto ptr = to_pointer(it, size)) { + if (negative) *ptr++ = static_cast('-'); + format_decimal(ptr, abs_value, num_digits); + return out; + } + if (negative) *it++ = static_cast('-'); + it = format_decimal(it, abs_value, num_digits).end; + return base_iterator(out, it); +} + +template +FMT_CONSTEXPR20 auto write_nonfinite(OutputIt out, bool isnan, + basic_format_specs specs, + const float_specs& fspecs) -> OutputIt { + auto str = + isnan ? (fspecs.upper ? "NAN" : "nan") : (fspecs.upper ? "INF" : "inf"); + constexpr size_t str_size = 3; + auto sign = fspecs.sign; + auto size = str_size + (sign ? 1 : 0); + // Replace '0'-padding with space for non-finite values. + const bool is_zero_fill = + specs.fill.size() == 1 && *specs.fill.data() == static_cast('0'); + if (is_zero_fill) specs.fill[0] = static_cast(' '); + return write_padded(out, specs, size, [=](reserve_iterator it) { + if (sign) *it++ = detail::sign(sign); + return copy_str(str, str + str_size, it); + }); +} + +// A decimal floating-point number significand * pow(10, exp). +struct big_decimal_fp { + const char* significand; + int significand_size; + int exponent; +}; + +constexpr auto get_significand_size(const big_decimal_fp& f) -> int { + return f.significand_size; +} +template +inline auto get_significand_size(const dragonbox::decimal_fp& f) -> int { + return count_digits(f.significand); +} + +template +constexpr auto write_significand(OutputIt out, const char* significand, + int significand_size) -> OutputIt { + return copy_str(significand, significand + significand_size, out); +} +template +inline auto write_significand(OutputIt out, UInt significand, + int significand_size) -> OutputIt { + return format_decimal(out, significand, significand_size).end; +} +template +FMT_CONSTEXPR20 auto write_significand(OutputIt out, T significand, + int significand_size, int exponent, + const Grouping& grouping) -> OutputIt { + if (!grouping.separator()) { + out = write_significand(out, significand, significand_size); + return detail::fill_n(out, exponent, static_cast('0')); + } + auto buffer = memory_buffer(); + write_significand(appender(buffer), significand, significand_size); + detail::fill_n(appender(buffer), exponent, '0'); + return grouping.apply(out, string_view(buffer.data(), buffer.size())); +} + +template ::value)> +inline auto write_significand(Char* out, UInt significand, int significand_size, + int integral_size, Char decimal_point) -> Char* { + if (!decimal_point) + return format_decimal(out, significand, significand_size).end; + out += significand_size + 1; + Char* end = out; + int floating_size = significand_size - integral_size; + for (int i = floating_size / 2; i > 0; --i) { + out -= 2; + copy2(out, digits2(static_cast(significand % 100))); + significand /= 100; + } + if (floating_size % 2 != 0) { + *--out = static_cast('0' + significand % 10); + significand /= 10; + } + *--out = decimal_point; + format_decimal(out - integral_size, significand, integral_size); + return end; +} + +template >::value)> +inline auto write_significand(OutputIt out, UInt significand, + int significand_size, int integral_size, + Char decimal_point) -> OutputIt { + // Buffer is large enough to hold digits (digits10 + 1) and a decimal point. + Char buffer[digits10() + 2]; + auto end = write_significand(buffer, significand, significand_size, + integral_size, decimal_point); + return detail::copy_str_noinline(buffer, end, out); +} + +template +FMT_CONSTEXPR auto write_significand(OutputIt out, const char* significand, + int significand_size, int integral_size, + Char decimal_point) -> OutputIt { + out = detail::copy_str_noinline(significand, + significand + integral_size, out); + if (!decimal_point) return out; + *out++ = decimal_point; + return detail::copy_str_noinline(significand + integral_size, + significand + significand_size, out); +} + +template +FMT_CONSTEXPR20 auto write_significand(OutputIt out, T significand, + int significand_size, int integral_size, + Char decimal_point, + const Grouping& grouping) -> OutputIt { + if (!grouping.separator()) { + return write_significand(out, significand, significand_size, integral_size, + decimal_point); + } + auto buffer = basic_memory_buffer(); + write_significand(buffer_appender(buffer), significand, + significand_size, integral_size, decimal_point); + grouping.apply( + out, basic_string_view(buffer.data(), to_unsigned(integral_size))); + return detail::copy_str_noinline(buffer.data() + integral_size, + buffer.end(), out); +} + +template > +FMT_CONSTEXPR20 auto do_write_float(OutputIt out, const DecimalFP& f, + const basic_format_specs& specs, + float_specs fspecs, locale_ref loc) + -> OutputIt { + auto significand = f.significand; + int significand_size = get_significand_size(f); + const Char zero = static_cast('0'); + auto sign = fspecs.sign; + size_t size = to_unsigned(significand_size) + (sign ? 1 : 0); + using iterator = reserve_iterator; + + Char decimal_point = + fspecs.locale ? detail::decimal_point(loc) : static_cast('.'); + + int output_exp = f.exponent + significand_size - 1; + auto use_exp_format = [=]() { + if (fspecs.format == float_format::exp) return true; + if (fspecs.format != float_format::general) return false; + // Use the fixed notation if the exponent is in [exp_lower, exp_upper), + // e.g. 0.0001 instead of 1e-04. Otherwise use the exponent notation. + const int exp_lower = -4, exp_upper = 16; + return output_exp < exp_lower || + output_exp >= (fspecs.precision > 0 ? fspecs.precision : exp_upper); + }; + if (use_exp_format()) { + int num_zeros = 0; + if (fspecs.showpoint) { + num_zeros = fspecs.precision - significand_size; + if (num_zeros < 0) num_zeros = 0; + size += to_unsigned(num_zeros); + } else if (significand_size == 1) { + decimal_point = Char(); + } + auto abs_output_exp = output_exp >= 0 ? output_exp : -output_exp; + int exp_digits = 2; + if (abs_output_exp >= 100) exp_digits = abs_output_exp >= 1000 ? 4 : 3; + + size += to_unsigned((decimal_point ? 1 : 0) + 2 + exp_digits); + char exp_char = fspecs.upper ? 'E' : 'e'; + auto write = [=](iterator it) { + if (sign) *it++ = detail::sign(sign); + // Insert a decimal point after the first digit and add an exponent. + it = write_significand(it, significand, significand_size, 1, + decimal_point); + if (num_zeros > 0) it = detail::fill_n(it, num_zeros, zero); + *it++ = static_cast(exp_char); + return write_exponent(output_exp, it); + }; + return specs.width > 0 ? write_padded(out, specs, size, write) + : base_iterator(out, write(reserve(out, size))); + } + + int exp = f.exponent + significand_size; + if (f.exponent >= 0) { + // 1234e5 -> 123400000[.0+] + size += to_unsigned(f.exponent); + int num_zeros = fspecs.precision - exp; + abort_fuzzing_if(num_zeros > 5000); + if (fspecs.showpoint) { + ++size; + if (num_zeros <= 0 && fspecs.format != float_format::fixed) num_zeros = 1; + if (num_zeros > 0) size += to_unsigned(num_zeros); + } + auto grouping = Grouping(loc, fspecs.locale); + size += to_unsigned(grouping.count_separators(exp)); + return write_padded(out, specs, size, [&](iterator it) { + if (sign) *it++ = detail::sign(sign); + it = write_significand(it, significand, significand_size, + f.exponent, grouping); + if (!fspecs.showpoint) return it; + *it++ = decimal_point; + return num_zeros > 0 ? detail::fill_n(it, num_zeros, zero) : it; + }); + } else if (exp > 0) { + // 1234e-2 -> 12.34[0+] + int num_zeros = fspecs.showpoint ? fspecs.precision - significand_size : 0; + size += 1 + to_unsigned(num_zeros > 0 ? num_zeros : 0); + auto grouping = Grouping(loc, fspecs.locale); + size += to_unsigned(grouping.count_separators(significand_size)); + return write_padded(out, specs, size, [&](iterator it) { + if (sign) *it++ = detail::sign(sign); + it = write_significand(it, significand, significand_size, exp, + decimal_point, grouping); + return num_zeros > 0 ? detail::fill_n(it, num_zeros, zero) : it; + }); + } + // 1234e-6 -> 0.001234 + int num_zeros = -exp; + if (significand_size == 0 && fspecs.precision >= 0 && + fspecs.precision < num_zeros) { + num_zeros = fspecs.precision; + } + bool pointy = num_zeros != 0 || significand_size != 0 || fspecs.showpoint; + size += 1 + (pointy ? 1 : 0) + to_unsigned(num_zeros); + return write_padded(out, specs, size, [&](iterator it) { + if (sign) *it++ = detail::sign(sign); + *it++ = zero; + if (!pointy) return it; + *it++ = decimal_point; + it = detail::fill_n(it, num_zeros, zero); + return write_significand(it, significand, significand_size); + }); +} + +template class fallback_digit_grouping { + public: + constexpr fallback_digit_grouping(locale_ref, bool) {} + + constexpr Char separator() const { return Char(); } + + constexpr int count_separators(int) const { return 0; } + + template + constexpr Out apply(Out out, basic_string_view) const { + return out; + } +}; + +template +FMT_CONSTEXPR20 auto write_float(OutputIt out, const DecimalFP& f, + const basic_format_specs& specs, + float_specs fspecs, locale_ref loc) + -> OutputIt { + if (is_constant_evaluated()) { + return do_write_float>(out, f, specs, fspecs, + loc); + } else { + return do_write_float(out, f, specs, fspecs, loc); + } +} + +template constexpr bool isnan(T value) { + return !(value >= value); // std::isnan doesn't support __float128. +} + +template +struct has_isfinite : std::false_type {}; + +template +struct has_isfinite> + : std::true_type {}; + +template ::value&& + has_isfinite::value)> +FMT_CONSTEXPR20 bool isfinite(T value) { + constexpr T inf = T(std::numeric_limits::infinity()); + if (is_constant_evaluated()) + return !detail::isnan(value) && value != inf && value != -inf; + return std::isfinite(value); +} +template ::value)> +FMT_CONSTEXPR bool isfinite(T value) { + T inf = T(std::numeric_limits::infinity()); + // std::isfinite doesn't support __float128. + return !detail::isnan(value) && value != inf && value != -inf; +} + +template ::value)> +FMT_INLINE FMT_CONSTEXPR bool signbit(T value) { + if (is_constant_evaluated()) { +#ifdef __cpp_if_constexpr + if constexpr (std::numeric_limits::is_iec559) { + auto bits = detail::bit_cast(static_cast(value)); + return (bits >> (num_bits() - 1)) != 0; + } +#endif + } + return std::signbit(static_cast(value)); +} + +enum class round_direction { unknown, up, down }; + +// Given the divisor (normally a power of 10), the remainder = v % divisor for +// some number v and the error, returns whether v should be rounded up, down, or +// whether the rounding direction can't be determined due to error. +// error should be less than divisor / 2. +FMT_CONSTEXPR inline round_direction get_round_direction(uint64_t divisor, + uint64_t remainder, + uint64_t error) { + FMT_ASSERT(remainder < divisor, ""); // divisor - remainder won't overflow. + FMT_ASSERT(error < divisor, ""); // divisor - error won't overflow. + FMT_ASSERT(error < divisor - error, ""); // error * 2 won't overflow. + // Round down if (remainder + error) * 2 <= divisor. + if (remainder <= divisor - remainder && error * 2 <= divisor - remainder * 2) + return round_direction::down; + // Round up if (remainder - error) * 2 >= divisor. + if (remainder >= error && + remainder - error >= divisor - (remainder - error)) { + return round_direction::up; + } + return round_direction::unknown; +} + +namespace digits { +enum result { + more, // Generate more digits. + done, // Done generating digits. + error // Digit generation cancelled due to an error. +}; +} + +struct gen_digits_handler { + char* buf; + int size; + int precision; + int exp10; + bool fixed; + + FMT_CONSTEXPR digits::result on_digit(char digit, uint64_t divisor, + uint64_t remainder, uint64_t error, + bool integral) { + FMT_ASSERT(remainder < divisor, ""); + buf[size++] = digit; + if (!integral && error >= remainder) return digits::error; + if (size < precision) return digits::more; + if (!integral) { + // Check if error * 2 < divisor with overflow prevention. + // The check is not needed for the integral part because error = 1 + // and divisor > (1 << 32) there. + if (error >= divisor || error >= divisor - error) return digits::error; + } else { + FMT_ASSERT(error == 1 && divisor > 2, ""); + } + auto dir = get_round_direction(divisor, remainder, error); + if (dir != round_direction::up) + return dir == round_direction::down ? digits::done : digits::error; + ++buf[size - 1]; + for (int i = size - 1; i > 0 && buf[i] > '9'; --i) { + buf[i] = '0'; + ++buf[i - 1]; + } + if (buf[0] > '9') { + buf[0] = '1'; + if (fixed) + buf[size++] = '0'; + else + ++exp10; + } + return digits::done; + } +}; + +inline FMT_CONSTEXPR20 void adjust_precision(int& precision, int exp10) { + // Adjust fixed precision by exponent because it is relative to decimal + // point. + if (exp10 > 0 && precision > max_value() - exp10) + FMT_THROW(format_error("number is too big")); + precision += exp10; +} + +// Generates output using the Grisu digit-gen algorithm. +// error: the size of the region (lower, upper) outside of which numbers +// definitely do not round to value (Delta in Grisu3). +FMT_INLINE FMT_CONSTEXPR20 auto grisu_gen_digits(fp value, uint64_t error, + int& exp, + gen_digits_handler& handler) + -> digits::result { + const fp one(1ULL << -value.e, value.e); + // The integral part of scaled value (p1 in Grisu) = value / one. It cannot be + // zero because it contains a product of two 64-bit numbers with MSB set (due + // to normalization) - 1, shifted right by at most 60 bits. + auto integral = static_cast(value.f >> -one.e); + FMT_ASSERT(integral != 0, ""); + FMT_ASSERT(integral == value.f >> -one.e, ""); + // The fractional part of scaled value (p2 in Grisu) c = value % one. + uint64_t fractional = value.f & (one.f - 1); + exp = count_digits(integral); // kappa in Grisu. + // Non-fixed formats require at least one digit and no precision adjustment. + if (handler.fixed) { + adjust_precision(handler.precision, exp + handler.exp10); + // Check if precision is satisfied just by leading zeros, e.g. + // format("{:.2f}", 0.001) gives "0.00" without generating any digits. + if (handler.precision <= 0) { + if (handler.precision < 0) return digits::done; + // Divide by 10 to prevent overflow. + uint64_t divisor = data::power_of_10_64[exp - 1] << -one.e; + auto dir = get_round_direction(divisor, value.f / 10, error * 10); + if (dir == round_direction::unknown) return digits::error; + handler.buf[handler.size++] = dir == round_direction::up ? '1' : '0'; + return digits::done; + } + } + // Generate digits for the integral part. This can produce up to 10 digits. + do { + uint32_t digit = 0; + auto divmod_integral = [&](uint32_t divisor) { + digit = integral / divisor; + integral %= divisor; + }; + // This optimization by Milo Yip reduces the number of integer divisions by + // one per iteration. + switch (exp) { + case 10: + divmod_integral(1000000000); + break; + case 9: + divmod_integral(100000000); + break; + case 8: + divmod_integral(10000000); + break; + case 7: + divmod_integral(1000000); + break; + case 6: + divmod_integral(100000); + break; + case 5: + divmod_integral(10000); + break; + case 4: + divmod_integral(1000); + break; + case 3: + divmod_integral(100); + break; + case 2: + divmod_integral(10); + break; + case 1: + digit = integral; + integral = 0; + break; + default: + FMT_ASSERT(false, "invalid number of digits"); + } + --exp; + auto remainder = (static_cast(integral) << -one.e) + fractional; + auto result = handler.on_digit(static_cast('0' + digit), + data::power_of_10_64[exp] << -one.e, + remainder, error, true); + if (result != digits::more) return result; + } while (exp > 0); + // Generate digits for the fractional part. + for (;;) { + fractional *= 10; + error *= 10; + char digit = static_cast('0' + (fractional >> -one.e)); + fractional &= one.f - 1; + --exp; + auto result = handler.on_digit(digit, one.f, fractional, error, false); + if (result != digits::more) return result; + } +} + +class bigint { + private: + // A bigint is stored as an array of bigits (big digits), with bigit at index + // 0 being the least significant one. + using bigit = uint32_t; + using double_bigit = uint64_t; + enum { bigits_capacity = 32 }; + basic_memory_buffer bigits_; + int exp_; + + FMT_CONSTEXPR20 bigit operator[](int index) const { + return bigits_[to_unsigned(index)]; + } + FMT_CONSTEXPR20 bigit& operator[](int index) { + return bigits_[to_unsigned(index)]; + } + + static constexpr const int bigit_bits = num_bits(); + + friend struct formatter; + + FMT_CONSTEXPR20 void subtract_bigits(int index, bigit other, bigit& borrow) { + auto result = static_cast((*this)[index]) - other - borrow; + (*this)[index] = static_cast(result); + borrow = static_cast(result >> (bigit_bits * 2 - 1)); + } + + FMT_CONSTEXPR20 void remove_leading_zeros() { + int num_bigits = static_cast(bigits_.size()) - 1; + while (num_bigits > 0 && (*this)[num_bigits] == 0) --num_bigits; + bigits_.resize(to_unsigned(num_bigits + 1)); + } + + // Computes *this -= other assuming aligned bigints and *this >= other. + FMT_CONSTEXPR20 void subtract_aligned(const bigint& other) { + FMT_ASSERT(other.exp_ >= exp_, "unaligned bigints"); + FMT_ASSERT(compare(*this, other) >= 0, ""); + bigit borrow = 0; + int i = other.exp_ - exp_; + for (size_t j = 0, n = other.bigits_.size(); j != n; ++i, ++j) + subtract_bigits(i, other.bigits_[j], borrow); + while (borrow > 0) subtract_bigits(i, 0, borrow); + remove_leading_zeros(); + } + + FMT_CONSTEXPR20 void multiply(uint32_t value) { + const double_bigit wide_value = value; + bigit carry = 0; + for (size_t i = 0, n = bigits_.size(); i < n; ++i) { + double_bigit result = bigits_[i] * wide_value + carry; + bigits_[i] = static_cast(result); + carry = static_cast(result >> bigit_bits); + } + if (carry != 0) bigits_.push_back(carry); + } + + template ::value || + std::is_same::value)> + FMT_CONSTEXPR20 void multiply(UInt value) { + using half_uint = + conditional_t::value, uint64_t, uint32_t>; + const int shift = num_bits() - bigit_bits; + const UInt lower = static_cast(value); + const UInt upper = value >> num_bits(); + UInt carry = 0; + for (size_t i = 0, n = bigits_.size(); i < n; ++i) { + UInt result = lower * bigits_[i] + static_cast(carry); + carry = (upper * bigits_[i] << shift) + (result >> bigit_bits) + + (carry >> bigit_bits); + bigits_[i] = static_cast(result); + } + while (carry != 0) { + bigits_.push_back(static_cast(carry)); + carry >>= bigit_bits; + } + } + + template ::value || + std::is_same::value)> + FMT_CONSTEXPR20 void assign(UInt n) { + size_t num_bigits = 0; + do { + bigits_[num_bigits++] = static_cast(n); + n >>= bigit_bits; + } while (n != 0); + bigits_.resize(num_bigits); + exp_ = 0; + } + + public: + FMT_CONSTEXPR20 bigint() : exp_(0) {} + explicit bigint(uint64_t n) { assign(n); } + + bigint(const bigint&) = delete; + void operator=(const bigint&) = delete; + + FMT_CONSTEXPR20 void assign(const bigint& other) { + auto size = other.bigits_.size(); + bigits_.resize(size); + auto data = other.bigits_.data(); + std::copy(data, data + size, make_checked(bigits_.data(), size)); + exp_ = other.exp_; + } + + template FMT_CONSTEXPR20 void operator=(Int n) { + FMT_ASSERT(n > 0, ""); + assign(uint64_or_128_t(n)); + } + + FMT_CONSTEXPR20 int num_bigits() const { + return static_cast(bigits_.size()) + exp_; + } + + FMT_NOINLINE FMT_CONSTEXPR20 bigint& operator<<=(int shift) { + FMT_ASSERT(shift >= 0, ""); + exp_ += shift / bigit_bits; + shift %= bigit_bits; + if (shift == 0) return *this; + bigit carry = 0; + for (size_t i = 0, n = bigits_.size(); i < n; ++i) { + bigit c = bigits_[i] >> (bigit_bits - shift); + bigits_[i] = (bigits_[i] << shift) + carry; + carry = c; + } + if (carry != 0) bigits_.push_back(carry); + return *this; + } + + template FMT_CONSTEXPR20 bigint& operator*=(Int value) { + FMT_ASSERT(value > 0, ""); + multiply(uint32_or_64_or_128_t(value)); + return *this; + } + + friend FMT_CONSTEXPR20 int compare(const bigint& lhs, const bigint& rhs) { + int num_lhs_bigits = lhs.num_bigits(), num_rhs_bigits = rhs.num_bigits(); + if (num_lhs_bigits != num_rhs_bigits) + return num_lhs_bigits > num_rhs_bigits ? 1 : -1; + int i = static_cast(lhs.bigits_.size()) - 1; + int j = static_cast(rhs.bigits_.size()) - 1; + int end = i - j; + if (end < 0) end = 0; + for (; i >= end; --i, --j) { + bigit lhs_bigit = lhs[i], rhs_bigit = rhs[j]; + if (lhs_bigit != rhs_bigit) return lhs_bigit > rhs_bigit ? 1 : -1; + } + if (i != j) return i > j ? 1 : -1; + return 0; + } + + // Returns compare(lhs1 + lhs2, rhs). + friend FMT_CONSTEXPR20 int add_compare(const bigint& lhs1, const bigint& lhs2, + const bigint& rhs) { + auto minimum = [](int a, int b) { return a < b ? a : b; }; + auto maximum = [](int a, int b) { return a > b ? a : b; }; + int max_lhs_bigits = maximum(lhs1.num_bigits(), lhs2.num_bigits()); + int num_rhs_bigits = rhs.num_bigits(); + if (max_lhs_bigits + 1 < num_rhs_bigits) return -1; + if (max_lhs_bigits > num_rhs_bigits) return 1; + auto get_bigit = [](const bigint& n, int i) -> bigit { + return i >= n.exp_ && i < n.num_bigits() ? n[i - n.exp_] : 0; + }; + double_bigit borrow = 0; + int min_exp = minimum(minimum(lhs1.exp_, lhs2.exp_), rhs.exp_); + for (int i = num_rhs_bigits - 1; i >= min_exp; --i) { + double_bigit sum = + static_cast(get_bigit(lhs1, i)) + get_bigit(lhs2, i); + bigit rhs_bigit = get_bigit(rhs, i); + if (sum > rhs_bigit + borrow) return 1; + borrow = rhs_bigit + borrow - sum; + if (borrow > 1) return -1; + borrow <<= bigit_bits; + } + return borrow != 0 ? -1 : 0; + } + + // Assigns pow(10, exp) to this bigint. + FMT_CONSTEXPR20 void assign_pow10(int exp) { + FMT_ASSERT(exp >= 0, ""); + if (exp == 0) return *this = 1; + // Find the top bit. + int bitmask = 1; + while (exp >= bitmask) bitmask <<= 1; + bitmask >>= 1; + // pow(10, exp) = pow(5, exp) * pow(2, exp). First compute pow(5, exp) by + // repeated squaring and multiplication. + *this = 5; + bitmask >>= 1; + while (bitmask != 0) { + square(); + if ((exp & bitmask) != 0) *this *= 5; + bitmask >>= 1; + } + *this <<= exp; // Multiply by pow(2, exp) by shifting. + } + + FMT_CONSTEXPR20 void square() { + int num_bigits = static_cast(bigits_.size()); + int num_result_bigits = 2 * num_bigits; + basic_memory_buffer n(std::move(bigits_)); + bigits_.resize(to_unsigned(num_result_bigits)); + auto sum = uint128_t(); + for (int bigit_index = 0; bigit_index < num_bigits; ++bigit_index) { + // Compute bigit at position bigit_index of the result by adding + // cross-product terms n[i] * n[j] such that i + j == bigit_index. + for (int i = 0, j = bigit_index; j >= 0; ++i, --j) { + // Most terms are multiplied twice which can be optimized in the future. + sum += static_cast(n[i]) * n[j]; + } + (*this)[bigit_index] = static_cast(sum); + sum >>= num_bits(); // Compute the carry. + } + // Do the same for the top half. + for (int bigit_index = num_bigits; bigit_index < num_result_bigits; + ++bigit_index) { + for (int j = num_bigits - 1, i = bigit_index - j; i < num_bigits;) + sum += static_cast(n[i++]) * n[j--]; + (*this)[bigit_index] = static_cast(sum); + sum >>= num_bits(); + } + remove_leading_zeros(); + exp_ *= 2; + } + + // If this bigint has a bigger exponent than other, adds trailing zero to make + // exponents equal. This simplifies some operations such as subtraction. + FMT_CONSTEXPR20 void align(const bigint& other) { + int exp_difference = exp_ - other.exp_; + if (exp_difference <= 0) return; + int num_bigits = static_cast(bigits_.size()); + bigits_.resize(to_unsigned(num_bigits + exp_difference)); + for (int i = num_bigits - 1, j = i + exp_difference; i >= 0; --i, --j) + bigits_[j] = bigits_[i]; + std::uninitialized_fill_n(bigits_.data(), exp_difference, 0); + exp_ -= exp_difference; + } + + // Divides this bignum by divisor, assigning the remainder to this and + // returning the quotient. + FMT_CONSTEXPR20 int divmod_assign(const bigint& divisor) { + FMT_ASSERT(this != &divisor, ""); + if (compare(*this, divisor) < 0) return 0; + FMT_ASSERT(divisor.bigits_[divisor.bigits_.size() - 1u] != 0, ""); + align(divisor); + int quotient = 0; + do { + subtract_aligned(divisor); + ++quotient; + } while (compare(*this, divisor) >= 0); + return quotient; + } +}; + +// format_dragon flags. +enum dragon { + predecessor_closer = 1, + fixup = 2, // Run fixup to correct exp10 which can be off by one. + fixed = 4, +}; + +// Formats a floating-point number using a variation of the Fixed-Precision +// Positive Floating-Point Printout ((FPP)^2) algorithm by Steele & White: +// https://fmt.dev/papers/p372-steele.pdf. +FMT_CONSTEXPR20 inline void format_dragon(basic_fp value, + unsigned flags, int num_digits, + buffer& buf, int& exp10) { + bigint numerator; // 2 * R in (FPP)^2. + bigint denominator; // 2 * S in (FPP)^2. + // lower and upper are differences between value and corresponding boundaries. + bigint lower; // (M^- in (FPP)^2). + bigint upper_store; // upper's value if different from lower. + bigint* upper = nullptr; // (M^+ in (FPP)^2). + // Shift numerator and denominator by an extra bit or two (if lower boundary + // is closer) to make lower and upper integers. This eliminates multiplication + // by 2 during later computations. + bool is_predecessor_closer = (flags & dragon::predecessor_closer) != 0; + int shift = is_predecessor_closer ? 2 : 1; + if (value.e >= 0) { + numerator = value.f; + numerator <<= value.e + shift; + lower = 1; + lower <<= value.e; + if (is_predecessor_closer) { + upper_store = 1; + upper_store <<= value.e + 1; + upper = &upper_store; + } + denominator.assign_pow10(exp10); + denominator <<= shift; + } else if (exp10 < 0) { + numerator.assign_pow10(-exp10); + lower.assign(numerator); + if (is_predecessor_closer) { + upper_store.assign(numerator); + upper_store <<= 1; + upper = &upper_store; + } + numerator *= value.f; + numerator <<= shift; + denominator = 1; + denominator <<= shift - value.e; + } else { + numerator = value.f; + numerator <<= shift; + denominator.assign_pow10(exp10); + denominator <<= shift - value.e; + lower = 1; + if (is_predecessor_closer) { + upper_store = 1ULL << 1; + upper = &upper_store; + } + } + int even = static_cast((value.f & 1) == 0); + if (!upper) upper = &lower; + if ((flags & dragon::fixup) != 0) { + if (add_compare(numerator, *upper, denominator) + even <= 0) { + --exp10; + numerator *= 10; + if (num_digits < 0) { + lower *= 10; + if (upper != &lower) *upper *= 10; + } + } + if ((flags & dragon::fixed) != 0) adjust_precision(num_digits, exp10 + 1); + } + // Invariant: value == (numerator / denominator) * pow(10, exp10). + if (num_digits < 0) { + // Generate the shortest representation. + num_digits = 0; + char* data = buf.data(); + for (;;) { + int digit = numerator.divmod_assign(denominator); + bool low = compare(numerator, lower) - even < 0; // numerator <[=] lower. + // numerator + upper >[=] pow10: + bool high = add_compare(numerator, *upper, denominator) + even > 0; + data[num_digits++] = static_cast('0' + digit); + if (low || high) { + if (!low) { + ++data[num_digits - 1]; + } else if (high) { + int result = add_compare(numerator, numerator, denominator); + // Round half to even. + if (result > 0 || (result == 0 && (digit % 2) != 0)) + ++data[num_digits - 1]; + } + buf.try_resize(to_unsigned(num_digits)); + exp10 -= num_digits - 1; + return; + } + numerator *= 10; + lower *= 10; + if (upper != &lower) *upper *= 10; + } + } + // Generate the given number of digits. + exp10 -= num_digits - 1; + if (num_digits == 0) { + denominator *= 10; + auto digit = add_compare(numerator, numerator, denominator) > 0 ? '1' : '0'; + buf.push_back(digit); + return; + } + buf.try_resize(to_unsigned(num_digits)); + for (int i = 0; i < num_digits - 1; ++i) { + int digit = numerator.divmod_assign(denominator); + buf[i] = static_cast('0' + digit); + numerator *= 10; + } + int digit = numerator.divmod_assign(denominator); + auto result = add_compare(numerator, numerator, denominator); + if (result > 0 || (result == 0 && (digit % 2) != 0)) { + if (digit == 9) { + const auto overflow = '0' + 10; + buf[num_digits - 1] = overflow; + // Propagate the carry. + for (int i = num_digits - 1; i > 0 && buf[i] == overflow; --i) { + buf[i] = '0'; + ++buf[i - 1]; + } + if (buf[0] == overflow) { + buf[0] = '1'; + ++exp10; + } + return; + } + ++digit; + } + buf[num_digits - 1] = static_cast('0' + digit); +} + +template +FMT_CONSTEXPR20 auto format_float(Float value, int precision, float_specs specs, + buffer& buf) -> int { + // float is passed as double to reduce the number of instantiations. + static_assert(!std::is_same::value, ""); + FMT_ASSERT(value >= 0, "value is negative"); + auto converted_value = convert_float(value); + + const bool fixed = specs.format == float_format::fixed; + if (value <= 0) { // <= instead of == to silence a warning. + if (precision <= 0 || !fixed) { + buf.push_back('0'); + return 0; + } + buf.try_resize(to_unsigned(precision)); + fill_n(buf.data(), precision, '0'); + return -precision; + } + + int exp = 0; + bool use_dragon = true; + unsigned dragon_flags = 0; + if (!is_fast_float()) { + const auto inv_log2_10 = 0.3010299956639812; // 1 / log2(10) + using info = dragonbox::float_info; + const auto f = basic_fp(converted_value); + // Compute exp, an approximate power of 10, such that + // 10^(exp - 1) <= value < 10^exp or 10^exp <= value < 10^(exp + 1). + // This is based on log10(value) == log2(value) / log2(10) and approximation + // of log2(value) by e + num_fraction_bits idea from double-conversion. + exp = static_cast( + std::ceil((f.e + count_digits<1>(f.f) - 1) * inv_log2_10 - 1e-10)); + dragon_flags = dragon::fixup; + } else if (!is_constant_evaluated() && precision < 0) { + // Use Dragonbox for the shortest format. + if (specs.binary32) { + auto dec = dragonbox::to_decimal(static_cast(value)); + write(buffer_appender(buf), dec.significand); + return dec.exponent; + } + auto dec = dragonbox::to_decimal(static_cast(value)); + write(buffer_appender(buf), dec.significand); + return dec.exponent; + } else { + // Use Grisu + Dragon4 for the given precision: + // https://www.cs.tufts.edu/~nr/cs257/archive/florian-loitsch/printf.pdf. + const int min_exp = -60; // alpha in Grisu. + int cached_exp10 = 0; // K in Grisu. + fp normalized = normalize(fp(converted_value)); + const auto cached_pow = get_cached_power( + min_exp - (normalized.e + fp::num_significand_bits), cached_exp10); + normalized = normalized * cached_pow; + gen_digits_handler handler{buf.data(), 0, precision, -cached_exp10, fixed}; + if (grisu_gen_digits(normalized, 1, exp, handler) != digits::error && + !is_constant_evaluated()) { + exp += handler.exp10; + buf.try_resize(to_unsigned(handler.size)); + use_dragon = false; + } else { + exp += handler.size - cached_exp10 - 1; + precision = handler.precision; + } + } + if (use_dragon) { + auto f = basic_fp(); + bool is_predecessor_closer = specs.binary32 + ? f.assign(static_cast(value)) + : f.assign(converted_value); + if (is_predecessor_closer) dragon_flags |= dragon::predecessor_closer; + if (fixed) dragon_flags |= dragon::fixed; + // Limit precision to the maximum possible number of significant digits in + // an IEEE754 double because we don't need to generate zeros. + const int max_double_digits = 767; + if (precision > max_double_digits) precision = max_double_digits; + format_dragon(f, dragon_flags, precision, buf, exp); + } + if (!fixed && !specs.showpoint) { + // Remove trailing zeros. + auto num_digits = buf.size(); + while (num_digits > 0 && buf[num_digits - 1] == '0') { + --num_digits; + ++exp; + } + buf.try_resize(num_digits); + } + return exp; +} + +template ::value)> +FMT_CONSTEXPR20 auto write(OutputIt out, T value, + basic_format_specs specs, locale_ref loc = {}) + -> OutputIt { + if (const_check(!is_supported_floating_point(value))) return out; + float_specs fspecs = parse_float_type_spec(specs); + fspecs.sign = specs.sign; + if (detail::signbit(value)) { // value < 0 is false for NaN so use signbit. + fspecs.sign = sign::minus; + value = -value; + } else if (fspecs.sign == sign::minus) { + fspecs.sign = sign::none; + } + + if (!detail::isfinite(value)) + return write_nonfinite(out, detail::isnan(value), specs, fspecs); + + if (specs.align == align::numeric && fspecs.sign) { + auto it = reserve(out, 1); + *it++ = detail::sign(fspecs.sign); + out = base_iterator(out, it); + fspecs.sign = sign::none; + if (specs.width != 0) --specs.width; + } + + memory_buffer buffer; + if (fspecs.format == float_format::hex) { + if (fspecs.sign) buffer.push_back(detail::sign(fspecs.sign)); + snprintf_float(convert_float(value), specs.precision, fspecs, buffer); + return write_bytes(out, {buffer.data(), buffer.size()}, + specs); + } + int precision = specs.precision >= 0 || specs.type == presentation_type::none + ? specs.precision + : 6; + if (fspecs.format == float_format::exp) { + if (precision == max_value()) + throw_format_error("number is too big"); + else + ++precision; + } else if (fspecs.format != float_format::fixed && precision == 0) { + precision = 1; + } + if (const_check(std::is_same())) fspecs.binary32 = true; + int exp = format_float(convert_float(value), precision, fspecs, buffer); + fspecs.precision = precision; + auto f = big_decimal_fp{buffer.data(), static_cast(buffer.size()), exp}; + return write_float(out, f, specs, fspecs, loc); +} + +template ::value)> +FMT_CONSTEXPR20 auto write(OutputIt out, T value) -> OutputIt { + if (is_constant_evaluated()) + return write(out, value, basic_format_specs()); + if (const_check(!is_supported_floating_point(value))) return out; + + auto fspecs = float_specs(); + if (detail::signbit(value)) { + fspecs.sign = sign::minus; + value = -value; + } + + constexpr auto specs = basic_format_specs(); + using floaty = conditional_t::value, double, T>; + using uint = typename dragonbox::float_info::carrier_uint; + uint mask = exponent_mask(); + if ((bit_cast(value) & mask) == mask) + return write_nonfinite(out, std::isnan(value), specs, fspecs); + + auto dec = dragonbox::to_decimal(static_cast(value)); + return write_float(out, dec, specs, fspecs, {}); +} + +template ::value && + !is_fast_float::value)> +inline auto write(OutputIt out, T value) -> OutputIt { + return write(out, value, basic_format_specs()); +} + +template +auto write(OutputIt out, monostate, basic_format_specs = {}, + locale_ref = {}) -> OutputIt { + FMT_ASSERT(false, ""); + return out; +} + +template +FMT_CONSTEXPR auto write(OutputIt out, basic_string_view value) + -> OutputIt { + auto it = reserve(out, value.size()); + it = copy_str_noinline(value.begin(), value.end(), it); + return base_iterator(out, it); +} + +template ::value)> +constexpr auto write(OutputIt out, const T& value) -> OutputIt { + return write(out, to_string_view(value)); +} + +// FMT_ENABLE_IF() condition separated to workaround an MSVC bug. +template < + typename Char, typename OutputIt, typename T, + bool check = + std::is_enum::value && !std::is_same::value && + mapped_type_constant>::value != + type::custom_type, + FMT_ENABLE_IF(check)> +FMT_CONSTEXPR auto write(OutputIt out, T value) -> OutputIt { + return write(out, static_cast>(value)); +} + +template ::value)> +FMT_CONSTEXPR auto write(OutputIt out, T value, + const basic_format_specs& specs = {}, + locale_ref = {}) -> OutputIt { + return specs.type != presentation_type::none && + specs.type != presentation_type::string + ? write(out, value ? 1 : 0, specs, {}) + : write_bytes(out, value ? "true" : "false", specs); +} + +template +FMT_CONSTEXPR auto write(OutputIt out, Char value) -> OutputIt { + auto it = reserve(out, 1); + *it++ = value; + return base_iterator(out, it); +} + +template +FMT_CONSTEXPR_CHAR_TRAITS auto write(OutputIt out, const Char* value) + -> OutputIt { + if (!value) { + throw_format_error("string pointer is null"); + } else { + out = write(out, basic_string_view(value)); + } + return out; +} + +template ::value)> +auto write(OutputIt out, const T* value, + const basic_format_specs& specs = {}, locale_ref = {}) + -> OutputIt { + check_pointer_type_spec(specs.type, error_handler()); + return write_ptr(out, bit_cast(value), &specs); +} + +// A write overload that handles implicit conversions. +template > +FMT_CONSTEXPR auto write(OutputIt out, const T& value) -> enable_if_t< + std::is_class::value && !is_string::value && + !is_floating_point::value && !std::is_same::value && + !std::is_same().map(value))>::value, + OutputIt> { + return write(out, arg_mapper().map(value)); +} + +template > +FMT_CONSTEXPR auto write(OutputIt out, const T& value) + -> enable_if_t::value == type::custom_type, + OutputIt> { + using formatter_type = + conditional_t::value, + typename Context::template formatter_type, + fallback_formatter>; + auto ctx = Context(out, {}, {}); + return formatter_type().format(value, ctx); +} + +// An argument visitor that formats the argument and writes it via the output +// iterator. It's a class and not a generic lambda for compatibility with C++11. +template struct default_arg_formatter { + using iterator = buffer_appender; + using context = buffer_context; + + iterator out; + basic_format_args args; + locale_ref loc; + + template auto operator()(T value) -> iterator { + return write(out, value); + } + auto operator()(typename basic_format_arg::handle h) -> iterator { + basic_format_parse_context parse_ctx({}); + context format_ctx(out, args, loc); + h.format(parse_ctx, format_ctx); + return format_ctx.out(); + } +}; + +template struct arg_formatter { + using iterator = buffer_appender; + using context = buffer_context; + + iterator out; + const basic_format_specs& specs; + locale_ref locale; + + template + FMT_CONSTEXPR FMT_INLINE auto operator()(T value) -> iterator { + return detail::write(out, value, specs, locale); + } + auto operator()(typename basic_format_arg::handle) -> iterator { + // User-defined types are handled separately because they require access + // to the parse context. + return out; + } +}; + +template struct custom_formatter { + basic_format_parse_context& parse_ctx; + buffer_context& ctx; + + void operator()( + typename basic_format_arg>::handle h) const { + h.format(parse_ctx, ctx); + } + template void operator()(T) const {} +}; + +template +using is_integer = + bool_constant::value && !std::is_same::value && + !std::is_same::value && + !std::is_same::value>; + +template class width_checker { + public: + explicit FMT_CONSTEXPR width_checker(ErrorHandler& eh) : handler_(eh) {} + + template ::value)> + FMT_CONSTEXPR auto operator()(T value) -> unsigned long long { + if (is_negative(value)) handler_.on_error("negative width"); + return static_cast(value); + } + + template ::value)> + FMT_CONSTEXPR auto operator()(T) -> unsigned long long { + handler_.on_error("width is not integer"); + return 0; + } + + private: + ErrorHandler& handler_; +}; + +template class precision_checker { + public: + explicit FMT_CONSTEXPR precision_checker(ErrorHandler& eh) : handler_(eh) {} + + template ::value)> + FMT_CONSTEXPR auto operator()(T value) -> unsigned long long { + if (is_negative(value)) handler_.on_error("negative precision"); + return static_cast(value); + } + + template ::value)> + FMT_CONSTEXPR auto operator()(T) -> unsigned long long { + handler_.on_error("precision is not integer"); + return 0; + } + + private: + ErrorHandler& handler_; +}; + +template