diff --git a/.appveyor.yml b/.appveyor.yml index 627755ba2a..26e41f796f 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -11,18 +11,15 @@ skip_commits: # Add [av skip] to commit messages message: /\[av skip\]/ -cache: - - '%APPVEYOR_BUILD_FOLDER%\build' - environment: global: - CONDA_INSTALL_LOCN: C:\\Miniconda36-x64 + CONDA_INSTALL_LOCN: C:\\Miniconda37-x64 + CTEST_OUTPUT_ON_FAILURE: 1 install: - call %CONDA_INSTALL_LOCN%\Scripts\activate.bat - - conda config --set auto_update_conda false - - conda config --add channels conda-forge --force - - conda install --yes --quiet flang jom +# - conda config --set auto_update_conda false + - conda install -c conda-forge --yes --quiet flang=11.0.1 jom - call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" amd64 - set "LIB=%CONDA_INSTALL_LOCN%\Library\lib;%LIB%" - set "CPATH=%CONDA_INSTALL_LOCN%\Library\include;%CPATH%" diff --git a/.github/SECURITY.md b/.github/SECURITY.md new file mode 100644 index 0000000000..b5b57624a7 --- /dev/null +++ b/.github/SECURITY.md @@ -0,0 +1,13 @@ +# Security Policy + +## Supported Versions + +Security updates are applied only to the latest release. + +## Reporting a Vulnerability + +If you have discovered a security vulnerability in this project, please report it privately. **Do not disclose it as a public issue.** This gives us time to work with you to fix the issue before public exposure, reducing the chance that the exploit will be used before a patch is released. + +Please disclose it at [security advisory](https://github.com/Reference-LAPACK/lapack/security/advisories/new). + +This project is maintained by a team of volunteers on a reasonable-effort basis. As such, please give us at least 90 days to work on a fix before public exposure. diff --git a/.github/julia/build_tarballs.jl b/.github/julia/build_tarballs.jl new file mode 100644 index 0000000000..1a003ce345 --- /dev/null +++ b/.github/julia/build_tarballs.jl @@ -0,0 +1,65 @@ +using BinaryBuilder, Pkg + +haskey(ENV, "BLAS_LAPACK_RELEASE") || error("The environment variable BLAS_LAPACK_RELEASE is not defined.") +haskey(ENV, "BLAS_LAPACK_COMMIT") || error("The environment variable BLAS_LAPACK_COMMIT is not defined.") +haskey(ENV, "BLAS_LAPACK_URL") || error("The environment variable BLAS_LAPACK_URL is not defined.") + +name = "blas_lapack" +version = VersionNumber(ENV["BLAS_LAPACK_RELEASE"]) + +# Collection of sources required to complete build +sources = [ + GitSource(ENV["BLAS_LAPACK_URL"], ENV["BLAS_LAPACK_COMMIT"]) +] + +# Bash recipe for building across all platforms +script = raw""" +cd ${WORKSPACE}/srcdir/lapack + +# FortranCInterface_VERIFY fails on macOS, but it's not actually needed for the current build +sed -i 's/FortranCInterface_VERIFY/# FortranCInterface_VERIFY/g' ./CBLAS/CMakeLists.txt +sed -i 's/FortranCInterface_VERIFY/# FortranCInterface_VERIFY/g' ./LAPACKE/include/CMakeLists.txt + +mkdir build && cd build +cmake .. \ + -DCBLAS=ON \ + -DLAPACKE=ON \ + -DCMAKE_INSTALL_PREFIX="$prefix" \ + -DCMAKE_FIND_ROOT_PATH="$prefix" \ + -DCMAKE_TOOLCHAIN_FILE="${CMAKE_TARGET_TOOLCHAIN}" \ + -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_SHARED_LIBS=OFF \ + -DBUILD_INDEX64_EXT_API=OFF \ + -DTEST_FORTRAN_COMPILER=OFF \ + -DLAPACKE_WITH_TMG=OFF + +make -j${nproc} +make install + +install_license $WORKSPACE/srcdir/lapack/LICENSE +""" + +# These are the platforms we will build for by default, unless further +# platforms are passed in on the command line +platforms = supported_platforms() +platforms = expand_gfortran_versions(platforms) + +# The products that we will ensure are always built +products = [ + FileProduct("lib/libblas.a", :libblas_a), + FileProduct("lib/libcblas.a", :libcblas_a), + FileProduct("lib/liblapack.a", :liblapack_a), + FileProduct("lib/liblapacke.a", :liblapacke_a), + # LibraryProduct("libblas", :libblas), + # LibraryProduct("libcblas", :libcblas), + # LibraryProduct("liblapack", :liblapack), + # LibraryProduct("liblapacke", :liblapacke), +] + +# Dependencies that must be installed before this package can be built +dependencies = [ + Dependency(PackageSpec(name="CompilerSupportLibraries_jll", uuid="e66e0078-7015-5450-92f7-15fbd957f2ae")), +] + +# Build the tarballs, and possibly a `build.jl` as well. +build_tarballs(ARGS, name, version, sources, script, platforms, products, dependencies; julia_compat="1.6") diff --git a/.github/julia/generate_binaries.jl b/.github/julia/generate_binaries.jl new file mode 100644 index 0000000000..4ecb643a3a --- /dev/null +++ b/.github/julia/generate_binaries.jl @@ -0,0 +1,90 @@ +# Version +haskey(ENV, "BLAS_LAPACK_RELEASE") || error("The environment variable BLAS_LAPACK_RELEASE is not defined.") +version = VersionNumber(ENV["BLAS_LAPACK_RELEASE"]) +version2 = ENV["BLAS_LAPACK_RELEASE"] +package = "blas_lapack" + +platforms = [ + ("aarch64-apple-darwin-libgfortran5" , "lib", "dylib"), +# ("aarch64-linux-gnu-libgfortran3" , "lib", "so" ), +# ("aarch64-linux-gnu-libgfortran4" , "lib", "so" ), + ("aarch64-linux-gnu-libgfortran5" , "lib", "so" ), +# ("aarch64-linux-musl-libgfortran3" , "lib", "so" ), +# ("aarch64-linux-musl-libgfortran4" , "lib", "so" ), +# ("aarch64-linux-musl-libgfortran5" , "lib", "so" ), +# ("powerpc64le-linux-gnu-libgfortran3" , "lib", "so" ), +# ("powerpc64le-linux-gnu-libgfortran4" , "lib", "so" ), +# ("powerpc64le-linux-gnu-libgfortran5" , "lib", "so" ), +# ("x86_64-apple-darwin-libgfortran3" , "lib", "dylib"), +# ("x86_64-apple-darwin-libgfortran4" , "lib", "dylib"), + ("x86_64-apple-darwin-libgfortran5" , "lib", "dylib"), +# ("x86_64-linux-gnu-libgfortran3" , "lib", "so" ), +# ("x86_64-linux-gnu-libgfortran4" , "lib", "so" ), + ("x86_64-linux-gnu-libgfortran5" , "lib", "so" ), +# ("x86_64-linux-musl-libgfortran3" , "lib", "so" ), +# ("x86_64-linux-musl-libgfortran4" , "lib", "so" ), +# ("x86_64-linux-musl-libgfortran5" , "lib", "so" ), +# ("x86_64-unknown-freebsd-libgfortran3", "lib", "so" ), +# ("x86_64-unknown-freebsd-libgfortran4", "lib", "so" ), +# ("x86_64-unknown-freebsd-libgfortran5", "lib", "so" ), +# ("x86_64-w64-mingw32-libgfortran3" , "bin", "dll" ), +# ("x86_64-w64-mingw32-libgfortran4" , "bin", "dll" ), + ("x86_64-w64-mingw32-libgfortran5" , "bin", "dll" ), +] + + +for (platform, libdir, ext) in platforms + + tarball_name = "$package.v$version.$platform.tar.gz" + + if isfile("products/$(tarball_name)") + # Unzip the tarball generated by BinaryBuilder.jl + isdir("products/$platform") && rm("products/$platform", recursive=true) + mkdir("products/$platform") + run(`tar -xzf products/$(tarball_name) -C products/$platform`) + + if isfile("products/$platform/deps.tar.gz") + # Unzip the tarball of the dependencies + run(`tar -xzf products/$platform/deps.tar.gz -C products/$platform`) + + # Copy the license of each dependency + for folder in readdir("products/$platform/deps/licenses") + cp("products/$platform/deps/licenses/$folder", "products/$platform/share/licenses/$folder") + end + rm("products/$platform/deps/licenses", recursive=true) + + # Copy the shared library of each dependency + for file in readdir("products/$platform/deps") + cp("products/$platform/deps/$file", "products/$platform/$libdir/$file") + end + + # Remove the folder used to unzip the tarball of the dependencies + rm("products/$platform/deps", recursive=true) + rm("products/$platform/deps.tar.gz", recursive=true) + end + + # Create the archives *_binaries + isfile("$(package)_binaries.$version2.$platform.tar.gz") && rm("$(package)_binaries.$version2.$platform.tar.gz") + isfile("$(package)_binaries.$version2.$platform.zip") && rm("$(package)_binaries.$version2.$platform.zip") + cd("products/$platform") + + # Create a folder with the version number of the package + mkdir("$(package)_binaries.$version2") + for folder in ("include", "share", "lib") + cp(folder, "$(package)_binaries.$version2/$folder") + end + + cd("$(package)_binaries.$version2") + if ext == "dll" + run(`zip -r --symlinks ../../../$(package)_binaries.$version2.$platform.zip include share lib`) + else + run(`tar -czf ../../../$(package)_binaries.$version2.$platform.tar.gz include share lib`) + end + cd("../../..") + + # Remove the folder used to unzip the tarball generated by BinaryBuilder.jl + rm("products/$platform", recursive=true) + else + @warn("The tarball for the platform $platform was not generated!") + end +end diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index 0a2d05fa60..087ed262d4 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -4,7 +4,7 @@ on: push: branches: - master - - try-github-actions + - try-github-actions-for-windows paths: - .github/workflows/cmake.yml - '**CMakeLists.txt' @@ -33,6 +33,9 @@ on: - '!**Makefile' - '!**md' +permissions: + contents: read + env: CFLAGS: "-Wall -pedantic" # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.) @@ -59,35 +62,38 @@ jobs: strategy: fail-fast: true matrix: - os: [ macos-latest, ubuntu-latest ] + os: [ macos-latest, ubuntu-latest, windows-latest ] fflags: [ - "-fimplicit-none -frecursive -fcheck=all", - "-fimplicit-none -frecursive -fcheck=all -fopenmp" ] + "-Wall -Wno-unused-dummy-argument -Wno-unused-variable -Wno-unused-label -Werror=conversion -fimplicit-none -frecursive -fcheck=all", + "-Wall -Wno-unused-dummy-argument -Wno-unused-variable -Wno-unused-label -Werror=conversion -fimplicit-none -frecursive -fcheck=all -fopenmp" ] steps: - name: Checkout LAPACK - uses: actions/checkout@v2 + uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + + - name: Install ninja-build tool + uses: seanmiddleditch/gha-setup-ninja@16b940825621068d98711680b6c3ff92201f8fc0 # v3 - - name: Use GCC-11 on MacOS + - name: Use GCC-14 on MacOS if: ${{ matrix.os == 'macos-latest' }} run: > - cmake -B build - -D CMAKE_C_COMPILER="gcc-11" - -D CMAKE_Fortran_COMPILER="gfortran-11" + cmake -B build -G Ninja + -D CMAKE_C_COMPILER="gcc-14" + -D CMAKE_Fortran_COMPILER="gfortran-14" + -D USE_FLAT_NAMESPACE:BOOL=ON - # - name: Use Unix Makefiles on Windows - # if: ${{ matrix.os == 'windows-latest' }} - # run: > - # cmake -B build - # -G "Unix Makefiles" - # -D CMAKE_C_FLAGS="${{env.CFLAGS}} -Wl,--stack=1000000000" + - name: Special flags for Windows + if: ${{ matrix.os == 'windows-latest' }} + run: > + cmake -B build -G Ninja + -D CMAKE_EXE_LINKER_FLAGS="-Wl,--stack=2097152" - name: Configure CMake # Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make. # See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type run: > - cmake -B build + cmake -B build -G Ninja -D CMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -D CMAKE_INSTALL_PREFIX=${{github.workspace}}/lapack_install -D CBLAS:BOOL=ON @@ -96,16 +102,20 @@ jobs: -D LAPACKE_WITH_TMG:BOOL=ON -D BUILD_SHARED_LIBS:BOOL=ON - - name: CTest - working-directory: ${{github.workspace}}/build + - name: Build # Execute tests defined by the CMake configuration. # See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail - run: | - ctest -D ExperimentalStart - ctest -D ExperimentalConfigure - ctest -D ExperimentalBuild -j2 - ctest -D ExperimentalTest --schedule-random -j2 --output-on-failure --timeout 100 - ctest -D ExperimentalSubmit + run: cmake --build build --config ${{env.BUILD_TYPE}} + + - name: Test with OpenMP + working-directory: ${{github.workspace}}/build + if: ${{ contains( matrix.fflags, 'openmp' ) && (matrix.os != 'windows-latest') }} + run: ctest -C ${{env.BUILD_TYPE}} --schedule-random -j1 --output-on-failure --timeout 100 + + - name: Test + working-directory: ${{github.workspace}}/build + if: ${{ !contains( matrix.fflags, 'openmp' ) && (matrix.os != 'windows-latest') }} + run: ctest -C ${{env.BUILD_TYPE}} --schedule-random -j2 --output-on-failure --timeout 100 - name: Install run: cmake --build build --target install -j2 @@ -118,13 +128,16 @@ jobs: steps: - name: Checkout LAPACK - uses: actions/checkout@v2 + uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + + - name: Install ninja-build tool + uses: seanmiddleditch/gha-setup-ninja@16b940825621068d98711680b6c3ff92201f8fc0 # v3 - name: Configure CMake # Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make. # See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type run: > - cmake -B build + cmake -B build -G Ninja -D CMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -D CMAKE_INSTALL_PREFIX=${{github.workspace}}/lapack_install -D CBLAS:BOOL=ON @@ -141,3 +154,87 @@ jobs: echo "Coverage" cmake --build build --target coverage bash <(curl -s https://codecov.io/bash) -X gcov + + test-install-cblas-lapacke-without-fortran-compiler: + runs-on: ubuntu-latest + steps: + - name: Checkout LAPACK + uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + + - name: Install ninja-build tool + uses: seanmiddleditch/gha-setup-ninja@16b940825621068d98711680b6c3ff92201f8fc0 # v3 + + - name: Install basics + run: | + sudo apt update + sudo apt install -y cmake liblapack-dev libblas-dev + sudo apt purge gfortran + + - name: Configure CMake + run: > + cmake -B build -G Ninja + -D CMAKE_BUILD_TYPE=Release + -D CMAKE_INSTALL_PREFIX=${{github.workspace}}/lapack_install + -D CBLAS:BOOL=ON + -D LAPACKE:BOOL=ON + -D USE_OPTIMIZED_BLAS:BOOL=ON + -D USE_OPTIMIZED_LAPACK:BOOL=ON + -D BUILD_TESTING:BOOL=OFF + -D LAPACKE_WITH_TMG:BOOL=OFF + -D BUILD_SHARED_LIBS:BOOL=ON + + - name: Install + run: cmake --build build --target install -j2 + + memory-check: + runs-on: ubuntu-latest + env: + BUILD_TYPE: Debug + + steps: + + - name: Checkout LAPACK + uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + + - name: Install ninja-build tool + uses: seanmiddleditch/gha-setup-ninja@16b940825621068d98711680b6c3ff92201f8fc0 # v3 + + - name: Install APT packages + run: | + sudo apt update + sudo apt install -y cmake valgrind gfortran + + - name: Configure CMake + run: > + cmake -B build -G Ninja + -D CMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} + -D CBLAS:BOOL=ON + -D LAPACKE:BOOL=ON + -D BUILD_TESTING:BOOL=ON + -D LAPACKE_WITH_TMG:BOOL=ON + -D BUILD_SHARED_LIBS:BOOL=ON + -D LAPACK_TESTING_USE_PYTHON:BOOL=OFF + + - name: Build + run: cmake --build build --config ${{env.BUILD_TYPE}} + + - name: Test + working-directory: ${{github.workspace}}/build + run: | + ctest -C ${{env.BUILD_TYPE}} --schedule-random -j2 -T memcheck > memcheck.out + cat memcheck.out + if tail -n 1 memcheck.out | grep -q "Memory checking results:"; then + exit 0 + else + for f in Testing/Temporary/MemoryChecker.*.log; do + if tail -n 1 $f | grep -q "ERROR SUMMARY: 0 errors"; then + tail -n 1 $f + continue + else + echo "Memory check failed in $f" + cat $f + exit 1 + fi + done + exit 0 + fi diff --git a/.github/workflows/makefile.yml b/.github/workflows/makefile.yml index 567295783d..eb6720dbaa 100644 --- a/.github/workflows/makefile.yml +++ b/.github/workflows/makefile.yml @@ -31,9 +31,19 @@ on: - '!**CMakeLists.txt' - '!**md' +permissions: + contents: read + env: - CFLAGS: "-Wall -pedantic" - FFLAGS: "-fimplicit-none -frecursive -fopenmp -fcheck=all" + CC: "gcc" + FC: "gfortran" + CFLAGS: "-O3 -flto -Wall -pedantic-errors" + FFLAGS: "-O2 -flto -Wall -Werror=conversion -pedantic -fimplicit-none -frecursive -fopenmp -fcheck=all" + FFLAGS_NOOPT: "-O0 -flto -Wall -fimplicit-none -frecursive -fopenmp -fcheck=all" + LDFLAGS: "" + AR: "ar" + ARFLAGS: "cr" + RANLIB: "ranlib" defaults: run: @@ -45,10 +55,20 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout LAPACK - uses: actions/checkout@v2 + uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + - name: Set configurations + run: | + echo "SHELL = /bin/sh" >> make.inc + echo "FFLAGS_DRV = ${{env.FFLAGS}}" >> make.inc + echo "TIMER = INT_ETIME" >> make.inc + echo "BLASLIB = ${{github.workspace}}/librefblas.a" >> make.inc + echo "CBLASLIB = ${{github.workspace}}/libcblas.a" >> make.inc + echo "LAPACKLIB = ${{github.workspace}}/liblapack.a" >> make.inc + echo "TMGLIB = ${{github.workspace}}/libtmglib.a" >> make.inc + echo "LAPACKELIB = ${{github.workspace}}/liblapacke.a" >> make.inc + echo "DOCSDIR = ${{github.workspace}}/DOCS" >> make.inc - name: Install run: | - cp make.inc.example make.inc make -s -j2 all make -j2 lapack_install @@ -56,13 +76,23 @@ jobs: runs-on: macos-latest steps: - name: Checkout LAPACK - uses: actions/checkout@v2 + uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + - name: Set configurations + run: | + echo "SHELL = /bin/sh" >> make.inc + echo "FFLAGS_DRV = ${{env.FFLAGS}}" >> make.inc + echo "TIMER = INT_ETIME" >> make.inc + echo "BLASLIB = ${{github.workspace}}/librefblas.a" >> make.inc + echo "CBLASLIB = ${{github.workspace}}/libcblas.a" >> make.inc + echo "LAPACKLIB = ${{github.workspace}}/liblapack.a" >> make.inc + echo "TMGLIB = ${{github.workspace}}/libtmglib.a" >> make.inc + echo "LAPACKELIB = ${{github.workspace}}/liblapacke.a" >> make.inc + echo "DOCSDIR = ${{github.workspace}}/DOCS" >> make.inc - name: Alias for GCC compilers run: | - sudo ln -s $(which gcc-11) /usr/local/bin/gcc - sudo ln -s $(which gfortran-11) /usr/local/bin/gfortran + sudo ln -s $(which gcc-14) /usr/local/bin/gcc + sudo ln -s $(which gfortran-14) /usr/local/bin/gfortran - name: Install run: | - cp make.inc.example make.inc make -s -j2 all make -j2 lapack_install diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000000..4900d2e194 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,239 @@ +name: Release + +on: + push: + # Sequence of patterns matched against refs/tags + tags: + - 'v*' # Push events to matching v*, i.e. v1.0, v2023.11.15 + +jobs: + build-linux-x64: + name: blas / lapack -- Linux (x86_64) -- Release ${{ github.ref_name }} + runs-on: ubuntu-latest + steps: + - name: Checkout lapack + uses: actions/checkout@v4 + + - name: Install Julia + uses: julia-actions/setup-julia@v2 + with: + version: "1.7" + arch: x64 + + - name: Set the environment variables BINARYBUILDER_AUTOMATIC_APPLE, BLAS_LAPACK_RELEASE, BLAS_LAPACK_COMMIT + shell: bash + run: | + echo "BINARYBUILDER_AUTOMATIC_APPLE=true" >> $GITHUB_ENV + echo "BLAS_LAPACK_RELEASE=${{ github.ref_name }}" >> $GITHUB_ENV + echo "BLAS_LAPACK_COMMIT=${{ github.sha }}" >> $GITHUB_ENV + echo "BLAS_LAPACK_URL=https://github.com/${{ github.repository }}.git" >> $GITHUB_ENV + + - name: Cross-compilation of blas / lapack -- x86_64-linux-gnu-libgfortran5 + run: | + julia --color=no -e 'using Pkg; Pkg.add("BinaryBuilder")' + julia --color=no .github/julia/build_tarballs.jl x86_64-linux-gnu-libgfortran5 --verbose + + - name: Archive artifact + run: julia --color=no .github/julia/generate_binaries.jl + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: blas_lapack_binaries.${{ github.ref_name }}.x86_64-linux-gnu-libgfortran5.tar.gz + path: ./blas_lapack_binaries.${{ github.ref_name }}.x86_64-linux-gnu-libgfortran5.tar.gz + + build-linux-aarch64: + name: blas / lapack -- Linux (aarch64) -- Release ${{ github.ref_name }} + runs-on: ubuntu-latest + steps: + - name: Checkout lapack + uses: actions/checkout@v4 + + - name: Install Julia + uses: julia-actions/setup-julia@v2 + with: + version: "1.7" + arch: x64 + + - name: Set the environment variables BINARYBUILDER_AUTOMATIC_APPLE, BLAS_LAPACK_RELEASE, BLAS_LAPACK_COMMIT + shell: bash + run: | + echo "BINARYBUILDER_AUTOMATIC_APPLE=true" >> $GITHUB_ENV + echo "BLAS_LAPACK_RELEASE=${{ github.ref_name }}" >> $GITHUB_ENV + echo "BLAS_LAPACK_COMMIT=${{ github.sha }}" >> $GITHUB_ENV + echo "BLAS_LAPACK_URL=https://github.com/${{ github.repository }}.git" >> $GITHUB_ENV + + - name: Cross-compilation of blas / lapack -- aarch64-linux-gnu-libgfortran5 + run: | + julia --color=no -e 'using Pkg; Pkg.add("BinaryBuilder")' + julia --color=no .github/julia/build_tarballs.jl aarch64-linux-gnu-libgfortran5 --verbose + + - name: Archive artifact + run: julia --color=no .github/julia/generate_binaries.jl + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: blas_lapack_binaries.${{ github.ref_name }}.aarch64-linux-gnu-libgfortran5.tar.gz + path: ./blas_lapack_binaries.${{ github.ref_name }}.aarch64-linux-gnu-libgfortran5.tar.gz + + build-windows-x64: + name: blas / lapack -- Windows (x86_64) -- Release ${{ github.ref_name }} + runs-on: ubuntu-latest + steps: + - name: Checkout lapack + uses: actions/checkout@v4 + + - name: Install Julia + uses: julia-actions/setup-julia@v2 + with: + version: "1.7" + arch: x64 + + - name: Set the environment variables BINARYBUILDER_AUTOMATIC_APPLE, BLAS_LAPACK_RELEASE, BLAS_LAPACK_COMMIT + shell: bash + run: | + echo "BINARYBUILDER_AUTOMATIC_APPLE=true" >> $GITHUB_ENV + echo "BLAS_LAPACK_RELEASE=${{ github.ref_name }}" >> $GITHUB_ENV + echo "BLAS_LAPACK_COMMIT=${{ github.sha }}" >> $GITHUB_ENV + echo "BLAS_LAPACK_URL=https://github.com/${{ github.repository }}.git" >> $GITHUB_ENV + + - name: Cross-compilation of blas / lapack -- x86_64-w64-mingw32-libgfortran5 + run: | + julia --color=no -e 'using Pkg; Pkg.add("BinaryBuilder")' + julia --color=no .github/julia/build_tarballs.jl x86_64-w64-mingw32-libgfortran5 --verbose + - name: Archive artifact + run: julia --color=no .github/julia/generate_binaries.jl + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: blas_lapack_binaries.${{ github.ref_name }}.x86_64-w64-mingw32-libgfortran5.zip + path: ./blas_lapack_binaries.${{ github.ref_name }}.x86_64-w64-mingw32-libgfortran5.zip + + build-mac-x64: + name: blas / lapack -- macOS (x86_64) -- Release ${{ github.ref_name }} + runs-on: ubuntu-latest + steps: + - name: Checkout lapack + uses: actions/checkout@v4 + + - name: Install Julia + uses: julia-actions/setup-julia@v2 + with: + version: "1.7" + arch: x64 + + - name: Set the environment variables BINARYBUILDER_AUTOMATIC_APPLE, BLAS_LAPACK_RELEASE, BLAS_LAPACK_COMMIT + shell: bash + run: | + echo "BINARYBUILDER_AUTOMATIC_APPLE=true" >> $GITHUB_ENV + echo "BLAS_LAPACK_RELEASE=${{ github.ref_name }}" >> $GITHUB_ENV + echo "BLAS_LAPACK_COMMIT=${{ github.sha }}" >> $GITHUB_ENV + echo "BLAS_LAPACK_URL=https://github.com/${{ github.repository }}.git" >> $GITHUB_ENV + + - name: Cross-compilation of blas / lapack -- x86_64-apple-darwin-libgfortran5 + run: | + julia --color=no -e 'using Pkg; Pkg.add("BinaryBuilder")' + julia --color=no .github/julia/build_tarballs.jl x86_64-apple-darwin-libgfortran5 --verbose + + - name: Archive artifact + run: julia --color=no .github/julia/generate_binaries.jl + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: blas_lapack_binaries.${{ github.ref_name }}.x86_64-apple-darwin-libgfortran5.tar.gz + path: ./blas_lapack_binaries.${{ github.ref_name }}.x86_64-apple-darwin-libgfortran5.tar.gz + + build-mac-aarch64: + name: blas / lapack -- macOS (aarch64) -- Release ${{ github.ref_name }} + runs-on: ubuntu-latest + steps: + - name: Checkout lapack + uses: actions/checkout@v4 + + - name: Install Julia + uses: julia-actions/setup-julia@v2 + with: + version: "1.7" + arch: x64 + + - name: Set the environment variables BINARYBUILDER_AUTOMATIC_APPLE, BLAS_LAPACK_RELEASE, BLAS_LAPACK_COMMIT + shell: bash + run: | + echo "BINARYBUILDER_AUTOMATIC_APPLE=true" >> $GITHUB_ENV + echo "BLAS_LAPACK_RELEASE=${{ github.ref_name }}" >> $GITHUB_ENV + echo "BLAS_LAPACK_COMMIT=${{ github.sha }}" >> $GITHUB_ENV + echo "BLAS_LAPACK_URL=https://github.com/${{ github.repository }}.git" >> $GITHUB_ENV + + - name: Cross-compilation of blas / lapack -- aarch64-apple-darwin-libgfortran5 + run: | + julia --color=no -e 'using Pkg; Pkg.add("BinaryBuilder")' + julia --color=no .github/julia/build_tarballs.jl aarch64-apple-darwin-libgfortran5 --verbose + + - name: Archive artifact + run: julia --color=no .github/julia/generate_binaries.jl + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: blas_lapack_binaries.${{ github.ref_name }}.aarch64-apple-darwin-libgfortran5.tar.gz + path: ./blas_lapack_binaries.${{ github.ref_name }}.aarch64-apple-darwin-libgfortran5.tar.gz + + release: + name: Create Release and Upload Binaries + needs: [build-windows-x64, build-linux-x64, build-linux-aarch64, build-mac-x64, build-mac-aarch64] + runs-on: ubuntu-latest + steps: + - name: Checkout lapack + uses: actions/checkout@v4 + + - name: Download artifacts + uses: actions/download-artifact@v4 + with: + path: . + + - name: Create GitHub Release + run: | + gh release create ${{ github.ref_name }} \ + --title "${{ github.ref_name }}" \ + --notes "" \ + --verify-tag + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Upload Linux (x86_64) artifact + run: | + gh release upload ${{ github.ref_name }} \ + blas_lapack_binaries.${{ github.ref_name }}.x86_64-linux-gnu-libgfortran5.tar.gz/blas_lapack_binaries.${{ github.ref_name }}.x86_64-linux-gnu-libgfortran5.tar.gz#blas_lapack.${{ github.ref_name }}.linux.x86_64.tar.gz + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Upload Linux (aarch64) artifact + run: | + gh release upload ${{ github.ref_name }} \ + blas_lapack_binaries.${{ github.ref_name }}.aarch64-linux-gnu-libgfortran5.tar.gz/blas_lapack_binaries.${{ github.ref_name }}.aarch64-linux-gnu-libgfortran5.tar.gz#blas_lapack.${{ github.ref_name }}.linux.aarch64.tar.gz + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Upload Mac (x86_64) artifact + run: | + gh release upload ${{ github.ref_name }} \ + blas_lapack_binaries.${{ github.ref_name }}.x86_64-apple-darwin-libgfortran5.tar.gz/blas_lapack_binaries.${{ github.ref_name }}.x86_64-apple-darwin-libgfortran5.tar.gz#blas_lapack.${{ github.ref_name }}.mac.x86_64.tar.gz + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Upload Mac (aarch64) artifact + run: | + gh release upload ${{ github.ref_name }} \ + blas_lapack_binaries.${{ github.ref_name }}.aarch64-apple-darwin-libgfortran5.tar.gz/blas_lapack_binaries.${{ github.ref_name }}.aarch64-apple-darwin-libgfortran5.tar.gz#blas_lapack.${{ github.ref_name }}.mac.aarch64.tar.gz + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Upload Windows (x86_64) artifact + run: | + gh release upload ${{ github.ref_name }} \ + blas_lapack_binaries.${{ github.ref_name }}.x86_64-w64-mingw32-libgfortran5.zip/blas_lapack_binaries.${{ github.ref_name }}.x86_64-w64-mingw32-libgfortran5.zip#blas_lapack.${{ github.ref_name }}.windows.x86_64.zip + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml new file mode 100644 index 0000000000..99ab75d5ad --- /dev/null +++ b/.github/workflows/scorecard.yml @@ -0,0 +1,72 @@ +# This workflow uses actions that are not certified by GitHub. They are provided +# by a third-party and are governed by separate terms of service, privacy +# policy, and support documentation. + +name: Scorecard supply-chain security +on: + # For Branch-Protection check. Only the default branch is supported. See + # https://github.com/ossf/scorecard/blob/main/docs/checks.md#branch-protection + branch_protection_rule: + # To guarantee Maintained check is occasionally updated. See + # https://github.com/ossf/scorecard/blob/main/docs/checks.md#maintained + schedule: + - cron: '40 17 * * 2' + push: + branches: [ "master" ] + +# Declare default permissions as read only. +permissions: read-all + +jobs: + analysis: + name: Scorecard analysis + runs-on: ubuntu-latest + permissions: + # Needed to upload the results to code-scanning dashboard. + security-events: write + # Needed to publish results and get a badge (see publish_results below). + id-token: write + # Uncomment the permissions below if installing in a private repository. + # contents: read + # actions: read + + steps: + - name: "Checkout code" + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # tag=v4.2.0 + with: + persist-credentials: false + + - name: "Run analysis" + uses: ossf/scorecard-action@62b2cac7ed8198b15735ed49ab1e5cf35480ba46 # v2.4.0 + with: + results_file: results.sarif + results_format: sarif + # (Optional) "write" PAT token. Uncomment the `repo_token` line below if: + # - you want to enable the Branch-Protection check on a *public* repository, or + # - you are installing Scorecard on a *private* repository + # To create the PAT, follow the steps in https://github.com/ossf/scorecard-action#authentication-with-pat. + # repo_token: ${{ secrets.SCORECARD_TOKEN }} + + # Public repositories: + # - Publish results to OpenSSF REST API for easy access by consumers + # - Allows the repository to include the Scorecard badge. + # - See https://github.com/ossf/scorecard-action#publishing-results. + # For private repositories: + # - `publish_results` will always be set to `false`, regardless + # of the value entered here. + publish_results: true + + # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF + # format to the repository Actions tab. + - name: "Upload artifact" + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 + with: + name: SARIF file + path: results.sarif + retention-days: 5 + + # Upload the results to GitHub's code scanning dashboard. + - name: "Upload to code-scanning" + uses: github/codeql-action/upload-sarif@662472033e021d55d94146f66f6058822b0b39fd # v3.27.0 + with: + sarif_file: results.sarif diff --git a/.gitignore b/.gitignore index 015f09d779..cd6f0ad023 100644 --- a/.gitignore +++ b/.gitignore @@ -25,8 +25,10 @@ CBLAS/examples/cblas_ex2 # LAPACK testing TESTING/LIN/xlintst* TESTING/EIG/xeigtst* +TESTING/EIG/xdmd* TESTING/*.out TESTING/*.txt +!TESTING/CMakeLists.txt TESTING/x* # LAPACKE example @@ -41,3 +43,7 @@ build* DOCS/man DOCS/explore-html output_err + +# Mod files from compilation in SRC +SRC/la_constants.mod +SRC/la_xisnan.mod diff --git a/BLAS/CMakeLists.txt b/BLAS/CMakeLists.txt index 45cec39c22..a33f38f253 100644 --- a/BLAS/CMakeLists.txt +++ b/BLAS/CMakeLists.txt @@ -1,3 +1,9 @@ +enable_language(Fortran) + +# Check for any necessary platform specific compiler flags +include(CheckLAPACKCompilerFlags) +CheckLAPACKCompilerFlags() + add_subdirectory(SRC) if(BUILD_TESTING) add_subdirectory(TESTING) diff --git a/BLAS/SRC/CMakeLists.txt b/BLAS/SRC/CMakeLists.txt index d585729e6b..300948a975 100644 --- a/BLAS/SRC/CMakeLists.txt +++ b/BLAS/SRC/CMakeLists.txt @@ -29,21 +29,31 @@ # Level 1 BLAS #--------------------------------------------------------- -set(SBLAS1 isamax.f sasum.f saxpy.f scopy.f sdot.f snrm2.f90 +set(SBLAS1 isamax.f sasum.f saxpy.f saxpby.f scopy.f sdot.f snrm2.f90 srot.f srotg.f90 sscal.f sswap.f sdsdot.f srotmg.f srotm.f) -set(CBLAS1 scabs1.f scasum.f scnrm2.f90 icamax.f caxpy.f ccopy.f +set(CBLAS1 scabs1.f scasum.f scnrm2.f90 icamax.f90 caxpy.f caxpby.f ccopy.f cdotc.f cdotu.f csscal.f crotg.f90 cscal.f cswap.f csrot.f) -set(DBLAS1 idamax.f dasum.f daxpy.f dcopy.f ddot.f dnrm2.f90 +set(DBLAS1 idamax.f dasum.f daxpy.f daxpby.f dcopy.f ddot.f dnrm2.f90 drot.f drotg.f90 dscal.f dsdot.f dswap.f drotmg.f drotm.f) -set(ZBLAS1 dcabs1.f dzasum.f dznrm2.f90 izamax.f zaxpy.f zcopy.f +set(DB1AUX sscal.f isamax.f) + +set(ZBLAS1 dcabs1.f dzasum.f dznrm2.f90 izamax.f90 zaxpy.f zaxpby.f zcopy.f zdotc.f zdotu.f zdscal.f zrotg.f90 zscal.f zswap.f zdrot.f) -set(CB1AUX isamax.f sasum.f saxpy.f scopy.f snrm2.f90 sscal.f) +set(CB1AUX + isamax.f idamax.f + sasum.f saxpy.f scopy.f sdot.f sgemm.f sgemv.f snrm2.f90 srot.f sscal.f + sswap.f) -set(ZB1AUX idamax.f dasum.f daxpy.f dcopy.f dnrm2.f90 dscal.f) +set(ZB1AUX + icamax.f90 idamax.f + cgemm.f cherk.f cscal.f ctrsm.f + dasum.f daxpy.f dcopy.f ddot.f dgemm.f dgemv.f dnrm2.f90 drot.f dscal.f + dswap.f + scabs1.f) #--------------------------------------------------------------------- # Auxiliary routines needed by both the Level 2 and Level 3 BLAS @@ -72,15 +82,15 @@ set(ZBLAS2 zgemv.f zgbmv.f zhemv.f zhbmv.f zhpmv.f #--------------------------------------------------------- # Level 3 BLAS #--------------------------------------------------------- -set(SBLAS3 sgemm.f ssymm.f ssyrk.f ssyr2k.f strmm.f strsm.f) +set(SBLAS3 sgemm.f ssymm.f ssyrk.f ssyr2k.f strmm.f strsm.f sgemmtr.f) set(CBLAS3 cgemm.f csymm.f csyrk.f csyr2k.f ctrmm.f ctrsm.f - chemm.f cherk.f cher2k.f) + chemm.f cherk.f cher2k.f cgemmtr.f) -set(DBLAS3 dgemm.f dsymm.f dsyrk.f dsyr2k.f dtrmm.f dtrsm.f) +set(DBLAS3 dgemm.f dsymm.f dsyrk.f dsyr2k.f dtrmm.f dtrsm.f dgemmtr.f) set(ZBLAS3 zgemm.f zsymm.f zsyrk.f zsyr2k.f ztrmm.f ztrsm.f - zhemm.f zherk.f zher2k.f) + zhemm.f zherk.f zher2k.f zgemmtr.f) set(SOURCES) @@ -88,7 +98,8 @@ if(BUILD_SINGLE) list(APPEND SOURCES ${SBLAS1} ${ALLBLAS} ${SBLAS2} ${SBLAS3}) endif() if(BUILD_DOUBLE) - list(APPEND SOURCES ${DBLAS1} ${ALLBLAS} ${DBLAS2} ${DBLAS3}) + list(APPEND SOURCES + ${DBLAS1} ${DB1AUX} ${ALLBLAS} ${DBLAS2} ${DBLAS3} ${SBLAS3}) endif() if(BUILD_COMPLEX) list(APPEND SOURCES ${CBLAS1} ${CB1AUX} ${ALLBLAS} ${CBLAS2} ${CBLAS3}) @@ -98,10 +109,53 @@ if(BUILD_COMPLEX16) endif() list(REMOVE_DUPLICATES SOURCES) -add_library(${BLASLIB} ${SOURCES}) +add_library(${BLASLIB}_obj OBJECT ${SOURCES}) +set_target_properties(${BLASLIB}_obj PROPERTIES POSITION_INDEPENDENT_CODE ON) + +if(BUILD_INDEX64_EXT_API) + set(SOURCES_64_F) + # Copy files so we can set source property specific to /${BLASLIB}_64_obj target + file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${BLASLIB}_64_obj) + file(COPY ${SOURCES} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/${BLASLIB}_64_obj) + file(GLOB SOURCES_64_F ${CMAKE_CURRENT_BINARY_DIR}/${BLASLIB}_64_obj/*.f*) + add_library(${BLASLIB}_64_obj OBJECT ${SOURCES_64_F}) + target_compile_options(${BLASLIB}_64_obj PRIVATE ${FOPT_ILP64}) + set_target_properties(${BLASLIB}_64_obj PROPERTIES POSITION_INDEPENDENT_CODE ON) + #Add _64 suffix to all Fortran functions via macros + foreach(F IN LISTS SOURCES_64_F) + if(CMAKE_Fortran_COMPILER_ID STREQUAL "NAG") + set_source_files_properties(${F} PROPERTIES COMPILE_FLAGS "-fpp") + else() + set_source_files_properties(${F} PROPERTIES COMPILE_FLAGS "-cpp") + endif() + file(STRINGS ${F} ${F}.lst) + list(FILTER ${F}.lst INCLUDE REGEX "subroutine|SUBROUTINE|external|EXTERNAL|function|FUNCTION") + list(FILTER ${F}.lst EXCLUDE REGEX "^!.*") + list(FILTER ${F}.lst EXCLUDE REGEX "^[*].*") + list(FILTER ${F}.lst EXCLUDE REGEX "end|END") + foreach(FUNC IN LISTS ${F}.lst) + string(REGEX REPLACE "^[a-zA-Z0-9_ *]*(subroutine|SUBROUTINE|external|EXTERNAL|function|FUNCTION)[ ]*[*]?" "" FUNC ${FUNC}) + string(REGEX REPLACE "[(][a-zA-Z0-9_, )]*$" "" FUNC ${FUNC}) + string(STRIP ${FUNC} FUNC) + list(APPEND COPT_64_F "${FUNC}=${FUNC}_64") + endforeach() + list(REMOVE_DUPLICATES COPT_64_F) + set_source_files_properties(${F} PROPERTIES COMPILE_DEFINITIONS "${COPT_64_F}") + endforeach() +endif() + +add_library(${BLASLIB} + $ + $<$: $>) + set_target_properties( ${BLASLIB} PROPERTIES VERSION ${LAPACK_VERSION} SOVERSION ${LAPACK_MAJOR_VERSION} + POSITION_INDEPENDENT_CODE ON ) lapack_install_library(${BLASLIB}) + +if( TEST_FORTRAN_COMPILER ) + add_dependencies( ${BLASLIB} run_test_zcomplexabs run_test_zcomplexdiv run_test_zcomplexmult run_test_zminMax ) +endif() diff --git a/BLAS/SRC/icamax.f b/BLAS/SRC/DEPRECATED/icamax.f similarity index 99% rename from BLAS/SRC/icamax.f rename to BLAS/SRC/DEPRECATED/icamax.f index c103cc800e..b65cbf8cf3 100644 --- a/BLAS/SRC/icamax.f +++ b/BLAS/SRC/DEPRECATED/icamax.f @@ -54,7 +54,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup aux_blas +*> \ingroup iamax * *> \par Further Details: * ===================== diff --git a/BLAS/SRC/izamax.f b/BLAS/SRC/DEPRECATED/izamax.f similarity index 99% rename from BLAS/SRC/izamax.f rename to BLAS/SRC/DEPRECATED/izamax.f index e4779a1ff2..0fe4125070 100644 --- a/BLAS/SRC/izamax.f +++ b/BLAS/SRC/DEPRECATED/izamax.f @@ -54,7 +54,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup aux_blas +*> \ingroup iamax * *> \par Further Details: * ===================== diff --git a/BLAS/SRC/Makefile b/BLAS/SRC/Makefile index 70534c8358..e49ff4d08a 100644 --- a/BLAS/SRC/Makefile +++ b/BLAS/SRC/Makefile @@ -69,19 +69,19 @@ all: $(BLASLIB) # Comment out the next 6 definitions if you already have # the Level 1 BLAS. #--------------------------------------------------------- -SBLAS1 = isamax.o sasum.o saxpy.o scopy.o sdot.o snrm2.o \ +SBLAS1 = isamax.o sasum.o saxpy.o saxpby.o scopy.o sdot.o snrm2.o \ srot.o srotg.o sscal.o sswap.o sdsdot.o srotmg.o srotm.o $(SBLAS1): $(FRC) -CBLAS1 = scabs1.o scasum.o scnrm2.o icamax.o caxpy.o ccopy.o \ +CBLAS1 = scabs1.o scasum.o scnrm2.o icamax.o caxpy.o caxpby.o ccopy.o \ cdotc.o cdotu.o csscal.o crotg.o cscal.o cswap.o csrot.o $(CBLAS1): $(FRC) -DBLAS1 = idamax.o dasum.o daxpy.o dcopy.o ddot.o dnrm2.o \ +DBLAS1 = idamax.o dasum.o daxpy.o daxpby.o dcopy.o ddot.o dnrm2.o \ drot.o drotg.o dscal.o dsdot.o dswap.o drotmg.o drotm.o $(DBLAS1): $(FRC) -ZBLAS1 = dcabs1.o dzasum.o dznrm2.o izamax.o zaxpy.o zcopy.o \ +ZBLAS1 = dcabs1.o dzasum.o dznrm2.o izamax.o zaxpy.o zaxpby.o zcopy.o \ zdotc.o zdotu.o zdscal.o zrotg.o zscal.o zswap.o zdrot.o $(ZBLAS1): $(FRC) @@ -127,18 +127,18 @@ $(ZBLAS2): $(FRC) # Comment out the next 4 definitions if you already have # the Level 3 BLAS. #--------------------------------------------------------- -SBLAS3 = sgemm.o ssymm.o ssyrk.o ssyr2k.o strmm.o strsm.o +SBLAS3 = sgemm.o ssymm.o ssyrk.o ssyr2k.o strmm.o strsm.o sgemmtr.o $(SBLAS3): $(FRC) CBLAS3 = cgemm.o csymm.o csyrk.o csyr2k.o ctrmm.o ctrsm.o \ - chemm.o cherk.o cher2k.o + chemm.o cherk.o cher2k.o cgemmtr.o $(CBLAS3): $(FRC) -DBLAS3 = dgemm.o dsymm.o dsyrk.o dsyr2k.o dtrmm.o dtrsm.o +DBLAS3 = dgemm.o dsymm.o dsyrk.o dsyr2k.o dtrmm.o dtrsm.o dgemmtr.o $(DBLAS3): $(FRC) ZBLAS3 = zgemm.o zsymm.o zsyrk.o zsyr2k.o ztrmm.o ztrsm.o \ - zhemm.o zherk.o zher2k.o + zhemm.o zherk.o zher2k.o zgemmtr.o $(ZBLAS3): $(FRC) ALLOBJ = $(SBLAS1) $(SBLAS2) $(SBLAS3) $(DBLAS1) $(DBLAS2) $(DBLAS3) \ diff --git a/BLAS/SRC/caxpby.f b/BLAS/SRC/caxpby.f new file mode 100644 index 0000000000..3ae8486a95 --- /dev/null +++ b/BLAS/SRC/caxpby.f @@ -0,0 +1,144 @@ +*> \brief \b CAXPBY +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +* Definition: +* =========== +* +* SUBROUTINE CAXPBY(N,CA,CX,INCX,CB,CY,INCY) +* +* .. Scalar Arguments .. +* COMPLEX CA,CB +* INTEGER INCX,INCY,N +* .. +* .. Array Arguments .. +* COMPLEX CX(*),CY(*) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> CAXPBY constant times a vector plus constant times a vector. +*> +*> Y = ALPHA * X + BETA * Y +*> +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> number of elements in input vector(s) +*> \endverbatim +*> +*> \param[in] CA +*> \verbatim +*> CA is COMPLEX +*> On entry, CA specifies the scalar alpha. +*> \endverbatim +*> +*> \param[in] CX +*> \verbatim +*> CX is COMPLEX array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) +*> \endverbatim +*> +*> \param[in] INCX +*> \verbatim +*> INCX is INTEGER +*> storage spacing between elements of CX +*> \endverbatim +*> +*> \param[in] CB +*> \verbatim +*> CB is COMPLEX +*> On entry, CB specifies the scalar beta. +*> \endverbatim +*> +*> \param[in,out] CY +*> \verbatim +*> CY is COMPLEX array, dimension ( 1 + ( N - 1 )*abs( INCY ) ) +*> \endverbatim +*> +*> \param[in] INCY +*> \verbatim +*> INCY is INTEGER +*> storage spacing between elements of CY +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +*> \author Martin Koehler, MPI Magdeburg +* +*> \ingroup axpby +* +* ===================================================================== + SUBROUTINE CAXPBY(N,CA,CX,INCX,CB,CY,INCY) + IMPLICIT NONE +* +* -- Reference BLAS level1 routine -- +* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* +* .. Scalar Arguments .. + COMPLEX CA, CB + INTEGER INCX,INCY,N +* .. +* .. Array Arguments .. + COMPLEX CX(*),CY(*) +* .. +* .. External Subroutines .. + EXTERNAL CSCAL +* +* ===================================================================== +* +* .. Local Scalars .. + INTEGER I,IX,IY +* .. + IF (N.LE.0) RETURN + + IF (CA .EQ. (0.0,0.0) .AND. CB.NE.(0.0,0.0)) THEN + CALL CSCAL(N,CB, CY, INCY) + RETURN + END IF + + IF (INCX.EQ.1 .AND. INCY.EQ.1) THEN +* +* code for both increments equal to 1 +* + DO I = 1,N + CY(I) = CB*CY(I) + CA*CX(I) + END DO + ELSE +* +* code for unequal increments or equal increments +* not equal to 1 +* + IX = 1 + IY = 1 + IF (INCX.LT.0) IX = (-N+1)*INCX + 1 + IF (INCY.LT.0) IY = (-N+1)*INCY + 1 + DO I = 1,N + CY(IY) = CB*CY(IY) + CA*CX(IX) + IX = IX + INCX + IY = IY + INCY + END DO + END IF +* + RETURN +* +* End of CAXBPY +* + END diff --git a/BLAS/SRC/caxpy.f b/BLAS/SRC/caxpy.f index 8dfdba9c0a..6503a80c11 100644 --- a/BLAS/SRC/caxpy.f +++ b/BLAS/SRC/caxpy.f @@ -72,7 +72,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex_blas_level1 +*> \ingroup axpy * *> \par Further Details: * ===================== @@ -85,6 +85,7 @@ *> * ===================================================================== SUBROUTINE CAXPY(N,CA,CX,INCX,CY,INCY) + IMPLICIT NONE * * -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/ccopy.f b/BLAS/SRC/ccopy.f index 1b4999bae6..7d8c04dc16 100644 --- a/BLAS/SRC/ccopy.f +++ b/BLAS/SRC/ccopy.f @@ -65,7 +65,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex_blas_level1 +*> \ingroup copy * *> \par Further Details: * ===================== @@ -78,6 +78,7 @@ *> * ===================================================================== SUBROUTINE CCOPY(N,CX,INCX,CY,INCY) + IMPLICIT NONE * * -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/cdotc.f b/BLAS/SRC/cdotc.f index da29fdf896..bc38c7af46 100644 --- a/BLAS/SRC/cdotc.f +++ b/BLAS/SRC/cdotc.f @@ -67,7 +67,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex_blas_level1 +*> \ingroup dot * *> \par Further Details: * ===================== @@ -80,6 +80,7 @@ *> * ===================================================================== COMPLEX FUNCTION CDOTC(N,CX,INCX,CY,INCY) + IMPLICIT NONE * * -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/cdotu.f b/BLAS/SRC/cdotu.f index d8c21d10c1..aa57e32031 100644 --- a/BLAS/SRC/cdotu.f +++ b/BLAS/SRC/cdotu.f @@ -67,7 +67,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex_blas_level1 +*> \ingroup dot * *> \par Further Details: * ===================== @@ -80,6 +80,7 @@ *> * ===================================================================== COMPLEX FUNCTION CDOTU(N,CX,INCX,CY,INCY) + IMPLICIT NONE * * -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/cgbmv.f b/BLAS/SRC/cgbmv.f index 42a1da0335..238bf87e2d 100644 --- a/BLAS/SRC/cgbmv.f +++ b/BLAS/SRC/cgbmv.f @@ -148,6 +148,8 @@ *> ( 1 + ( n - 1 )*abs( INCY ) ) otherwise. *> Before entry, the incremented array Y must contain the *> vector y. On exit, Y is overwritten by the updated vector y. +*> If either m or n is zero, then Y not referenced and the function +*> performs a quick return. *> \endverbatim *> *> \param[in] INCY @@ -165,7 +167,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex_blas_level2 +*> \ingroup gbmv * *> \par Further Details: * ===================== @@ -183,7 +185,9 @@ *> \endverbatim *> * ===================================================================== - SUBROUTINE CGBMV(TRANS,M,N,KL,KU,ALPHA,A,LDA,X,INCX,BETA,Y,INCY) + SUBROUTINE CGBMV(TRANS,M,N,KL,KU,ALPHA,A,LDA,X,INCX, + + BETA,Y,INCY) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/cgemm.f b/BLAS/SRC/cgemm.f index baefe21e8b..7d62b66f69 100644 --- a/BLAS/SRC/cgemm.f +++ b/BLAS/SRC/cgemm.f @@ -35,6 +35,16 @@ *> *> alpha and beta are scalars, and A, B and C are matrices, with op( A ) *> an m by k matrix, op( B ) a k by n matrix and C an m by n matrix. +*> +*> Note: if alpha and/or beta is zero, some parts of the matrix-matrix +*> operations are not performed. This results in the following NaN/Inf +*> propagation quirks: +*> +*> 1. If alpha is zero, NaNs or Infs in A or B do not affect the result. +*> 2. If both alpha and beta are zero, then a zero matrix is returned in C, +*> irrespective of any NaNs or Infs in A, B or C. +*> 3. If only beta is zero, alpha*op( A )*op( B ) is returned, irrespective +*> of any NaNs or Infs in C. *> \endverbatim * * Arguments: @@ -92,7 +102,9 @@ *> \param[in] ALPHA *> \verbatim *> ALPHA is COMPLEX -*> On entry, ALPHA specifies the scalar alpha. +*> On entry, ALPHA specifies the scalar alpha. If ALPHA is zero the +*> values in A and B do not affect the result. This also means that +*> NaN/Inf propagation from A and B is inhibited if ALPHA is zero. *> \endverbatim *> *> \param[in] A @@ -102,7 +114,10 @@ *> Before entry with TRANSA = 'N' or 'n', the leading m by k *> part of the array A must contain the matrix A, otherwise *> the leading k by m part of the array A must contain the -*> matrix A. +*> matrix A, except if ALPHA is zero. +*> If ALPHA is zero, none of the values in A affect the result, even +*> if they are NaN/Inf. This also implies that if ALPHA is zero, +*> the matrix elements of A need not be initialized by the caller. *> \endverbatim *> *> \param[in] LDA @@ -121,7 +136,10 @@ *> Before entry with TRANSB = 'N' or 'n', the leading k by n *> part of the array B must contain the matrix B, otherwise *> the leading n by k part of the array B must contain the -*> matrix B. +*> matrix B, except if ALPHA is zero. +*> If ALPHA is zero, none of the values in B affect the result, even +*> if they are NaN/Inf. This also implies that if ALPHA is zero, +*> the matrix elements of B need not be initialized by the caller. *> \endverbatim *> *> \param[in] LDB @@ -136,16 +154,19 @@ *> \param[in] BETA *> \verbatim *> BETA is COMPLEX -*> On entry, BETA specifies the scalar beta. When BETA is -*> supplied as zero then C need not be set on input. +*> On entry, BETA specifies the scalar beta. If BETA is zero the +*> values in C do not affect the result. This also means that +*> NaN/Inf propagation from C is inhibited if BETA is zero. *> \endverbatim *> *> \param[in,out] C *> \verbatim *> C is COMPLEX array, dimension ( LDC, N ) *> Before entry, the leading m by n part of the array C must -*> contain the matrix C, except when beta is zero, in which -*> case C need not be set on entry. +*> contain the matrix C, except if beta is zero. +*> If beta is zero, none of the values in C affect the result, even +*> if they are NaN/Inf. This also implies that if beta is zero, +*> the matrix elements of C need not be initialized by the caller. *> On exit, the array C is overwritten by the m by n matrix *> ( alpha*op( A )*op( B ) + beta*C ). *> \endverbatim @@ -166,7 +187,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex_blas_level3 +*> \ingroup gemm * *> \par Further Details: * ===================== @@ -183,7 +204,9 @@ *> \endverbatim *> * ===================================================================== - SUBROUTINE CGEMM(TRANSA,TRANSB,M,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC) + SUBROUTINE CGEMM(TRANSA,TRANSB,M,N,K,ALPHA,A,LDA,B,LDB, + + BETA,C,LDC) + IMPLICIT NONE * * -- Reference BLAS level3 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/cgemmtr.f b/BLAS/SRC/cgemmtr.f new file mode 100644 index 0000000000..a5f552960d --- /dev/null +++ b/BLAS/SRC/cgemmtr.f @@ -0,0 +1,569 @@ +*> \brief \b CGEMMTR +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +* Definition: +* =========== +* +* SUBROUTINE CGEMMTR(UPLO,TRANSA,TRANSB,N,K,ALPHA,A,LDA,B,LDB,BETA, +* C,LDC) +* +* .. Scalar Arguments .. +* COMPLEX ALPHA,BETA +* INTEGER K,LDA,LDB,LDC,N +* CHARACTER TRANSA,TRANSB, UPLO +* .. +* .. Array Arguments .. +* COMPLEX A(LDA,*),B(LDB,*),C(LDC,*) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> CGEMMTR performs one of the matrix-matrix operations +*> +*> C := alpha*op( A )*op( B ) + beta*C, +*> +*> where op( X ) is one of +*> +*> op( X ) = X or op( X ) = X**T, +*> +*> alpha and beta are scalars, and A, B and C are matrices, with op( A ) +*> an n by k matrix, op( B ) a k by n matrix and C an n by n matrix. +*> Thereby, the routine only accesses and updates the upper or lower +*> triangular part of the result matrix C. This behaviour can be used if +*> the resulting matrix C is known to be Hermitian or symmetric. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] UPLO +*> \verbatim +*> UPLO is CHARACTER*1 +*> On entry, UPLO specifies whether the lower or the upper +*> triangular part of C is access and updated. +*> +*> UPLO = 'L' or 'l', the lower triangular part of C is used. +*> +*> UPLO = 'U' or 'u', the upper triangular part of C is used. +*> \endverbatim +* +*> \param[in] TRANSA +*> \verbatim +*> TRANSA is CHARACTER*1 +*> On entry, TRANSA specifies the form of op( A ) to be used in +*> the matrix multiplication as follows: +*> +*> TRANSA = 'N' or 'n', op( A ) = A. +*> +*> TRANSA = 'T' or 't', op( A ) = A**T. +*> +*> TRANSA = 'C' or 'c', op( A ) = A**H. +*> \endverbatim +*> +*> \param[in] TRANSB +*> \verbatim +*> TRANSB is CHARACTER*1 +*> On entry, TRANSB specifies the form of op( B ) to be used in +*> the matrix multiplication as follows: +*> +*> TRANSB = 'N' or 'n', op( B ) = B. +*> +*> TRANSB = 'T' or 't', op( B ) = B**T. +*> +*> TRANSB = 'C' or 'c', op( B ) = B**H. +*> \endverbatim +*> +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> On entry, N specifies the number of rows and columns of +*> the matrix C, the number of columns of op(B) and the number +*> of rows of op(A). N must be at least zero. +*> \endverbatim +*> +*> \param[in] K +*> \verbatim +*> K is INTEGER +*> On entry, K specifies the number of columns of the matrix +*> op( A ) and the number of rows of the matrix op( B ). K must +*> be at least zero. +*> \endverbatim +*> +*> \param[in] ALPHA +*> \verbatim +*> ALPHA is COMPLEX. +*> On entry, ALPHA specifies the scalar alpha. +*> \endverbatim +*> +*> \param[in] A +*> \verbatim +*> A is COMPLEX array, dimension ( LDA, ka ), where ka is +*> k when TRANSA = 'N' or 'n', and is n otherwise. +*> Before entry with TRANSA = 'N' or 'n', the leading n by k +*> part of the array A must contain the matrix A, otherwise +*> the leading k by m part of the array A must contain the +*> matrix A. +*> \endverbatim +*> +*> \param[in] LDA +*> \verbatim +*> LDA is INTEGER +*> On entry, LDA specifies the first dimension of A as declared +*> in the calling (sub) program. When TRANSA = 'N' or 'n' then +*> LDA must be at least max( 1, n ), otherwise LDA must be at +*> least max( 1, k ). +*> \endverbatim +*> +*> \param[in] B +*> \verbatim +*> B is COMPLEX array, dimension ( LDB, kb ), where kb is +*> n when TRANSB = 'N' or 'n', and is k otherwise. +*> Before entry with TRANSB = 'N' or 'n', the leading k by n +*> part of the array B must contain the matrix B, otherwise +*> the leading n by k part of the array B must contain the +*> matrix B. +*> \endverbatim +*> +*> \param[in] LDB +*> \verbatim +*> LDB is INTEGER +*> On entry, LDB specifies the first dimension of B as declared +*> in the calling (sub) program. When TRANSB = 'N' or 'n' then +*> LDB must be at least max( 1, k ), otherwise LDB must be at +*> least max( 1, n ). +*> \endverbatim +*> +*> \param[in] BETA +*> \verbatim +*> BETA is COMPLEX. +*> On entry, BETA specifies the scalar beta. When BETA is +*> supplied as zero then C need not be set on input. +*> \endverbatim +*> +*> \param[in,out] C +*> \verbatim +*> C is COMPLEX array, dimension ( LDC, N ) +*> Before entry, the leading n by n part of the array C must +*> contain the matrix C, except when beta is zero, in which +*> case C need not be set on entry. +*> On exit, the upper or lower triangular part of the matrix +*> C is overwritten by the n by n matrix +*> ( alpha*op( A )*op( B ) + beta*C ). +*> \endverbatim +*> +*> \param[in] LDC +*> \verbatim +*> LDC is INTEGER +*> On entry, LDC specifies the first dimension of C as declared +*> in the calling (sub) program. LDC must be at least +*> max( 1, n ). +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Martin Koehler +* +*> \ingroup gemmtr +* +*> \par Further Details: +* ===================== +*> +*> \verbatim +*> +*> Level 3 Blas routine. +*> +*> -- Written on 19-July-2023. +*> Martin Koehler, MPI Magdeburg +*> \endverbatim +*> +* ===================================================================== + SUBROUTINE CGEMMTR(UPLO,TRANSA,TRANSB,N,K,ALPHA,A,LDA,B,LDB, + + BETA,C,LDC) + IMPLICIT NONE +* +* -- Reference BLAS level3 routine -- +* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* +* .. Scalar Arguments .. + COMPLEX ALPHA,BETA + INTEGER K,LDA,LDB,LDC,N + CHARACTER TRANSA,TRANSB,UPLO +* .. +* .. Array Arguments .. + COMPLEX A(LDA,*),B(LDB,*),C(LDC,*) +* .. +* +* ===================================================================== +* +* .. External Functions .. + LOGICAL LSAME + EXTERNAL LSAME +* .. +* .. External Subroutines .. + EXTERNAL XERBLA +* .. +* .. Intrinsic Functions .. + INTRINSIC CONJG,MAX +* .. +* .. Local Scalars .. + COMPLEX TEMP + INTEGER I,INFO,J,L,NROWA,NROWB,ISTART, ISTOP + LOGICAL CONJA,CONJB,NOTA,NOTB,UPPER +* .. +* .. Parameters .. + COMPLEX ONE + PARAMETER (ONE= (1.0E+0,0.0E+0)) + COMPLEX ZERO + PARAMETER (ZERO= (0.0E+0,0.0E+0)) +* .. +* +* Set NOTA and NOTB as true if A and B respectively are not +* conjugated or transposed, set CONJA and CONJB as true if A and +* B respectively are to be transposed but not conjugated and set +* NROWA and NROWB as the number of rows of A and B respectively. +* + NOTA = LSAME(TRANSA,'N') + NOTB = LSAME(TRANSB,'N') + CONJA = LSAME(TRANSA,'C') + CONJB = LSAME(TRANSB,'C') + IF (NOTA) THEN + NROWA = N + ELSE + NROWA = K + END IF + IF (NOTB) THEN + NROWB = K + ELSE + NROWB = N + END IF + UPPER = LSAME(UPLO, 'U') + +* +* Test the input parameters. +* + INFO = 0 + IF ((.NOT. UPPER) .AND. (.NOT. LSAME(UPLO, 'L'))) THEN + INFO = 1 + ELSE IF ((.NOT.NOTA) .AND. (.NOT.CONJA) .AND. + + (.NOT.LSAME(TRANSA,'T'))) THEN + INFO = 2 + ELSE IF ((.NOT.NOTB) .AND. (.NOT.CONJB) .AND. + + (.NOT.LSAME(TRANSB,'T'))) THEN + INFO = 3 + ELSE IF (N.LT.0) THEN + INFO = 4 + ELSE IF (K.LT.0) THEN + INFO = 5 + ELSE IF (LDA.LT.MAX(1,NROWA)) THEN + INFO = 8 + ELSE IF (LDB.LT.MAX(1,NROWB)) THEN + INFO = 10 + ELSE IF (LDC.LT.MAX(1,N)) THEN + INFO = 13 + END IF + IF (INFO.NE.0) THEN + CALL XERBLA('CGEMMTR',INFO) + RETURN + END IF +* +* Quick return if possible. +* + IF (N.EQ.0) RETURN +* +* And when alpha.eq.zero. +* + IF (ALPHA.EQ.ZERO) THEN + IF (BETA.EQ.ZERO) THEN + DO 20 J = 1,N + IF (UPPER) THEN + ISTART = 1 + ISTOP = J + ELSE + ISTART = J + ISTOP = N + END IF + + DO 10 I = ISTART, ISTOP + C(I,J) = ZERO + 10 CONTINUE + 20 CONTINUE + ELSE + DO 40 J = 1,N + IF (UPPER) THEN + ISTART = 1 + ISTOP = J + ELSE + ISTART = J + ISTOP = N + END IF + DO 30 I = ISTART, ISTOP + C(I,J) = BETA*C(I,J) + 30 CONTINUE + 40 CONTINUE + END IF + RETURN + END IF +* +* Start the operations. +* + IF (NOTB) THEN + IF (NOTA) THEN +* +* Form C := alpha*A*B + beta*C. +* + DO 90 J = 1,N + IF (UPPER) THEN + ISTART = 1 + ISTOP = J + ELSE + ISTART = J + ISTOP = N + END IF + IF (BETA.EQ.ZERO) THEN + DO 50 I = ISTART, ISTOP + C(I,J) = ZERO + 50 CONTINUE + ELSE IF (BETA.NE.ONE) THEN + DO 60 I = ISTART, ISTOP + C(I,J) = BETA*C(I,J) + 60 CONTINUE + END IF + DO 80 L = 1,K + TEMP = ALPHA*B(L,J) + DO 70 I = ISTART, ISTOP + C(I,J) = C(I,J) + TEMP*A(I,L) + 70 CONTINUE + 80 CONTINUE + 90 CONTINUE + ELSE IF (CONJA) THEN +* +* Form C := alpha*A**H*B + beta*C. +* + DO 120 J = 1,N + IF (UPPER) THEN + ISTART = 1 + ISTOP = J + ELSE + ISTART = J + ISTOP = N + END IF + + DO 110 I = ISTART, ISTOP + TEMP = ZERO + DO 100 L = 1,K + TEMP = TEMP + CONJG(A(L,I))*B(L,J) + 100 CONTINUE + IF (BETA.EQ.ZERO) THEN + C(I,J) = ALPHA*TEMP + ELSE + C(I,J) = ALPHA*TEMP + BETA*C(I,J) + END IF + 110 CONTINUE + 120 CONTINUE + ELSE +* +* Form C := alpha*A**T*B + beta*C +* + DO 150 J = 1,N + IF (UPPER) THEN + ISTART = 1 + ISTOP = J + ELSE + ISTART = J + ISTOP = N + END IF + + DO 140 I = ISTART, ISTOP + TEMP = ZERO + DO 130 L = 1,K + TEMP = TEMP + A(L,I)*B(L,J) + 130 CONTINUE + IF (BETA.EQ.ZERO) THEN + C(I,J) = ALPHA*TEMP + ELSE + C(I,J) = ALPHA*TEMP + BETA*C(I,J) + END IF + 140 CONTINUE + 150 CONTINUE + END IF + ELSE IF (NOTA) THEN + IF (CONJB) THEN +* +* Form C := alpha*A*B**H + beta*C. +* + DO 200 J = 1,N + IF (UPPER) THEN + ISTART = 1 + ISTOP = J + ELSE + ISTART = J + ISTOP = N + END IF + + IF (BETA.EQ.ZERO) THEN + DO 160 I = ISTART,ISTOP + C(I,J) = ZERO + 160 CONTINUE + ELSE IF (BETA.NE.ONE) THEN + DO 170 I = ISTART, ISTOP + C(I,J) = BETA*C(I,J) + 170 CONTINUE + END IF + DO 190 L = 1,K + TEMP = ALPHA*CONJG(B(J,L)) + DO 180 I = ISTART, ISTOP + C(I,J) = C(I,J) + TEMP*A(I,L) + 180 CONTINUE + 190 CONTINUE + 200 CONTINUE + ELSE +* +* Form C := alpha*A*B**T + beta*C +* + DO 250 J = 1,N + IF (UPPER) THEN + ISTART = 1 + ISTOP = J + ELSE + ISTART = J + ISTOP = N + END IF + + IF (BETA.EQ.ZERO) THEN + DO 210 I = ISTART, ISTOP + C(I,J) = ZERO + 210 CONTINUE + ELSE IF (BETA.NE.ONE) THEN + DO 220 I = ISTART, ISTOP + C(I,J) = BETA*C(I,J) + 220 CONTINUE + END IF + DO 240 L = 1,K + TEMP = ALPHA*B(J,L) + DO 230 I = ISTART, ISTOP + C(I,J) = C(I,J) + TEMP*A(I,L) + 230 CONTINUE + 240 CONTINUE + 250 CONTINUE + END IF + ELSE IF (CONJA) THEN + IF (CONJB) THEN +* +* Form C := alpha*A**H*B**H + beta*C. +* + DO 280 J = 1,N + IF (UPPER) THEN + ISTART = 1 + ISTOP = J + ELSE + ISTART = J + ISTOP = N + END IF + + DO 270 I = ISTART, ISTOP + TEMP = ZERO + DO 260 L = 1,K + TEMP = TEMP + CONJG(A(L,I))*CONJG(B(J,L)) + 260 CONTINUE + IF (BETA.EQ.ZERO) THEN + C(I,J) = ALPHA*TEMP + ELSE + C(I,J) = ALPHA*TEMP + BETA*C(I,J) + END IF + 270 CONTINUE + 280 CONTINUE + ELSE +* +* Form C := alpha*A**H*B**T + beta*C +* + DO 310 J = 1,N + IF (UPPER) THEN + ISTART = 1 + ISTOP = J + ELSE + ISTART = J + ISTOP = N + END IF + + DO 300 I = ISTART, ISTOP + TEMP = ZERO + DO 290 L = 1,K + TEMP = TEMP + CONJG(A(L,I))*B(J,L) + 290 CONTINUE + IF (BETA.EQ.ZERO) THEN + C(I,J) = ALPHA*TEMP + ELSE + C(I,J) = ALPHA*TEMP + BETA*C(I,J) + END IF + 300 CONTINUE + 310 CONTINUE + END IF + ELSE + IF (CONJB) THEN +* +* Form C := alpha*A**T*B**H + beta*C +* + DO 340 J = 1,N + IF (UPPER) THEN + ISTART = 1 + ISTOP = J + ELSE + ISTART = J + ISTOP = N + END IF + + DO 330 I = ISTART, ISTOP + TEMP = ZERO + DO 320 L = 1,K + TEMP = TEMP + A(L,I)*CONJG(B(J,L)) + 320 CONTINUE + IF (BETA.EQ.ZERO) THEN + C(I,J) = ALPHA*TEMP + ELSE + C(I,J) = ALPHA*TEMP + BETA*C(I,J) + END IF + 330 CONTINUE + 340 CONTINUE + ELSE +* +* Form C := alpha*A**T*B**T + beta*C +* + DO 370 J = 1,N + IF (UPPER) THEN + ISTART = 1 + ISTOP = J + ELSE + ISTART = J + ISTOP = N + END IF + + DO 360 I = ISTART, ISTOP + TEMP = ZERO + DO 350 L = 1,K + TEMP = TEMP + A(L,I)*B(J,L) + 350 CONTINUE + IF (BETA.EQ.ZERO) THEN + C(I,J) = ALPHA*TEMP + ELSE + C(I,J) = ALPHA*TEMP + BETA*C(I,J) + END IF + 360 CONTINUE + 370 CONTINUE + END IF + END IF +* + RETURN +* +* End of CGEMMTR +* + END diff --git a/BLAS/SRC/cgemv.f b/BLAS/SRC/cgemv.f index 574be07602..cb1232bc4d 100644 --- a/BLAS/SRC/cgemv.f +++ b/BLAS/SRC/cgemv.f @@ -119,6 +119,8 @@ *> Before entry with BETA non-zero, the incremented array Y *> must contain the vector y. On exit, Y is overwritten by the *> updated vector y. +*> If either m or n is zero, then Y not referenced and the function +*> performs a quick return. *> \endverbatim *> *> \param[in] INCY @@ -136,7 +138,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex_blas_level2 +*> \ingroup gemv * *> \par Further Details: * ===================== @@ -155,6 +157,7 @@ *> * ===================================================================== SUBROUTINE CGEMV(TRANS,M,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/cgerc.f b/BLAS/SRC/cgerc.f index 716628d8ad..3df05a5c5e 100644 --- a/BLAS/SRC/cgerc.f +++ b/BLAS/SRC/cgerc.f @@ -109,7 +109,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex_blas_level2 +*> \ingroup ger * *> \par Further Details: * ===================== @@ -127,6 +127,7 @@ *> * ===================================================================== SUBROUTINE CGERC(M,N,ALPHA,X,INCX,Y,INCY,A,LDA) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/cgeru.f b/BLAS/SRC/cgeru.f index 5ff8f9405d..065397831a 100644 --- a/BLAS/SRC/cgeru.f +++ b/BLAS/SRC/cgeru.f @@ -109,7 +109,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex_blas_level2 +*> \ingroup ger * *> \par Further Details: * ===================== @@ -127,6 +127,7 @@ *> * ===================================================================== SUBROUTINE CGERU(M,N,ALPHA,X,INCX,Y,INCY,A,LDA) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/chbmv.f b/BLAS/SRC/chbmv.f index bddab93259..25113ecb2b 100644 --- a/BLAS/SRC/chbmv.f +++ b/BLAS/SRC/chbmv.f @@ -165,7 +165,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex_blas_level2 +*> \ingroup hbmv * *> \par Further Details: * ===================== @@ -184,6 +184,7 @@ *> * ===================================================================== SUBROUTINE CHBMV(UPLO,N,K,ALPHA,A,LDA,X,INCX,BETA,Y,INCY) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/chemm.f b/BLAS/SRC/chemm.f index 5d66dda3d5..bc65e5323b 100644 --- a/BLAS/SRC/chemm.f +++ b/BLAS/SRC/chemm.f @@ -170,7 +170,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex_blas_level3 +*> \ingroup hemm * *> \par Further Details: * ===================== @@ -188,6 +188,7 @@ *> * ===================================================================== SUBROUTINE CHEMM(SIDE,UPLO,M,N,ALPHA,A,LDA,B,LDB,BETA,C,LDC) + IMPLICIT NONE * * -- Reference BLAS level3 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -238,9 +239,11 @@ SUBROUTINE CHEMM(SIDE,UPLO,M,N,ALPHA,A,LDA,B,LDB,BETA,C,LDC) * Test the input parameters. * INFO = 0 - IF ((.NOT.LSAME(SIDE,'L')) .AND. (.NOT.LSAME(SIDE,'R'))) THEN + IF ((.NOT.LSAME(SIDE,'L')) .AND. + + (.NOT.LSAME(SIDE,'R'))) THEN INFO = 1 - ELSE IF ((.NOT.UPPER) .AND. (.NOT.LSAME(UPLO,'L'))) THEN + ELSE IF ((.NOT.UPPER) .AND. + + (.NOT.LSAME(UPLO,'L'))) THEN INFO = 2 ELSE IF (M.LT.0) THEN INFO = 3 diff --git a/BLAS/SRC/chemv.f b/BLAS/SRC/chemv.f index 288ab1436f..fbc4eca8f8 100644 --- a/BLAS/SRC/chemv.f +++ b/BLAS/SRC/chemv.f @@ -132,7 +132,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex_blas_level2 +*> \ingroup hemv * *> \par Further Details: * ===================== @@ -151,6 +151,7 @@ *> * ===================================================================== SUBROUTINE CHEMV(UPLO,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/cher.f b/BLAS/SRC/cher.f index 2695a7eb1b..63b630e7bd 100644 --- a/BLAS/SRC/cher.f +++ b/BLAS/SRC/cher.f @@ -114,7 +114,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex_blas_level2 +*> \ingroup her * *> \par Further Details: * ===================== @@ -132,6 +132,7 @@ *> * ===================================================================== SUBROUTINE CHER(UPLO,N,ALPHA,X,INCX,A,LDA) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/cher2.f b/BLAS/SRC/cher2.f index 68976b46ee..d6770a295e 100644 --- a/BLAS/SRC/cher2.f +++ b/BLAS/SRC/cher2.f @@ -129,7 +129,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex_blas_level2 +*> \ingroup her2 * *> \par Further Details: * ===================== @@ -147,6 +147,7 @@ *> * ===================================================================== SUBROUTINE CHER2(UPLO,N,ALPHA,X,INCX,Y,INCY,A,LDA) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/cher2k.f b/BLAS/SRC/cher2k.f index a77908738a..8cffc18211 100644 --- a/BLAS/SRC/cher2k.f +++ b/BLAS/SRC/cher2k.f @@ -173,7 +173,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex_blas_level3 +*> \ingroup her2k * *> \par Further Details: * ===================== @@ -194,6 +194,7 @@ *> * ===================================================================== SUBROUTINE CHER2K(UPLO,TRANS,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC) + IMPLICIT NONE * * -- Reference BLAS level3 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/cherk.f b/BLAS/SRC/cherk.f index 7aa8b33cd3..aad09b7dab 100644 --- a/BLAS/SRC/cherk.f +++ b/BLAS/SRC/cherk.f @@ -149,7 +149,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex_blas_level3 +*> \ingroup herk * *> \par Further Details: * ===================== @@ -170,6 +170,7 @@ *> * ===================================================================== SUBROUTINE CHERK(UPLO,TRANS,N,K,ALPHA,A,LDA,BETA,C,LDC) + IMPLICIT NONE * * -- Reference BLAS level3 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -352,7 +353,7 @@ SUBROUTINE CHERK(UPLO,TRANS,N,K,ALPHA,A,LDA,BETA,C,LDC) 200 CONTINUE RTEMP = ZERO DO 210 L = 1,K - RTEMP = RTEMP + CONJG(A(L,J))*A(L,J) + RTEMP = RTEMP + REAL(CONJG(A(L,J))*A(L,J)) 210 CONTINUE IF (BETA.EQ.ZERO) THEN C(J,J) = ALPHA*RTEMP @@ -364,7 +365,7 @@ SUBROUTINE CHERK(UPLO,TRANS,N,K,ALPHA,A,LDA,BETA,C,LDC) DO 260 J = 1,N RTEMP = ZERO DO 230 L = 1,K - RTEMP = RTEMP + CONJG(A(L,J))*A(L,J) + RTEMP = RTEMP + REAL(CONJG(A(L,J))*A(L,J)) 230 CONTINUE IF (BETA.EQ.ZERO) THEN C(J,J) = ALPHA*RTEMP diff --git a/BLAS/SRC/chpmv.f b/BLAS/SRC/chpmv.f index 459a9ba3ed..241906a8d8 100644 --- a/BLAS/SRC/chpmv.f +++ b/BLAS/SRC/chpmv.f @@ -127,7 +127,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex_blas_level2 +*> \ingroup hpmv * *> \par Further Details: * ===================== @@ -146,6 +146,7 @@ *> * ===================================================================== SUBROUTINE CHPMV(UPLO,N,ALPHA,AP,X,INCX,BETA,Y,INCY) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/chpr.f b/BLAS/SRC/chpr.f index 62a946f242..3d197f5142 100644 --- a/BLAS/SRC/chpr.f +++ b/BLAS/SRC/chpr.f @@ -109,7 +109,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex_blas_level2 +*> \ingroup hpr * *> \par Further Details: * ===================== @@ -127,6 +127,7 @@ *> * ===================================================================== SUBROUTINE CHPR(UPLO,N,ALPHA,X,INCX,AP) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/chpr2.f b/BLAS/SRC/chpr2.f index cb07168b0e..13e9d51848 100644 --- a/BLAS/SRC/chpr2.f +++ b/BLAS/SRC/chpr2.f @@ -124,7 +124,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex_blas_level2 +*> \ingroup hpr2 * *> \par Further Details: * ===================== @@ -142,6 +142,7 @@ *> * ===================================================================== SUBROUTINE CHPR2(UPLO,N,ALPHA,X,INCX,Y,INCY,AP) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/crotg.f90 b/BLAS/SRC/crotg.f90 index 7806140668..08f6cb1bf7 100644 --- a/BLAS/SRC/crotg.f90 +++ b/BLAS/SRC/crotg.f90 @@ -1,38 +1,37 @@ -!> \brief \b CROTG +!> \brief \b CROTG generates a Givens rotation with real cosine and complex sine. ! ! =========== DOCUMENTATION =========== ! ! Online html documentation available at ! http://www.netlib.org/lapack/explore-html/ ! -! Definition: -! =========== -! -! CROTG constructs a plane rotation -! [ c s ] [ a ] = [ r ] -! [ -conjg(s) c ] [ b ] [ 0 ] -! where c is real, s ic complex, and c**2 + conjg(s)*s = 1. -! !> \par Purpose: ! ============= !> !> \verbatim !> +!> CROTG constructs a plane rotation +!> [ c s ] [ a ] = [ r ] +!> [ -conjg(s) c ] [ b ] [ 0 ] +!> where c is real, s is complex, and c**2 + conjg(s)*s = 1. +!> !> The computation uses the formulas !> |x| = sqrt( Re(x)**2 + Im(x)**2 ) !> sgn(x) = x / |x| if x /= 0 !> = 1 if x = 0 !> c = |a| / sqrt(|a|**2 + |b|**2) !> s = sgn(a) * conjg(b) / sqrt(|a|**2 + |b|**2) -!> When a and b are real and r /= 0, the formulas simplify to !> r = sgn(a)*sqrt(|a|**2 + |b|**2) +!> When a and b are real and r /= 0, the formulas simplify to !> c = a / r !> s = b / r -!> the same as in CROTG when |a| > |b|. When |b| >= |a|, the -!> sign of c and s will be different from those computed by CROTG +!> the same as in SROTG when |a| > |b|. When |b| >= |a|, the +!> sign of c and s will be different from those computed by SROTG !> if the signs of a and b are not the same. !> !> \endverbatim +!> +!> @see lartg, @see lartgp ! ! Arguments: ! ========== @@ -65,20 +64,19 @@ ! Authors: ! ======== ! -!> \author Edward Anderson, Lockheed Martin +!> \author Weslley Pereira, University of Colorado Denver, USA ! -!> \par Contributors: -! ================== -!> -!> Weslley Pereira, University of Colorado Denver, USA +!> \date December 2021 ! -!> \ingroup single_blas_level1 +!> \ingroup rotg ! !> \par Further Details: ! ===================== !> !> \verbatim !> +!> Based on the algorithm from +!> !> Anderson E. (2017) !> Algorithm 978: Safe Scaling in the Level 1 BLAS !> ACM Trans Math Softw 44:1--28 @@ -88,6 +86,7 @@ ! ! ===================================================================== subroutine CROTG( a, b, c, s ) + implicit none integer, parameter :: wp = kind(1.e0) ! ! -- Reference BLAS level1 routine -- @@ -108,21 +107,14 @@ subroutine CROTG( a, b, c, s ) 1-minexponent(0._wp), & maxexponent(0._wp)-1 & ) - real(wp), parameter :: rtmin = sqrt( real(radix(0._wp),wp)**max( & - minexponent(0._wp)-1, & - 1-maxexponent(0._wp) & - ) / epsilon(0._wp) ) - real(wp), parameter :: rtmax = sqrt( real(radix(0._wp),wp)**max( & - 1-minexponent(0._wp), & - maxexponent(0._wp)-1 & - ) * epsilon(0._wp) ) + real(wp), parameter :: rtmin = sqrt( safmin ) ! .. ! .. Scalar Arguments .. real(wp) :: c complex(wp) :: a, b, s ! .. ! .. Local Scalars .. - real(wp) :: d, f1, f2, g1, g2, h2, p, u, uu, v, vv, w + real(wp) :: d, f1, f2, g1, g2, h2, u, v, w, rtmax complex(wp) :: f, fs, g, gs, r, t ! .. ! .. Intrinsic Functions .. @@ -144,30 +136,43 @@ subroutine CROTG( a, b, c, s ) r = f else if( f == czero ) then c = zero - g1 = max( abs(real(g)), abs(aimag(g)) ) - if( g1 > rtmin .and. g1 < rtmax ) then + if( real(g) == zero ) then + r = abs(aimag(g)) + s = conjg( g ) / r + elseif( aimag(g) == zero ) then + r = abs(real(g)) + s = conjg( g ) / r + else + g1 = max( abs(real(g)), abs(aimag(g)) ) + rtmax = sqrt( safmax/2 ) + if( g1 > rtmin .and. g1 < rtmax ) then ! ! Use unscaled algorithm ! - g2 = ABSSQ( g ) - d = sqrt( g2 ) - s = conjg( g ) / d - r = d - else +! The following two lines can be replaced by `d = abs( g )`. +! This algorithm do not use the intrinsic complex abs. + g2 = ABSSQ( g ) + d = sqrt( g2 ) + s = conjg( g ) / d + r = d + else ! ! Use scaled algorithm ! - u = min( safmax, max( safmin, g1 ) ) - uu = one / u - gs = g*uu - g2 = ABSSQ( gs ) - d = sqrt( g2 ) - s = conjg( gs ) / d - r = d*u + u = min( safmax, max( safmin, g1 ) ) + gs = g / u +! The following two lines can be replaced by `d = abs( gs )`. +! This algorithm do not use the intrinsic complex abs. + g2 = ABSSQ( gs ) + d = sqrt( g2 ) + s = conjg( gs ) / d + r = d*u + end if end if else f1 = max( abs(real(f)), abs(aimag(f)) ) g1 = max( abs(real(g)), abs(aimag(g)) ) + rtmax = sqrt( safmax/4 ) if( f1 > rtmin .and. f1 < rtmax .and. & g1 > rtmin .and. g1 < rtmax ) then ! @@ -176,32 +181,51 @@ subroutine CROTG( a, b, c, s ) f2 = ABSSQ( f ) g2 = ABSSQ( g ) h2 = f2 + g2 - if( f2 > rtmin .and. h2 < rtmax ) then - d = sqrt( f2*h2 ) + ! safmin <= f2 <= h2 <= safmax + if( f2 >= h2 * safmin ) then + ! safmin <= f2/h2 <= 1, and h2/f2 is finite + c = sqrt( f2 / h2 ) + r = f / c + rtmax = rtmax * 2 + if( f2 > rtmin .and. h2 < rtmax ) then + ! safmin <= sqrt( f2*h2 ) <= safmax + s = conjg( g ) * ( f / sqrt( f2*h2 ) ) + else + s = conjg( g ) * ( r / h2 ) + end if else - d = sqrt( f2 )*sqrt( h2 ) + ! f2/h2 <= safmin may be subnormal, and h2/f2 may overflow. + ! Moreover, + ! safmin <= f2*f2 * safmax < f2 * h2 < h2*h2 * safmin <= safmax, + ! sqrt(safmin) <= sqrt(f2 * h2) <= sqrt(safmax). + ! Also, + ! g2 >> f2, which means that h2 = g2. + d = sqrt( f2 * h2 ) + c = f2 / d + if( c >= safmin ) then + r = f / c + else + ! f2 / sqrt(f2 * h2) < safmin, then + ! sqrt(safmin) <= f2 * sqrt(safmax) <= h2 / sqrt(f2 * h2) <= h2 * (safmin / f2) <= h2 <= safmax + r = f * ( h2 / d ) + end if + s = conjg( g ) * ( f / d ) end if - p = 1 / d - c = f2*p - s = conjg( g )*( f*p ) - r = f*( h2*p ) else ! ! Use scaled algorithm ! u = min( safmax, max( safmin, f1, g1 ) ) - uu = one / u - gs = g*uu + gs = g / u g2 = ABSSQ( gs ) - if( f1*uu < rtmin ) then + if( f1 / u < rtmin ) then ! ! f is not well-scaled when scaled by g1. ! Use a different scaling for f. ! v = min( safmax, max( safmin, f1 ) ) - vv = one / v - w = v * uu - fs = f*vv + w = v / u + fs = f / v f2 = ABSSQ( fs ) h2 = f2*w**2 + g2 else @@ -209,19 +233,43 @@ subroutine CROTG( a, b, c, s ) ! Otherwise use the same scaling for f and g. ! w = one - fs = f*uu + fs = f / u f2 = ABSSQ( fs ) h2 = f2 + g2 end if - if( f2 > rtmin .and. h2 < rtmax ) then - d = sqrt( f2*h2 ) + ! safmin <= f2 <= h2 <= safmax + if( f2 >= h2 * safmin ) then + ! safmin <= f2/h2 <= 1, and h2/f2 is finite + c = sqrt( f2 / h2 ) + r = fs / c + rtmax = rtmax * 2 + if( f2 > rtmin .and. h2 < rtmax ) then + ! safmin <= sqrt( f2*h2 ) <= safmax + s = conjg( gs ) * ( fs / sqrt( f2*h2 ) ) + else + s = conjg( gs ) * ( r / h2 ) + end if else - d = sqrt( f2 )*sqrt( h2 ) + ! f2/h2 <= safmin may be subnormal, and h2/f2 may overflow. + ! Moreover, + ! safmin <= f2*f2 * safmax < f2 * h2 < h2*h2 * safmin <= safmax, + ! sqrt(safmin) <= sqrt(f2 * h2) <= sqrt(safmax). + ! Also, + ! g2 >> f2, which means that h2 = g2. + d = sqrt( f2 * h2 ) + c = f2 / d + if( c >= safmin ) then + r = fs / c + else + ! f2 / sqrt(f2 * h2) < safmin, then + ! sqrt(safmin) <= f2 * sqrt(safmax) <= h2 / sqrt(f2 * h2) <= h2 * (safmin / f2) <= h2 <= safmax + r = fs * ( h2 / d ) + end if + s = conjg( gs ) * ( fs / d ) end if - p = 1 / d - c = ( f2*p )*w - s = conjg( gs )*( fs*p ) - r = ( fs*( h2*p ) )*u + ! Rescale c and r + c = c * w + r = r * u end if end if a = r diff --git a/BLAS/SRC/cscal.f b/BLAS/SRC/cscal.f index b72c08e74c..9f61933a85 100644 --- a/BLAS/SRC/cscal.f +++ b/BLAS/SRC/cscal.f @@ -61,7 +61,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex_blas_level1 +*> \ingroup scal * *> \par Further Details: * ===================== @@ -75,6 +75,7 @@ *> * ===================================================================== SUBROUTINE CSCAL(N,CA,CX,INCX) + IMPLICIT NONE * * -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -93,7 +94,11 @@ SUBROUTINE CSCAL(N,CA,CX,INCX) * .. Local Scalars .. INTEGER I,NINCX * .. - IF (N.LE.0 .OR. INCX.LE.0) RETURN +* .. Parameters .. + COMPLEX ONE + PARAMETER (ONE= (1.0E+0,0.0E+0)) +* .. + IF (N.LE.0 .OR. INCX.LE.0 .OR. CA.EQ.ONE) RETURN IF (INCX.EQ.1) THEN * * code for increment equal to 1 diff --git a/BLAS/SRC/csrot.f b/BLAS/SRC/csrot.f index 2b4b92b722..795448e6b0 100644 --- a/BLAS/SRC/csrot.f +++ b/BLAS/SRC/csrot.f @@ -91,10 +91,11 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex_blas_level1 +*> \ingroup rot * * ===================================================================== SUBROUTINE CSROT( N, CX, INCX, CY, INCY, C, S ) + IMPLICIT NONE * * -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/csscal.f b/BLAS/SRC/csscal.f index 5c4da6d8db..b78c0acfa5 100644 --- a/BLAS/SRC/csscal.f +++ b/BLAS/SRC/csscal.f @@ -61,7 +61,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex_blas_level1 +*> \ingroup scal * *> \par Further Details: * ===================== @@ -75,6 +75,7 @@ *> * ===================================================================== SUBROUTINE CSSCAL(N,SA,CX,INCX) + IMPLICIT NONE * * -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -93,10 +94,14 @@ SUBROUTINE CSSCAL(N,SA,CX,INCX) * .. Local Scalars .. INTEGER I,NINCX * .. +* .. Parameters .. + REAL ONE + PARAMETER (ONE=1.0E+0) +* .. * .. Intrinsic Functions .. INTRINSIC AIMAG,CMPLX,REAL * .. - IF (N.LE.0 .OR. INCX.LE.0) RETURN + IF (N.LE.0 .OR. INCX.LE.0 .OR. SA.EQ.ONE) RETURN IF (INCX.EQ.1) THEN * * code for increment equal to 1 diff --git a/BLAS/SRC/cswap.f b/BLAS/SRC/cswap.f index 310bf18178..fcd3e60658 100644 --- a/BLAS/SRC/cswap.f +++ b/BLAS/SRC/cswap.f @@ -65,7 +65,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex_blas_level1 +*> \ingroup swap * *> \par Further Details: * ===================== @@ -78,6 +78,7 @@ *> * ===================================================================== SUBROUTINE CSWAP(N,CX,INCX,CY,INCY) + IMPLICIT NONE * * -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/csymm.f b/BLAS/SRC/csymm.f index ff6a6bf05b..96251885db 100644 --- a/BLAS/SRC/csymm.f +++ b/BLAS/SRC/csymm.f @@ -168,7 +168,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex_blas_level3 +*> \ingroup hemm * *> \par Further Details: * ===================== @@ -186,6 +186,7 @@ *> * ===================================================================== SUBROUTINE CSYMM(SIDE,UPLO,M,N,ALPHA,A,LDA,B,LDB,BETA,C,LDC) + IMPLICIT NONE * * -- Reference BLAS level3 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -236,9 +237,11 @@ SUBROUTINE CSYMM(SIDE,UPLO,M,N,ALPHA,A,LDA,B,LDB,BETA,C,LDC) * Test the input parameters. * INFO = 0 - IF ((.NOT.LSAME(SIDE,'L')) .AND. (.NOT.LSAME(SIDE,'R'))) THEN + IF ((.NOT.LSAME(SIDE,'L')) .AND. + + (.NOT.LSAME(SIDE,'R'))) THEN INFO = 1 - ELSE IF ((.NOT.UPPER) .AND. (.NOT.LSAME(UPLO,'L'))) THEN + ELSE IF ((.NOT.UPPER) .AND. + + (.NOT.LSAME(UPLO,'L'))) THEN INFO = 2 ELSE IF (M.LT.0) THEN INFO = 3 diff --git a/BLAS/SRC/csyr2k.f b/BLAS/SRC/csyr2k.f index 09751895d2..c688b8d361 100644 --- a/BLAS/SRC/csyr2k.f +++ b/BLAS/SRC/csyr2k.f @@ -167,7 +167,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex_blas_level3 +*> \ingroup her2k * *> \par Further Details: * ===================== @@ -185,6 +185,7 @@ *> * ===================================================================== SUBROUTINE CSYR2K(UPLO,TRANS,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC) + IMPLICIT NONE * * -- Reference BLAS level3 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/csyrk.f b/BLAS/SRC/csyrk.f index 97bde056cd..ec6ced98ae 100644 --- a/BLAS/SRC/csyrk.f +++ b/BLAS/SRC/csyrk.f @@ -146,7 +146,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex_blas_level3 +*> \ingroup herk * *> \par Further Details: * ===================== @@ -164,6 +164,7 @@ *> * ===================================================================== SUBROUTINE CSYRK(UPLO,TRANS,N,K,ALPHA,A,LDA,BETA,C,LDC) + IMPLICIT NONE * * -- Reference BLAS level3 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/ctbmv.f b/BLAS/SRC/ctbmv.f index c0be8f4ea5..adf9ca6ab7 100644 --- a/BLAS/SRC/ctbmv.f +++ b/BLAS/SRC/ctbmv.f @@ -164,7 +164,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex_blas_level2 +*> \ingroup tbmv * *> \par Further Details: * ===================== @@ -183,6 +183,7 @@ *> * ===================================================================== SUBROUTINE CTBMV(UPLO,TRANS,DIAG,N,K,A,LDA,X,INCX) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -223,10 +224,12 @@ SUBROUTINE CTBMV(UPLO,TRANS,DIAG,N,K,A,LDA,X,INCX) INFO = 0 IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN INFO = 1 - ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND. + ELSE IF (.NOT.LSAME(TRANS,'N') .AND. + + .NOT.LSAME(TRANS,'T') .AND. + .NOT.LSAME(TRANS,'C')) THEN INFO = 2 - ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN + ELSE IF (.NOT.LSAME(DIAG,'U') .AND. + + .NOT.LSAME(DIAG,'N')) THEN INFO = 3 ELSE IF (N.LT.0) THEN INFO = 4 diff --git a/BLAS/SRC/ctbsv.f b/BLAS/SRC/ctbsv.f index b3600e4636..c997997b89 100644 --- a/BLAS/SRC/ctbsv.f +++ b/BLAS/SRC/ctbsv.f @@ -168,7 +168,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex_blas_level2 +*> \ingroup tbsv * *> \par Further Details: * ===================== @@ -186,6 +186,7 @@ *> * ===================================================================== SUBROUTINE CTBSV(UPLO,TRANS,DIAG,N,K,A,LDA,X,INCX) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -226,10 +227,12 @@ SUBROUTINE CTBSV(UPLO,TRANS,DIAG,N,K,A,LDA,X,INCX) INFO = 0 IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN INFO = 1 - ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND. + ELSE IF (.NOT.LSAME(TRANS,'N') .AND. + + .NOT.LSAME(TRANS,'T') .AND. + .NOT.LSAME(TRANS,'C')) THEN INFO = 2 - ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN + ELSE IF (.NOT.LSAME(DIAG,'U') .AND. + + .NOT.LSAME(DIAG,'N')) THEN INFO = 3 ELSE IF (N.LT.0) THEN INFO = 4 diff --git a/BLAS/SRC/ctpmv.f b/BLAS/SRC/ctpmv.f index b4651a2a39..efb5dd9255 100644 --- a/BLAS/SRC/ctpmv.f +++ b/BLAS/SRC/ctpmv.f @@ -120,7 +120,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex_blas_level2 +*> \ingroup tpmv * *> \par Further Details: * ===================== @@ -139,6 +139,7 @@ *> * ===================================================================== SUBROUTINE CTPMV(UPLO,TRANS,DIAG,N,AP,X,INCX) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -179,10 +180,12 @@ SUBROUTINE CTPMV(UPLO,TRANS,DIAG,N,AP,X,INCX) INFO = 0 IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN INFO = 1 - ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND. + ELSE IF (.NOT.LSAME(TRANS,'N') .AND. + + .NOT.LSAME(TRANS,'T') .AND. + .NOT.LSAME(TRANS,'C')) THEN INFO = 2 - ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN + ELSE IF (.NOT.LSAME(DIAG,'U') .AND. + + .NOT.LSAME(DIAG,'N')) THEN INFO = 3 ELSE IF (N.LT.0) THEN INFO = 4 diff --git a/BLAS/SRC/ctpsv.f b/BLAS/SRC/ctpsv.f index d306cc2380..0ee6cf8db5 100644 --- a/BLAS/SRC/ctpsv.f +++ b/BLAS/SRC/ctpsv.f @@ -123,7 +123,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex_blas_level2 +*> \ingroup tpsv * *> \par Further Details: * ===================== @@ -141,6 +141,7 @@ *> * ===================================================================== SUBROUTINE CTPSV(UPLO,TRANS,DIAG,N,AP,X,INCX) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -181,10 +182,12 @@ SUBROUTINE CTPSV(UPLO,TRANS,DIAG,N,AP,X,INCX) INFO = 0 IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN INFO = 1 - ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND. + ELSE IF (.NOT.LSAME(TRANS,'N') .AND. + + .NOT.LSAME(TRANS,'T') .AND. + .NOT.LSAME(TRANS,'C')) THEN INFO = 2 - ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN + ELSE IF (.NOT.LSAME(DIAG,'U') .AND. + + .NOT.LSAME(DIAG,'N')) THEN INFO = 3 ELSE IF (N.LT.0) THEN INFO = 4 diff --git a/BLAS/SRC/ctrmm.f b/BLAS/SRC/ctrmm.f index 2597372136..01ada82975 100644 --- a/BLAS/SRC/ctrmm.f +++ b/BLAS/SRC/ctrmm.f @@ -156,7 +156,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex_blas_level3 +*> \ingroup trmm * *> \par Further Details: * ===================== @@ -174,6 +174,7 @@ *> * ===================================================================== SUBROUTINE CTRMM(SIDE,UPLO,TRANSA,DIAG,M,N,ALPHA,A,LDA,B,LDB) + IMPLICIT NONE * * -- Reference BLAS level3 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -233,7 +234,8 @@ SUBROUTINE CTRMM(SIDE,UPLO,TRANSA,DIAG,M,N,ALPHA,A,LDA,B,LDB) + (.NOT.LSAME(TRANSA,'T')) .AND. + (.NOT.LSAME(TRANSA,'C'))) THEN INFO = 3 - ELSE IF ((.NOT.LSAME(DIAG,'U')) .AND. (.NOT.LSAME(DIAG,'N'))) THEN + ELSE IF ((.NOT.LSAME(DIAG,'U')) .AND. + + (.NOT.LSAME(DIAG,'N'))) THEN INFO = 4 ELSE IF (M.LT.0) THEN INFO = 5 diff --git a/BLAS/SRC/ctrmv.f b/BLAS/SRC/ctrmv.f index 2404b3deb1..63a6c2a9b9 100644 --- a/BLAS/SRC/ctrmv.f +++ b/BLAS/SRC/ctrmv.f @@ -125,7 +125,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex_blas_level2 +*> \ingroup trmv * *> \par Further Details: * ===================== @@ -144,6 +144,7 @@ *> * ===================================================================== SUBROUTINE CTRMV(UPLO,TRANS,DIAG,N,A,LDA,X,INCX) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -184,10 +185,12 @@ SUBROUTINE CTRMV(UPLO,TRANS,DIAG,N,A,LDA,X,INCX) INFO = 0 IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN INFO = 1 - ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND. + ELSE IF (.NOT.LSAME(TRANS,'N') .AND. + + .NOT.LSAME(TRANS,'T') .AND. + .NOT.LSAME(TRANS,'C')) THEN INFO = 2 - ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN + ELSE IF (.NOT.LSAME(DIAG,'U') .AND. + + .NOT.LSAME(DIAG,'N')) THEN INFO = 3 ELSE IF (N.LT.0) THEN INFO = 4 diff --git a/BLAS/SRC/ctrsm.f b/BLAS/SRC/ctrsm.f index 7da6cfe59a..6275d4a59b 100644 --- a/BLAS/SRC/ctrsm.f +++ b/BLAS/SRC/ctrsm.f @@ -159,7 +159,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex_blas_level3 +*> \ingroup trsm * *> \par Further Details: * ===================== @@ -177,6 +177,7 @@ *> * ===================================================================== SUBROUTINE CTRSM(SIDE,UPLO,TRANSA,DIAG,M,N,ALPHA,A,LDA,B,LDB) + IMPLICIT NONE * * -- Reference BLAS level3 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -236,7 +237,8 @@ SUBROUTINE CTRSM(SIDE,UPLO,TRANSA,DIAG,M,N,ALPHA,A,LDA,B,LDB) + (.NOT.LSAME(TRANSA,'T')) .AND. + (.NOT.LSAME(TRANSA,'C'))) THEN INFO = 3 - ELSE IF ((.NOT.LSAME(DIAG,'U')) .AND. (.NOT.LSAME(DIAG,'N'))) THEN + ELSE IF ((.NOT.LSAME(DIAG,'U')) .AND. + + (.NOT.LSAME(DIAG,'N'))) THEN INFO = 4 ELSE IF (M.LT.0) THEN INFO = 5 diff --git a/BLAS/SRC/ctrsv.f b/BLAS/SRC/ctrsv.f index de0640e4bd..8340bd12e9 100644 --- a/BLAS/SRC/ctrsv.f +++ b/BLAS/SRC/ctrsv.f @@ -128,7 +128,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex_blas_level2 +*> \ingroup trsv * *> \par Further Details: * ===================== @@ -146,6 +146,7 @@ *> * ===================================================================== SUBROUTINE CTRSV(UPLO,TRANS,DIAG,N,A,LDA,X,INCX) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -186,10 +187,12 @@ SUBROUTINE CTRSV(UPLO,TRANS,DIAG,N,A,LDA,X,INCX) INFO = 0 IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN INFO = 1 - ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND. + ELSE IF (.NOT.LSAME(TRANS,'N') .AND. + + .NOT.LSAME(TRANS,'T') .AND. + .NOT.LSAME(TRANS,'C')) THEN INFO = 2 - ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN + ELSE IF (.NOT.LSAME(DIAG,'U') .AND. + + .NOT.LSAME(DIAG,'N')) THEN INFO = 3 ELSE IF (N.LT.0) THEN INFO = 4 diff --git a/BLAS/SRC/dasum.f b/BLAS/SRC/dasum.f index 9a360b5acd..3a1c399a1f 100644 --- a/BLAS/SRC/dasum.f +++ b/BLAS/SRC/dasum.f @@ -54,7 +54,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup double_blas_level1 +*> \ingroup asum * *> \par Further Details: * ===================== @@ -68,6 +68,7 @@ *> * ===================================================================== DOUBLE PRECISION FUNCTION DASUM(N,DX,INCX) + IMPLICIT NONE * * -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/daxpby.f b/BLAS/SRC/daxpby.f new file mode 100644 index 0000000000..e42bece7b7 --- /dev/null +++ b/BLAS/SRC/daxpby.f @@ -0,0 +1,149 @@ +*> \brief \b DAXPBY +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +* Definition: +* =========== +* +* SUBROUTINE DAXPBY(N,DA,DX,INCX,DB,DY,INCY) +* +* .. Scalar Arguments .. +* DOUBLE PRECISION DA,DB +* INTEGER INCX,INCY,N +* .. +* .. Array Arguments .. +* DOUBLE PRECISION DX(*),DY(*) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> DAXPBY constant times a vector plus constant times a vector. +*> +*> Y = ALPHA * X + BETA * Y +*> +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> number of elements in input vector(s) +*> \endverbatim +*> +*> \param[in] DA +*> \verbatim +*> DA is DOUBLE PRECISION +*> On entry, DA specifies the scalar alpha. +*> \endverbatim +*> +*> \param[in] DX +*> \verbatim +*> DX is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) +*> \endverbatim +*> +*> \param[in] INCX +*> \verbatim +*> INCX is INTEGER +*> storage spacing between elements of DX +*> \endverbatim +*> +*> \param[in] DB +*> \verbatim +*> DB is DOUBLE PRECISION +*> On entry, DB specifies the scalar beta. +*> \endverbatim +*> +*> \param[in,out] DY +*> \verbatim +*> DY is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCY ) ) +*> \endverbatim +*> +*> \param[in] INCY +*> \verbatim +*> INCY is INTEGER +*> storage spacing between elements of DY +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +*> \author Martin Koehler, MPI Magdeburg +* +*> \ingroup axpby +* +* ===================================================================== + SUBROUTINE DAXPBY(N,DA,DX,INCX,DB,DY,INCY) + IMPLICIT NONE +* +* -- Reference BLAS level1 routine -- +* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* +* .. Scalar Arguments .. + DOUBLE PRECISION DA,DB + INTEGER INCX,INCY,N +* .. +* .. Array Arguments .. + DOUBLE PRECISION DX(*),DY(*) +* .. +* .. External Subroutines + EXTERNAL DSCAL +* +* ===================================================================== +* +* .. Local Scalars .. + INTEGER I,IX,IY,M,MP1 +* .. +* .. Intrinsic Functions .. + INTRINSIC MOD +* .. + IF (N.LE.0) RETURN + +* Scale if DA.EQ.0 + IF (DA.EQ.0.0D0 .AND. DB.NE.0.0D0) THEN + CALL DSCAL(N, DB, DY, INCY) + RETURN + END IF + + IF (INCX.EQ.1 .AND. INCY.EQ.1) THEN +* +* code for both increments equal to 1 +* +* +* + DO I = 1,N + DY(I) = DB*DY(I) + DA*DX(I) + END DO + ELSE +* +* code for unequal increments or equal increments +* not equal to 1 +* + IX = 1 + IY = 1 + IF (INCX.LT.0) IX = (-N+1)*INCX + 1 + IF (INCY.LT.0) IY = (-N+1)*INCY + 1 + DO I = 1,N + DY(IY) = DB*DY(IY) + DA*DX(IX) + IX = IX + INCX + IY = IY + INCY + END DO + END IF + RETURN +* +* End of DAXPBY +* + END diff --git a/BLAS/SRC/daxpy.f b/BLAS/SRC/daxpy.f index 421f7c630b..3385e30b6a 100644 --- a/BLAS/SRC/daxpy.f +++ b/BLAS/SRC/daxpy.f @@ -73,7 +73,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup double_blas_level1 +*> \ingroup axpy * *> \par Further Details: * ===================== @@ -86,6 +86,7 @@ *> * ===================================================================== SUBROUTINE DAXPY(N,DA,DX,INCX,DY,INCY) + IMPLICIT NONE * * -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/dcabs1.f b/BLAS/SRC/dcabs1.f index f6212a8595..9014cd6bfe 100644 --- a/BLAS/SRC/dcabs1.f +++ b/BLAS/SRC/dcabs1.f @@ -40,10 +40,11 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup double_blas_level1 +*> \ingroup abs1 * * ===================================================================== DOUBLE PRECISION FUNCTION DCABS1(Z) + IMPLICIT NONE * * -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/dcopy.f b/BLAS/SRC/dcopy.f index ded46c5ecf..284caac1bc 100644 --- a/BLAS/SRC/dcopy.f +++ b/BLAS/SRC/dcopy.f @@ -66,7 +66,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup double_blas_level1 +*> \ingroup copy * *> \par Further Details: * ===================== @@ -79,6 +79,7 @@ *> * ===================================================================== SUBROUTINE DCOPY(N,DX,INCX,DY,INCY) + IMPLICIT NONE * * -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/ddot.f b/BLAS/SRC/ddot.f index 683a04bd46..467123fa30 100644 --- a/BLAS/SRC/ddot.f +++ b/BLAS/SRC/ddot.f @@ -66,7 +66,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup double_blas_level1 +*> \ingroup dot * *> \par Further Details: * ===================== @@ -79,6 +79,7 @@ *> * ===================================================================== DOUBLE PRECISION FUNCTION DDOT(N,DX,INCX,DY,INCY) + IMPLICIT NONE * * -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/dgbmv.f b/BLAS/SRC/dgbmv.f index 4c8f088b00..c54d5bde1f 100644 --- a/BLAS/SRC/dgbmv.f +++ b/BLAS/SRC/dgbmv.f @@ -146,6 +146,8 @@ *> ( 1 + ( n - 1 )*abs( INCY ) ) otherwise. *> Before entry, the incremented array Y must contain the *> vector y. On exit, Y is overwritten by the updated vector y. +*> If either m or n is zero, then Y not referenced and the function +*> performs a quick return. *> \endverbatim *> *> \param[in] INCY @@ -163,7 +165,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup double_blas_level2 +*> \ingroup gbmv * *> \par Further Details: * ===================== @@ -181,7 +183,9 @@ *> \endverbatim *> * ===================================================================== - SUBROUTINE DGBMV(TRANS,M,N,KL,KU,ALPHA,A,LDA,X,INCX,BETA,Y,INCY) + SUBROUTINE DGBMV(TRANS,M,N,KL,KU,ALPHA,A,LDA,X,INCX, + + BETA,Y,INCY) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/dgemm.f b/BLAS/SRC/dgemm.f index 8c1b4f2066..e8b15794d7 100644 --- a/BLAS/SRC/dgemm.f +++ b/BLAS/SRC/dgemm.f @@ -35,6 +35,16 @@ *> *> alpha and beta are scalars, and A, B and C are matrices, with op( A ) *> an m by k matrix, op( B ) a k by n matrix and C an m by n matrix. +*> +*> Note: if alpha and/or beta is zero, some parts of the matrix-matrix +*> operations are not performed. This results in the following NaN/Inf +*> propagation quirks: +*> +*> 1. If alpha is zero, NaNs or Infs in A or B do not affect the result. +*> 2. If both alpha and beta are zero, then a zero matrix is returned in C, +*> irrespective of any NaNs or Infs in A, B or C. +*> 3. If only beta is zero, alpha*op( A )*op( B ) is returned, irrespective +*> of any NaNs or Infs in C. *> \endverbatim * * Arguments: @@ -51,6 +61,9 @@ *> TRANSA = 'T' or 't', op( A ) = A**T. *> *> TRANSA = 'C' or 'c', op( A ) = A**T. +*> +*> Note: TRANSA = 'C' is supported for the sake of API consistency +*> between all ?GEMM variants. *> \endverbatim *> *> \param[in] TRANSB @@ -64,6 +77,9 @@ *> TRANSB = 'T' or 't', op( B ) = B**T. *> *> TRANSB = 'C' or 'c', op( B ) = B**T. +*> +*> Note: TRANSB = 'C' is supported for the sake of API consistency +*> between all ?GEMM variants. *> \endverbatim *> *> \param[in] M @@ -92,7 +108,9 @@ *> \param[in] ALPHA *> \verbatim *> ALPHA is DOUBLE PRECISION. -*> On entry, ALPHA specifies the scalar alpha. +*> On entry, ALPHA specifies the scalar alpha. If ALPHA is zero the +*> values in A and B do not affect the result. This also means that +*> NaN/Inf propagation from A and B is inhibited if ALPHA is zero. *> \endverbatim *> *> \param[in] A @@ -102,7 +120,10 @@ *> Before entry with TRANSA = 'N' or 'n', the leading m by k *> part of the array A must contain the matrix A, otherwise *> the leading k by m part of the array A must contain the -*> matrix A. +*> matrix A, except if ALPHA is zero. +*> If ALPHA is zero, none of the values in A affect the result, even +*> if they are NaN/Inf. This also implies that if ALPHA is zero, +*> the matrix elements of A need not be initialized by the caller. *> \endverbatim *> *> \param[in] LDA @@ -121,7 +142,10 @@ *> Before entry with TRANSB = 'N' or 'n', the leading k by n *> part of the array B must contain the matrix B, otherwise *> the leading n by k part of the array B must contain the -*> matrix B. +*> matrix B, except if ALPHA is zero. +*> If ALPHA is zero, none of the values in B affect the result, even +*> if they are NaN/Inf. This also implies that if ALPHA is zero, +*> the matrix elements of B need not be initialized by the caller. *> \endverbatim *> *> \param[in] LDB @@ -136,16 +160,19 @@ *> \param[in] BETA *> \verbatim *> BETA is DOUBLE PRECISION. -*> On entry, BETA specifies the scalar beta. When BETA is -*> supplied as zero then C need not be set on input. +*> On entry, BETA specifies the scalar beta. If BETA is zero the +*> values in C do not affect the result. This also means that +*> NaN/Inf propagation from C is inhibited if BETA is zero. *> \endverbatim *> *> \param[in,out] C *> \verbatim *> C is DOUBLE PRECISION array, dimension ( LDC, N ) *> Before entry, the leading m by n part of the array C must -*> contain the matrix C, except when beta is zero, in which -*> case C need not be set on entry. +*> contain the matrix C, except if beta is zero. +*> If beta is zero, none of the values in C affect the result, even +*> if they are NaN/Inf. This also implies that if beta is zero, +*> the matrix elements of C need not be initialized by the caller. *> On exit, the array C is overwritten by the m by n matrix *> ( alpha*op( A )*op( B ) + beta*C ). *> \endverbatim @@ -166,7 +193,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup double_blas_level3 +*> \ingroup gemm * *> \par Further Details: * ===================== @@ -183,7 +210,9 @@ *> \endverbatim *> * ===================================================================== - SUBROUTINE DGEMM(TRANSA,TRANSB,M,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC) + SUBROUTINE DGEMM(TRANSA,TRANSB,M,N,K,ALPHA,A,LDA,B,LDB, + + BETA,C,LDC) + IMPLICIT NONE * * -- Reference BLAS level3 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/dgemmtr.f b/BLAS/SRC/dgemmtr.f new file mode 100644 index 0000000000..cab5b71fc8 --- /dev/null +++ b/BLAS/SRC/dgemmtr.f @@ -0,0 +1,431 @@ +*> \brief \b DGEMMTR +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +* Definition: +* =========== +* +* SUBROUTINE DGEMMTR(UPLO,TRANSA,TRANSB,N,K,ALPHA,A,LDA,B,LDB,BETA, +* C,LDC) +* +* .. Scalar Arguments .. +* DOUBLE PRECISION ALPHA,BETA +* INTEGER K,LDA,LDB,LDC,N +* CHARACTER TRANSA,TRANSB, UPLO +* .. +* .. Array Arguments .. +* DOUBLE PRECISION A(LDA,*),B(LDB,*),C(LDC,*) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> DGEMMTR performs one of the matrix-matrix operations +*> +*> C := alpha*op( A )*op( B ) + beta*C, +*> +*> where op( X ) is one of +*> +*> op( X ) = X or op( X ) = X**T, +*> +*> alpha and beta are scalars, and A, B and C are matrices, with op( A ) +*> an n by k matrix, op( B ) a k by n matrix and C an n by n matrix. +*> Thereby, the routine only accesses and updates the upper or lower +*> triangular part of the result matrix C. This behaviour can be used if +*> the resulting matrix C is known to be symmetric. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] UPLO +*> \verbatim +*> UPLO is CHARACTER*1 +*> On entry, UPLO specifies whether the lower or the upper +*> triangular part of C is access and updated. +*> +*> UPLO = 'L' or 'l', the lower triangular part of C is used. +*> +*> UPLO = 'U' or 'u', the upper triangular part of C is used. +*> \endverbatim +* +*> \param[in] TRANSA +*> \verbatim +*> TRANSA is CHARACTER*1 +*> On entry, TRANSA specifies the form of op( A ) to be used in +*> the matrix multiplication as follows: +*> +*> TRANSA = 'N' or 'n', op( A ) = A. +*> +*> TRANSA = 'T' or 't', op( A ) = A**T. +*> +*> TRANSA = 'C' or 'c', op( A ) = A**T. +*> \endverbatim +*> +*> \param[in] TRANSB +*> \verbatim +*> TRANSB is CHARACTER*1 +*> On entry, TRANSB specifies the form of op( B ) to be used in +*> the matrix multiplication as follows: +*> +*> TRANSB = 'N' or 'n', op( B ) = B. +*> +*> TRANSB = 'T' or 't', op( B ) = B**T. +*> +*> TRANSB = 'C' or 'c', op( B ) = B**T. +*> \endverbatim +*> +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> On entry, N specifies the number of rows and columns of +*> the matrix C, the number of columns of op(B) and the number +*> of rows of op(A). N must be at least zero. +*> \endverbatim +*> +*> \param[in] K +*> \verbatim +*> K is INTEGER +*> On entry, K specifies the number of columns of the matrix +*> op( A ) and the number of rows of the matrix op( B ). K must +*> be at least zero. +*> \endverbatim +*> +*> \param[in] ALPHA +*> \verbatim +*> ALPHA is DOUBLE PRECISION. +*> On entry, ALPHA specifies the scalar alpha. +*> \endverbatim +*> +*> \param[in] A +*> \verbatim +*> A is DOUBLE PRECISION array, dimension ( LDA, ka ), where ka is +*> k when TRANSA = 'N' or 'n', and is n otherwise. +*> Before entry with TRANSA = 'N' or 'n', the leading n by k +*> part of the array A must contain the matrix A, otherwise +*> the leading k by m part of the array A must contain the +*> matrix A. +*> \endverbatim +*> +*> \param[in] LDA +*> \verbatim +*> LDA is INTEGER +*> On entry, LDA specifies the first dimension of A as declared +*> in the calling (sub) program. When TRANSA = 'N' or 'n' then +*> LDA must be at least max( 1, n ), otherwise LDA must be at +*> least max( 1, k ). +*> \endverbatim +*> +*> \param[in] B +*> \verbatim +*> B is DOUBLE PRECISION array, dimension ( LDB, kb ), where kb is +*> n when TRANSB = 'N' or 'n', and is k otherwise. +*> Before entry with TRANSB = 'N' or 'n', the leading k by n +*> part of the array B must contain the matrix B, otherwise +*> the leading n by k part of the array B must contain the +*> matrix B. +*> \endverbatim +*> +*> \param[in] LDB +*> \verbatim +*> LDB is INTEGER +*> On entry, LDB specifies the first dimension of B as declared +*> in the calling (sub) program. When TRANSB = 'N' or 'n' then +*> LDB must be at least max( 1, k ), otherwise LDB must be at +*> least max( 1, n ). +*> \endverbatim +*> +*> \param[in] BETA +*> \verbatim +*> BETA is DOUBLE PRECISION. +*> On entry, BETA specifies the scalar beta. When BETA is +*> supplied as zero then C need not be set on input. +*> \endverbatim +*> +*> \param[in,out] C +*> \verbatim +*> C is DOUBLE PRECISION array, dimension ( LDC, N ) +*> Before entry, the leading n by n part of the array C must +*> contain the matrix C, except when beta is zero, in which +*> case C need not be set on entry. +*> On exit, the upper or lower triangular part of the matrix +*> C is overwritten by the n by n matrix +*> ( alpha*op( A )*op( B ) + beta*C ). +*> \endverbatim +*> +*> \param[in] LDC +*> \verbatim +*> LDC is INTEGER +*> On entry, LDC specifies the first dimension of C as declared +*> in the calling (sub) program. LDC must be at least +*> max( 1, n ). +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Martin Koehler +* +*> \ingroup gemmtr +* +*> \par Further Details: +* ===================== +*> +*> \verbatim +*> +*> Level 3 Blas routine. +*> +*> -- Written on 19-July-2023. +*> Martin Koehler, MPI Magdeburg +*> \endverbatim +*> +* ===================================================================== + SUBROUTINE DGEMMTR(UPLO,TRANSA,TRANSB,N,K,ALPHA,A,LDA,B,LDB, + + BETA,C,LDC) + IMPLICIT NONE +* +* -- Reference BLAS level3 routine -- +* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* +* .. Scalar Arguments .. + DOUBLE PRECISION ALPHA,BETA + INTEGER K,LDA,LDB,LDC,N + CHARACTER TRANSA,TRANSB,UPLO +* .. +* .. Array Arguments .. + DOUBLE PRECISION A(LDA,*),B(LDB,*),C(LDC,*) +* .. +* +* ===================================================================== +* +* .. External Functions .. + LOGICAL LSAME + EXTERNAL LSAME +* .. +* .. External Subroutines .. + EXTERNAL XERBLA +* .. +* .. Intrinsic Functions .. + INTRINSIC MAX +* .. +* .. Local Scalars .. + DOUBLE PRECISION TEMP + INTEGER I,INFO,J,L,NROWA,NROWB, ISTART, ISTOP + LOGICAL NOTA,NOTB, UPPER +* .. +* .. Parameters .. + DOUBLE PRECISION ONE,ZERO + PARAMETER (ONE=1.0D+0,ZERO=0.0D+0) +* .. +* +* Set NOTA and NOTB as true if A and B respectively are not +* transposed and set NROWA and NROWB as the number of rows of A +* and B respectively. +* + NOTA = LSAME(TRANSA,'N') + NOTB = LSAME(TRANSB,'N') + IF (NOTA) THEN + NROWA = N + ELSE + NROWA = K + END IF + IF (NOTB) THEN + NROWB = K + ELSE + NROWB = N + END IF + UPPER = LSAME(UPLO, 'U') +* +* Test the input parameters. +* + INFO = 0 + IF ((.NOT. UPPER) .AND. (.NOT. LSAME(UPLO, 'L'))) THEN + INFO = 1 + ELSE IF ((.NOT.NOTA) .AND. (.NOT.LSAME(TRANSA,'C')) .AND. + + (.NOT.LSAME(TRANSA,'T'))) THEN + INFO = 2 + ELSE IF ((.NOT.NOTB) .AND. (.NOT.LSAME(TRANSB,'C')) .AND. + + (.NOT.LSAME(TRANSB,'T'))) THEN + INFO = 3 + ELSE IF (N.LT.0) THEN + INFO = 4 + ELSE IF (K.LT.0) THEN + INFO = 5 + ELSE IF (LDA.LT.MAX(1,NROWA)) THEN + INFO = 8 + ELSE IF (LDB.LT.MAX(1,NROWB)) THEN + INFO = 10 + ELSE IF (LDC.LT.MAX(1,N)) THEN + INFO = 13 + END IF + IF (INFO.NE.0) THEN + CALL XERBLA('DGEMMTR',INFO) + RETURN + END IF +* +* Quick return if possible. +* + IF (N.EQ.0) RETURN +* +* And if alpha.eq.zero. +* + IF (ALPHA.EQ.ZERO) THEN + IF (BETA.EQ.ZERO) THEN + DO 20 J = 1,N + IF (UPPER) THEN + ISTART = 1 + ISTOP = J + ELSE + ISTART = J + ISTOP = N + END IF + + DO 10 I = ISTART, ISTOP + C(I,J) = ZERO + 10 CONTINUE + 20 CONTINUE + ELSE + DO 40 J = 1,N + IF (UPPER) THEN + ISTART = 1 + ISTOP = J + ELSE + ISTART = J + ISTOP = N + END IF + + DO 30 I = ISTART, ISTOP + C(I,J) = BETA*C(I,J) + 30 CONTINUE + 40 CONTINUE + END IF + RETURN + END IF +* +* Start the operations. +* + IF (NOTB) THEN + IF (NOTA) THEN +* +* Form C := alpha*A*B + beta*C. +* + DO 90 J = 1,N + IF (UPPER) THEN + ISTART = 1 + ISTOP = J + ELSE + ISTART = J + ISTOP = N + END IF + IF (BETA.EQ.ZERO) THEN + DO 50 I = ISTART, ISTOP + C(I,J) = ZERO + 50 CONTINUE + ELSE IF (BETA.NE.ONE) THEN + DO 60 I = ISTART, ISTOP + C(I,J) = BETA*C(I,J) + 60 CONTINUE + END IF + DO 80 L = 1,K + TEMP = ALPHA*B(L,J) + DO 70 I = ISTART, ISTOP + C(I,J) = C(I,J) + TEMP*A(I,L) + 70 CONTINUE + 80 CONTINUE + 90 CONTINUE + ELSE +* +* Form C := alpha*A**T*B + beta*C +* + DO 120 J = 1,N + IF (UPPER) THEN + ISTART = 1 + ISTOP = J + ELSE + ISTART = J + ISTOP = N + END IF + + DO 110 I = ISTART, ISTOP + TEMP = ZERO + DO 100 L = 1,K + TEMP = TEMP + A(L,I)*B(L,J) + 100 CONTINUE + IF (BETA.EQ.ZERO) THEN + C(I,J) = ALPHA*TEMP + ELSE + C(I,J) = ALPHA*TEMP + BETA*C(I,J) + END IF + 110 CONTINUE + 120 CONTINUE + END IF + ELSE + IF (NOTA) THEN +* +* Form C := alpha*A*B**T + beta*C +* + DO 170 J = 1,N + IF (UPPER) THEN + ISTART = 1 + ISTOP = J + ELSE + ISTART = J + ISTOP = N + END IF + + IF (BETA.EQ.ZERO) THEN + DO 130 I = ISTART,ISTOP + C(I,J) = ZERO + 130 CONTINUE + ELSE IF (BETA.NE.ONE) THEN + DO 140 I = ISTART,ISTOP + C(I,J) = BETA*C(I,J) + 140 CONTINUE + END IF + DO 160 L = 1,K + TEMP = ALPHA*B(J,L) + DO 150 I = ISTART,ISTOP + C(I,J) = C(I,J) + TEMP*A(I,L) + 150 CONTINUE + 160 CONTINUE + 170 CONTINUE + ELSE +* +* Form C := alpha*A**T*B**T + beta*C +* + DO 200 J = 1,N + IF (UPPER) THEN + ISTART = 1 + ISTOP = J + ELSE + ISTART = J + ISTOP = N + END IF + + DO 190 I = ISTART, ISTOP + TEMP = ZERO + DO 180 L = 1,K + TEMP = TEMP + A(L,I)*B(J,L) + 180 CONTINUE + IF (BETA.EQ.ZERO) THEN + C(I,J) = ALPHA*TEMP + ELSE + C(I,J) = ALPHA*TEMP + BETA*C(I,J) + END IF + 190 CONTINUE + 200 CONTINUE + END IF + END IF +* + RETURN +* +* End of SGEMM +* + END diff --git a/BLAS/SRC/dgemv.f b/BLAS/SRC/dgemv.f index 6625509b3a..f6defb8c29 100644 --- a/BLAS/SRC/dgemv.f +++ b/BLAS/SRC/dgemv.f @@ -117,6 +117,8 @@ *> Before entry with BETA non-zero, the incremented array Y *> must contain the vector y. On exit, Y is overwritten by the *> updated vector y. +*> If either m or n is zero, then Y not referenced and the function +*> performs a quick return. *> \endverbatim *> *> \param[in] INCY @@ -134,7 +136,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup double_blas_level2 +*> \ingroup gemv * *> \par Further Details: * ===================== @@ -153,6 +155,7 @@ *> * ===================================================================== SUBROUTINE DGEMV(TRANS,M,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/dger.f b/BLAS/SRC/dger.f index 8c19cb4e41..24a6d86bb2 100644 --- a/BLAS/SRC/dger.f +++ b/BLAS/SRC/dger.f @@ -109,7 +109,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup double_blas_level2 +*> \ingroup ger * *> \par Further Details: * ===================== @@ -127,6 +127,7 @@ *> * ===================================================================== SUBROUTINE DGER(M,N,ALPHA,X,INCX,Y,INCY,A,LDA) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/dnrm2.f90 b/BLAS/SRC/dnrm2.f90 index 5649d41af4..638687c81b 100644 --- a/BLAS/SRC/dnrm2.f90 +++ b/BLAS/SRC/dnrm2.f90 @@ -60,7 +60,7 @@ ! !> \date August 2016 ! -!> \ingroup single_blas_level1 +!> \ingroup nrm2 ! !> \par Contributors: ! ================== @@ -85,11 +85,12 @@ !> \endverbatim !> ! ===================================================================== -function DNRM2( n, x, incx ) +function DNRM2( n, x, incx ) + implicit none integer, parameter :: wp = kind(1.d0) real(wp) :: DNRM2 ! -! -- Reference BLAS level1 routine (version 3.9.1) -- +! -- Reference BLAS level1 routine -- ! -- Reference BLAS is a software package provided by Univ. of Tennessee, -- ! -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- ! March 2021 @@ -99,15 +100,15 @@ function DNRM2( n, x, incx ) real(wp), parameter :: one = 1.0_wp real(wp), parameter :: maxN = huge(0.0_wp) ! .. -! .. Blue's ccaling constants .. +! .. Blue's scaling constants .. real(wp), parameter :: tsml = real(radix(0._wp), wp)**ceiling( & (minexponent(0._wp) - 1) * 0.5_wp) real(wp), parameter :: tbig = real(radix(0._wp), wp)**floor( & (maxexponent(0._wp) - digits(0._wp) + 1) * 0.5_wp) real(wp), parameter :: ssml = real(radix(0._wp), wp)**( - floor( & - (minexponent(0._wp) - 1) * 0.5_wp)) + (minexponent(0._wp) - digits(0._wp)) * 0.5_wp)) real(wp), parameter :: sbig = real(radix(0._wp), wp)**( - ceiling( & - (maxexponent(0._wp) - digits(0._wp) + 1) * 0.5_wp)) + (maxexponent(0._wp) + digits(0._wp) - 1) * 0.5_wp)) ! .. ! .. Scalar Arguments .. integer :: incx, n diff --git a/BLAS/SRC/drot.f b/BLAS/SRC/drot.f index 0386626c8f..973a0c759b 100644 --- a/BLAS/SRC/drot.f +++ b/BLAS/SRC/drot.f @@ -76,7 +76,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup double_blas_level1 +*> \ingroup rot * *> \par Further Details: * ===================== @@ -89,6 +89,7 @@ *> * ===================================================================== SUBROUTINE DROT(N,DX,INCX,DY,INCY,C,S) + IMPLICIT NONE * * -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/drotg.f90 b/BLAS/SRC/drotg.f90 index a344cd4856..b1abba914b 100644 --- a/BLAS/SRC/drotg.f90 +++ b/BLAS/SRC/drotg.f90 @@ -5,19 +5,16 @@ ! Online html documentation available at ! http://www.netlib.org/lapack/explore-html/ ! -! Definition: -! =========== -! -! DROTG constructs a plane rotation -! [ c s ] [ a ] = [ r ] -! [ -s c ] [ b ] [ 0 ] -! satisfying c**2 + s**2 = 1. -! !> \par Purpose: ! ============= !> !> \verbatim !> +!> DROTG constructs a plane rotation +!> [ c s ] [ a ] = [ r ] +!> [ -s c ] [ b ] [ 0 ] +!> satisfying c**2 + s**2 = 1. +!> !> The computation uses the formulas !> sigma = sgn(a) if |a| > |b| !> = sgn(b) if |b| >= |a| @@ -34,6 +31,8 @@ !> If |z| > 1, set c = 1/z and s = sqrt( 1 - c**2). !> !> \endverbatim +!> +!> @see lartg, @see lartgp ! ! Arguments: ! ========== @@ -74,7 +73,7 @@ !> !> Weslley Pereira, University of Colorado Denver, USA ! -!> \ingroup single_blas_level1 +!> \ingroup rotg ! !> \par Further Details: ! ===================== @@ -90,6 +89,7 @@ ! ! ===================================================================== subroutine DROTG( a, b, c, s ) + implicit none integer, parameter :: wp = kind(1.d0) ! ! -- Reference BLAS level1 routine -- diff --git a/BLAS/SRC/drotm.f b/BLAS/SRC/drotm.f index 0363ddd888..1eb7d89509 100644 --- a/BLAS/SRC/drotm.f +++ b/BLAS/SRC/drotm.f @@ -38,6 +38,10 @@ *> H=( ) ( ) ( ) ( ) *> (DH21 DH22), (DH21 1.D0), (-1.D0 DH22), (0.D0 1.D0). *> SEE DROTMG FOR A DESCRIPTION OF DATA STORAGE IN DPARAM. +*> +*> IF DFLAG IS NOT ONE OF THE LISTED ABOVE, THE BEHAVIOR IS UNDEFINED. +*> NANS IN DFLAG MAY NOT PROPAGATE TO THE OUTPUT. +*> *> \endverbatim * * Arguments: @@ -89,10 +93,11 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup double_blas_level1 +*> \ingroup rotm * * ===================================================================== SUBROUTINE DROTM(N,DX,INCX,DY,INCY,DPARAM) + IMPLICIT NONE * * -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/drotmg.f b/BLAS/SRC/drotmg.f index be59f314a6..61007239bb 100644 --- a/BLAS/SRC/drotmg.f +++ b/BLAS/SRC/drotmg.f @@ -83,10 +83,11 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup double_blas_level1 +*> \ingroup rotmg * * ===================================================================== SUBROUTINE DROTMG(DD1,DD2,DX1,DY1,DPARAM) + IMPLICIT NONE * * -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/dsbmv.f b/BLAS/SRC/dsbmv.f index ad9e418a1e..9b3f76faa6 100644 --- a/BLAS/SRC/dsbmv.f +++ b/BLAS/SRC/dsbmv.f @@ -162,7 +162,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup double_blas_level2 +*> \ingroup hbmv * *> \par Further Details: * ===================== @@ -181,6 +181,7 @@ *> * ===================================================================== SUBROUTINE DSBMV(UPLO,N,K,ALPHA,A,LDA,X,INCX,BETA,Y,INCY) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/dscal.f b/BLAS/SRC/dscal.f index 3713427334..24437f5d14 100644 --- a/BLAS/SRC/dscal.f +++ b/BLAS/SRC/dscal.f @@ -62,7 +62,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup double_blas_level1 +*> \ingroup scal * *> \par Further Details: * ===================== @@ -76,6 +76,7 @@ *> * ===================================================================== SUBROUTINE DSCAL(N,DA,DX,INCX) + IMPLICIT NONE * * -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -93,11 +94,14 @@ SUBROUTINE DSCAL(N,DA,DX,INCX) * * .. Local Scalars .. INTEGER I,M,MP1,NINCX +* .. Parameters .. + DOUBLE PRECISION ONE + PARAMETER (ONE=1.0D+0) * .. * .. Intrinsic Functions .. INTRINSIC MOD * .. - IF (N.LE.0 .OR. INCX.LE.0) RETURN + IF (N.LE.0 .OR. INCX.LE.0 .OR. DA.EQ.ONE) RETURN IF (INCX.EQ.1) THEN * * code for increment equal to 1 diff --git a/BLAS/SRC/dsdot.f b/BLAS/SRC/dsdot.f index ae254a6e50..78983b2929 100644 --- a/BLAS/SRC/dsdot.f +++ b/BLAS/SRC/dsdot.f @@ -84,7 +84,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup double_blas_level1 +*> \ingroup dot * *> \par Further Details: * ===================== @@ -116,6 +116,7 @@ *> * ===================================================================== DOUBLE PRECISION FUNCTION DSDOT(N,SX,INCX,SY,INCY) + IMPLICIT NONE * * -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/dspmv.f b/BLAS/SRC/dspmv.f index a79c74da7b..42331e9f9a 100644 --- a/BLAS/SRC/dspmv.f +++ b/BLAS/SRC/dspmv.f @@ -125,7 +125,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup double_blas_level2 +*> \ingroup hpmv * *> \par Further Details: * ===================== @@ -144,6 +144,7 @@ *> * ===================================================================== SUBROUTINE DSPMV(UPLO,N,ALPHA,AP,X,INCX,BETA,Y,INCY) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/dspr.f b/BLAS/SRC/dspr.f index 67227a2d58..50a164697d 100644 --- a/BLAS/SRC/dspr.f +++ b/BLAS/SRC/dspr.f @@ -106,7 +106,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup double_blas_level2 +*> \ingroup hpr * *> \par Further Details: * ===================== @@ -124,6 +124,7 @@ *> * ===================================================================== SUBROUTINE DSPR(UPLO,N,ALPHA,X,INCX,AP) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/dspr2.f b/BLAS/SRC/dspr2.f index 0756c2bbd6..a946802504 100644 --- a/BLAS/SRC/dspr2.f +++ b/BLAS/SRC/dspr2.f @@ -121,7 +121,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup double_blas_level2 +*> \ingroup hpr2 * *> \par Further Details: * ===================== @@ -139,6 +139,7 @@ *> * ===================================================================== SUBROUTINE DSPR2(UPLO,N,ALPHA,X,INCX,Y,INCY,AP) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/dswap.f b/BLAS/SRC/dswap.f index b7600aa2d4..720f944a25 100644 --- a/BLAS/SRC/dswap.f +++ b/BLAS/SRC/dswap.f @@ -66,7 +66,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup double_blas_level1 +*> \ingroup swap * *> \par Further Details: * ===================== @@ -79,6 +79,7 @@ *> * ===================================================================== SUBROUTINE DSWAP(N,DX,INCX,DY,INCY) + IMPLICIT NONE * * -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/dsymm.f b/BLAS/SRC/dsymm.f index 683e79f6ad..7bb289c868 100644 --- a/BLAS/SRC/dsymm.f +++ b/BLAS/SRC/dsymm.f @@ -168,7 +168,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup double_blas_level3 +*> \ingroup hemm * *> \par Further Details: * ===================== @@ -186,6 +186,7 @@ *> * ===================================================================== SUBROUTINE DSYMM(SIDE,UPLO,M,N,ALPHA,A,LDA,B,LDB,BETA,C,LDC) + IMPLICIT NONE * * -- Reference BLAS level3 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -234,7 +235,8 @@ SUBROUTINE DSYMM(SIDE,UPLO,M,N,ALPHA,A,LDA,B,LDB,BETA,C,LDC) * Test the input parameters. * INFO = 0 - IF ((.NOT.LSAME(SIDE,'L')) .AND. (.NOT.LSAME(SIDE,'R'))) THEN + IF ((.NOT.LSAME(SIDE,'L')) .AND. + + (.NOT.LSAME(SIDE,'R'))) THEN INFO = 1 ELSE IF ((.NOT.UPPER) .AND. (.NOT.LSAME(UPLO,'L'))) THEN INFO = 2 diff --git a/BLAS/SRC/dsymv.f b/BLAS/SRC/dsymv.f index 17310d7c62..bfead2aedb 100644 --- a/BLAS/SRC/dsymv.f +++ b/BLAS/SRC/dsymv.f @@ -130,7 +130,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup double_blas_level2 +*> \ingroup hemv * *> \par Further Details: * ===================== @@ -149,6 +149,7 @@ *> * ===================================================================== SUBROUTINE DSYMV(UPLO,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/dsyr.f b/BLAS/SRC/dsyr.f index ab452dd950..9d89db9643 100644 --- a/BLAS/SRC/dsyr.f +++ b/BLAS/SRC/dsyr.f @@ -111,7 +111,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup double_blas_level2 +*> \ingroup her * *> \par Further Details: * ===================== @@ -129,6 +129,7 @@ *> * ===================================================================== SUBROUTINE DSYR(UPLO,N,ALPHA,X,INCX,A,LDA) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/dsyr2.f b/BLAS/SRC/dsyr2.f index 4bad19b96b..3eab4fd6a1 100644 --- a/BLAS/SRC/dsyr2.f +++ b/BLAS/SRC/dsyr2.f @@ -126,7 +126,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup double_blas_level2 +*> \ingroup her2 * *> \par Further Details: * ===================== @@ -144,6 +144,7 @@ *> * ===================================================================== SUBROUTINE DSYR2(UPLO,N,ALPHA,X,INCX,Y,INCY,A,LDA) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/dsyr2k.f b/BLAS/SRC/dsyr2k.f index f5d16e0854..2e1a48984a 100644 --- a/BLAS/SRC/dsyr2k.f +++ b/BLAS/SRC/dsyr2k.f @@ -170,7 +170,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup double_blas_level3 +*> \ingroup her2k * *> \par Further Details: * ===================== @@ -189,6 +189,7 @@ *> * ===================================================================== SUBROUTINE DSYR2K(UPLO,TRANS,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC) + IMPLICIT NONE * * -- Reference BLAS level3 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/dsyrk.f b/BLAS/SRC/dsyrk.f index 0548c0ce2f..c6ca791e14 100644 --- a/BLAS/SRC/dsyrk.f +++ b/BLAS/SRC/dsyrk.f @@ -148,7 +148,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup double_blas_level3 +*> \ingroup herk * *> \par Further Details: * ===================== @@ -166,6 +166,7 @@ *> * ===================================================================== SUBROUTINE DSYRK(UPLO,TRANS,N,K,ALPHA,A,LDA,BETA,C,LDC) + IMPLICIT NONE * * -- Reference BLAS level3 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/dtbmv.f b/BLAS/SRC/dtbmv.f index 646fb9bf55..25b1664c18 100644 --- a/BLAS/SRC/dtbmv.f +++ b/BLAS/SRC/dtbmv.f @@ -164,7 +164,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup double_blas_level2 +*> \ingroup tbmv * *> \par Further Details: * ===================== @@ -183,6 +183,7 @@ *> * ===================================================================== SUBROUTINE DTBMV(UPLO,TRANS,DIAG,N,K,A,LDA,X,INCX) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -223,10 +224,12 @@ SUBROUTINE DTBMV(UPLO,TRANS,DIAG,N,K,A,LDA,X,INCX) INFO = 0 IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN INFO = 1 - ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND. + ELSE IF (.NOT.LSAME(TRANS,'N') .AND. + + .NOT.LSAME(TRANS,'T') .AND. + .NOT.LSAME(TRANS,'C')) THEN INFO = 2 - ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN + ELSE IF (.NOT.LSAME(DIAG,'U') .AND. + + .NOT.LSAME(DIAG,'N')) THEN INFO = 3 ELSE IF (N.LT.0) THEN INFO = 4 diff --git a/BLAS/SRC/dtbsv.f b/BLAS/SRC/dtbsv.f index d4ab7c65ac..a18c235825 100644 --- a/BLAS/SRC/dtbsv.f +++ b/BLAS/SRC/dtbsv.f @@ -168,7 +168,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup double_blas_level2 +*> \ingroup tbsv * *> \par Further Details: * ===================== @@ -186,6 +186,7 @@ *> * ===================================================================== SUBROUTINE DTBSV(UPLO,TRANS,DIAG,N,K,A,LDA,X,INCX) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -226,10 +227,12 @@ SUBROUTINE DTBSV(UPLO,TRANS,DIAG,N,K,A,LDA,X,INCX) INFO = 0 IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN INFO = 1 - ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND. + ELSE IF (.NOT.LSAME(TRANS,'N') .AND. + + .NOT.LSAME(TRANS,'T') .AND. + .NOT.LSAME(TRANS,'C')) THEN INFO = 2 - ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN + ELSE IF (.NOT.LSAME(DIAG,'U') .AND. + + .NOT.LSAME(DIAG,'N')) THEN INFO = 3 ELSE IF (N.LT.0) THEN INFO = 4 diff --git a/BLAS/SRC/dtpmv.f b/BLAS/SRC/dtpmv.f index 32ab147f77..08bd667ff4 100644 --- a/BLAS/SRC/dtpmv.f +++ b/BLAS/SRC/dtpmv.f @@ -120,7 +120,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup double_blas_level2 +*> \ingroup tpmv * *> \par Further Details: * ===================== @@ -139,6 +139,7 @@ *> * ===================================================================== SUBROUTINE DTPMV(UPLO,TRANS,DIAG,N,AP,X,INCX) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -176,10 +177,12 @@ SUBROUTINE DTPMV(UPLO,TRANS,DIAG,N,AP,X,INCX) INFO = 0 IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN INFO = 1 - ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND. + ELSE IF (.NOT.LSAME(TRANS,'N') .AND. + + .NOT.LSAME(TRANS,'T') .AND. + .NOT.LSAME(TRANS,'C')) THEN INFO = 2 - ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN + ELSE IF (.NOT.LSAME(DIAG,'U') .AND. + + .NOT.LSAME(DIAG,'N')) THEN INFO = 3 ELSE IF (N.LT.0) THEN INFO = 4 diff --git a/BLAS/SRC/dtpsv.f b/BLAS/SRC/dtpsv.f index 853d0dab0c..7e297ef6b3 100644 --- a/BLAS/SRC/dtpsv.f +++ b/BLAS/SRC/dtpsv.f @@ -123,7 +123,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup double_blas_level2 +*> \ingroup tpsv * *> \par Further Details: * ===================== @@ -141,6 +141,7 @@ *> * ===================================================================== SUBROUTINE DTPSV(UPLO,TRANS,DIAG,N,AP,X,INCX) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -178,10 +179,12 @@ SUBROUTINE DTPSV(UPLO,TRANS,DIAG,N,AP,X,INCX) INFO = 0 IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN INFO = 1 - ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND. + ELSE IF (.NOT.LSAME(TRANS,'N') .AND. + + .NOT.LSAME(TRANS,'T') .AND. + .NOT.LSAME(TRANS,'C')) THEN INFO = 2 - ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN + ELSE IF (.NOT.LSAME(DIAG,'U') .AND. + + .NOT.LSAME(DIAG,'N')) THEN INFO = 3 ELSE IF (N.LT.0) THEN INFO = 4 diff --git a/BLAS/SRC/dtrmm.f b/BLAS/SRC/dtrmm.f index b2cc0a1fa8..541d180748 100644 --- a/BLAS/SRC/dtrmm.f +++ b/BLAS/SRC/dtrmm.f @@ -156,7 +156,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup double_blas_level3 +*> \ingroup trmm * *> \par Further Details: * ===================== @@ -174,6 +174,7 @@ *> * ===================================================================== SUBROUTINE DTRMM(SIDE,UPLO,TRANSA,DIAG,M,N,ALPHA,A,LDA,B,LDB) + IMPLICIT NONE * * -- Reference BLAS level3 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -230,7 +231,8 @@ SUBROUTINE DTRMM(SIDE,UPLO,TRANSA,DIAG,M,N,ALPHA,A,LDA,B,LDB) + (.NOT.LSAME(TRANSA,'T')) .AND. + (.NOT.LSAME(TRANSA,'C'))) THEN INFO = 3 - ELSE IF ((.NOT.LSAME(DIAG,'U')) .AND. (.NOT.LSAME(DIAG,'N'))) THEN + ELSE IF ((.NOT.LSAME(DIAG,'U')) .AND. + + (.NOT.LSAME(DIAG,'N'))) THEN INFO = 4 ELSE IF (M.LT.0) THEN INFO = 5 diff --git a/BLAS/SRC/dtrmv.f b/BLAS/SRC/dtrmv.f index e8af8e6136..332ac7d56f 100644 --- a/BLAS/SRC/dtrmv.f +++ b/BLAS/SRC/dtrmv.f @@ -125,7 +125,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup double_blas_level2 +*> \ingroup trmv * *> \par Further Details: * ===================== @@ -144,6 +144,7 @@ *> * ===================================================================== SUBROUTINE DTRMV(UPLO,TRANS,DIAG,N,A,LDA,X,INCX) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -184,10 +185,12 @@ SUBROUTINE DTRMV(UPLO,TRANS,DIAG,N,A,LDA,X,INCX) INFO = 0 IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN INFO = 1 - ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND. + ELSE IF (.NOT.LSAME(TRANS,'N') .AND. + + .NOT.LSAME(TRANS,'T') .AND. + .NOT.LSAME(TRANS,'C')) THEN INFO = 2 - ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN + ELSE IF (.NOT.LSAME(DIAG,'U') .AND. + + .NOT.LSAME(DIAG,'N')) THEN INFO = 3 ELSE IF (N.LT.0) THEN INFO = 4 diff --git a/BLAS/SRC/dtrsm.f b/BLAS/SRC/dtrsm.f index fa8080bc92..0cd4a91a25 100644 --- a/BLAS/SRC/dtrsm.f +++ b/BLAS/SRC/dtrsm.f @@ -159,7 +159,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup double_blas_level3 +*> \ingroup trsm * *> \par Further Details: * ===================== @@ -178,6 +178,7 @@ *> * ===================================================================== SUBROUTINE DTRSM(SIDE,UPLO,TRANSA,DIAG,M,N,ALPHA,A,LDA,B,LDB) + IMPLICIT NONE * * -- Reference BLAS level3 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -234,7 +235,8 @@ SUBROUTINE DTRSM(SIDE,UPLO,TRANSA,DIAG,M,N,ALPHA,A,LDA,B,LDB) + (.NOT.LSAME(TRANSA,'T')) .AND. + (.NOT.LSAME(TRANSA,'C'))) THEN INFO = 3 - ELSE IF ((.NOT.LSAME(DIAG,'U')) .AND. (.NOT.LSAME(DIAG,'N'))) THEN + ELSE IF ((.NOT.LSAME(DIAG,'U')) .AND. + + (.NOT.LSAME(DIAG,'N'))) THEN INFO = 4 ELSE IF (M.LT.0) THEN INFO = 5 diff --git a/BLAS/SRC/dtrsv.f b/BLAS/SRC/dtrsv.f index d8ea9fa898..4c1f40ae16 100644 --- a/BLAS/SRC/dtrsv.f +++ b/BLAS/SRC/dtrsv.f @@ -136,12 +136,13 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup double_blas_level1 +*> \ingroup trsv * * ===================================================================== SUBROUTINE DTRSV(UPLO,TRANS,DIAG,N,A,LDA,X,INCX) + IMPLICIT NONE * -* -- Reference BLAS level1 routine -- +* -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- * @@ -180,10 +181,12 @@ SUBROUTINE DTRSV(UPLO,TRANS,DIAG,N,A,LDA,X,INCX) INFO = 0 IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN INFO = 1 - ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND. + ELSE IF (.NOT.LSAME(TRANS,'N') .AND. + + .NOT.LSAME(TRANS,'T') .AND. + .NOT.LSAME(TRANS,'C')) THEN INFO = 2 - ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN + ELSE IF (.NOT.LSAME(DIAG,'U') .AND. + + .NOT.LSAME(DIAG,'N')) THEN INFO = 3 ELSE IF (N.LT.0) THEN INFO = 4 diff --git a/BLAS/SRC/dzasum.f b/BLAS/SRC/dzasum.f index 7cc6ec506a..9cf841c197 100644 --- a/BLAS/SRC/dzasum.f +++ b/BLAS/SRC/dzasum.f @@ -55,7 +55,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup double_blas_level1 +*> \ingroup asum * *> \par Further Details: * ===================== @@ -69,6 +69,7 @@ *> * ===================================================================== DOUBLE PRECISION FUNCTION DZASUM(N,ZX,INCX) + IMPLICIT NONE * * -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/dznrm2.f90 b/BLAS/SRC/dznrm2.f90 index ff158e58c0..68aa6d496f 100644 --- a/BLAS/SRC/dznrm2.f90 +++ b/BLAS/SRC/dznrm2.f90 @@ -61,7 +61,7 @@ ! !> \date August 2016 ! -!> \ingroup single_blas_level1 +!> \ingroup nrm2 ! !> \par Contributors: ! ================== @@ -86,11 +86,12 @@ !> \endverbatim !> ! ===================================================================== -function DZNRM2( n, x, incx ) +function DZNRM2( n, x, incx ) + implicit none integer, parameter :: wp = kind(1.d0) real(wp) :: DZNRM2 ! -! -- Reference BLAS level1 routine (version 3.9.1) -- +! -- Reference BLAS level1 routine -- ! -- Reference BLAS is a software package provided by Univ. of Tennessee, -- ! -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- ! March 2021 @@ -100,15 +101,15 @@ function DZNRM2( n, x, incx ) real(wp), parameter :: one = 1.0_wp real(wp), parameter :: maxN = huge(0.0_wp) ! .. -! .. Blue's ccaling constants .. +! .. Blue's scaling constants .. real(wp), parameter :: tsml = real(radix(0._wp), wp)**ceiling( & (minexponent(0._wp) - 1) * 0.5_wp) real(wp), parameter :: tbig = real(radix(0._wp), wp)**floor( & (maxexponent(0._wp) - digits(0._wp) + 1) * 0.5_wp) real(wp), parameter :: ssml = real(radix(0._wp), wp)**( - floor( & - (minexponent(0._wp) - 1) * 0.5_wp)) + (minexponent(0._wp) - digits(0._wp)) * 0.5_wp)) real(wp), parameter :: sbig = real(radix(0._wp), wp)**( - ceiling( & - (maxexponent(0._wp) - digits(0._wp) + 1) * 0.5_wp)) + (maxexponent(0._wp) + digits(0._wp) - 1) * 0.5_wp)) ! .. ! .. Scalar Arguments .. integer :: incx, n diff --git a/BLAS/SRC/icamax.f90 b/BLAS/SRC/icamax.f90 new file mode 100644 index 0000000000..9be0d9fdaa --- /dev/null +++ b/BLAS/SRC/icamax.f90 @@ -0,0 +1,193 @@ +!> \brief \b ICAMAX +! +! =========== DOCUMENTATION =========== +! +! Online html documentation available at +! http://www.netlib.org/lapack/explore-html/ +! +! Definition: +! =========== +! +! INTEGER FUNCTION ICAMAX(N,X,INCX) +! +! .. Scalar Arguments .. +! INTEGER INCX,N +! .. +! .. Array Arguments .. +! COMPLEX X(*) +! .. +! +! +!> \par Purpose: +! ============= +!> +!> \verbatim +!> +!> ICAMAX finds the index of the first element having maximum |Re(.)| + |Im(.)| +!> \endverbatim +! +! Arguments: +! ========== +! +!> \param[in] N +!> \verbatim +!> N is INTEGER +!> number of elements in input vector(s) +!> \endverbatim +!> +!> \param[in] X +!> \verbatim +!> X is COMPLEX array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) +!> \endverbatim +!> +!> \param[in] INCX +!> \verbatim +!> INCX is INTEGER +!> storage spacing between elements of X +!> \endverbatim +! +! Authors: +! ======== +! +!> James Demmel, University of California Berkeley, USA +!> Weslley Pereira, National Renewable Energy Laboratory, USA +! +!> \ingroup iamax +! +!> \par Further Details: +! ===================== +!> +!> \verbatim +!> +!> James Demmel et al. Proposed Consistent Exception Handling for the BLAS and +!> LAPACK, 2022 (https://arxiv.org/abs/2207.09281). +!> +!> \endverbatim +!> +! ===================================================================== +integer function icamax(n, x, incx) + implicit none + integer, parameter :: wp = kind(1.e0) +! +! -- Reference BLAS level1 routine -- +! -- Reference BLAS is a software package provided by Univ. of Tennessee, -- +! -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +! +! .. Constants .. + real(wp), parameter :: hugeval = huge(0.0_wp) +! +! .. Scalar Arguments .. + integer :: n, incx +! +! .. Array Arguments .. + complex(wp) :: x(*) +! .. +! .. Local Scalars .. + integer :: i, j, ix, jx + real(wp) :: val, smax + logical :: scaledsmax +! .. +! .. Intrinsic Functions .. + intrinsic :: abs, aimag, huge, real +! +! Quick return if possible +! + icamax = 0 + if (n < 1 .or. incx < 1) return +! + icamax = 1 + if (n == 1) return +! + icamax = 0 + scaledsmax = .false. + smax = -1 +! +! scaledsmax = .true. indicates that x(icamax) is finite but +! abs(real(x(icamax))) + abs(aimag(x(icamax))) overflows +! + if (incx == 1) then + ! code for increment equal to 1 + do i = 1, n + if (x(i) /= x(i)) then + ! return when first NaN found + icamax = i + return + elseif (abs(real(x(i))) > hugeval .or. abs(aimag(x(i))) > hugeval) then + ! keep looking for first NaN + do j = i+1, n + if (x(j) /= x(j)) then + ! return when first NaN found + icamax = j + return + endif + enddo + ! record location of first Inf + icamax = i + return + else ! still no Inf found yet + if (.not. scaledsmax) then + ! no abs(real(x(i))) + abs(aimag(x(i))) = Inf yet + val = abs(real(x(i))) + abs(aimag(x(i))) + if (val > hugeval) then + scaledsmax = .true. + smax = 0.25*abs(real(x(i))) + 0.25*abs(aimag(x(i))) + icamax = i + elseif (val > smax) then ! everything finite so far + smax = val + icamax = i + endif + else ! scaledsmax + val = 0.25*abs(real(x(i))) + 0.25*abs(aimag(x(i))) + if (val > smax) then + smax = val + icamax = i + endif + endif + endif + end do + else + ! code for increment not equal to 1 + ix = 1 + do i = 1, n + if (x(ix) /= x(ix)) then + ! return when first NaN found + icamax = i + return + elseif (abs(real(x(ix))) > hugeval .or. abs(aimag(x(ix))) > hugeval) then + ! keep looking for first NaN + jx = ix + incx + do j = i+1, n + if (x(jx) /= x(jx)) then + ! return when first NaN found + icamax = j + return + endif + jx = jx + incx + enddo + ! record location of first Inf + icamax = i + return + else ! still no Inf found yet + if (.not. scaledsmax) then + ! no abs(real(x(ix))) + abs(aimag(x(ix))) = Inf yet + val = abs(real(x(ix))) + abs(aimag(x(ix))) + if (val > hugeval) then + scaledsmax = .true. + smax = 0.25*abs(real(x(ix))) + 0.25*abs(aimag(x(ix))) + icamax = i + elseif (val > smax) then ! everything finite so far + smax = val + icamax = i + endif + else ! scaledsmax + val = 0.25*abs(real(x(ix))) + 0.25*abs(aimag(x(ix))) + if (val > smax) then + smax = val + icamax = i + endif + endif + endif + ix = ix + incx + end do + endif +end diff --git a/BLAS/SRC/idamax.f b/BLAS/SRC/idamax.f index 1be301ea3e..35042300d7 100644 --- a/BLAS/SRC/idamax.f +++ b/BLAS/SRC/idamax.f @@ -54,7 +54,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup aux_blas +*> \ingroup iamax * *> \par Further Details: * ===================== @@ -68,6 +68,7 @@ *> * ===================================================================== INTEGER FUNCTION IDAMAX(N,DX,INCX) + IMPLICIT NONE * * -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/isamax.f b/BLAS/SRC/isamax.f index 8ad44ad419..6104adbf50 100644 --- a/BLAS/SRC/isamax.f +++ b/BLAS/SRC/isamax.f @@ -54,7 +54,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup aux_blas +*> \ingroup iamax * *> \par Further Details: * ===================== @@ -68,6 +68,7 @@ *> * ===================================================================== INTEGER FUNCTION ISAMAX(N,SX,INCX) + IMPLICIT NONE * * -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/izamax.f90 b/BLAS/SRC/izamax.f90 new file mode 100644 index 0000000000..35b81d741c --- /dev/null +++ b/BLAS/SRC/izamax.f90 @@ -0,0 +1,193 @@ +!> \brief \b IZAMAX +! +! =========== DOCUMENTATION =========== +! +! Online html documentation available at +! http://www.netlib.org/lapack/explore-html/ +! +! Definition: +! =========== +! +! INTEGER FUNCTION IZAMAX(N,X,INCX) +! +! .. Scalar Arguments .. +! INTEGER INCX,N +! .. +! .. Array Arguments .. +! DOUBLE COMPLEX X(*) +! .. +! +! +!> \par Purpose: +! ============= +!> +!> \verbatim +!> +!> IZAMAX finds the index of the first element having maximum |Re(.)| + |Im(.)| +!> \endverbatim +! +! Arguments: +! ========== +! +!> \param[in] N +!> \verbatim +!> N is INTEGER +!> number of elements in input vector(s) +!> \endverbatim +!> +!> \param[in] X +!> \verbatim +!> X is DOUBLE COMPLEX array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) +!> \endverbatim +!> +!> \param[in] INCX +!> \verbatim +!> INCX is INTEGER +!> storage spacing between elements of X +!> \endverbatim +! +! Authors: +! ======== +! +!> James Demmel, University of California Berkeley, USA +!> Weslley Pereira, National Renewable Energy Laboratory, USA +! +!> \ingroup iamax +! +!> \par Further Details: +! ===================== +!> +!> \verbatim +!> +!> James Demmel et al. Proposed Consistent Exception Handling for the BLAS and +!> LAPACK, 2022 (https://arxiv.org/abs/2207.09281). +!> +!> \endverbatim +!> +! ===================================================================== +integer function izamax(n, x, incx) + implicit none + integer, parameter :: wp = kind(1.d0) +! +! -- Reference BLAS level1 routine -- +! -- Reference BLAS is a software package provided by Univ. of Tennessee, -- +! -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +! +! .. Constants .. + real(wp), parameter :: hugeval = huge(0.0_wp) +! +! .. Scalar Arguments .. + integer :: n, incx +! +! .. Array Arguments .. + complex(wp) :: x(*) +! .. +! .. Local Scalars .. + integer :: i, j, ix, jx + real(wp) :: val, smax + logical :: scaledsmax +! .. +! .. Intrinsic Functions .. + intrinsic :: abs, dimag, huge, real +! +! Quick return if possible +! + izamax = 0 + if (n < 1 .or. incx < 1) return +! + izamax = 1 + if (n == 1) return +! + izamax = 0 + scaledsmax = .false. + smax = -1 +! +! scaledsmax = .true. indicates that x(izamax) is finite but +! abs(real(x(izamax))) + abs(dimag(x(izamax))) overflows +! + if (incx == 1) then + ! code for increment equal to 1 + do i = 1, n + if (x(i) /= x(i)) then + ! return when first NaN found + izamax = i + return + elseif (abs(real(x(i))) > hugeval .or. abs(dimag(x(i))) > hugeval) then + ! keep looking for first NaN + do j = i+1, n + if (x(j) /= x(j)) then + ! return when first NaN found + izamax = j + return + endif + enddo + ! record location of first Inf + izamax = i + return + else ! still no Inf found yet + if (.not. scaledsmax) then + ! no abs(real(x(i))) + abs(dimag(x(i))) = Inf yet + val = abs(real(x(i))) + abs(dimag(x(i))) + if (val > hugeval) then + scaledsmax = .true. + smax = 0.25*abs(real(x(i))) + 0.25*abs(dimag(x(i))) + izamax = i + elseif (val > smax) then ! everything finite so far + smax = val + izamax = i + endif + else ! scaledsmax + val = 0.25*abs(real(x(i))) + 0.25*abs(dimag(x(i))) + if (val > smax) then + smax = val + izamax = i + endif + endif + endif + end do + else + ! code for increment not equal to 1 + ix = 1 + do i = 1, n + if (x(ix) /= x(ix)) then + ! return when first NaN found + izamax = i + return + elseif (abs(real(x(ix))) > hugeval .or. abs(dimag(x(ix))) > hugeval) then + ! keep looking for first NaN + jx = ix + incx + do j = i+1, n + if (x(jx) /= x(jx)) then + ! return when first NaN found + izamax = j + return + endif + jx = jx + incx + enddo + ! record location of first Inf + izamax = i + return + else ! still no Inf found yet + if (.not. scaledsmax) then + ! no abs(real(x(ix))) + abs(dimag(x(ix))) = Inf yet + val = abs(real(x(ix))) + abs(dimag(x(ix))) + if (val > hugeval) then + scaledsmax = .true. + smax = 0.25*abs(real(x(ix))) + 0.25*abs(dimag(x(ix))) + izamax = i + elseif (val > smax) then ! everything finite so far + smax = val + izamax = i + endif + else ! scaledsmax + val = 0.25*abs(real(x(ix))) + 0.25*abs(dimag(x(ix))) + if (val > smax) then + smax = val + izamax = i + endif + endif + endif + ix = ix + incx + end do + endif +end diff --git a/BLAS/SRC/lsame.f b/BLAS/SRC/lsame.f index 6aa4007065..10246991e4 100644 --- a/BLAS/SRC/lsame.f +++ b/BLAS/SRC/lsame.f @@ -46,10 +46,11 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup aux_blas +*> \ingroup lsame * * ===================================================================== LOGICAL FUNCTION LSAME(CA,CB) + IMPLICIT NONE * * -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/sasum.f b/BLAS/SRC/sasum.f index 6c2e0c9bc8..8b3136898a 100644 --- a/BLAS/SRC/sasum.f +++ b/BLAS/SRC/sasum.f @@ -55,7 +55,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup single_blas_level1 +*> \ingroup asum * *> \par Further Details: * ===================== @@ -69,6 +69,7 @@ *> * ===================================================================== REAL FUNCTION SASUM(N,SX,INCX) + IMPLICIT NONE * * -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/saxpby.f b/BLAS/SRC/saxpby.f new file mode 100644 index 0000000000..d1da056f43 --- /dev/null +++ b/BLAS/SRC/saxpby.f @@ -0,0 +1,148 @@ +*> \brief \b SAXPBY +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +* Definition: +* =========== +* +* SUBROUTINE SAXPBY(N,SA,SX,INCX,SB,SY,INCY) +* +* .. Scalar Arguments .. +* REAL SA,SB +* INTEGER INCX,INCY,N +* .. +* .. Array Arguments .. +* REAL SX(*),SY(*) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> SAXPBY constant times a vector plus constant times a vector. +*> +*> Y = ALPHA * X + BETA * Y +*> +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> number of elements in input vector(s) +*> \endverbatim +*> +*> \param[in] SA +*> \verbatim +*> SA is REAL +*> On entry, SA specifies the scalar alpha. +*> \endverbatim +*> +*> \param[in] SX +*> \verbatim +*> SX is REAL array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) +*> \endverbatim +*> +*> \param[in] INCX +*> \verbatim +*> INCX is INTEGER +*> storage spacing between elements of SX +*> \endverbatim +*> +*> \param[in] SB +*> \verbatim +*> SB is REAL +*> On entry, SB specifies the scalar beta. +*> \endverbatim +*> +*> \param[in,out] SY +*> \verbatim +*> SY is REAL array, dimension ( 1 + ( N - 1 )*abs( INCY ) ) +*> \endverbatim +*> +*> \param[in] INCY +*> \verbatim +*> INCY is INTEGER +*> storage spacing between elements of SY +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +*> \author Martin Koehler, MPI Magdeburg +* +*> \ingroup axpby +* +* ===================================================================== + SUBROUTINE SAXPBY(N,SA,SX,INCX,SB,SY,INCY) + IMPLICIT NONE +* +* -- Reference BLAS level1 routine -- +* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* +* .. Scalar Arguments .. + REAL SA,SB + INTEGER INCX,INCY,N +* .. +* .. Array Arguments .. + REAL SX(*),SY(*) +* .. +* .. External Subroutines .. + EXTERNAL SSCAL +* +* ===================================================================== +* +* .. Local Scalars .. + INTEGER I,IX,IY,M,MP1 +* .. +* .. Intrinsic Functions .. + INTRINSIC MOD +* .. + IF (N.LE.0) RETURN + +* Scale if SA.EQ.0 + IF (SA.EQ.0.0E0 .AND. SB.NE.0.0E0) THEN + CALL SSCAL(N, SB, SY, INCY) + RETURN + END IF + + + IF (INCX.EQ.1 .AND. INCY.EQ.1) THEN +* +* code for both increments equal to 1 +* + DO I = 1,N + SY(I) = SB*SY(I) + SA*SX(I) + END DO + ELSE +* +* code for unequal increments or equal increments +* not equal to 1 +* + IX = 1 + IY = 1 + IF (INCX.LT.0) IX = (-N+1)*INCX + 1 + IF (INCY.LT.0) IY = (-N+1)*INCY + 1 + DO I = 1,N + SY(IY) = SB*SY(IY) + SA*SX(IX) + IX = IX + INCX + IY = IY + INCY + END DO + END IF + RETURN +* +* End of SAXPBY +* + END diff --git a/BLAS/SRC/saxpy.f b/BLAS/SRC/saxpy.f index ded238a9f9..52296e5b37 100644 --- a/BLAS/SRC/saxpy.f +++ b/BLAS/SRC/saxpy.f @@ -73,7 +73,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup single_blas_level1 +*> \ingroup axpy * *> \par Further Details: * ===================== @@ -86,6 +86,7 @@ *> * ===================================================================== SUBROUTINE SAXPY(N,SA,SX,INCX,SY,INCY) + IMPLICIT NONE * * -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/scabs1.f b/BLAS/SRC/scabs1.f index 9bacf09db6..f6e6cbb7cc 100644 --- a/BLAS/SRC/scabs1.f +++ b/BLAS/SRC/scabs1.f @@ -39,10 +39,11 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup single_blas_level1 +*> \ingroup abs1 * * ===================================================================== REAL FUNCTION SCABS1(Z) + IMPLICIT NONE * * -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/scasum.f b/BLAS/SRC/scasum.f index 8fd67e9b29..054859ff37 100644 --- a/BLAS/SRC/scasum.f +++ b/BLAS/SRC/scasum.f @@ -55,7 +55,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup single_blas_level1 +*> \ingroup asum * *> \par Further Details: * ===================== @@ -69,6 +69,7 @@ *> * ===================================================================== REAL FUNCTION SCASUM(N,CX,INCX) + IMPLICIT NONE * * -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/scnrm2.f90 b/BLAS/SRC/scnrm2.f90 index 2b282d40a1..1885d7bf71 100644 --- a/BLAS/SRC/scnrm2.f90 +++ b/BLAS/SRC/scnrm2.f90 @@ -61,7 +61,7 @@ ! !> \date August 2016 ! -!> \ingroup single_blas_level1 +!> \ingroup nrm2 ! !> \par Contributors: ! ================== @@ -86,11 +86,12 @@ !> \endverbatim !> ! ===================================================================== -function SCNRM2( n, x, incx ) +function SCNRM2( n, x, incx ) + implicit none integer, parameter :: wp = kind(1.e0) real(wp) :: SCNRM2 ! -! -- Reference BLAS level1 routine (version 3.9.1) -- +! -- Reference BLAS level1 routine -- ! -- Reference BLAS is a software package provided by Univ. of Tennessee, -- ! -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- ! March 2021 @@ -100,15 +101,15 @@ function SCNRM2( n, x, incx ) real(wp), parameter :: one = 1.0_wp real(wp), parameter :: maxN = huge(0.0_wp) ! .. -! .. Blue's ccaling constants .. +! .. Blue's scaling constants .. real(wp), parameter :: tsml = real(radix(0._wp), wp)**ceiling( & (minexponent(0._wp) - 1) * 0.5_wp) real(wp), parameter :: tbig = real(radix(0._wp), wp)**floor( & (maxexponent(0._wp) - digits(0._wp) + 1) * 0.5_wp) real(wp), parameter :: ssml = real(radix(0._wp), wp)**( - floor( & - (minexponent(0._wp) - 1) * 0.5_wp)) + (minexponent(0._wp) - digits(0._wp)) * 0.5_wp)) real(wp), parameter :: sbig = real(radix(0._wp), wp)**( - ceiling( & - (maxexponent(0._wp) - digits(0._wp) + 1) * 0.5_wp)) + (maxexponent(0._wp) + digits(0._wp) - 1) * 0.5_wp)) ! .. ! .. Scalar Arguments .. integer :: incx, n diff --git a/BLAS/SRC/scopy.f b/BLAS/SRC/scopy.f index 961025ca44..76503a20f3 100644 --- a/BLAS/SRC/scopy.f +++ b/BLAS/SRC/scopy.f @@ -66,7 +66,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup single_blas_level1 +*> \ingroup copy * *> \par Further Details: * ===================== @@ -79,6 +79,7 @@ *> * ===================================================================== SUBROUTINE SCOPY(N,SX,INCX,SY,INCY) + IMPLICIT NONE * * -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/sdot.f b/BLAS/SRC/sdot.f index ed7213e4a9..2271ff03b1 100644 --- a/BLAS/SRC/sdot.f +++ b/BLAS/SRC/sdot.f @@ -66,7 +66,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup single_blas_level1 +*> \ingroup dot * *> \par Further Details: * ===================== @@ -79,6 +79,7 @@ *> * ===================================================================== REAL FUNCTION SDOT(N,SX,INCX,SY,INCY) + IMPLICIT NONE * * -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/sdsdot.f b/BLAS/SRC/sdsdot.f index 62e2bdd11f..4271c2be98 100644 --- a/BLAS/SRC/sdsdot.f +++ b/BLAS/SRC/sdsdot.f @@ -82,7 +82,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup single_blas_level1 +*> \ingroup dot * *> \par Further Details: * ===================== @@ -110,6 +110,7 @@ *> * ===================================================================== REAL FUNCTION SDSDOT(N,SB,SX,INCX,SY,INCY) + IMPLICIT NONE * * -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -130,7 +131,7 @@ REAL FUNCTION SDSDOT(N,SB,SX,INCX,SY,INCY) * .. DSDOT = SB IF (N.LE.0) THEN - SDSDOT = DSDOT + SDSDOT = REAL(DSDOT) RETURN END IF IF (INCX.EQ.INCY .AND. INCX.GT.0) THEN @@ -155,7 +156,7 @@ REAL FUNCTION SDSDOT(N,SB,SX,INCX,SY,INCY) KY = KY + INCY END DO END IF - SDSDOT = DSDOT + SDSDOT = REAL(DSDOT) RETURN * * End of SDSDOT diff --git a/BLAS/SRC/sgbmv.f b/BLAS/SRC/sgbmv.f index b5211eec99..942cd29a7d 100644 --- a/BLAS/SRC/sgbmv.f +++ b/BLAS/SRC/sgbmv.f @@ -146,6 +146,8 @@ *> ( 1 + ( n - 1 )*abs( INCY ) ) otherwise. *> Before entry, the incremented array Y must contain the *> vector y. On exit, Y is overwritten by the updated vector y. +*> If either m or n is zero, then Y not referenced and the function +*> performs a quick return. *> \endverbatim *> *> \param[in] INCY @@ -163,7 +165,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup single_blas_level2 +*> \ingroup gbmv * *> \par Further Details: * ===================== @@ -181,7 +183,9 @@ *> \endverbatim *> * ===================================================================== - SUBROUTINE SGBMV(TRANS,M,N,KL,KU,ALPHA,A,LDA,X,INCX,BETA,Y,INCY) + SUBROUTINE SGBMV(TRANS,M,N,KL,KU,ALPHA,A,LDA,X,INCX, + + BETA,Y,INCY) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/sgemm.f b/BLAS/SRC/sgemm.f index d25a152116..c88cae7d46 100644 --- a/BLAS/SRC/sgemm.f +++ b/BLAS/SRC/sgemm.f @@ -35,6 +35,16 @@ *> *> alpha and beta are scalars, and A, B and C are matrices, with op( A ) *> an m by k matrix, op( B ) a k by n matrix and C an m by n matrix. +*> +*> Note: if alpha and/or beta is zero, some parts of the matrix-matrix +*> operations are not performed. This results in the following NaN/Inf +*> propagation quirks: +*> +*> 1. If alpha is zero, NaNs or Infs in A or B do not affect the result. +*> 2. If both alpha and beta are zero, then a zero matrix is returned in C, +*> irrespective of any NaNs or Infs in A, B or C. +*> 3. If only beta is zero, alpha*op( A )*op( B ) is returned, irrespective +*> of any NaNs or Infs in C. *> \endverbatim * * Arguments: @@ -51,6 +61,9 @@ *> TRANSA = 'T' or 't', op( A ) = A**T. *> *> TRANSA = 'C' or 'c', op( A ) = A**T. +*> +*> Note: TRANSA = 'C' is supported for the sake of API consistency +*> between all ?GEMM variants. *> \endverbatim *> *> \param[in] TRANSB @@ -64,6 +77,9 @@ *> TRANSB = 'T' or 't', op( B ) = B**T. *> *> TRANSB = 'C' or 'c', op( B ) = B**T. +*> +*> Note: TRANSB = 'C' is supported for the sake of API consistency +*> between all ?GEMM variants. *> \endverbatim *> *> \param[in] M @@ -92,7 +108,9 @@ *> \param[in] ALPHA *> \verbatim *> ALPHA is REAL -*> On entry, ALPHA specifies the scalar alpha. +*> On entry, ALPHA specifies the scalar alpha. If ALPHA is zero the +*> values in A and B do not affect the result. This also means that +*> NaN/Inf propagation from A and B is inhibited if ALPHA is zero. *> \endverbatim *> *> \param[in] A @@ -102,7 +120,10 @@ *> Before entry with TRANSA = 'N' or 'n', the leading m by k *> part of the array A must contain the matrix A, otherwise *> the leading k by m part of the array A must contain the -*> matrix A. +*> matrix A, except if ALPHA is zero. +*> If ALPHA is zero, none of the values in A affect the result, even +*> if they are NaN/Inf. This also implies that if ALPHA is zero, +*> the matrix elements of A need not be initialized by the caller. *> \endverbatim *> *> \param[in] LDA @@ -121,7 +142,10 @@ *> Before entry with TRANSB = 'N' or 'n', the leading k by n *> part of the array B must contain the matrix B, otherwise *> the leading n by k part of the array B must contain the -*> matrix B. +*> matrix B, except if ALPHA is zero. +*> If ALPHA is zero, none of the values in B affect the result, even +*> if they are NaN/Inf. This also implies that if ALPHA is zero, +*> the matrix elements of B need not be initialized by the caller. *> \endverbatim *> *> \param[in] LDB @@ -136,16 +160,19 @@ *> \param[in] BETA *> \verbatim *> BETA is REAL -*> On entry, BETA specifies the scalar beta. When BETA is -*> supplied as zero then C need not be set on input. +*> On entry, BETA specifies the scalar beta. If BETA is zero the +*> values in C do not affect the result. This also means that +*> NaN/Inf propagation from C is inhibited if BETA is zero. *> \endverbatim *> *> \param[in,out] C *> \verbatim *> C is REAL array, dimension ( LDC, N ) *> Before entry, the leading m by n part of the array C must -*> contain the matrix C, except when beta is zero, in which -*> case C need not be set on entry. +*> contain the matrix C, except if beta is zero. +*> If beta is zero, none of the values in C affect the result, even +*> if they are NaN/Inf. This also implies that if beta is zero, +*> the matrix elements of C need not be initialized by the caller. *> On exit, the array C is overwritten by the m by n matrix *> ( alpha*op( A )*op( B ) + beta*C ). *> \endverbatim @@ -166,7 +193,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup single_blas_level3 +*> \ingroup gemm * *> \par Further Details: * ===================== @@ -183,7 +210,9 @@ *> \endverbatim *> * ===================================================================== - SUBROUTINE SGEMM(TRANSA,TRANSB,M,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC) + SUBROUTINE SGEMM(TRANSA,TRANSB,M,N,K,ALPHA,A,LDA,B,LDB, + + BETA,C,LDC) + IMPLICIT NONE * * -- Reference BLAS level3 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/sgemmtr.f b/BLAS/SRC/sgemmtr.f new file mode 100644 index 0000000000..257ff8bde2 --- /dev/null +++ b/BLAS/SRC/sgemmtr.f @@ -0,0 +1,431 @@ +*> \brief \b SGEMMTR +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +* Definition: +* =========== +* +* SUBROUTINE SGEMMTR(UPLO,TRANSA,TRANSB,N,K,ALPHA,A,LDA,B,LDB,BETA, +* C,LDC) +* +* .. Scalar Arguments .. +* REAL ALPHA,BETA +* INTEGER K,LDA,LDB,LDC,N +* CHARACTER TRANSA,TRANSB, UPLO +* .. +* .. Array Arguments .. +* REAL A(LDA,*),B(LDB,*),C(LDC,*) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> SGEMMTR performs one of the matrix-matrix operations +*> +*> C := alpha*op( A )*op( B ) + beta*C, +*> +*> where op( X ) is one of +*> +*> op( X ) = X or op( X ) = X**T, +*> +*> alpha and beta are scalars, and A, B and C are matrices, with op( A ) +*> an n by k matrix, op( B ) a k by n matrix and C an n by n matrix. +*> Thereby, the routine only accesses and updates the upper or lower +*> triangular part of the result matrix C. This behaviour can be used if +*> the resulting matrix C is known to be symmetric. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] UPLO +*> \verbatim +*> UPLO is CHARACTER*1 +*> On entry, UPLO specifies whether the lower or the upper +*> triangular part of C is access and updated. +*> +*> UPLO = 'L' or 'l', the lower triangular part of C is used. +*> +*> UPLO = 'U' or 'u', the upper triangular part of C is used. +*> \endverbatim +* +*> \param[in] TRANSA +*> \verbatim +*> TRANSA is CHARACTER*1 +*> On entry, TRANSA specifies the form of op( A ) to be used in +*> the matrix multiplication as follows: +*> +*> TRANSA = 'N' or 'n', op( A ) = A. +*> +*> TRANSA = 'T' or 't', op( A ) = A**T. +*> +*> TRANSA = 'C' or 'c', op( A ) = A**T. +*> \endverbatim +*> +*> \param[in] TRANSB +*> \verbatim +*> TRANSB is CHARACTER*1 +*> On entry, TRANSB specifies the form of op( B ) to be used in +*> the matrix multiplication as follows: +*> +*> TRANSB = 'N' or 'n', op( B ) = B. +*> +*> TRANSB = 'T' or 't', op( B ) = B**T. +*> +*> TRANSB = 'C' or 'c', op( B ) = B**T. +*> \endverbatim +*> +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> On entry, N specifies the number of rows and columns of +*> the matrix C, the number of columns of op(B) and the number +*> of rows of op(A). N must be at least zero. +*> \endverbatim +*> +*> \param[in] K +*> \verbatim +*> K is INTEGER +*> On entry, K specifies the number of columns of the matrix +*> op( A ) and the number of rows of the matrix op( B ). K must +*> be at least zero. +*> \endverbatim +*> +*> \param[in] ALPHA +*> \verbatim +*> ALPHA is REAL. +*> On entry, ALPHA specifies the scalar alpha. +*> \endverbatim +*> +*> \param[in] A +*> \verbatim +*> A is REAL array, dimension ( LDA, ka ), where ka is +*> k when TRANSA = 'N' or 'n', and is n otherwise. +*> Before entry with TRANSA = 'N' or 'n', the leading n by k +*> part of the array A must contain the matrix A, otherwise +*> the leading k by m part of the array A must contain the +*> matrix A. +*> \endverbatim +*> +*> \param[in] LDA +*> \verbatim +*> LDA is INTEGER +*> On entry, LDA specifies the first dimension of A as declared +*> in the calling (sub) program. When TRANSA = 'N' or 'n' then +*> LDA must be at least max( 1, n ), otherwise LDA must be at +*> least max( 1, k ). +*> \endverbatim +*> +*> \param[in] B +*> \verbatim +*> B is REAL array, dimension ( LDB, kb ), where kb is +*> n when TRANSB = 'N' or 'n', and is k otherwise. +*> Before entry with TRANSB = 'N' or 'n', the leading k by n +*> part of the array B must contain the matrix B, otherwise +*> the leading n by k part of the array B must contain the +*> matrix B. +*> \endverbatim +*> +*> \param[in] LDB +*> \verbatim +*> LDB is INTEGER +*> On entry, LDB specifies the first dimension of B as declared +*> in the calling (sub) program. When TRANSB = 'N' or 'n' then +*> LDB must be at least max( 1, k ), otherwise LDB must be at +*> least max( 1, n ). +*> \endverbatim +*> +*> \param[in] BETA +*> \verbatim +*> BETA is REAL. +*> On entry, BETA specifies the scalar beta. When BETA is +*> supplied as zero then C need not be set on input. +*> \endverbatim +*> +*> \param[in,out] C +*> \verbatim +*> C is REAL array, dimension ( LDC, N ) +*> Before entry, the leading n by n part of the array C must +*> contain the matrix C, except when beta is zero, in which +*> case C need not be set on entry. +*> On exit, the upper or lower triangular part of the matrix +*> C is overwritten by the n by n matrix +*> ( alpha*op( A )*op( B ) + beta*C ). +*> \endverbatim +*> +*> \param[in] LDC +*> \verbatim +*> LDC is INTEGER +*> On entry, LDC specifies the first dimension of C as declared +*> in the calling (sub) program. LDC must be at least +*> max( 1, n ). +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Martin Koehler +* +*> \ingroup gemmtr +* +*> \par Further Details: +* ===================== +*> +*> \verbatim +*> +*> Level 3 Blas routine. +*> +*> -- Written on 19-July-2023. +*> Martin Koehler, MPI Magdeburg +*> \endverbatim +*> +* ===================================================================== + SUBROUTINE SGEMMTR(UPLO,TRANSA,TRANSB,N,K,ALPHA,A,LDA,B,LDB, + + BETA,C,LDC) + IMPLICIT NONE +* +* -- Reference BLAS level3 routine -- +* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* +* .. Scalar Arguments .. + REAL ALPHA,BETA + INTEGER K,LDA,LDB,LDC,N + CHARACTER TRANSA,TRANSB,UPLO +* .. +* .. Array Arguments .. + REAL A(LDA,*),B(LDB,*),C(LDC,*) +* .. +* +* ===================================================================== +* +* .. External Functions .. + LOGICAL LSAME + EXTERNAL LSAME +* .. +* .. External Subroutines .. + EXTERNAL XERBLA +* .. +* .. Intrinsic Functions .. + INTRINSIC MAX +* .. +* .. Local Scalars .. + REAL TEMP + INTEGER I,INFO,J,L,NROWA,NROWB, ISTART, ISTOP + LOGICAL NOTA,NOTB, UPPER +* .. +* .. Parameters .. + REAL ONE,ZERO + PARAMETER (ONE=1.0D+0,ZERO=0.0D+0) +* .. +* +* Set NOTA and NOTB as true if A and B respectively are not +* transposed and set NROWA and NROWB as the number of rows of A +* and B respectively. +* + NOTA = LSAME(TRANSA,'N') + NOTB = LSAME(TRANSB,'N') + IF (NOTA) THEN + NROWA = N + ELSE + NROWA = K + END IF + IF (NOTB) THEN + NROWB = K + ELSE + NROWB = N + END IF + UPPER = LSAME(UPLO, 'U') +* +* Test the input parameters. +* + INFO = 0 + IF ((.NOT. UPPER) .AND. (.NOT. LSAME(UPLO, 'L'))) THEN + INFO = 1 + ELSE IF ((.NOT.NOTA) .AND. (.NOT.LSAME(TRANSA,'C')) .AND. + + (.NOT.LSAME(TRANSA,'T'))) THEN + INFO = 2 + ELSE IF ((.NOT.NOTB) .AND. (.NOT.LSAME(TRANSB,'C')) .AND. + + (.NOT.LSAME(TRANSB,'T'))) THEN + INFO = 3 + ELSE IF (N.LT.0) THEN + INFO = 4 + ELSE IF (K.LT.0) THEN + INFO = 5 + ELSE IF (LDA.LT.MAX(1,NROWA)) THEN + INFO = 8 + ELSE IF (LDB.LT.MAX(1,NROWB)) THEN + INFO = 10 + ELSE IF (LDC.LT.MAX(1,N)) THEN + INFO = 13 + END IF + IF (INFO.NE.0) THEN + CALL XERBLA('SGEMMTR',INFO) + RETURN + END IF +* +* Quick return if possible. +* + IF (N.EQ.0) RETURN +* +* And if alpha.eq.zero. +* + IF (ALPHA.EQ.ZERO) THEN + IF (BETA.EQ.ZERO) THEN + DO 20 J = 1,N + IF (UPPER) THEN + ISTART = 1 + ISTOP = J + ELSE + ISTART = J + ISTOP = N + END IF + + DO 10 I = ISTART, ISTOP + C(I,J) = ZERO + 10 CONTINUE + 20 CONTINUE + ELSE + DO 40 J = 1,N + IF (UPPER) THEN + ISTART = 1 + ISTOP = J + ELSE + ISTART = J + ISTOP = N + END IF + + DO 30 I = ISTART, ISTOP + C(I,J) = BETA*C(I,J) + 30 CONTINUE + 40 CONTINUE + END IF + RETURN + END IF +* +* Start the operations. +* + IF (NOTB) THEN + IF (NOTA) THEN +* +* Form C := alpha*A*B + beta*C. +* + DO 90 J = 1,N + IF (UPPER) THEN + ISTART = 1 + ISTOP = J + ELSE + ISTART = J + ISTOP = N + END IF + IF (BETA.EQ.ZERO) THEN + DO 50 I = ISTART, ISTOP + C(I,J) = ZERO + 50 CONTINUE + ELSE IF (BETA.NE.ONE) THEN + DO 60 I = ISTART, ISTOP + C(I,J) = BETA*C(I,J) + 60 CONTINUE + END IF + DO 80 L = 1,K + TEMP = ALPHA*B(L,J) + DO 70 I = ISTART, ISTOP + C(I,J) = C(I,J) + TEMP*A(I,L) + 70 CONTINUE + 80 CONTINUE + 90 CONTINUE + ELSE +* +* Form C := alpha*A**T*B + beta*C +* + DO 120 J = 1,N + IF (UPPER) THEN + ISTART = 1 + ISTOP = J + ELSE + ISTART = J + ISTOP = N + END IF + + DO 110 I = ISTART, ISTOP + TEMP = ZERO + DO 100 L = 1,K + TEMP = TEMP + A(L,I)*B(L,J) + 100 CONTINUE + IF (BETA.EQ.ZERO) THEN + C(I,J) = ALPHA*TEMP + ELSE + C(I,J) = ALPHA*TEMP + BETA*C(I,J) + END IF + 110 CONTINUE + 120 CONTINUE + END IF + ELSE + IF (NOTA) THEN +* +* Form C := alpha*A*B**T + beta*C +* + DO 170 J = 1,N + IF (UPPER) THEN + ISTART = 1 + ISTOP = J + ELSE + ISTART = J + ISTOP = N + END IF + + IF (BETA.EQ.ZERO) THEN + DO 130 I = ISTART,ISTOP + C(I,J) = ZERO + 130 CONTINUE + ELSE IF (BETA.NE.ONE) THEN + DO 140 I = ISTART,ISTOP + C(I,J) = BETA*C(I,J) + 140 CONTINUE + END IF + DO 160 L = 1,K + TEMP = ALPHA*B(J,L) + DO 150 I = ISTART,ISTOP + C(I,J) = C(I,J) + TEMP*A(I,L) + 150 CONTINUE + 160 CONTINUE + 170 CONTINUE + ELSE +* +* Form C := alpha*A**T*B**T + beta*C +* + DO 200 J = 1,N + IF (UPPER) THEN + ISTART = 1 + ISTOP = J + ELSE + ISTART = J + ISTOP = N + END IF + + DO 190 I = ISTART, ISTOP + TEMP = ZERO + DO 180 L = 1,K + TEMP = TEMP + A(L,I)*B(J,L) + 180 CONTINUE + IF (BETA.EQ.ZERO) THEN + C(I,J) = ALPHA*TEMP + ELSE + C(I,J) = ALPHA*TEMP + BETA*C(I,J) + END IF + 190 CONTINUE + 200 CONTINUE + END IF + END IF +* + RETURN +* +* End of SGEMMTR +* + END diff --git a/BLAS/SRC/sgemv.f b/BLAS/SRC/sgemv.f index 0517b124c5..07efa04307 100644 --- a/BLAS/SRC/sgemv.f +++ b/BLAS/SRC/sgemv.f @@ -117,6 +117,8 @@ *> Before entry with BETA non-zero, the incremented array Y *> must contain the vector y. On exit, Y is overwritten by the *> updated vector y. +*> If either m or n is zero, then Y not referenced and the function +*> performs a quick return. *> \endverbatim *> *> \param[in] INCY @@ -134,7 +136,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup single_blas_level2 +*> \ingroup gemv * *> \par Further Details: * ===================== @@ -153,6 +155,7 @@ *> * ===================================================================== SUBROUTINE SGEMV(TRANS,M,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/sger.f b/BLAS/SRC/sger.f index 9dfe4a2826..befc1e3390 100644 --- a/BLAS/SRC/sger.f +++ b/BLAS/SRC/sger.f @@ -109,7 +109,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup single_blas_level2 +*> \ingroup ger * *> \par Further Details: * ===================== @@ -127,6 +127,7 @@ *> * ===================================================================== SUBROUTINE SGER(M,N,ALPHA,X,INCX,Y,INCY,A,LDA) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/snrm2.f90 b/BLAS/SRC/snrm2.f90 index 2404ff0914..1e849f19b6 100644 --- a/BLAS/SRC/snrm2.f90 +++ b/BLAS/SRC/snrm2.f90 @@ -60,7 +60,7 @@ ! !> \date August 2016 ! -!> \ingroup single_blas_level1 +!> \ingroup nrm2 ! !> \par Contributors: ! ================== @@ -85,11 +85,12 @@ !> \endverbatim !> ! ===================================================================== -function SNRM2( n, x, incx ) +function SNRM2( n, x, incx ) + implicit none integer, parameter :: wp = kind(1.e0) real(wp) :: SNRM2 ! -! -- Reference BLAS level1 routine (version 3.9.1) -- +! -- Reference BLAS level1 routine -- ! -- Reference BLAS is a software package provided by Univ. of Tennessee, -- ! -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- ! March 2021 @@ -99,15 +100,15 @@ function SNRM2( n, x, incx ) real(wp), parameter :: one = 1.0_wp real(wp), parameter :: maxN = huge(0.0_wp) ! .. -! .. Blue's ccaling constants .. +! .. Blue's scaling constants .. real(wp), parameter :: tsml = real(radix(0._wp), wp)**ceiling( & (minexponent(0._wp) - 1) * 0.5_wp) real(wp), parameter :: tbig = real(radix(0._wp), wp)**floor( & (maxexponent(0._wp) - digits(0._wp) + 1) * 0.5_wp) real(wp), parameter :: ssml = real(radix(0._wp), wp)**( - floor( & - (minexponent(0._wp) - 1) * 0.5_wp)) + (minexponent(0._wp) - digits(0._wp)) * 0.5_wp)) real(wp), parameter :: sbig = real(radix(0._wp), wp)**( - ceiling( & - (maxexponent(0._wp) - digits(0._wp) + 1) * 0.5_wp)) + (maxexponent(0._wp) + digits(0._wp) - 1) * 0.5_wp)) ! .. ! .. Scalar Arguments .. integer :: incx, n diff --git a/BLAS/SRC/srot.f b/BLAS/SRC/srot.f index 1441e0d939..2a778906f1 100644 --- a/BLAS/SRC/srot.f +++ b/BLAS/SRC/srot.f @@ -76,7 +76,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup single_blas_level1 +*> \ingroup rot * *> \par Further Details: * ===================== @@ -89,6 +89,7 @@ *> * ===================================================================== SUBROUTINE SROT(N,SX,INCX,SY,INCY,C,S) + IMPLICIT NONE * * -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/srotg.f90 b/BLAS/SRC/srotg.f90 index af1beceeef..93b2e2b54e 100644 --- a/BLAS/SRC/srotg.f90 +++ b/BLAS/SRC/srotg.f90 @@ -5,19 +5,16 @@ ! Online html documentation available at ! http://www.netlib.org/lapack/explore-html/ ! -! Definition: -! =========== -! -! SROTG constructs a plane rotation -! [ c s ] [ a ] = [ r ] -! [ -s c ] [ b ] [ 0 ] -! satisfying c**2 + s**2 = 1. -! !> \par Purpose: ! ============= !> !> \verbatim !> +!> SROTG constructs a plane rotation +!> [ c s ] [ a ] = [ r ] +!> [ -s c ] [ b ] [ 0 ] +!> satisfying c**2 + s**2 = 1. +!> !> The computation uses the formulas !> sigma = sgn(a) if |a| > |b| !> = sgn(b) if |b| >= |a| @@ -34,6 +31,8 @@ !> If |z| > 1, set c = 1/z and s = sqrt( 1 - c**2). !> !> \endverbatim +!> +!> @see lartg, @see lartgp ! ! Arguments: ! ========== @@ -74,7 +73,7 @@ !> !> Weslley Pereira, University of Colorado Denver, USA ! -!> \ingroup single_blas_level1 +!> \ingroup rotg ! !> \par Further Details: ! ===================== @@ -90,6 +89,7 @@ ! ! ===================================================================== subroutine SROTG( a, b, c, s ) + implicit none integer, parameter :: wp = kind(1.e0) ! ! -- Reference BLAS level1 routine -- diff --git a/BLAS/SRC/srotm.f b/BLAS/SRC/srotm.f index a20cfd9649..f5c2e3c9cd 100644 --- a/BLAS/SRC/srotm.f +++ b/BLAS/SRC/srotm.f @@ -39,6 +39,9 @@ *> (SH21 SH22), (SH21 1.E0), (-1.E0 SH22), (0.E0 1.E0). *> SEE SROTMG FOR A DESCRIPTION OF DATA STORAGE IN SPARAM. *> +*> IF SFLAG IS NOT ONE OF THE LISTED ABOVE, THE BEHAVIOR IS UNDEFINED. +*> NANS IN SFLAG MAY NOT PROPAGATE TO THE OUTPUT. +*> *> \endverbatim * * Arguments: @@ -90,10 +93,11 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup single_blas_level1 +*> \ingroup rotm * * ===================================================================== SUBROUTINE SROTM(N,SX,INCX,SY,INCY,SPARAM) + IMPLICIT NONE * * -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/srotmg.f b/BLAS/SRC/srotmg.f index 63d55dde03..bd1bb57624 100644 --- a/BLAS/SRC/srotmg.f +++ b/BLAS/SRC/srotmg.f @@ -83,10 +83,11 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup single_blas_level1 +*> \ingroup rotmg * * ===================================================================== SUBROUTINE SROTMG(SD1,SD2,SX1,SY1,SPARAM) + IMPLICIT NONE * * -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/ssbmv.f b/BLAS/SRC/ssbmv.f index c458131709..487a610626 100644 --- a/BLAS/SRC/ssbmv.f +++ b/BLAS/SRC/ssbmv.f @@ -162,7 +162,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup single_blas_level2 +*> \ingroup hbmv * *> \par Further Details: * ===================== @@ -181,6 +181,7 @@ *> * ===================================================================== SUBROUTINE SSBMV(UPLO,N,K,ALPHA,A,LDA,X,INCX,BETA,Y,INCY) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/sscal.f b/BLAS/SRC/sscal.f index 7d52c4253f..1079418637 100644 --- a/BLAS/SRC/sscal.f +++ b/BLAS/SRC/sscal.f @@ -62,7 +62,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup single_blas_level1 +*> \ingroup scal * *> \par Further Details: * ===================== @@ -76,6 +76,7 @@ *> * ===================================================================== SUBROUTINE SSCAL(N,SA,SX,INCX) + IMPLICIT NONE * * -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -94,10 +95,14 @@ SUBROUTINE SSCAL(N,SA,SX,INCX) * .. Local Scalars .. INTEGER I,M,MP1,NINCX * .. +* .. Parameters .. + REAL ONE + PARAMETER (ONE=1.0E+0) +* .. * .. Intrinsic Functions .. INTRINSIC MOD * .. - IF (N.LE.0 .OR. INCX.LE.0) RETURN + IF (N.LE.0 .OR. INCX.LE.0 .OR. SA.EQ.ONE) RETURN IF (INCX.EQ.1) THEN * * code for increment equal to 1 diff --git a/BLAS/SRC/sspmv.f b/BLAS/SRC/sspmv.f index 840fd5c79a..22a9ce25cf 100644 --- a/BLAS/SRC/sspmv.f +++ b/BLAS/SRC/sspmv.f @@ -125,7 +125,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup single_blas_level2 +*> \ingroup hpmv * *> \par Further Details: * ===================== @@ -144,6 +144,7 @@ *> * ===================================================================== SUBROUTINE SSPMV(UPLO,N,ALPHA,AP,X,INCX,BETA,Y,INCY) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/sspr.f b/BLAS/SRC/sspr.f index ab24d3f1dc..9c6d961ea3 100644 --- a/BLAS/SRC/sspr.f +++ b/BLAS/SRC/sspr.f @@ -106,7 +106,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup single_blas_level2 +*> \ingroup hpr * *> \par Further Details: * ===================== @@ -124,6 +124,7 @@ *> * ===================================================================== SUBROUTINE SSPR(UPLO,N,ALPHA,X,INCX,AP) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/sspr2.f b/BLAS/SRC/sspr2.f index 1107a8c655..31adc3e817 100644 --- a/BLAS/SRC/sspr2.f +++ b/BLAS/SRC/sspr2.f @@ -121,7 +121,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup single_blas_level2 +*> \ingroup hpr2 * *> \par Further Details: * ===================== @@ -139,6 +139,7 @@ *> * ===================================================================== SUBROUTINE SSPR2(UPLO,N,ALPHA,X,INCX,Y,INCY,AP) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/sswap.f b/BLAS/SRC/sswap.f index 1a0fd9a025..29136e5492 100644 --- a/BLAS/SRC/sswap.f +++ b/BLAS/SRC/sswap.f @@ -66,7 +66,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup single_blas_level1 +*> \ingroup swap * *> \par Further Details: * ===================== @@ -79,6 +79,7 @@ *> * ===================================================================== SUBROUTINE SSWAP(N,SX,INCX,SY,INCY) + IMPLICIT NONE * * -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/ssymm.f b/BLAS/SRC/ssymm.f index 3147bd619e..4a26cf42ba 100644 --- a/BLAS/SRC/ssymm.f +++ b/BLAS/SRC/ssymm.f @@ -168,7 +168,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup single_blas_level3 +*> \ingroup hemm * *> \par Further Details: * ===================== @@ -186,6 +186,7 @@ *> * ===================================================================== SUBROUTINE SSYMM(SIDE,UPLO,M,N,ALPHA,A,LDA,B,LDB,BETA,C,LDC) + IMPLICIT NONE * * -- Reference BLAS level3 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -234,9 +235,11 @@ SUBROUTINE SSYMM(SIDE,UPLO,M,N,ALPHA,A,LDA,B,LDB,BETA,C,LDC) * Test the input parameters. * INFO = 0 - IF ((.NOT.LSAME(SIDE,'L')) .AND. (.NOT.LSAME(SIDE,'R'))) THEN + IF ((.NOT.LSAME(SIDE,'L')) .AND. + + (.NOT.LSAME(SIDE,'R'))) THEN INFO = 1 - ELSE IF ((.NOT.UPPER) .AND. (.NOT.LSAME(UPLO,'L'))) THEN + ELSE IF ((.NOT.UPPER) .AND. + + (.NOT.LSAME(UPLO,'L'))) THEN INFO = 2 ELSE IF (M.LT.0) THEN INFO = 3 diff --git a/BLAS/SRC/ssymv.f b/BLAS/SRC/ssymv.f index 91117989bf..23020d8374 100644 --- a/BLAS/SRC/ssymv.f +++ b/BLAS/SRC/ssymv.f @@ -130,7 +130,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup single_blas_level2 +*> \ingroup hemv * *> \par Further Details: * ===================== @@ -149,6 +149,7 @@ *> * ===================================================================== SUBROUTINE SSYMV(UPLO,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/ssyr.f b/BLAS/SRC/ssyr.f index 51164c5c41..0f4edfcdbd 100644 --- a/BLAS/SRC/ssyr.f +++ b/BLAS/SRC/ssyr.f @@ -111,7 +111,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup single_blas_level2 +*> \ingroup her * *> \par Further Details: * ===================== @@ -129,6 +129,7 @@ *> * ===================================================================== SUBROUTINE SSYR(UPLO,N,ALPHA,X,INCX,A,LDA) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/ssyr2.f b/BLAS/SRC/ssyr2.f index 1dc73eee96..b184d79dcc 100644 --- a/BLAS/SRC/ssyr2.f +++ b/BLAS/SRC/ssyr2.f @@ -126,7 +126,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup single_blas_level2 +*> \ingroup her2 * *> \par Further Details: * ===================== @@ -144,6 +144,7 @@ *> * ===================================================================== SUBROUTINE SSYR2(UPLO,N,ALPHA,X,INCX,Y,INCY,A,LDA) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/ssyr2k.f b/BLAS/SRC/ssyr2k.f index 1bb5aa4caf..859f56d81e 100644 --- a/BLAS/SRC/ssyr2k.f +++ b/BLAS/SRC/ssyr2k.f @@ -170,7 +170,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup single_blas_level3 +*> \ingroup her2k * *> \par Further Details: * ===================== @@ -189,6 +189,7 @@ *> * ===================================================================== SUBROUTINE SSYR2K(UPLO,TRANS,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC) + IMPLICIT NONE * * -- Reference BLAS level3 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/ssyrk.f b/BLAS/SRC/ssyrk.f index faca01b894..9bb69668a3 100644 --- a/BLAS/SRC/ssyrk.f +++ b/BLAS/SRC/ssyrk.f @@ -148,7 +148,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup single_blas_level3 +*> \ingroup herk * *> \par Further Details: * ===================== @@ -166,6 +166,7 @@ *> * ===================================================================== SUBROUTINE SSYRK(UPLO,TRANS,N,K,ALPHA,A,LDA,BETA,C,LDC) + IMPLICIT NONE * * -- Reference BLAS level3 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/stbmv.f b/BLAS/SRC/stbmv.f index 09273a1b1b..f111b30495 100644 --- a/BLAS/SRC/stbmv.f +++ b/BLAS/SRC/stbmv.f @@ -164,7 +164,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup single_blas_level2 +*> \ingroup tbmv * *> \par Further Details: * ===================== @@ -183,6 +183,7 @@ *> * ===================================================================== SUBROUTINE STBMV(UPLO,TRANS,DIAG,N,K,A,LDA,X,INCX) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -223,10 +224,12 @@ SUBROUTINE STBMV(UPLO,TRANS,DIAG,N,K,A,LDA,X,INCX) INFO = 0 IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN INFO = 1 - ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND. + ELSE IF (.NOT.LSAME(TRANS,'N') .AND. + + .NOT.LSAME(TRANS,'T') .AND. + .NOT.LSAME(TRANS,'C')) THEN INFO = 2 - ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN + ELSE IF (.NOT.LSAME(DIAG,'U') .AND. + + .NOT.LSAME(DIAG,'N')) THEN INFO = 3 ELSE IF (N.LT.0) THEN INFO = 4 diff --git a/BLAS/SRC/stbsv.f b/BLAS/SRC/stbsv.f index 5f37cf7195..ee12cd0b26 100644 --- a/BLAS/SRC/stbsv.f +++ b/BLAS/SRC/stbsv.f @@ -168,7 +168,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup single_blas_level2 +*> \ingroup tbsv * *> \par Further Details: * ===================== @@ -186,6 +186,7 @@ *> * ===================================================================== SUBROUTINE STBSV(UPLO,TRANS,DIAG,N,K,A,LDA,X,INCX) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -226,10 +227,12 @@ SUBROUTINE STBSV(UPLO,TRANS,DIAG,N,K,A,LDA,X,INCX) INFO = 0 IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN INFO = 1 - ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND. + ELSE IF (.NOT.LSAME(TRANS,'N') .AND. + + .NOT.LSAME(TRANS,'T') .AND. + .NOT.LSAME(TRANS,'C')) THEN INFO = 2 - ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN + ELSE IF (.NOT.LSAME(DIAG,'U') .AND. + + .NOT.LSAME(DIAG,'N')) THEN INFO = 3 ELSE IF (N.LT.0) THEN INFO = 4 diff --git a/BLAS/SRC/stpmv.f b/BLAS/SRC/stpmv.f index 9e77c1e70d..4cfee1448f 100644 --- a/BLAS/SRC/stpmv.f +++ b/BLAS/SRC/stpmv.f @@ -120,7 +120,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup single_blas_level2 +*> \ingroup tpmv * *> \par Further Details: * ===================== @@ -139,6 +139,7 @@ *> * ===================================================================== SUBROUTINE STPMV(UPLO,TRANS,DIAG,N,AP,X,INCX) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -176,10 +177,12 @@ SUBROUTINE STPMV(UPLO,TRANS,DIAG,N,AP,X,INCX) INFO = 0 IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN INFO = 1 - ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND. + ELSE IF (.NOT.LSAME(TRANS,'N') .AND. + + .NOT.LSAME(TRANS,'T') .AND. + .NOT.LSAME(TRANS,'C')) THEN INFO = 2 - ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN + ELSE IF (.NOT.LSAME(DIAG,'U') .AND. + + .NOT.LSAME(DIAG,'N')) THEN INFO = 3 ELSE IF (N.LT.0) THEN INFO = 4 diff --git a/BLAS/SRC/stpsv.f b/BLAS/SRC/stpsv.f index 40b1ffb2c7..fbeac84974 100644 --- a/BLAS/SRC/stpsv.f +++ b/BLAS/SRC/stpsv.f @@ -123,7 +123,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup single_blas_level2 +*> \ingroup tpsv * *> \par Further Details: * ===================== @@ -141,6 +141,7 @@ *> * ===================================================================== SUBROUTINE STPSV(UPLO,TRANS,DIAG,N,AP,X,INCX) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -178,10 +179,12 @@ SUBROUTINE STPSV(UPLO,TRANS,DIAG,N,AP,X,INCX) INFO = 0 IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN INFO = 1 - ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND. + ELSE IF (.NOT.LSAME(TRANS,'N') .AND. + + .NOT.LSAME(TRANS,'T') .AND. + .NOT.LSAME(TRANS,'C')) THEN INFO = 2 - ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN + ELSE IF (.NOT.LSAME(DIAG,'U') .AND. + + .NOT.LSAME(DIAG,'N')) THEN INFO = 3 ELSE IF (N.LT.0) THEN INFO = 4 diff --git a/BLAS/SRC/strmm.f b/BLAS/SRC/strmm.f index 9aa2ac260c..bdef18c401 100644 --- a/BLAS/SRC/strmm.f +++ b/BLAS/SRC/strmm.f @@ -156,7 +156,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup single_blas_level3 +*> \ingroup trmm * *> \par Further Details: * ===================== @@ -174,6 +174,7 @@ *> * ===================================================================== SUBROUTINE STRMM(SIDE,UPLO,TRANSA,DIAG,M,N,ALPHA,A,LDA,B,LDB) + IMPLICIT NONE * * -- Reference BLAS level3 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -230,7 +231,8 @@ SUBROUTINE STRMM(SIDE,UPLO,TRANSA,DIAG,M,N,ALPHA,A,LDA,B,LDB) + (.NOT.LSAME(TRANSA,'T')) .AND. + (.NOT.LSAME(TRANSA,'C'))) THEN INFO = 3 - ELSE IF ((.NOT.LSAME(DIAG,'U')) .AND. (.NOT.LSAME(DIAG,'N'))) THEN + ELSE IF ((.NOT.LSAME(DIAG,'U')) .AND. + + (.NOT.LSAME(DIAG,'N'))) THEN INFO = 4 ELSE IF (M.LT.0) THEN INFO = 5 diff --git a/BLAS/SRC/strmv.f b/BLAS/SRC/strmv.f index 6f5a3e8fd4..4a303b9d6b 100644 --- a/BLAS/SRC/strmv.f +++ b/BLAS/SRC/strmv.f @@ -125,7 +125,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup single_blas_level2 +*> \ingroup trmv * *> \par Further Details: * ===================== @@ -144,6 +144,7 @@ *> * ===================================================================== SUBROUTINE STRMV(UPLO,TRANS,DIAG,N,A,LDA,X,INCX) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -184,10 +185,12 @@ SUBROUTINE STRMV(UPLO,TRANS,DIAG,N,A,LDA,X,INCX) INFO = 0 IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN INFO = 1 - ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND. + ELSE IF (.NOT.LSAME(TRANS,'N') .AND. + + .NOT.LSAME(TRANS,'T') .AND. + .NOT.LSAME(TRANS,'C')) THEN INFO = 2 - ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN + ELSE IF (.NOT.LSAME(DIAG,'U') .AND. + + .NOT.LSAME(DIAG,'N')) THEN INFO = 3 ELSE IF (N.LT.0) THEN INFO = 4 diff --git a/BLAS/SRC/strsm.f b/BLAS/SRC/strsm.f index 6e97c52d86..45fbb315b2 100644 --- a/BLAS/SRC/strsm.f +++ b/BLAS/SRC/strsm.f @@ -159,7 +159,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup single_blas_level3 +*> \ingroup trsm * *> \par Further Details: * ===================== @@ -178,6 +178,7 @@ *> * ===================================================================== SUBROUTINE STRSM(SIDE,UPLO,TRANSA,DIAG,M,N,ALPHA,A,LDA,B,LDB) + IMPLICIT NONE * * -- Reference BLAS level3 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -234,7 +235,8 @@ SUBROUTINE STRSM(SIDE,UPLO,TRANSA,DIAG,M,N,ALPHA,A,LDA,B,LDB) + (.NOT.LSAME(TRANSA,'T')) .AND. + (.NOT.LSAME(TRANSA,'C'))) THEN INFO = 3 - ELSE IF ((.NOT.LSAME(DIAG,'U')) .AND. (.NOT.LSAME(DIAG,'N'))) THEN + ELSE IF ((.NOT.LSAME(DIAG,'U')) .AND. + + (.NOT.LSAME(DIAG,'N'))) THEN INFO = 4 ELSE IF (M.LT.0) THEN INFO = 5 diff --git a/BLAS/SRC/strsv.f b/BLAS/SRC/strsv.f index e228ea90c1..1d6adbd461 100644 --- a/BLAS/SRC/strsv.f +++ b/BLAS/SRC/strsv.f @@ -128,7 +128,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup single_blas_level2 +*> \ingroup trsv * *> \par Further Details: * ===================== @@ -146,6 +146,7 @@ *> * ===================================================================== SUBROUTINE STRSV(UPLO,TRANS,DIAG,N,A,LDA,X,INCX) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -186,10 +187,12 @@ SUBROUTINE STRSV(UPLO,TRANS,DIAG,N,A,LDA,X,INCX) INFO = 0 IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN INFO = 1 - ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND. + ELSE IF (.NOT.LSAME(TRANS,'N') .AND. + + .NOT.LSAME(TRANS,'T') .AND. + .NOT.LSAME(TRANS,'C')) THEN INFO = 2 - ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN + ELSE IF (.NOT.LSAME(DIAG,'U') .AND. + + .NOT.LSAME(DIAG,'N')) THEN INFO = 3 ELSE IF (N.LT.0) THEN INFO = 4 diff --git a/BLAS/SRC/xerbla.f b/BLAS/SRC/xerbla.f index 0d73705fad..622f91959b 100644 --- a/BLAS/SRC/xerbla.f +++ b/BLAS/SRC/xerbla.f @@ -53,10 +53,11 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup aux_blas +*> \ingroup xerbla * * ===================================================================== SUBROUTINE XERBLA( SRNAME, INFO ) + IMPLICIT NONE * * -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/xerbla_array.f b/BLAS/SRC/xerbla_array.f index 8a3c87840b..3faee74f24 100644 --- a/BLAS/SRC/xerbla_array.f +++ b/BLAS/SRC/xerbla_array.f @@ -73,10 +73,11 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup aux_blas +*> \ingroup xerbla_array * * ===================================================================== SUBROUTINE XERBLA_ARRAY(SRNAME_ARRAY, SRNAME_LEN, INFO) + IMPLICIT NONE * * -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -105,7 +106,7 @@ SUBROUTINE XERBLA_ARRAY(SRNAME_ARRAY, SRNAME_LEN, INFO) EXTERNAL XERBLA * .. * .. Executable Statements .. - SRNAME = '' + SRNAME = ' ' DO I = 1, MIN( SRNAME_LEN, LEN( SRNAME ) ) SRNAME( I:I ) = SRNAME_ARRAY( I ) END DO diff --git a/BLAS/SRC/zaxpby.f b/BLAS/SRC/zaxpby.f new file mode 100644 index 0000000000..c0d166256f --- /dev/null +++ b/BLAS/SRC/zaxpby.f @@ -0,0 +1,145 @@ +*> \brief \b ZAXPBY +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +* Definition: +* =========== +* +* SUBROUTINE ZAXPBY(N,ZA,ZX,INCX,ZB,ZY,INCY) +* +* .. Scalar Arguments .. +* COMPLEX*16 ZA,ZB +* INTEGER INCX,INCY,N +* .. +* .. Array Arguments .. +* COMPLEX*16 ZX(*),ZY(*) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> ZAXPBY constant times a vector plus constant times a vector. +*> +*> Y = ALPHA * X + BETA * Y +*> +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> number of elements in input vector(s) +*> \endverbatim +*> +*> \param[in] ZA +*> \verbatim +*> ZA is COMPLEX*16 +*> On entry, ZA specifies the scalar alpha. +*> \endverbatim +*> +*> \param[in] ZX +*> \verbatim +*> ZX is COMPLEX*16 array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) +*> \endverbatim +*> +*> \param[in] INCX +*> \verbatim +*> INCX is INTEGER +*> storage spacing between elements of ZX +*> \endverbatim +*> +*> \param[in] ZB +*> \verbatim +*> ZB is COMPLEX*16 +*> On entry, ZB specifies the scalar beta. +*> \endverbatim +*> +*> \param[in,out] ZY +*> \verbatim +*> ZY is COMPLEX*16 array, dimension ( 1 + ( N - 1 )*abs( INCY ) ) +*> \endverbatim +*> +*> \param[in] INCY +*> \verbatim +*> INCY is INTEGER +*> storage spacing between elements of ZY +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +*> \author Martin Koehler, MPI Magdeburg +* +*> \ingroup axpby +* +* ===================================================================== + SUBROUTINE ZAXPBY(N,ZA,ZX,INCX,ZB,ZY,INCY) + IMPLICIT NONE +* +* -- Reference BLAS level1 routine -- +* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* +* .. Scalar Arguments .. + COMPLEX*16 ZA,ZB + INTEGER INCX,INCY,N +* .. +* .. Array Arguments .. + COMPLEX*16 ZX(*),ZY(*) +* .. +* .. External Subroutines .. + EXTERNAL ZSCAL +* +* ===================================================================== +* +* .. Local Scalars .. + INTEGER I,IX,IY +* .. + IF (N.LE.0) RETURN + +* Scale if ZA .EQ. 0 + IF ( ZA.EQ.(0.0D0,0.0D0) .AND. ZB.NE.(0.0D0,0.0D0)) THEN + CALL ZSCAL(N, ZB, ZY, INCY) + RETURN + END IF + + IF (INCX.EQ.1 .AND. INCY.EQ.1) THEN +* +* code for both increments equal to 1 +* + DO I = 1,N + ZY(I) = ZB*ZY(I) + ZA*ZX(I) + END DO + ELSE +* +* code for unequal increments or equal increments +* not equal to 1 +* + IX = 1 + IY = 1 + IF (INCX.LT.0) IX = (-N+1)*INCX + 1 + IF (INCY.LT.0) IY = (-N+1)*INCY + 1 + DO I = 1,N + ZY(IY) = ZB*ZY(IY) + ZA*ZX(IX) + IX = IX + INCX + IY = IY + INCY + END DO + END IF +* + RETURN +* +* End of ZAXBPY +* + END diff --git a/BLAS/SRC/zaxpy.f b/BLAS/SRC/zaxpy.f index 35c0e4b892..f9081e957a 100644 --- a/BLAS/SRC/zaxpy.f +++ b/BLAS/SRC/zaxpy.f @@ -72,7 +72,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex16_blas_level1 +*> \ingroup axpy * *> \par Further Details: * ===================== @@ -85,6 +85,7 @@ *> * ===================================================================== SUBROUTINE ZAXPY(N,ZA,ZX,INCX,ZY,INCY) + IMPLICIT NONE * * -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/zcopy.f b/BLAS/SRC/zcopy.f index 1efcdb6b0f..736bb9f680 100644 --- a/BLAS/SRC/zcopy.f +++ b/BLAS/SRC/zcopy.f @@ -65,7 +65,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex16_blas_level1 +*> \ingroup copy * *> \par Further Details: * ===================== @@ -78,6 +78,7 @@ *> * ===================================================================== SUBROUTINE ZCOPY(N,ZX,INCX,ZY,INCY) + IMPLICIT NONE * * -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/zdotc.f b/BLAS/SRC/zdotc.f index bcc29e2dad..bdb6e8c6f8 100644 --- a/BLAS/SRC/zdotc.f +++ b/BLAS/SRC/zdotc.f @@ -67,7 +67,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex16_blas_level1 +*> \ingroup dot * *> \par Further Details: * ===================== @@ -80,6 +80,7 @@ *> * ===================================================================== COMPLEX*16 FUNCTION ZDOTC(N,ZX,INCX,ZY,INCY) + IMPLICIT NONE * * -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/zdotu.f b/BLAS/SRC/zdotu.f index 11c18da230..aeed01201d 100644 --- a/BLAS/SRC/zdotu.f +++ b/BLAS/SRC/zdotu.f @@ -67,7 +67,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex16_blas_level1 +*> \ingroup dot * *> \par Further Details: * ===================== @@ -80,6 +80,7 @@ *> * ===================================================================== COMPLEX*16 FUNCTION ZDOTU(N,ZX,INCX,ZY,INCY) + IMPLICIT NONE * * -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/zdrot.f b/BLAS/SRC/zdrot.f index 3145561d67..6c4c2f6fe6 100644 --- a/BLAS/SRC/zdrot.f +++ b/BLAS/SRC/zdrot.f @@ -91,10 +91,11 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex16_blas_level1 +*> \ingroup rot * * ===================================================================== SUBROUTINE ZDROT( N, ZX, INCX, ZY, INCY, C, S ) + IMPLICIT NONE * * -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/zdscal.f b/BLAS/SRC/zdscal.f index b3546ba206..14a6e98c40 100644 --- a/BLAS/SRC/zdscal.f +++ b/BLAS/SRC/zdscal.f @@ -61,7 +61,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex16_blas_level1 +*> \ingroup scal * *> \par Further Details: * ===================== @@ -75,6 +75,7 @@ *> * ===================================================================== SUBROUTINE ZDSCAL(N,DA,ZX,INCX) + IMPLICIT NONE * * -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -92,17 +93,20 @@ SUBROUTINE ZDSCAL(N,DA,ZX,INCX) * * .. Local Scalars .. INTEGER I,NINCX +* .. Parameters .. + DOUBLE PRECISION ONE + PARAMETER (ONE=1.0D+0) * .. * .. Intrinsic Functions .. - INTRINSIC DCMPLX + INTRINSIC DBLE, DCMPLX, DIMAG * .. - IF (N.LE.0 .OR. INCX.LE.0) RETURN + IF (N.LE.0 .OR. INCX.LE.0 .OR. DA.EQ.ONE) RETURN IF (INCX.EQ.1) THEN * * code for increment equal to 1 * DO I = 1,N - ZX(I) = DCMPLX(DA,0.0d0)*ZX(I) + ZX(I) = DCMPLX(DA*DBLE(ZX(I)),DA*DIMAG(ZX(I))) END DO ELSE * @@ -110,7 +114,7 @@ SUBROUTINE ZDSCAL(N,DA,ZX,INCX) * NINCX = N*INCX DO I = 1,NINCX,INCX - ZX(I) = DCMPLX(DA,0.0d0)*ZX(I) + ZX(I) = DCMPLX(DA*DBLE(ZX(I)),DA*DIMAG(ZX(I))) END DO END IF RETURN diff --git a/BLAS/SRC/zgbmv.f b/BLAS/SRC/zgbmv.f index 0bca54eb9e..bb162da970 100644 --- a/BLAS/SRC/zgbmv.f +++ b/BLAS/SRC/zgbmv.f @@ -148,6 +148,8 @@ *> ( 1 + ( n - 1 )*abs( INCY ) ) otherwise. *> Before entry, the incremented array Y must contain the *> vector y. On exit, Y is overwritten by the updated vector y. +*> If either m or n is zero, then Y not referenced and the function +*> performs a quick return. *> \endverbatim *> *> \param[in] INCY @@ -165,7 +167,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex16_blas_level2 +*> \ingroup gbmv * *> \par Further Details: * ===================== @@ -183,7 +185,9 @@ *> \endverbatim *> * ===================================================================== - SUBROUTINE ZGBMV(TRANS,M,N,KL,KU,ALPHA,A,LDA,X,INCX,BETA,Y,INCY) + SUBROUTINE ZGBMV(TRANS,M,N,KL,KU,ALPHA,A,LDA,X,INCX, + + BETA,Y,INCY) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/zgemm.f b/BLAS/SRC/zgemm.f index 0b712f1b73..de8b2f2c4d 100644 --- a/BLAS/SRC/zgemm.f +++ b/BLAS/SRC/zgemm.f @@ -35,6 +35,16 @@ *> *> alpha and beta are scalars, and A, B and C are matrices, with op( A ) *> an m by k matrix, op( B ) a k by n matrix and C an m by n matrix. +*> +*> Note: if alpha and/or beta is zero, some parts of the matrix-matrix +*> operations are not performed. This results in the following NaN/Inf +*> propagation quirks: +*> +*> 1. If alpha is zero, NaNs or Infs in A or B do not affect the result. +*> 2. If both alpha and beta are zero, then a zero matrix is returned in C, +*> irrespective of any NaNs or Infs in A, B or C. +*> 3. If only beta is zero, alpha*op( A )*op( B ) is returned, irrespective +*> of any NaNs or Infs in C. *> \endverbatim * * Arguments: @@ -92,7 +102,9 @@ *> \param[in] ALPHA *> \verbatim *> ALPHA is COMPLEX*16 -*> On entry, ALPHA specifies the scalar alpha. +*> On entry, ALPHA specifies the scalar alpha. If ALPHA is zero the +*> values in A and B do not affect the result. This also means that +*> NaN/Inf propagation from A and B is inhibited if ALPHA is zero. *> \endverbatim *> *> \param[in] A @@ -102,7 +114,10 @@ *> Before entry with TRANSA = 'N' or 'n', the leading m by k *> part of the array A must contain the matrix A, otherwise *> the leading k by m part of the array A must contain the -*> matrix A. +*> matrix A, except if ALPHA is zero. +*> If ALPHA is zero, none of the values in A affect the result, even +*> if they are NaN/Inf. This also implies that if ALPHA is zero, +*> the matrix elements of A need not be initialized by the caller. *> \endverbatim *> *> \param[in] LDA @@ -121,7 +136,10 @@ *> Before entry with TRANSB = 'N' or 'n', the leading k by n *> part of the array B must contain the matrix B, otherwise *> the leading n by k part of the array B must contain the -*> matrix B. +*> matrix B, except if ALPHA is zero. +*> If ALPHA is zero, none of the values in B affect the result, even +*> if they are NaN/Inf. This also implies that if ALPHA is zero, +*> the matrix elements of B need not be initialized by the caller. *> \endverbatim *> *> \param[in] LDB @@ -136,16 +154,19 @@ *> \param[in] BETA *> \verbatim *> BETA is COMPLEX*16 -*> On entry, BETA specifies the scalar beta. When BETA is -*> supplied as zero then C need not be set on input. +*> On entry, BETA specifies the scalar beta. If BETA is zero the +*> values in C do not affect the result. This also means that +*> NaN/Inf propagation from C is inhibited if BETA is zero. *> \endverbatim *> *> \param[in,out] C *> \verbatim *> C is COMPLEX*16 array, dimension ( LDC, N ) *> Before entry, the leading m by n part of the array C must -*> contain the matrix C, except when beta is zero, in which -*> case C need not be set on entry. +*> contain the matrix C,, except if beta is zero. +*> If beta is zero, none of the values in C affect the result, even +*> if they are NaN/Inf. This also implies that if beta is zero, +*> the matrix elements of C need not be initialized by the caller. *> On exit, the array C is overwritten by the m by n matrix *> ( alpha*op( A )*op( B ) + beta*C ). *> \endverbatim @@ -166,7 +187,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex16_blas_level3 +*> \ingroup gemm * *> \par Further Details: * ===================== @@ -183,7 +204,9 @@ *> \endverbatim *> * ===================================================================== - SUBROUTINE ZGEMM(TRANSA,TRANSB,M,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC) + SUBROUTINE ZGEMM(TRANSA,TRANSB,M,N,K,ALPHA,A,LDA,B,LDB, + + BETA,C,LDC) + IMPLICIT NONE * * -- Reference BLAS level3 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/zgemmtr.f b/BLAS/SRC/zgemmtr.f new file mode 100644 index 0000000000..01dd91c387 --- /dev/null +++ b/BLAS/SRC/zgemmtr.f @@ -0,0 +1,569 @@ +*> \brief \b ZGEMMTR +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +* Definition: +* =========== +* +* SUBROUTINE ZGEMMTR(UPLO,TRANSA,TRANSB,N,K,ALPHA,A,LDA,B,LDB,BETA, +* C,LDC) +* +* .. Scalar Arguments .. +* COMPLEX*16 ALPHA,BETA +* INTEGER K,LDA,LDB,LDC,N +* CHARACTER TRANSA,TRANSB, UPLO +* .. +* .. Array Arguments .. +* COMPLEX*16 A(LDA,*),B(LDB,*),C(LDC,*) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> ZGEMMTR performs one of the matrix-matrix operations +*> +*> C := alpha*op( A )*op( B ) + beta*C, +*> +*> where op( X ) is one of +*> +*> op( X ) = X or op( X ) = X**T, +*> +*> alpha and beta are scalars, and A, B and C are matrices, with op( A ) +*> an n by k matrix, op( B ) a k by n matrix and C an n by n matrix. +*> Thereby, the routine only accesses and updates the upper or lower +*> triangular part of the result matrix C. This behaviour can be used if +*> the resulting matrix C is known to be Hermitian or symmetric. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] UPLO +*> \verbatim +*> UPLO is CHARACTER*1 +*> On entry, UPLO specifies whether the lower or the upper +*> triangular part of C is access and updated. +*> +*> UPLO = 'L' or 'l', the lower triangular part of C is used. +*> +*> UPLO = 'U' or 'u', the upper triangular part of C is used. +*> \endverbatim +* +*> \param[in] TRANSA +*> \verbatim +*> TRANSA is CHARACTER*1 +*> On entry, TRANSA specifies the form of op( A ) to be used in +*> the matrix multiplication as follows: +*> +*> TRANSA = 'N' or 'n', op( A ) = A. +*> +*> TRANSA = 'T' or 't', op( A ) = A**T. +*> +*> TRANSA = 'C' or 'c', op( A ) = A**H. +*> \endverbatim +*> +*> \param[in] TRANSB +*> \verbatim +*> TRANSB is CHARACTER*1 +*> On entry, TRANSB specifies the form of op( B ) to be used in +*> the matrix multiplication as follows: +*> +*> TRANSB = 'N' or 'n', op( B ) = B. +*> +*> TRANSB = 'T' or 't', op( B ) = B**T. +*> +*> TRANSB = 'C' or 'c', op( B ) = B**H. +*> \endverbatim +*> +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> On entry, N specifies the number of rows and columns of +*> the matrix C, the number of columns of op(B) and the number +*> of rows of op(A). N must be at least zero. +*> \endverbatim +*> +*> \param[in] K +*> \verbatim +*> K is INTEGER +*> On entry, K specifies the number of columns of the matrix +*> op( A ) and the number of rows of the matrix op( B ). K must +*> be at least zero. +*> \endverbatim +*> +*> \param[in] ALPHA +*> \verbatim +*> ALPHA is COMPLEX*16. +*> On entry, ALPHA specifies the scalar alpha. +*> \endverbatim +*> +*> \param[in] A +*> \verbatim +*> A is COMPLEX*16 array, dimension ( LDA, ka ), where ka is +*> k when TRANSA = 'N' or 'n', and is n otherwise. +*> Before entry with TRANSA = 'N' or 'n', the leading n by k +*> part of the array A must contain the matrix A, otherwise +*> the leading k by m part of the array A must contain the +*> matrix A. +*> \endverbatim +*> +*> \param[in] LDA +*> \verbatim +*> LDA is INTEGER +*> On entry, LDA specifies the first dimension of A as declared +*> in the calling (sub) program. When TRANSA = 'N' or 'n' then +*> LDA must be at least max( 1, n ), otherwise LDA must be at +*> least max( 1, k ). +*> \endverbatim +*> +*> \param[in] B +*> \verbatim +*> B is COMPLEX*16 array, dimension ( LDB, kb ), where kb is +*> n when TRANSB = 'N' or 'n', and is k otherwise. +*> Before entry with TRANSB = 'N' or 'n', the leading k by n +*> part of the array B must contain the matrix B, otherwise +*> the leading n by k part of the array B must contain the +*> matrix B. +*> \endverbatim +*> +*> \param[in] LDB +*> \verbatim +*> LDB is INTEGER +*> On entry, LDB specifies the first dimension of B as declared +*> in the calling (sub) program. When TRANSB = 'N' or 'n' then +*> LDB must be at least max( 1, k ), otherwise LDB must be at +*> least max( 1, n ). +*> \endverbatim +*> +*> \param[in] BETA +*> \verbatim +*> BETA is COMPLEX*16. +*> On entry, BETA specifies the scalar beta. When BETA is +*> supplied as zero then C need not be set on input. +*> \endverbatim +*> +*> \param[in,out] C +*> \verbatim +*> C is COMPLEX*16 array, dimension ( LDC, N ) +*> Before entry, the leading n by n part of the array C must +*> contain the matrix C, except when beta is zero, in which +*> case C need not be set on entry. +*> On exit, the upper or lower triangular part of the matrix +*> C is overwritten by the n by n matrix +*> ( alpha*op( A )*op( B ) + beta*C ). +*> \endverbatim +*> +*> \param[in] LDC +*> \verbatim +*> LDC is INTEGER +*> On entry, LDC specifies the first dimension of C as declared +*> in the calling (sub) program. LDC must be at least +*> max( 1, n ). +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Martin Koehler +* +*> \ingroup gemmtr +* +*> \par Further Details: +* ===================== +*> +*> \verbatim +*> +*> Level 3 Blas routine. +*> +*> -- Written on 19-July-2023. +*> Martin Koehler, MPI Magdeburg +*> \endverbatim +*> +* ===================================================================== + SUBROUTINE ZGEMMTR(UPLO,TRANSA,TRANSB,N,K,ALPHA,A,LDA,B,LDB, + + BETA,C,LDC) + IMPLICIT NONE +* +* -- Reference BLAS level3 routine -- +* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* +* .. Scalar Arguments .. + COMPLEX*16 ALPHA,BETA + INTEGER K,LDA,LDB,LDC,N + CHARACTER TRANSA,TRANSB,UPLO +* .. +* .. Array Arguments .. + COMPLEX*16 A(LDA,*),B(LDB,*),C(LDC,*) +* .. +* +* ===================================================================== +* +* .. External Functions .. + LOGICAL LSAME + EXTERNAL LSAME +* .. +* .. External Subroutines .. + EXTERNAL XERBLA +* .. +* .. Intrinsic Functions .. + INTRINSIC CONJG,MAX +* .. +* .. Local Scalars .. + COMPLEX*16 TEMP + INTEGER I,INFO,J,L,NROWA,NROWB,ISTART, ISTOP + LOGICAL CONJA,CONJB,NOTA,NOTB,UPPER +* .. +* .. Parameters .. + COMPLEX*16 ONE + PARAMETER (ONE= (1.0D+0,0.0D+0)) + COMPLEX*16 ZERO + PARAMETER (ZERO= (0.0D+0,0.0D+0)) +* .. +* +* Set NOTA and NOTB as true if A and B respectively are not +* conjugated or transposed, set CONJA and CONJB as true if A and +* B respectively are to be transposed but not conjugated and set +* NROWA and NROWB as the number of rows of A and B respectively. +* + NOTA = LSAME(TRANSA,'N') + NOTB = LSAME(TRANSB,'N') + CONJA = LSAME(TRANSA,'C') + CONJB = LSAME(TRANSB,'C') + IF (NOTA) THEN + NROWA = N + ELSE + NROWA = K + END IF + IF (NOTB) THEN + NROWB = K + ELSE + NROWB = N + END IF + UPPER = LSAME(UPLO, 'U') + +* +* Test the input parameters. +* + INFO = 0 + IF ((.NOT. UPPER) .AND. (.NOT. LSAME(UPLO, 'L'))) THEN + INFO = 1 + ELSE IF ((.NOT.NOTA) .AND. (.NOT.CONJA) .AND. + + (.NOT.LSAME(TRANSA,'T'))) THEN + INFO = 2 + ELSE IF ((.NOT.NOTB) .AND. (.NOT.CONJB) .AND. + + (.NOT.LSAME(TRANSB,'T'))) THEN + INFO = 3 + ELSE IF (N.LT.0) THEN + INFO = 4 + ELSE IF (K.LT.0) THEN + INFO = 5 + ELSE IF (LDA.LT.MAX(1,NROWA)) THEN + INFO = 8 + ELSE IF (LDB.LT.MAX(1,NROWB)) THEN + INFO = 10 + ELSE IF (LDC.LT.MAX(1,N)) THEN + INFO = 13 + END IF + IF (INFO.NE.0) THEN + CALL XERBLA('ZGEMMTR',INFO) + RETURN + END IF +* +* Quick return if possible. +* + IF (N.EQ.0) RETURN +* +* And when alpha.eq.zero. +* + IF (ALPHA.EQ.ZERO) THEN + IF (BETA.EQ.ZERO) THEN + DO 20 J = 1,N + IF (UPPER) THEN + ISTART = 1 + ISTOP = J + ELSE + ISTART = J + ISTOP = N + END IF + + DO 10 I = ISTART, ISTOP + C(I,J) = ZERO + 10 CONTINUE + 20 CONTINUE + ELSE + DO 40 J = 1,N + IF (UPPER) THEN + ISTART = 1 + ISTOP = J + ELSE + ISTART = J + ISTOP = N + END IF + DO 30 I = ISTART, ISTOP + C(I,J) = BETA*C(I,J) + 30 CONTINUE + 40 CONTINUE + END IF + RETURN + END IF +* +* Start the operations. +* + IF (NOTB) THEN + IF (NOTA) THEN +* +* Form C := alpha*A*B + beta*C. +* + DO 90 J = 1,N + IF (UPPER) THEN + ISTART = 1 + ISTOP = J + ELSE + ISTART = J + ISTOP = N + END IF + IF (BETA.EQ.ZERO) THEN + DO 50 I = ISTART, ISTOP + C(I,J) = ZERO + 50 CONTINUE + ELSE IF (BETA.NE.ONE) THEN + DO 60 I = ISTART, ISTOP + C(I,J) = BETA*C(I,J) + 60 CONTINUE + END IF + DO 80 L = 1,K + TEMP = ALPHA*B(L,J) + DO 70 I = ISTART, ISTOP + C(I,J) = C(I,J) + TEMP*A(I,L) + 70 CONTINUE + 80 CONTINUE + 90 CONTINUE + ELSE IF (CONJA) THEN +* +* Form C := alpha*A**H*B + beta*C. +* + DO 120 J = 1,N + IF (UPPER) THEN + ISTART = 1 + ISTOP = J + ELSE + ISTART = J + ISTOP = N + END IF + + DO 110 I = ISTART, ISTOP + TEMP = ZERO + DO 100 L = 1,K + TEMP = TEMP + CONJG(A(L,I))*B(L,J) + 100 CONTINUE + IF (BETA.EQ.ZERO) THEN + C(I,J) = ALPHA*TEMP + ELSE + C(I,J) = ALPHA*TEMP + BETA*C(I,J) + END IF + 110 CONTINUE + 120 CONTINUE + ELSE +* +* Form C := alpha*A**T*B + beta*C +* + DO 150 J = 1,N + IF (UPPER) THEN + ISTART = 1 + ISTOP = J + ELSE + ISTART = J + ISTOP = N + END IF + + DO 140 I = ISTART, ISTOP + TEMP = ZERO + DO 130 L = 1,K + TEMP = TEMP + A(L,I)*B(L,J) + 130 CONTINUE + IF (BETA.EQ.ZERO) THEN + C(I,J) = ALPHA*TEMP + ELSE + C(I,J) = ALPHA*TEMP + BETA*C(I,J) + END IF + 140 CONTINUE + 150 CONTINUE + END IF + ELSE IF (NOTA) THEN + IF (CONJB) THEN +* +* Form C := alpha*A*B**H + beta*C. +* + DO 200 J = 1,N + IF (UPPER) THEN + ISTART = 1 + ISTOP = J + ELSE + ISTART = J + ISTOP = N + END IF + + IF (BETA.EQ.ZERO) THEN + DO 160 I = ISTART,ISTOP + C(I,J) = ZERO + 160 CONTINUE + ELSE IF (BETA.NE.ONE) THEN + DO 170 I = ISTART, ISTOP + C(I,J) = BETA*C(I,J) + 170 CONTINUE + END IF + DO 190 L = 1,K + TEMP = ALPHA*CONJG(B(J,L)) + DO 180 I = ISTART, ISTOP + C(I,J) = C(I,J) + TEMP*A(I,L) + 180 CONTINUE + 190 CONTINUE + 200 CONTINUE + ELSE +* +* Form C := alpha*A*B**T + beta*C +* + DO 250 J = 1,N + IF (UPPER) THEN + ISTART = 1 + ISTOP = J + ELSE + ISTART = J + ISTOP = N + END IF + + IF (BETA.EQ.ZERO) THEN + DO 210 I = ISTART, ISTOP + C(I,J) = ZERO + 210 CONTINUE + ELSE IF (BETA.NE.ONE) THEN + DO 220 I = ISTART, ISTOP + C(I,J) = BETA*C(I,J) + 220 CONTINUE + END IF + DO 240 L = 1,K + TEMP = ALPHA*B(J,L) + DO 230 I = ISTART, ISTOP + C(I,J) = C(I,J) + TEMP*A(I,L) + 230 CONTINUE + 240 CONTINUE + 250 CONTINUE + END IF + ELSE IF (CONJA) THEN + IF (CONJB) THEN +* +* Form C := alpha*A**H*B**H + beta*C. +* + DO 280 J = 1,N + IF (UPPER) THEN + ISTART = 1 + ISTOP = J + ELSE + ISTART = J + ISTOP = N + END IF + + DO 270 I = ISTART, ISTOP + TEMP = ZERO + DO 260 L = 1,K + TEMP = TEMP + CONJG(A(L,I))*CONJG(B(J,L)) + 260 CONTINUE + IF (BETA.EQ.ZERO) THEN + C(I,J) = ALPHA*TEMP + ELSE + C(I,J) = ALPHA*TEMP + BETA*C(I,J) + END IF + 270 CONTINUE + 280 CONTINUE + ELSE +* +* Form C := alpha*A**H*B**T + beta*C +* + DO 310 J = 1,N + IF (UPPER) THEN + ISTART = 1 + ISTOP = J + ELSE + ISTART = J + ISTOP = N + END IF + + DO 300 I = ISTART, ISTOP + TEMP = ZERO + DO 290 L = 1,K + TEMP = TEMP + CONJG(A(L,I))*B(J,L) + 290 CONTINUE + IF (BETA.EQ.ZERO) THEN + C(I,J) = ALPHA*TEMP + ELSE + C(I,J) = ALPHA*TEMP + BETA*C(I,J) + END IF + 300 CONTINUE + 310 CONTINUE + END IF + ELSE + IF (CONJB) THEN +* +* Form C := alpha*A**T*B**H + beta*C +* + DO 340 J = 1,N + IF (UPPER) THEN + ISTART = 1 + ISTOP = J + ELSE + ISTART = J + ISTOP = N + END IF + + DO 330 I = ISTART, ISTOP + TEMP = ZERO + DO 320 L = 1,K + TEMP = TEMP + A(L,I)*CONJG(B(J,L)) + 320 CONTINUE + IF (BETA.EQ.ZERO) THEN + C(I,J) = ALPHA*TEMP + ELSE + C(I,J) = ALPHA*TEMP + BETA*C(I,J) + END IF + 330 CONTINUE + 340 CONTINUE + ELSE +* +* Form C := alpha*A**T*B**T + beta*C +* + DO 370 J = 1,N + IF (UPPER) THEN + ISTART = 1 + ISTOP = J + ELSE + ISTART = J + ISTOP = N + END IF + + DO 360 I = ISTART, ISTOP + TEMP = ZERO + DO 350 L = 1,K + TEMP = TEMP + A(L,I)*B(J,L) + 350 CONTINUE + IF (BETA.EQ.ZERO) THEN + C(I,J) = ALPHA*TEMP + ELSE + C(I,J) = ALPHA*TEMP + BETA*C(I,J) + END IF + 360 CONTINUE + 370 CONTINUE + END IF + END IF +* + RETURN +* +* End of ZGEMMTR +* + END diff --git a/BLAS/SRC/zgemv.f b/BLAS/SRC/zgemv.f index 2664454b94..4d41239193 100644 --- a/BLAS/SRC/zgemv.f +++ b/BLAS/SRC/zgemv.f @@ -119,6 +119,8 @@ *> Before entry with BETA non-zero, the incremented array Y *> must contain the vector y. On exit, Y is overwritten by the *> updated vector y. +*> If either m or n is zero, then Y not referenced and the function +*> performs a quick return. *> \endverbatim *> *> \param[in] INCY @@ -136,7 +138,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex16_blas_level2 +*> \ingroup gemv * *> \par Further Details: * ===================== @@ -155,6 +157,7 @@ *> * ===================================================================== SUBROUTINE ZGEMV(TRANS,M,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/zgerc.f b/BLAS/SRC/zgerc.f index 2eb4349367..a5f1cfd280 100644 --- a/BLAS/SRC/zgerc.f +++ b/BLAS/SRC/zgerc.f @@ -109,7 +109,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex16_blas_level2 +*> \ingroup ger * *> \par Further Details: * ===================== @@ -127,6 +127,7 @@ *> * ===================================================================== SUBROUTINE ZGERC(M,N,ALPHA,X,INCX,Y,INCY,A,LDA) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/zgeru.f b/BLAS/SRC/zgeru.f index e1cd2dcd19..601eee645a 100644 --- a/BLAS/SRC/zgeru.f +++ b/BLAS/SRC/zgeru.f @@ -109,7 +109,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex16_blas_level2 +*> \ingroup ger * *> \par Further Details: * ===================== @@ -127,6 +127,7 @@ *> * ===================================================================== SUBROUTINE ZGERU(M,N,ALPHA,X,INCX,Y,INCY,A,LDA) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/zhbmv.f b/BLAS/SRC/zhbmv.f index 6f8026c693..c760e35abd 100644 --- a/BLAS/SRC/zhbmv.f +++ b/BLAS/SRC/zhbmv.f @@ -165,7 +165,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex16_blas_level2 +*> \ingroup hbmv * *> \par Further Details: * ===================== @@ -184,6 +184,7 @@ *> * ===================================================================== SUBROUTINE ZHBMV(UPLO,N,K,ALPHA,A,LDA,X,INCX,BETA,Y,INCY) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/zhemm.f b/BLAS/SRC/zhemm.f index 9ebbab2c77..abc36e5d56 100644 --- a/BLAS/SRC/zhemm.f +++ b/BLAS/SRC/zhemm.f @@ -170,7 +170,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex16_blas_level3 +*> \ingroup hemm * *> \par Further Details: * ===================== @@ -188,6 +188,7 @@ *> * ===================================================================== SUBROUTINE ZHEMM(SIDE,UPLO,M,N,ALPHA,A,LDA,B,LDB,BETA,C,LDC) + IMPLICIT NONE * * -- Reference BLAS level3 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -238,9 +239,11 @@ SUBROUTINE ZHEMM(SIDE,UPLO,M,N,ALPHA,A,LDA,B,LDB,BETA,C,LDC) * Test the input parameters. * INFO = 0 - IF ((.NOT.LSAME(SIDE,'L')) .AND. (.NOT.LSAME(SIDE,'R'))) THEN + IF ((.NOT.LSAME(SIDE,'L')) .AND. + + (.NOT.LSAME(SIDE,'R'))) THEN INFO = 1 - ELSE IF ((.NOT.UPPER) .AND. (.NOT.LSAME(UPLO,'L'))) THEN + ELSE IF ((.NOT.UPPER) .AND. + + (.NOT.LSAME(UPLO,'L'))) THEN INFO = 2 ELSE IF (M.LT.0) THEN INFO = 3 diff --git a/BLAS/SRC/zhemv.f b/BLAS/SRC/zhemv.f index dad68bf25b..390d002056 100644 --- a/BLAS/SRC/zhemv.f +++ b/BLAS/SRC/zhemv.f @@ -132,7 +132,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex16_blas_level2 +*> \ingroup hemv * *> \par Further Details: * ===================== @@ -151,6 +151,7 @@ *> * ===================================================================== SUBROUTINE ZHEMV(UPLO,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/zher.f b/BLAS/SRC/zher.f index 59227305f8..c572daa8b1 100644 --- a/BLAS/SRC/zher.f +++ b/BLAS/SRC/zher.f @@ -114,7 +114,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex16_blas_level2 +*> \ingroup her * *> \par Further Details: * ===================== @@ -132,6 +132,7 @@ *> * ===================================================================== SUBROUTINE ZHER(UPLO,N,ALPHA,X,INCX,A,LDA) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/zher2.f b/BLAS/SRC/zher2.f index d1f2b57ec4..6d59b00bef 100644 --- a/BLAS/SRC/zher2.f +++ b/BLAS/SRC/zher2.f @@ -129,7 +129,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex16_blas_level2 +*> \ingroup her2 * *> \par Further Details: * ===================== @@ -147,6 +147,7 @@ *> * ===================================================================== SUBROUTINE ZHER2(UPLO,N,ALPHA,X,INCX,Y,INCY,A,LDA) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/zher2k.f b/BLAS/SRC/zher2k.f index 5c75083cd5..6000487f8d 100644 --- a/BLAS/SRC/zher2k.f +++ b/BLAS/SRC/zher2k.f @@ -174,7 +174,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex16_blas_level3 +*> \ingroup her2k * *> \par Further Details: * ===================== @@ -195,6 +195,7 @@ *> * ===================================================================== SUBROUTINE ZHER2K(UPLO,TRANS,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC) + IMPLICIT NONE * * -- Reference BLAS level3 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/zherk.f b/BLAS/SRC/zherk.f index e39a3fce36..1ee4bd61f3 100644 --- a/BLAS/SRC/zherk.f +++ b/BLAS/SRC/zherk.f @@ -149,7 +149,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex16_blas_level3 +*> \ingroup herk * *> \par Further Details: * ===================== @@ -170,6 +170,7 @@ *> * ===================================================================== SUBROUTINE ZHERK(UPLO,TRANS,N,K,ALPHA,A,LDA,BETA,C,LDC) + IMPLICIT NONE * * -- Reference BLAS level3 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -352,7 +353,7 @@ SUBROUTINE ZHERK(UPLO,TRANS,N,K,ALPHA,A,LDA,BETA,C,LDC) 200 CONTINUE RTEMP = ZERO DO 210 L = 1,K - RTEMP = RTEMP + DCONJG(A(L,J))*A(L,J) + RTEMP = RTEMP + DBLE(DCONJG(A(L,J))*A(L,J)) 210 CONTINUE IF (BETA.EQ.ZERO) THEN C(J,J) = ALPHA*RTEMP @@ -364,7 +365,7 @@ SUBROUTINE ZHERK(UPLO,TRANS,N,K,ALPHA,A,LDA,BETA,C,LDC) DO 260 J = 1,N RTEMP = ZERO DO 230 L = 1,K - RTEMP = RTEMP + DCONJG(A(L,J))*A(L,J) + RTEMP = RTEMP + DBLE(DCONJG(A(L,J))*A(L,J)) 230 CONTINUE IF (BETA.EQ.ZERO) THEN C(J,J) = ALPHA*RTEMP diff --git a/BLAS/SRC/zhpmv.f b/BLAS/SRC/zhpmv.f index c1a2fa006c..9e4d455b2f 100644 --- a/BLAS/SRC/zhpmv.f +++ b/BLAS/SRC/zhpmv.f @@ -127,7 +127,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex16_blas_level2 +*> \ingroup hpmv * *> \par Further Details: * ===================== @@ -146,6 +146,7 @@ *> * ===================================================================== SUBROUTINE ZHPMV(UPLO,N,ALPHA,AP,X,INCX,BETA,Y,INCY) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/zhpr.f b/BLAS/SRC/zhpr.f index 2ba5774a21..2a8a9249b8 100644 --- a/BLAS/SRC/zhpr.f +++ b/BLAS/SRC/zhpr.f @@ -109,7 +109,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex16_blas_level2 +*> \ingroup hpr * *> \par Further Details: * ===================== @@ -127,6 +127,7 @@ *> * ===================================================================== SUBROUTINE ZHPR(UPLO,N,ALPHA,X,INCX,AP) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/zhpr2.f b/BLAS/SRC/zhpr2.f index 55cfe77e30..3ab26ac690 100644 --- a/BLAS/SRC/zhpr2.f +++ b/BLAS/SRC/zhpr2.f @@ -124,7 +124,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex16_blas_level2 +*> \ingroup hpr2 * *> \par Further Details: * ===================== @@ -142,6 +142,7 @@ *> * ===================================================================== SUBROUTINE ZHPR2(UPLO,N,ALPHA,X,INCX,Y,INCY,AP) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/zrotg.f90 b/BLAS/SRC/zrotg.f90 index 288e5c7ef5..0dae53b837 100644 --- a/BLAS/SRC/zrotg.f90 +++ b/BLAS/SRC/zrotg.f90 @@ -1,38 +1,37 @@ -!> \brief \b ZROTG +!> \brief \b ZROTG generates a Givens rotation with real cosine and complex sine. ! ! =========== DOCUMENTATION =========== ! ! Online html documentation available at ! http://www.netlib.org/lapack/explore-html/ ! -! Definition: -! =========== -! -! ZROTG constructs a plane rotation -! [ c s ] [ a ] = [ r ] -! [ -conjg(s) c ] [ b ] [ 0 ] -! where c is real, s ic complex, and c**2 + conjg(s)*s = 1. -! !> \par Purpose: ! ============= !> !> \verbatim !> +!> ZROTG constructs a plane rotation +!> [ c s ] [ a ] = [ r ] +!> [ -conjg(s) c ] [ b ] [ 0 ] +!> where c is real, s is complex, and c**2 + conjg(s)*s = 1. +!> !> The computation uses the formulas !> |x| = sqrt( Re(x)**2 + Im(x)**2 ) !> sgn(x) = x / |x| if x /= 0 !> = 1 if x = 0 !> c = |a| / sqrt(|a|**2 + |b|**2) !> s = sgn(a) * conjg(b) / sqrt(|a|**2 + |b|**2) -!> When a and b are real and r /= 0, the formulas simplify to !> r = sgn(a)*sqrt(|a|**2 + |b|**2) +!> When a and b are real and r /= 0, the formulas simplify to !> c = a / r !> s = b / r -!> the same as in ZROTG when |a| > |b|. When |b| >= |a|, the -!> sign of c and s will be different from those computed by ZROTG +!> the same as in DROTG when |a| > |b|. When |b| >= |a|, the +!> sign of c and s will be different from those computed by DROTG !> if the signs of a and b are not the same. !> !> \endverbatim +!> +!> @see lartg, @see lartgp ! ! Arguments: ! ========== @@ -65,20 +64,19 @@ ! Authors: ! ======== ! -!> \author Edward Anderson, Lockheed Martin +!> \author Weslley Pereira, University of Colorado Denver, USA ! -!> \par Contributors: -! ================== -!> -!> Weslley Pereira, University of Colorado Denver, USA +!> \date December 2021 ! -!> \ingroup single_blas_level1 +!> \ingroup rotg ! !> \par Further Details: ! ===================== !> !> \verbatim !> +!> Based on the algorithm from +!> !> Anderson E. (2017) !> Algorithm 978: Safe Scaling in the Level 1 BLAS !> ACM Trans Math Softw 44:1--28 @@ -88,6 +86,7 @@ ! ! ===================================================================== subroutine ZROTG( a, b, c, s ) + implicit none integer, parameter :: wp = kind(1.d0) ! ! -- Reference BLAS level1 routine -- @@ -108,21 +107,14 @@ subroutine ZROTG( a, b, c, s ) 1-minexponent(0._wp), & maxexponent(0._wp)-1 & ) - real(wp), parameter :: rtmin = sqrt( real(radix(0._wp),wp)**max( & - minexponent(0._wp)-1, & - 1-maxexponent(0._wp) & - ) / epsilon(0._wp) ) - real(wp), parameter :: rtmax = sqrt( real(radix(0._wp),wp)**max( & - 1-minexponent(0._wp), & - maxexponent(0._wp)-1 & - ) * epsilon(0._wp) ) + real(wp), parameter :: rtmin = sqrt( safmin ) ! .. ! .. Scalar Arguments .. real(wp) :: c complex(wp) :: a, b, s ! .. ! .. Local Scalars .. - real(wp) :: d, f1, f2, g1, g2, h2, p, u, uu, v, vv, w + real(wp) :: d, f1, f2, g1, g2, h2, u, v, w, rtmax complex(wp) :: f, fs, g, gs, r, t ! .. ! .. Intrinsic Functions .. @@ -144,30 +136,43 @@ subroutine ZROTG( a, b, c, s ) r = f else if( f == czero ) then c = zero - g1 = max( abs(real(g)), abs(aimag(g)) ) - if( g1 > rtmin .and. g1 < rtmax ) then + if( real(g) == zero ) then + r = abs(aimag(g)) + s = conjg( g ) / r + elseif( aimag(g) == zero ) then + r = abs(real(g)) + s = conjg( g ) / r + else + g1 = max( abs(real(g)), abs(aimag(g)) ) + rtmax = sqrt( safmax/2 ) + if( g1 > rtmin .and. g1 < rtmax ) then ! ! Use unscaled algorithm ! - g2 = ABSSQ( g ) - d = sqrt( g2 ) - s = conjg( g ) / d - r = d - else +! The following two lines can be replaced by `d = abs( g )`. +! This algorithm do not use the intrinsic complex abs. + g2 = ABSSQ( g ) + d = sqrt( g2 ) + s = conjg( g ) / d + r = d + else ! ! Use scaled algorithm ! - u = min( safmax, max( safmin, g1 ) ) - uu = one / u - gs = g*uu - g2 = ABSSQ( gs ) - d = sqrt( g2 ) - s = conjg( gs ) / d - r = d*u + u = min( safmax, max( safmin, g1 ) ) + gs = g / u +! The following two lines can be replaced by `d = abs( gs )`. +! This algorithm do not use the intrinsic complex abs. + g2 = ABSSQ( gs ) + d = sqrt( g2 ) + s = conjg( gs ) / d + r = d*u + end if end if else f1 = max( abs(real(f)), abs(aimag(f)) ) g1 = max( abs(real(g)), abs(aimag(g)) ) + rtmax = sqrt( safmax/4 ) if( f1 > rtmin .and. f1 < rtmax .and. & g1 > rtmin .and. g1 < rtmax ) then ! @@ -176,32 +181,51 @@ subroutine ZROTG( a, b, c, s ) f2 = ABSSQ( f ) g2 = ABSSQ( g ) h2 = f2 + g2 - if( f2 > rtmin .and. h2 < rtmax ) then - d = sqrt( f2*h2 ) + ! safmin <= f2 <= h2 <= safmax + if( f2 >= h2 * safmin ) then + ! safmin <= f2/h2 <= 1, and h2/f2 is finite + c = sqrt( f2 / h2 ) + r = f / c + rtmax = rtmax * 2 + if( f2 > rtmin .and. h2 < rtmax ) then + ! safmin <= sqrt( f2*h2 ) <= safmax + s = conjg( g ) * ( f / sqrt( f2*h2 ) ) + else + s = conjg( g ) * ( r / h2 ) + end if else - d = sqrt( f2 )*sqrt( h2 ) + ! f2/h2 <= safmin may be subnormal, and h2/f2 may overflow. + ! Moreover, + ! safmin <= f2*f2 * safmax < f2 * h2 < h2*h2 * safmin <= safmax, + ! sqrt(safmin) <= sqrt(f2 * h2) <= sqrt(safmax). + ! Also, + ! g2 >> f2, which means that h2 = g2. + d = sqrt( f2 * h2 ) + c = f2 / d + if( c >= safmin ) then + r = f / c + else + ! f2 / sqrt(f2 * h2) < safmin, then + ! sqrt(safmin) <= f2 * sqrt(safmax) <= h2 / sqrt(f2 * h2) <= h2 * (safmin / f2) <= h2 <= safmax + r = f * ( h2 / d ) + end if + s = conjg( g ) * ( f / d ) end if - p = 1 / d - c = f2*p - s = conjg( g )*( f*p ) - r = f*( h2*p ) else ! ! Use scaled algorithm ! u = min( safmax, max( safmin, f1, g1 ) ) - uu = one / u - gs = g*uu + gs = g / u g2 = ABSSQ( gs ) - if( f1*uu < rtmin ) then + if( f1 / u < rtmin ) then ! ! f is not well-scaled when scaled by g1. ! Use a different scaling for f. ! v = min( safmax, max( safmin, f1 ) ) - vv = one / v - w = v * uu - fs = f*vv + w = v / u + fs = f / v f2 = ABSSQ( fs ) h2 = f2*w**2 + g2 else @@ -209,19 +233,43 @@ subroutine ZROTG( a, b, c, s ) ! Otherwise use the same scaling for f and g. ! w = one - fs = f*uu + fs = f / u f2 = ABSSQ( fs ) h2 = f2 + g2 end if - if( f2 > rtmin .and. h2 < rtmax ) then - d = sqrt( f2*h2 ) + ! safmin <= f2 <= h2 <= safmax + if( f2 >= h2 * safmin ) then + ! safmin <= f2/h2 <= 1, and h2/f2 is finite + c = sqrt( f2 / h2 ) + r = fs / c + rtmax = rtmax * 2 + if( f2 > rtmin .and. h2 < rtmax ) then + ! safmin <= sqrt( f2*h2 ) <= safmax + s = conjg( gs ) * ( fs / sqrt( f2*h2 ) ) + else + s = conjg( gs ) * ( r / h2 ) + end if else - d = sqrt( f2 )*sqrt( h2 ) + ! f2/h2 <= safmin may be subnormal, and h2/f2 may overflow. + ! Moreover, + ! safmin <= f2*f2 * safmax < f2 * h2 < h2*h2 * safmin <= safmax, + ! sqrt(safmin) <= sqrt(f2 * h2) <= sqrt(safmax). + ! Also, + ! g2 >> f2, which means that h2 = g2. + d = sqrt( f2 * h2 ) + c = f2 / d + if( c >= safmin ) then + r = fs / c + else + ! f2 / sqrt(f2 * h2) < safmin, then + ! sqrt(safmin) <= f2 * sqrt(safmax) <= h2 / sqrt(f2 * h2) <= h2 * (safmin / f2) <= h2 <= safmax + r = fs * ( h2 / d ) + end if + s = conjg( gs ) * ( fs / d ) end if - p = 1 / d - c = ( f2*p )*w - s = conjg( gs )*( fs*p ) - r = ( fs*( h2*p ) )*u + ! Rescale c and r + c = c * w + r = r * u end if end if a = r diff --git a/BLAS/SRC/zscal.f b/BLAS/SRC/zscal.f index 8085f5a399..29db3b1f92 100644 --- a/BLAS/SRC/zscal.f +++ b/BLAS/SRC/zscal.f @@ -61,7 +61,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex16_blas_level1 +*> \ingroup scal * *> \par Further Details: * ===================== @@ -75,6 +75,7 @@ *> * ===================================================================== SUBROUTINE ZSCAL(N,ZA,ZX,INCX) + IMPLICIT NONE * * -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -93,7 +94,11 @@ SUBROUTINE ZSCAL(N,ZA,ZX,INCX) * .. Local Scalars .. INTEGER I,NINCX * .. - IF (N.LE.0 .OR. INCX.LE.0) RETURN +* .. Parameters .. + COMPLEX*16 ONE + PARAMETER (ONE= (1.0D+0,0.0D+0)) +* .. + IF (N.LE.0 .OR. INCX.LE.0 .OR. ZA.EQ.ONE) RETURN IF (INCX.EQ.1) THEN * * code for increment equal to 1 diff --git a/BLAS/SRC/zswap.f b/BLAS/SRC/zswap.f index 93f8fc52d0..a13bfffc80 100644 --- a/BLAS/SRC/zswap.f +++ b/BLAS/SRC/zswap.f @@ -65,7 +65,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex16_blas_level1 +*> \ingroup swap * *> \par Further Details: * ===================== @@ -78,6 +78,7 @@ *> * ===================================================================== SUBROUTINE ZSWAP(N,ZX,INCX,ZY,INCY) + IMPLICIT NONE * * -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/zsymm.f b/BLAS/SRC/zsymm.f index 3ec8a8db7a..6990fed816 100644 --- a/BLAS/SRC/zsymm.f +++ b/BLAS/SRC/zsymm.f @@ -168,7 +168,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex16_blas_level3 +*> \ingroup hemm * *> \par Further Details: * ===================== @@ -186,6 +186,7 @@ *> * ===================================================================== SUBROUTINE ZSYMM(SIDE,UPLO,M,N,ALPHA,A,LDA,B,LDB,BETA,C,LDC) + IMPLICIT NONE * * -- Reference BLAS level3 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -236,9 +237,11 @@ SUBROUTINE ZSYMM(SIDE,UPLO,M,N,ALPHA,A,LDA,B,LDB,BETA,C,LDC) * Test the input parameters. * INFO = 0 - IF ((.NOT.LSAME(SIDE,'L')) .AND. (.NOT.LSAME(SIDE,'R'))) THEN + IF ((.NOT.LSAME(SIDE,'L')) .AND. + + (.NOT.LSAME(SIDE,'R'))) THEN INFO = 1 - ELSE IF ((.NOT.UPPER) .AND. (.NOT.LSAME(UPLO,'L'))) THEN + ELSE IF ((.NOT.UPPER) .AND. + + (.NOT.LSAME(UPLO,'L'))) THEN INFO = 2 ELSE IF (M.LT.0) THEN INFO = 3 diff --git a/BLAS/SRC/zsyr2k.f b/BLAS/SRC/zsyr2k.f index e0f89bb584..3c0aab1432 100644 --- a/BLAS/SRC/zsyr2k.f +++ b/BLAS/SRC/zsyr2k.f @@ -167,7 +167,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex16_blas_level3 +*> \ingroup her2k * *> \par Further Details: * ===================== @@ -185,6 +185,7 @@ *> * ===================================================================== SUBROUTINE ZSYR2K(UPLO,TRANS,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC) + IMPLICIT NONE * * -- Reference BLAS level3 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/zsyrk.f b/BLAS/SRC/zsyrk.f index 143a5e235a..7589727406 100644 --- a/BLAS/SRC/zsyrk.f +++ b/BLAS/SRC/zsyrk.f @@ -146,7 +146,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex16_blas_level3 +*> \ingroup herk * *> \par Further Details: * ===================== @@ -164,6 +164,7 @@ *> * ===================================================================== SUBROUTINE ZSYRK(UPLO,TRANS,N,K,ALPHA,A,LDA,BETA,C,LDC) + IMPLICIT NONE * * -- Reference BLAS level3 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- diff --git a/BLAS/SRC/ztbmv.f b/BLAS/SRC/ztbmv.f index 6be39d04e1..eb4e1a7c17 100644 --- a/BLAS/SRC/ztbmv.f +++ b/BLAS/SRC/ztbmv.f @@ -164,7 +164,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex16_blas_level2 +*> \ingroup tbmv * *> \par Further Details: * ===================== @@ -183,6 +183,7 @@ *> * ===================================================================== SUBROUTINE ZTBMV(UPLO,TRANS,DIAG,N,K,A,LDA,X,INCX) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -223,10 +224,12 @@ SUBROUTINE ZTBMV(UPLO,TRANS,DIAG,N,K,A,LDA,X,INCX) INFO = 0 IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN INFO = 1 - ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND. + ELSE IF (.NOT.LSAME(TRANS,'N') .AND. + + .NOT.LSAME(TRANS,'T') .AND. + .NOT.LSAME(TRANS,'C')) THEN INFO = 2 - ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN + ELSE IF (.NOT.LSAME(DIAG,'U') .AND. + + .NOT.LSAME(DIAG,'N')) THEN INFO = 3 ELSE IF (N.LT.0) THEN INFO = 4 diff --git a/BLAS/SRC/ztbsv.f b/BLAS/SRC/ztbsv.f index 41b540774a..7275df32b5 100644 --- a/BLAS/SRC/ztbsv.f +++ b/BLAS/SRC/ztbsv.f @@ -168,7 +168,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex16_blas_level2 +*> \ingroup tbsv * *> \par Further Details: * ===================== @@ -186,6 +186,7 @@ *> * ===================================================================== SUBROUTINE ZTBSV(UPLO,TRANS,DIAG,N,K,A,LDA,X,INCX) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -226,10 +227,12 @@ SUBROUTINE ZTBSV(UPLO,TRANS,DIAG,N,K,A,LDA,X,INCX) INFO = 0 IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN INFO = 1 - ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND. + ELSE IF (.NOT.LSAME(TRANS,'N') .AND. + + .NOT.LSAME(TRANS,'T') .AND. + .NOT.LSAME(TRANS,'C')) THEN INFO = 2 - ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN + ELSE IF (.NOT.LSAME(DIAG,'U') .AND. + + .NOT.LSAME(DIAG,'N')) THEN INFO = 3 ELSE IF (N.LT.0) THEN INFO = 4 diff --git a/BLAS/SRC/ztpmv.f b/BLAS/SRC/ztpmv.f index 363fd5a2ac..433ee5ebae 100644 --- a/BLAS/SRC/ztpmv.f +++ b/BLAS/SRC/ztpmv.f @@ -120,7 +120,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex16_blas_level2 +*> \ingroup tpmv * *> \par Further Details: * ===================== @@ -139,6 +139,7 @@ *> * ===================================================================== SUBROUTINE ZTPMV(UPLO,TRANS,DIAG,N,AP,X,INCX) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -179,10 +180,12 @@ SUBROUTINE ZTPMV(UPLO,TRANS,DIAG,N,AP,X,INCX) INFO = 0 IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN INFO = 1 - ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND. + ELSE IF (.NOT.LSAME(TRANS,'N') .AND. + + .NOT.LSAME(TRANS,'T') .AND. + .NOT.LSAME(TRANS,'C')) THEN INFO = 2 - ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN + ELSE IF (.NOT.LSAME(DIAG,'U') .AND. + + .NOT.LSAME(DIAG,'N')) THEN INFO = 3 ELSE IF (N.LT.0) THEN INFO = 4 diff --git a/BLAS/SRC/ztpsv.f b/BLAS/SRC/ztpsv.f index c6f24d0b27..de9ce14d55 100644 --- a/BLAS/SRC/ztpsv.f +++ b/BLAS/SRC/ztpsv.f @@ -123,7 +123,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex16_blas_level2 +*> \ingroup tpsv * *> \par Further Details: * ===================== @@ -141,6 +141,7 @@ *> * ===================================================================== SUBROUTINE ZTPSV(UPLO,TRANS,DIAG,N,AP,X,INCX) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -181,10 +182,12 @@ SUBROUTINE ZTPSV(UPLO,TRANS,DIAG,N,AP,X,INCX) INFO = 0 IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN INFO = 1 - ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND. + ELSE IF (.NOT.LSAME(TRANS,'N') .AND. + + .NOT.LSAME(TRANS,'T') .AND. + .NOT.LSAME(TRANS,'C')) THEN INFO = 2 - ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN + ELSE IF (.NOT.LSAME(DIAG,'U') .AND. + + .NOT.LSAME(DIAG,'N')) THEN INFO = 3 ELSE IF (N.LT.0) THEN INFO = 4 diff --git a/BLAS/SRC/ztrmm.f b/BLAS/SRC/ztrmm.f index c59c367cee..b158403211 100644 --- a/BLAS/SRC/ztrmm.f +++ b/BLAS/SRC/ztrmm.f @@ -156,7 +156,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex16_blas_level3 +*> \ingroup trmm * *> \par Further Details: * ===================== @@ -174,6 +174,7 @@ *> * ===================================================================== SUBROUTINE ZTRMM(SIDE,UPLO,TRANSA,DIAG,M,N,ALPHA,A,LDA,B,LDB) + IMPLICIT NONE * * -- Reference BLAS level3 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -233,7 +234,8 @@ SUBROUTINE ZTRMM(SIDE,UPLO,TRANSA,DIAG,M,N,ALPHA,A,LDA,B,LDB) + (.NOT.LSAME(TRANSA,'T')) .AND. + (.NOT.LSAME(TRANSA,'C'))) THEN INFO = 3 - ELSE IF ((.NOT.LSAME(DIAG,'U')) .AND. (.NOT.LSAME(DIAG,'N'))) THEN + ELSE IF ((.NOT.LSAME(DIAG,'U')) .AND. + + (.NOT.LSAME(DIAG,'N'))) THEN INFO = 4 ELSE IF (M.LT.0) THEN INFO = 5 diff --git a/BLAS/SRC/ztrmv.f b/BLAS/SRC/ztrmv.f index e8314facb7..5c1962ba47 100644 --- a/BLAS/SRC/ztrmv.f +++ b/BLAS/SRC/ztrmv.f @@ -125,7 +125,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex16_blas_level2 +*> \ingroup trmv * *> \par Further Details: * ===================== @@ -144,6 +144,7 @@ *> * ===================================================================== SUBROUTINE ZTRMV(UPLO,TRANS,DIAG,N,A,LDA,X,INCX) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -184,10 +185,12 @@ SUBROUTINE ZTRMV(UPLO,TRANS,DIAG,N,A,LDA,X,INCX) INFO = 0 IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN INFO = 1 - ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND. + ELSE IF (.NOT.LSAME(TRANS,'N') .AND. + + .NOT.LSAME(TRANS,'T') .AND. + .NOT.LSAME(TRANS,'C')) THEN INFO = 2 - ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN + ELSE IF (.NOT.LSAME(DIAG,'U') .AND. + + .NOT.LSAME(DIAG,'N')) THEN INFO = 3 ELSE IF (N.LT.0) THEN INFO = 4 diff --git a/BLAS/SRC/ztrsm.f b/BLAS/SRC/ztrsm.f index 7f7eb52f3e..192190f6ce 100644 --- a/BLAS/SRC/ztrsm.f +++ b/BLAS/SRC/ztrsm.f @@ -159,7 +159,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex16_blas_level3 +*> \ingroup trsm * *> \par Further Details: * ===================== @@ -177,6 +177,7 @@ *> * ===================================================================== SUBROUTINE ZTRSM(SIDE,UPLO,TRANSA,DIAG,M,N,ALPHA,A,LDA,B,LDB) + IMPLICIT NONE * * -- Reference BLAS level3 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -236,7 +237,8 @@ SUBROUTINE ZTRSM(SIDE,UPLO,TRANSA,DIAG,M,N,ALPHA,A,LDA,B,LDB) + (.NOT.LSAME(TRANSA,'T')) .AND. + (.NOT.LSAME(TRANSA,'C'))) THEN INFO = 3 - ELSE IF ((.NOT.LSAME(DIAG,'U')) .AND. (.NOT.LSAME(DIAG,'N'))) THEN + ELSE IF ((.NOT.LSAME(DIAG,'U')) .AND. + + (.NOT.LSAME(DIAG,'N'))) THEN INFO = 4 ELSE IF (M.LT.0) THEN INFO = 5 diff --git a/BLAS/SRC/ztrsv.f b/BLAS/SRC/ztrsv.f index 0bb9cbe745..9b96211d25 100644 --- a/BLAS/SRC/ztrsv.f +++ b/BLAS/SRC/ztrsv.f @@ -128,7 +128,7 @@ *> \author Univ. of Colorado Denver *> \author NAG Ltd. * -*> \ingroup complex16_blas_level2 +*> \ingroup trsv * *> \par Further Details: * ===================== @@ -146,6 +146,7 @@ *> * ===================================================================== SUBROUTINE ZTRSV(UPLO,TRANS,DIAG,N,A,LDA,X,INCX) + IMPLICIT NONE * * -- Reference BLAS level2 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -186,10 +187,12 @@ SUBROUTINE ZTRSV(UPLO,TRANS,DIAG,N,A,LDA,X,INCX) INFO = 0 IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN INFO = 1 - ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND. + ELSE IF (.NOT.LSAME(TRANS,'N') .AND. + + .NOT.LSAME(TRANS,'T') .AND. + .NOT.LSAME(TRANS,'C')) THEN INFO = 2 - ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN + ELSE IF (.NOT.LSAME(DIAG,'U') .AND. + + .NOT.LSAME(DIAG,'N')) THEN INFO = 3 ELSE IF (N.LT.0) THEN INFO = 4 diff --git a/BLAS/TESTING/CMakeLists.txt b/BLAS/TESTING/CMakeLists.txt index ae82cf937f..597e81738b 100644 --- a/BLAS/TESTING/CMakeLists.txt +++ b/BLAS/TESTING/CMakeLists.txt @@ -15,6 +15,12 @@ macro(add_blas_test name src) -DINTDIR=${CMAKE_CFG_INTDIR} -P "${LAPACK_SOURCE_DIR}/TESTING/runtest.cmake") endif() + + # Disable constant propagation for NAG compiler to avoid issues with + # special values (Inf, NaN) returned by SXVALS and DXVALS. + if(CMAKE_Fortran_COMPILER_ID STREQUAL "NAG") + target_compile_options(${name} PRIVATE "-Onopropagate") + endif() endmacro() if(BUILD_SINGLE) diff --git a/BLAS/TESTING/cblat1.f b/BLAS/TESTING/cblat1.f index c6dc453b45..f2f9b21267 100644 --- a/BLAS/TESTING/cblat1.f +++ b/BLAS/TESTING/cblat1.f @@ -34,6 +34,7 @@ * * ===================================================================== PROGRAM CBLAT1 + IMPLICIT NONE * * -- Reference BLAS test routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -58,7 +59,7 @@ PROGRAM CBLAT1 DATA SFAC/9.765625E-4/ * .. Executable Statements .. WRITE (NOUT,99999) - DO 20 IC = 1, 10 + DO 20 IC = 1, 11 ICASE = IC CALL HEADER * @@ -71,7 +72,7 @@ PROGRAM CBLAT1 INCX = 9999 INCY = 9999 MODE = 9999 - IF (ICASE.LE.5) THEN + IF (ICASE.LE.5 .OR. ICASE.EQ.11) THEN CALL CHECK2(SFAC) ELSE IF (ICASE.GE.6) THEN CALL CHECK1(SFAC) @@ -88,6 +89,7 @@ PROGRAM CBLAT1 * END SUBROUTINE HEADER + IMPLICIT NONE * .. Parameters .. INTEGER NOUT PARAMETER (NOUT=6) @@ -95,7 +97,7 @@ SUBROUTINE HEADER INTEGER ICASE, INCX, INCY, MODE, N LOGICAL PASS * .. Local Arrays .. - CHARACTER*6 L(10) + CHARACTER*6 L(11) * .. Common blocks .. COMMON /COMBLA/ICASE, N, INCX, INCY, MODE, PASS * .. Data statements .. @@ -109,6 +111,8 @@ SUBROUTINE HEADER DATA L(8)/'CSCAL '/ DATA L(9)/'CSSCAL'/ DATA L(10)/'ICAMAX'/ + DATA L(11)/'CAXPBY'/ + * .. Executable Statements .. WRITE (NOUT,99999) ICASE, L(ICASE) RETURN @@ -119,9 +123,11 @@ SUBROUTINE HEADER * END SUBROUTINE CHECK1(SFAC) + IMPLICIT NONE * .. Parameters .. INTEGER NOUT - PARAMETER (NOUT=6) + REAL THRESH + PARAMETER (NOUT=6, THRESH=10.0E0) * .. Scalar Arguments .. REAL SFAC * .. Scalars in Common .. @@ -141,7 +147,7 @@ SUBROUTINE CHECK1(SFAC) INTEGER ICAMAX EXTERNAL SCASUM, SCNRM2, ICAMAX * .. External Subroutines .. - EXTERNAL CSCAL, CSSCAL, CTEST, ITEST1, STEST1 + EXTERNAL CB1NRM2, CSCAL, CSSCAL, CTEST, ITEST1, STEST1 * .. Intrinsic Functions .. INTRINSIC MAX * .. Common blocks .. @@ -256,6 +262,10 @@ SUBROUTINE CHECK1(SFAC) 20 CONTINUE IF (ICASE.EQ.6) THEN * .. SCNRM2 .. +* Test scaling when some entries are tiny or huge + CALL CB1NRM2(N,(INCX-2)*2,THRESH) + CALL CB1NRM2(N,INCX,THRESH) +* Test with hardcoded mid range entries CALL STEST1(SCNRM2(N,CX,INCX),STRUE2(NP1),STRUE2(NP1), + SFAC) ELSE IF (ICASE.EQ.7) THEN @@ -340,6 +350,7 @@ SUBROUTINE CHECK1(SFAC) * END SUBROUTINE CHECK2(SFAC) + IMPLICIT NONE * .. Parameters .. INTEGER NOUT PARAMETER (NOUT=6) @@ -349,26 +360,27 @@ SUBROUTINE CHECK2(SFAC) INTEGER ICASE, INCX, INCY, MODE, N LOGICAL PASS * .. Local Scalars .. - COMPLEX CA + COMPLEX CA, CB INTEGER I, J, KI, KN, KSIZE, LENX, LENY, LINCX, LINCY, + MX, MY * .. Local Arrays .. COMPLEX CDOT(1), CSIZE1(4), CSIZE2(7,2), CSIZE3(14), + CT10X(7,4,4), CT10Y(7,4,4), CT6(4,4), CT7(4,4), + CT8(7,4,4), CTY0(1), CX(7), CX0(1), CX1(7), - + CY(7), CY0(1), CY1(7) + + CY(7), CY0(1), CY1(7), CT11(7,4,4) INTEGER INCXS(4), INCYS(4), LENS(4,2), NS(4) * .. External Functions .. COMPLEX CDOTC, CDOTU EXTERNAL CDOTC, CDOTU * .. External Subroutines .. - EXTERNAL CAXPY, CCOPY, CSWAP, CTEST + EXTERNAL CAXPY, CAXPBY, CCOPY, CSWAP, CTEST * .. Intrinsic Functions .. INTRINSIC ABS, MIN * .. Common blocks .. COMMON /COMBLA/ICASE, N, INCX, INCY, MODE, PASS * .. Data statements .. DATA CA/(0.4E0,-0.7E0)/ + DATA CB/(0.7E0,-0.4E0)/ DATA INCXS/1, 2, -2, -1/ DATA INCYS/1, -2, 1, -2/ DATA LENS/1, 1, 2, 4, 1, 1, 3, 7/ @@ -538,6 +550,53 @@ SUBROUTINE CHECK2(SFAC) + (1.54E0,1.54E0), (1.54E0,1.54E0), + (1.54E0,1.54E0), (1.54E0,1.54E0), + (1.54E0,1.54E0), (1.54E0,1.54E0)/ + + DATA ((CT11(I,J,1),I=1,7),J=1,4)/(0.6E0,-0.6E0), + + (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0), + + (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0), + + (-0.1E0,-1.47E0), (0.0E0,0.0E0), (0.0E0,0.0E0), + + (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0), + + (0.0E0,0.0E0), (-0.1E0,-1.47E0), + + (-1.08E0,0.71E0), (0.0E0,0.0E0), (0.0E0,0.0E0), + + (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0), + + (-0.1E0,-1.47E0), (-1.08E0,0.71E0), + + (-0.42E0,-0.99E0), (-0.61E0,-0.85E0), + + (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0)/ + DATA ((CT11(I,J,2),I=1,7),J=1,4)/(0.6E0,-0.6E0), + + (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0), + + (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0), + + (-0.1E0,-1.47E0), (0.0E0,0.0E0), (0.0E0,0.0E0), + + (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0), + + (0.0E0,0.0E0), (-0.49E0,-0.95E0), + + (-0.9E0,0.5E0),(-0.03E0,-1.51E0), (0.0E0,0.0E0), + + (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0), + + (0.36E0,0.00E0), (-0.9E0,0.5E0), + + (-0.39E0,-0.23E0), (0.1E0,-0.5E0), + + (-0.82E0,-0.39E0), (-0.5E0,-0.3E0), + + (0.0E0,-1.62E0)/ + DATA ((CT11(I,J,3),I=1,7),J=1,4)/(0.6E0,-0.6E0), + + (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0), + + (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0), + + (-0.1E0,-1.47E0), (0.0E0,0.0E0), (0.0E0,0.0E0), + + (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0), + + (0.0E0,0.0E0), (-0.49E0,-0.95E0), + + (-0.71E0,-0.1E0), (0.0E0,0.0E0), (0.0E0,0.0E0), + + (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0), + + (0.36E0,0.00E0), (-1.07E0,1.18E0), + + (-0.42E0,-0.99E0), (-0.41E0,-1.2E0), + + (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0)/ + DATA ((CT11(I,J,4),I=1,7),J=1,4)/(0.6E0,-0.6E0), + + (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0), + + (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0), + + (-0.1E0,-1.47E0), (0.0E0,0.0E0), (0.0E0,0.0E0), + + (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0), + + (0.0E0,0.0E0), (-0.1E0,-1.47E0), (-0.9E0,0.5E0), + + (-0.4E0,-0.7E0), (0.0E0,0.0E0), (0.0E0,0.0E0), + + (0.0E0,0.0E0), (0.0E0,0.0E0), (-0.1E0,-1.47E0), + + (-0.9E0,0.5E0),(-0.4E0,-0.7E0), (0.1E0,-0.5E0), + + (-0.82E0,-0.39E0), (-0.5E0,-0.3E0), + + (-0.2E0,-1.27E0)/ + * .. Executable Statements .. DO 60 KI = 1, 4 INCX = INCXS(KI) @@ -593,6 +652,10 @@ SUBROUTINE CHECK2(SFAC) CALL CSWAP(N,CX,INCX,CY,INCY) CALL CTEST(LENX,CX,CT10X(1,KN,KI),CSIZE3,1.0E0) CALL CTEST(LENY,CY,CT10Y(1,KN,KI),CSIZE3,1.0E0) + ELSE IF (ICASE.EQ.11) THEN +* .. CAXBPY .. + CALL CAXPBY(N,CA,CX,INCX,CB,CY,INCY) + CALL CTEST(LENY,CY,CT11(1,KN,KI),CSIZE2(1,KSIZE),SFAC) ELSE WRITE (NOUT,*) ' Shouldn''t be here in CHECK2' STOP @@ -606,6 +669,7 @@ SUBROUTINE CHECK2(SFAC) * END SUBROUTINE STEST(LEN,SCOMP,STRUE,SSIZE,SFAC) + IMPLICIT NONE * ********************************* STEST ************************** * * THIS SUBR COMPARES ARRAYS SCOMP() AND STRUE() OF LENGTH LEN TO @@ -665,6 +729,7 @@ SUBROUTINE STEST(LEN,SCOMP,STRUE,SSIZE,SFAC) * END SUBROUTINE STEST1(SCOMP1,STRUE1,SSIZE,SFAC) + IMPLICIT NONE * ************************* STEST1 ***************************** * * THIS IS AN INTERFACE SUBROUTINE TO ACCOMMODATE THE FORTRAN @@ -693,6 +758,7 @@ SUBROUTINE STEST1(SCOMP1,STRUE1,SSIZE,SFAC) * END REAL FUNCTION SDIFF(SA,SB) + IMPLICIT NONE * ********************************* SDIFF ************************** * COMPUTES DIFFERENCE OF TWO NUMBERS. C. L. LAWSON, JPL 1974 FEB 15 * @@ -706,6 +772,7 @@ REAL FUNCTION SDIFF(SA,SB) * END SUBROUTINE CTEST(LEN,CCOMP,CTRUE,CSIZE,SFAC) + IMPLICIT NONE * **************************** CTEST ***************************** * * C.L. LAWSON, JPL, 1978 DEC 6 @@ -740,6 +807,7 @@ SUBROUTINE CTEST(LEN,CCOMP,CTRUE,CSIZE,SFAC) * END SUBROUTINE ITEST1(ICOMP,ITRUE) + IMPLICIT NONE * ********************************* ITEST1 ************************* * * THIS SUBROUTINE COMPARES THE VARIABLES ICOMP AND ITRUE FOR @@ -782,3 +850,234 @@ SUBROUTINE ITEST1(ICOMP,ITRUE) * End of ITEST1 * END + SUBROUTINE CB1NRM2(N,INCX,THRESH) + IMPLICIT NONE +* Compare NRM2 with a reference computation using combinations +* of the following values: +* +* 0, very small, small, ulp, 1, 1/ulp, big, very big, infinity, NaN +* +* one of these values is used to initialize x(1) and x(2:N) is +* filled with random values from [-1,1] scaled by another of +* these values. +* +* This routine is adapted from the test suite provided by +* Anderson E. (2017) +* Algorithm 978: Safe Scaling in the Level 1 BLAS +* ACM Trans Math Softw 44:1--28 +* https://doi.org/10.1145/3061665 +* +* .. Scalar Arguments .. + INTEGER INCX, N + REAL THRESH +* +* ===================================================================== +* .. Parameters .. + INTEGER NMAX, NOUT, NV + PARAMETER (NMAX=20, NOUT=6, NV=10) + REAL HALF, ONE, THREE, TWO, ZERO + PARAMETER (HALF=0.5E+0, ONE=1.0E+0, TWO= 2.0E+0, + & THREE=3.0E+0, ZERO=0.0E+0) +* .. External Functions .. + REAL SCNRM2 + EXTERNAL SCNRM2 +* .. Intrinsic Functions .. + INTRINSIC AIMAG, ABS, CMPLX, MAX, MIN, REAL, SQRT +* .. Model parameters .. + REAL BIGNUM, SAFMAX, SAFMIN, SMLNUM, ULP + PARAMETER (BIGNUM=0.1014120480E+32, + & SAFMAX=0.8507059173E+38, + & SAFMIN=0.1175494351E-37, + & SMLNUM=0.9860761315E-31, + & ULP=0.1192092896E-06) +* .. Local Scalars .. + COMPLEX ROGUE + REAL SNRM, TRAT, V0, V1, WORKSSQ, Y1, Y2, + & YMAX, YMIN, YNRM, ZNRM + INTEGER I, IV, IW, IX, KS + LOGICAL FIRST +* .. Local Arrays .. + COMPLEX X(NMAX), Z(NMAX) + REAL VALUES(NV), WORK(NMAX) +* .. Executable Statements .. + VALUES(1) = ZERO + VALUES(2) = TWO*SAFMIN + VALUES(3) = SMLNUM + VALUES(4) = ULP + VALUES(5) = ONE + VALUES(6) = ONE / ULP + VALUES(7) = BIGNUM + VALUES(8) = SAFMAX + VALUES(9) = SXVALS(V0,2) + VALUES(10) = SXVALS(V0,3) + ROGUE = CMPLX(1234.5678E+0,-1234.5678E+0) + FIRST = .TRUE. +* +* Check that the arrays are large enough +* + IF (N*ABS(INCX).GT.NMAX) THEN + WRITE (NOUT,99) "SCNRM2", NMAX, INCX, N, N*ABS(INCX) + RETURN + END IF +* +* Zero-sized inputs are tested in STEST1. + IF (N.LE.0) THEN + RETURN + END IF +* +* Generate 2*(N-1) values in (-1,1). +* + KS = 2*(N-1) + DO I = 1, KS + CALL RANDOM_NUMBER(WORK(I)) + WORK(I) = ONE - TWO*WORK(I) + END DO +* +* Compute the sum of squares of the random values +* by an unscaled algorithm. +* + WORKSSQ = ZERO + DO I = 1, KS + WORKSSQ = WORKSSQ + WORK(I)*WORK(I) + END DO +* +* Construct the test vector with one known value +* and the rest from the random work array multiplied +* by a scaling factor. +* + DO IV = 1, NV + V0 = VALUES(IV) + IF (ABS(V0).GT.ONE) THEN + V0 = V0*HALF*HALF + END IF + Z(1) = CMPLX(V0,-THREE*V0) + DO IW = 1, NV + V1 = VALUES(IW) + IF (ABS(V1).GT.ONE) THEN + V1 = (V1*HALF) / SQRT(REAL(KS+1)) + END IF + DO I = 1, N-1 + Z(I+1) = CMPLX(V1*WORK(2*I-1),V1*WORK(2*I)) + END DO +* +* Compute the expected value of the 2-norm +* + Y1 = ABS(V0) * SQRT(10.0E0) + IF (N.GT.1) THEN + Y2 = ABS(V1)*SQRT(WORKSSQ) + ELSE + Y2 = ZERO + END IF + YMIN = MIN(Y1, Y2) + YMAX = MAX(Y1, Y2) +* +* Expected value is NaN if either is NaN. The test +* for YMIN == YMAX avoids further computation if both +* are infinity. +* + IF ((Y1.NE.Y1).OR.(Y2.NE.Y2)) THEN +* add to propagate NaN + YNRM = Y1 + Y2 + ELSE IF (YMIN == YMAX) THEN + YNRM = SQRT(TWO)*YMAX + ELSE IF (YMAX == ZERO) THEN + YNRM = ZERO + ELSE + YNRM = YMAX*SQRT(ONE + (YMIN / YMAX)**2) + END IF +* +* Fill the input array to SCNRM2 with steps of incx +* + DO I = 1, N + X(I) = ROGUE + END DO + IX = 1 + IF (INCX.LT.0) IX = 1 - (N-1)*INCX + DO I = 1, N + X(IX) = Z(I) + IX = IX + INCX + END DO +* +* Call SCNRM2 to compute the 2-norm +* + SNRM = SCNRM2(N,X,INCX) +* +* Compare SNRM and ZNRM. Roundoff error grows like O(n) +* in this implementation so we scale the test ratio accordingly. +* + IF (INCX.EQ.0) THEN + Y1 = ABS(REAL(X(1))) + Y2 = ABS(AIMAG(X(1))) + YMIN = MIN(Y1, Y2) + YMAX = MAX(Y1, Y2) + IF ((Y1.NE.Y1).OR.(Y2.NE.Y2)) THEN +* add to propagate NaN + ZNRM = Y1 + Y2 + ELSE IF (YMIN == YMAX) THEN + ZNRM = SQRT(TWO)*YMAX + ELSE IF (YMAX == ZERO) THEN + ZNRM = ZERO + ELSE + ZNRM = YMAX * SQRT(ONE + (YMIN / YMAX)**2) + END IF + ZNRM = SQRT(REAL(n)) * ZNRM + ELSE + ZNRM = YNRM + END IF +* +* The tests for NaN rely on the compiler not being overly +* aggressive and removing the statements altogether. + IF ((SNRM.NE.SNRM).OR.(ZNRM.NE.ZNRM)) THEN + IF ((SNRM.NE.SNRM).NEQV.(ZNRM.NE.ZNRM)) THEN + TRAT = ONE / ULP + ELSE + TRAT = ZERO + END IF + ELSE IF (ZNRM == ZERO) THEN + TRAT = SNRM / ULP + ELSE + TRAT = (ABS(SNRM-ZNRM) / ZNRM) / (TWO*REAL(N)*ULP) + END IF + IF ((TRAT.NE.TRAT).OR.(TRAT.GE.THRESH)) THEN + IF (FIRST) THEN + FIRST = .FALSE. + WRITE(NOUT,99999) + END IF + WRITE (NOUT,98) "SCNRM2", N, INCX, IV, IW, TRAT + END IF + END DO + END DO +99999 FORMAT (' FAIL') + 99 FORMAT ( ' Not enough space to test ', A6, ': NMAX = ',I6, + + ', INCX = ',I6,/,' N = ',I6,', must be at least ',I6 ) + 98 FORMAT( 1X, A6, ': N=', I6,', INCX=', I4, ', IV=', I2, ', IW=', + + I2, ', test=', E15.8 ) + RETURN + CONTAINS + REAL FUNCTION SXVALS(XX,K) + IMPLICIT NONE +* .. Scalar Arguments .. + REAL XX + INTEGER K +* .. Parameters .. + REAL ZERO + PARAMETER (ZERO=0.0E+0) +* .. Local Scalars .. + REAL X, Y, Z +* .. Intrinsic Functions .. + INTRINSIC HUGE +* .. Executable Statements .. + X = ZERO + Y = HUGE(XX) + Z = Y*Y + IF (K.EQ.1) THEN + X = -Z + ELSE IF (K.EQ.2) THEN + X = Z + ELSE IF (K.EQ.3) THEN + X = Z / Z + END IF + SXVALS = X + RETURN + END + END diff --git a/BLAS/TESTING/cblat2.f b/BLAS/TESTING/cblat2.f index cad4405033..a29c1a63ad 100644 --- a/BLAS/TESTING/cblat2.f +++ b/BLAS/TESTING/cblat2.f @@ -100,6 +100,7 @@ * * ===================================================================== PROGRAM CBLAT2 + IMPLICIT NONE * * -- Reference BLAS test routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -435,6 +436,7 @@ SUBROUTINE CCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF, NBET, $ BET, NINC, INC, NMAX, INCMAX, A, AA, AS, X, XX, $ XS, Y, YY, YS, YT, G ) + IMPLICIT NONE * * Tests CGEMV and CGBMV. * @@ -479,7 +481,7 @@ SUBROUTINE CCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, LOGICAL LCE, LCERES EXTERNAL LCE, LCERES * .. External Subroutines .. - EXTERNAL CGBMV, CGEMV, CMAKE, CMVCH + EXTERNAL CGBMV, CGEMV, CMAKE, CMVCH, CREGR1 * .. Intrinsic Functions .. INTRINSIC ABS, MAX, MIN * .. Scalars in Common .. @@ -734,6 +736,34 @@ SUBROUTINE CCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * 120 CONTINUE * +* Regression test to verify preservation of y when m zero, n nonzero. +* + CALL CREGR1( TRANS, M, N, LY, KL, KU, ALPHA, AA, LDA, XX, INCX, + $ BETA, YY, INCY, YS ) + IF( FULL )THEN + IF( TRACE ) + $ WRITE( NTRA, FMT = 9994 )NC, SNAME, TRANS, M, N, ALPHA, LDA, + $ INCX, BETA, INCY + IF( REWI ) + $ REWIND NTRA + CALL CGEMV( TRANS, M, N, ALPHA, AA, LDA, XX, INCX, BETA, YY, + $ INCY ) + ELSE IF( BANDED )THEN + IF( TRACE ) + $ WRITE( NTRA, FMT = 9995 )NC, SNAME, TRANS, M, N, KL, KU, + $ ALPHA, LDA, INCX, BETA, INCY + IF( REWI ) + $ REWIND NTRA + CALL CGBMV( TRANS, M, N, KL, KU, ALPHA, AA, LDA, XX, INCX, + $ BETA, YY, INCY ) + END IF + NC = NC + 1 + IF( .NOT.LCE( YS, YY, LY ) )THEN + WRITE( NOUT, FMT = 9998 )NARGS - 1 + FATAL = .TRUE. + GO TO 130 + END IF +* * Report result. * IF( ERRMAX.LT.THRESH )THEN @@ -780,6 +810,7 @@ SUBROUTINE CCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF, NBET, $ BET, NINC, INC, NMAX, INCMAX, A, AA, AS, X, XX, $ XS, Y, YY, YS, YT, G ) + IMPLICIT NONE * * Tests CHEMV, CHBMV and CHPMV. * @@ -1127,6 +1158,7 @@ SUBROUTINE CCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, SUBROUTINE CCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NKB, KB, NINC, INC, NMAX, $ INCMAX, A, AA, AS, X, XX, XS, XT, G, Z ) + IMPLICIT NONE * * Tests CTRMV, CTBMV, CTPMV, CTRSV, CTBSV and CTPSV. * @@ -1489,6 +1521,7 @@ SUBROUTINE CCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX, $ INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G, $ Z ) + IMPLICIT NONE * * Tests CGERC and CGERU. * @@ -1766,6 +1799,7 @@ SUBROUTINE CCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX, $ INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G, $ Z ) + IMPLICIT NONE * * Tests CHER and CHPR. * @@ -2050,6 +2084,7 @@ SUBROUTINE CCHK6( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX, $ INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G, $ Z ) + IMPLICIT NONE * * Tests CHER2 and CHPR2. * @@ -2369,6 +2404,7 @@ SUBROUTINE CCHK6( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * END SUBROUTINE CCHKE( ISNUM, SRNAMT, NOUT ) + IMPLICIT NONE * * Tests the error exits from the Level 2 Blas. * Requires a special version of the error-handling routine XERBLA. @@ -2713,6 +2749,7 @@ SUBROUTINE CCHKE( ISNUM, SRNAMT, NOUT ) END SUBROUTINE CMAKE( TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, KL, $ KU, RESET, TRANSL ) + IMPLICIT NONE * * Generates values for an M by N matrix A within the bandwidth * defined by KL and KU. @@ -2905,6 +2942,7 @@ SUBROUTINE CMAKE( TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, KL, END SUBROUTINE CMVCH( TRANS, M, N, ALPHA, A, NMAX, X, INCX, BETA, Y, $ INCY, YT, G, YY, EPS, ERR, FATAL, NOUT, MV ) + IMPLICIT NONE * * Checks the results of the computational tests. * @@ -3036,6 +3074,7 @@ SUBROUTINE CMVCH( TRANS, M, N, ALPHA, A, NMAX, X, INCX, BETA, Y, * END LOGICAL FUNCTION LCE( RI, RJ, LR ) + IMPLICIT NONE * * Tests if two arrays are identical. * @@ -3066,6 +3105,7 @@ LOGICAL FUNCTION LCE( RI, RJ, LR ) * END LOGICAL FUNCTION LCERES( TYPE, UPLO, M, N, AA, AS, LDA ) + IMPLICIT NONE * * Tests if selected elements in two arrays are equal. * @@ -3125,6 +3165,7 @@ LOGICAL FUNCTION LCERES( TYPE, UPLO, M, N, AA, AS, LDA ) * END COMPLEX FUNCTION CBEG( RESET ) + IMPLICIT NONE * * Generates complex numbers as pairs of random numbers uniformly * distributed between -0.5 and 0.5. @@ -3177,6 +3218,7 @@ COMPLEX FUNCTION CBEG( RESET ) * END REAL FUNCTION SDIFF( X, Y ) + IMPLICIT NONE * * Auxiliary routine for test program for Level 2 Blas. * @@ -3193,6 +3235,7 @@ REAL FUNCTION SDIFF( X, Y ) * END SUBROUTINE CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + IMPLICIT NONE * * Tests whether XERBLA has detected an error when it should. * @@ -3219,8 +3262,43 @@ SUBROUTINE CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) * * End of CHKXER * + END + SUBROUTINE CREGR1( TRANS, M, N, LY, KL, KU, ALPHA, A, LDA, X, + $ INCX, BETA, Y, INCY, YS ) + IMPLICIT NONE +* +* Input initialization for regression test. +* +* .. Scalar Arguments .. + CHARACTER*1 TRANS + INTEGER LY, M, N, KL, KU, LDA, INCX, INCY + COMPLEX ALPHA, BETA +* .. Array Arguments .. + COMPLEX A(LDA,*), X(*), Y(*), YS(*) +* .. Local Scalars .. + INTEGER I +* .. Intrinsic Functions .. + INTRINSIC CMPLX, REAL +* .. Executable Statements .. + TRANS = 'T' + M = 0 + N = 5 + KL = 0 + KU = 0 + ALPHA = CMPLX( 1.0 ) + LDA = MAX( 1, M ) + INCX = 1 + BETA = CMPLX( -0.7, -0.8 ) + INCY = 1 + LY = ABS( INCY )*N + DO 10 I = 1, LY + Y( I ) = CMPLX( 42.0, REAL( I ) ) + YS( I ) = Y( I ) + 10 CONTINUE + RETURN END SUBROUTINE XERBLA( SRNAME, INFO ) + IMPLICIT NONE * * This is a special version of XERBLA to be used only as part of * the test program for testing error exits from the Level 2 BLAS diff --git a/BLAS/TESTING/cblat3.f b/BLAS/TESTING/cblat3.f index 18adeba6d5..06d8b2b78f 100644 --- a/BLAS/TESTING/cblat3.f +++ b/BLAS/TESTING/cblat3.f @@ -19,8 +19,8 @@ *> Test program for the COMPLEX Level 3 Blas. *> *> The program must be driven by a short data file. The first 14 records -*> of the file are read using list-directed input, the last 9 records -*> are read using the format ( A6, L2 ). An annotated example of a data +*> of the file are read using list-directed input, the last 10 records +*> are read using the format ( A7, L2 ). An annotated example of a data *> file can be obtained by deleting the first 3 characters from the *> following 23 lines: *> 'cblat3.out' NAME OF SUMMARY OUTPUT FILE @@ -46,6 +46,7 @@ *> CSYRK T PUT F FOR NO TEST. SAME COLUMNS. *> CHER2K T PUT F FOR NO TEST. SAME COLUMNS. *> CSYR2K T PUT F FOR NO TEST. SAME COLUMNS. +*> CGEMMTR T PUT F FOR NO TEST. SAME COLUMNS. *> *> Further Details *> =============== @@ -82,6 +83,7 @@ * * ===================================================================== PROGRAM CBLAT3 + IMPLICIT NONE * * -- Reference BLAS test routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -93,7 +95,7 @@ PROGRAM CBLAT3 INTEGER NIN PARAMETER ( NIN = 5 ) INTEGER NSUBS - PARAMETER ( NSUBS = 9 ) + PARAMETER ( NSUBS = 10 ) COMPLEX ZERO, ONE PARAMETER ( ZERO = ( 0.0, 0.0 ), ONE = ( 1.0, 0.0 ) ) REAL RZERO @@ -108,7 +110,7 @@ PROGRAM CBLAT3 LOGICAL FATAL, LTESTT, REWI, SAME, SFATAL, TRACE, $ TSTERR CHARACTER*1 TRANSA, TRANSB - CHARACTER*6 SNAMET + CHARACTER*7 SNAMET CHARACTER*32 SNAPS, SUMMRY * .. Local Arrays .. COMPLEX AA( NMAX*NMAX ), AB( NMAX, 2*NMAX ), @@ -120,26 +122,27 @@ PROGRAM CBLAT3 REAL G( NMAX ) INTEGER IDIM( NIDMAX ) LOGICAL LTEST( NSUBS ) - CHARACTER*6 SNAMES( NSUBS ) + CHARACTER*7 SNAMES( NSUBS ) * .. External Functions .. REAL SDIFF LOGICAL LCE EXTERNAL SDIFF, LCE * .. External Subroutines .. EXTERNAL CCHK1, CCHK2, CCHK3, CCHK4, CCHK5, CCHKE, CMMCH + EXTERNAL CCHK6 * .. Intrinsic Functions .. INTRINSIC MAX, MIN * .. Scalars in Common .. INTEGER INFOT, NOUTC LOGICAL LERR, OK - CHARACTER*6 SRNAMT + CHARACTER*7 SRNAMT * .. Common blocks .. COMMON /INFOC/INFOT, NOUTC, OK, LERR COMMON /SRNAMC/SRNAMT * .. Data statements .. DATA SNAMES/'CGEMM ', 'CHEMM ', 'CSYMM ', 'CTRMM ', $ 'CTRSM ', 'CHERK ', 'CSYRK ', 'CHER2K', - $ 'CSYR2K'/ + $ 'CSYR2K', 'CGEMMTR'/ * .. Executable Statements .. * * Read name and unit number for summary output file and open file. @@ -317,7 +320,7 @@ PROGRAM CBLAT3 OK = .TRUE. FATAL = .FALSE. GO TO ( 140, 150, 150, 160, 160, 170, 170, - $ 180, 180 )ISNUM + $ 180, 180, 185 )ISNUM * Test CGEMM, 01. 140 CALL CCHK1( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE, $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, @@ -346,6 +349,11 @@ PROGRAM CBLAT3 $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, $ NMAX, AB, AA, AS, BB, BS, C, CC, CS, CT, G, W ) GO TO 190 + 185 CALL CCHK6( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE, + $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, + $ NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C, + $ CC, CS, CT, G ) + * 190 IF( FATAL.AND.SFATAL ) $ GO TO 210 @@ -382,7 +390,7 @@ PROGRAM CBLAT3 $ 7( '(', F4.1, ',', F4.1, ') ', : ) ) 9991 FORMAT( ' AMEND DATA FILE OR INCREASE ARRAY SIZES IN PROGRAM', $ /' ******* TESTS ABANDONED *******' ) - 9990 FORMAT( ' SUBPROGRAM NAME ', A6, ' NOT RECOGNIZED', /' ******* T', + 9990 FORMAT( ' SUBPROGRAM NAME ', A7, ' NOT RECOGNIZED', /' ******* T', $ 'ESTS ABANDONED *******' ) 9989 FORMAT( ' ERROR IN CMMCH - IN-LINE DOT PRODUCTS ARE BEING EVALU', $ 'ATED WRONGLY.', /' CMMCH WAS CALLED WITH TRANSA = ', A1, @@ -390,8 +398,8 @@ PROGRAM CBLAT3 $ 'ERR = ', F12.3, '.', /' THIS MAY BE DUE TO FAULTS IN THE ', $ 'ARITHMETIC OR THE COMPILER.', /' ******* TESTS ABANDONED ', $ '*******' ) - 9988 FORMAT( A6, L2 ) - 9987 FORMAT( 1X, A6, ' WAS NOT TESTED' ) + 9988 FORMAT( A7, L2 ) + 9987 FORMAT( 1X, A7, ' WAS NOT TESTED' ) 9986 FORMAT( /' END OF TESTS' ) 9985 FORMAT( /' ******* FATAL ERROR - TESTS ABANDONED *******' ) 9984 FORMAT( ' ERROR-EXITS WILL NOT BE TESTED' ) @@ -422,7 +430,7 @@ SUBROUTINE CCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, REAL EPS, THRESH INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA LOGICAL FATAL, REWI, TRACE - CHARACTER*6 SNAME + CHARACTER*7 SNAME * .. Array Arguments .. COMPLEX A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ), $ AS( NMAX*NMAX ), B( NMAX, NMAX ), @@ -667,15 +675,15 @@ SUBROUTINE CCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, 130 CONTINUE RETURN * - 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', + 9999 FORMAT( ' ', A7, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', $ 'S)' ) 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', $ 'ANGED INCORRECTLY *******' ) - 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', + 9997 FORMAT( ' ', A7, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', $ 'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2, $ ' - SUSPECT *******' ) - 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' ) - 9995 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',''', A1, ''',', + 9996 FORMAT( ' ******* ', A7, ' FAILED ON CALL NUMBER:' ) + 9995 FORMAT( 1X, I6, ': ', A7, '(''', A1, ''',''', A1, ''',', $ 3( I3, ',' ), '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, $ ',(', F4.1, ',', F4.1, '), C,', I3, ').' ) 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', @@ -707,7 +715,7 @@ SUBROUTINE CCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, REAL EPS, THRESH INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA LOGICAL FATAL, REWI, TRACE - CHARACTER*6 SNAME + CHARACTER*7 SNAME * .. Array Arguments .. COMPLEX A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ), $ AS( NMAX*NMAX ), B( NMAX, NMAX ), @@ -946,15 +954,15 @@ SUBROUTINE CCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, 120 CONTINUE RETURN * - 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', + 9999 FORMAT( ' ', A7, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', $ 'S)' ) 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', $ 'ANGED INCORRECTLY *******' ) - 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', + 9997 FORMAT( ' ', A7, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', $ 'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2, $ ' - SUSPECT *******' ) - 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' ) - 9995 FORMAT( 1X, I6, ': ', A6, '(', 2( '''', A1, ''',' ), 2( I3, ',' ), + 9996 FORMAT( ' ******* ', A7, ' FAILED ON CALL NUMBER:' ) + 9995 FORMAT( 1X, I6, ': ', A7, '(', 2( '''', A1, ''',' ), 2( I3, ',' ), $ '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ',(', F4.1, $ ',', F4.1, '), C,', I3, ') .' ) 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', @@ -986,7 +994,7 @@ SUBROUTINE CCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, REAL EPS, THRESH INTEGER NALF, NIDIM, NMAX, NOUT, NTRA LOGICAL FATAL, REWI, TRACE - CHARACTER*6 SNAME + CHARACTER*7 SNAME * .. Array Arguments .. COMPLEX A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ), $ AS( NMAX*NMAX ), B( NMAX, NMAX ), @@ -1256,15 +1264,15 @@ SUBROUTINE CCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, 160 CONTINUE RETURN * - 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', + 9999 FORMAT( ' ', A7, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', $ 'S)' ) 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', $ 'ANGED INCORRECTLY *******' ) - 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', + 9997 FORMAT( ' ', A7, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', $ 'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2, $ ' - SUSPECT *******' ) - 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' ) - 9995 FORMAT( 1X, I6, ': ', A6, '(', 4( '''', A1, ''',' ), 2( I3, ',' ), + 9996 FORMAT( ' ******* ', A7, ' FAILED ON CALL NUMBER:' ) + 9995 FORMAT( 1X, I6, ': ', A7, '(', 4( '''', A1, ''',' ), 2( I3, ',' ), $ '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ') ', $ ' .' ) 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', @@ -1296,7 +1304,7 @@ SUBROUTINE CCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, REAL EPS, THRESH INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA LOGICAL FATAL, REWI, TRACE - CHARACTER*6 SNAME + CHARACTER*7 SNAME * .. Array Arguments .. COMPLEX A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ), $ AS( NMAX*NMAX ), B( NMAX, NMAX ), @@ -1584,19 +1592,19 @@ SUBROUTINE CCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, 130 CONTINUE RETURN * - 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', + 9999 FORMAT( ' ', A7, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', $ 'S)' ) 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', $ 'ANGED INCORRECTLY *******' ) - 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', + 9997 FORMAT( ' ', A7, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', $ 'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2, $ ' - SUSPECT *******' ) - 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' ) + 9996 FORMAT( ' ******* ', A7, ' FAILED ON CALL NUMBER:' ) 9995 FORMAT( ' THESE ARE THE RESULTS FOR COLUMN ', I3 ) - 9994 FORMAT( 1X, I6, ': ', A6, '(', 2( '''', A1, ''',' ), 2( I3, ',' ), + 9994 FORMAT( 1X, I6, ': ', A7, '(', 2( '''', A1, ''',' ), 2( I3, ',' ), $ F4.1, ', A,', I3, ',', F4.1, ', C,', I3, ') ', $ ' .' ) - 9993 FORMAT( 1X, I6, ': ', A6, '(', 2( '''', A1, ''',' ), 2( I3, ',' ), + 9993 FORMAT( 1X, I6, ': ', A7, '(', 2( '''', A1, ''',' ), 2( I3, ',' ), $ '(', F4.1, ',', F4.1, ') , A,', I3, ',(', F4.1, ',', F4.1, $ '), C,', I3, ') .' ) 9992 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', @@ -1628,7 +1636,7 @@ SUBROUTINE CCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, REAL EPS, THRESH INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA LOGICAL FATAL, REWI, TRACE - CHARACTER*6 SNAME + CHARACTER*7 SNAME * .. Array Arguments .. COMPLEX AA( NMAX*NMAX ), AB( 2*NMAX*NMAX ), $ ALF( NALF ), AS( NMAX*NMAX ), BB( NMAX*NMAX ), @@ -1957,19 +1965,19 @@ SUBROUTINE CCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, 160 CONTINUE RETURN * - 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', + 9999 FORMAT( ' ', A7, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', $ 'S)' ) 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', $ 'ANGED INCORRECTLY *******' ) - 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', + 9997 FORMAT( ' ', A7, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', $ 'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2, $ ' - SUSPECT *******' ) - 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' ) + 9996 FORMAT( ' ******* ', A7, ' FAILED ON CALL NUMBER:' ) 9995 FORMAT( ' THESE ARE THE RESULTS FOR COLUMN ', I3 ) - 9994 FORMAT( 1X, I6, ': ', A6, '(', 2( '''', A1, ''',' ), 2( I3, ',' ), + 9994 FORMAT( 1X, I6, ': ', A7, '(', 2( '''', A1, ''',' ), 2( I3, ',' ), $ '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ',', F4.1, $ ', C,', I3, ') .' ) - 9993 FORMAT( 1X, I6, ': ', A6, '(', 2( '''', A1, ''',' ), 2( I3, ',' ), + 9993 FORMAT( 1X, I6, ': ', A7, '(', 2( '''', A1, ''',' ), 2( I3, ',' ), $ '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ',(', F4.1, $ ',', F4.1, '), C,', I3, ') .' ) 9992 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', @@ -1998,7 +2006,7 @@ SUBROUTINE CCHKE( ISNUM, SRNAMT, NOUT ) * * .. Scalar Arguments .. INTEGER ISNUM, NOUT - CHARACTER*6 SRNAMT + CHARACTER*7 SRNAMT * .. Scalars in Common .. INTEGER INFOT, NOUTC LOGICAL LERR, OK @@ -2012,7 +2020,7 @@ SUBROUTINE CCHKE( ISNUM, SRNAMT, NOUT ) COMPLEX A( 2, 1 ), B( 2, 1 ), C( 2, 1 ) * .. External Subroutines .. EXTERNAL CGEMM, CHEMM, CHER2K, CHERK, CHKXER, CSYMM, - $ CSYR2K, CSYRK, CTRMM, CTRSM + $ CSYR2K, CSYRK, CTRMM, CTRSM, CGEMMTR * .. Common blocks .. COMMON /INFOC/INFOT, NOUTC, OK, LERR * .. Executable Statements .. @@ -2031,7 +2039,7 @@ SUBROUTINE CCHKE( ISNUM, SRNAMT, NOUT ) RBETA = TWO * GO TO ( 10, 20, 30, 40, 50, 60, 70, 80, - $ 90 )ISNUM + $ 90, 100 )ISNUM 10 INFOT = 1 CALL CGEMM( '/', 'N', 0, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) @@ -2212,7 +2220,7 @@ SUBROUTINE CCHKE( ISNUM, SRNAMT, NOUT ) INFOT = 13 CALL CGEMM( 'T', 'T', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) - GO TO 100 + GO TO 110 20 INFOT = 1 CALL CHEMM( '/', 'U', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) @@ -2279,7 +2287,7 @@ SUBROUTINE CCHKE( ISNUM, SRNAMT, NOUT ) INFOT = 12 CALL CHEMM( 'R', 'L', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) - GO TO 100 + GO TO 110 30 INFOT = 1 CALL CSYMM( '/', 'U', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) @@ -2346,7 +2354,7 @@ SUBROUTINE CCHKE( ISNUM, SRNAMT, NOUT ) INFOT = 12 CALL CSYMM( 'R', 'L', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) - GO TO 100 + GO TO 110 40 INFOT = 1 CALL CTRMM( '/', 'U', 'N', 'N', 0, 0, ALPHA, A, 1, B, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) @@ -2503,7 +2511,7 @@ SUBROUTINE CCHKE( ISNUM, SRNAMT, NOUT ) INFOT = 11 CALL CTRMM( 'R', 'L', 'T', 'N', 2, 0, ALPHA, A, 1, B, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) - GO TO 100 + GO TO 110 50 INFOT = 1 CALL CTRSM( '/', 'U', 'N', 'N', 0, 0, ALPHA, A, 1, B, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) @@ -2660,7 +2668,7 @@ SUBROUTINE CCHKE( ISNUM, SRNAMT, NOUT ) INFOT = 11 CALL CTRSM( 'R', 'L', 'T', 'N', 2, 0, ALPHA, A, 1, B, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) - GO TO 100 + GO TO 110 60 INFOT = 1 CALL CHERK( '/', 'N', 0, 0, RALPHA, A, 1, RBETA, C, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) @@ -2715,7 +2723,7 @@ SUBROUTINE CCHKE( ISNUM, SRNAMT, NOUT ) INFOT = 10 CALL CHERK( 'L', 'C', 2, 0, RALPHA, A, 1, RBETA, C, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) - GO TO 100 + GO TO 110 70 INFOT = 1 CALL CSYRK( '/', 'N', 0, 0, ALPHA, A, 1, BETA, C, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) @@ -2770,7 +2778,7 @@ SUBROUTINE CCHKE( ISNUM, SRNAMT, NOUT ) INFOT = 10 CALL CSYRK( 'L', 'T', 2, 0, ALPHA, A, 1, BETA, C, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) - GO TO 100 + GO TO 110 80 INFOT = 1 CALL CHER2K( '/', 'N', 0, 0, ALPHA, A, 1, B, 1, RBETA, C, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) @@ -2837,7 +2845,7 @@ SUBROUTINE CCHKE( ISNUM, SRNAMT, NOUT ) INFOT = 12 CALL CHER2K( 'L', 'C', 2, 0, ALPHA, A, 1, B, 1, RBETA, C, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) - GO TO 100 + GO TO 110 90 INFOT = 1 CALL CSYR2K( '/', 'N', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) @@ -2904,16 +2912,212 @@ SUBROUTINE CCHKE( ISNUM, SRNAMT, NOUT ) INFOT = 12 CALL CSYR2K( 'L', 'T', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + GO TO 110 + 100 INFOT = 1 + CALL CGEMMTR( '/', 'N', 'N', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 1 + CALL CGEMMTR( '/', 'N', 'T', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 1 + CALL CGEMMTR( '/', 'N', 'C', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 1 + CALL CGEMMTR( '/', 'T', 'N', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 1 + CALL CGEMMTR( '/', 'T', 'T', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 1 + CALL CGEMMTR( '/', 'T', 'C', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 1 + CALL CGEMMTR( '/', 'C', 'N', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 1 + CALL CGEMMTR( '/', 'C', 'T', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 1 + CALL CGEMMTR( '/', 'C', 'C', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + + INFOT = 2 + CALL CGEMMTR( 'U', '/', 'N', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 2 + CALL CGEMMTR( 'U', '/', 'C', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 2 + CALL CGEMMTR( 'U', '/', 'T', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 2 + CALL CGEMMTR( 'L', '/', 'N', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 2 + CALL CGEMMTR( 'L', '/', 'C', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 2 + CALL CGEMMTR( 'L', '/', 'T', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + + INFOT = 3 + CALL CGEMMTR( 'U', 'N', '/', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 3 + CALL CGEMMTR( 'U', 'C', '/', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 3 + CALL CGEMMTR( 'U', 'T', '/', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 4 + CALL CGEMMTR( 'U', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 4 + CALL CGEMMTR( 'U', 'N', 'C', -1, 0, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 4 + CALL CGEMMTR( 'U', 'N', 'T', -1, 0, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 4 + CALL CGEMMTR( 'U', 'C', 'N', -1, 0, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 4 + CALL CGEMMTR( 'U', 'C', 'C', -1, 0, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 4 + CALL CGEMMTR( 'U', 'C', 'T', -1, 0, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 4 + CALL CGEMMTR( 'U', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 4 + CALL CGEMMTR( 'U', 'T', 'C', -1, 0, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 4 + CALL CGEMMTR( 'U', 'T', 'T', -1, 0, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 5 + CALL CGEMMTR( 'U', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 5 + CALL CGEMMTR( 'U', 'N', 'C', 0, -1, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 5 + CALL CGEMMTR( 'U', 'N', 'T', 0, -1, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 5 + CALL CGEMMTR( 'U', 'C', 'N', 0, -1, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 5 + CALL CGEMMTR( 'U', 'C', 'C', 0, -1, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 5 + CALL CGEMMTR( 'U', 'C', 'T', 0, -1, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 5 + CALL CGEMMTR( 'U', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 5 + CALL CGEMMTR( 'U', 'T', 'C', 0, -1, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 5 + CALL CGEMMTR( 'U', 'T', 'T', 0, -1, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + + INFOT = 8 + CALL CGEMMTR( 'U', 'N', 'N', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 2 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 8 + CALL CGEMMTR( 'U', 'N', 'C', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 2 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 8 + CALL CGEMMTR( 'U', 'N', 'T', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 2 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 8 + CALL CGEMMTR( 'U', 'C', 'N', 0, 2, ALPHA, A, 1, B, 2, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 8 + CALL CGEMMTR( 'U', 'C', 'C', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 8 + CALL CGEMMTR( 'U', 'C', 'T', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 8 + CALL CGEMMTR( 'U', 'T', 'N', 0, 2, ALPHA, A, 1, B, 2, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 8 + CALL CGEMMTR( 'U', 'T', 'C', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 8 + CALL CGEMMTR( 'U', 'T', 'T', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + + INFOT = 10 + CALL CGEMMTR( 'U', 'N', 'N', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 10 + CALL CGEMMTR( 'U', 'C', 'N', 0, 2, ALPHA, A, 2, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 10 + CALL CGEMMTR( 'U', 'T', 'N', 0, 2, ALPHA, A, 2, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 13 + CALL CGEMMTR( 'U', 'N', 'N', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 13 + CALL CGEMMTR( 'U', 'N', 'C', 2, 0, ALPHA, A, 2, B, 2, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 13 + CALL CGEMMTR( 'U', 'N', 'T', 2, 0, ALPHA, A, 2, B, 2, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 13 + CALL CGEMMTR( 'U', 'C', 'N', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 13 + CALL CGEMMTR( 'U', 'C', 'C', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 13 + CALL CGEMMTR( 'U', 'C', 'T', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 13 + CALL CGEMMTR( 'U', 'T', 'N', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 13 + CALL CGEMMTR( 'U', 'T', 'C', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 13 + CALL CGEMMTR( 'U', 'T', 'T', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + GO TO 110 + * - 100 IF( OK )THEN + 110 IF( OK )THEN WRITE( NOUT, FMT = 9999 )SRNAMT ELSE WRITE( NOUT, FMT = 9998 )SRNAMT END IF RETURN * - 9999 FORMAT( ' ', A6, ' PASSED THE TESTS OF ERROR-EXITS' ) - 9998 FORMAT( ' ******* ', A6, ' FAILED THE TESTS OF ERROR-EXITS *****', + 9999 FORMAT( ' ', A7, ' PASSED THE TESTS OF ERROR-EXITS' ) + 9998 FORMAT( ' ******* ', A7, ' FAILED THE TESTS OF ERROR-EXITS *****', $ '**' ) * * End of CCHKE @@ -3416,7 +3620,7 @@ SUBROUTINE CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) * .. Scalar Arguments .. INTEGER INFOT, NOUT LOGICAL LERR, OK - CHARACTER*6 SRNAMT + CHARACTER*7 SRNAMT * .. Executable Statements .. IF( .NOT.LERR )THEN WRITE( NOUT, FMT = 9999 )INFOT, SRNAMT @@ -3426,7 +3630,7 @@ SUBROUTINE CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) RETURN * 9999 FORMAT( ' ***** ILLEGAL VALUE OF PARAMETER NUMBER ', I2, ' NOT D', - $ 'ETECTED BY ', A6, ' *****' ) + $ 'ETECTED BY ', A7, ' *****' ) * * End of CHKXER * @@ -3452,14 +3656,16 @@ SUBROUTINE XERBLA( SRNAME, INFO ) * * .. Scalar Arguments .. INTEGER INFO - CHARACTER*6 SRNAME + CHARACTER*(*) SRNAME * .. Scalars in Common .. INTEGER INFOT, NOUT LOGICAL LERR, OK - CHARACTER*6 SRNAMT + CHARACTER*7 SRNAMT * .. Common blocks .. COMMON /INFOC/INFOT, NOUT, OK, LERR COMMON /SRNAMC/SRNAMT +* .. Locals .. + INTEGER SRLEN * .. Executable Statements .. LERR = .TRUE. IF( INFO.NE.INFOT )THEN @@ -3470,7 +3676,8 @@ SUBROUTINE XERBLA( SRNAME, INFO ) END IF OK = .FALSE. END IF - IF( SRNAME.NE.SRNAMT )THEN + SRLEN = MIN(LEN_TRIM(SRNAME), LEN_TRIM(SRNAMT)) + IF( SRNAME(1:SRLEN).NE.SRNAMT(1:SRLEN) )THEN WRITE( NOUT, FMT = 9998 )SRNAME, SRNAMT OK = .FALSE. END IF @@ -3478,11 +3685,504 @@ SUBROUTINE XERBLA( SRNAME, INFO ) * 9999 FORMAT( ' ******* XERBLA WAS CALLED WITH INFO = ', I6, ' INSTEAD', $ ' OF ', I2, ' *******' ) - 9998 FORMAT( ' ******* XERBLA WAS CALLED WITH SRNAME = ', A6, ' INSTE', - $ 'AD OF ', A6, ' *******' ) + 9998 FORMAT( ' ******* XERBLA WAS CALLED WITH SRNAME = ', A7, ' INSTE', + $ 'AD OF ', A7, ' *******' ) 9997 FORMAT( ' ******* XERBLA WAS CALLED WITH INFO = ', I6, $ ' *******' ) * * End of XERBLA * END + + SUBROUTINE CCHK6( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, + $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX, + $ A, AA, AS, B, BB, BS, C, CC, CS, CT, G ) +* +* Tests CGEMMTR. +* +* Auxiliary routine for test program for Level 3 Blas. +* +* -- Written on 8-February-1989. +* Jack Dongarra, Argonne National Laboratory. +* Iain Duff, AERE Harwell. +* Jeremy Du Croz, Numerical Algorithms Group Ltd. +* Sven Hammarling, Numerical Algorithms Group Ltd. +* +* .. Parameters .. + COMPLEX ZERO + PARAMETER ( ZERO = ( 0.0, 0.0 ) ) + REAL RZERO + PARAMETER ( RZERO = 0.0 ) +* .. Scalar Arguments .. + REAL EPS, THRESH + INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA + LOGICAL FATAL, REWI, TRACE + CHARACTER*7 SNAME +* .. Array Arguments .. + COMPLEX A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ), + $ AS( NMAX*NMAX ), B( NMAX, NMAX ), + $ BB( NMAX*NMAX ), BET( NBET ), BS( NMAX*NMAX ), + $ C( NMAX, NMAX ), CC( NMAX*NMAX ), + $ CS( NMAX*NMAX ), CT( NMAX ) + REAL G( NMAX ) + INTEGER IDIM( NIDIM ) +* .. Local Scalars .. + COMPLEX ALPHA, ALS, BETA, BLS + REAL ERR, ERRMAX + INTEGER I, IA, IB, ICA, ICB, IK, IN, K, KS, LAA, + $ LBB, LCC, LDA, LDAS, LDB, LDBS, LDC, LDCS, + $ MA, MB, N, NA, NARGS, NB, NC, NS, IS + LOGICAL NULL, RESET, SAME, TRANA, TRANB + CHARACTER*1 TRANAS, TRANBS, TRANSA, TRANSB, UPLO, UPLOS + CHARACTER*3 ICH + CHARACTER*2 ISHAPE +* .. Local Arrays .. + LOGICAL ISAME( 13 ) +* .. External Functions .. + LOGICAL LCE, LCERES + EXTERNAL LCE, LCERES +* .. External Subroutines .. + EXTERNAL CGEMMTR, CMAKE, CMMTCH +* .. Intrinsic Functions .. + INTRINSIC MAX +* .. Scalars in Common .. + INTEGER INFOT, NOUTC + LOGICAL LERR, OK +* .. Common blocks .. + COMMON /INFOC/INFOT, NOUTC, OK, LERR +* .. Data statements .. + DATA ICH/'NTC'/ + DATA ISHAPE/'UL'/ + +* .. Executable Statements .. +* + NARGS = 13 + NC = 0 + RESET = .TRUE. + ERRMAX = RZERO +* + DO 100 IN = 1, NIDIM + N = IDIM( IN ) +* Set LDC to 1 more than minimum value if room. + LDC = N + IF( LDC.LT.NMAX ) + $ LDC = LDC + 1 +* Skip tests if not enough room. + IF( LDC.GT.NMAX ) + $ GO TO 100 + LCC = LDC*N + NULL = N.LE.0 +* + DO 90 IK = 1, NIDIM + K = IDIM( IK ) +* + DO 80 ICA = 1, 3 + TRANSA = ICH( ICA: ICA ) + TRANA = TRANSA.EQ.'T'.OR.TRANSA.EQ.'C' +* + IF( TRANA )THEN + MA = K + NA = N + ELSE + MA = N + NA = K + END IF +* Set LDA to 1 more than minimum value if room. + LDA = MA + IF( LDA.LT.NMAX ) + $ LDA = LDA + 1 +* Skip tests if not enough room. + IF( LDA.GT.NMAX ) + $ GO TO 80 + LAA = LDA*NA +* +* Generate the matrix A. +* + CALL CMAKE( 'GE', ' ', ' ', MA, NA, A, NMAX, AA, LDA, + $ RESET, ZERO ) +* + DO 70 ICB = 1, 3 + TRANSB = ICH( ICB: ICB ) + TRANB = TRANSB.EQ.'T'.OR.TRANSB.EQ.'C' +* + IF( TRANB )THEN + MB = N + NB = K + ELSE + MB = K + NB = N + END IF +* Set LDB to 1 more than minimum value if room. + LDB = MB + IF( LDB.LT.NMAX ) + $ LDB = LDB + 1 +* Skip tests if not enough room. + IF( LDB.GT.NMAX ) + $ GO TO 70 + LBB = LDB*NB +* +* Generate the matrix B. +* + CALL CMAKE( 'GE', ' ', ' ', MB, NB, B, NMAX, BB, + $ LDB, RESET, ZERO ) +* + DO 60 IA = 1, NALF + ALPHA = ALF( IA ) +* + DO 50 IB = 1, NBET + BETA = BET( IB ) + DO 45 IS = 1, 2 + UPLO = ISHAPE( IS: IS ) + +* +* Generate the matrix C. +* + CALL CMAKE( 'GE', UPLO, ' ', N, N, C, NMAX, + $ CC, LDC, RESET, ZERO ) +* + NC = NC + 1 +* +* Save every datum before calling the +* subroutine. +* + UPLOS = UPLO + TRANAS = TRANSA + TRANBS = TRANSB + NS = N + KS = K + ALS = ALPHA + DO 10 I = 1, LAA + AS( I ) = AA( I ) + 10 CONTINUE + LDAS = LDA + DO 20 I = 1, LBB + BS( I ) = BB( I ) + 20 CONTINUE + LDBS = LDB + BLS = BETA + DO 30 I = 1, LCC + CS( I ) = CC( I ) + 30 CONTINUE + LDCS = LDC +* +* Call the subroutine. +* + IF( TRACE ) + $ WRITE( NTRA, FMT = 9995 )NC, SNAME, UPLO, + $ TRANSA, TRANSB, N, K, ALPHA, LDA, LDB, + $ BETA, LDC + IF( REWI ) + $ REWIND NTRA + CALL CGEMMTR( UPLO, TRANSA, TRANSB, N, K, + $ ALPHA, AA, LDA, BB, LDB, BETA, + $ CC, LDC ) +* +* Check if error-exit was taken incorrectly. +* + IF( .NOT.OK )THEN + WRITE( NOUT, FMT = 9994 ) + FATAL = .TRUE. + GO TO 120 + END IF +* +* See what data changed inside subroutines. +* + ISAME( 1 ) = UPLOS.EQ.UPLO + ISAME( 2 ) = TRANSA.EQ.TRANAS + ISAME( 3 ) = TRANSB.EQ.TRANBS + ISAME( 4 ) = NS.EQ.N + ISAME( 5 ) = KS.EQ.K + ISAME( 6 ) = ALS.EQ.ALPHA + ISAME( 7 ) = LCE( AS, AA, LAA ) + ISAME( 8 ) = LDAS.EQ.LDA + ISAME( 9 ) = LCE( BS, BB, LBB ) + ISAME( 10 ) = LDBS.EQ.LDB + ISAME( 11 ) = BLS.EQ.BETA + IF( NULL )THEN + ISAME( 12 ) = LCE( CS, CC, LCC ) + ELSE + ISAME( 12 ) = LCERES( 'GE', ' ', N, N, CS, + $ CC, LDC ) + END IF + ISAME( 13 ) = LDCS.EQ.LDC +* +* If data was incorrectly changed, report +* and return. +* + SAME = .TRUE. + DO 40 I = 1, NARGS + SAME = SAME.AND.ISAME( I ) + IF( .NOT.ISAME( I ) ) + $ WRITE( NOUT, FMT = 9998 )I + 40 CONTINUE + IF( .NOT.SAME )THEN + FATAL = .TRUE. + GO TO 120 + END IF +* + IF( .NOT.NULL )THEN +* +* Check the result. +* + CALL CMMTCH( UPLO, TRANSA, TRANSB, N, + $ K, ALPHA, A, NMAX, B, NMAX, + $ BETA, C, NMAX, CT, G, CC, LDC, + $ EPS, ERR, FATAL, NOUT, .TRUE.) + ERRMAX = MAX( ERRMAX, ERR ) +* If got really bad answer, report and +* return. + IF( FATAL ) + $ GO TO 120 + END IF + 45 CONTINUE +* + 50 CONTINUE +* + 60 CONTINUE +* + 70 CONTINUE +* + 80 CONTINUE +* + 90 CONTINUE +* + 100 CONTINUE +* +* +* Report result. +* + IF( ERRMAX.LT.THRESH )THEN + WRITE( NOUT, FMT = 9999 )SNAME, NC + ELSE + WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX + END IF + GO TO 130 +* + 120 CONTINUE + WRITE( NOUT, FMT = 9996 )SNAME + WRITE( NOUT, FMT = 9995 )NC, SNAME, UPLO, TRANSA, TRANSB, N, K, + $ ALPHA, LDA, LDB, BETA, LDC +* + 130 CONTINUE + RETURN +* + 9999 FORMAT( ' ', A7, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', + $ 'S)' ) + 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', + $ 'ANGED INCORRECTLY *******' ) + 9997 FORMAT( ' ', A7, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', + $ 'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2, + $ ' - SUSPECT *******' ) + 9996 FORMAT( ' ******* ', A7, ' FAILED ON CALL NUMBER:' ) + 9995 FORMAT( 1X, I6, ': ', A7, '(''',A1, ''',''',A1, ''',''', A1,''',', + $ 2( I3, ',' ), '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, + $ ',(', F4.1, ',', F4.1, '), C,', I3, ').' ) + 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', + $ '******' ) +* +* End of CCHK6 +* + END + + SUBROUTINE CMMTCH( UPLO, TRANSA, TRANSB, N, KK, ALPHA, A, LDA, + $ B, LDB, BETA, C, LDC, CT, G, CC, LDCC, EPS, ERR, + $ FATAL, NOUT, MV ) + IMPLICIT NONE +* +* Checks the results of the computational tests. +* +* Auxiliary routine for test program for Level 3 Blas. +* +* -- Written on 8-February-1989. +* Jack Dongarra, Argonne National Laboratory. +* Iain Duff, AERE Harwell. +* Jeremy Du Croz, Numerical Algorithms Group Ltd. +* Sven Hammarling, Numerical Algorithms Group Ltd. +* +* .. Parameters .. + COMPLEX ZERO + PARAMETER ( ZERO = ( 0.0, 0.0 ) ) + REAL RZERO, RONE + PARAMETER ( RZERO = 0.0, RONE = 1.0 ) +* .. Scalar Arguments .. + COMPLEX ALPHA, BETA + REAL EPS, ERR + INTEGER KK, LDA, LDB, LDC, LDCC, N, NOUT + LOGICAL FATAL, MV + CHARACTER*1 TRANSA, TRANSB, UPLO +* .. Array Arguments .. + COMPLEX A( LDA, * ), B( LDB, * ), C( LDC, * ), + $ CC( LDCC, * ), CT( * ) + REAL G( * ) +* .. Local Scalars .. + COMPLEX CL + REAL ERRI + INTEGER I, J, K, ISTART, ISTOP + LOGICAL CTRANA, CTRANB, TRANA, TRANB, UPPER +* .. Intrinsic Functions .. + INTRINSIC ABS, AIMAG, CONJG, MAX, REAL, SQRT +* .. Statement Functions .. + REAL ABS1 +* .. Statement Function definitions .. + ABS1( CL ) = ABS( REAL( CL ) ) + ABS( AIMAG( CL ) ) +* .. Executable Statements .. + UPPER = UPLO.EQ.'U' + TRANA = TRANSA.EQ.'T'.OR.TRANSA.EQ.'C' + TRANB = TRANSB.EQ.'T'.OR.TRANSB.EQ.'C' + CTRANA = TRANSA.EQ.'C' + CTRANB = TRANSB.EQ.'C' +* +* Compute expected result, one column at a time, in CT using data +* in A, B and C. +* Compute gauges in G. +* + ISTART = 1 + ISTOP = 1 + + DO 220 J = 1, N +* + IF ( UPPER ) THEN + ISTART = 1 + ISTOP = J + ELSE + ISTART = J + ISTOP = N + END IF + + DO 10 I = ISTART, ISTOP + CT( I ) = ZERO + G( I ) = RZERO + 10 CONTINUE + IF( .NOT.TRANA.AND..NOT.TRANB )THEN + DO 30 K = 1, KK + DO 20 I = ISTART, ISTOP + CT( I ) = CT( I ) + A( I, K )*B( K, J ) + G( I ) = G( I ) + ABS1( A( I, K ) )*ABS1( B( K, J ) ) + 20 CONTINUE + 30 CONTINUE + ELSE IF( TRANA.AND..NOT.TRANB )THEN + IF( CTRANA )THEN + DO 50 K = 1, KK + DO 40 I = ISTART, ISTOP + CT( I ) = CT( I ) + CONJG( A( K, I ) )*B( K, J ) + G( I ) = G( I ) + ABS1( A( K, I ) )* + $ ABS1( B( K, J ) ) + 40 CONTINUE + 50 CONTINUE + ELSE + DO 70 K = 1, KK + DO 60 I = ISTART, ISTOP + CT( I ) = CT( I ) + A( K, I )*B( K, J ) + G( I ) = G( I ) + ABS1( A( K, I ) )* + $ ABS1( B( K, J ) ) + 60 CONTINUE + 70 CONTINUE + END IF + ELSE IF( .NOT.TRANA.AND.TRANB )THEN + IF( CTRANB )THEN + DO 90 K = 1, KK + DO 80 I = ISTART, ISTOP + CT( I ) = CT( I ) + A( I, K )*CONJG( B( J, K ) ) + G( I ) = G( I ) + ABS1( A( I, K ) )* + $ ABS1( B( J, K ) ) + 80 CONTINUE + 90 CONTINUE + ELSE + DO 110 K = 1, KK + DO 100 I = ISTART, ISTOP + CT( I ) = CT( I ) + A( I, K )*B( J, K ) + G( I ) = G( I ) + ABS1( A( I, K ) )* + $ ABS1( B( J, K ) ) + 100 CONTINUE + 110 CONTINUE + END IF + ELSE IF( TRANA.AND.TRANB )THEN + IF( CTRANA )THEN + IF( CTRANB )THEN + DO 130 K = 1, KK + DO 120 I = ISTART, ISTOP + CT( I ) = CT( I ) + CONJG( A( K, I ) )* + $ CONJG( B( J, K ) ) + G( I ) = G( I ) + ABS1( A( K, I ) )* + $ ABS1( B( J, K ) ) + 120 CONTINUE + 130 CONTINUE + ELSE + DO 150 K = 1, KK + DO 140 I = ISTART, ISTOP + CT( I ) = CT( I ) + CONJG( A( K, I ) )*B( J, K ) + G( I ) = G( I ) + ABS1( A( K, I ) )* + $ ABS1( B( J, K ) ) + 140 CONTINUE + 150 CONTINUE + END IF + ELSE + IF( CTRANB )THEN + DO 170 K = 1, KK + DO 160 I = ISTART, ISTOP + CT( I ) = CT( I ) + A( K, I )*CONJG( B( J, K ) ) + G( I ) = G( I ) + ABS1( A( K, I ) )* + $ ABS1( B( J, K ) ) + 160 CONTINUE + 170 CONTINUE + ELSE + DO 190 K = 1, KK + DO 180 I = ISTART, ISTOP + CT( I ) = CT( I ) + A( K, I )*B( J, K ) + G( I ) = G( I ) + ABS1( A( K, I ) )* + $ ABS1( B( J, K ) ) + 180 CONTINUE + 190 CONTINUE + END IF + END IF + END IF + DO 200 I = ISTART, ISTOP + CT( I ) = ALPHA*CT( I ) + BETA*C( I, J ) + G( I ) = ABS1( ALPHA )*G( I ) + + $ ABS1( BETA )*ABS1( C( I, J ) ) + 200 CONTINUE +* +* Compute the error ratio for this result. +* + ERR = ZERO + DO 210 I = ISTART, ISTOP + ERRI = ABS1( CT( I ) - CC( I, J ) )/EPS + IF( G( I ).NE.RZERO ) + $ ERRI = ERRI/G( I ) + ERR = MAX( ERR, ERRI ) + IF( ERR*SQRT( EPS ).GE.RONE ) + $ GO TO 230 + 210 CONTINUE +* + 220 CONTINUE +* +* If the loop completes, all results are at least half accurate. + GO TO 250 +* +* Report fatal error. +* + 230 FATAL = .TRUE. + WRITE( NOUT, FMT = 9999 ) + DO 240 I = ISTART, ISTOP + IF( MV )THEN + WRITE( NOUT, FMT = 9998 )I, CT( I ), CC( I, J ) + ELSE + WRITE( NOUT, FMT = 9998 )I, CC( I, J ), CT( I ) + END IF + 240 CONTINUE + IF( N.GT.1 ) + $ WRITE( NOUT, FMT = 9997 )J +* + 250 CONTINUE + RETURN +* + 9999 FORMAT( ' ******* FATAL ERROR - COMPUTED RESULT IS LESS THAN HAL', + $ 'F ACCURATE *******', /' EXPECTED RE', + $ 'SULT COMPUTED RESULT' ) + 9998 FORMAT( 1X, I7, 2( ' (', G15.6, ',', G15.6, ')' ) ) + 9997 FORMAT( ' THESE ARE THE RESULTS FOR COLUMN ', I3 ) +* +* End of CMMTCH +* + END + diff --git a/BLAS/TESTING/cblat3.in b/BLAS/TESTING/cblat3.in index f1480557a1..701180f550 100644 --- a/BLAS/TESTING/cblat3.in +++ b/BLAS/TESTING/cblat3.in @@ -12,12 +12,13 @@ T LOGICAL FLAG, T TO TEST ERROR EXITS. (0.0,0.0) (1.0,0.0) (0.7,-0.9) VALUES OF ALPHA 3 NUMBER OF VALUES OF BETA (0.0,0.0) (1.0,0.0) (1.3,-1.1) VALUES OF BETA -CGEMM T PUT F FOR NO TEST. SAME COLUMNS. -CHEMM T PUT F FOR NO TEST. SAME COLUMNS. -CSYMM T PUT F FOR NO TEST. SAME COLUMNS. -CTRMM T PUT F FOR NO TEST. SAME COLUMNS. -CTRSM T PUT F FOR NO TEST. SAME COLUMNS. -CHERK T PUT F FOR NO TEST. SAME COLUMNS. -CSYRK T PUT F FOR NO TEST. SAME COLUMNS. -CHER2K T PUT F FOR NO TEST. SAME COLUMNS. -CSYR2K T PUT F FOR NO TEST. SAME COLUMNS. +CGEMM T PUT F FOR NO TEST. SAME COLUMNS. +CHEMM T PUT F FOR NO TEST. SAME COLUMNS. +CSYMM T PUT F FOR NO TEST. SAME COLUMNS. +CTRMM T PUT F FOR NO TEST. SAME COLUMNS. +CTRSM T PUT F FOR NO TEST. SAME COLUMNS. +CHERK T PUT F FOR NO TEST. SAME COLUMNS. +CSYRK T PUT F FOR NO TEST. SAME COLUMNS. +CHER2K T PUT F FOR NO TEST. SAME COLUMNS. +CSYR2K T PUT F FOR NO TEST. SAME COLUMNS. +CGEMMTR T PUT F FOR NO TEST. SAME COLUMNS. diff --git a/BLAS/TESTING/dblat1.f b/BLAS/TESTING/dblat1.f index 9a27a249b2..cb46217766 100644 --- a/BLAS/TESTING/dblat1.f +++ b/BLAS/TESTING/dblat1.f @@ -34,6 +34,7 @@ * * ===================================================================== PROGRAM DBLAT1 + IMPLICIT NONE * * -- Reference BLAS test routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -58,7 +59,7 @@ PROGRAM DBLAT1 DATA SFAC/9.765625D-4/ * .. Executable Statements .. WRITE (NOUT,99999) - DO 20 IC = 1, 13 + DO 20 IC = 1, 14 ICASE = IC CALL HEADER * @@ -76,7 +77,8 @@ PROGRAM DBLAT1 + ICASE.EQ.10) THEN CALL CHECK1(SFAC) ELSE IF (ICASE.EQ.1 .OR. ICASE.EQ.2 .OR. ICASE.EQ.5 .OR. - + ICASE.EQ.6 .OR. ICASE.EQ.12 .OR. ICASE.EQ.13) THEN + + ICASE.EQ.6 .OR. ICASE.EQ.12 .OR. ICASE.EQ.13 .OR. + + ICASE.EQ.14 ) THEN CALL CHECK2(SFAC) ELSE IF (ICASE.EQ.4) THEN CALL CHECK3(SFAC) @@ -100,7 +102,7 @@ SUBROUTINE HEADER INTEGER ICASE, INCX, INCY, N LOGICAL PASS * .. Local Arrays .. - CHARACTER*6 L(13) + CHARACTER*6 L(14) * .. Common blocks .. COMMON /COMBLA/ICASE, N, INCX, INCY, PASS * .. Data statements .. @@ -117,6 +119,8 @@ SUBROUTINE HEADER DATA L(11)/'DROTMG'/ DATA L(12)/'DROTM '/ DATA L(13)/'DSDOT '/ + DATA L(14)/'DAXPBY'/ + * .. Executable Statements .. WRITE (NOUT,99999) ICASE, L(ICASE) RETURN @@ -127,6 +131,7 @@ SUBROUTINE HEADER * END SUBROUTINE CHECK0(SFAC) + IMPLICIT NONE * .. Parameters .. INTEGER NOUT PARAMETER (NOUT=6) @@ -246,9 +251,11 @@ SUBROUTINE CHECK0(SFAC) * END SUBROUTINE CHECK1(SFAC) + IMPLICIT NONE * .. Parameters .. + DOUBLE PRECISION THRESH INTEGER NOUT - PARAMETER (NOUT=6) + PARAMETER (NOUT=6, THRESH=10.0D0) * .. Scalar Arguments .. DOUBLE PRECISION SFAC * .. Scalars in Common .. @@ -266,7 +273,7 @@ SUBROUTINE CHECK1(SFAC) INTEGER IDAMAX EXTERNAL DASUM, DNRM2, IDAMAX * .. External Subroutines .. - EXTERNAL ITEST1, DSCAL, STEST, STEST1 + EXTERNAL ITEST1, DB1NRM2, DSCAL, STEST, STEST1 * .. Intrinsic Functions .. INTRINSIC MAX * .. Common blocks .. @@ -319,6 +326,10 @@ SUBROUTINE CHECK1(SFAC) * IF (ICASE.EQ.7) THEN * .. DNRM2 .. +* Test scaling when some entries are tiny or huge + CALL DB1NRM2(N,(INCX-2)*2,THRESH) + CALL DB1NRM2(N,INCX,THRESH) +* Test with hardcoded mid range entries STEMP(1) = DTRUE1(NP1) CALL STEST1(DNRM2(N,SX,INCX),STEMP(1),STEMP,SFAC) ELSE IF (ICASE.EQ.8) THEN @@ -360,6 +371,7 @@ SUBROUTINE CHECK1(SFAC) * END SUBROUTINE CHECK2(SFAC) + IMPLICIT NONE * .. Parameters .. INTEGER NOUT PARAMETER (NOUT=6) @@ -369,7 +381,7 @@ SUBROUTINE CHECK2(SFAC) INTEGER ICASE, INCX, INCY, N LOGICAL PASS * .. Local Scalars .. - DOUBLE PRECISION SA + DOUBLE PRECISION SA, SB INTEGER I, J, KI, KN, KNI, KPAR, KSIZE, LENX, LENY, $ LINCX, LINCY, MX, MY * .. Local Arrays .. @@ -381,14 +393,14 @@ SUBROUTINE CHECK2(SFAC) $ DT19XB(7,4,4), DT19XC(7,4,4),DT19XD(7,4,4), $ DT19Y(7,4,16), DT19YA(7,4,4),DT19YB(7,4,4), $ DT19YC(7,4,4), DT19YD(7,4,4), DTEMP(5), - $ STY0(1), SX0(1), SY0(1) + $ STY0(1), SX0(1), SY0(1), DT20(7,4,4) INTEGER INCXS(4), INCYS(4), LENS(4,2), NS(4) * .. External Functions .. DOUBLE PRECISION DDOT, DSDOT EXTERNAL DDOT, DSDOT * .. External Subroutines .. - EXTERNAL DAXPY, DCOPY, DROTM, DSWAP, STEST, STEST1, - $ TESTDSDOT + EXTERNAL DAXPY, DAXPBY, DCOPY, DROTM, DSWAP, STEST, + $ STEST1, TESTDSDOT * .. Intrinsic Functions .. INTRINSIC ABS, MIN * .. Common blocks .. @@ -402,6 +414,7 @@ SUBROUTINE CHECK2(SFAC) B (DT19Y(1,1,13),DT19YD(1,1,1)) DATA SA/0.3D0/ + DATA SB/0.5D0/ DATA INCXS/1, 2, -2, -1/ DATA INCYS/1, -2, 1, -2/ DATA LENS/1, 1, 2, 4, 1, 1, 3, 7/ @@ -617,6 +630,27 @@ SUBROUTINE CHECK2(SFAC) M .7D0, -.9D0, 1.2D0, .7D0, -1.5D0, .2D0, 1.6D0, N 1.7D0, -.9D0, .5D0, .7D0, -1.6D0, .2D0, 2.4D0, O -2.6D0, -.9D0, -1.3D0, .7D0, 2.9D0, .2D0, -4.0D0 / + DATA DT20/0.5D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, + + 0.0D0, 0.43D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, + + 0.0D0, 0.0D0, 0.43D0, -0.42D0, 0.0D0, 0.0D0, + + 0.0D0, 0.0D0, 0.0D0, 0.43D0, -0.42D0, 0.0D0, + + 0.59D0, 0.0D0, 0.0D0, 0.0D0, 0.5D0, 0.0D0, + + 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.43D0, + + 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, + + 0.1D0, -0.9D0, 0.33D0, 0.0D0, 0.0D0, 0.0D0, + + 0.0D0, 0.13D0, -0.9D0, 0.42D0, 0.7D0, -0.45D0, + + 0.2D0, 0.58D0, 0.5D0, 0.0D0, 0.0D0, 0.0D0, + + 0.0D0, 0.0D0, 0.0D0, 0.43D0, 0.0D0, 0.0D0, + + 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.1D0, -0.27D0, + + 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.13D0, + + -0.18D0, 0.00D0, 0.53D0, 0.0D0, 0.0D0, 0.0D0, + + 0.5D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, + + 0.43D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, + + 0.0D0, 0.43D0, -0.9D0, 0.18D0, 0.0D0, 0.0D0, + + 0.0D0, 0.0D0, 0.43D0, -0.9D0, 0.18D0, 0.7D0, + + -0.45D0, 0.2D0, 0.64D0/ + + * * .. Executable Statements .. * @@ -648,6 +682,14 @@ SUBROUTINE CHECK2(SFAC) STY(J) = DT8(J,KN,KI) 40 CONTINUE CALL STEST(LENY,SY,STY,SSIZE2(1,KSIZE),SFAC) + ELSE IF (ICASE.EQ.14) THEN +* .. DAXPBY .. + CALL DAXPBY(N,SA,SX,INCX,SB,SY,INCY) + DO 50 J = 1, LENY + STY(J) = DT20(J,KN,KI) + 50 CONTINUE + CALL STEST(LENY,SY,STY,SSIZE2(1,KSIZE),SFAC) + ELSE IF (ICASE.EQ.5) THEN * .. DCOPY .. DO 60 I = 1, 7 @@ -726,6 +768,7 @@ SUBROUTINE CHECK2(SFAC) * END SUBROUTINE CHECK3(SFAC) + IMPLICIT NONE * .. Parameters .. INTEGER NOUT PARAMETER (NOUT=6) @@ -935,6 +978,7 @@ SUBROUTINE CHECK3(SFAC) * END SUBROUTINE STEST(LEN,SCOMP,STRUE,SSIZE,SFAC) + IMPLICIT NONE * ********************************* STEST ************************** * * THIS SUBR COMPARES ARRAYS SCOMP() AND STRUE() OF LENGTH LEN TO @@ -994,6 +1038,7 @@ SUBROUTINE STEST(LEN,SCOMP,STRUE,SSIZE,SFAC) * END SUBROUTINE TESTDSDOT(SCOMP,STRUE,SSIZE,SFAC) + IMPLICIT NONE * ********************************* STEST ************************** * * THIS SUBR COMPARES ARRAYS SCOMP() AND STRUE() OF LENGTH LEN TO @@ -1045,6 +1090,7 @@ SUBROUTINE TESTDSDOT(SCOMP,STRUE,SSIZE,SFAC) * END SUBROUTINE STEST1(SCOMP1,STRUE1,SSIZE,SFAC) + IMPLICIT NONE * ************************* STEST1 ***************************** * * THIS IS AN INTERFACE SUBROUTINE TO ACCOMMODATE THE FORTRAN @@ -1073,6 +1119,7 @@ SUBROUTINE STEST1(SCOMP1,STRUE1,SSIZE,SFAC) * END DOUBLE PRECISION FUNCTION SDIFF(SA,SB) + IMPLICIT NONE * ********************************* SDIFF ************************** * COMPUTES DIFFERENCE OF TWO NUMBERS. C. L. LAWSON, JPL 1974 FEB 15 * @@ -1086,6 +1133,7 @@ DOUBLE PRECISION FUNCTION SDIFF(SA,SB) * END SUBROUTINE ITEST1(ICOMP,ITRUE) + IMPLICIT NONE * ********************************* ITEST1 ************************* * * THIS SUBROUTINE COMPARES THE VARIABLES ICOMP AND ITRUE FOR @@ -1129,3 +1177,219 @@ SUBROUTINE ITEST1(ICOMP,ITRUE) * End of ITEST1 * END + SUBROUTINE DB1NRM2(N,INCX,THRESH) + IMPLICIT NONE +* Compare NRM2 with a reference computation using combinations +* of the following values: +* +* 0, very small, small, ulp, 1, 1/ulp, big, very big, infinity, NaN +* +* one of these values is used to initialize x(1) and x(2:N) is +* filled with random values from [-1,1] scaled by another of +* these values. +* +* This routine is adapted from the test suite provided by +* Anderson E. (2017) +* Algorithm 978: Safe Scaling in the Level 1 BLAS +* ACM Trans Math Softw 44:1--28 +* https://doi.org/10.1145/3061665 +* +* .. Scalar Arguments .. + INTEGER INCX, N + DOUBLE PRECISION THRESH +* +* ===================================================================== +* .. Parameters .. + INTEGER NMAX, NOUT, NV + PARAMETER (NMAX=20, NOUT=6, NV=10) + DOUBLE PRECISION HALF, ONE, TWO, ZERO + PARAMETER (HALF=0.5D+0, ONE=1.0D+0, TWO= 2.0D+0, + & ZERO=0.0D+0) +* .. External Functions .. + DOUBLE PRECISION DNRM2 + EXTERNAL DNRM2 +* .. Intrinsic Functions .. + INTRINSIC ABS, DBLE, MAX, MIN, SQRT +* .. Model parameters .. + DOUBLE PRECISION BIGNUM, SAFMAX, SAFMIN, SMLNUM, ULP + PARAMETER (BIGNUM=0.99792015476735990583D+292, + & SAFMAX=0.44942328371557897693D+308, + & SAFMIN=0.22250738585072013831D-307, + & SMLNUM=0.10020841800044863890D-291, + & ULP=0.22204460492503130808D-015) +* .. Local Scalars .. + DOUBLE PRECISION ROGUE, SNRM, TRAT, V0, V1, WORKSSQ, Y1, Y2, + & YMAX, YMIN, YNRM, ZNRM + INTEGER I, IV, IW, IX + LOGICAL FIRST +* .. Local Arrays .. + DOUBLE PRECISION VALUES(NV), WORK(NMAX), X(NMAX), Z(NMAX) +* .. Executable Statements .. + VALUES(1) = ZERO + VALUES(2) = TWO*SAFMIN + VALUES(3) = SMLNUM + VALUES(4) = ULP + VALUES(5) = ONE + VALUES(6) = ONE / ULP + VALUES(7) = BIGNUM + VALUES(8) = SAFMAX + VALUES(9) = DXVALS(V0,2) + VALUES(10) = DXVALS(V0,3) + ROGUE = -1234.5678D+0 + FIRST = .TRUE. +* +* Check that the arrays are large enough +* + IF (N*ABS(INCX).GT.NMAX) THEN + WRITE (NOUT,99) "DNRM2", NMAX, INCX, N, N*ABS(INCX) + RETURN + END IF +* +* Zero-sized inputs are tested in STEST1. + IF (N.LE.0) THEN + RETURN + END IF +* +* Generate (N-1) values in (-1,1). +* + DO I = 2, N + CALL RANDOM_NUMBER(WORK(I)) + WORK(I) = ONE - TWO*WORK(I) + END DO +* +* Compute the sum of squares of the random values +* by an unscaled algorithm. +* + WORKSSQ = ZERO + DO I = 2, N + WORKSSQ = WORKSSQ + WORK(I)*WORK(I) + END DO +* +* Construct the test vector with one known value +* and the rest from the random work array multiplied +* by a scaling factor. +* + DO IV = 1, NV + V0 = VALUES(IV) + IF (ABS(V0).GT.ONE) THEN + V0 = V0*HALF + END IF + Z(1) = V0 + DO IW = 1, NV + V1 = VALUES(IW) + IF (ABS(V1).GT.ONE) THEN + V1 = (V1*HALF) / SQRT(DBLE(N)) + END IF + DO I = 2, N + Z(I) = V1*WORK(I) + END DO +* +* Compute the expected value of the 2-norm +* + Y1 = ABS(V0) + IF (N.GT.1) THEN + Y2 = ABS(V1)*SQRT(WORKSSQ) + ELSE + Y2 = ZERO + END IF + YMIN = MIN(Y1, Y2) + YMAX = MAX(Y1, Y2) +* +* Expected value is NaN if either is NaN. The test +* for YMIN == YMAX avoids further computation if both +* are infinity. +* + IF ((Y1.NE.Y1).OR.(Y2.NE.Y2)) THEN +* Add to propagate NaN + YNRM = Y1 + Y2 + ELSE IF (YMAX == ZERO) THEN + YNRM = ZERO + ELSE IF (YMIN == YMAX) THEN + YNRM = SQRT(TWO)*YMAX + ELSE + YNRM = YMAX*SQRT(ONE + (YMIN / YMAX)**2) + END IF +* +* Fill the input array to DNRM2 with steps of incx +* + DO I = 1, N + X(I) = ROGUE + END DO + IX = 1 + IF (INCX.LT.0) IX = 1 - (N-1)*INCX + DO I = 1, N + X(IX) = Z(I) + IX = IX + INCX + END DO +* +* Call DNRM2 to compute the 2-norm +* + SNRM = DNRM2(N,X,INCX) +* +* Compare SNRM and ZNRM. Roundoff error grows like O(n) +* in this implementation so we scale the test ratio accordingly. +* + IF (INCX.EQ.0) THEN + ZNRM = SQRT(DBLE(N))*ABS(X(1)) + ELSE + ZNRM = YNRM + END IF +* +* The tests for NaN rely on the compiler not being overly +* aggressive and removing the statements altogether. + IF ((SNRM.NE.SNRM).OR.(ZNRM.NE.ZNRM)) THEN + IF ((SNRM.NE.SNRM).NEQV.(ZNRM.NE.ZNRM)) THEN + TRAT = ONE / ULP + ELSE + TRAT = ZERO + END IF + ELSE IF (SNRM == ZNRM) THEN + TRAT = ZERO + ELSE IF (ZNRM == ZERO) THEN + TRAT = SNRM / ULP + ELSE + TRAT = (ABS(SNRM-ZNRM) / ZNRM) / (DBLE(N)*ULP) + END IF + IF ((TRAT.NE.TRAT).OR.(TRAT.GE.THRESH)) THEN + IF (FIRST) THEN + FIRST = .FALSE. + WRITE(NOUT,99999) + END IF + WRITE (NOUT,98) "DNRM2", N, INCX, IV, IW, TRAT + END IF + END DO + END DO +99999 FORMAT (' FAIL') + 99 FORMAT ( ' Not enough space to test ', A6, ': NMAX = ',I6, + + ', INCX = ',I6,/,' N = ',I6,', must be at least ',I6 ) + 98 FORMAT( 1X, A6, ': N=', I6,', INCX=', I4, ', IV=', I2, ', IW=', + + I2, ', test=', E15.8 ) + RETURN + CONTAINS + DOUBLE PRECISION FUNCTION DXVALS(XX,K) + IMPLICIT NONE +* .. Scalar Arguments .. + DOUBLE PRECISION XX + INTEGER K +* .. Parameters .. + DOUBLE PRECISION ZERO + PARAMETER (ZERO=0.0D+0) +* .. Local Scalars .. + DOUBLE PRECISION X, Y, Z +* .. Intrinsic Functions .. + INTRINSIC HUGE +* .. Executable Statements .. + X = ZERO + Y = HUGE(XX) + Z = Y*Y + IF (K.EQ.1) THEN + X = -Z + ELSE IF (K.EQ.2) THEN + X = Z + ELSE IF (K.EQ.3) THEN + X = Z / Z + END IF + DXVALS = X + RETURN + END + END diff --git a/BLAS/TESTING/dblat2.f b/BLAS/TESTING/dblat2.f index b3e7f0df9f..ae1c8e8dcb 100644 --- a/BLAS/TESTING/dblat2.f +++ b/BLAS/TESTING/dblat2.f @@ -99,6 +99,7 @@ * * ===================================================================== PROGRAM DBLAT2 + IMPLICIT NONE * * -- Reference BLAS test routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -428,6 +429,7 @@ SUBROUTINE DCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF, NBET, $ BET, NINC, INC, NMAX, INCMAX, A, AA, AS, X, XX, $ XS, Y, YY, YS, YT, G ) + IMPLICIT NONE * * Tests DGEMV and DGBMV. * @@ -469,7 +471,7 @@ SUBROUTINE DCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, LOGICAL LDE, LDERES EXTERNAL LDE, LDERES * .. External Subroutines .. - EXTERNAL DGBMV, DGEMV, DMAKE, DMVCH + EXTERNAL DGBMV, DGEMV, DMAKE, DMVCH, DREGR1 * .. Intrinsic Functions .. INTRINSIC ABS, MAX, MIN * .. Scalars in Common .. @@ -724,6 +726,34 @@ SUBROUTINE DCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * 120 CONTINUE * +* Regression test to verify preservation of y when m zero, n nonzero. +* + CALL DREGR1( TRANS, M, N, LY, KL, KU, ALPHA, AA, LDA, XX, INCX, + $ BETA, YY, INCY, YS ) + IF( FULL )THEN + IF( TRACE ) + $ WRITE( NTRA, FMT = 9994 )NC, SNAME, TRANS, M, N, ALPHA, LDA, + $ INCX, BETA, INCY + IF( REWI ) + $ REWIND NTRA + CALL DGEMV( TRANS, M, N, ALPHA, AA, LDA, XX, INCX, BETA, YY, + $ INCY ) + ELSE IF( BANDED )THEN + IF( TRACE ) + $ WRITE( NTRA, FMT = 9995 )NC, SNAME, TRANS, M, N, KL, KU, + $ ALPHA, LDA, INCX, BETA, INCY + IF( REWI ) + $ REWIND NTRA + CALL DGBMV( TRANS, M, N, KL, KU, ALPHA, AA, LDA, XX, INCX, + $ BETA, YY, INCY ) + END IF + NC = NC + 1 + IF( .NOT.LDE( YS, YY, LY ) )THEN + WRITE( NOUT, FMT = 9998 )NARGS - 1 + FATAL = .TRUE. + GO TO 130 + END IF +* * Report result. * IF( ERRMAX.LT.THRESH )THEN @@ -769,6 +799,7 @@ SUBROUTINE DCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF, NBET, $ BET, NINC, INC, NMAX, INCMAX, A, AA, AS, X, XX, $ XS, Y, YY, YS, YT, G ) + IMPLICIT NONE * * Tests DSYMV, DSBMV and DSPMV. * @@ -1111,6 +1142,7 @@ SUBROUTINE DCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, SUBROUTINE DCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NKB, KB, NINC, INC, NMAX, $ INCMAX, A, AA, AS, X, XX, XS, XT, G, Z ) + IMPLICIT NONE * * Tests DTRMV, DTBMV, DTPMV, DTRSV, DTBSV and DTPSV. * @@ -1469,6 +1501,7 @@ SUBROUTINE DCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX, $ INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G, $ Z ) + IMPLICIT NONE * * Tests DGER. * @@ -1730,6 +1763,7 @@ SUBROUTINE DCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX, $ INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G, $ Z ) + IMPLICIT NONE * * Tests DSYR and DSPR. * @@ -2008,6 +2042,7 @@ SUBROUTINE DCHK6( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX, $ INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G, $ Z ) + IMPLICIT NONE * * Tests DSYR2 and DSPR2. * @@ -2320,6 +2355,7 @@ SUBROUTINE DCHK6( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * END SUBROUTINE DCHKE( ISNUM, SRNAMT, NOUT ) + IMPLICIT NONE * * Tests the error exits from the Level 2 Blas. * Requires a special version of the error-handling routine XERBLA. @@ -2647,6 +2683,7 @@ SUBROUTINE DCHKE( ISNUM, SRNAMT, NOUT ) END SUBROUTINE DMAKE( TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, KL, $ KU, RESET, TRANSL ) + IMPLICIT NONE * * Generates values for an M by N matrix A within the bandwidth * defined by KL and KU. @@ -2823,6 +2860,7 @@ SUBROUTINE DMAKE( TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, KL, END SUBROUTINE DMVCH( TRANS, M, N, ALPHA, A, NMAX, X, INCX, BETA, Y, $ INCY, YT, G, YY, EPS, ERR, FATAL, NOUT, MV ) + IMPLICIT NONE * * Checks the results of the computational tests. * @@ -2939,6 +2977,7 @@ SUBROUTINE DMVCH( TRANS, M, N, ALPHA, A, NMAX, X, INCX, BETA, Y, * END LOGICAL FUNCTION LDE( RI, RJ, LR ) + IMPLICIT NONE * * Tests if two arrays are identical. * @@ -2969,6 +3008,7 @@ LOGICAL FUNCTION LDE( RI, RJ, LR ) * END LOGICAL FUNCTION LDERES( TYPE, UPLO, M, N, AA, AS, LDA ) + IMPLICIT NONE * * Tests if selected elements in two arrays are equal. * @@ -3028,6 +3068,7 @@ LOGICAL FUNCTION LDERES( TYPE, UPLO, M, N, AA, AS, LDA ) * END DOUBLE PRECISION FUNCTION DBEG( RESET ) + IMPLICIT NONE * * Generates random numbers uniformly distributed between -0.5 and 0.5. * @@ -3074,6 +3115,7 @@ DOUBLE PRECISION FUNCTION DBEG( RESET ) * END DOUBLE PRECISION FUNCTION DDIFF( X, Y ) + IMPLICIT NONE * * Auxiliary routine for test program for Level 2 Blas. * @@ -3090,6 +3132,7 @@ DOUBLE PRECISION FUNCTION DDIFF( X, Y ) * END SUBROUTINE CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + IMPLICIT NONE * * Tests whether XERBLA has detected an error when it should. * @@ -3116,8 +3159,43 @@ SUBROUTINE CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) * * End of CHKXER * + END + SUBROUTINE DREGR1( TRANS, M, N, LY, KL, KU, ALPHA, A, LDA, X, + $ INCX, BETA, Y, INCY, YS ) + IMPLICIT NONE +* +* Input initialization for regression test. +* +* .. Scalar Arguments .. + CHARACTER*1 TRANS + INTEGER LY, M, N, KL, KU, LDA, INCX, INCY + DOUBLE PRECISION ALPHA, BETA +* .. Array Arguments .. + DOUBLE PRECISION A(LDA,*), X(*), Y(*), YS(*) +* .. Local Scalars .. + INTEGER I +* .. Intrinsic Functions .. + INTRINSIC DBLE +* .. Executable Statements .. + TRANS = 'T' + M = 0 + N = 5 + KL = 0 + KU = 0 + ALPHA = 1.0D0 + LDA = MAX( 1, M ) + INCX = 1 + BETA = -0.7D0 + INCY = 1 + LY = ABS( INCY )*N + DO 10 I = 1, LY + Y( I ) = 42.0D0 + DBLE( I ) + YS( I ) = Y( I ) + 10 CONTINUE + RETURN END SUBROUTINE XERBLA( SRNAME, INFO ) + IMPLICIT NONE * * This is a special version of XERBLA to be used only as part of * the test program for testing error exits from the Level 2 BLAS diff --git a/BLAS/TESTING/dblat3.f b/BLAS/TESTING/dblat3.f index 89087d539c..281c428f47 100644 --- a/BLAS/TESTING/dblat3.f +++ b/BLAS/TESTING/dblat3.f @@ -19,10 +19,10 @@ *> Test program for the DOUBLE PRECISION Level 3 Blas. *> *> The program must be driven by a short data file. The first 14 records -*> of the file are read using list-directed input, the last 6 records -*> are read using the format ( A6, L2 ). An annotated example of a data +*> of the file are read using list-directed input, the last 7 records +*> are read using the format ( A7, L2 ). An annotated example of a data *> file can be obtained by deleting the first 3 characters from the -*> following 20 lines: +*> following 21 lines: *> 'dblat3.out' NAME OF SUMMARY OUTPUT FILE *> 6 UNIT NUMBER OF SUMMARY FILE *> 'DBLAT3.SNAP' NAME OF SNAPSHOT OUTPUT FILE @@ -37,12 +37,13 @@ *> 0.0 1.0 0.7 VALUES OF ALPHA *> 3 NUMBER OF VALUES OF BETA *> 0.0 1.0 1.3 VALUES OF BETA -*> DGEMM T PUT F FOR NO TEST. SAME COLUMNS. -*> DSYMM T PUT F FOR NO TEST. SAME COLUMNS. -*> DTRMM T PUT F FOR NO TEST. SAME COLUMNS. -*> DTRSM T PUT F FOR NO TEST. SAME COLUMNS. -*> DSYRK T PUT F FOR NO TEST. SAME COLUMNS. -*> DSYR2K T PUT F FOR NO TEST. SAME COLUMNS. +*> DGEMM T PUT F FOR NO TEST. SAME COLUMNS. +*> DSYMM T PUT F FOR NO TEST. SAME COLUMNS. +*> DTRMM T PUT F FOR NO TEST. SAME COLUMNS. +*> DTRSM T PUT F FOR NO TEST. SAME COLUMNS. +*> DSYRK T PUT F FOR NO TEST. SAME COLUMNS. +*> DSYR2K T PUT F FOR NO TEST. SAME COLUMNS. +*> DGEMMTR T PUT F FOR NO TEST. SAME COLUMNS. *> *> Further Details *> =============== @@ -79,6 +80,7 @@ * * ===================================================================== PROGRAM DBLAT3 + IMPLICIT NONE * * -- Reference BLAS test routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -90,7 +92,7 @@ PROGRAM DBLAT3 INTEGER NIN PARAMETER ( NIN = 5 ) INTEGER NSUBS - PARAMETER ( NSUBS = 6 ) + PARAMETER ( NSUBS = 7 ) DOUBLE PRECISION ZERO, ONE PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0 ) INTEGER NMAX @@ -103,7 +105,7 @@ PROGRAM DBLAT3 LOGICAL FATAL, LTESTT, REWI, SAME, SFATAL, TRACE, $ TSTERR CHARACTER*1 TRANSA, TRANSB - CHARACTER*6 SNAMET + CHARACTER*7 SNAMET CHARACTER*32 SNAPS, SUMMRY * .. Local Arrays .. DOUBLE PRECISION AA( NMAX*NMAX ), AB( NMAX, 2*NMAX ), @@ -114,25 +116,26 @@ PROGRAM DBLAT3 $ G( NMAX ), W( 2*NMAX ) INTEGER IDIM( NIDMAX ) LOGICAL LTEST( NSUBS ) - CHARACTER*6 SNAMES( NSUBS ) + CHARACTER*7 SNAMES( NSUBS ) * .. External Functions .. DOUBLE PRECISION DDIFF LOGICAL LDE EXTERNAL DDIFF, LDE * .. External Subroutines .. EXTERNAL DCHK1, DCHK2, DCHK3, DCHK4, DCHK5, DCHKE, DMMCH + EXTERNAL DCHK6 * .. Intrinsic Functions .. INTRINSIC MAX, MIN * .. Scalars in Common .. INTEGER INFOT, NOUTC LOGICAL LERR, OK - CHARACTER*6 SRNAMT + CHARACTER*7 SRNAMT * .. Common blocks .. COMMON /INFOC/INFOT, NOUTC, OK, LERR COMMON /SRNAMC/SRNAMT * .. Data statements .. DATA SNAMES/'DGEMM ', 'DSYMM ', 'DTRMM ', 'DTRSM ', - $ 'DSYRK ', 'DSYR2K'/ + $ 'DSYRK ', 'DSYR2K', 'DGEMMTR'/ * .. Executable Statements .. * * Read name and unit number for summary output file and open file. @@ -309,7 +312,7 @@ PROGRAM DBLAT3 INFOT = 0 OK = .TRUE. FATAL = .FALSE. - GO TO ( 140, 150, 160, 160, 170, 180 )ISNUM + GO TO ( 140, 150, 160, 160, 170, 180, 185 )ISNUM * Test DGEMM, 01. 140 CALL DCHK1( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE, $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, @@ -338,6 +341,12 @@ PROGRAM DBLAT3 $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, $ NMAX, AB, AA, AS, BB, BS, C, CC, CS, CT, G, W ) GO TO 190 +* Test DGEMMTR, 07. + 185 CALL DCHK6( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE, + $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, + $ NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C, + $ CC, CS, CT, G ) + * 190 IF( FATAL.AND.SFATAL ) $ GO TO 210 @@ -372,7 +381,7 @@ PROGRAM DBLAT3 9992 FORMAT( ' FOR BETA ', 7F6.1 ) 9991 FORMAT( ' AMEND DATA FILE OR INCREASE ARRAY SIZES IN PROGRAM', $ /' ******* TESTS ABANDONED *******' ) - 9990 FORMAT( ' SUBPROGRAM NAME ', A6, ' NOT RECOGNIZED', /' ******* T', + 9990 FORMAT( ' SUBPROGRAM NAME ', A7, ' NOT RECOGNIZED', /' ******* T', $ 'ESTS ABANDONED *******' ) 9989 FORMAT( ' ERROR IN DMMCH - IN-LINE DOT PRODUCTS ARE BEING EVALU', $ 'ATED WRONGLY.', /' DMMCH WAS CALLED WITH TRANSA = ', A1, @@ -380,8 +389,8 @@ PROGRAM DBLAT3 $ 'ERR = ', F12.3, '.', /' THIS MAY BE DUE TO FAULTS IN THE ', $ 'ARITHMETIC OR THE COMPILER.', /' ******* TESTS ABANDONED ', $ '*******' ) - 9988 FORMAT( A6, L2 ) - 9987 FORMAT( 1X, A6, ' WAS NOT TESTED' ) + 9988 FORMAT( A7, L2 ) + 9987 FORMAT( 1X, A7, ' WAS NOT TESTED' ) 9986 FORMAT( /' END OF TESTS' ) 9985 FORMAT( /' ******* FATAL ERROR - TESTS ABANDONED *******' ) 9984 FORMAT( ' ERROR-EXITS WILL NOT BE TESTED' ) @@ -392,6 +401,7 @@ PROGRAM DBLAT3 SUBROUTINE DCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX, $ A, AA, AS, B, BB, BS, C, CC, CS, CT, G ) + IMPLICIT NONE * * Tests DGEMM. * @@ -410,7 +420,7 @@ SUBROUTINE DCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, DOUBLE PRECISION EPS, THRESH INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA LOGICAL FATAL, REWI, TRACE - CHARACTER*6 SNAME + CHARACTER*7 SNAME * .. Array Arguments .. DOUBLE PRECISION A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ), $ AS( NMAX*NMAX ), B( NMAX, NMAX ), @@ -653,15 +663,15 @@ SUBROUTINE DCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, 130 CONTINUE RETURN * - 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', + 9999 FORMAT( ' ', A7, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', $ 'S)' ) 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', $ 'ANGED INCORRECTLY *******' ) - 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', + 9997 FORMAT( ' ', A7, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', $ 'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2, $ ' - SUSPECT *******' ) - 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' ) - 9995 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',''', A1, ''',', + 9996 FORMAT( ' ******* ', A7, ' FAILED ON CALL NUMBER:' ) + 9995 FORMAT( 1X, I6, ': ', A7, '(''', A1, ''',''', A1, ''',', $ 3( I3, ',' ), F4.1, ', A,', I3, ', B,', I3, ',', F4.1, ', ', $ 'C,', I3, ').' ) 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', @@ -673,6 +683,7 @@ SUBROUTINE DCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, SUBROUTINE DCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX, $ A, AA, AS, B, BB, BS, C, CC, CS, CT, G ) + IMPLICIT NONE * * Tests DSYMM. * @@ -691,7 +702,7 @@ SUBROUTINE DCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, DOUBLE PRECISION EPS, THRESH INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA LOGICAL FATAL, REWI, TRACE - CHARACTER*6 SNAME + CHARACTER*7 SNAME * .. Array Arguments .. DOUBLE PRECISION A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ), $ AS( NMAX*NMAX ), B( NMAX, NMAX ), @@ -923,15 +934,15 @@ SUBROUTINE DCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, 120 CONTINUE RETURN * - 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', + 9999 FORMAT( ' ', A7, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', $ 'S)' ) 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', $ 'ANGED INCORRECTLY *******' ) - 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', + 9997 FORMAT( ' ', A7, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', $ 'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2, $ ' - SUSPECT *******' ) - 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' ) - 9995 FORMAT( 1X, I6, ': ', A6, '(', 2( '''', A1, ''',' ), 2( I3, ',' ), + 9996 FORMAT( ' ******* ', A7, ' FAILED ON CALL NUMBER:' ) + 9995 FORMAT( 1X, I6, ': ', A7, '(', 2( '''', A1, ''',' ), 2( I3, ',' ), $ F4.1, ', A,', I3, ', B,', I3, ',', F4.1, ', C,', I3, ') ', $ ' .' ) 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', @@ -943,6 +954,7 @@ SUBROUTINE DCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, SUBROUTINE DCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NMAX, A, AA, AS, $ B, BB, BS, CT, G, C ) + IMPLICIT NONE * * Tests DTRMM and DTRSM. * @@ -961,7 +973,7 @@ SUBROUTINE DCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, DOUBLE PRECISION EPS, THRESH INTEGER NALF, NIDIM, NMAX, NOUT, NTRA LOGICAL FATAL, REWI, TRACE - CHARACTER*6 SNAME + CHARACTER*7 SNAME * .. Array Arguments .. DOUBLE PRECISION A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ), $ AS( NMAX*NMAX ), B( NMAX, NMAX ), @@ -1229,15 +1241,15 @@ SUBROUTINE DCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, 160 CONTINUE RETURN * - 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', + 9999 FORMAT( ' ', A7, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', $ 'S)' ) 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', $ 'ANGED INCORRECTLY *******' ) - 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', + 9997 FORMAT( ' ', A7, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', $ 'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2, $ ' - SUSPECT *******' ) - 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' ) - 9995 FORMAT( 1X, I6, ': ', A6, '(', 4( '''', A1, ''',' ), 2( I3, ',' ), + 9996 FORMAT( ' ******* ', A7, ' FAILED ON CALL NUMBER:' ) + 9995 FORMAT( 1X, I6, ': ', A7, '(', 4( '''', A1, ''',' ), 2( I3, ',' ), $ F4.1, ', A,', I3, ', B,', I3, ') .' ) 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', $ '******' ) @@ -1248,6 +1260,7 @@ SUBROUTINE DCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, SUBROUTINE DCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX, $ A, AA, AS, B, BB, BS, C, CC, CS, CT, G ) + IMPLICIT NONE * * Tests DSYRK. * @@ -1266,7 +1279,7 @@ SUBROUTINE DCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, DOUBLE PRECISION EPS, THRESH INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA LOGICAL FATAL, REWI, TRACE - CHARACTER*6 SNAME + CHARACTER*7 SNAME * .. Array Arguments .. DOUBLE PRECISION A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ), $ AS( NMAX*NMAX ), B( NMAX, NMAX ), @@ -1503,16 +1516,16 @@ SUBROUTINE DCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, 130 CONTINUE RETURN * - 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', + 9999 FORMAT( ' ', A7, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', $ 'S)' ) 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', $ 'ANGED INCORRECTLY *******' ) - 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', + 9997 FORMAT( ' ', A7, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', $ 'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2, $ ' - SUSPECT *******' ) - 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' ) + 9996 FORMAT( ' ******* ', A7, ' FAILED ON CALL NUMBER:' ) 9995 FORMAT( ' THESE ARE THE RESULTS FOR COLUMN ', I3 ) - 9994 FORMAT( 1X, I6, ': ', A6, '(', 2( '''', A1, ''',' ), 2( I3, ',' ), + 9994 FORMAT( 1X, I6, ': ', A7, '(', 2( '''', A1, ''',' ), 2( I3, ',' ), $ F4.1, ', A,', I3, ',', F4.1, ', C,', I3, ') .' ) 9993 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', $ '******' ) @@ -1523,6 +1536,7 @@ SUBROUTINE DCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, SUBROUTINE DCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX, $ AB, AA, AS, BB, BS, C, CC, CS, CT, G, W ) + IMPLICIT NONE * * Tests DSYR2K. * @@ -1541,7 +1555,7 @@ SUBROUTINE DCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, DOUBLE PRECISION EPS, THRESH INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA LOGICAL FATAL, REWI, TRACE - CHARACTER*6 SNAME + CHARACTER*7 SNAME * .. Array Arguments .. DOUBLE PRECISION AA( NMAX*NMAX ), AB( 2*NMAX*NMAX ), $ ALF( NALF ), AS( NMAX*NMAX ), BB( NMAX*NMAX ), @@ -1816,16 +1830,16 @@ SUBROUTINE DCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, 160 CONTINUE RETURN * - 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', + 9999 FORMAT( ' ', A7, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', $ 'S)' ) 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', $ 'ANGED INCORRECTLY *******' ) - 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', + 9997 FORMAT( ' ', A7, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', $ 'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2, $ ' - SUSPECT *******' ) - 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' ) + 9996 FORMAT( ' ******* ', A7, ' FAILED ON CALL NUMBER:' ) 9995 FORMAT( ' THESE ARE THE RESULTS FOR COLUMN ', I3 ) - 9994 FORMAT( 1X, I6, ': ', A6, '(', 2( '''', A1, ''',' ), 2( I3, ',' ), + 9994 FORMAT( 1X, I6, ': ', A7, '(', 2( '''', A1, ''',' ), 2( I3, ',' ), $ F4.1, ', A,', I3, ', B,', I3, ',', F4.1, ', C,', I3, ') ', $ ' .' ) 9993 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', @@ -1835,6 +1849,7 @@ SUBROUTINE DCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * END SUBROUTINE DCHKE( ISNUM, SRNAMT, NOUT ) + IMPLICIT NONE * * Tests the error exits from the Level 3 Blas. * Requires a special version of the error-handling routine XERBLA. @@ -1853,7 +1868,7 @@ SUBROUTINE DCHKE( ISNUM, SRNAMT, NOUT ) * * .. Scalar Arguments .. INTEGER ISNUM, NOUT - CHARACTER*6 SRNAMT + CHARACTER*7 SRNAMT * .. Scalars in Common .. INTEGER INFOT, NOUTC LOGICAL LERR, OK @@ -1866,7 +1881,7 @@ SUBROUTINE DCHKE( ISNUM, SRNAMT, NOUT ) DOUBLE PRECISION A( 2, 1 ), B( 2, 1 ), C( 2, 1 ) * .. External Subroutines .. EXTERNAL CHKXER, DGEMM, DSYMM, DSYR2K, DSYRK, DTRMM, - $ DTRSM + $ DTRSM, DGEMMTR * .. Common blocks .. COMMON /INFOC/INFOT, NOUTC, OK, LERR * .. Executable Statements .. @@ -1882,7 +1897,7 @@ SUBROUTINE DCHKE( ISNUM, SRNAMT, NOUT ) ALPHA = ONE BETA = TWO * - GO TO ( 10, 20, 30, 40, 50, 60 )ISNUM + GO TO ( 10, 20, 30, 40, 50, 60, 70 )ISNUM 10 INFOT = 1 CALL DGEMM( '/', 'N', 0, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) @@ -1967,7 +1982,7 @@ SUBROUTINE DCHKE( ISNUM, SRNAMT, NOUT ) INFOT = 13 CALL DGEMM( 'T', 'T', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) - GO TO 70 + GO TO 80 20 INFOT = 1 CALL DSYMM( '/', 'U', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) @@ -2034,7 +2049,7 @@ SUBROUTINE DCHKE( ISNUM, SRNAMT, NOUT ) INFOT = 12 CALL DSYMM( 'R', 'L', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) - GO TO 70 + GO TO 80 30 INFOT = 1 CALL DTRMM( '/', 'U', 'N', 'N', 0, 0, ALPHA, A, 1, B, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) @@ -2143,7 +2158,7 @@ SUBROUTINE DCHKE( ISNUM, SRNAMT, NOUT ) INFOT = 11 CALL DTRMM( 'R', 'L', 'T', 'N', 2, 0, ALPHA, A, 1, B, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) - GO TO 70 + GO TO 80 40 INFOT = 1 CALL DTRSM( '/', 'U', 'N', 'N', 0, 0, ALPHA, A, 1, B, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) @@ -2252,7 +2267,7 @@ SUBROUTINE DCHKE( ISNUM, SRNAMT, NOUT ) INFOT = 11 CALL DTRSM( 'R', 'L', 'T', 'N', 2, 0, ALPHA, A, 1, B, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) - GO TO 70 + GO TO 80 50 INFOT = 1 CALL DSYRK( '/', 'N', 0, 0, ALPHA, A, 1, BETA, C, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) @@ -2307,7 +2322,7 @@ SUBROUTINE DCHKE( ISNUM, SRNAMT, NOUT ) INFOT = 10 CALL DSYRK( 'L', 'T', 2, 0, ALPHA, A, 1, BETA, C, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) - GO TO 70 + GO TO 80 60 INFOT = 1 CALL DSYR2K( '/', 'N', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) @@ -2374,16 +2389,95 @@ SUBROUTINE DCHKE( ISNUM, SRNAMT, NOUT ) INFOT = 12 CALL DSYR2K( 'L', 'T', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + GO TO 80 + 70 INFOT = 1 + CALL DGEMMTR( '/', 'N', 'N', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 2 + CALL DGEMMTR( 'U', '/', 'N', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 2 + CALL DGEMMTR( 'U', '/', 'T', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 3 + CALL DGEMMTR( 'U', 'N', '/', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 3 + CALL DGEMMTR( 'U', 'T', '/', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 4 + CALL DGEMMTR( 'U', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 4 + CALL DGEMMTR( 'U', 'N', 'T', -1, 0, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 4 + CALL DGEMMTR( 'U', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 4 + CALL DGEMMTR( 'U', 'T', 'T', -1, 0, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 5 + CALL DGEMMTR( 'U', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 5 + CALL DGEMMTR( 'U', 'N', 'T', 0, -1, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 5 + CALL DGEMMTR( 'U', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 5 + CALL DGEMMTR( 'U', 'T', 'T', 0, -1, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 8 + CALL DGEMMTR( 'U', 'N', 'N', 2, 0, ALPHA, A, 1, B, 2, BETA, C, + $ 2 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 8 + CALL DGEMMTR( 'U', 'N', 'T', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 2 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 10 + CALL DGEMMTR( 'U', 'N', 'N', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 10 + CALL DGEMMTR( 'U', 'T', 'N', 0, 2, ALPHA, A, 2, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 10 + CALL DGEMMTR( 'U', 'N', 'T', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 10 + CALL DGEMMTR( 'U', 'T', 'T', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 13 + CALL DGEMMTR( 'U', 'N', 'N', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 13 + CALL DGEMMTR( 'U', 'N', 'T', 2, 0, ALPHA, A, 2, B, 2, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 13 + CALL DGEMMTR( 'U', 'T', 'N', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 13 + CALL DGEMMTR( 'U', 'T', 'T', 2, 0, ALPHA, A, 2, B, 2, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) * - 70 IF( OK )THEN + 80 IF( OK )THEN WRITE( NOUT, FMT = 9999 )SRNAMT ELSE WRITE( NOUT, FMT = 9998 )SRNAMT END IF RETURN * - 9999 FORMAT( ' ', A6, ' PASSED THE TESTS OF ERROR-EXITS' ) - 9998 FORMAT( ' ******* ', A6, ' FAILED THE TESTS OF ERROR-EXITS *****', + 9999 FORMAT( ' ', A7, ' PASSED THE TESTS OF ERROR-EXITS' ) + 9998 FORMAT( ' ******* ', A7, ' FAILED THE TESTS OF ERROR-EXITS *****', $ '**' ) * * End of DCHKE @@ -2391,6 +2485,7 @@ SUBROUTINE DCHKE( ISNUM, SRNAMT, NOUT ) END SUBROUTINE DMAKE( TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, RESET, $ TRANSL ) + IMPLICIT NONE * * Generates values for an M by N matrix A. * Stores the values in the array AA in the data structure required @@ -2505,6 +2600,7 @@ SUBROUTINE DMAKE( TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, RESET, SUBROUTINE DMMCH( TRANSA, TRANSB, M, N, KK, ALPHA, A, LDA, B, LDB, $ BETA, C, LDC, CT, G, CC, LDCC, EPS, ERR, FATAL, $ NOUT, MV ) + IMPLICIT NONE * * Checks the results of the computational tests. * @@ -2625,6 +2721,7 @@ SUBROUTINE DMMCH( TRANSA, TRANSB, M, N, KK, ALPHA, A, LDA, B, LDB, * END LOGICAL FUNCTION LDE( RI, RJ, LR ) + IMPLICIT NONE * * Tests if two arrays are identical. * @@ -2657,6 +2754,7 @@ LOGICAL FUNCTION LDE( RI, RJ, LR ) * END LOGICAL FUNCTION LDERES( TYPE, UPLO, M, N, AA, AS, LDA ) + IMPLICIT NONE * * Tests if selected elements in two arrays are equal. * @@ -2718,6 +2816,7 @@ LOGICAL FUNCTION LDERES( TYPE, UPLO, M, N, AA, AS, LDA ) * END DOUBLE PRECISION FUNCTION DBEG( RESET ) + IMPLICIT NONE * * Generates random numbers uniformly distributed between -0.5 and 0.5. * @@ -2764,6 +2863,7 @@ DOUBLE PRECISION FUNCTION DBEG( RESET ) * END DOUBLE PRECISION FUNCTION DDIFF( X, Y ) + IMPLICIT NONE * * Auxiliary routine for test program for Level 3 Blas. * @@ -2783,6 +2883,7 @@ DOUBLE PRECISION FUNCTION DDIFF( X, Y ) * END SUBROUTINE CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + IMPLICIT NONE * * Tests whether XERBLA has detected an error when it should. * @@ -2797,7 +2898,7 @@ SUBROUTINE CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) * .. Scalar Arguments .. INTEGER INFOT, NOUT LOGICAL LERR, OK - CHARACTER*6 SRNAMT + CHARACTER*7 SRNAMT * .. Executable Statements .. IF( .NOT.LERR )THEN WRITE( NOUT, FMT = 9999 )INFOT, SRNAMT @@ -2807,12 +2908,13 @@ SUBROUTINE CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) RETURN * 9999 FORMAT( ' ***** ILLEGAL VALUE OF PARAMETER NUMBER ', I2, ' NOT D', - $ 'ETECTED BY ', A6, ' *****' ) + $ 'ETECTED BY ', A7, ' *****' ) * * End of CHKXER * END SUBROUTINE XERBLA( SRNAME, INFO ) + IMPLICIT NONE * * This is a special version of XERBLA to be used only as part of * the test program for testing error exits from the Level 3 BLAS @@ -2833,14 +2935,16 @@ SUBROUTINE XERBLA( SRNAME, INFO ) * * .. Scalar Arguments .. INTEGER INFO - CHARACTER*6 SRNAME + CHARACTER*(*) SRNAME * .. Scalars in Common .. INTEGER INFOT, NOUT LOGICAL LERR, OK - CHARACTER*6 SRNAMT + CHARACTER*7 SRNAMT * .. Common blocks .. COMMON /INFOC/INFOT, NOUT, OK, LERR COMMON /SRNAMC/SRNAMT +* .. Locals .. + INTEGER SRLEN * .. Executable Statements .. LERR = .TRUE. IF( INFO.NE.INFOT )THEN @@ -2851,7 +2955,8 @@ SUBROUTINE XERBLA( SRNAME, INFO ) END IF OK = .FALSE. END IF - IF( SRNAME.NE.SRNAMT )THEN + SRLEN = MIN(LEN_TRIM(SRNAME), LEN_TRIM(SRNAMT)) + IF( SRNAME(1:SRLEN).NE.SRNAMT(1:SRLEN) )THEN WRITE( NOUT, FMT = 9998 )SRNAME, SRNAMT OK = .FALSE. END IF @@ -2859,11 +2964,430 @@ SUBROUTINE XERBLA( SRNAME, INFO ) * 9999 FORMAT( ' ******* XERBLA WAS CALLED WITH INFO = ', I6, ' INSTEAD', $ ' OF ', I2, ' *******' ) - 9998 FORMAT( ' ******* XERBLA WAS CALLED WITH SRNAME = ', A6, ' INSTE', - $ 'AD OF ', A6, ' *******' ) + 9998 FORMAT( ' ******* XERBLA WAS CALLED WITH SRNAME = ', A7, ' INSTE', + $ 'AD OF ', A7, ' *******' ) 9997 FORMAT( ' ******* XERBLA WAS CALLED WITH INFO = ', I6, $ ' *******' ) * * End of XERBLA * END + + SUBROUTINE DCHK6( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, + $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX, + $ A, AA, AS, B, BB, BS, C, CC, CS, CT, G ) + IMPLICIT NONE +* +* Tests DGEMMTR. +* +* Auxiliary routine for test program for Level 3 Blas. +* +* -- Written on 19-July-2023. +* Martin Koehler, MPI Magdeburg +* +* .. Parameters .. + DOUBLE PRECISION ZERO + PARAMETER ( ZERO = 0.0D0 ) +* .. Scalar Arguments .. + DOUBLE PRECISION EPS, THRESH + INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA + LOGICAL FATAL, REWI, TRACE + CHARACTER*7 SNAME +* .. Array Arguments .. + DOUBLE PRECISION A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ), + $ AS( NMAX*NMAX ), B( NMAX, NMAX ), + $ BB( NMAX*NMAX ), BET( NBET ), BS( NMAX*NMAX ), + $ C( NMAX, NMAX ), CC( NMAX*NMAX ), + $ CS( NMAX*NMAX ), CT( NMAX ), G( NMAX ) + INTEGER IDIM( NIDIM ) +* .. Local Scalars .. + DOUBLE PRECISION ALPHA, ALS, BETA, BLS, ERR, ERRMAX + INTEGER I, IA, IB, ICA, ICB, IK, IN, K, KS, LAA, + $ LBB, LCC, LDA, LDAS, LDB, LDBS, LDC, LDCS, + $ MA, MB, N, NA, NARGS, NB, NC, NS, IS + LOGICAL NULL, RESET, SAME, TRANA, TRANB + CHARACTER*1 TRANAS, TRANBS, TRANSA, TRANSB, UPLO, UPLOS + CHARACTER*3 ICH + CHARACTER*2 ISHAPE +* .. Local Arrays .. + LOGICAL ISAME( 13 ) +* .. External Functions .. + LOGICAL LDE, LDERES + EXTERNAL LDE, LDERES +* .. External Subroutines .. + EXTERNAL DGEMMTR, DMAKE, DMMTCH +* .. Intrinsic Functions .. + INTRINSIC MAX +* .. Scalars in Common .. + INTEGER INFOT, NOUTC + LOGICAL LERR, OK +* .. Common blocks .. + COMMON /INFOC/INFOT, NOUTC, OK, LERR +* .. Data statements .. + DATA ICH/'NTC'/ + DATA ISHAPE/'UL'/ +* .. Executable Statements .. +* + NARGS = 13 + NC = 0 + RESET = .TRUE. + ERRMAX = ZERO +* + DO 100 IN = 1, NIDIM + N = IDIM( IN ) +* Set LDC to 1 more than minimum value if room. + LDC = N + IF( LDC.LT.NMAX ) + $ LDC = LDC + 1 +* Skip tests if not enough room. + IF( LDC.GT.NMAX ) + $ GO TO 100 + LCC = LDC*N + NULL = N.LE.0 +* + DO 90 IK = 1, NIDIM + K = IDIM( IK ) +* + DO 80 ICA = 1, 3 + TRANSA = ICH( ICA: ICA ) + TRANA = TRANSA.EQ.'T'.OR.TRANSA.EQ.'C' +* + IF( TRANA )THEN + MA = K + NA = N + ELSE + MA = N + NA = K + END IF +* Set LDA to 1 more than minimum value if room. + LDA = MA + IF( LDA.LT.NMAX ) + $ LDA = LDA + 1 +* Skip tests if not enough room. + IF( LDA.GT.NMAX ) + $ GO TO 80 + LAA = LDA*NA +* +* Generate the matrix A. +* + CALL DMAKE( 'GE', ' ', ' ', MA, NA, A, NMAX, AA, LDA, + $ RESET, ZERO ) +* + DO 70 ICB = 1, 3 + TRANSB = ICH( ICB: ICB ) + TRANB = TRANSB.EQ.'T'.OR.TRANSB.EQ.'C' +* + IF( TRANB )THEN + MB = N + NB = K + ELSE + MB = K + NB = N + END IF +* Set LDB to 1 more than minimum value if room. + LDB = MB + IF( LDB.LT.NMAX ) + $ LDB = LDB + 1 +* Skip tests if not enough room. + IF( LDB.GT.NMAX ) + $ GO TO 70 + LBB = LDB*NB +* +* Generate the matrix B. +* + CALL DMAKE( 'GE', ' ', ' ', MB, NB, B, NMAX, BB, + $ LDB, RESET, ZERO ) +* + DO 60 IA = 1, NALF + ALPHA = ALF( IA ) +* + DO 50 IB = 1, NBET + BETA = BET( IB ) + + DO 45 IS = 1, 2 + UPLO = ISHAPE( IS: IS ) + +* +* Generate the matrix C. +* + CALL DMAKE( 'GE', UPLO, ' ', N, N, C, + $ NMAX, CC, LDC, RESET, ZERO ) +* + NC = NC + 1 +* +* Save every datum before calling the +* subroutine. +* + UPLOS = UPLO + TRANAS = TRANSA + TRANBS = TRANSB + NS = N + KS = K + ALS = ALPHA + DO 10 I = 1, LAA + AS( I ) = AA( I ) + 10 CONTINUE + LDAS = LDA + DO 20 I = 1, LBB + BS( I ) = BB( I ) + 20 CONTINUE + LDBS = LDB + BLS = BETA + DO 30 I = 1, LCC + CS( I ) = CC( I ) + 30 CONTINUE + LDCS = LDC +* +* Call the subroutine. +* + IF( TRACE ) + $ WRITE( NTRA, FMT = 9995 )NC, SNAME, + $ UPLO, TRANSA, TRANSB, N, K, ALPHA, LDA, + $ LDB, BETA, LDC + IF( REWI ) + $ REWIND NTRA + CALL DGEMMTR( UPLO, TRANSA, TRANSB, N, + $ K, ALPHA, AA, LDA, BB, LDB, + $ BETA, CC, LDC ) +* +* Check if error-exit was taken incorrectly. +* + IF( .NOT.OK )THEN + WRITE( NOUT, FMT = 9994 ) + FATAL = .TRUE. + GO TO 120 + END IF +* +* See what data changed inside subroutines. +* + ISAME( 1 ) = UPLO.EQ.UPLOS + ISAME( 2 ) = TRANSA.EQ.TRANAS + ISAME( 3 ) = TRANSB.EQ.TRANBS + ISAME( 4 ) = NS.EQ.N + ISAME( 5 ) = KS.EQ.K + ISAME( 6 ) = ALS.EQ.ALPHA + ISAME( 7 ) = LDE( AS, AA, LAA ) + ISAME( 8 ) = LDAS.EQ.LDA + ISAME( 9 ) = LDE( BS, BB, LBB ) + ISAME( 10 ) = LDBS.EQ.LDB + ISAME( 11 ) = BLS.EQ.BETA + IF( NULL )THEN + ISAME( 12 ) = LDE( CS, CC, LCC ) + ELSE + ISAME( 12 ) = LDERES( 'GE', ' ', N, N, + $ CS, CC, LDC ) + END IF + ISAME( 13 ) = LDCS.EQ.LDC +* +* If data was incorrectly changed, report +* and return. +* + SAME = .TRUE. + DO 40 I = 1, NARGS + SAME = SAME.AND.ISAME( I ) + IF( .NOT.ISAME( I ) ) + $ WRITE( NOUT, FMT = 9998 )I + 40 CONTINUE + IF( .NOT.SAME )THEN + FATAL = .TRUE. + GO TO 120 + END IF +* + IF( .NOT.NULL )THEN +* +* Check the result. +* + CALL DMMTCH( UPLO, TRANSA, TRANSB, + $ N, K, + $ ALPHA, A, NMAX, B, NMAX, BETA, + $ C, NMAX, CT, G, CC, LDC, EPS, + $ ERR, FATAL, NOUT, .TRUE. ) + ERRMAX = MAX( ERRMAX, ERR ) +* If got really bad answer, report and +* return. + IF( FATAL ) + $ GO TO 120 + END IF +* + 45 CONTINUE +* + 50 CONTINUE +* + 60 CONTINUE +* + 70 CONTINUE +* + 80 CONTINUE +* + 90 CONTINUE +* + 100 CONTINUE +* +* +* Report result. +* + IF( ERRMAX.LT.THRESH )THEN + WRITE( NOUT, FMT = 9999 )SNAME, NC + ELSE + WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX + END IF + GO TO 130 +* + 120 CONTINUE + WRITE( NOUT, FMT = 9996 )SNAME + WRITE( NOUT, FMT = 9995 )NC, SNAME, UPLO, TRANSA, TRANSB, N, K, + $ ALPHA, LDA, LDB, BETA, LDC +* + 130 CONTINUE + RETURN +* + 9999 FORMAT( ' ', A7, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', + $ 'S)' ) + 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', + $ 'ANGED INCORRECTLY *******' ) + 9997 FORMAT( ' ', A7, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', + $ 'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2, + $ ' - SUSPECT *******' ) + 9996 FORMAT( ' ******* ', A7, ' FAILED ON CALL NUMBER:' ) + 9995 FORMAT( 1X, I6, ': ', A7, '(''',A1, ''',''',A1, ''',''', A1,''',', + $ 2( I3, ',' ), F4.1, ', A,', I3, ', B,', I3, ',', F4.1, ', ', + $ 'C,', I3, ').' ) + 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', + $ '******' ) +* +* End of DCHK6 +* + END + + SUBROUTINE DMMTCH( UPLO, TRANSA, TRANSB, N, KK, ALPHA, A, LDA, + $ B, LDB, BETA, C, LDC, CT, G, CC, LDCC, EPS, ERR, + $ FATAL, NOUT, MV ) + IMPLICIT NONE +* +* Checks the results of the computational tests. +* +* Auxiliary routine for test program for Level 3 Blas. (DGEMMTR) +* +* -- Written on 19-July-2023. +* Martin Koehler, MPI Magdeburg +* +* .. Parameters .. + DOUBLE PRECISION ZERO, ONE + PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0 ) +* .. Scalar Arguments .. + DOUBLE PRECISION ALPHA, BETA, EPS, ERR + INTEGER KK, LDA, LDB, LDC, LDCC, N, NOUT + LOGICAL FATAL, MV + CHARACTER*1 UPLO, TRANSA, TRANSB +* .. Array Arguments .. + DOUBLE PRECISION A( LDA, * ), B( LDB, * ), C( LDC, * ), + $ CC( LDCC, * ), CT( * ), G( * ) +* .. Local Scalars .. + DOUBLE PRECISION ERRI + INTEGER I, J, K, ISTART, ISTOP + LOGICAL TRANA, TRANB, UPPER +* .. Intrinsic Functions .. + INTRINSIC ABS, MAX, SQRT +* .. Executable Statements .. + UPPER = UPLO.EQ.'U' + TRANA = TRANSA.EQ.'T'.OR.TRANSA.EQ.'C' + TRANB = TRANSB.EQ.'T'.OR.TRANSB.EQ.'C' +* +* Compute expected result, one column at a time, in CT using data +* in A, B and C. +* Compute gauges in G. +* + ISTART = 1 + ISTOP = N + + DO 120 J = 1, N +* + IF ( UPPER ) THEN + ISTART = 1 + ISTOP = J + ELSE + ISTART = J + ISTOP = N + END IF + DO 10 I = ISTART, ISTOP + CT( I ) = ZERO + G( I ) = ZERO + 10 CONTINUE + IF( .NOT.TRANA.AND..NOT.TRANB )THEN + DO 30 K = 1, KK + DO 20 I = ISTART, ISTOP + CT( I ) = CT( I ) + A( I, K )*B( K, J ) + G( I ) = G( I ) + ABS( A( I, K ) )*ABS( B( K, J ) ) + 20 CONTINUE + 30 CONTINUE + ELSE IF( TRANA.AND..NOT.TRANB )THEN + DO 50 K = 1, KK + DO 40 I = ISTART, ISTOP + CT( I ) = CT( I ) + A( K, I )*B( K, J ) + G( I ) = G( I ) + ABS( A( K, I ) )*ABS( B( K, J ) ) + 40 CONTINUE + 50 CONTINUE + ELSE IF( .NOT.TRANA.AND.TRANB )THEN + DO 70 K = 1, KK + DO 60 I = ISTART, ISTOP + CT( I ) = CT( I ) + A( I, K )*B( J, K ) + G( I ) = G( I ) + ABS( A( I, K ) )*ABS( B( J, K ) ) + 60 CONTINUE + 70 CONTINUE + ELSE IF( TRANA.AND.TRANB )THEN + DO 90 K = 1, KK + DO 80 I = ISTART, ISTOP + CT( I ) = CT( I ) + A( K, I )*B( J, K ) + G( I ) = G( I ) + ABS( A( K, I ) )*ABS( B( J, K ) ) + 80 CONTINUE + 90 CONTINUE + END IF + DO 100 I = ISTART, ISTOP + CT( I ) = ALPHA*CT( I ) + BETA*C( I, J ) + G( I ) = ABS( ALPHA )*G( I ) + ABS( BETA )*ABS( C( I, J ) ) + 100 CONTINUE +* +* Compute the error ratio for this result. +* + ERR = ZERO + DO 110 I = ISTART, ISTOP + ERRI = ABS( CT( I ) - CC( I, J ) )/EPS + IF( G( I ).NE.ZERO ) + $ ERRI = ERRI/G( I ) + ERR = MAX( ERR, ERRI ) + IF( ERR*SQRT( EPS ).GE.ONE ) + $ GO TO 130 + 110 CONTINUE +* + 120 CONTINUE +* +* If the loop completes, all results are at least half accurate. + GO TO 150 +* +* Report fatal error. +* + 130 FATAL = .TRUE. + WRITE( NOUT, FMT = 9999 ) + DO 140 I = ISTART, ISTOP + IF( MV )THEN + WRITE( NOUT, FMT = 9998 )I, CT( I ), CC( I, J ) + ELSE + WRITE( NOUT, FMT = 9998 )I, CC( I, J ), CT( I ) + END IF + 140 CONTINUE + IF( N.GT.1 ) + $ WRITE( NOUT, FMT = 9997 )J +* + 150 CONTINUE + RETURN +* + 9999 FORMAT( ' ******* FATAL ERROR - COMPUTED RESULT IS LESS THAN HAL', + $ 'F ACCURATE *******', /' EXPECTED RESULT COMPU', + $ 'TED RESULT' ) + 9998 FORMAT( 1X, I7, 2G18.6 ) + 9997 FORMAT( ' THESE ARE THE RESULTS FOR COLUMN ', I3 ) +* +* End of DMMTCH +* + END + diff --git a/BLAS/TESTING/dblat3.in b/BLAS/TESTING/dblat3.in index 0098f3e521..30b74c6e40 100644 --- a/BLAS/TESTING/dblat3.in +++ b/BLAS/TESTING/dblat3.in @@ -12,9 +12,10 @@ T LOGICAL FLAG, T TO TEST ERROR EXITS. 0.0 1.0 0.7 VALUES OF ALPHA 3 NUMBER OF VALUES OF BETA 0.0 1.0 1.3 VALUES OF BETA -DGEMM T PUT F FOR NO TEST. SAME COLUMNS. -DSYMM T PUT F FOR NO TEST. SAME COLUMNS. -DTRMM T PUT F FOR NO TEST. SAME COLUMNS. -DTRSM T PUT F FOR NO TEST. SAME COLUMNS. -DSYRK T PUT F FOR NO TEST. SAME COLUMNS. -DSYR2K T PUT F FOR NO TEST. SAME COLUMNS. +DGEMM T PUT F FOR NO TEST. SAME COLUMNS. +DSYMM T PUT F FOR NO TEST. SAME COLUMNS. +DTRMM T PUT F FOR NO TEST. SAME COLUMNS. +DTRSM T PUT F FOR NO TEST. SAME COLUMNS. +DSYRK T PUT F FOR NO TEST. SAME COLUMNS. +DSYR2K T PUT F FOR NO TEST. SAME COLUMNS. +DGEMMTR T PUT F FOR NO TEST. SAME COLUMNS. diff --git a/BLAS/TESTING/sblat1.f b/BLAS/TESTING/sblat1.f index d81496b6a3..78008e4779 100644 --- a/BLAS/TESTING/sblat1.f +++ b/BLAS/TESTING/sblat1.f @@ -34,6 +34,7 @@ * * ===================================================================== PROGRAM SBLAT1 + IMPLICIT NONE * * -- Reference BLAS test routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -58,7 +59,7 @@ PROGRAM SBLAT1 DATA SFAC/9.765625E-4/ * .. Executable Statements .. WRITE (NOUT,99999) - DO 20 IC = 1, 13 + DO 20 IC = 1, 14 ICASE = IC CALL HEADER * @@ -76,7 +77,8 @@ PROGRAM SBLAT1 + ICASE.EQ.10) THEN CALL CHECK1(SFAC) ELSE IF (ICASE.EQ.1 .OR. ICASE.EQ.2 .OR. ICASE.EQ.5 .OR. - + ICASE.EQ.6 .OR. ICASE.EQ.12 .OR. ICASE.EQ.13) THEN + + ICASE.EQ.6 .OR. ICASE.EQ.12 .OR. ICASE.EQ.13 .OR. + + ICASE.EQ.14 ) THEN CALL CHECK2(SFAC) ELSE IF (ICASE.EQ.4) THEN CALL CHECK3(SFAC) @@ -100,7 +102,7 @@ SUBROUTINE HEADER INTEGER ICASE, INCX, INCY, N LOGICAL PASS * .. Local Arrays .. - CHARACTER*6 L(13) + CHARACTER*6 L(14) * .. Common blocks .. COMMON /COMBLA/ICASE, N, INCX, INCY, PASS * .. Data statements .. @@ -117,6 +119,8 @@ SUBROUTINE HEADER DATA L(11)/'SROTMG'/ DATA L(12)/'SROTM '/ DATA L(13)/'SDSDOT'/ + DATA L(14)/'SAXPBY'/ + * .. Executable Statements .. WRITE (NOUT,99999) ICASE, L(ICASE) RETURN @@ -248,7 +252,8 @@ SUBROUTINE CHECK0(SFAC) SUBROUTINE CHECK1(SFAC) * .. Parameters .. INTEGER NOUT - PARAMETER (NOUT=6) + REAL THRESH + PARAMETER (NOUT=6, THRESH=10.0E0) * .. Scalar Arguments .. REAL SFAC * .. Scalars in Common .. @@ -266,7 +271,7 @@ SUBROUTINE CHECK1(SFAC) INTEGER ISAMAX EXTERNAL SASUM, SNRM2, ISAMAX * .. External Subroutines .. - EXTERNAL ITEST1, SSCAL, STEST, STEST1 + EXTERNAL ITEST1, SB1NRM2, SSCAL, STEST, STEST1 * .. Intrinsic Functions .. INTRINSIC MAX * .. Common blocks .. @@ -319,6 +324,10 @@ SUBROUTINE CHECK1(SFAC) * IF (ICASE.EQ.7) THEN * .. SNRM2 .. +* Test scaling when some entries are tiny or huge + CALL SB1NRM2(N,(INCX-2)*2,THRESH) + CALL SB1NRM2(N,INCX,THRESH) +* Test with hardcoded mid range entries STEMP(1) = DTRUE1(NP1) CALL STEST1(SNRM2(N,SX,INCX),STEMP(1),STEMP,SFAC) ELSE IF (ICASE.EQ.8) THEN @@ -369,7 +378,7 @@ SUBROUTINE CHECK2(SFAC) INTEGER ICASE, INCX, INCY, N LOGICAL PASS * .. Local Scalars .. - REAL SA + REAL SA,SB INTEGER I, J, KI, KN, KNI, KPAR, KSIZE, LENX, LENY, $ LINCX, LINCY, MX, MY * .. Local Arrays .. @@ -381,13 +390,13 @@ SUBROUTINE CHECK2(SFAC) $ DT19XB(7,4,4), DT19XC(7,4,4),DT19XD(7,4,4), $ DT19Y(7,4,16), DT19YA(7,4,4),DT19YB(7,4,4), $ DT19YC(7,4,4), DT19YD(7,4,4), DTEMP(5), - $ ST7B(4,4), STY0(1), SX0(1), SY0(1) + $ ST7B(4,4), STY0(1), SX0(1), SY0(1), DT20(7,4,4) INTEGER INCXS(4), INCYS(4), LENS(4,2), NS(4) * .. External Functions .. REAL SDOT, SDSDOT EXTERNAL SDOT, SDSDOT * .. External Subroutines .. - EXTERNAL SAXPY, SCOPY, SROTM, SSWAP, STEST, STEST1 + EXTERNAL SAXPY, SAXPBY,SCOPY, SROTM, SSWAP, STEST, STEST1 * .. Intrinsic Functions .. INTRINSIC ABS, MIN * .. Common blocks .. @@ -401,6 +410,7 @@ SUBROUTINE CHECK2(SFAC) B (DT19Y(1,1,13),DT19YD(1,1,1)) DATA SA/0.3E0/ + DATA SB/0.5E0/ DATA INCXS/1, 2, -2, -1/ DATA INCYS/1, -2, 1, -2/ DATA LENS/1, 1, 2, 4, 1, 1, 3, 7/ @@ -619,6 +629,27 @@ SUBROUTINE CHECK2(SFAC) M .7E0, -.9E0, 1.2E0, .7E0, -1.5E0, .2E0, 1.6E0, N 1.7E0, -.9E0, .5E0, .7E0, -1.6E0, .2E0, 2.4E0, O -2.6E0, -.9E0, -1.3E0, .7E0, 2.9E0, .2E0, -4.0E0 / + DATA DT20/0.5E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, + + 0.0E0, 0.43E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, + + 0.0E0, 0.0E0, 0.43E0, -0.42E0, 0.0E0, 0.0E0, + + 0.0E0, 0.0E0, 0.0E0, 0.43E0, -0.42E0, 0.0E0, + + 0.59E0, 0.0E0, 0.0E0, 0.0E0, 0.5E0, 0.0E0, + + 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.43E0, + + 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, + + 0.1E0, -0.9E0, 0.33E0, 0.0E0, 0.0E0, 0.0E0, + + 0.0E0, 0.13E0, -0.9E0, 0.42E0, 0.7E0, -0.45E0, + + 0.2E0, 0.58E0, 0.5E0, 0.0E0, 0.0E0, 0.0E0, + + 0.0E0, 0.0E0, 0.0E0, 0.43E0, 0.0E0, 0.0E0, + + 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.1E0, -0.27E0, + + 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.13E0, + + -0.18E0, 0.00E0, 0.53E0, 0.0E0, 0.0E0, 0.0E0, + + 0.5E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, + + 0.43E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, + + 0.0E0, 0.43E0, -0.9E0, 0.18E0, 0.0E0, 0.0E0, + + 0.0E0, 0.0E0, 0.43E0, -0.9E0, 0.18E0, 0.7E0, + + -0.45E0, 0.2E0, 0.64E0/ + + * * .. Executable Statements .. * @@ -650,6 +681,14 @@ SUBROUTINE CHECK2(SFAC) STY(J) = DT8(J,KN,KI) 40 CONTINUE CALL STEST(LENY,SY,STY,SSIZE2(1,KSIZE),SFAC) + ELSE IF (ICASE.EQ.14) THEN +* .. SAXPBY .. + CALL SAXPBY(N,SA,SX,INCX,SB,SY,INCY) + DO 50 J = 1, LENY + STY(J) = DT20(J,KN,KI) + 50 CONTINUE + CALL STEST(LENY,SY,STY,SSIZE2(1,KSIZE),SFAC) + ELSE IF (ICASE.EQ.5) THEN * .. SCOPY .. DO 60 I = 1, 7 @@ -1080,3 +1119,218 @@ SUBROUTINE ITEST1(ICOMP,ITRUE) * End of ITEST1 * END + SUBROUTINE SB1NRM2(N,INCX,THRESH) +* Compare NRM2 with a reference computation using combinations +* of the following values: +* +* 0, very small, small, ulp, 1, 1/ulp, big, very big, infinity, NaN +* +* one of these values is used to initialize x(1) and x(2:N) is +* filled with random values from [-1,1] scaled by another of +* these values. +* +* This routine is adapted from the test suite provided by +* Anderson E. (2017) +* Algorithm 978: Safe Scaling in the Level 1 BLAS +* ACM Trans Math Softw 44:1--28 +* https://doi.org/10.1145/3061665 +* + IMPLICIT NONE +* .. Scalar Arguments .. + INTEGER INCX, N + REAL THRESH +* +* ===================================================================== +* .. Parameters .. + INTEGER NMAX, NOUT, NV + PARAMETER (NMAX=20, NOUT=6, NV=10) + REAL HALF, ONE, TWO, ZERO + PARAMETER (HALF=0.5E+0, ONE=1.0E+0, TWO= 2.0E+0, + & ZERO=0.0E+0) +* .. External Functions .. + REAL SNRM2 + EXTERNAL SNRM2 +* .. Intrinsic Functions .. + INTRINSIC ABS, MAX, MIN, REAL, SQRT +* .. Model parameters .. + REAL BIGNUM, SAFMAX, SAFMIN, SMLNUM, ULP + PARAMETER (BIGNUM=0.1014120480E+32, + & SAFMAX=0.8507059173E+38, + & SAFMIN=0.1175494351E-37, + & SMLNUM=0.9860761315E-31, + & ULP=0.1192092896E-06) +* .. Local Scalars .. + REAL ROGUE, SNRM, TRAT, V0, V1, WORKSSQ, Y1, Y2, + & YMAX, YMIN, YNRM, ZNRM + INTEGER I, IV, IW, IX + LOGICAL FIRST +* .. Local Arrays .. + REAL VALUES(NV), WORK(NMAX), X(NMAX), Z(NMAX) +* .. Executable Statements .. + VALUES(1) = ZERO + VALUES(2) = TWO*SAFMIN + VALUES(3) = SMLNUM + VALUES(4) = ULP + VALUES(5) = ONE + VALUES(6) = ONE / ULP + VALUES(7) = BIGNUM + VALUES(8) = SAFMAX + VALUES(9) = SXVALS(V0,2) + VALUES(10) = SXVALS(V0,3) + ROGUE = -1234.5678E+0 + FIRST = .TRUE. +* +* Check that the arrays are large enough +* + IF (N*ABS(INCX).GT.NMAX) THEN + WRITE (NOUT,99) "SNRM2", NMAX, INCX, N, N*ABS(INCX) + RETURN + END IF +* +* Zero-sized inputs are tested in STEST1. + IF (N.LE.0) THEN + RETURN + END IF +* +* Generate (N-1) values in (-1,1). +* + DO I = 2, N + CALL RANDOM_NUMBER(WORK(I)) + WORK(I) = ONE - TWO*WORK(I) + END DO +* +* Compute the sum of squares of the random values +* by an unscaled algorithm. +* + WORKSSQ = ZERO + DO I = 2, N + WORKSSQ = WORKSSQ + WORK(I)*WORK(I) + END DO +* +* Construct the test vector with one known value +* and the rest from the random work array multiplied +* by a scaling factor. +* + DO IV = 1, NV + V0 = VALUES(IV) + IF (ABS(V0).GT.ONE) THEN + V0 = V0*HALF + END IF + Z(1) = V0 + DO IW = 1, NV + V1 = VALUES(IW) + IF (ABS(V1).GT.ONE) THEN + V1 = (V1*HALF) / SQRT(REAL(N)) + END IF + DO I = 2, N + Z(I) = V1*WORK(I) + END DO +* +* Compute the expected value of the 2-norm +* + Y1 = ABS(V0) + IF (N.GT.1) THEN + Y2 = ABS(V1)*SQRT(WORKSSQ) + ELSE + Y2 = ZERO + END IF + YMIN = MIN(Y1, Y2) + YMAX = MAX(Y1, Y2) +* +* Expected value is NaN if either is NaN. The test +* for YMIN == YMAX avoids further computation if both +* are infinity. +* + IF ((Y1.NE.Y1).OR.(Y2.NE.Y2)) THEN +* add to propagate NaN + YNRM = Y1 + Y2 + ELSE IF (YMIN == YMAX) THEN + YNRM = SQRT(TWO)*YMAX + ELSE IF (YMAX == ZERO) THEN + YNRM = ZERO + ELSE + YNRM = YMAX*SQRT(ONE + (YMIN / YMAX)**2) + END IF +* +* Fill the input array to SNRM2 with steps of incx +* + DO I = 1, N + X(I) = ROGUE + END DO + IX = 1 + IF (INCX.LT.0) IX = 1 - (N-1)*INCX + DO I = 1, N + X(IX) = Z(I) + IX = IX + INCX + END DO +* +* Call SNRM2 to compute the 2-norm +* + SNRM = SNRM2(N,X,INCX) +* +* Compare SNRM and ZNRM. Roundoff error grows like O(n) +* in this implementation so we scale the test ratio accordingly. +* + IF (INCX.EQ.0) THEN + ZNRM = SQRT(REAL(N))*ABS(X(1)) + ELSE + ZNRM = YNRM + END IF +* +* The tests for NaN rely on the compiler not being overly +* aggressive and removing the statements altogether. + IF ((SNRM.NE.SNRM).OR.(ZNRM.NE.ZNRM)) THEN + IF ((SNRM.NE.SNRM).NEQV.(ZNRM.NE.ZNRM)) THEN + TRAT = ONE / ULP + ELSE + TRAT = ZERO + END IF + ELSE IF (SNRM == ZNRM) THEN + TRAT = ZERO + ELSE IF (ZNRM == ZERO) THEN + TRAT = SNRM / ULP + ELSE + TRAT = (ABS(SNRM-ZNRM) / ZNRM) / (REAL(N)*ULP) + END IF + IF ((TRAT.NE.TRAT).OR.(TRAT.GE.THRESH)) THEN + IF (FIRST) THEN + FIRST = .FALSE. + WRITE(NOUT,99999) + END IF + WRITE (NOUT,98) "SNRM2", N, INCX, IV, IW, TRAT + END IF + END DO + END DO +99999 FORMAT (' FAIL') + 99 FORMAT ( ' Not enough space to test ', A6, ': NMAX = ',I6, + + ', INCX = ',I6,/,' N = ',I6,', must be at least ',I6 ) + 98 FORMAT( 1X, A6, ': N=', I6,', INCX=', I4, ', IV=', I2, ', IW=', + + I2, ', test=', E15.8 ) + RETURN + CONTAINS + REAL FUNCTION SXVALS(XX,K) +* .. Scalar Arguments .. + REAL XX + INTEGER K +* .. Parameters .. + REAL ZERO + PARAMETER (ZERO=0.0E+0) +* .. Local Scalars .. + REAL X, Y, Z +* .. Intrinsic Functions .. + INTRINSIC HUGE +* .. Executable Statements .. + X = ZERO + Y = HUGE(XX) + Z = Y*Y + IF (K.EQ.1) THEN + X = -Z + ELSE IF (K.EQ.2) THEN + X = Z + ELSE IF (K.EQ.3) THEN + X = Z / Z + END IF + SXVALS = X + RETURN + END + END diff --git a/BLAS/TESTING/sblat2.f b/BLAS/TESTING/sblat2.f index 17962a99cd..ff5acffa83 100644 --- a/BLAS/TESTING/sblat2.f +++ b/BLAS/TESTING/sblat2.f @@ -99,6 +99,7 @@ * * ===================================================================== PROGRAM SBLAT2 + IMPLICIT NONE * * -- Reference BLAS test routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -428,6 +429,7 @@ SUBROUTINE SCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF, NBET, $ BET, NINC, INC, NMAX, INCMAX, A, AA, AS, X, XX, $ XS, Y, YY, YS, YT, G ) + IMPLICIT NONE * * Tests SGEMV and SGBMV. * @@ -469,7 +471,7 @@ SUBROUTINE SCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, LOGICAL LSE, LSERES EXTERNAL LSE, LSERES * .. External Subroutines .. - EXTERNAL SGBMV, SGEMV, SMAKE, SMVCH + EXTERNAL SGBMV, SGEMV, SMAKE, SMVCH, SREGR1 * .. Intrinsic Functions .. INTRINSIC ABS, MAX, MIN * .. Scalars in Common .. @@ -724,6 +726,34 @@ SUBROUTINE SCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * 120 CONTINUE * +* Regression test to verify preservation of y when m zero, n nonzero. +* + CALL SREGR1( TRANS, M, N, LY, KL, KU, ALPHA, AA, LDA, XX, INCX, + $ BETA, YY, INCY, YS ) + IF( FULL )THEN + IF( TRACE ) + $ WRITE( NTRA, FMT = 9994 )NC, SNAME, TRANS, M, N, ALPHA, LDA, + $ INCX, BETA, INCY + IF( REWI ) + $ REWIND NTRA + CALL SGEMV( TRANS, M, N, ALPHA, AA, LDA, XX, INCX, BETA, YY, + $ INCY ) + ELSE IF( BANDED )THEN + IF( TRACE ) + $ WRITE( NTRA, FMT = 9995 )NC, SNAME, TRANS, M, N, KL, KU, + $ ALPHA, LDA, INCX, BETA, INCY + IF( REWI ) + $ REWIND NTRA + CALL SGBMV( TRANS, M, N, KL, KU, ALPHA, AA, LDA, XX, INCX, + $ BETA, YY, INCY ) + END IF + NC = NC + 1 + IF( .NOT.LSE( YS, YY, LY ) )THEN + WRITE( NOUT, FMT = 9998 )NARGS - 1 + FATAL = .TRUE. + GO TO 130 + END IF +* * Report result. * IF( ERRMAX.LT.THRESH )THEN @@ -769,6 +799,7 @@ SUBROUTINE SCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF, NBET, $ BET, NINC, INC, NMAX, INCMAX, A, AA, AS, X, XX, $ XS, Y, YY, YS, YT, G ) + IMPLICIT NONE * * Tests SSYMV, SSBMV and SSPMV. * @@ -1111,6 +1142,7 @@ SUBROUTINE SCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, SUBROUTINE SCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NKB, KB, NINC, INC, NMAX, $ INCMAX, A, AA, AS, X, XX, XS, XT, G, Z ) + IMPLICIT NONE * * Tests STRMV, STBMV, STPMV, STRSV, STBSV and STPSV. * @@ -1469,6 +1501,7 @@ SUBROUTINE SCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX, $ INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G, $ Z ) + IMPLICIT NONE * * Tests SGER. * @@ -1730,6 +1763,7 @@ SUBROUTINE SCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX, $ INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G, $ Z ) + IMPLICIT NONE * * Tests SSYR and SSPR. * @@ -2008,6 +2042,7 @@ SUBROUTINE SCHK6( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX, $ INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G, $ Z ) + IMPLICIT NONE * * Tests SSYR2 and SSPR2. * @@ -2320,6 +2355,7 @@ SUBROUTINE SCHK6( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * END SUBROUTINE SCHKE( ISNUM, SRNAMT, NOUT ) + IMPLICIT NONE * * Tests the error exits from the Level 2 Blas. * Requires a special version of the error-handling routine XERBLA. @@ -2647,6 +2683,7 @@ SUBROUTINE SCHKE( ISNUM, SRNAMT, NOUT ) END SUBROUTINE SMAKE( TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, KL, $ KU, RESET, TRANSL ) + IMPLICIT NONE * * Generates values for an M by N matrix A within the bandwidth * defined by KL and KU. @@ -2823,6 +2860,7 @@ SUBROUTINE SMAKE( TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, KL, END SUBROUTINE SMVCH( TRANS, M, N, ALPHA, A, NMAX, X, INCX, BETA, Y, $ INCY, YT, G, YY, EPS, ERR, FATAL, NOUT, MV ) + IMPLICIT NONE * * Checks the results of the computational tests. * @@ -2939,6 +2977,7 @@ SUBROUTINE SMVCH( TRANS, M, N, ALPHA, A, NMAX, X, INCX, BETA, Y, * END LOGICAL FUNCTION LSE( RI, RJ, LR ) + IMPLICIT NONE * * Tests if two arrays are identical. * @@ -2969,6 +3008,7 @@ LOGICAL FUNCTION LSE( RI, RJ, LR ) * END LOGICAL FUNCTION LSERES( TYPE, UPLO, M, N, AA, AS, LDA ) + IMPLICIT NONE * * Tests if selected elements in two arrays are equal. * @@ -3028,6 +3068,7 @@ LOGICAL FUNCTION LSERES( TYPE, UPLO, M, N, AA, AS, LDA ) * END REAL FUNCTION SBEG( RESET ) + IMPLICIT NONE * * Generates random numbers uniformly distributed between -0.5 and 0.5. * @@ -3074,6 +3115,7 @@ REAL FUNCTION SBEG( RESET ) * END REAL FUNCTION SDIFF( X, Y ) + IMPLICIT NONE * * Auxiliary routine for test program for Level 2 Blas. * @@ -3090,6 +3132,7 @@ REAL FUNCTION SDIFF( X, Y ) * END SUBROUTINE CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + IMPLICIT NONE * * Tests whether XERBLA has detected an error when it should. * @@ -3116,8 +3159,43 @@ SUBROUTINE CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) * * End of CHKXER * + END + SUBROUTINE SREGR1( TRANS, M, N, LY, KL, KU, ALPHA, A, LDA, X, + $ INCX, BETA, Y, INCY, YS ) + IMPLICIT NONE +* +* Input initialization for regression test. +* +* .. Scalar Arguments .. + CHARACTER*1 TRANS + INTEGER LY, M, N, KL, KU, LDA, INCX, INCY + REAL ALPHA, BETA +* .. Array Arguments .. + REAL A(LDA,*), X(*), Y(*), YS(*) +* .. Local Scalars .. + INTEGER I +* .. Intrinsic Functions .. + INTRINSIC REAL +* .. Executable Statements .. + TRANS = 'T' + M = 0 + N = 5 + KL = 0 + KU = 0 + ALPHA = 1.0 + LDA = MAX( 1, M ) + INCX = 1 + BETA = -0.7 + INCY = 1 + LY = ABS( INCY )*N + DO 10 I = 1, LY + Y( I ) = 42.0 + REAL( I ) + YS( I ) = Y( I ) + 10 CONTINUE + RETURN END SUBROUTINE XERBLA( SRNAME, INFO ) + IMPLICIT NONE * * This is a special version of XERBLA to be used only as part of * the test program for testing error exits from the Level 2 BLAS diff --git a/BLAS/TESTING/sblat3.f b/BLAS/TESTING/sblat3.f index c4c1fccee8..d8f2ed85cb 100644 --- a/BLAS/TESTING/sblat3.f +++ b/BLAS/TESTING/sblat3.f @@ -19,8 +19,8 @@ *> Test program for the REAL Level 3 Blas. *> *> The program must be driven by a short data file. The first 14 records -*> of the file are read using list-directed input, the last 6 records -*> are read using the format ( A6, L2 ). An annotated example of a data +*> of the file are read using list-directed input, the last 7 records +*> are read using the format ( A7, L2 ). An annotated example of a data *> file can be obtained by deleting the first 3 characters from the *> following 20 lines: *> 'sblat3.out' NAME OF SUMMARY OUTPUT FILE @@ -43,6 +43,7 @@ *> STRSM T PUT F FOR NO TEST. SAME COLUMNS. *> SSYRK T PUT F FOR NO TEST. SAME COLUMNS. *> SSYR2K T PUT F FOR NO TEST. SAME COLUMNS. +*> SGEMMTR T PUT F FOR NO TEST. SAME COLUMNS. *> *> Further Details *> =============== @@ -79,6 +80,7 @@ * * ===================================================================== PROGRAM SBLAT3 + IMPLICIT NONE * * -- Reference BLAS test routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -90,7 +92,7 @@ PROGRAM SBLAT3 INTEGER NIN PARAMETER ( NIN = 5 ) INTEGER NSUBS - PARAMETER ( NSUBS = 6 ) + PARAMETER ( NSUBS = 7 ) REAL ZERO, ONE PARAMETER ( ZERO = 0.0, ONE = 1.0 ) INTEGER NMAX @@ -103,7 +105,7 @@ PROGRAM SBLAT3 LOGICAL FATAL, LTESTT, REWI, SAME, SFATAL, TRACE, $ TSTERR CHARACTER*1 TRANSA, TRANSB - CHARACTER*6 SNAMET + CHARACTER*7 SNAMET CHARACTER*32 SNAPS, SUMMRY * .. Local Arrays .. REAL AA( NMAX*NMAX ), AB( NMAX, 2*NMAX ), @@ -114,25 +116,26 @@ PROGRAM SBLAT3 $ G( NMAX ), W( 2*NMAX ) INTEGER IDIM( NIDMAX ) LOGICAL LTEST( NSUBS ) - CHARACTER*6 SNAMES( NSUBS ) + CHARACTER*7 SNAMES( NSUBS ) * .. External Functions .. REAL SDIFF LOGICAL LSE EXTERNAL SDIFF, LSE * .. External Subroutines .. EXTERNAL SCHK1, SCHK2, SCHK3, SCHK4, SCHK5, SCHKE, SMMCH + EXTERNAL SCHK6 * .. Intrinsic Functions .. INTRINSIC MAX, MIN * .. Scalars in Common .. INTEGER INFOT, NOUTC LOGICAL LERR, OK - CHARACTER*6 SRNAMT + CHARACTER*7 SRNAMT * .. Common blocks .. COMMON /INFOC/INFOT, NOUTC, OK, LERR COMMON /SRNAMC/SRNAMT * .. Data statements .. - DATA SNAMES/'SGEMM ', 'SSYMM ', 'STRMM ', 'STRSM ', - $ 'SSYRK ', 'SSYR2K'/ + DATA SNAMES/'SGEMM', 'SSYMM ', 'STRMM ', + $ 'STRSM ', 'SSYRK ', 'SSYR2K ', 'SGEMMTR'/ * .. Executable Statements .. * * Read name and unit number for summary output file and open file. @@ -309,7 +312,7 @@ PROGRAM SBLAT3 INFOT = 0 OK = .TRUE. FATAL = .FALSE. - GO TO ( 140, 150, 160, 160, 170, 180 )ISNUM + GO TO ( 140, 150, 160, 160, 170, 180, 185 )ISNUM * Test SGEMM, 01. 140 CALL SCHK1( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE, $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, @@ -338,6 +341,12 @@ PROGRAM SBLAT3 $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, $ NMAX, AB, AA, AS, BB, BS, C, CC, CS, CT, G, W ) GO TO 190 +* Test SGEMMTR, 07. + 185 CALL SCHK6( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE, + $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, + $ NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C, + $ CC, CS, CT, G ) + GO TO 190 * 190 IF( FATAL.AND.SFATAL ) $ GO TO 210 @@ -372,7 +381,7 @@ PROGRAM SBLAT3 9992 FORMAT( ' FOR BETA ', 7F6.1 ) 9991 FORMAT( ' AMEND DATA FILE OR INCREASE ARRAY SIZES IN PROGRAM', $ /' ******* TESTS ABANDONED *******' ) - 9990 FORMAT( ' SUBPROGRAM NAME ', A6, ' NOT RECOGNIZED', /' ******* T', + 9990 FORMAT( ' SUBPROGRAM NAME ', A7, ' NOT RECOGNIZED', /' ******* T', $ 'ESTS ABANDONED *******' ) 9989 FORMAT( ' ERROR IN SMMCH - IN-LINE DOT PRODUCTS ARE BEING EVALU', $ 'ATED WRONGLY.', /' SMMCH WAS CALLED WITH TRANSA = ', A1, @@ -380,8 +389,8 @@ PROGRAM SBLAT3 $ 'ERR = ', F12.3, '.', /' THIS MAY BE DUE TO FAULTS IN THE ', $ 'ARITHMETIC OR THE COMPILER.', /' ******* TESTS ABANDONED ', $ '*******' ) - 9988 FORMAT( A6, L2 ) - 9987 FORMAT( 1X, A6, ' WAS NOT TESTED' ) + 9988 FORMAT( A7, L2 ) + 9987 FORMAT( 1X, A7, ' WAS NOT TESTED' ) 9986 FORMAT( /' END OF TESTS' ) 9985 FORMAT( /' ******* FATAL ERROR - TESTS ABANDONED *******' ) 9984 FORMAT( ' ERROR-EXITS WILL NOT BE TESTED' ) @@ -392,6 +401,7 @@ PROGRAM SBLAT3 SUBROUTINE SCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX, $ A, AA, AS, B, BB, BS, C, CC, CS, CT, G ) + IMPLICIT NONE * * Tests SGEMM. * @@ -410,7 +420,7 @@ SUBROUTINE SCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, REAL EPS, THRESH INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA LOGICAL FATAL, REWI, TRACE - CHARACTER*6 SNAME + CHARACTER*7 SNAME * .. Array Arguments .. REAL A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ), $ AS( NMAX*NMAX ), B( NMAX, NMAX ), @@ -653,15 +663,15 @@ SUBROUTINE SCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, 130 CONTINUE RETURN * - 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', + 9999 FORMAT( ' ', A7, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', $ 'S)' ) 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', $ 'ANGED INCORRECTLY *******' ) - 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', + 9997 FORMAT( ' ', A7, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', $ 'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2, $ ' - SUSPECT *******' ) - 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' ) - 9995 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',''', A1, ''',', + 9996 FORMAT( ' ******* ', A7, ' FAILED ON CALL NUMBER:' ) + 9995 FORMAT( 1X, I6, ': ', A7, '(''', A1, ''',''', A1, ''',', $ 3( I3, ',' ), F4.1, ', A,', I3, ', B,', I3, ',', F4.1, ', ', $ 'C,', I3, ').' ) 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', @@ -673,6 +683,7 @@ SUBROUTINE SCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, SUBROUTINE SCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX, $ A, AA, AS, B, BB, BS, C, CC, CS, CT, G ) + IMPLICIT NONE * * Tests SSYMM. * @@ -691,7 +702,7 @@ SUBROUTINE SCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, REAL EPS, THRESH INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA LOGICAL FATAL, REWI, TRACE - CHARACTER*6 SNAME + CHARACTER*7 SNAME * .. Array Arguments .. REAL A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ), $ AS( NMAX*NMAX ), B( NMAX, NMAX ), @@ -923,15 +934,15 @@ SUBROUTINE SCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, 120 CONTINUE RETURN * - 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', + 9999 FORMAT( ' ', A7, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', $ 'S)' ) 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', $ 'ANGED INCORRECTLY *******' ) - 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', + 9997 FORMAT( ' ', A7, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', $ 'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2, $ ' - SUSPECT *******' ) - 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' ) - 9995 FORMAT( 1X, I6, ': ', A6, '(', 2( '''', A1, ''',' ), 2( I3, ',' ), + 9996 FORMAT( ' ******* ', A7, ' FAILED ON CALL NUMBER:' ) + 9995 FORMAT( 1X, I6, ': ', A7, '(', 2( '''', A1, ''',' ), 2( I3, ',' ), $ F4.1, ', A,', I3, ', B,', I3, ',', F4.1, ', C,', I3, ') ', $ ' .' ) 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', @@ -943,6 +954,7 @@ SUBROUTINE SCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, SUBROUTINE SCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NMAX, A, AA, AS, $ B, BB, BS, CT, G, C ) + IMPLICIT NONE * * Tests STRMM and STRSM. * @@ -961,7 +973,7 @@ SUBROUTINE SCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, REAL EPS, THRESH INTEGER NALF, NIDIM, NMAX, NOUT, NTRA LOGICAL FATAL, REWI, TRACE - CHARACTER*6 SNAME + CHARACTER*7 SNAME * .. Array Arguments .. REAL A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ), $ AS( NMAX*NMAX ), B( NMAX, NMAX ), @@ -1229,15 +1241,15 @@ SUBROUTINE SCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, 160 CONTINUE RETURN * - 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', + 9999 FORMAT( ' ', A7, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', $ 'S)' ) 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', $ 'ANGED INCORRECTLY *******' ) - 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', + 9997 FORMAT( ' ', A7, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', $ 'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2, $ ' - SUSPECT *******' ) - 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' ) - 9995 FORMAT( 1X, I6, ': ', A6, '(', 4( '''', A1, ''',' ), 2( I3, ',' ), + 9996 FORMAT( ' ******* ', A7, ' FAILED ON CALL NUMBER:' ) + 9995 FORMAT( 1X, I6, ': ', A7, '(', 4( '''', A1, ''',' ), 2( I3, ',' ), $ F4.1, ', A,', I3, ', B,', I3, ') .' ) 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', $ '******' ) @@ -1248,6 +1260,7 @@ SUBROUTINE SCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, SUBROUTINE SCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX, $ A, AA, AS, B, BB, BS, C, CC, CS, CT, G ) + IMPLICIT NONE * * Tests SSYRK. * @@ -1266,7 +1279,7 @@ SUBROUTINE SCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, REAL EPS, THRESH INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA LOGICAL FATAL, REWI, TRACE - CHARACTER*6 SNAME + CHARACTER*7 SNAME * .. Array Arguments .. REAL A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ), $ AS( NMAX*NMAX ), B( NMAX, NMAX ), @@ -1503,16 +1516,16 @@ SUBROUTINE SCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, 130 CONTINUE RETURN * - 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', + 9999 FORMAT( ' ', A7, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', $ 'S)' ) 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', $ 'ANGED INCORRECTLY *******' ) - 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', + 9997 FORMAT( ' ', A7, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', $ 'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2, $ ' - SUSPECT *******' ) - 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' ) + 9996 FORMAT( ' ******* ', A7, ' FAILED ON CALL NUMBER:' ) 9995 FORMAT( ' THESE ARE THE RESULTS FOR COLUMN ', I3 ) - 9994 FORMAT( 1X, I6, ': ', A6, '(', 2( '''', A1, ''',' ), 2( I3, ',' ), + 9994 FORMAT( 1X, I6, ': ', A7, '(', 2( '''', A1, ''',' ), 2( I3, ',' ), $ F4.1, ', A,', I3, ',', F4.1, ', C,', I3, ') .' ) 9993 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', $ '******' ) @@ -1523,6 +1536,7 @@ SUBROUTINE SCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, SUBROUTINE SCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX, $ AB, AA, AS, BB, BS, C, CC, CS, CT, G, W ) + IMPLICIT NONE * * Tests SSYR2K. * @@ -1541,7 +1555,7 @@ SUBROUTINE SCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, REAL EPS, THRESH INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA LOGICAL FATAL, REWI, TRACE - CHARACTER*6 SNAME + CHARACTER*7 SNAME * .. Array Arguments .. REAL AA( NMAX*NMAX ), AB( 2*NMAX*NMAX ), $ ALF( NALF ), AS( NMAX*NMAX ), BB( NMAX*NMAX ), @@ -1816,16 +1830,16 @@ SUBROUTINE SCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, 160 CONTINUE RETURN * - 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', + 9999 FORMAT( ' ', A7, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', $ 'S)' ) 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', $ 'ANGED INCORRECTLY *******' ) - 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', + 9997 FORMAT( ' ', A7, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', $ 'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2, $ ' - SUSPECT *******' ) - 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' ) + 9996 FORMAT( ' ******* ', A7, ' FAILED ON CALL NUMBER:' ) 9995 FORMAT( ' THESE ARE THE RESULTS FOR COLUMN ', I3 ) - 9994 FORMAT( 1X, I6, ': ', A6, '(', 2( '''', A1, ''',' ), 2( I3, ',' ), + 9994 FORMAT( 1X, I6, ': ', A7, '(', 2( '''', A1, ''',' ), 2( I3, ',' ), $ F4.1, ', A,', I3, ', B,', I3, ',', F4.1, ', C,', I3, ') ', $ ' .' ) 9993 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', @@ -1835,6 +1849,7 @@ SUBROUTINE SCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * END SUBROUTINE SCHKE( ISNUM, SRNAMT, NOUT ) + IMPLICIT NONE * * Tests the error exits from the Level 3 Blas. * Requires a special version of the error-handling routine XERBLA. @@ -1853,7 +1868,7 @@ SUBROUTINE SCHKE( ISNUM, SRNAMT, NOUT ) * * .. Scalar Arguments .. INTEGER ISNUM, NOUT - CHARACTER*6 SRNAMT + CHARACTER*7 SRNAMT * .. Scalars in Common .. INTEGER INFOT, NOUTC LOGICAL LERR, OK @@ -1866,7 +1881,7 @@ SUBROUTINE SCHKE( ISNUM, SRNAMT, NOUT ) REAL A( 2, 1 ), B( 2, 1 ), C( 2, 1 ) * .. External Subroutines .. EXTERNAL CHKXER, SGEMM, SSYMM, SSYR2K, SSYRK, STRMM, - $ STRSM + $ STRSM, SGEMMTR * .. Common blocks .. COMMON /INFOC/INFOT, NOUTC, OK, LERR * .. Executable Statements .. @@ -1882,7 +1897,7 @@ SUBROUTINE SCHKE( ISNUM, SRNAMT, NOUT ) ALPHA = ONE BETA = TWO * - GO TO ( 10, 20, 30, 40, 50, 60 )ISNUM + GO TO ( 10, 20, 30, 40, 50, 60, 70 )ISNUM 10 INFOT = 1 CALL SGEMM( '/', 'N', 0, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) @@ -1967,7 +1982,7 @@ SUBROUTINE SCHKE( ISNUM, SRNAMT, NOUT ) INFOT = 13 CALL SGEMM( 'T', 'T', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) - GO TO 70 + GO TO 80 20 INFOT = 1 CALL SSYMM( '/', 'U', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) @@ -2034,7 +2049,7 @@ SUBROUTINE SCHKE( ISNUM, SRNAMT, NOUT ) INFOT = 12 CALL SSYMM( 'R', 'L', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) - GO TO 70 + GO TO 80 30 INFOT = 1 CALL STRMM( '/', 'U', 'N', 'N', 0, 0, ALPHA, A, 1, B, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) @@ -2143,7 +2158,7 @@ SUBROUTINE SCHKE( ISNUM, SRNAMT, NOUT ) INFOT = 11 CALL STRMM( 'R', 'L', 'T', 'N', 2, 0, ALPHA, A, 1, B, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) - GO TO 70 + GO TO 80 40 INFOT = 1 CALL STRSM( '/', 'U', 'N', 'N', 0, 0, ALPHA, A, 1, B, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) @@ -2252,7 +2267,7 @@ SUBROUTINE SCHKE( ISNUM, SRNAMT, NOUT ) INFOT = 11 CALL STRSM( 'R', 'L', 'T', 'N', 2, 0, ALPHA, A, 1, B, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) - GO TO 70 + GO TO 80 50 INFOT = 1 CALL SSYRK( '/', 'N', 0, 0, ALPHA, A, 1, BETA, C, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) @@ -2307,7 +2322,7 @@ SUBROUTINE SCHKE( ISNUM, SRNAMT, NOUT ) INFOT = 10 CALL SSYRK( 'L', 'T', 2, 0, ALPHA, A, 1, BETA, C, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) - GO TO 70 + GO TO 80 60 INFOT = 1 CALL SSYR2K( '/', 'N', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) @@ -2374,16 +2389,95 @@ SUBROUTINE SCHKE( ISNUM, SRNAMT, NOUT ) INFOT = 12 CALL SSYR2K( 'L', 'T', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + GO TO 80 + 70 INFOT = 1 + CALL SGEMMTR( '/', 'N', 'N', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 2 + CALL SGEMMTR( 'U', '/', 'N', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 2 + CALL SGEMMTR( 'U', '/', 'T', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 3 + CALL SGEMMTR( 'U', 'N', '/', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 3 + CALL SGEMMTR( 'U', 'T', '/', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 4 + CALL SGEMMTR( 'U', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 4 + CALL SGEMMTR( 'U', 'N', 'T', -1, 0, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 4 + CALL SGEMMTR( 'U', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 4 + CALL SGEMMTR( 'U', 'T', 'T', -1, 0, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 5 + CALL SGEMMTR( 'U', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 5 + CALL SGEMMTR( 'U', 'N', 'T', 0, -1, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 5 + CALL SGEMMTR( 'U', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 5 + CALL SGEMMTR( 'U', 'T', 'T', 0, -1, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 8 + CALL SGEMMTR( 'U', 'N', 'N', 2, 0, ALPHA, A, 1, B, 2, BETA, C, + $ 2 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 8 + CALL SGEMMTR( 'U', 'N', 'T', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 2 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 10 + CALL SGEMMTR( 'U', 'N', 'N', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 10 + CALL SGEMMTR( 'U', 'T', 'N', 0, 2, ALPHA, A, 2, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 10 + CALL SGEMMTR( 'U', 'N', 'T', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 10 + CALL SGEMMTR( 'U', 'T', 'T', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 13 + CALL SGEMMTR( 'U', 'N', 'N', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 13 + CALL SGEMMTR( 'U', 'N', 'T', 2, 0, ALPHA, A, 2, B, 2, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 13 + CALL SGEMMTR( 'U', 'T', 'N', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 13 + CALL SGEMMTR( 'U', 'T', 'T', 2, 0, ALPHA, A, 2, B, 2, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) * - 70 IF( OK )THEN + 80 IF( OK )THEN WRITE( NOUT, FMT = 9999 )SRNAMT ELSE WRITE( NOUT, FMT = 9998 )SRNAMT END IF RETURN * - 9999 FORMAT( ' ', A6, ' PASSED THE TESTS OF ERROR-EXITS' ) - 9998 FORMAT( ' ******* ', A6, ' FAILED THE TESTS OF ERROR-EXITS *****', + 9999 FORMAT( ' ', A7, ' PASSED THE TESTS OF ERROR-EXITS' ) + 9998 FORMAT( ' ******* ', A7, ' FAILED THE TESTS OF ERROR-EXITS *****', $ '**' ) * * End of SCHKE @@ -2391,6 +2485,7 @@ SUBROUTINE SCHKE( ISNUM, SRNAMT, NOUT ) END SUBROUTINE SMAKE( TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, RESET, $ TRANSL ) + IMPLICIT NONE * * Generates values for an M by N matrix A. * Stores the values in the array AA in the data structure required @@ -2505,6 +2600,7 @@ SUBROUTINE SMAKE( TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, RESET, SUBROUTINE SMMCH( TRANSA, TRANSB, M, N, KK, ALPHA, A, LDA, B, LDB, $ BETA, C, LDC, CT, G, CC, LDCC, EPS, ERR, FATAL, $ NOUT, MV ) + IMPLICIT NONE * * Checks the results of the computational tests. * @@ -2625,6 +2721,7 @@ SUBROUTINE SMMCH( TRANSA, TRANSB, M, N, KK, ALPHA, A, LDA, B, LDB, * END LOGICAL FUNCTION LSE( RI, RJ, LR ) + IMPLICIT NONE * * Tests if two arrays are identical. * @@ -2657,6 +2754,7 @@ LOGICAL FUNCTION LSE( RI, RJ, LR ) * END LOGICAL FUNCTION LSERES( TYPE, UPLO, M, N, AA, AS, LDA ) + IMPLICIT NONE * * Tests if selected elements in two arrays are equal. * @@ -2718,6 +2816,7 @@ LOGICAL FUNCTION LSERES( TYPE, UPLO, M, N, AA, AS, LDA ) * END REAL FUNCTION SBEG( RESET ) + IMPLICIT NONE * * Generates random numbers uniformly distributed between -0.5 and 0.5. * @@ -2764,6 +2863,7 @@ REAL FUNCTION SBEG( RESET ) * END REAL FUNCTION SDIFF( X, Y ) + IMPLICIT NONE * * Auxiliary routine for test program for Level 3 Blas. * @@ -2783,6 +2883,7 @@ REAL FUNCTION SDIFF( X, Y ) * END SUBROUTINE CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + IMPLICIT NONE * * Tests whether XERBLA has detected an error when it should. * @@ -2797,7 +2898,7 @@ SUBROUTINE CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) * .. Scalar Arguments .. INTEGER INFOT, NOUT LOGICAL LERR, OK - CHARACTER*6 SRNAMT + CHARACTER*7 SRNAMT * .. Executable Statements .. IF( .NOT.LERR )THEN WRITE( NOUT, FMT = 9999 )INFOT, SRNAMT @@ -2807,12 +2908,13 @@ SUBROUTINE CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) RETURN * 9999 FORMAT( ' ***** ILLEGAL VALUE OF PARAMETER NUMBER ', I2, ' NOT D', - $ 'ETECTED BY ', A6, ' *****' ) + $ 'ETECTED BY ', A7, ' *****' ) * * End of CHKXER * END SUBROUTINE XERBLA( SRNAME, INFO ) + IMPLICIT NONE * * This is a special version of XERBLA to be used only as part of * the test program for testing error exits from the Level 3 BLAS @@ -2833,14 +2935,16 @@ SUBROUTINE XERBLA( SRNAME, INFO ) * * .. Scalar Arguments .. INTEGER INFO - CHARACTER*6 SRNAME + CHARACTER*(*) SRNAME * .. Scalars in Common .. INTEGER INFOT, NOUT LOGICAL LERR, OK - CHARACTER*6 SRNAMT + CHARACTER*7 SRNAMT * .. Common blocks .. COMMON /INFOC/INFOT, NOUT, OK, LERR COMMON /SRNAMC/SRNAMT +* .. Locals .. + INTEGER SRLEN * .. Executable Statements .. LERR = .TRUE. IF( INFO.NE.INFOT )THEN @@ -2851,7 +2955,8 @@ SUBROUTINE XERBLA( SRNAME, INFO ) END IF OK = .FALSE. END IF - IF( SRNAME.NE.SRNAMT )THEN + SRLEN = MIN(LEN_TRIM(SRNAME), LEN_TRIM(SRNAMT)) + IF( SRNAME(1:SRLEN).NE.SRNAMT(1:SRLEN) )THEN WRITE( NOUT, FMT = 9998 )SRNAME, SRNAMT OK = .FALSE. END IF @@ -2859,11 +2964,430 @@ SUBROUTINE XERBLA( SRNAME, INFO ) * 9999 FORMAT( ' ******* XERBLA WAS CALLED WITH INFO = ', I6, ' INSTEAD', $ ' OF ', I2, ' *******' ) - 9998 FORMAT( ' ******* XERBLA WAS CALLED WITH SRNAME = ', A6, ' INSTE', - $ 'AD OF ', A6, ' *******' ) + 9998 FORMAT( ' ******* XERBLA WAS CALLED WITH SRNAME = ', A7, ' INSTE', + $ 'AD OF ', A7, ' *******' ) 9997 FORMAT( ' ******* XERBLA WAS CALLED WITH INFO = ', I6, $ ' *******' ) * * End of XERBLA +* + END + + + SUBROUTINE SCHK6( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, + $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX, + $ A, AA, AS, B, BB, BS, C, CC, CS, CT, G ) + IMPLICIT NONE +* +* Tests SGEMMTR. +* +* Auxiliary routine for test program for Level 3 Blas. +* +* -- Written on 19-July-2023. +* Martin Koehler, MPI Magdeburg +* +* .. Parameters .. + REAL ZERO + PARAMETER ( ZERO = 0.0D0 ) +* .. Scalar Arguments .. + REAL EPS, THRESH + INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA + LOGICAL FATAL, REWI, TRACE + CHARACTER*7 SNAME +* .. Array Arguments .. + REAL A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ), + $ AS( NMAX*NMAX ), B( NMAX, NMAX ), + $ BB( NMAX*NMAX ), BET( NBET ), BS( NMAX*NMAX ), + $ C( NMAX, NMAX ), CC( NMAX*NMAX ), + $ CS( NMAX*NMAX ), CT( NMAX ), G( NMAX ) + INTEGER IDIM( NIDIM ) +* .. Local Scalars .. + REAL ALPHA, ALS, BETA, BLS, ERR, ERRMAX + INTEGER I, IA, IB, ICA, ICB, IK, IN, K, KS, LAA, + $ LBB, LCC, LDA, LDAS, LDB, LDBS, LDC, LDCS, + $ MA, MB, N, NA, NARGS, NB, NC, NS, IS + LOGICAL NULL, RESET, SAME, TRANA, TRANB + CHARACTER*1 TRANAS, TRANBS, TRANSA, TRANSB, UPLO, UPLOS + CHARACTER*3 ICH + CHARACTER*2 ISHAPE +* .. Local Arrays .. + LOGICAL ISAME( 13 ) +* .. External Functions .. + LOGICAL LSE, LSERES + EXTERNAL LSE, LSERES +* .. External Subroutines .. + EXTERNAL SGEMMTR, SMAKE, SMMTCH +* .. Intrinsic Functions .. + INTRINSIC MAX +* .. Scalars in Common .. + INTEGER INFOT, NOUTC + LOGICAL LERR, OK +* .. Common blocks .. + COMMON /INFOC/INFOT, NOUTC, OK, LERR +* .. Data statements .. + DATA ICH/'NTC'/ + DATA ISHAPE/'UL'/ +* .. Executable Statements .. +* + NARGS = 13 + NC = 0 + RESET = .TRUE. + ERRMAX = ZERO +* + DO 100 IN = 1, NIDIM + N = IDIM( IN ) +* Set LDC to 1 more than minimum value if room. + LDC = N + IF( LDC.LT.NMAX ) + $ LDC = LDC + 1 +* Skip tests if not enough room. + IF( LDC.GT.NMAX ) + $ GO TO 100 + LCC = LDC*N + NULL = N.LE.0 +* + DO 90 IK = 1, NIDIM + K = IDIM( IK ) +* + DO 80 ICA = 1, 3 + TRANSA = ICH( ICA: ICA ) + TRANA = TRANSA.EQ.'T'.OR.TRANSA.EQ.'C' +* + IF( TRANA )THEN + MA = K + NA = N + ELSE + MA = N + NA = K + END IF +* Set LDA to 1 more than minimum value if room. + LDA = MA + IF( LDA.LT.NMAX ) + $ LDA = LDA + 1 +* Skip tests if not enough room. + IF( LDA.GT.NMAX ) + $ GO TO 80 + LAA = LDA*NA +* +* Generate the matrix A. +* + CALL SMAKE( 'GE', ' ', ' ', MA, NA, A, NMAX, AA, LDA, + $ RESET, ZERO ) +* + DO 70 ICB = 1, 3 + TRANSB = ICH( ICB: ICB ) + TRANB = TRANSB.EQ.'T'.OR.TRANSB.EQ.'C' +* + IF( TRANB )THEN + MB = N + NB = K + ELSE + MB = K + NB = N + END IF +* Set LDB to 1 more than minimum value if room. + LDB = MB + IF( LDB.LT.NMAX ) + $ LDB = LDB + 1 +* Skip tests if not enough room. + IF( LDB.GT.NMAX ) + $ GO TO 70 + LBB = LDB*NB +* +* Generate the matrix B. +* + CALL SMAKE( 'GE', ' ', ' ', MB, NB, B, NMAX, BB, + $ LDB, RESET, ZERO ) +* + DO 60 IA = 1, NALF + ALPHA = ALF( IA ) +* + DO 50 IB = 1, NBET + BETA = BET( IB ) + + DO 45 IS = 1, 2 + UPLO = ISHAPE( IS: IS ) + +* +* Generate the matrix C. +* + CALL SMAKE( 'GE', UPLO, ' ', N, N, C, + $ NMAX, CC, LDC, RESET, ZERO ) +* + NC = NC + 1 +* +* Save every datum before calling the +* subroutine. +* + UPLOS = UPLO + TRANAS = TRANSA + TRANBS = TRANSB + NS = N + KS = K + ALS = ALPHA + DO 10 I = 1, LAA + AS( I ) = AA( I ) + 10 CONTINUE + LDAS = LDA + DO 20 I = 1, LBB + BS( I ) = BB( I ) + 20 CONTINUE + LDBS = LDB + BLS = BETA + DO 30 I = 1, LCC + CS( I ) = CC( I ) + 30 CONTINUE + LDCS = LDC +* +* Call the subroutine. +* + IF( TRACE ) + $ WRITE( NTRA, FMT = 9995 )NC, SNAME, + $ UPLO, TRANSA, TRANSB, N, K, ALPHA, LDA, + $ LDB, BETA, LDC + IF( REWI ) + $ REWIND NTRA + CALL SGEMMTR( UPLO, TRANSA, TRANSB, N, + $ K, ALPHA, AA, LDA, BB, LDB, + $ BETA, CC, LDC ) +* +* Check if error-exit was taken incorrectly. +* + IF( .NOT.OK )THEN + WRITE( NOUT, FMT = 9994 ) + FATAL = .TRUE. + GO TO 120 + END IF +* +* See what data changed inside subroutines. +* + ISAME( 1 ) = UPLO.EQ.UPLOS + ISAME( 2 ) = TRANSA.EQ.TRANAS + ISAME( 3 ) = TRANSB.EQ.TRANBS + ISAME( 4 ) = NS.EQ.N + ISAME( 5 ) = KS.EQ.K + ISAME( 6 ) = ALS.EQ.ALPHA + ISAME( 7 ) = LSE( AS, AA, LAA ) + ISAME( 8 ) = LDAS.EQ.LDA + ISAME( 9 ) = LSE( BS, BB, LBB ) + ISAME( 10 ) = LDBS.EQ.LDB + ISAME( 11 ) = BLS.EQ.BETA + IF( NULL )THEN + ISAME( 12 ) = LSE( CS, CC, LCC ) + ELSE + ISAME( 12 ) = LSERES( 'GE', ' ', N, N, + $ CS, CC, LDC ) + END IF + ISAME( 13 ) = LDCS.EQ.LDC +* +* If data was incorrectly changed, report +* and return. +* + SAME = .TRUE. + DO 40 I = 1, NARGS + SAME = SAME.AND.ISAME( I ) + IF( .NOT.ISAME( I ) ) + $ WRITE( NOUT, FMT = 9998 )I + 40 CONTINUE + IF( .NOT.SAME )THEN + FATAL = .TRUE. + GO TO 120 + END IF +* + IF( .NOT.NULL )THEN +* +* Check the result. +* + CALL SMMTCH( UPLO, TRANSA, TRANSB, + $ N, K, + $ ALPHA, A, NMAX, B, NMAX, BETA, + $ C, NMAX, CT, G, CC, LDC, EPS, + $ ERR, FATAL, NOUT, .TRUE. ) + ERRMAX = MAX( ERRMAX, ERR ) +* If got really bad answer, report and +* return. + IF( FATAL ) + $ GO TO 120 + END IF +* + 45 CONTINUE +* + 50 CONTINUE +* + 60 CONTINUE +* + 70 CONTINUE +* + 80 CONTINUE +* + 90 CONTINUE +* + 100 CONTINUE +* +* +* Report result. +* + IF( ERRMAX.LT.THRESH )THEN + WRITE( NOUT, FMT = 9999 )SNAME, NC + ELSE + WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX + END IF + GO TO 130 +* + 120 CONTINUE + WRITE( NOUT, FMT = 9996 )SNAME + WRITE( NOUT, FMT = 9995 )NC, SNAME, UPLO, TRANSA, TRANSB, N, K, + $ ALPHA, LDA, LDB, BETA, LDC +* + 130 CONTINUE + RETURN +* + 9999 FORMAT( ' ', A7, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', + $ 'S)' ) + 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', + $ 'ANGED INCORRECTLY *******' ) + 9997 FORMAT( ' ', A7, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', + $ 'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2, + $ ' - SUSPECT *******' ) + 9996 FORMAT( ' ******* ', A7, ' FAILED ON CALL NUMBER:' ) + 9995 FORMAT( 1X, I6, ': ', A7, '(''',A1, ''',''',A1, ''',''', A1,''',', + $ 2( I3, ',' ), F4.1, ', A,', I3, ', B,', I3, ',', F4.1, ', ', + $ 'C,', I3, ').' ) + 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', + $ '******' ) +* +* End of DCHK6 +* + END + + SUBROUTINE SMMTCH( UPLO, TRANSA, TRANSB, N, KK, ALPHA, A, LDA, + $ B, LDB, BETA, C, LDC, CT, G, CC, LDCC, EPS, ERR, + $ FATAL, NOUT, MV ) + IMPLICIT NONE +* +* Checks the results of the computational tests. +* +* Auxiliary routine for test program for Level 3 Blas. (SGEMMTR) +* +* -- Written on 19-July-2023. +* Martin Koehler, MPI Magdeburg +* +* .. Parameters .. + REAL ZERO, ONE + PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0 ) +* .. Scalar Arguments .. + REAL ALPHA, BETA, EPS, ERR + INTEGER KK, LDA, LDB, LDC, LDCC, N, NOUT + LOGICAL FATAL, MV + CHARACTER*1 UPLO, TRANSA, TRANSB +* .. Array Arguments .. + REAL A( LDA, * ), B( LDB, * ), C( LDC, * ), + $ CC( LDCC, * ), CT( * ), G( * ) +* .. Local Scalars .. + REAL ERRI + INTEGER I, J, K, ISTART, ISTOP + LOGICAL TRANA, TRANB, UPPER +* .. Intrinsic Functions .. + INTRINSIC ABS, MAX, SQRT +* .. Executable Statements .. + UPPER = UPLO.EQ.'U' + TRANA = TRANSA.EQ.'T'.OR.TRANSA.EQ.'C' + TRANB = TRANSB.EQ.'T'.OR.TRANSB.EQ.'C' +* +* Compute expected result, one column at a time, in CT using data +* in A, B and C. +* Compute gauges in G. +* + ISTART = 1 + ISTOP = N + + DO 120 J = 1, N +* + IF ( UPPER ) THEN + ISTART = 1 + ISTOP = J + ELSE + ISTART = J + ISTOP = N + END IF + DO 10 I = ISTART, ISTOP + CT( I ) = ZERO + G( I ) = ZERO + 10 CONTINUE + IF( .NOT.TRANA.AND..NOT.TRANB )THEN + DO 30 K = 1, KK + DO 20 I = ISTART, ISTOP + CT( I ) = CT( I ) + A( I, K )*B( K, J ) + G( I ) = G( I ) + ABS( A( I, K ) )*ABS( B( K, J ) ) + 20 CONTINUE + 30 CONTINUE + ELSE IF( TRANA.AND..NOT.TRANB )THEN + DO 50 K = 1, KK + DO 40 I = ISTART, ISTOP + CT( I ) = CT( I ) + A( K, I )*B( K, J ) + G( I ) = G( I ) + ABS( A( K, I ) )*ABS( B( K, J ) ) + 40 CONTINUE + 50 CONTINUE + ELSE IF( .NOT.TRANA.AND.TRANB )THEN + DO 70 K = 1, KK + DO 60 I = ISTART, ISTOP + CT( I ) = CT( I ) + A( I, K )*B( J, K ) + G( I ) = G( I ) + ABS( A( I, K ) )*ABS( B( J, K ) ) + 60 CONTINUE + 70 CONTINUE + ELSE IF( TRANA.AND.TRANB )THEN + DO 90 K = 1, KK + DO 80 I = ISTART, ISTOP + CT( I ) = CT( I ) + A( K, I )*B( J, K ) + G( I ) = G( I ) + ABS( A( K, I ) )*ABS( B( J, K ) ) + 80 CONTINUE + 90 CONTINUE + END IF + DO 100 I = ISTART, ISTOP + CT( I ) = ALPHA*CT( I ) + BETA*C( I, J ) + G( I ) = ABS( ALPHA )*G( I ) + ABS( BETA )*ABS( C( I, J ) ) + 100 CONTINUE +* +* Compute the error ratio for this result. +* + ERR = ZERO + DO 110 I = ISTART, ISTOP + ERRI = ABS( CT( I ) - CC( I, J ) )/EPS + IF( G( I ).NE.ZERO ) + $ ERRI = ERRI/G( I ) + ERR = MAX( ERR, ERRI ) + IF( ERR*SQRT( EPS ).GE.ONE ) + $ GO TO 130 + 110 CONTINUE +* + 120 CONTINUE +* +* If the loop completes, all results are at least half accurate. + GO TO 150 +* +* Report fatal error. +* + 130 FATAL = .TRUE. + WRITE( NOUT, FMT = 9999 ) + DO 140 I = ISTART, ISTOP + IF( MV )THEN + WRITE( NOUT, FMT = 9998 )I, CT( I ), CC( I, J ) + ELSE + WRITE( NOUT, FMT = 9998 )I, CC( I, J ), CT( I ) + END IF + 140 CONTINUE + IF( N.GT.1 ) + $ WRITE( NOUT, FMT = 9997 )J +* + 150 CONTINUE + RETURN +* + 9999 FORMAT( ' ******* FATAL ERROR - COMPUTED RESULT IS LESS THAN HAL', + $ 'F ACCURATE *******', /' EXPECTED RESULT COMPU', + $ 'TED RESULT' ) + 9998 FORMAT( 1X, I7, 2G18.6 ) + 9997 FORMAT( ' THESE ARE THE RESULTS FOR COLUMN ', I3 ) +* +* End of DMMTCH * END diff --git a/BLAS/TESTING/sblat3.in b/BLAS/TESTING/sblat3.in index 5c4e3b83e1..ea1a305875 100644 --- a/BLAS/TESTING/sblat3.in +++ b/BLAS/TESTING/sblat3.in @@ -12,9 +12,10 @@ T LOGICAL FLAG, T TO TEST ERROR EXITS. 0.0 1.0 0.7 VALUES OF ALPHA 3 NUMBER OF VALUES OF BETA 0.0 1.0 1.3 VALUES OF BETA -SGEMM T PUT F FOR NO TEST. SAME COLUMNS. -SSYMM T PUT F FOR NO TEST. SAME COLUMNS. -STRMM T PUT F FOR NO TEST. SAME COLUMNS. -STRSM T PUT F FOR NO TEST. SAME COLUMNS. -SSYRK T PUT F FOR NO TEST. SAME COLUMNS. -SSYR2K T PUT F FOR NO TEST. SAME COLUMNS. +SGEMM T PUT F FOR NO TEST. SAME COLUMNS. +SSYMM T PUT F FOR NO TEST. SAME COLUMNS. +STRMM T PUT F FOR NO TEST. SAME COLUMNS. +STRSM T PUT F FOR NO TEST. SAME COLUMNS. +SSYRK T PUT F FOR NO TEST. SAME COLUMNS. +SSYR2K T PUT F FOR NO TEST. SAME COLUMNS. +SGEMMTR T PUT F FOR NO TEST. SAME COLUMNS. diff --git a/BLAS/TESTING/zblat1.f b/BLAS/TESTING/zblat1.f index 118212d098..71438c420d 100644 --- a/BLAS/TESTING/zblat1.f +++ b/BLAS/TESTING/zblat1.f @@ -34,6 +34,7 @@ * * ===================================================================== PROGRAM ZBLAT1 + IMPLICIT NONE * * -- Reference BLAS test routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -58,7 +59,7 @@ PROGRAM ZBLAT1 DATA SFAC/9.765625D-4/ * .. Executable Statements .. WRITE (NOUT,99999) - DO 20 IC = 1, 10 + DO 20 IC = 1, 11 ICASE = IC CALL HEADER * @@ -71,7 +72,7 @@ PROGRAM ZBLAT1 INCX = 9999 INCY = 9999 MODE = 9999 - IF (ICASE.LE.5) THEN + IF (ICASE.LE.5 .OR. ICASE.EQ.11) THEN CALL CHECK2(SFAC) ELSE IF (ICASE.GE.6) THEN CALL CHECK1(SFAC) @@ -95,7 +96,7 @@ SUBROUTINE HEADER INTEGER ICASE, INCX, INCY, MODE, N LOGICAL PASS * .. Local Arrays .. - CHARACTER*6 L(10) + CHARACTER*6 L(11) * .. Common blocks .. COMMON /COMBLA/ICASE, N, INCX, INCY, MODE, PASS * .. Data statements .. @@ -109,6 +110,8 @@ SUBROUTINE HEADER DATA L(8)/'ZSCAL '/ DATA L(9)/'ZDSCAL'/ DATA L(10)/'IZAMAX'/ + DATA L(11)/'ZAXPBY'/ + * .. Executable Statements .. WRITE (NOUT,99999) ICASE, L(ICASE) RETURN @@ -119,9 +122,11 @@ SUBROUTINE HEADER * END SUBROUTINE CHECK1(SFAC) + IMPLICIT NONE * .. Parameters .. INTEGER NOUT - PARAMETER (NOUT=6) + DOUBLE PRECISION THRESH + PARAMETER (NOUT=6, THRESH=10.0D0) * .. Scalar Arguments .. DOUBLE PRECISION SFAC * .. Scalars in Common .. @@ -141,7 +146,7 @@ SUBROUTINE CHECK1(SFAC) INTEGER IZAMAX EXTERNAL DZASUM, DZNRM2, IZAMAX * .. External Subroutines .. - EXTERNAL ZSCAL, ZDSCAL, CTEST, ITEST1, STEST1 + EXTERNAL ZB1NRM2, ZSCAL, ZDSCAL, CTEST, ITEST1, STEST1 * .. Intrinsic Functions .. INTRINSIC MAX * .. Common blocks .. @@ -256,6 +261,10 @@ SUBROUTINE CHECK1(SFAC) 20 CONTINUE IF (ICASE.EQ.6) THEN * .. DZNRM2 .. +* Test scaling when some entries are tiny or huge + CALL ZB1NRM2(N,(INCX-2)*2,THRESH) + CALL ZB1NRM2(N,INCX,THRESH) +* Test with hardcoded mid range entries CALL STEST1(DZNRM2(N,CX,INCX),STRUE2(NP1),STRUE2(NP1), + SFAC) ELSE IF (ICASE.EQ.7) THEN @@ -340,6 +349,7 @@ SUBROUTINE CHECK1(SFAC) * END SUBROUTINE CHECK2(SFAC) + IMPLICIT NONE * .. Parameters .. INTEGER NOUT PARAMETER (NOUT=6) @@ -349,26 +359,27 @@ SUBROUTINE CHECK2(SFAC) INTEGER ICASE, INCX, INCY, MODE, N LOGICAL PASS * .. Local Scalars .. - COMPLEX*16 CA + COMPLEX*16 CA, CB INTEGER I, J, KI, KN, KSIZE, LENX, LENY, LINCX, LINCY, + MX, MY * .. Local Arrays .. COMPLEX*16 CDOT(1), CSIZE1(4), CSIZE2(7,2), CSIZE3(14), + CT10X(7,4,4), CT10Y(7,4,4), CT6(4,4), CT7(4,4), + CT8(7,4,4), CTY0(1), CX(7), CX0(1), CX1(7), - + CY(7), CY0(1), CY1(7) + + CY(7), CY0(1), CY1(7), CT11(7,4,4) INTEGER INCXS(4), INCYS(4), LENS(4,2), NS(4) * .. External Functions .. COMPLEX*16 ZDOTC, ZDOTU EXTERNAL ZDOTC, ZDOTU * .. External Subroutines .. - EXTERNAL ZAXPY, ZCOPY, ZSWAP, CTEST + EXTERNAL ZAXPY, ZAXPBY, ZCOPY, ZSWAP, CTEST * .. Intrinsic Functions .. INTRINSIC ABS, MIN * .. Common blocks .. COMMON /COMBLA/ICASE, N, INCX, INCY, MODE, PASS * .. Data statements .. DATA CA/(0.4D0,-0.7D0)/ + DATA CB/(0.7D0,-0.4D0)/ DATA INCXS/1, 2, -2, -1/ DATA INCYS/1, -2, 1, -2/ DATA LENS/1, 1, 2, 4, 1, 1, 3, 7/ @@ -538,6 +549,54 @@ SUBROUTINE CHECK2(SFAC) + (1.54D0,1.54D0), (1.54D0,1.54D0), + (1.54D0,1.54D0), (1.54D0,1.54D0), + (1.54D0,1.54D0), (1.54D0,1.54D0)/ + + DATA ((CT11(I,J,1),I=1,7),J=1,4)/(0.6D0,-0.6D0), + + (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0), + + (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0), + + (-0.1D0,-1.47D0), (0.0D0,0.0D0), (0.0D0,0.0D0), + + (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0), + + (0.0D0,0.0D0), (-0.1D0,-1.47D0), + + (-1.08D0,0.71D0), (0.0D0,0.0D0), (0.0D0,0.0D0), + + (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0), + + (-0.1D0,-1.47D0), (-1.08D0,0.71D0), + + (-0.42D0,-0.99D0), (-0.61D0,-0.85D0), + + (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0)/ + DATA ((CT11(I,J,2),I=1,7),J=1,4)/(0.6D0,-0.6D0), + + (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0), + + (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0), + + (-0.1D0,-1.47D0), (0.0D0,0.0D0), (0.0D0,0.0D0), + + (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0), + + (0.0D0,0.0D0), (-0.49D0,-0.95D0), + + (-0.9D0,0.5D0),(-0.03D0,-1.51D0), (0.0D0,0.0D0), + + (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0), + + (0.36D0,0.00D0), (-0.9D0,0.5D0), + + (-0.39D0,-0.23D0), (0.1D0,-0.5D0), + + (-0.82D0,-0.39D0), (-0.5D0,-0.3D0), + + (0.0D0,-1.62D0)/ + DATA ((CT11(I,J,3),I=1,7),J=1,4)/(0.6D0,-0.6D0), + + (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0), + + (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0), + + (-0.1D0,-1.47D0), (0.0D0,0.0D0), (0.0D0,0.0D0), + + (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0), + + (0.0D0,0.0D0), (-0.49D0,-0.95D0), + + (-0.71D0,-0.1D0), (0.0D0,0.0D0), (0.0D0,0.0D0), + + (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0), + + (0.36D0,0.00D0), (-1.07D0,1.18D0), + + (-0.42D0,-0.99D0), (-0.41D0,-1.2D0), + + (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0)/ + DATA ((CT11(I,J,4),I=1,7),J=1,4)/(0.6D0,-0.6D0), + + (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0), + + (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0), + + (-0.1D0,-1.47D0), (0.0D0,0.0D0), (0.0D0,0.0D0), + + (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0), + + (0.0D0,0.0D0), (-0.1D0,-1.47D0), (-0.9D0,0.5D0), + + (-0.4D0,-0.7D0), (0.0D0,0.0D0), (0.0D0,0.0D0), + + (0.0D0,0.0D0), (0.0D0,0.0D0), (-0.1D0,-1.47D0), + + (-0.9D0,0.5D0),(-0.4D0,-0.7D0), (0.1D0,-0.5D0), + + (-0.82D0,-0.39D0), (-0.5D0,-0.3D0), + + (-0.2D0,-1.27D0)/ + + * .. Executable Statements .. DO 60 KI = 1, 4 INCX = INCXS(KI) @@ -593,6 +652,10 @@ SUBROUTINE CHECK2(SFAC) CALL ZSWAP(N,CX,INCX,CY,INCY) CALL CTEST(LENX,CX,CT10X(1,KN,KI),CSIZE3,1.0D0) CALL CTEST(LENY,CY,CT10Y(1,KN,KI),CSIZE3,1.0D0) + ELSE IF (ICASE.EQ.11) THEN +* .. ZAXPY .. + CALL ZAXPBY(N,CA,CX,INCX,CB, CY,INCY) + CALL CTEST(LENY,CY,CT11(1,KN,KI),CSIZE2(1,KSIZE),SFAC) ELSE WRITE (NOUT,*) ' Shouldn''t be here in CHECK2' STOP @@ -606,6 +669,7 @@ SUBROUTINE CHECK2(SFAC) * END SUBROUTINE STEST(LEN,SCOMP,STRUE,SSIZE,SFAC) + IMPLICIT NONE * ********************************* STEST ************************** * * THIS SUBR COMPARES ARRAYS SCOMP() AND STRUE() OF LENGTH LEN TO @@ -665,6 +729,7 @@ SUBROUTINE STEST(LEN,SCOMP,STRUE,SSIZE,SFAC) * END SUBROUTINE STEST1(SCOMP1,STRUE1,SSIZE,SFAC) + IMPLICIT NONE * ************************* STEST1 ***************************** * * THIS IS AN INTERFACE SUBROUTINE TO ACCOMMODATE THE FORTRAN @@ -693,6 +758,7 @@ SUBROUTINE STEST1(SCOMP1,STRUE1,SSIZE,SFAC) * END DOUBLE PRECISION FUNCTION SDIFF(SA,SB) + IMPLICIT NONE * ********************************* SDIFF ************************** * COMPUTES DIFFERENCE OF TWO NUMBERS. C. L. LAWSON, JPL 1974 FEB 15 * @@ -706,6 +772,7 @@ DOUBLE PRECISION FUNCTION SDIFF(SA,SB) * END SUBROUTINE CTEST(LEN,CCOMP,CTRUE,CSIZE,SFAC) + IMPLICIT NONE * **************************** CTEST ***************************** * * C.L. LAWSON, JPL, 1978 DEC 6 @@ -740,6 +807,7 @@ SUBROUTINE CTEST(LEN,CCOMP,CTRUE,CSIZE,SFAC) * END SUBROUTINE ITEST1(ICOMP,ITRUE) + IMPLICIT NONE * ********************************* ITEST1 ************************* * * THIS SUBROUTINE COMPARES THE VARIABLES ICOMP AND ITRUE FOR @@ -782,3 +850,234 @@ SUBROUTINE ITEST1(ICOMP,ITRUE) * End of ITEST1 * END + SUBROUTINE ZB1NRM2(N,INCX,THRESH) + IMPLICIT NONE +* Compare NRM2 with a reference computation using combinations +* of the following values: +* +* 0, very small, small, ulp, 1, 1/ulp, big, very big, infinity, NaN +* +* one of these values is used to initialize x(1) and x(2:N) is +* filled with random values from [-1,1] scaled by another of +* these values. +* +* This routine is adapted from the test suite provided by +* Anderson E. (2017) +* Algorithm 978: Safe Scaling in the Level 1 BLAS +* ACM Trans Math Softw 44:1--28 +* https://doi.org/10.1145/3061665 +* +* .. Scalar Arguments .. + INTEGER INCX, N + DOUBLE PRECISION THRESH +* +* ===================================================================== +* .. Parameters .. + INTEGER NMAX, NOUT, NV + PARAMETER (NMAX=20, NOUT=6, NV=10) + DOUBLE PRECISION HALF, ONE, THREE, TWO, ZERO + PARAMETER (HALF=0.5D+0, ONE=1.0D+0, TWO= 2.0D+0, + & THREE=3.0D+0, ZERO=0.0D+0) +* .. External Functions .. + DOUBLE PRECISION DZNRM2 + EXTERNAL DZNRM2 +* .. Intrinsic Functions .. + INTRINSIC AIMAG, ABS, DCMPLX, DBLE, MAX, MIN, SQRT +* .. Model parameters .. + DOUBLE PRECISION BIGNUM, SAFMAX, SAFMIN, SMLNUM, ULP + PARAMETER (BIGNUM=0.99792015476735990583D+292, + & SAFMAX=0.44942328371557897693D+308, + & SAFMIN=0.22250738585072013831D-307, + & SMLNUM=0.10020841800044863890D-291, + & ULP=0.22204460492503130808D-015) +* .. Local Scalars .. + COMPLEX*16 ROGUE + DOUBLE PRECISION SNRM, TRAT, V0, V1, WORKSSQ, Y1, Y2, + & YMAX, YMIN, YNRM, ZNRM + INTEGER I, IV, IW, IX, KS + LOGICAL FIRST +* .. Local Arrays .. + COMPLEX*16 X(NMAX), Z(NMAX) + DOUBLE PRECISION VALUES(NV), WORK(NMAX) +* .. Executable Statements .. + VALUES(1) = ZERO + VALUES(2) = TWO*SAFMIN + VALUES(3) = SMLNUM + VALUES(4) = ULP + VALUES(5) = ONE + VALUES(6) = ONE / ULP + VALUES(7) = BIGNUM + VALUES(8) = SAFMAX + VALUES(9) = DXVALS(V0,2) + VALUES(10) = DXVALS(V0,3) + ROGUE = DCMPLX(1234.5678D+0,-1234.5678D+0) + FIRST = .TRUE. +* +* Check that the arrays are large enough +* + IF (N*ABS(INCX).GT.NMAX) THEN + WRITE (NOUT,99) "DZNRM2", NMAX, INCX, N, N*ABS(INCX) + RETURN + END IF +* +* Zero-sized inputs are tested in STEST1. + IF (N.LE.0) THEN + RETURN + END IF +* +* Generate 2*(N-1) values in (-1,1). +* + KS = 2*(N-1) + DO I = 1, KS + CALL RANDOM_NUMBER(WORK(I)) + WORK(I) = ONE - TWO*WORK(I) + END DO +* +* Compute the sum of squares of the random values +* by an unscaled algorithm. +* + WORKSSQ = ZERO + DO I = 1, KS + WORKSSQ = WORKSSQ + WORK(I)*WORK(I) + END DO +* +* Construct the test vector with one known value +* and the rest from the random work array multiplied +* by a scaling factor. +* + DO IV = 1, NV + V0 = VALUES(IV) + IF (ABS(V0).GT.ONE) THEN + V0 = V0*HALF*HALF + END IF + Z(1) = DCMPLX(V0,-THREE*V0) + DO IW = 1, NV + V1 = VALUES(IW) + IF (ABS(V1).GT.ONE) THEN + V1 = (V1*HALF) / SQRT(DBLE(KS+1)) + END IF + DO I = 1, N-1 + Z(I+1) = DCMPLX(V1*WORK(2*I-1),V1*WORK(2*I)) + END DO +* +* Compute the expected value of the 2-norm +* + Y1 = ABS(V0) * SQRT(10.0D0) + IF (N.GT.1) THEN + Y2 = ABS(V1)*SQRT(WORKSSQ) + ELSE + Y2 = ZERO + END IF + YMIN = MIN(Y1, Y2) + YMAX = MAX(Y1, Y2) +* +* Expected value is NaN if either is NaN. The test +* for YMIN == YMAX avoids further computation if both +* are infinity. +* + IF ((Y1.NE.Y1).OR.(Y2.NE.Y2)) THEN +* add to propagate NaN + YNRM = Y1 + Y2 + ELSE IF (YMIN == YMAX) THEN + YNRM = SQRT(TWO)*YMAX + ELSE IF (YMAX == ZERO) THEN + YNRM = ZERO + ELSE + YNRM = YMAX*SQRT(ONE + (YMIN / YMAX)**2) + END IF +* +* Fill the input array to DZNRM2 with steps of incx +* + DO I = 1, N + X(I) = ROGUE + END DO + IX = 1 + IF (INCX.LT.0) IX = 1 - (N-1)*INCX + DO I = 1, N + X(IX) = Z(I) + IX = IX + INCX + END DO +* +* Call DZNRM2 to compute the 2-norm +* + SNRM = DZNRM2(N,X,INCX) +* +* Compare SNRM and ZNRM. Roundoff error grows like O(n) +* in this implementation so we scale the test ratio accordingly. +* + IF (INCX.EQ.0) THEN + Y1 = ABS(DBLE(X(1))) + Y2 = ABS(AIMAG(X(1))) + YMIN = MIN(Y1, Y2) + YMAX = MAX(Y1, Y2) + IF ((Y1.NE.Y1).OR.(Y2.NE.Y2)) THEN +* add to propagate NaN + ZNRM = Y1 + Y2 + ELSE IF (YMIN == YMAX) THEN + ZNRM = SQRT(TWO)*YMAX + ELSE IF (YMAX == ZERO) THEN + ZNRM = ZERO + ELSE + ZNRM = YMAX * SQRT(ONE + (YMIN / YMAX)**2) + END IF + ZNRM = SQRT(DBLE(n)) * ZNRM + ELSE + ZNRM = YNRM + END IF +* +* The tests for NaN rely on the compiler not being overly +* aggressive and removing the statements altogether. + IF ((SNRM.NE.SNRM).OR.(ZNRM.NE.ZNRM)) THEN + IF ((SNRM.NE.SNRM).NEQV.(ZNRM.NE.ZNRM)) THEN + TRAT = ONE / ULP + ELSE + TRAT = ZERO + END IF + ELSE IF (ZNRM == ZERO) THEN + TRAT = SNRM / ULP + ELSE + TRAT = (ABS(SNRM-ZNRM) / ZNRM) / (TWO*DBLE(N)*ULP) + END IF + IF ((TRAT.NE.TRAT).OR.(TRAT.GE.THRESH)) THEN + IF (FIRST) THEN + FIRST = .FALSE. + WRITE(NOUT,99999) + END IF + WRITE (NOUT,98) "DZNRM2", N, INCX, IV, IW, TRAT + END IF + END DO + END DO +99999 FORMAT (' FAIL') + 99 FORMAT ( ' Not enough space to test ', A6, ': NMAX = ',I6, + + ', INCX = ',I6,/,' N = ',I6,', must be at least ',I6 ) + 98 FORMAT( 1X, A6, ': N=', I6,', INCX=', I4, ', IV=', I2, ', IW=', + + I2, ', test=', E15.8 ) + RETURN + CONTAINS + DOUBLE PRECISION FUNCTION DXVALS(XX,K) + IMPLICIT NONE +* .. Scalar Arguments .. + DOUBLE PRECISION XX + INTEGER K +* .. Parameters .. + DOUBLE PRECISION ZERO + PARAMETER (ZERO=0.0D+0) +* .. Local Scalars .. + DOUBLE PRECISION X, Y, Z +* .. Intrinsic Functions .. + INTRINSIC HUGE +* .. Executable Statements .. + X = ZERO + Y = HUGE(XX) + Z = Y*Y + IF (K.EQ.1) THEN + X = -Z + ELSE IF (K.EQ.2) THEN + X = Z + ELSE IF (K.EQ.3) THEN + X = Z / Z + END IF + DXVALS = X + RETURN + END + END diff --git a/BLAS/TESTING/zblat2.f b/BLAS/TESTING/zblat2.f index 662ef683b2..b7f4a3c716 100644 --- a/BLAS/TESTING/zblat2.f +++ b/BLAS/TESTING/zblat2.f @@ -100,6 +100,7 @@ * * ===================================================================== PROGRAM ZBLAT2 + IMPLICIT NONE * * -- Reference BLAS test routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -436,6 +437,7 @@ SUBROUTINE ZCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF, NBET, $ BET, NINC, INC, NMAX, INCMAX, A, AA, AS, X, XX, $ XS, Y, YY, YS, YT, G ) + IMPLICIT NONE * * Tests ZGEMV and ZGBMV. * @@ -481,7 +483,7 @@ SUBROUTINE ZCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, LOGICAL LZE, LZERES EXTERNAL LZE, LZERES * .. External Subroutines .. - EXTERNAL ZGBMV, ZGEMV, ZMAKE, ZMVCH + EXTERNAL ZGBMV, ZGEMV, ZMAKE, ZMVCH, ZREGR1 * .. Intrinsic Functions .. INTRINSIC ABS, MAX, MIN * .. Scalars in Common .. @@ -736,6 +738,34 @@ SUBROUTINE ZCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * 120 CONTINUE * +* Regression test to verify preservation of y when m zero, n nonzero. +* + CALL ZREGR1( TRANS, M, N, LY, KL, KU, ALPHA, AA, LDA, XX, INCX, + $ BETA, YY, INCY, YS ) + IF( FULL )THEN + IF( TRACE ) + $ WRITE( NTRA, FMT = 9994 )NC, SNAME, TRANS, M, N, ALPHA, LDA, + $ INCX, BETA, INCY + IF( REWI ) + $ REWIND NTRA + CALL ZGEMV( TRANS, M, N, ALPHA, AA, LDA, XX, INCX, BETA, YY, + $ INCY ) + ELSE IF( BANDED )THEN + IF( TRACE ) + $ WRITE( NTRA, FMT = 9995 )NC, SNAME, TRANS, M, N, KL, KU, + $ ALPHA, LDA, INCX, BETA, INCY + IF( REWI ) + $ REWIND NTRA + CALL ZGBMV( TRANS, M, N, KL, KU, ALPHA, AA, LDA, XX, INCX, + $ BETA, YY, INCY ) + END IF + NC = NC + 1 + IF( .NOT.LZE( YS, YY, LY ) )THEN + WRITE( NOUT, FMT = 9998 )NARGS - 1 + FATAL = .TRUE. + GO TO 130 + END IF +* * Report result. * IF( ERRMAX.LT.THRESH )THEN @@ -782,6 +812,7 @@ SUBROUTINE ZCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF, NBET, $ BET, NINC, INC, NMAX, INCMAX, A, AA, AS, X, XX, $ XS, Y, YY, YS, YT, G ) + IMPLICIT NONE * * Tests ZHEMV, ZHBMV and ZHPMV. * @@ -1130,6 +1161,7 @@ SUBROUTINE ZCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, SUBROUTINE ZCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NKB, KB, NINC, INC, NMAX, $ INCMAX, A, AA, AS, X, XX, XS, XT, G, Z ) + IMPLICIT NONE * * Tests ZTRMV, ZTBMV, ZTPMV, ZTRSV, ZTBSV and ZTPSV. * @@ -1493,6 +1525,7 @@ SUBROUTINE ZCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX, $ INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G, $ Z ) + IMPLICIT NONE * * Tests ZGERC and ZGERU. * @@ -1771,6 +1804,7 @@ SUBROUTINE ZCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX, $ INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G, $ Z ) + IMPLICIT NONE * * Tests ZHER and ZHPR. * @@ -2056,6 +2090,7 @@ SUBROUTINE ZCHK6( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX, $ INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G, $ Z ) + IMPLICIT NONE * * Tests ZHER2 and ZHPR2. * @@ -2376,6 +2411,7 @@ SUBROUTINE ZCHK6( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * END SUBROUTINE ZCHKE( ISNUM, SRNAMT, NOUT ) + IMPLICIT NONE * * Tests the error exits from the Level 2 Blas. * Requires a special version of the error-handling routine XERBLA. @@ -2720,6 +2756,7 @@ SUBROUTINE ZCHKE( ISNUM, SRNAMT, NOUT ) END SUBROUTINE ZMAKE( TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, KL, $ KU, RESET, TRANSL ) + IMPLICIT NONE * * Generates values for an M by N matrix A within the bandwidth * defined by KL and KU. @@ -2913,6 +2950,7 @@ SUBROUTINE ZMAKE( TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, KL, END SUBROUTINE ZMVCH( TRANS, M, N, ALPHA, A, NMAX, X, INCX, BETA, Y, $ INCY, YT, G, YY, EPS, ERR, FATAL, NOUT, MV ) + IMPLICIT NONE * * Checks the results of the computational tests. * @@ -3044,6 +3082,7 @@ SUBROUTINE ZMVCH( TRANS, M, N, ALPHA, A, NMAX, X, INCX, BETA, Y, * END LOGICAL FUNCTION LZE( RI, RJ, LR ) + IMPLICIT NONE * * Tests if two arrays are identical. * @@ -3074,6 +3113,7 @@ LOGICAL FUNCTION LZE( RI, RJ, LR ) * END LOGICAL FUNCTION LZERES( TYPE, UPLO, M, N, AA, AS, LDA ) + IMPLICIT NONE * * Tests if selected elements in two arrays are equal. * @@ -3133,6 +3173,7 @@ LOGICAL FUNCTION LZERES( TYPE, UPLO, M, N, AA, AS, LDA ) * END COMPLEX*16 FUNCTION ZBEG( RESET ) + IMPLICIT NONE * * Generates complex numbers as pairs of random numbers uniformly * distributed between -0.5 and 0.5. @@ -3185,6 +3226,7 @@ COMPLEX*16 FUNCTION ZBEG( RESET ) * END DOUBLE PRECISION FUNCTION DDIFF( X, Y ) + IMPLICIT NONE * * Auxiliary routine for test program for Level 2 Blas. * @@ -3201,6 +3243,7 @@ DOUBLE PRECISION FUNCTION DDIFF( X, Y ) * END SUBROUTINE CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + IMPLICIT NONE * * Tests whether XERBLA has detected an error when it should. * @@ -3227,8 +3270,43 @@ SUBROUTINE CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) * * End of CHKXER * + END + SUBROUTINE ZREGR1( TRANS, M, N, LY, KL, KU, ALPHA, A, LDA, X, + $ INCX, BETA, Y, INCY, YS ) + IMPLICIT NONE +* +* Input initialization for regression test. +* +* .. Scalar Arguments .. + CHARACTER*1 TRANS + INTEGER LY, M, N, KL, KU, LDA, INCX, INCY + COMPLEX*16 ALPHA, BETA +* .. Array Arguments .. + COMPLEX*16 A(LDA,*), X(*), Y(*), YS(*) +* .. Local Scalars .. + INTEGER I +* .. Intrinsic Functions .. + INTRINSIC DBLE, DCMPLX +* .. Executable Statements .. + TRANS = 'T' + M = 0 + N = 5 + KL = 0 + KU = 0 + ALPHA = DCMPLX( 1.0D0 ) + LDA = MAX( 1, M ) + INCX = 1 + BETA = DCMPLX( -0.7D0, -0.8D0 ) + INCY = 1 + LY = ABS( INCY )*N + DO 10 I = 1, LY + Y( I ) = DCMPLX( 42.0D0, DBLE( I ) ) + YS( I ) = Y( I ) + 10 CONTINUE + RETURN END SUBROUTINE XERBLA( SRNAME, INFO ) + IMPLICIT NONE * * This is a special version of XERBLA to be used only as part of * the test program for testing error exits from the Level 2 BLAS diff --git a/BLAS/TESTING/zblat3.f b/BLAS/TESTING/zblat3.f index fb4d8019e9..ccb492a657 100644 --- a/BLAS/TESTING/zblat3.f +++ b/BLAS/TESTING/zblat3.f @@ -19,8 +19,8 @@ *> Test program for the COMPLEX*16 Level 3 Blas. *> *> The program must be driven by a short data file. The first 14 records -*> of the file are read using list-directed input, the last 9 records -*> are read using the format ( A6, L2 ). An annotated example of a data +*> of the file are read using list-directed input, the last 10 records +*> are read using the format ( A7, L2 ). An annotated example of a data *> file can be obtained by deleting the first 3 characters from the *> following 23 lines: *> 'zblat3.out' NAME OF SUMMARY OUTPUT FILE @@ -46,6 +46,7 @@ *> ZSYRK T PUT F FOR NO TEST. SAME COLUMNS. *> ZHER2K T PUT F FOR NO TEST. SAME COLUMNS. *> ZSYR2K T PUT F FOR NO TEST. SAME COLUMNS. +*> ZGEMMTR T PUT F FOR NO TEST. SAME COLUMNS. *> *> *> Further Details @@ -83,6 +84,7 @@ * * ===================================================================== PROGRAM ZBLAT3 + IMPLICIT NONE * * -- Reference BLAS test routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- @@ -94,7 +96,7 @@ PROGRAM ZBLAT3 INTEGER NIN PARAMETER ( NIN = 5 ) INTEGER NSUBS - PARAMETER ( NSUBS = 9 ) + PARAMETER ( NSUBS = 10 ) COMPLEX*16 ZERO, ONE PARAMETER ( ZERO = ( 0.0D0, 0.0D0 ), $ ONE = ( 1.0D0, 0.0D0 ) ) @@ -110,7 +112,7 @@ PROGRAM ZBLAT3 LOGICAL FATAL, LTESTT, REWI, SAME, SFATAL, TRACE, $ TSTERR CHARACTER*1 TRANSA, TRANSB - CHARACTER*6 SNAMET + CHARACTER*7 SNAMET CHARACTER*32 SNAPS, SUMMRY * .. Local Arrays .. COMPLEX*16 AA( NMAX*NMAX ), AB( NMAX, 2*NMAX ), @@ -122,26 +124,27 @@ PROGRAM ZBLAT3 DOUBLE PRECISION G( NMAX ) INTEGER IDIM( NIDMAX ) LOGICAL LTEST( NSUBS ) - CHARACTER*6 SNAMES( NSUBS ) + CHARACTER*7 SNAMES( NSUBS ) * .. External Functions .. DOUBLE PRECISION DDIFF LOGICAL LZE EXTERNAL DDIFF, LZE * .. External Subroutines .. - EXTERNAL ZCHK1, ZCHK2, ZCHK3, ZCHK4, ZCHK5, ZCHKE, ZMMCH + EXTERNAL ZCHK1, ZCHK2, ZCHK3, ZCHK4, ZCHK5, ZCHK6 + EXTERNAL ZCHKE, ZMMCH * .. Intrinsic Functions .. INTRINSIC MAX, MIN * .. Scalars in Common .. INTEGER INFOT, NOUTC LOGICAL LERR, OK - CHARACTER*6 SRNAMT + CHARACTER*7 SRNAMT * .. Common blocks .. COMMON /INFOC/INFOT, NOUTC, OK, LERR COMMON /SRNAMC/SRNAMT * .. Data statements .. DATA SNAMES/'ZGEMM ', 'ZHEMM ', 'ZSYMM ', 'ZTRMM ', $ 'ZTRSM ', 'ZHERK ', 'ZSYRK ', 'ZHER2K', - $ 'ZSYR2K'/ + $ 'ZSYR2K', 'ZGEMMTR'/ * .. Executable Statements .. * * Read name and unit number for summary output file and open file. @@ -319,7 +322,7 @@ PROGRAM ZBLAT3 OK = .TRUE. FATAL = .FALSE. GO TO ( 140, 150, 150, 160, 160, 170, 170, - $ 180, 180 )ISNUM + $ 180, 180, 185 )ISNUM * Test ZGEMM, 01. 140 CALL ZCHK1( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE, $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, @@ -348,6 +351,13 @@ PROGRAM ZBLAT3 $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, $ NMAX, AB, AA, AS, BB, BS, C, CC, CS, CT, G, W ) GO TO 190 +* Test ZGEMMTR, 01. + 185 CALL ZCHK6( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE, + $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, + $ NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C, + $ CC, CS, CT, G ) + GO TO 190 + * 190 IF( FATAL.AND.SFATAL ) $ GO TO 210 @@ -384,7 +394,7 @@ PROGRAM ZBLAT3 $ 7( '(', F4.1, ',', F4.1, ') ', : ) ) 9991 FORMAT( ' AMEND DATA FILE OR INCREASE ARRAY SIZES IN PROGRAM', $ /' ******* TESTS ABANDONED *******' ) - 9990 FORMAT( ' SUBPROGRAM NAME ', A6, ' NOT RECOGNIZED', /' ******* T', + 9990 FORMAT( ' SUBPROGRAM NAME ', A7, ' NOT RECOGNIZED', /' ******* T', $ 'ESTS ABANDONED *******' ) 9989 FORMAT( ' ERROR IN ZMMCH - IN-LINE DOT PRODUCTS ARE BEING EVALU', $ 'ATED WRONGLY.', /' ZMMCH WAS CALLED WITH TRANSA = ', A1, @@ -392,8 +402,8 @@ PROGRAM ZBLAT3 $ 'ERR = ', F12.3, '.', /' THIS MAY BE DUE TO FAULTS IN THE ', $ 'ARITHMETIC OR THE COMPILER.', /' ******* TESTS ABANDONED ', $ '*******' ) - 9988 FORMAT( A6, L2 ) - 9987 FORMAT( 1X, A6, ' WAS NOT TESTED' ) + 9988 FORMAT( A7, L2 ) + 9987 FORMAT( 1X, A7, ' WAS NOT TESTED' ) 9986 FORMAT( /' END OF TESTS' ) 9985 FORMAT( /' ******* FATAL ERROR - TESTS ABANDONED *******' ) 9984 FORMAT( ' ERROR-EXITS WILL NOT BE TESTED' ) @@ -424,7 +434,7 @@ SUBROUTINE ZCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, DOUBLE PRECISION EPS, THRESH INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA LOGICAL FATAL, REWI, TRACE - CHARACTER*6 SNAME + CHARACTER*7 SNAME * .. Array Arguments .. COMPLEX*16 A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ), $ AS( NMAX*NMAX ), B( NMAX, NMAX ), @@ -669,15 +679,15 @@ SUBROUTINE ZCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, 130 CONTINUE RETURN * - 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', + 9999 FORMAT( ' ', A7, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', $ 'S)' ) 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', $ 'ANGED INCORRECTLY *******' ) - 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', + 9997 FORMAT( ' ', A7, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', $ 'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2, $ ' - SUSPECT *******' ) - 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' ) - 9995 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',''', A1, ''',', + 9996 FORMAT( ' ******* ', A7, ' FAILED ON CALL NUMBER:' ) + 9995 FORMAT( 1X, I6, ': ', A7, '(''', A1, ''',''', A1, ''',', $ 3( I3, ',' ), '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, $ ',(', F4.1, ',', F4.1, '), C,', I3, ').' ) 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', @@ -709,7 +719,7 @@ SUBROUTINE ZCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, DOUBLE PRECISION EPS, THRESH INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA LOGICAL FATAL, REWI, TRACE - CHARACTER*6 SNAME + CHARACTER*7 SNAME * .. Array Arguments .. COMPLEX*16 A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ), $ AS( NMAX*NMAX ), B( NMAX, NMAX ), @@ -948,15 +958,15 @@ SUBROUTINE ZCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, 120 CONTINUE RETURN * - 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', + 9999 FORMAT( ' ', A7, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', $ 'S)' ) 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', $ 'ANGED INCORRECTLY *******' ) - 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', + 9997 FORMAT( ' ', A7, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', $ 'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2, $ ' - SUSPECT *******' ) - 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' ) - 9995 FORMAT( 1X, I6, ': ', A6, '(', 2( '''', A1, ''',' ), 2( I3, ',' ), + 9996 FORMAT( ' ******* ', A7, ' FAILED ON CALL NUMBER:' ) + 9995 FORMAT( 1X, I6, ': ', A7, '(', 2( '''', A1, ''',' ), 2( I3, ',' ), $ '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ',(', F4.1, $ ',', F4.1, '), C,', I3, ') .' ) 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', @@ -989,7 +999,7 @@ SUBROUTINE ZCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, DOUBLE PRECISION EPS, THRESH INTEGER NALF, NIDIM, NMAX, NOUT, NTRA LOGICAL FATAL, REWI, TRACE - CHARACTER*6 SNAME + CHARACTER*7 SNAME * .. Array Arguments .. COMPLEX*16 A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ), $ AS( NMAX*NMAX ), B( NMAX, NMAX ), @@ -1259,15 +1269,15 @@ SUBROUTINE ZCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, 160 CONTINUE RETURN * - 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', + 9999 FORMAT( ' ', A7, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', $ 'S)' ) 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', $ 'ANGED INCORRECTLY *******' ) - 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', + 9997 FORMAT( ' ', A7, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', $ 'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2, $ ' - SUSPECT *******' ) - 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' ) - 9995 FORMAT( 1X, I6, ': ', A6, '(', 4( '''', A1, ''',' ), 2( I3, ',' ), + 9996 FORMAT( ' ******* ', A7, ' FAILED ON CALL NUMBER:' ) + 9995 FORMAT( 1X, I6, ': ', A7, '(', 4( '''', A1, ''',' ), 2( I3, ',' ), $ '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ') ', $ ' .' ) 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', @@ -1299,7 +1309,7 @@ SUBROUTINE ZCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, DOUBLE PRECISION EPS, THRESH INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA LOGICAL FATAL, REWI, TRACE - CHARACTER*6 SNAME + CHARACTER*7 SNAME * .. Array Arguments .. COMPLEX*16 A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ), $ AS( NMAX*NMAX ), B( NMAX, NMAX ), @@ -1587,19 +1597,19 @@ SUBROUTINE ZCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, 130 CONTINUE RETURN * - 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', + 9999 FORMAT( ' ', A7, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', $ 'S)' ) 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', $ 'ANGED INCORRECTLY *******' ) - 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', + 9997 FORMAT( ' ', A7, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', $ 'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2, $ ' - SUSPECT *******' ) - 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' ) + 9996 FORMAT( ' ******* ', A7, ' FAILED ON CALL NUMBER:' ) 9995 FORMAT( ' THESE ARE THE RESULTS FOR COLUMN ', I3 ) - 9994 FORMAT( 1X, I6, ': ', A6, '(', 2( '''', A1, ''',' ), 2( I3, ',' ), + 9994 FORMAT( 1X, I6, ': ', A7, '(', 2( '''', A1, ''',' ), 2( I3, ',' ), $ F4.1, ', A,', I3, ',', F4.1, ', C,', I3, ') ', $ ' .' ) - 9993 FORMAT( 1X, I6, ': ', A6, '(', 2( '''', A1, ''',' ), 2( I3, ',' ), + 9993 FORMAT( 1X, I6, ': ', A7, '(', 2( '''', A1, ''',' ), 2( I3, ',' ), $ '(', F4.1, ',', F4.1, ') , A,', I3, ',(', F4.1, ',', F4.1, $ '), C,', I3, ') .' ) 9992 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', @@ -1632,7 +1642,7 @@ SUBROUTINE ZCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, DOUBLE PRECISION EPS, THRESH INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA LOGICAL FATAL, REWI, TRACE - CHARACTER*6 SNAME + CHARACTER*7 SNAME * .. Array Arguments .. COMPLEX*16 AA( NMAX*NMAX ), AB( 2*NMAX*NMAX ), $ ALF( NALF ), AS( NMAX*NMAX ), BB( NMAX*NMAX ), @@ -1961,19 +1971,19 @@ SUBROUTINE ZCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, 160 CONTINUE RETURN * - 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', + 9999 FORMAT( ' ', A7, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', $ 'S)' ) 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', $ 'ANGED INCORRECTLY *******' ) - 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', + 9997 FORMAT( ' ', A7, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', $ 'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2, $ ' - SUSPECT *******' ) - 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' ) + 9996 FORMAT( ' ******* ', A7, ' FAILED ON CALL NUMBER:' ) 9995 FORMAT( ' THESE ARE THE RESULTS FOR COLUMN ', I3 ) - 9994 FORMAT( 1X, I6, ': ', A6, '(', 2( '''', A1, ''',' ), 2( I3, ',' ), + 9994 FORMAT( 1X, I6, ': ', A7, '(', 2( '''', A1, ''',' ), 2( I3, ',' ), $ '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ',', F4.1, $ ', C,', I3, ') .' ) - 9993 FORMAT( 1X, I6, ': ', A6, '(', 2( '''', A1, ''',' ), 2( I3, ',' ), + 9993 FORMAT( 1X, I6, ': ', A7, '(', 2( '''', A1, ''',' ), 2( I3, ',' ), $ '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ',(', F4.1, $ ',', F4.1, '), C,', I3, ') .' ) 9992 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', @@ -2003,12 +2013,12 @@ SUBROUTINE ZCHKE( ISNUM, SRNAMT, NOUT ) * * .. Scalar Arguments .. INTEGER ISNUM, NOUT - CHARACTER*6 SRNAMT + CHARACTER*7 SRNAMT * .. Scalars in Common .. INTEGER INFOT, NOUTC LOGICAL LERR, OK * .. Parameters .. - REAL ONE, TWO + DOUBLE PRECISION ONE, TWO PARAMETER ( ONE = 1.0D0, TWO = 2.0D0 ) * .. Local Scalars .. COMPLEX*16 ALPHA, BETA @@ -2017,7 +2027,7 @@ SUBROUTINE ZCHKE( ISNUM, SRNAMT, NOUT ) COMPLEX*16 A( 2, 1 ), B( 2, 1 ), C( 2, 1 ) * .. External Subroutines .. EXTERNAL ZGEMM, ZHEMM, ZHER2K, ZHERK, CHKXER, ZSYMM, - $ ZSYR2K, ZSYRK, ZTRMM, ZTRSM + $ ZSYR2K, ZSYRK, ZTRMM, ZTRSM, ZGEMMTR * .. Intrinsic Functions .. INTRINSIC DCMPLX * .. Common blocks .. @@ -2038,7 +2048,7 @@ SUBROUTINE ZCHKE( ISNUM, SRNAMT, NOUT ) RBETA = TWO * GO TO ( 10, 20, 30, 40, 50, 60, 70, 80, - $ 90 )ISNUM + $ 90, 100 )ISNUM 10 INFOT = 1 CALL ZGEMM( '/', 'N', 0, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) @@ -2219,7 +2229,7 @@ SUBROUTINE ZCHKE( ISNUM, SRNAMT, NOUT ) INFOT = 13 CALL ZGEMM( 'T', 'T', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) - GO TO 100 + GO TO 110 20 INFOT = 1 CALL ZHEMM( '/', 'U', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) @@ -2286,7 +2296,7 @@ SUBROUTINE ZCHKE( ISNUM, SRNAMT, NOUT ) INFOT = 12 CALL ZHEMM( 'R', 'L', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) - GO TO 100 + GO TO 110 30 INFOT = 1 CALL ZSYMM( '/', 'U', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) @@ -2353,7 +2363,7 @@ SUBROUTINE ZCHKE( ISNUM, SRNAMT, NOUT ) INFOT = 12 CALL ZSYMM( 'R', 'L', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) - GO TO 100 + GO TO 110 40 INFOT = 1 CALL ZTRMM( '/', 'U', 'N', 'N', 0, 0, ALPHA, A, 1, B, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) @@ -2510,7 +2520,7 @@ SUBROUTINE ZCHKE( ISNUM, SRNAMT, NOUT ) INFOT = 11 CALL ZTRMM( 'R', 'L', 'T', 'N', 2, 0, ALPHA, A, 1, B, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) - GO TO 100 + GO TO 110 50 INFOT = 1 CALL ZTRSM( '/', 'U', 'N', 'N', 0, 0, ALPHA, A, 1, B, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) @@ -2667,7 +2677,7 @@ SUBROUTINE ZCHKE( ISNUM, SRNAMT, NOUT ) INFOT = 11 CALL ZTRSM( 'R', 'L', 'T', 'N', 2, 0, ALPHA, A, 1, B, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) - GO TO 100 + GO TO 110 60 INFOT = 1 CALL ZHERK( '/', 'N', 0, 0, RALPHA, A, 1, RBETA, C, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) @@ -2722,7 +2732,7 @@ SUBROUTINE ZCHKE( ISNUM, SRNAMT, NOUT ) INFOT = 10 CALL ZHERK( 'L', 'C', 2, 0, RALPHA, A, 1, RBETA, C, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) - GO TO 100 + GO TO 110 70 INFOT = 1 CALL ZSYRK( '/', 'N', 0, 0, ALPHA, A, 1, BETA, C, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) @@ -2777,7 +2787,7 @@ SUBROUTINE ZCHKE( ISNUM, SRNAMT, NOUT ) INFOT = 10 CALL ZSYRK( 'L', 'T', 2, 0, ALPHA, A, 1, BETA, C, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) - GO TO 100 + GO TO 110 80 INFOT = 1 CALL ZHER2K( '/', 'N', 0, 0, ALPHA, A, 1, B, 1, RBETA, C, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) @@ -2844,7 +2854,7 @@ SUBROUTINE ZCHKE( ISNUM, SRNAMT, NOUT ) INFOT = 12 CALL ZHER2K( 'L', 'C', 2, 0, ALPHA, A, 1, B, 1, RBETA, C, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) - GO TO 100 + GO TO 110 90 INFOT = 1 CALL ZSYR2K( '/', 'N', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) @@ -2911,16 +2921,212 @@ SUBROUTINE ZCHKE( ISNUM, SRNAMT, NOUT ) INFOT = 12 CALL ZSYR2K( 'L', 'T', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + GO TO 110 + 100 INFOT = 1 + CALL ZGEMMTR( '/', 'N', 'N', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 1 + CALL ZGEMMTR( '/', 'N', 'T', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 1 + CALL ZGEMMTR( '/', 'N', 'C', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 1 + CALL ZGEMMTR( '/', 'T', 'N', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 1 + CALL ZGEMMTR( '/', 'T', 'T', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 1 + CALL ZGEMMTR( '/', 'T', 'C', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 1 + CALL ZGEMMTR( '/', 'C', 'N', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 1 + CALL ZGEMMTR( '/', 'C', 'T', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 1 + CALL ZGEMMTR( '/', 'C', 'C', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + + INFOT = 2 + CALL ZGEMMTR( 'U', '/', 'N', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 2 + CALL ZGEMMTR( 'U', '/', 'C', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 2 + CALL ZGEMMTR( 'U', '/', 'T', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 2 + CALL ZGEMMTR( 'L', '/', 'N', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 2 + CALL ZGEMMTR( 'L', '/', 'C', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 2 + CALL ZGEMMTR( 'L', '/', 'T', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + + INFOT = 3 + CALL ZGEMMTR( 'U', 'N', '/', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 3 + CALL ZGEMMTR( 'U', 'C', '/', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 3 + CALL ZGEMMTR( 'U', 'T', '/', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 4 + CALL ZGEMMTR( 'U', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 4 + CALL ZGEMMTR( 'U', 'N', 'C', -1, 0, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 4 + CALL ZGEMMTR( 'U', 'N', 'T', -1, 0, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 4 + CALL ZGEMMTR( 'U', 'C', 'N', -1, 0, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 4 + CALL ZGEMMTR( 'U', 'C', 'C', -1, 0, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 4 + CALL ZGEMMTR( 'U', 'C', 'T', -1, 0, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 4 + CALL ZGEMMTR( 'U', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 4 + CALL ZGEMMTR( 'U', 'T', 'C', -1, 0, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 4 + CALL ZGEMMTR( 'U', 'T', 'T', -1, 0, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 5 + CALL ZGEMMTR( 'U', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 5 + CALL ZGEMMTR( 'U', 'N', 'C', 0, -1, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 5 + CALL ZGEMMTR( 'U', 'N', 'T', 0, -1, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 5 + CALL ZGEMMTR( 'U', 'C', 'N', 0, -1, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 5 + CALL ZGEMMTR( 'U', 'C', 'C', 0, -1, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 5 + CALL ZGEMMTR( 'U', 'C', 'T', 0, -1, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 5 + CALL ZGEMMTR( 'U', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 5 + CALL ZGEMMTR( 'U', 'T', 'C', 0, -1, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 5 + CALL ZGEMMTR( 'U', 'T', 'T', 0, -1, ALPHA, A, 1, B, 1, BETA, C, + $ 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + + INFOT = 8 + CALL ZGEMMTR( 'U', 'N', 'N', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 2 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 8 + CALL ZGEMMTR( 'U', 'N', 'C', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 2 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 8 + CALL ZGEMMTR( 'U', 'N', 'T', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 2 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 8 + CALL ZGEMMTR( 'U', 'C', 'N', 0, 2, ALPHA, A, 1, B, 2, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 8 + CALL ZGEMMTR( 'U', 'C', 'C', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 8 + CALL ZGEMMTR( 'U', 'C', 'T', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 8 + CALL ZGEMMTR( 'U', 'T', 'N', 0, 2, ALPHA, A, 1, B, 2, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 8 + CALL ZGEMMTR( 'U', 'T', 'C', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 8 + CALL ZGEMMTR( 'U', 'T', 'T', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + + INFOT = 10 + CALL ZGEMMTR( 'U', 'N', 'N', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 10 + CALL ZGEMMTR( 'U', 'C', 'N', 0, 2, ALPHA, A, 2, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 10 + CALL ZGEMMTR( 'U', 'T', 'N', 0, 2, ALPHA, A, 2, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 13 + CALL ZGEMMTR( 'U', 'N', 'N', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 13 + CALL ZGEMMTR( 'U', 'N', 'C', 2, 0, ALPHA, A, 2, B, 2, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 13 + CALL ZGEMMTR( 'U', 'N', 'T', 2, 0, ALPHA, A, 2, B, 2, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 13 + CALL ZGEMMTR( 'U', 'C', 'N', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 13 + CALL ZGEMMTR( 'U', 'C', 'C', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 13 + CALL ZGEMMTR( 'U', 'C', 'T', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 13 + CALL ZGEMMTR( 'U', 'T', 'N', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 13 + CALL ZGEMMTR( 'U', 'T', 'C', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + INFOT = 13 + CALL ZGEMMTR( 'U', 'T', 'T', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 1 ) + CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) + GO TO 110 + * - 100 IF( OK )THEN + 110 IF( OK )THEN WRITE( NOUT, FMT = 9999 )SRNAMT ELSE WRITE( NOUT, FMT = 9998 )SRNAMT END IF RETURN * - 9999 FORMAT( ' ', A6, ' PASSED THE TESTS OF ERROR-EXITS' ) - 9998 FORMAT( ' ******* ', A6, ' FAILED THE TESTS OF ERROR-EXITS *****', + 9999 FORMAT( ' ', A7, ' PASSED THE TESTS OF ERROR-EXITS' ) + 9998 FORMAT( ' ******* ', A7, ' FAILED THE TESTS OF ERROR-EXITS *****', $ '**' ) * * End of ZCHKE @@ -3426,7 +3632,7 @@ SUBROUTINE CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) * .. Scalar Arguments .. INTEGER INFOT, NOUT LOGICAL LERR, OK - CHARACTER*6 SRNAMT + CHARACTER*7 SRNAMT * .. Executable Statements .. IF( .NOT.LERR )THEN WRITE( NOUT, FMT = 9999 )INFOT, SRNAMT @@ -3436,7 +3642,7 @@ SUBROUTINE CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) RETURN * 9999 FORMAT( ' ***** ILLEGAL VALUE OF PARAMETER NUMBER ', I2, ' NOT D', - $ 'ETECTED BY ', A6, ' *****' ) + $ 'ETECTED BY ', A7, ' *****' ) * * End of CHKXER * @@ -3462,14 +3668,16 @@ SUBROUTINE XERBLA( SRNAME, INFO ) * * .. Scalar Arguments .. INTEGER INFO - CHARACTER*6 SRNAME + CHARACTER*(*) SRNAME * .. Scalars in Common .. INTEGER INFOT, NOUT LOGICAL LERR, OK - CHARACTER*6 SRNAMT + CHARACTER*7 SRNAMT * .. Common blocks .. COMMON /INFOC/INFOT, NOUT, OK, LERR COMMON /SRNAMC/SRNAMT +* .. Locals .. + INTEGER SRLEN * .. Executable Statements .. LERR = .TRUE. IF( INFO.NE.INFOT )THEN @@ -3480,7 +3688,8 @@ SUBROUTINE XERBLA( SRNAME, INFO ) END IF OK = .FALSE. END IF - IF( SRNAME.NE.SRNAMT )THEN + SRLEN = MIN(LEN_TRIM(SRNAME), LEN_TRIM(SRNAMT)) + IF( SRNAME(1:SRLEN).NE.SRNAMT(1:SRLEN) )THEN WRITE( NOUT, FMT = 9998 )SRNAME, SRNAMT OK = .FALSE. END IF @@ -3488,11 +3697,506 @@ SUBROUTINE XERBLA( SRNAME, INFO ) * 9999 FORMAT( ' ******* XERBLA WAS CALLED WITH INFO = ', I6, ' INSTEAD', $ ' OF ', I2, ' *******' ) - 9998 FORMAT( ' ******* XERBLA WAS CALLED WITH SRNAME = ', A6, ' INSTE', - $ 'AD OF ', A6, ' *******' ) + 9998 FORMAT( ' ******* XERBLA WAS CALLED WITH SRNAME = ', A7, ' INSTE', + $ 'AD OF ', A7, ' *******' ) 9997 FORMAT( ' ******* XERBLA WAS CALLED WITH INFO = ', I6, $ ' *******' ) * * End of XERBLA * END + + + + SUBROUTINE ZCHK6( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, + $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX, + $ A, AA, AS, B, BB, BS, C, CC, CS, CT, G ) +* +* Tests ZGEMMTR. +* +* Auxiliary routine for test program for Level 3 Blas. +* +* -- Written on 8-February-1989. +* Jack Dongarra, Argonne National Laboratory. +* Iain Duff, AERE Harwell. +* Jeremy Du Croz, Numerical Algorithms Group Ltd. +* Sven Hammarling, Numerical Algorithms Group Ltd. +* +* .. Parameters .. + COMPLEX*16 ZERO + PARAMETER ( ZERO = ( 0.0, 0.0 ) ) + DOUBLE PRECISION RZERO + PARAMETER ( RZERO = 0.0D0 ) +* .. Scalar Arguments .. + DOUBLE PRECISION EPS, THRESH + INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA + LOGICAL FATAL, REWI, TRACE + CHARACTER*7 SNAME +* .. Array Arguments .. + COMPLEX*16 A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ), + $ AS( NMAX*NMAX ), B( NMAX, NMAX ), + $ BB( NMAX*NMAX ), BET( NBET ), BS( NMAX*NMAX ), + $ C( NMAX, NMAX ), CC( NMAX*NMAX ), + $ CS( NMAX*NMAX ), CT( NMAX ) + DOUBLE PRECISION G( NMAX ) + INTEGER IDIM( NIDIM ) +* .. Local Scalars .. + COMPLEX*16 ALPHA, ALS, BETA, BLS + DOUBLE PRECISION ERR, ERRMAX + INTEGER I, IA, IB, ICA, ICB, IK, IN, K, KS, LAA, + $ LBB, LCC, LDA, LDAS, LDB, LDBS, LDC, LDCS, + $ MA, MB, N, NA, NARGS, NB, NC, NS, IS + LOGICAL NULL, RESET, SAME, TRANA, TRANB + CHARACTER*1 TRANAS, TRANBS, TRANSA, TRANSB, UPLO, UPLOS + CHARACTER*3 ICH + CHARACTER*2 ISHAPE +* .. Local Arrays .. + LOGICAL ISAME( 13 ) +* .. External Functions .. + LOGICAL LZE, LZERES + EXTERNAL LZE, LZERES +* .. External Subroutines .. + EXTERNAL ZGEMMTR, ZMAKE, ZMMTCH +* .. Intrinsic Functions .. + INTRINSIC MAX +* .. Scalars in Common .. + INTEGER INFOT, NOUTC + LOGICAL LERR, OK +* .. Common blocks .. + COMMON /INFOC/INFOT, NOUTC, OK, LERR +* .. Data statements .. + DATA ICH/'NTC'/ + DATA ISHAPE/'UL'/ + +* .. Executable Statements .. +* + NARGS = 13 + NC = 0 + RESET = .TRUE. + ERRMAX = RZERO +* + DO 100 IN = 1, NIDIM + N = IDIM( IN ) +* Set LDC to 1 more than minimum value if room. + LDC = N + IF( LDC.LT.NMAX ) + $ LDC = LDC + 1 +* Skip tests if not enough room. + IF( LDC.GT.NMAX ) + $ GO TO 100 + LCC = LDC*N + NULL = N.LE.0 +* + DO 90 IK = 1, NIDIM + K = IDIM( IK ) +* + DO 80 ICA = 1, 3 + TRANSA = ICH( ICA: ICA ) + TRANA = TRANSA.EQ.'T'.OR.TRANSA.EQ.'C' +* + IF( TRANA )THEN + MA = K + NA = N + ELSE + MA = N + NA = K + END IF +* Set LDA to 1 more than minimum value if room. + LDA = MA + IF( LDA.LT.NMAX ) + $ LDA = LDA + 1 +* Skip tests if not enough room. + IF( LDA.GT.NMAX ) + $ GO TO 80 + LAA = LDA*NA +* +* Generate the matrix A. +* + CALL ZMAKE( 'GE', ' ', ' ', MA, NA, A, NMAX, AA, LDA, + $ RESET, ZERO ) +* + DO 70 ICB = 1, 3 + TRANSB = ICH( ICB: ICB ) + TRANB = TRANSB.EQ.'T'.OR.TRANSB.EQ.'C' +* + IF( TRANB )THEN + MB = N + NB = K + ELSE + MB = K + NB = N + END IF +* Set LDB to 1 more than minimum value if room. + LDB = MB + IF( LDB.LT.NMAX ) + $ LDB = LDB + 1 +* Skip tests if not enough room. + IF( LDB.GT.NMAX ) + $ GO TO 70 + LBB = LDB*NB +* +* Generate the matrix B. +* + CALL ZMAKE( 'GE', ' ', ' ', MB, NB, B, NMAX, BB, + $ LDB, RESET, ZERO ) +* + DO 60 IA = 1, NALF + ALPHA = ALF( IA ) +* + DO 50 IB = 1, NBET + BETA = BET( IB ) + DO 45 IS = 1, 2 + UPLO = ISHAPE( IS: IS ) + +* +* Generate the matrix C. +* + CALL ZMAKE( 'GE', UPLO, ' ', N, N, C, NMAX, + $ CC, LDC, RESET, ZERO ) +* + NC = NC + 1 +* +* Save every datum before calling the +* subroutine. +* + UPLOS = UPLO + TRANAS = TRANSA + TRANBS = TRANSB + NS = N + KS = K + ALS = ALPHA + DO 10 I = 1, LAA + AS( I ) = AA( I ) + 10 CONTINUE + LDAS = LDA + DO 20 I = 1, LBB + BS( I ) = BB( I ) + 20 CONTINUE + LDBS = LDB + BLS = BETA + DO 30 I = 1, LCC + CS( I ) = CC( I ) + 30 CONTINUE + LDCS = LDC +* +* Call the subroutine. +* + IF( TRACE ) + $ WRITE( NTRA, FMT = 9995 )NC, SNAME, UPLO, + $ TRANSA, TRANSB, N, K, ALPHA, LDA, LDB, + $ BETA, LDC + IF( REWI ) + $ REWIND NTRA + CALL ZGEMMTR( UPLO, TRANSA, TRANSB, N, K, + $ ALPHA, AA, LDA, BB, LDB, BETA, + $ CC, LDC ) +* +* Check if error-exit was taken incorrectly. +* + IF( .NOT.OK )THEN + WRITE( NOUT, FMT = 9994 ) + FATAL = .TRUE. + GO TO 120 + END IF +* +* See what data changed inside subroutines. +* + ISAME( 1 ) = UPLOS.EQ.UPLO + ISAME( 2 ) = TRANSA.EQ.TRANAS + ISAME( 3 ) = TRANSB.EQ.TRANBS + ISAME( 4 ) = NS.EQ.N + ISAME( 5 ) = KS.EQ.K + ISAME( 6 ) = ALS.EQ.ALPHA + ISAME( 7 ) = LZE( AS, AA, LAA ) + ISAME( 8 ) = LDAS.EQ.LDA + ISAME( 9 ) = LZE( BS, BB, LBB ) + ISAME( 10 ) = LDBS.EQ.LDB + ISAME( 11 ) = BLS.EQ.BETA + IF( NULL )THEN + ISAME( 12 ) = LZE( CS, CC, LCC ) + ELSE + ISAME( 12 ) = LZERES( 'GE', ' ', N, N, CS, + $ CC, LDC ) + END IF + ISAME( 13 ) = LDCS.EQ.LDC +* +* If data was incorrectly changed, report +* and return. +* + SAME = .TRUE. + DO 40 I = 1, NARGS + SAME = SAME.AND.ISAME( I ) + IF( .NOT.ISAME( I ) ) + $ WRITE( NOUT, FMT = 9998 )I + 40 CONTINUE + IF( .NOT.SAME )THEN + FATAL = .TRUE. + GO TO 120 + END IF +* + IF( .NOT.NULL )THEN +* +* Check the result. +* + CALL ZMMTCH( UPLO, TRANSA, TRANSB, N, + $ K, ALPHA, A, NMAX, B, NMAX, + $ BETA, C, NMAX, CT, G, CC, LDC, + $ EPS, ERR, FATAL, NOUT, .TRUE.) + ERRMAX = MAX( ERRMAX, ERR ) +* If got really bad answer, report and +* return. + IF( FATAL ) + $ GO TO 120 + END IF + 45 CONTINUE +* + 50 CONTINUE +* + 60 CONTINUE +* + 70 CONTINUE +* + 80 CONTINUE +* + 90 CONTINUE +* + 100 CONTINUE +* +* +* Report result. +* + IF( ERRMAX.LT.THRESH )THEN + WRITE( NOUT, FMT = 9999 )SNAME, NC + ELSE + WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX + END IF + GO TO 130 +* + 120 CONTINUE + WRITE( NOUT, FMT = 9996 )SNAME + WRITE( NOUT, FMT = 9995 )NC, UPLO, SNAME, TRANSA, TRANSB, N, K, + $ ALPHA, LDA, LDB, BETA, LDC +* + 130 CONTINUE + RETURN +* + 9999 FORMAT( ' ', A7, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', + $ 'S)' ) + 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', + $ 'ANGED INCORRECTLY *******' ) + 9997 FORMAT( ' ', A7, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', + $ 'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2, + $ ' - SUSPECT *******' ) + 9996 FORMAT( ' ******* ', A7, ' FAILED ON CALL NUMBER:' ) + 9995 FORMAT( 1X, I6, ': ', A7, '(''',A1, ''',''',A1, ''',''', A1,''',', + $ 2( I3, ',' ), '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, + $ ',(', F4.1, ',', F4.1, '), C,', I3, ').' ) + 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', + $ '******' ) +* +* End of ZCHK6 +* + END + + SUBROUTINE ZMMTCH( UPLO, TRANSA, TRANSB, N, KK, ALPHA, A, LDA, + $ B, LDB, BETA, C, LDC, CT, G, CC, LDCC, EPS, ERR, + $ FATAL, NOUT, MV ) + IMPLICIT NONE +* +* Checks the results of the computational tests. +* +* Auxiliary routine for test program for Level 3 Blas. +* +* -- Written on 8-February-1989. +* Jack Dongarra, Argonne National Laboratory. +* Iain Duff, AERE Harwell. +* Jeremy Du Croz, Numerical Algorithms Group Ltd. +* Sven Hammarling, Numerical Algorithms Group Ltd. +* +* .. Parameters .. + COMPLEX*16 ZERO + PARAMETER ( ZERO = ( 0.0, 0.0 ) ) + DOUBLE PRECISION RZERO, RONE + PARAMETER ( RZERO = 0.0D0, RONE = 1.0D0 ) +* .. Scalar Arguments .. + COMPLEX*16 ALPHA, BETA + DOUBLE PRECISION EPS, ERR + INTEGER KK, LDA, LDB, LDC, LDCC, N, NOUT + LOGICAL FATAL, MV + CHARACTER*1 TRANSA, TRANSB, UPLO +* .. Array Arguments .. + COMPLEX*16 A( LDA, * ), B( LDB, * ), C( LDC, * ), + $ CC( LDCC, * ), CT( * ) + DOUBLE PRECISION G( * ) +* .. Local Scalars .. + COMPLEX*16 CL + DOUBLE PRECISION ERRI + INTEGER I, J, K, ISTART, ISTOP + LOGICAL CTRANA, CTRANB, TRANA, TRANB, UPPER +* .. Intrinsic Functions .. + INTRINSIC ABS, AIMAG, CONJG, MAX, REAL, SQRT +* .. Statement Functions .. + DOUBLE PRECISION ABS1 +* .. Statement Function definitions .. + ABS1( CL ) = ABS( DBLE( CL ) ) + ABS( DIMAG( CL ) ) +* .. Executable Statements .. + UPPER = UPLO.EQ.'U' + TRANA = TRANSA.EQ.'T'.OR.TRANSA.EQ.'C' + TRANB = TRANSB.EQ.'T'.OR.TRANSB.EQ.'C' + CTRANA = TRANSA.EQ.'C' + CTRANB = TRANSB.EQ.'C' +* +* Compute expected result, one column at a time, in CT using data +* in A, B and C. +* Compute gauges in G. +* + ISTART = 1 + ISTOP = 1 + + DO 220 J = 1, N +* + IF ( UPPER ) THEN + ISTART = 1 + ISTOP = J + ELSE + ISTART = J + ISTOP = N + END IF + + DO 10 I = ISTART, ISTOP + CT( I ) = ZERO + G( I ) = RZERO + 10 CONTINUE + IF( .NOT.TRANA.AND..NOT.TRANB )THEN + DO 30 K = 1, KK + DO 20 I = ISTART, ISTOP + CT( I ) = CT( I ) + A( I, K )*B( K, J ) + G( I ) = G( I ) + ABS1( A( I, K ) )*ABS1( B( K, J ) ) + 20 CONTINUE + 30 CONTINUE + ELSE IF( TRANA.AND..NOT.TRANB )THEN + IF( CTRANA )THEN + DO 50 K = 1, KK + DO 40 I = ISTART, ISTOP + CT( I ) = CT( I ) + CONJG( A( K, I ) )*B( K, J ) + G( I ) = G( I ) + ABS1( A( K, I ) )* + $ ABS1( B( K, J ) ) + 40 CONTINUE + 50 CONTINUE + ELSE + DO 70 K = 1, KK + DO 60 I = ISTART, ISTOP + CT( I ) = CT( I ) + A( K, I )*B( K, J ) + G( I ) = G( I ) + ABS1( A( K, I ) )* + $ ABS1( B( K, J ) ) + 60 CONTINUE + 70 CONTINUE + END IF + ELSE IF( .NOT.TRANA.AND.TRANB )THEN + IF( CTRANB )THEN + DO 90 K = 1, KK + DO 80 I = ISTART, ISTOP + CT( I ) = CT( I ) + A( I, K )*CONJG( B( J, K ) ) + G( I ) = G( I ) + ABS1( A( I, K ) )* + $ ABS1( B( J, K ) ) + 80 CONTINUE + 90 CONTINUE + ELSE + DO 110 K = 1, KK + DO 100 I = ISTART, ISTOP + CT( I ) = CT( I ) + A( I, K )*B( J, K ) + G( I ) = G( I ) + ABS1( A( I, K ) )* + $ ABS1( B( J, K ) ) + 100 CONTINUE + 110 CONTINUE + END IF + ELSE IF( TRANA.AND.TRANB )THEN + IF( CTRANA )THEN + IF( CTRANB )THEN + DO 130 K = 1, KK + DO 120 I = ISTART, ISTOP + CT( I ) = CT( I ) + CONJG( A( K, I ) )* + $ CONJG( B( J, K ) ) + G( I ) = G( I ) + ABS1( A( K, I ) )* + $ ABS1( B( J, K ) ) + 120 CONTINUE + 130 CONTINUE + ELSE + DO 150 K = 1, KK + DO 140 I = ISTART, ISTOP + CT( I ) = CT( I ) + CONJG( A( K, I ) )*B( J, K ) + G( I ) = G( I ) + ABS1( A( K, I ) )* + $ ABS1( B( J, K ) ) + 140 CONTINUE + 150 CONTINUE + END IF + ELSE + IF( CTRANB )THEN + DO 170 K = 1, KK + DO 160 I = ISTART, ISTOP + CT( I ) = CT( I ) + A( K, I )*CONJG( B( J, K ) ) + G( I ) = G( I ) + ABS1( A( K, I ) )* + $ ABS1( B( J, K ) ) + 160 CONTINUE + 170 CONTINUE + ELSE + DO 190 K = 1, KK + DO 180 I = ISTART, ISTOP + CT( I ) = CT( I ) + A( K, I )*B( J, K ) + G( I ) = G( I ) + ABS1( A( K, I ) )* + $ ABS1( B( J, K ) ) + 180 CONTINUE + 190 CONTINUE + END IF + END IF + END IF + DO 200 I = ISTART, ISTOP + CT( I ) = ALPHA*CT( I ) + BETA*C( I, J ) + G( I ) = ABS1( ALPHA )*G( I ) + + $ ABS1( BETA )*ABS1( C( I, J ) ) + 200 CONTINUE +* +* Compute the error ratio for this result. +* + ERR = ZERO + DO 210 I = ISTART, ISTOP + ERRI = ABS1( CT( I ) - CC( I, J ) )/EPS + IF( G( I ).NE.RZERO ) + $ ERRI = ERRI/G( I ) + ERR = MAX( ERR, ERRI ) + IF( ERR*SQRT( EPS ).GE.RONE ) + $ GO TO 230 + 210 CONTINUE +* + 220 CONTINUE +* +* If the loop completes, all results are at least half accurate. + GO TO 250 +* +* Report fatal error. +* + 230 FATAL = .TRUE. + WRITE( NOUT, FMT = 9999 ) + DO 240 I = ISTART, ISTOP + IF( MV )THEN + WRITE( NOUT, FMT = 9998 )I, CT( I ), CC( I, J ) + ELSE + WRITE( NOUT, FMT = 9998 )I, CC( I, J ), CT( I ) + END IF + 240 CONTINUE + IF( N.GT.1 ) + $ WRITE( NOUT, FMT = 9997 )J +* + 250 CONTINUE + RETURN +* + 9999 FORMAT( ' ******* FATAL ERROR - COMPUTED RESULT IS LESS THAN HAL', + $ 'F ACCURATE *******', /' EXPECTED RE', + $ 'SULT COMPUTED RESULT' ) + 9998 FORMAT( 1X, I7, 2( ' (', G15.6, ',', G15.6, ')' ) ) + 9997 FORMAT( ' THESE ARE THE RESULTS FOR COLUMN ', I3 ) +* +* End of ZMMTCH +* + END + diff --git a/BLAS/TESTING/zblat3.in b/BLAS/TESTING/zblat3.in index a3618b0f6d..7768859c11 100644 --- a/BLAS/TESTING/zblat3.in +++ b/BLAS/TESTING/zblat3.in @@ -12,12 +12,13 @@ T LOGICAL FLAG, T TO TEST ERROR EXITS. (0.0,0.0) (1.0,0.0) (0.7,-0.9) VALUES OF ALPHA 3 NUMBER OF VALUES OF BETA (0.0,0.0) (1.0,0.0) (1.3,-1.1) VALUES OF BETA -ZGEMM T PUT F FOR NO TEST. SAME COLUMNS. -ZHEMM T PUT F FOR NO TEST. SAME COLUMNS. -ZSYMM T PUT F FOR NO TEST. SAME COLUMNS. -ZTRMM T PUT F FOR NO TEST. SAME COLUMNS. -ZTRSM T PUT F FOR NO TEST. SAME COLUMNS. -ZHERK T PUT F FOR NO TEST. SAME COLUMNS. -ZSYRK T PUT F FOR NO TEST. SAME COLUMNS. -ZHER2K T PUT F FOR NO TEST. SAME COLUMNS. -ZSYR2K T PUT F FOR NO TEST. SAME COLUMNS. +ZGEMM T PUT F FOR NO TEST. SAME COLUMNS. +ZHEMM T PUT F FOR NO TEST. SAME COLUMNS. +ZSYMM T PUT F FOR NO TEST. SAME COLUMNS. +ZTRMM T PUT F FOR NO TEST. SAME COLUMNS. +ZTRSM T PUT F FOR NO TEST. SAME COLUMNS. +ZHERK T PUT F FOR NO TEST. SAME COLUMNS. +ZSYRK T PUT F FOR NO TEST. SAME COLUMNS. +ZHER2K T PUT F FOR NO TEST. SAME COLUMNS. +ZSYR2K T PUT F FOR NO TEST. SAME COLUMNS. +ZGEMMTR T PUT F FOR NO TEST. SAME COLUMNS. diff --git a/CBLAS/CMakeLists.txt b/CBLAS/CMakeLists.txt index a64ab0cef4..b01d795af9 100644 --- a/CBLAS/CMakeLists.txt +++ b/CBLAS/CMakeLists.txt @@ -1,25 +1,32 @@ -message(STATUS "CBLAS enable") +message(STATUS "CBLAS enabled") enable_language(C) set(LAPACK_INSTALL_EXPORT_NAME ${CBLASLIB}-targets) # Create a header file cblas.h for the routines called in my C programs -include(FortranCInterface) -## Ensure that the fortran compiler and c compiler specified are compatible -FortranCInterface_VERIFY() -FortranCInterface_HEADER(${LAPACK_BINARY_DIR}/include/cblas_mangling.h - MACRO_NAMESPACE "F77_" - SYMBOL_NAMESPACE "F77_") +include(CheckLanguage) +check_language(Fortran) +if(CMAKE_Fortran_COMPILER) + enable_language(Fortran) + include(FortranCInterface) + ## Ensure that the fortran compiler and c compiler specified are compatible + FortranCInterface_VERIFY() + FortranCInterface_HEADER(${LAPACK_BINARY_DIR}/include/cblas_mangling.h + MACRO_NAMESPACE "F77_" + SYMBOL_NAMESPACE "F77_") + + # Check for any necessary platform specific compiler flags + include(CheckLAPACKCompilerFlags) + CheckLAPACKCompilerFlags() +endif() if(NOT FortranCInterface_GLOBAL_FOUND OR NOT FortranCInterface_MODULE_FOUND) - message(WARNING "Reverting to pre-defined include/lapacke_mangling.h") - configure_file(include/lapacke_mangling_with_flags.h.in - ${LAPACK_BINARY_DIR}/include/lapacke_mangling.h) + message(WARNING "Reverting to pre-defined include/cblas_mangling.h") configure_file(include/cblas_mangling_with_flags.h.in ${LAPACK_BINARY_DIR}/include/cblas_mangling.h) endif() include(CheckCSourceCompiles) -check_c_source_compiles("void __attribute__((weak)) main() {};" +check_c_source_compiles("int __attribute__((weak)) main() {};" HAS_ATTRIBUTE_WEAK_SUPPORT) include_directories(include ${LAPACK_BINARY_DIR}/include) diff --git a/CBLAS/cmake/cblas-config-install.cmake.in b/CBLAS/cmake/cblas-config-install.cmake.in index 44046a283b..95b1f71941 100644 --- a/CBLAS/cmake/cblas-config-install.cmake.in +++ b/CBLAS/cmake/cblas-config-install.cmake.in @@ -1,11 +1,8 @@ # Compute locations from /@{LIBRARY_DIR@/cmake/lapacke-/.cmake get_filename_component(_CBLAS_SELF_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) -get_filename_component(_CBLAS_PREFIX "${_CBLAS_SELF_DIR}" PATH) -get_filename_component(_CBLAS_PREFIX "${_CBLAS_PREFIX}" PATH) -get_filename_component(_CBLAS_PREFIX "${_CBLAS_PREFIX}" PATH) # Load the LAPACK package with which we were built. -set(LAPACK_DIR "${_CBLAS_PREFIX}/@CMAKE_INSTALL_LIBDIR@/cmake/@LAPACKLIB@-@LAPACK_VERSION@") +set(LAPACK_DIR "@CMAKE_INSTALL_FULL_LIBDIR@/cmake/@LAPACKLIB@-@LAPACK_VERSION@") find_package(LAPACK NO_MODULE) # Load lapacke targets from the install tree. @@ -14,10 +11,9 @@ if(NOT TARGET @CBLASLIB@) endif() # Report lapacke header search locations. -set(CBLAS_INCLUDE_DIRS ${_CBLAS_PREFIX}/include) +set(CBLAS_INCLUDE_DIRS @CMAKE_INSTALL_FULL_INCLUDEDIR@) # Report lapacke libraries. set(CBLAS_LIBRARIES @CBLASLIB@) -unset(_CBLAS_PREFIX) unset(_CBLAS_SELF_DIR) diff --git a/CBLAS/examples/CMakeLists.txt b/CBLAS/examples/CMakeLists.txt index 74f7d8bb83..61042430ee 100644 --- a/CBLAS/examples/CMakeLists.txt +++ b/CBLAS/examples/CMakeLists.txt @@ -6,3 +6,14 @@ target_link_libraries(xexample2_CBLAS ${CBLASLIB} ${BLAS_LIBRARIES}) add_test(example1_CBLAS ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/xexample1_CBLAS) add_test(example2_CBLAS ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/xexample2_CBLAS) + +if(BUILD_INDEX64_EXT_API) + add_executable(xexample1_64_CBLAS cblas_example1_64.c) + add_executable(xexample2_64_CBLAS cblas_example2_64.c) + + target_link_libraries(xexample1_64_CBLAS ${CBLASLIB}) + target_link_libraries(xexample2_64_CBLAS ${CBLASLIB} ${BLAS_LIBRARIES}) + + add_test(example1_64_CBLAS ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/xexample1_64_CBLAS) + add_test(example2_64_CBLAS ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/xexample2_64_CBLAS) +endif() diff --git a/CBLAS/examples/cblas_example1.c b/CBLAS/examples/cblas_example1.c index 65731ba15c..0571770ba5 100644 --- a/CBLAS/examples/cblas_example1.c +++ b/CBLAS/examples/cblas_example1.c @@ -61,7 +61,7 @@ int main ( ) y, incy ); /* Print y */ for( i = 0; i < n; i++ ) - printf(" y%d = %f\n", i, y[i]); + printf(" y%" CBLAS_IFMT " = %f\n", i, y[i]); free(a); free(x); free(y); diff --git a/CBLAS/examples/cblas_example1_64.c b/CBLAS/examples/cblas_example1_64.c new file mode 100644 index 0000000000..2dfcb73094 --- /dev/null +++ b/CBLAS/examples/cblas_example1_64.c @@ -0,0 +1,69 @@ +/* cblas_example.c */ + +#include +#include +#include "cblas_64.h" + +int main ( ) +{ + CBLAS_LAYOUT Layout; + CBLAS_TRANSPOSE transa; + + double *a, *x, *y; + double alpha, beta; + int64_t m, n, lda, incx, incy, i; + + Layout = CblasColMajor; + transa = CblasNoTrans; + + m = 4; /* Size of Column ( the number of rows ) */ + n = 4; /* Size of Row ( the number of columns ) */ + lda = 4; /* Leading dimension of 5 * 4 matrix is 5 */ + incx = 1; + incy = 1; + alpha = 1; + beta = 0; + + a = (double *)malloc(sizeof(double)*m*n); + x = (double *)malloc(sizeof(double)*n); + y = (double *)malloc(sizeof(double)*n); + /* The elements of the first column */ + a[0] = 1; + a[1] = 2; + a[2] = 3; + a[3] = 4; + /* The elements of the second column */ + a[m] = 1; + a[m+1] = 1; + a[m+2] = 1; + a[m+3] = 1; + /* The elements of the third column */ + a[m*2] = 3; + a[m*2+1] = 4; + a[m*2+2] = 5; + a[m*2+3] = 6; + /* The elements of the fourth column */ + a[m*3] = 5; + a[m*3+1] = 6; + a[m*3+2] = 7; + a[m*3+3] = 8; + /* The elements of x and y */ + x[0] = 1; + x[1] = 2; + x[2] = 1; + x[3] = 1; + y[0] = 0; + y[1] = 0; + y[2] = 0; + y[3] = 0; + + cblas_dgemv_64( Layout, transa, m, n, alpha, a, lda, x, incx, beta, + y, incy ); + /* Print y */ + for( i = 0; i < n; i++ ) + printf(" y%d = %f\n", (int) i, y[i]); + free(a); + free(x); + free(y); + return 0; +} diff --git a/CBLAS/examples/cblas_example2_64.c b/CBLAS/examples/cblas_example2_64.c new file mode 100644 index 0000000000..1682e6d208 --- /dev/null +++ b/CBLAS/examples/cblas_example2_64.c @@ -0,0 +1,75 @@ +/* cblas_example2.c */ + +#define CBLAS_API64 +#define F77_INT int64_t + +#include +#include +#include "cblas_64.h" +#include "cblas_f77.h" + +#define INVALID -1 + +int main (int argc, char **argv ) +{ + int64_t rout=-1,info=0,m,n,k,lda,ldb,ldc; + double A[2] = {0.0,0.0}, + B[2] = {0.0,0.0}, + C[2] = {0.0,0.0}, + ALPHA=0.0, BETA=0.0; + + if (argc > 2){ + rout = atoi(argv[1]); + info = atoi(argv[2]); + } + + if (rout == 1) { + if (info==0) { + printf("Checking if cblas_dgemm fails on parameter 4\n"); + cblas_dgemm_64( CblasRowMajor, CblasTrans, CblasNoTrans, INVALID, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + } + if (info==1) { + printf("Checking if cblas_dgemm fails on parameter 5\n"); + cblas_dgemm_64( CblasRowMajor, CblasNoTrans, CblasTrans, 0, INVALID, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + } + if (info==2) { + printf("Checking if cblas_dgemm fails on parameter 9\n"); + cblas_dgemm_64( CblasRowMajor, CblasNoTrans, CblasNoTrans, 0, 0, 2, + ALPHA, A, 1, B, 1, BETA, C, 2 ); + } + if (info==3) { + printf("Checking if cblas_dgemm fails on parameter 11\n"); + cblas_dgemm_64( CblasRowMajor, CblasNoTrans, CblasNoTrans, 0, 2, 2, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + } + } else { + if (info==0) { + printf("Checking if F77_dgemm fails on parameter 3\n"); + m=INVALID; n=0; k=0; lda=1; ldb=1; ldc=1; + F77_dgemm( "T", "N", &m, &n, &k, + &ALPHA, A, &lda, B, &ldb, &BETA, C, &ldc ); + } + if (info==1) { + m=0; n=INVALID; k=0; lda=1; ldb=1; ldc=1; + printf("Checking if F77_dgemm fails on parameter 4\n"); + F77_dgemm( "N", "T", &m, &n, &k, + &ALPHA, A, &lda, B, &ldb, &BETA, C, &ldc ); + } + if (info==2) { + printf("Checking if F77_dgemm fails on parameter 8\n"); + m=2; n=0; k=0; lda=1; ldb=1; ldc=2; + F77_dgemm( "N", "N" , &m, &n, &k, + &ALPHA, A, &lda, B, &ldb, &BETA, C, &ldc ); + } + if (info==3) { + printf("Checking if F77_dgemm fails on parameter 10\n"); + m=0; n=0; k=2; lda=1; ldb=1; ldc=1; + F77_dgemm( "N", "N" , &m, &n, &k, + &ALPHA, A, &lda, B, &ldb, &BETA, C, &ldc ); + } + } + + return 0; +} diff --git a/CBLAS/include/CMakeLists.txt b/CBLAS/include/CMakeLists.txt index 059bca0096..0fd5e586ed 100644 --- a/CBLAS/include/CMakeLists.txt +++ b/CBLAS/include/CMakeLists.txt @@ -1,4 +1,4 @@ -set(CBLAS_INCLUDE cblas.h cblas_f77.h) +set(CBLAS_INCLUDE cblas.h cblas_f77.h cblas_64.h) file(COPY ${CBLAS_INCLUDE} DESTINATION ${LAPACK_BINARY_DIR}/include) diff --git a/CBLAS/include/cblas.h b/CBLAS/include/cblas.h index 8b1cd2a1c4..af86cc6886 100644 --- a/CBLAS/include/cblas.h +++ b/CBLAS/include/cblas.h @@ -1,6 +1,8 @@ #ifndef CBLAS_H #define CBLAS_H #include +#include +#include #ifdef __cplusplus @@ -15,10 +17,23 @@ extern "C" { /* Assume C declarations for C++ */ /* * Integer type */ +#ifndef CBLAS_INT #ifdef WeirdNEC - #define CBLAS_INT long + #define CBLAS_INT int64_t #else - #define CBLAS_INT int + #define CBLAS_INT int32_t +#endif +#endif + +/* + * Integer format string + */ +#ifndef CBLAS_IFMT +#ifdef WeirdNEC + #define CBLAS_IFMT PRId64 +#else + #define CBLAS_IFMT PRId32 +#endif #endif typedef enum CBLAS_LAYOUT {CblasRowMajor=101, CblasColMajor=102} CBLAS_LAYOUT; @@ -31,6 +46,19 @@ typedef enum CBLAS_SIDE {CblasLeft=141, CblasRight=142} CBLAS_SIDE; #include "cblas_mangling.h" +/* + * Integer specific API + */ +#ifndef API_SUFFIX +#ifdef CBLAS_API64 +#define API_SUFFIX(a) a##_64 +#include "cblas_64.h" +#else +#define API_SUFFIX(a) a +#endif +#endif + + /* * =========================================================================== * Prototypes for level 1 BLAS functions (complex are recast as routines) @@ -102,6 +130,8 @@ void cblas_scopy(const CBLAS_INT N, const float *X, const CBLAS_INT incX, float *Y, const CBLAS_INT incY); void cblas_saxpy(const CBLAS_INT N, const float alpha, const float *X, const CBLAS_INT incX, float *Y, const CBLAS_INT incY); +void cblas_saxpby(const CBLAS_INT N, const float alpha, const float *X, + const CBLAS_INT incX, const float beta, float *Y, const CBLAS_INT incY); void cblas_dswap(const CBLAS_INT N, double *X, const CBLAS_INT incX, double *Y, const CBLAS_INT incY); @@ -109,6 +139,8 @@ void cblas_dcopy(const CBLAS_INT N, const double *X, const CBLAS_INT incX, double *Y, const CBLAS_INT incY); void cblas_daxpy(const CBLAS_INT N, const double alpha, const double *X, const CBLAS_INT incX, double *Y, const CBLAS_INT incY); +void cblas_daxpby(const CBLAS_INT N, const double alpha, const double *X, + const CBLAS_INT incX, const double beta, double *Y, const CBLAS_INT incY); void cblas_cswap(const CBLAS_INT N, void *X, const CBLAS_INT incX, void *Y, const CBLAS_INT incY); @@ -116,6 +148,8 @@ void cblas_ccopy(const CBLAS_INT N, const void *X, const CBLAS_INT incX, void *Y, const CBLAS_INT incY); void cblas_caxpy(const CBLAS_INT N, const void *alpha, const void *X, const CBLAS_INT incX, void *Y, const CBLAS_INT incY); +void cblas_caxpby(const CBLAS_INT N, const void *alpha, const void *X, + const CBLAS_INT incX, const void *beta, void *Y, const CBLAS_INT incY); void cblas_zswap(const CBLAS_INT N, void *X, const CBLAS_INT incX, void *Y, const CBLAS_INT incY); @@ -123,24 +157,20 @@ void cblas_zcopy(const CBLAS_INT N, const void *X, const CBLAS_INT incX, void *Y, const CBLAS_INT incY); void cblas_zaxpy(const CBLAS_INT N, const void *alpha, const void *X, const CBLAS_INT incX, void *Y, const CBLAS_INT incY); +void cblas_zaxpby(const CBLAS_INT N, const void *alpha, const void *X, + const CBLAS_INT incX, const void *beta, void *Y, const CBLAS_INT incY); /* * Routines with S and D prefix only */ -void cblas_srotg(float *a, float *b, float *c, float *s); void cblas_srotmg(float *d1, float *d2, float *b1, const float b2, float *P); -void cblas_srot(const CBLAS_INT N, float *X, const CBLAS_INT incX, - float *Y, const CBLAS_INT incY, const float c, const float s); void cblas_srotm(const CBLAS_INT N, float *X, const CBLAS_INT incX, - float *Y, const CBLAS_INT incY, const float *P); - -void cblas_drotg(double *a, double *b, double *c, double *s); + float *Y, const CBLAS_INT incY, const float *P); void cblas_drotmg(double *d1, double *d2, double *b1, const double b2, double *P); -void cblas_drot(const CBLAS_INT N, double *X, const CBLAS_INT incX, - double *Y, const CBLAS_INT incY, const double c, const double s); void cblas_drotm(const CBLAS_INT N, double *X, const CBLAS_INT incX, - double *Y, const CBLAS_INT incY, const double *P); + double *Y, const CBLAS_INT incY, const double *P); + /* @@ -153,6 +183,20 @@ void cblas_zscal(const CBLAS_INT N, const void *alpha, void *X, const CBLAS_INT void cblas_csscal(const CBLAS_INT N, const float alpha, void *X, const CBLAS_INT incX); void cblas_zdscal(const CBLAS_INT N, const double alpha, void *X, const CBLAS_INT incX); +void cblas_srotg(float *a, float *b, float *c, float *s); +void cblas_drotg(double *a, double *b, double *c, double *s); +void cblas_crotg(void *a, void *b, float *c, void *s); +void cblas_zrotg(void *a, void *b, double *c, void *s); + +void cblas_srot(const CBLAS_INT N, float *X, const CBLAS_INT incX, + float *Y, const CBLAS_INT incY, const float c, const float s); +void cblas_drot(const CBLAS_INT N, double *X, const CBLAS_INT incX, + double *Y, const CBLAS_INT incY, const double c, const double s); +void cblas_csrot(const CBLAS_INT N, void *X, const CBLAS_INT incX, + void *Y, const CBLAS_INT incY, const float c, const float s); +void cblas_zdrot(const CBLAS_INT N, void *X, const CBLAS_INT incX, + void *Y, const CBLAS_INT incY, const double c, const double s); + /* * =========================================================================== * Prototypes for level 2 BLAS @@ -436,6 +480,12 @@ void cblas_sgemm(CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA, const CBLAS_INT K, const float alpha, const float *A, const CBLAS_INT lda, const float *B, const CBLAS_INT ldb, const float beta, float *C, const CBLAS_INT ldc); +void cblas_sgemmtr(CBLAS_LAYOUT layout,CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, + CBLAS_TRANSPOSE TransB, const CBLAS_INT N, + const CBLAS_INT K, const float alpha, const float *A, + const CBLAS_INT lda, const float *B, const CBLAS_INT ldb, + const float beta, float *C, const CBLAS_INT ldc); + void cblas_ssymm(CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo, const CBLAS_INT M, const CBLAS_INT N, const float alpha, const float *A, const CBLAS_INT lda, @@ -466,6 +516,11 @@ void cblas_dgemm(CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA, const CBLAS_INT K, const double alpha, const double *A, const CBLAS_INT lda, const double *B, const CBLAS_INT ldb, const double beta, double *C, const CBLAS_INT ldc); +void cblas_dgemmtr(CBLAS_LAYOUT layout,CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, + CBLAS_TRANSPOSE TransB, const CBLAS_INT N, + const CBLAS_INT K, const double alpha, const double *A, + const CBLAS_INT lda, const double *B, const CBLAS_INT ldb, + const double beta, double *C, const CBLAS_INT ldc); void cblas_dsymm(CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo, const CBLAS_INT M, const CBLAS_INT N, const double alpha, const double *A, const CBLAS_INT lda, @@ -496,6 +551,11 @@ void cblas_cgemm(CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA, const CBLAS_INT K, const void *alpha, const void *A, const CBLAS_INT lda, const void *B, const CBLAS_INT ldb, const void *beta, void *C, const CBLAS_INT ldc); +void cblas_cgemmtr(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, + CBLAS_TRANSPOSE TransB, const CBLAS_INT N, + const CBLAS_INT K, const void *alpha, const void *A, + const CBLAS_INT lda, const void *B, const CBLAS_INT ldb, + const void *beta, void *C, const CBLAS_INT ldc); void cblas_csymm(CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo, const CBLAS_INT M, const CBLAS_INT N, const void *alpha, const void *A, const CBLAS_INT lda, @@ -526,6 +586,11 @@ void cblas_zgemm(CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA, const CBLAS_INT K, const void *alpha, const void *A, const CBLAS_INT lda, const void *B, const CBLAS_INT ldb, const void *beta, void *C, const CBLAS_INT ldc); +void cblas_zgemmtr(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, + CBLAS_TRANSPOSE TransB, const CBLAS_INT N, + const CBLAS_INT K, const void *alpha, const void *A, + const CBLAS_INT lda, const void *B, const CBLAS_INT ldb, + const void *beta, void *C, const CBLAS_INT ldc); void cblas_zsymm(CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo, const CBLAS_INT M, const CBLAS_INT N, const void *alpha, const void *A, const CBLAS_INT lda, @@ -585,7 +650,11 @@ void cblas_zher2k(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const void *B, const CBLAS_INT ldb, const double beta, void *C, const CBLAS_INT ldc); -void cblas_xerbla(CBLAS_INT p, const char *rout, const char *form, ...); +void +#ifdef HAS_ATTRIBUTE_WEAK_SUPPORT +__attribute__((weak)) +#endif +cblas_xerbla(CBLAS_INT p, const char *rout, const char *form, ...); #ifdef __cplusplus } diff --git a/CBLAS/include/cblas_64.h b/CBLAS/include/cblas_64.h new file mode 100644 index 0000000000..ddcd8f7aa6 --- /dev/null +++ b/CBLAS/include/cblas_64.h @@ -0,0 +1,615 @@ +#ifndef CBLAS_64_H +#define CBLAS_64_H +#include +#include +#include + +#include "cblas.h" + +#ifdef __cplusplus +extern "C" { /* Assume C declarations for C++ */ +#endif /* __cplusplus */ + +/* + * =========================================================================== + * Prototypes for level 1 BLAS functions (complex are recast as routines) + * =========================================================================== + */ + +double cblas_dcabs1_64(const void *z); +float cblas_scabs1_64(const void *c); + +float cblas_sdsdot_64(const int64_t N, const float alpha, const float *X, + const int64_t incX, const float *Y, const int64_t incY); +double cblas_dsdot_64(const int64_t N, const float *X, const int64_t incX, const float *Y, + const int64_t incY); +float cblas_sdot_64(const int64_t N, const float *X, const int64_t incX, + const float *Y, const int64_t incY); +double cblas_ddot_64(const int64_t N, const double *X, const int64_t incX, + const double *Y, const int64_t incY); + +/* + * Functions having prefixes Z and C only + */ +void cblas_cdotu_sub_64(const int64_t N, const void *X, const int64_t incX, + const void *Y, const int64_t incY, void *dotu); +void cblas_cdotc_sub_64(const int64_t N, const void *X, const int64_t incX, + const void *Y, const int64_t incY, void *dotc); + +void cblas_zdotu_sub_64(const int64_t N, const void *X, const int64_t incX, + const void *Y, const int64_t incY, void *dotu); +void cblas_zdotc_sub_64(const int64_t N, const void *X, const int64_t incX, + const void *Y, const int64_t incY, void *dotc); + + +/* + * Functions having prefixes S D SC DZ + */ +float cblas_snrm2_64(const int64_t N, const float *X, const int64_t incX); +float cblas_sasum_64(const int64_t N, const float *X, const int64_t incX); + +double cblas_dnrm2_64(const int64_t N, const double *X, const int64_t incX); +double cblas_dasum_64(const int64_t N, const double *X, const int64_t incX); + +float cblas_scnrm2_64(const int64_t N, const void *X, const int64_t incX); +float cblas_scasum_64(const int64_t N, const void *X, const int64_t incX); + +double cblas_dznrm2_64(const int64_t N, const void *X, const int64_t incX); +double cblas_dzasum_64(const int64_t N, const void *X, const int64_t incX); + + +/* + * Functions having standard 4 prefixes (S D C Z) + */ +CBLAS_INDEX cblas_isamax_64(const int64_t N, const float *X, const int64_t incX); +CBLAS_INDEX cblas_idamax_64(const int64_t N, const double *X, const int64_t incX); +CBLAS_INDEX cblas_icamax_64(const int64_t N, const void *X, const int64_t incX); +CBLAS_INDEX cblas_izamax_64(const int64_t N, const void *X, const int64_t incX); + +/* + * =========================================================================== + * Prototypes for level 1 BLAS routines + * =========================================================================== + */ + +/* + * Routines with standard 4 prefixes (s, d, c, z) + */ +void cblas_sswap_64(const int64_t N, float *X, const int64_t incX, + float *Y, const int64_t incY); +void cblas_scopy_64(const int64_t N, const float *X, const int64_t incX, + float *Y, const int64_t incY); +void cblas_saxpy_64(const int64_t N, const float alpha, const float *X, + const int64_t incX, float *Y, const int64_t incY); +void cblas_saxpby_64(const int64_t N, const float alpha, const float *X, + const int64_t incX, const float beta, float *Y, const int64_t incY); + + +void cblas_dswap_64(const int64_t N, double *X, const int64_t incX, + double *Y, const int64_t incY); +void cblas_dcopy_64(const int64_t N, const double *X, const int64_t incX, + double *Y, const int64_t incY); +void cblas_daxpy_64(const int64_t N, const double alpha, const double *X, + const int64_t incX, double *Y, const int64_t incY); +void cblas_daxpby_64(const int64_t N, const double alpha, const double *X, + const int64_t incX, const double beta, double *Y, const int64_t incY); + +void cblas_cswap_64(const int64_t N, void *X, const int64_t incX, + void *Y, const int64_t incY); +void cblas_ccopy_64(const int64_t N, const void *X, const int64_t incX, + void *Y, const int64_t incY); +void cblas_caxpy_64(const int64_t N, const void *alpha, const void *X, + const int64_t incX, void *Y, const int64_t incY); +void cblas_caxpby_64(const int64_t N, const void *alpha, const void *X, + const int64_t incX, const void *beta, void *Y, const int64_t incY); + +void cblas_zswap_64(const int64_t N, void *X, const int64_t incX, + void *Y, const int64_t incY); +void cblas_zcopy_64(const int64_t N, const void *X, const int64_t incX, + void *Y, const int64_t incY); +void cblas_zaxpy_64(const int64_t N, const void *alpha, const void *X, + const int64_t incX, void *Y, const int64_t incY); +void cblas_zaxbpy_64(const int64_t N, const void *alpha, const void *X, + const int64_t incX, const void *beta, void *Y, const int64_t incY); + + +/* + * Routines with S and D prefix only + */ +void cblas_srotmg_64(float *d1, float *d2, float *b1, const float b2, float *P); +void cblas_srotm_64(const int64_t N, float *X, const int64_t incX, + float *Y, const int64_t incY, const float *P); +void cblas_drotmg_64(double *d1, double *d2, double *b1, const double b2, double *P); +void cblas_drotm_64(const int64_t N, double *X, const int64_t incX, + double *Y, const int64_t incY, const double *P); + + + +/* + * Routines with S D C Z CS and ZD prefixes + */ +void cblas_sscal_64(const int64_t N, const float alpha, float *X, const int64_t incX); +void cblas_dscal_64(const int64_t N, const double alpha, double *X, const int64_t incX); +void cblas_cscal_64(const int64_t N, const void *alpha, void *X, const int64_t incX); +void cblas_zscal_64(const int64_t N, const void *alpha, void *X, const int64_t incX); +void cblas_csscal_64(const int64_t N, const float alpha, void *X, const int64_t incX); +void cblas_zdscal_64(const int64_t N, const double alpha, void *X, const int64_t incX); + +void cblas_srotg_64(float *a, float *b, float *c, float *s); +void cblas_drotg_64(double *a, double *b, double *c, double *s); +void cblas_crotg_64(void *a, void *b, float *c, void *s); +void cblas_zrotg_64(void *a, void *b, double *c, void *s); + +void cblas_srot_64(const int64_t N, float *X, const int64_t incX, + float *Y, const int64_t incY, const float c, const float s); +void cblas_drot_64(const int64_t N, double *X, const int64_t incX, + double *Y, const int64_t incY, const double c, const double s); +void cblas_csrot_64(const int64_t N, void *X, const int64_t incX, + void *Y, const int64_t incY, const float c, const float s); +void cblas_zdrot_64(const int64_t N, void *X, const int64_t incX, + void *Y, const int64_t incY, const double c, const double s); + +/* + * =========================================================================== + * Prototypes for level 2 BLAS + * =========================================================================== + */ + +/* + * Routines with standard 4 prefixes (S, D, C, Z) + */ +void cblas_sgemv_64(const CBLAS_LAYOUT layout, + const CBLAS_TRANSPOSE TransA, const int64_t M, const int64_t N, + const float alpha, const float *A, const int64_t lda, + const float *X, const int64_t incX, const float beta, + float *Y, const int64_t incY); +void cblas_sgbmv_64(CBLAS_LAYOUT layout, + CBLAS_TRANSPOSE TransA, const int64_t M, const int64_t N, + const int64_t KL, const int64_t KU, const float alpha, + const float *A, const int64_t lda, const float *X, + const int64_t incX, const float beta, float *Y, const int64_t incY); +void cblas_strmv_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, + const int64_t N, const float *A, const int64_t lda, + float *X, const int64_t incX); +void cblas_stbmv_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, + const int64_t N, const int64_t K, const float *A, const int64_t lda, + float *X, const int64_t incX); +void cblas_stpmv_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, + const int64_t N, const float *Ap, float *X, const int64_t incX); +void cblas_strsv_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, + const int64_t N, const float *A, const int64_t lda, float *X, + const int64_t incX); +void cblas_stbsv_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, + const int64_t N, const int64_t K, const float *A, const int64_t lda, + float *X, const int64_t incX); +void cblas_stpsv_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, + const int64_t N, const float *Ap, float *X, const int64_t incX); + +void cblas_dgemv_64(CBLAS_LAYOUT layout, + CBLAS_TRANSPOSE TransA, const int64_t M, const int64_t N, + const double alpha, const double *A, const int64_t lda, + const double *X, const int64_t incX, const double beta, + double *Y, const int64_t incY); +void cblas_dgbmv_64(CBLAS_LAYOUT layout, + CBLAS_TRANSPOSE TransA, const int64_t M, const int64_t N, + const int64_t KL, const int64_t KU, const double alpha, + const double *A, const int64_t lda, const double *X, + const int64_t incX, const double beta, double *Y, const int64_t incY); +void cblas_dtrmv_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, + const int64_t N, const double *A, const int64_t lda, + double *X, const int64_t incX); +void cblas_dtbmv_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, + const int64_t N, const int64_t K, const double *A, const int64_t lda, + double *X, const int64_t incX); +void cblas_dtpmv_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, + const int64_t N, const double *Ap, double *X, const int64_t incX); +void cblas_dtrsv_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, + const int64_t N, const double *A, const int64_t lda, double *X, + const int64_t incX); +void cblas_dtbsv_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, + const int64_t N, const int64_t K, const double *A, const int64_t lda, + double *X, const int64_t incX); +void cblas_dtpsv_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, + const int64_t N, const double *Ap, double *X, const int64_t incX); + +void cblas_cgemv_64(CBLAS_LAYOUT layout, + CBLAS_TRANSPOSE TransA, const int64_t M, const int64_t N, + const void *alpha, const void *A, const int64_t lda, + const void *X, const int64_t incX, const void *beta, + void *Y, const int64_t incY); +void cblas_cgbmv_64(CBLAS_LAYOUT layout, + CBLAS_TRANSPOSE TransA, const int64_t M, const int64_t N, + const int64_t KL, const int64_t KU, const void *alpha, + const void *A, const int64_t lda, const void *X, + const int64_t incX, const void *beta, void *Y, const int64_t incY); +void cblas_ctrmv_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, + const int64_t N, const void *A, const int64_t lda, + void *X, const int64_t incX); +void cblas_ctbmv_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, + const int64_t N, const int64_t K, const void *A, const int64_t lda, + void *X, const int64_t incX); +void cblas_ctpmv_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, + const int64_t N, const void *Ap, void *X, const int64_t incX); +void cblas_ctrsv_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, + const int64_t N, const void *A, const int64_t lda, void *X, + const int64_t incX); +void cblas_ctbsv_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, + const int64_t N, const int64_t K, const void *A, const int64_t lda, + void *X, const int64_t incX); +void cblas_ctpsv_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, + const int64_t N, const void *Ap, void *X, const int64_t incX); + +void cblas_zgemv_64(CBLAS_LAYOUT layout, + CBLAS_TRANSPOSE TransA, const int64_t M, const int64_t N, + const void *alpha, const void *A, const int64_t lda, + const void *X, const int64_t incX, const void *beta, + void *Y, const int64_t incY); +void cblas_zgbmv_64(CBLAS_LAYOUT layout, + CBLAS_TRANSPOSE TransA, const int64_t M, const int64_t N, + const int64_t KL, const int64_t KU, const void *alpha, + const void *A, const int64_t lda, const void *X, + const int64_t incX, const void *beta, void *Y, const int64_t incY); +void cblas_ztrmv_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, + const int64_t N, const void *A, const int64_t lda, + void *X, const int64_t incX); +void cblas_ztbmv_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, + const int64_t N, const int64_t K, const void *A, const int64_t lda, + void *X, const int64_t incX); +void cblas_ztpmv_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, + const int64_t N, const void *Ap, void *X, const int64_t incX); +void cblas_ztrsv_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, + const int64_t N, const void *A, const int64_t lda, void *X, + const int64_t incX); +void cblas_ztbsv_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, + const int64_t N, const int64_t K, const void *A, const int64_t lda, + void *X, const int64_t incX); +void cblas_ztpsv_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, + const int64_t N, const void *Ap, void *X, const int64_t incX); + + +/* + * Routines with S and D prefixes only + */ +void cblas_ssymv_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + const int64_t N, const float alpha, const float *A, + const int64_t lda, const float *X, const int64_t incX, + const float beta, float *Y, const int64_t incY); +void cblas_ssbmv_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + const int64_t N, const int64_t K, const float alpha, const float *A, + const int64_t lda, const float *X, const int64_t incX, + const float beta, float *Y, const int64_t incY); +void cblas_sspmv_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + const int64_t N, const float alpha, const float *Ap, + const float *X, const int64_t incX, + const float beta, float *Y, const int64_t incY); +void cblas_sger_64(CBLAS_LAYOUT layout, const int64_t M, const int64_t N, + const float alpha, const float *X, const int64_t incX, + const float *Y, const int64_t incY, float *A, const int64_t lda); +void cblas_ssyr_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + const int64_t N, const float alpha, const float *X, + const int64_t incX, float *A, const int64_t lda); +void cblas_sspr_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + const int64_t N, const float alpha, const float *X, + const int64_t incX, float *Ap); +void cblas_ssyr2_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + const int64_t N, const float alpha, const float *X, + const int64_t incX, const float *Y, const int64_t incY, float *A, + const int64_t lda); +void cblas_sspr2_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + const int64_t N, const float alpha, const float *X, + const int64_t incX, const float *Y, const int64_t incY, float *A); + +void cblas_dsymv_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + const int64_t N, const double alpha, const double *A, + const int64_t lda, const double *X, const int64_t incX, + const double beta, double *Y, const int64_t incY); +void cblas_dsbmv_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + const int64_t N, const int64_t K, const double alpha, const double *A, + const int64_t lda, const double *X, const int64_t incX, + const double beta, double *Y, const int64_t incY); +void cblas_dspmv_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + const int64_t N, const double alpha, const double *Ap, + const double *X, const int64_t incX, + const double beta, double *Y, const int64_t incY); +void cblas_dger_64(CBLAS_LAYOUT layout, const int64_t M, const int64_t N, + const double alpha, const double *X, const int64_t incX, + const double *Y, const int64_t incY, double *A, const int64_t lda); +void cblas_dsyr_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + const int64_t N, const double alpha, const double *X, + const int64_t incX, double *A, const int64_t lda); +void cblas_dspr_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + const int64_t N, const double alpha, const double *X, + const int64_t incX, double *Ap); +void cblas_dsyr2_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + const int64_t N, const double alpha, const double *X, + const int64_t incX, const double *Y, const int64_t incY, double *A, + const int64_t lda); +void cblas_dspr2_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + const int64_t N, const double alpha, const double *X, + const int64_t incX, const double *Y, const int64_t incY, double *A); + + +/* + * Routines with C and Z prefixes only + */ +void cblas_chemv_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + const int64_t N, const void *alpha, const void *A, + const int64_t lda, const void *X, const int64_t incX, + const void *beta, void *Y, const int64_t incY); +void cblas_chbmv_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + const int64_t N, const int64_t K, const void *alpha, const void *A, + const int64_t lda, const void *X, const int64_t incX, + const void *beta, void *Y, const int64_t incY); +void cblas_chpmv_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + const int64_t N, const void *alpha, const void *Ap, + const void *X, const int64_t incX, + const void *beta, void *Y, const int64_t incY); +void cblas_cgeru_64(CBLAS_LAYOUT layout, const int64_t M, const int64_t N, + const void *alpha, const void *X, const int64_t incX, + const void *Y, const int64_t incY, void *A, const int64_t lda); +void cblas_cgerc_64(CBLAS_LAYOUT layout, const int64_t M, const int64_t N, + const void *alpha, const void *X, const int64_t incX, + const void *Y, const int64_t incY, void *A, const int64_t lda); +void cblas_cher_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + const int64_t N, const float alpha, const void *X, const int64_t incX, + void *A, const int64_t lda); +void cblas_chpr_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + const int64_t N, const float alpha, const void *X, + const int64_t incX, void *A); +void cblas_cher2_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t N, + const void *alpha, const void *X, const int64_t incX, + const void *Y, const int64_t incY, void *A, const int64_t lda); +void cblas_chpr2_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t N, + const void *alpha, const void *X, const int64_t incX, + const void *Y, const int64_t incY, void *Ap); + +void cblas_zhemv_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + const int64_t N, const void *alpha, const void *A, + const int64_t lda, const void *X, const int64_t incX, + const void *beta, void *Y, const int64_t incY); +void cblas_zhbmv_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + const int64_t N, const int64_t K, const void *alpha, const void *A, + const int64_t lda, const void *X, const int64_t incX, + const void *beta, void *Y, const int64_t incY); +void cblas_zhpmv_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + const int64_t N, const void *alpha, const void *Ap, + const void *X, const int64_t incX, + const void *beta, void *Y, const int64_t incY); +void cblas_zgeru_64(CBLAS_LAYOUT layout, const int64_t M, const int64_t N, + const void *alpha, const void *X, const int64_t incX, + const void *Y, const int64_t incY, void *A, const int64_t lda); +void cblas_zgerc_64(CBLAS_LAYOUT layout, const int64_t M, const int64_t N, + const void *alpha, const void *X, const int64_t incX, + const void *Y, const int64_t incY, void *A, const int64_t lda); +void cblas_zher_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + const int64_t N, const double alpha, const void *X, const int64_t incX, + void *A, const int64_t lda); +void cblas_zhpr_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + const int64_t N, const double alpha, const void *X, + const int64_t incX, void *A); +void cblas_zher2_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t N, + const void *alpha, const void *X, const int64_t incX, + const void *Y, const int64_t incY, void *A, const int64_t lda); +void cblas_zhpr2_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t N, + const void *alpha, const void *X, const int64_t incX, + const void *Y, const int64_t incY, void *Ap); + +/* + * =========================================================================== + * Prototypes for level 3 BLAS + * =========================================================================== + */ + +/* + * Routines with standard 4 prefixes (S, D, C, Z) + */ +void cblas_sgemm_64(CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA, + CBLAS_TRANSPOSE TransB, const int64_t M, const int64_t N, + const int64_t K, const float alpha, const float *A, + const int64_t lda, const float *B, const int64_t ldb, + const float beta, float *C, const int64_t ldc); +void cblas_sgemmtr_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, + CBLAS_TRANSPOSE TransB, const int64_t N, + const int64_t K, const float alpha, const float *A, + const int64_t lda, const float *B, const int64_t ldb, + const float beta, float *C, const int64_t ldc); + +void cblas_ssymm_64(CBLAS_LAYOUT layout, CBLAS_SIDE Side, + CBLAS_UPLO Uplo, const int64_t M, const int64_t N, + const float alpha, const float *A, const int64_t lda, + const float *B, const int64_t ldb, const float beta, + float *C, const int64_t ldc); +void cblas_ssyrk_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + CBLAS_TRANSPOSE Trans, const int64_t N, const int64_t K, + const float alpha, const float *A, const int64_t lda, + const float beta, float *C, const int64_t ldc); +void cblas_ssyr2k_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + CBLAS_TRANSPOSE Trans, const int64_t N, const int64_t K, + const float alpha, const float *A, const int64_t lda, + const float *B, const int64_t ldb, const float beta, + float *C, const int64_t ldc); +void cblas_strmm_64(CBLAS_LAYOUT layout, CBLAS_SIDE Side, + CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, + CBLAS_DIAG Diag, const int64_t M, const int64_t N, + const float alpha, const float *A, const int64_t lda, + float *B, const int64_t ldb); +void cblas_strsm_64(CBLAS_LAYOUT layout, CBLAS_SIDE Side, + CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, + CBLAS_DIAG Diag, const int64_t M, const int64_t N, + const float alpha, const float *A, const int64_t lda, + float *B, const int64_t ldb); + +void cblas_dgemm_64(CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA, + CBLAS_TRANSPOSE TransB, const int64_t M, const int64_t N, + const int64_t K, const double alpha, const double *A, + const int64_t lda, const double *B, const int64_t ldb, + const double beta, double *C, const int64_t ldc); +void cblas_dgemmtr_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, + CBLAS_TRANSPOSE TransB, const int64_t N, + const int64_t K, const double alpha, const double *A, + const int64_t lda, const double *B, const int64_t ldb, + const double beta, double *C, const int64_t ldc); +void cblas_dsymm_64(CBLAS_LAYOUT layout, CBLAS_SIDE Side, + CBLAS_UPLO Uplo, const int64_t M, const int64_t N, + const double alpha, const double *A, const int64_t lda, + const double *B, const int64_t ldb, const double beta, + double *C, const int64_t ldc); +void cblas_dsyrk_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + CBLAS_TRANSPOSE Trans, const int64_t N, const int64_t K, + const double alpha, const double *A, const int64_t lda, + const double beta, double *C, const int64_t ldc); +void cblas_dsyr2k_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + CBLAS_TRANSPOSE Trans, const int64_t N, const int64_t K, + const double alpha, const double *A, const int64_t lda, + const double *B, const int64_t ldb, const double beta, + double *C, const int64_t ldc); +void cblas_dtrmm_64(CBLAS_LAYOUT layout, CBLAS_SIDE Side, + CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, + CBLAS_DIAG Diag, const int64_t M, const int64_t N, + const double alpha, const double *A, const int64_t lda, + double *B, const int64_t ldb); +void cblas_dtrsm_64(CBLAS_LAYOUT layout, CBLAS_SIDE Side, + CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, + CBLAS_DIAG Diag, const int64_t M, const int64_t N, + const double alpha, const double *A, const int64_t lda, + double *B, const int64_t ldb); + +void cblas_cgemm_64(CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA, + CBLAS_TRANSPOSE TransB, const int64_t M, const int64_t N, + const int64_t K, const void *alpha, const void *A, + const int64_t lda, const void *B, const int64_t ldb, + const void *beta, void *C, const int64_t ldc); +void cblas_cgemmtr_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, + CBLAS_TRANSPOSE TransB, const int64_t N, + const int64_t K, const void *alpha, const void *A, + const int64_t lda, const void *B, const int64_t ldb, + const void *beta, void *C, const int64_t ldc); + +void cblas_csymm_64(CBLAS_LAYOUT layout, CBLAS_SIDE Side, + CBLAS_UPLO Uplo, const int64_t M, const int64_t N, + const void *alpha, const void *A, const int64_t lda, + const void *B, const int64_t ldb, const void *beta, + void *C, const int64_t ldc); +void cblas_csyrk_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + CBLAS_TRANSPOSE Trans, const int64_t N, const int64_t K, + const void *alpha, const void *A, const int64_t lda, + const void *beta, void *C, const int64_t ldc); +void cblas_csyr2k_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + CBLAS_TRANSPOSE Trans, const int64_t N, const int64_t K, + const void *alpha, const void *A, const int64_t lda, + const void *B, const int64_t ldb, const void *beta, + void *C, const int64_t ldc); +void cblas_ctrmm_64(CBLAS_LAYOUT layout, CBLAS_SIDE Side, + CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, + CBLAS_DIAG Diag, const int64_t M, const int64_t N, + const void *alpha, const void *A, const int64_t lda, + void *B, const int64_t ldb); +void cblas_ctrsm_64(CBLAS_LAYOUT layout, CBLAS_SIDE Side, + CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, + CBLAS_DIAG Diag, const int64_t M, const int64_t N, + const void *alpha, const void *A, const int64_t lda, + void *B, const int64_t ldb); + +void cblas_zgemm_64(CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA, + CBLAS_TRANSPOSE TransB, const int64_t M, const int64_t N, + const int64_t K, const void *alpha, const void *A, + const int64_t lda, const void *B, const int64_t ldb, + const void *beta, void *C, const int64_t ldc); +void cblas_zgemmtr_64(CBLAS_LAYOUT layout,CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, + CBLAS_TRANSPOSE TransB, const int64_t N, + const int64_t K, const void *alpha, const void *A, + const int64_t lda, const void *B, const int64_t ldb, + const void *beta, void *C, const int64_t ldc); +void cblas_zsymm_64(CBLAS_LAYOUT layout, CBLAS_SIDE Side, + CBLAS_UPLO Uplo, const int64_t M, const int64_t N, + const void *alpha, const void *A, const int64_t lda, + const void *B, const int64_t ldb, const void *beta, + void *C, const int64_t ldc); +void cblas_zsyrk_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + CBLAS_TRANSPOSE Trans, const int64_t N, const int64_t K, + const void *alpha, const void *A, const int64_t lda, + const void *beta, void *C, const int64_t ldc); +void cblas_zsyr2k_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + CBLAS_TRANSPOSE Trans, const int64_t N, const int64_t K, + const void *alpha, const void *A, const int64_t lda, + const void *B, const int64_t ldb, const void *beta, + void *C, const int64_t ldc); +void cblas_ztrmm_64(CBLAS_LAYOUT layout, CBLAS_SIDE Side, + CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, + CBLAS_DIAG Diag, const int64_t M, const int64_t N, + const void *alpha, const void *A, const int64_t lda, + void *B, const int64_t ldb); +void cblas_ztrsm_64(CBLAS_LAYOUT layout, CBLAS_SIDE Side, + CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, + CBLAS_DIAG Diag, const int64_t M, const int64_t N, + const void *alpha, const void *A, const int64_t lda, + void *B, const int64_t ldb); + + +/* + * Routines with prefixes C and Z only + */ +void cblas_chemm_64(CBLAS_LAYOUT layout, CBLAS_SIDE Side, + CBLAS_UPLO Uplo, const int64_t M, const int64_t N, + const void *alpha, const void *A, const int64_t lda, + const void *B, const int64_t ldb, const void *beta, + void *C, const int64_t ldc); +void cblas_cherk_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + CBLAS_TRANSPOSE Trans, const int64_t N, const int64_t K, + const float alpha, const void *A, const int64_t lda, + const float beta, void *C, const int64_t ldc); +void cblas_cher2k_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + CBLAS_TRANSPOSE Trans, const int64_t N, const int64_t K, + const void *alpha, const void *A, const int64_t lda, + const void *B, const int64_t ldb, const float beta, + void *C, const int64_t ldc); + +void cblas_zhemm_64(CBLAS_LAYOUT layout, CBLAS_SIDE Side, + CBLAS_UPLO Uplo, const int64_t M, const int64_t N, + const void *alpha, const void *A, const int64_t lda, + const void *B, const int64_t ldb, const void *beta, + void *C, const int64_t ldc); +void cblas_zherk_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + CBLAS_TRANSPOSE Trans, const int64_t N, const int64_t K, + const double alpha, const void *A, const int64_t lda, + const double beta, void *C, const int64_t ldc); +void cblas_zher2k_64(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, + CBLAS_TRANSPOSE Trans, const int64_t N, const int64_t K, + const void *alpha, const void *A, const int64_t lda, + const void *B, const int64_t ldb, const double beta, + void *C, const int64_t ldc); + +void +#ifdef HAS_ATTRIBUTE_WEAK_SUPPORT +__attribute__((weak)) +#endif +cblas_xerbla_64(int64_t p, const char *rout, const char *form, ...); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/CBLAS/include/cblas_f77.h b/CBLAS/include/cblas_f77.h index 9c87428ace..a251f3079d 100644 --- a/CBLAS/include/cblas_f77.h +++ b/CBLAS/include/cblas_f77.h @@ -10,12 +10,17 @@ #define CBLAS_F77_H #include +#include /* It seems all current Fortran compilers put strlen at end. * Some historical compilers put strlen after the str argument * or make the str argument into a struct. */ #define BLAS_FORTRAN_STRLEN_END +#ifndef FORTRAN_STRLEN + #define FORTRAN_STRLEN size_t +#endif + #ifdef CRAY #include #define F77_CHAR _fcd @@ -24,10 +29,12 @@ #define F77_STRLEN(a) (_fcdlen) #endif +#ifndef F77_INT #ifdef WeirdNEC - #define F77_INT long + #define F77_INT int64_t #else - #define F77_INT int + #define F77_INT int32_t +#endif #endif #ifdef F77_CHAR @@ -39,235 +46,275 @@ #define FINT const F77_INT * #define FINT2 F77_INT * +/* + * Integer specific API + */ +#ifndef API_SUFFIX +#ifdef CBLAS_API64 +#define API_SUFFIX(a) a##_64 +#else +#define API_SUFFIX(a) a +#endif +#endif + +#define F77_GLOBAL_SUFFIX(a,b) F77_GLOBAL_SUFFIX_(API_SUFFIX(a),API_SUFFIX(b)) +#define F77_GLOBAL_SUFFIX_(a,b) F77_GLOBAL(a,b) + /* * Level 1 BLAS */ -#define F77_xerbla_base F77_GLOBAL(xerbla,XERBLA) -#define F77_srotg_base F77_GLOBAL(srotg,SROTG) -#define F77_srotmg_base F77_GLOBAL(srotmg,SROTMG) -#define F77_srot_base F77_GLOBAL(srot,SROT) -#define F77_srotm_base F77_GLOBAL(srotm,SROTM) -#define F77_drotg_base F77_GLOBAL(drotg,DROTG) -#define F77_drotmg_base F77_GLOBAL(drotmg,DROTMG) -#define F77_drot_base F77_GLOBAL(drot,DROT) -#define F77_drotm_base F77_GLOBAL(drotm,DROTM) -#define F77_sswap_base F77_GLOBAL(sswap,SSWAP) -#define F77_scopy_base F77_GLOBAL(scopy,SCOPY) -#define F77_saxpy_base F77_GLOBAL(saxpy,SAXPY) -#define F77_isamax_sub_base F77_GLOBAL(isamaxsub,ISAMAXSUB) -#define F77_dswap_base F77_GLOBAL(dswap,DSWAP) -#define F77_dcopy_base F77_GLOBAL(dcopy,DCOPY) -#define F77_daxpy_base F77_GLOBAL(daxpy,DAXPY) -#define F77_idamax_sub_base F77_GLOBAL(idamaxsub,IDAMAXSUB) -#define F77_cswap_base F77_GLOBAL(cswap,CSWAP) -#define F77_ccopy_base F77_GLOBAL(ccopy,CCOPY) -#define F77_caxpy_base F77_GLOBAL(caxpy,CAXPY) -#define F77_icamax_sub_base F77_GLOBAL(icamaxsub,ICAMAXSUB) -#define F77_zswap_base F77_GLOBAL(zswap,ZSWAP) -#define F77_zcopy_base F77_GLOBAL(zcopy,ZCOPY) -#define F77_zaxpy_base F77_GLOBAL(zaxpy,ZAXPY) -#define F77_izamax_sub_base F77_GLOBAL(izamaxsub,IZAMAXSUB) -#define F77_sdot_sub_base F77_GLOBAL(sdotsub,SDOTSUB) -#define F77_ddot_sub_base F77_GLOBAL(ddotsub,DDOTSUB) -#define F77_dsdot_sub_base F77_GLOBAL(dsdotsub,DSDOTSUB) -#define F77_sscal_base F77_GLOBAL(sscal,SSCAL) -#define F77_dscal_base F77_GLOBAL(dscal,DSCAL) -#define F77_cscal_base F77_GLOBAL(cscal,CSCAL) -#define F77_zscal_base F77_GLOBAL(zscal,ZSCAL) -#define F77_csscal_base F77_GLOBAL(csscal,CSSCAL) -#define F77_zdscal_base F77_GLOBAL(zdscal,ZDSCAL) -#define F77_cdotu_sub_base F77_GLOBAL(cdotusub,CDOTUSUB) -#define F77_cdotc_sub_base F77_GLOBAL(cdotcsub,CDOTCSUB) -#define F77_zdotu_sub_base F77_GLOBAL(zdotusub,ZDOTUSUB) -#define F77_zdotc_sub_base F77_GLOBAL(zdotcsub,ZDOTCSUB) -#define F77_snrm2_sub_base F77_GLOBAL(snrm2sub,SNRM2SUB) -#define F77_sasum_sub_base F77_GLOBAL(sasumsub,SASUMSUB) -#define F77_dnrm2_sub_base F77_GLOBAL(dnrm2sub,DNRM2SUB) -#define F77_dasum_sub_base F77_GLOBAL(dasumsub,DASUMSUB) -#define F77_scnrm2_sub_base F77_GLOBAL(scnrm2sub,SCNRM2SUB) -#define F77_scasum_sub_base F77_GLOBAL(scasumsub,SCASUMSUB) -#define F77_dznrm2_sub_base F77_GLOBAL(dznrm2sub,DZNRM2SUB) -#define F77_dzasum_sub_base F77_GLOBAL(dzasumsub,DZASUMSUB) -#define F77_sdsdot_sub_base F77_GLOBAL(sdsdotsub,SDSDOTSUB) +#define F77_xerbla_base F77_GLOBAL_SUFFIX(xerbla,XERBLA) +#define F77_srotg_base F77_GLOBAL_SUFFIX(srotg,SROTG) +#define F77_srotmg_base F77_GLOBAL_SUFFIX(srotmg,SROTMG) +#define F77_srot_base F77_GLOBAL_SUFFIX(srot,SROT) +#define F77_srotm_base F77_GLOBAL_SUFFIX(srotm,SROTM) +#define F77_drotg_base F77_GLOBAL_SUFFIX(drotg,DROTG) +#define F77_drotmg_base F77_GLOBAL_SUFFIX(drotmg,DROTMG) +#define F77_drot_base F77_GLOBAL_SUFFIX(drot,DROT) +#define F77_drotm_base F77_GLOBAL_SUFFIX(drotm,DROTM) +#define F77_sswap_base F77_GLOBAL_SUFFIX(sswap,SSWAP) +#define F77_scopy_base F77_GLOBAL_SUFFIX(scopy,SCOPY) +#define F77_saxpy_base F77_GLOBAL_SUFFIX(saxpy,SAXPY) +#define F77_saxpby_base F77_GLOBAL_SUFFIX(saxpby,SAXPBY) +#define F77_isamax_sub_base F77_GLOBAL_SUFFIX(isamaxsub,ISAMAXSUB) +#define F77_dswap_base F77_GLOBAL_SUFFIX(dswap,DSWAP) +#define F77_dcopy_base F77_GLOBAL_SUFFIX(dcopy,DCOPY) +#define F77_daxpy_base F77_GLOBAL_SUFFIX(daxpy,DAXPY) +#define F77_daxpby_base F77_GLOBAL_SUFFIX(daxpby,DAXPBY) +#define F77_idamax_sub_base F77_GLOBAL_SUFFIX(idamaxsub,IDAMAXSUB) +#define F77_cswap_base F77_GLOBAL_SUFFIX(cswap,CSWAP) +#define F77_ccopy_base F77_GLOBAL_SUFFIX(ccopy,CCOPY) +#define F77_caxpy_base F77_GLOBAL_SUFFIX(caxpy,CAXPY) +#define F77_caxpby_base F77_GLOBAL_SUFFIX(caxpby,CAXPBY) +#define F77_icamax_sub_base F77_GLOBAL_SUFFIX(icamaxsub,ICAMAXSUB) +#define F77_zswap_base F77_GLOBAL_SUFFIX(zswap,ZSWAP) +#define F77_zcopy_base F77_GLOBAL_SUFFIX(zcopy,ZCOPY) +#define F77_zaxpy_base F77_GLOBAL_SUFFIX(zaxpy,ZAXPY) +#define F77_zaxpby_base F77_GLOBAL_SUFFIX(zaxpby,ZAXPBY) +#define F77_izamax_sub_base F77_GLOBAL_SUFFIX(izamaxsub,IZAMAXSUB) +#define F77_sdot_sub_base F77_GLOBAL_SUFFIX(sdotsub,SDOTSUB) +#define F77_ddot_sub_base F77_GLOBAL_SUFFIX(ddotsub,DDOTSUB) +#define F77_dsdot_sub_base F77_GLOBAL_SUFFIX(dsdotsub,DSDOTSUB) +#define F77_sscal_base F77_GLOBAL_SUFFIX(sscal,SSCAL) +#define F77_dscal_base F77_GLOBAL_SUFFIX(dscal,DSCAL) +#define F77_cscal_base F77_GLOBAL_SUFFIX(cscal,CSCAL) +#define F77_zscal_base F77_GLOBAL_SUFFIX(zscal,ZSCAL) +#define F77_csscal_base F77_GLOBAL_SUFFIX(csscal,CSSCAL) +#define F77_zdscal_base F77_GLOBAL_SUFFIX(zdscal,ZDSCAL) +#define F77_cdotu_sub_base F77_GLOBAL_SUFFIX(cdotusub,CDOTUSUB) +#define F77_cdotc_sub_base F77_GLOBAL_SUFFIX(cdotcsub,CDOTCSUB) +#define F77_zdotu_sub_base F77_GLOBAL_SUFFIX(zdotusub,ZDOTUSUB) +#define F77_zdotc_sub_base F77_GLOBAL_SUFFIX(zdotcsub,ZDOTCSUB) +#define F77_snrm2_sub_base F77_GLOBAL_SUFFIX(snrm2sub,SNRM2SUB) +#define F77_sasum_sub_base F77_GLOBAL_SUFFIX(sasumsub,SASUMSUB) +#define F77_dnrm2_sub_base F77_GLOBAL_SUFFIX(dnrm2sub,DNRM2SUB) +#define F77_dasum_sub_base F77_GLOBAL_SUFFIX(dasumsub,DASUMSUB) +#define F77_scnrm2_sub_base F77_GLOBAL_SUFFIX(scnrm2sub,SCNRM2SUB) +#define F77_scasum_sub_base F77_GLOBAL_SUFFIX(scasumsub,SCASUMSUB) +#define F77_dznrm2_sub_base F77_GLOBAL_SUFFIX(dznrm2sub,DZNRM2SUB) +#define F77_dzasum_sub_base F77_GLOBAL_SUFFIX(dzasumsub,DZASUMSUB) +#define F77_sdsdot_sub_base F77_GLOBAL_SUFFIX(sdsdotsub,SDSDOTSUB) +#define F77_crotg_base F77_GLOBAL_SUFFIX(crotg, CROTG) +#define F77_csrot_base F77_GLOBAL_SUFFIX(csrot, CSROT) +#define F77_zrotg_base F77_GLOBAL_SUFFIX(zrotg, ZROTG) +#define F77_zdrot_base F77_GLOBAL_SUFFIX(zdrot, ZDROT) +#define F77_scabs1_sub_base F77_GLOBAL_SUFFIX(scabs1sub, SCABS1SUB) +#define F77_dcabs1_sub_base F77_GLOBAL_SUFFIX(dcabs1sub, DCABS1SUB) + /* * Level 2 BLAS */ -#define F77_ssymv_base F77_GLOBAL(ssymv,SSYMV) -#define F77_ssbmv_base F77_GLOBAL(ssbmv,SSBMV) -#define F77_sspmv_base F77_GLOBAL(sspmv,SSPMV) -#define F77_sger_base F77_GLOBAL(sger,SGER) -#define F77_ssyr_base F77_GLOBAL(ssyr,SSYR) -#define F77_sspr_base F77_GLOBAL(sspr,SSPR) -#define F77_ssyr2_base F77_GLOBAL(ssyr2,SSYR2) -#define F77_sspr2_base F77_GLOBAL(sspr2,SSPR2) -#define F77_dsymv_base F77_GLOBAL(dsymv,DSYMV) -#define F77_dsbmv_base F77_GLOBAL(dsbmv,DSBMV) -#define F77_dspmv_base F77_GLOBAL(dspmv,DSPMV) -#define F77_dger_base F77_GLOBAL(dger,DGER) -#define F77_dsyr_base F77_GLOBAL(dsyr,DSYR) -#define F77_dspr_base F77_GLOBAL(dspr,DSPR) -#define F77_dsyr2_base F77_GLOBAL(dsyr2,DSYR2) -#define F77_dspr2_base F77_GLOBAL(dspr2,DSPR2) -#define F77_chemv_base F77_GLOBAL(chemv,CHEMV) -#define F77_chbmv_base F77_GLOBAL(chbmv,CHBMV) -#define F77_chpmv_base F77_GLOBAL(chpmv,CHPMV) -#define F77_cgeru_base F77_GLOBAL(cgeru,CGERU) -#define F77_cgerc_base F77_GLOBAL(cgerc,CGERC) -#define F77_cher_base F77_GLOBAL(cher,CHER) -#define F77_chpr_base F77_GLOBAL(chpr,CHPR) -#define F77_cher2_base F77_GLOBAL(cher2,CHER2) -#define F77_chpr2_base F77_GLOBAL(chpr2,CHPR2) -#define F77_zhemv_base F77_GLOBAL(zhemv,ZHEMV) -#define F77_zhbmv_base F77_GLOBAL(zhbmv,ZHBMV) -#define F77_zhpmv_base F77_GLOBAL(zhpmv,ZHPMV) -#define F77_zgeru_base F77_GLOBAL(zgeru,ZGERU) -#define F77_zgerc_base F77_GLOBAL(zgerc,ZGERC) -#define F77_zher_base F77_GLOBAL(zher,ZHER) -#define F77_zhpr_base F77_GLOBAL(zhpr,ZHPR) -#define F77_zher2_base F77_GLOBAL(zher2,ZHER2) -#define F77_zhpr2_base F77_GLOBAL(zhpr2,ZHPR2) -#define F77_sgemv_base F77_GLOBAL(sgemv,SGEMV) -#define F77_sgbmv_base F77_GLOBAL(sgbmv,SGBMV) -#define F77_strmv_base F77_GLOBAL(strmv,STRMV) -#define F77_stbmv_base F77_GLOBAL(stbmv,STBMV) -#define F77_stpmv_base F77_GLOBAL(stpmv,STPMV) -#define F77_strsv_base F77_GLOBAL(strsv,STRSV) -#define F77_stbsv_base F77_GLOBAL(stbsv,STBSV) -#define F77_stpsv_base F77_GLOBAL(stpsv,STPSV) -#define F77_dgemv_base F77_GLOBAL(dgemv,DGEMV) -#define F77_dgbmv_base F77_GLOBAL(dgbmv,DGBMV) -#define F77_dtrmv_base F77_GLOBAL(dtrmv,DTRMV) -#define F77_dtbmv_base F77_GLOBAL(dtbmv,DTBMV) -#define F77_dtpmv_base F77_GLOBAL(dtpmv,DTPMV) -#define F77_dtrsv_base F77_GLOBAL(dtrsv,DTRSV) -#define F77_dtbsv_base F77_GLOBAL(dtbsv,DTBSV) -#define F77_dtpsv_base F77_GLOBAL(dtpsv,DTPSV) -#define F77_cgemv_base F77_GLOBAL(cgemv,CGEMV) -#define F77_cgbmv_base F77_GLOBAL(cgbmv,CGBMV) -#define F77_ctrmv_base F77_GLOBAL(ctrmv,CTRMV) -#define F77_ctbmv_base F77_GLOBAL(ctbmv,CTBMV) -#define F77_ctpmv_base F77_GLOBAL(ctpmv,CTPMV) -#define F77_ctrsv_base F77_GLOBAL(ctrsv,CTRSV) -#define F77_ctbsv_base F77_GLOBAL(ctbsv,CTBSV) -#define F77_ctpsv_base F77_GLOBAL(ctpsv,CTPSV) -#define F77_zgemv_base F77_GLOBAL(zgemv,ZGEMV) -#define F77_zgbmv_base F77_GLOBAL(zgbmv,ZGBMV) -#define F77_ztrmv_base F77_GLOBAL(ztrmv,ZTRMV) -#define F77_ztbmv_base F77_GLOBAL(ztbmv,ZTBMV) -#define F77_ztpmv_base F77_GLOBAL(ztpmv,ZTPMV) -#define F77_ztrsv_base F77_GLOBAL(ztrsv,ZTRSV) -#define F77_ztbsv_base F77_GLOBAL(ztbsv,ZTBSV) -#define F77_ztpsv_base F77_GLOBAL(ztpsv,ZTPSV) +#define F77_ssymv_base F77_GLOBAL_SUFFIX(ssymv,SSYMV) +#define F77_ssbmv_base F77_GLOBAL_SUFFIX(ssbmv,SSBMV) +#define F77_sspmv_base F77_GLOBAL_SUFFIX(sspmv,SSPMV) +#define F77_sger_base F77_GLOBAL_SUFFIX(sger,SGER) +#define F77_ssyr_base F77_GLOBAL_SUFFIX(ssyr,SSYR) +#define F77_sspr_base F77_GLOBAL_SUFFIX(sspr,SSPR) +#define F77_ssyr2_base F77_GLOBAL_SUFFIX(ssyr2,SSYR2) +#define F77_sspr2_base F77_GLOBAL_SUFFIX(sspr2,SSPR2) +#define F77_dsymv_base F77_GLOBAL_SUFFIX(dsymv,DSYMV) +#define F77_dsbmv_base F77_GLOBAL_SUFFIX(dsbmv,DSBMV) +#define F77_dspmv_base F77_GLOBAL_SUFFIX(dspmv,DSPMV) +#define F77_dger_base F77_GLOBAL_SUFFIX(dger,DGER) +#define F77_dsyr_base F77_GLOBAL_SUFFIX(dsyr,DSYR) +#define F77_dspr_base F77_GLOBAL_SUFFIX(dspr,DSPR) +#define F77_dsyr2_base F77_GLOBAL_SUFFIX(dsyr2,DSYR2) +#define F77_dspr2_base F77_GLOBAL_SUFFIX(dspr2,DSPR2) +#define F77_chemv_base F77_GLOBAL_SUFFIX(chemv,CHEMV) +#define F77_chbmv_base F77_GLOBAL_SUFFIX(chbmv,CHBMV) +#define F77_chpmv_base F77_GLOBAL_SUFFIX(chpmv,CHPMV) +#define F77_cgeru_base F77_GLOBAL_SUFFIX(cgeru,CGERU) +#define F77_cgerc_base F77_GLOBAL_SUFFIX(cgerc,CGERC) +#define F77_cher_base F77_GLOBAL_SUFFIX(cher,CHER) +#define F77_chpr_base F77_GLOBAL_SUFFIX(chpr,CHPR) +#define F77_cher2_base F77_GLOBAL_SUFFIX(cher2,CHER2) +#define F77_chpr2_base F77_GLOBAL_SUFFIX(chpr2,CHPR2) +#define F77_zhemv_base F77_GLOBAL_SUFFIX(zhemv,ZHEMV) +#define F77_zhbmv_base F77_GLOBAL_SUFFIX(zhbmv,ZHBMV) +#define F77_zhpmv_base F77_GLOBAL_SUFFIX(zhpmv,ZHPMV) +#define F77_zgeru_base F77_GLOBAL_SUFFIX(zgeru,ZGERU) +#define F77_zgerc_base F77_GLOBAL_SUFFIX(zgerc,ZGERC) +#define F77_zher_base F77_GLOBAL_SUFFIX(zher,ZHER) +#define F77_zhpr_base F77_GLOBAL_SUFFIX(zhpr,ZHPR) +#define F77_zher2_base F77_GLOBAL_SUFFIX(zher2,ZHER2) +#define F77_zhpr2_base F77_GLOBAL_SUFFIX(zhpr2,ZHPR2) +#define F77_sgemv_base F77_GLOBAL_SUFFIX(sgemv,SGEMV) +#define F77_sgbmv_base F77_GLOBAL_SUFFIX(sgbmv,SGBMV) +#define F77_strmv_base F77_GLOBAL_SUFFIX(strmv,STRMV) +#define F77_stbmv_base F77_GLOBAL_SUFFIX(stbmv,STBMV) +#define F77_stpmv_base F77_GLOBAL_SUFFIX(stpmv,STPMV) +#define F77_strsv_base F77_GLOBAL_SUFFIX(strsv,STRSV) +#define F77_stbsv_base F77_GLOBAL_SUFFIX(stbsv,STBSV) +#define F77_stpsv_base F77_GLOBAL_SUFFIX(stpsv,STPSV) +#define F77_dgemv_base F77_GLOBAL_SUFFIX(dgemv,DGEMV) +#define F77_dgbmv_base F77_GLOBAL_SUFFIX(dgbmv,DGBMV) +#define F77_dtrmv_base F77_GLOBAL_SUFFIX(dtrmv,DTRMV) +#define F77_dtbmv_base F77_GLOBAL_SUFFIX(dtbmv,DTBMV) +#define F77_dtpmv_base F77_GLOBAL_SUFFIX(dtpmv,DTPMV) +#define F77_dtrsv_base F77_GLOBAL_SUFFIX(dtrsv,DTRSV) +#define F77_dtbsv_base F77_GLOBAL_SUFFIX(dtbsv,DTBSV) +#define F77_dtpsv_base F77_GLOBAL_SUFFIX(dtpsv,DTPSV) +#define F77_cgemv_base F77_GLOBAL_SUFFIX(cgemv,CGEMV) +#define F77_cgbmv_base F77_GLOBAL_SUFFIX(cgbmv,CGBMV) +#define F77_ctrmv_base F77_GLOBAL_SUFFIX(ctrmv,CTRMV) +#define F77_ctbmv_base F77_GLOBAL_SUFFIX(ctbmv,CTBMV) +#define F77_ctpmv_base F77_GLOBAL_SUFFIX(ctpmv,CTPMV) +#define F77_ctrsv_base F77_GLOBAL_SUFFIX(ctrsv,CTRSV) +#define F77_ctbsv_base F77_GLOBAL_SUFFIX(ctbsv,CTBSV) +#define F77_ctpsv_base F77_GLOBAL_SUFFIX(ctpsv,CTPSV) +#define F77_zgemv_base F77_GLOBAL_SUFFIX(zgemv,ZGEMV) +#define F77_zgbmv_base F77_GLOBAL_SUFFIX(zgbmv,ZGBMV) +#define F77_ztrmv_base F77_GLOBAL_SUFFIX(ztrmv,ZTRMV) +#define F77_ztbmv_base F77_GLOBAL_SUFFIX(ztbmv,ZTBMV) +#define F77_ztpmv_base F77_GLOBAL_SUFFIX(ztpmv,ZTPMV) +#define F77_ztrsv_base F77_GLOBAL_SUFFIX(ztrsv,ZTRSV) +#define F77_ztbsv_base F77_GLOBAL_SUFFIX(ztbsv,ZTBSV) +#define F77_ztpsv_base F77_GLOBAL_SUFFIX(ztpsv,ZTPSV) /* * Level 3 BLAS */ -#define F77_chemm_base F77_GLOBAL(chemm,CHEMM) -#define F77_cherk_base F77_GLOBAL(cherk,CHERK) -#define F77_cher2k_base F77_GLOBAL(cher2k,CHER2K) -#define F77_zhemm_base F77_GLOBAL(zhemm,ZHEMM) -#define F77_zherk_base F77_GLOBAL(zherk,ZHERK) -#define F77_zher2k_base F77_GLOBAL(zher2k,ZHER2K) -#define F77_sgemm_base F77_GLOBAL(sgemm,SGEMM) -#define F77_ssymm_base F77_GLOBAL(ssymm,SSYMM) -#define F77_ssyrk_base F77_GLOBAL(ssyrk,SSYRK) -#define F77_ssyr2k_base F77_GLOBAL(ssyr2k,SSYR2K) -#define F77_strmm_base F77_GLOBAL(strmm,STRMM) -#define F77_strsm_base F77_GLOBAL(strsm,STRSM) -#define F77_dgemm_base F77_GLOBAL(dgemm,DGEMM) -#define F77_dsymm_base F77_GLOBAL(dsymm,DSYMM) -#define F77_dsyrk_base F77_GLOBAL(dsyrk,DSYRK) -#define F77_dsyr2k_base F77_GLOBAL(dsyr2k,DSYR2K) -#define F77_dtrmm_base F77_GLOBAL(dtrmm,DTRMM) -#define F77_dtrsm_base F77_GLOBAL(dtrsm,DTRSM) -#define F77_cgemm_base F77_GLOBAL(cgemm,CGEMM) -#define F77_csymm_base F77_GLOBAL(csymm,CSYMM) -#define F77_csyrk_base F77_GLOBAL(csyrk,CSYRK) -#define F77_csyr2k_base F77_GLOBAL(csyr2k,CSYR2K) -#define F77_ctrmm_base F77_GLOBAL(ctrmm,CTRMM) -#define F77_ctrsm_base F77_GLOBAL(ctrsm,CTRSM) -#define F77_zgemm_base F77_GLOBAL(zgemm,ZGEMM) -#define F77_zsymm_base F77_GLOBAL(zsymm,ZSYMM) -#define F77_zsyrk_base F77_GLOBAL(zsyrk,ZSYRK) -#define F77_zsyr2k_base F77_GLOBAL(zsyr2k,ZSYR2K) -#define F77_ztrmm_base F77_GLOBAL(ztrmm,ZTRMM) -#define F77_ztrsm_base F77_GLOBAL(ztrsm,ZTRSM) +#define F77_chemm_base F77_GLOBAL_SUFFIX(chemm,CHEMM) +#define F77_cherk_base F77_GLOBAL_SUFFIX(cherk,CHERK) +#define F77_cher2k_base F77_GLOBAL_SUFFIX(cher2k,CHER2K) +#define F77_zhemm_base F77_GLOBAL_SUFFIX(zhemm,ZHEMM) +#define F77_zherk_base F77_GLOBAL_SUFFIX(zherk,ZHERK) +#define F77_zher2k_base F77_GLOBAL_SUFFIX(zher2k,ZHER2K) +#define F77_sgemm_base F77_GLOBAL_SUFFIX(sgemm,SGEMM) +#define F77_sgemmtr_base F77_GLOBAL_SUFFIX(sgemmtr,SGEMMTR) +#define F77_ssymm_base F77_GLOBAL_SUFFIX(ssymm,SSYMM) +#define F77_ssyrk_base F77_GLOBAL_SUFFIX(ssyrk,SSYRK) +#define F77_ssyr2k_base F77_GLOBAL_SUFFIX(ssyr2k,SSYR2K) +#define F77_strmm_base F77_GLOBAL_SUFFIX(strmm,STRMM) +#define F77_strsm_base F77_GLOBAL_SUFFIX(strsm,STRSM) +#define F77_dgemm_base F77_GLOBAL_SUFFIX(dgemm,DGEMM) +#define F77_dgemmtr_base F77_GLOBAL_SUFFIX(dgemmtr,DGEMMTR) +#define F77_dsymm_base F77_GLOBAL_SUFFIX(dsymm,DSYMM) +#define F77_dsyrk_base F77_GLOBAL_SUFFIX(dsyrk,DSYRK) +#define F77_dsyr2k_base F77_GLOBAL_SUFFIX(dsyr2k,DSYR2K) +#define F77_dtrmm_base F77_GLOBAL_SUFFIX(dtrmm,DTRMM) +#define F77_dtrsm_base F77_GLOBAL_SUFFIX(dtrsm,DTRSM) +#define F77_cgemm_base F77_GLOBAL_SUFFIX(cgemm,CGEMM) +#define F77_cgemmtr_base F77_GLOBAL_SUFFIX(cgemmtr,CGEMMTR) +#define F77_csymm_base F77_GLOBAL_SUFFIX(csymm,CSYMM) +#define F77_csyrk_base F77_GLOBAL_SUFFIX(csyrk,CSYRK) +#define F77_csyr2k_base F77_GLOBAL_SUFFIX(csyr2k,CSYR2K) +#define F77_ctrmm_base F77_GLOBAL_SUFFIX(ctrmm,CTRMM) +#define F77_ctrsm_base F77_GLOBAL_SUFFIX(ctrsm,CTRSM) +#define F77_zgemm_base F77_GLOBAL_SUFFIX(zgemm,ZGEMM) +#define F77_zgemmtr_base F77_GLOBAL_SUFFIX(zgemmtr,ZGEMMTR) +#define F77_zsymm_base F77_GLOBAL_SUFFIX(zsymm,ZSYMM) +#define F77_zsyrk_base F77_GLOBAL_SUFFIX(zsyrk,ZSYRK) +#define F77_zsyr2k_base F77_GLOBAL_SUFFIX(zsyr2k,ZSYR2K) +#define F77_ztrmm_base F77_GLOBAL_SUFFIX(ztrmm,ZTRMM) +#define F77_ztrsm_base F77_GLOBAL_SUFFIX(ztrsm,ZTRSM) /* * Level 1 Fortran variadic definitions */ + /* Single Precision */ - #define F77_srot(...) F77_srot_base(__VA_ARGS__) - #define F77_srotg(...) F77_srotg_base(__VA_ARGS__) - #define F77_srotm(...) F77_srotm_base(__VA_ARGS__) - #define F77_srotmg(...) F77_srotmg_base(__VA_ARGS__) - #define F77_sswap(...) F77_sswap_base(__VA_ARGS__) - #define F77_scopy(...) F77_scopy_base(__VA_ARGS__) - #define F77_saxpy(...) F77_saxpy_base(__VA_ARGS__) - #define F77_sdot_sub(...) F77_sdot_sub_base(__VA_ARGS__) - #define F77_sdsdot_sub(...) F77_sdsdot_sub_base(__VA_ARGS__) - #define F77_sscal(...) F77_sscal_base(__VA_ARGS__) - #define F77_snrm2_sub(...) F77_snrm2_sub_base(__VA_ARGS__) - #define F77_sasum_sub(...) F77_sasum_sub_base(__VA_ARGS__) - #define F77_isamax_sub(...) F77_isamax_sub_base(__VA_ARGS__) +#define F77_srot(...) F77_srot_base(__VA_ARGS__) +#define F77_srotg(...) F77_srotg_base(__VA_ARGS__) +#define F77_srotm(...) F77_srotm_base(__VA_ARGS__) +#define F77_srotmg(...) F77_srotmg_base(__VA_ARGS__) +#define F77_sswap(...) F77_sswap_base(__VA_ARGS__) +#define F77_scopy(...) F77_scopy_base(__VA_ARGS__) +#define F77_saxpy(...) F77_saxpy_base(__VA_ARGS__) +#define F77_saxpby(...) F77_saxpby_base(__VA_ARGS__) +#define F77_sdot_sub(...) F77_sdot_sub_base(__VA_ARGS__) +#define F77_sdsdot_sub(...) F77_sdsdot_sub_base(__VA_ARGS__) +#define F77_sscal(...) F77_sscal_base(__VA_ARGS__) +#define F77_snrm2_sub(...) F77_snrm2_sub_base(__VA_ARGS__) +#define F77_sasum_sub(...) F77_sasum_sub_base(__VA_ARGS__) +#define F77_isamax_sub(...) F77_isamax_sub_base(__VA_ARGS__) +#define F77_scabs1_sub(...) F77_scabs1_sub_base(__VA_ARGS__) /* Double Precision */ - #define F77_drot(...) F77_drot_base(__VA_ARGS__) - #define F77_drotg(...) F77_drotg_base(__VA_ARGS__) - #define F77_drotm(...) F77_drotm_base(__VA_ARGS__) - #define F77_drotmg(...) F77_drotmg_base(__VA_ARGS__) - #define F77_dswap(...) F77_dswap_base(__VA_ARGS__) - #define F77_dcopy(...) F77_dcopy_base(__VA_ARGS__) - #define F77_daxpy(...) F77_daxpy_base(__VA_ARGS__) - #define F77_dswap(...) F77_dswap_base(__VA_ARGS__) - #define F77_dsdot_sub(...) F77_dsdot_sub_base(__VA_ARGS__) - #define F77_ddot_sub(...) F77_ddot_sub_base(__VA_ARGS__) - #define F77_dscal(...) F77_dscal_base(__VA_ARGS__) - #define F77_dnrm2_sub(...) F77_dnrm2_sub_base(__VA_ARGS__) - #define F77_dasum_sub(...) F77_dasum_sub_base(__VA_ARGS__) - #define F77_idamax_sub(...) F77_idamax_sub_base(__VA_ARGS__) +#define F77_drot(...) F77_drot_base(__VA_ARGS__) +#define F77_drotg(...) F77_drotg_base(__VA_ARGS__) +#define F77_drotm(...) F77_drotm_base(__VA_ARGS__) +#define F77_drotmg(...) F77_drotmg_base(__VA_ARGS__) +#define F77_dswap(...) F77_dswap_base(__VA_ARGS__) +#define F77_dcopy(...) F77_dcopy_base(__VA_ARGS__) +#define F77_daxpy(...) F77_daxpy_base(__VA_ARGS__) +#define F77_daxpby(...) F77_daxpby_base(__VA_ARGS__) +#define F77_dswap(...) F77_dswap_base(__VA_ARGS__) +#define F77_dsdot_sub(...) F77_dsdot_sub_base(__VA_ARGS__) +#define F77_ddot_sub(...) F77_ddot_sub_base(__VA_ARGS__) +#define F77_dscal(...) F77_dscal_base(__VA_ARGS__) +#define F77_dnrm2_sub(...) F77_dnrm2_sub_base(__VA_ARGS__) +#define F77_dasum_sub(...) F77_dasum_sub_base(__VA_ARGS__) +#define F77_idamax_sub(...) F77_idamax_sub_base(__VA_ARGS__) +#define F77_dcabs1_sub(...) F77_dcabs1_sub_base(__VA_ARGS__) /* Single Complex Precision */ - #define F77_cswap(...) F77_cswap_base(__VA_ARGS__) - #define F77_ccopy(...) F77_ccopy_base(__VA_ARGS__) - #define F77_caxpy(...) F77_caxpy_base(__VA_ARGS__) - #define F77_cswap(...) F77_cswap_base(__VA_ARGS__) - #define F77_cdotc_sub(...) F77_cdotc_sub_base(__VA_ARGS__) - #define F77_cdotu_sub(...) F77_cdotu_sub_base(__VA_ARGS__) - #define F77_cscal(...) F77_cscal_base(__VA_ARGS__) - #define F77_icamax_sub(...) F77_icamax_sub_base(__VA_ARGS__) - #define F77_csscal(...) F77_csscal_base(__VA_ARGS__) - #define F77_scnrm2_sub(...) F77_scnrm2_sub_base(__VA_ARGS__) - #define F77_scasum_sub(...) F77_scasum_sub_base(__VA_ARGS__) +#define F77_crotg(...) F77_crotg_base(__VA_ARGS__) +#define F77_csrot(...) F77_csrot_base(__VA_ARGS__) +#define F77_cswap(...) F77_cswap_base(__VA_ARGS__) +#define F77_ccopy(...) F77_ccopy_base(__VA_ARGS__) +#define F77_caxpy(...) F77_caxpy_base(__VA_ARGS__) +#define F77_caxpby(...) F77_caxpby_base(__VA_ARGS__) +#define F77_cswap(...) F77_cswap_base(__VA_ARGS__) +#define F77_cdotc_sub(...) F77_cdotc_sub_base(__VA_ARGS__) +#define F77_cdotu_sub(...) F77_cdotu_sub_base(__VA_ARGS__) +#define F77_cscal(...) F77_cscal_base(__VA_ARGS__) +#define F77_icamax_sub(...) F77_icamax_sub_base(__VA_ARGS__) +#define F77_csscal(...) F77_csscal_base(__VA_ARGS__) +#define F77_scnrm2_sub(...) F77_scnrm2_sub_base(__VA_ARGS__) +#define F77_scasum_sub(...) F77_scasum_sub_base(__VA_ARGS__) /* Double Complex Precision */ - #define F77_zswap(...) F77_zswap_base(__VA_ARGS__) - #define F77_zcopy(...) F77_zcopy_base(__VA_ARGS__) - #define F77_zaxpy(...) F77_zaxpy_base(__VA_ARGS__) - #define F77_zswap(...) F77_zswap_base(__VA_ARGS__) - #define F77_zdotc_sub(...) F77_zdotc_sub_base(__VA_ARGS__) - #define F77_zdotu_sub(...) F77_zdotu_sub_base(__VA_ARGS__) - #define F77_zdscal(...) F77_zdscal_base(__VA_ARGS__) - #define F77_zscal(...) F77_zscal_base(__VA_ARGS__) - #define F77_dznrm2_sub(...) F77_dznrm2_sub_base(__VA_ARGS__) - #define F77_dzasum_sub(...) F77_dzasum_sub_base(__VA_ARGS__) - #define F77_izamax_sub(...) F77_izamax_sub_base(__VA_ARGS__) +#define F77_zrotg(...) F77_zrotg_base(__VA_ARGS__) +#define F77_zdrot(...) F77_zdrot_base(__VA_ARGS__) +#define F77_zswap(...) F77_zswap_base(__VA_ARGS__) +#define F77_zcopy(...) F77_zcopy_base(__VA_ARGS__) +#define F77_zaxpy(...) F77_zaxpy_base(__VA_ARGS__) +#define F77_zaxpby(...) F77_zaxpby_base(__VA_ARGS__) +#define F77_zswap(...) F77_zswap_base(__VA_ARGS__) +#define F77_zdotc_sub(...) F77_zdotc_sub_base(__VA_ARGS__) +#define F77_zdotu_sub(...) F77_zdotu_sub_base(__VA_ARGS__) +#define F77_zdscal(...) F77_zdscal_base(__VA_ARGS__) +#define F77_zscal(...) F77_zscal_base(__VA_ARGS__) +#define F77_dznrm2_sub(...) F77_dznrm2_sub_base(__VA_ARGS__) +#define F77_dzasum_sub(...) F77_dzasum_sub_base(__VA_ARGS__) +#define F77_izamax_sub(...) F77_izamax_sub_base(__VA_ARGS__) /* * Level 2 Fortran variadic definitions without FCHAR */ - #define F77_sger(...) F77_sger_base(__VA_ARGS__) - #define F77_dger(...) F77_dger_base(__VA_ARGS__) - #define F77_cgerc(...) F77_cgerc_base(__VA_ARGS__) - #define F77_cgeru(...) F77_cgeru_base(__VA_ARGS__) - #define F77_zgerc(...) F77_zgerc_base(__VA_ARGS__) - #define F77_zgeru(...) F77_zgeru_base(__VA_ARGS__) +#define F77_sger(...) F77_sger_base(__VA_ARGS__) +#define F77_dger(...) F77_dger_base(__VA_ARGS__) +#define F77_cgerc(...) F77_cgerc_base(__VA_ARGS__) +#define F77_cgeru(...) F77_cgeru_base(__VA_ARGS__) +#define F77_zgerc(...) F77_zgerc_base(__VA_ARGS__) +#define F77_zgeru(...) F77_zgeru_base(__VA_ARGS__) #ifdef BLAS_FORTRAN_STRLEN_END @@ -277,75 +324,75 @@ /* Single Precision */ - #define F77_sgemv(...) F77_sgemv_base(__VA_ARGS__, 1) - #define F77_sgbmv(...) F77_sgbmv_base(__VA_ARGS__, 1) - #define F77_ssymv(...) F77_ssymv_base(__VA_ARGS__, 1) - #define F77_ssbmv(...) F77_ssbmv_base(__VA_ARGS__, 1) - #define F77_sspmv(...) F77_sspmv_base(__VA_ARGS__, 1) - #define F77_strmv(...) F77_strmv_base(__VA_ARGS__, 1, 1, 1) - #define F77_stbmv(...) F77_stbmv_base(__VA_ARGS__, 1, 1, 1) - #define F77_strsv(...) F77_strsv_base(__VA_ARGS__, 1, 1, 1) - #define F77_stbsv(...) F77_stbsv_base(__VA_ARGS__, 1, 1, 1) - #define F77_stpmv(...) F77_stpmv_base(__VA_ARGS__, 1, 1, 1) - #define F77_stpsv(...) F77_stpsv_base(__VA_ARGS__, 1, 1, 1) - #define F77_ssyr(...) F77_ssyr_base(__VA_ARGS__, 1) - #define F77_sspr(...) F77_sspr_base(__VA_ARGS__, 1) - #define F77_sspr2(...) F77_sspr2_base(__VA_ARGS__, 1) - #define F77_ssyr2(...) F77_ssyr2_base(__VA_ARGS__, 1) + #define F77_sgemv(...) F77_sgemv_base(__VA_ARGS__, 1) + #define F77_sgbmv(...) F77_sgbmv_base(__VA_ARGS__, 1) + #define F77_ssymv(...) F77_ssymv_base(__VA_ARGS__, 1) + #define F77_ssbmv(...) F77_ssbmv_base(__VA_ARGS__, 1) + #define F77_sspmv(...) F77_sspmv_base(__VA_ARGS__, 1) + #define F77_strmv(...) F77_strmv_base(__VA_ARGS__, 1, 1, 1) + #define F77_stbmv(...) F77_stbmv_base(__VA_ARGS__, 1, 1, 1) + #define F77_strsv(...) F77_strsv_base(__VA_ARGS__, 1, 1, 1) + #define F77_stbsv(...) F77_stbsv_base(__VA_ARGS__, 1, 1, 1) + #define F77_stpmv(...) F77_stpmv_base(__VA_ARGS__, 1, 1, 1) + #define F77_stpsv(...) F77_stpsv_base(__VA_ARGS__, 1, 1, 1) + #define F77_ssyr(...) F77_ssyr_base(__VA_ARGS__, 1) + #define F77_sspr(...) F77_sspr_base(__VA_ARGS__, 1) + #define F77_sspr2(...) F77_sspr2_base(__VA_ARGS__, 1) + #define F77_ssyr2(...) F77_ssyr2_base(__VA_ARGS__, 1) /* Double Precision */ - #define F77_dgemv(...) F77_dgemv_base(__VA_ARGS__, 1) - #define F77_dgbmv(...) F77_dgbmv_base(__VA_ARGS__, 1) - #define F77_dsymv(...) F77_dsymv_base(__VA_ARGS__, 1) - #define F77_dsbmv(...) F77_dsbmv_base(__VA_ARGS__, 1) - #define F77_dspmv(...) F77_dspmv_base(__VA_ARGS__, 1) - #define F77_dtrmv(...) F77_dtrmv_base(__VA_ARGS__, 1, 1, 1) - #define F77_dtbmv(...) F77_dtbmv_base(__VA_ARGS__, 1, 1, 1) - #define F77_dtrsv(...) F77_dtrsv_base(__VA_ARGS__, 1, 1, 1) - #define F77_dtbsv(...) F77_dtbsv_base(__VA_ARGS__, 1, 1, 1) - #define F77_dtpmv(...) F77_dtpmv_base(__VA_ARGS__, 1, 1, 1) - #define F77_dtpsv(...) F77_dtpsv_base(__VA_ARGS__, 1, 1, 1) - #define F77_dsyr(...) F77_dsyr_base(__VA_ARGS__, 1) - #define F77_dspr(...) F77_dspr_base(__VA_ARGS__, 1) - #define F77_dspr2(...) F77_dspr2_base(__VA_ARGS__, 1) - #define F77_dsyr2(...) F77_dsyr2_base(__VA_ARGS__, 1) + #define F77_dgemv(...) F77_dgemv_base(__VA_ARGS__, 1) + #define F77_dgbmv(...) F77_dgbmv_base(__VA_ARGS__, 1) + #define F77_dsymv(...) F77_dsymv_base(__VA_ARGS__, 1) + #define F77_dsbmv(...) F77_dsbmv_base(__VA_ARGS__, 1) + #define F77_dspmv(...) F77_dspmv_base(__VA_ARGS__, 1) + #define F77_dtrmv(...) F77_dtrmv_base(__VA_ARGS__, 1, 1, 1) + #define F77_dtbmv(...) F77_dtbmv_base(__VA_ARGS__, 1, 1, 1) + #define F77_dtrsv(...) F77_dtrsv_base(__VA_ARGS__, 1, 1, 1) + #define F77_dtbsv(...) F77_dtbsv_base(__VA_ARGS__, 1, 1, 1) + #define F77_dtpmv(...) F77_dtpmv_base(__VA_ARGS__, 1, 1, 1) + #define F77_dtpsv(...) F77_dtpsv_base(__VA_ARGS__, 1, 1, 1) + #define F77_dsyr(...) F77_dsyr_base(__VA_ARGS__, 1) + #define F77_dspr(...) F77_dspr_base(__VA_ARGS__, 1) + #define F77_dspr2(...) F77_dspr2_base(__VA_ARGS__, 1) + #define F77_dsyr2(...) F77_dsyr2_base(__VA_ARGS__, 1) /* Single Complex Precision */ - #define F77_cgemv(...) F77_cgemv_base(__VA_ARGS__, 1) - #define F77_cgbmv(...) F77_cgbmv_base(__VA_ARGS__, 1) - #define F77_chemv(...) F77_chemv_base(__VA_ARGS__, 1) - #define F77_chbmv(...) F77_chbmv_base(__VA_ARGS__, 1) - #define F77_chpmv(...) F77_chpmv_base(__VA_ARGS__, 1) - #define F77_ctrmv(...) F77_ctrmv_base(__VA_ARGS__, 1, 1, 1) - #define F77_ctbmv(...) F77_ctbmv_base(__VA_ARGS__, 1, 1, 1) - #define F77_ctpmv(...) F77_ctpmv_base(__VA_ARGS__, 1, 1, 1) - #define F77_ctrsv(...) F77_ctrsv_base(__VA_ARGS__, 1, 1, 1) - #define F77_ctbsv(...) F77_ctbsv_base(__VA_ARGS__, 1, 1, 1) - #define F77_ctpsv(...) F77_ctpsv_base(__VA_ARGS__, 1, 1, 1) - #define F77_cher(...) F77_cher_base(__VA_ARGS__, 1) - #define F77_cher2(...) F77_cher2_base(__VA_ARGS__, 1) - #define F77_chpr(...) F77_chpr_base(__VA_ARGS__, 1) - #define F77_chpr2(...) F77_chpr2_base(__VA_ARGS__, 1) + #define F77_cgemv(...) F77_cgemv_base(__VA_ARGS__, 1) + #define F77_cgbmv(...) F77_cgbmv_base(__VA_ARGS__, 1) + #define F77_chemv(...) F77_chemv_base(__VA_ARGS__, 1) + #define F77_chbmv(...) F77_chbmv_base(__VA_ARGS__, 1) + #define F77_chpmv(...) F77_chpmv_base(__VA_ARGS__, 1) + #define F77_ctrmv(...) F77_ctrmv_base(__VA_ARGS__, 1, 1, 1) + #define F77_ctbmv(...) F77_ctbmv_base(__VA_ARGS__, 1, 1, 1) + #define F77_ctpmv(...) F77_ctpmv_base(__VA_ARGS__, 1, 1, 1) + #define F77_ctrsv(...) F77_ctrsv_base(__VA_ARGS__, 1, 1, 1) + #define F77_ctbsv(...) F77_ctbsv_base(__VA_ARGS__, 1, 1, 1) + #define F77_ctpsv(...) F77_ctpsv_base(__VA_ARGS__, 1, 1, 1) + #define F77_cher(...) F77_cher_base(__VA_ARGS__, 1) + #define F77_cher2(...) F77_cher2_base(__VA_ARGS__, 1) + #define F77_chpr(...) F77_chpr_base(__VA_ARGS__, 1) + #define F77_chpr2(...) F77_chpr2_base(__VA_ARGS__, 1) /* Double Complex Precision */ - #define F77_zgemv(...) F77_zgemv_base(__VA_ARGS__, 1) - #define F77_zgbmv(...) F77_zgbmv_base(__VA_ARGS__, 1) - #define F77_zhemv(...) F77_zhemv_base(__VA_ARGS__, 1) - #define F77_zhbmv(...) F77_zhbmv_base(__VA_ARGS__, 1) - #define F77_zhpmv(...) F77_zhpmv_base(__VA_ARGS__, 1) - #define F77_ztrmv(...) F77_ztrmv_base(__VA_ARGS__, 1, 1, 1) - #define F77_ztbmv(...) F77_ztbmv_base(__VA_ARGS__, 1, 1, 1) - #define F77_ztpmv(...) F77_ztpmv_base(__VA_ARGS__, 1, 1, 1) - #define F77_ztrsv(...) F77_ztrsv_base(__VA_ARGS__, 1, 1, 1) - #define F77_ztbsv(...) F77_ztbsv_base(__VA_ARGS__, 1, 1, 1) - #define F77_ztpsv(...) F77_ztpsv_base(__VA_ARGS__, 1, 1, 1) - #define F77_zher(...) F77_zher_base(__VA_ARGS__, 1) - #define F77_zher2(...) F77_zher2_base(__VA_ARGS__, 1) - #define F77_zhpr(...) F77_zhpr_base(__VA_ARGS__, 1) - #define F77_zhpr2(...) F77_zhpr2_base(__VA_ARGS__, 1) + #define F77_zgemv(...) F77_zgemv_base(__VA_ARGS__, 1) + #define F77_zgbmv(...) F77_zgbmv_base(__VA_ARGS__, 1) + #define F77_zhemv(...) F77_zhemv_base(__VA_ARGS__, 1) + #define F77_zhbmv(...) F77_zhbmv_base(__VA_ARGS__, 1) + #define F77_zhpmv(...) F77_zhpmv_base(__VA_ARGS__, 1) + #define F77_ztrmv(...) F77_ztrmv_base(__VA_ARGS__, 1, 1, 1) + #define F77_ztbmv(...) F77_ztbmv_base(__VA_ARGS__, 1, 1, 1) + #define F77_ztpmv(...) F77_ztpmv_base(__VA_ARGS__, 1, 1, 1) + #define F77_ztrsv(...) F77_ztrsv_base(__VA_ARGS__, 1, 1, 1) + #define F77_ztbsv(...) F77_ztbsv_base(__VA_ARGS__, 1, 1, 1) + #define F77_ztpsv(...) F77_ztpsv_base(__VA_ARGS__, 1, 1, 1) + #define F77_zher(...) F77_zher_base(__VA_ARGS__, 1) + #define F77_zher2(...) F77_zher2_base(__VA_ARGS__, 1) + #define F77_zhpr(...) F77_zhpr_base(__VA_ARGS__, 1) + #define F77_zhpr2(...) F77_zhpr2_base(__VA_ARGS__, 1) /* * Level 3 Fortran variadic definitions with BLAS_FORTRAN_STRLEN_END @@ -353,123 +400,127 @@ /* Single Precision */ - #define F77_sgemm(...) F77_sgemm_base(__VA_ARGS__, 1, 1) - #define F77_ssymm(...) F77_ssymm_base(__VA_ARGS__, 1, 1) - #define F77_ssyrk(...) F77_ssyrk_base(__VA_ARGS__, 1, 1) - #define F77_ssyr2k(...) F77_ssyr2k_base(__VA_ARGS__, 1, 1) - #define F77_strmm(...) F77_strmm_base(__VA_ARGS__, 1, 1, 1, 1) - #define F77_strsm(...) F77_strsm_base(__VA_ARGS__, 1, 1, 1, 1) + #define F77_sgemm(...) F77_sgemm_base(__VA_ARGS__, 1, 1) + #define F77_sgemmtr(...) F77_sgemmtr_base(__VA_ARGS__, 1, 1, 1) + #define F77_ssymm(...) F77_ssymm_base(__VA_ARGS__, 1, 1) + #define F77_ssyrk(...) F77_ssyrk_base(__VA_ARGS__, 1, 1) + #define F77_ssyr2k(...) F77_ssyr2k_base(__VA_ARGS__, 1, 1) + #define F77_strmm(...) F77_strmm_base(__VA_ARGS__, 1, 1, 1, 1) + #define F77_strsm(...) F77_strsm_base(__VA_ARGS__, 1, 1, 1, 1) /* Double Precision */ - #define F77_dgemm(...) F77_dgemm_base(__VA_ARGS__, 1, 1) - #define F77_dsymm(...) F77_dsymm_base(__VA_ARGS__, 1, 1) - #define F77_dsyrk(...) F77_dsyrk_base(__VA_ARGS__, 1, 1) - #define F77_dsyr2k(...) F77_dsyr2k_base(__VA_ARGS__, 1, 1) - #define F77_dtrmm(...) F77_dtrmm_base(__VA_ARGS__, 1, 1, 1, 1) - #define F77_dtrsm(...) F77_dtrsm_base(__VA_ARGS__, 1, 1, 1, 1) + #define F77_dgemm(...) F77_dgemm_base(__VA_ARGS__, 1, 1) + #define F77_dgemmtr(...) F77_dgemmtr_base(__VA_ARGS__, 1, 1, 1) + #define F77_dsymm(...) F77_dsymm_base(__VA_ARGS__, 1, 1) + #define F77_dsyrk(...) F77_dsyrk_base(__VA_ARGS__, 1, 1) + #define F77_dsyr2k(...) F77_dsyr2k_base(__VA_ARGS__, 1, 1) + #define F77_dtrmm(...) F77_dtrmm_base(__VA_ARGS__, 1, 1, 1, 1) + #define F77_dtrsm(...) F77_dtrsm_base(__VA_ARGS__, 1, 1, 1, 1) /* Single Complex Precision */ - #define F77_cgemm(...) F77_cgemm_base(__VA_ARGS__, 1, 1) - #define F77_csymm(...) F77_csymm_base(__VA_ARGS__, 1, 1) - #define F77_chemm(...) F77_chemm_base(__VA_ARGS__, 1, 1) - #define F77_csyrk(...) F77_csyrk_base(__VA_ARGS__, 1, 1) - #define F77_cherk(...) F77_cherk_base(__VA_ARGS__, 1, 1) - #define F77_csyr2k(...) F77_csyr2k_base(__VA_ARGS__, 1, 1) - #define F77_cher2k(...) F77_cher2k_base(__VA_ARGS__, 1, 1) - #define F77_ctrmm(...) F77_ctrmm_base(__VA_ARGS__, 1, 1, 1, 1) - #define F77_ctrsm(...) F77_ctrsm_base(__VA_ARGS__, 1, 1, 1, 1) + #define F77_cgemm(...) F77_cgemm_base(__VA_ARGS__, 1, 1) + #define F77_cgemmtr(...) F77_cgemmtr_base(__VA_ARGS__, 1, 1, 1) + #define F77_csymm(...) F77_csymm_base(__VA_ARGS__, 1, 1) + #define F77_chemm(...) F77_chemm_base(__VA_ARGS__, 1, 1) + #define F77_csyrk(...) F77_csyrk_base(__VA_ARGS__, 1, 1) + #define F77_cherk(...) F77_cherk_base(__VA_ARGS__, 1, 1) + #define F77_csyr2k(...) F77_csyr2k_base(__VA_ARGS__, 1, 1) + #define F77_cher2k(...) F77_cher2k_base(__VA_ARGS__, 1, 1) + #define F77_ctrmm(...) F77_ctrmm_base(__VA_ARGS__, 1, 1, 1, 1) + #define F77_ctrsm(...) F77_ctrsm_base(__VA_ARGS__, 1, 1, 1, 1) /* Double Complex Precision */ - #define F77_zgemm(...) F77_zgemm_base(__VA_ARGS__, 1, 1) - #define F77_zsymm(...) F77_zsymm_base(__VA_ARGS__, 1, 1) - #define F77_zhemm(...) F77_zhemm_base(__VA_ARGS__, 1, 1) - #define F77_zsyrk(...) F77_zsyrk_base(__VA_ARGS__, 1, 1) - #define F77_zherk(...) F77_zherk_base(__VA_ARGS__, 1, 1) - #define F77_zsyr2k(...) F77_zsyr2k_base(__VA_ARGS__, 1, 1) - #define F77_zher2k(...) F77_zher2k_base(__VA_ARGS__, 1, 1) - #define F77_ztrmm(...) F77_ztrmm_base(__VA_ARGS__, 1, 1, 1, 1) - #define F77_ztrsm(...) F77_ztrsm_base(__VA_ARGS__, 1, 1, 1, 1) + #define F77_zgemm(...) F77_zgemm_base(__VA_ARGS__, 1, 1) + #define F77_zgemmtr(...) F77_zgemmtr_base(__VA_ARGS__, 1, 1, 1) + #define F77_zsymm(...) F77_zsymm_base(__VA_ARGS__, 1, 1) + #define F77_zhemm(...) F77_zhemm_base(__VA_ARGS__, 1, 1) + #define F77_zsyrk(...) F77_zsyrk_base(__VA_ARGS__, 1, 1) + #define F77_zherk(...) F77_zherk_base(__VA_ARGS__, 1, 1) + #define F77_zsyr2k(...) F77_zsyr2k_base(__VA_ARGS__, 1, 1) + #define F77_zher2k(...) F77_zher2k_base(__VA_ARGS__, 1, 1) + #define F77_ztrmm(...) F77_ztrmm_base(__VA_ARGS__, 1, 1, 1, 1) + #define F77_ztrsm(...) F77_ztrsm_base(__VA_ARGS__, 1, 1, 1, 1) #else - + /* * Level 2 Fortran variadic definitions without BLAS_FORTRAN_STRLEN_END */ /* Single Precision */ - #define F77_sgemv(...) F77_sgemv_base(__VA_ARGS__) - #define F77_sgbmv(...) F77_sgbmv_base(__VA_ARGS__) - #define F77_ssymv(...) F77_ssymv_base(__VA_ARGS__) - #define F77_ssbmv(...) F77_ssbmv_base(__VA_ARGS__) - #define F77_sspmv(...) F77_sspmv_base(__VA_ARGS__) - #define F77_strmv(...) F77_strmv_base(__VA_ARGS__) - #define F77_stbmv(...) F77_stbmv_base(__VA_ARGS__) - #define F77_strsv(...) F77_strsv_base(__VA_ARGS__) - #define F77_stbsv(...) F77_stbsv_base(__VA_ARGS__) - #define F77_stpmv(...) F77_stpmv_base(__VA_ARGS__) - #define F77_stpsv(...) F77_stpsv_base(__VA_ARGS__) - #define F77_ssyr(...) F77_ssyr_base(__VA_ARGS__) - #define F77_sspr(...) F77_sspr_base(__VA_ARGS__) - #define F77_sspr2(...) F77_sspr2_base(__VA_ARGS__) - #define F77_ssyr2(...) F77_ssyr2_base(__VA_ARGS__) + #define F77_sgemv(...) F77_sgemv_base(__VA_ARGS__) + #define F77_sgbmv(...) F77_sgbmv_base(__VA_ARGS__) + #define F77_ssymv(...) F77_ssymv_base(__VA_ARGS__) + #define F77_ssbmv(...) F77_ssbmv_base(__VA_ARGS__) + #define F77_sspmv(...) F77_sspmv_base(__VA_ARGS__) + #define F77_strmv(...) F77_strmv_base(__VA_ARGS__) + #define F77_stbmv(...) F77_stbmv_base(__VA_ARGS__) + #define F77_strsv(...) F77_strsv_base(__VA_ARGS__) + #define F77_stbsv(...) F77_stbsv_base(__VA_ARGS__) + #define F77_stpmv(...) F77_stpmv_base(__VA_ARGS__) + #define F77_stpsv(...) F77_stpsv_base(__VA_ARGS__) + #define F77_ssyr(...) F77_ssyr_base(__VA_ARGS__) + #define F77_sspr(...) F77_sspr_base(__VA_ARGS__) + #define F77_sspr2(...) F77_sspr2_base(__VA_ARGS__) + #define F77_ssyr2(...) F77_ssyr2_base(__VA_ARGS__) /* Double Precision */ - #define F77_dgemv(...) F77_dgemv_base(__VA_ARGS__) - #define F77_dgbmv(...) F77_dgbmv_base(__VA_ARGS__) - #define F77_dsymv(...) F77_dsymv_base(__VA_ARGS__) - #define F77_dsbmv(...) F77_dsbmv_base(__VA_ARGS__) - #define F77_dspmv(...) F77_dspmv_base(__VA_ARGS__) - #define F77_dtrmv(...) F77_dtrmv_base(__VA_ARGS__) - #define F77_dtbmv(...) F77_dtbmv_base(__VA_ARGS__) - #define F77_dtrsv(...) F77_dtrsv_base(__VA_ARGS__) - #define F77_dtbsv(...) F77_dtbsv_base(__VA_ARGS__) - #define F77_dtpmv(...) F77_dtpmv_base(__VA_ARGS__) - #define F77_dtpsv(...) F77_dtpsv_base(__VA_ARGS__) - #define F77_dsyr(...) F77_dsyr_base(__VA_ARGS__) - #define F77_dspr(...) F77_dspr_base(__VA_ARGS__) - #define F77_dspr2(...) F77_dspr2_base(__VA_ARGS__) - #define F77_dsyr2(...) F77_dsyr2_base(__VA_ARGS__) + #define F77_dgemv(...) F77_dgemv_base(__VA_ARGS__) + #define F77_dgbmv(...) F77_dgbmv_base(__VA_ARGS__) + #define F77_dsymv(...) F77_dsymv_base(__VA_ARGS__) + #define F77_dsbmv(...) F77_dsbmv_base(__VA_ARGS__) + #define F77_dspmv(...) F77_dspmv_base(__VA_ARGS__) + #define F77_dtrmv(...) F77_dtrmv_base(__VA_ARGS__) + #define F77_dtbmv(...) F77_dtbmv_base(__VA_ARGS__) + #define F77_dtrsv(...) F77_dtrsv_base(__VA_ARGS__) + #define F77_dtbsv(...) F77_dtbsv_base(__VA_ARGS__) + #define F77_dtpmv(...) F77_dtpmv_base(__VA_ARGS__) + #define F77_dtpsv(...) F77_dtpsv_base(__VA_ARGS__) + #define F77_dsyr(...) F77_dsyr_base(__VA_ARGS__) + #define F77_dspr(...) F77_dspr_base(__VA_ARGS__) + #define F77_dspr2(...) F77_dspr2_base(__VA_ARGS__) + #define F77_dsyr2(...) F77_dsyr2_base(__VA_ARGS__) /* Single Complex Precision */ - #define F77_cgemv(...) F77_cgemv_base(__VA_ARGS__) - #define F77_cgbmv(...) F77_cgbmv_base(__VA_ARGS__) - #define F77_chemv(...) F77_chemv_base(__VA_ARGS__) - #define F77_chbmv(...) F77_chbmv_base(__VA_ARGS__) - #define F77_chpmv(...) F77_chpmv_base(__VA_ARGS__) - #define F77_ctrmv(...) F77_ctrmv_base(__VA_ARGS__) - #define F77_ctbmv(...) F77_ctbmv_base(__VA_ARGS__) - #define F77_ctpmv(...) F77_ctpmv_base(__VA_ARGS__) - #define F77_ctrsv(...) F77_ctrsv_base(__VA_ARGS__) - #define F77_ctbsv(...) F77_ctbsv_base(__VA_ARGS__) - #define F77_ctpsv(...) F77_ctpsv_base(__VA_ARGS__) - #define F77_cher(...) F77_cher_base(__VA_ARGS__) - #define F77_cher2(...) F77_cher2_base(__VA_ARGS__) - #define F77_chpr(...) F77_chpr_base(__VA_ARGS__) - #define F77_chpr2(...) F77_chpr2_base(__VA_ARGS__) + #define F77_cgemv(...) F77_cgemv_base(__VA_ARGS__) + #define F77_cgbmv(...) F77_cgbmv_base(__VA_ARGS__) + #define F77_chemv(...) F77_chemv_base(__VA_ARGS__) + #define F77_chbmv(...) F77_chbmv_base(__VA_ARGS__) + #define F77_chpmv(...) F77_chpmv_base(__VA_ARGS__) + #define F77_ctrmv(...) F77_ctrmv_base(__VA_ARGS__) + #define F77_ctbmv(...) F77_ctbmv_base(__VA_ARGS__) + #define F77_ctpmv(...) F77_ctpmv_base(__VA_ARGS__) + #define F77_ctrsv(...) F77_ctrsv_base(__VA_ARGS__) + #define F77_ctbsv(...) F77_ctbsv_base(__VA_ARGS__) + #define F77_ctpsv(...) F77_ctpsv_base(__VA_ARGS__) + #define F77_cher(...) F77_cher_base(__VA_ARGS__) + #define F77_cher2(...) F77_cher2_base(__VA_ARGS__) + #define F77_chpr(...) F77_chpr_base(__VA_ARGS__) + #define F77_chpr2(...) F77_chpr2_base(__VA_ARGS__) /* Double Complex Precision */ - #define F77_zgemv(...) F77_zgemv_base(__VA_ARGS__) - #define F77_zgbmv(...) F77_zgbmv_base(__VA_ARGS__) - #define F77_zhemv(...) F77_zhemv_base(__VA_ARGS__) - #define F77_zhbmv(...) F77_zhbmv_base(__VA_ARGS__) - #define F77_zhpmv(...) F77_zhpmv_base(__VA_ARGS__) - #define F77_ztrmv(...) F77_ztrmv_base(__VA_ARGS__) - #define F77_ztbmv(...) F77_ztbmv_base(__VA_ARGS__) - #define F77_ztpmv(...) F77_ztpmv_base(__VA_ARGS__) - #define F77_ztrsv(...) F77_ztrsv_base(__VA_ARGS__) - #define F77_ztbsv(...) F77_ztbsv_base(__VA_ARGS__) - #define F77_ztpsv(...) F77_ztpsv_base(__VA_ARGS__) - #define F77_zher(...) F77_zher_base(__VA_ARGS__) - #define F77_zher2(...) F77_zher2_base(__VA_ARGS__) - #define F77_zhpr(...) F77_zhpr_base(__VA_ARGS__) - #define F77_zhpr2(...) F77_zhpr2_base(__VA_ARGS__) + #define F77_zgemv(...) F77_zgemv_base(__VA_ARGS__) + #define F77_zgbmv(...) F77_zgbmv_base(__VA_ARGS__) + #define F77_zhemv(...) F77_zhemv_base(__VA_ARGS__) + #define F77_zhbmv(...) F77_zhbmv_base(__VA_ARGS__) + #define F77_zhpmv(...) F77_zhpmv_base(__VA_ARGS__) + #define F77_ztrmv(...) F77_ztrmv_base(__VA_ARGS__) + #define F77_ztbmv(...) F77_ztbmv_base(__VA_ARGS__) + #define F77_ztpmv(...) F77_ztpmv_base(__VA_ARGS__) + #define F77_ztrsv(...) F77_ztrsv_base(__VA_ARGS__) + #define F77_ztbsv(...) F77_ztbsv_base(__VA_ARGS__) + #define F77_ztpsv(...) F77_ztpsv_base(__VA_ARGS__) + #define F77_zher(...) F77_zher_base(__VA_ARGS__) + #define F77_zher2(...) F77_zher2_base(__VA_ARGS__) + #define F77_zhpr(...) F77_zhpr_base(__VA_ARGS__) + #define F77_zhpr2(...) F77_zhpr2_base(__VA_ARGS__) /* * Level 3 Fortran variadic definitions without BLAS_FORTRAN_STRLEN_END @@ -477,45 +528,49 @@ /* Single Precision */ - #define F77_sgemm(...) F77_sgemm_base(__VA_ARGS__) - #define F77_ssymm(...) F77_ssymm_base(__VA_ARGS__) - #define F77_ssyrk(...) F77_ssyrk_base(__VA_ARGS__) - #define F77_ssyr2k(...) F77_ssyr2k_base(__VA_ARGS__) - #define F77_strmm(...) F77_strmm_base(__VA_ARGS__) - #define F77_strsm(...) F77_strsm_base(__VA_ARGS__) + #define F77_sgemm(...) F77_sgemm_base(__VA_ARGS__) + #define F77_sgemmtr(...) F77_sgemmtr_base(__VA_ARGS__) + #define F77_ssymm(...) F77_ssymm_base(__VA_ARGS__) + #define F77_ssyrk(...) F77_ssyrk_base(__VA_ARGS__) + #define F77_ssyr2k(...) F77_ssyr2k_base(__VA_ARGS__) + #define F77_strmm(...) F77_strmm_base(__VA_ARGS__) + #define F77_strsm(...) F77_strsm_base(__VA_ARGS__) /* Double Precision */ - #define F77_dgemm(...) F77_dgemm_base(__VA_ARGS__) - #define F77_dsymm(...) F77_dsymm_base(__VA_ARGS__) - #define F77_dsyrk(...) F77_dsyrk_base(__VA_ARGS__) - #define F77_dsyr2k(...) F77_dsyr2k_base(__VA_ARGS__) - #define F77_dtrmm(...) F77_dtrmm_base(__VA_ARGS__) - #define F77_dtrsm(...) F77_dtrsm_base(__VA_ARGS__) + #define F77_dgemm(...) F77_dgemm_base(__VA_ARGS__) + #define F77_dgemmtr(...) F77_dgemmtr_base(__VA_ARGS__) + #define F77_dsymm(...) F77_dsymm_base(__VA_ARGS__) + #define F77_dsyrk(...) F77_dsyrk_base(__VA_ARGS__) + #define F77_dsyr2k(...) F77_dsyr2k_base(__VA_ARGS__) + #define F77_dtrmm(...) F77_dtrmm_base(__VA_ARGS__) + #define F77_dtrsm(...) F77_dtrsm_base(__VA_ARGS__) /* Single Complex Precision */ - #define F77_cgemm(...) F77_cgemm_base(__VA_ARGS__) - #define F77_csymm(...) F77_csymm_base(__VA_ARGS__) - #define F77_chemm(...) F77_chemm_base(__VA_ARGS__) - #define F77_csyrk(...) F77_csyrk_base(__VA_ARGS__) - #define F77_cherk(...) F77_cherk_base(__VA_ARGS__) - #define F77_csyr2k(...) F77_csyr2k_base(__VA_ARGS__) - #define F77_cher2k(...) F77_cher2k_base(__VA_ARGS__) - #define F77_ctrmm(...) F77_ctrmm_base(__VA_ARGS__) - #define F77_ctrsm(...) F77_ctrsm_base(__VA_ARGS__) + #define F77_cgemm(...) F77_cgemm_base(__VA_ARGS__) + #define F77_cgemmtr(...) F77_cgemmtr_base(__VA_ARGS__) + #define F77_csymm(...) F77_csymm_base(__VA_ARGS__) + #define F77_chemm(...) F77_chemm_base(__VA_ARGS__) + #define F77_csyrk(...) F77_csyrk_base(__VA_ARGS__) + #define F77_cherk(...) F77_cherk_base(__VA_ARGS__) + #define F77_csyr2k(...) F77_csyr2k_base(__VA_ARGS__) + #define F77_cher2k(...) F77_cher2k_base(__VA_ARGS__) + #define F77_ctrmm(...) F77_ctrmm_base(__VA_ARGS__) + #define F77_ctrsm(...) F77_ctrsm_base(__VA_ARGS__) /* Double Complex Precision */ - #define F77_zgemm(...) F77_zgemm_base(__VA_ARGS__) - #define F77_zsymm(...) F77_zsymm_base(__VA_ARGS__) - #define F77_zhemm(...) F77_zhemm_base(__VA_ARGS__) - #define F77_zsyrk(...) F77_zsyrk_base(__VA_ARGS__) - #define F77_zherk(...) F77_zherk_base(__VA_ARGS__) - #define F77_zsyr2k(...) F77_zsyr2k_base(__VA_ARGS__) - #define F77_zher2k(...) F77_zher2k_base(__VA_ARGS__) - #define F77_ztrmm(...) F77_ztrmm_base(__VA_ARGS__) - #define F77_ztrsm(...) F77_ztrsm_base(__VA_ARGS__) + #define F77_zgemm(...) F77_zgemm_base(__VA_ARGS__) + #define F77_zgemmtr(...) F77_zgemmtr_base(__VA_ARGS__) + #define F77_zsymm(...) F77_zsymm_base(__VA_ARGS__) + #define F77_zhemm(...) F77_zhemm_base(__VA_ARGS__) + #define F77_zsyrk(...) F77_zsyrk_base(__VA_ARGS__) + #define F77_zherk(...) F77_zherk_base(__VA_ARGS__) + #define F77_zsyr2k(...) F77_zsyr2k_base(__VA_ARGS__) + #define F77_zher2k(...) F77_zher2k_base(__VA_ARGS__) + #define F77_ztrmm(...) F77_ztrmm_base(__VA_ARGS__) + #define F77_ztrsm(...) F77_ztrsm_base(__VA_ARGS__) #endif @@ -527,76 +582,95 @@ extern "C" { #endif -void F77_xerbla(FCHAR, void *); -void F77_xerbla_base(FCHAR, void * - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t - #endif - ); +#ifdef BLAS_FORTRAN_STRLEN_END + #define F77_xerbla(...) F77_xerbla_base(__VA_ARGS__, 1) +#else + #define F77_xerbla(...) F77_xerbla_base(__VA_ARGS__) +#endif +void +#ifdef HAS_ATTRIBUTE_WEAK_SUPPORT +__attribute__((weak)) +#endif +F77_xerbla_base(FCHAR, void * +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN +#endif +); + /* * Level 1 Fortran Prototypes */ /* Single Precision */ - void F77_srot_base(FINT, float *, FINT, float *, FINT, const float *, const float *); - void F77_srotg_base(float *,float *,float *,float *); - void F77_srotm_base( FINT, float *, FINT, float *, FINT, const float *); - void F77_srotmg_base(float *,float *,float *,const float *, float *); - void F77_sswap_base( FINT, float *, FINT, float *, FINT); - void F77_scopy_base( FINT, const float *, FINT, float *, FINT); - void F77_saxpy_base( FINT, const float *, const float *, FINT, float *, FINT); - void F77_sdot_sub_base(FINT, const float *, FINT, const float *, FINT, float *); - void F77_sdsdot_sub_base( FINT, const float *, const float *, FINT, const float *, FINT, float *); - void F77_sscal_base( FINT, const float *, float *, FINT); - void F77_snrm2_sub_base( FINT, const float *, FINT, float *); - void F77_sasum_sub_base( FINT, const float *, FINT, float *); - void F77_isamax_sub_base( FINT, const float * , FINT, FINT2); +void F77_srot_base(FINT, float *, FINT, float *, FINT, const float *, const float *); +void F77_srotg_base(float *,float *,float *,float *); +void F77_srotm_base(FINT, float *, FINT, float *, FINT, const float *); +void F77_srotmg_base(float *,float *,float *,const float *, float *); +void F77_sswap_base(FINT, float *, FINT, float *, FINT); +void F77_scopy_base(FINT, const float *, FINT, float *, FINT); +void F77_saxpy_base(FINT, const float *, const float *, FINT, float *, FINT); +void F77_saxpby_base(FINT, const float *, const float *, FINT, const float *, float *, FINT); +void F77_sdot_sub_base(FINT, const float *, FINT, const float *, FINT, float *); +void F77_sdsdot_sub_base(FINT, const float *, const float *, FINT, const float *, FINT, float *); +void F77_sscal_base(FINT, const float *, float *, FINT); +void F77_snrm2_sub_base(FINT, const float *, FINT, float *); +void F77_sasum_sub_base(FINT, const float *, FINT, float *); +void F77_isamax_sub_base(FINT, const float * , FINT, FINT2); /* Double Precision */ - void F77_drot_base(FINT, double *, FINT, double *, FINT, const double *, const double *); - void F77_drotg_base(double *,double *,double *,double *); - void F77_drotm_base( FINT, double *, FINT, double *, FINT, const double *); - void F77_drotmg_base(double *,double *,double *,const double *, double *); - void F77_dswap_base( FINT, double *, FINT, double *, FINT); - void F77_dcopy_base( FINT, const double *, FINT, double *, FINT); - void F77_daxpy_base( FINT, const double *, const double *, FINT, double *, FINT); - void F77_dswap_base( FINT, double *, FINT, double *, FINT); - void F77_dsdot_sub_base(FINT, const float *, FINT, const float *, FINT, double *); - void F77_ddot_sub_base( FINT, const double *, FINT, const double *, FINT, double *); - void F77_dscal_base( FINT, const double *, double *, FINT); - void F77_dnrm2_sub_base( FINT, const double *, FINT, double *); - void F77_dasum_sub_base( FINT, const double *, FINT, double *); - void F77_idamax_sub_base( FINT, const double * , FINT, FINT2); +void F77_drot_base(FINT, double *, FINT, double *, FINT, const double *, const double *); +void F77_drotg_base(double *,double *,double *,double *); +void F77_drotm_base(FINT, double *, FINT, double *, FINT, const double *); +void F77_drotmg_base(double *,double *,double *,const double *, double *); +void F77_dswap_base(FINT, double *, FINT, double *, FINT); +void F77_dcopy_base(FINT, const double *, FINT, double *, FINT); +void F77_daxpy_base(FINT, const double *, const double *, FINT, double *, FINT); +void F77_daxpby_base(FINT, const double *, const double *, FINT, const double *, double *, FINT); +void F77_dswap_base(FINT, double *, FINT, double *, FINT); +void F77_dsdot_sub_base(FINT, const float *, FINT, const float *, FINT, double *); +void F77_ddot_sub_base(FINT, const double *, FINT, const double *, FINT, double *); +void F77_dscal_base(FINT, const double *, double *, FINT); +void F77_dnrm2_sub_base(FINT, const double *, FINT, double *); +void F77_dasum_sub_base(FINT, const double *, FINT, double *); +void F77_idamax_sub_base(FINT, const double * , FINT, FINT2); /* Single Complex Precision */ - void F77_cswap_base( FINT, void *, FINT, void *, FINT); - void F77_ccopy_base( FINT, const void *, FINT, void *, FINT); - void F77_caxpy_base( FINT, const void *, const void *, FINT, void *, FINT); - void F77_cswap_base( FINT, void *, FINT, void *, FINT); - void F77_cdotc_sub_base( FINT, const void *, FINT, const void *, FINT, void *); - void F77_cdotu_sub_base( FINT, const void *, FINT, const void *, FINT, void *); - void F77_cscal_base( FINT, const void *, void *, FINT); - void F77_icamax_sub_base( FINT, const void *, FINT, FINT2); - void F77_csscal_base( FINT, const float *, void *, FINT); - void F77_scnrm2_sub_base( FINT, const void *, FINT, float *); - void F77_scasum_sub_base( FINT, const void *, FINT, float *); +void F77_crotg_base(void *, void *, float *, void *); +void F77_csrot_base(FINT, void *X, FINT, void *, FINT, const float *, const float *); +void F77_cswap_base(FINT, void *, FINT, void *, FINT); +void F77_ccopy_base(FINT, const void *, FINT, void *, FINT); +void F77_caxpy_base(FINT, const void *, const void *, FINT, void *, FINT); +void F77_caxpby_base(FINT, const void *, const void *, FINT, const void *, void *, FINT); +void F77_cswap_base(FINT, void *, FINT, void *, FINT); +void F77_cdotc_sub_base(FINT, const void *, FINT, const void *, FINT, void *); +void F77_cdotu_sub_base(FINT, const void *, FINT, const void *, FINT, void *); +void F77_cscal_base(FINT, const void *, void *, FINT); +void F77_icamax_sub_base(FINT, const void *, FINT, FINT2); +void F77_csscal_base(FINT, const float *, void *, FINT); +void F77_scnrm2_sub_base(FINT, const void *, FINT, float *); +void F77_scasum_sub_base(FINT, const void *, FINT, float *); +void F77_scabs1_sub_base(const void *, float *); /* Double Complex Precision */ - void F77_zswap_base( FINT, void *, FINT, void *, FINT); - void F77_zcopy_base( FINT, const void *, FINT, void *, FINT); - void F77_zaxpy_base( FINT, const void *, const void *, FINT, void *, FINT); - void F77_zswap_base( FINT, void *, FINT, void *, FINT); - void F77_zdotc_sub_base( FINT, const void *, FINT, const void *, FINT, void *); - void F77_zdotu_sub_base( FINT, const void *, FINT, const void *, FINT, void *); - void F77_zdscal_base( FINT, const double *, void *, FINT); - void F77_zscal_base( FINT, const void *, void *, FINT); - void F77_dznrm2_sub_base( FINT, const void *, FINT, double *); - void F77_dzasum_sub_base( FINT, const void *, FINT, double *); - void F77_izamax_sub_base( FINT, const void *, FINT, FINT2); +void F77_zrotg_base(void *, void *, double *, void *); +void F77_zdrot_base(FINT, void *X, FINT, void *, FINT, const double *, const double *); +void F77_zswap_base(FINT, void *, FINT, void *, FINT); +void F77_zcopy_base(FINT, const void *, FINT, void *, FINT); +void F77_zaxpy_base(FINT, const void *, const void *, FINT, void *, FINT); +void F77_zaxpby_base(FINT, const void *, const void *, FINT, const void*, void *, FINT); +void F77_zswap_base(FINT, void *, FINT, void *, FINT); +void F77_zdotc_sub_base(FINT, const void *, FINT, const void *, FINT, void *); +void F77_zdotu_sub_base(FINT, const void *, FINT, const void *, FINT, void *); +void F77_zdscal_base(FINT, const double *, void *, FINT); +void F77_zscal_base(FINT, const void *, void *, FINT); +void F77_dznrm2_sub_base(FINT, const void *, FINT, double *); +void F77_dzasum_sub_base(FINT, const void *, FINT, double *); +void F77_izamax_sub_base(FINT, const void *, FINT, FINT2); +void F77_dcabs1_sub_base(const void *, double *); /* * Level 2 Fortran Prototypes @@ -604,321 +678,321 @@ void F77_xerbla_base(FCHAR, void * /* Single Precision */ - void F77_sgemv_base(FCHAR, FINT, FINT, const float *, const float *, FINT, const float *, FINT, const float *, float *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t - #endif - ); - void F77_sgbmv_base(FCHAR, FINT, FINT, FINT, FINT, const float *, const float *, FINT, const float *, FINT, const float *, float *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t - #endif - ); - void F77_ssymv_base(FCHAR, FINT, const float *, const float *, FINT, const float *, FINT, const float *, float *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t - #endif - ); - void F77_ssbmv_base(FCHAR, FINT, FINT, const float *, const float *, FINT, const float *, FINT, const float *, float *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t - #endif - ); - void F77_sspmv_base(FCHAR, FINT, const float *, const float *, const float *, FINT, const float *, float *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t - #endif - ); - void F77_strmv_base(FCHAR, FCHAR, FCHAR, FINT, const float *, FINT, float *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t, size_t - #endif - ); - void F77_stbmv_base(FCHAR, FCHAR, FCHAR, FINT, FINT, const float *, FINT, float *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t, size_t - #endif - ); - void F77_strsv_base(FCHAR, FCHAR, FCHAR, FINT, const float *, FINT, float *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t, size_t - #endif - ); - void F77_stbsv_base(FCHAR, FCHAR, FCHAR, FINT, FINT, const float *, FINT, float *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t, size_t - #endif - ); - void F77_stpmv_base(FCHAR, FCHAR, FCHAR, FINT, const float *, float *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t, size_t - #endif - ); - void F77_stpsv_base(FCHAR, FCHAR, FCHAR, FINT, const float *, float *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t, size_t - #endif - ); - void F77_sger_base( FINT, FINT, const float *, const float *, FINT, const float *, FINT, float *, FINT); - void F77_ssyr_base(FCHAR, FINT, const float *, const float *, FINT, float *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t - #endif - ); - void F77_sspr_base(FCHAR, FINT, const float *, const float *, FINT, float * - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t - #endif - ); - void F77_sspr2_base(FCHAR, FINT, const float *, const float *, FINT, const float *, FINT, float * - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t - #endif - ); - void F77_ssyr2_base(FCHAR, FINT, const float *, const float *, FINT, const float *, FINT, float *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t - #endif - ); +void F77_sgemv_base(FCHAR, FINT, FINT, const float *, const float *, FINT, const float *, FINT, const float *, float *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN +#endif +); +void F77_sgbmv_base(FCHAR, FINT, FINT, FINT, FINT, const float *, const float *, FINT, const float *, FINT, const float *, float *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN +#endif +); +void F77_ssymv_base(FCHAR, FINT, const float *, const float *, FINT, const float *, FINT, const float *, float *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN +#endif +); +void F77_ssbmv_base(FCHAR, FINT, FINT, const float *, const float *, FINT, const float *, FINT, const float *, float *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN +#endif +); +void F77_sspmv_base(FCHAR, FINT, const float *, const float *, const float *, FINT, const float *, float *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN +#endif +); +void F77_strmv_base(FCHAR, FCHAR, FCHAR, FINT, const float *, FINT, float *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_stbmv_base(FCHAR, FCHAR, FCHAR, FINT, FINT, const float *, FINT, float *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_strsv_base(FCHAR, FCHAR, FCHAR, FINT, const float *, FINT, float *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_stbsv_base(FCHAR, FCHAR, FCHAR, FINT, FINT, const float *, FINT, float *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_stpmv_base(FCHAR, FCHAR, FCHAR, FINT, const float *, float *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_stpsv_base(FCHAR, FCHAR, FCHAR, FINT, const float *, float *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_sger_base(FINT, FINT, const float *, const float *, FINT, const float *, FINT, float *, FINT); +void F77_ssyr_base(FCHAR, FINT, const float *, const float *, FINT, float *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN +#endif +); +void F77_sspr_base(FCHAR, FINT, const float *, const float *, FINT, float * +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN +#endif +); +void F77_sspr2_base(FCHAR, FINT, const float *, const float *, FINT, const float *, FINT, float * +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN +#endif +); +void F77_ssyr2_base(FCHAR, FINT, const float *, const float *, FINT, const float *, FINT, float *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN +#endif +); /* Double Precision */ - void F77_dgemv_base(FCHAR, FINT, FINT, const double *, const double *, FINT, const double *, FINT, const double *, double *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t - #endif - ); - void F77_dgbmv_base(FCHAR, FINT, FINT, FINT, FINT, const double *, const double *, FINT, const double *, FINT, const double *, double *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t - #endif - ); - void F77_dsymv_base(FCHAR, FINT, const double *, const double *, FINT, const double *, FINT, const double *, double *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t - #endif - ); - void F77_dsbmv_base(FCHAR, FINT, FINT, const double *, const double *, FINT, const double *, FINT, const double *, double *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t - #endif - ); - void F77_dspmv_base(FCHAR, FINT, const double *, const double *, const double *, FINT, const double *, double *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t - #endif - ); - void F77_dtrmv_base(FCHAR, FCHAR, FCHAR, FINT, const double *, FINT, double *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t, size_t - #endif - ); - void F77_dtbmv_base(FCHAR, FCHAR, FCHAR, FINT, FINT, const double *, FINT, double *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t, size_t - #endif - ); - void F77_dtrsv_base(FCHAR, FCHAR, FCHAR, FINT, const double *, FINT, double *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t, size_t - #endif - ); - void F77_dtbsv_base(FCHAR, FCHAR, FCHAR, FINT, FINT, const double *, FINT, double *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t, size_t - #endif - ); - void F77_dtpmv_base(FCHAR, FCHAR, FCHAR, FINT, const double *, double *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t, size_t - #endif - ); - void F77_dtpsv_base(FCHAR, FCHAR, FCHAR, FINT, const double *, double *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t, size_t - #endif - ); - void F77_dger_base( FINT, FINT, const double *, const double *, FINT, const double *, FINT, double *, FINT); - void F77_dsyr_base(FCHAR, FINT, const double *, const double *, FINT, double *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t - #endif - ); - void F77_dspr_base(FCHAR, FINT, const double *, const double *, FINT, double * - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t - #endif - ); - void F77_dspr2_base(FCHAR, FINT, const double *, const double *, FINT, const double *, FINT, double * - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t - #endif - ); - void F77_dsyr2_base(FCHAR, FINT, const double *, const double *, FINT, const double *, FINT, double *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t - #endif - ); +void F77_dgemv_base(FCHAR, FINT, FINT, const double *, const double *, FINT, const double *, FINT, const double *, double *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN +#endif +); +void F77_dgbmv_base(FCHAR, FINT, FINT, FINT, FINT, const double *, const double *, FINT, const double *, FINT, const double *, double *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN +#endif +); +void F77_dsymv_base(FCHAR, FINT, const double *, const double *, FINT, const double *, FINT, const double *, double *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN +#endif +); +void F77_dsbmv_base(FCHAR, FINT, FINT, const double *, const double *, FINT, const double *, FINT, const double *, double *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN +#endif +); +void F77_dspmv_base(FCHAR, FINT, const double *, const double *, const double *, FINT, const double *, double *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN +#endif +); +void F77_dtrmv_base(FCHAR, FCHAR, FCHAR, FINT, const double *, FINT, double *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_dtbmv_base(FCHAR, FCHAR, FCHAR, FINT, FINT, const double *, FINT, double *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_dtrsv_base(FCHAR, FCHAR, FCHAR, FINT, const double *, FINT, double *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_dtbsv_base(FCHAR, FCHAR, FCHAR, FINT, FINT, const double *, FINT, double *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_dtpmv_base(FCHAR, FCHAR, FCHAR, FINT, const double *, double *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_dtpsv_base(FCHAR, FCHAR, FCHAR, FINT, const double *, double *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_dger_base(FINT, FINT, const double *, const double *, FINT, const double *, FINT, double *, FINT); +void F77_dsyr_base(FCHAR, FINT, const double *, const double *, FINT, double *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN +#endif +); +void F77_dspr_base(FCHAR, FINT, const double *, const double *, FINT, double * +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN +#endif +); +void F77_dspr2_base(FCHAR, FINT, const double *, const double *, FINT, const double *, FINT, double * +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN +#endif +); +void F77_dsyr2_base(FCHAR, FINT, const double *, const double *, FINT, const double *, FINT, double *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN +#endif +); /* Single Complex Precision */ - void F77_cgemv_base(FCHAR, FINT, FINT, const void *, const void *, FINT, const void *, FINT, const void *, void *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t - #endif - ); - void F77_cgbmv_base(FCHAR, FINT, FINT, FINT, FINT, const void *, const void *, FINT, const void *, FINT, const void *, void *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t - #endif - ); - void F77_chemv_base(FCHAR, FINT, const void *, const void *, FINT, const void *, FINT, const void *, void *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t - #endif - ); - void F77_chbmv_base(FCHAR, FINT, FINT, const void *, const void *, FINT, const void *, FINT, const void *, void *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t - #endif - ); - void F77_chpmv_base(FCHAR, FINT, const void *, const void *, const void *, FINT, const void *, void *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t - #endif - ); - void F77_ctrmv_base(FCHAR, FCHAR, FCHAR, FINT, const void *, FINT, void *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t, size_t - #endif - ); - void F77_ctbmv_base(FCHAR, FCHAR, FCHAR, FINT, FINT, const void *, FINT, void *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t, size_t - #endif - ); - void F77_ctpmv_base(FCHAR, FCHAR, FCHAR, FINT, const void *, void *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t, size_t - #endif - ); - void F77_ctrsv_base(FCHAR, FCHAR, FCHAR, FINT, const void *, FINT, void *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t, size_t - #endif - ); - void F77_ctbsv_base(FCHAR, FCHAR, FCHAR, FINT, FINT, const void *, FINT, void *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t, size_t - #endif - ); - void F77_ctpsv_base(FCHAR, FCHAR, FCHAR, FINT, const void *, void *,FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t, size_t - #endif - ); - void F77_cgerc_base( FINT, FINT, const void *, const void *, FINT, const void *, FINT, void *, FINT); - void F77_cgeru_base( FINT, FINT, const void *, const void *, FINT, const void *, FINT, void *, FINT); - void F77_cher_base(FCHAR, FINT, const float *, const void *, FINT, void *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t - #endif - ); - void F77_cher2_base(FCHAR, FINT, const void *, const void *, FINT, const void *, FINT, void *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t - #endif - ); - void F77_chpr_base(FCHAR, FINT, const float *, const void *, FINT, void * - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t - #endif - ); - void F77_chpr2_base(FCHAR, FINT, const float *, const void *, FINT, const void *, FINT, void * - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t - #endif - ); +void F77_cgemv_base(FCHAR, FINT, FINT, const void *, const void *, FINT, const void *, FINT, const void *, void *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN +#endif +); +void F77_cgbmv_base(FCHAR, FINT, FINT, FINT, FINT, const void *, const void *, FINT, const void *, FINT, const void *, void *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN +#endif +); +void F77_chemv_base(FCHAR, FINT, const void *, const void *, FINT, const void *, FINT, const void *, void *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN +#endif +); +void F77_chbmv_base(FCHAR, FINT, FINT, const void *, const void *, FINT, const void *, FINT, const void *, void *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN +#endif +); +void F77_chpmv_base(FCHAR, FINT, const void *, const void *, const void *, FINT, const void *, void *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN +#endif +); +void F77_ctrmv_base(FCHAR, FCHAR, FCHAR, FINT, const void *, FINT, void *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_ctbmv_base(FCHAR, FCHAR, FCHAR, FINT, FINT, const void *, FINT, void *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_ctpmv_base(FCHAR, FCHAR, FCHAR, FINT, const void *, void *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_ctrsv_base(FCHAR, FCHAR, FCHAR, FINT, const void *, FINT, void *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_ctbsv_base(FCHAR, FCHAR, FCHAR, FINT, FINT, const void *, FINT, void *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_ctpsv_base(FCHAR, FCHAR, FCHAR, FINT, const void *, void *,FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_cgerc_base(FINT, FINT, const void *, const void *, FINT, const void *, FINT, void *, FINT); +void F77_cgeru_base(FINT, FINT, const void *, const void *, FINT, const void *, FINT, void *, FINT); +void F77_cher_base(FCHAR, FINT, const float *, const void *, FINT, void *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN +#endif +); +void F77_cher2_base(FCHAR, FINT, const void *, const void *, FINT, const void *, FINT, void *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN +#endif +); +void F77_chpr_base(FCHAR, FINT, const float *, const void *, FINT, void * +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN +#endif +); +void F77_chpr2_base(FCHAR, FINT, const void *, const void *, FINT, const void *, FINT, void * +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN +#endif +); /* Double Complex Precision */ - void F77_zgemv_base(FCHAR, FINT, FINT, const void *, const void *, FINT, const void *, FINT, const void *, void *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t - #endif - ); - void F77_zgbmv_base(FCHAR, FINT, FINT, FINT, FINT, const void *, const void *, FINT, const void *, FINT, const void *, void *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t - #endif - ); - void F77_zhemv_base(FCHAR, FINT, const void *, const void *, FINT, const void *, FINT, const void *, void *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t - #endif - ); - void F77_zhbmv_base(FCHAR, FINT, FINT, const void *, const void *, FINT, const void *, FINT, const void *, void *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t - #endif - ); - void F77_zhpmv_base(FCHAR, FINT, const void *, const void *, const void *, FINT, const void *, void *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t - #endif - ); - void F77_ztrmv_base(FCHAR, FCHAR, FCHAR, FINT, const void *, FINT, void *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t, size_t - #endif - ); - void F77_ztbmv_base(FCHAR, FCHAR, FCHAR, FINT, FINT, const void *, FINT, void *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t, size_t - #endif - ); - void F77_ztpmv_base(FCHAR, FCHAR, FCHAR, FINT, const void *, void *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t, size_t - #endif - ); - void F77_ztrsv_base(FCHAR, FCHAR, FCHAR, FINT, const void *, FINT, void *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t, size_t - #endif - ); - void F77_ztbsv_base(FCHAR, FCHAR, FCHAR, FINT, FINT, const void *, FINT, void *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t, size_t - #endif - ); - void F77_ztpsv_base(FCHAR, FCHAR, FCHAR, FINT, const void *, void *,FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t, size_t - #endif - ); - void F77_zgerc_base( FINT, FINT, const void *, const void *, FINT, const void *, FINT, void *, FINT); - void F77_zgeru_base( FINT, FINT, const void *, const void *, FINT, const void *, FINT, void *, FINT); - void F77_zher_base(FCHAR, FINT, const double *, const void *, FINT, void *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t - #endif - ); - void F77_zher2_base(FCHAR, FINT, const void *, const void *, FINT, const void *, FINT, void *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t - #endif - ); - void F77_zhpr_base(FCHAR, FINT, const double *, const void *, FINT, void * - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t - #endif - ); - void F77_zhpr2_base(FCHAR, FINT, const double *, const void *, FINT, const void *, FINT, void * - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t - #endif - ); +void F77_zgemv_base(FCHAR, FINT, FINT, const void *, const void *, FINT, const void *, FINT, const void *, void *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN +#endif +); +void F77_zgbmv_base(FCHAR, FINT, FINT, FINT, FINT, const void *, const void *, FINT, const void *, FINT, const void *, void *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN +#endif +); +void F77_zhemv_base(FCHAR, FINT, const void *, const void *, FINT, const void *, FINT, const void *, void *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN +#endif +); +void F77_zhbmv_base(FCHAR, FINT, FINT, const void *, const void *, FINT, const void *, FINT, const void *, void *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN +#endif +); +void F77_zhpmv_base(FCHAR, FINT, const void *, const void *, const void *, FINT, const void *, void *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN +#endif +); +void F77_ztrmv_base(FCHAR, FCHAR, FCHAR, FINT, const void *, FINT, void *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_ztbmv_base(FCHAR, FCHAR, FCHAR, FINT, FINT, const void *, FINT, void *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_ztpmv_base(FCHAR, FCHAR, FCHAR, FINT, const void *, void *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_ztrsv_base(FCHAR, FCHAR, FCHAR, FINT, const void *, FINT, void *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_ztbsv_base(FCHAR, FCHAR, FCHAR, FINT, FINT, const void *, FINT, void *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_ztpsv_base(FCHAR, FCHAR, FCHAR, FINT, const void *, void *,FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_zgerc_base(FINT, FINT, const void *, const void *, FINT, const void *, FINT, void *, FINT); +void F77_zgeru_base(FINT, FINT, const void *, const void *, FINT, const void *, FINT, void *, FINT); +void F77_zher_base(FCHAR, FINT, const double *, const void *, FINT, void *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN +#endif +); +void F77_zher2_base(FCHAR, FINT, const void *, const void *, FINT, const void *, FINT, void *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN +#endif +); +void F77_zhpr_base(FCHAR, FINT, const double *, const void *, FINT, void * +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN +#endif +); +void F77_zhpr2_base(FCHAR, FINT, const void *, const void *, FINT, const void *, FINT, void * +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN +#endif +); /* * Level 3 Fortran Prototypes @@ -926,165 +1000,191 @@ void F77_xerbla_base(FCHAR, void * /* Single Precision */ - void F77_sgemm_base(FCHAR, FCHAR, FINT, FINT, FINT, const float *, const float *, FINT, const float *, FINT, const float *, float *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t - #endif - ); - void F77_ssymm_base(FCHAR, FCHAR, FINT, FINT, const float *, const float *, FINT, const float *, FINT, const float *, float *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t - #endif - ); - void F77_ssyrk_base(FCHAR, FCHAR, FINT, FINT, const float *, const float *, FINT, const float *, float *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t - #endif - ); - void F77_ssyr2k_base(FCHAR, FCHAR, FINT, FINT, const float *, const float *, FINT, const float *, FINT, const float *, float *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t - #endif - ); - void F77_strmm_base(FCHAR, FCHAR, FCHAR, FCHAR, FINT, FINT, const float *, const float *, FINT, float *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t, size_t, size_t - #endif - ); - void F77_strsm_base(FCHAR, FCHAR, FCHAR, FCHAR, FINT, FINT, const float *, const float *, FINT, float *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t, size_t, size_t - #endif - ); +void F77_sgemm_base(FCHAR, FCHAR, FINT, FINT, FINT, const float *, const float *, FINT, const float *, FINT, const float *, float *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_sgemmtr_base(FCHAR, FCHAR, FCHAR, FINT, FINT, const float *, const float *, FINT, const float *, FINT, const float *, float *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , size_t, size_t, size_t +#endif +); + +void F77_ssymm_base(FCHAR, FCHAR, FINT, FINT, const float *, const float *, FINT, const float *, FINT, const float *, float *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_ssyrk_base(FCHAR, FCHAR, FINT, FINT, const float *, const float *, FINT, const float *, float *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_ssyr2k_base(FCHAR, FCHAR, FINT, FINT, const float *, const float *, FINT, const float *, FINT, const float *, float *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_strmm_base(FCHAR, FCHAR, FCHAR, FCHAR, FINT, FINT, const float *, const float *, FINT, float *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN, FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_strsm_base(FCHAR, FCHAR, FCHAR, FCHAR, FINT, FINT, const float *, const float *, FINT, float *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN, FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); /* Double Precision */ - void F77_dgemm_base(FCHAR, FCHAR, FINT, FINT, FINT, const double *, const double *, FINT, const double *, FINT, const double *, double *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t - #endif - ); - void F77_dsymm_base(FCHAR, FCHAR, FINT, FINT, const double *, const double *, FINT, const double *, FINT, const double *, double *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t - #endif - ); - void F77_dsyrk_base(FCHAR, FCHAR, FINT, FINT, const double *, const double *, FINT, const double *, double *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t - #endif - ); - void F77_dsyr2k_base(FCHAR, FCHAR, FINT, FINT, const double *, const double *, FINT, const double *, FINT, const double *, double *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t - #endif - ); - void F77_dtrmm_base(FCHAR, FCHAR, FCHAR, FCHAR, FINT, FINT, const double *, const double *, FINT, double *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t, size_t, size_t - #endif - ); - void F77_dtrsm_base(FCHAR, FCHAR, FCHAR, FCHAR, FINT, FINT, const double *, const double *, FINT, double *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t, size_t, size_t - #endif - ); +void F77_dgemm_base(FCHAR, FCHAR, FINT, FINT, FINT, const double *, const double *, FINT, const double *, FINT, const double *, double *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_dgemmtr_base(FCHAR, FCHAR, FCHAR, FINT, FINT, const double *, const double *, FINT, const double *, FINT, const double *, double *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , size_t, size_t, size_t +#endif +); + +void F77_dsymm_base(FCHAR, FCHAR, FINT, FINT, const double *, const double *, FINT, const double *, FINT, const double *, double *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_dsyrk_base(FCHAR, FCHAR, FINT, FINT, const double *, const double *, FINT, const double *, double *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_dsyr2k_base(FCHAR, FCHAR, FINT, FINT, const double *, const double *, FINT, const double *, FINT, const double *, double *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_dtrmm_base(FCHAR, FCHAR, FCHAR, FCHAR, FINT, FINT, const double *, const double *, FINT, double *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN, FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_dtrsm_base(FCHAR, FCHAR, FCHAR, FCHAR, FINT, FINT, const double *, const double *, FINT, double *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN, FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); /* Single Complex Precision */ - void F77_cgemm_base(FCHAR, FCHAR, FINT, FINT, FINT, const float *, const float *, FINT, const float *, FINT, const float *, float *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t - #endif - ); - void F77_csymm_base(FCHAR, FCHAR, FINT, FINT, const float *, const float *, FINT, const float *, FINT, const float *, float *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t - #endif - ); - void F77_chemm_base(FCHAR, FCHAR, FINT, FINT, const float *, const float *, FINT, const float *, FINT, const float *, float *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t - #endif - ); - void F77_csyrk_base(FCHAR, FCHAR, FINT, FINT, const float *, const float *, FINT, const float *, float *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t - #endif - ); - void F77_cherk_base(FCHAR, FCHAR, FINT, FINT, const float *, const float *, FINT, const float *, float *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t - #endif - ); - void F77_csyr2k_base(FCHAR, FCHAR, FINT, FINT, const float *, const float *, FINT, const float *, FINT, const float *, float *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t - #endif - ); - void F77_cher2k_base(FCHAR, FCHAR, FINT, FINT, const float *, const float *, FINT, const float *, FINT, const float *, float *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t - #endif - ); - void F77_ctrmm_base(FCHAR, FCHAR, FCHAR, FCHAR, FINT, FINT, const float *, const float *, FINT, float *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t, size_t, size_t - #endif - ); - void F77_ctrsm_base(FCHAR, FCHAR, FCHAR, FCHAR, FINT, FINT, const float *, const float *, FINT, float *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t, size_t, size_t - #endif - ); +void F77_cgemm_base(FCHAR, FCHAR, FINT, FINT, FINT, const void *, const void *, FINT, const void *, FINT, const void *, void *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); + +void F77_cgemmtr_base(FCHAR, FCHAR, FCHAR, FINT, FINT, const void *, const void *, FINT, const void *, FINT, const void *, void *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); + +void F77_csymm_base(FCHAR, FCHAR, FINT, FINT, const void *, const void *, FINT, const void *, FINT, const void *, void *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_chemm_base(FCHAR, FCHAR, FINT, FINT, const void *, const void *, FINT, const void *, FINT, const void *, void *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_csyrk_base(FCHAR, FCHAR, FINT, FINT, const void *, const void *, FINT, const void *, void *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_cherk_base(FCHAR, FCHAR, FINT, FINT, const float *, const void *, FINT, const float *, void *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_csyr2k_base(FCHAR, FCHAR, FINT, FINT, const void *, const void *, FINT, const void *, FINT, const void *, void *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_cher2k_base(FCHAR, FCHAR, FINT, FINT, const void *, const void *, FINT, const void *, FINT, const float *, void *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_ctrmm_base(FCHAR, FCHAR, FCHAR, FCHAR, FINT, FINT, const void *, const void *, FINT, void *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN, FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_ctrsm_base(FCHAR, FCHAR, FCHAR, FCHAR, FINT, FINT, const void *, const void *, FINT, void *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN, FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); /* Double Complex Precision */ - void F77_zgemm_base(FCHAR, FCHAR, FINT, FINT, FINT, const double *, const double *, FINT, const double *, FINT, const double *, double *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t - #endif - ); - void F77_zsymm_base(FCHAR, FCHAR, FINT, FINT, const double *, const double *, FINT, const double *, FINT, const double *, double *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t - #endif - ); - void F77_zhemm_base(FCHAR, FCHAR, FINT, FINT, const double *, const double *, FINT, const double *, FINT, const double *, double *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t - #endif - ); - void F77_zsyrk_base(FCHAR, FCHAR, FINT, FINT, const double *, const double *, FINT, const double *, double *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t - #endif - ); - void F77_zherk_base(FCHAR, FCHAR, FINT, FINT, const double *, const double *, FINT, const double *, double *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t - #endif - ); - void F77_zsyr2k_base(FCHAR, FCHAR, FINT, FINT, const double *, const double *, FINT, const double *, FINT, const double *, double *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t - #endif - ); - void F77_zher2k_base(FCHAR, FCHAR, FINT, FINT, const double *, const double *, FINT, const double *, FINT, const double *, double *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t - #endif - ); - void F77_ztrmm_base(FCHAR, FCHAR, FCHAR, FCHAR, FINT, FINT, const double *, const double *, FINT, double *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t, size_t, size_t - #endif - ); - void F77_ztrsm_base(FCHAR, FCHAR, FCHAR, FCHAR, FINT, FINT, const double *, const double *, FINT, double *, FINT - #ifdef BLAS_FORTRAN_STRLEN_END - , size_t, size_t, size_t, size_t - #endif - ); +void F77_zgemm_base(FCHAR, FCHAR, FINT, FINT, FINT, const void *, const void *, FINT, const void *, FINT, const void *, void *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); + +void F77_zgemmtr_base(FCHAR, FCHAR, FCHAR, FINT, FINT, const void *, const void *, FINT, const void *, FINT, const void *, void *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); + +void F77_zsymm_base(FCHAR, FCHAR, FINT, FINT, const void *, const void *, FINT, const void *, FINT, const void *, void *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_zhemm_base(FCHAR, FCHAR, FINT, FINT, const void *, const void *, FINT, const void *, FINT, const void *, void *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_zsyrk_base(FCHAR, FCHAR, FINT, FINT, const void *, const void *, FINT, const void *, void *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_zherk_base(FCHAR, FCHAR, FINT, FINT, const double *, const void *, FINT, const double *, void *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_zsyr2k_base(FCHAR, FCHAR, FINT, FINT, const void *, const void *, FINT, const void *, FINT, const void *, void *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_zher2k_base(FCHAR, FCHAR, FINT, FINT, const void *, const void *, FINT, const void *, FINT, const double *, void *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_ztrmm_base(FCHAR, FCHAR, FCHAR, FCHAR, FINT, FINT, const void *, const void *, FINT, void *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN, FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); +void F77_ztrsm_base(FCHAR, FCHAR, FCHAR, FCHAR, FINT, FINT, const void *, const void *, FINT, void *, FINT +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN, FORTRAN_STRLEN, FORTRAN_STRLEN, FORTRAN_STRLEN +#endif +); #ifdef __cplusplus } diff --git a/CBLAS/include/cblas_test.h b/CBLAS/include/cblas_test.h index f8174ba43c..32f9394801 100644 --- a/CBLAS/include/cblas_test.h +++ b/CBLAS/include/cblas_test.h @@ -7,6 +7,15 @@ #include "cblas.h" #include "cblas_mangling.h" +/* It seems all current Fortran compilers put strlen at end. +* Some historical compilers put strlen after the str argument +* or make the str argument into a struct. */ +#define BLAS_FORTRAN_STRLEN_END + +#ifndef FORTRAN_STRLEN + #define FORTRAN_STRLEN size_t +#endif + #define TRUE 1 #define PASSED 1 #define TEST_ROW_MJR 1 @@ -36,18 +45,22 @@ typedef struct { double real; double imag; } CBLAS_TEST_ZOMPLEX; #define F77_sswap F77_GLOBAL(sswaptest,SSWAPTEST) #define F77_scopy F77_GLOBAL(scopytest,SCOPYTEST) #define F77_saxpy F77_GLOBAL(saxpytest,SAXPYTEST) +#define F77_saxpby F77_GLOBAL(saxpbytest,SAXPBYTEST) #define F77_isamax F77_GLOBAL(isamaxtest,ISAMAXTEST) #define F77_dswap F77_GLOBAL(dswaptest,DSWAPTEST) #define F77_dcopy F77_GLOBAL(dcopytest,DCOPYTEST) #define F77_daxpy F77_GLOBAL(daxpytest,DAXPYTEST) +#define F77_daxpby F77_GLOBAL(daxpbytest,DAXPBYTEST) #define F77_idamax F77_GLOBAL(idamaxtest,IDAMAXTEST) #define F77_cswap F77_GLOBAL(cswaptest,CSWAPTEST) #define F77_ccopy F77_GLOBAL(ccopytest,CCOPYTEST) #define F77_caxpy F77_GLOBAL(caxpytest,CAXPYTEST) +#define F77_caxpby F77_GLOBAL(caxpbytest,CAXPBYTEST) #define F77_icamax F77_GLOBAL(icamaxtest,ICAMAXTEST) #define F77_zswap F77_GLOBAL(zswaptest,ZSWAPTEST) #define F77_zcopy F77_GLOBAL(zcopytest,ZCOPYTEST) #define F77_zaxpy F77_GLOBAL(zaxpytest,ZAXPYTEST) +#define F77_zaxpby F77_GLOBAL(zaxpbytest,ZAXPBYTEST) #define F77_izamax F77_GLOBAL(izamaxtest,IZAMAXTEST) #define F77_sdot F77_GLOBAL(sdottest,SDOTTEST) #define F77_ddot F77_GLOBAL(ddottest,DDOTTEST) @@ -158,24 +171,28 @@ typedef struct { double real; double imag; } CBLAS_TEST_ZOMPLEX; #define F77_zherk F77_GLOBAL(czherk,CZHERK) #define F77_zher2k F77_GLOBAL(czher2k,CZHER2K) #define F77_sgemm F77_GLOBAL(csgemm,CSGEMM) +#define F77_sgemmtr F77_GLOBAL(csgemmtr,CSGEMMTR) #define F77_ssymm F77_GLOBAL(cssymm,CSSYMM) #define F77_ssyrk F77_GLOBAL(cssyrk,CSSYRK) #define F77_ssyr2k F77_GLOBAL(cssyr2k,CSSYR2K) #define F77_strmm F77_GLOBAL(cstrmm,CSTRMM) #define F77_strsm F77_GLOBAL(cstrsm,CSTRSM) #define F77_dgemm F77_GLOBAL(cdgemm,CDGEMM) +#define F77_dgemmtr F77_GLOBAL(cdgemmtr,CDGEMMTR) #define F77_dsymm F77_GLOBAL(cdsymm,CDSYMM) #define F77_dsyrk F77_GLOBAL(cdsyrk,CDSYRK) #define F77_dsyr2k F77_GLOBAL(cdsyr2k,CDSYR2K) #define F77_dtrmm F77_GLOBAL(cdtrmm,CDTRMM) #define F77_dtrsm F77_GLOBAL(cdtrsm,CDTRSM) #define F77_cgemm F77_GLOBAL(ccgemm,CCGEMM) +#define F77_cgemmtr F77_GLOBAL(ccgemmtr,CCGEMMTR) #define F77_csymm F77_GLOBAL(ccsymm,CCSYMM) #define F77_csyrk F77_GLOBAL(ccsyrk,CCSYRK) #define F77_csyr2k F77_GLOBAL(ccsyr2k,CCSYR2K) #define F77_ctrmm F77_GLOBAL(cctrmm,CCTRMM) #define F77_ctrsm F77_GLOBAL(cctrsm,CCTRSM) #define F77_zgemm F77_GLOBAL(czgemm,CZGEMM) +#define F77_zgemmtr F77_GLOBAL(czgemmtr,CZGEMMTR) #define F77_zsymm F77_GLOBAL(czsymm,CZSYMM) #define F77_zsyrk F77_GLOBAL(czsyrk,CZSYRK) #define F77_zsyr2k F77_GLOBAL(czsyr2k,CZSYR2K) diff --git a/CBLAS/src/CMakeLists.txt b/CBLAS/src/CMakeLists.txt index 266b1794e5..87bc076867 100644 --- a/CBLAS/src/CMakeLists.txt +++ b/CBLAS/src/CMakeLists.txt @@ -16,25 +16,29 @@ set(SLEV1 cblas_srotg.c cblas_srotmg.c cblas_srot.c cblas_srotm.c cblas_sswap.c cblas_sscal.c cblas_scopy.c cblas_saxpy.c cblas_sdot.c cblas_sdsdot.c cblas_snrm2.c cblas_sasum.c cblas_isamax.c sdotsub.f sdsdotsub.f snrm2sub.f sasumsub.f - isamaxsub.f) + isamaxsub.f cblas_saxpby.c) # Files for level 1 double precision real set(DLEV1 cblas_drotg.c cblas_drotmg.c cblas_drot.c cblas_drotm.c cblas_dswap.c cblas_dscal.c cblas_dcopy.c cblas_daxpy.c cblas_ddot.c cblas_dsdot.c cblas_dnrm2.c cblas_dasum.c cblas_idamax.c ddotsub.f dsdotsub.f dnrm2sub.f - dasumsub.f idamaxsub.f) + dasumsub.f idamaxsub.f cblas_daxpby.c) # Files for level 1 single precision complex -set(CLEV1 cblas_cswap.c cblas_cscal.c cblas_csscal.c cblas_ccopy.c +set(CLEV1 cblas_crotg.c cblas_csrot.c + cblas_cswap.c cblas_cscal.c cblas_csscal.c cblas_ccopy.c cblas_caxpy.c cblas_cdotu_sub.c cblas_cdotc_sub.c - cblas_icamax.c cdotcsub.f cdotusub.f icamaxsub.f) + cblas_icamax.c cdotcsub.f cdotusub.f icamaxsub.f + cblas_scabs1.c scabs1sub.f cblas_caxpby.c) # Files for level 1 double precision complex -set(ZLEV1 cblas_zswap.c cblas_zscal.c cblas_zdscal.c cblas_zcopy.c +set(ZLEV1 cblas_zrotg.c cblas_zdrot.c + cblas_zswap.c cblas_zscal.c cblas_zdscal.c cblas_zcopy.c cblas_zaxpy.c cblas_zdotu_sub.c cblas_zdotc_sub.c cblas_dznrm2.c cblas_dzasum.c cblas_izamax.c zdotcsub.f zdotusub.f - dzasumsub.f dznrm2sub.f izamaxsub.f) + dzasumsub.f dznrm2sub.f izamaxsub.f + cblas_dcabs1.c dcabs1sub.f cblas_zaxpby.c) # Common files for level 1 single precision set(SCLEV1 cblas_scasum.c scasumsub.f cblas_scnrm2.c scnrm2sub.f) @@ -81,21 +85,21 @@ set(ZLEV2 cblas_zgemv.c cblas_zgbmv.c cblas_zhemv.c cblas_zhbmv.c cblas_zhpmv.c # Files for level 3 single precision real set(SLEV3 cblas_sgemm.c cblas_ssymm.c cblas_ssyrk.c cblas_ssyr2k.c cblas_strmm.c - cblas_strsm.c) + cblas_strsm.c cblas_sgemmtr.c) # Files for level 3 double precision real set(DLEV3 cblas_dgemm.c cblas_dsymm.c cblas_dsyrk.c cblas_dsyr2k.c cblas_dtrmm.c - cblas_dtrsm.c) + cblas_dtrsm.c cblas_dgemmtr.c) # Files for level 3 single precision complex set(CLEV3 cblas_cgemm.c cblas_csymm.c cblas_chemm.c cblas_cherk.c cblas_cher2k.c cblas_ctrmm.c cblas_ctrsm.c cblas_csyrk.c - cblas_csyr2k.c) + cblas_csyr2k.c cblas_cgemmtr.c) # Files for level 3 double precision complex set(ZLEV3 cblas_zgemm.c cblas_zsymm.c cblas_zhemm.c cblas_zherk.c cblas_zher2k.c cblas_ztrmm.c cblas_ztrsm.c cblas_zsyrk.c - cblas_zsyr2k.c) + cblas_zsyr2k.c cblas_zgemmtr.c) set(SOURCES) @@ -113,19 +117,67 @@ if(BUILD_COMPLEX16) endif() list(REMOVE_DUPLICATES SOURCES) -add_library(${CBLASLIB} ${SOURCES}) +add_library(${CBLASLIB}_obj OBJECT ${SOURCES}) +set_target_properties(${CBLASLIB}_obj PROPERTIES POSITION_INDEPENDENT_CODE ON) +if(HAS_ATTRIBUTE_WEAK_SUPPORT) + target_compile_definitions(${CBLASLIB}_obj PRIVATE HAS_ATTRIBUTE_WEAK_SUPPORT) +endif() + +if(BUILD_INDEX64_EXT_API) + # 64bit Integer Interface + # Define list of C files + set(SOURCES_64_C) + list(APPEND SOURCES_64_C ${SOURCES}) + list(FILTER SOURCES_64_C EXCLUDE REGEX "\.f$") + list(REMOVE_ITEM SOURCES_64_C cblas_globals.c) + # Define list of Fortran files + set(SOURCES_64_F) + list(APPEND SOURCES_64_F ${SOURCES}) + list(FILTER SOURCES_64_F INCLUDE REGEX "\.f$") + # Copy files so we can set source property specific to /${CBLASLIB}_64_obj target + file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${CBLASLIB}_64_fobj) + file(COPY ${SOURCES_64_F} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/${CBLASLIB}_64_fobj) + file(GLOB SOURCES_64_F ${CMAKE_CURRENT_BINARY_DIR}/${CBLASLIB}_64_fobj/*) + add_library(${CBLASLIB}_64_cobj OBJECT ${SOURCES_64_C}) + add_library(${CBLASLIB}_64_fobj OBJECT ${SOURCES_64_F}) + set_target_properties(${CBLASLIB}_64_cobj ${CBLASLIB}_64_fobj PROPERTIES + POSITION_INDEPENDENT_CODE ON + Fortran_PREPROCESS ON + LINKER_LANGUAGE C) + target_compile_options(${CBLASLIB}_64_cobj PRIVATE -DWeirdNEC -DCBLAS_API64) + target_compile_options(${CBLASLIB}_64_fobj PRIVATE ${FOPT_ILP64}) + if(HAS_ATTRIBUTE_WEAK_SUPPORT) + target_compile_definitions(${CBLASLIB}_64_cobj PRIVATE HAS_ATTRIBUTE_WEAK_SUPPORT) + endif() + #Add suffix to all Fortran functions via macros + foreach(F IN LISTS SOURCES_64_F) + set(COPT_64_F) + file(STRINGS ${F} ${F}.lst) + list(FILTER ${F}.lst INCLUDE REGEX "subroutine|external") + foreach(FUNC IN LISTS ${F}.lst) + string(REGEX REPLACE "[ ]*(subroutine|external)[ ]*" "" FUNC ${FUNC}) + string(REGEX REPLACE "[(][a-zA-Z0-9, ]*[)]" "" FUNC ${FUNC}) + list(APPEND COPT_64_F "-D${FUNC}=${FUNC}_64") + endforeach() + set_source_files_properties(${F} PROPERTIES COMPILE_OPTIONS "${COPT_64_F}") + endforeach() +endif() + +add_library(${CBLASLIB} + $ + $<$: $> + $<$: $>) + set_target_properties( ${CBLASLIB} PROPERTIES LINKER_LANGUAGE C VERSION ${LAPACK_VERSION} SOVERSION ${LAPACK_MAJOR_VERSION} + POSITION_INDEPENDENT_CODE ON ) -if(HAS_ATTRIBUTE_WEAK_SUPPORT) - target_compile_definitions(${CBLASLIB} PRIVATE HAS_ATTRIBUTE_WEAK_SUPPORT) -endif() + target_include_directories(${CBLASLIB} PUBLIC - $ $ ) -target_link_libraries(${CBLASLIB} PRIVATE ${BLAS_LIBRARIES}) +target_link_libraries(${CBLASLIB} PUBLIC ${BLAS_LIBRARIES}) lapack_install_library(${CBLASLIB}) diff --git a/CBLAS/src/Makefile b/CBLAS/src/Makefile index 7100568e4e..9583a08447 100644 --- a/CBLAS/src/Makefile +++ b/CBLAS/src/Makefile @@ -26,25 +26,29 @@ slev1 = cblas_srotg.o cblas_srotmg.o cblas_srot.o cblas_srotm.o \ cblas_sswap.o cblas_sscal.o cblas_scopy.o cblas_saxpy.o \ cblas_sdot.o cblas_sdsdot.o cblas_snrm2.o cblas_sasum.o \ cblas_isamax.o sdotsub.o sdsdotsub.o snrm2sub.o sasumsub.o \ - isamaxsub.o + isamaxsub.o cblas_saxpby.o # Files for level 1 double precision real dlev1 = cblas_drotg.o cblas_drotmg.o cblas_drot.o cblas_drotm.o \ cblas_dswap.o cblas_dscal.o cblas_dcopy.o cblas_daxpy.o \ cblas_ddot.o cblas_dsdot.o cblas_dnrm2.o cblas_dasum.o \ cblas_idamax.o ddotsub.o dsdotsub.o dnrm2sub.o \ - dasumsub.o idamaxsub.o + dasumsub.o idamaxsub.o cblas_daxpby.o # Files for level 1 single precision complex -clev1 = cblas_cswap.o cblas_cscal.o cblas_csscal.o cblas_ccopy.o \ +clev1 = cblas_crotg.o cblas_csrot.o \ + cblas_cswap.o cblas_cscal.o cblas_csscal.o cblas_ccopy.o \ cblas_caxpy.o cblas_cdotu_sub.o cblas_cdotc_sub.o \ - cblas_icamax.o cdotcsub.o cdotusub.o icamaxsub.o + cblas_icamax.o cdotcsub.o cdotusub.o icamaxsub.o \ + cblas_scabs1.o scabs1sub.o cblas_caxpby.o # Files for level 1 double precision complex -zlev1 = cblas_zswap.o cblas_zscal.o cblas_zdscal.o cblas_zcopy.o \ +zlev1 = cblas_zrotg.o cblas_zdrot.o \ + cblas_zswap.o cblas_zscal.o cblas_zdscal.o cblas_zcopy.o \ cblas_zaxpy.o cblas_zdotu_sub.o cblas_zdotc_sub.o cblas_dznrm2.o \ cblas_dzasum.o cblas_izamax.o zdotcsub.o zdotusub.o \ - dzasumsub.o dznrm2sub.o izamaxsub.o + dzasumsub.o dznrm2sub.o izamaxsub.o \ + cblas_dcabs1.o dcabs1sub.o cblas_zaxpby.o # Common files for level 1 single precision sclev1 = cblas_scasum.o scasumsub.o cblas_scnrm2.o scnrm2sub.o @@ -133,21 +137,21 @@ zlib2: $(zlev2) $(errhand) # Files for level 3 single precision real slev3 = cblas_sgemm.o cblas_ssymm.o cblas_ssyrk.o cblas_ssyr2k.o cblas_strmm.o \ - cblas_strsm.o + cblas_strsm.o cblas_sgemmtr.o # Files for level 3 double precision real dlev3 = cblas_dgemm.o cblas_dsymm.o cblas_dsyrk.o cblas_dsyr2k.o cblas_dtrmm.o \ - cblas_dtrsm.o + cblas_dtrsm.o cblas_dgemmtr.o # Files for level 3 single precision complex clev3 = cblas_cgemm.o cblas_csymm.o cblas_chemm.o cblas_cherk.o \ cblas_cher2k.o cblas_ctrmm.o cblas_ctrsm.o cblas_csyrk.o \ - cblas_csyr2k.o + cblas_csyr2k.o cblas_cgemmtr.o # Files for level 3 double precision complex zlev3 = cblas_zgemm.o cblas_zsymm.o cblas_zhemm.o cblas_zherk.o \ cblas_zher2k.o cblas_ztrmm.o cblas_ztrsm.o cblas_zsyrk.o \ - cblas_zsyr2k.o + cblas_zsyr2k.o cblas_zgemmtr.o .PHONY: slib3 dlib3 clib3 zlib3 # Single precision real diff --git a/CBLAS/src/cblas_caxpby.c b/CBLAS/src/cblas_caxpby.c new file mode 100644 index 0000000000..997ba3c952 --- /dev/null +++ b/CBLAS/src/cblas_caxpby.c @@ -0,0 +1,22 @@ +/* + * cblas_caxpby.c + * + * The program is a C interface to caxpby. + * + * Written by Martin Koehler. 08/26/2024 + * + */ +#include "cblas.h" +#include "cblas_f77.h" +void API_SUFFIX(cblas_caxpby)( const CBLAS_INT N, const void *alpha, const void *X, + const CBLAS_INT incX, const void *beta, void *Y, const CBLAS_INT incY) +{ +#ifdef F77_INT + F77_INT F77_N=N, F77_incX=incX, F77_incY=incY; +#else + #define F77_N N + #define F77_incX incX + #define F77_incY incY +#endif + F77_caxpby( &F77_N, alpha, X, &F77_incX, beta, Y, &F77_incY); +} diff --git a/CBLAS/src/cblas_caxpy.c b/CBLAS/src/cblas_caxpy.c index d4288f7423..f38ee4cb62 100644 --- a/CBLAS/src/cblas_caxpy.c +++ b/CBLAS/src/cblas_caxpy.c @@ -8,7 +8,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_caxpy( const CBLAS_INT N, const void *alpha, const void *X, +void API_SUFFIX(cblas_caxpy)( const CBLAS_INT N, const void *alpha, const void *X, const CBLAS_INT incX, void *Y, const CBLAS_INT incY) { #ifdef F77_INT diff --git a/CBLAS/src/cblas_ccopy.c b/CBLAS/src/cblas_ccopy.c index cae561ae3d..04ee03f860 100644 --- a/CBLAS/src/cblas_ccopy.c +++ b/CBLAS/src/cblas_ccopy.c @@ -8,7 +8,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_ccopy( const CBLAS_INT N, const void *X, +void API_SUFFIX(cblas_ccopy)( const CBLAS_INT N, const void *X, const CBLAS_INT incX, void *Y, const CBLAS_INT incY) { #ifdef F77_INT diff --git a/CBLAS/src/cblas_cdotc_sub.c b/CBLAS/src/cblas_cdotc_sub.c index 81520ebd18..cd7958bda0 100644 --- a/CBLAS/src/cblas_cdotc_sub.c +++ b/CBLAS/src/cblas_cdotc_sub.c @@ -9,7 +9,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_cdotc_sub( const CBLAS_INT N, const void *X, const CBLAS_INT incX, +void API_SUFFIX(cblas_cdotc_sub)( const CBLAS_INT N, const void *X, const CBLAS_INT incX, const void *Y, const CBLAS_INT incY, void *dotc) { #ifdef F77_INT diff --git a/CBLAS/src/cblas_cdotu_sub.c b/CBLAS/src/cblas_cdotu_sub.c index 0f7ded90b9..e513fed057 100644 --- a/CBLAS/src/cblas_cdotu_sub.c +++ b/CBLAS/src/cblas_cdotu_sub.c @@ -9,7 +9,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_cdotu_sub( const CBLAS_INT N, const void *X, const CBLAS_INT incX, +void API_SUFFIX(cblas_cdotu_sub)( const CBLAS_INT N, const void *X, const CBLAS_INT incX, const void *Y, const CBLAS_INT incY, void *dotu) { #ifdef F77_INT diff --git a/CBLAS/src/cblas_cgbmv.c b/CBLAS/src/cblas_cgbmv.c index c2d9b212f7..776fcbc7eb 100644 --- a/CBLAS/src/cblas_cgbmv.c +++ b/CBLAS/src/cblas_cgbmv.c @@ -7,9 +7,11 @@ */ #include #include +#include + #include "cblas.h" #include "cblas_f77.h" -void cblas_cgbmv(const CBLAS_LAYOUT layout, +void API_SUFFIX(cblas_cgbmv)(const CBLAS_LAYOUT layout, const CBLAS_TRANSPOSE TransA, const CBLAS_INT M, const CBLAS_INT N, const CBLAS_INT KL, const CBLAS_INT KU, const void *alpha, const void *A, const CBLAS_INT lda, @@ -26,6 +28,7 @@ void cblas_cgbmv(const CBLAS_LAYOUT layout, F77_INT F77_M=M, F77_N=N, F77_lda=lda, F77_incX=incX, F77_incY=incY; F77_INT F77_KL=KL,F77_KU=KU; #else + CBLAS_INT incx=incX; #define F77_M M #define F77_N N #define F77_lda lda @@ -34,15 +37,19 @@ void cblas_cgbmv(const CBLAS_LAYOUT layout, #define F77_incX incx #define F77_incY incY #endif - CBLAS_INT n=0, i=0, incx=incX; - const float *xx= (float *)X, *alp= (float *)alpha, *bet = (float *)beta; + CBLAS_INT n=0, i=0; + const float *xx= (const float *)X, *alp= (const float *)alpha, *bet = (const float *)beta; float ALPHA[2],BETA[2]; CBLAS_INT tincY, tincx; - float *x=(float *)X, *y=(float *)Y, *st=0, *tx=0; + float *x, *y, *st=0, *tx=0; extern int CBLAS_CallFromC; extern int RowMajorStrg; RowMajorStrg = 0; + memcpy(&x, &X, sizeof(float*)); + memcpy(&y, &Y, sizeof(float*)); + + CBLAS_CallFromC = 1; if (layout == CblasColMajor) { @@ -51,7 +58,7 @@ void cblas_cgbmv(const CBLAS_LAYOUT layout, else if (TransA == CblasConjTrans) TA = 'C'; else { - cblas_xerbla(2, "cblas_cgbmv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(2, "cblas_cgbmv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -125,13 +132,13 @@ void cblas_cgbmv(const CBLAS_LAYOUT layout, y -= n; } } - else x = (float *) X; + else memcpy(&x, &X, sizeof(float*)); } else { - cblas_xerbla(2, "cblas_cgbmv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(2, "cblas_cgbmv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -159,7 +166,7 @@ void cblas_cgbmv(const CBLAS_LAYOUT layout, } } } - else cblas_xerbla(1, "cblas_cgbmv", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_cgbmv", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; } diff --git a/CBLAS/src/cblas_cgemm.c b/CBLAS/src/cblas_cgemm.c index 0ad99267d2..fe4b599a19 100644 --- a/CBLAS/src/cblas_cgemm.c +++ b/CBLAS/src/cblas_cgemm.c @@ -9,7 +9,7 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_cgemm(const CBLAS_LAYOUT layout, const CBLAS_TRANSPOSE TransA, +void API_SUFFIX(cblas_cgemm)(const CBLAS_LAYOUT layout, const CBLAS_TRANSPOSE TransA, const CBLAS_TRANSPOSE TransB, const CBLAS_INT M, const CBLAS_INT N, const CBLAS_INT K, const void *alpha, const void *A, const CBLAS_INT lda, const void *B, const CBLAS_INT ldb, @@ -47,7 +47,7 @@ void cblas_cgemm(const CBLAS_LAYOUT layout, const CBLAS_TRANSPOSE TransA, else if ( TransA == CblasNoTrans ) TA='N'; else { - cblas_xerbla(2, "cblas_cgemm", "Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(2, "cblas_cgemm", "Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -58,7 +58,7 @@ void cblas_cgemm(const CBLAS_LAYOUT layout, const CBLAS_TRANSPOSE TransA, else if ( TransB == CblasNoTrans ) TB='N'; else { - cblas_xerbla(3, "cblas_cgemm", "Illegal TransB setting, %d\n", TransB); + API_SUFFIX(cblas_xerbla)(3, "cblas_cgemm", "Illegal TransB setting, %d\n", TransB); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -79,7 +79,7 @@ void cblas_cgemm(const CBLAS_LAYOUT layout, const CBLAS_TRANSPOSE TransA, else if ( TransA == CblasNoTrans ) TB='N'; else { - cblas_xerbla(2, "cblas_cgemm", "Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(2, "cblas_cgemm", "Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -89,7 +89,7 @@ void cblas_cgemm(const CBLAS_LAYOUT layout, const CBLAS_TRANSPOSE TransA, else if ( TransB == CblasNoTrans ) TA='N'; else { - cblas_xerbla(2, "cblas_cgemm", "Illegal TransB setting, %d\n", TransB); + API_SUFFIX(cblas_xerbla)(2, "cblas_cgemm", "Illegal TransB setting, %d\n", TransB); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -102,7 +102,7 @@ void cblas_cgemm(const CBLAS_LAYOUT layout, const CBLAS_TRANSPOSE TransA, F77_cgemm(F77_TA, F77_TB, &F77_N, &F77_M, &F77_K, alpha, B, &F77_ldb, A, &F77_lda, beta, C, &F77_ldc); } - else cblas_xerbla(1, "cblas_cgemm", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_cgemm", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_cgemmtr.c b/CBLAS/src/cblas_cgemmtr.c new file mode 100644 index 0000000000..5717dc4097 --- /dev/null +++ b/CBLAS/src/cblas_cgemmtr.c @@ -0,0 +1,134 @@ +/* + * + * cblas_cgemmtr.c + * This program is a C interface to cgemmtr. + * Written by Martin Koehler, MPI Magdeburg + * 06/24/2024 + * + */ + +#include "cblas.h" +#include "cblas_f77.h" +void API_SUFFIX(cblas_cgemmtr)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE TransA, + const CBLAS_TRANSPOSE TransB, const CBLAS_INT N, + const CBLAS_INT K, const void *alpha, const void *A, + const CBLAS_INT lda, const void *B, const CBLAS_INT ldb, + const void *beta, void *C, const CBLAS_INT ldc) +{ + char TA, TB; + char UL; +#ifdef F77_CHAR + F77_CHAR F77_TA, F77_TB, F77_UL; +#else +#define F77_TA &TA +#define F77_TB &TB +#define F77_UL &UL +#endif + +#ifdef F77_INT + F77_INT F77_N=N, F77_K=K, F77_lda=lda, F77_ldb=ldb; + F77_INT F77_ldc=ldc; +#else +#define F77_N N +#define F77_K K +#define F77_lda lda +#define F77_ldb ldb +#define F77_ldc ldc +#endif + + extern int CBLAS_CallFromC; + extern int RowMajorStrg; + RowMajorStrg = 0; + CBLAS_CallFromC = 1; + + + if( layout == CblasColMajor ) + { + if ( Uplo == CblasUpper ) UL = 'U'; + else if (Uplo == CblasLower) UL= 'L'; + else { + API_SUFFIX(cblas_xerbla)(2, "cblas_cgemmtr", "Illegal Uplo setting, %d\n", Uplo); + CBLAS_CallFromC = 0; + RowMajorStrg = 0; + return; + } + + if(TransA == CblasTrans) TA='T'; + else if ( TransA == CblasConjTrans ) TA='C'; + else if ( TransA == CblasNoTrans ) TA='N'; + else + { + API_SUFFIX(cblas_xerbla)(3, "cblas_cgemmtr", "Illegal TransA setting, %d\n", TransA); + CBLAS_CallFromC = 0; + RowMajorStrg = 0; + return; + } + + if(TransB == CblasTrans) TB='T'; + else if ( TransB == CblasConjTrans ) TB='C'; + else if ( TransB == CblasNoTrans ) TB='N'; + else + { + API_SUFFIX(cblas_xerbla)(4, "cblas_cgemmtr", "Illegal TransB setting, %d\n", TransB); + CBLAS_CallFromC = 0; + RowMajorStrg = 0; + return; + } + +#ifdef F77_CHAR + F77_TA = C2F_CHAR(&TA); + F77_TB = C2F_CHAR(&TB); + F77_UL = C2F_CHAR(&UL); +#endif + + F77_cgemmtr(F77_UL, F77_TA, F77_TB, &F77_N, &F77_K, alpha, A, + &F77_lda, B, &F77_ldb, beta, C, &F77_ldc); + } + else if (layout == CblasRowMajor) + { + RowMajorStrg = 1; + + if ( Uplo == CblasUpper ) UL = 'L'; + else if (Uplo == CblasLower) UL= 'U'; + else { + API_SUFFIX(cblas_xerbla)(2, "cblas_cgemmtr", "Illegal Uplo setting, %d\n", Uplo); + CBLAS_CallFromC = 0; + RowMajorStrg = 0; + return; + } + + if(TransA == CblasTrans) TB='T'; + else if ( TransA == CblasConjTrans ) TB='C'; + else if ( TransA == CblasNoTrans ) TB='N'; + else + { + API_SUFFIX(cblas_xerbla)(3, "cblas_cgemmtr", "Illegal TransA setting, %d\n", TransA); + CBLAS_CallFromC = 0; + RowMajorStrg = 0; + return; + } + if(TransB == CblasTrans) TA='T'; + else if ( TransB == CblasConjTrans ) TA='C'; + else if ( TransB == CblasNoTrans ) TA='N'; + else + { + API_SUFFIX(cblas_xerbla)(4, "cblas_cgemmtr", "Illegal TransB setting, %d\n", TransB); + CBLAS_CallFromC = 0; + RowMajorStrg = 0; + return; + } +#ifdef F77_CHAR + F77_TA = C2F_CHAR(&TA); + F77_TB = C2F_CHAR(&TB); + F77_UL = C2F_CHAR(&UL); + +#endif + + F77_cgemmtr(F77_UL, F77_TA, F77_TB, &F77_N, &F77_K, alpha, B, + &F77_ldb, A, &F77_lda, beta, C, &F77_ldc); + } + else API_SUFFIX(cblas_xerbla)(1, "cblas_cgemmtr", "Illegal layout setting, %d\n", layout); + CBLAS_CallFromC = 0; + RowMajorStrg = 0; + return; +} diff --git a/CBLAS/src/cblas_cgemv.c b/CBLAS/src/cblas_cgemv.c index 1147242707..a9a27f4562 100644 --- a/CBLAS/src/cblas_cgemv.c +++ b/CBLAS/src/cblas_cgemv.c @@ -7,9 +7,10 @@ */ #include #include +#include #include "cblas.h" #include "cblas_f77.h" -void cblas_cgemv(const CBLAS_LAYOUT layout, +void API_SUFFIX(cblas_cgemv)(const CBLAS_LAYOUT layout, const CBLAS_TRANSPOSE TransA, const CBLAS_INT M, const CBLAS_INT N, const void *alpha, const void *A, const CBLAS_INT lda, const void *X, const CBLAS_INT incX, const void *beta, @@ -31,18 +32,22 @@ void cblas_cgemv(const CBLAS_LAYOUT layout, #define F77_incY incY #endif - CBLAS_INT n=0, i=0, incx=incX; + CBLAS_INT n=0, i=0; const float *xx= (const float *)X; float ALPHA[2],BETA[2]; CBLAS_INT tincY, tincx; - float *x=(float *)X, *y=(float *)Y, *st=0, *tx=0; - const float *stx = x; + float *x, *y, *st=0, *tx=0; extern int CBLAS_CallFromC; extern int RowMajorStrg; RowMajorStrg = 0; CBLAS_CallFromC = 1; + memcpy(&x, &X, sizeof(float *)); + memcpy(&y, &Y, sizeof(float *)); + + const float *stx = x; + if (layout == CblasColMajor) { if (TransA == CblasNoTrans) TA = 'N'; @@ -50,7 +55,7 @@ void cblas_cgemv(const CBLAS_LAYOUT layout, else if (TransA == CblasConjTrans) TA = 'C'; else { - cblas_xerbla(2, "cblas_cgemv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(2, "cblas_cgemv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -126,7 +131,7 @@ void cblas_cgemv(const CBLAS_LAYOUT layout, } else { - cblas_xerbla(2, "cblas_cgemv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(2, "cblas_cgemv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -155,7 +160,7 @@ void cblas_cgemv(const CBLAS_LAYOUT layout, } } } - else cblas_xerbla(1, "cblas_cgemv", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_cgemv", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_cgerc.c b/CBLAS/src/cblas_cgerc.c index a558417e64..f9e4af33cc 100644 --- a/CBLAS/src/cblas_cgerc.c +++ b/CBLAS/src/cblas_cgerc.c @@ -7,15 +7,18 @@ */ #include #include +#include + #include "cblas.h" #include "cblas_f77.h" -void cblas_cgerc(const CBLAS_LAYOUT layout, const CBLAS_INT M, const CBLAS_INT N, +void API_SUFFIX(cblas_cgerc)(const CBLAS_LAYOUT layout, const CBLAS_INT M, const CBLAS_INT N, const void *alpha, const void *X, const CBLAS_INT incX, const void *Y, const CBLAS_INT incY, void *A, const CBLAS_INT lda) { #ifdef F77_INT F77_INT F77_M=M, F77_N=N, F77_lda=lda, F77_incX=incX, F77_incY=incY; #else + CBLAS_INT incy = incY; #define F77_M M #define F77_N N #define F77_incX incX @@ -23,8 +26,10 @@ void cblas_cgerc(const CBLAS_LAYOUT layout, const CBLAS_INT M, const CBLAS_INT N #define F77_lda lda #endif - CBLAS_INT n, i, tincy, incy=incY; - float *y=(float *)Y, *yy=(float *)Y, *ty, *st; + CBLAS_INT n, i, tincy; + float *y, *yy, *ty, *st; + memcpy(&y,&Y,sizeof(float*)); + memcpy(&yy,&Y,sizeof(float*)); extern int CBLAS_CallFromC; extern int RowMajorStrg; @@ -70,14 +75,15 @@ void cblas_cgerc(const CBLAS_LAYOUT layout, const CBLAS_INT M, const CBLAS_INT N incy = 1; #endif } - else y = (float *) Y; + else + memcpy(&y,&Y,sizeof(float*)); F77_cgeru( &F77_N, &F77_M, alpha, y, &F77_incY, X, &F77_incX, A, &F77_lda); if(Y!=y) free(y); - } else cblas_xerbla(1, "cblas_cgerc", "Illegal layout setting, %d\n", layout); + } else API_SUFFIX(cblas_xerbla)(1, "cblas_cgerc", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_cgeru.c b/CBLAS/src/cblas_cgeru.c index 6cca83e6fc..ea5b74bc4a 100644 --- a/CBLAS/src/cblas_cgeru.c +++ b/CBLAS/src/cblas_cgeru.c @@ -7,7 +7,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_cgeru(const CBLAS_LAYOUT layout, const CBLAS_INT M, const CBLAS_INT N, +void API_SUFFIX(cblas_cgeru)(const CBLAS_LAYOUT layout, const CBLAS_INT M, const CBLAS_INT N, const void *alpha, const void *X, const CBLAS_INT incX, const void *Y, const CBLAS_INT incY, void *A, const CBLAS_INT lda) { @@ -38,7 +38,7 @@ void cblas_cgeru(const CBLAS_LAYOUT layout, const CBLAS_INT M, const CBLAS_INT N F77_cgeru( &F77_N, &F77_M, alpha, Y, &F77_incY, X, &F77_incX, A, &F77_lda); } - else cblas_xerbla(1, "cblas_cgeru","Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_cgeru","Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_chbmv.c b/CBLAS/src/cblas_chbmv.c index 13e3920ee7..5fab2022cd 100644 --- a/CBLAS/src/cblas_chbmv.c +++ b/CBLAS/src/cblas_chbmv.c @@ -9,7 +9,8 @@ #include "cblas_f77.h" #include #include -void cblas_chbmv(const CBLAS_LAYOUT layout, +#include +void API_SUFFIX(cblas_chbmv)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo,const CBLAS_INT N,const CBLAS_INT K, const void *alpha, const void *A, const CBLAS_INT lda, const void *X, const CBLAS_INT incX, const void *beta, @@ -24,21 +25,25 @@ void cblas_chbmv(const CBLAS_LAYOUT layout, #ifdef F77_INT F77_INT F77_N=N, F77_K=K, F77_lda=lda, F77_incX=incX, F77_incY=incY; #else + CBLAS_INT incx = incX; #define F77_N N #define F77_K K #define F77_lda lda #define F77_incX incx #define F77_incY incY #endif - CBLAS_INT n, i=0, incx=incX; - const float *xx= (float *)X, *alp= (float *)alpha, *bet = (float *)beta; + CBLAS_INT n, i=0; + const float *xx= (const float *)X, *alp= (const float *)alpha, *bet = (const float *)beta; float ALPHA[2],BETA[2]; CBLAS_INT tincY, tincx; - float *x=(float *)X, *y=(float *)Y, *st=0, *tx; + float *x, *y, *st=0, *tx; extern int CBLAS_CallFromC; extern int RowMajorStrg; RowMajorStrg = 0; + memcpy(&x, &X, sizeof(float*)); + memcpy(&y, &Y, sizeof(float*)); + CBLAS_CallFromC = 1; if (layout == CblasColMajor) { @@ -46,7 +51,7 @@ void cblas_chbmv(const CBLAS_LAYOUT layout, else if (Uplo == CblasUpper) UL = 'U'; else { - cblas_xerbla(2, "cblas_chbmv","Illegal Uplo setting, %d\n",Uplo ); + API_SUFFIX(cblas_xerbla)(2, "cblas_chbmv","Illegal Uplo setting, %d\n",Uplo ); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -114,13 +119,13 @@ void cblas_chbmv(const CBLAS_LAYOUT layout, } while(y != st); y -= n; } else - x = (float *) X; + memcpy(&x, &X, sizeof(float*)); if (Uplo == CblasUpper) UL = 'L'; else if (Uplo == CblasLower) UL = 'U'; else { - cblas_xerbla(2, "cblas_chbmv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_chbmv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -133,7 +138,7 @@ void cblas_chbmv(const CBLAS_LAYOUT layout, } else { - cblas_xerbla(1, "cblas_chbmv","Illegal layout setting, %d\n", layout); + API_SUFFIX(cblas_xerbla)(1, "cblas_chbmv","Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_chemm.c b/CBLAS/src/cblas_chemm.c index 9ccb18a3af..4dd7b5c1ad 100644 --- a/CBLAS/src/cblas_chemm.c +++ b/CBLAS/src/cblas_chemm.c @@ -9,7 +9,7 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_chemm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, +void API_SUFFIX(cblas_chemm)(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, const CBLAS_UPLO Uplo, const CBLAS_INT M, const CBLAS_INT N, const void *alpha, const void *A, const CBLAS_INT lda, const void *B, const CBLAS_INT ldb, const void *beta, @@ -45,7 +45,7 @@ void cblas_chemm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Side == CblasLeft ) SD='L'; else { - cblas_xerbla(2, "cblas_chemm", "Illegal Side setting, %d\n", Side); + API_SUFFIX(cblas_xerbla)(2, "cblas_chemm", "Illegal Side setting, %d\n", Side); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -55,7 +55,7 @@ void cblas_chemm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Uplo == CblasLower ) UL='L'; else { - cblas_xerbla(3, "cblas_chemm", "Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(3, "cblas_chemm", "Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -75,7 +75,7 @@ void cblas_chemm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Side == CblasLeft ) SD='R'; else { - cblas_xerbla(2, "cblas_chemm", "Illegal Side setting, %d\n", Side); + API_SUFFIX(cblas_xerbla)(2, "cblas_chemm", "Illegal Side setting, %d\n", Side); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -85,7 +85,7 @@ void cblas_chemm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Uplo == CblasLower ) UL='U'; else { - cblas_xerbla(3, "cblas_chemm", "Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(3, "cblas_chemm", "Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -99,7 +99,7 @@ void cblas_chemm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, F77_chemm(F77_SD, F77_UL, &F77_N, &F77_M, alpha, A, &F77_lda, B, &F77_ldb, beta, C, &F77_ldc); } - else cblas_xerbla(1, "cblas_chemm", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_chemm", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_chemv.c b/CBLAS/src/cblas_chemv.c index 8c4eadf101..fd092be66c 100644 --- a/CBLAS/src/cblas_chemv.c +++ b/CBLAS/src/cblas_chemv.c @@ -7,9 +7,11 @@ */ #include #include +#include + #include "cblas.h" #include "cblas_f77.h" -void cblas_chemv(const CBLAS_LAYOUT layout, +void API_SUFFIX(cblas_chemv)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_INT N, const void *alpha, const void *A, const CBLAS_INT lda, const void *X, const CBLAS_INT incX, const void *beta, @@ -24,20 +26,24 @@ void cblas_chemv(const CBLAS_LAYOUT layout, #ifdef F77_INT F77_INT F77_N=N, F77_lda=lda, F77_incX=incX, F77_incY=incY; #else + CBLAS_INT incx = incX; #define F77_N N #define F77_lda lda #define F77_incX incx #define F77_incY incY #endif - CBLAS_INT n=0, i=0, incx=incX; - const float *xx= (float *)X, *alp= (float *)alpha, *bet = (float *)beta; + CBLAS_INT n=0, i=0; + const float *xx= (const float *)X, *alp= (const float *)alpha, *bet = (const float *)beta; float ALPHA[2],BETA[2]; CBLAS_INT tincY, tincx; - float *x=(float *)X, *y=(float *)Y, *st=0, *tx; + float *x, *y, *st=0, *tx; extern int CBLAS_CallFromC; extern int RowMajorStrg; RowMajorStrg = 0; + memcpy(&x, &X, sizeof(float*)); + memcpy(&y, &Y, sizeof(float*)); + CBLAS_CallFromC = 1; if (layout == CblasColMajor) @@ -46,7 +52,7 @@ void cblas_chemv(const CBLAS_LAYOUT layout, else if (Uplo == CblasLower) UL = 'L'; else { - cblas_xerbla(2, "cblas_chemv","Illegal Uplo setting, %d\n",Uplo ); + API_SUFFIX(cblas_xerbla)(2, "cblas_chemv","Illegal Uplo setting, %d\n",Uplo ); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -114,14 +120,14 @@ void cblas_chemv(const CBLAS_LAYOUT layout, } while(y != st); y -= n; } else - x = (float *) X; + memcpy(&x, &X, sizeof(float*)); if (Uplo == CblasUpper) UL = 'L'; else if (Uplo == CblasLower) UL = 'U'; else { - cblas_xerbla(2, "cblas_chemv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_chemv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -134,7 +140,7 @@ void cblas_chemv(const CBLAS_LAYOUT layout, } else { - cblas_xerbla(1, "cblas_chemv","Illegal layout setting, %d\n", layout); + API_SUFFIX(cblas_xerbla)(1, "cblas_chemv","Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_cher.c b/CBLAS/src/cblas_cher.c index d1cb2068b7..a5da13ba05 100644 --- a/CBLAS/src/cblas_cher.c +++ b/CBLAS/src/cblas_cher.c @@ -7,9 +7,10 @@ */ #include #include +#include #include "cblas.h" #include "cblas_f77.h" -void cblas_cher(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_cher)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_INT N, const float alpha, const void *X, const CBLAS_INT incX ,void *A, const CBLAS_INT lda) { @@ -23,17 +24,22 @@ void cblas_cher(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, #ifdef F77_INT F77_INT F77_N=N, F77_lda=lda, F77_incX=incX; #else + CBLAS_INT incx; #define F77_N N #define F77_lda lda #define F77_incX incx #endif - CBLAS_INT n, i, tincx, incx=incX; - float *x=(float *)X, *xx=(float *)X, *tx, *st; + CBLAS_INT n, i, tincx; + float *x, *xx, *tx, *st; extern int CBLAS_CallFromC; extern int RowMajorStrg; RowMajorStrg = 0; + memcpy(&x,&X,sizeof(float*)); + memcpy(&xx,&X,sizeof(float*)); + + CBLAS_CallFromC = 1; if (layout == CblasColMajor) { @@ -41,7 +47,7 @@ void cblas_cher(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasUpper) UL = 'U'; else { - cblas_xerbla(2, "cblas_cher","Illegal Uplo setting, %d\n",Uplo ); + API_SUFFIX(cblas_xerbla)(2, "cblas_cher","Illegal Uplo setting, %d\n",Uplo ); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -59,7 +65,7 @@ void cblas_cher(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'U'; else { - cblas_xerbla(2, "cblas_cher","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_cher","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -98,11 +104,13 @@ void cblas_cher(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, incx = 1; #endif } - else x = (float *) X; + else + memcpy(&x,&X,sizeof(float*)); + F77_cher(F77_UL, &F77_N, &alpha, x, &F77_incX, A, &F77_lda); } else { - cblas_xerbla(1, "cblas_cher","Illegal layout setting, %d\n", layout); + API_SUFFIX(cblas_xerbla)(1, "cblas_cher","Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_cher2.c b/CBLAS/src/cblas_cher2.c index ff03216d74..f66c93e3d1 100644 --- a/CBLAS/src/cblas_cher2.c +++ b/CBLAS/src/cblas_cher2.c @@ -7,9 +7,10 @@ */ #include #include +#include #include "cblas.h" #include "cblas_f77.h" -void cblas_cher2(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_cher2)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_INT N, const void *alpha, const void *X, const CBLAS_INT incX, const void *Y, const CBLAS_INT incY, void *A, const CBLAS_INT lda) { @@ -23,19 +24,25 @@ void cblas_cher2(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, #ifdef F77_INT F77_INT F77_N=N, F77_lda=lda, F77_incX=incX, F77_incY=incY; #else + CBLAS_INT incx = incX, incy = incY; #define F77_N N #define F77_lda lda #define F77_incX incx #define F77_incY incy #endif - CBLAS_INT n, i, j, tincx, tincy, incx=incX, incy=incY; - float *x=(float *)X, *xx=(float *)X, *y=(float *)Y, - *yy=(float *)Y, *tx, *ty, *stx, *sty; + CBLAS_INT n, i, j, tincx, tincy; + float *x, *xx, *y, + *yy, *tx, *ty, *stx, *sty; extern int CBLAS_CallFromC; extern int RowMajorStrg; RowMajorStrg = 0; + memcpy(&x,&X,sizeof(float*)); + memcpy(&xx,&X,sizeof(float*)); + memcpy(&y,&Y,sizeof(float*)); + memcpy(&yy,&Y,sizeof(float*)); + CBLAS_CallFromC = 1; if (layout == CblasColMajor) { @@ -43,7 +50,7 @@ void cblas_cher2(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasUpper) UL = 'U'; else { - cblas_xerbla(2, "cblas_cher2","Illegal Uplo setting, %d\n",Uplo ); + API_SUFFIX(cblas_xerbla)(2, "cblas_cher2","Illegal Uplo setting, %d\n",Uplo ); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -62,7 +69,7 @@ void cblas_cher2(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'U'; else { - cblas_xerbla(2, "cblas_cher2","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_cher2","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -129,14 +136,14 @@ void cblas_cher2(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, #endif } else { - x = (float *) X; - y = (float *) Y; + memcpy(&x,&X,sizeof(float*)); + memcpy(&y,&Y,sizeof(float*)); } F77_cher2(F77_UL, &F77_N, alpha, y, &F77_incY, x, &F77_incX, A, &F77_lda); } else { - cblas_xerbla(1, "cblas_cher2","Illegal layout setting, %d\n", layout); + API_SUFFIX(cblas_xerbla)(1, "cblas_cher2","Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_cher2k.c b/CBLAS/src/cblas_cher2k.c index a1452a9efe..a4e24abfa1 100644 --- a/CBLAS/src/cblas_cher2k.c +++ b/CBLAS/src/cblas_cher2k.c @@ -9,7 +9,7 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_cher2k(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_cher2k)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE Trans, const CBLAS_INT N, const CBLAS_INT K, const void *alpha, const void *A, const CBLAS_INT lda, const void *B, const CBLAS_INT ldb, const float beta, @@ -37,7 +37,7 @@ void cblas_cher2k(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, extern int CBLAS_CallFromC; extern int RowMajorStrg; float ALPHA[2]; - const float *alp=(float *)alpha; + const float *alp=(const float *)alpha; CBLAS_CallFromC = 1; RowMajorStrg = 0; @@ -49,7 +49,7 @@ void cblas_cher2k(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Uplo == CblasLower ) UL='L'; else { - cblas_xerbla(2, "cblas_cher2k", "Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_cher2k", "Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -60,7 +60,7 @@ void cblas_cher2k(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Trans == CblasNoTrans ) TR='N'; else { - cblas_xerbla(3, "cblas_cher2k", "Illegal Trans setting, %d\n", Trans); + API_SUFFIX(cblas_xerbla)(3, "cblas_cher2k", "Illegal Trans setting, %d\n", Trans); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -80,7 +80,7 @@ void cblas_cher2k(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Uplo == CblasLower ) UL='U'; else { - cblas_xerbla(2, "cblas_cher2k", "Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_cher2k", "Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -90,7 +90,7 @@ void cblas_cher2k(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Trans == CblasNoTrans ) TR='C'; else { - cblas_xerbla(3, "cblas_cher2k", "Illegal Trans setting, %d\n", Trans); + API_SUFFIX(cblas_xerbla)(3, "cblas_cher2k", "Illegal Trans setting, %d\n", Trans); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -104,7 +104,7 @@ void cblas_cher2k(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, ALPHA[1]= -alp[1]; F77_cher2k(F77_UL,F77_TR, &F77_N, &F77_K, ALPHA, A, &F77_lda, B, &F77_ldb, &beta, C, &F77_ldc); } - else cblas_xerbla(1, "cblas_cher2k", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_cher2k", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_cherk.c b/CBLAS/src/cblas_cherk.c index 0395408dc8..4ac61bab26 100644 --- a/CBLAS/src/cblas_cherk.c +++ b/CBLAS/src/cblas_cherk.c @@ -9,7 +9,7 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_cherk(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_cherk)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE Trans, const CBLAS_INT N, const CBLAS_INT K, const float alpha, const void *A, const CBLAS_INT lda, const float beta, void *C, const CBLAS_INT ldc) @@ -43,7 +43,7 @@ void cblas_cherk(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Uplo == CblasLower ) UL='L'; else { - cblas_xerbla(2, "cblas_cherk", "Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_cherk", "Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -54,7 +54,7 @@ void cblas_cherk(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Trans == CblasNoTrans ) TR='N'; else { - cblas_xerbla(3, "cblas_cherk", "Illegal Trans setting, %d\n", Trans); + API_SUFFIX(cblas_xerbla)(3, "cblas_cherk", "Illegal Trans setting, %d\n", Trans); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -74,7 +74,7 @@ void cblas_cherk(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Uplo == CblasLower ) UL='U'; else { - cblas_xerbla(3, "cblas_cherk", "Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(3, "cblas_cherk", "Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -84,7 +84,7 @@ void cblas_cherk(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Trans == CblasNoTrans ) TR='C'; else { - cblas_xerbla(3, "cblas_cherk", "Illegal Trans setting, %d\n", Trans); + API_SUFFIX(cblas_xerbla)(3, "cblas_cherk", "Illegal Trans setting, %d\n", Trans); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -98,7 +98,7 @@ void cblas_cherk(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, F77_cherk(F77_UL, F77_TR, &F77_N, &F77_K, &alpha, A, &F77_lda, &beta, C, &F77_ldc); } - else cblas_xerbla(1, "cblas_cherk", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_cherk", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_chpmv.c b/CBLAS/src/cblas_chpmv.c index f30dafc1bf..6c8e829dea 100644 --- a/CBLAS/src/cblas_chpmv.c +++ b/CBLAS/src/cblas_chpmv.c @@ -7,9 +7,11 @@ */ #include #include +#include + #include "cblas.h" #include "cblas_f77.h" -void cblas_chpmv(const CBLAS_LAYOUT layout, +void API_SUFFIX(cblas_chpmv)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo,const CBLAS_INT N, const void *alpha, const void *AP, const void *X, const CBLAS_INT incX, const void *beta, @@ -24,19 +26,24 @@ void cblas_chpmv(const CBLAS_LAYOUT layout, #ifdef F77_INT F77_INT F77_N=N, F77_incX=incX, F77_incY=incY; #else + CBLAS_INT incx = incX; #define F77_N N #define F77_incX incx #define F77_incY incY #endif - CBLAS_INT n, i=0, incx=incX; - const float *xx= (float *)X, *alp= (float *)alpha, *bet = (float *)beta; + CBLAS_INT n, i=0; + const float *xx= (const float *)X, *alp= (const float *)alpha, *bet = (const float *)beta; float ALPHA[2],BETA[2]; CBLAS_INT tincY, tincx; - float *x=(float *)X, *y=(float *)Y, *st=0, *tx; + float *x, *y, *st=0, *tx; extern int CBLAS_CallFromC; extern int RowMajorStrg; RowMajorStrg = 0; + memcpy(&x,&X,sizeof(float*)); + memcpy(&y,&Y,sizeof(float*)); + + CBLAS_CallFromC = 1; if (layout == CblasColMajor) { @@ -44,7 +51,7 @@ void cblas_chpmv(const CBLAS_LAYOUT layout, else if (Uplo == CblasUpper) UL = 'U'; else { - cblas_xerbla(2, "cblas_chpmv","Illegal Uplo setting, %d\n",Uplo ); + API_SUFFIX(cblas_xerbla)(2, "cblas_chpmv","Illegal Uplo setting, %d\n",Uplo ); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -112,14 +119,13 @@ void cblas_chpmv(const CBLAS_LAYOUT layout, } while(y != st); y -= n; } else - x = (float *) X; - + memcpy(&x,&X,sizeof(float*)); if (Uplo == CblasUpper) UL = 'L'; else if (Uplo == CblasLower) UL = 'U'; else { - cblas_xerbla(2, "cblas_chpmv","Illegal Uplo setting, %d\n", Uplo ); + API_SUFFIX(cblas_xerbla)(2, "cblas_chpmv","Illegal Uplo setting, %d\n", Uplo ); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -133,7 +139,7 @@ void cblas_chpmv(const CBLAS_LAYOUT layout, } else { - cblas_xerbla(1, "cblas_chpmv","Illegal layout setting, %d\n", layout); + API_SUFFIX(cblas_xerbla)(1, "cblas_chpmv","Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_chpr.c b/CBLAS/src/cblas_chpr.c index f2a410270a..ff4220690d 100644 --- a/CBLAS/src/cblas_chpr.c +++ b/CBLAS/src/cblas_chpr.c @@ -7,9 +7,11 @@ */ #include #include +#include + #include "cblas.h" #include "cblas_f77.h" -void cblas_chpr(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_chpr)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_INT N, const float alpha, const void *X, const CBLAS_INT incX, void *A) { @@ -23,16 +25,20 @@ void cblas_chpr(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, #ifdef F77_INT F77_INT F77_N=N, F77_incX=incX; #else + CBLAS_INT incx = incX; #define F77_N N #define F77_incX incx #endif - CBLAS_INT n, i, tincx, incx=incX; - float *x=(float *)X, *xx=(float *)X, *tx, *st; + CBLAS_INT n, i, tincx; + float *x, *xx, *tx, *st; extern int CBLAS_CallFromC; extern int RowMajorStrg; RowMajorStrg = 0; + memcpy(&x,&X,sizeof(float*)); + memcpy(&xx,&X,sizeof(float*)); + CBLAS_CallFromC = 1; if (layout == CblasColMajor) { @@ -40,7 +46,7 @@ void cblas_chpr(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasUpper) UL = 'U'; else { - cblas_xerbla(2, "cblas_chpr","Illegal Uplo setting, %d\n",Uplo ); + API_SUFFIX(cblas_xerbla)(2, "cblas_chpr","Illegal Uplo setting, %d\n",Uplo ); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -58,7 +64,7 @@ void cblas_chpr(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'U'; else { - cblas_xerbla(2, "cblas_chpr","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_chpr","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -96,13 +102,14 @@ void cblas_chpr(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, incx = 1; #endif } - else x = (float *) X; + else + memcpy(&x,&X,sizeof(float*)); F77_chpr(F77_UL, &F77_N, &alpha, x, &F77_incX, A); } else { - cblas_xerbla(1, "cblas_chpr","Illegal layout setting, %d\n", layout); + API_SUFFIX(cblas_xerbla)(1, "cblas_chpr","Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_chpr2.c b/CBLAS/src/cblas_chpr2.c index 4ed87677f4..435738a1c3 100644 --- a/CBLAS/src/cblas_chpr2.c +++ b/CBLAS/src/cblas_chpr2.c @@ -7,9 +7,10 @@ */ #include #include +#include #include "cblas.h" #include "cblas_f77.h" -void cblas_chpr2(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_chpr2)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_INT N,const void *alpha, const void *X, const CBLAS_INT incX,const void *Y, const CBLAS_INT incY, void *Ap) @@ -24,18 +25,25 @@ void cblas_chpr2(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, #ifdef F77_INT F77_INT F77_N=N, F77_incX=incX, F77_incY=incY; #else + CBLAS_INT incx = incX; + CBLAS_INT incy = incY; #define F77_N N #define F77_incX incx #define F77_incY incy #endif - CBLAS_INT n, i, j, tincx, tincy, incx=incX, incy=incY; - float *x=(float *)X, *xx=(float *)X, *y=(float *)Y, - *yy=(float *)Y, *tx, *ty, *stx, *sty; + CBLAS_INT n, i, j, tincx, tincy; + float *x, *xx, *y, + *yy, *tx, *ty, *stx, *sty; extern int CBLAS_CallFromC; extern int RowMajorStrg; RowMajorStrg = 0; + memcpy(&x,&X,sizeof(float*)); + memcpy(&xx,&X,sizeof(float*)); + memcpy(&y,&Y,sizeof(float*)); + memcpy(&yy,&Y,sizeof(float*)); + CBLAS_CallFromC = 1; if (layout == CblasColMajor) { @@ -43,7 +51,7 @@ void cblas_chpr2(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasUpper) UL = 'U'; else { - cblas_xerbla(2, "cblas_chpr2","Illegal Uplo setting, %d\n",Uplo ); + API_SUFFIX(cblas_xerbla)(2, "cblas_chpr2","Illegal Uplo setting, %d\n",Uplo ); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -61,7 +69,7 @@ void cblas_chpr2(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'U'; else { - cblas_xerbla(2, "cblas_chpr2","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_chpr2","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -128,13 +136,13 @@ void cblas_chpr2(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, } else { - x = (float *) X; - y = (void *) Y; + memcpy(&x,&X,sizeof(float*)); + memcpy(&y,&Y,sizeof(float*)); } F77_chpr2(F77_UL, &F77_N, alpha, y, &F77_incY, x, &F77_incX, Ap); } else { - cblas_xerbla(1, "cblas_chpr2","Illegal layout setting, %d\n", layout); + API_SUFFIX(cblas_xerbla)(1, "cblas_chpr2","Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_crotg.c b/CBLAS/src/cblas_crotg.c new file mode 100644 index 0000000000..7f489ccdce --- /dev/null +++ b/CBLAS/src/cblas_crotg.c @@ -0,0 +1,13 @@ +/* + * cblas_crotg.c + * + * The program is a C interface to crotg. + * + */ +#include "cblas.h" +#include "cblas_f77.h" +void API_SUFFIX(cblas_crotg)(void *a, void *b, float *c, void *s) +{ + F77_crotg(a,b,c,s); +} + diff --git a/CBLAS/src/cblas_cscal.c b/CBLAS/src/cblas_cscal.c index 63574ac97b..6e35d5885a 100644 --- a/CBLAS/src/cblas_cscal.c +++ b/CBLAS/src/cblas_cscal.c @@ -8,7 +8,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_cscal( const CBLAS_INT N, const void *alpha, void *X, +void API_SUFFIX(cblas_cscal)( const CBLAS_INT N, const void *alpha, void *X, const CBLAS_INT incX) { #ifdef F77_INT diff --git a/CBLAS/src/cblas_csrot.c b/CBLAS/src/cblas_csrot.c new file mode 100644 index 0000000000..4f6164029a --- /dev/null +++ b/CBLAS/src/cblas_csrot.c @@ -0,0 +1,21 @@ +/* + * cblas_csrot.c + * + * The program is a C interface to csrot. + * + */ +#include "cblas.h" +#include "cblas_f77.h" +void API_SUFFIX(cblas_csrot)(const CBLAS_INT N, void *X, const CBLAS_INT incX, + void *Y, const CBLAS_INT incY, const float c, const float s) +{ +#ifdef F77_INT + F77_INT F77_N=N, F77_incX=incX, F77_incY=incY; +#else + #define F77_N N + #define F77_incX incX + #define F77_incY incY +#endif + F77_csrot(&F77_N, X, &F77_incX, Y, &F77_incY, &c, &s); + return; +} diff --git a/CBLAS/src/cblas_csscal.c b/CBLAS/src/cblas_csscal.c index 19ba383fea..df6952d070 100644 --- a/CBLAS/src/cblas_csscal.c +++ b/CBLAS/src/cblas_csscal.c @@ -8,7 +8,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_csscal( const CBLAS_INT N, const float alpha, void *X, +void API_SUFFIX(cblas_csscal)( const CBLAS_INT N, const float alpha, void *X, const CBLAS_INT incX) { #ifdef F77_INT diff --git a/CBLAS/src/cblas_cswap.c b/CBLAS/src/cblas_cswap.c index 7f45e54b53..8a2bfe5c0f 100644 --- a/CBLAS/src/cblas_cswap.c +++ b/CBLAS/src/cblas_cswap.c @@ -8,7 +8,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_cswap( const CBLAS_INT N, void *X, const CBLAS_INT incX, void *Y, +void API_SUFFIX(cblas_cswap)( const CBLAS_INT N, void *X, const CBLAS_INT incX, void *Y, const CBLAS_INT incY) { #ifdef F77_INT diff --git a/CBLAS/src/cblas_csymm.c b/CBLAS/src/cblas_csymm.c index c277e38f4c..15827e7fca 100644 --- a/CBLAS/src/cblas_csymm.c +++ b/CBLAS/src/cblas_csymm.c @@ -9,7 +9,7 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_csymm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, +void API_SUFFIX(cblas_csymm)(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, const CBLAS_UPLO Uplo, const CBLAS_INT M, const CBLAS_INT N, const void *alpha, const void *A, const CBLAS_INT lda, const void *B, const CBLAS_INT ldb, const void *beta, @@ -45,7 +45,7 @@ void cblas_csymm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Side == CblasLeft ) SD='L'; else { - cblas_xerbla(2, "cblas_csymm", "Illegal Side setting, %d\n", Side); + API_SUFFIX(cblas_xerbla)(2, "cblas_csymm", "Illegal Side setting, %d\n", Side); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -55,7 +55,7 @@ void cblas_csymm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Uplo == CblasLower ) UL='L'; else { - cblas_xerbla(3, "cblas_csymm", "Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(3, "cblas_csymm", "Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -75,7 +75,7 @@ void cblas_csymm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Side == CblasLeft ) SD='R'; else { - cblas_xerbla(2, "cblas_csymm", "Illegal Side setting, %d\n", Side); + API_SUFFIX(cblas_xerbla)(2, "cblas_csymm", "Illegal Side setting, %d\n", Side); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -85,7 +85,7 @@ void cblas_csymm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Uplo == CblasLower ) UL='U'; else { - cblas_xerbla(3, "cblas_csymm", "Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(3, "cblas_csymm", "Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -99,7 +99,7 @@ void cblas_csymm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, F77_csymm(F77_SD, F77_UL, &F77_N, &F77_M, alpha, A, &F77_lda, B, &F77_ldb, beta, C, &F77_ldc); } - else cblas_xerbla(1, "cblas_csymm", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_csymm", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_csyr2k.c b/CBLAS/src/cblas_csyr2k.c index ba960ea414..e564a9043a 100644 --- a/CBLAS/src/cblas_csyr2k.c +++ b/CBLAS/src/cblas_csyr2k.c @@ -9,7 +9,7 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_csyr2k(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_csyr2k)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE Trans, const CBLAS_INT N, const CBLAS_INT K, const void *alpha, const void *A, const CBLAS_INT lda, const void *B, const CBLAS_INT ldb, const void *beta, @@ -46,7 +46,7 @@ void cblas_csyr2k(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Uplo == CblasLower ) UL='L'; else { - cblas_xerbla(2, "cblas_csyr2k", "Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_csyr2k", "Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -57,7 +57,7 @@ void cblas_csyr2k(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Trans == CblasNoTrans ) TR='N'; else { - cblas_xerbla(3, "cblas_csyr2k", "Illegal Trans setting, %d\n", Trans); + API_SUFFIX(cblas_xerbla)(3, "cblas_csyr2k", "Illegal Trans setting, %d\n", Trans); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -78,7 +78,7 @@ void cblas_csyr2k(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Uplo == CblasLower ) UL='U'; else { - cblas_xerbla(3, "cblas_csyr2k", "Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(3, "cblas_csyr2k", "Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -88,7 +88,7 @@ void cblas_csyr2k(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Trans == CblasNoTrans ) TR='T'; else { - cblas_xerbla(3, "cblas_csyr2k", "Illegal Trans setting, %d\n", Trans); + API_SUFFIX(cblas_xerbla)(3, "cblas_csyr2k", "Illegal Trans setting, %d\n", Trans); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -101,7 +101,7 @@ void cblas_csyr2k(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, F77_csyr2k(F77_UL, F77_TR, &F77_N, &F77_K, alpha, A, &F77_lda, B, &F77_ldb, beta, C, &F77_ldc); } - else cblas_xerbla(1, "cblas_csyr2k", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_csyr2k", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_csyrk.c b/CBLAS/src/cblas_csyrk.c index 1e720f0827..21c32d0c3c 100644 --- a/CBLAS/src/cblas_csyrk.c +++ b/CBLAS/src/cblas_csyrk.c @@ -9,7 +9,7 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_csyrk(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_csyrk)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE Trans, const CBLAS_INT N, const CBLAS_INT K, const void *alpha, const void *A, const CBLAS_INT lda, const void *beta, void *C, const CBLAS_INT ldc) @@ -44,7 +44,7 @@ void cblas_csyrk(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Uplo == CblasLower ) UL='L'; else { - cblas_xerbla(2, "cblas_csyrk", "Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_csyrk", "Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -55,7 +55,7 @@ void cblas_csyrk(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Trans == CblasNoTrans ) TR='N'; else { - cblas_xerbla(3, "cblas_csyrk", "Illegal Trans setting, %d\n", Trans); + API_SUFFIX(cblas_xerbla)(3, "cblas_csyrk", "Illegal Trans setting, %d\n", Trans); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -76,7 +76,7 @@ void cblas_csyrk(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Uplo == CblasLower ) UL='U'; else { - cblas_xerbla(3, "cblas_csyrk", "Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(3, "cblas_csyrk", "Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -86,7 +86,7 @@ void cblas_csyrk(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Trans == CblasNoTrans ) TR='T'; else { - cblas_xerbla(3, "cblas_csyrk", "Illegal Trans setting, %d\n", Trans); + API_SUFFIX(cblas_xerbla)(3, "cblas_csyrk", "Illegal Trans setting, %d\n", Trans); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -100,7 +100,7 @@ void cblas_csyrk(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, F77_csyrk(F77_UL, F77_TR, &F77_N, &F77_K, alpha, A, &F77_lda, beta, C, &F77_ldc); } - else cblas_xerbla(1, "cblas_csyrk", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_csyrk", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_ctbmv.c b/CBLAS/src/cblas_ctbmv.c index 5a0571b9bd..d86697b100 100644 --- a/CBLAS/src/cblas_ctbmv.c +++ b/CBLAS/src/cblas_ctbmv.c @@ -7,7 +7,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_ctbmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_ctbmv)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE TransA, const CBLAS_DIAG Diag, const CBLAS_INT N, const CBLAS_INT K, const void *A, const CBLAS_INT lda, void *X, const CBLAS_INT incX) @@ -43,7 +43,7 @@ void cblas_ctbmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'L'; else { - cblas_xerbla(2, "cblas_ctbmv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_ctbmv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -53,7 +53,7 @@ void cblas_ctbmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (TransA == CblasConjTrans) TA = 'C'; else { - cblas_xerbla(3, "cblas_ctbmv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_ctbmv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -62,7 +62,7 @@ void cblas_ctbmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_ctbmv","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(4, "cblas_ctbmv","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -82,7 +82,7 @@ void cblas_ctbmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'U'; else { - cblas_xerbla(2, "cblas_ctbmv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_ctbmv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -114,7 +114,7 @@ void cblas_ctbmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, } else { - cblas_xerbla(3, "cblas_ctbmv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_ctbmv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -124,7 +124,7 @@ void cblas_ctbmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_ctbmv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(4, "cblas_ctbmv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -151,7 +151,7 @@ void cblas_ctbmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, } } } - else cblas_xerbla(1, "cblas_ctbmv", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_ctbmv", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_ctbsv.c b/CBLAS/src/cblas_ctbsv.c index 8faef87850..5aaaabdf25 100644 --- a/CBLAS/src/cblas_ctbsv.c +++ b/CBLAS/src/cblas_ctbsv.c @@ -7,7 +7,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_ctbsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_ctbsv)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE TransA, const CBLAS_DIAG Diag, const CBLAS_INT N, const CBLAS_INT K, const void *A, const CBLAS_INT lda, void *X, const CBLAS_INT incX) @@ -43,7 +43,7 @@ void cblas_ctbsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'L'; else { - cblas_xerbla(2, "cblas_ctbsv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_ctbsv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -53,7 +53,7 @@ void cblas_ctbsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (TransA == CblasConjTrans) TA = 'C'; else { - cblas_xerbla(3, "cblas_ctbsv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_ctbsv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -62,7 +62,7 @@ void cblas_ctbsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_ctbsv","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(4, "cblas_ctbsv","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -82,7 +82,7 @@ void cblas_ctbsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'U'; else { - cblas_xerbla(2, "cblas_ctbsv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_ctbsv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -118,7 +118,7 @@ void cblas_ctbsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, } else { - cblas_xerbla(3, "cblas_ctbsv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_ctbsv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -128,7 +128,7 @@ void cblas_ctbsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_ctbsv","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(4, "cblas_ctbsv","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -155,7 +155,7 @@ void cblas_ctbsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, } } } - else cblas_xerbla(1, "cblas_ctbsv", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_ctbsv", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_ctpmv.c b/CBLAS/src/cblas_ctpmv.c index 6e8d7cc8e7..97a45d383b 100644 --- a/CBLAS/src/cblas_ctpmv.c +++ b/CBLAS/src/cblas_ctpmv.c @@ -7,7 +7,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_ctpmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_ctpmv)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE TransA, const CBLAS_DIAG Diag, const CBLAS_INT N, const void *Ap, void *X, const CBLAS_INT incX) { @@ -40,7 +40,7 @@ void cblas_ctpmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'L'; else { - cblas_xerbla(2, "cblas_ctpmv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_ctpmv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -50,7 +50,7 @@ void cblas_ctpmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (TransA == CblasConjTrans) TA = 'C'; else { - cblas_xerbla(3, "cblas_ctpmv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_ctpmv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -59,7 +59,7 @@ void cblas_ctpmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_ctpmv","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(4, "cblas_ctpmv","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -78,7 +78,7 @@ void cblas_ctpmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'U'; else { - cblas_xerbla(2, "cblas_ctpmv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_ctpmv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -110,7 +110,7 @@ void cblas_ctpmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, } else { - cblas_xerbla(3, "cblas_ctpmv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_ctpmv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -120,7 +120,7 @@ void cblas_ctpmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_ctpmv","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(4, "cblas_ctpmv","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -145,7 +145,7 @@ void cblas_ctpmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, } } } - else cblas_xerbla(1, "cblas_ctpmv", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_ctpmv", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_ctpsv.c b/CBLAS/src/cblas_ctpsv.c index 08091d255a..4b9be145af 100644 --- a/CBLAS/src/cblas_ctpsv.c +++ b/CBLAS/src/cblas_ctpsv.c @@ -7,7 +7,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_ctpsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_ctpsv)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE TransA, const CBLAS_DIAG Diag, const CBLAS_INT N, const void *Ap, void *X, const CBLAS_INT incX) { @@ -40,7 +40,7 @@ void cblas_ctpsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'L'; else { - cblas_xerbla(2, "cblas_ctpsv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_ctpsv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -50,7 +50,7 @@ void cblas_ctpsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (TransA == CblasConjTrans) TA = 'C'; else { - cblas_xerbla(3, "cblas_ctpsv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_ctpsv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -59,7 +59,7 @@ void cblas_ctpsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_ctpsv","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(4, "cblas_ctpsv","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -78,7 +78,7 @@ void cblas_ctpsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'U'; else { - cblas_xerbla(2, "cblas_ctpsv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_ctpsv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -114,7 +114,7 @@ void cblas_ctpsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, } else { - cblas_xerbla(3, "cblas_ctpsv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_ctpsv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -124,7 +124,7 @@ void cblas_ctpsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_ctpsv","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(4, "cblas_ctpsv","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -150,7 +150,7 @@ void cblas_ctpsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, } } } - else cblas_xerbla(1, "cblas_ctpsv", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_ctpsv", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_ctrmm.c b/CBLAS/src/cblas_ctrmm.c index 46a98bb845..75dee5b864 100644 --- a/CBLAS/src/cblas_ctrmm.c +++ b/CBLAS/src/cblas_ctrmm.c @@ -9,7 +9,7 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_ctrmm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, +void API_SUFFIX(cblas_ctrmm)(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE TransA, const CBLAS_DIAG Diag, const CBLAS_INT M, const CBLAS_INT N, const void *alpha, const void *A, const CBLAS_INT lda, @@ -45,7 +45,7 @@ void cblas_ctrmm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Side == CblasLeft ) SD='L'; else { - cblas_xerbla(2, "cblas_ctrmm", "Illegal Side setting, %d\n", Side); + API_SUFFIX(cblas_xerbla)(2, "cblas_ctrmm", "Illegal Side setting, %d\n", Side); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -54,7 +54,7 @@ void cblas_ctrmm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Uplo == CblasLower ) UL='L'; else { - cblas_xerbla(3, "cblas_ctrmm", "Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(3, "cblas_ctrmm", "Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -65,7 +65,7 @@ void cblas_ctrmm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( TransA == CblasNoTrans ) TA='N'; else { - cblas_xerbla(4, "cblas_ctrmm", "Illegal Trans setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(4, "cblas_ctrmm", "Illegal Trans setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -73,7 +73,7 @@ void cblas_ctrmm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, if( Diag == CblasUnit ) DI='U'; else if ( Diag == CblasNonUnit ) DI='N'; - else cblas_xerbla(5, "cblas_ctrmm", + else API_SUFFIX(cblas_xerbla)(5, "cblas_ctrmm", "Illegal Diag setting, %d\n", Diag); #ifdef F77_CHAR @@ -91,7 +91,7 @@ void cblas_ctrmm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Side == CblasLeft ) SD='R'; else { - cblas_xerbla(2, "cblas_ctrmm", "Illegal Side setting, %d\n", Side); + API_SUFFIX(cblas_xerbla)(2, "cblas_ctrmm", "Illegal Side setting, %d\n", Side); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -101,7 +101,7 @@ void cblas_ctrmm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Uplo == CblasLower ) UL='U'; else { - cblas_xerbla(3, "cblas_ctrmm", "Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(3, "cblas_ctrmm", "Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -112,7 +112,7 @@ void cblas_ctrmm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( TransA == CblasNoTrans ) TA='N'; else { - cblas_xerbla(4, "cblas_ctrmm", "Illegal Trans setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(4, "cblas_ctrmm", "Illegal Trans setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -122,7 +122,7 @@ void cblas_ctrmm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Diag == CblasNonUnit ) DI='N'; else { - cblas_xerbla(5, "cblas_ctrmm", "Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(5, "cblas_ctrmm", "Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -137,7 +137,7 @@ void cblas_ctrmm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, F77_ctrmm(F77_SD, F77_UL, F77_TA, F77_DI, &F77_N, &F77_M, alpha, A, &F77_lda, B, &F77_ldb); } - else cblas_xerbla(1, "cblas_ctrmm", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_ctrmm", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_ctrmv.c b/CBLAS/src/cblas_ctrmv.c index 8fcb79a3f1..32dabd786e 100644 --- a/CBLAS/src/cblas_ctrmv.c +++ b/CBLAS/src/cblas_ctrmv.c @@ -7,7 +7,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_ctrmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_ctrmv)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE TransA, const CBLAS_DIAG Diag, const CBLAS_INT N, const void *A, const CBLAS_INT lda, void *X, const CBLAS_INT incX) @@ -43,7 +43,7 @@ void cblas_ctrmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'L'; else { - cblas_xerbla(2, "cblas_ctrmv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_ctrmv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -53,7 +53,7 @@ void cblas_ctrmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (TransA == CblasConjTrans) TA = 'C'; else { - cblas_xerbla(3, "cblas_ctrmv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_ctrmv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -62,7 +62,7 @@ void cblas_ctrmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_ctrmv","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(4, "cblas_ctrmv","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -82,7 +82,7 @@ void cblas_ctrmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'U'; else { - cblas_xerbla(2, "cblas_ctrmv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_ctrmv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -113,7 +113,7 @@ void cblas_ctrmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, } else { - cblas_xerbla(3, "cblas_ctrmv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_ctrmv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -123,7 +123,7 @@ void cblas_ctrmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_ctrmv","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(4, "cblas_ctrmv","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -148,7 +148,7 @@ void cblas_ctrmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, } } } - else cblas_xerbla(1, "cblas_ctrmv", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_ctrmv", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_ctrsm.c b/CBLAS/src/cblas_ctrsm.c index 9e42f9aa00..7d492f2ab4 100644 --- a/CBLAS/src/cblas_ctrsm.c +++ b/CBLAS/src/cblas_ctrsm.c @@ -9,7 +9,7 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_ctrsm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, +void API_SUFFIX(cblas_ctrsm)(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE TransA, const CBLAS_DIAG Diag, const CBLAS_INT M, const CBLAS_INT N, const void *alpha, const void *A, const CBLAS_INT lda, @@ -46,7 +46,7 @@ void cblas_ctrsm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Side == CblasLeft ) SD='L'; else { - cblas_xerbla(2, "cblas_ctrsm", "Illegal Side setting, %d\n", Side); + API_SUFFIX(cblas_xerbla)(2, "cblas_ctrsm", "Illegal Side setting, %d\n", Side); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -56,7 +56,7 @@ void cblas_ctrsm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Uplo == CblasLower ) UL='L'; else { - cblas_xerbla(3, "cblas_ctrsm", "Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(3, "cblas_ctrsm", "Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -67,7 +67,7 @@ void cblas_ctrsm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( TransA == CblasNoTrans ) TA='N'; else { - cblas_xerbla(4, "cblas_ctrsm", "Illegal Trans setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(4, "cblas_ctrsm", "Illegal Trans setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -77,7 +77,7 @@ void cblas_ctrsm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Diag == CblasNonUnit ) DI='N'; else { - cblas_xerbla(5, "cblas_ctrsm", "Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(5, "cblas_ctrsm", "Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -100,7 +100,7 @@ void cblas_ctrsm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Side == CblasLeft ) SD='R'; else { - cblas_xerbla(2, "cblas_ctrsm", "Illegal Side setting, %d\n", Side); + API_SUFFIX(cblas_xerbla)(2, "cblas_ctrsm", "Illegal Side setting, %d\n", Side); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -110,7 +110,7 @@ void cblas_ctrsm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Uplo == CblasLower ) UL='U'; else { - cblas_xerbla(3, "cblas_ctrsm", "Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(3, "cblas_ctrsm", "Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -121,7 +121,7 @@ void cblas_ctrsm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( TransA == CblasNoTrans ) TA='N'; else { - cblas_xerbla(4, "cblas_ctrsm", "Illegal Trans setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(4, "cblas_ctrsm", "Illegal Trans setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -131,7 +131,7 @@ void cblas_ctrsm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Diag == CblasNonUnit ) DI='N'; else { - cblas_xerbla(5, "cblas_ctrsm", "Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(5, "cblas_ctrsm", "Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -148,7 +148,7 @@ void cblas_ctrsm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, F77_ctrsm(F77_SD, F77_UL, F77_TA, F77_DI, &F77_N, &F77_M, alpha, A, &F77_lda, B, &F77_ldb); } - else cblas_xerbla(1, "cblas_ctrsm", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_ctrsm", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_ctrsv.c b/CBLAS/src/cblas_ctrsv.c index e0447d3009..41a9440472 100644 --- a/CBLAS/src/cblas_ctrsv.c +++ b/CBLAS/src/cblas_ctrsv.c @@ -7,7 +7,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_ctrsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_ctrsv)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE TransA, const CBLAS_DIAG Diag, const CBLAS_INT N, const void *A, const CBLAS_INT lda, void *X, const CBLAS_INT incX) @@ -42,7 +42,7 @@ void cblas_ctrsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'L'; else { - cblas_xerbla(2, "cblas_ctrsv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_ctrsv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -52,7 +52,7 @@ void cblas_ctrsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (TransA == CblasConjTrans) TA = 'C'; else { - cblas_xerbla(3, "cblas_ctrsv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_ctrsv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -61,7 +61,7 @@ void cblas_ctrsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_ctrsv","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(4, "cblas_ctrsv","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -81,7 +81,7 @@ void cblas_ctrsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'U'; else { - cblas_xerbla(2, "cblas_ctrsv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_ctrsv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -114,7 +114,7 @@ void cblas_ctrsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, } else { - cblas_xerbla(3, "cblas_ctrsv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_ctrsv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -124,7 +124,7 @@ void cblas_ctrsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_ctrsv","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(4, "cblas_ctrsv","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -149,7 +149,7 @@ void cblas_ctrsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, } } } - else cblas_xerbla(1, "cblas_ctrsv", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_ctrsv", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_dasum.c b/CBLAS/src/cblas_dasum.c index 67e257a7f2..3b7abd06a6 100644 --- a/CBLAS/src/cblas_dasum.c +++ b/CBLAS/src/cblas_dasum.c @@ -9,7 +9,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -double cblas_dasum( const CBLAS_INT N, const double *X, const CBLAS_INT incX) +double API_SUFFIX(cblas_dasum)( const CBLAS_INT N, const double *X, const CBLAS_INT incX) { double asum; #ifdef F77_INT diff --git a/CBLAS/src/cblas_daxpby.c b/CBLAS/src/cblas_daxpby.c new file mode 100644 index 0000000000..a4df635247 --- /dev/null +++ b/CBLAS/src/cblas_daxpby.c @@ -0,0 +1,22 @@ +/* + * cblas_daxpby.c + * + * The program is a C interface to daxpby. + * + * Written by Martin Koehler. 08/26/2024 + * + */ +#include "cblas.h" +#include "cblas_f77.h" +void API_SUFFIX(cblas_daxpby)( const CBLAS_INT N, const double alpha, const double *X, + const CBLAS_INT incX, const double beta, double *Y, const CBLAS_INT incY) +{ +#ifdef F77_INT + F77_INT F77_N=N, F77_incX=incX, F77_incY=incY; +#else + #define F77_N N + #define F77_incX incX + #define F77_incY incY +#endif + F77_daxpby( &F77_N, &alpha, X, &F77_incX, &beta, Y, &F77_incY); +} diff --git a/CBLAS/src/cblas_daxpy.c b/CBLAS/src/cblas_daxpy.c index 1b38e0a936..9ab57c79d3 100644 --- a/CBLAS/src/cblas_daxpy.c +++ b/CBLAS/src/cblas_daxpy.c @@ -8,7 +8,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_daxpy( const CBLAS_INT N, const double alpha, const double *X, +void API_SUFFIX(cblas_daxpy)( const CBLAS_INT N, const double alpha, const double *X, const CBLAS_INT incX, double *Y, const CBLAS_INT incY) { #ifdef F77_INT diff --git a/CBLAS/src/cblas_dcabs1.c b/CBLAS/src/cblas_dcabs1.c new file mode 100644 index 0000000000..35e127ddf1 --- /dev/null +++ b/CBLAS/src/cblas_dcabs1.c @@ -0,0 +1,15 @@ +/* + * cblas_scabs1.c + * + * The program is a C interface to scabs1. + * + */ +#include "cblas.h" +#include "cblas_f77.h" +double API_SUFFIX(cblas_dcabs1)(const void *c) +{ + double cabs1 = 0.0; + F77_dcabs1_sub(c, &cabs1); + return cabs1; +} + diff --git a/CBLAS/src/cblas_dcopy.c b/CBLAS/src/cblas_dcopy.c index 6eaed67ab1..0eec047bea 100644 --- a/CBLAS/src/cblas_dcopy.c +++ b/CBLAS/src/cblas_dcopy.c @@ -8,7 +8,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_dcopy( const CBLAS_INT N, const double *X, +void API_SUFFIX(cblas_dcopy)( const CBLAS_INT N, const double *X, const CBLAS_INT incX, double *Y, const CBLAS_INT incY) { #ifdef F77_INT diff --git a/CBLAS/src/cblas_ddot.c b/CBLAS/src/cblas_ddot.c index c2035a0a7c..54afaadc25 100644 --- a/CBLAS/src/cblas_ddot.c +++ b/CBLAS/src/cblas_ddot.c @@ -9,7 +9,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -double cblas_ddot( const CBLAS_INT N, const double *X, +double API_SUFFIX(cblas_ddot)( const CBLAS_INT N, const double *X, const CBLAS_INT incX, const double *Y, const CBLAS_INT incY) { double dot; diff --git a/CBLAS/src/cblas_dgbmv.c b/CBLAS/src/cblas_dgbmv.c index ef2eeff18c..a0fc8d7aa1 100644 --- a/CBLAS/src/cblas_dgbmv.c +++ b/CBLAS/src/cblas_dgbmv.c @@ -8,7 +8,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_dgbmv(const CBLAS_LAYOUT layout, +void API_SUFFIX(cblas_dgbmv)(const CBLAS_LAYOUT layout, const CBLAS_TRANSPOSE TransA, const CBLAS_INT M, const CBLAS_INT N, const CBLAS_INT KL, const CBLAS_INT KU, const double alpha, const double *A, const CBLAS_INT lda, @@ -45,7 +45,7 @@ void cblas_dgbmv(const CBLAS_LAYOUT layout, else if (TransA == CblasConjTrans) TA = 'C'; else { - cblas_xerbla(2, "cblas_dgbmv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(2, "cblas_dgbmv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -64,7 +64,7 @@ void cblas_dgbmv(const CBLAS_LAYOUT layout, else if (TransA == CblasConjTrans) TA = 'N'; else { - cblas_xerbla(2, "cblas_dgbmv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(2, "cblas_dgbmv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -75,7 +75,7 @@ void cblas_dgbmv(const CBLAS_LAYOUT layout, F77_dgbmv(F77_TA, &F77_N, &F77_M, &F77_KU, &F77_KL, &alpha, A ,&F77_lda, X,&F77_incX, &beta, Y, &F77_incY); } - else cblas_xerbla(1, "cblas_dgbmv", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_dgbmv", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; } diff --git a/CBLAS/src/cblas_dgemm.c b/CBLAS/src/cblas_dgemm.c index 1dce9cf3e8..c4ae0275c2 100644 --- a/CBLAS/src/cblas_dgemm.c +++ b/CBLAS/src/cblas_dgemm.c @@ -9,7 +9,7 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_dgemm(const CBLAS_LAYOUT layout, const CBLAS_TRANSPOSE TransA, +void API_SUFFIX(cblas_dgemm)(const CBLAS_LAYOUT layout, const CBLAS_TRANSPOSE TransA, const CBLAS_TRANSPOSE TransB, const CBLAS_INT M, const CBLAS_INT N, const CBLAS_INT K, const double alpha, const double *A, const CBLAS_INT lda, const double *B, const CBLAS_INT ldb, @@ -47,7 +47,7 @@ void cblas_dgemm(const CBLAS_LAYOUT layout, const CBLAS_TRANSPOSE TransA, else if ( TransA == CblasNoTrans ) TA='N'; else { - cblas_xerbla(2, "cblas_dgemm","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(2, "cblas_dgemm","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -58,7 +58,7 @@ void cblas_dgemm(const CBLAS_LAYOUT layout, const CBLAS_TRANSPOSE TransA, else if ( TransB == CblasNoTrans ) TB='N'; else { - cblas_xerbla(3, "cblas_dgemm","Illegal TransB setting, %d\n", TransB); + API_SUFFIX(cblas_xerbla)(3, "cblas_dgemm","Illegal TransB setting, %d\n", TransB); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -79,7 +79,7 @@ void cblas_dgemm(const CBLAS_LAYOUT layout, const CBLAS_TRANSPOSE TransA, else if ( TransA == CblasNoTrans ) TB='N'; else { - cblas_xerbla(2, "cblas_dgemm","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(2, "cblas_dgemm","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -89,7 +89,7 @@ void cblas_dgemm(const CBLAS_LAYOUT layout, const CBLAS_TRANSPOSE TransA, else if ( TransB == CblasNoTrans ) TA='N'; else { - cblas_xerbla(2, "cblas_dgemm","Illegal TransB setting, %d\n", TransB); + API_SUFFIX(cblas_xerbla)(3, "cblas_dgemm","Illegal TransB setting, %d\n", TransB); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -102,7 +102,7 @@ void cblas_dgemm(const CBLAS_LAYOUT layout, const CBLAS_TRANSPOSE TransA, F77_dgemm(F77_TA, F77_TB, &F77_N, &F77_M, &F77_K, &alpha, B, &F77_ldb, A, &F77_lda, &beta, C, &F77_ldc); } - else cblas_xerbla(1, "cblas_dgemm", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_dgemm", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_dgemmtr.c b/CBLAS/src/cblas_dgemmtr.c new file mode 100644 index 0000000000..d64c664ba2 --- /dev/null +++ b/CBLAS/src/cblas_dgemmtr.c @@ -0,0 +1,134 @@ +/* + * + * cblas_dgemmtr.c + * This program is a C interface to dgemmtr. + * Written by Martin Koehler, MPI Magdeburg + * 06/24/2024 + * + */ + +#include "cblas.h" +#include "cblas_f77.h" +void API_SUFFIX(cblas_dgemmtr)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE TransA, + const CBLAS_TRANSPOSE TransB, const CBLAS_INT N, + const CBLAS_INT K, const double alpha, const double *A, + const CBLAS_INT lda, const double *B, const CBLAS_INT ldb, + const double beta, double *C, const CBLAS_INT ldc) +{ + char TA, TB, UL; +#ifdef F77_CHAR + F77_CHAR F77_TA, F77_TB. F77_UL; +#else +#define F77_TA &TA +#define F77_TB &TB +#define F77_UL &UL +#endif + +#ifdef F77_INT + F77_INT F77_N=N, F77_K=K, F77_lda=lda, F77_ldb=ldb; + F77_INT F77_ldc=ldc; +#else +#define F77_N N +#define F77_K K +#define F77_lda lda +#define F77_ldb ldb +#define F77_ldc ldc +#endif + + extern int CBLAS_CallFromC; + extern int RowMajorStrg; + RowMajorStrg = 0; + CBLAS_CallFromC = 1; + + + if( layout == CblasColMajor ) + { + if ( Uplo == CblasUpper ) UL = 'U'; + else if (Uplo == CblasLower) UL= 'L'; + else { + API_SUFFIX(cblas_xerbla)(2, "cblas_dgemmtr", "Illegal Uplo setting, %d\n", Uplo); + CBLAS_CallFromC = 0; + RowMajorStrg = 0; + return; + } + + + + if(TransA == CblasTrans) TA='T'; + else if ( TransA == CblasConjTrans ) TA='C'; + else if ( TransA == CblasNoTrans ) TA='N'; + else + { + API_SUFFIX(cblas_xerbla)(3, "cblas_dgemmtr","Illegal TransA setting, %d\n", TransA); + CBLAS_CallFromC = 0; + RowMajorStrg = 0; + return; + } + + if(TransB == CblasTrans) TB='T'; + else if ( TransB == CblasConjTrans ) TB='C'; + else if ( TransB == CblasNoTrans ) TB='N'; + else + { + API_SUFFIX(cblas_xerbla)(4, "cblas_dgemmtr","Illegal TransB setting, %d\n", TransB); + CBLAS_CallFromC = 0; + RowMajorStrg = 0; + return; + } + +#ifdef F77_CHAR + F77_TA = C2F_CHAR(&TA); + F77_TB = C2F_CHAR(&TB); + F77_UL = C2F_CHAR(&UL); +#endif + + F77_dgemmtr(F77_UL, F77_TA, F77_TB, &F77_N, &F77_K, &alpha, A, + &F77_lda, B, &F77_ldb, &beta, C, &F77_ldc); + } + else if (layout == CblasRowMajor) + { + if ( Uplo == CblasUpper ) UL = 'L'; + else if (Uplo == CblasLower) UL= 'U'; + else { + API_SUFFIX(cblas_xerbla)(2, "cblas_dgemmtr", "Illegal Uplo setting, %d\n", Uplo); + CBLAS_CallFromC = 0; + RowMajorStrg = 0; + return; + } + + + RowMajorStrg = 1; + if(TransA == CblasTrans) TB='T'; + else if ( TransA == CblasConjTrans ) TB='C'; + else if ( TransA == CblasNoTrans ) TB='N'; + else + { + API_SUFFIX(cblas_xerbla)(3, "cblas_dgemmtr","Illegal TransA setting, %d\n", TransA); + CBLAS_CallFromC = 0; + RowMajorStrg = 0; + return; + } + if(TransB == CblasTrans) TA='T'; + else if ( TransB == CblasConjTrans ) TA='C'; + else if ( TransB == CblasNoTrans ) TA='N'; + else + { + API_SUFFIX(cblas_xerbla)(4, "cblas_dgemmtr","Illegal TransB setting, %d\n", TransB); + CBLAS_CallFromC = 0; + RowMajorStrg = 0; + return; + } +#ifdef F77_CHAR + F77_TA = C2F_CHAR(&TA); + F77_TB = C2F_CHAR(&TB); + F77_UL = C2F_CHAR(&UL); +#endif + + F77_dgemmtr( F77_UL, F77_TA, F77_TB, &F77_N, &F77_K, &alpha, B, + &F77_ldb, A, &F77_lda, &beta, C, &F77_ldc); + } + else API_SUFFIX(cblas_xerbla)(1, "cblas_dgemmtr", "Illegal layout setting, %d\n", layout); + CBLAS_CallFromC = 0; + RowMajorStrg = 0; + return; +} diff --git a/CBLAS/src/cblas_dgemv.c b/CBLAS/src/cblas_dgemv.c index c5d10b791e..80edd756b0 100644 --- a/CBLAS/src/cblas_dgemv.c +++ b/CBLAS/src/cblas_dgemv.c @@ -8,7 +8,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_dgemv(const CBLAS_LAYOUT layout, +void API_SUFFIX(cblas_dgemv)(const CBLAS_LAYOUT layout, const CBLAS_TRANSPOSE TransA, const CBLAS_INT M, const CBLAS_INT N, const double alpha, const double *A, const CBLAS_INT lda, const double *X, const CBLAS_INT incX, const double beta, @@ -41,7 +41,7 @@ void cblas_dgemv(const CBLAS_LAYOUT layout, else if (TransA == CblasConjTrans) TA = 'C'; else { - cblas_xerbla(2, "cblas_dgemv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(2, "cblas_dgemv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -60,7 +60,7 @@ void cblas_dgemv(const CBLAS_LAYOUT layout, else if (TransA == CblasConjTrans) TA = 'N'; else { - cblas_xerbla(2, "cblas_dgemv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(2, "cblas_dgemv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -71,7 +71,7 @@ void cblas_dgemv(const CBLAS_LAYOUT layout, F77_dgemv(F77_TA, &F77_N, &F77_M, &alpha, A, &F77_lda, X, &F77_incX, &beta, Y, &F77_incY); } - else cblas_xerbla(1, "cblas_dgemv", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_dgemv", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_dger.c b/CBLAS/src/cblas_dger.c index fa69dcbb20..8e5d687791 100644 --- a/CBLAS/src/cblas_dger.c +++ b/CBLAS/src/cblas_dger.c @@ -9,7 +9,7 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_dger(const CBLAS_LAYOUT layout, const CBLAS_INT M, const CBLAS_INT N, +void API_SUFFIX(cblas_dger)(const CBLAS_LAYOUT layout, const CBLAS_INT M, const CBLAS_INT N, const double alpha, const double *X, const CBLAS_INT incX, const double *Y, const CBLAS_INT incY, double *A, const CBLAS_INT lda) { @@ -40,7 +40,7 @@ void cblas_dger(const CBLAS_LAYOUT layout, const CBLAS_INT M, const CBLAS_INT N, &F77_lda); } - else cblas_xerbla(1, "cblas_dger", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_dger", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_dnrm2.c b/CBLAS/src/cblas_dnrm2.c index 48bb1657dd..3fafa48e5c 100644 --- a/CBLAS/src/cblas_dnrm2.c +++ b/CBLAS/src/cblas_dnrm2.c @@ -9,7 +9,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -double cblas_dnrm2( const CBLAS_INT N, const double *X, const CBLAS_INT incX) +double API_SUFFIX(cblas_dnrm2)( const CBLAS_INT N, const double *X, const CBLAS_INT incX) { double nrm2; #ifdef F77_INT diff --git a/CBLAS/src/cblas_drot.c b/CBLAS/src/cblas_drot.c index 0ecdcb316c..410aece4d6 100644 --- a/CBLAS/src/cblas_drot.c +++ b/CBLAS/src/cblas_drot.c @@ -8,7 +8,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_drot(const CBLAS_INT N, double *X, const CBLAS_INT incX, +void API_SUFFIX(cblas_drot)(const CBLAS_INT N, double *X, const CBLAS_INT incX, double *Y, const CBLAS_INT incY, const double c, const double s) { #ifdef F77_INT diff --git a/CBLAS/src/cblas_drotg.c b/CBLAS/src/cblas_drotg.c index a433f4844f..01e5c202ac 100644 --- a/CBLAS/src/cblas_drotg.c +++ b/CBLAS/src/cblas_drotg.c @@ -8,7 +8,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_drotg( double *a, double *b, double *c, double *s) +void API_SUFFIX(cblas_drotg)( double *a, double *b, double *c, double *s) { F77_drotg(a,b,c,s); } diff --git a/CBLAS/src/cblas_drotm.c b/CBLAS/src/cblas_drotm.c index 70ac6c1cd9..a9646d775f 100644 --- a/CBLAS/src/cblas_drotm.c +++ b/CBLAS/src/cblas_drotm.c @@ -1,6 +1,6 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_drotm( const CBLAS_INT N, double *X, const CBLAS_INT incX, double *Y, +void API_SUFFIX(cblas_drotm)( const CBLAS_INT N, double *X, const CBLAS_INT incX, double *Y, const CBLAS_INT incY, const double *P) { #ifdef F77_INT diff --git a/CBLAS/src/cblas_drotmg.c b/CBLAS/src/cblas_drotmg.c index ad33ba4fd2..f04042ee9b 100644 --- a/CBLAS/src/cblas_drotmg.c +++ b/CBLAS/src/cblas_drotmg.c @@ -8,7 +8,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_drotmg( double *d1, double *d2, double *b1, +void API_SUFFIX(cblas_drotmg)( double *d1, double *d2, double *b1, const double b2, double *p) { F77_drotmg(d1,d2,b1,&b2,p); diff --git a/CBLAS/src/cblas_dsbmv.c b/CBLAS/src/cblas_dsbmv.c index 1502142c11..7bccfae362 100644 --- a/CBLAS/src/cblas_dsbmv.c +++ b/CBLAS/src/cblas_dsbmv.c @@ -9,7 +9,7 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_dsbmv(const CBLAS_LAYOUT layout, +void API_SUFFIX(cblas_dsbmv)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_INT N, const CBLAS_INT K, const double alpha, const double *A, const CBLAS_INT lda, const double *X, const CBLAS_INT incX, const double beta, @@ -41,7 +41,7 @@ void cblas_dsbmv(const CBLAS_LAYOUT layout, else if (Uplo == CblasLower) UL = 'L'; else { - cblas_xerbla(2, "cblas_dsbmv","Illegal Uplo setting, %d\n",Uplo ); + API_SUFFIX(cblas_xerbla)(2, "cblas_dsbmv","Illegal Uplo setting, %d\n",Uplo ); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -59,7 +59,7 @@ void cblas_dsbmv(const CBLAS_LAYOUT layout, else if (Uplo == CblasLower) UL = 'U'; else { - cblas_xerbla(2, "cblas_dsbmv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_dsbmv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -70,7 +70,7 @@ void cblas_dsbmv(const CBLAS_LAYOUT layout, F77_dsbmv(F77_UL, &F77_N, &F77_K, &alpha, A ,&F77_lda, X,&F77_incX, &beta, Y, &F77_incY); } - else cblas_xerbla(1, "cblas_dsbmv", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_dsbmv", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_dscal.c b/CBLAS/src/cblas_dscal.c index b0ecfd4c2c..b5b0d44dfc 100644 --- a/CBLAS/src/cblas_dscal.c +++ b/CBLAS/src/cblas_dscal.c @@ -8,7 +8,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_dscal( const CBLAS_INT N, const double alpha, double *X, +void API_SUFFIX(cblas_dscal)( const CBLAS_INT N, const double alpha, double *X, const CBLAS_INT incX) { #ifdef F77_INT diff --git a/CBLAS/src/cblas_dsdot.c b/CBLAS/src/cblas_dsdot.c index 7141c6f729..f3ce05d244 100644 --- a/CBLAS/src/cblas_dsdot.c +++ b/CBLAS/src/cblas_dsdot.c @@ -9,7 +9,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -double cblas_dsdot( const CBLAS_INT N, const float *X, +double API_SUFFIX(cblas_dsdot)( const CBLAS_INT N, const float *X, const CBLAS_INT incX, const float *Y, const CBLAS_INT incY) { double dot; diff --git a/CBLAS/src/cblas_dspmv.c b/CBLAS/src/cblas_dspmv.c index 864a8883df..14a9a8d31a 100644 --- a/CBLAS/src/cblas_dspmv.c +++ b/CBLAS/src/cblas_dspmv.c @@ -10,7 +10,7 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_dspmv(const CBLAS_LAYOUT layout, +void API_SUFFIX(cblas_dspmv)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_INT N, const double alpha, const double *AP, const double *X, const CBLAS_INT incX, const double beta, @@ -40,7 +40,7 @@ void cblas_dspmv(const CBLAS_LAYOUT layout, else if (Uplo == CblasLower) UL = 'L'; else { - cblas_xerbla(2, "cblas_dspmv","Illegal Uplo setting, %d\n",Uplo ); + API_SUFFIX(cblas_xerbla)(2, "cblas_dspmv","Illegal Uplo setting, %d\n",Uplo ); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -58,7 +58,7 @@ void cblas_dspmv(const CBLAS_LAYOUT layout, else if (Uplo == CblasLower) UL = 'U'; else { - cblas_xerbla(2, "cblas_dspmv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_dspmv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -69,7 +69,7 @@ void cblas_dspmv(const CBLAS_LAYOUT layout, F77_dspmv(F77_UL, &F77_N, &alpha, AP, X,&F77_incX, &beta, Y, &F77_incY); } - else cblas_xerbla(1, "cblas_dspmv", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_dspmv", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_dspr.c b/CBLAS/src/cblas_dspr.c index 5140bc0771..ef33968519 100644 --- a/CBLAS/src/cblas_dspr.c +++ b/CBLAS/src/cblas_dspr.c @@ -9,7 +9,7 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_dspr(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_dspr)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_INT N, const double alpha, const double *X, const CBLAS_INT incX, double *Ap) { @@ -36,7 +36,7 @@ void cblas_dspr(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasUpper) UL = 'U'; else { - cblas_xerbla(2, "cblas_dspr","Illegal Uplo setting, %d\n",Uplo ); + API_SUFFIX(cblas_xerbla)(2, "cblas_dspr","Illegal Uplo setting, %d\n",Uplo ); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -54,7 +54,7 @@ void cblas_dspr(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasUpper) UL = 'L'; else { - cblas_xerbla(2, "cblas_dspr","Illegal Uplo setting, %d\n",Uplo ); + API_SUFFIX(cblas_xerbla)(2, "cblas_dspr","Illegal Uplo setting, %d\n",Uplo ); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -63,7 +63,7 @@ void cblas_dspr(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, F77_UL = C2F_CHAR(&UL); #endif F77_dspr(F77_UL, &F77_N, &alpha, X, &F77_incX, Ap); - } else cblas_xerbla(1, "cblas_dspr", "Illegal layout setting, %d\n", layout); + } else API_SUFFIX(cblas_xerbla)(1, "cblas_dspr", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_dspr2.c b/CBLAS/src/cblas_dspr2.c index 07cde29cfe..e18c6672f1 100644 --- a/CBLAS/src/cblas_dspr2.c +++ b/CBLAS/src/cblas_dspr2.c @@ -7,7 +7,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_dspr2(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_dspr2)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_INT N, const double alpha, const double *X, const CBLAS_INT incX, const double *Y, const CBLAS_INT incY, double *A) { @@ -36,7 +36,7 @@ void cblas_dspr2(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasUpper) UL = 'U'; else { - cblas_xerbla(2, "cblas_dspr2","Illegal Uplo setting, %d\n",Uplo ); + API_SUFFIX(cblas_xerbla)(2, "cblas_dspr2","Illegal Uplo setting, %d\n",Uplo ); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -54,7 +54,7 @@ void cblas_dspr2(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasUpper) UL = 'L'; else { - cblas_xerbla(2, "cblas_dspr2","Illegal Uplo setting, %d\n",Uplo ); + API_SUFFIX(cblas_xerbla)(2, "cblas_dspr2","Illegal Uplo setting, %d\n",Uplo ); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -63,7 +63,7 @@ void cblas_dspr2(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, F77_UL = C2F_CHAR(&UL); #endif F77_dspr2(F77_UL, &F77_N, &alpha, X, &F77_incX, Y, &F77_incY, A); - } else cblas_xerbla(1, "cblas_dspr2", "Illegal layout setting, %d\n", layout); + } else API_SUFFIX(cblas_xerbla)(1, "cblas_dspr2", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_dswap.c b/CBLAS/src/cblas_dswap.c index 7a586f2f67..e78fd2face 100644 --- a/CBLAS/src/cblas_dswap.c +++ b/CBLAS/src/cblas_dswap.c @@ -8,7 +8,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_dswap( const CBLAS_INT N, double *X, const CBLAS_INT incX, double *Y, +void API_SUFFIX(cblas_dswap)( const CBLAS_INT N, double *X, const CBLAS_INT incX, double *Y, const CBLAS_INT incY) { #ifdef F77_INT diff --git a/CBLAS/src/cblas_dsymm.c b/CBLAS/src/cblas_dsymm.c index 54a549867a..3bab6f659e 100644 --- a/CBLAS/src/cblas_dsymm.c +++ b/CBLAS/src/cblas_dsymm.c @@ -9,7 +9,7 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_dsymm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, +void API_SUFFIX(cblas_dsymm)(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, const CBLAS_UPLO Uplo, const CBLAS_INT M, const CBLAS_INT N, const double alpha, const double *A, const CBLAS_INT lda, const double *B, const CBLAS_INT ldb, const double beta, @@ -45,7 +45,7 @@ void cblas_dsymm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Side == CblasLeft ) SD='L'; else { - cblas_xerbla(2, "cblas_dsymm","Illegal Side setting, %d\n", Side); + API_SUFFIX(cblas_xerbla)(2, "cblas_dsymm","Illegal Side setting, %d\n", Side); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -55,7 +55,7 @@ void cblas_dsymm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Uplo == CblasLower ) UL='L'; else { - cblas_xerbla(3, "cblas_dsymm","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(3, "cblas_dsymm","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -75,7 +75,7 @@ void cblas_dsymm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Side == CblasLeft ) SD='R'; else { - cblas_xerbla(2, "cblas_dsymm","Illegal Side setting, %d\n", Side); + API_SUFFIX(cblas_xerbla)(2, "cblas_dsymm","Illegal Side setting, %d\n", Side); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -85,7 +85,7 @@ void cblas_dsymm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Uplo == CblasLower ) UL='U'; else { - cblas_xerbla(3, "cblas_dsymm","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(3, "cblas_dsymm","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -99,7 +99,7 @@ void cblas_dsymm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, F77_dsymm(F77_SD, F77_UL, &F77_N, &F77_M, &alpha, A, &F77_lda, B, &F77_ldb, &beta, C, &F77_ldc); } - else cblas_xerbla(1, "cblas_dsymm","Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_dsymm","Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_dsymv.c b/CBLAS/src/cblas_dsymv.c index 327a02e6f8..18607d3637 100644 --- a/CBLAS/src/cblas_dsymv.c +++ b/CBLAS/src/cblas_dsymv.c @@ -9,7 +9,7 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_dsymv(const CBLAS_LAYOUT layout, +void API_SUFFIX(cblas_dsymv)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_INT N, const double alpha, const double *A, const CBLAS_INT lda, const double *X, const CBLAS_INT incX, const double beta, @@ -40,7 +40,7 @@ void cblas_dsymv(const CBLAS_LAYOUT layout, else if (Uplo == CblasLower) UL = 'L'; else { - cblas_xerbla(2, "cblas_dsymv","Illegal Uplo setting, %d\n",Uplo ); + API_SUFFIX(cblas_xerbla)(2, "cblas_dsymv","Illegal Uplo setting, %d\n",Uplo ); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -58,7 +58,7 @@ void cblas_dsymv(const CBLAS_LAYOUT layout, else if (Uplo == CblasLower) UL = 'U'; else { - cblas_xerbla(2, "cblas_dsymv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_dsymv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -69,7 +69,7 @@ void cblas_dsymv(const CBLAS_LAYOUT layout, F77_dsymv(F77_UL, &F77_N, &alpha, A ,&F77_lda, X,&F77_incX, &beta, Y, &F77_incY); } - else cblas_xerbla(1, "cblas_dsymv", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_dsymv", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_dsyr.c b/CBLAS/src/cblas_dsyr.c index d58c301735..383d41419c 100644 --- a/CBLAS/src/cblas_dsyr.c +++ b/CBLAS/src/cblas_dsyr.c @@ -9,7 +9,7 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_dsyr(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_dsyr)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_INT N, const double alpha, const double *X, const CBLAS_INT incX, double *A, const CBLAS_INT lda) { @@ -37,7 +37,7 @@ void cblas_dsyr(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasUpper) UL = 'U'; else { - cblas_xerbla(2, "cblas_dsyr","Illegal Uplo setting, %d\n",Uplo ); + API_SUFFIX(cblas_xerbla)(2, "cblas_dsyr","Illegal Uplo setting, %d\n",Uplo ); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -55,7 +55,7 @@ void cblas_dsyr(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasUpper) UL = 'L'; else { - cblas_xerbla(2, "cblas_dsyr","Illegal Uplo setting, %d\n",Uplo ); + API_SUFFIX(cblas_xerbla)(2, "cblas_dsyr","Illegal Uplo setting, %d\n",Uplo ); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -64,7 +64,7 @@ void cblas_dsyr(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, F77_UL = C2F_CHAR(&UL); #endif F77_dsyr(F77_UL, &F77_N, &alpha, X, &F77_incX, A, &F77_lda); - } else cblas_xerbla(1, "cblas_dsyr", "Illegal layout setting, %d\n", layout); + } else API_SUFFIX(cblas_xerbla)(1, "cblas_dsyr", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_dsyr2.c b/CBLAS/src/cblas_dsyr2.c index 96ae1f80f0..db85bf5216 100644 --- a/CBLAS/src/cblas_dsyr2.c +++ b/CBLAS/src/cblas_dsyr2.c @@ -9,7 +9,7 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_dsyr2(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_dsyr2)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_INT N, const double alpha, const double *X, const CBLAS_INT incX, const double *Y, const CBLAS_INT incY, double *A, const CBLAS_INT lda) @@ -40,7 +40,7 @@ void cblas_dsyr2(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasUpper) UL = 'U'; else { - cblas_xerbla(2, "cblas_dsyr2","Illegal Uplo setting, %d\n",Uplo ); + API_SUFFIX(cblas_xerbla)(2, "cblas_dsyr2","Illegal Uplo setting, %d\n",Uplo ); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -59,7 +59,7 @@ void cblas_dsyr2(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasUpper) UL = 'L'; else { - cblas_xerbla(2, "cblas_dsyr2","Illegal Uplo setting, %d\n",Uplo ); + API_SUFFIX(cblas_xerbla)(2, "cblas_dsyr2","Illegal Uplo setting, %d\n",Uplo ); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -69,7 +69,7 @@ void cblas_dsyr2(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, #endif F77_dsyr2(F77_UL, &F77_N, &alpha, X, &F77_incX, Y, &F77_incY, A, &F77_lda); - } else cblas_xerbla(1, "cblas_dsyr2", "Illegal layout setting, %d\n", layout); + } else API_SUFFIX(cblas_xerbla)(1, "cblas_dsyr2", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_dsyr2k.c b/CBLAS/src/cblas_dsyr2k.c index 3de741dd8e..85e01b2714 100644 --- a/CBLAS/src/cblas_dsyr2k.c +++ b/CBLAS/src/cblas_dsyr2k.c @@ -9,7 +9,7 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_dsyr2k(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_dsyr2k)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE Trans, const CBLAS_INT N, const CBLAS_INT K, const double alpha, const double *A, const CBLAS_INT lda, const double *B, const CBLAS_INT ldb, const double beta, @@ -46,7 +46,7 @@ void cblas_dsyr2k(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Uplo == CblasLower ) UL='L'; else { - cblas_xerbla(2, "cblas_dsyr2k","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_dsyr2k","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -57,7 +57,7 @@ void cblas_dsyr2k(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Trans == CblasNoTrans ) TR='N'; else { - cblas_xerbla(3, "cblas_dsyr2k","Illegal Trans setting, %d\n", Trans); + API_SUFFIX(cblas_xerbla)(3, "cblas_dsyr2k","Illegal Trans setting, %d\n", Trans); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -78,7 +78,7 @@ void cblas_dsyr2k(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Uplo == CblasLower ) UL='U'; else { - cblas_xerbla(3, "cblas_dsyr2k","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(3, "cblas_dsyr2k","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -88,7 +88,7 @@ void cblas_dsyr2k(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Trans == CblasNoTrans ) TR='T'; else { - cblas_xerbla(3, "cblas_dsyr2k","Illegal Trans setting, %d\n", Trans); + API_SUFFIX(cblas_xerbla)(3, "cblas_dsyr2k","Illegal Trans setting, %d\n", Trans); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -102,7 +102,7 @@ void cblas_dsyr2k(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, F77_dsyr2k(F77_UL, F77_TR, &F77_N, &F77_K, &alpha, A, &F77_lda, B, &F77_ldb, &beta, C, &F77_ldc); } - else cblas_xerbla(1, "cblas_dsyr2k","Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_dsyr2k","Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_dsyrk.c b/CBLAS/src/cblas_dsyrk.c index 835b9eedb7..dfca582148 100644 --- a/CBLAS/src/cblas_dsyrk.c +++ b/CBLAS/src/cblas_dsyrk.c @@ -9,7 +9,7 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_dsyrk(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_dsyrk)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE Trans, const CBLAS_INT N, const CBLAS_INT K, const double alpha, const double *A, const CBLAS_INT lda, const double beta, double *C, const CBLAS_INT ldc) @@ -44,7 +44,7 @@ void cblas_dsyrk(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Uplo == CblasLower ) UL='L'; else { - cblas_xerbla(2, "cblas_dsyrk","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_dsyrk","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -55,7 +55,7 @@ void cblas_dsyrk(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Trans == CblasNoTrans ) TR='N'; else { - cblas_xerbla(3, "cblas_dsyrk","Illegal Trans setting, %d\n", Trans); + API_SUFFIX(cblas_xerbla)(3, "cblas_dsyrk","Illegal Trans setting, %d\n", Trans); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -76,7 +76,7 @@ void cblas_dsyrk(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Uplo == CblasLower ) UL='U'; else { - cblas_xerbla(3, "cblas_dsyrk","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(3, "cblas_dsyrk","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -86,7 +86,7 @@ void cblas_dsyrk(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Trans == CblasNoTrans ) TR='T'; else { - cblas_xerbla(3, "cblas_dsyrk","Illegal Trans setting, %d\n", Trans); + API_SUFFIX(cblas_xerbla)(3, "cblas_dsyrk","Illegal Trans setting, %d\n", Trans); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -100,7 +100,7 @@ void cblas_dsyrk(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, F77_dsyrk(F77_UL, F77_TR, &F77_N, &F77_K, &alpha, A, &F77_lda, &beta, C, &F77_ldc); } - else cblas_xerbla(1, "cblas_dsyrk","Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_dsyrk","Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_dtbmv.c b/CBLAS/src/cblas_dtbmv.c index badcc20189..dea9165d96 100644 --- a/CBLAS/src/cblas_dtbmv.c +++ b/CBLAS/src/cblas_dtbmv.c @@ -7,7 +7,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_dtbmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_dtbmv)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE TransA, const CBLAS_DIAG Diag, const CBLAS_INT N, const CBLAS_INT K, const double *A, const CBLAS_INT lda, double *X, const CBLAS_INT incX) @@ -41,7 +41,7 @@ void cblas_dtbmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'L'; else { - cblas_xerbla(2, "cblas_dtbmv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_dtbmv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -51,7 +51,7 @@ void cblas_dtbmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (TransA == CblasConjTrans) TA = 'C'; else { - cblas_xerbla(3, "cblas_dtbmv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_dtbmv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -60,7 +60,7 @@ void cblas_dtbmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_dtbmv","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(4, "cblas_dtbmv","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -80,7 +80,7 @@ void cblas_dtbmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'U'; else { - cblas_xerbla(2, "cblas_dtbmv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_dtbmv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -91,7 +91,7 @@ void cblas_dtbmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (TransA == CblasConjTrans) TA = 'N'; else { - cblas_xerbla(3, "cblas_dtbmv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_dtbmv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -101,7 +101,7 @@ void cblas_dtbmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_dtbmv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(4, "cblas_dtbmv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -116,7 +116,7 @@ void cblas_dtbmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, &F77_incX); } - else cblas_xerbla(1, "cblas_dtbmv", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_dtbmv", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; } diff --git a/CBLAS/src/cblas_dtbsv.c b/CBLAS/src/cblas_dtbsv.c index afead06808..fefca5bd43 100644 --- a/CBLAS/src/cblas_dtbsv.c +++ b/CBLAS/src/cblas_dtbsv.c @@ -7,7 +7,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_dtbsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_dtbsv)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE TransA, const CBLAS_DIAG Diag, const CBLAS_INT N, const CBLAS_INT K, const double *A, const CBLAS_INT lda, double *X, const CBLAS_INT incX) @@ -41,7 +41,7 @@ void cblas_dtbsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'L'; else { - cblas_xerbla(2, "cblas_dtbsv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_dtbsv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -51,7 +51,7 @@ void cblas_dtbsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (TransA == CblasConjTrans) TA = 'C'; else { - cblas_xerbla(3, "cblas_dtbsv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_dtbsv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -60,7 +60,7 @@ void cblas_dtbsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_dtbsv","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(4, "cblas_dtbsv","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -80,7 +80,7 @@ void cblas_dtbsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'U'; else { - cblas_xerbla(2, "cblas_dtbsv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_dtbsv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -91,7 +91,7 @@ void cblas_dtbsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (TransA == CblasConjTrans) TA = 'N'; else { - cblas_xerbla(3, "cblas_dtbsv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_dtbsv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -101,7 +101,7 @@ void cblas_dtbsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_dtbsv","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(4, "cblas_dtbsv","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -115,7 +115,7 @@ void cblas_dtbsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, F77_dtbsv( F77_UL, F77_TA, F77_DI, &F77_N, &F77_K, A, &F77_lda, X, &F77_incX); } - else cblas_xerbla(1, "cblas_dtbsv", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_dtbsv", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_dtpmv.c b/CBLAS/src/cblas_dtpmv.c index 94381aff4f..bd502fea96 100644 --- a/CBLAS/src/cblas_dtpmv.c +++ b/CBLAS/src/cblas_dtpmv.c @@ -7,7 +7,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_dtpmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_dtpmv)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE TransA, const CBLAS_DIAG Diag, const CBLAS_INT N, const double *Ap, double *X, const CBLAS_INT incX) { @@ -38,7 +38,7 @@ void cblas_dtpmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'L'; else { - cblas_xerbla(2, "cblas_dtpmv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_dtpmv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -48,7 +48,7 @@ void cblas_dtpmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (TransA == CblasConjTrans) TA = 'C'; else { - cblas_xerbla(3, "cblas_dtpmv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_dtpmv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -57,7 +57,7 @@ void cblas_dtpmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_dtpmv","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(4, "cblas_dtpmv","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -76,7 +76,7 @@ void cblas_dtpmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'U'; else { - cblas_xerbla(2, "cblas_dtpmv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_dtpmv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -87,7 +87,7 @@ void cblas_dtpmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (TransA == CblasConjTrans) TA = 'N'; else { - cblas_xerbla(3, "cblas_dtpmv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_dtpmv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -97,7 +97,7 @@ void cblas_dtpmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_dtpmv","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(4, "cblas_dtpmv","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -110,7 +110,7 @@ void cblas_dtpmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, F77_dtpmv( F77_UL, F77_TA, F77_DI, &F77_N, Ap, X,&F77_incX); } - else cblas_xerbla(1, "cblas_dtpmv", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_dtpmv", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_dtpsv.c b/CBLAS/src/cblas_dtpsv.c index 53181b253f..c7894ca744 100644 --- a/CBLAS/src/cblas_dtpsv.c +++ b/CBLAS/src/cblas_dtpsv.c @@ -7,7 +7,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_dtpsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_dtpsv)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE TransA, const CBLAS_DIAG Diag, const CBLAS_INT N, const double *Ap, double *X, const CBLAS_INT incX) { @@ -38,7 +38,7 @@ void cblas_dtpsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'L'; else { - cblas_xerbla(2, "cblas_dtpsv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_dtpsv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -48,7 +48,7 @@ void cblas_dtpsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (TransA == CblasConjTrans) TA = 'C'; else { - cblas_xerbla(3, "cblas_dtpsv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_dtpsv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -57,7 +57,7 @@ void cblas_dtpsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_dtpsv","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(4, "cblas_dtpsv","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -76,7 +76,7 @@ void cblas_dtpsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'U'; else { - cblas_xerbla(2, "cblas_dtpsv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_dtpsv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -87,7 +87,7 @@ void cblas_dtpsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (TransA == CblasConjTrans) TA = 'N'; else { - cblas_xerbla(3, "cblas_dtpsv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_dtpsv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -97,7 +97,7 @@ void cblas_dtpsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_dtpsv","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(4, "cblas_dtpsv","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -111,7 +111,7 @@ void cblas_dtpsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, F77_dtpsv( F77_UL, F77_TA, F77_DI, &F77_N, Ap, X,&F77_incX); } - else cblas_xerbla(1, "cblas_dtpsv", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_dtpsv", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_dtrmm.c b/CBLAS/src/cblas_dtrmm.c index c2ea08a5ba..1421d5d158 100644 --- a/CBLAS/src/cblas_dtrmm.c +++ b/CBLAS/src/cblas_dtrmm.c @@ -9,7 +9,7 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_dtrmm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, +void API_SUFFIX(cblas_dtrmm)(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE TransA, const CBLAS_DIAG Diag, const CBLAS_INT M, const CBLAS_INT N, const double alpha, const double *A, const CBLAS_INT lda, @@ -45,7 +45,7 @@ void cblas_dtrmm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Side == CblasLeft ) SD='L'; else { - cblas_xerbla(2, "cblas_dtrmm","Illegal Side setting, %d\n", Side); + API_SUFFIX(cblas_xerbla)(2, "cblas_dtrmm","Illegal Side setting, %d\n", Side); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -54,7 +54,7 @@ void cblas_dtrmm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Uplo == CblasLower ) UL='L'; else { - cblas_xerbla(3, "cblas_dtrmm","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(3, "cblas_dtrmm","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -65,7 +65,7 @@ void cblas_dtrmm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( TransA == CblasNoTrans ) TA='N'; else { - cblas_xerbla(4, "cblas_dtrmm","Illegal Trans setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(4, "cblas_dtrmm","Illegal Trans setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -75,7 +75,7 @@ void cblas_dtrmm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Diag == CblasNonUnit ) DI='N'; else { - cblas_xerbla(5, "cblas_dtrmm","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(5, "cblas_dtrmm","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -96,7 +96,7 @@ void cblas_dtrmm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Side == CblasLeft ) SD='R'; else { - cblas_xerbla(2, "cblas_dtrmm","Illegal Side setting, %d\n", Side); + API_SUFFIX(cblas_xerbla)(2, "cblas_dtrmm","Illegal Side setting, %d\n", Side); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -106,7 +106,7 @@ void cblas_dtrmm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Uplo == CblasLower ) UL='U'; else { - cblas_xerbla(3, "cblas_dtrmm","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(3, "cblas_dtrmm","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -117,7 +117,7 @@ void cblas_dtrmm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( TransA == CblasNoTrans ) TA='N'; else { - cblas_xerbla(4, "cblas_dtrmm","Illegal Trans setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(4, "cblas_dtrmm","Illegal Trans setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -127,7 +127,7 @@ void cblas_dtrmm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Diag == CblasNonUnit ) DI='N'; else { - cblas_xerbla(5, "cblas_dtrmm","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(5, "cblas_dtrmm","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -141,7 +141,7 @@ void cblas_dtrmm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, #endif F77_dtrmm(F77_SD, F77_UL, F77_TA, F77_DI, &F77_N, &F77_M, &alpha, A, &F77_lda, B, &F77_ldb); } - else cblas_xerbla(1, "cblas_dtrmm", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_dtrmm", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_dtrmv.c b/CBLAS/src/cblas_dtrmv.c index f2ec535b75..6ee99a5d81 100644 --- a/CBLAS/src/cblas_dtrmv.c +++ b/CBLAS/src/cblas_dtrmv.c @@ -9,7 +9,7 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_dtrmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_dtrmv)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE TransA, const CBLAS_DIAG Diag, const CBLAS_INT N, const double *A, const CBLAS_INT lda, double *X, const CBLAS_INT incX) @@ -43,7 +43,7 @@ void cblas_dtrmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'L'; else { - cblas_xerbla(2, "cblas_dtrmv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_dtrmv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -53,7 +53,7 @@ void cblas_dtrmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (TransA == CblasConjTrans) TA = 'C'; else { - cblas_xerbla(3, "cblas_dtrmv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_dtrmv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -62,7 +62,7 @@ void cblas_dtrmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_dtrmv","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(4, "cblas_dtrmv","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -82,7 +82,7 @@ void cblas_dtrmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'U'; else { - cblas_xerbla(2, "cblas_dtrmv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_dtrmv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -93,7 +93,7 @@ void cblas_dtrmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (TransA == CblasConjTrans) TA = 'N'; else { - cblas_xerbla(3, "cblas_dtrmv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_dtrmv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -103,7 +103,7 @@ void cblas_dtrmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_dtrmv","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(4, "cblas_dtrmv","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -115,7 +115,7 @@ void cblas_dtrmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, #endif F77_dtrmv( F77_UL, F77_TA, F77_DI, &F77_N, A, &F77_lda, X, &F77_incX); - } else cblas_xerbla(1, "cblas_dtrmv", "Illegal layout setting, %d\n", layout); + } else API_SUFFIX(cblas_xerbla)(1, "cblas_dtrmv", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_dtrsm.c b/CBLAS/src/cblas_dtrsm.c index 5fe185d251..a53a8a0609 100644 --- a/CBLAS/src/cblas_dtrsm.c +++ b/CBLAS/src/cblas_dtrsm.c @@ -9,7 +9,7 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_dtrsm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, +void API_SUFFIX(cblas_dtrsm)(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE TransA, const CBLAS_DIAG Diag, const CBLAS_INT M, const CBLAS_INT N, const double alpha, const double *A, const CBLAS_INT lda, @@ -46,7 +46,7 @@ void cblas_dtrsm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Side == CblasLeft ) SD='L'; else { - cblas_xerbla(2, "cblas_dtrsm","Illegal Side setting, %d\n", Side); + API_SUFFIX(cblas_xerbla)(2, "cblas_dtrsm","Illegal Side setting, %d\n", Side); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -55,7 +55,7 @@ void cblas_dtrsm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Uplo == CblasLower) UL='L'; else { - cblas_xerbla(3, "cblas_dtrsm","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(3, "cblas_dtrsm","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -66,7 +66,7 @@ void cblas_dtrsm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( TransA == CblasNoTrans ) TA='N'; else { - cblas_xerbla(4, "cblas_dtrsm","Illegal Trans setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(4, "cblas_dtrsm","Illegal Trans setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -76,7 +76,7 @@ void cblas_dtrsm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Diag == CblasNonUnit) DI='N'; else { - cblas_xerbla(5, "cblas_dtrsm","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(5, "cblas_dtrsm","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -99,7 +99,7 @@ void cblas_dtrsm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Side == CblasLeft ) SD='R'; else { - cblas_xerbla(2, "cblas_dtrsm","Illegal Side setting, %d\n", Side); + API_SUFFIX(cblas_xerbla)(2, "cblas_dtrsm","Illegal Side setting, %d\n", Side); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -109,7 +109,7 @@ void cblas_dtrsm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Uplo == CblasLower) UL='U'; else { - cblas_xerbla(3, "cblas_dtrsm","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(3, "cblas_dtrsm","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -120,7 +120,7 @@ void cblas_dtrsm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( TransA == CblasNoTrans ) TA='N'; else { - cblas_xerbla(4, "cblas_dtrsm","Illegal Trans setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(4, "cblas_dtrsm","Illegal Trans setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -130,7 +130,7 @@ void cblas_dtrsm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Diag == CblasNonUnit) DI='N'; else { - cblas_xerbla(5, "cblas_dtrsm","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(5, "cblas_dtrsm","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -146,7 +146,7 @@ void cblas_dtrsm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, F77_dtrsm(F77_SD, F77_UL, F77_TA, F77_DI, &F77_N, &F77_M, &alpha, A, &F77_lda, B, &F77_ldb); } - else cblas_xerbla(1, "cblas_dtrsm","Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_dtrsm","Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_dtrsv.c b/CBLAS/src/cblas_dtrsv.c index 51b49da14d..527d3c255d 100644 --- a/CBLAS/src/cblas_dtrsv.c +++ b/CBLAS/src/cblas_dtrsv.c @@ -7,7 +7,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_dtrsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_dtrsv)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE TransA, const CBLAS_DIAG Diag, const CBLAS_INT N, const double *A, const CBLAS_INT lda, double *X, const CBLAS_INT incX) @@ -41,7 +41,7 @@ void cblas_dtrsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'L'; else { - cblas_xerbla(2, "cblas_dtrsv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_dtrsv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -51,7 +51,7 @@ void cblas_dtrsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (TransA == CblasConjTrans) TA = 'C'; else { - cblas_xerbla(3, "cblas_dtrsv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_dtrsv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -60,7 +60,7 @@ void cblas_dtrsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_dtrsv","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(4, "cblas_dtrsv","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -80,7 +80,7 @@ void cblas_dtrsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'U'; else { - cblas_xerbla(2, "cblas_dtrsv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_dtrsv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -91,7 +91,7 @@ void cblas_dtrsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (TransA == CblasConjTrans) TA = 'N'; else { - cblas_xerbla(3, "cblas_dtrsv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_dtrsv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -101,7 +101,7 @@ void cblas_dtrsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_dtrsv","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(4, "cblas_dtrsv","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -114,7 +114,7 @@ void cblas_dtrsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, F77_dtrsv( F77_UL, F77_TA, F77_DI, &F77_N, A, &F77_lda, X, &F77_incX); } - else cblas_xerbla(1, "cblas_dtrsv", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_dtrsv", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_dzasum.c b/CBLAS/src/cblas_dzasum.c index b68879860b..d306ac6dce 100644 --- a/CBLAS/src/cblas_dzasum.c +++ b/CBLAS/src/cblas_dzasum.c @@ -9,7 +9,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -double cblas_dzasum( const CBLAS_INT N, const void *X, const CBLAS_INT incX) +double API_SUFFIX(cblas_dzasum)( const CBLAS_INT N, const void *X, const CBLAS_INT incX) { double asum; #ifdef F77_INT diff --git a/CBLAS/src/cblas_dznrm2.c b/CBLAS/src/cblas_dznrm2.c index f815e15327..92ba052418 100644 --- a/CBLAS/src/cblas_dznrm2.c +++ b/CBLAS/src/cblas_dznrm2.c @@ -9,7 +9,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -double cblas_dznrm2( const CBLAS_INT N, const void *X, const CBLAS_INT incX) +double API_SUFFIX(cblas_dznrm2)( const CBLAS_INT N, const void *X, const CBLAS_INT incX) { double nrm2; #ifdef F77_INT diff --git a/CBLAS/src/cblas_icamax.c b/CBLAS/src/cblas_icamax.c index 66a12cdab8..8fc0c592b2 100644 --- a/CBLAS/src/cblas_icamax.c +++ b/CBLAS/src/cblas_icamax.c @@ -9,7 +9,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -CBLAS_INDEX cblas_icamax( const CBLAS_INT N, const void *X, const CBLAS_INT incX) +CBLAS_INDEX API_SUFFIX(cblas_icamax)( const CBLAS_INT N, const void *X, const CBLAS_INT incX) { #ifdef F77_INT F77_INT F77_N=N, F77_incX=incX, F77_iamax; diff --git a/CBLAS/src/cblas_idamax.c b/CBLAS/src/cblas_idamax.c index db016c7cf7..4d7599f9c5 100644 --- a/CBLAS/src/cblas_idamax.c +++ b/CBLAS/src/cblas_idamax.c @@ -9,7 +9,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -CBLAS_INDEX cblas_idamax( const CBLAS_INT N, const double *X, const CBLAS_INT incX) +CBLAS_INDEX API_SUFFIX(cblas_idamax)( const CBLAS_INT N, const double *X, const CBLAS_INT incX) { #ifdef F77_INT F77_INT F77_N=N, F77_incX=incX, F77_iamax; diff --git a/CBLAS/src/cblas_isamax.c b/CBLAS/src/cblas_isamax.c index 0898a82701..8b0f29a3bd 100644 --- a/CBLAS/src/cblas_isamax.c +++ b/CBLAS/src/cblas_isamax.c @@ -9,7 +9,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -CBLAS_INDEX cblas_isamax( const CBLAS_INT N, const float *X, const CBLAS_INT incX) +CBLAS_INDEX API_SUFFIX(cblas_isamax)( const CBLAS_INT N, const float *X, const CBLAS_INT incX) { #ifdef F77_INT F77_INT F77_N=N, F77_incX=incX, F77_iamax; diff --git a/CBLAS/src/cblas_izamax.c b/CBLAS/src/cblas_izamax.c index c173e9d44e..20ca0cdb7b 100644 --- a/CBLAS/src/cblas_izamax.c +++ b/CBLAS/src/cblas_izamax.c @@ -9,7 +9,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -CBLAS_INDEX cblas_izamax( const CBLAS_INT N, const void *X, const CBLAS_INT incX) +CBLAS_INDEX API_SUFFIX(cblas_izamax)( const CBLAS_INT N, const void *X, const CBLAS_INT incX) { #ifdef F77_INT F77_INT F77_N=N, F77_incX=incX, F77_iamax; diff --git a/CBLAS/src/cblas_sasum.c b/CBLAS/src/cblas_sasum.c index 091561ed5e..fcdfbc01b2 100644 --- a/CBLAS/src/cblas_sasum.c +++ b/CBLAS/src/cblas_sasum.c @@ -9,7 +9,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -float cblas_sasum( const CBLAS_INT N, const float *X, const CBLAS_INT incX) +float API_SUFFIX(cblas_sasum)( const CBLAS_INT N, const float *X, const CBLAS_INT incX) { float asum; #ifdef F77_INT diff --git a/CBLAS/src/cblas_saxpby.c b/CBLAS/src/cblas_saxpby.c new file mode 100644 index 0000000000..b8e025d766 --- /dev/null +++ b/CBLAS/src/cblas_saxpby.c @@ -0,0 +1,23 @@ +/* + * cblas_saxpby.c + * + * The program is a C interface to saxpby. + * It calls the fortran wrapper before calling saxpby. + * + * Written by Martin Koehler, 08/24/2024 + * + */ +#include "cblas.h" +#include "cblas_f77.h" +void API_SUFFIX(cblas_saxpby)( const CBLAS_INT N, const float alpha, const float *X, + const CBLAS_INT incX, const float beta, float *Y, const CBLAS_INT incY) +{ +#ifdef F77_INT + F77_INT F77_N=N, F77_incX=incX, F77_incY=incY; +#else + #define F77_N N + #define F77_incX incX + #define F77_incY incY +#endif + F77_saxpby( &F77_N, &alpha, X, &F77_incX, &beta, Y, &F77_incY); +} diff --git a/CBLAS/src/cblas_saxpy.c b/CBLAS/src/cblas_saxpy.c index 2c56f499d6..8d1541d8a2 100644 --- a/CBLAS/src/cblas_saxpy.c +++ b/CBLAS/src/cblas_saxpy.c @@ -9,7 +9,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_saxpy( const CBLAS_INT N, const float alpha, const float *X, +void API_SUFFIX(cblas_saxpy)( const CBLAS_INT N, const float alpha, const float *X, const CBLAS_INT incX, float *Y, const CBLAS_INT incY) { #ifdef F77_INT diff --git a/CBLAS/src/cblas_scabs1.c b/CBLAS/src/cblas_scabs1.c new file mode 100644 index 0000000000..5899603d9a --- /dev/null +++ b/CBLAS/src/cblas_scabs1.c @@ -0,0 +1,15 @@ +/* + * cblas_scabs1.c + * + * The program is a C interface to scabs1. + * + */ +#include "cblas.h" +#include "cblas_f77.h" +float API_SUFFIX(cblas_scabs1)(const void *c) +{ + float cabs1 = 0.0; + F77_scabs1_sub(c, &cabs1); + return cabs1; +} + diff --git a/CBLAS/src/cblas_scasum.c b/CBLAS/src/cblas_scasum.c index 1f84efefd0..feda02d751 100644 --- a/CBLAS/src/cblas_scasum.c +++ b/CBLAS/src/cblas_scasum.c @@ -9,7 +9,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -float cblas_scasum( const CBLAS_INT N, const void *X, const CBLAS_INT incX) +float API_SUFFIX(cblas_scasum)( const CBLAS_INT N, const void *X, const CBLAS_INT incX) { float asum; #ifdef F77_INT diff --git a/CBLAS/src/cblas_scnrm2.c b/CBLAS/src/cblas_scnrm2.c index fd66915371..a1825816c0 100644 --- a/CBLAS/src/cblas_scnrm2.c +++ b/CBLAS/src/cblas_scnrm2.c @@ -9,7 +9,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -float cblas_scnrm2( const CBLAS_INT N, const void *X, const CBLAS_INT incX) +float API_SUFFIX(cblas_scnrm2)( const CBLAS_INT N, const void *X, const CBLAS_INT incX) { float nrm2; #ifdef F77_INT diff --git a/CBLAS/src/cblas_scopy.c b/CBLAS/src/cblas_scopy.c index 24d3bf5860..7f3dcdcc9f 100644 --- a/CBLAS/src/cblas_scopy.c +++ b/CBLAS/src/cblas_scopy.c @@ -8,7 +8,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_scopy( const CBLAS_INT N, const float *X, +void API_SUFFIX(cblas_scopy)( const CBLAS_INT N, const float *X, const CBLAS_INT incX, float *Y, const CBLAS_INT incY) { #ifdef F77_INT diff --git a/CBLAS/src/cblas_sdot.c b/CBLAS/src/cblas_sdot.c index a263ae3c42..76e56353a0 100644 --- a/CBLAS/src/cblas_sdot.c +++ b/CBLAS/src/cblas_sdot.c @@ -9,7 +9,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -float cblas_sdot( const CBLAS_INT N, const float *X, +float API_SUFFIX(cblas_sdot)( const CBLAS_INT N, const float *X, const CBLAS_INT incX, const float *Y, const CBLAS_INT incY) { float dot; diff --git a/CBLAS/src/cblas_sdsdot.c b/CBLAS/src/cblas_sdsdot.c index 48694f921e..113dd57b65 100644 --- a/CBLAS/src/cblas_sdsdot.c +++ b/CBLAS/src/cblas_sdsdot.c @@ -9,7 +9,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -float cblas_sdsdot( const CBLAS_INT N, const float alpha, const float *X, +float API_SUFFIX(cblas_sdsdot)( const CBLAS_INT N, const float alpha, const float *X, const CBLAS_INT incX, const float *Y, const CBLAS_INT incY) { float dot; diff --git a/CBLAS/src/cblas_sgbmv.c b/CBLAS/src/cblas_sgbmv.c index 3889e5f6d6..e530260e67 100644 --- a/CBLAS/src/cblas_sgbmv.c +++ b/CBLAS/src/cblas_sgbmv.c @@ -9,7 +9,7 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_sgbmv(const CBLAS_LAYOUT layout, +void API_SUFFIX(cblas_sgbmv)(const CBLAS_LAYOUT layout, const CBLAS_TRANSPOSE TransA, const CBLAS_INT M, const CBLAS_INT N, const CBLAS_INT KL, const CBLAS_INT KU, const float alpha, const float *A, const CBLAS_INT lda, @@ -46,7 +46,7 @@ void cblas_sgbmv(const CBLAS_LAYOUT layout, else if (TransA == CblasConjTrans) TA = 'C'; else { - cblas_xerbla(2, "cblas_sgbmv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(2, "cblas_sgbmv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -65,7 +65,7 @@ void cblas_sgbmv(const CBLAS_LAYOUT layout, else if (TransA == CblasConjTrans) TA = 'N'; else { - cblas_xerbla(2, "cblas_sgbmv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(2, "cblas_sgbmv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -76,7 +76,7 @@ void cblas_sgbmv(const CBLAS_LAYOUT layout, F77_sgbmv(F77_TA, &F77_N, &F77_M, &F77_KU, &F77_KL, &alpha, A ,&F77_lda, X, &F77_incX, &beta, Y, &F77_incY); } - else cblas_xerbla(1, "cblas_sgbmv", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_sgbmv", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_sgemm.c b/CBLAS/src/cblas_sgemm.c index 99708a7d7f..26be2a8f0a 100644 --- a/CBLAS/src/cblas_sgemm.c +++ b/CBLAS/src/cblas_sgemm.c @@ -9,7 +9,7 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_sgemm(const CBLAS_LAYOUT layout, const CBLAS_TRANSPOSE TransA, +void API_SUFFIX(cblas_sgemm)(const CBLAS_LAYOUT layout, const CBLAS_TRANSPOSE TransA, const CBLAS_TRANSPOSE TransB, const CBLAS_INT M, const CBLAS_INT N, const CBLAS_INT K, const float alpha, const float *A, const CBLAS_INT lda, const float *B, const CBLAS_INT ldb, @@ -46,7 +46,7 @@ void cblas_sgemm(const CBLAS_LAYOUT layout, const CBLAS_TRANSPOSE TransA, else if ( TransA == CblasNoTrans ) TA='N'; else { - cblas_xerbla(2, "cblas_sgemm", + API_SUFFIX(cblas_xerbla)(2, "cblas_sgemm", "Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; @@ -58,7 +58,7 @@ void cblas_sgemm(const CBLAS_LAYOUT layout, const CBLAS_TRANSPOSE TransA, else if ( TransB == CblasNoTrans ) TB='N'; else { - cblas_xerbla(3, "cblas_sgemm", + API_SUFFIX(cblas_xerbla)(3, "cblas_sgemm", "Illegal TransB setting, %d\n", TransB); CBLAS_CallFromC = 0; RowMajorStrg = 0; @@ -79,7 +79,7 @@ void cblas_sgemm(const CBLAS_LAYOUT layout, const CBLAS_TRANSPOSE TransA, else if ( TransA == CblasNoTrans ) TB='N'; else { - cblas_xerbla(2, "cblas_sgemm", + API_SUFFIX(cblas_xerbla)(2, "cblas_sgemm", "Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; @@ -90,7 +90,7 @@ void cblas_sgemm(const CBLAS_LAYOUT layout, const CBLAS_TRANSPOSE TransA, else if ( TransB == CblasNoTrans ) TA='N'; else { - cblas_xerbla(2, "cblas_sgemm", + API_SUFFIX(cblas_xerbla)(3, "cblas_sgemm", "Illegal TransB setting, %d\n", TransB); CBLAS_CallFromC = 0; RowMajorStrg = 0; @@ -103,7 +103,7 @@ void cblas_sgemm(const CBLAS_LAYOUT layout, const CBLAS_TRANSPOSE TransA, F77_sgemm(F77_TA, F77_TB, &F77_N, &F77_M, &F77_K, &alpha, B, &F77_ldb, A, &F77_lda, &beta, C, &F77_ldc); } else - cblas_xerbla(1, "cblas_sgemm", + API_SUFFIX(cblas_xerbla)(1, "cblas_sgemm", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; diff --git a/CBLAS/src/cblas_sgemmtr.c b/CBLAS/src/cblas_sgemmtr.c new file mode 100644 index 0000000000..065a031bec --- /dev/null +++ b/CBLAS/src/cblas_sgemmtr.c @@ -0,0 +1,136 @@ + +/* + * + * cblas_sgemmtr.c + * This program is a C interface to sgemmtr. + * Written by Martin Koehler, MPI Magdeburg + * 06/24/2024 + * + */ + +#include "cblas.h" +#include "cblas_f77.h" +void API_SUFFIX(cblas_sgemmtr)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE TransA, + const CBLAS_TRANSPOSE TransB, const CBLAS_INT N, + const CBLAS_INT K, const float alpha, const float *A, + const CBLAS_INT lda, const float *B, const CBLAS_INT ldb, + const float beta, float *C, const CBLAS_INT ldc) +{ + char TA, TB, UL; +#ifdef F77_CHAR + F77_CHAR F77_TA, F77_TB, F77_UL; +#else +#define F77_TA &TA +#define F77_TB &TB +#define F77_UL &UL +#endif + +#ifdef F77_INT + F77_INT F77_N=N, F77_K=K, F77_lda=lda, F77_ldb=ldb; + F77_INT F77_ldc=ldc; +#else +#define F77_N N +#define F77_K K +#define F77_lda lda +#define F77_ldb ldb +#define F77_ldc ldc +#endif + + extern int CBLAS_CallFromC; + extern int RowMajorStrg; + RowMajorStrg = 0; + CBLAS_CallFromC = 1; + + + if( layout == CblasColMajor ) + { + if ( Uplo == CblasUpper ) UL = 'U'; + else if (Uplo == CblasLower) UL= 'L'; + else { + API_SUFFIX(cblas_xerbla)(2, "cblas_sgemmtr", "Illegal Uplo setting, %d\n", Uplo); + CBLAS_CallFromC = 0; + RowMajorStrg = 0; + return; + } + + + if(TransA == CblasTrans) TA='T'; + else if ( TransA == CblasConjTrans ) TA='C'; + else if ( TransA == CblasNoTrans ) TA='N'; + else + { + API_SUFFIX(cblas_xerbla)(3, "cblas_sgemmtr", + "Illegal TransA setting, %d\n", TransA); + CBLAS_CallFromC = 0; + RowMajorStrg = 0; + return; + } + + if(TransB == CblasTrans) TB='T'; + else if ( TransB == CblasConjTrans ) TB='C'; + else if ( TransB == CblasNoTrans ) TB='N'; + else + { + API_SUFFIX(cblas_xerbla)(4, "cblas_sgemmtr", + "Illegal TransB setting, %d\n", TransB); + CBLAS_CallFromC = 0; + RowMajorStrg = 0; + return; + } + +#ifdef F77_CHAR + F77_TA = C2F_CHAR(&TA); + F77_TB = C2F_CHAR(&TB); + F77_UL = C2F_CHAR(&UL); +#endif + + F77_sgemmtr(F77_UL, F77_TA, F77_TB, &F77_N, &F77_K, &alpha, A, &F77_lda, B, &F77_ldb, &beta, C, &F77_ldc); + } + else if (layout == CblasRowMajor) + { + if ( Uplo == CblasUpper ) UL = 'L'; + else if (Uplo == CblasLower) UL= 'U'; + else { + API_SUFFIX(cblas_xerbla)(2, "cblas_sgemmtr", "Illegal Uplo setting, %d\n", Uplo); + CBLAS_CallFromC = 0; + RowMajorStrg = 0; + return; + } + + + RowMajorStrg = 1; + if(TransA == CblasTrans) TB='T'; + else if ( TransA == CblasConjTrans ) TB='C'; + else if ( TransA == CblasNoTrans ) TB='N'; + else + { + API_SUFFIX(cblas_xerbla)(3, "cblas_sgemmtr", + "Illegal TransA setting, %d\n", TransA); + CBLAS_CallFromC = 0; + RowMajorStrg = 0; + return; + } + if(TransB == CblasTrans) TA='T'; + else if ( TransB == CblasConjTrans ) TA='C'; + else if ( TransB == CblasNoTrans ) TA='N'; + else + { + API_SUFFIX(cblas_xerbla)(4, "cblas_sgemmtr", + "Illegal TransB setting, %d\n", TransB); + CBLAS_CallFromC = 0; + RowMajorStrg = 0; + return; + } +#ifdef F77_CHAR + F77_TA = C2F_CHAR(&TA); + F77_TB = C2F_CHAR(&TB); + F77_UL = C2F_CHAR(&UL); +#endif + + F77_sgemmtr(F77_UL, F77_TA, F77_TB, &F77_N, &F77_K, &alpha, B, &F77_ldb, A, &F77_lda, &beta, C, &F77_ldc); + } else + API_SUFFIX(cblas_xerbla)(1, "cblas_sgemmtr", + "Illegal layout setting, %d\n", layout); + CBLAS_CallFromC = 0; + RowMajorStrg = 0; +} diff --git a/CBLAS/src/cblas_sgemv.c b/CBLAS/src/cblas_sgemv.c index 14beeb3414..5c95151f9e 100644 --- a/CBLAS/src/cblas_sgemv.c +++ b/CBLAS/src/cblas_sgemv.c @@ -8,7 +8,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_sgemv(const CBLAS_LAYOUT layout, +void API_SUFFIX(cblas_sgemv)(const CBLAS_LAYOUT layout, const CBLAS_TRANSPOSE TransA, const CBLAS_INT M, const CBLAS_INT N, const float alpha, const float *A, const CBLAS_INT lda, const float *X, const CBLAS_INT incX, const float beta, @@ -42,7 +42,7 @@ void cblas_sgemv(const CBLAS_LAYOUT layout, else if (TransA == CblasConjTrans) TA = 'C'; else { - cblas_xerbla(2, "cblas_sgemv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(2, "cblas_sgemv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; } @@ -60,7 +60,7 @@ void cblas_sgemv(const CBLAS_LAYOUT layout, else if (TransA == CblasConjTrans) TA = 'N'; else { - cblas_xerbla(2, "cblas_sgemv", "Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(2, "cblas_sgemv", "Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -71,7 +71,7 @@ void cblas_sgemv(const CBLAS_LAYOUT layout, F77_sgemv(F77_TA, &F77_N, &F77_M, &alpha, A, &F77_lda, X, &F77_incX, &beta, Y, &F77_incY); } - else cblas_xerbla(1, "cblas_sgemv", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_sgemv", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_sger.c b/CBLAS/src/cblas_sger.c index ddcdb1d670..b456a31ad1 100644 --- a/CBLAS/src/cblas_sger.c +++ b/CBLAS/src/cblas_sger.c @@ -9,7 +9,7 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_sger(const CBLAS_LAYOUT layout, const CBLAS_INT M, const CBLAS_INT N, +void API_SUFFIX(cblas_sger)(const CBLAS_LAYOUT layout, const CBLAS_INT M, const CBLAS_INT N, const float alpha, const float *X, const CBLAS_INT incX, const float *Y, const CBLAS_INT incY, float *A, const CBLAS_INT lda) { @@ -39,7 +39,7 @@ void cblas_sger(const CBLAS_LAYOUT layout, const CBLAS_INT M, const CBLAS_INT N, F77_sger( &F77_N, &F77_M, &alpha, Y, &F77_incY, X, &F77_incX, A, &F77_lda); } - else cblas_xerbla(1, "cblas_sger", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_sger", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_snrm2.c b/CBLAS/src/cblas_snrm2.c index a2c482bf13..d1c70be8fd 100644 --- a/CBLAS/src/cblas_snrm2.c +++ b/CBLAS/src/cblas_snrm2.c @@ -9,7 +9,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -float cblas_snrm2( const CBLAS_INT N, const float *X, const CBLAS_INT incX) +float API_SUFFIX(cblas_snrm2)( const CBLAS_INT N, const float *X, const CBLAS_INT incX) { float nrm2; #ifdef F77_INT diff --git a/CBLAS/src/cblas_srot.c b/CBLAS/src/cblas_srot.c index 57fd38bbf7..61c4c75042 100644 --- a/CBLAS/src/cblas_srot.c +++ b/CBLAS/src/cblas_srot.c @@ -8,7 +8,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_srot( const CBLAS_INT N, float *X, const CBLAS_INT incX, float *Y, +void API_SUFFIX(cblas_srot)( const CBLAS_INT N, float *X, const CBLAS_INT incX, float *Y, const CBLAS_INT incY, const float c, const float s) { #ifdef F77_INT diff --git a/CBLAS/src/cblas_srotg.c b/CBLAS/src/cblas_srotg.c index 4584a29c9a..b96ed1c5c4 100644 --- a/CBLAS/src/cblas_srotg.c +++ b/CBLAS/src/cblas_srotg.c @@ -8,7 +8,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_srotg( float *a, float *b, float *c, float *s) +void API_SUFFIX(cblas_srotg)( float *a, float *b, float *c, float *s) { F77_srotg(a,b,c,s); } diff --git a/CBLAS/src/cblas_srotm.c b/CBLAS/src/cblas_srotm.c index 7de0970ce0..04e3c6438b 100644 --- a/CBLAS/src/cblas_srotm.c +++ b/CBLAS/src/cblas_srotm.c @@ -8,7 +8,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_srotm( const CBLAS_INT N, float *X, const CBLAS_INT incX, float *Y, +void API_SUFFIX(cblas_srotm)( const CBLAS_INT N, float *X, const CBLAS_INT incX, float *Y, const CBLAS_INT incY, const float *P) { #ifdef F77_INT diff --git a/CBLAS/src/cblas_srotmg.c b/CBLAS/src/cblas_srotmg.c index 1d84054a02..6290a6207d 100644 --- a/CBLAS/src/cblas_srotmg.c +++ b/CBLAS/src/cblas_srotmg.c @@ -8,7 +8,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_srotmg( float *d1, float *d2, float *b1, +void API_SUFFIX(cblas_srotmg)( float *d1, float *d2, float *b1, const float b2, float *p) { F77_srotmg(d1,d2,b1,&b2,p); diff --git a/CBLAS/src/cblas_ssbmv.c b/CBLAS/src/cblas_ssbmv.c index eab4f7bcd7..1c85cff6ae 100644 --- a/CBLAS/src/cblas_ssbmv.c +++ b/CBLAS/src/cblas_ssbmv.c @@ -8,7 +8,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_ssbmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_ssbmv)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_INT N, const CBLAS_INT K, const float alpha, const float *A, const CBLAS_INT lda, const float *X, const CBLAS_INT incX, const float beta, float *Y, const CBLAS_INT incY) @@ -41,7 +41,7 @@ void cblas_ssbmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'L'; else { - cblas_xerbla(2, "cblas_ssbmv","Illegal Uplo setting, %d\n",Uplo ); + API_SUFFIX(cblas_xerbla)(2, "cblas_ssbmv","Illegal Uplo setting, %d\n",Uplo ); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -58,7 +58,7 @@ void cblas_ssbmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'U'; else { - cblas_xerbla(2, "cblas_ssbmv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_ssbmv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -69,7 +69,7 @@ void cblas_ssbmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, F77_ssbmv(F77_UL, &F77_N, &F77_K, &alpha, A, &F77_lda, X, &F77_incX, &beta, Y, &F77_incY); } - else cblas_xerbla(1, "cblas_ssbmv", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_ssbmv", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_sscal.c b/CBLAS/src/cblas_sscal.c index ad5af245ef..98aecd7133 100644 --- a/CBLAS/src/cblas_sscal.c +++ b/CBLAS/src/cblas_sscal.c @@ -8,7 +8,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_sscal( const CBLAS_INT N, const float alpha, float *X, +void API_SUFFIX(cblas_sscal)( const CBLAS_INT N, const float alpha, float *X, const CBLAS_INT incX) { #ifdef F77_INT diff --git a/CBLAS/src/cblas_sspmv.c b/CBLAS/src/cblas_sspmv.c index bd9de77e23..05e37e8f52 100644 --- a/CBLAS/src/cblas_sspmv.c +++ b/CBLAS/src/cblas_sspmv.c @@ -8,7 +8,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_sspmv(const CBLAS_LAYOUT layout, +void API_SUFFIX(cblas_sspmv)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_INT N, const float alpha, const float *AP, const float *X, const CBLAS_INT incX, const float beta, @@ -38,7 +38,7 @@ void cblas_sspmv(const CBLAS_LAYOUT layout, else if (Uplo == CblasLower) UL = 'L'; else { - cblas_xerbla(2, "cblas_sspmv","Illegal Uplo setting, %d\n",Uplo ); + API_SUFFIX(cblas_xerbla)(2, "cblas_sspmv","Illegal Uplo setting, %d\n",Uplo ); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -56,7 +56,7 @@ void cblas_sspmv(const CBLAS_LAYOUT layout, else if (Uplo == CblasLower) UL = 'U'; else { - cblas_xerbla(2, "cblas_sspmv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_sspmv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -67,7 +67,7 @@ void cblas_sspmv(const CBLAS_LAYOUT layout, F77_sspmv(F77_UL, &F77_N, &alpha, AP, X,&F77_incX, &beta, Y, &F77_incY); } - else cblas_xerbla(1, "cblas_sspmv", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_sspmv", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; } diff --git a/CBLAS/src/cblas_sspr.c b/CBLAS/src/cblas_sspr.c index c24501ed99..de4750f167 100644 --- a/CBLAS/src/cblas_sspr.c +++ b/CBLAS/src/cblas_sspr.c @@ -9,7 +9,7 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_sspr(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_sspr)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_INT N, const float alpha, const float *X, const CBLAS_INT incX, float *Ap) { @@ -38,7 +38,7 @@ void cblas_sspr(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasUpper) UL = 'U'; else { - cblas_xerbla(2, "cblas_sspr","Illegal Uplo setting, %d\n",Uplo ); + API_SUFFIX(cblas_xerbla)(2, "cblas_sspr","Illegal Uplo setting, %d\n",Uplo ); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -56,7 +56,7 @@ void cblas_sspr(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasUpper) UL = 'L'; else { - cblas_xerbla(2, "cblas_sspr","Illegal Uplo setting, %d\n",Uplo ); + API_SUFFIX(cblas_xerbla)(2, "cblas_sspr","Illegal Uplo setting, %d\n",Uplo ); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -65,7 +65,7 @@ void cblas_sspr(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, F77_UL = C2F_CHAR(&UL); #endif F77_sspr(F77_UL, &F77_N, &alpha, X, &F77_incX, Ap); - } else cblas_xerbla(1, "cblas_sspr", "Illegal layout setting, %d\n", layout); + } else API_SUFFIX(cblas_xerbla)(1, "cblas_sspr", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_sspr2.c b/CBLAS/src/cblas_sspr2.c index 88b3bbc705..1a0e4f5205 100644 --- a/CBLAS/src/cblas_sspr2.c +++ b/CBLAS/src/cblas_sspr2.c @@ -9,7 +9,7 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_sspr2(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_sspr2)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_INT N, const float alpha, const float *X, const CBLAS_INT incX, const float *Y, const CBLAS_INT incY, float *A) { @@ -38,7 +38,7 @@ void cblas_sspr2(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasUpper) UL = 'U'; else { - cblas_xerbla(2, "cblas_sspr2","Illegal Uplo setting, %d\n",Uplo ); + API_SUFFIX(cblas_xerbla)(2, "cblas_sspr2","Illegal Uplo setting, %d\n",Uplo ); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -56,7 +56,7 @@ void cblas_sspr2(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasUpper) UL = 'L'; else { - cblas_xerbla(2, "cblas_sspr2","Illegal Uplo setting, %d\n",Uplo ); + API_SUFFIX(cblas_xerbla)(2, "cblas_sspr2","Illegal Uplo setting, %d\n",Uplo ); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -65,7 +65,7 @@ void cblas_sspr2(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, F77_UL = C2F_CHAR(&UL); #endif F77_sspr2(F77_UL, &F77_N, &alpha, X, &F77_incX, Y, &F77_incY, A); - } else cblas_xerbla(1, "cblas_sspr2", "Illegal layout setting, %d\n", layout); + } else API_SUFFIX(cblas_xerbla)(1, "cblas_sspr2", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; } diff --git a/CBLAS/src/cblas_sswap.c b/CBLAS/src/cblas_sswap.c index 222993786d..cc5a633b09 100644 --- a/CBLAS/src/cblas_sswap.c +++ b/CBLAS/src/cblas_sswap.c @@ -8,7 +8,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_sswap( const CBLAS_INT N, float *X, const CBLAS_INT incX, float *Y, +void API_SUFFIX(cblas_sswap)( const CBLAS_INT N, float *X, const CBLAS_INT incX, float *Y, const CBLAS_INT incY) { #ifdef F77_INT diff --git a/CBLAS/src/cblas_ssymm.c b/CBLAS/src/cblas_ssymm.c index b70c09c46b..6d347f5333 100644 --- a/CBLAS/src/cblas_ssymm.c +++ b/CBLAS/src/cblas_ssymm.c @@ -9,7 +9,7 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_ssymm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, +void API_SUFFIX(cblas_ssymm)(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, const CBLAS_UPLO Uplo, const CBLAS_INT M, const CBLAS_INT N, const float alpha, const float *A, const CBLAS_INT lda, const float *B, const CBLAS_INT ldb, const float beta, @@ -45,7 +45,7 @@ void cblas_ssymm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Side == CblasLeft ) SD='L'; else { - cblas_xerbla(2, "cblas_ssymm", + API_SUFFIX(cblas_xerbla)(2, "cblas_ssymm", "Illegal Side setting, %d\n", Side); CBLAS_CallFromC = 0; RowMajorStrg = 0; @@ -56,7 +56,7 @@ void cblas_ssymm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Uplo == CblasLower ) UL='L'; else { - cblas_xerbla(3, "cblas_ssymm", + API_SUFFIX(cblas_xerbla)(3, "cblas_ssymm", "Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; @@ -76,7 +76,7 @@ void cblas_ssymm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Side == CblasLeft ) SD='R'; else { - cblas_xerbla(2, "cblas_ssymm", + API_SUFFIX(cblas_xerbla)(2, "cblas_ssymm", "Illegal Side setting, %d\n", Side); CBLAS_CallFromC = 0; RowMajorStrg = 0; @@ -87,7 +87,7 @@ void cblas_ssymm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Uplo == CblasLower ) UL='U'; else { - cblas_xerbla(3, "cblas_ssymm", + API_SUFFIX(cblas_xerbla)(3, "cblas_ssymm", "Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; @@ -100,7 +100,7 @@ void cblas_ssymm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, #endif F77_ssymm(F77_SD, F77_UL, &F77_N, &F77_M, &alpha, A, &F77_lda, B, &F77_ldb, &beta, C, &F77_ldc); - } else cblas_xerbla(1, "cblas_ssymm", + } else API_SUFFIX(cblas_xerbla)(1, "cblas_ssymm", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; diff --git a/CBLAS/src/cblas_ssymv.c b/CBLAS/src/cblas_ssymv.c index 6a005c5487..ecd72a12fb 100644 --- a/CBLAS/src/cblas_ssymv.c +++ b/CBLAS/src/cblas_ssymv.c @@ -9,7 +9,7 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_ssymv(const CBLAS_LAYOUT layout, +void API_SUFFIX(cblas_ssymv)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_INT N, const float alpha, const float *A, const CBLAS_INT lda, const float *X, const CBLAS_INT incX, const float beta, @@ -40,7 +40,7 @@ void cblas_ssymv(const CBLAS_LAYOUT layout, else if (Uplo == CblasLower) UL = 'L'; else { - cblas_xerbla(2, "cblas_ssymv","Illegal Uplo setting, %d\n",Uplo ); + API_SUFFIX(cblas_xerbla)(2, "cblas_ssymv","Illegal Uplo setting, %d\n",Uplo ); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -58,7 +58,7 @@ void cblas_ssymv(const CBLAS_LAYOUT layout, else if (Uplo == CblasLower) UL = 'U'; else { - cblas_xerbla(2, "cblas_ssymv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_ssymv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -69,7 +69,7 @@ void cblas_ssymv(const CBLAS_LAYOUT layout, F77_ssymv(F77_UL, &F77_N, &alpha, A ,&F77_lda, X,&F77_incX, &beta, Y, &F77_incY); } - else cblas_xerbla(1, "cblas_ssymv", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_ssymv", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_ssyr.c b/CBLAS/src/cblas_ssyr.c index 8b960fa99f..2311a47094 100644 --- a/CBLAS/src/cblas_ssyr.c +++ b/CBLAS/src/cblas_ssyr.c @@ -8,7 +8,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_ssyr(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_ssyr)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_INT N, const float alpha, const float *X, const CBLAS_INT incX, float *A, const CBLAS_INT lda) { @@ -36,7 +36,7 @@ void cblas_ssyr(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasUpper) UL = 'U'; else { - cblas_xerbla(2, "cblas_ssyr","Illegal Uplo setting, %d\n",Uplo ); + API_SUFFIX(cblas_xerbla)(2, "cblas_ssyr","Illegal Uplo setting, %d\n",Uplo ); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -54,7 +54,7 @@ void cblas_ssyr(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasUpper) UL = 'L'; else { - cblas_xerbla(2, "cblas_ssyr","Illegal Uplo setting, %d\n",Uplo ); + API_SUFFIX(cblas_xerbla)(2, "cblas_ssyr","Illegal Uplo setting, %d\n",Uplo ); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -63,7 +63,7 @@ void cblas_ssyr(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, F77_UL = C2F_CHAR(&UL); #endif F77_ssyr(F77_UL, &F77_N, &alpha, X, &F77_incX, A, &F77_lda); - } else cblas_xerbla(1, "cblas_ssyr", "Illegal layout setting, %d\n", layout); + } else API_SUFFIX(cblas_xerbla)(1, "cblas_ssyr", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_ssyr2.c b/CBLAS/src/cblas_ssyr2.c index 09512808ae..facf1bed87 100644 --- a/CBLAS/src/cblas_ssyr2.c +++ b/CBLAS/src/cblas_ssyr2.c @@ -9,7 +9,7 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_ssyr2(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_ssyr2)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_INT N, const float alpha, const float *X, const CBLAS_INT incX, const float *Y, const CBLAS_INT incY, float *A, const CBLAS_INT lda) @@ -40,7 +40,7 @@ void cblas_ssyr2(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasUpper) UL = 'U'; else { - cblas_xerbla(2, "cblas_ssyr2","Illegal Uplo setting, %d\n",Uplo ); + API_SUFFIX(cblas_xerbla)(2, "cblas_ssyr2","Illegal Uplo setting, %d\n",Uplo ); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -59,7 +59,7 @@ void cblas_ssyr2(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasUpper) UL = 'L'; else { - cblas_xerbla(2, "cblas_ssyr2","Illegal Uplo setting, %d\n",Uplo ); + API_SUFFIX(cblas_xerbla)(2, "cblas_ssyr2","Illegal Uplo setting, %d\n",Uplo ); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -69,7 +69,7 @@ void cblas_ssyr2(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, #endif F77_ssyr2(F77_UL, &F77_N, &alpha, X, &F77_incX, Y, &F77_incY, A, &F77_lda); - } else cblas_xerbla(1, "cblas_ssyr2", "Illegal layout setting, %d\n", layout); + } else API_SUFFIX(cblas_xerbla)(1, "cblas_ssyr2", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_ssyr2k.c b/CBLAS/src/cblas_ssyr2k.c index 1a375e5df3..ca471b8fac 100644 --- a/CBLAS/src/cblas_ssyr2k.c +++ b/CBLAS/src/cblas_ssyr2k.c @@ -9,7 +9,7 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_ssyr2k(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_ssyr2k)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE Trans, const CBLAS_INT N, const CBLAS_INT K, const float alpha, const float *A, const CBLAS_INT lda, const float *B, const CBLAS_INT ldb, const float beta, @@ -46,7 +46,7 @@ void cblas_ssyr2k(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Uplo == CblasLower ) UL='L'; else { - cblas_xerbla(2, "cblas_ssyr2k", + API_SUFFIX(cblas_xerbla)(2, "cblas_ssyr2k", "Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; @@ -58,7 +58,7 @@ void cblas_ssyr2k(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Trans == CblasNoTrans ) TR='N'; else { - cblas_xerbla(3, "cblas_ssyr2k", + API_SUFFIX(cblas_xerbla)(3, "cblas_ssyr2k", "Illegal Trans setting, %d\n", Trans); CBLAS_CallFromC = 0; RowMajorStrg = 0; @@ -79,7 +79,7 @@ void cblas_ssyr2k(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Uplo == CblasLower ) UL='U'; else { - cblas_xerbla(3, "cblas_ssyr2k", + API_SUFFIX(cblas_xerbla)(3, "cblas_ssyr2k", "Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; @@ -90,7 +90,7 @@ void cblas_ssyr2k(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Trans == CblasNoTrans ) TR='T'; else { - cblas_xerbla(3, "cblas_ssyr2k", + API_SUFFIX(cblas_xerbla)(3, "cblas_ssyr2k", "Illegal Trans setting, %d\n", Trans); CBLAS_CallFromC = 0; RowMajorStrg = 0; @@ -103,7 +103,7 @@ void cblas_ssyr2k(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, #endif F77_ssyr2k(F77_UL, F77_TR, &F77_N, &F77_K, &alpha, A, &F77_lda, B, &F77_ldb, &beta, C, &F77_ldc); - } else cblas_xerbla(1, "cblas_ssyr2k", + } else API_SUFFIX(cblas_xerbla)(1, "cblas_ssyr2k", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; diff --git a/CBLAS/src/cblas_ssyrk.c b/CBLAS/src/cblas_ssyrk.c index 3a2373dd6a..bf9b985087 100644 --- a/CBLAS/src/cblas_ssyrk.c +++ b/CBLAS/src/cblas_ssyrk.c @@ -9,7 +9,7 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_ssyrk(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_ssyrk)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE Trans, const CBLAS_INT N, const CBLAS_INT K, const float alpha, const float *A, const CBLAS_INT lda, const float beta, float *C, const CBLAS_INT ldc) @@ -44,7 +44,7 @@ void cblas_ssyrk(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Uplo == CblasLower ) UL='L'; else { - cblas_xerbla(2, "cblas_ssyrk", + API_SUFFIX(cblas_xerbla)(2, "cblas_ssyrk", "Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; @@ -56,7 +56,7 @@ void cblas_ssyrk(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Trans == CblasNoTrans ) TR='N'; else { - cblas_xerbla(3, "cblas_ssyrk", + API_SUFFIX(cblas_xerbla)(3, "cblas_ssyrk", "Illegal Trans setting, %d\n", Trans); CBLAS_CallFromC = 0; RowMajorStrg = 0; @@ -77,7 +77,7 @@ void cblas_ssyrk(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Uplo == CblasLower ) UL='U'; else { - cblas_xerbla(3, "cblas_ssyrk", + API_SUFFIX(cblas_xerbla)(3, "cblas_ssyrk", "Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; @@ -88,7 +88,7 @@ void cblas_ssyrk(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Trans == CblasNoTrans ) TR='T'; else { - cblas_xerbla(3, "cblas_ssyrk", + API_SUFFIX(cblas_xerbla)(3, "cblas_ssyrk", "Illegal Trans setting, %d\n", Trans); CBLAS_CallFromC = 0; RowMajorStrg = 0; @@ -101,7 +101,7 @@ void cblas_ssyrk(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, #endif F77_ssyrk(F77_UL, F77_TR, &F77_N, &F77_K, &alpha, A, &F77_lda, &beta, C, &F77_ldc); - } else cblas_xerbla(1, "cblas_ssyrk", + } else API_SUFFIX(cblas_xerbla)(1, "cblas_ssyrk", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; diff --git a/CBLAS/src/cblas_stbmv.c b/CBLAS/src/cblas_stbmv.c index d89dbdd43c..9005e747d6 100644 --- a/CBLAS/src/cblas_stbmv.c +++ b/CBLAS/src/cblas_stbmv.c @@ -7,7 +7,7 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_stbmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_stbmv)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE TransA, const CBLAS_DIAG Diag, const CBLAS_INT N, const CBLAS_INT K, const float *A, const CBLAS_INT lda, float *X, const CBLAS_INT incX) @@ -41,7 +41,7 @@ void cblas_stbmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'L'; else { - cblas_xerbla(2, "cblas_stbmv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_stbmv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -51,7 +51,7 @@ void cblas_stbmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (TransA == CblasConjTrans) TA = 'C'; else { - cblas_xerbla(3, "cblas_stbmv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_stbmv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -60,7 +60,7 @@ void cblas_stbmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_stbmv","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(4, "cblas_stbmv","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -80,7 +80,7 @@ void cblas_stbmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'U'; else { - cblas_xerbla(2, "cblas_stbmv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_stbmv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -91,7 +91,7 @@ void cblas_stbmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (TransA == CblasConjTrans) TA = 'N'; else { - cblas_xerbla(3, "cblas_stbmv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_stbmv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -101,7 +101,7 @@ void cblas_stbmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_stbmv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(4, "cblas_stbmv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -115,7 +115,7 @@ void cblas_stbmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, F77_stbmv( F77_UL, F77_TA, F77_DI, &F77_N, &F77_K, A, &F77_lda, X, &F77_incX); } - else cblas_xerbla(1, "cblas_stbmv", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_stbmv", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_stbsv.c b/CBLAS/src/cblas_stbsv.c index 296db6f953..c6ef05f8e5 100644 --- a/CBLAS/src/cblas_stbsv.c +++ b/CBLAS/src/cblas_stbsv.c @@ -7,7 +7,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_stbsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_stbsv)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE TransA, const CBLAS_DIAG Diag, const CBLAS_INT N, const CBLAS_INT K, const float *A, const CBLAS_INT lda, float *X, const CBLAS_INT incX) @@ -41,7 +41,7 @@ void cblas_stbsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'L'; else { - cblas_xerbla(2, "cblas_stbsv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_stbsv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -51,7 +51,7 @@ void cblas_stbsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (TransA == CblasConjTrans) TA = 'C'; else { - cblas_xerbla(3, "cblas_stbsv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_stbsv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -60,7 +60,7 @@ void cblas_stbsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_stbsv","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(4, "cblas_stbsv","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -80,7 +80,7 @@ void cblas_stbsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'U'; else { - cblas_xerbla(2, "cblas_stbsv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_stbsv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -91,7 +91,7 @@ void cblas_stbsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (TransA == CblasConjTrans) TA = 'N'; else { - cblas_xerbla(3, "cblas_stbsv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_stbsv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -101,7 +101,7 @@ void cblas_stbsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_stbsv","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(4, "cblas_stbsv","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -115,7 +115,7 @@ void cblas_stbsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, F77_stbsv( F77_UL, F77_TA, F77_DI, &F77_N, &F77_K, A, &F77_lda, X, &F77_incX); } - else cblas_xerbla(1, "cblas_stbsv", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_stbsv", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_stpmv.c b/CBLAS/src/cblas_stpmv.c index 22f9f6b6fd..bcc5f215d4 100644 --- a/CBLAS/src/cblas_stpmv.c +++ b/CBLAS/src/cblas_stpmv.c @@ -8,7 +8,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_stpmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_stpmv)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE TransA, const CBLAS_DIAG Diag, const CBLAS_INT N, const float *Ap, float *X, const CBLAS_INT incX) { @@ -39,7 +39,7 @@ void cblas_stpmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'L'; else { - cblas_xerbla(2, "cblas_stpmv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_stpmv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -49,7 +49,7 @@ void cblas_stpmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (TransA == CblasConjTrans) TA = 'C'; else { - cblas_xerbla(3, "cblas_stpmv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_stpmv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -58,7 +58,7 @@ void cblas_stpmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_stpmv","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(4, "cblas_stpmv","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -77,7 +77,7 @@ void cblas_stpmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'U'; else { - cblas_xerbla(2, "cblas_stpmv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_stpmv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -88,7 +88,7 @@ void cblas_stpmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (TransA == CblasConjTrans) TA = 'N'; else { - cblas_xerbla(3, "cblas_stpmv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_stpmv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -98,7 +98,7 @@ void cblas_stpmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_stpmv","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(4, "cblas_stpmv","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -111,7 +111,7 @@ void cblas_stpmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, F77_stpmv( F77_UL, F77_TA, F77_DI, &F77_N, Ap, X,&F77_incX); } - else cblas_xerbla(1, "cblas_stpmv", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_stpmv", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_stpsv.c b/CBLAS/src/cblas_stpsv.c index aa3cec9a3b..c729fdbb2f 100644 --- a/CBLAS/src/cblas_stpsv.c +++ b/CBLAS/src/cblas_stpsv.c @@ -7,7 +7,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_stpsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_stpsv)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE TransA, const CBLAS_DIAG Diag, const CBLAS_INT N, const float *Ap, float *X, const CBLAS_INT incX) { @@ -38,7 +38,7 @@ void cblas_stpsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'L'; else { - cblas_xerbla(2, "cblas_stpsv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_stpsv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -48,7 +48,7 @@ void cblas_stpsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (TransA == CblasConjTrans) TA = 'C'; else { - cblas_xerbla(3, "cblas_stpsv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_stpsv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -57,7 +57,7 @@ void cblas_stpsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_stpsv","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(4, "cblas_stpsv","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -76,7 +76,7 @@ void cblas_stpsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'U'; else { - cblas_xerbla(2, "cblas_stpsv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_stpsv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -87,7 +87,7 @@ void cblas_stpsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (TransA == CblasConjTrans) TA = 'N'; else { - cblas_xerbla(3, "cblas_stpsv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_stpsv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -97,7 +97,7 @@ void cblas_stpsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_stpsv","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(4, "cblas_stpsv","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -111,7 +111,7 @@ void cblas_stpsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, F77_stpsv( F77_UL, F77_TA, F77_DI, &F77_N, Ap, X,&F77_incX); } - else cblas_xerbla(1, "cblas_stpsv", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_stpsv", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_strmm.c b/CBLAS/src/cblas_strmm.c index 658e46f42f..49133e5c4e 100644 --- a/CBLAS/src/cblas_strmm.c +++ b/CBLAS/src/cblas_strmm.c @@ -9,7 +9,7 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_strmm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, +void API_SUFFIX(cblas_strmm)(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE TransA, const CBLAS_DIAG Diag, const CBLAS_INT M, const CBLAS_INT N, const float alpha, const float *A, const CBLAS_INT lda, @@ -45,7 +45,7 @@ void cblas_strmm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Side == CblasLeft ) SD='L'; else { - cblas_xerbla(2, "cblas_strmm","Illegal Side setting, %d\n", Side); + API_SUFFIX(cblas_xerbla)(2, "cblas_strmm","Illegal Side setting, %d\n", Side); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -54,7 +54,7 @@ void cblas_strmm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Uplo == CblasLower ) UL='L'; else { - cblas_xerbla(3, "cblas_strmm","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(3, "cblas_strmm","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -65,7 +65,7 @@ void cblas_strmm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( TransA == CblasNoTrans ) TA='N'; else { - cblas_xerbla(4, "cblas_strmm","Illegal Trans setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(4, "cblas_strmm","Illegal Trans setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -75,7 +75,7 @@ void cblas_strmm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Diag == CblasNonUnit ) DI='N'; else { - cblas_xerbla(5, "cblas_strmm", "Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(5, "cblas_strmm", "Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -96,7 +96,7 @@ void cblas_strmm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Side == CblasLeft ) SD='R'; else { - cblas_xerbla(2, "cblas_strmm","Illegal Side setting, %d\n", Side); + API_SUFFIX(cblas_xerbla)(2, "cblas_strmm","Illegal Side setting, %d\n", Side); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -106,7 +106,7 @@ void cblas_strmm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Uplo == CblasLower ) UL='U'; else { - cblas_xerbla(3, "cblas_strmm", "Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(3, "cblas_strmm", "Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -117,7 +117,7 @@ void cblas_strmm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( TransA == CblasNoTrans ) TA='N'; else { - cblas_xerbla(4, "cblas_strmm", "Illegal Trans setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(4, "cblas_strmm", "Illegal Trans setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -127,7 +127,7 @@ void cblas_strmm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Diag == CblasNonUnit ) DI='N'; else { - cblas_xerbla(5, "cblas_strmm","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(5, "cblas_strmm","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -141,7 +141,7 @@ void cblas_strmm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, F77_strmm(F77_SD, F77_UL, F77_TA, F77_DI, &F77_N, &F77_M, &alpha, A, &F77_lda, B, &F77_ldb); } - else cblas_xerbla(1, "cblas_strmm", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_strmm", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_strmv.c b/CBLAS/src/cblas_strmv.c index 57f1841b89..bd7c14d3ad 100644 --- a/CBLAS/src/cblas_strmv.c +++ b/CBLAS/src/cblas_strmv.c @@ -8,7 +8,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_strmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_strmv)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE TransA, const CBLAS_DIAG Diag, const CBLAS_INT N, const float *A, const CBLAS_INT lda, float *X, const CBLAS_INT incX) @@ -42,7 +42,7 @@ void cblas_strmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'L'; else { - cblas_xerbla(2, "cblas_strmv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_strmv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -52,7 +52,7 @@ void cblas_strmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (TransA == CblasConjTrans) TA = 'C'; else { - cblas_xerbla(3, "cblas_strmv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_strmv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -61,7 +61,7 @@ void cblas_strmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_strmv","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(4, "cblas_strmv","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -81,7 +81,7 @@ void cblas_strmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'U'; else { - cblas_xerbla(2, "cblas_strmv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_strmv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -92,7 +92,7 @@ void cblas_strmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (TransA == CblasConjTrans) TA = 'N'; else { - cblas_xerbla(3, "cblas_strmv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_strmv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -102,7 +102,7 @@ void cblas_strmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_strmv","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(4, "cblas_strmv","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -115,7 +115,7 @@ void cblas_strmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, F77_strmv( F77_UL, F77_TA, F77_DI, &F77_N, A, &F77_lda, X, &F77_incX); } - else cblas_xerbla(1, "cblas_strmv", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_strmv", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_strsm.c b/CBLAS/src/cblas_strsm.c index b5811758c8..e883be1dfb 100644 --- a/CBLAS/src/cblas_strsm.c +++ b/CBLAS/src/cblas_strsm.c @@ -9,7 +9,7 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_strsm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, +void API_SUFFIX(cblas_strsm)(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE TransA, const CBLAS_DIAG Diag, const CBLAS_INT M, const CBLAS_INT N, const float alpha, const float *A, const CBLAS_INT lda, @@ -46,7 +46,7 @@ void cblas_strsm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Side == CblasLeft ) SD='L'; else { - cblas_xerbla(2, "cblas_strsm", "Illegal Side setting, %d\n", Side); + API_SUFFIX(cblas_xerbla)(2, "cblas_strsm", "Illegal Side setting, %d\n", Side); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -55,7 +55,7 @@ void cblas_strsm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Uplo == CblasLower ) UL='L'; else { - cblas_xerbla(3, "cblas_strsm", "Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(3, "cblas_strsm", "Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -65,7 +65,7 @@ void cblas_strsm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( TransA == CblasNoTrans ) TA='N'; else { - cblas_xerbla(4, "cblas_strsm", "Illegal Trans setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(4, "cblas_strsm", "Illegal Trans setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -74,7 +74,7 @@ void cblas_strsm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Diag == CblasNonUnit ) DI='N'; else { - cblas_xerbla(5, "cblas_strsm", "Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(5, "cblas_strsm", "Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -94,7 +94,7 @@ void cblas_strsm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Side == CblasLeft ) SD='R'; else { - cblas_xerbla(2, "cblas_strsm", "Illegal Side setting, %d\n", Side); + API_SUFFIX(cblas_xerbla)(2, "cblas_strsm", "Illegal Side setting, %d\n", Side); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -103,7 +103,7 @@ void cblas_strsm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Uplo == CblasLower ) UL='U'; else { - cblas_xerbla(3, "cblas_strsm", "Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(3, "cblas_strsm", "Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -113,7 +113,7 @@ void cblas_strsm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( TransA == CblasNoTrans ) TA='N'; else { - cblas_xerbla(4, "cblas_strsm", "Illegal Trans setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(4, "cblas_strsm", "Illegal Trans setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -122,7 +122,7 @@ void cblas_strsm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Diag == CblasNonUnit ) DI='N'; else { - cblas_xerbla(5, "cblas_strsm", "Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(5, "cblas_strsm", "Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -136,7 +136,7 @@ void cblas_strsm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, F77_strsm(F77_SD, F77_UL, F77_TA, F77_DI, &F77_N, &F77_M, &alpha, A, &F77_lda, B, &F77_ldb); } - else cblas_xerbla(1, "cblas_strsm", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_strsm", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_strsv.c b/CBLAS/src/cblas_strsv.c index cb1b7cbf7c..a98c692dfd 100644 --- a/CBLAS/src/cblas_strsv.c +++ b/CBLAS/src/cblas_strsv.c @@ -7,7 +7,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_strsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_strsv)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE TransA, const CBLAS_DIAG Diag, const CBLAS_INT N, const float *A, const CBLAS_INT lda, float *X, const CBLAS_INT incX) @@ -41,7 +41,7 @@ void cblas_strsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'L'; else { - cblas_xerbla(2, "cblas_strsv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_strsv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -51,7 +51,7 @@ void cblas_strsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (TransA == CblasConjTrans) TA = 'C'; else { - cblas_xerbla(3, "cblas_strsv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_strsv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -60,7 +60,7 @@ void cblas_strsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_strsv","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(4, "cblas_strsv","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -80,7 +80,7 @@ void cblas_strsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'U'; else { - cblas_xerbla(2, "cblas_strsv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_strsv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -91,7 +91,7 @@ void cblas_strsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (TransA == CblasConjTrans) TA = 'N'; else { - cblas_xerbla(3, "cblas_strsv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_strsv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -101,7 +101,7 @@ void cblas_strsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_strsv","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(4, "cblas_strsv","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -114,7 +114,7 @@ void cblas_strsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, F77_strsv( F77_UL, F77_TA, F77_DI, &F77_N, A, &F77_lda, X, &F77_incX); } - else cblas_xerbla(1, "cblas_strsv", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_strsv", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_xerbla.c b/CBLAS/src/cblas_xerbla.c index 6a24d2f77b..f353153a42 100644 --- a/CBLAS/src/cblas_xerbla.c +++ b/CBLAS/src/cblas_xerbla.c @@ -9,7 +9,7 @@ void #ifdef HAS_ATTRIBUTE_WEAK_SUPPORT __attribute__((weak)) #endif -cblas_xerbla(CBLAS_INT info, const char *rout, const char *form, ...) +API_SUFFIX(cblas_xerbla)(CBLAS_INT info, const char *rout, const char *form, ...) { extern int RowMajorStrg; char empty[1] = ""; @@ -63,7 +63,7 @@ cblas_xerbla(CBLAS_INT info, const char *rout, const char *form, ...) } } if (info) - fprintf(stderr, "Parameter %d to routine %s was incorrect\n", info, rout); + fprintf(stderr, "Parameter %" CBLAS_IFMT " to routine %s was incorrect\n", info, rout); vfprintf(stderr, form, argptr); va_end(argptr); if (info && !info) diff --git a/CBLAS/src/cblas_zaxpby.c b/CBLAS/src/cblas_zaxpby.c new file mode 100644 index 0000000000..3aebecac8b --- /dev/null +++ b/CBLAS/src/cblas_zaxpby.c @@ -0,0 +1,22 @@ +/* + * cblas_zaxpby.c + * + * The program is a C interface to zaxpby. + * + * Written by Martin Koehler, 08/26/2024 + * + */ +#include "cblas.h" +#include "cblas_f77.h" +void API_SUFFIX(cblas_zaxpby)( const CBLAS_INT N, const void *alpha, const void *X, + const CBLAS_INT incX, const void *beta, void *Y, const CBLAS_INT incY) +{ +#ifdef F77_INT + F77_INT F77_N=N, F77_incX=incX, F77_incY=incY; +#else + #define F77_N N + #define F77_incX incX + #define F77_incY incY +#endif + F77_zaxpby( &F77_N, alpha, X, &F77_incX, beta, Y, &F77_incY); +} diff --git a/CBLAS/src/cblas_zaxpy.c b/CBLAS/src/cblas_zaxpy.c index 5ea07904c7..0612cb3fbc 100644 --- a/CBLAS/src/cblas_zaxpy.c +++ b/CBLAS/src/cblas_zaxpy.c @@ -8,7 +8,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_zaxpy( const CBLAS_INT N, const void *alpha, const void *X, +void API_SUFFIX(cblas_zaxpy)( const CBLAS_INT N, const void *alpha, const void *X, const CBLAS_INT incX, void *Y, const CBLAS_INT incY) { #ifdef F77_INT diff --git a/CBLAS/src/cblas_zcopy.c b/CBLAS/src/cblas_zcopy.c index 8524cbed8a..b02d509802 100644 --- a/CBLAS/src/cblas_zcopy.c +++ b/CBLAS/src/cblas_zcopy.c @@ -8,7 +8,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_zcopy( const CBLAS_INT N, const void *X, +void API_SUFFIX(cblas_zcopy)( const CBLAS_INT N, const void *X, const CBLAS_INT incX, void *Y, const CBLAS_INT incY) { #ifdef F77_INT diff --git a/CBLAS/src/cblas_zdotc_sub.c b/CBLAS/src/cblas_zdotc_sub.c index 0e9f35dec4..45d87bbf64 100644 --- a/CBLAS/src/cblas_zdotc_sub.c +++ b/CBLAS/src/cblas_zdotc_sub.c @@ -9,7 +9,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_zdotc_sub( const CBLAS_INT N, const void *X, const CBLAS_INT incX, +void API_SUFFIX(cblas_zdotc_sub)( const CBLAS_INT N, const void *X, const CBLAS_INT incX, const void *Y, const CBLAS_INT incY, void *dotc) { #ifdef F77_INT diff --git a/CBLAS/src/cblas_zdotu_sub.c b/CBLAS/src/cblas_zdotu_sub.c index cf575bcd7c..d6766e64bd 100644 --- a/CBLAS/src/cblas_zdotu_sub.c +++ b/CBLAS/src/cblas_zdotu_sub.c @@ -9,7 +9,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_zdotu_sub( const CBLAS_INT N, const void *X, const CBLAS_INT incX, +void API_SUFFIX(cblas_zdotu_sub)( const CBLAS_INT N, const void *X, const CBLAS_INT incX, const void *Y, const CBLAS_INT incY, void *dotu) { #ifdef F77_INT diff --git a/CBLAS/src/cblas_zdrot.c b/CBLAS/src/cblas_zdrot.c new file mode 100644 index 0000000000..d208a3034e --- /dev/null +++ b/CBLAS/src/cblas_zdrot.c @@ -0,0 +1,21 @@ +/* + * cblas_zdrot.c + * + * The program is a C interface to zdrot. + * + */ +#include "cblas.h" +#include "cblas_f77.h" +void API_SUFFIX(cblas_zdrot)(const CBLAS_INT N, void *X, const CBLAS_INT incX, + void *Y, const CBLAS_INT incY, const double c, const double s) +{ +#ifdef F77_INT + F77_INT F77_N=N, F77_incX=incX, F77_incY=incY; +#else + #define F77_N N + #define F77_incX incX + #define F77_incY incY +#endif + F77_zdrot(&F77_N, X, &F77_incX, Y, &F77_incY, &c, &s); + return; +} diff --git a/CBLAS/src/cblas_zdscal.c b/CBLAS/src/cblas_zdscal.c index a365b02af0..0bebcdfd9e 100644 --- a/CBLAS/src/cblas_zdscal.c +++ b/CBLAS/src/cblas_zdscal.c @@ -8,7 +8,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_zdscal( const CBLAS_INT N, const double alpha, void *X, +void API_SUFFIX(cblas_zdscal)( const CBLAS_INT N, const double alpha, void *X, const CBLAS_INT incX) { #ifdef F77_INT diff --git a/CBLAS/src/cblas_zgbmv.c b/CBLAS/src/cblas_zgbmv.c index 0d0b3427f0..6efd9be78c 100644 --- a/CBLAS/src/cblas_zgbmv.c +++ b/CBLAS/src/cblas_zgbmv.c @@ -7,9 +7,10 @@ */ #include #include +#include #include "cblas.h" #include "cblas_f77.h" -void cblas_zgbmv(const CBLAS_LAYOUT layout, +void API_SUFFIX(cblas_zgbmv)(const CBLAS_LAYOUT layout, const CBLAS_TRANSPOSE TransA, const CBLAS_INT M, const CBLAS_INT N, const CBLAS_INT KL, const CBLAS_INT KU, const void *alpha, const void *A, const CBLAS_INT lda, @@ -26,6 +27,7 @@ void cblas_zgbmv(const CBLAS_LAYOUT layout, F77_INT F77_M=M, F77_N=N, F77_lda=lda, F77_incX=incX, F77_incY=incY; F77_INT F77_KL=KL,F77_KU=KU; #else + CBLAS_INT incx = incX; #define F77_M M #define F77_N N #define F77_lda lda @@ -34,15 +36,18 @@ void cblas_zgbmv(const CBLAS_LAYOUT layout, #define F77_incX incx #define F77_incY incY #endif - CBLAS_INT n, i=0, incx=incX; - const double *xx= (double *)X, *alp= (double *)alpha, *bet = (double *)beta; + CBLAS_INT n, i=0; + const double *xx= (const double *)X, *alp= (const double *)alpha, *bet = (const double *)beta; double ALPHA[2],BETA[2]; CBLAS_INT tincY, tincx; - double *x=(double *)X, *y=(double *)Y, *st=0, *tx; + double *x, *y, *st=0, *tx; extern int CBLAS_CallFromC; extern int RowMajorStrg; RowMajorStrg = 0; + memcpy(&x,&X,sizeof(double*)); + memcpy(&y,&Y,sizeof(double*)); + CBLAS_CallFromC = 1; if (layout == CblasColMajor) { @@ -51,7 +56,7 @@ void cblas_zgbmv(const CBLAS_LAYOUT layout, else if (TransA == CblasConjTrans) TA = 'C'; else { - cblas_xerbla(2, "cblas_zgbmv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(2, "cblas_zgbmv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -125,13 +130,14 @@ void cblas_zgbmv(const CBLAS_LAYOUT layout, y -= n; } } - else x = (double *) X; + else + memcpy(&x,&X,sizeof(double*)); } else { - cblas_xerbla(2, "cblas_zgbmv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(2, "cblas_zgbmv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -159,7 +165,7 @@ void cblas_zgbmv(const CBLAS_LAYOUT layout, } } } - else cblas_xerbla(1, "cblas_zgbmv", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_zgbmv", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_zgemm.c b/CBLAS/src/cblas_zgemm.c index 38c9cfb60f..9b3b66e568 100644 --- a/CBLAS/src/cblas_zgemm.c +++ b/CBLAS/src/cblas_zgemm.c @@ -9,7 +9,7 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_zgemm(const CBLAS_LAYOUT layout, const CBLAS_TRANSPOSE TransA, +void API_SUFFIX(cblas_zgemm)(const CBLAS_LAYOUT layout, const CBLAS_TRANSPOSE TransA, const CBLAS_TRANSPOSE TransB, const CBLAS_INT M, const CBLAS_INT N, const CBLAS_INT K, const void *alpha, const void *A, const CBLAS_INT lda, const void *B, const CBLAS_INT ldb, @@ -47,7 +47,7 @@ void cblas_zgemm(const CBLAS_LAYOUT layout, const CBLAS_TRANSPOSE TransA, else if ( TransA == CblasNoTrans ) TA='N'; else { - cblas_xerbla(2, "cblas_zgemm","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(2, "cblas_zgemm","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -58,7 +58,7 @@ void cblas_zgemm(const CBLAS_LAYOUT layout, const CBLAS_TRANSPOSE TransA, else if ( TransB == CblasNoTrans ) TB='N'; else { - cblas_xerbla(3, "cblas_zgemm","Illegal TransB setting, %d\n", TransB); + API_SUFFIX(cblas_xerbla)(3, "cblas_zgemm","Illegal TransB setting, %d\n", TransB); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -79,7 +79,7 @@ void cblas_zgemm(const CBLAS_LAYOUT layout, const CBLAS_TRANSPOSE TransA, else if ( TransA == CblasNoTrans ) TB='N'; else { - cblas_xerbla(2, "cblas_zgemm","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(2, "cblas_zgemm","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -89,7 +89,7 @@ void cblas_zgemm(const CBLAS_LAYOUT layout, const CBLAS_TRANSPOSE TransA, else if ( TransB == CblasNoTrans ) TA='N'; else { - cblas_xerbla(2, "cblas_zgemm","Illegal TransB setting, %d\n", TransB); + API_SUFFIX(cblas_xerbla)(3, "cblas_zgemm","Illegal TransB setting, %d\n", TransB); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -102,7 +102,7 @@ void cblas_zgemm(const CBLAS_LAYOUT layout, const CBLAS_TRANSPOSE TransA, F77_zgemm(F77_TA, F77_TB, &F77_N, &F77_M, &F77_K, alpha, B, &F77_ldb, A, &F77_lda, beta, C, &F77_ldc); } - else cblas_xerbla(1, "cblas_zgemm", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_zgemm", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_zgemmtr.c b/CBLAS/src/cblas_zgemmtr.c new file mode 100644 index 0000000000..4d884d944a --- /dev/null +++ b/CBLAS/src/cblas_zgemmtr.c @@ -0,0 +1,135 @@ +/* + * + * cblas_zgemmtr.c + * This program is a C interface to zgemmtr. + * Written by Martin Koehler, MPI Magdeburg + * 06/24/2024 + * + */ + +#include "cblas.h" +#include "cblas_f77.h" +void API_SUFFIX(cblas_zgemmtr)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE TransA, + const CBLAS_TRANSPOSE TransB, const CBLAS_INT N, + const CBLAS_INT K, const void *alpha, const void *A, + const CBLAS_INT lda, const void *B, const CBLAS_INT ldb, + const void *beta, void *C, const CBLAS_INT ldc) +{ + char TA, TB, UL; +#ifdef F77_CHAR + F77_CHAR F77_TA, F77_TB, F77_UL; +#else +#define F77_TA &TA +#define F77_TB &TB +#define F77_UL &UL +#endif + +#ifdef F77_INT + F77_INT F77_N=N, F77_K=K, F77_lda=lda, F77_ldb=ldb; + F77_INT F77_ldc=ldc; +#else +#define F77_N N +#define F77_K K +#define F77_lda lda +#define F77_ldb ldb +#define F77_ldc ldc +#endif + + extern int CBLAS_CallFromC; + extern int RowMajorStrg; + RowMajorStrg = 0; + CBLAS_CallFromC = 1; + + + if( layout == CblasColMajor ) + { + if ( Uplo == CblasUpper ) UL = 'U'; + else if (Uplo == CblasLower) UL= 'L'; + else { + API_SUFFIX(cblas_xerbla)(2, "cblas_zgemmtr", "Illegal Uplo setting, %d\n", Uplo); + CBLAS_CallFromC = 0; + RowMajorStrg = 0; + return; + } + + + if(TransA == CblasTrans) TA='T'; + else if ( TransA == CblasConjTrans ) TA='C'; + else if ( TransA == CblasNoTrans ) TA='N'; + else + { + API_SUFFIX(cblas_xerbla)(3, "cblas_zgemmtr","Illegal TransA setting, %d\n", TransA); + CBLAS_CallFromC = 0; + RowMajorStrg = 0; + return; + } + + if(TransB == CblasTrans) TB='T'; + else if ( TransB == CblasConjTrans ) TB='C'; + else if ( TransB == CblasNoTrans ) TB='N'; + else + { + API_SUFFIX(cblas_xerbla)(4, "cblas_zgemmtr","Illegal TransB setting, %d\n", TransB); + CBLAS_CallFromC = 0; + RowMajorStrg = 0; + return; + } + +#ifdef F77_CHAR + F77_TA = C2F_CHAR(&TA); + F77_TB = C2F_CHAR(&TB); + F77_UL = C2F_CHAR(&UL); +#endif + + F77_zgemmtr(F77_UL, F77_TA, F77_TB, &F77_N, &F77_K, alpha, A, + &F77_lda, B, &F77_ldb, beta, C, &F77_ldc); + } + else if (layout == CblasRowMajor) + { + RowMajorStrg = 1; + + if ( Uplo == CblasUpper ) UL = 'L'; + else if (Uplo == CblasLower) UL= 'U'; + else { + API_SUFFIX(cblas_xerbla)(2, "cblas_cgemmtr", "Illegal Uplo setting, %d\n", Uplo); + CBLAS_CallFromC = 0; + RowMajorStrg = 0; + return; + } + + if(TransA == CblasTrans) TB='T'; + else if ( TransA == CblasConjTrans ) TB='C'; + else if ( TransA == CblasNoTrans ) TB='N'; + else + { + API_SUFFIX(cblas_xerbla)(3, "zblas_cgemmtr", "Illegal TransA setting, %d\n", TransA); + CBLAS_CallFromC = 0; + RowMajorStrg = 0; + return; + } + if(TransB == CblasTrans) TA='T'; + else if ( TransB == CblasConjTrans ) TA='C'; + else if ( TransB == CblasNoTrans ) TA='N'; + else + { + API_SUFFIX(cblas_xerbla)(4, "zblas_cgemmtr", "Illegal TransB setting, %d\n", TransB); + CBLAS_CallFromC = 0; + RowMajorStrg = 0; + return; + } +#ifdef F77_CHAR + F77_TA = C2F_CHAR(&TA); + F77_TB = C2F_CHAR(&TB); + F77_UL = C2F_CHAR(&UL); + +#endif + + F77_zgemmtr(F77_UL, F77_TA, F77_TB, &F77_N, &F77_K, alpha, B, + &F77_ldb, A, &F77_lda, beta, C, &F77_ldc); + } + + else API_SUFFIX(cblas_xerbla)(1, "cblas_zgemmtr", "Illegal layout setting, %d\n", layout); + CBLAS_CallFromC = 0; + RowMajorStrg = 0; + return; +} diff --git a/CBLAS/src/cblas_zgemv.c b/CBLAS/src/cblas_zgemv.c index c3d8a9f5d0..930f4f9cb4 100644 --- a/CBLAS/src/cblas_zgemv.c +++ b/CBLAS/src/cblas_zgemv.c @@ -7,9 +7,10 @@ */ #include #include +#include #include "cblas.h" #include "cblas_f77.h" -void cblas_zgemv(const CBLAS_LAYOUT layout, +void API_SUFFIX(cblas_zgemv)(const CBLAS_LAYOUT layout, const CBLAS_TRANSPOSE TransA, const CBLAS_INT M, const CBLAS_INT N, const void *alpha, const void *A, const CBLAS_INT lda, const void *X, const CBLAS_INT incX, const void *beta, @@ -24,6 +25,7 @@ void cblas_zgemv(const CBLAS_LAYOUT layout, #ifdef F77_INT F77_INT F77_M=M, F77_N=N, F77_lda=lda, F77_incX=incX, F77_incY=incY; #else + CBLAS_INT incx = incX; #define F77_M M #define F77_N N #define F77_lda lda @@ -31,15 +33,18 @@ void cblas_zgemv(const CBLAS_LAYOUT layout, #define F77_incY incY #endif - CBLAS_INT n, i=0, incx=incX; - const double *xx= (double *)X, *alp= (double *)alpha, *bet = (double *)beta; + CBLAS_INT n, i=0; + const double *xx= (const double *)X, *alp= (const double *)alpha, *bet = (const double *)beta; double ALPHA[2],BETA[2]; CBLAS_INT tincY, tincx; - double *x=(double *)X, *y=(double *)Y, *st=0, *tx; + double *x, *y, *st=0, *tx; extern int CBLAS_CallFromC; extern int RowMajorStrg; RowMajorStrg = 0; + memcpy(&x,&X,sizeof(double*)); + memcpy(&y,&Y,sizeof(double*)); + CBLAS_CallFromC = 1; if (layout == CblasColMajor) @@ -49,7 +54,7 @@ void cblas_zgemv(const CBLAS_LAYOUT layout, else if (TransA == CblasConjTrans) TA = 'C'; else { - cblas_xerbla(2, "cblas_zgemv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(2, "cblas_zgemv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -124,11 +129,12 @@ void cblas_zgemv(const CBLAS_LAYOUT layout, y -= n; } } - else x = (double *) X; + else + memcpy(&x,&X,sizeof(double*)); } else { - cblas_xerbla(2, "cblas_zgemv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(2, "cblas_zgemv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -145,7 +151,7 @@ void cblas_zgemv(const CBLAS_LAYOUT layout, if (TransA == CblasConjTrans) { - if (x != (double *)X) free(x); + if (x != X) free(x); if (N > 0) { do @@ -157,7 +163,7 @@ void cblas_zgemv(const CBLAS_LAYOUT layout, } } } - else cblas_xerbla(1, "cblas_zgemv", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_zgemv", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_zgerc.c b/CBLAS/src/cblas_zgerc.c index 0e3f8afcb5..e0f801e2e3 100644 --- a/CBLAS/src/cblas_zgerc.c +++ b/CBLAS/src/cblas_zgerc.c @@ -7,15 +7,18 @@ */ #include #include +#include + #include "cblas.h" #include "cblas_f77.h" -void cblas_zgerc(const CBLAS_LAYOUT layout, const CBLAS_INT M, const CBLAS_INT N, +void API_SUFFIX(cblas_zgerc)(const CBLAS_LAYOUT layout, const CBLAS_INT M, const CBLAS_INT N, const void *alpha, const void *X, const CBLAS_INT incX, const void *Y, const CBLAS_INT incY, void *A, const CBLAS_INT lda) { #ifdef F77_INT F77_INT F77_M=M, F77_N=N, F77_lda=lda, F77_incX=incX, F77_incY=incY; #else + CBLAS_INT incy = incY; #define F77_M M #define F77_N N #define F77_incX incX @@ -23,13 +26,16 @@ void cblas_zgerc(const CBLAS_LAYOUT layout, const CBLAS_INT M, const CBLAS_INT N #define F77_lda lda #endif - CBLAS_INT n, i, tincy, incy=incY; - double *y=(double *)Y, *yy=(double *)Y, *ty, *st; + CBLAS_INT n, i, tincy; + double *y, *yy, *ty, *st; extern int CBLAS_CallFromC; extern int RowMajorStrg; RowMajorStrg = 0; + memcpy(&y,&Y,sizeof(double*)); + memcpy(&yy,&Y,sizeof(double*)); + CBLAS_CallFromC = 1; if (layout == CblasColMajor) { @@ -56,7 +62,7 @@ void cblas_zgerc(const CBLAS_LAYOUT layout, const CBLAS_INT M, const CBLAS_INT N } do { - *y = *yy; + *y = (double) *yy; y[1] = -yy[1]; y += tincy ; yy += i; @@ -70,14 +76,15 @@ void cblas_zgerc(const CBLAS_LAYOUT layout, const CBLAS_INT M, const CBLAS_INT N incy = 1; #endif } - else y = (double *) Y; + else + memcpy(&y,&Y,sizeof(double*)); F77_zgeru( &F77_N, &F77_M, alpha, y, &F77_incY, X, &F77_incX, A, &F77_lda); if(Y!=y) free(y); - } else cblas_xerbla(1, "cblas_zgerc", "Illegal layout setting, %d\n", layout); + } else API_SUFFIX(cblas_xerbla)(1, "cblas_zgerc", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_zgeru.c b/CBLAS/src/cblas_zgeru.c index 424f1f3e70..d1a128ca2f 100644 --- a/CBLAS/src/cblas_zgeru.c +++ b/CBLAS/src/cblas_zgeru.c @@ -7,7 +7,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_zgeru(const CBLAS_LAYOUT layout, const CBLAS_INT M, const CBLAS_INT N, +void API_SUFFIX(cblas_zgeru)(const CBLAS_LAYOUT layout, const CBLAS_INT M, const CBLAS_INT N, const void *alpha, const void *X, const CBLAS_INT incX, const void *Y, const CBLAS_INT incY, void *A, const CBLAS_INT lda) { @@ -37,7 +37,7 @@ void cblas_zgeru(const CBLAS_LAYOUT layout, const CBLAS_INT M, const CBLAS_INT N F77_zgeru( &F77_N, &F77_M, alpha, Y, &F77_incY, X, &F77_incX, A, &F77_lda); } - else cblas_xerbla(1, "cblas_zgeru", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_zgeru", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_zhbmv.c b/CBLAS/src/cblas_zhbmv.c index c97ae7cddd..0808f57946 100644 --- a/CBLAS/src/cblas_zhbmv.c +++ b/CBLAS/src/cblas_zhbmv.c @@ -9,7 +9,9 @@ #include "cblas_f77.h" #include #include -void cblas_zhbmv(const CBLAS_LAYOUT layout, +#include + +void API_SUFFIX(cblas_zhbmv)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo,const CBLAS_INT N,const CBLAS_INT K, const void *alpha, const void *A, const CBLAS_INT lda, const void *X, const CBLAS_INT incX, const void *beta, @@ -24,21 +26,25 @@ void cblas_zhbmv(const CBLAS_LAYOUT layout, #ifdef F77_INT F77_INT F77_N=N, F77_K=K, F77_lda=lda, F77_incX=incX, F77_incY=incY; #else + CBLAS_INT incx = incX; #define F77_N N #define F77_K K #define F77_lda lda #define F77_incX incx #define F77_incY incY #endif - CBLAS_INT n, i=0, incx=incX; - const double *xx= (double *)X, *alp= (double *)alpha, *bet = (double *)beta; + CBLAS_INT n, i=0; + const double *xx= (const double *)X, *alp= (const double *)alpha, *bet = (const double *)beta; double ALPHA[2],BETA[2]; CBLAS_INT tincY, tincx; - double *x=(double *)X, *y=(double *)Y, *st=0, *tx; + double *x, *y, *st=0, *tx; extern int CBLAS_CallFromC; extern int RowMajorStrg; RowMajorStrg = 0; + memcpy(&x,&X,sizeof(double*)); + memcpy(&y,&Y,sizeof(double*)); + CBLAS_CallFromC = 1; if (layout == CblasColMajor) { @@ -46,7 +52,7 @@ void cblas_zhbmv(const CBLAS_LAYOUT layout, else if (Uplo == CblasUpper) UL = 'U'; else { - cblas_xerbla(2, "cblas_zhbmv","Illegal Uplo setting, %d\n",Uplo ); + API_SUFFIX(cblas_xerbla)(2, "cblas_zhbmv","Illegal Uplo setting, %d\n",Uplo ); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -114,13 +120,13 @@ void cblas_zhbmv(const CBLAS_LAYOUT layout, } while(y != st); y -= n; } else - x = (double *) X; + memcpy(&x,&X,sizeof(double*)); if (Uplo == CblasUpper) UL = 'L'; else if (Uplo == CblasLower) UL = 'U'; else { - cblas_xerbla(2, "cblas_zhbmv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_zhbmv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -133,7 +139,7 @@ void cblas_zhbmv(const CBLAS_LAYOUT layout, } else { - cblas_xerbla(1, "cblas_zhbmv","Illegal layout setting, %d\n", layout); + API_SUFFIX(cblas_xerbla)(1, "cblas_zhbmv","Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_zhemm.c b/CBLAS/src/cblas_zhemm.c index be41d471af..98fb7084db 100644 --- a/CBLAS/src/cblas_zhemm.c +++ b/CBLAS/src/cblas_zhemm.c @@ -9,7 +9,7 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_zhemm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, +void API_SUFFIX(cblas_zhemm)(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, const CBLAS_UPLO Uplo, const CBLAS_INT M, const CBLAS_INT N, const void *alpha, const void *A, const CBLAS_INT lda, const void *B, const CBLAS_INT ldb, const void *beta, @@ -45,7 +45,7 @@ void cblas_zhemm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Side == CblasLeft ) SD='L'; else { - cblas_xerbla(2, "cblas_zhemm", "Illegal Side setting, %d\n", Side); + API_SUFFIX(cblas_xerbla)(2, "cblas_zhemm", "Illegal Side setting, %d\n", Side); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -55,7 +55,7 @@ void cblas_zhemm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Uplo == CblasLower ) UL='L'; else { - cblas_xerbla(3, "cblas_zhemm", "Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(3, "cblas_zhemm", "Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -75,7 +75,7 @@ void cblas_zhemm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Side == CblasLeft ) SD='R'; else { - cblas_xerbla(2, "cblas_zhemm", "Illegal Side setting, %d\n", Side); + API_SUFFIX(cblas_xerbla)(2, "cblas_zhemm", "Illegal Side setting, %d\n", Side); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -85,7 +85,7 @@ void cblas_zhemm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Uplo == CblasLower ) UL='U'; else { - cblas_xerbla(3, "cblas_zhemm", "Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(3, "cblas_zhemm", "Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -99,7 +99,7 @@ void cblas_zhemm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, F77_zhemm(F77_SD, F77_UL, &F77_N, &F77_M, alpha, A, &F77_lda, B, &F77_ldb, beta, C, &F77_ldc); } - else cblas_xerbla(1, "cblas_zhemm", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_zhemm", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_zhemv.c b/CBLAS/src/cblas_zhemv.c index c123ba25f3..28a0a7da5f 100644 --- a/CBLAS/src/cblas_zhemv.c +++ b/CBLAS/src/cblas_zhemv.c @@ -7,9 +7,10 @@ */ #include #include +#include #include "cblas.h" #include "cblas_f77.h" -void cblas_zhemv(const CBLAS_LAYOUT layout, +void API_SUFFIX(cblas_zhemv)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_INT N, const void *alpha, const void *A, const CBLAS_INT lda, const void *X, const CBLAS_INT incX, const void *beta, @@ -24,20 +25,23 @@ void cblas_zhemv(const CBLAS_LAYOUT layout, #ifdef F77_INT F77_INT F77_N=N, F77_lda=lda, F77_incX=incX, F77_incY=incY; #else + CBLAS_INT incx = incX; #define F77_N N #define F77_lda lda #define F77_incX incx #define F77_incY incY #endif - CBLAS_INT n, i=0, incx=incX; - const double *xx= (double *)X, *alp= (double *)alpha, *bet = (double *)beta; + CBLAS_INT n, i=0; + const double *xx= (const double *)X, *alp= (const double *)alpha, *bet = (const double *)beta; double ALPHA[2],BETA[2]; CBLAS_INT tincY, tincx; - double *x=(double *)X, *y=(double *)Y, *st=0, *tx; + double *x, *y, *st=0, *tx; extern int CBLAS_CallFromC; extern int RowMajorStrg; RowMajorStrg = 0; + memcpy(&x,&X,sizeof(double*)); + memcpy(&y,&Y,sizeof(double*)); CBLAS_CallFromC = 1; if (layout == CblasColMajor) @@ -46,7 +50,7 @@ void cblas_zhemv(const CBLAS_LAYOUT layout, else if (Uplo == CblasLower) UL = 'L'; else { - cblas_xerbla(2, "cblas_zhemv","Illegal Uplo setting, %d\n",Uplo ); + API_SUFFIX(cblas_xerbla)(2, "cblas_zhemv","Illegal Uplo setting, %d\n",Uplo ); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -114,14 +118,15 @@ void cblas_zhemv(const CBLAS_LAYOUT layout, } while(y != st); y -= n; } else - x = (double *) X; + memcpy(&x,&X,sizeof(double*)); + if (Uplo == CblasUpper) UL = 'L'; else if (Uplo == CblasLower) UL = 'U'; else { - cblas_xerbla(2, "cblas_zhemv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_zhemv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -134,7 +139,7 @@ void cblas_zhemv(const CBLAS_LAYOUT layout, } else { - cblas_xerbla(1, "cblas_zhemv","Illegal layout setting, %d\n", layout); + API_SUFFIX(cblas_xerbla)(1, "cblas_zhemv","Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_zher.c b/CBLAS/src/cblas_zher.c index 196d735fd5..5af15f6b40 100644 --- a/CBLAS/src/cblas_zher.c +++ b/CBLAS/src/cblas_zher.c @@ -7,9 +7,10 @@ */ #include #include +#include #include "cblas.h" #include "cblas_f77.h" -void cblas_zher(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_zher)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_INT N, const double alpha, const void *X, const CBLAS_INT incX ,void *A, const CBLAS_INT lda) { @@ -23,17 +24,22 @@ void cblas_zher(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, #ifdef F77_INT F77_INT F77_N=N, F77_lda=lda, F77_incX=incX; #else + CBLAS_INT incx = incX; #define F77_N N #define F77_lda lda #define F77_incX incx #endif - CBLAS_INT n, i, tincx, incx=incX; - double *x=(double *)X, *xx=(double *)X, *tx, *st; + CBLAS_INT n, i, tincx; + double *x, *xx, *tx, *st; extern int CBLAS_CallFromC; extern int RowMajorStrg; RowMajorStrg = 0; + + memcpy(&x,&X,sizeof(double*)); + memcpy(&xx,&X,sizeof(double*)); + CBLAS_CallFromC = 1; if (layout == CblasColMajor) { @@ -41,7 +47,7 @@ void cblas_zher(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasUpper) UL = 'U'; else { - cblas_xerbla(2, "cblas_zher","Illegal Uplo setting, %d\n",Uplo ); + API_SUFFIX(cblas_xerbla)(2, "cblas_zher","Illegal Uplo setting, %d\n",Uplo ); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -59,7 +65,7 @@ void cblas_zher(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'U'; else { - cblas_xerbla(2, "cblas_zher","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_zher","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -98,9 +104,10 @@ void cblas_zher(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, incx = 1; #endif } - else x = (double *) X; + else + memcpy(&x,&X,sizeof(double*)); F77_zher(F77_UL, &F77_N, &alpha, x, &F77_incX, A, &F77_lda); - } else cblas_xerbla(1, "cblas_zher", "Illegal layout setting, %d\n", layout); + } else API_SUFFIX(cblas_xerbla)(1, "cblas_zher", "Illegal layout setting, %d\n", layout); if(X!=x) free(x); diff --git a/CBLAS/src/cblas_zher2.c b/CBLAS/src/cblas_zher2.c index 6cf2f7d776..1b685a98ea 100644 --- a/CBLAS/src/cblas_zher2.c +++ b/CBLAS/src/cblas_zher2.c @@ -7,9 +7,10 @@ */ #include #include +#include #include "cblas.h" #include "cblas_f77.h" -void cblas_zher2(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_zher2)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_INT N, const void *alpha, const void *X, const CBLAS_INT incX, const void *Y, const CBLAS_INT incY, void *A, const CBLAS_INT lda) { @@ -23,19 +24,27 @@ void cblas_zher2(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, #ifdef F77_INT F77_INT F77_N=N, F77_lda=lda, F77_incX=incX, F77_incY=incY; #else + CBLAS_INT incx = incX, incy = incY; #define F77_N N #define F77_lda lda #define F77_incX incx #define F77_incY incy #endif - CBLAS_INT n, i, j, tincx, tincy, incx=incX, incy=incY; - double *x=(double *)X, *xx=(double *)X, *y=(double *)Y, - *yy=(double *)Y, *tx, *ty, *stx, *sty; + CBLAS_INT n, i, j, tincx, tincy; + double *x, *xx, *y, + *yy, *tx, *ty, *stx, *sty; extern int CBLAS_CallFromC; extern int RowMajorStrg; RowMajorStrg = 0; + + memcpy(&x,&X,sizeof(double*)); + memcpy(&xx,&X,sizeof(double*)); + memcpy(&y,&Y,sizeof(double*)); + memcpy(&yy,&Y,sizeof(double*)); + + CBLAS_CallFromC = 1; if (layout == CblasColMajor) { @@ -43,7 +52,7 @@ void cblas_zher2(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasUpper) UL = 'U'; else { - cblas_xerbla(2, "cblas_zher2", "Illegal Uplo setting, %d\n",Uplo ); + API_SUFFIX(cblas_xerbla)(2, "cblas_zher2", "Illegal Uplo setting, %d\n",Uplo ); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -62,7 +71,7 @@ void cblas_zher2(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'U'; else { - cblas_xerbla(2, "cblas_zher2", "Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_zher2", "Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -129,15 +138,16 @@ void cblas_zher2(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, #endif } else { - x = (double *) X; - y = (double *) Y; + + memcpy(&x,&X,sizeof(double*)); + memcpy(&y,&Y,sizeof(double*)); } F77_zher2(F77_UL, &F77_N, alpha, y, &F77_incY, x, &F77_incX, A, &F77_lda); } else { - cblas_xerbla(1, "cblas_zher2", "Illegal layout setting, %d\n", layout); + API_SUFFIX(cblas_xerbla)(1, "cblas_zher2", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_zher2k.c b/CBLAS/src/cblas_zher2k.c index 2c741ae07c..31a82974cb 100644 --- a/CBLAS/src/cblas_zher2k.c +++ b/CBLAS/src/cblas_zher2k.c @@ -9,7 +9,7 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_zher2k(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_zher2k)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE Trans, const CBLAS_INT N, const CBLAS_INT K, const void *alpha, const void *A, const CBLAS_INT lda, const void *B, const CBLAS_INT ldb, const double beta, @@ -37,7 +37,7 @@ void cblas_zher2k(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, extern int CBLAS_CallFromC; extern int RowMajorStrg; double ALPHA[2]; - const double *alp=(double *)alpha; + const double *alp=(const double *)alpha; CBLAS_CallFromC = 1; RowMajorStrg = 0; @@ -49,7 +49,7 @@ void cblas_zher2k(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Uplo == CblasLower ) UL='L'; else { - cblas_xerbla(2, "cblas_zher2k", "Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_zher2k", "Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -60,7 +60,7 @@ void cblas_zher2k(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Trans == CblasNoTrans ) TR='N'; else { - cblas_xerbla(3, "cblas_zher2k", "Illegal Trans setting, %d\n", Trans); + API_SUFFIX(cblas_xerbla)(3, "cblas_zher2k", "Illegal Trans setting, %d\n", Trans); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -80,7 +80,7 @@ void cblas_zher2k(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Uplo == CblasLower ) UL='U'; else { - cblas_xerbla(2, "cblas_zher2k", "Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_zher2k", "Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -90,7 +90,7 @@ void cblas_zher2k(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Trans == CblasNoTrans ) TR='C'; else { - cblas_xerbla(3, "cblas_zher2k", "Illegal Trans setting, %d\n", Trans); + API_SUFFIX(cblas_xerbla)(3, "cblas_zher2k", "Illegal Trans setting, %d\n", Trans); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -103,7 +103,7 @@ void cblas_zher2k(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, ALPHA[0]= *alp; ALPHA[1]= -alp[1]; F77_zher2k(F77_UL,F77_TR, &F77_N, &F77_K, ALPHA, A, &F77_lda, B, &F77_ldb, &beta, C, &F77_ldc); - } else cblas_xerbla(1, "cblas_zher2k", "Illegal layout setting, %d\n", layout); + } else API_SUFFIX(cblas_xerbla)(1, "cblas_zher2k", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_zherk.c b/CBLAS/src/cblas_zherk.c index 52a7bc222f..8d9ab9e3c2 100644 --- a/CBLAS/src/cblas_zherk.c +++ b/CBLAS/src/cblas_zherk.c @@ -9,7 +9,7 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_zherk(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_zherk)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE Trans, const CBLAS_INT N, const CBLAS_INT K, const double alpha, const void *A, const CBLAS_INT lda, const double beta, void *C, const CBLAS_INT ldc) @@ -43,7 +43,7 @@ void cblas_zherk(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Uplo == CblasLower ) UL='L'; else { - cblas_xerbla(2, "cblas_zherk", "Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_zherk", "Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -54,7 +54,7 @@ void cblas_zherk(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Trans == CblasNoTrans ) TR='N'; else { - cblas_xerbla(3, "cblas_zherk", "Illegal Trans setting, %d\n", Trans); + API_SUFFIX(cblas_xerbla)(3, "cblas_zherk", "Illegal Trans setting, %d\n", Trans); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -74,7 +74,7 @@ void cblas_zherk(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Uplo == CblasLower ) UL='U'; else { - cblas_xerbla(3, "cblas_zherk", "Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(3, "cblas_zherk", "Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -84,7 +84,7 @@ void cblas_zherk(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Trans == CblasNoTrans ) TR='C'; else { - cblas_xerbla(3, "cblas_zherk", "Illegal Trans setting, %d\n", Trans); + API_SUFFIX(cblas_xerbla)(3, "cblas_zherk", "Illegal Trans setting, %d\n", Trans); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -98,7 +98,7 @@ void cblas_zherk(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, F77_zherk(F77_UL, F77_TR, &F77_N, &F77_K, &alpha, A, &F77_lda, &beta, C, &F77_ldc); } - else cblas_xerbla(1, "cblas_zherk", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_zherk", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_zhpmv.c b/CBLAS/src/cblas_zhpmv.c index 325e9fc8ad..7f6cd045b5 100644 --- a/CBLAS/src/cblas_zhpmv.c +++ b/CBLAS/src/cblas_zhpmv.c @@ -7,9 +7,11 @@ */ #include #include +#include + #include "cblas.h" #include "cblas_f77.h" -void cblas_zhpmv(const CBLAS_LAYOUT layout, +void API_SUFFIX(cblas_zhpmv)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo,const CBLAS_INT N, const void *alpha, const void *AP, const void *X, const CBLAS_INT incX, const void *beta, @@ -24,19 +26,23 @@ void cblas_zhpmv(const CBLAS_LAYOUT layout, #ifdef F77_INT F77_INT F77_N=N, F77_incX=incX, F77_incY=incY; #else + CBLAS_INT incx = incX; #define F77_N N #define F77_incX incx #define F77_incY incY #endif - CBLAS_INT n, i=0, incx=incX; - const double *xx= (double *)X, *alp= (double *)alpha, *bet = (double *)beta; + CBLAS_INT n, i=0; + const double *xx= (const double *)X, *alp= (const double *)alpha, *bet = (const double *)beta; double ALPHA[2],BETA[2]; CBLAS_INT tincY, tincx; - double *x=(double *)X, *y=(double *)Y, *st=0, *tx; + double *x, *y, *st=0, *tx; extern int CBLAS_CallFromC; extern int RowMajorStrg; RowMajorStrg = 0; + memcpy(&x,&X,sizeof(double*)); + memcpy(&y,&Y,sizeof(double*)); + CBLAS_CallFromC = 1; if (layout == CblasColMajor) { @@ -44,7 +50,7 @@ void cblas_zhpmv(const CBLAS_LAYOUT layout, else if (Uplo == CblasUpper) UL = 'U'; else { - cblas_xerbla(2, "cblas_zhpmv","Illegal Uplo setting, %d\n",Uplo ); + API_SUFFIX(cblas_xerbla)(2, "cblas_zhpmv","Illegal Uplo setting, %d\n",Uplo ); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -112,14 +118,13 @@ void cblas_zhpmv(const CBLAS_LAYOUT layout, } while(y != st); y -= n; } else - x = (double *) X; - + memcpy(&x,&X,sizeof(double*)); if (Uplo == CblasUpper) UL = 'L'; else if (Uplo == CblasLower) UL = 'U'; else { - cblas_xerbla(2, "cblas_zhpmv","Illegal Uplo setting, %d\n", Uplo ); + API_SUFFIX(cblas_xerbla)(2, "cblas_zhpmv","Illegal Uplo setting, %d\n", Uplo ); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -133,7 +138,7 @@ void cblas_zhpmv(const CBLAS_LAYOUT layout, } else { - cblas_xerbla(1, "cblas_zhpmv","Illegal layout setting, %d\n", layout); + API_SUFFIX(cblas_xerbla)(1, "cblas_zhpmv","Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_zhpr.c b/CBLAS/src/cblas_zhpr.c index a938df595d..9578c82f19 100644 --- a/CBLAS/src/cblas_zhpr.c +++ b/CBLAS/src/cblas_zhpr.c @@ -7,9 +7,10 @@ */ #include #include +#include #include "cblas.h" #include "cblas_f77.h" -void cblas_zhpr(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_zhpr)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_INT N, const double alpha, const void *X, const CBLAS_INT incX, void *A) { @@ -23,16 +24,20 @@ void cblas_zhpr(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, #ifdef F77_INT F77_INT F77_N=N, F77_incX=incX; #else + CBLAS_INT incx = incX; #define F77_N N #define F77_incX incx #endif - CBLAS_INT n, i, tincx, incx=incX; - double *x=(double *)X, *xx=(double *)X, *tx, *st; + CBLAS_INT n, i, tincx; + double *x, *xx, *tx, *st; extern int CBLAS_CallFromC; extern int RowMajorStrg; RowMajorStrg = 0; + memcpy(&x,&X,sizeof(double*)); + memcpy(&xx,&X,sizeof(double*)); + CBLAS_CallFromC = 1; if (layout == CblasColMajor) { @@ -40,7 +45,7 @@ void cblas_zhpr(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasUpper) UL = 'U'; else { - cblas_xerbla(2, "cblas_zhpr","Illegal Uplo setting, %d\n",Uplo ); + API_SUFFIX(cblas_xerbla)(2, "cblas_zhpr","Illegal Uplo setting, %d\n",Uplo ); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -58,7 +63,7 @@ void cblas_zhpr(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'U'; else { - cblas_xerbla(2, "cblas_zhpr","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_zhpr","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -96,13 +101,14 @@ void cblas_zhpr(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, incx = 1; #endif } - else x = (double *) X; + else + memcpy(&x,&X,sizeof(double*)); F77_zhpr(F77_UL, &F77_N, &alpha, x, &F77_incX, A); } else { - cblas_xerbla(1, "cblas_zhpr","Illegal layout setting, %d\n", layout); + API_SUFFIX(cblas_xerbla)(1, "cblas_zhpr","Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_zhpr2.c b/CBLAS/src/cblas_zhpr2.c index c26d7d9253..58ba7d39a7 100644 --- a/CBLAS/src/cblas_zhpr2.c +++ b/CBLAS/src/cblas_zhpr2.c @@ -7,9 +7,10 @@ */ #include #include +#include #include "cblas.h" #include "cblas_f77.h" -void cblas_zhpr2(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_zhpr2)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_INT N,const void *alpha, const void *X, const CBLAS_INT incX,const void *Y, const CBLAS_INT incY, void *Ap) @@ -24,18 +25,24 @@ void cblas_zhpr2(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, #ifdef F77_INT F77_INT F77_N=N, F77_incX=incX, F77_incY=incY; #else + CBLAS_INT incx = incX, incy = incY; #define F77_N N #define F77_incX incx #define F77_incY incy #endif - CBLAS_INT n, i, j, incx=incX, incy=incY; - double *x=(double *)X, *xx=(double *)X, *y=(double *)Y, - *yy=(double *)Y, *stx, *sty; + CBLAS_INT n, i, j; + double *x, *xx, *y, + *yy, *stx, *sty; extern int CBLAS_CallFromC; extern int RowMajorStrg; RowMajorStrg = 0; + memcpy(&x,&X,sizeof(double*)); + memcpy(&xx,&X,sizeof(double*)); + memcpy(&y,&Y,sizeof(double*)); + memcpy(&yy,&Y,sizeof(double*)); + CBLAS_CallFromC = 1; if (layout == CblasColMajor) { @@ -43,7 +50,7 @@ void cblas_zhpr2(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasUpper) UL = 'U'; else { - cblas_xerbla(2, "cblas_zhpr2","Illegal Uplo setting, %d\n",Uplo ); + API_SUFFIX(cblas_xerbla)(2, "cblas_zhpr2","Illegal Uplo setting, %d\n",Uplo ); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -61,7 +68,7 @@ void cblas_zhpr2(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'U'; else { - cblas_xerbla(2, "cblas_zhpr2","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_zhpr2","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -128,14 +135,15 @@ void cblas_zhpr2(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, } else { - x = (double *) X; - y = (void *) Y; + + memcpy(&x,&X,sizeof(double*)); + memcpy(&y,&Y,sizeof(double*)); } F77_zhpr2(F77_UL, &F77_N, alpha, y, &F77_incY, x, &F77_incX, Ap); } else { - cblas_xerbla(1, "cblas_zhpr2","Illegal layout setting, %d\n", layout); + API_SUFFIX(cblas_xerbla)(1, "cblas_zhpr2","Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_zrotg.c b/CBLAS/src/cblas_zrotg.c new file mode 100644 index 0000000000..07d9af0deb --- /dev/null +++ b/CBLAS/src/cblas_zrotg.c @@ -0,0 +1,13 @@ +/* + * cblas_zrotg.c + * + * The program is a C interface to zrotg. + * + */ +#include "cblas.h" +#include "cblas_f77.h" +void API_SUFFIX(cblas_zrotg)(void *a, void *b, double *c, void *s) +{ + F77_zrotg(a,b,c,s); +} + diff --git a/CBLAS/src/cblas_zscal.c b/CBLAS/src/cblas_zscal.c index b93886fcdf..1c146dfd8a 100644 --- a/CBLAS/src/cblas_zscal.c +++ b/CBLAS/src/cblas_zscal.c @@ -8,7 +8,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_zscal( const CBLAS_INT N, const void *alpha, void *X, +void API_SUFFIX(cblas_zscal)( const CBLAS_INT N, const void *alpha, void *X, const CBLAS_INT incX) { #ifdef F77_INT diff --git a/CBLAS/src/cblas_zswap.c b/CBLAS/src/cblas_zswap.c index 9cf8691482..d1aa9fa5ef 100644 --- a/CBLAS/src/cblas_zswap.c +++ b/CBLAS/src/cblas_zswap.c @@ -8,7 +8,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_zswap( const CBLAS_INT N, void *X, const CBLAS_INT incX, void *Y, +void API_SUFFIX(cblas_zswap)( const CBLAS_INT N, void *X, const CBLAS_INT incX, void *Y, const CBLAS_INT incY) { #ifdef F77_INT diff --git a/CBLAS/src/cblas_zsymm.c b/CBLAS/src/cblas_zsymm.c index f66e2470e4..a2550d3878 100644 --- a/CBLAS/src/cblas_zsymm.c +++ b/CBLAS/src/cblas_zsymm.c @@ -9,7 +9,7 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_zsymm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, +void API_SUFFIX(cblas_zsymm)(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, const CBLAS_UPLO Uplo, const CBLAS_INT M, const CBLAS_INT N, const void *alpha, const void *A, const CBLAS_INT lda, const void *B, const CBLAS_INT ldb, const void *beta, @@ -45,7 +45,7 @@ void cblas_zsymm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Side == CblasLeft ) SD='L'; else { - cblas_xerbla(2, "cblas_zsymm", "Illegal Side setting, %d\n", Side); + API_SUFFIX(cblas_xerbla)(2, "cblas_zsymm", "Illegal Side setting, %d\n", Side); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -55,7 +55,7 @@ void cblas_zsymm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Uplo == CblasLower ) UL='L'; else { - cblas_xerbla(3, "cblas_zsymm", "Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(3, "cblas_zsymm", "Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -75,7 +75,7 @@ void cblas_zsymm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Side == CblasLeft ) SD='R'; else { - cblas_xerbla(2, "cblas_zsymm", "Illegal Side setting, %d\n", Side); + API_SUFFIX(cblas_xerbla)(2, "cblas_zsymm", "Illegal Side setting, %d\n", Side); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -85,7 +85,7 @@ void cblas_zsymm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Uplo == CblasLower ) UL='U'; else { - cblas_xerbla(3, "cblas_zsymm", "Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(3, "cblas_zsymm", "Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -99,7 +99,7 @@ void cblas_zsymm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, F77_zsymm(F77_SD, F77_UL, &F77_N, &F77_M, alpha, A, &F77_lda, B, &F77_ldb, beta, C, &F77_ldc); } - else cblas_xerbla(1, "cblas_zsymm", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_zsymm", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_zsyr2k.c b/CBLAS/src/cblas_zsyr2k.c index 3c490268d3..3223229d71 100644 --- a/CBLAS/src/cblas_zsyr2k.c +++ b/CBLAS/src/cblas_zsyr2k.c @@ -9,7 +9,7 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_zsyr2k(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_zsyr2k)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE Trans, const CBLAS_INT N, const CBLAS_INT K, const void *alpha, const void *A, const CBLAS_INT lda, const void *B, const CBLAS_INT ldb, const void *beta, @@ -46,7 +46,7 @@ void cblas_zsyr2k(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Uplo == CblasLower ) UL='L'; else { - cblas_xerbla(2, "cblas_zsyr2k", "Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_zsyr2k", "Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -57,7 +57,7 @@ void cblas_zsyr2k(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Trans == CblasNoTrans ) TR='N'; else { - cblas_xerbla(3, "cblas_zsyr2k", "Illegal Trans setting, %d\n", Trans); + API_SUFFIX(cblas_xerbla)(3, "cblas_zsyr2k", "Illegal Trans setting, %d\n", Trans); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -78,7 +78,7 @@ void cblas_zsyr2k(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Uplo == CblasLower ) UL='U'; else { - cblas_xerbla(3, "cblas_zsyr2k", "Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(3, "cblas_zsyr2k", "Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -88,7 +88,7 @@ void cblas_zsyr2k(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Trans == CblasNoTrans ) TR='T'; else { - cblas_xerbla(3, "cblas_zsyr2k", "Illegal Trans setting, %d\n", Trans); + API_SUFFIX(cblas_xerbla)(3, "cblas_zsyr2k", "Illegal Trans setting, %d\n", Trans); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -101,7 +101,7 @@ void cblas_zsyr2k(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, F77_zsyr2k(F77_UL, F77_TR, &F77_N, &F77_K, alpha, A, &F77_lda, B, &F77_ldb, beta, C, &F77_ldc); } - else cblas_xerbla(1, "cblas_zsyr2k", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_zsyr2k", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_zsyrk.c b/CBLAS/src/cblas_zsyrk.c index 2d5f3394bf..4f5b6b325c 100644 --- a/CBLAS/src/cblas_zsyrk.c +++ b/CBLAS/src/cblas_zsyrk.c @@ -9,7 +9,7 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_zsyrk(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_zsyrk)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE Trans, const CBLAS_INT N, const CBLAS_INT K, const void *alpha, const void *A, const CBLAS_INT lda, const void *beta, void *C, const CBLAS_INT ldc) @@ -44,7 +44,7 @@ void cblas_zsyrk(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Uplo == CblasLower ) UL='L'; else { - cblas_xerbla(2, "cblas_zsyrk", "Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_zsyrk", "Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -55,7 +55,7 @@ void cblas_zsyrk(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Trans == CblasNoTrans ) TR='N'; else { - cblas_xerbla(3, "cblas_zsyrk", "Illegal Trans setting, %d\n", Trans); + API_SUFFIX(cblas_xerbla)(3, "cblas_zsyrk", "Illegal Trans setting, %d\n", Trans); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -76,7 +76,7 @@ void cblas_zsyrk(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Uplo == CblasLower ) UL='U'; else { - cblas_xerbla(3, "cblas_zsyrk", "Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(3, "cblas_zsyrk", "Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -86,7 +86,7 @@ void cblas_zsyrk(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if ( Trans == CblasNoTrans ) TR='T'; else { - cblas_xerbla(3, "cblas_zsyrk", "Illegal Trans setting, %d\n", Trans); + API_SUFFIX(cblas_xerbla)(3, "cblas_zsyrk", "Illegal Trans setting, %d\n", Trans); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -100,7 +100,7 @@ void cblas_zsyrk(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, F77_zsyrk(F77_UL, F77_TR, &F77_N, &F77_K, alpha, A, &F77_lda, beta, C, &F77_ldc); } - else cblas_xerbla(1, "cblas_zsyrk", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_zsyrk", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_ztbmv.c b/CBLAS/src/cblas_ztbmv.c index 437f40c882..3b6f17e236 100644 --- a/CBLAS/src/cblas_ztbmv.c +++ b/CBLAS/src/cblas_ztbmv.c @@ -7,7 +7,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_ztbmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_ztbmv)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE TransA, const CBLAS_DIAG Diag, const CBLAS_INT N, const CBLAS_INT K, const void *A, const CBLAS_INT lda, void *X, const CBLAS_INT incX) @@ -43,7 +43,7 @@ void cblas_ztbmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'L'; else { - cblas_xerbla(2, "cblas_ztbmv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_ztbmv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -53,7 +53,7 @@ void cblas_ztbmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (TransA == CblasConjTrans) TA = 'C'; else { - cblas_xerbla(3, "cblas_ztbmv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_ztbmv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -62,7 +62,7 @@ void cblas_ztbmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_ztbmv","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(4, "cblas_ztbmv","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -82,7 +82,7 @@ void cblas_ztbmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'U'; else { - cblas_xerbla(2, "cblas_ztbmv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_ztbmv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -114,7 +114,7 @@ void cblas_ztbmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, } else { - cblas_xerbla(3, "cblas_ztbmv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_ztbmv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -124,7 +124,7 @@ void cblas_ztbmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_ztbmv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(4, "cblas_ztbmv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -151,7 +151,7 @@ void cblas_ztbmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, } } } - else cblas_xerbla(1, "cblas_ztbmv", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_ztbmv", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_ztbsv.c b/CBLAS/src/cblas_ztbsv.c index 1e286bf90d..ea6b4d3b08 100644 --- a/CBLAS/src/cblas_ztbsv.c +++ b/CBLAS/src/cblas_ztbsv.c @@ -7,7 +7,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_ztbsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_ztbsv)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE TransA, const CBLAS_DIAG Diag, const CBLAS_INT N, const CBLAS_INT K, const void *A, const CBLAS_INT lda, void *X, const CBLAS_INT incX) @@ -43,7 +43,7 @@ void cblas_ztbsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'L'; else { - cblas_xerbla(2, "cblas_ztbsv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_ztbsv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -53,7 +53,7 @@ void cblas_ztbsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (TransA == CblasConjTrans) TA = 'C'; else { - cblas_xerbla(3, "cblas_ztbsv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_ztbsv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -62,7 +62,7 @@ void cblas_ztbsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_ztbsv","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(4, "cblas_ztbsv","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -82,7 +82,7 @@ void cblas_ztbsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'U'; else { - cblas_xerbla(2, "cblas_ztbsv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_ztbsv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -118,7 +118,7 @@ void cblas_ztbsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, } else { - cblas_xerbla(3, "cblas_ztbsv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_ztbsv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -128,7 +128,7 @@ void cblas_ztbsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_ztbsv","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(4, "cblas_ztbsv","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -155,7 +155,7 @@ void cblas_ztbsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, } } } - else cblas_xerbla(1, "cblas_ztbsv", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_ztbsv", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_ztpmv.c b/CBLAS/src/cblas_ztpmv.c index 7b65e3cd2f..119b6bcdd3 100644 --- a/CBLAS/src/cblas_ztpmv.c +++ b/CBLAS/src/cblas_ztpmv.c @@ -7,7 +7,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_ztpmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_ztpmv)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE TransA, const CBLAS_DIAG Diag, const CBLAS_INT N, const void *Ap, void *X, const CBLAS_INT incX) { @@ -40,7 +40,7 @@ void cblas_ztpmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'L'; else { - cblas_xerbla(2, "cblas_ztpmv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_ztpmv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -50,7 +50,7 @@ void cblas_ztpmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (TransA == CblasConjTrans) TA = 'C'; else { - cblas_xerbla(3, "cblas_ztpmv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_ztpmv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -59,7 +59,7 @@ void cblas_ztpmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_ztpmv","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(4, "cblas_ztpmv","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -78,7 +78,7 @@ void cblas_ztpmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'U'; else { - cblas_xerbla(2, "cblas_ztpmv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_ztpmv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -110,7 +110,7 @@ void cblas_ztpmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, } else { - cblas_xerbla(3, "cblas_ztpmv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_ztpmv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -120,7 +120,7 @@ void cblas_ztpmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_ztpmv","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(4, "cblas_ztpmv","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -145,7 +145,7 @@ void cblas_ztpmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, } } } - else cblas_xerbla(1, "cblas_ztpmv", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_ztpmv", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_ztpsv.c b/CBLAS/src/cblas_ztpsv.c index 142f971a53..d907d2f706 100644 --- a/CBLAS/src/cblas_ztpsv.c +++ b/CBLAS/src/cblas_ztpsv.c @@ -7,7 +7,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_ztpsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_ztpsv)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE TransA, const CBLAS_DIAG Diag, const CBLAS_INT N, const void *Ap, void *X, const CBLAS_INT incX) { @@ -40,7 +40,7 @@ void cblas_ztpsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'L'; else { - cblas_xerbla(2, "cblas_ztpsv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_ztpsv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -50,7 +50,7 @@ void cblas_ztpsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (TransA == CblasConjTrans) TA = 'C'; else { - cblas_xerbla(3, "cblas_ztpsv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_ztpsv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -59,7 +59,7 @@ void cblas_ztpsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_ztpsv","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(4, "cblas_ztpsv","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -78,7 +78,7 @@ void cblas_ztpsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'U'; else { - cblas_xerbla(2, "cblas_ztpsv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_ztpsv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -114,7 +114,7 @@ void cblas_ztpsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, } else { - cblas_xerbla(3, "cblas_ztpsv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_ztpsv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -124,7 +124,7 @@ void cblas_ztpsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_ztpsv","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(4, "cblas_ztpsv","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -150,7 +150,7 @@ void cblas_ztpsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, } } } - else cblas_xerbla(1, "cblas_ztpsv", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_ztpsv", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_ztrmm.c b/CBLAS/src/cblas_ztrmm.c index a34e710675..4b93f8e3a6 100644 --- a/CBLAS/src/cblas_ztrmm.c +++ b/CBLAS/src/cblas_ztrmm.c @@ -9,7 +9,7 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_ztrmm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, +void API_SUFFIX(cblas_ztrmm)(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE TransA, const CBLAS_DIAG Diag, const CBLAS_INT M, const CBLAS_INT N, const void *alpha, const void *A, const CBLAS_INT lda, @@ -45,7 +45,7 @@ void cblas_ztrmm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Side == CblasLeft ) SD='L'; else { - cblas_xerbla(2, "cblas_ztrmm", "Illegal Side setting, %d\n", Side); + API_SUFFIX(cblas_xerbla)(2, "cblas_ztrmm", "Illegal Side setting, %d\n", Side); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -54,7 +54,7 @@ void cblas_ztrmm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Uplo == CblasLower ) UL='L'; else { - cblas_xerbla(3, "cblas_ztrmm", "Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(3, "cblas_ztrmm", "Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -65,7 +65,7 @@ void cblas_ztrmm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( TransA == CblasNoTrans ) TA='N'; else { - cblas_xerbla(4, "cblas_ztrmm", "Illegal Trans setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(4, "cblas_ztrmm", "Illegal Trans setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -75,7 +75,7 @@ void cblas_ztrmm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Diag == CblasNonUnit ) DI='N'; else { - cblas_xerbla(5, "cblas_ztrmm", "Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(5, "cblas_ztrmm", "Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -96,7 +96,7 @@ void cblas_ztrmm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Side == CblasLeft ) SD='R'; else { - cblas_xerbla(2, "cblas_ztrmm", "Illegal Side setting, %d\n", Side); + API_SUFFIX(cblas_xerbla)(2, "cblas_ztrmm", "Illegal Side setting, %d\n", Side); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -106,7 +106,7 @@ void cblas_ztrmm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Uplo == CblasLower ) UL='U'; else { - cblas_xerbla(3, "cblas_ztrmm", "Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(3, "cblas_ztrmm", "Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -117,7 +117,7 @@ void cblas_ztrmm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( TransA == CblasNoTrans ) TA='N'; else { - cblas_xerbla(4, "cblas_ztrmm", "Illegal Trans setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(4, "cblas_ztrmm", "Illegal Trans setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -127,7 +127,7 @@ void cblas_ztrmm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Diag == CblasNonUnit ) DI='N'; else { - cblas_xerbla(5, "cblas_ztrmm", "Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(5, "cblas_ztrmm", "Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -142,7 +142,7 @@ void cblas_ztrmm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, F77_ztrmm(F77_SD, F77_UL, F77_TA, F77_DI, &F77_N, &F77_M, alpha, A, &F77_lda, B, &F77_ldb); } - else cblas_xerbla(1, "cblas_ztrmm", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_ztrmm", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_ztrmv.c b/CBLAS/src/cblas_ztrmv.c index fff888005e..f28fb19db4 100644 --- a/CBLAS/src/cblas_ztrmv.c +++ b/CBLAS/src/cblas_ztrmv.c @@ -7,7 +7,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_ztrmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_ztrmv)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE TransA, const CBLAS_DIAG Diag, const CBLAS_INT N, const void *A, const CBLAS_INT lda, void *X, const CBLAS_INT incX) @@ -43,7 +43,7 @@ void cblas_ztrmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'L'; else { - cblas_xerbla(2, "cblas_ztrmv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_ztrmv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -53,7 +53,7 @@ void cblas_ztrmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (TransA == CblasConjTrans) TA = 'C'; else { - cblas_xerbla(3, "cblas_ztrmv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_ztrmv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -62,7 +62,7 @@ void cblas_ztrmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_ztrmv","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(4, "cblas_ztrmv","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -82,7 +82,7 @@ void cblas_ztrmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'U'; else { - cblas_xerbla(2, "cblas_ztrmv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_ztrmv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -114,7 +114,7 @@ void cblas_ztrmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, } else { - cblas_xerbla(3, "cblas_ztrmv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_ztrmv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -124,7 +124,7 @@ void cblas_ztrmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_ztrmv","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(4, "cblas_ztrmv","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -149,7 +149,7 @@ void cblas_ztrmv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, } } } - else cblas_xerbla(1, "cblas_ztrmv", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_ztrmv", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_ztrsm.c b/CBLAS/src/cblas_ztrsm.c index f34b5631b6..f6d777e2ff 100644 --- a/CBLAS/src/cblas_ztrsm.c +++ b/CBLAS/src/cblas_ztrsm.c @@ -9,7 +9,7 @@ #include "cblas.h" #include "cblas_f77.h" -void cblas_ztrsm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, +void API_SUFFIX(cblas_ztrsm)(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE TransA, const CBLAS_DIAG Diag, const CBLAS_INT M, const CBLAS_INT N, const void *alpha, const void *A, const CBLAS_INT lda, @@ -46,7 +46,7 @@ void cblas_ztrsm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Side == CblasLeft ) SD='L'; else { - cblas_xerbla(2, "cblas_ztrsm", "Illegal Side setting, %d\n", Side); + API_SUFFIX(cblas_xerbla)(2, "cblas_ztrsm", "Illegal Side setting, %d\n", Side); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -56,7 +56,7 @@ void cblas_ztrsm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Uplo == CblasLower ) UL='L'; else { - cblas_xerbla(3, "cblas_ztrsm", "Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(3, "cblas_ztrsm", "Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -67,7 +67,7 @@ void cblas_ztrsm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( TransA == CblasNoTrans ) TA='N'; else { - cblas_xerbla(4, "cblas_ztrsm", "Illegal Trans setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(4, "cblas_ztrsm", "Illegal Trans setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -77,7 +77,7 @@ void cblas_ztrsm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Diag == CblasNonUnit ) DI='N'; else { - cblas_xerbla(5, "cblas_ztrsm", "Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(5, "cblas_ztrsm", "Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -100,7 +100,7 @@ void cblas_ztrsm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Side == CblasLeft ) SD='R'; else { - cblas_xerbla(2, "cblas_ztrsm", "Illegal Side setting, %d\n", Side); + API_SUFFIX(cblas_xerbla)(2, "cblas_ztrsm", "Illegal Side setting, %d\n", Side); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -110,7 +110,7 @@ void cblas_ztrsm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Uplo == CblasLower ) UL='U'; else { - cblas_xerbla(3, "cblas_ztrsm", "Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(3, "cblas_ztrsm", "Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -121,7 +121,7 @@ void cblas_ztrsm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( TransA == CblasNoTrans ) TA='N'; else { - cblas_xerbla(4, "cblas_ztrsm", "Illegal Trans setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(4, "cblas_ztrsm", "Illegal Trans setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -131,7 +131,7 @@ void cblas_ztrsm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, else if ( Diag == CblasNonUnit ) DI='N'; else { - cblas_xerbla(5, "cblas_ztrsm", "Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(5, "cblas_ztrsm", "Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -148,7 +148,7 @@ void cblas_ztrsm(const CBLAS_LAYOUT layout, const CBLAS_SIDE Side, F77_ztrsm(F77_SD, F77_UL, F77_TA, F77_DI, &F77_N, &F77_M, alpha, A, &F77_lda, B, &F77_ldb); } - else cblas_xerbla(1, "cblas_ztrsm", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_ztrsm", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cblas_ztrsv.c b/CBLAS/src/cblas_ztrsv.c index 1822bc8053..bbdbd8ff1a 100644 --- a/CBLAS/src/cblas_ztrsv.c +++ b/CBLAS/src/cblas_ztrsv.c @@ -7,7 +7,7 @@ */ #include "cblas.h" #include "cblas_f77.h" -void cblas_ztrsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, +void API_SUFFIX(cblas_ztrsv)(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, const CBLAS_TRANSPOSE TransA, const CBLAS_DIAG Diag, const CBLAS_INT N, const void *A, const CBLAS_INT lda, void *X, const CBLAS_INT incX) @@ -42,7 +42,7 @@ void cblas_ztrsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'L'; else { - cblas_xerbla(2, "cblas_ztrsv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_ztrsv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -52,7 +52,7 @@ void cblas_ztrsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (TransA == CblasConjTrans) TA = 'C'; else { - cblas_xerbla(3, "cblas_ztrsv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_ztrsv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -61,7 +61,7 @@ void cblas_ztrsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_ztrsv","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(4, "cblas_ztrsv","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -81,7 +81,7 @@ void cblas_ztrsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Uplo == CblasLower) UL = 'U'; else { - cblas_xerbla(2, "cblas_ztrsv","Illegal Uplo setting, %d\n", Uplo); + API_SUFFIX(cblas_xerbla)(2, "cblas_ztrsv","Illegal Uplo setting, %d\n", Uplo); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -114,7 +114,7 @@ void cblas_ztrsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, } else { - cblas_xerbla(3, "cblas_ztrsv","Illegal TransA setting, %d\n", TransA); + API_SUFFIX(cblas_xerbla)(3, "cblas_ztrsv","Illegal TransA setting, %d\n", TransA); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -124,7 +124,7 @@ void cblas_ztrsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, else if (Diag == CblasNonUnit) DI = 'N'; else { - cblas_xerbla(4, "cblas_ztrsv","Illegal Diag setting, %d\n", Diag); + API_SUFFIX(cblas_xerbla)(4, "cblas_ztrsv","Illegal Diag setting, %d\n", Diag); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; @@ -149,7 +149,7 @@ void cblas_ztrsv(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo, } } } - else cblas_xerbla(1, "cblas_ztrsv", "Illegal layout setting, %d\n", layout); + else API_SUFFIX(cblas_xerbla)(1, "cblas_ztrsv", "Illegal layout setting, %d\n", layout); CBLAS_CallFromC = 0; RowMajorStrg = 0; return; diff --git a/CBLAS/src/cdotcsub.f b/CBLAS/src/cdotcsub.f index f97d7159ee..1141e9582e 100644 --- a/CBLAS/src/cdotcsub.f +++ b/CBLAS/src/cdotcsub.f @@ -4,6 +4,7 @@ c Witten by Keita Teranishi. 2/11/1998 c subroutine cdotcsub(n,x,incx,y,incy,dotc) + implicit none c external cdotc complex cdotc,dotc diff --git a/CBLAS/src/cdotusub.f b/CBLAS/src/cdotusub.f index 5107c0402b..f7168c22d9 100644 --- a/CBLAS/src/cdotusub.f +++ b/CBLAS/src/cdotusub.f @@ -4,6 +4,7 @@ c Witten by Keita Teranishi. 2/11/1998 c subroutine cdotusub(n,x,incx,y,incy,dotu) + implicit none c external cdotu complex cdotu,dotu diff --git a/CBLAS/src/dasumsub.f b/CBLAS/src/dasumsub.f index 3d64d17e67..9a8f3648a6 100644 --- a/CBLAS/src/dasumsub.f +++ b/CBLAS/src/dasumsub.f @@ -4,6 +4,7 @@ c Witten by Keita Teranishi. 2/11/1998 c subroutine dasumsub(n,x,incx,asum) + implicit none c external dasum double precision dasum,asum diff --git a/CBLAS/src/dcabs1sub.f b/CBLAS/src/dcabs1sub.f new file mode 100644 index 0000000000..5b71052dc6 --- /dev/null +++ b/CBLAS/src/dcabs1sub.f @@ -0,0 +1,14 @@ +c dcabs1.f +c +c The program is a fortran wrapper for dcabs1. +c + subroutine dcabs1sub(z, cabs1) + implicit none +c + external dcabs1 + double complex z + double precision dcabs1, cabs1 +c + cabs1=dcabs1(z) + return + end diff --git a/CBLAS/src/ddotsub.f b/CBLAS/src/ddotsub.f index 205f3b46f0..911a49e6d3 100644 --- a/CBLAS/src/ddotsub.f +++ b/CBLAS/src/ddotsub.f @@ -4,6 +4,7 @@ c Witten by Keita Teranishi. 2/11/1998 c subroutine ddotsub(n,x,incx,y,incy,dot) + implicit none c external ddot double precision ddot diff --git a/CBLAS/src/dnrm2sub.f b/CBLAS/src/dnrm2sub.f index 88f17db8bc..40beababa0 100644 --- a/CBLAS/src/dnrm2sub.f +++ b/CBLAS/src/dnrm2sub.f @@ -4,6 +4,7 @@ c Witten by Keita Teranishi. 2/11/1998 c subroutine dnrm2sub(n,x,incx,nrm2) + implicit none c external dnrm2 double precision dnrm2,nrm2 diff --git a/CBLAS/src/dsdotsub.f b/CBLAS/src/dsdotsub.f index ef53b881a2..0a5936a8de 100644 --- a/CBLAS/src/dsdotsub.f +++ b/CBLAS/src/dsdotsub.f @@ -4,6 +4,7 @@ c Witten by Keita Teranishi. 2/11/1998 c subroutine dsdotsub(n,x,incx,y,incy,dot) + implicit none c external dsdot double precision dsdot,dot diff --git a/CBLAS/src/dzasumsub.f b/CBLAS/src/dzasumsub.f index 9aaf163872..486b54dd25 100644 --- a/CBLAS/src/dzasumsub.f +++ b/CBLAS/src/dzasumsub.f @@ -4,6 +4,7 @@ c Witten by Keita Teranishi. 2/11/1998 c subroutine dzasumsub(n,x,incx,asum) + implicit none c external dzasum double precision dzasum,asum diff --git a/CBLAS/src/dznrm2sub.f b/CBLAS/src/dznrm2sub.f index 45dc599f81..c2b8128180 100644 --- a/CBLAS/src/dznrm2sub.f +++ b/CBLAS/src/dznrm2sub.f @@ -4,6 +4,7 @@ c Witten by Keita Teranishi. 2/11/1998 c subroutine dznrm2sub(n,x,incx,nrm2) + implicit none c external dznrm2 double precision dznrm2,nrm2 diff --git a/CBLAS/src/icamaxsub.f b/CBLAS/src/icamaxsub.f index 3f47071eb5..107f50d265 100644 --- a/CBLAS/src/icamaxsub.f +++ b/CBLAS/src/icamaxsub.f @@ -4,6 +4,7 @@ c Witten by Keita Teranishi. 2/11/1998 c subroutine icamaxsub(n,x,incx,iamax) + implicit none c external icamax integer icamax,iamax diff --git a/CBLAS/src/idamaxsub.f b/CBLAS/src/idamaxsub.f index 3c1ee5c325..39738e1a5e 100644 --- a/CBLAS/src/idamaxsub.f +++ b/CBLAS/src/idamaxsub.f @@ -4,6 +4,7 @@ c Witten by Keita Teranishi. 2/22/1998 c subroutine idamaxsub(n,x,incx,iamax) + implicit none c external idamax integer idamax,iamax diff --git a/CBLAS/src/isamaxsub.f b/CBLAS/src/isamaxsub.f index 0faf42fde1..345fb77431 100644 --- a/CBLAS/src/isamaxsub.f +++ b/CBLAS/src/isamaxsub.f @@ -4,6 +4,7 @@ c Witten by Keita Teranishi. 2/11/1998 c subroutine isamaxsub(n,x,incx,iamax) + implicit none c external isamax integer isamax,iamax diff --git a/CBLAS/src/izamaxsub.f b/CBLAS/src/izamaxsub.f index 5b15855a7f..a96fa57af9 100644 --- a/CBLAS/src/izamaxsub.f +++ b/CBLAS/src/izamaxsub.f @@ -4,6 +4,7 @@ c Witten by Keita Teranishi. 2/11/1998 c subroutine izamaxsub(n,x,incx,iamax) + implicit none c external izamax integer izamax,iamax diff --git a/CBLAS/src/sasumsub.f b/CBLAS/src/sasumsub.f index 955f11e8dc..f8ffdc5c8a 100644 --- a/CBLAS/src/sasumsub.f +++ b/CBLAS/src/sasumsub.f @@ -4,6 +4,7 @@ c Witten by Keita Teranishi. 2/11/1998 c subroutine sasumsub(n,x,incx,asum) + implicit none c external sasum real sasum,asum diff --git a/CBLAS/src/scabs1sub.f b/CBLAS/src/scabs1sub.f new file mode 100644 index 0000000000..07c91d0b5c --- /dev/null +++ b/CBLAS/src/scabs1sub.f @@ -0,0 +1,14 @@ +c scabs1.f +c +c The program is a fortran wrapper for scabs1. +c + subroutine scabs1sub(z, cabs1) + implicit none +c + external scabs1 + complex z + real scabs1, cabs1 +c + cabs1=scabs1(z) + return + end diff --git a/CBLAS/src/scasumsub.f b/CBLAS/src/scasumsub.f index 077ace6703..c7de3bc19a 100644 --- a/CBLAS/src/scasumsub.f +++ b/CBLAS/src/scasumsub.f @@ -4,6 +4,7 @@ c Witten by Keita Teranishi. 2/11/1998 c subroutine scasumsub(n,x,incx,asum) + implicit none c external scasum real scasum,asum diff --git a/CBLAS/src/scnrm2sub.f b/CBLAS/src/scnrm2sub.f index 7242c9742d..59999ecd23 100644 --- a/CBLAS/src/scnrm2sub.f +++ b/CBLAS/src/scnrm2sub.f @@ -4,6 +4,7 @@ c Witten by Keita Teranishi. 2/11/1998 c subroutine scnrm2sub(n,x,incx,nrm2) + implicit none c external scnrm2 real scnrm2,nrm2 diff --git a/CBLAS/src/sdotsub.f b/CBLAS/src/sdotsub.f index 33fa89a9f1..c17d140699 100644 --- a/CBLAS/src/sdotsub.f +++ b/CBLAS/src/sdotsub.f @@ -4,6 +4,7 @@ c Witten by Keita Teranishi. 2/11/1998 c subroutine sdotsub(n,x,incx,y,incy,dot) + implicit none c external sdot real sdot diff --git a/CBLAS/src/sdsdotsub.f b/CBLAS/src/sdsdotsub.f index c6b8bb2e5a..9384609c69 100644 --- a/CBLAS/src/sdsdotsub.f +++ b/CBLAS/src/sdsdotsub.f @@ -4,6 +4,7 @@ c Witten by Keita Teranishi. 2/11/1998 c subroutine sdsdotsub(n,sb,x,incx,y,incy,dot) + implicit none c external sdsdot real sb,sdsdot,dot diff --git a/CBLAS/src/snrm2sub.f b/CBLAS/src/snrm2sub.f index 871a6e49f4..7fa737c338 100644 --- a/CBLAS/src/snrm2sub.f +++ b/CBLAS/src/snrm2sub.f @@ -4,6 +4,7 @@ c Witten by Keita Teranishi. 2/11/1998 c subroutine snrm2sub(n,x,incx,nrm2) + implicit none c external snrm2 real snrm2,nrm2 diff --git a/CBLAS/src/xerbla.c b/CBLAS/src/xerbla.c index 1857e92e84..a7ca7869a7 100644 --- a/CBLAS/src/xerbla.c +++ b/CBLAS/src/xerbla.c @@ -10,13 +10,16 @@ void #ifdef HAS_ATTRIBUTE_WEAK_SUPPORT __attribute__((weak)) #endif -F77_xerbla +F77_xerbla_base #ifdef F77_CHAR -(F77_CHAR F77_srname, void *vinfo) +(F77_CHAR F77_srname, void *vinfo #else -(char *srname, void *vinfo) +(char *srname, void *vinfo #endif - +#ifdef BLAS_FORTRAN_STRLEN_END +, FORTRAN_STRLEN len +#endif +) { #ifdef F77_CHAR char *srname; @@ -37,7 +40,7 @@ F77_xerbla { for(i=0; i != XerblaStrLen; i++) rout[i+6] = tolower(srname[i]); rout[XerblaStrLen+6] = '\0'; - cblas_xerbla(*info+1,rout,""); + API_SUFFIX(cblas_xerbla)(*info+1,rout,""); } else { diff --git a/CBLAS/src/zdotcsub.f b/CBLAS/src/zdotcsub.f index 8d483c895b..0298654ea5 100644 --- a/CBLAS/src/zdotcsub.f +++ b/CBLAS/src/zdotcsub.f @@ -4,6 +4,7 @@ c Witten by Keita Teranishi. 2/11/1998 c subroutine zdotcsub(n,x,incx,y,incy,dotc) + implicit none c external zdotc double complex zdotc,dotc diff --git a/CBLAS/src/zdotusub.f b/CBLAS/src/zdotusub.f index 23f32dec3f..8482905ac4 100644 --- a/CBLAS/src/zdotusub.f +++ b/CBLAS/src/zdotusub.f @@ -4,6 +4,7 @@ c Witten by Keita Teranishi. 2/11/1998 c subroutine zdotusub(n,x,incx,y,incy,dotu) + implicit none c external zdotu double complex zdotu,dotu diff --git a/CBLAS/testing/CMakeLists.txt b/CBLAS/testing/CMakeLists.txt index 9b8cfaeb17..db53c30fe7 100644 --- a/CBLAS/testing/CMakeLists.txt +++ b/CBLAS/testing/CMakeLists.txt @@ -4,11 +4,13 @@ ####################################################################### macro(add_cblas_test output input target) - set(TEST_INPUT "${CMAKE_CURRENT_SOURCE_DIR}/${input}") + if(NOT "${input}" STREQUAL "") + set(TEST_INPUT "${CMAKE_CURRENT_SOURCE_DIR}/${input}") + endif() set(TEST_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${output}") set(testName "${target}") - if(EXISTS "${TEST_INPUT}") + if(DEFINED TEST_INPUT AND EXISTS "${TEST_INPUT}") add_test(NAME CBLAS-${testName} COMMAND "${CMAKE_COMMAND}" -DTEST=$ -DINPUT=${TEST_INPUT} @@ -52,6 +54,12 @@ if(BUILD_SINGLE) add_executable(xscblat2 c_sblat2.f ${STESTL2O} ${LAPACK_BINARY_DIR}/test_include/cblas_test.h) add_executable(xscblat3 c_sblat3.f ${STESTL3O} ${LAPACK_BINARY_DIR}/test_include/cblas_test.h) + if(HAS_ATTRIBUTE_WEAK_SUPPORT) + target_compile_definitions(xscblat1 PRIVATE HAS_ATTRIBUTE_WEAK_SUPPORT) + target_compile_definitions(xscblat2 PRIVATE HAS_ATTRIBUTE_WEAK_SUPPORT) + target_compile_definitions(xscblat3 PRIVATE HAS_ATTRIBUTE_WEAK_SUPPORT) + endif() + target_link_libraries(xscblat1 ${CBLASLIB}) target_link_libraries(xscblat2 ${CBLASLIB}) target_link_libraries(xscblat3 ${CBLASLIB}) @@ -66,6 +74,12 @@ if(BUILD_DOUBLE) add_executable(xdcblat2 c_dblat2.f ${DTESTL2O} ${LAPACK_BINARY_DIR}/test_include/cblas_test.h) add_executable(xdcblat3 c_dblat3.f ${DTESTL3O} ${LAPACK_BINARY_DIR}/test_include/cblas_test.h) + if(HAS_ATTRIBUTE_WEAK_SUPPORT) + target_compile_definitions(xdcblat1 PRIVATE HAS_ATTRIBUTE_WEAK_SUPPORT) + target_compile_definitions(xdcblat2 PRIVATE HAS_ATTRIBUTE_WEAK_SUPPORT) + target_compile_definitions(xdcblat3 PRIVATE HAS_ATTRIBUTE_WEAK_SUPPORT) + endif() + target_link_libraries(xdcblat1 ${CBLASLIB}) target_link_libraries(xdcblat2 ${CBLASLIB}) target_link_libraries(xdcblat3 ${CBLASLIB}) @@ -80,6 +94,12 @@ if(BUILD_COMPLEX) add_executable(xccblat2 c_cblat2.f ${CTESTL2O} ${LAPACK_BINARY_DIR}/test_include/cblas_test.h) add_executable(xccblat3 c_cblat3.f ${CTESTL3O} ${LAPACK_BINARY_DIR}/test_include/cblas_test.h) + if(HAS_ATTRIBUTE_WEAK_SUPPORT) + target_compile_definitions(xccblat1 PRIVATE HAS_ATTRIBUTE_WEAK_SUPPORT) + target_compile_definitions(xccblat2 PRIVATE HAS_ATTRIBUTE_WEAK_SUPPORT) + target_compile_definitions(xccblat3 PRIVATE HAS_ATTRIBUTE_WEAK_SUPPORT) + endif() + target_link_libraries(xccblat1 ${CBLASLIB} ${BLAS_LIBRARIES}) target_link_libraries(xccblat2 ${CBLASLIB}) target_link_libraries(xccblat3 ${CBLASLIB}) @@ -94,6 +114,12 @@ if(BUILD_COMPLEX16) add_executable(xzcblat2 c_zblat2.f ${ZTESTL2O} ${LAPACK_BINARY_DIR}/test_include/cblas_test.h) add_executable(xzcblat3 c_zblat3.f ${ZTESTL3O} ${LAPACK_BINARY_DIR}/test_include/cblas_test.h) + if(HAS_ATTRIBUTE_WEAK_SUPPORT) + target_compile_definitions(xzcblat1 PRIVATE HAS_ATTRIBUTE_WEAK_SUPPORT) + target_compile_definitions(xzcblat2 PRIVATE HAS_ATTRIBUTE_WEAK_SUPPORT) + target_compile_definitions(xzcblat3 PRIVATE HAS_ATTRIBUTE_WEAK_SUPPORT) + endif() + target_link_libraries(xzcblat1 ${CBLASLIB}) target_link_libraries(xzcblat2 ${CBLASLIB}) target_link_libraries(xzcblat3 ${CBLASLIB}) diff --git a/CBLAS/testing/c_c2chke.c b/CBLAS/testing/c_c2chke.c index 33a0261f51..09be46e4e5 100644 --- a/CBLAS/testing/c_c2chke.c +++ b/CBLAS/testing/c_c2chke.c @@ -3,28 +3,36 @@ #include "cblas.h" #include "cblas_test.h" -int cblas_ok, cblas_lerr, cblas_info; -int link_xerbla=TRUE; +CBLAS_INT cblas_ok, cblas_lerr, cblas_info; +CBLAS_INT link_xerbla=TRUE; char *cblas_rout; #ifdef F77_Char -void F77_xerbla(F77_Char F77_srname, void *vinfo); +void F77_xerbla(F77_Char F77_srname, void *vinfo #else -void F77_xerbla(char *srname, void *vinfo); +void F77_xerbla(char *srname, void *vinfo #endif +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN srname_len +#endif +); void chkxer(void) { - extern int cblas_ok, cblas_lerr, cblas_info; - extern int link_xerbla; + extern CBLAS_INT cblas_ok, cblas_lerr, cblas_info; + extern CBLAS_INT link_xerbla; extern char *cblas_rout; if (cblas_lerr == 1 ) { - printf("***** ILLEGAL VALUE OF PARAMETER NUMBER %d NOT DETECTED BY %s *****\n", cblas_info, cblas_rout); + printf("***** ILLEGAL VALUE OF PARAMETER NUMBER %d NOT DETECTED BY %s *****\n", (int) cblas_info, cblas_rout); cblas_ok = 0 ; } cblas_lerr = 1 ; } -void F77_c2chke(char *rout) { +void F77_c2chke(char *rout +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN rout_len +#endif +) { char *sf = ( rout ) ; float A[2] = {0.0,0.0}, X[2] = {0.0,0.0}, @@ -32,7 +40,7 @@ void F77_c2chke(char *rout) { ALPHA[2] = {0.0,0.0}, BETA[2] = {0.0,0.0}, RALPHA = 0.0; - extern int cblas_info, cblas_lerr, cblas_ok; + extern CBLAS_INT cblas_info, cblas_lerr, cblas_ok; extern int RowMajorStrg; extern char *cblas_rout; @@ -40,10 +48,10 @@ void F77_c2chke(char *rout) { if (link_xerbla) /* call these first to link */ { cblas_xerbla(cblas_info,cblas_rout,""); - F77_xerbla(cblas_rout,&cblas_info); + F77_xerbla(cblas_rout,&cblas_info, 1); } #endif - + link_xerbla = 0; cblas_ok = TRUE ; cblas_lerr = PASSED ; diff --git a/CBLAS/testing/c_c3chke.c b/CBLAS/testing/c_c3chke.c index 7057c7a2c4..05109d4e0a 100644 --- a/CBLAS/testing/c_c3chke.c +++ b/CBLAS/testing/c_c3chke.c @@ -3,28 +3,36 @@ #include "cblas.h" #include "cblas_test.h" -int cblas_ok, cblas_lerr, cblas_info; -int link_xerbla=TRUE; +CBLAS_INT cblas_ok, cblas_lerr, cblas_info; +CBLAS_INT link_xerbla=TRUE; char *cblas_rout; #ifdef F77_Char -void F77_xerbla(F77_Char F77_srname, void *vinfo); +void F77_xerbla(F77_Char F77_srname, void *vinfo #else -void F77_xerbla(char *srname, void *vinfo); +void F77_xerbla(char *srname, void *vinfo #endif +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN srname_len +#endif +); void chkxer(void) { - extern int cblas_ok, cblas_lerr, cblas_info; - extern int link_xerbla; + extern CBLAS_INT cblas_ok, cblas_lerr, cblas_info; + extern CBLAS_INT link_xerbla; extern char *cblas_rout; if (cblas_lerr == 1 ) { - printf("***** ILLEGAL VALUE OF PARAMETER NUMBER %d NOT DETECTED BY %s *****\n", cblas_info, cblas_rout); + printf("***** ILLEGAL VALUE OF PARAMETER NUMBER %d NOT DETECTED BY %s *****\n", (int) cblas_info, cblas_rout); cblas_ok = 0 ; } cblas_lerr = 1 ; } -void F77_c3chke(char * rout) { +void F77_c3chke(char * rout +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN rout_len +#endif +) { char *sf = ( rout ) ; float A[4] = {0.0,0.0,0.0,0.0}, B[4] = {0.0,0.0,0.0,0.0}, @@ -32,7 +40,7 @@ void F77_c3chke(char * rout) { ALPHA[2] = {0.0,0.0}, BETA[2] = {0.0,0.0}, RALPHA = 0.0, RBETA = 0.0; - extern int cblas_info, cblas_lerr, cblas_ok; + extern CBLAS_INT cblas_info, cblas_lerr, cblas_ok; extern int RowMajorStrg; extern char *cblas_rout; @@ -43,11 +51,242 @@ void F77_c3chke(char * rout) { if (link_xerbla) /* call these first to link */ { cblas_xerbla(cblas_info,cblas_rout,""); - F77_xerbla(cblas_rout,&cblas_info); + F77_xerbla(cblas_rout,&cblas_info, 1); } #endif - if (strncmp( sf,"cblas_cgemm" ,11)==0) { + link_xerbla = 0; + if (strncmp( sf,"cblas_cgemmtr" ,13)==0) { + cblas_rout = "cblas_cgemmtr" ; + + cblas_info = 1; + cblas_cgemmtr( INVALID, CblasUpper, CblasNoTrans, CblasNoTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 1; + cblas_cgemmtr( INVALID, CblasUpper, CblasNoTrans, CblasTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 1; + cblas_cgemmtr( INVALID, CblasUpper,CblasTrans, CblasNoTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 1; + cblas_cgemmtr( INVALID, CblasUpper, CblasTrans, CblasTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + cblas_info = 1; + cblas_cgemmtr( INVALID, CblasLower, CblasNoTrans, CblasNoTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 1; + cblas_cgemmtr( INVALID, CblasLower, CblasNoTrans, CblasTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 1; + cblas_cgemmtr( INVALID, CblasLower,CblasTrans, CblasNoTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 1; + cblas_cgemmtr( INVALID, CblasLower, CblasTrans, CblasTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + cblas_info = 2; RowMajorStrg = FALSE; + cblas_cgemmtr( CblasColMajor, INVALID, CblasNoTrans, CblasNoTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 2; RowMajorStrg = FALSE; + cblas_cgemmtr( CblasColMajor, INVALID, CblasNoTrans, CblasTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + cblas_info = 3; RowMajorStrg = FALSE; + cblas_cgemmtr( CblasColMajor, CblasUpper, INVALID, CblasNoTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 3; RowMajorStrg = FALSE; + cblas_cgemmtr( CblasColMajor, CblasUpper, INVALID, CblasTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + cblas_info = 4; RowMajorStrg = FALSE; + cblas_cgemmtr( CblasColMajor, CblasUpper, CblasNoTrans, INVALID, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 4; RowMajorStrg = FALSE; + cblas_cgemmtr( CblasColMajor, CblasUpper, CblasTrans, INVALID, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + + cblas_info = 5; RowMajorStrg = FALSE; + cblas_cgemmtr( CblasColMajor, CblasUpper, CblasNoTrans, CblasNoTrans, INVALID, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 5; RowMajorStrg = FALSE; + cblas_cgemmtr( CblasColMajor, CblasUpper, CblasNoTrans, CblasTrans, INVALID, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 5; RowMajorStrg = FALSE; + cblas_cgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasNoTrans, INVALID, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 5; RowMajorStrg = FALSE; + cblas_cgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasTrans, INVALID, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + cblas_info = 6; RowMajorStrg = FALSE; + cblas_cgemmtr( CblasColMajor, CblasUpper, CblasNoTrans, CblasNoTrans, 0, INVALID, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 6; RowMajorStrg = FALSE; + cblas_cgemmtr( CblasColMajor, CblasUpper, CblasNoTrans, CblasTrans, 0, INVALID, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 6; RowMajorStrg = FALSE; + cblas_cgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasNoTrans, 0, INVALID, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 6; RowMajorStrg = FALSE; + cblas_cgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasTrans, 0, INVALID, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + + cblas_info = 9; RowMajorStrg = FALSE; + cblas_cgemmtr( CblasColMajor, CblasUpper, CblasNoTrans, CblasNoTrans, 2, 0, + ALPHA, A, 1, B, 1, BETA, C, 2 ); + chkxer(); + cblas_info = 9; RowMajorStrg = FALSE; + cblas_cgemmtr( CblasColMajor, CblasUpper, CblasNoTrans, CblasTrans, 2, 0, + ALPHA, A, 1, B, 1, BETA, C, 2 ); + chkxer(); + cblas_info = 9; RowMajorStrg = FALSE; + cblas_cgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasNoTrans, 0, 2, + ALPHA, A, 1, B, 2, BETA, C, 1 ); + chkxer(); + cblas_info = 9; RowMajorStrg = FALSE; + cblas_cgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasTrans, 0, 2, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + cblas_info = 11; RowMajorStrg = FALSE; + cblas_cgemmtr( CblasColMajor, CblasUpper, CblasNoTrans, CblasNoTrans, 0, 2, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 11; RowMajorStrg = FALSE; + cblas_cgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasNoTrans, 0, 2, + ALPHA, A, 2, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 11; RowMajorStrg = FALSE; + cblas_cgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasTrans, 2, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + cblas_info = 14; RowMajorStrg = FALSE; + cblas_cgemmtr( CblasColMajor, CblasUpper, CblasNoTrans, CblasNoTrans, 2, 0, + ALPHA, A, 2, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 14; RowMajorStrg = FALSE; + cblas_cgemmtr( CblasColMajor, CblasUpper, CblasNoTrans, CblasTrans, 2, 0, + ALPHA, A, 2, B, 2, BETA, C, 1 ); + chkxer(); + + cblas_info = 14; RowMajorStrg = FALSE; + cblas_cgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasNoTrans, 2, 0, + ALPHA, A, 2, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 14; RowMajorStrg = FALSE; + cblas_cgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasTrans, 2, 0, + ALPHA, A, 2, B, 2, BETA, C, 1 ); + chkxer(); + + /* Row Major */ + cblas_info = 5; RowMajorStrg = TRUE; + cblas_cgemmtr( CblasRowMajor, CblasUpper, CblasNoTrans, CblasNoTrans, INVALID, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 5; RowMajorStrg = TRUE; + cblas_cgemmtr( CblasRowMajor, CblasUpper, CblasNoTrans, CblasTrans, INVALID, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 5; RowMajorStrg = TRUE; + cblas_cgemmtr( CblasRowMajor, CblasUpper, CblasTrans, CblasNoTrans, INVALID, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 5; RowMajorStrg = TRUE; + cblas_cgemmtr( CblasRowMajor, CblasUpper, CblasTrans, CblasTrans, INVALID, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + cblas_info = 6; RowMajorStrg = TRUE; + cblas_cgemmtr( CblasRowMajor, CblasUpper, CblasNoTrans, CblasNoTrans, 0, INVALID, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 6; RowMajorStrg = TRUE; + cblas_cgemmtr( CblasRowMajor, CblasUpper, CblasNoTrans, CblasTrans, 0, INVALID, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 6; RowMajorStrg = TRUE; + cblas_cgemmtr( CblasRowMajor, CblasUpper, CblasTrans, CblasNoTrans, 0, INVALID, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 6; RowMajorStrg = TRUE; + cblas_cgemmtr( CblasRowMajor, CblasUpper, CblasTrans, CblasTrans, 0, INVALID, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + cblas_info = 9; RowMajorStrg = TRUE; + cblas_cgemmtr( CblasRowMajor, CblasUpper, CblasNoTrans, CblasNoTrans, 0, 2, + ALPHA, A, 1, B, 1, BETA, C, 2 ); + chkxer(); + cblas_info = 9; RowMajorStrg = TRUE; + cblas_cgemmtr( CblasRowMajor, CblasUpper, CblasNoTrans, CblasTrans, 0, 2, + ALPHA, A, 1, B, 2, BETA, C, 2 ); + chkxer(); + cblas_info = 9; RowMajorStrg = TRUE; + cblas_cgemmtr( CblasRowMajor, CblasUpper, CblasTrans, CblasNoTrans, 2, 0, + ALPHA, A, 1, B, 2, BETA, C, 1 ); + chkxer(); + cblas_info = 9; RowMajorStrg = TRUE; + cblas_cgemmtr( CblasRowMajor, CblasUpper, CblasTrans, CblasTrans, 2, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + cblas_info = 11; RowMajorStrg = TRUE; + cblas_cgemmtr( CblasColMajor, CblasUpper, CblasNoTrans, CblasNoTrans, 0, 2, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 11; RowMajorStrg = TRUE; + cblas_cgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasNoTrans, 0, 2, + ALPHA, A, 2, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 11; RowMajorStrg = TRUE; + cblas_cgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasTrans, 2, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + cblas_info = 14; RowMajorStrg = TRUE; + cblas_cgemmtr( CblasRowMajor, CblasUpper, CblasNoTrans, CblasNoTrans, 2, 0, + ALPHA, A, 2, B, 2, BETA, C, 1 ); + chkxer(); + cblas_info = 14; RowMajorStrg = TRUE; + cblas_cgemmtr( CblasRowMajor, CblasUpper, CblasNoTrans, CblasTrans, 2, 0, + ALPHA, A, 2, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 14; RowMajorStrg = TRUE; + cblas_cgemmtr( CblasRowMajor, CblasUpper, CblasTrans, CblasNoTrans, 2, 0, + ALPHA, A, 2, B, 2, BETA, C, 1 ); + chkxer(); + cblas_info = 14; RowMajorStrg = TRUE; + cblas_cgemmtr( CblasRowMajor, CblasUpper, CblasTrans, CblasTrans, 2, 0, + ALPHA, A, 2, B, 2, BETA, C, 1 ); + chkxer(); + + } else if (strncmp( sf,"cblas_cgemm" ,11)==0) { cblas_rout = "cblas_cgemm" ; cblas_info = 1; @@ -274,7 +513,6 @@ void F77_c3chke(char * rout) { cblas_cgemm( CblasRowMajor, CblasTrans, CblasTrans, 0, 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ); chkxer(); - } else if (strncmp( sf,"cblas_chemm" ,11)==0) { cblas_rout = "cblas_chemm" ; @@ -1702,7 +1940,7 @@ void F77_c3chke(char * rout) { } if (cblas_ok == 1 ) - printf(" %-12s PASSED THE TESTS OF ERROR-EXITS\n", cblas_rout); + printf(" %-13s PASSED THE TESTS OF ERROR-EXITS\n", cblas_rout); else printf("***** %s FAILED THE TESTS OF ERROR-EXITS *******\n",cblas_rout); } diff --git a/CBLAS/testing/c_cblas1.c b/CBLAS/testing/c_cblas1.c index 81a5b843b5..ddfd84490a 100644 --- a/CBLAS/testing/c_cblas1.c +++ b/CBLAS/testing/c_cblas1.c @@ -8,67 +8,75 @@ */ #include "cblas_test.h" #include "cblas.h" -void F77_caxpy(const int *N, const void *alpha, void *X, - const int *incX, void *Y, const int *incY) +void F77_caxpy(const CBLAS_INT *N, const void *alpha, void *X, + const CBLAS_INT *incX, void *Y, const CBLAS_INT *incY) { cblas_caxpy(*N, alpha, X, *incX, Y, *incY); return; } -void F77_ccopy(const int *N, void *X, const int *incX, - void *Y, const int *incY) +void F77_caxpby(const CBLAS_INT *N, const void *alpha, void *X, + const CBLAS_INT *incX, const void *beta, void *Y, const CBLAS_INT *incY) +{ + cblas_caxpby(*N, alpha, X, *incX, beta, Y, *incY); + return; +} + + +void F77_ccopy(const CBLAS_INT *N, void *X, const CBLAS_INT *incX, + void *Y, const CBLAS_INT *incY) { cblas_ccopy(*N, X, *incX, Y, *incY); return; } -void F77_cdotc(const int *N, void *X, const int *incX, - void *Y, const int *incY, void *dotc) +void F77_cdotc(const CBLAS_INT *N, void *X, const CBLAS_INT *incX, + void *Y, const CBLAS_INT *incY, void *dotc) { cblas_cdotc_sub(*N, X, *incX, Y, *incY, dotc); return; } -void F77_cdotu(const int *N, void *X, const int *incX, - void *Y, const int *incY,void *dotu) +void F77_cdotu(const CBLAS_INT *N, void *X, const CBLAS_INT *incX, + void *Y, const CBLAS_INT *incY,void *dotu) { cblas_cdotu_sub(*N, X, *incX, Y, *incY, dotu); return; } -void F77_cscal(const int *N, const void * *alpha, void *X, - const int *incX) +void F77_cscal(const CBLAS_INT *N, const void * *alpha, void *X, + const CBLAS_INT *incX) { cblas_cscal(*N, alpha, X, *incX); return; } -void F77_csscal(const int *N, const float *alpha, void *X, - const int *incX) +void F77_csscal(const CBLAS_INT *N, const float *alpha, void *X, + const CBLAS_INT *incX) { cblas_csscal(*N, *alpha, X, *incX); return; } -void F77_cswap( const int *N, void *X, const int *incX, - void *Y, const int *incY) +void F77_cswap( const CBLAS_INT *N, void *X, const CBLAS_INT *incX, + void *Y, const CBLAS_INT *incY) { cblas_cswap(*N,X,*incX,Y,*incY); return; } -int F77_icamax(const int *N, const void *X, const int *incX) +CBLAS_INT F77_icamax(const CBLAS_INT *N, const void *X, const CBLAS_INT *incX) { if (*N < 1 || *incX < 1) return(0); return (cblas_icamax(*N, X, *incX)+1); } -float F77_scnrm2(const int *N, const void *X, const int *incX) +float F77_scnrm2(const CBLAS_INT *N, const void *X, const CBLAS_INT *incX) { return cblas_scnrm2(*N, X, *incX); } -float F77_scasum(const int *N, void *X, const int *incX) +float F77_scasum(const CBLAS_INT *N, void *X, const CBLAS_INT *incX) { return cblas_scasum(*N, X, *incX); } diff --git a/CBLAS/testing/c_cblas2.c b/CBLAS/testing/c_cblas2.c index bb7e644854..38a089f0e2 100644 --- a/CBLAS/testing/c_cblas2.c +++ b/CBLAS/testing/c_cblas2.c @@ -8,13 +8,17 @@ #include "cblas.h" #include "cblas_test.h" -void F77_cgemv(int *layout, char *transp, int *m, int *n, +void F77_cgemv(CBLAS_INT *layout, char *transp, CBLAS_INT *m, CBLAS_INT *n, const void *alpha, - CBLAS_TEST_COMPLEX *a, int *lda, const void *x, int *incx, - const void *beta, void *y, int *incy) { + CBLAS_TEST_COMPLEX *a, CBLAS_INT *lda, const void *x, CBLAS_INT *incx, + const void *beta, void *y, CBLAS_INT *incy +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN transp_len +#endif +) { CBLAS_TEST_COMPLEX *A; - int i,j,LDA; + CBLAS_INT i,j,LDA; CBLAS_TRANSPOSE trans; get_transpose_type(transp, &trans); @@ -38,13 +42,17 @@ void F77_cgemv(int *layout, char *transp, int *m, int *n, *m, *n, alpha, a, *lda, x, *incx, beta, y, *incy ); } -void F77_cgbmv(int *layout, char *transp, int *m, int *n, int *kl, int *ku, - CBLAS_TEST_COMPLEX *alpha, CBLAS_TEST_COMPLEX *a, int *lda, - CBLAS_TEST_COMPLEX *x, int *incx, - CBLAS_TEST_COMPLEX *beta, CBLAS_TEST_COMPLEX *y, int *incy) { +void F77_cgbmv(CBLAS_INT *layout, char *transp, CBLAS_INT *m, CBLAS_INT *n, CBLAS_INT *kl, CBLAS_INT *ku, + CBLAS_TEST_COMPLEX *alpha, CBLAS_TEST_COMPLEX *a, CBLAS_INT *lda, + CBLAS_TEST_COMPLEX *x, CBLAS_INT *incx, + CBLAS_TEST_COMPLEX *beta, CBLAS_TEST_COMPLEX *y, CBLAS_INT *incy +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN transp_len +#endif +) { CBLAS_TEST_COMPLEX *A; - int i,j,irow,jcol,LDA; + CBLAS_INT i,j,irow,jcol,LDA; CBLAS_TRANSPOSE trans; get_transpose_type(transp, &trans); @@ -85,12 +93,12 @@ void F77_cgbmv(int *layout, char *transp, int *m, int *n, int *kl, int *ku, *incx, beta, y, *incy ); } -void F77_cgeru(int *layout, int *m, int *n, CBLAS_TEST_COMPLEX *alpha, - CBLAS_TEST_COMPLEX *x, int *incx, CBLAS_TEST_COMPLEX *y, int *incy, - CBLAS_TEST_COMPLEX *a, int *lda){ +void F77_cgeru(CBLAS_INT *layout, CBLAS_INT *m, CBLAS_INT *n, CBLAS_TEST_COMPLEX *alpha, + CBLAS_TEST_COMPLEX *x, CBLAS_INT *incx, CBLAS_TEST_COMPLEX *y, CBLAS_INT *incy, + CBLAS_TEST_COMPLEX *a, CBLAS_INT *lda){ CBLAS_TEST_COMPLEX *A; - int i,j,LDA; + CBLAS_INT i,j,LDA; if (*layout == TEST_ROW_MJR) { LDA = *n+1; @@ -114,11 +122,11 @@ void F77_cgeru(int *layout, int *m, int *n, CBLAS_TEST_COMPLEX *alpha, cblas_cgeru( UNDEFINED, *m, *n, alpha, x, *incx, y, *incy, a, *lda ); } -void F77_cgerc(int *layout, int *m, int *n, CBLAS_TEST_COMPLEX *alpha, - CBLAS_TEST_COMPLEX *x, int *incx, CBLAS_TEST_COMPLEX *y, int *incy, - CBLAS_TEST_COMPLEX *a, int *lda) { +void F77_cgerc(CBLAS_INT *layout, CBLAS_INT *m, CBLAS_INT *n, CBLAS_TEST_COMPLEX *alpha, + CBLAS_TEST_COMPLEX *x, CBLAS_INT *incx, CBLAS_TEST_COMPLEX *y, CBLAS_INT *incy, + CBLAS_TEST_COMPLEX *a, CBLAS_INT *lda) { CBLAS_TEST_COMPLEX *A; - int i,j,LDA; + CBLAS_INT i,j,LDA; if (*layout == TEST_ROW_MJR) { LDA = *n+1; @@ -142,12 +150,16 @@ void F77_cgerc(int *layout, int *m, int *n, CBLAS_TEST_COMPLEX *alpha, cblas_cgerc( UNDEFINED, *m, *n, alpha, x, *incx, y, *incy, a, *lda ); } -void F77_chemv(int *layout, char *uplow, int *n, CBLAS_TEST_COMPLEX *alpha, - CBLAS_TEST_COMPLEX *a, int *lda, CBLAS_TEST_COMPLEX *x, - int *incx, CBLAS_TEST_COMPLEX *beta, CBLAS_TEST_COMPLEX *y, int *incy){ +void F77_chemv(CBLAS_INT *layout, char *uplow, CBLAS_INT *n, CBLAS_TEST_COMPLEX *alpha, + CBLAS_TEST_COMPLEX *a, CBLAS_INT *lda, CBLAS_TEST_COMPLEX *x, + CBLAS_INT *incx, CBLAS_TEST_COMPLEX *beta, CBLAS_TEST_COMPLEX *y, CBLAS_INT *incy +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len +#endif +){ CBLAS_TEST_COMPLEX *A; - int i,j,LDA; + CBLAS_INT i,j,LDA; CBLAS_UPLO uplo; get_uplo_type(uplow,&uplo); @@ -172,13 +184,17 @@ void F77_chemv(int *layout, char *uplow, int *n, CBLAS_TEST_COMPLEX *alpha, beta, y, *incy ); } -void F77_chbmv(int *layout, char *uplow, int *n, int *k, - CBLAS_TEST_COMPLEX *alpha, CBLAS_TEST_COMPLEX *a, int *lda, - CBLAS_TEST_COMPLEX *x, int *incx, CBLAS_TEST_COMPLEX *beta, - CBLAS_TEST_COMPLEX *y, int *incy){ +void F77_chbmv(CBLAS_INT *layout, char *uplow, CBLAS_INT *n, CBLAS_INT *k, + CBLAS_TEST_COMPLEX *alpha, CBLAS_TEST_COMPLEX *a, CBLAS_INT *lda, + CBLAS_TEST_COMPLEX *x, CBLAS_INT *incx, CBLAS_TEST_COMPLEX *beta, + CBLAS_TEST_COMPLEX *y, CBLAS_INT *incy +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len +#endif +){ CBLAS_TEST_COMPLEX *A; -int i,irow,j,jcol,LDA; +CBLAS_INT i,irow,j,jcol,LDA; CBLAS_UPLO uplo; @@ -236,12 +252,16 @@ int i,irow,j,jcol,LDA; beta, y, *incy ); } -void F77_chpmv(int *layout, char *uplow, int *n, CBLAS_TEST_COMPLEX *alpha, - CBLAS_TEST_COMPLEX *ap, CBLAS_TEST_COMPLEX *x, int *incx, - CBLAS_TEST_COMPLEX *beta, CBLAS_TEST_COMPLEX *y, int *incy){ +void F77_chpmv(CBLAS_INT *layout, char *uplow, CBLAS_INT *n, CBLAS_TEST_COMPLEX *alpha, + CBLAS_TEST_COMPLEX *ap, CBLAS_TEST_COMPLEX *x, CBLAS_INT *incx, + CBLAS_TEST_COMPLEX *beta, CBLAS_TEST_COMPLEX *y, CBLAS_INT *incy +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len +#endif +){ CBLAS_TEST_COMPLEX *A, *AP; - int i,j,k,LDA; + CBLAS_INT i,j,k,LDA; CBLAS_UPLO uplo; get_uplo_type(uplow,&uplo); @@ -292,11 +312,15 @@ void F77_chpmv(int *layout, char *uplow, int *n, CBLAS_TEST_COMPLEX *alpha, *incy ); } -void F77_ctbmv(int *layout, char *uplow, char *transp, char *diagn, - int *n, int *k, CBLAS_TEST_COMPLEX *a, int *lda, CBLAS_TEST_COMPLEX *x, - int *incx) { +void F77_ctbmv(CBLAS_INT *layout, char *uplow, char *transp, char *diagn, + CBLAS_INT *n, CBLAS_INT *k, CBLAS_TEST_COMPLEX *a, CBLAS_INT *lda, CBLAS_TEST_COMPLEX *x, + CBLAS_INT *incx +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len, FORTRAN_STRLEN transp_len, FORTRAN_STRLEN diagn_len +#endif +) { CBLAS_TEST_COMPLEX *A; - int irow, jcol, i, j, LDA; + CBLAS_INT irow, jcol, i, j, LDA; CBLAS_TRANSPOSE trans; CBLAS_UPLO uplo; CBLAS_DIAG diag; @@ -355,12 +379,16 @@ void F77_ctbmv(int *layout, char *uplow, char *transp, char *diagn, cblas_ctbmv(UNDEFINED, uplo, trans, diag, *n, *k, a, *lda, x, *incx); } -void F77_ctbsv(int *layout, char *uplow, char *transp, char *diagn, - int *n, int *k, CBLAS_TEST_COMPLEX *a, int *lda, CBLAS_TEST_COMPLEX *x, - int *incx) { +void F77_ctbsv(CBLAS_INT *layout, char *uplow, char *transp, char *diagn, + CBLAS_INT *n, CBLAS_INT *k, CBLAS_TEST_COMPLEX *a, CBLAS_INT *lda, CBLAS_TEST_COMPLEX *x, + CBLAS_INT *incx +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len, FORTRAN_STRLEN transp_len, FORTRAN_STRLEN diagn_len +#endif +) { CBLAS_TEST_COMPLEX *A; - int irow, jcol, i, j, LDA; + CBLAS_INT irow, jcol, i, j, LDA; CBLAS_TRANSPOSE trans; CBLAS_UPLO uplo; CBLAS_DIAG diag; @@ -419,10 +447,14 @@ void F77_ctbsv(int *layout, char *uplow, char *transp, char *diagn, cblas_ctbsv(UNDEFINED, uplo, trans, diag, *n, *k, a, *lda, x, *incx); } -void F77_ctpmv(int *layout, char *uplow, char *transp, char *diagn, - int *n, CBLAS_TEST_COMPLEX *ap, CBLAS_TEST_COMPLEX *x, int *incx) { +void F77_ctpmv(CBLAS_INT *layout, char *uplow, char *transp, char *diagn, + CBLAS_INT *n, CBLAS_TEST_COMPLEX *ap, CBLAS_TEST_COMPLEX *x, CBLAS_INT *incx +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len, FORTRAN_STRLEN transp_len , FORTRAN_STRLEN diagn_len +#endif +) { CBLAS_TEST_COMPLEX *A, *AP; - int i, j, k, LDA; + CBLAS_INT i, j, k, LDA; CBLAS_TRANSPOSE trans; CBLAS_UPLO uplo; CBLAS_DIAG diag; @@ -474,10 +506,14 @@ void F77_ctpmv(int *layout, char *uplow, char *transp, char *diagn, cblas_ctpmv( UNDEFINED, uplo, trans, diag, *n, ap, x, *incx ); } -void F77_ctpsv(int *layout, char *uplow, char *transp, char *diagn, - int *n, CBLAS_TEST_COMPLEX *ap, CBLAS_TEST_COMPLEX *x, int *incx) { +void F77_ctpsv(CBLAS_INT *layout, char *uplow, char *transp, char *diagn, + CBLAS_INT *n, CBLAS_TEST_COMPLEX *ap, CBLAS_TEST_COMPLEX *x, CBLAS_INT *incx +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len, FORTRAN_STRLEN transp_len, FORTRAN_STRLEN diagn_len +#endif +) { CBLAS_TEST_COMPLEX *A, *AP; - int i, j, k, LDA; + CBLAS_INT i, j, k, LDA; CBLAS_TRANSPOSE trans; CBLAS_UPLO uplo; CBLAS_DIAG diag; @@ -529,11 +565,15 @@ void F77_ctpsv(int *layout, char *uplow, char *transp, char *diagn, cblas_ctpsv( UNDEFINED, uplo, trans, diag, *n, ap, x, *incx ); } -void F77_ctrmv(int *layout, char *uplow, char *transp, char *diagn, - int *n, CBLAS_TEST_COMPLEX *a, int *lda, CBLAS_TEST_COMPLEX *x, - int *incx) { +void F77_ctrmv(CBLAS_INT *layout, char *uplow, char *transp, char *diagn, + CBLAS_INT *n, CBLAS_TEST_COMPLEX *a, CBLAS_INT *lda, CBLAS_TEST_COMPLEX *x, + CBLAS_INT *incx +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len, FORTRAN_STRLEN transp_len, FORTRAN_STRLEN diagn_len +#endif +) { CBLAS_TEST_COMPLEX *A; - int i,j,LDA; + CBLAS_INT i,j,LDA; CBLAS_TRANSPOSE trans; CBLAS_UPLO uplo; CBLAS_DIAG diag; @@ -558,11 +598,15 @@ void F77_ctrmv(int *layout, char *uplow, char *transp, char *diagn, else cblas_ctrmv(UNDEFINED, uplo, trans, diag, *n, a, *lda, x, *incx); } -void F77_ctrsv(int *layout, char *uplow, char *transp, char *diagn, - int *n, CBLAS_TEST_COMPLEX *a, int *lda, CBLAS_TEST_COMPLEX *x, - int *incx) { +void F77_ctrsv(CBLAS_INT *layout, char *uplow, char *transp, char *diagn, + CBLAS_INT *n, CBLAS_TEST_COMPLEX *a, CBLAS_INT *lda, CBLAS_TEST_COMPLEX *x, + CBLAS_INT *incx +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len, FORTRAN_STRLEN transp_len, FORTRAN_STRLEN diagn_len +#endif +) { CBLAS_TEST_COMPLEX *A; - int i,j,LDA; + CBLAS_INT i,j,LDA; CBLAS_TRANSPOSE trans; CBLAS_UPLO uplo; CBLAS_DIAG diag; @@ -588,10 +632,14 @@ void F77_ctrsv(int *layout, char *uplow, char *transp, char *diagn, cblas_ctrsv(UNDEFINED, uplo, trans, diag, *n, a, *lda, x, *incx ); } -void F77_chpr(int *layout, char *uplow, int *n, float *alpha, - CBLAS_TEST_COMPLEX *x, int *incx, CBLAS_TEST_COMPLEX *ap) { +void F77_chpr(CBLAS_INT *layout, char *uplow, CBLAS_INT *n, float *alpha, + CBLAS_TEST_COMPLEX *x, CBLAS_INT *incx, CBLAS_TEST_COMPLEX *ap +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len +#endif +) { CBLAS_TEST_COMPLEX *A, *AP; - int i,j,k,LDA; + CBLAS_INT i,j,k,LDA; CBLAS_UPLO uplo; get_uplo_type(uplow,&uplo); @@ -663,11 +711,15 @@ void F77_chpr(int *layout, char *uplow, int *n, float *alpha, cblas_chpr(UNDEFINED, uplo, *n, *alpha, x, *incx, ap ); } -void F77_chpr2(int *layout, char *uplow, int *n, CBLAS_TEST_COMPLEX *alpha, - CBLAS_TEST_COMPLEX *x, int *incx, CBLAS_TEST_COMPLEX *y, int *incy, - CBLAS_TEST_COMPLEX *ap) { +void F77_chpr2(CBLAS_INT *layout, char *uplow, CBLAS_INT *n, CBLAS_TEST_COMPLEX *alpha, + CBLAS_TEST_COMPLEX *x, CBLAS_INT *incx, CBLAS_TEST_COMPLEX *y, CBLAS_INT *incy, + CBLAS_TEST_COMPLEX *ap +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len +#endif +) { CBLAS_TEST_COMPLEX *A, *AP; - int i,j,k,LDA; + CBLAS_INT i,j,k,LDA; CBLAS_UPLO uplo; get_uplo_type(uplow,&uplo); @@ -740,10 +792,14 @@ void F77_chpr2(int *layout, char *uplow, int *n, CBLAS_TEST_COMPLEX *alpha, cblas_chpr2( UNDEFINED, uplo, *n, alpha, x, *incx, y, *incy, ap ); } -void F77_cher(int *layout, char *uplow, int *n, float *alpha, - CBLAS_TEST_COMPLEX *x, int *incx, CBLAS_TEST_COMPLEX *a, int *lda) { +void F77_cher(CBLAS_INT *layout, char *uplow, CBLAS_INT *n, float *alpha, + CBLAS_TEST_COMPLEX *x, CBLAS_INT *incx, CBLAS_TEST_COMPLEX *a, CBLAS_INT *lda +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len +#endif +) { CBLAS_TEST_COMPLEX *A; - int i,j,LDA; + CBLAS_INT i,j,LDA; CBLAS_UPLO uplo; get_uplo_type(uplow,&uplo); @@ -772,12 +828,16 @@ void F77_cher(int *layout, char *uplow, int *n, float *alpha, cblas_cher( UNDEFINED, uplo, *n, *alpha, x, *incx, a, *lda ); } -void F77_cher2(int *layout, char *uplow, int *n, CBLAS_TEST_COMPLEX *alpha, - CBLAS_TEST_COMPLEX *x, int *incx, CBLAS_TEST_COMPLEX *y, int *incy, - CBLAS_TEST_COMPLEX *a, int *lda) { +void F77_cher2(CBLAS_INT *layout, char *uplow, CBLAS_INT *n, CBLAS_TEST_COMPLEX *alpha, + CBLAS_TEST_COMPLEX *x, CBLAS_INT *incx, CBLAS_TEST_COMPLEX *y, CBLAS_INT *incy, + CBLAS_TEST_COMPLEX *a, CBLAS_INT *lda +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len +#endif +) { CBLAS_TEST_COMPLEX *A; - int i,j,LDA; + CBLAS_INT i,j,LDA; CBLAS_UPLO uplo; get_uplo_type(uplow,&uplo); diff --git a/CBLAS/testing/c_cblas3.c b/CBLAS/testing/c_cblas3.c index e0e41230f4..4d396fe678 100644 --- a/CBLAS/testing/c_cblas3.c +++ b/CBLAS/testing/c_cblas3.c @@ -11,13 +11,17 @@ #define TEST_ROW_MJR 1 #define UNDEFINED -1 -void F77_cgemm(int *layout, char *transpa, char *transpb, int *m, int *n, - int *k, CBLAS_TEST_COMPLEX *alpha, CBLAS_TEST_COMPLEX *a, int *lda, - CBLAS_TEST_COMPLEX *b, int *ldb, CBLAS_TEST_COMPLEX *beta, - CBLAS_TEST_COMPLEX *c, int *ldc ) { +void F77_cgemm(CBLAS_INT *layout, char *transpa, char *transpb, CBLAS_INT *m, CBLAS_INT *n, + CBLAS_INT *k, CBLAS_TEST_COMPLEX *alpha, CBLAS_TEST_COMPLEX *a, CBLAS_INT *lda, + CBLAS_TEST_COMPLEX *b, CBLAS_INT *ldb, CBLAS_TEST_COMPLEX *beta, + CBLAS_TEST_COMPLEX *c, CBLAS_INT *ldc +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN transpa_len, FORTRAN_STRLEN transpb_len +#endif +) { CBLAS_TEST_COMPLEX *A, *B, *C; - int i,j,LDA, LDB, LDC; + CBLAS_INT i,j,LDA, LDB, LDC; CBLAS_TRANSPOSE transa, transb; get_transpose_type(transpa, &transa); @@ -87,13 +91,98 @@ void F77_cgemm(int *layout, char *transpa, char *transpb, int *m, int *n, cblas_cgemm( UNDEFINED, transa, transb, *m, *n, *k, alpha, a, *lda, b, *ldb, beta, c, *ldc ); } -void F77_chemm(int *layout, char *rtlf, char *uplow, int *m, int *n, - CBLAS_TEST_COMPLEX *alpha, CBLAS_TEST_COMPLEX *a, int *lda, - CBLAS_TEST_COMPLEX *b, int *ldb, CBLAS_TEST_COMPLEX *beta, - CBLAS_TEST_COMPLEX *c, int *ldc ) { + +void F77_cgemmtr(CBLAS_INT *layout, char *uplop, char *transpa, char *transpb, CBLAS_INT *n, + CBLAS_INT *k, CBLAS_TEST_COMPLEX *alpha, CBLAS_TEST_COMPLEX *a, CBLAS_INT *lda, + CBLAS_TEST_COMPLEX *b, CBLAS_INT *ldb, CBLAS_TEST_COMPLEX *beta, + CBLAS_TEST_COMPLEX *c, CBLAS_INT *ldc ) { + + CBLAS_TEST_COMPLEX *A, *B, *C; + CBLAS_INT i,j,LDA, LDB, LDC; + CBLAS_TRANSPOSE transa, transb; + CBLAS_UPLO uplo; + + get_transpose_type(transpa, &transa); + get_transpose_type(transpb, &transb); + get_uplo_type(uplop, &uplo); + + if (*layout == TEST_ROW_MJR) { + if (transa == CblasNoTrans) { + LDA = *k+1; + A=(CBLAS_TEST_COMPLEX*)malloc((*n)*LDA*sizeof(CBLAS_TEST_COMPLEX)); + for( i=0; i<*n; i++ ) + for( j=0; j<*k; j++ ) { + A[i*LDA+j].real=a[j*(*lda)+i].real; + A[i*LDA+j].imag=a[j*(*lda)+i].imag; + } + } + else { + LDA = *n+1; + A=(CBLAS_TEST_COMPLEX* )malloc(LDA*(*k)*sizeof(CBLAS_TEST_COMPLEX)); + for( i=0; i<*k; i++ ) + for( j=0; j<*n; j++ ) { + A[i*LDA+j].real=a[j*(*lda)+i].real; + A[i*LDA+j].imag=a[j*(*lda)+i].imag; + } + } + + if (transb == CblasNoTrans) { + LDB = *n+1; + B=(CBLAS_TEST_COMPLEX* )malloc((*k)*LDB*sizeof(CBLAS_TEST_COMPLEX) ); + for( i=0; i<*k; i++ ) + for( j=0; j<*n; j++ ) { + B[i*LDB+j].real=b[j*(*ldb)+i].real; + B[i*LDB+j].imag=b[j*(*ldb)+i].imag; + } + } + else { + LDB = *k+1; + B=(CBLAS_TEST_COMPLEX* )malloc(LDB*(*n)*sizeof(CBLAS_TEST_COMPLEX)); + for( i=0; i<*n; i++ ) + for( j=0; j<*k; j++ ) { + B[i*LDB+j].real=b[j*(*ldb)+i].real; + B[i*LDB+j].imag=b[j*(*ldb)+i].imag; + } + } + + LDC = *n+1; + C=(CBLAS_TEST_COMPLEX* )malloc((*n)*LDC*sizeof(CBLAS_TEST_COMPLEX)); + for( j=0; j<*n; j++ ) + for( i=0; i<*n; i++ ) { + C[i*LDC+j].real=c[j*(*ldc)+i].real; + C[i*LDC+j].imag=c[j*(*ldc)+i].imag; + } + cblas_cgemmtr( CblasRowMajor, uplo, transa, transb, *n, *k, alpha, A, LDA, + B, LDB, beta, C, LDC ); + for( j=0; j<*n; j++ ) + for( i=0; i<*n; i++ ) { + c[j*(*ldc)+i].real=C[i*LDC+j].real; + c[j*(*ldc)+i].imag=C[i*LDC+j].imag; + } + free(A); + free(B); + free(C); + } + else if (*layout == TEST_COL_MJR) + cblas_cgemmtr( CblasColMajor, uplo, transa, transb, *n, *k, alpha, a, *lda, + b, *ldb, beta, c, *ldc ); + else + cblas_cgemmtr( UNDEFINED, uplo, transa, transb, *n, *k, alpha, a, *lda, + b, *ldb, beta, c, *ldc ); +} + + +void F77_chemm(CBLAS_INT *layout, char *rtlf, char *uplow, CBLAS_INT *m, CBLAS_INT *n, + CBLAS_TEST_COMPLEX *alpha, CBLAS_TEST_COMPLEX *a, CBLAS_INT *lda, + CBLAS_TEST_COMPLEX *b, CBLAS_INT *ldb, CBLAS_TEST_COMPLEX *beta, + CBLAS_TEST_COMPLEX *c, CBLAS_INT *ldc +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN rtlf_len, FORTRAN_STRLEN uplow_len +#endif +) { CBLAS_TEST_COMPLEX *A, *B, *C; - int i,j,LDA, LDB, LDC; + CBLAS_INT i,j,LDA, LDB, LDC; CBLAS_UPLO uplo; CBLAS_SIDE side; @@ -151,13 +240,17 @@ void F77_chemm(int *layout, char *rtlf, char *uplow, int *m, int *n, cblas_chemm( UNDEFINED, side, uplo, *m, *n, alpha, a, *lda, b, *ldb, beta, c, *ldc ); } -void F77_csymm(int *layout, char *rtlf, char *uplow, int *m, int *n, - CBLAS_TEST_COMPLEX *alpha, CBLAS_TEST_COMPLEX *a, int *lda, - CBLAS_TEST_COMPLEX *b, int *ldb, CBLAS_TEST_COMPLEX *beta, - CBLAS_TEST_COMPLEX *c, int *ldc ) { +void F77_csymm(CBLAS_INT *layout, char *rtlf, char *uplow, CBLAS_INT *m, CBLAS_INT *n, + CBLAS_TEST_COMPLEX *alpha, CBLAS_TEST_COMPLEX *a, CBLAS_INT *lda, + CBLAS_TEST_COMPLEX *b, CBLAS_INT *ldb, CBLAS_TEST_COMPLEX *beta, + CBLAS_TEST_COMPLEX *c, CBLAS_INT *ldc +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN rtlf_len, FORTRAN_STRLEN uplow_len +#endif +) { CBLAS_TEST_COMPLEX *A, *B, *C; - int i,j,LDA, LDB, LDC; + CBLAS_INT i,j,LDA, LDB, LDC; CBLAS_UPLO uplo; CBLAS_SIDE side; @@ -206,11 +299,15 @@ void F77_csymm(int *layout, char *rtlf, char *uplow, int *m, int *n, beta, c, *ldc ); } -void F77_cherk(int *layout, char *uplow, char *transp, int *n, int *k, - float *alpha, CBLAS_TEST_COMPLEX *a, int *lda, - float *beta, CBLAS_TEST_COMPLEX *c, int *ldc ) { +void F77_cherk(CBLAS_INT *layout, char *uplow, char *transp, CBLAS_INT *n, CBLAS_INT *k, + float *alpha, CBLAS_TEST_COMPLEX *a, CBLAS_INT *lda, + float *beta, CBLAS_TEST_COMPLEX *c, CBLAS_INT *ldc +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len, FORTRAN_STRLEN transp_len +#endif +) { - int i,j,LDA,LDC; + CBLAS_INT i,j,LDA,LDC; CBLAS_TEST_COMPLEX *A, *C; CBLAS_UPLO uplo; CBLAS_TRANSPOSE trans; @@ -262,11 +359,15 @@ void F77_cherk(int *layout, char *uplow, char *transp, int *n, int *k, c, *ldc ); } -void F77_csyrk(int *layout, char *uplow, char *transp, int *n, int *k, - CBLAS_TEST_COMPLEX *alpha, CBLAS_TEST_COMPLEX *a, int *lda, - CBLAS_TEST_COMPLEX *beta, CBLAS_TEST_COMPLEX *c, int *ldc ) { +void F77_csyrk(CBLAS_INT *layout, char *uplow, char *transp, CBLAS_INT *n, CBLAS_INT *k, + CBLAS_TEST_COMPLEX *alpha, CBLAS_TEST_COMPLEX *a, CBLAS_INT *lda, + CBLAS_TEST_COMPLEX *beta, CBLAS_TEST_COMPLEX *c, CBLAS_INT *ldc +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len, FORTRAN_STRLEN transp_len +#endif +) { - int i,j,LDA,LDC; + CBLAS_INT i,j,LDA,LDC; CBLAS_TEST_COMPLEX *A, *C; CBLAS_UPLO uplo; CBLAS_TRANSPOSE trans; @@ -317,11 +418,15 @@ void F77_csyrk(int *layout, char *uplow, char *transp, int *n, int *k, cblas_csyrk(UNDEFINED, uplo, trans, *n, *k, alpha, a, *lda, beta, c, *ldc ); } -void F77_cher2k(int *layout, char *uplow, char *transp, int *n, int *k, - CBLAS_TEST_COMPLEX *alpha, CBLAS_TEST_COMPLEX *a, int *lda, - CBLAS_TEST_COMPLEX *b, int *ldb, float *beta, - CBLAS_TEST_COMPLEX *c, int *ldc ) { - int i,j,LDA,LDB,LDC; +void F77_cher2k(CBLAS_INT *layout, char *uplow, char *transp, CBLAS_INT *n, CBLAS_INT *k, + CBLAS_TEST_COMPLEX *alpha, CBLAS_TEST_COMPLEX *a, CBLAS_INT *lda, + CBLAS_TEST_COMPLEX *b, CBLAS_INT *ldb, float *beta, + CBLAS_TEST_COMPLEX *c, CBLAS_INT *ldc +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len, FORTRAN_STRLEN transp_len +#endif +) { + CBLAS_INT i,j,LDA,LDB,LDC; CBLAS_TEST_COMPLEX *A, *B, *C; CBLAS_UPLO uplo; CBLAS_TRANSPOSE trans; @@ -381,11 +486,15 @@ void F77_cher2k(int *layout, char *uplow, char *transp, int *n, int *k, cblas_cher2k(UNDEFINED, uplo, trans, *n, *k, alpha, a, *lda, b, *ldb, *beta, c, *ldc ); } -void F77_csyr2k(int *layout, char *uplow, char *transp, int *n, int *k, - CBLAS_TEST_COMPLEX *alpha, CBLAS_TEST_COMPLEX *a, int *lda, - CBLAS_TEST_COMPLEX *b, int *ldb, CBLAS_TEST_COMPLEX *beta, - CBLAS_TEST_COMPLEX *c, int *ldc ) { - int i,j,LDA,LDB,LDC; +void F77_csyr2k(CBLAS_INT *layout, char *uplow, char *transp, CBLAS_INT *n, CBLAS_INT *k, + CBLAS_TEST_COMPLEX *alpha, CBLAS_TEST_COMPLEX *a, CBLAS_INT *lda, + CBLAS_TEST_COMPLEX *b, CBLAS_INT *ldb, CBLAS_TEST_COMPLEX *beta, + CBLAS_TEST_COMPLEX *c, CBLAS_INT *ldc +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len, FORTRAN_STRLEN transp_len +#endif +) { + CBLAS_INT i,j,LDA,LDB,LDC; CBLAS_TEST_COMPLEX *A, *B, *C; CBLAS_UPLO uplo; CBLAS_TRANSPOSE trans; @@ -445,10 +554,14 @@ void F77_csyr2k(int *layout, char *uplow, char *transp, int *n, int *k, cblas_csyr2k(UNDEFINED, uplo, trans, *n, *k, alpha, a, *lda, b, *ldb, beta, c, *ldc ); } -void F77_ctrmm(int *layout, char *rtlf, char *uplow, char *transp, char *diagn, - int *m, int *n, CBLAS_TEST_COMPLEX *alpha, CBLAS_TEST_COMPLEX *a, - int *lda, CBLAS_TEST_COMPLEX *b, int *ldb) { - int i,j,LDA,LDB; +void F77_ctrmm(CBLAS_INT *layout, char *rtlf, char *uplow, char *transp, char *diagn, + CBLAS_INT *m, CBLAS_INT *n, CBLAS_TEST_COMPLEX *alpha, CBLAS_TEST_COMPLEX *a, + CBLAS_INT *lda, CBLAS_TEST_COMPLEX *b, CBLAS_INT *ldb +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN rtlf_len, FORTRAN_STRLEN uplow_len, FORTRAN_STRLEN transp_len, FORTRAN_STRLEN diagn_len +#endif +) { + CBLAS_INT i,j,LDA,LDB; CBLAS_TEST_COMPLEX *A, *B; CBLAS_SIDE side; CBLAS_DIAG diag; @@ -504,10 +617,14 @@ void F77_ctrmm(int *layout, char *rtlf, char *uplow, char *transp, char *diagn, a, *lda, b, *ldb); } -void F77_ctrsm(int *layout, char *rtlf, char *uplow, char *transp, char *diagn, - int *m, int *n, CBLAS_TEST_COMPLEX *alpha, CBLAS_TEST_COMPLEX *a, - int *lda, CBLAS_TEST_COMPLEX *b, int *ldb) { - int i,j,LDA,LDB; +void F77_ctrsm(CBLAS_INT *layout, char *rtlf, char *uplow, char *transp, char *diagn, + CBLAS_INT *m, CBLAS_INT *n, CBLAS_TEST_COMPLEX *alpha, CBLAS_TEST_COMPLEX *a, + CBLAS_INT *lda, CBLAS_TEST_COMPLEX *b, CBLAS_INT *ldb +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN rtlf_len, FORTRAN_STRLEN uplow_len, FORTRAN_STRLEN transp_len, FORTRAN_STRLEN diagn_len +#endif +) { + CBLAS_INT i,j,LDA,LDB; CBLAS_TEST_COMPLEX *A, *B; CBLAS_SIDE side; CBLAS_DIAG diag; diff --git a/CBLAS/testing/c_cblat1.f b/CBLAS/testing/c_cblat1.f index 1a123d74dc..ec1bae514b 100644 --- a/CBLAS/testing/c_cblat1.f +++ b/CBLAS/testing/c_cblat1.f @@ -1,4 +1,6 @@ +* ===================================================================== PROGRAM CCBLAT1 + IMPLICIT NONE * Test program for the COMPLEX Level 1 CBLAS. * Based upon the original CBLAS test routine together with: * F06GAF Example Program Text @@ -19,7 +21,7 @@ PROGRAM CCBLAT1 DATA SFAC/9.765625E-4/ * .. Executable Statements .. WRITE (NOUT,99999) - DO 20 IC = 1, 10 + DO 20 IC = 1, 11 ICASE = IC CALL HEADER * @@ -32,7 +34,7 @@ PROGRAM CCBLAT1 INCX = 9999 INCY = 9999 MODE = 9999 - IF (ICASE.LE.5) THEN + IF (ICASE.LE.5 .OR. ICASE.EQ.11) THEN CALL CHECK2(SFAC) ELSE IF (ICASE.GE.6) THEN CALL CHECK1(SFAC) @@ -45,7 +47,10 @@ PROGRAM CCBLAT1 99999 FORMAT (' Complex CBLAS Test Program Results',/1X) 99998 FORMAT (' ----- PASS -----') END + +* ===================================================================== SUBROUTINE HEADER + IMPLICIT NONE * .. Parameters .. INTEGER NOUT PARAMETER (NOUT=6) @@ -53,7 +58,7 @@ SUBROUTINE HEADER INTEGER ICASE, INCX, INCY, MODE, N LOGICAL PASS * .. Local Arrays .. - CHARACTER*15 L(10) + CHARACTER*15 L(11) * .. Common blocks .. COMMON /COMBLA/ICASE, N, INCX, INCY, MODE, PASS * .. Data statements .. @@ -67,13 +72,18 @@ SUBROUTINE HEADER DATA L(8)/'CBLAS_CSCAL'/ DATA L(9)/'CBLAS_CSSCAL'/ DATA L(10)/'CBLAS_ICAMAX'/ + DATA L(11)/'CBLAS_CAXPBY'/ + * .. Executable Statements .. WRITE (NOUT,99999) ICASE, L(ICASE) RETURN * 99999 FORMAT (/' Test of subprogram number',I3,9X,A15) END + +* ===================================================================== SUBROUTINE CHECK1(SFAC) + IMPLICIT NONE * .. Parameters .. INTEGER NOUT PARAMETER (NOUT=6) @@ -274,7 +284,10 @@ SUBROUTINE CHECK1(SFAC) END IF RETURN END + +* ===================================================================== SUBROUTINE CHECK2(SFAC) + IMPLICIT NONE * .. Parameters .. INTEGER NOUT PARAMETER (NOUT=6) @@ -284,23 +297,26 @@ SUBROUTINE CHECK2(SFAC) INTEGER ICASE, INCX, INCY, MODE, N LOGICAL PASS * .. Local Scalars .. - COMPLEX CA,CTEMP + COMPLEX CA,CB,CTEMP INTEGER I, J, KI, KN, KSIZE, LENX, LENY, MX, MY * .. Local Arrays .. COMPLEX CDOT(1), CSIZE1(4), CSIZE2(7,2), CSIZE3(14), + CT10X(7,4,4), CT10Y(7,4,4), CT6(4,4), CT7(4,4), - + CT8(7,4,4), CX(7), CX1(7), CY(7), CY1(7) + + CT8(7,4,4), CX(7), CX1(7), CY(7), CY1(7), + + CT11(7,4,4) INTEGER INCXS(4), INCYS(4), LENS(4,2), NS(4) * .. External Functions .. EXTERNAL CDOTCTEST, CDOTUTEST * .. External Subroutines .. - EXTERNAL CAXPYTEST, CCOPYTEST, CSWAPTEST, CTEST + EXTERNAL CAXPYTEST, CCOPYTEST, CSWAPTEST, CTEST, + + CAXPBYTEST * .. Intrinsic Functions .. INTRINSIC ABS, MIN * .. Common blocks .. COMMON /COMBLA/ICASE, N, INCX, INCY, MODE, PASS * .. Data statements .. DATA CA/(0.4E0,-0.7E0)/ + DATA CB/(0.7E0,-0.4E0)/ DATA INCXS/1, 2, -2, -1/ DATA INCYS/1, -2, 1, -2/ DATA LENS/1, 1, 2, 4, 1, 1, 3, 7/ @@ -470,6 +486,54 @@ SUBROUTINE CHECK2(SFAC) + (1.54E0,1.54E0), (1.54E0,1.54E0), + (1.54E0,1.54E0), (1.54E0,1.54E0), + (1.54E0,1.54E0), (1.54E0,1.54E0)/ + + DATA ((CT11(I,J,1),I=1,7),J=1,4)/(0.6E0,-0.6E0), + + (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0), + + (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0), + + (-0.1E0,-1.47E0), (0.0E0,0.0E0), (0.0E0,0.0E0), + + (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0), + + (0.0E0,0.0E0), (-0.1E0,-1.47E0), + + (-1.08E0,0.71E0), (0.0E0,0.0E0), (0.0E0,0.0E0), + + (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0), + + (-0.1E0,-1.47E0), (-1.08E0,0.71E0), + + (-0.42E0,-0.99E0), (-0.61E0,-0.85E0), + + (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0)/ + DATA ((CT11(I,J,2),I=1,7),J=1,4)/(0.6E0,-0.6E0), + + (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0), + + (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0), + + (-0.1E0,-1.47E0), (0.0E0,0.0E0), (0.0E0,0.0E0), + + (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0), + + (0.0E0,0.0E0), (-0.49E0,-0.95E0), + + (-0.9E0,0.5E0),(-0.03E0,-1.51E0), (0.0E0,0.0E0), + + (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0), + + (0.36E0,0.00E0), (-0.9E0,0.5E0), + + (-0.39E0,-0.23E0), (0.1E0,-0.5E0), + + (-0.82E0,-0.39E0), (-0.5E0,-0.3E0), + + (0.0E0,-1.62E0)/ + DATA ((CT11(I,J,3),I=1,7),J=1,4)/(0.6E0,-0.6E0), + + (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0), + + (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0), + + (-0.1E0,-1.47E0), (0.0E0,0.0E0), (0.0E0,0.0E0), + + (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0), + + (0.0E0,0.0E0), (-0.49E0,-0.95E0), + + (-0.71E0,-0.1E0), (0.0E0,0.0E0), (0.0E0,0.0E0), + + (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0), + + (0.36E0,0.00E0), (-1.07E0,1.18E0), + + (-0.42E0,-0.99E0), (-0.41E0,-1.2E0), + + (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0)/ + DATA ((CT11(I,J,4),I=1,7),J=1,4)/(0.6E0,-0.6E0), + + (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0), + + (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0), + + (-0.1E0,-1.47E0), (0.0E0,0.0E0), (0.0E0,0.0E0), + + (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0), + + (0.0E0,0.0E0), (-0.1E0,-1.47E0), (-0.9E0,0.5E0), + + (-0.4E0,-0.7E0), (0.0E0,0.0E0), (0.0E0,0.0E0), + + (0.0E0,0.0E0), (0.0E0,0.0E0), (-0.1E0,-1.47E0), + + (-0.9E0,0.5E0),(-0.4E0,-0.7E0), (0.1E0,-0.5E0), + + (-0.82E0,-0.39E0), (-0.5E0,-0.3E0), + + (-0.2E0,-1.27E0)/ + + * .. Executable Statements .. DO 60 KI = 1, 4 INCX = INCXS(KI) @@ -510,6 +574,10 @@ SUBROUTINE CHECK2(SFAC) CALL CSWAPTEST(N,CX,INCX,CY,INCY) CALL CTEST(LENX,CX,CT10X(1,KN,KI),CSIZE3,1.0E0) CALL CTEST(LENY,CY,CT10Y(1,KN,KI),CSIZE3,1.0E0) + ELSE IF (ICASE.EQ.11) THEN +* .. CAXPBYTEST .. + CALL CAXPBYTEST(N,CA,CX,INCX,CB,CY,INCY) + CALL CTEST(LENY,CY,CT11(1,KN,KI),CSIZE2(1,KSIZE),SFAC) ELSE WRITE (NOUT,*) ' Shouldn''t be here in CHECK2' STOP @@ -519,7 +587,10 @@ SUBROUTINE CHECK2(SFAC) 60 CONTINUE RETURN END + +* ===================================================================== SUBROUTINE STEST(LEN,SCOMP,STRUE,SSIZE,SFAC) + IMPLICIT NONE * ********************************* STEST ************************** * * THIS SUBR COMPARES ARRAYS SCOMP() AND STRUE() OF LENGTH LEN TO @@ -574,7 +645,10 @@ SUBROUTINE STEST(LEN,SCOMP,STRUE,SSIZE,SFAC) + ' SIZE(I)',/1X) 99997 FORMAT (1X,I4,I3,3I5,I3,2E36.8,2E12.4) END + +* ===================================================================== SUBROUTINE STEST1(SCOMP1,STRUE1,SSIZE,SFAC) + IMPLICIT NONE * ************************* STEST1 ***************************** * * THIS IS AN INTERFACE SUBROUTINE TO ACCOMMODATE THE FORTRAN @@ -599,7 +673,10 @@ SUBROUTINE STEST1(SCOMP1,STRUE1,SSIZE,SFAC) * RETURN END + +* ===================================================================== REAL FUNCTION SDIFF(SA,SB) + IMPLICIT NONE * ********************************* SDIFF ************************** * COMPUTES DIFFERENCE OF TWO NUMBERS. C. L. LAWSON, JPL 1974 FEB 15 * @@ -609,7 +686,10 @@ REAL FUNCTION SDIFF(SA,SB) SDIFF = SA - SB RETURN END + +* ===================================================================== SUBROUTINE CTEST(LEN,CCOMP,CTRUE,CSIZE,SFAC) + IMPLICIT NONE * **************************** CTEST ***************************** * * C.L. LAWSON, JPL, 1978 DEC 6 @@ -640,7 +720,10 @@ SUBROUTINE CTEST(LEN,CCOMP,CTRUE,CSIZE,SFAC) CALL STEST(2*LEN,SCOMP,STRUE,SSIZE,SFAC) RETURN END + +* ===================================================================== SUBROUTINE ITEST1(ICOMP,ITRUE) + IMPLICIT NONE * ********************************* ITEST1 ************************* * * THIS SUBROUTINE COMPARES THE VARIABLES ICOMP AND ITRUE FOR diff --git a/CBLAS/testing/c_cblat2.f b/CBLAS/testing/c_cblat2.f index d934ebb49d..3aa7908c33 100644 --- a/CBLAS/testing/c_cblat2.f +++ b/CBLAS/testing/c_cblat2.f @@ -1,4 +1,6 @@ +* ===================================================================== PROGRAM CBLAT2 + IMPLICIT NONE * * Test program for the COMPLEX Level 2 Blas. * @@ -349,13 +351,13 @@ PROGRAM CBLAT2 CALL CCHK3( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE, $ REWI, FATAL, NIDIM, IDIM, NKB, KB, NINC, INC, $ NMAX, INCMAX, A, AA, AS, Y, YY, YS, YT, G, Z, - $ 0 ) + $ 0 ) END IF IF (RORDER) THEN CALL CCHK3( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE, $ REWI, FATAL, NIDIM, IDIM, NKB, KB, NINC, INC, $ NMAX, INCMAX, A, AA, AS, Y, YY, YS, YT, G, Z, - $ 1 ) + $ 1 ) END IF GO TO 200 * Test CGERC, 12, CGERU, 13. @@ -459,10 +461,13 @@ PROGRAM CBLAT2 * End of CBLAT2. * END + +* ===================================================================== SUBROUTINE CCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF, NBET, $ BET, NINC, INC, NMAX, INCMAX, A, AA, AS, X, XX, $ XS, Y, YY, YS, YT, G, IORDER ) + IMPLICIT NONE * * Tests CGEMV and CGBMV. * @@ -814,10 +819,13 @@ SUBROUTINE CCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * End of CCHK1. * END + +* ===================================================================== SUBROUTINE CCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF, NBET, $ BET, NINC, INC, NMAX, INCMAX, A, AA, AS, X, XX, $ XS, Y, YY, YS, YT, G, IORDER ) + IMPLICIT NONE * * Tests CHEMV, CHBMV and CHPMV. * @@ -1170,9 +1178,12 @@ SUBROUTINE CCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * End of CCHK2. * END + +* ===================================================================== SUBROUTINE CCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NKB, KB, NINC, INC, NMAX, $ INCMAX, A, AA, AS, X, XX, XS, XT, G, Z, IORDER ) + IMPLICIT NONE * * Tests CTRMV, CTBMV, CTPMV, CTRSV, CTBSV and CTPSV. * @@ -1551,10 +1562,13 @@ SUBROUTINE CCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * End of CCHK3. * END + +* ===================================================================== SUBROUTINE CCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX, $ INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G, $ Z, IORDER ) + IMPLICIT NONE * * Tests CGERC and CGERU. * @@ -1828,10 +1842,13 @@ SUBROUTINE CCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * End of CCHK4. * END + +* ===================================================================== SUBROUTINE CCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX, $ INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G, $ Z, IORDER ) + IMPLICIT NONE * * Tests CHER and CHPR. * @@ -2121,10 +2138,13 @@ SUBROUTINE CCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * End of CCHK5. * END + +* ===================================================================== SUBROUTINE CCHK6( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX, $ INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G, $ Z, IORDER ) + IMPLICIT NONE * * Tests CHER2 and CHPR2. * @@ -2448,8 +2468,11 @@ SUBROUTINE CCHK6( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * End of CCHK6. * END + +* ===================================================================== SUBROUTINE CMVCH( TRANS, M, N, ALPHA, A, NMAX, X, INCX, BETA, Y, $ INCY, YT, G, YY, EPS, ERR, FATAL, NOUT, MV ) + IMPLICIT NONE * * Checks the results of the computational tests. * @@ -2580,7 +2603,10 @@ SUBROUTINE CMVCH( TRANS, M, N, ALPHA, A, NMAX, X, INCX, BETA, Y, * End of CMVCH. * END + +* ===================================================================== LOGICAL FUNCTION LCE( RI, RJ, LR ) + IMPLICIT NONE * * Tests if two arrays are identical. * @@ -2610,7 +2636,10 @@ LOGICAL FUNCTION LCE( RI, RJ, LR ) * End of LCE. * END + +* ===================================================================== LOGICAL FUNCTION LCERES( TYPE, UPLO, M, N, AA, AS, LDA ) + IMPLICIT NONE * * Tests if selected elements in two arrays are equal. * @@ -2670,7 +2699,10 @@ LOGICAL FUNCTION LCERES( TYPE, UPLO, M, N, AA, AS, LDA ) * End of LCERES. * END + +* ===================================================================== COMPLEX FUNCTION CBEG( RESET ) + IMPLICIT NONE * * Generates complex numbers as pairs of random numbers uniformly * distributed between -0.5 and 0.5. @@ -2722,7 +2754,10 @@ COMPLEX FUNCTION CBEG( RESET ) * End of CBEG. * END + +* ===================================================================== REAL FUNCTION SDIFF( X, Y ) + IMPLICIT NONE * * Auxiliary routine for test program for Level 2 Blas. * @@ -2738,8 +2773,11 @@ REAL FUNCTION SDIFF( X, Y ) * End of SDIFF. * END + +* ===================================================================== SUBROUTINE CMAKE( TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, KL, $ KU, RESET, TRANSL ) + IMPLICIT NONE * * Generates values for an M by N matrix A within the bandwidth * defined by KL and KU. diff --git a/CBLAS/testing/c_cblat3.f b/CBLAS/testing/c_cblat3.f index 94144b8750..44aa1425c5 100644 --- a/CBLAS/testing/c_cblat3.f +++ b/CBLAS/testing/c_cblat3.f @@ -1,12 +1,14 @@ +* ===================================================================== PROGRAM CBLAT3 + IMPLICIT NONE * * Test program for the COMPLEX Level 3 Blas. * * The program must be driven by a short data file. The first 13 records -* of the file are read using list-directed input, the last 9 records -* are read using the format ( A12, L2 ). An annotated example of a data +* of the file are read using list-directed input, the last 10 records +* are read using the format ( A13, L2 ). An annotated example of a data * file can be obtained by deleting the first 3 characters from the -* following 22 lines: +* following 23 lines: * 'CBLAT3.SNAP' NAME OF SNAPSHOT OUTPUT FILE * -1 UNIT NUMBER OF SNAPSHOT FILE (NOT USED IF .LT. 0) * F LOGICAL FLAG, T TO REWIND SNAPSHOT FILE AFTER EACH RECORD. @@ -20,15 +22,16 @@ PROGRAM CBLAT3 * (0.0,0.0) (1.0,0.0) (0.7,-0.9) VALUES OF ALPHA * 3 NUMBER OF VALUES OF BETA * (0.0,0.0) (1.0,0.0) (1.3,-1.1) VALUES OF BETA -* cblas_cgemm T PUT F FOR NO TEST. SAME COLUMNS. -* cblas_chemm T PUT F FOR NO TEST. SAME COLUMNS. -* cblas_csymm T PUT F FOR NO TEST. SAME COLUMNS. -* cblas_ctrmm T PUT F FOR NO TEST. SAME COLUMNS. -* cblas_ctrsm T PUT F FOR NO TEST. SAME COLUMNS. -* cblas_cherk T PUT F FOR NO TEST. SAME COLUMNS. -* cblas_csyrk T PUT F FOR NO TEST. SAME COLUMNS. -* cblas_cher2k T PUT F FOR NO TEST. SAME COLUMNS. -* cblas_csyr2k T PUT F FOR NO TEST. SAME COLUMNS. +* cblas_cgemm T PUT F FOR NO TEST. SAME COLUMNS. +* cblas_chemm T PUT F FOR NO TEST. SAME COLUMNS. +* cblas_csymm T PUT F FOR NO TEST. SAME COLUMNS. +* cblas_ctrmm T PUT F FOR NO TEST. SAME COLUMNS. +* cblas_ctrsm T PUT F FOR NO TEST. SAME COLUMNS. +* cblas_cherk T PUT F FOR NO TEST. SAME COLUMNS. +* cblas_csyrk T PUT F FOR NO TEST. SAME COLUMNS. +* cblas_cher2k T PUT F FOR NO TEST. SAME COLUMNS. +* cblas_csyr2k T PUT F FOR NO TEST. SAME COLUMNS. +* cblas_cgemmtr T PUT F FOR NO TEST. SAME COLUMNS. * * See: * @@ -49,7 +52,7 @@ PROGRAM CBLAT3 INTEGER NIN, NOUT PARAMETER ( NIN = 5, NOUT = 6 ) INTEGER NSUBS - PARAMETER ( NSUBS = 9 ) + PARAMETER ( NSUBS = 10 ) COMPLEX ZERO, ONE PARAMETER ( ZERO = ( 0.0, 0.0 ), ONE = ( 1.0, 0.0 ) ) REAL RZERO, RHALF, RONE @@ -65,7 +68,7 @@ PROGRAM CBLAT3 LOGICAL FATAL, LTESTT, REWI, SAME, SFATAL, TRACE, $ TSTERR, CORDER, RORDER CHARACTER*1 TRANSA, TRANSB - CHARACTER*12 SNAMET + CHARACTER*13 SNAMET CHARACTER*32 SNAPS * .. Local Arrays .. COMPLEX AA( NMAX*NMAX ), AB( NMAX, 2*NMAX ), @@ -77,19 +80,19 @@ PROGRAM CBLAT3 REAL G( NMAX ) INTEGER IDIM( NIDMAX ) LOGICAL LTEST( NSUBS ) - CHARACTER*12 SNAMES( NSUBS ) + CHARACTER*13 SNAMES( NSUBS ) * .. External Functions .. REAL SDIFF LOGICAL LCE EXTERNAL SDIFF, LCE * .. External Subroutines .. - EXTERNAL CCHK1, CCHK2, CCHK3, CCHK4, CCHK5, CMMCH + EXTERNAL CCHK1, CCHK2, CCHK3, CCHK4, CCHK5, CCHK6, CMMCH * .. Intrinsic Functions .. INTRINSIC MAX, MIN * .. Scalars in Common .. INTEGER INFOT, NOUTC LOGICAL LERR, OK - CHARACTER*12 SRNAMT + CHARACTER*13 SRNAMT * .. Common blocks .. COMMON /INFOC/INFOT, NOUTC, OK, LERR COMMON /SRNAMC/SRNAMT @@ -97,7 +100,7 @@ PROGRAM CBLAT3 DATA SNAMES/'cblas_cgemm ', 'cblas_chemm ', $ 'cblas_csymm ', 'cblas_ctrmm ', 'cblas_ctrsm ', $ 'cblas_cherk ', 'cblas_csyrk ', 'cblas_cher2k', - $ 'cblas_csyr2k'/ + $ 'cblas_csyr2k', 'cblas_cgemmtr' / * .. Executable Statements .. * NOUTC = NOUT @@ -295,7 +298,7 @@ PROGRAM CBLAT3 OK = .TRUE. FATAL = .FALSE. GO TO ( 140, 150, 150, 160, 160, 170, 170, - $ 180, 180 )ISNUM + $ 180, 180, 185 )ISNUM * Test CGEMM, 01. 140 IF (CORDER) THEN CALL CCHK1(SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE, @@ -329,13 +332,13 @@ PROGRAM CBLAT3 CALL CCHK3(SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE, $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NMAX, AB, $ AA, AS, AB( 1, NMAX + 1 ), BB, BS, CT, G, C, - $ 0 ) + $ 0 ) END IF IF (RORDER) THEN CALL CCHK3(SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE, $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NMAX, AB, $ AA, AS, AB( 1, NMAX + 1 ), BB, BS, CT, G, C, - $ 1 ) + $ 1 ) END IF GO TO 190 * Test CHERK, 06, CSYRK, 07. @@ -357,15 +360,30 @@ PROGRAM CBLAT3 CALL CCHK5(SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE, $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, $ NMAX, AB, AA, AS, BB, BS, C, CC, CS, CT, G, W, - $ 0 ) + $ 0 ) END IF IF (RORDER) THEN CALL CCHK5(SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE, $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, $ NMAX, AB, AA, AS, BB, BS, C, CC, CS, CT, G, W, - $ 1 ) + $ 1 ) END IF GO TO 190 +* Test CGEMMTR, 10. + 185 IF (CORDER) THEN + CALL CCHK6(SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE, + $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, + $ NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C, + $ CC, CS, CT, G, 0 ) + END IF + IF (RORDER) THEN + CALL CCHK6(SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE, + $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, + $ NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C, + $ CC, CS, CT, G, 1 ) + END IF + GO TO 190 + * 190 IF( FATAL.AND.SFATAL ) $ GO TO 210 @@ -405,7 +423,7 @@ PROGRAM CBLAT3 $ 7( '(', F4.1, ',', F4.1, ') ', : ) ) 9991 FORMAT( ' AMEND DATA FILE OR INCREASE ARRAY SIZES IN PROGRAM', $ /' ******* TESTS ABANDONED *******' ) - 9990 FORMAT(' SUBPROGRAM NAME ', A12,' NOT RECOGNIZED', /' ******* T', + 9990 FORMAT(' SUBPROGRAM NAME ', A13,' NOT RECOGNIZED', /' ******* T', $ 'ESTS ABANDONED *******' ) 9989 FORMAT(' ERROR IN CMMCH - IN-LINE DOT PRODUCTS ARE BEING EVALU', $ 'ATED WRONGLY.', /' CMMCH WAS CALLED WITH TRANSA = ', A1, @@ -413,8 +431,8 @@ PROGRAM CBLAT3 $ ' ERR = ', F12.3, '.', /' THIS MAY BE DUE TO FAULTS IN THE ', $ 'ARITHMETIC OR THE COMPILER.', /' ******* TESTS ABANDONED ', $ '*******' ) - 9988 FORMAT( A12,L2 ) - 9987 FORMAT( 1X, A12,' WAS NOT TESTED' ) + 9988 FORMAT( A13,L2 ) + 9987 FORMAT( 1X, A13,' WAS NOT TESTED' ) 9986 FORMAT( /' END OF TESTS' ) 9985 FORMAT( /' ******* FATAL ERROR - TESTS ABANDONED *******' ) 9984 FORMAT( ' ERROR-EXITS WILL NOT BE TESTED' ) @@ -422,10 +440,13 @@ PROGRAM CBLAT3 * End of CBLAT3. * END + +* ===================================================================== SUBROUTINE CCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX, $ A, AA, AS, B, BB, BS, C, CC, CS, CT, G, $ IORDER ) + IMPLICIT NONE * * Tests CGEMM. * @@ -446,7 +467,7 @@ SUBROUTINE CCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, REAL EPS, THRESH INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA, IORDER LOGICAL FATAL, REWI, TRACE - CHARACTER*12 SNAME + CHARACTER*13 SNAME * .. Array Arguments .. COMPLEX A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ), $ AS( NMAX*NMAX ), B( NMAX, NMAX ), @@ -694,20 +715,20 @@ SUBROUTINE CCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, 130 CONTINUE RETURN * -10003 FORMAT( ' ', A12,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ', +10003 FORMAT( ' ', A13,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ', $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', $ 'RATIO ', F8.2, ' - SUSPECT *******' ) -10002 FORMAT( ' ', A12,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ', +10002 FORMAT( ' ', A13,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ', $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', $ 'RATIO ', F8.2, ' - SUSPECT *******' ) -10001 FORMAT( ' ', A12,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS', +10001 FORMAT( ' ', A13,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS', $ ' (', I6, ' CALL', 'S)' ) -10000 FORMAT( ' ', A12,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS', +10000 FORMAT( ' ', A13,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS', $ ' (', I6, ' CALL', 'S)' ) 9998 FORMAT(' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', $ 'ANGED INCORRECTLY *******' ) - 9996 FORMAT( ' ******* ', A12,' FAILED ON CALL NUMBER:' ) - 9995 FORMAT( 1X, I6, ': ', A12,'(''', A1, ''',''', A1, ''',', + 9996 FORMAT( ' ******* ', A13,' FAILED ON CALL NUMBER:' ) + 9995 FORMAT( 1X, I6, ': ', A13,'(''', A1, ''',''', A1, ''',', $ 3( I3, ',' ), '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, $ ',(', F4.1, ',', F4.1, '), C,', I3, ').' ) 9994 FORMAT(' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', @@ -716,13 +737,16 @@ SUBROUTINE CCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * End of CCHK1. * END -* + +* ===================================================================== SUBROUTINE CPRCN1(NOUT, NC, SNAME, IORDER, TRANSA, TRANSB, M, N, $ K, ALPHA, LDA, LDB, BETA, LDC) + IMPLICIT NONE + INTEGER NOUT, NC, IORDER, M, N, K, LDA, LDB, LDC COMPLEX ALPHA, BETA CHARACTER*1 TRANSA, TRANSB - CHARACTER*12 SNAME + CHARACTER*13 SNAME CHARACTER*14 CRC, CTA,CTB IF (TRANSA.EQ.'N')THEN @@ -747,15 +771,17 @@ SUBROUTINE CPRCN1(NOUT, NC, SNAME, IORDER, TRANSA, TRANSB, M, N, WRITE(NOUT, FMT = 9995)NC,SNAME,CRC, CTA,CTB WRITE(NOUT, FMT = 9994)M, N, K, ALPHA, LDA, LDB, BETA, LDC - 9995 FORMAT( 1X, I6, ': ', A12,'(', A14, ',', A14, ',', A14, ',') + 9995 FORMAT( 1X, I6, ': ', A13,'(', A14, ',', A14, ',', A14, ',') 9994 FORMAT( 10X, 3( I3, ',' ) ,' (', F4.1,',',F4.1,') , A,', $ I3, ', B,', I3, ', (', F4.1,',',F4.1,') , C,', I3, ').' ) END -* + +* ===================================================================== SUBROUTINE CCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX, $ A, AA, AS, B, BB, BS, C, CC, CS, CT, G, $ IORDER ) + IMPLICIT NONE * * Tests CHEMM and CSYMM. * @@ -776,7 +802,7 @@ SUBROUTINE CCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, REAL EPS, THRESH INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA, IORDER LOGICAL FATAL, REWI, TRACE - CHARACTER*12 SNAME + CHARACTER*13 SNAME * .. Array Arguments .. COMPLEX A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ), $ AS( NMAX*NMAX ), B( NMAX, NMAX ), @@ -1020,20 +1046,20 @@ SUBROUTINE CCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, 120 CONTINUE RETURN * -10003 FORMAT( ' ', A12,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ', +10003 FORMAT( ' ', A13,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ', $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', $ 'RATIO ', F8.2, ' - SUSPECT *******' ) -10002 FORMAT( ' ', A12,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ', +10002 FORMAT( ' ', A13,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ', $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', $ 'RATIO ', F8.2, ' - SUSPECT *******' ) -10001 FORMAT( ' ', A12,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS', +10001 FORMAT( ' ', A13,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS', $ ' (', I6, ' CALL', 'S)' ) -10000 FORMAT( ' ', A12,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS', +10000 FORMAT( ' ', A13,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS', $ ' (', I6, ' CALL', 'S)' ) 9998 FORMAT(' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', $ 'ANGED INCORRECTLY *******' ) - 9996 FORMAT( ' ******* ', A12,' FAILED ON CALL NUMBER:' ) - 9995 FORMAT(1X, I6, ': ', A12,'(', 2( '''', A1, ''',' ), 2( I3, ',' ), + 9996 FORMAT( ' ******* ', A13,' FAILED ON CALL NUMBER:' ) + 9995 FORMAT(1X, I6, ': ', A13,'(', 2( '''', A1, ''',' ), 2( I3, ',' ), $ '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ',(', F4.1, $ ',', F4.1, '), C,', I3, ') .' ) 9994 FORMAT(' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', @@ -1042,13 +1068,16 @@ SUBROUTINE CCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * End of CCHK2. * END -* + +* ===================================================================== SUBROUTINE CPRCN2(NOUT, NC, SNAME, IORDER, SIDE, UPLO, M, N, $ ALPHA, LDA, LDB, BETA, LDC) + IMPLICIT NONE + INTEGER NOUT, NC, IORDER, M, N, LDA, LDB, LDC COMPLEX ALPHA, BETA CHARACTER*1 SIDE, UPLO - CHARACTER*12 SNAME + CHARACTER*13 SNAME CHARACTER*14 CRC, CS,CU IF (SIDE.EQ.'L')THEN @@ -1069,14 +1098,16 @@ SUBROUTINE CPRCN2(NOUT, NC, SNAME, IORDER, SIDE, UPLO, M, N, WRITE(NOUT, FMT = 9995)NC,SNAME,CRC, CS,CU WRITE(NOUT, FMT = 9994)M, N, ALPHA, LDA, LDB, BETA, LDC - 9995 FORMAT( 1X, I6, ': ', A12,'(', A14, ',', A14, ',', A14, ',') + 9995 FORMAT( 1X, I6, ': ', A13,'(', A14, ',', A14, ',', A14, ',') 9994 FORMAT( 10X, 2( I3, ',' ),' (',F4.1,',',F4.1, '), A,', I3, $ ', B,', I3, ', (',F4.1,',',F4.1, '), ', 'C,', I3, ').' ) END -* + +* ===================================================================== SUBROUTINE CCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NMAX, A, AA, AS, $ B, BB, BS, CT, G, C, IORDER ) + IMPLICIT NONE * * Tests CTRMM and CTRSM. * @@ -1097,7 +1128,7 @@ SUBROUTINE CCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, REAL EPS, THRESH INTEGER NALF, NIDIM, NMAX, NOUT, NTRA, IORDER LOGICAL FATAL, REWI, TRACE - CHARACTER*12 SNAME + CHARACTER*13 SNAME * .. Array Arguments .. COMPLEX A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ), $ AS( NMAX*NMAX ), B( NMAX, NMAX ), @@ -1372,20 +1403,20 @@ SUBROUTINE CCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, 160 CONTINUE RETURN * -10003 FORMAT( ' ', A12,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ', +10003 FORMAT( ' ', A13,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ', $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', $ 'RATIO ', F8.2, ' - SUSPECT *******' ) -10002 FORMAT( ' ', A12,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ', +10002 FORMAT( ' ', A13,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ', $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', $ 'RATIO ', F8.2, ' - SUSPECT *******' ) -10001 FORMAT( ' ', A12,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS', +10001 FORMAT( ' ', A13,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS', $ ' (', I6, ' CALL', 'S)' ) -10000 FORMAT( ' ', A12,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS', +10000 FORMAT( ' ', A13,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS', $ ' (', I6, ' CALL', 'S)' ) 9998 FORMAT(' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', $ 'ANGED INCORRECTLY *******' ) - 9996 FORMAT(' ******* ', A12,' FAILED ON CALL NUMBER:' ) - 9995 FORMAT(1X, I6, ': ', A12,'(', 4( '''', A1, ''',' ), 2( I3, ',' ), + 9996 FORMAT(' ******* ', A13,' FAILED ON CALL NUMBER:' ) + 9995 FORMAT(1X, I6, ': ', A13,'(', 4( '''', A1, ''',' ), 2( I3, ',' ), $ '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ') ', $ ' .' ) 9994 FORMAT(' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', @@ -1394,13 +1425,16 @@ SUBROUTINE CCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * End of CCHK3. * END -* + +* ===================================================================== SUBROUTINE CPRCN3(NOUT, NC, SNAME, IORDER, SIDE, UPLO, TRANSA, $ DIAG, M, N, ALPHA, LDA, LDB) + IMPLICIT NONE + INTEGER NOUT, NC, IORDER, M, N, LDA, LDB COMPLEX ALPHA CHARACTER*1 SIDE, UPLO, TRANSA, DIAG - CHARACTER*12 SNAME + CHARACTER*13 SNAME CHARACTER*14 CRC, CS, CU, CA, CD IF (SIDE.EQ.'L')THEN @@ -1433,15 +1467,17 @@ SUBROUTINE CPRCN3(NOUT, NC, SNAME, IORDER, SIDE, UPLO, TRANSA, WRITE(NOUT, FMT = 9995)NC,SNAME,CRC, CS,CU WRITE(NOUT, FMT = 9994)CA, CD, M, N, ALPHA, LDA, LDB - 9995 FORMAT( 1X, I6, ': ', A12,'(', A14, ',', A14, ',', A14, ',') + 9995 FORMAT( 1X, I6, ': ', A13,'(', A14, ',', A14, ',', A14, ',') 9994 FORMAT( 10X, 2( A14, ',') , 2( I3, ',' ), ' (', F4.1, ',', $ F4.1, '), A,', I3, ', B,', I3, ').' ) END -* + +* ===================================================================== SUBROUTINE CCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX, $ A, AA, AS, B, BB, BS, C, CC, CS, CT, G, $ IORDER ) + IMPLICIT NONE * * Tests CHERK and CSYRK. * @@ -1462,7 +1498,7 @@ SUBROUTINE CCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, REAL EPS, THRESH INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA, IORDER LOGICAL FATAL, REWI, TRACE - CHARACTER*12 SNAME + CHARACTER*13 SNAME * .. Array Arguments .. COMPLEX A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ), $ AS( NMAX*NMAX ), B( NMAX, NMAX ), @@ -1754,24 +1790,24 @@ SUBROUTINE CCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, 130 CONTINUE RETURN * -10003 FORMAT( ' ', A12,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ', +10003 FORMAT( ' ', A13,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ', $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', $ 'RATIO ', F8.2, ' - SUSPECT *******' ) -10002 FORMAT( ' ', A12,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ', +10002 FORMAT( ' ', A13,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ', $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', $ 'RATIO ', F8.2, ' - SUSPECT *******' ) -10001 FORMAT( ' ', A12,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS', +10001 FORMAT( ' ', A13,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS', $ ' (', I6, ' CALL', 'S)' ) -10000 FORMAT( ' ', A12,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS', +10000 FORMAT( ' ', A13,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS', $ ' (', I6, ' CALL', 'S)' ) 9998 FORMAT(' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', $ 'ANGED INCORRECTLY *******' ) - 9996 FORMAT( ' ******* ', A12,' FAILED ON CALL NUMBER:' ) + 9996 FORMAT( ' ******* ', A13,' FAILED ON CALL NUMBER:' ) 9995 FORMAT( ' THESE ARE THE RESULTS FOR COLUMN ', I3 ) - 9994 FORMAT(1X, I6, ': ', A12,'(', 2( '''', A1, ''',' ), 2( I3, ',' ), + 9994 FORMAT(1X, I6, ': ', A13,'(', 2( '''', A1, ''',' ), 2( I3, ',' ), $ F4.1, ', A,', I3, ',', F4.1, ', C,', I3, ') ', $ ' .' ) - 9993 FORMAT(1X, I6, ': ', A12,'(', 2( '''', A1, ''',' ), 2( I3, ',' ), + 9993 FORMAT(1X, I6, ': ', A13,'(', 2( '''', A1, ''',' ), 2( I3, ',' ), $ '(', F4.1, ',', F4.1, ') , A,', I3, ',(', F4.1, ',', F4.1, $ '), C,', I3, ') .' ) 9992 FORMAT(' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', @@ -1780,13 +1816,16 @@ SUBROUTINE CCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * End of CCHK4. * END -* + +* ===================================================================== SUBROUTINE CPRCN4(NOUT, NC, SNAME, IORDER, UPLO, TRANSA, $ N, K, ALPHA, LDA, BETA, LDC) + IMPLICIT NONE + INTEGER NOUT, NC, IORDER, N, K, LDA, LDC COMPLEX ALPHA, BETA CHARACTER*1 UPLO, TRANSA - CHARACTER*12 SNAME + CHARACTER*13 SNAME CHARACTER*14 CRC, CU, CA IF (UPLO.EQ.'U')THEN @@ -1809,18 +1848,20 @@ SUBROUTINE CPRCN4(NOUT, NC, SNAME, IORDER, UPLO, TRANSA, WRITE(NOUT, FMT = 9995)NC, SNAME, CRC, CU, CA WRITE(NOUT, FMT = 9994)N, K, ALPHA, LDA, BETA, LDC - 9995 FORMAT( 1X, I6, ': ', A12,'(', 3( A14, ',') ) + 9995 FORMAT( 1X, I6, ': ', A13,'(', 3( A14, ',') ) 9994 FORMAT( 10X, 2( I3, ',' ), ' (', F4.1, ',', F4.1 ,'), A,', $ I3, ', (', F4.1,',', F4.1, '), C,', I3, ').' ) END -* -* + +* ===================================================================== SUBROUTINE CPRCN6(NOUT, NC, SNAME, IORDER, UPLO, TRANSA, $ N, K, ALPHA, LDA, BETA, LDC) + IMPLICIT NONE + INTEGER NOUT, NC, IORDER, N, K, LDA, LDC REAL ALPHA, BETA CHARACTER*1 UPLO, TRANSA - CHARACTER*12 SNAME + CHARACTER*13 SNAME CHARACTER*14 CRC, CU, CA IF (UPLO.EQ.'U')THEN @@ -1843,15 +1884,17 @@ SUBROUTINE CPRCN6(NOUT, NC, SNAME, IORDER, UPLO, TRANSA, WRITE(NOUT, FMT = 9995)NC, SNAME, CRC, CU, CA WRITE(NOUT, FMT = 9994)N, K, ALPHA, LDA, BETA, LDC - 9995 FORMAT( 1X, I6, ': ', A12,'(', 3( A14, ',') ) + 9995 FORMAT( 1X, I6, ': ', A13,'(', 3( A14, ',') ) 9994 FORMAT( 10X, 2( I3, ',' ), $ F4.1, ', A,', I3, ',', F4.1, ', C,', I3, ').' ) END -* + +* ===================================================================== SUBROUTINE CCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX, $ AB, AA, AS, BB, BS, C, CC, CS, CT, G, W, $ IORDER ) + IMPLICIT NONE * * Tests CHER2K and CSYR2K. * @@ -1872,7 +1915,7 @@ SUBROUTINE CCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, REAL EPS, THRESH INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA, IORDER LOGICAL FATAL, REWI, TRACE - CHARACTER*12 SNAME + CHARACTER*13 SNAME * .. Array Arguments .. COMPLEX AA( NMAX*NMAX ), AB( 2*NMAX*NMAX ), $ ALF( NALF ), AS( NMAX*NMAX ), BB( NMAX*NMAX ), @@ -2207,24 +2250,24 @@ SUBROUTINE CCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, 160 CONTINUE RETURN * -10003 FORMAT( ' ', A12,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ', +10003 FORMAT( ' ', A13,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ', $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', $ 'RATIO ', F8.2, ' - SUSPECT *******' ) -10002 FORMAT( ' ', A12,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ', +10002 FORMAT( ' ', A13,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ', $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', $ 'RATIO ', F8.2, ' - SUSPECT *******' ) -10001 FORMAT( ' ', A12,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS', +10001 FORMAT( ' ', A13,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS', $ ' (', I6, ' CALL', 'S)' ) -10000 FORMAT( ' ', A12,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS', +10000 FORMAT( ' ', A13,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS', $ ' (', I6, ' CALL', 'S)' ) 9998 FORMAT(' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', $ 'ANGED INCORRECTLY *******' ) - 9996 FORMAT( ' ******* ', A12,' FAILED ON CALL NUMBER:' ) + 9996 FORMAT( ' ******* ', A13,' FAILED ON CALL NUMBER:' ) 9995 FORMAT( ' THESE ARE THE RESULTS FOR COLUMN ', I3 ) - 9994 FORMAT(1X, I6, ': ', A12,'(', 2( '''', A1, ''',' ), 2( I3, ',' ), + 9994 FORMAT(1X, I6, ': ', A13,'(', 2( '''', A1, ''',' ), 2( I3, ',' ), $ '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ',', F4.1, $ ', C,', I3, ') .' ) - 9993 FORMAT(1X, I6, ': ', A12,'(', 2( '''', A1, ''',' ), 2( I3, ',' ), + 9993 FORMAT(1X, I6, ': ', A13,'(', 2( '''', A1, ''',' ), 2( I3, ',' ), $ '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ',(', F4.1, $ ',', F4.1, '), C,', I3, ') .' ) 9992 FORMAT(' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', @@ -2233,13 +2276,16 @@ SUBROUTINE CCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * End of CCHK5. * END -* + +* ===================================================================== SUBROUTINE CPRCN5(NOUT, NC, SNAME, IORDER, UPLO, TRANSA, $ N, K, ALPHA, LDA, LDB, BETA, LDC) + IMPLICIT NONE + INTEGER NOUT, NC, IORDER, N, K, LDA, LDB, LDC COMPLEX ALPHA, BETA CHARACTER*1 UPLO, TRANSA - CHARACTER*12 SNAME + CHARACTER*13 SNAME CHARACTER*14 CRC, CU, CA IF (UPLO.EQ.'U')THEN @@ -2262,19 +2308,21 @@ SUBROUTINE CPRCN5(NOUT, NC, SNAME, IORDER, UPLO, TRANSA, WRITE(NOUT, FMT = 9995)NC, SNAME, CRC, CU, CA WRITE(NOUT, FMT = 9994)N, K, ALPHA, LDA, LDB, BETA, LDC - 9995 FORMAT( 1X, I6, ': ', A12,'(', 3( A14, ',') ) + 9995 FORMAT( 1X, I6, ': ', A13,'(', 3( A14, ',') ) 9994 FORMAT( 10X, 2( I3, ',' ), ' (', F4.1, ',', F4.1, '), A,', $ I3, ', B', I3, ', (', F4.1, ',', F4.1, '), C,', I3, ').' ) END -* -* + +* ===================================================================== SUBROUTINE CPRCN7(NOUT, NC, SNAME, IORDER, UPLO, TRANSA, $ N, K, ALPHA, LDA, LDB, BETA, LDC) + IMPLICIT NONE + INTEGER NOUT, NC, IORDER, N, K, LDA, LDB, LDC COMPLEX ALPHA REAL BETA CHARACTER*1 UPLO, TRANSA - CHARACTER*12 SNAME + CHARACTER*13 SNAME CHARACTER*14 CRC, CU, CA IF (UPLO.EQ.'U')THEN @@ -2297,13 +2345,15 @@ SUBROUTINE CPRCN7(NOUT, NC, SNAME, IORDER, UPLO, TRANSA, WRITE(NOUT, FMT = 9995)NC, SNAME, CRC, CU, CA WRITE(NOUT, FMT = 9994)N, K, ALPHA, LDA, LDB, BETA, LDC - 9995 FORMAT( 1X, I6, ': ', A12,'(', 3( A14, ',') ) + 9995 FORMAT( 1X, I6, ': ', A13,'(', 3( A14, ',') ) 9994 FORMAT( 10X, 2( I3, ',' ), ' (', F4.1, ',', F4.1, '), A,', $ I3, ', B', I3, ',', F4.1, ', C,', I3, ').' ) END -* + +* ===================================================================== SUBROUTINE CMAKE(TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, RESET, $ TRANSL ) + IMPLICIT NONE * * Generates values for an M by N matrix A. * Stores the values in the array AA in the data structure required @@ -2430,9 +2480,12 @@ SUBROUTINE CMAKE(TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, RESET, * End of CMAKE. * END + +* ===================================================================== SUBROUTINE CMMCH(TRANSA, TRANSB, M, N, KK, ALPHA, A, LDA, B, LDB, $ BETA, C, LDC, CT, G, CC, LDCC, EPS, ERR, FATAL, $ NOUT, MV ) + IMPLICIT NONE * * Checks the results of the computational tests. * @@ -2618,7 +2671,10 @@ SUBROUTINE CMMCH(TRANSA, TRANSB, M, N, KK, ALPHA, A, LDA, B, LDB, * End of CMMCH. * END + +* ===================================================================== LOGICAL FUNCTION LCE( RI, RJ, LR ) + IMPLICIT NONE * * Tests if two arrays are identical. * @@ -2650,7 +2706,10 @@ LOGICAL FUNCTION LCE( RI, RJ, LR ) * End of LCE. * END + +* ===================================================================== LOGICAL FUNCTION LCERES( TYPE, UPLO, M, N, AA, AS, LDA ) + IMPLICIT NONE * * Tests if selected elements in two arrays are equal. * @@ -2712,7 +2771,10 @@ LOGICAL FUNCTION LCERES( TYPE, UPLO, M, N, AA, AS, LDA ) * End of LCERES. * END + +* ===================================================================== COMPLEX FUNCTION CBEG( RESET ) + IMPLICIT NONE * * Generates complex numbers as pairs of random numbers uniformly * distributed between -0.5 and 0.5. @@ -2766,7 +2828,10 @@ COMPLEX FUNCTION CBEG( RESET ) * End of CBEG. * END + +* ===================================================================== REAL FUNCTION SDIFF( X, Y ) + IMPLICIT NONE * * Auxiliary routine for test program for Level 3 Blas. * @@ -2785,3 +2850,546 @@ REAL FUNCTION SDIFF( X, Y ) * End of SDIFF. * END + +* ===================================================================== + SUBROUTINE CCHK6( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, + $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX, + $ A, AA, AS, B, BB, BS, C, CC, CS, CT, G, + $ IORDER ) + IMPLICIT NONE +* +* Tests CGEMMTR. +* +* Auxiliary routine for test program for Level 3 Blas. +* +* -- Written on 24-June-2024. +* Martin Koehler, Max Planck Institute Magdeburg +* +* .. Parameters .. + COMPLEX ZERO + PARAMETER ( ZERO = ( 0.0, 0.0 ) ) + REAL RZERO + PARAMETER ( RZERO = 0.0 ) +* .. Scalar Arguments .. + REAL EPS, THRESH + INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA, IORDER + LOGICAL FATAL, REWI, TRACE + CHARACTER*13 SNAME +* .. Array Arguments .. + COMPLEX A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ), + $ AS( NMAX*NMAX ), B( NMAX, NMAX ), + $ BB( NMAX*NMAX ), BET( NBET ), BS( NMAX*NMAX ), + $ C( NMAX, NMAX ), CC( NMAX*NMAX ), + $ CS( NMAX*NMAX ), CT( NMAX ) + REAL G( NMAX ) + INTEGER IDIM( NIDIM ) +* .. Local Scalars .. + COMPLEX ALPHA, ALS, BETA, BLS + REAL ERR, ERRMAX + INTEGER I, IA, IB, ICA, ICB, IK, IM, IN, K, KS, LAA, + $ LBB, LCC, LDA, LDAS, LDB, LDBS, LDC, LDCS, + $ MA, MB, N, NA, NARGS, NB, NC, NS, IS + LOGICAL NULL, RESET, SAME, TRANA, TRANB + CHARACTER*1 TRANAS, TRANBS, TRANSA, TRANSB, UPLO, UPLOS + CHARACTER*3 ICH + CHARACTER*2 ISHAPE +* .. Local Arrays .. + LOGICAL ISAME( 13 ) +* .. External Functions .. + LOGICAL LCE, LCERES + EXTERNAL LCE, LCERES +* .. External Subroutines .. + EXTERNAL CCGEMMTR, CMAKE, CMMTCH, CPRCN8 +* .. Intrinsic Functions .. + INTRINSIC MAX +* .. Scalars in Common .. + INTEGER INFOT, NOUTC + LOGICAL LERR, OK +* .. Common blocks .. + COMMON /INFOC/INFOT, NOUTC, OK, LERR +* .. Data statements .. + DATA ICH/'NTC'/ + DATA ISHAPE/'UL'/ +* .. Executable Statements .. +* + NARGS = 13 + NC = 0 + RESET = .TRUE. + ERRMAX = RZERO +* + DO 100 IN = 1, NIDIM + N = IDIM( IN ) +* Set LDC to 1 more than minimum value if room. + LDC = N + IF( LDC.LT.NMAX ) + $ LDC = LDC + 1 +* Skip tests if not enough room. + IF( LDC.GT.NMAX ) + $ GO TO 100 + LCC = LDC*N + NULL = N.LE.0. +* + DO 90 IK = 1, NIDIM + K = IDIM( IK ) +* + DO 80 ICA = 1, 3 + TRANSA = ICH( ICA: ICA ) + TRANA = TRANSA.EQ.'T'.OR.TRANSA.EQ.'C' +* + IF( TRANA )THEN + MA = K + NA = N + ELSE + MA = N + NA = K + END IF +* Set LDA to 1 more than minimum value if room. + LDA = MA + IF( LDA.LT.NMAX ) + $ LDA = LDA + 1 +* Skip tests if not enough room. + IF( LDA.GT.NMAX ) + $ GO TO 80 + LAA = LDA*NA +* +* Generate the matrix A. +* + CALL CMAKE( 'ge', ' ', ' ', MA, NA, A, NMAX, AA, LDA, + $ RESET, ZERO ) +* + DO 70 ICB = 1, 3 + TRANSB = ICH( ICB: ICB ) + TRANB = TRANSB.EQ.'T'.OR.TRANSB.EQ.'C' +* + IF( TRANB )THEN + MB = N + NB = K + ELSE + MB = K + NB = N + END IF +* Set LDB to 1 more than minimum value if room. + LDB = MB + IF( LDB.LT.NMAX ) + $ LDB = LDB + 1 +* Skip tests if not enough room. + IF( LDB.GT.NMAX ) + $ GO TO 70 + LBB = LDB*NB +* +* Generate the matrix B. +* + CALL CMAKE( 'ge', ' ', ' ', MB, NB, B, NMAX, BB, + $ LDB, RESET, ZERO ) +* + DO 60 IA = 1, NALF + ALPHA = ALF( IA ) +* + DO 50 IB = 1, NBET + BETA = BET( IB ) + DO 45 IS = 1, 2 + UPLO = ISHAPE(IS:IS) +* +* Generate the matrix C. +* + CALL CMAKE( 'ge', UPLO, ' ', N, N, C, NMAX, + $ CC, LDC, RESET, ZERO ) +* + NC = NC + 1 +* +* Save every datum before calling the +* subroutine. +* + UPLOS = UPLO + TRANAS = TRANSA + TRANBS = TRANSB + NS = N + KS = K + ALS = ALPHA + DO 10 I = 1, LAA + AS( I ) = AA( I ) + 10 CONTINUE + LDAS = LDA + DO 20 I = 1, LBB + BS( I ) = BB( I ) + 20 CONTINUE + LDBS = LDB + BLS = BETA + DO 30 I = 1, LCC + CS( I ) = CC( I ) + 30 CONTINUE + LDCS = LDC +* +* Call the subroutine. +* + IF( TRACE ) + $ CALL CPRCN8(NTRA, NC, SNAME, IORDER, UPLO, + $ TRANSA, TRANSB, N, K, ALPHA, LDA, + $ LDB, BETA, LDC) + IF( REWI ) + $ REWIND NTRA + CALL CCGEMMTR(IORDER, UPLO, TRANSA, TRANSB, + $ N, K, ALPHA, AA, LDA, BB, LDB, + $ BETA, CC, LDC ) +* +* Check if error-exit was taken incorrectly. +* + IF( .NOT.OK )THEN + WRITE( NOUT, FMT = 9994 ) + FATAL = .TRUE. + GO TO 120 + END IF +* +* See what data changed inside subroutines. +* + ISAME( 1 ) = UPLO .EQ. UPLOS + ISAME( 2 ) = TRANSA.EQ.TRANAS + ISAME( 3 ) = TRANSB.EQ.TRANBS + ISAME( 4 ) = NS.EQ.N + ISAME( 5 ) = KS.EQ.K + ISAME( 6 ) = ALS.EQ.ALPHA + ISAME( 7 ) = LCE( AS, AA, LAA ) + ISAME( 8 ) = LDAS.EQ.LDA + ISAME( 9 ) = LCE( BS, BB, LBB ) + ISAME( 10 ) = LDBS.EQ.LDB + ISAME( 11 ) = BLS.EQ.BETA + IF( NULL )THEN + ISAME( 12 ) = LCE( CS, CC, LCC ) + ELSE + ISAME( 12 ) = LCERES( 'ge', ' ', N, N, CS, + $ CC, LDC ) + END IF + ISAME( 13 ) = LDCS.EQ.LDC +* +* If data was incorrectly changed, report +* and return. +* + SAME = .TRUE. + DO 40 I = 1, NARGS + SAME = SAME.AND.ISAME( I ) + IF( .NOT.ISAME( I ) ) + $ WRITE( NOUT, FMT = 9998 )I + 40 CONTINUE + IF( .NOT.SAME )THEN + FATAL = .TRUE. + GO TO 120 + END IF +* + IF( .NOT.NULL )THEN +* +* Check the result. +* + CALL CMMTCH( UPLO, TRANSA, TRANSB, N, K, + $ ALPHA, A, NMAX, B, NMAX, BETA, + $ C, NMAX, CT, G, CC, LDC, EPS, + $ ERR, FATAL, NOUT, .TRUE. ) + ERRMAX = MAX( ERRMAX, ERR ) +* If got really bad answer, report and +* return. + IF( FATAL ) + $ GO TO 120 + END IF +* + 45 CONTINUE +* + 50 CONTINUE +* + 60 CONTINUE +* + 70 CONTINUE +* + 80 CONTINUE +* + 90 CONTINUE +* + 100 CONTINUE +* +* +* Report result. +* + IF( ERRMAX.LT.THRESH )THEN + IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10000 )SNAME, NC + IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10001 )SNAME, NC + ELSE + IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10002 )SNAME, NC, ERRMAX + IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10003 )SNAME, NC, ERRMAX + END IF + GO TO 130 +* + 120 CONTINUE + WRITE( NOUT, FMT = 9996 )SNAME + CALL CPRCN8(NOUT, NC, SNAME, IORDER, UPLO, TRANSA, TRANSB, + $ N, K, ALPHA, LDA, LDB, BETA, LDC) +* + 130 CONTINUE + RETURN +* +10003 FORMAT( ' ', A13,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ', + $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', + $ 'RATIO ', F8.2, ' - SUSPECT *******' ) +10002 FORMAT( ' ', A13,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ', + $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', + $ 'RATIO ', F8.2, ' - SUSPECT *******' ) +10001 FORMAT( ' ', A13,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS', + $ ' (', I6, ' CALL', 'S)' ) +10000 FORMAT( ' ', A13,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS', + $ ' (', I6, ' CALL', 'S)' ) + 9998 FORMAT(' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', + $ 'ANGED INCORRECTLY *******' ) + 9996 FORMAT( ' ******* ', A13,' FAILED ON CALL NUMBER:' ) + 9995 FORMAT( 1X, I6, ': ', A13,'(''', A1, ''',''', A1, ''',', + $ 3( I3, ',' ), '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, + $ ',(', F4.1, ',', F4.1, '), C,', I3, ').' ) + 9994 FORMAT(' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', + $ '******' ) +* +* End of CCHK6. +* + END + +* ===================================================================== + SUBROUTINE CPRCN8(NOUT, NC, SNAME, IORDER, UPLO, + $ TRANSA, TRANSB, N, + $ K, ALPHA, LDA, LDB, BETA, LDC) + IMPLICIT NONE + + INTEGER NOUT, NC, IORDER, N, K, LDA, LDB, LDC + COMPLEX ALPHA, BETA + CHARACTER*1 TRANSA, TRANSB, UPLO + CHARACTER*13 SNAME + CHARACTER*14 CRC, CTA,CTB,CUPLO + + IF (UPLO.EQ.'U') THEN + CUPLO = 'CblasUpper' + ELSE + CUPLO = 'CblasLower' + END IF + IF (TRANSA.EQ.'N')THEN + CTA = ' CblasNoTrans' + ELSE IF (TRANSA.EQ.'T')THEN + CTA = ' CblasTrans' + ELSE + CTA = 'CblasConjTrans' + END IF + IF (TRANSB.EQ.'N')THEN + CTB = ' CblasNoTrans' + ELSE IF (TRANSB.EQ.'T')THEN + CTB = ' CblasTrans' + ELSE + CTB = 'CblasConjTrans' + END IF + IF (IORDER.EQ.1)THEN + CRC = ' CblasRowMajor' + ELSE + CRC = ' CblasColMajor' + END IF + WRITE(NOUT, FMT = 9995)NC,SNAME,CRC, CUPLO, CTA,CTB + WRITE(NOUT, FMT = 9994)N, K, ALPHA, LDA, LDB, BETA, LDC + + 9995 FORMAT( 1X, I6, ': ', A13,'(', A14, ',', A14, ',', A14, ',', + $ A14, ',') + 9994 FORMAT( 10X, 2( I3, ',' ) ,' (', F4.1,',',F4.1,') , A,', + $ I3, ', B,', I3, ', (', F4.1,',',F4.1,') , C,', I3, ').' ) + END + +* ===================================================================== + SUBROUTINE CMMTCH(UPLO, TRANSA, TRANSB, N, KK, ALPHA, A, LDA, + $ B, LDB, + $ BETA, C, LDC, CT, G, CC, LDCC, EPS, ERR, FATAL, + $ NOUT, MV ) + IMPLICIT NONE +* +* Checks the results of the computational tests for GEMMTR. +* +* Auxiliary routine for test program for Level 3 Blas. +* +* -- Written on 24-June-2024. +* Martin Koehler, Max Planck Institute, Magdeburg +* +* .. Parameters .. + COMPLEX ZERO + PARAMETER ( ZERO = ( 0.0, 0.0 ) ) + REAL RZERO, RONE + PARAMETER ( RZERO = 0.0, RONE = 1.0 ) +* .. Scalar Arguments .. + COMPLEX ALPHA, BETA + REAL EPS, ERR + INTEGER KK, LDA, LDB, LDC, LDCC, N, NOUT + LOGICAL FATAL, MV + CHARACTER*1 TRANSA, TRANSB, UPLO +* .. Array Arguments .. + COMPLEX A( LDA, * ), B( LDB, * ), C( LDC, * ), + $ CC( LDCC, * ), CT( * ) + REAL G( * ) +* .. Local Scalars .. + COMPLEX CL + REAL ERRI + INTEGER I, J, K, ISTART, ISTOP + LOGICAL CTRANA, CTRANB, TRANA, TRANB, UPPER +* .. Intrinsic Functions .. + INTRINSIC ABS, AIMAG, CONJG, MAX, REAL, SQRT +* .. Statement Functions .. + REAL ABS1 +* .. Statement Function definitions .. + ABS1( CL ) = ABS( REAL( CL ) ) + ABS( AIMAG( CL ) ) +* .. Executable Statements .. + + UPPER = UPLO.EQ.'U' + TRANA = TRANSA.EQ.'T'.OR.TRANSA.EQ.'C' + TRANB = TRANSB.EQ.'T'.OR.TRANSB.EQ.'C' + CTRANA = TRANSA.EQ.'C' + CTRANB = TRANSB.EQ.'C' + + ISTART = 1 + ISTOP = N +* +* Compute expected result, one column at a time, in CT using data +* in A, B and C. +* Compute gauges in G. +* + DO 220 J = 1, N +* + IF (UPPER) THEN + ISTART = 1 + ISTOP = J + ELSE + ISTART = J + ISTOP = N + END IF + DO 10 I = ISTART, ISTOP + CT( I ) = ZERO + G( I ) = RZERO + 10 CONTINUE + IF( .NOT.TRANA.AND..NOT.TRANB )THEN + DO 30 K = 1, KK + DO 20 I = ISTART, ISTOP + CT( I ) = CT( I ) + A( I, K )*B( K, J ) + G( I ) = G( I ) + ABS1( A( I, K ) )*ABS1( B( K, J ) ) + 20 CONTINUE + 30 CONTINUE + ELSE IF( TRANA.AND..NOT.TRANB )THEN + IF( CTRANA )THEN + DO 50 K = 1, KK + DO 40 I = ISTART, ISTOP + CT( I ) = CT( I ) + CONJG( A( K, I ) )*B( K, J ) + G( I ) = G( I ) + ABS1( A( K, I ) )* + $ ABS1( B( K, J ) ) + 40 CONTINUE + 50 CONTINUE + ELSE + DO 70 K = 1, KK + DO 60 I = ISTART, ISTOP + CT( I ) = CT( I ) + A( K, I )*B( K, J ) + G( I ) = G( I ) + ABS1( A( K, I ) )* + $ ABS1( B( K, J ) ) + 60 CONTINUE + 70 CONTINUE + END IF + ELSE IF( .NOT.TRANA.AND.TRANB )THEN + IF( CTRANB )THEN + DO 90 K = 1, KK + DO 80 I = ISTART, ISTOP + CT( I ) = CT( I ) + A( I, K )*CONJG( B( J, K ) ) + G( I ) = G( I ) + ABS1( A( I, K ) )* + $ ABS1( B( J, K ) ) + 80 CONTINUE + 90 CONTINUE + ELSE + DO 110 K = 1, KK + DO 100 I = ISTART, ISTOP + CT( I ) = CT( I ) + A( I, K )*B( J, K ) + G( I ) = G( I ) + ABS1( A( I, K ) )* + $ ABS1( B( J, K ) ) + 100 CONTINUE + 110 CONTINUE + END IF + ELSE IF( TRANA.AND.TRANB )THEN + IF( CTRANA )THEN + IF( CTRANB )THEN + DO 130 K = 1, KK + DO 120 I = ISTART, ISTOP + CT( I ) = CT( I ) + CONJG( A( K, I ) )* + $ CONJG( B( J, K ) ) + G( I ) = G( I ) + ABS1( A( K, I ) )* + $ ABS1( B( J, K ) ) + 120 CONTINUE + 130 CONTINUE + ELSE + DO 150 K = 1, KK + DO 140 I = ISTART, ISTOP + CT( I ) = CT( I ) + CONJG( A( K, I ) )*B( J, K ) + G( I ) = G( I ) + ABS1( A( K, I ) )* + $ ABS1( B( J, K ) ) + 140 CONTINUE + 150 CONTINUE + END IF + ELSE + IF( CTRANB )THEN + DO 170 K = 1, KK + DO 160 I = ISTART, ISTOP + CT( I ) = CT( I ) + A( K, I )*CONJG( B( J, K ) ) + G( I ) = G( I ) + ABS1( A( K, I ) )* + $ ABS1( B( J, K ) ) + 160 CONTINUE + 170 CONTINUE + ELSE + DO 190 K = 1, KK + DO 180 I = ISTART, ISTOP + CT( I ) = CT( I ) + A( K, I )*B( J, K ) + G( I ) = G( I ) + ABS1( A( K, I ) )* + $ ABS1( B( J, K ) ) + 180 CONTINUE + 190 CONTINUE + END IF + END IF + END IF + DO 200 I = ISTART, ISTOP + CT( I ) = ALPHA*CT( I ) + BETA*C( I, J ) + G( I ) = ABS1( ALPHA )*G( I ) + + $ ABS1( BETA )*ABS1( C( I, J ) ) + 200 CONTINUE +* +* Compute the error ratio for this result. +* + ERR = ZERO + DO 210 I = ISTART, ISTOP + ERRI = ABS1( CT( I ) - CC( I, J ) )/EPS + IF( G( I ).NE.RZERO ) + $ ERRI = ERRI/G( I ) + ERR = MAX( ERR, ERRI ) + IF( ERR*SQRT( EPS ).GE.RONE ) + $ GO TO 230 + 210 CONTINUE +* + 220 CONTINUE +* +* If the loop completes, all results are at least half accurate. + GO TO 250 +* +* Report fatal error. +* + 230 FATAL = .TRUE. + WRITE( NOUT, FMT = 9999 ) + DO 240 I = ISTART, ISTOP + IF( MV )THEN + WRITE( NOUT, FMT = 9998 )I, CT( I ), CC( I, J ) + ELSE + WRITE( NOUT, FMT = 9998 )I, CC( I, J ), CT( I ) + END IF + 240 CONTINUE + IF( N.GT.1 ) + $ WRITE( NOUT, FMT = 9997 )J +* + 250 CONTINUE + RETURN +* + 9999 FORMAT(' ******* FATAL ERROR - COMPUTED RESULT IS LESS THAN HAL', + $ 'F ACCURATE *******', /' EXPECTED RE', + $ 'SULT COMPUTED RESULT' ) + 9998 FORMAT( 1X, I7, 2( ' (', G15.6, ',', G15.6, ')' ) ) + 9997 FORMAT( ' THESE ARE THE RESULTS FOR COLUMN ', I3 ) +* +* End of CMMTCH. +* + END + diff --git a/CBLAS/testing/c_d2chke.c b/CBLAS/testing/c_d2chke.c index 73e8aceec5..9e9d981107 100644 --- a/CBLAS/testing/c_d2chke.c +++ b/CBLAS/testing/c_d2chke.c @@ -3,34 +3,42 @@ #include "cblas.h" #include "cblas_test.h" -int cblas_ok, cblas_lerr, cblas_info; -int link_xerbla=TRUE; +CBLAS_INT cblas_ok, cblas_lerr, cblas_info; +CBLAS_INT link_xerbla=TRUE; char *cblas_rout; #ifdef F77_Char -void F77_xerbla(F77_Char F77_srname, void *vinfo); +void F77_xerbla(F77_Char F77_srname, void *vinfo #else -void F77_xerbla(char *srname, void *vinfo); +void F77_xerbla(char *srname, void *vinfo #endif +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN srname_len +#endif +); void chkxer(void) { - extern int cblas_ok, cblas_lerr, cblas_info; - extern int link_xerbla; + extern CBLAS_INT cblas_ok, cblas_lerr, cblas_info; + extern CBLAS_INT link_xerbla; extern char *cblas_rout; if (cblas_lerr == 1 ) { - printf("***** ILLEGAL VALUE OF PARAMETER NUMBER %d NOT DETECTED BY %s *****\n", cblas_info, cblas_rout); + printf("***** ILLEGAL VALUE OF PARAMETER NUMBER %d NOT DETECTED BY %s *****\n", (int) cblas_info, cblas_rout); cblas_ok = 0 ; } cblas_lerr = 1 ; } -void F77_d2chke(char *rout) { +void F77_d2chke(char *rout +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN rout_len +#endif +) { char *sf = ( rout ) ; double A[2] = {0.0,0.0}, X[2] = {0.0,0.0}, Y[2] = {0.0,0.0}, ALPHA=0.0, BETA=0.0; - extern int cblas_info, cblas_lerr, cblas_ok; + extern CBLAS_INT cblas_info, cblas_lerr, cblas_ok; extern int RowMajorStrg; extern char *cblas_rout; @@ -38,10 +46,11 @@ void F77_d2chke(char *rout) { if (link_xerbla) /* call these first to link */ { cblas_xerbla(cblas_info,cblas_rout,""); - F77_xerbla(cblas_rout,&cblas_info); + F77_xerbla(cblas_rout,&cblas_info, 1); } #endif + link_xerbla = 0; cblas_ok = TRUE ; cblas_lerr = PASSED ; diff --git a/CBLAS/testing/c_d3chke.c b/CBLAS/testing/c_d3chke.c index 9a1ba3cc59..fa611f0f20 100644 --- a/CBLAS/testing/c_d3chke.c +++ b/CBLAS/testing/c_d3chke.c @@ -3,34 +3,42 @@ #include "cblas.h" #include "cblas_test.h" -int cblas_ok, cblas_lerr, cblas_info; -int link_xerbla=TRUE; +CBLAS_INT cblas_ok, cblas_lerr, cblas_info; +CBLAS_INT link_xerbla=TRUE; char *cblas_rout; #ifdef F77_Char -void F77_xerbla(F77_Char F77_srname, void *vinfo); +void F77_xerbla(F77_Char F77_srname, void *vinfo #else -void F77_xerbla(char *srname, void *vinfo); +void F77_xerbla(char *srname, void *vinfo #endif +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN srname_len +#endif +); void chkxer(void) { - extern int cblas_ok, cblas_lerr, cblas_info; - extern int link_xerbla; + extern CBLAS_INT cblas_ok, cblas_lerr, cblas_info; + extern CBLAS_INT link_xerbla; extern char *cblas_rout; if (cblas_lerr == 1 ) { - printf("***** ILLEGAL VALUE OF PARAMETER NUMBER %d NOT DETECTED BY %s *****\n", cblas_info, cblas_rout); + printf("***** ILLEGAL VALUE OF PARAMETER NUMBER %d NOT DETECTED BY %s *****\n", (int) cblas_info, cblas_rout); cblas_ok = 0 ; } cblas_lerr = 1 ; } -void F77_d3chke(char *rout) { +void F77_d3chke(char *rout +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN rout_len +#endif +) { char *sf = ( rout ) ; double A[2] = {0.0,0.0}, B[2] = {0.0,0.0}, C[2] = {0.0,0.0}, ALPHA=0.0, BETA=0.0; - extern int cblas_info, cblas_lerr, cblas_ok; + extern CBLAS_INT cblas_info, cblas_lerr, cblas_ok; extern int RowMajorStrg; extern char *cblas_rout; @@ -38,14 +46,245 @@ void F77_d3chke(char *rout) { if (link_xerbla) /* call these first to link */ { cblas_xerbla(cblas_info,cblas_rout,""); - F77_xerbla(cblas_rout,&cblas_info); + F77_xerbla(cblas_rout,&cblas_info, 1); } #endif + link_xerbla = 0; cblas_ok = TRUE ; cblas_lerr = PASSED ; - if (strncmp( sf,"cblas_dgemm" ,11)==0) { + if (strncmp( sf,"cblas_dgemmtr" ,13)==0) { + cblas_rout = "cblas_dgemmtr" ; + + cblas_info = 1; + cblas_dgemmtr( INVALID, CblasUpper, CblasNoTrans, CblasNoTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 1; + cblas_dgemmtr( INVALID, CblasUpper, CblasNoTrans, CblasTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 1; + cblas_dgemmtr( INVALID, CblasUpper,CblasTrans, CblasNoTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 1; + cblas_dgemmtr( INVALID, CblasUpper, CblasTrans, CblasTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + cblas_info = 1; + cblas_dgemmtr( INVALID, CblasLower, CblasNoTrans, CblasNoTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 1; + cblas_dgemmtr( INVALID, CblasLower, CblasNoTrans, CblasTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 1; + cblas_dgemmtr( INVALID, CblasLower,CblasTrans, CblasNoTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 1; + cblas_dgemmtr( INVALID, CblasLower, CblasTrans, CblasTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + cblas_info = 2; RowMajorStrg = FALSE; + cblas_dgemmtr( CblasColMajor, INVALID, CblasNoTrans, CblasNoTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 2; RowMajorStrg = FALSE; + cblas_dgemmtr( CblasColMajor, INVALID, CblasNoTrans, CblasTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + cblas_info = 3; RowMajorStrg = FALSE; + cblas_dgemmtr( CblasColMajor, CblasUpper, INVALID, CblasNoTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 3; RowMajorStrg = FALSE; + cblas_dgemmtr( CblasColMajor, CblasUpper, INVALID, CblasTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + cblas_info = 4; RowMajorStrg = FALSE; + cblas_dgemmtr( CblasColMajor, CblasUpper, CblasNoTrans, INVALID, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 4; RowMajorStrg = FALSE; + cblas_dgemmtr( CblasColMajor, CblasUpper, CblasTrans, INVALID, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + + cblas_info = 5; RowMajorStrg = FALSE; + cblas_dgemmtr( CblasColMajor, CblasUpper, CblasNoTrans, CblasNoTrans, INVALID, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 5; RowMajorStrg = FALSE; + cblas_dgemmtr( CblasColMajor, CblasUpper, CblasNoTrans, CblasTrans, INVALID, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 5; RowMajorStrg = FALSE; + cblas_dgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasNoTrans, INVALID, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 5; RowMajorStrg = FALSE; + cblas_dgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasTrans, INVALID, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + cblas_info = 6; RowMajorStrg = FALSE; + cblas_dgemmtr( CblasColMajor, CblasUpper, CblasNoTrans, CblasNoTrans, 0, INVALID, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 6; RowMajorStrg = FALSE; + cblas_dgemmtr( CblasColMajor, CblasUpper, CblasNoTrans, CblasTrans, 0, INVALID, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 6; RowMajorStrg = FALSE; + cblas_dgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasNoTrans, 0, INVALID, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 6; RowMajorStrg = FALSE; + cblas_dgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasTrans, 0, INVALID, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + + cblas_info = 9; RowMajorStrg = FALSE; + cblas_dgemmtr( CblasColMajor, CblasUpper, CblasNoTrans, CblasNoTrans, 2, 0, + ALPHA, A, 1, B, 1, BETA, C, 2 ); + chkxer(); + cblas_info = 9; RowMajorStrg = FALSE; + cblas_dgemmtr( CblasColMajor, CblasUpper, CblasNoTrans, CblasTrans, 2, 0, + ALPHA, A, 1, B, 1, BETA, C, 2 ); + chkxer(); + cblas_info = 9; RowMajorStrg = FALSE; + cblas_dgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasNoTrans, 0, 2, + ALPHA, A, 1, B, 2, BETA, C, 1 ); + chkxer(); + cblas_info = 9; RowMajorStrg = FALSE; + cblas_dgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasTrans, 0, 2, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + cblas_info = 11; RowMajorStrg = FALSE; + cblas_dgemmtr( CblasColMajor, CblasUpper, CblasNoTrans, CblasNoTrans, 0, 2, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 11; RowMajorStrg = FALSE; + cblas_dgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasNoTrans, 0, 2, + ALPHA, A, 2, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 11; RowMajorStrg = FALSE; + cblas_dgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasTrans, 2, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + cblas_info = 14; RowMajorStrg = FALSE; + cblas_dgemmtr( CblasColMajor, CblasUpper, CblasNoTrans, CblasNoTrans, 2, 0, + ALPHA, A, 2, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 14; RowMajorStrg = FALSE; + cblas_dgemmtr( CblasColMajor, CblasUpper, CblasNoTrans, CblasTrans, 2, 0, + ALPHA, A, 2, B, 2, BETA, C, 1 ); + chkxer(); + + cblas_info = 14; RowMajorStrg = FALSE; + cblas_dgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasNoTrans, 2, 0, + ALPHA, A, 2, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 14; RowMajorStrg = FALSE; + cblas_dgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasTrans, 2, 0, + ALPHA, A, 2, B, 2, BETA, C, 1 ); + chkxer(); + + /* Row Major */ + cblas_info = 5; RowMajorStrg = TRUE; + cblas_dgemmtr( CblasRowMajor, CblasUpper, CblasNoTrans, CblasNoTrans, INVALID, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 5; RowMajorStrg = TRUE; + cblas_dgemmtr( CblasRowMajor, CblasUpper, CblasNoTrans, CblasTrans, INVALID, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 5; RowMajorStrg = TRUE; + cblas_dgemmtr( CblasRowMajor, CblasUpper, CblasTrans, CblasNoTrans, INVALID, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 5; RowMajorStrg = TRUE; + cblas_dgemmtr( CblasRowMajor, CblasUpper, CblasTrans, CblasTrans, INVALID, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + cblas_info = 6; RowMajorStrg = TRUE; + cblas_dgemmtr( CblasRowMajor, CblasUpper, CblasNoTrans, CblasNoTrans, 0, INVALID, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 6; RowMajorStrg = TRUE; + cblas_dgemmtr( CblasRowMajor, CblasUpper, CblasNoTrans, CblasTrans, 0, INVALID, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 6; RowMajorStrg = TRUE; + cblas_dgemmtr( CblasRowMajor, CblasUpper, CblasTrans, CblasNoTrans, 0, INVALID, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 6; RowMajorStrg = TRUE; + cblas_dgemmtr( CblasRowMajor, CblasUpper, CblasTrans, CblasTrans, 0, INVALID, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + cblas_info = 9; RowMajorStrg = TRUE; + cblas_dgemmtr( CblasRowMajor, CblasUpper, CblasNoTrans, CblasNoTrans, 0, 2, + ALPHA, A, 1, B, 1, BETA, C, 2 ); + chkxer(); + cblas_info = 9; RowMajorStrg = TRUE; + cblas_dgemmtr( CblasRowMajor, CblasUpper, CblasNoTrans, CblasTrans, 0, 2, + ALPHA, A, 1, B, 2, BETA, C, 2 ); + chkxer(); + cblas_info = 9; RowMajorStrg = TRUE; + cblas_dgemmtr( CblasRowMajor, CblasUpper, CblasTrans, CblasNoTrans, 2, 0, + ALPHA, A, 1, B, 2, BETA, C, 1 ); + chkxer(); + cblas_info = 9; RowMajorStrg = TRUE; + cblas_dgemmtr( CblasRowMajor, CblasUpper, CblasTrans, CblasTrans, 2, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + cblas_info = 11; RowMajorStrg = TRUE; + cblas_dgemmtr( CblasColMajor, CblasUpper, CblasNoTrans, CblasNoTrans, 0, 2, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 11; RowMajorStrg = TRUE; + cblas_dgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasNoTrans, 0, 2, + ALPHA, A, 2, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 11; RowMajorStrg = TRUE; + cblas_dgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasTrans, 2, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + cblas_info = 14; RowMajorStrg = TRUE; + cblas_dgemmtr( CblasRowMajor, CblasUpper, CblasNoTrans, CblasNoTrans, 2, 0, + ALPHA, A, 2, B, 2, BETA, C, 1 ); + chkxer(); + cblas_info = 14; RowMajorStrg = TRUE; + cblas_dgemmtr( CblasRowMajor, CblasUpper, CblasNoTrans, CblasTrans, 2, 0, + ALPHA, A, 2, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 14; RowMajorStrg = TRUE; + cblas_dgemmtr( CblasRowMajor, CblasUpper, CblasTrans, CblasNoTrans, 2, 0, + ALPHA, A, 2, B, 2, BETA, C, 1 ); + chkxer(); + cblas_info = 14; RowMajorStrg = TRUE; + cblas_dgemmtr( CblasRowMajor, CblasUpper, CblasTrans, CblasTrans, 2, 0, + ALPHA, A, 2, B, 2, BETA, C, 1 ); + chkxer(); + + } else if (strncmp( sf,"cblas_dgemm" ,11)==0) { cblas_rout = "cblas_dgemm" ; cblas_info = 1; @@ -1267,7 +1506,7 @@ void F77_d3chke(char *rout) { chkxer(); } if (cblas_ok == TRUE ) - printf(" %-12s PASSED THE TESTS OF ERROR-EXITS\n", cblas_rout); + printf(" %-13s PASSED THE TESTS OF ERROR-EXITS\n", cblas_rout); else printf("***** %s FAILED THE TESTS OF ERROR-EXITS *******\n",cblas_rout); } diff --git a/CBLAS/testing/c_dblas1.c b/CBLAS/testing/c_dblas1.c index deb7851257..ee120af594 100644 --- a/CBLAS/testing/c_dblas1.c +++ b/CBLAS/testing/c_dblas1.c @@ -8,32 +8,40 @@ */ #include "cblas_test.h" #include "cblas.h" -double F77_dasum(const int *N, double *X, const int *incX) +double F77_dasum(const CBLAS_INT *N, double *X, const CBLAS_INT *incX) { return cblas_dasum(*N, X, *incX); } -void F77_daxpy(const int *N, const double *alpha, const double *X, - const int *incX, double *Y, const int *incY) +void F77_daxpy(const CBLAS_INT *N, const double *alpha, const double *X, + const CBLAS_INT *incX, double *Y, const CBLAS_INT *incY) { cblas_daxpy(*N, *alpha, X, *incX, Y, *incY); return; } -void F77_dcopy(const int *N, double *X, const int *incX, - double *Y, const int *incY) +void F77_daxpby(const CBLAS_INT *N, const double *alpha, const double *X, + const CBLAS_INT *incX, const double *beta, double *Y, const CBLAS_INT *incY) +{ + cblas_daxpby(*N, *alpha, X, *incX, *beta, Y, *incY); + return; +} + + +void F77_dcopy(const CBLAS_INT *N, double *X, const CBLAS_INT *incX, + double *Y, const CBLAS_INT *incY) { cblas_dcopy(*N, X, *incX, Y, *incY); return; } -double F77_ddot(const int *N, const double *X, const int *incX, - const double *Y, const int *incY) +double F77_ddot(const CBLAS_INT *N, const double *X, const CBLAS_INT *incX, + const double *Y, const CBLAS_INT *incY) { return cblas_ddot(*N, X, *incX, Y, *incY); } -double F77_dnrm2(const int *N, const double *X, const int *incX) +double F77_dnrm2(const CBLAS_INT *N, const double *X, const CBLAS_INT *incX) { return cblas_dnrm2(*N, X, *incX); } @@ -44,39 +52,39 @@ void F77_drotg( double *a, double *b, double *c, double *s) return; } -void F77_drot( const int *N, double *X, const int *incX, double *Y, - const int *incY, const double *c, const double *s) +void F77_drot( const CBLAS_INT *N, double *X, const CBLAS_INT *incX, double *Y, + const CBLAS_INT *incY, const double *c, const double *s) { cblas_drot(*N,X,*incX,Y,*incY,*c,*s); return; } -void F77_dscal(const int *N, const double *alpha, double *X, - const int *incX) +void F77_dscal(const CBLAS_INT *N, const double *alpha, double *X, + const CBLAS_INT *incX) { cblas_dscal(*N, *alpha, X, *incX); return; } -void F77_dswap( const int *N, double *X, const int *incX, - double *Y, const int *incY) +void F77_dswap( const CBLAS_INT *N, double *X, const CBLAS_INT *incX, + double *Y, const CBLAS_INT *incY) { cblas_dswap(*N,X,*incX,Y,*incY); return; } -double F77_dzasum(const int *N, void *X, const int *incX) +double F77_dzasum(const CBLAS_INT *N, void *X, const CBLAS_INT *incX) { return cblas_dzasum(*N, X, *incX); } -double F77_dznrm2(const int *N, const void *X, const int *incX) +double F77_dznrm2(const CBLAS_INT *N, const void *X, const CBLAS_INT *incX) { return cblas_dznrm2(*N, X, *incX); } -int F77_idamax(const int *N, const double *X, const int *incX) +CBLAS_INT F77_idamax(const CBLAS_INT *N, const double *X, const CBLAS_INT *incX) { if (*N < 1 || *incX < 1) return(0); return (cblas_idamax(*N, X, *incX)+1); diff --git a/CBLAS/testing/c_dblas2.c b/CBLAS/testing/c_dblas2.c index 835ba19f34..e8cc2bd23d 100644 --- a/CBLAS/testing/c_dblas2.c +++ b/CBLAS/testing/c_dblas2.c @@ -8,12 +8,16 @@ #include "cblas.h" #include "cblas_test.h" -void F77_dgemv(int *layout, char *transp, int *m, int *n, double *alpha, - double *a, int *lda, double *x, int *incx, double *beta, - double *y, int *incy ) { +void F77_dgemv(CBLAS_INT *layout, char *transp, CBLAS_INT *m, CBLAS_INT *n, double *alpha, + double *a, CBLAS_INT *lda, double *x, CBLAS_INT *incx, double *beta, + double *y, CBLAS_INT *incy +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN transp_len +#endif +) { double *A; - int i,j,LDA; + CBLAS_INT i,j,LDA; CBLAS_TRANSPOSE trans; get_transpose_type(transp, &trans); @@ -35,11 +39,11 @@ void F77_dgemv(int *layout, char *transp, int *m, int *n, double *alpha, *m, *n, *alpha, a, *lda, x, *incx, *beta, y, *incy ); } -void F77_dger(int *layout, int *m, int *n, double *alpha, double *x, int *incx, - double *y, int *incy, double *a, int *lda ) { +void F77_dger(CBLAS_INT *layout, CBLAS_INT *m, CBLAS_INT *n, double *alpha, double *x, CBLAS_INT *incx, + double *y, CBLAS_INT *incy, double *a, CBLAS_INT *lda ) { double *A; - int i,j,LDA; + CBLAS_INT i,j,LDA; if (*layout == TEST_ROW_MJR) { LDA = *n+1; @@ -60,10 +64,14 @@ void F77_dger(int *layout, int *m, int *n, double *alpha, double *x, int *incx, cblas_dger( CblasColMajor, *m, *n, *alpha, x, *incx, y, *incy, a, *lda ); } -void F77_dtrmv(int *layout, char *uplow, char *transp, char *diagn, - int *n, double *a, int *lda, double *x, int *incx) { +void F77_dtrmv(CBLAS_INT *layout, char *uplow, char *transp, char *diagn, + CBLAS_INT *n, double *a, CBLAS_INT *lda, double *x, CBLAS_INT *incx +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len, FORTRAN_STRLEN transp_len, FORTRAN_STRLEN diagn_len +#endif +) { double *A; - int i,j,LDA; + CBLAS_INT i,j,LDA; CBLAS_TRANSPOSE trans; CBLAS_UPLO uplo; CBLAS_DIAG diag; @@ -88,10 +96,14 @@ void F77_dtrmv(int *layout, char *uplow, char *transp, char *diagn, } } -void F77_dtrsv(int *layout, char *uplow, char *transp, char *diagn, - int *n, double *a, int *lda, double *x, int *incx ) { +void F77_dtrsv(CBLAS_INT *layout, char *uplow, char *transp, char *diagn, + CBLAS_INT *n, double *a, CBLAS_INT *lda, double *x, CBLAS_INT *incx +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len, FORTRAN_STRLEN transp_len, FORTRAN_STRLEN diagn_len +#endif +) { double *A; - int i,j,LDA; + CBLAS_INT i,j,LDA; CBLAS_TRANSPOSE trans; CBLAS_UPLO uplo; CBLAS_DIAG diag; @@ -112,11 +124,15 @@ void F77_dtrsv(int *layout, char *uplow, char *transp, char *diagn, else cblas_dtrsv(CblasColMajor, uplo, trans, diag, *n, a, *lda, x, *incx ); } -void F77_dsymv(int *layout, char *uplow, int *n, double *alpha, double *a, - int *lda, double *x, int *incx, double *beta, double *y, - int *incy) { +void F77_dsymv(CBLAS_INT *layout, char *uplow, CBLAS_INT *n, double *alpha, double *a, + CBLAS_INT *lda, double *x, CBLAS_INT *incx, double *beta, double *y, + CBLAS_INT *incy +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len +#endif +) { double *A; - int i,j,LDA; + CBLAS_INT i,j,LDA; CBLAS_UPLO uplo; get_uplo_type(uplow,&uplo); @@ -136,10 +152,14 @@ void F77_dsymv(int *layout, char *uplow, int *n, double *alpha, double *a, *beta, y, *incy ); } -void F77_dsyr(int *layout, char *uplow, int *n, double *alpha, double *x, - int *incx, double *a, int *lda) { +void F77_dsyr(CBLAS_INT *layout, char *uplow, CBLAS_INT *n, double *alpha, double *x, + CBLAS_INT *incx, double *a, CBLAS_INT *lda +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len +#endif +) { double *A; - int i,j,LDA; + CBLAS_INT i,j,LDA; CBLAS_UPLO uplo; get_uplo_type(uplow,&uplo); @@ -160,10 +180,14 @@ void F77_dsyr(int *layout, char *uplow, int *n, double *alpha, double *x, cblas_dsyr(CblasColMajor, uplo, *n, *alpha, x, *incx, a, *lda); } -void F77_dsyr2(int *layout, char *uplow, int *n, double *alpha, double *x, - int *incx, double *y, int *incy, double *a, int *lda) { +void F77_dsyr2(CBLAS_INT *layout, char *uplow, CBLAS_INT *n, double *alpha, double *x, + CBLAS_INT *incx, double *y, CBLAS_INT *incy, double *a, CBLAS_INT *lda +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len +#endif +) { double *A; - int i,j,LDA; + CBLAS_INT i,j,LDA; CBLAS_UPLO uplo; get_uplo_type(uplow,&uplo); @@ -184,12 +208,16 @@ void F77_dsyr2(int *layout, char *uplow, int *n, double *alpha, double *x, cblas_dsyr2(CblasColMajor, uplo, *n, *alpha, x, *incx, y, *incy, a, *lda); } -void F77_dgbmv(int *layout, char *transp, int *m, int *n, int *kl, int *ku, - double *alpha, double *a, int *lda, double *x, int *incx, - double *beta, double *y, int *incy ) { +void F77_dgbmv(CBLAS_INT *layout, char *transp, CBLAS_INT *m, CBLAS_INT *n, CBLAS_INT *kl, CBLAS_INT *ku, + double *alpha, double *a, CBLAS_INT *lda, double *x, CBLAS_INT *incx, + double *beta, double *y, CBLAS_INT *incy +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN transp_len +#endif +) { double *A; - int i,irow,j,jcol,LDA; + CBLAS_INT i,irow,j,jcol,LDA; CBLAS_TRANSPOSE trans; get_transpose_type(transp, &trans); @@ -222,10 +250,14 @@ void F77_dgbmv(int *layout, char *transp, int *m, int *n, int *kl, int *ku, a, *lda, x, *incx, *beta, y, *incy ); } -void F77_dtbmv(int *layout, char *uplow, char *transp, char *diagn, - int *n, int *k, double *a, int *lda, double *x, int *incx) { +void F77_dtbmv(CBLAS_INT *layout, char *uplow, char *transp, char *diagn, + CBLAS_INT *n, CBLAS_INT *k, double *a, CBLAS_INT *lda, double *x, CBLAS_INT *incx +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len, FORTRAN_STRLEN transp_len, FORTRAN_STRLEN diagn_len +#endif +) { double *A; - int irow, jcol, i, j, LDA; + CBLAS_INT irow, jcol, i, j, LDA; CBLAS_TRANSPOSE trans; CBLAS_UPLO uplo; CBLAS_DIAG diag; @@ -268,10 +300,14 @@ void F77_dtbmv(int *layout, char *uplow, char *transp, char *diagn, cblas_dtbmv(CblasColMajor, uplo, trans, diag, *n, *k, a, *lda, x, *incx); } -void F77_dtbsv(int *layout, char *uplow, char *transp, char *diagn, - int *n, int *k, double *a, int *lda, double *x, int *incx) { +void F77_dtbsv(CBLAS_INT *layout, char *uplow, char *transp, char *diagn, + CBLAS_INT *n, CBLAS_INT *k, double *a, CBLAS_INT *lda, double *x, CBLAS_INT *incx +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len, FORTRAN_STRLEN transp_len, FORTRAN_STRLEN diagn_len +#endif +) { double *A; - int irow, jcol, i, j, LDA; + CBLAS_INT irow, jcol, i, j, LDA; CBLAS_TRANSPOSE trans; CBLAS_UPLO uplo; CBLAS_DIAG diag; @@ -314,11 +350,15 @@ void F77_dtbsv(int *layout, char *uplow, char *transp, char *diagn, cblas_dtbsv(CblasColMajor, uplo, trans, diag, *n, *k, a, *lda, x, *incx); } -void F77_dsbmv(int *layout, char *uplow, int *n, int *k, double *alpha, - double *a, int *lda, double *x, int *incx, double *beta, - double *y, int *incy) { +void F77_dsbmv(CBLAS_INT *layout, char *uplow, CBLAS_INT *n, CBLAS_INT *k, double *alpha, + double *a, CBLAS_INT *lda, double *x, CBLAS_INT *incx, double *beta, + double *y, CBLAS_INT *incy +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len +#endif +) { double *A; - int i,j,irow,jcol,LDA; + CBLAS_INT i,j,irow,jcol,LDA; CBLAS_UPLO uplo; get_uplo_type(uplow,&uplo); @@ -359,10 +399,14 @@ void F77_dsbmv(int *layout, char *uplow, int *n, int *k, double *alpha, *beta, y, *incy ); } -void F77_dspmv(int *layout, char *uplow, int *n, double *alpha, double *ap, - double *x, int *incx, double *beta, double *y, int *incy) { +void F77_dspmv(CBLAS_INT *layout, char *uplow, CBLAS_INT *n, double *alpha, double *ap, + double *x, CBLAS_INT *incx, double *beta, double *y, CBLAS_INT *incy +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len +#endif +) { double *A,*AP; - int i,j,k,LDA; + CBLAS_INT i,j,k,LDA; CBLAS_UPLO uplo; get_uplo_type(uplow,&uplo); @@ -397,10 +441,14 @@ void F77_dspmv(int *layout, char *uplow, int *n, double *alpha, double *ap, *incy ); } -void F77_dtpmv(int *layout, char *uplow, char *transp, char *diagn, - int *n, double *ap, double *x, int *incx) { +void F77_dtpmv(CBLAS_INT *layout, char *uplow, char *transp, char *diagn, + CBLAS_INT *n, double *ap, double *x, CBLAS_INT *incx +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len, FORTRAN_STRLEN transp_len, FORTRAN_STRLEN diagn_len +#endif +) { double *A, *AP; - int i, j, k, LDA; + CBLAS_INT i, j, k, LDA; CBLAS_TRANSPOSE trans; CBLAS_UPLO uplo; CBLAS_DIAG diag; @@ -437,10 +485,14 @@ void F77_dtpmv(int *layout, char *uplow, char *transp, char *diagn, cblas_dtpmv( CblasColMajor, uplo, trans, diag, *n, ap, x, *incx ); } -void F77_dtpsv(int *layout, char *uplow, char *transp, char *diagn, - int *n, double *ap, double *x, int *incx) { +void F77_dtpsv(CBLAS_INT *layout, char *uplow, char *transp, char *diagn, + CBLAS_INT *n, double *ap, double *x, CBLAS_INT *incx +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len, FORTRAN_STRLEN transp_len, FORTRAN_STRLEN diagn_len +#endif +) { double *A, *AP; - int i, j, k, LDA; + CBLAS_INT i, j, k, LDA; CBLAS_TRANSPOSE trans; CBLAS_UPLO uplo; CBLAS_DIAG diag; @@ -478,10 +530,14 @@ void F77_dtpsv(int *layout, char *uplow, char *transp, char *diagn, cblas_dtpsv( CblasColMajor, uplo, trans, diag, *n, ap, x, *incx ); } -void F77_dspr(int *layout, char *uplow, int *n, double *alpha, double *x, - int *incx, double *ap ){ +void F77_dspr(CBLAS_INT *layout, char *uplow, CBLAS_INT *n, double *alpha, double *x, + CBLAS_INT *incx, double *ap +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len +#endif +){ double *A, *AP; - int i,j,k,LDA; + CBLAS_INT i,j,k,LDA; CBLAS_UPLO uplo; get_uplo_type(uplow,&uplo); @@ -530,10 +586,14 @@ void F77_dspr(int *layout, char *uplow, int *n, double *alpha, double *x, cblas_dspr( CblasColMajor, uplo, *n, *alpha, x, *incx, ap ); } -void F77_dspr2(int *layout, char *uplow, int *n, double *alpha, double *x, - int *incx, double *y, int *incy, double *ap ){ +void F77_dspr2(CBLAS_INT *layout, char *uplow, CBLAS_INT *n, double *alpha, double *x, + CBLAS_INT *incx, double *y, CBLAS_INT *incy, double *ap +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len +#endif +){ double *A, *AP; - int i,j,k,LDA; + CBLAS_INT i,j,k,LDA; CBLAS_UPLO uplo; get_uplo_type(uplow,&uplo); diff --git a/CBLAS/testing/c_dblas3.c b/CBLAS/testing/c_dblas3.c index 8a2c37688d..675f0ebfc0 100644 --- a/CBLAS/testing/c_dblas3.c +++ b/CBLAS/testing/c_dblas3.c @@ -11,12 +11,16 @@ #define TEST_ROW_MJR 1 #define UNDEFINED -1 -void F77_dgemm(int *layout, char *transpa, char *transpb, int *m, int *n, - int *k, double *alpha, double *a, int *lda, double *b, int *ldb, - double *beta, double *c, int *ldc ) { +void F77_dgemm(CBLAS_INT *layout, char *transpa, char *transpb, CBLAS_INT *m, CBLAS_INT *n, + CBLAS_INT *k, double *alpha, double *a, CBLAS_INT *lda, double *b, CBLAS_INT *ldb, + double *beta, double *c, CBLAS_INT *ldc +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN transpa_len, FORTRAN_STRLEN transpb_len +#endif +) { double *A, *B, *C; - int i,j,LDA, LDB, LDC; + CBLAS_INT i,j,LDA, LDB, LDC; CBLAS_TRANSPOSE transa, transb; get_transpose_type(transpa, &transa); @@ -73,12 +77,95 @@ void F77_dgemm(int *layout, char *transpa, char *transpb, int *m, int *n, cblas_dgemm( UNDEFINED, transa, transb, *m, *n, *k, *alpha, a, *lda, b, *ldb, *beta, c, *ldc ); } -void F77_dsymm(int *layout, char *rtlf, char *uplow, int *m, int *n, - double *alpha, double *a, int *lda, double *b, int *ldb, - double *beta, double *c, int *ldc ) { + +void F77_dgemmtr(CBLAS_INT *layout, char *uplop, char *transpa, char *transpb, CBLAS_INT *n, + CBLAS_INT *k, double *alpha, double *a, CBLAS_INT *lda, + double *b, CBLAS_INT *ldb, double *beta, + double *c, CBLAS_INT *ldc ) { + + double *A, *B, *C; + CBLAS_INT i,j,LDA, LDB, LDC; + CBLAS_TRANSPOSE transa, transb; + CBLAS_UPLO uplo; + + get_transpose_type(transpa, &transa); + get_transpose_type(transpb, &transb); + get_uplo_type(uplop, &uplo); + + if (*layout == TEST_ROW_MJR) { + if (transa == CblasNoTrans) { + LDA = *k+1; + A=(double*)malloc((*n)*LDA*sizeof(double)); + for( i=0; i<*n; i++ ) + for( j=0; j<*k; j++ ) { + A[i*LDA+j]=a[j*(*lda)+i]; + } + } + else { + LDA = *n+1; + A=(double* )malloc(LDA*(*k)*sizeof(double)); + for( i=0; i<*k; i++ ) + for( j=0; j<*n; j++ ) { + A[i*LDA+j]=a[j*(*lda)+i]; + } + } + + if (transb == CblasNoTrans) { + LDB = *n+1; + B=(double* )malloc((*k)*LDB*sizeof(double) ); + for( i=0; i<*k; i++ ) + for( j=0; j<*n; j++ ) { + B[i*LDB+j]=b[j*(*ldb)+i]; + } + } + else { + LDB = *k+1; + B=(double* )malloc(LDB*(*n)*sizeof(double)); + for( i=0; i<*n; i++ ) + for( j=0; j<*k; j++ ) { + B[i*LDB+j]=b[j*(*ldb)+i]; + } + } + + LDC = *n+1; + C=(double* )malloc((*n)*LDC*sizeof(double)); + for( j=0; j<*n; j++ ) + for( i=0; i<*n; i++ ) { + C[i*LDC+j]=c[j*(*ldc)+i]; + } + cblas_dgemmtr( CblasRowMajor, uplo, transa, transb, *n, *k, *alpha, A, LDA, + B, LDB, *beta, C, LDC ); + for( j=0; j<*n; j++ ) + for( i=0; i<*n; i++ ) { + c[j*(*ldc)+i]=C[i*LDC+j]; + } + free(A); + free(B); + free(C); + } + else if (*layout == TEST_COL_MJR){ + cblas_dgemmtr( CblasColMajor, uplo, transa, transb, *n, *k, *alpha, a, *lda, + b, *ldb, *beta, c, *ldc ); + } + else + cblas_dgemmtr( UNDEFINED, uplo, transa, transb, *n, *k, *alpha, a, *lda, + b, *ldb, *beta, c, *ldc ); +} + + + + + +void F77_dsymm(CBLAS_INT *layout, char *rtlf, char *uplow, CBLAS_INT *m, CBLAS_INT *n, + double *alpha, double *a, CBLAS_INT *lda, double *b, CBLAS_INT *ldb, + double *beta, double *c, CBLAS_INT *ldc +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN rtlf_len, FORTRAN_STRLEN uplow_len +#endif +) { double *A, *B, *C; - int i,j,LDA, LDB, LDC; + CBLAS_INT i,j,LDA, LDB, LDC; CBLAS_UPLO uplo; CBLAS_SIDE side; @@ -127,11 +214,15 @@ void F77_dsymm(int *layout, char *rtlf, char *uplow, int *m, int *n, *beta, c, *ldc ); } -void F77_dsyrk(int *layout, char *uplow, char *transp, int *n, int *k, - double *alpha, double *a, int *lda, - double *beta, double *c, int *ldc ) { +void F77_dsyrk(CBLAS_INT *layout, char *uplow, char *transp, CBLAS_INT *n, CBLAS_INT *k, + double *alpha, double *a, CBLAS_INT *lda, + double *beta, double *c, CBLAS_INT *ldc +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len, FORTRAN_STRLEN transp_len +#endif +) { - int i,j,LDA,LDC; + CBLAS_INT i,j,LDA,LDC; double *A, *C; CBLAS_UPLO uplo; CBLAS_TRANSPOSE trans; @@ -175,10 +266,14 @@ void F77_dsyrk(int *layout, char *uplow, char *transp, int *n, int *k, c, *ldc ); } -void F77_dsyr2k(int *layout, char *uplow, char *transp, int *n, int *k, - double *alpha, double *a, int *lda, double *b, int *ldb, - double *beta, double *c, int *ldc ) { - int i,j,LDA,LDB,LDC; +void F77_dsyr2k(CBLAS_INT *layout, char *uplow, char *transp, CBLAS_INT *n, CBLAS_INT *k, + double *alpha, double *a, CBLAS_INT *lda, double *b, CBLAS_INT *ldb, + double *beta, double *c, CBLAS_INT *ldc +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len, FORTRAN_STRLEN transp_len +#endif +) { + CBLAS_INT i,j,LDA,LDB,LDC; double *A, *B, *C; CBLAS_UPLO uplo; CBLAS_TRANSPOSE trans; @@ -230,10 +325,14 @@ void F77_dsyr2k(int *layout, char *uplow, char *transp, int *n, int *k, cblas_dsyr2k(UNDEFINED, uplo, trans, *n, *k, *alpha, a, *lda, b, *ldb, *beta, c, *ldc ); } -void F77_dtrmm(int *layout, char *rtlf, char *uplow, char *transp, char *diagn, - int *m, int *n, double *alpha, double *a, int *lda, double *b, - int *ldb) { - int i,j,LDA,LDB; +void F77_dtrmm(CBLAS_INT *layout, char *rtlf, char *uplow, char *transp, char *diagn, + CBLAS_INT *m, CBLAS_INT *n, double *alpha, double *a, CBLAS_INT *lda, double *b, + CBLAS_INT *ldb +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN rtlf_len, FORTRAN_STRLEN uplow_len, FORTRAN_STRLEN transp_len, FORTRAN_STRLEN diag_len +#endif +) { + CBLAS_INT i,j,LDA,LDB; double *A, *B; CBLAS_SIDE side; CBLAS_DIAG diag; @@ -281,10 +380,14 @@ void F77_dtrmm(int *layout, char *rtlf, char *uplow, char *transp, char *diagn, a, *lda, b, *ldb); } -void F77_dtrsm(int *layout, char *rtlf, char *uplow, char *transp, char *diagn, - int *m, int *n, double *alpha, double *a, int *lda, double *b, - int *ldb) { - int i,j,LDA,LDB; +void F77_dtrsm(CBLAS_INT *layout, char *rtlf, char *uplow, char *transp, char *diagn, + CBLAS_INT *m, CBLAS_INT *n, double *alpha, double *a, CBLAS_INT *lda, double *b, + CBLAS_INT *ldb +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN rtlf_len, FORTRAN_STRLEN uplow_len, FORTRAN_STRLEN transp_len, FORTRAN_STRLEN diagn_len +#endif +) { + CBLAS_INT i,j,LDA,LDB; double *A, *B; CBLAS_SIDE side; CBLAS_DIAG diag; diff --git a/CBLAS/testing/c_dblat1.f b/CBLAS/testing/c_dblat1.f index 4a71b4dcf7..c272939206 100644 --- a/CBLAS/testing/c_dblat1.f +++ b/CBLAS/testing/c_dblat1.f @@ -1,4 +1,6 @@ +* ===================================================================== PROGRAM DCBLAT1 + IMPLICIT NONE * Test program for the DOUBLE PRECISION Level 1 CBLAS. * Based upon the original CBLAS test routine together with: * F06EAF Example Program Text @@ -19,7 +21,7 @@ PROGRAM DCBLAT1 DATA SFAC/9.765625D-4/ * .. Executable Statements .. WRITE (NOUT,99999) - DO 20 IC = 1, 10 + DO 20 IC = 1, 11 ICASE = IC CALL HEADER * @@ -38,7 +40,7 @@ PROGRAM DCBLAT1 + ICASE.EQ.10) THEN CALL CHECK1(SFAC) ELSE IF (ICASE.EQ.1 .OR. ICASE.EQ.2 .OR. ICASE.EQ.5 .OR. - + ICASE.EQ.6) THEN + + ICASE.EQ.6 .OR. ICASE.EQ.11 ) THEN CALL CHECK2(SFAC) ELSE IF (ICASE.EQ.4) THEN CALL CHECK3(SFAC) @@ -51,7 +53,11 @@ PROGRAM DCBLAT1 99999 FORMAT (' Real CBLAS Test Program Results',/1X) 99998 FORMAT (' ----- PASS -----') END + +* ===================================================================== SUBROUTINE HEADER + IMPLICIT NONE + * .. Parameters .. INTEGER NOUT PARAMETER (NOUT=6) @@ -59,7 +65,7 @@ SUBROUTINE HEADER INTEGER ICASE, INCX, INCY, MODE, N LOGICAL PASS * .. Local Arrays .. - CHARACTER*15 L(10) + CHARACTER*15 L(11) * .. Common blocks .. COMMON /COMBLA/ICASE, N, INCX, INCY, MODE, PASS * .. Data statements .. @@ -73,13 +79,18 @@ SUBROUTINE HEADER DATA L(8)/'CBLAS_DASUM '/ DATA L(9)/'CBLAS_DSCAL '/ DATA L(10)/'CBLAS_IDAMAX'/ + DATA L(11)/'CBLAS_DAXPBY'/ + * .. Executable Statements .. WRITE (NOUT,99999) ICASE, L(ICASE) RETURN * 99999 FORMAT (/' Test of subprogram number',I3,9X,A15) END + +* ===================================================================== SUBROUTINE CHECK0(SFAC) + IMPLICIT NONE * .. Parameters .. INTEGER NOUT PARAMETER (NOUT=6) @@ -140,7 +151,10 @@ SUBROUTINE CHECK0(SFAC) 20 CONTINUE 40 RETURN END + +* ===================================================================== SUBROUTINE CHECK1(SFAC) + IMPLICIT NONE * .. Parameters .. INTEGER NOUT PARAMETER (NOUT=6) @@ -234,7 +248,10 @@ SUBROUTINE CHECK1(SFAC) 80 CONTINUE RETURN END + +* ===================================================================== SUBROUTINE CHECK2(SFAC) + IMPLICIT NONE * .. Parameters .. INTEGER NOUT PARAMETER (NOUT=6) @@ -244,25 +261,27 @@ SUBROUTINE CHECK2(SFAC) INTEGER ICASE, INCX, INCY, MODE, N LOGICAL PASS * .. Local Scalars .. - DOUBLE PRECISION SA + DOUBLE PRECISION SA, SB INTEGER I, J, KI, KN, KSIZE, LENX, LENY, MX, MY * .. Local Arrays .. DOUBLE PRECISION DT10X(7,4,4), DT10Y(7,4,4), DT7(4,4), + DT8(7,4,4), DX1(7), + DY1(7), SSIZE1(4), SSIZE2(14,2), STX(7), STY(7), - + SX(7), SY(7) + + SX(7), SY(7), DT20(7,4,4) INTEGER INCXS(4), INCYS(4), LENS(4,2), NS(4) * .. External Functions .. EXTERNAL DDOTTEST DOUBLE PRECISION DDOTTEST * .. External Subroutines .. EXTERNAL DAXPYTEST, DCOPYTEST, DSWAPTEST, STEST, STEST1 + + DAXPBYTEST * .. Intrinsic Functions .. INTRINSIC ABS, MIN * .. Common blocks .. COMMON /COMBLA/ICASE, N, INCX, INCY, MODE, PASS * .. Data statements .. DATA SA/0.3D0/ + DATA SB/0.5D0/ DATA INCXS/1, 2, -2, -1/ DATA INCYS/1, -2, 1, -2/ DATA LENS/1, 1, 2, 4, 1, 1, 3, 7/ @@ -335,6 +354,27 @@ SUBROUTINE CHECK2(SFAC) + 0.0D0, 1.17D0, 1.17D0, 1.17D0, 1.17D0, 1.17D0, + 1.17D0, 1.17D0, 1.17D0, 1.17D0, 1.17D0, 1.17D0, + 1.17D0, 1.17D0, 1.17D0/ + DATA DT20/0.5D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, + + 0.0D0, 0.43D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, + + 0.0D0, 0.0D0, 0.43D0, -0.42D0, 0.0D0, 0.0D0, + + 0.0D0, 0.0D0, 0.0D0, 0.43D0, -0.42D0, 0.0D0, + + 0.59D0, 0.0D0, 0.0D0, 0.0D0, 0.5D0, 0.0D0, + + 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.43D0, + + 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, + + 0.1D0, -0.9D0, 0.33D0, 0.0D0, 0.0D0, 0.0D0, + + 0.0D0, 0.13D0, -0.9D0, 0.42D0, 0.7D0, -0.45D0, + + 0.2D0, 0.58D0, 0.5D0, 0.0D0, 0.0D0, 0.0D0, + + 0.0D0, 0.0D0, 0.0D0, 0.43D0, 0.0D0, 0.0D0, + + 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.1D0, -0.27D0, + + 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.13D0, + + -0.18D0, 0.00D0, 0.53D0, 0.0D0, 0.0D0, 0.0D0, + + 0.5D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, + + 0.43D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, + + 0.0D0, 0.43D0, -0.9D0, 0.18D0, 0.0D0, 0.0D0, + + 0.0D0, 0.0D0, 0.43D0, -0.9D0, 0.18D0, 0.7D0, + + -0.45D0, 0.2D0, 0.64D0/ + + * .. Executable Statements .. * DO 120 KI = 1, 4 @@ -365,6 +405,14 @@ SUBROUTINE CHECK2(SFAC) STY(J) = DT8(J,KN,KI) 40 CONTINUE CALL STEST(LENY,SY,STY,SSIZE2(1,KSIZE),SFAC) + ELSE IF (ICASE.EQ.11) THEN +* .. DAXPBYTEST .. + CALL DAXPBYTEST(N,SA,SX,INCX,SB,SY,INCY) + DO 50 J = 1, LENY + STY(J) = DT20(J,KN,KI) + 50 CONTINUE + CALL STEST(LENY,SY,STY,SSIZE2(1,KSIZE),SFAC) + ELSE IF (ICASE.EQ.5) THEN * .. DCOPYTEST .. DO 60 I = 1, 7 @@ -389,7 +437,10 @@ SUBROUTINE CHECK2(SFAC) 120 CONTINUE RETURN END + +* ===================================================================== SUBROUTINE CHECK3(SFAC) + IMPLICIT NONE * .. Parameters .. INTEGER NOUT PARAMETER (NOUT=6) @@ -595,7 +646,10 @@ SUBROUTINE CHECK3(SFAC) 200 CONTINUE RETURN END + +* ===================================================================== SUBROUTINE STEST(LEN,SCOMP,STRUE,SSIZE,SFAC) + IMPLICIT NONE * ********************************* STEST ************************** * * THIS SUBR COMPARES ARRAYS SCOMP() AND STRUE() OF LENGTH LEN TO @@ -650,7 +704,10 @@ SUBROUTINE STEST(LEN,SCOMP,STRUE,SSIZE,SFAC) + ' SIZE(I)',/1X) 99997 FORMAT (1X,I4,I3,3I5,I3,2D36.8,2D12.4) END + +* ===================================================================== SUBROUTINE STEST1(SCOMP1,STRUE1,SSIZE,SFAC) + IMPLICIT NONE * ************************* STEST1 ***************************** * * THIS IS AN INTERFACE SUBROUTINE TO ACCOMMODATE THE FORTRAN @@ -675,7 +732,10 @@ SUBROUTINE STEST1(SCOMP1,STRUE1,SSIZE,SFAC) * RETURN END + +* ===================================================================== DOUBLE PRECISION FUNCTION SDIFF(SA,SB) + IMPLICIT NONE * ********************************* SDIFF ************************** * COMPUTES DIFFERENCE OF TWO NUMBERS. C. L. LAWSON, JPL 1974 FEB 15 * @@ -685,7 +745,10 @@ DOUBLE PRECISION FUNCTION SDIFF(SA,SB) SDIFF = SA - SB RETURN END + +* ===================================================================== SUBROUTINE ITEST1(ICOMP,ITRUE) + IMPLICIT NONE * ********************************* ITEST1 ************************* * * THIS SUBROUTINE COMPARES THE VARIABLES ICOMP AND ITRUE FOR diff --git a/CBLAS/testing/c_dblat2.f b/CBLAS/testing/c_dblat2.f index 27ceda622f..8e92df5627 100644 --- a/CBLAS/testing/c_dblat2.f +++ b/CBLAS/testing/c_dblat2.f @@ -1,4 +1,6 @@ +* ===================================================================== PROGRAM DBLAT2 + IMPLICIT NONE * * Test program for the DOUBLE PRECISION Level 2 Blas. * @@ -453,10 +455,13 @@ PROGRAM DBLAT2 * End of DBLAT2. * END + +* ===================================================================== SUBROUTINE DCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF, NBET, $ BET, NINC, INC, NMAX, INCMAX, A, AA, AS, X, XX, $ XS, Y, YY, YS, YT, G, IORDER ) + IMPLICIT NONE * * Tests DGEMV and DGBMV. * @@ -813,10 +818,13 @@ SUBROUTINE DCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * End of DCHK1. * END + +* ===================================================================== SUBROUTINE DCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF, NBET, $ BET, NINC, INC, NMAX, INCMAX, A, AA, AS, X, XX, $ XS, Y, YY, YS, YT, G, IORDER ) + IMPLICIT NONE * * Tests DSYMV, DSBMV and DSPMV. * @@ -1173,9 +1181,12 @@ SUBROUTINE DCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * End of DCHK2. * END + +* ===================================================================== SUBROUTINE DCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NKB, KB, NINC, INC, NMAX, $ INCMAX, A, AA, AS, X, XX, XS, XT, G, Z, IORDER ) + IMPLICIT NONE * * Tests DTRMV, DTBMV, DTPMV, DTRSV, DTBSV and DTPSV. * @@ -1560,10 +1571,13 @@ SUBROUTINE DCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * End of DCHK3. * END + +* ===================================================================== SUBROUTINE DCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX, $ INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G, $ Z, IORDER ) + IMPLICIT NONE * * Tests DGER. * @@ -1832,10 +1846,13 @@ SUBROUTINE DCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * End of DCHK4. * END + +* ===================================================================== SUBROUTINE DCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX, $ INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G, $ Z, IORDER ) + IMPLICIT NONE * * Tests DSYR and DSPR. * @@ -2128,10 +2145,13 @@ SUBROUTINE DCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * End of DCHK5. * END + +* ===================================================================== SUBROUTINE DCHK6( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX, $ INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G, $ Z, IORDER ) + IMPLICIT NONE * * Tests DSYR2 and DSPR2. * @@ -2460,8 +2480,11 @@ SUBROUTINE DCHK6( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * End of DCHK6. * END + +* ===================================================================== SUBROUTINE DMAKE( TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, KL, $ KU, RESET, TRANSL ) + IMPLICIT NONE * * Generates values for an M by N matrix A within the bandwidth * defined by KL and KU. @@ -2636,8 +2659,11 @@ SUBROUTINE DMAKE( TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, KL, * End of DMAKE. * END + +* ===================================================================== SUBROUTINE DMVCH( TRANS, M, N, ALPHA, A, NMAX, X, INCX, BETA, Y, $ INCY, YT, G, YY, EPS, ERR, FATAL, NOUT, MV ) + IMPLICIT NONE * * Checks the results of the computational tests. * @@ -2753,7 +2779,10 @@ SUBROUTINE DMVCH( TRANS, M, N, ALPHA, A, NMAX, X, INCX, BETA, Y, * End of DMVCH. * END + +* ===================================================================== LOGICAL FUNCTION LDE( RI, RJ, LR ) + IMPLICIT NONE * * Tests if two arrays are identical. * @@ -2783,7 +2812,10 @@ LOGICAL FUNCTION LDE( RI, RJ, LR ) * End of LDE. * END + +* ===================================================================== LOGICAL FUNCTION LDERES( TYPE, UPLO, M, N, AA, AS, LDA ) + IMPLICIT NONE * * Tests if selected elements in two arrays are equal. * @@ -2843,7 +2875,10 @@ LOGICAL FUNCTION LDERES( TYPE, UPLO, M, N, AA, AS, LDA ) * End of LDERES. * END + +* ===================================================================== DOUBLE PRECISION FUNCTION DBEG( RESET ) + IMPLICIT NONE * * Generates random numbers uniformly distributed between -0.5 and 0.5. * @@ -2889,7 +2924,10 @@ DOUBLE PRECISION FUNCTION DBEG( RESET ) * End of DBEG. * END + +* ===================================================================== DOUBLE PRECISION FUNCTION DDIFF( X, Y ) + IMPLICIT NONE * * Auxiliary routine for test program for Level 2 Blas. * diff --git a/CBLAS/testing/c_dblat3.f b/CBLAS/testing/c_dblat3.f index 72ad80c925..9d8f0bb819 100644 --- a/CBLAS/testing/c_dblat3.f +++ b/CBLAS/testing/c_dblat3.f @@ -1,10 +1,12 @@ +* ===================================================================== PROGRAM DBLAT3 + IMPLICIT NONE * * Test program for the DOUBLE PRECISION Level 3 Blas. * * The program must be driven by a short data file. The first 13 records * of the file are read using list-directed input, the last 6 records -* are read using the format ( A12, L2 ). An annotated example of a data +* are read using the format ( A13, L2 ). An annotated example of a data * file can be obtained by deleting the first 3 characters from the * following 19 lines: * 'DBLAT3.SNAP' NAME OF SNAPSHOT OUTPUT FILE @@ -20,12 +22,13 @@ PROGRAM DBLAT3 * 0.0 1.0 0.7 VALUES OF ALPHA * 3 NUMBER OF VALUES OF BETA * 0.0 1.0 1.3 VALUES OF BETA -* cblas_dgemm T PUT F FOR NO TEST. SAME COLUMNS. -* cblas_dsymm T PUT F FOR NO TEST. SAME COLUMNS. -* cblas_dtrmm T PUT F FOR NO TEST. SAME COLUMNS. -* cblas_dtrsm T PUT F FOR NO TEST. SAME COLUMNS. -* cblas_dsyrk T PUT F FOR NO TEST. SAME COLUMNS. -* cblas_dsyr2k T PUT F FOR NO TEST. SAME COLUMNS. +* cblas_dgemm T PUT F FOR NO TEST. SAME COLUMNS. +* cblas_dsymm T PUT F FOR NO TEST. SAME COLUMNS. +* cblas_dtrmm T PUT F FOR NO TEST. SAME COLUMNS. +* cblas_dtrsm T PUT F FOR NO TEST. SAME COLUMNS. +* cblas_dsyrk T PUT F FOR NO TEST. SAME COLUMNS. +* cblas_dsyr2k T PUT F FOR NO TEST. SAME COLUMNS. +* cblas_dgemmtr T PUT F FOR NO TEST. SAME COLUMNS. * * See: * @@ -46,7 +49,7 @@ PROGRAM DBLAT3 INTEGER NIN, NOUT PARAMETER ( NIN = 5, NOUT = 6 ) INTEGER NSUBS - PARAMETER ( NSUBS = 6 ) + PARAMETER ( NSUBS = 7 ) DOUBLE PRECISION ZERO, HALF, ONE PARAMETER ( ZERO = 0.0D0, HALF = 0.5D0, ONE = 1.0D0 ) INTEGER NMAX @@ -56,11 +59,11 @@ PROGRAM DBLAT3 * .. Local Scalars .. DOUBLE PRECISION EPS, ERR, THRESH INTEGER I, ISNUM, J, N, NALF, NBET, NIDIM, NTRA, - $ LAYOUT + $ LAYOUT LOGICAL FATAL, LTESTT, REWI, SAME, SFATAL, TRACE, $ TSTERR, CORDER, RORDER CHARACTER*1 TRANSA, TRANSB - CHARACTER*12 SNAMET + CHARACTER*13 SNAMET CHARACTER*32 SNAPS * .. Local Arrays .. DOUBLE PRECISION AA( NMAX*NMAX ), AB( NMAX, 2*NMAX ), @@ -71,27 +74,27 @@ PROGRAM DBLAT3 $ G( NMAX ), W( 2*NMAX ) INTEGER IDIM( NIDMAX ) LOGICAL LTEST( NSUBS ) - CHARACTER*12 SNAMES( NSUBS ) + CHARACTER*13 SNAMES( NSUBS ) * .. External Functions .. DOUBLE PRECISION DDIFF LOGICAL LDE EXTERNAL DDIFF, LDE * .. External Subroutines .. EXTERNAL DCHK1, DCHK2, DCHK3, DCHK4, DCHK5, CD3CHKE, - $ DMMCH + $ DMMCH * .. Intrinsic Functions .. INTRINSIC MAX, MIN * .. Scalars in Common .. INTEGER INFOT, NOUTC - LOGICAL OK - CHARACTER*12 SRNAMT + LOGICAL LERR, OK + CHARACTER*13 SRNAMT * .. Common blocks .. - COMMON /INFOC/INFOT, NOUTC, OK + COMMON /INFOC/INFOT, NOUTC, OK, LERR COMMON /SRNAMC/SRNAMT * .. Data statements .. DATA SNAMES/'cblas_dgemm ', 'cblas_dsymm ', $ 'cblas_dtrmm ', 'cblas_dtrsm ','cblas_dsyrk ', - $ 'cblas_dsyr2k'/ + $ 'cblas_dsyr2k', 'cblas_dgemmtr'/ * .. Executable Statements .. * * Read name and unit number for summary output file and open file. @@ -289,7 +292,7 @@ PROGRAM DBLAT3 INFOT = 0 OK = .TRUE. FATAL = .FALSE. - GO TO ( 140, 150, 160, 160, 170, 180 )ISNUM + GO TO ( 140, 150, 160, 160, 170, 180, 185 )ISNUM * Test DGEMM, 01. 140 IF (CORDER) THEN CALL DCHK1( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE, @@ -323,13 +326,13 @@ PROGRAM DBLAT3 CALL DCHK3( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE, $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NMAX, AB, $ AA, AS, AB( 1, NMAX + 1 ), BB, BS, CT, G, C, - $ 0 ) + $ 0 ) END IF IF (RORDER) THEN CALL DCHK3( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE, $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NMAX, AB, $ AA, AS, AB( 1, NMAX + 1 ), BB, BS, CT, G, C, - $ 1 ) + $ 1 ) END IF GO TO 190 * Test DSYRK, 05. @@ -351,15 +354,30 @@ PROGRAM DBLAT3 CALL DCHK5( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE, $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, $ NMAX, AB, AA, AS, BB, BS, C, CC, CS, CT, G, W, - $ 0 ) + $ 0 ) END IF IF (RORDER) THEN CALL DCHK5( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE, $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, $ NMAX, AB, AA, AS, BB, BS, C, CC, CS, CT, G, W, - $ 1 ) + $ 1 ) END IF GO TO 190 +* Test DGEMMTR, 07. + 185 IF (CORDER) THEN + CALL DCHK6( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE, + $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, + $ NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C, + $ CC, CS, CT, G, 0 ) + END IF + IF (RORDER) THEN + CALL DCHK6( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE, + $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, + $ NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C, + $ CC, CS, CT, G, 1 ) + END IF + GO TO 190 + * 190 IF( FATAL.AND.SFATAL ) $ GO TO 210 @@ -397,7 +415,7 @@ PROGRAM DBLAT3 9992 FORMAT( ' FOR BETA ', 7F6.1 ) 9991 FORMAT( ' AMEND DATA FILE OR INCREASE ARRAY SIZES IN PROGRAM', $ /' ******* TESTS ABANDONED *******' ) - 9990 FORMAT( ' SUBPROGRAM NAME ', A12,' NOT RECOGNIZED', /' ******* T', + 9990 FORMAT( ' SUBPROGRAM NAME ', A13,' NOT RECOGNIZED', /' ******* T', $ 'ESTS ABANDONED *******' ) 9989 FORMAT( ' ERROR IN DMMCH - IN-LINE DOT PRODUCTS ARE BEING EVALU', $ 'ATED WRONGLY.', /' DMMCH WAS CALLED WITH TRANSA = ', A1, @@ -405,8 +423,8 @@ PROGRAM DBLAT3 $ 'ERR = ', F12.3, '.', /' THIS MAY BE DUE TO FAULTS IN THE ', $ 'ARITHMETIC OR THE COMPILER.', /' ******* TESTS ABANDONED ', $ '*******' ) - 9988 FORMAT( A12,L2 ) - 9987 FORMAT( 1X, A12,' WAS NOT TESTED' ) + 9988 FORMAT( A13,L2 ) + 9987 FORMAT( 1X, A13,' WAS NOT TESTED' ) 9986 FORMAT( /' END OF TESTS' ) 9985 FORMAT( /' ******* FATAL ERROR - TESTS ABANDONED *******' ) 9984 FORMAT( ' ERROR-EXITS WILL NOT BE TESTED' ) @@ -414,9 +432,12 @@ PROGRAM DBLAT3 * End of DBLAT3. * END + +* ===================================================================== SUBROUTINE DCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX, $ A, AA, AS, B, BB, BS, C, CC, CS, CT, G, IORDER) + IMPLICIT NONE * * Tests DGEMM. * @@ -435,7 +456,7 @@ SUBROUTINE DCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, DOUBLE PRECISION EPS, THRESH INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA, IORDER LOGICAL FATAL, REWI, TRACE - CHARACTER*12 SNAME + CHARACTER*13 SNAME * .. Array Arguments .. DOUBLE PRECISION A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ), $ AS( NMAX*NMAX ), B( NMAX, NMAX ), @@ -462,9 +483,9 @@ SUBROUTINE DCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, INTRINSIC MAX * .. Scalars in Common .. INTEGER INFOT, NOUTC - LOGICAL OK + LOGICAL LERR, OK * .. Common blocks .. - COMMON /INFOC/INFOT, NOUTC, OK + COMMON /INFOC/INFOT, NOUTC, OK, LERR * .. Data statements .. DATA ICH/'NTC'/ * .. Executable Statements .. @@ -588,7 +609,7 @@ SUBROUTINE DCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ REWIND NTRA CALL CDGEMM( IORDER, TRANSA, TRANSB, M, N, $ K, ALPHA, AA, LDA, BB, LDB, - $ BETA, CC, LDC ) + $ BETA, CC, LDC ) * * Check if error-exit was taken incorrectly. * @@ -681,20 +702,20 @@ SUBROUTINE DCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, 130 CONTINUE RETURN * -10003 FORMAT( ' ', A12,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ', +10003 FORMAT( ' ', A13,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ', $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', $ 'RATIO ', F8.2, ' - SUSPECT *******' ) -10002 FORMAT( ' ', A12,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ', +10002 FORMAT( ' ', A13,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ', $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', $ 'RATIO ', F8.2, ' - SUSPECT *******' ) -10001 FORMAT( ' ', A12,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS', +10001 FORMAT( ' ', A13,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS', $ ' (', I6, ' CALL', 'S)' ) -10000 FORMAT( ' ', A12,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS', +10000 FORMAT( ' ', A13,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS', $ ' (', I6, ' CALL', 'S)' ) 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', $ 'ANGED INCORRECTLY *******' ) - 9996 FORMAT( ' ******* ', A12,' FAILED ON CALL NUMBER:' ) - 9995 FORMAT( 1X, I6, ': ', A12,'(''', A1, ''',''', A1, ''',', + 9996 FORMAT( ' ******* ', A13,' FAILED ON CALL NUMBER:' ) + 9995 FORMAT( 1X, I6, ': ', A13,'(''', A1, ''',''', A1, ''',', $ 3( I3, ',' ), F4.1, ', A,', I3, ', B,', I3, ',', F4.1, ', ', $ 'C,', I3, ').' ) 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', @@ -703,12 +724,16 @@ SUBROUTINE DCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * End of DCHK1. * END + +* ===================================================================== SUBROUTINE DPRCN1(NOUT, NC, SNAME, IORDER, TRANSA, TRANSB, M, N, $ K, ALPHA, LDA, LDB, BETA, LDC) + IMPLICIT NONE + INTEGER NOUT, NC, IORDER, M, N, K, LDA, LDB, LDC DOUBLE PRECISION ALPHA, BETA CHARACTER*1 TRANSA, TRANSB - CHARACTER*12 SNAME + CHARACTER*13 SNAME CHARACTER*14 CRC, CTA,CTB IF (TRANSA.EQ.'N')THEN @@ -733,14 +758,16 @@ SUBROUTINE DPRCN1(NOUT, NC, SNAME, IORDER, TRANSA, TRANSB, M, N, WRITE(NOUT, FMT = 9995)NC,SNAME,CRC, CTA,CTB WRITE(NOUT, FMT = 9994)M, N, K, ALPHA, LDA, LDB, BETA, LDC - 9995 FORMAT( 1X, I6, ': ', A12,'(', A14, ',', A14, ',', A14, ',') + 9995 FORMAT( 1X, I6, ': ', A13,'(', A14, ',', A14, ',', A14, ',') 9994 FORMAT( 20X, 3( I3, ',' ), F4.1, ', A,', I3, ', B,', I3, ',', $ F4.1, ', ', 'C,', I3, ').' ) END -* + +* ===================================================================== SUBROUTINE DCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX, $ A, AA, AS, B, BB, BS, C, CC, CS, CT, G, IORDER) + IMPLICIT NONE * * Tests DSYMM. * @@ -759,7 +786,7 @@ SUBROUTINE DCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, DOUBLE PRECISION EPS, THRESH INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA, IORDER LOGICAL FATAL, REWI, TRACE - CHARACTER*12 SNAME + CHARACTER*13 SNAME * .. Array Arguments .. DOUBLE PRECISION A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ), $ AS( NMAX*NMAX ), B( NMAX, NMAX ), @@ -786,9 +813,9 @@ SUBROUTINE DCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, INTRINSIC MAX * .. Scalars in Common .. INTEGER INFOT, NOUTC - LOGICAL OK + LOGICAL LERR, OK * .. Common blocks .. - COMMON /INFOC/INFOT, NOUTC, OK + COMMON /INFOC/INFOT, NOUTC, OK, LERR * .. Data statements .. DATA ICHS/'LR'/, ICHU/'UL'/ * .. Executable Statements .. @@ -994,20 +1021,20 @@ SUBROUTINE DCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, 120 CONTINUE RETURN * -10003 FORMAT( ' ', A12,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ', +10003 FORMAT( ' ', A13,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ', $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', $ 'RATIO ', F8.2, ' - SUSPECT *******' ) -10002 FORMAT( ' ', A12,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ', +10002 FORMAT( ' ', A13,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ', $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', $ 'RATIO ', F8.2, ' - SUSPECT *******' ) -10001 FORMAT( ' ', A12,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS', +10001 FORMAT( ' ', A13,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS', $ ' (', I6, ' CALL', 'S)' ) -10000 FORMAT( ' ', A12,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS', +10000 FORMAT( ' ', A13,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS', $ ' (', I6, ' CALL', 'S)' ) 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', $ 'ANGED INCORRECTLY *******' ) - 9996 FORMAT( ' ******* ', A12,' FAILED ON CALL NUMBER:' ) - 9995 FORMAT( 1X, I6, ': ', A12,'(', 2( '''', A1, ''',' ), 2( I3, ',' ), + 9996 FORMAT( ' ******* ', A13,' FAILED ON CALL NUMBER:' ) + 9995 FORMAT( 1X, I6, ': ', A13,'(', 2( '''', A1, ''',' ), 2( I3, ',' ), $ F4.1, ', A,', I3, ', B,', I3, ',', F4.1, ', C,', I3, ') ', $ ' .' ) 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', @@ -1016,13 +1043,16 @@ SUBROUTINE DCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * End of DCHK2. * END -* + +* ===================================================================== SUBROUTINE DPRCN2(NOUT, NC, SNAME, IORDER, SIDE, UPLO, M, N, $ ALPHA, LDA, LDB, BETA, LDC) + IMPLICIT NONE + INTEGER NOUT, NC, IORDER, M, N, LDA, LDB, LDC DOUBLE PRECISION ALPHA, BETA CHARACTER*1 SIDE, UPLO - CHARACTER*12 SNAME + CHARACTER*13 SNAME CHARACTER*14 CRC, CS,CU IF (SIDE.EQ.'L')THEN @@ -1043,14 +1073,16 @@ SUBROUTINE DPRCN2(NOUT, NC, SNAME, IORDER, SIDE, UPLO, M, N, WRITE(NOUT, FMT = 9995)NC,SNAME,CRC, CS,CU WRITE(NOUT, FMT = 9994)M, N, ALPHA, LDA, LDB, BETA, LDC - 9995 FORMAT( 1X, I6, ': ', A12,'(', A14, ',', A14, ',', A14, ',') + 9995 FORMAT( 1X, I6, ': ', A13,'(', A14, ',', A14, ',', A14, ',') 9994 FORMAT( 20X, 2( I3, ',' ), F4.1, ', A,', I3, ', B,', I3, ',', $ F4.1, ', ', 'C,', I3, ').' ) END -* + +* ===================================================================== SUBROUTINE DCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NMAX, A, AA, AS, $ B, BB, BS, CT, G, C, IORDER ) + IMPLICIT NONE * * Tests DTRMM and DTRSM. * @@ -1069,7 +1101,7 @@ SUBROUTINE DCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, DOUBLE PRECISION EPS, THRESH INTEGER NALF, NIDIM, NMAX, NOUT, NTRA, IORDER LOGICAL FATAL, REWI, TRACE - CHARACTER*12 SNAME + CHARACTER*13 SNAME * .. Array Arguments .. DOUBLE PRECISION A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ), $ AS( NMAX*NMAX ), B( NMAX, NMAX ), @@ -1097,9 +1129,9 @@ SUBROUTINE DCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, INTRINSIC MAX * .. Scalars in Common .. INTEGER INFOT, NOUTC - LOGICAL OK + LOGICAL LERR, OK * .. Common blocks .. - COMMON /INFOC/INFOT, NOUTC, OK + COMMON /INFOC/INFOT, NOUTC, OK, LERR * .. Data statements .. DATA ICHU/'UL'/, ICHT/'NTC'/, ICHD/'UN'/, ICHS/'LR'/ * .. Executable Statements .. @@ -1201,7 +1233,7 @@ SUBROUTINE DCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ REWIND NTRA CALL CDTRMM( IORDER, SIDE, UPLO, TRANSA, $ DIAG, M, N, ALPHA, AA, LDA, - $ BB, LDB ) + $ BB, LDB ) ELSE IF( SNAME( 10: 11 ).EQ.'sm' )THEN IF( TRACE ) $ CALL DPRCN3( NTRA, NC, SNAME, IORDER, @@ -1211,7 +1243,7 @@ SUBROUTINE DCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ REWIND NTRA CALL CDTRSM( IORDER, SIDE, UPLO, TRANSA, $ DIAG, M, N, ALPHA, AA, LDA, - $ BB, LDB ) + $ BB, LDB ) END IF * * Check if error-exit was taken incorrectly. @@ -1342,20 +1374,20 @@ SUBROUTINE DCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, 160 CONTINUE RETURN * -10003 FORMAT( ' ', A12,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ', +10003 FORMAT( ' ', A13,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ', $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', $ 'RATIO ', F8.2, ' - SUSPECT *******' ) -10002 FORMAT( ' ', A12,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ', +10002 FORMAT( ' ', A13,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ', $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', $ 'RATIO ', F8.2, ' - SUSPECT *******' ) -10001 FORMAT( ' ', A12,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS', +10001 FORMAT( ' ', A13,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS', $ ' (', I6, ' CALL', 'S)' ) -10000 FORMAT( ' ', A12,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS', +10000 FORMAT( ' ', A13,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS', $ ' (', I6, ' CALL', 'S)' ) 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', $ 'ANGED INCORRECTLY *******' ) - 9996 FORMAT( ' ******* ', A12,' FAILED ON CALL NUMBER:' ) - 9995 FORMAT( 1X, I6, ': ', A12,'(', 4( '''', A1, ''',' ), 2( I3, ',' ), + 9996 FORMAT( ' ******* ', A13,' FAILED ON CALL NUMBER:' ) + 9995 FORMAT( 1X, I6, ': ', A13,'(', 4( '''', A1, ''',' ), 2( I3, ',' ), $ F4.1, ', A,', I3, ', B,', I3, ') .' ) 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', $ '******' ) @@ -1363,13 +1395,16 @@ SUBROUTINE DCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * End of DCHK3. * END -* + +* ===================================================================== SUBROUTINE DPRCN3(NOUT, NC, SNAME, IORDER, SIDE, UPLO, TRANSA, $ DIAG, M, N, ALPHA, LDA, LDB) + IMPLICIT NONE + INTEGER NOUT, NC, IORDER, M, N, LDA, LDB DOUBLE PRECISION ALPHA CHARACTER*1 SIDE, UPLO, TRANSA, DIAG - CHARACTER*12 SNAME + CHARACTER*13 SNAME CHARACTER*14 CRC, CS, CU, CA, CD IF (SIDE.EQ.'L')THEN @@ -1402,14 +1437,16 @@ SUBROUTINE DPRCN3(NOUT, NC, SNAME, IORDER, SIDE, UPLO, TRANSA, WRITE(NOUT, FMT = 9995)NC,SNAME,CRC, CS,CU WRITE(NOUT, FMT = 9994)CA, CD, M, N, ALPHA, LDA, LDB - 9995 FORMAT( 1X, I6, ': ', A12,'(', A14, ',', A14, ',', A14, ',') + 9995 FORMAT( 1X, I6, ': ', A13,'(', A14, ',', A14, ',', A14, ',') 9994 FORMAT( 22X, 2( A14, ',') , 2( I3, ',' ), $ F4.1, ', A,', I3, ', B,', I3, ').' ) END -* + +* ===================================================================== SUBROUTINE DCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX, $ A, AA, AS, B, BB, BS, C, CC, CS, CT, G, IORDER) + IMPLICIT NONE * * Tests DSYRK. * @@ -1428,7 +1465,7 @@ SUBROUTINE DCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, DOUBLE PRECISION EPS, THRESH INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA, IORDER LOGICAL FATAL, REWI, TRACE - CHARACTER*12 SNAME + CHARACTER*13 SNAME * .. Array Arguments .. DOUBLE PRECISION A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ), $ AS( NMAX*NMAX ), B( NMAX, NMAX ), @@ -1456,9 +1493,9 @@ SUBROUTINE DCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, INTRINSIC MAX * .. Scalars in Common .. INTEGER INFOT, NOUTC - LOGICAL OK + LOGICAL LERR, OK * .. Common blocks .. - COMMON /INFOC/INFOT, NOUTC, OK + COMMON /INFOC/INFOT, NOUTC, OK, LERR * .. Data statements .. DATA ICHT/'NTC'/, ICHU/'UL'/ * .. Executable Statements .. @@ -1667,21 +1704,21 @@ SUBROUTINE DCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, 130 CONTINUE RETURN * -10003 FORMAT( ' ', A12,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ', +10003 FORMAT( ' ', A13,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ', $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', $ 'RATIO ', F8.2, ' - SUSPECT *******' ) -10002 FORMAT( ' ', A12,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ', +10002 FORMAT( ' ', A13,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ', $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', $ 'RATIO ', F8.2, ' - SUSPECT *******' ) -10001 FORMAT( ' ', A12,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS', +10001 FORMAT( ' ', A13,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS', $ ' (', I6, ' CALL', 'S)' ) -10000 FORMAT( ' ', A12,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS', +10000 FORMAT( ' ', A13,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS', $ ' (', I6, ' CALL', 'S)' ) 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', $ 'ANGED INCORRECTLY *******' ) - 9996 FORMAT( ' ******* ', A12,' FAILED ON CALL NUMBER:' ) + 9996 FORMAT( ' ******* ', A13,' FAILED ON CALL NUMBER:' ) 9995 FORMAT( ' THESE ARE THE RESULTS FOR COLUMN ', I3 ) - 9994 FORMAT( 1X, I6, ': ', A12,'(', 2( '''', A1, ''',' ), 2( I3, ',' ), + 9994 FORMAT( 1X, I6, ': ', A13,'(', 2( '''', A1, ''',' ), 2( I3, ',' ), $ F4.1, ', A,', I3, ',', F4.1, ', C,', I3, ') .' ) 9993 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', $ '******' ) @@ -1689,13 +1726,16 @@ SUBROUTINE DCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * End of DCHK4. * END -* + +* ===================================================================== SUBROUTINE DPRCN4(NOUT, NC, SNAME, IORDER, UPLO, TRANSA, $ N, K, ALPHA, LDA, BETA, LDC) + IMPLICIT NONE + INTEGER NOUT, NC, IORDER, N, K, LDA, LDC DOUBLE PRECISION ALPHA, BETA CHARACTER*1 UPLO, TRANSA - CHARACTER*12 SNAME + CHARACTER*13 SNAME CHARACTER*14 CRC, CU, CA IF (UPLO.EQ.'U')THEN @@ -1718,15 +1758,17 @@ SUBROUTINE DPRCN4(NOUT, NC, SNAME, IORDER, UPLO, TRANSA, WRITE(NOUT, FMT = 9995)NC, SNAME, CRC, CU, CA WRITE(NOUT, FMT = 9994)N, K, ALPHA, LDA, BETA, LDC - 9995 FORMAT( 1X, I6, ': ', A12,'(', 3( A14, ',') ) + 9995 FORMAT( 1X, I6, ': ', A13,'(', 3( A14, ',') ) 9994 FORMAT( 20X, 2( I3, ',' ), $ F4.1, ', A,', I3, ',', F4.1, ', C,', I3, ').' ) END -* + +* ===================================================================== SUBROUTINE DCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX, $ AB, AA, AS, BB, BS, C, CC, CS, CT, G, W, - $ IORDER ) + $ IORDER ) + IMPLICIT NONE * * Tests DSYR2K. * @@ -1745,7 +1787,7 @@ SUBROUTINE DCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, DOUBLE PRECISION EPS, THRESH INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA, IORDER LOGICAL FATAL, REWI, TRACE - CHARACTER*12 SNAME + CHARACTER*13 SNAME * .. Array Arguments .. DOUBLE PRECISION AA( NMAX*NMAX ), AB( 2*NMAX*NMAX ), $ ALF( NALF ), AS( NMAX*NMAX ), BB( NMAX*NMAX ), @@ -1773,9 +1815,9 @@ SUBROUTINE DCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, INTRINSIC MAX * .. Scalars in Common .. INTEGER INFOT, NOUTC - LOGICAL OK + LOGICAL LERR, OK * .. Common blocks .. - COMMON /INFOC/INFOT, NOUTC, OK + COMMON /INFOC/INFOT, NOUTC, OK, LERR * .. Data statements .. DATA ICHT/'NTC'/, ICHU/'UL'/ * .. Executable Statements .. @@ -1888,7 +1930,7 @@ SUBROUTINE DCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ REWIND NTRA CALL CDSYR2K( IORDER, UPLO, TRANS, N, K, $ ALPHA, AA, LDA, BB, LDB, BETA, - $ CC, LDC ) + $ CC, LDC ) * * Check if error-exit was taken incorrectly. * @@ -2023,21 +2065,21 @@ SUBROUTINE DCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, 160 CONTINUE RETURN * -10003 FORMAT( ' ', A12,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ', +10003 FORMAT( ' ', A13,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ', $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', $ 'RATIO ', F8.2, ' - SUSPECT *******' ) -10002 FORMAT( ' ', A12,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ', +10002 FORMAT( ' ', A13,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ', $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', $ 'RATIO ', F8.2, ' - SUSPECT *******' ) -10001 FORMAT( ' ', A12,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS', +10001 FORMAT( ' ', A13,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS', $ ' (', I6, ' CALL', 'S)' ) -10000 FORMAT( ' ', A12,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS', +10000 FORMAT( ' ', A13,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS', $ ' (', I6, ' CALL', 'S)' ) 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', $ 'ANGED INCORRECTLY *******' ) - 9996 FORMAT( ' ******* ', A12,' FAILED ON CALL NUMBER:' ) + 9996 FORMAT( ' ******* ', A13,' FAILED ON CALL NUMBER:' ) 9995 FORMAT( ' THESE ARE THE RESULTS FOR COLUMN ', I3 ) - 9994 FORMAT( 1X, I6, ': ', A12,'(', 2( '''', A1, ''',' ), 2( I3, ',' ), + 9994 FORMAT( 1X, I6, ': ', A13,'(', 2( '''', A1, ''',' ), 2( I3, ',' ), $ F4.1, ', A,', I3, ', B,', I3, ',', F4.1, ', C,', I3, ') ', $ ' .' ) 9993 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', @@ -2046,13 +2088,16 @@ SUBROUTINE DCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * End of DCHK5. * END -* + +* ===================================================================== SUBROUTINE DPRCN5(NOUT, NC, SNAME, IORDER, UPLO, TRANSA, $ N, K, ALPHA, LDA, LDB, BETA, LDC) + IMPLICIT NONE + INTEGER NOUT, NC, IORDER, N, K, LDA, LDB, LDC DOUBLE PRECISION ALPHA, BETA CHARACTER*1 UPLO, TRANSA - CHARACTER*12 SNAME + CHARACTER*13 SNAME CHARACTER*14 CRC, CU, CA IF (UPLO.EQ.'U')THEN @@ -2075,13 +2120,15 @@ SUBROUTINE DPRCN5(NOUT, NC, SNAME, IORDER, UPLO, TRANSA, WRITE(NOUT, FMT = 9995)NC, SNAME, CRC, CU, CA WRITE(NOUT, FMT = 9994)N, K, ALPHA, LDA, LDB, BETA, LDC - 9995 FORMAT( 1X, I6, ': ', A12,'(', 3( A14, ',') ) + 9995 FORMAT( 1X, I6, ': ', A13,'(', 3( A14, ',') ) 9994 FORMAT( 20X, 2( I3, ',' ), $ F4.1, ', A,', I3, ', B', I3, ',', F4.1, ', C,', I3, ').' ) END -* + +* ===================================================================== SUBROUTINE DMAKE( TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, RESET, $ TRANSL ) + IMPLICIT NONE * * Generates values for an M by N matrix A. * Stores the values in the array AA in the data structure required @@ -2193,9 +2240,12 @@ SUBROUTINE DMAKE( TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, RESET, * End of DMAKE. * END + +* ===================================================================== SUBROUTINE DMMCH( TRANSA, TRANSB, M, N, KK, ALPHA, A, LDA, B, LDB, $ BETA, C, LDC, CT, G, CC, LDCC, EPS, ERR, FATAL, $ NOUT, MV ) + IMPLICIT NONE * * Checks the results of the computational tests. * @@ -2315,7 +2365,10 @@ SUBROUTINE DMMCH( TRANSA, TRANSB, M, N, KK, ALPHA, A, LDA, B, LDB, * End of DMMCH. * END + +* ===================================================================== LOGICAL FUNCTION LDE( RI, RJ, LR ) + IMPLICIT NONE * * Tests if two arrays are identical. * @@ -2347,7 +2400,10 @@ LOGICAL FUNCTION LDE( RI, RJ, LR ) * End of LDE. * END + +* ===================================================================== LOGICAL FUNCTION LDERES( TYPE, UPLO, M, N, AA, AS, LDA ) + IMPLICIT NONE * * Tests if selected elements in two arrays are equal. * @@ -2409,7 +2465,10 @@ LOGICAL FUNCTION LDERES( TYPE, UPLO, M, N, AA, AS, LDA ) * End of LDERES. * END + +* ===================================================================== DOUBLE PRECISION FUNCTION DBEG( RESET ) + IMPLICIT NONE * * Generates random numbers uniformly distributed between -0.5 and 0.5. * @@ -2455,7 +2514,10 @@ DOUBLE PRECISION FUNCTION DBEG( RESET ) * End of DBEG. * END + +* ===================================================================== DOUBLE PRECISION FUNCTION DDIFF( X, Y ) + IMPLICIT NONE * * Auxiliary routine for test program for Level 3 Blas. * @@ -2474,3 +2536,482 @@ DOUBLE PRECISION FUNCTION DDIFF( X, Y ) * End of DDIFF. * END + +* ===================================================================== + SUBROUTINE DCHK6( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, + $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX, + $ A, AA, AS, B, BB, BS, C, CC, CS, CT, G, + $ IORDER) + IMPLICIT NONE +* +* Tests DGEMMTR. +* +* Auxiliary routine for test program for Level 3 Blas. +* +* -- Written on 19-July-2023. +* Martin Koehler, MPI Magdeburg +* +* .. Parameters .. + DOUBLE PRECISION ZERO + PARAMETER ( ZERO = 0.0D0 ) +* .. Scalar Arguments .. + DOUBLE PRECISION EPS, THRESH + INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA, IORDER + LOGICAL FATAL, REWI, TRACE + CHARACTER*13 SNAME +* .. Array Arguments .. + DOUBLE PRECISION A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ), + $ AS( NMAX*NMAX ), B( NMAX, NMAX ), + $ BB( NMAX*NMAX ), BET( NBET ), BS( NMAX*NMAX ), + $ C( NMAX, NMAX ), CC( NMAX*NMAX ), + $ CS( NMAX*NMAX ), CT( NMAX ), G( NMAX ) + INTEGER IDIM( NIDIM ) +* .. Local Scalars .. + DOUBLE PRECISION ALPHA, ALS, BETA, BLS, ERR, ERRMAX + INTEGER I, IA, IB, ICA, ICB, IK, IN, K, KS, LAA, + $ LBB, LCC, LDA, LDAS, LDB, LDBS, LDC, LDCS, + $ MA, MB, N, NA, NARGS, NB, NC, NS, IS + LOGICAL NULL, RESET, SAME, TRANA, TRANB + CHARACTER*1 TRANAS, TRANBS, TRANSA, TRANSB, UPLO, UPLOS + CHARACTER*3 ICH + CHARACTER*2 ISHAPE +* .. Local Arrays .. + LOGICAL ISAME( 13 ) +* .. External Functions .. + LOGICAL LDE, LDERES + EXTERNAL LDE, LDERES +* .. External Subroutines .. + EXTERNAL CDGEMMTR, DMAKE, DMMTCH +* .. Intrinsic Functions .. + INTRINSIC MAX +* .. Scalars in Common .. + INTEGER INFOT, NOUTC + LOGICAL LERR, OK +* .. Common blocks .. + COMMON /INFOC/INFOT, NOUTC, OK, LERR +* .. Data statements .. + DATA ICH/'NTC'/ + DATA ISHAPE/'UL'/ +* .. Executable Statements .. +* + NARGS = 13 + NC = 0 + RESET = .TRUE. + ERRMAX = ZERO +* + DO 100 IN = 1, NIDIM + N = IDIM( IN ) +* Set LDC to 1 more than minimum value if room. + LDC = N + IF( LDC.LT.NMAX ) + $ LDC = LDC + 1 +* Skip tests if not enough room. + IF( LDC.GT.NMAX ) + $ GO TO 100 + LCC = LDC*N + NULL = N.LE.0 +* + DO 90 IK = 1, NIDIM + K = IDIM( IK ) +* + DO 80 ICA = 1, 3 + TRANSA = ICH( ICA: ICA ) + TRANA = TRANSA.EQ.'T'.OR.TRANSA.EQ.'C' +* + IF( TRANA )THEN + MA = K + NA = N + ELSE + MA = N + NA = K + END IF +* Set LDA to 1 more than minimum value if room. + LDA = MA + IF( LDA.LT.NMAX ) + $ LDA = LDA + 1 +* Skip tests if not enough room. + IF( LDA.GT.NMAX ) + $ GO TO 80 + LAA = LDA*NA +* +* Generate the matrix A. +* + CALL DMAKE( 'GE', ' ', ' ', MA, NA, A, NMAX, AA, LDA, + $ RESET, ZERO ) +* + DO 70 ICB = 1, 3 + TRANSB = ICH( ICB: ICB ) + TRANB = TRANSB.EQ.'T'.OR.TRANSB.EQ.'C' +* + IF( TRANB )THEN + MB = N + NB = K + ELSE + MB = K + NB = N + END IF +* Set LDB to 1 more than minimum value if room. + LDB = MB + IF( LDB.LT.NMAX ) + $ LDB = LDB + 1 +* Skip tests if not enough room. + IF( LDB.GT.NMAX ) + $ GO TO 70 + LBB = LDB*NB +* +* Generate the matrix B. +* + CALL DMAKE( 'GE', ' ', ' ', MB, NB, B, NMAX, BB, + $ LDB, RESET, ZERO ) +* + DO 60 IA = 1, NALF + ALPHA = ALF( IA ) +* + DO 50 IB = 1, NBET + BETA = BET( IB ) + + DO 45 IS = 1, 2 + UPLO = ISHAPE( IS: IS ) + +* +* Generate the matrix C. +* + CALL DMAKE( 'GE', UPLO, ' ', N, N, C, + $ NMAX, CC, LDC, RESET, ZERO ) +* + NC = NC + 1 +* +* Save every datum before calling the +* subroutine. +* + UPLOS = UPLO + TRANAS = TRANSA + TRANBS = TRANSB + NS = N + KS = K + ALS = ALPHA + DO 10 I = 1, LAA + AS( I ) = AA( I ) + 10 CONTINUE + LDAS = LDA + DO 20 I = 1, LBB + BS( I ) = BB( I ) + 20 CONTINUE + LDBS = LDB + BLS = BETA + DO 30 I = 1, LCC + CS( I ) = CC( I ) + 30 CONTINUE + LDCS = LDC +* +* Call the subroutine. +* + IF( TRACE ) + $ CALL DPRCN8(NTRA, NC, SNAME, IORDER, UPLO, + $ TRANSA, TRANSB, N, K, ALPHA, LDA, + $ LDB, BETA, LDC) + IF( REWI ) + $ REWIND NTRA + CALL CDGEMMTR( IORDER, UPLO, TRANSA, TRANSB, + $ N, K, ALPHA, AA, LDA, BB, LDB, + $ BETA, CC, LDC ) +* +* Check if error-exit was taken incorrectly. +* + IF( .NOT.OK )THEN + WRITE( NOUT, FMT = 9994 ) + FATAL = .TRUE. + GO TO 120 + END IF +* +* See what data changed inside subroutines. +* + ISAME( 1 ) = UPLO.EQ.UPLOS + ISAME( 2 ) = TRANSA.EQ.TRANAS + ISAME( 3 ) = TRANSB.EQ.TRANBS + ISAME( 4 ) = NS.EQ.N + ISAME( 5 ) = KS.EQ.K + ISAME( 6 ) = ALS.EQ.ALPHA + ISAME( 7 ) = LDE( AS, AA, LAA ) + ISAME( 8 ) = LDAS.EQ.LDA + ISAME( 9 ) = LDE( BS, BB, LBB ) + ISAME( 10 ) = LDBS.EQ.LDB + ISAME( 11 ) = BLS.EQ.BETA + IF( NULL )THEN + ISAME( 12 ) = LDE( CS, CC, LCC ) + ELSE + ISAME( 12 ) = LDERES( 'GE', ' ', N, N, + $ CS, CC, LDC ) + END IF + ISAME( 13 ) = LDCS.EQ.LDC +* +* If data was incorrectly changed, report +* and return. +* + SAME = .TRUE. + DO 40 I = 1, NARGS + SAME = SAME.AND.ISAME( I ) + IF( .NOT.ISAME( I ) ) + $ WRITE( NOUT, FMT = 9998 )I + 40 CONTINUE + IF( .NOT.SAME )THEN + FATAL = .TRUE. + GO TO 120 + END IF +* + IF( .NOT.NULL )THEN +* +* Check the result. +* + CALL DMMTCH( UPLO, TRANSA, TRANSB, + $ N, K, + $ ALPHA, A, NMAX, B, NMAX, BETA, + $ C, NMAX, CT, G, CC, LDC, EPS, + $ ERR, FATAL, NOUT, .TRUE. ) + ERRMAX = MAX( ERRMAX, ERR ) +* If got really bad answer, report and +* return. + IF( FATAL ) + $ GO TO 120 + END IF +* + 45 CONTINUE +* + 50 CONTINUE +* + 60 CONTINUE +* + 70 CONTINUE +* + 80 CONTINUE +* + 90 CONTINUE +* + 100 CONTINUE +* +* +* Report result. +* + IF( ERRMAX.LT.THRESH )THEN + IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10000 )SNAME, NC + IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10001 )SNAME, NC + ELSE + IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10002 )SNAME, NC, ERRMAX + IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10003 )SNAME, NC, ERRMAX + END IF + GO TO 130 +* + 120 CONTINUE + WRITE( NOUT, FMT = 9996 )SNAME + CALL DPRCN8(NOUT, NC, SNAME, IORDER, UPLO, TRANSA, TRANSB, + $ N, K, ALPHA, LDA, LDB, BETA, LDC) +* + 130 CONTINUE + RETURN +* +10003 FORMAT( ' ', A13,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ', + $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', + $ 'RATIO ', F8.2, ' - SUSPECT *******' ) +10002 FORMAT( ' ', A13,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ', + $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', + $ 'RATIO ', F8.2, ' - SUSPECT *******' ) +10001 FORMAT( ' ', A13,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS', + $ ' (', I6, ' CALL', 'S)' ) +10000 FORMAT( ' ', A13,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS', + $ ' (', I6, ' CALL', 'S)' ) + 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', + $ 'ANGED INCORRECTLY *******' ) + 9997 FORMAT( ' ', A13, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, + $ ' C', 'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', + $ F8.2, ' - SUSPECT *******' ) + 9996 FORMAT( ' ******* ', A13, ' FAILED ON CALL NUMBER:' ) + 9995 FORMAT( 1X, I6, ': ', A13, '(''',A1, ''',''',A1, ''',''', A1, + $ ''',', 2( I3, ',' ), F4.1, ', A,', I3, ', B,', I3, ',', + $ F4.1, ', ', 'C,', I3, ').' ) + 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', + $ '******' ) +* +* End of DCHK6 +* + END + + +* ===================================================================== + SUBROUTINE DPRCN8(NOUT, NC, SNAME, IORDER, UPLO, + $ TRANSA, TRANSB, N, + $ K, ALPHA, LDA, LDB, BETA, LDC) + IMPLICIT NONE + + INTEGER NOUT, NC, IORDER, N, K, LDA, LDB, LDC + DOUBLE PRECISION ALPHA, BETA + CHARACTER*1 TRANSA, TRANSB, UPLO + CHARACTER*13 SNAME + CHARACTER*14 CRC, CTA,CTB,CUPLO + + IF (UPLO.EQ.'U') THEN + CUPLO = 'CblasUpper' + ELSE + CUPLO = 'CblasLower' + END IF + IF (TRANSA.EQ.'N')THEN + CTA = ' CblasNoTrans' + ELSE IF (TRANSA.EQ.'T')THEN + CTA = ' CblasTrans' + ELSE + CTA = 'CblasConjTrans' + END IF + IF (TRANSB.EQ.'N')THEN + CTB = ' CblasNoTrans' + ELSE IF (TRANSB.EQ.'T')THEN + CTB = ' CblasTrans' + ELSE + CTB = 'CblasConjTrans' + END IF + IF (IORDER.EQ.1)THEN + CRC = ' CblasRowMajor' + ELSE + CRC = ' CblasColMajor' + END IF + WRITE(NOUT, FMT = 9995)NC,SNAME,CRC, CUPLO, CTA,CTB + WRITE(NOUT, FMT = 9994)N, K, ALPHA, LDA, LDB, BETA, LDC + + 9995 FORMAT( 1X, I6, ': ', A13,'(', A14, ',', A14, ',', A14, ',', + $ A14, ',') + 9994 FORMAT( 10X, 2( I3, ',' ) ,' ', F4.1,' , A,', + $ I3, ', B,', I3, ', ', F4.1,' , C,', I3, ').' ) + END + +* ===================================================================== + SUBROUTINE DMMTCH( UPLO, TRANSA, TRANSB, N, KK, ALPHA, A, LDA, + $ B, LDB, BETA, C, LDC, CT, G, CC, LDCC, EPS, ERR, + $ FATAL, NOUT, MV ) + IMPLICIT NONE +* +* Checks the results of the computational tests. +* +* Auxiliary routine for test program for Level 3 Blas. (DGEMMTR) +* +* -- Written on 19-July-2023. +* Martin Koehler, MPI Magdeburg +* +* .. Parameters .. + DOUBLE PRECISION ZERO, ONE + PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0 ) +* .. Scalar Arguments .. + DOUBLE PRECISION ALPHA, BETA, EPS, ERR + INTEGER KK, LDA, LDB, LDC, LDCC, N, NOUT + LOGICAL FATAL, MV + CHARACTER*1 UPLO, TRANSA, TRANSB +* .. Array Arguments .. + DOUBLE PRECISION A( LDA, * ), B( LDB, * ), C( LDC, * ), + $ CC( LDCC, * ), CT( * ), G( * ) +* .. Local Scalars .. + DOUBLE PRECISION ERRI + INTEGER I, J, K, ISTART, ISTOP + LOGICAL TRANA, TRANB, UPPER +* .. Intrinsic Functions .. + INTRINSIC ABS, MAX, SQRT +* .. Executable Statements .. + UPPER = UPLO.EQ.'U' + TRANA = TRANSA.EQ.'T'.OR.TRANSA.EQ.'C' + TRANB = TRANSB.EQ.'T'.OR.TRANSB.EQ.'C' +* +* Compute expected result, one column at a time, in CT using data +* in A, B and C. +* Compute gauges in G. +* + ISTART = 1 + ISTOP = N + + DO 120 J = 1, N +* + IF ( UPPER ) THEN + ISTART = 1 + ISTOP = J + ELSE + ISTART = J + ISTOP = N + END IF + DO 10 I = ISTART, ISTOP + CT( I ) = ZERO + G( I ) = ZERO + 10 CONTINUE + IF( .NOT.TRANA.AND..NOT.TRANB )THEN + DO 30 K = 1, KK + DO 20 I = ISTART, ISTOP + CT( I ) = CT( I ) + A( I, K )*B( K, J ) + G( I ) = G( I ) + ABS( A( I, K ) )*ABS( B( K, J ) ) + 20 CONTINUE + 30 CONTINUE + ELSE IF( TRANA.AND..NOT.TRANB )THEN + DO 50 K = 1, KK + DO 40 I = ISTART, ISTOP + CT( I ) = CT( I ) + A( K, I )*B( K, J ) + G( I ) = G( I ) + ABS( A( K, I ) )*ABS( B( K, J ) ) + 40 CONTINUE + 50 CONTINUE + ELSE IF( .NOT.TRANA.AND.TRANB )THEN + DO 70 K = 1, KK + DO 60 I = ISTART, ISTOP + CT( I ) = CT( I ) + A( I, K )*B( J, K ) + G( I ) = G( I ) + ABS( A( I, K ) )*ABS( B( J, K ) ) + 60 CONTINUE + 70 CONTINUE + ELSE IF( TRANA.AND.TRANB )THEN + DO 90 K = 1, KK + DO 80 I = ISTART, ISTOP + CT( I ) = CT( I ) + A( K, I )*B( J, K ) + G( I ) = G( I ) + ABS( A( K, I ) )*ABS( B( J, K ) ) + 80 CONTINUE + 90 CONTINUE + END IF + DO 100 I = ISTART, ISTOP + CT( I ) = ALPHA*CT( I ) + BETA*C( I, J ) + G( I ) = ABS( ALPHA )*G( I ) + ABS( BETA )*ABS( C( I, J ) ) + 100 CONTINUE +* +* Compute the error ratio for this result. +* + ERR = ZERO + DO 110 I = ISTART, ISTOP + ERRI = ABS( CT( I ) - CC( I, J ) )/EPS + IF( G( I ).NE.ZERO ) + $ ERRI = ERRI/G( I ) + ERR = MAX( ERR, ERRI ) + IF( ERR*SQRT( EPS ).GE.ONE ) + $ GO TO 130 + 110 CONTINUE +* + 120 CONTINUE +* +* If the loop completes, all results are at least half accurate. + GO TO 150 +* +* Report fatal error. +* + 130 FATAL = .TRUE. + WRITE( NOUT, FMT = 9999 ) + DO 140 I = ISTART, ISTOP + IF( MV )THEN + WRITE( NOUT, FMT = 9998 )I, CT( I ), CC( I, J ) + ELSE + WRITE( NOUT, FMT = 9998 )I, CC( I, J ), CT( I ) + END IF + 140 CONTINUE + IF( N.GT.1 ) + $ WRITE( NOUT, FMT = 9997 )J +* + 150 CONTINUE + RETURN +* + 9999 FORMAT( ' ******* FATAL ERROR - COMPUTED RESULT IS LESS THAN HAL', + $ 'F ACCURATE *******', /' EXPECTED RESULT COMPU', + $ 'TED RESULT' ) + 9998 FORMAT( 1X, I7, 2G18.6 ) + 9997 FORMAT( ' THESE ARE THE RESULTS FOR COLUMN ', I3 ) +* +* End of DMMTCH +* + END + + diff --git a/CBLAS/testing/c_s2chke.c b/CBLAS/testing/c_s2chke.c index a781bd505f..81d4c2104e 100644 --- a/CBLAS/testing/c_s2chke.c +++ b/CBLAS/testing/c_s2chke.c @@ -3,34 +3,42 @@ #include "cblas.h" #include "cblas_test.h" -int cblas_ok, cblas_lerr, cblas_info; -int link_xerbla=TRUE; +CBLAS_INT cblas_ok, cblas_lerr, cblas_info; +CBLAS_INT link_xerbla=TRUE; char *cblas_rout; #ifdef F77_Char -void F77_xerbla(F77_Char F77_srname, void *vinfo); +void F77_xerbla(F77_Char F77_srname, void *vinfo #else -void F77_xerbla(char *srname, void *vinfo); +void F77_xerbla(char *srname, void *vinfo #endif +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN +#endif +); void chkxer(void) { - extern int cblas_ok, cblas_lerr, cblas_info; - extern int link_xerbla; + extern CBLAS_INT cblas_ok, cblas_lerr, cblas_info; + extern CBLAS_INT link_xerbla; extern char *cblas_rout; if (cblas_lerr == 1 ) { - printf("***** ILLEGAL VALUE OF PARAMETER NUMBER %d NOT DETECTED BY %s *****\n", cblas_info, cblas_rout); + printf("***** ILLEGAL VALUE OF PARAMETER NUMBER %d NOT DETECTED BY %s *****\n", (int) cblas_info, cblas_rout); cblas_ok = 0 ; } cblas_lerr = 1 ; } -void F77_s2chke(char *rout) { +void F77_s2chke(char *rout +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN rout_len +#endif +) { char *sf = ( rout ) ; float A[2] = {0.0,0.0}, X[2] = {0.0,0.0}, Y[2] = {0.0,0.0}, ALPHA=0.0, BETA=0.0; - extern int cblas_info, cblas_lerr, cblas_ok; + extern CBLAS_INT cblas_info, cblas_lerr, cblas_ok; extern int RowMajorStrg; extern char *cblas_rout; @@ -38,10 +46,11 @@ void F77_s2chke(char *rout) { if (link_xerbla) /* call these first to link */ { cblas_xerbla(cblas_info,cblas_rout,""); - F77_xerbla(cblas_rout,&cblas_info); + F77_xerbla(cblas_rout,&cblas_info, 1); } #endif + link_xerbla = 0; cblas_ok = TRUE ; cblas_lerr = PASSED ; diff --git a/CBLAS/testing/c_s3chke.c b/CBLAS/testing/c_s3chke.c index 425d6a7023..38b2bc1a3c 100644 --- a/CBLAS/testing/c_s3chke.c +++ b/CBLAS/testing/c_s3chke.c @@ -3,34 +3,43 @@ #include "cblas.h" #include "cblas_test.h" -int cblas_ok, cblas_lerr, cblas_info; -int link_xerbla=TRUE; +CBLAS_INT cblas_ok, cblas_lerr, cblas_info; +CBLAS_INT link_xerbla=TRUE; char *cblas_rout; #ifdef F77_Char -void F77_xerbla(F77_Char F77_srname, void *vinfo); +void F77_xerbla(F77_Char F77_srname, void *vinfo #else -void F77_xerbla(char *srname, void *vinfo); +void F77_xerbla(char *srname, void *vinfo #endif +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN srname_len +#endif +); void chkxer(void) { - extern int cblas_ok, cblas_lerr, cblas_info; - extern int link_xerbla; + extern CBLAS_INT cblas_ok, cblas_lerr, cblas_info; + extern CBLAS_INT link_xerbla; extern char *cblas_rout; if (cblas_lerr == 1 ) { - printf("***** ILLEGAL VALUE OF PARAMETER NUMBER %d NOT DETECTED BY %s *****\n", cblas_info, cblas_rout); + printf("***** ILLEGAL VALUE OF PARAMETER NUMBER %d NOT DETECTED BY %s *****\n", (int) cblas_info, cblas_rout); cblas_ok = 0 ; } cblas_lerr = 1 ; + } -void F77_s3chke(char *rout) { +void F77_s3chke(char *rout +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN rout_len +#endif +) { char *sf = ( rout ) ; float A[2] = {0.0,0.0}, B[2] = {0.0,0.0}, C[2] = {0.0,0.0}, ALPHA=0.0, BETA=0.0; - extern int cblas_info, cblas_lerr, cblas_ok; + extern CBLAS_INT cblas_info, cblas_lerr, cblas_ok; extern int RowMajorStrg; extern char *cblas_rout; @@ -38,14 +47,245 @@ void F77_s3chke(char *rout) { if (link_xerbla) /* call these first to link */ { cblas_xerbla(cblas_info,cblas_rout,""); - F77_xerbla(cblas_rout,&cblas_info); + F77_xerbla(cblas_rout,&cblas_info, 1); } #endif + link_xerbla = 0; cblas_ok = TRUE ; cblas_lerr = PASSED ; - if (strncmp( sf,"cblas_sgemm" ,11)==0) { + if (strncmp( sf,"cblas_sgemmtr" ,13)==0) { + cblas_rout = "cblas_sgemmtr" ; + + cblas_info = 1; + cblas_sgemmtr( INVALID, CblasUpper, CblasNoTrans, CblasNoTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 1; + cblas_sgemmtr( INVALID, CblasUpper, CblasNoTrans, CblasTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 1; + cblas_sgemmtr( INVALID, CblasUpper,CblasTrans, CblasNoTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 1; + cblas_sgemmtr( INVALID, CblasUpper, CblasTrans, CblasTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + cblas_info = 1; + cblas_sgemmtr( INVALID, CblasLower, CblasNoTrans, CblasNoTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 1; + cblas_sgemmtr( INVALID, CblasLower, CblasNoTrans, CblasTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 1; + cblas_sgemmtr( INVALID, CblasLower,CblasTrans, CblasNoTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 1; + cblas_sgemmtr( INVALID, CblasLower, CblasTrans, CblasTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + cblas_info = 2; RowMajorStrg = FALSE; + cblas_sgemmtr( CblasColMajor, INVALID, CblasNoTrans, CblasNoTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 2; RowMajorStrg = FALSE; + cblas_sgemmtr( CblasColMajor, INVALID, CblasNoTrans, CblasTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + cblas_info = 3; RowMajorStrg = FALSE; + cblas_sgemmtr( CblasColMajor, CblasUpper, INVALID, CblasNoTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 3; RowMajorStrg = FALSE; + cblas_sgemmtr( CblasColMajor, CblasUpper, INVALID, CblasTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + cblas_info = 4; RowMajorStrg = FALSE; + cblas_sgemmtr( CblasColMajor, CblasUpper, CblasNoTrans, INVALID, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 4; RowMajorStrg = FALSE; + cblas_sgemmtr( CblasColMajor, CblasUpper, CblasTrans, INVALID, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + + cblas_info = 5; RowMajorStrg = FALSE; + cblas_sgemmtr( CblasColMajor, CblasUpper, CblasNoTrans, CblasNoTrans, INVALID, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 5; RowMajorStrg = FALSE; + cblas_sgemmtr( CblasColMajor, CblasUpper, CblasNoTrans, CblasTrans, INVALID, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 5; RowMajorStrg = FALSE; + cblas_sgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasNoTrans, INVALID, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 5; RowMajorStrg = FALSE; + cblas_sgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasTrans, INVALID, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + cblas_info = 6; RowMajorStrg = FALSE; + cblas_sgemmtr( CblasColMajor, CblasUpper, CblasNoTrans, CblasNoTrans, 0, INVALID, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 6; RowMajorStrg = FALSE; + cblas_sgemmtr( CblasColMajor, CblasUpper, CblasNoTrans, CblasTrans, 0, INVALID, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 6; RowMajorStrg = FALSE; + cblas_sgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasNoTrans, 0, INVALID, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 6; RowMajorStrg = FALSE; + cblas_sgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasTrans, 0, INVALID, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + + cblas_info = 9; RowMajorStrg = FALSE; + cblas_sgemmtr( CblasColMajor, CblasUpper, CblasNoTrans, CblasNoTrans, 2, 0, + ALPHA, A, 1, B, 1, BETA, C, 2 ); + chkxer(); + cblas_info = 9; RowMajorStrg = FALSE; + cblas_sgemmtr( CblasColMajor, CblasUpper, CblasNoTrans, CblasTrans, 2, 0, + ALPHA, A, 1, B, 1, BETA, C, 2 ); + chkxer(); + cblas_info = 9; RowMajorStrg = FALSE; + cblas_sgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasNoTrans, 0, 2, + ALPHA, A, 1, B, 2, BETA, C, 1 ); + chkxer(); + cblas_info = 9; RowMajorStrg = FALSE; + cblas_sgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasTrans, 0, 2, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + cblas_info = 11; RowMajorStrg = FALSE; + cblas_sgemmtr( CblasColMajor, CblasUpper, CblasNoTrans, CblasNoTrans, 0, 2, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 11; RowMajorStrg = FALSE; + cblas_sgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasNoTrans, 0, 2, + ALPHA, A, 2, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 11; RowMajorStrg = FALSE; + cblas_sgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasTrans, 2, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + cblas_info = 14; RowMajorStrg = FALSE; + cblas_sgemmtr( CblasColMajor, CblasUpper, CblasNoTrans, CblasNoTrans, 2, 0, + ALPHA, A, 2, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 14; RowMajorStrg = FALSE; + cblas_sgemmtr( CblasColMajor, CblasUpper, CblasNoTrans, CblasTrans, 2, 0, + ALPHA, A, 2, B, 2, BETA, C, 1 ); + chkxer(); + + cblas_info = 14; RowMajorStrg = FALSE; + cblas_sgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasNoTrans, 2, 0, + ALPHA, A, 2, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 14; RowMajorStrg = FALSE; + cblas_sgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasTrans, 2, 0, + ALPHA, A, 2, B, 2, BETA, C, 1 ); + chkxer(); + + /* Row Major */ + cblas_info = 5; RowMajorStrg = TRUE; + cblas_sgemmtr( CblasRowMajor, CblasUpper, CblasNoTrans, CblasNoTrans, INVALID, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 5; RowMajorStrg = TRUE; + cblas_sgemmtr( CblasRowMajor, CblasUpper, CblasNoTrans, CblasTrans, INVALID, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 5; RowMajorStrg = TRUE; + cblas_sgemmtr( CblasRowMajor, CblasUpper, CblasTrans, CblasNoTrans, INVALID, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 5; RowMajorStrg = TRUE; + cblas_sgemmtr( CblasRowMajor, CblasUpper, CblasTrans, CblasTrans, INVALID, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + cblas_info = 6; RowMajorStrg = TRUE; + cblas_sgemmtr( CblasRowMajor, CblasUpper, CblasNoTrans, CblasNoTrans, 0, INVALID, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 6; RowMajorStrg = TRUE; + cblas_sgemmtr( CblasRowMajor, CblasUpper, CblasNoTrans, CblasTrans, 0, INVALID, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 6; RowMajorStrg = TRUE; + cblas_sgemmtr( CblasRowMajor, CblasUpper, CblasTrans, CblasNoTrans, 0, INVALID, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 6; RowMajorStrg = TRUE; + cblas_sgemmtr( CblasRowMajor, CblasUpper, CblasTrans, CblasTrans, 0, INVALID, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + cblas_info = 9; RowMajorStrg = TRUE; + cblas_sgemmtr( CblasRowMajor, CblasUpper, CblasNoTrans, CblasNoTrans, 0, 2, + ALPHA, A, 1, B, 1, BETA, C, 2 ); + chkxer(); + cblas_info = 9; RowMajorStrg = TRUE; + cblas_sgemmtr( CblasRowMajor, CblasUpper, CblasNoTrans, CblasTrans, 0, 2, + ALPHA, A, 1, B, 2, BETA, C, 2 ); + chkxer(); + cblas_info = 9; RowMajorStrg = TRUE; + cblas_sgemmtr( CblasRowMajor, CblasUpper, CblasTrans, CblasNoTrans, 2, 0, + ALPHA, A, 1, B, 2, BETA, C, 1 ); + chkxer(); + cblas_info = 9; RowMajorStrg = TRUE; + cblas_sgemmtr( CblasRowMajor, CblasUpper, CblasTrans, CblasTrans, 2, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + cblas_info = 11; RowMajorStrg = TRUE; + cblas_sgemmtr( CblasColMajor, CblasUpper, CblasNoTrans, CblasNoTrans, 0, 2, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 11; RowMajorStrg = TRUE; + cblas_sgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasNoTrans, 0, 2, + ALPHA, A, 2, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 11; RowMajorStrg = TRUE; + cblas_sgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasTrans, 2, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + cblas_info = 14; RowMajorStrg = TRUE; + cblas_sgemmtr( CblasRowMajor, CblasUpper, CblasNoTrans, CblasNoTrans, 2, 0, + ALPHA, A, 2, B, 2, BETA, C, 1 ); + chkxer(); + cblas_info = 14; RowMajorStrg = TRUE; + cblas_sgemmtr( CblasRowMajor, CblasUpper, CblasNoTrans, CblasTrans, 2, 0, + ALPHA, A, 2, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 14; RowMajorStrg = TRUE; + cblas_sgemmtr( CblasRowMajor, CblasUpper, CblasTrans, CblasNoTrans, 2, 0, + ALPHA, A, 2, B, 2, BETA, C, 1 ); + chkxer(); + cblas_info = 14; RowMajorStrg = TRUE; + cblas_sgemmtr( CblasRowMajor, CblasUpper, CblasTrans, CblasTrans, 2, 0, + ALPHA, A, 2, B, 2, BETA, C, 1 ); + chkxer(); + + } else if (strncmp( sf,"cblas_sgemm" ,11)==0) { cblas_rout = "cblas_sgemm" ; cblas_info = 1; cblas_sgemm( INVALID, CblasNoTrans, CblasNoTrans, 0, 0, 0, @@ -1269,7 +1509,7 @@ void F77_s3chke(char *rout) { chkxer(); } if (cblas_ok == TRUE ) - printf(" %-12s PASSED THE TESTS OF ERROR-EXITS\n", cblas_rout); + printf(" %-13s PASSED THE TESTS OF ERROR-EXITS\n", cblas_rout); else printf("***** %s FAILED THE TESTS OF ERROR-EXITS *******\n",cblas_rout); } diff --git a/CBLAS/testing/c_sblas1.c b/CBLAS/testing/c_sblas1.c index 2e63d98148..133944afbc 100644 --- a/CBLAS/testing/c_sblas1.c +++ b/CBLAS/testing/c_sblas1.c @@ -8,42 +8,50 @@ */ #include "cblas_test.h" #include "cblas.h" -float F77_sasum(const int *N, float *X, const int *incX) +float F77_sasum(const CBLAS_INT *N, float *X, const CBLAS_INT *incX) { return cblas_sasum(*N, X, *incX); } -void F77_saxpy(const int *N, const float *alpha, const float *X, - const int *incX, float *Y, const int *incY) +void F77_saxpy(const CBLAS_INT *N, const float *alpha, const float *X, + const CBLAS_INT *incX, float *Y, const CBLAS_INT *incY) { cblas_saxpy(*N, *alpha, X, *incX, Y, *incY); return; } -float F77_scasum(const int *N, void *X, const int *incX) +void F77_saxpby(const CBLAS_INT *N, const float *alpha, const float *X, + const CBLAS_INT *incX, const float *beta, float *Y, const CBLAS_INT *incY) +{ + cblas_saxpby(*N, *alpha, X, *incX, *beta, Y, *incY); + return; +} + + +float F77_scasum(const CBLAS_INT *N, void *X, const CBLAS_INT *incX) { return cblas_scasum(*N, X, *incX); } -float F77_scnrm2(const int *N, const void *X, const int *incX) +float F77_scnrm2(const CBLAS_INT *N, const void *X, const CBLAS_INT *incX) { return cblas_scnrm2(*N, X, *incX); } -void F77_scopy(const int *N, const float *X, const int *incX, - float *Y, const int *incY) +void F77_scopy(const CBLAS_INT *N, const float *X, const CBLAS_INT *incX, + float *Y, const CBLAS_INT *incY) { cblas_scopy(*N, X, *incX, Y, *incY); return; } -float F77_sdot(const int *N, const float *X, const int *incX, - const float *Y, const int *incY) +float F77_sdot(const CBLAS_INT *N, const float *X, const CBLAS_INT *incX, + const float *Y, const CBLAS_INT *incY) { return cblas_sdot(*N, X, *incX, Y, *incY); } -float F77_snrm2(const int *N, const float *X, const int *incX) +float F77_snrm2(const CBLAS_INT *N, const float *X, const CBLAS_INT *incX) { return cblas_snrm2(*N, X, *incX); } @@ -54,28 +62,28 @@ void F77_srotg( float *a, float *b, float *c, float *s) return; } -void F77_srot( const int *N, float *X, const int *incX, float *Y, - const int *incY, const float *c, const float *s) +void F77_srot( const CBLAS_INT *N, float *X, const CBLAS_INT *incX, float *Y, + const CBLAS_INT *incY, const float *c, const float *s) { cblas_srot(*N,X,*incX,Y,*incY,*c,*s); return; } -void F77_sscal(const int *N, const float *alpha, float *X, - const int *incX) +void F77_sscal(const CBLAS_INT *N, const float *alpha, float *X, + const CBLAS_INT *incX) { cblas_sscal(*N, *alpha, X, *incX); return; } -void F77_sswap( const int *N, float *X, const int *incX, - float *Y, const int *incY) +void F77_sswap( const CBLAS_INT *N, float *X, const CBLAS_INT *incX, + float *Y, const CBLAS_INT *incY) { cblas_sswap(*N,X,*incX,Y,*incY); return; } -int F77_isamax(const int *N, const float *X, const int *incX) +CBLAS_INT F77_isamax(const CBLAS_INT *N, const float *X, const CBLAS_INT *incX) { if (*N < 1 || *incX < 1) return(0); return (cblas_isamax(*N, X, *incX)+1); diff --git a/CBLAS/testing/c_sblas2.c b/CBLAS/testing/c_sblas2.c index f119504872..dd1a949ef9 100644 --- a/CBLAS/testing/c_sblas2.c +++ b/CBLAS/testing/c_sblas2.c @@ -8,12 +8,16 @@ #include "cblas.h" #include "cblas_test.h" -void F77_sgemv(int *layout, char *transp, int *m, int *n, float *alpha, - float *a, int *lda, float *x, int *incx, float *beta, - float *y, int *incy ) { +void F77_sgemv(CBLAS_INT *layout, char *transp, CBLAS_INT *m, CBLAS_INT *n, float *alpha, + float *a, CBLAS_INT *lda, float *x, CBLAS_INT *incx, float *beta, + float *y, CBLAS_INT *incy +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN transp_len +#endif +) { float *A; - int i,j,LDA; + CBLAS_INT i,j,LDA; CBLAS_TRANSPOSE trans; get_transpose_type(transp, &trans); @@ -35,11 +39,11 @@ void F77_sgemv(int *layout, char *transp, int *m, int *n, float *alpha, *m, *n, *alpha, a, *lda, x, *incx, *beta, y, *incy ); } -void F77_sger(int *layout, int *m, int *n, float *alpha, float *x, int *incx, - float *y, int *incy, float *a, int *lda ) { +void F77_sger(CBLAS_INT *layout, CBLAS_INT *m, CBLAS_INT *n, float *alpha, float *x, CBLAS_INT *incx, + float *y, CBLAS_INT *incy, float *a, CBLAS_INT *lda ) { float *A; - int i,j,LDA; + CBLAS_INT i,j,LDA; if (*layout == TEST_ROW_MJR) { LDA = *n+1; @@ -60,10 +64,14 @@ void F77_sger(int *layout, int *m, int *n, float *alpha, float *x, int *incx, cblas_sger( CblasColMajor, *m, *n, *alpha, x, *incx, y, *incy, a, *lda ); } -void F77_strmv(int *layout, char *uplow, char *transp, char *diagn, - int *n, float *a, int *lda, float *x, int *incx) { +void F77_strmv(CBLAS_INT *layout, char *uplow, char *transp, char *diagn, + CBLAS_INT *n, float *a, CBLAS_INT *lda, float *x, CBLAS_INT *incx +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len, FORTRAN_STRLEN transp_len, FORTRAN_STRLEN diagn_len +#endif +) { float *A; - int i,j,LDA; + CBLAS_INT i,j,LDA; CBLAS_TRANSPOSE trans; CBLAS_UPLO uplo; CBLAS_DIAG diag; @@ -88,10 +96,14 @@ void F77_strmv(int *layout, char *uplow, char *transp, char *diagn, } } -void F77_strsv(int *layout, char *uplow, char *transp, char *diagn, - int *n, float *a, int *lda, float *x, int *incx ) { +void F77_strsv(CBLAS_INT *layout, char *uplow, char *transp, char *diagn, + CBLAS_INT *n, float *a, CBLAS_INT *lda, float *x, CBLAS_INT *incx +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len, FORTRAN_STRLEN transp_len, FORTRAN_STRLEN diagn_len +#endif +) { float *A; - int i,j,LDA; + CBLAS_INT i,j,LDA; CBLAS_TRANSPOSE trans; CBLAS_UPLO uplo; CBLAS_DIAG diag; @@ -112,11 +124,15 @@ void F77_strsv(int *layout, char *uplow, char *transp, char *diagn, else cblas_strsv(CblasColMajor, uplo, trans, diag, *n, a, *lda, x, *incx ); } -void F77_ssymv(int *layout, char *uplow, int *n, float *alpha, float *a, - int *lda, float *x, int *incx, float *beta, float *y, - int *incy) { +void F77_ssymv(CBLAS_INT *layout, char *uplow, CBLAS_INT *n, float *alpha, float *a, + CBLAS_INT *lda, float *x, CBLAS_INT *incx, float *beta, float *y, + CBLAS_INT *incy +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len +#endif +) { float *A; - int i,j,LDA; + CBLAS_INT i,j,LDA; CBLAS_UPLO uplo; get_uplo_type(uplow,&uplo); @@ -136,10 +152,14 @@ void F77_ssymv(int *layout, char *uplow, int *n, float *alpha, float *a, *beta, y, *incy ); } -void F77_ssyr(int *layout, char *uplow, int *n, float *alpha, float *x, - int *incx, float *a, int *lda) { +void F77_ssyr(CBLAS_INT *layout, char *uplow, CBLAS_INT *n, float *alpha, float *x, + CBLAS_INT *incx, float *a, CBLAS_INT *lda +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len +#endif +) { float *A; - int i,j,LDA; + CBLAS_INT i,j,LDA; CBLAS_UPLO uplo; get_uplo_type(uplow,&uplo); @@ -160,10 +180,14 @@ void F77_ssyr(int *layout, char *uplow, int *n, float *alpha, float *x, cblas_ssyr(CblasColMajor, uplo, *n, *alpha, x, *incx, a, *lda); } -void F77_ssyr2(int *layout, char *uplow, int *n, float *alpha, float *x, - int *incx, float *y, int *incy, float *a, int *lda) { +void F77_ssyr2(CBLAS_INT *layout, char *uplow, CBLAS_INT *n, float *alpha, float *x, + CBLAS_INT *incx, float *y, CBLAS_INT *incy, float *a, CBLAS_INT *lda +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len +#endif +) { float *A; - int i,j,LDA; + CBLAS_INT i,j,LDA; CBLAS_UPLO uplo; get_uplo_type(uplow,&uplo); @@ -184,12 +208,16 @@ void F77_ssyr2(int *layout, char *uplow, int *n, float *alpha, float *x, cblas_ssyr2(CblasColMajor, uplo, *n, *alpha, x, *incx, y, *incy, a, *lda); } -void F77_sgbmv(int *layout, char *transp, int *m, int *n, int *kl, int *ku, - float *alpha, float *a, int *lda, float *x, int *incx, - float *beta, float *y, int *incy ) { +void F77_sgbmv(CBLAS_INT *layout, char *transp, CBLAS_INT *m, CBLAS_INT *n, CBLAS_INT *kl, CBLAS_INT *ku, + float *alpha, float *a, CBLAS_INT *lda, float *x, CBLAS_INT *incx, + float *beta, float *y, CBLAS_INT *incy +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN transp_len +#endif +) { float *A; - int i,irow,j,jcol,LDA; + CBLAS_INT i,irow,j,jcol,LDA; CBLAS_TRANSPOSE trans; get_transpose_type(transp, &trans); @@ -222,10 +250,14 @@ void F77_sgbmv(int *layout, char *transp, int *m, int *n, int *kl, int *ku, a, *lda, x, *incx, *beta, y, *incy ); } -void F77_stbmv(int *layout, char *uplow, char *transp, char *diagn, - int *n, int *k, float *a, int *lda, float *x, int *incx) { +void F77_stbmv(CBLAS_INT *layout, char *uplow, char *transp, char *diagn, + CBLAS_INT *n, CBLAS_INT *k, float *a, CBLAS_INT *lda, float *x, CBLAS_INT *incx +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len, FORTRAN_STRLEN transp_len, FORTRAN_STRLEN diagn_len +#endif +) { float *A; - int irow, jcol, i, j, LDA; + CBLAS_INT irow, jcol, i, j, LDA; CBLAS_TRANSPOSE trans; CBLAS_UPLO uplo; CBLAS_DIAG diag; @@ -268,10 +300,14 @@ void F77_stbmv(int *layout, char *uplow, char *transp, char *diagn, cblas_stbmv(CblasColMajor, uplo, trans, diag, *n, *k, a, *lda, x, *incx); } -void F77_stbsv(int *layout, char *uplow, char *transp, char *diagn, - int *n, int *k, float *a, int *lda, float *x, int *incx) { +void F77_stbsv(CBLAS_INT *layout, char *uplow, char *transp, char *diagn, + CBLAS_INT *n, CBLAS_INT *k, float *a, CBLAS_INT *lda, float *x, CBLAS_INT *incx +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len, FORTRAN_STRLEN transp_len, FORTRAN_STRLEN diagn_len +#endif +) { float *A; - int irow, jcol, i, j, LDA; + CBLAS_INT irow, jcol, i, j, LDA; CBLAS_TRANSPOSE trans; CBLAS_UPLO uplo; CBLAS_DIAG diag; @@ -314,11 +350,15 @@ void F77_stbsv(int *layout, char *uplow, char *transp, char *diagn, cblas_stbsv(CblasColMajor, uplo, trans, diag, *n, *k, a, *lda, x, *incx); } -void F77_ssbmv(int *layout, char *uplow, int *n, int *k, float *alpha, - float *a, int *lda, float *x, int *incx, float *beta, - float *y, int *incy) { +void F77_ssbmv(CBLAS_INT *layout, char *uplow, CBLAS_INT *n, CBLAS_INT *k, float *alpha, + float *a, CBLAS_INT *lda, float *x, CBLAS_INT *incx, float *beta, + float *y, CBLAS_INT *incy +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len +#endif +) { float *A; - int i,j,irow,jcol,LDA; + CBLAS_INT i,j,irow,jcol,LDA; CBLAS_UPLO uplo; get_uplo_type(uplow,&uplo); @@ -359,10 +399,14 @@ void F77_ssbmv(int *layout, char *uplow, int *n, int *k, float *alpha, *beta, y, *incy ); } -void F77_sspmv(int *layout, char *uplow, int *n, float *alpha, float *ap, - float *x, int *incx, float *beta, float *y, int *incy) { +void F77_sspmv(CBLAS_INT *layout, char *uplow, CBLAS_INT *n, float *alpha, float *ap, + float *x, CBLAS_INT *incx, float *beta, float *y, CBLAS_INT *incy +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len +#endif +) { float *A,*AP; - int i,j,k,LDA; + CBLAS_INT i,j,k,LDA; CBLAS_UPLO uplo; get_uplo_type(uplow,&uplo); @@ -396,10 +440,14 @@ void F77_sspmv(int *layout, char *uplow, int *n, float *alpha, float *ap, *incy ); } -void F77_stpmv(int *layout, char *uplow, char *transp, char *diagn, - int *n, float *ap, float *x, int *incx) { +void F77_stpmv(CBLAS_INT *layout, char *uplow, char *transp, char *diagn, + CBLAS_INT *n, float *ap, float *x, CBLAS_INT *incx +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len, FORTRAN_STRLEN transp_len, FORTRAN_STRLEN diagn_len +#endif +) { float *A, *AP; - int i, j, k, LDA; + CBLAS_INT i, j, k, LDA; CBLAS_TRANSPOSE trans; CBLAS_UPLO uplo; CBLAS_DIAG diag; @@ -435,10 +483,14 @@ void F77_stpmv(int *layout, char *uplow, char *transp, char *diagn, cblas_stpmv( CblasColMajor, uplo, trans, diag, *n, ap, x, *incx ); } -void F77_stpsv(int *layout, char *uplow, char *transp, char *diagn, - int *n, float *ap, float *x, int *incx) { +void F77_stpsv(CBLAS_INT *layout, char *uplow, char *transp, char *diagn, + CBLAS_INT *n, float *ap, float *x, CBLAS_INT *incx +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len, FORTRAN_STRLEN transp_len, FORTRAN_STRLEN diagn_len +#endif +) { float *A, *AP; - int i, j, k, LDA; + CBLAS_INT i, j, k, LDA; CBLAS_TRANSPOSE trans; CBLAS_UPLO uplo; CBLAS_DIAG diag; @@ -475,10 +527,14 @@ void F77_stpsv(int *layout, char *uplow, char *transp, char *diagn, cblas_stpsv( CblasColMajor, uplo, trans, diag, *n, ap, x, *incx ); } -void F77_sspr(int *layout, char *uplow, int *n, float *alpha, float *x, - int *incx, float *ap ){ +void F77_sspr(CBLAS_INT *layout, char *uplow, CBLAS_INT *n, float *alpha, float *x, + CBLAS_INT *incx, float *ap +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len +#endif +){ float *A, *AP; - int i,j,k,LDA; + CBLAS_INT i,j,k,LDA; CBLAS_UPLO uplo; get_uplo_type(uplow,&uplo); @@ -526,10 +582,14 @@ void F77_sspr(int *layout, char *uplow, int *n, float *alpha, float *x, cblas_sspr( CblasColMajor, uplo, *n, *alpha, x, *incx, ap ); } -void F77_sspr2(int *layout, char *uplow, int *n, float *alpha, float *x, - int *incx, float *y, int *incy, float *ap ){ +void F77_sspr2(CBLAS_INT *layout, char *uplow, CBLAS_INT *n, float *alpha, float *x, + CBLAS_INT *incx, float *y, CBLAS_INT *incy, float *ap +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len +#endif +){ float *A, *AP; - int i,j,k,LDA; + CBLAS_INT i,j,k,LDA; CBLAS_UPLO uplo; get_uplo_type(uplow,&uplo); diff --git a/CBLAS/testing/c_sblas3.c b/CBLAS/testing/c_sblas3.c index 024fc474fd..0aaa57d2d8 100644 --- a/CBLAS/testing/c_sblas3.c +++ b/CBLAS/testing/c_sblas3.c @@ -9,12 +9,16 @@ #include "cblas.h" #include "cblas_test.h" -void F77_sgemm(int *layout, char *transpa, char *transpb, int *m, int *n, - int *k, float *alpha, float *a, int *lda, float *b, int *ldb, - float *beta, float *c, int *ldc ) { +void F77_sgemm(CBLAS_INT *layout, char *transpa, char *transpb, CBLAS_INT *m, CBLAS_INT *n, + CBLAS_INT *k, float *alpha, float *a, CBLAS_INT *lda, float *b, CBLAS_INT *ldb, + float *beta, float *c, CBLAS_INT *ldc +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN transpa_len, FORTRAN_STRLEN transpb_len +#endif +) { float *A, *B, *C; - int i,j,LDA, LDB, LDC; + CBLAS_INT i,j,LDA, LDB, LDC; CBLAS_TRANSPOSE transa, transb; get_transpose_type(transpa, &transa); @@ -70,12 +74,92 @@ void F77_sgemm(int *layout, char *transpa, char *transpb, int *m, int *n, cblas_sgemm( UNDEFINED, transa, transb, *m, *n, *k, *alpha, a, *lda, b, *ldb, *beta, c, *ldc ); } -void F77_ssymm(int *layout, char *rtlf, char *uplow, int *m, int *n, - float *alpha, float *a, int *lda, float *b, int *ldb, - float *beta, float *c, int *ldc ) { + +void F77_sgemmtr(CBLAS_INT *layout, char *uplop, char *transpa, char *transpb, CBLAS_INT *n, + CBLAS_INT *k, float *alpha, float *a, CBLAS_INT *lda, + float *b, CBLAS_INT *ldb, float *beta, + float *c, CBLAS_INT *ldc ) { + + float *A, *B, *C; + CBLAS_INT i,j,LDA, LDB, LDC; + CBLAS_TRANSPOSE transa, transb; + CBLAS_UPLO uplo; + + get_transpose_type(transpa, &transa); + get_transpose_type(transpb, &transb); + get_uplo_type(uplop, &uplo); + + if (*layout == TEST_ROW_MJR) { + if (transa == CblasNoTrans) { + LDA = *k+1; + A=(float*)malloc((*n)*LDA*sizeof(float)); + for( i=0; i<*n; i++ ) + for( j=0; j<*k; j++ ) { + A[i*LDA+j]=a[j*(*lda)+i]; + } + } + else { + LDA = *n+1; + A=(float* )malloc(LDA*(*k)*sizeof(float)); + for( i=0; i<*k; i++ ) + for( j=0; j<*n; j++ ) { + A[i*LDA+j]=a[j*(*lda)+i]; + } + } + + if (transb == CblasNoTrans) { + LDB = *n+1; + B=(float* )malloc((*k)*LDB*sizeof(float) ); + for( i=0; i<*k; i++ ) + for( j=0; j<*n; j++ ) { + B[i*LDB+j]=b[j*(*ldb)+i]; + } + } + else { + LDB = *k+1; + B=(float* )malloc(LDB*(*n)*sizeof(float)); + for( i=0; i<*n; i++ ) + for( j=0; j<*k; j++ ) { + B[i*LDB+j]=b[j*(*ldb)+i]; + } + } + + LDC = *n+1; + C=(float* )malloc((*n)*LDC*sizeof(float)); + for( j=0; j<*n; j++ ) + for( i=0; i<*n; i++ ) { + C[i*LDC+j]=c[j*(*ldc)+i]; + } + cblas_sgemmtr( CblasRowMajor, uplo, transa, transb, *n, *k, *alpha, A, LDA, + B, LDB, *beta, C, LDC ); + for( j=0; j<*n; j++ ) + for( i=0; i<*n; i++ ) { + c[j*(*ldc)+i]=C[i*LDC+j]; + } + free(A); + free(B); + free(C); + } + else if (*layout == TEST_COL_MJR) + cblas_sgemmtr( CblasColMajor, uplo, transa, transb, *n, *k, *alpha, a, *lda, + b, *ldb, *beta, c, *ldc ); + else + cblas_sgemmtr( UNDEFINED, uplo, transa, transb, *n, *k, *alpha, a, *lda, + b, *ldb, *beta, c, *ldc ); +} + + + +void F77_ssymm(CBLAS_INT *layout, char *rtlf, char *uplow, CBLAS_INT *m, CBLAS_INT *n, + float *alpha, float *a, CBLAS_INT *lda, float *b, CBLAS_INT *ldb, + float *beta, float *c, CBLAS_INT *ldc +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN rtlf_len, FORTRAN_STRLEN uplow_len +#endif +) { float *A, *B, *C; - int i,j,LDA, LDB, LDC; + CBLAS_INT i,j,LDA, LDB, LDC; CBLAS_UPLO uplo; CBLAS_SIDE side; @@ -124,11 +208,15 @@ void F77_ssymm(int *layout, char *rtlf, char *uplow, int *m, int *n, *beta, c, *ldc ); } -void F77_ssyrk(int *layout, char *uplow, char *transp, int *n, int *k, - float *alpha, float *a, int *lda, - float *beta, float *c, int *ldc ) { +void F77_ssyrk(CBLAS_INT *layout, char *uplow, char *transp, CBLAS_INT *n, CBLAS_INT *k, + float *alpha, float *a, CBLAS_INT *lda, + float *beta, float *c, CBLAS_INT *ldc +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len, FORTRAN_STRLEN transp_len +#endif +) { - int i,j,LDA,LDC; + CBLAS_INT i,j,LDA,LDC; float *A, *C; CBLAS_UPLO uplo; CBLAS_TRANSPOSE trans; @@ -172,10 +260,14 @@ void F77_ssyrk(int *layout, char *uplow, char *transp, int *n, int *k, c, *ldc ); } -void F77_ssyr2k(int *layout, char *uplow, char *transp, int *n, int *k, - float *alpha, float *a, int *lda, float *b, int *ldb, - float *beta, float *c, int *ldc ) { - int i,j,LDA,LDB,LDC; +void F77_ssyr2k(CBLAS_INT *layout, char *uplow, char *transp, CBLAS_INT *n, CBLAS_INT *k, + float *alpha, float *a, CBLAS_INT *lda, float *b, CBLAS_INT *ldb, + float *beta, float *c, CBLAS_INT *ldc +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len, FORTRAN_STRLEN transp_len +#endif +) { + CBLAS_INT i,j,LDA,LDB,LDC; float *A, *B, *C; CBLAS_UPLO uplo; CBLAS_TRANSPOSE trans; @@ -227,10 +319,14 @@ void F77_ssyr2k(int *layout, char *uplow, char *transp, int *n, int *k, cblas_ssyr2k(UNDEFINED, uplo, trans, *n, *k, *alpha, a, *lda, b, *ldb, *beta, c, *ldc ); } -void F77_strmm(int *layout, char *rtlf, char *uplow, char *transp, char *diagn, - int *m, int *n, float *alpha, float *a, int *lda, float *b, - int *ldb) { - int i,j,LDA,LDB; +void F77_strmm(CBLAS_INT *layout, char *rtlf, char *uplow, char *transp, char *diagn, + CBLAS_INT *m, CBLAS_INT *n, float *alpha, float *a, CBLAS_INT *lda, float *b, + CBLAS_INT *ldb +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN rtlf_len, FORTRAN_STRLEN uplow_len, FORTRAN_STRLEN transp_len, FORTRAN_STRLEN diagn_len +#endif +) { + CBLAS_INT i,j,LDA,LDB; float *A, *B; CBLAS_SIDE side; CBLAS_DIAG diag; @@ -278,10 +374,14 @@ void F77_strmm(int *layout, char *rtlf, char *uplow, char *transp, char *diagn, a, *lda, b, *ldb); } -void F77_strsm(int *layout, char *rtlf, char *uplow, char *transp, char *diagn, - int *m, int *n, float *alpha, float *a, int *lda, float *b, - int *ldb) { - int i,j,LDA,LDB; +void F77_strsm(CBLAS_INT *layout, char *rtlf, char *uplow, char *transp, char *diagn, + CBLAS_INT *m, CBLAS_INT *n, float *alpha, float *a, CBLAS_INT *lda, float *b, + CBLAS_INT *ldb +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN rtlf_len, FORTRAN_STRLEN uplow_len, FORTRAN_STRLEN transp_len, FORTRAN_STRLEN diagn_len +#endif +) { + CBLAS_INT i,j,LDA,LDB; float *A, *B; CBLAS_SIDE side; CBLAS_DIAG diag; diff --git a/CBLAS/testing/c_sblat1.f b/CBLAS/testing/c_sblat1.f index 89902f12d9..44e24e5d0b 100644 --- a/CBLAS/testing/c_sblat1.f +++ b/CBLAS/testing/c_sblat1.f @@ -1,4 +1,6 @@ +* ===================================================================== PROGRAM SCBLAT1 + IMPLICIT NONE * Test program for the REAL Level 1 CBLAS. * Based upon the original CBLAS test routine together with: * F06EAF Example Program Text @@ -19,7 +21,7 @@ PROGRAM SCBLAT1 DATA SFAC/9.765625E-4/ * .. Executable Statements .. WRITE (NOUT,99999) - DO 20 IC = 1, 10 + DO 20 IC = 1, 11 ICASE = IC CALL HEADER * @@ -38,7 +40,7 @@ PROGRAM SCBLAT1 + ICASE.EQ.10) THEN CALL CHECK1(SFAC) ELSE IF (ICASE.EQ.1 .OR. ICASE.EQ.2 .OR. ICASE.EQ.5 .OR. - + ICASE.EQ.6) THEN + + ICASE.EQ.6 .OR. ICASE.EQ.11) THEN CALL CHECK2(SFAC) ELSE IF (ICASE.EQ.4) THEN CALL CHECK3(SFAC) @@ -51,7 +53,10 @@ PROGRAM SCBLAT1 99999 FORMAT (' Real CBLAS Test Program Results',/1X) 99998 FORMAT (' ----- PASS -----') END + +* ===================================================================== SUBROUTINE HEADER + IMPLICIT NONE * .. Parameters .. INTEGER NOUT PARAMETER (NOUT=6) @@ -59,7 +64,7 @@ SUBROUTINE HEADER INTEGER ICASE, INCX, INCY, MODE, N LOGICAL PASS * .. Local Arrays .. - CHARACTER*15 L(10) + CHARACTER*15 L(11) * .. Common blocks .. COMMON /COMBLA/ICASE, N, INCX, INCY, MODE, PASS * .. Data statements .. @@ -73,13 +78,18 @@ SUBROUTINE HEADER DATA L(8)/'CBLAS_SASUM '/ DATA L(9)/'CBLAS_SSCAL '/ DATA L(10)/'CBLAS_ISAMAX'/ + DATA L(11)/'CBLAS_SAXPBY'/ + * .. Executable Statements .. WRITE (NOUT,99999) ICASE, L(ICASE) RETURN * 99999 FORMAT (/' Test of subprogram number',I3,9X,A15) END + +* ===================================================================== SUBROUTINE CHECK0(SFAC) + IMPLICIT NONE * .. Parameters .. INTEGER NOUT PARAMETER (NOUT=6) @@ -140,7 +150,10 @@ SUBROUTINE CHECK0(SFAC) 20 CONTINUE 40 RETURN END + +* ===================================================================== SUBROUTINE CHECK1(SFAC) + IMPLICIT NONE * .. Parameters .. INTEGER NOUT PARAMETER (NOUT=6) @@ -234,7 +247,10 @@ SUBROUTINE CHECK1(SFAC) 80 CONTINUE RETURN END + +* ===================================================================== SUBROUTINE CHECK2(SFAC) + IMPLICIT NONE * .. Parameters .. INTEGER NOUT PARAMETER (NOUT=6) @@ -244,25 +260,27 @@ SUBROUTINE CHECK2(SFAC) INTEGER ICASE, INCX, INCY, MODE, N LOGICAL PASS * .. Local Scalars .. - REAL SA + REAL SA, SB INTEGER I, J, KI, KN, KSIZE, LENX, LENY, MX, MY * .. Local Arrays .. REAL DT10X(7,4,4), DT10Y(7,4,4), DT7(4,4), + DT8(7,4,4), DX1(7), + DY1(7), SSIZE1(4), SSIZE2(14,2), STX(7), STY(7), - + SX(7), SY(7) + + SX(7), SY(7), DT20(7,4,4) INTEGER INCXS(4), INCYS(4), LENS(4,2), NS(4) * .. External Functions .. REAL SDOTTEST EXTERNAL SDOTTEST * .. External Subroutines .. EXTERNAL SAXPYTEST, SCOPYTEST, SSWAPTEST, STEST, STEST1 + + SAXPBYTEST * .. Intrinsic Functions .. INTRINSIC ABS, MIN * .. Common blocks .. COMMON /COMBLA/ICASE, N, INCX, INCY, MODE, PASS * .. Data statements .. DATA SA/0.3E0/ + DATA SB/0.5E0/ DATA INCXS/1, 2, -2, -1/ DATA INCYS/1, -2, 1, -2/ DATA LENS/1, 1, 2, 4, 1, 1, 3, 7/ @@ -335,6 +353,26 @@ SUBROUTINE CHECK2(SFAC) + 0.0E0, 1.17E0, 1.17E0, 1.17E0, 1.17E0, 1.17E0, + 1.17E0, 1.17E0, 1.17E0, 1.17E0, 1.17E0, 1.17E0, + 1.17E0, 1.17E0, 1.17E0/ + DATA DT20/0.5E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, + + 0.0E0, 0.43E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, + + 0.0E0, 0.0E0, 0.43E0, -0.42E0, 0.0E0, 0.0E0, + + 0.0E0, 0.0E0, 0.0E0, 0.43E0, -0.42E0, 0.0E0, + + 0.59E0, 0.0E0, 0.0E0, 0.0E0, 0.5E0, 0.0E0, + + 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.43E0, + + 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, + + 0.1E0, -0.9E0, 0.33E0, 0.0E0, 0.0E0, 0.0E0, + + 0.0E0, 0.13E0, -0.9E0, 0.42E0, 0.7E0, -0.45E0, + + 0.2E0, 0.58E0, 0.5E0, 0.0E0, 0.0E0, 0.0E0, + + 0.0E0, 0.0E0, 0.0E0, 0.43E0, 0.0E0, 0.0E0, + + 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.1E0, -0.27E0, + + 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.13E0, + + -0.18E0, 0.00E0, 0.53E0, 0.0E0, 0.0E0, 0.0E0, + + 0.5E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, + + 0.43E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, + + 0.0E0, 0.43E0, -0.9E0, 0.18E0, 0.0E0, 0.0E0, + + 0.0E0, 0.0E0, 0.43E0, -0.9E0, 0.18E0, 0.7E0, + + -0.45E0, 0.2E0, 0.64E0/ + * .. Executable Statements .. * DO 120 KI = 1, 4 @@ -365,6 +403,13 @@ SUBROUTINE CHECK2(SFAC) STY(J) = DT8(J,KN,KI) 40 CONTINUE CALL STEST(LENY,SY,STY,SSIZE2(1,KSIZE),SFAC) + ELSE IF (ICASE.EQ.11) THEN +* .. SAXPBYTEST .. + CALL SAXPBYTEST(N,SA,SX,INCX,SB,SY,INCY) + DO 50 J = 1, LENY + STY(J) = DT20(J,KN,KI) + 50 CONTINUE + CALL STEST(LENY,SY,STY,SSIZE2(1,KSIZE),SFAC) ELSE IF (ICASE.EQ.5) THEN * .. SCOPYTEST .. DO 60 I = 1, 7 @@ -389,7 +434,10 @@ SUBROUTINE CHECK2(SFAC) 120 CONTINUE RETURN END + +* ===================================================================== SUBROUTINE CHECK3(SFAC) + IMPLICIT NONE * .. Parameters .. INTEGER NOUT PARAMETER (NOUT=6) @@ -595,7 +643,10 @@ SUBROUTINE CHECK3(SFAC) 200 CONTINUE RETURN END + +* ===================================================================== SUBROUTINE STEST(LEN,SCOMP,STRUE,SSIZE,SFAC) + IMPLICIT NONE * ********************************* STEST ************************** * * THIS SUBR COMPARES ARRAYS SCOMP() AND STRUE() OF LENGTH LEN TO @@ -650,7 +701,10 @@ SUBROUTINE STEST(LEN,SCOMP,STRUE,SSIZE,SFAC) + ' SIZE(I)',/1X) 99997 FORMAT (1X,I4,I3,3I5,I3,2E36.8,2E12.4) END + +* ===================================================================== SUBROUTINE STEST1(SCOMP1,STRUE1,SSIZE,SFAC) + IMPLICIT NONE * ************************* STEST1 ***************************** * * THIS IS AN INTERFACE SUBROUTINE TO ACCOMMODATE THE FORTRAN @@ -675,7 +729,10 @@ SUBROUTINE STEST1(SCOMP1,STRUE1,SSIZE,SFAC) * RETURN END + +* ===================================================================== REAL FUNCTION SDIFF(SA,SB) + IMPLICIT NONE * ********************************* SDIFF ************************** * COMPUTES DIFFERENCE OF TWO NUMBERS. C. L. LAWSON, JPL 1974 FEB 15 * @@ -685,7 +742,10 @@ REAL FUNCTION SDIFF(SA,SB) SDIFF = SA - SB RETURN END + +* ===================================================================== SUBROUTINE ITEST1(ICOMP,ITRUE) + IMPLICIT NONE * ********************************* ITEST1 ************************* * * THIS SUBROUTINE COMPARES THE VARIABLES ICOMP AND ITRUE FOR diff --git a/CBLAS/testing/c_sblat2.f b/CBLAS/testing/c_sblat2.f index 8bd23c3e9d..7219a30e11 100644 --- a/CBLAS/testing/c_sblat2.f +++ b/CBLAS/testing/c_sblat2.f @@ -1,4 +1,6 @@ +* ===================================================================== PROGRAM SBLAT2 + IMPLICIT NONE * * Test program for the REAL Level 2 Blas. * @@ -453,10 +455,13 @@ PROGRAM SBLAT2 * End of SBLAT2. * END + +* ===================================================================== SUBROUTINE SCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF, NBET, $ BET, NINC, INC, NMAX, INCMAX, A, AA, AS, X, XX, $ XS, Y, YY, YS, YT, G, IORDER ) + IMPLICIT NONE * * Tests SGEMV and SGBMV. * @@ -813,10 +818,13 @@ SUBROUTINE SCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * End of SCHK1. * END + +* ===================================================================== SUBROUTINE SCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF, NBET, $ BET, NINC, INC, NMAX, INCMAX, A, AA, AS, X, XX, $ XS, Y, YY, YS, YT, G, IORDER ) + IMPLICIT NONE * * Tests SSYMV, SSBMV and SSPMV. * @@ -1173,9 +1181,12 @@ SUBROUTINE SCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * End of SCHK2. * END + +* ===================================================================== SUBROUTINE SCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NKB, KB, NINC, INC, NMAX, $ INCMAX, A, AA, AS, X, XX, XS, XT, G, Z, IORDER ) + IMPLICIT NONE * * Tests STRMV, STBMV, STPMV, STRSV, STBSV and STPSV. * @@ -1560,10 +1571,13 @@ SUBROUTINE SCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * End of SCHK3. * END + +* ===================================================================== SUBROUTINE SCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX, $ INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G, $ Z, IORDER ) + IMPLICIT NONE * * Tests SGER. * @@ -1832,10 +1846,13 @@ SUBROUTINE SCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * End of SCHK4. * END + +* ===================================================================== SUBROUTINE SCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX, $ INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G, $ Z, IORDER ) + IMPLICIT NONE * * Tests SSYR and SSPR. * @@ -2128,10 +2145,13 @@ SUBROUTINE SCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * End of SCHK5. * END + +* ===================================================================== SUBROUTINE SCHK6( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX, $ INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G, $ Z, IORDER ) + IMPLICIT NONE * * Tests SSYR2 and SSPR2. * @@ -2460,8 +2480,11 @@ SUBROUTINE SCHK6( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * End of SCHK6. * END + +* ===================================================================== SUBROUTINE SMAKE( TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, KL, $ KU, RESET, TRANSL ) + IMPLICIT NONE * * Generates values for an M by N matrix A within the bandwidth * defined by KL and KU. @@ -2636,8 +2659,11 @@ SUBROUTINE SMAKE( TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, KL, * End of SMAKE. * END + +* ===================================================================== SUBROUTINE SMVCH( TRANS, M, N, ALPHA, A, NMAX, X, INCX, BETA, Y, $ INCY, YT, G, YY, EPS, ERR, FATAL, NOUT, MV ) + IMPLICIT NONE * * Checks the results of the computational tests. * @@ -2753,7 +2779,10 @@ SUBROUTINE SMVCH( TRANS, M, N, ALPHA, A, NMAX, X, INCX, BETA, Y, * End of SMVCH. * END + +* ===================================================================== LOGICAL FUNCTION LSE( RI, RJ, LR ) + IMPLICIT NONE * * Tests if two arrays are identical. * @@ -2783,7 +2812,10 @@ LOGICAL FUNCTION LSE( RI, RJ, LR ) * End of LSE. * END + +* ===================================================================== LOGICAL FUNCTION LSERES( TYPE, UPLO, M, N, AA, AS, LDA ) + IMPLICIT NONE * * Tests if selected elements in two arrays are equal. * @@ -2843,7 +2875,10 @@ LOGICAL FUNCTION LSERES( TYPE, UPLO, M, N, AA, AS, LDA ) * End of LSERES. * END + +* ===================================================================== REAL FUNCTION SBEG( RESET ) + IMPLICIT NONE * * Generates random numbers uniformly distributed between -0.5 and 0.5. * @@ -2889,7 +2924,10 @@ REAL FUNCTION SBEG( RESET ) * End of SBEG. * END + +* ===================================================================== REAL FUNCTION SDIFF( X, Y ) + IMPLICIT NONE * * Auxiliary routine for test program for Level 2 Blas. * diff --git a/CBLAS/testing/c_sblat3.f b/CBLAS/testing/c_sblat3.f index 31babd9a12..f9277655ac 100644 --- a/CBLAS/testing/c_sblat3.f +++ b/CBLAS/testing/c_sblat3.f @@ -1,10 +1,11 @@ PROGRAM SBLAT3 + IMPLICIT NONE * * Test program for the REAL Level 3 Blas. * * The program must be driven by a short data file. The first 13 records * of the file are read using list-directed input, the last 6 records -* are read using the format ( A12, L2 ). An annotated example of a data +* are read using the format ( A13, L2 ). An annotated example of a data * file can be obtained by deleting the first 3 characters from the * following 19 lines: * 'SBLAT3.SNAP' NAME OF SNAPSHOT OUTPUT FILE @@ -20,12 +21,14 @@ PROGRAM SBLAT3 * 0.0 1.0 0.7 VALUES OF ALPHA * 3 NUMBER OF VALUES OF BETA * 0.0 1.0 1.3 VALUES OF BETA -* cblas_sgemm T PUT F FOR NO TEST. SAME COLUMNS. -* cblas_ssymm T PUT F FOR NO TEST. SAME COLUMNS. -* cblas_strmm T PUT F FOR NO TEST. SAME COLUMNS. -* cblas_strsm T PUT F FOR NO TEST. SAME COLUMNS. -* cblas_ssyrk T PUT F FOR NO TEST. SAME COLUMNS. -* cblas_ssyr2k T PUT F FOR NO TEST. SAME COLUMNS. +* cblas_sgemm T PUT F FOR NO TEST. SAME COLUMNS. +* cblas_ssymm T PUT F FOR NO TEST. SAME COLUMNS. +* cblas_strmm T PUT F FOR NO TEST. SAME COLUMNS. +* cblas_strsm T PUT F FOR NO TEST. SAME COLUMNS. +* cblas_ssyrk T PUT F FOR NO TEST. SAME COLUMNS. +* cblas_ssyr2k T PUT F FOR NO TEST. SAME COLUMNS. +* cblas_sgemmtr T PUT F FOR NO TEST. SAME COLUMNS. + * * See: * @@ -46,7 +49,7 @@ PROGRAM SBLAT3 INTEGER NIN, NOUT PARAMETER ( NIN = 5, NOUT = 6 ) INTEGER NSUBS - PARAMETER ( NSUBS = 6 ) + PARAMETER ( NSUBS = 7 ) REAL ZERO, HALF, ONE PARAMETER ( ZERO = 0.0, HALF = 0.5, ONE = 1.0 ) INTEGER NMAX @@ -60,7 +63,7 @@ PROGRAM SBLAT3 LOGICAL FATAL, LTESTT, REWI, SAME, SFATAL, TRACE, $ TSTERR, CORDER, RORDER CHARACTER*1 TRANSA, TRANSB - CHARACTER*12 SNAMET + CHARACTER*13 SNAMET CHARACTER*32 SNAPS * .. Local Arrays .. REAL AA( NMAX*NMAX ), AB( NMAX, 2*NMAX ), @@ -71,27 +74,27 @@ PROGRAM SBLAT3 $ G( NMAX ), W( 2*NMAX ) INTEGER IDIM( NIDMAX ) LOGICAL LTEST( NSUBS ) - CHARACTER*12 SNAMES( NSUBS ) + CHARACTER*13 SNAMES( NSUBS ) * .. External Functions .. REAL SDIFF LOGICAL LSE EXTERNAL SDIFF, LSE * .. External Subroutines .. EXTERNAL SCHK1, SCHK2, SCHK3, SCHK4, SCHK5, CS3CHKE, - $ SMMCH + $ SMMCH, SCHK6 * .. Intrinsic Functions .. INTRINSIC MAX, MIN * .. Scalars in Common .. INTEGER INFOT, NOUTC - LOGICAL OK - CHARACTER*12 SRNAMT + LOGICAL LERR, OK + CHARACTER*13 SRNAMT * .. Common blocks .. - COMMON /INFOC/INFOT, NOUTC, OK + COMMON /INFOC/INFOT, NOUTC, OK, LERR COMMON /SRNAMC/SRNAMT * .. Data statements .. DATA SNAMES/'cblas_sgemm ', 'cblas_ssymm ', $ 'cblas_strmm ', 'cblas_strsm ','cblas_ssyrk ', - $ 'cblas_ssyr2k'/ + $ 'cblas_ssyr2k', 'cblas_sgemmtr'/ * .. Executable Statements .. * NOUTC = NOUT @@ -288,7 +291,7 @@ PROGRAM SBLAT3 INFOT = 0 OK = .TRUE. FATAL = .FALSE. - GO TO ( 140, 150, 160, 160, 170, 180 )ISNUM + GO TO ( 140, 150, 160, 160, 170, 180, 185 )ISNUM * Test SGEMM, 01. 140 IF (CORDER) THEN CALL SCHK1( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE, @@ -359,8 +362,23 @@ PROGRAM SBLAT3 $ 1 ) END IF GO TO 190 +* Test SGEMMTR, 07. + 185 IF (CORDER) THEN + CALL SCHK6( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE, + $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, + $ NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C, + $ CC, CS, CT, G, 0 ) + END IF + IF (RORDER) THEN + CALL SCHK6( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE, + $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, + $ NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C, + $ CC, CS, CT, G, 1 ) + END IF + GO TO 190 * - 190 IF( FATAL.AND.SFATAL ) + + 190 IF( FATAL.AND.SFATAL ) $ GO TO 210 END IF 200 CONTINUE @@ -396,7 +414,7 @@ PROGRAM SBLAT3 9992 FORMAT( ' FOR BETA ', 7F6.1 ) 9991 FORMAT( ' AMEND DATA FILE OR INCREASE ARRAY SIZES IN PROGRAM', $ /' ******* TESTS ABANDONED *******' ) - 9990 FORMAT( ' SUBPROGRAM NAME ', A12,' NOT RECOGNIZED', /' ******* ', + 9990 FORMAT( ' SUBPROGRAM NAME ', A13,' NOT RECOGNIZED', /' ******* ', $ 'TESTS ABANDONED *******' ) 9989 FORMAT( ' ERROR IN SMMCH - IN-LINE DOT PRODUCTS ARE BEING EVALU', $ 'ATED WRONGLY.', /' SMMCH WAS CALLED WITH TRANSA = ', A1, @@ -404,8 +422,8 @@ PROGRAM SBLAT3 $ 'ERR = ', F12.3, '.', /' THIS MAY BE DUE TO FAULTS IN THE ', $ 'ARITHMETIC OR THE COMPILER.', /' ******* TESTS ABANDONED ', $ '*******' ) - 9988 FORMAT( A12,L2 ) - 9987 FORMAT( 1X, A12,' WAS NOT TESTED' ) + 9988 FORMAT( A13,L2 ) + 9987 FORMAT( 1X, A13,' WAS NOT TESTED' ) 9986 FORMAT( /' END OF TESTS' ) 9985 FORMAT( /' ******* FATAL ERROR - TESTS ABANDONED *******' ) 9984 FORMAT( ' ERROR-EXITS WILL NOT BE TESTED' ) @@ -413,10 +431,13 @@ PROGRAM SBLAT3 * End of SBLAT3. * END + +* ===================================================================== SUBROUTINE SCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX, $ A, AA, AS, B, BB, BS, C, CC, CS, CT, G, $ IORDER ) + IMPLICIT NONE * * Tests SGEMM. * @@ -435,7 +456,7 @@ SUBROUTINE SCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, REAL EPS, THRESH INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA, IORDER LOGICAL FATAL, REWI, TRACE - CHARACTER*12 SNAME + CHARACTER*13 SNAME * .. Array Arguments .. REAL A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ), $ AS( NMAX*NMAX ), B( NMAX, NMAX ), @@ -462,9 +483,9 @@ SUBROUTINE SCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, INTRINSIC MAX * .. Scalars in Common .. INTEGER INFOT, NOUTC - LOGICAL OK + LOGICAL LERR, OK * .. Common blocks .. - COMMON /INFOC/INFOT, NOUTC, OK + COMMON /INFOC/INFOT, NOUTC, OK, LERR * .. Data statements .. DATA ICH/'NTC'/ * .. Executable Statements .. @@ -681,20 +702,20 @@ SUBROUTINE SCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, 130 CONTINUE RETURN * -10003 FORMAT( ' ', A12,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ', +10003 FORMAT( ' ', A13,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ', $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', $ 'RATIO ', F8.2, ' - SUSPECT *******' ) -10002 FORMAT( ' ', A12,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ', +10002 FORMAT( ' ', A13,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ', $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', $ 'RATIO ', F8.2, ' - SUSPECT *******' ) -10001 FORMAT( ' ', A12,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS', +10001 FORMAT( ' ', A13,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS', $ ' (', I6, ' CALL', 'S)' ) -10000 FORMAT( ' ', A12,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS', +10000 FORMAT( ' ', A13,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS', $ ' (', I6, ' CALL', 'S)' ) 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', $ 'ANGED INCORRECTLY *******' ) - 9996 FORMAT( ' ******* ', A12,' FAILED ON CALL NUMBER:' ) - 9995 FORMAT( 1X, I6, ': ', A12,'(''', A1, ''',''', A1, ''',', + 9996 FORMAT( ' ******* ', A13,' FAILED ON CALL NUMBER:' ) + 9995 FORMAT( 1X, I6, ': ', A13,'(''', A1, ''',''', A1, ''',', $ 3( I3, ',' ), F4.1, ', A,', I3, ', B,', I3, ',', F4.1, ', ', $ 'C,', I3, ').' ) 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', @@ -703,15 +724,16 @@ SUBROUTINE SCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * End of SCHK1. * END -* -* -* + +* ===================================================================== SUBROUTINE SPRCN1(NOUT, NC, SNAME, IORDER, TRANSA, TRANSB, M, N, $ K, ALPHA, LDA, LDB, BETA, LDC) + IMPLICIT NONE + INTEGER NOUT, NC, IORDER, M, N, K, LDA, LDB, LDC REAL ALPHA, BETA CHARACTER*1 TRANSA, TRANSB - CHARACTER*12 SNAME + CHARACTER*13 SNAME CHARACTER*14 CRC, CTA,CTB IF (TRANSA.EQ.'N')THEN @@ -736,15 +758,17 @@ SUBROUTINE SPRCN1(NOUT, NC, SNAME, IORDER, TRANSA, TRANSB, M, N, WRITE(NOUT, FMT = 9995)NC,SNAME,CRC, CTA,CTB WRITE(NOUT, FMT = 9994)M, N, K, ALPHA, LDA, LDB, BETA, LDC - 9995 FORMAT( 1X, I6, ': ', A12,'(', A14, ',', A14, ',', A14, ',') + 9995 FORMAT( 1X, I6, ': ', A13,'(', A14, ',', A14, ',', A14, ',') 9994 FORMAT( 20X, 3( I3, ',' ), F4.1, ', A,', I3, ', B,', I3, ',', $ F4.1, ', ', 'C,', I3, ').' ) END -* + +* ===================================================================== SUBROUTINE SCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX, $ A, AA, AS, B, BB, BS, C, CC, CS, CT, G, $ IORDER ) + IMPLICIT NONE * * Tests SSYMM. * @@ -763,7 +787,7 @@ SUBROUTINE SCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, REAL EPS, THRESH INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA, IORDER LOGICAL FATAL, REWI, TRACE - CHARACTER*12 SNAME + CHARACTER*13 SNAME * .. Array Arguments .. REAL A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ), $ AS( NMAX*NMAX ), B( NMAX, NMAX ), @@ -790,9 +814,9 @@ SUBROUTINE SCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, INTRINSIC MAX * .. Scalars in Common .. INTEGER INFOT, NOUTC - LOGICAL OK + LOGICAL LERR, OK * .. Common blocks .. - COMMON /INFOC/INFOT, NOUTC, OK + COMMON /INFOC/INFOT, NOUTC, OK, LERR * .. Data statements .. DATA ICHS/'LR'/, ICHU/'UL'/ * .. Executable Statements .. @@ -998,20 +1022,20 @@ SUBROUTINE SCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, 120 CONTINUE RETURN * -10003 FORMAT( ' ', A12,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ', +10003 FORMAT( ' ', A13,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ', $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', $ 'RATIO ', F8.2, ' - SUSPECT *******' ) -10002 FORMAT( ' ', A12,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ', +10002 FORMAT( ' ', A13,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ', $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', $ 'RATIO ', F8.2, ' - SUSPECT *******' ) -10001 FORMAT( ' ', A12,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS', +10001 FORMAT( ' ', A13,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS', $ ' (', I6, ' CALL', 'S)' ) -10000 FORMAT( ' ', A12,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS', +10000 FORMAT( ' ', A13,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS', $ ' (', I6, ' CALL', 'S)' ) 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', $ 'ANGED INCORRECTLY *******' ) - 9996 FORMAT( ' ******* ', A12,' FAILED ON CALL NUMBER:' ) - 9995 FORMAT( 1X, I6, ': ', A12,'(', 2( '''', A1, ''',' ), 2( I3, ',' ), + 9996 FORMAT( ' ******* ', A13,' FAILED ON CALL NUMBER:' ) + 9995 FORMAT( 1X, I6, ': ', A13,'(', 2( '''', A1, ''',' ), 2( I3, ',' ), $ F4.1, ', A,', I3, ', B,', I3, ',', F4.1, ', C,', I3, ') ', $ ' .' ) 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', @@ -1020,13 +1044,16 @@ SUBROUTINE SCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * End of SCHK2. * END -* + +* ===================================================================== SUBROUTINE SPRCN2(NOUT, NC, SNAME, IORDER, SIDE, UPLO, M, N, $ ALPHA, LDA, LDB, BETA, LDC) + IMPLICIT NONE + INTEGER NOUT, NC, IORDER, M, N, LDA, LDB, LDC REAL ALPHA, BETA CHARACTER*1 SIDE, UPLO - CHARACTER*12 SNAME + CHARACTER*13 SNAME CHARACTER*14 CRC, CS,CU IF (SIDE.EQ.'L')THEN @@ -1047,14 +1074,16 @@ SUBROUTINE SPRCN2(NOUT, NC, SNAME, IORDER, SIDE, UPLO, M, N, WRITE(NOUT, FMT = 9995)NC,SNAME,CRC, CS,CU WRITE(NOUT, FMT = 9994)M, N, ALPHA, LDA, LDB, BETA, LDC - 9995 FORMAT( 1X, I6, ': ', A12,'(', A14, ',', A14, ',', A14, ',') + 9995 FORMAT( 1X, I6, ': ', A13,'(', A14, ',', A14, ',', A14, ',') 9994 FORMAT( 20X, 2( I3, ',' ), F4.1, ', A,', I3, ', B,', I3, ',', $ F4.1, ', ', 'C,', I3, ').' ) END -* + +* ===================================================================== SUBROUTINE SCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NMAX, A, AA, AS, $ B, BB, BS, CT, G, C, IORDER ) + IMPLICIT NONE * * Tests STRMM and STRSM. * @@ -1073,7 +1102,7 @@ SUBROUTINE SCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, REAL EPS, THRESH INTEGER NALF, NIDIM, NMAX, NOUT, NTRA, IORDER LOGICAL FATAL, REWI, TRACE - CHARACTER*12 SNAME + CHARACTER*13 SNAME * .. Array Arguments .. REAL A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ), $ AS( NMAX*NMAX ), B( NMAX, NMAX ), @@ -1101,9 +1130,9 @@ SUBROUTINE SCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, INTRINSIC MAX * .. Scalars in Common .. INTEGER INFOT, NOUTC - LOGICAL OK + LOGICAL LERR, OK * .. Common blocks .. - COMMON /INFOC/INFOT, NOUTC, OK + COMMON /INFOC/INFOT, NOUTC, OK, LERR * .. Data statements .. DATA ICHU/'UL'/, ICHT/'NTC'/, ICHD/'UN'/, ICHS/'LR'/ * .. Executable Statements .. @@ -1346,20 +1375,20 @@ SUBROUTINE SCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, 160 CONTINUE RETURN * -10003 FORMAT( ' ', A12,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ', +10003 FORMAT( ' ', A13,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ', $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', $ 'RATIO ', F8.2, ' - SUSPECT *******' ) -10002 FORMAT( ' ', A12,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ', +10002 FORMAT( ' ', A13,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ', $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', $ 'RATIO ', F8.2, ' - SUSPECT *******' ) -10001 FORMAT( ' ', A12,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS', +10001 FORMAT( ' ', A13,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS', $ ' (', I6, ' CALL', 'S)' ) -10000 FORMAT( ' ', A12,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS', +10000 FORMAT( ' ', A13,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS', $ ' (', I6, ' CALL', 'S)' ) 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', $ 'ANGED INCORRECTLY *******' ) - 9996 FORMAT( ' ******* ', A12,' FAILED ON CALL NUMBER:' ) - 9995 FORMAT( 1X, I6, ': ', A12,'(', 4( '''', A1, ''',' ), 2( I3, ',' ), + 9996 FORMAT( ' ******* ', A13,' FAILED ON CALL NUMBER:' ) + 9995 FORMAT( 1X, I6, ': ', A13,'(', 4( '''', A1, ''',' ), 2( I3, ',' ), $ F4.1, ', A,', I3, ', B,', I3, ') .' ) 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', $ '******' ) @@ -1367,13 +1396,16 @@ SUBROUTINE SCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * End of SCHK3. * END -* + +* ===================================================================== SUBROUTINE SPRCN3(NOUT, NC, SNAME, IORDER, SIDE, UPLO, TRANSA, $ DIAG, M, N, ALPHA, LDA, LDB) + IMPLICIT NONE + INTEGER NOUT, NC, IORDER, M, N, LDA, LDB REAL ALPHA CHARACTER*1 SIDE, UPLO, TRANSA, DIAG - CHARACTER*12 SNAME + CHARACTER*13 SNAME CHARACTER*14 CRC, CS, CU, CA, CD IF (SIDE.EQ.'L')THEN @@ -1406,15 +1438,17 @@ SUBROUTINE SPRCN3(NOUT, NC, SNAME, IORDER, SIDE, UPLO, TRANSA, WRITE(NOUT, FMT = 9995)NC,SNAME,CRC, CS,CU WRITE(NOUT, FMT = 9994)CA, CD, M, N, ALPHA, LDA, LDB - 9995 FORMAT( 1X, I6, ': ', A12,'(', A14, ',', A14, ',', A14, ',') + 9995 FORMAT( 1X, I6, ': ', A13,'(', A14, ',', A14, ',', A14, ',') 9994 FORMAT( 22X, 2( A14, ',') , 2( I3, ',' ), $ F4.1, ', A,', I3, ', B,', I3, ').' ) END -* + +* ===================================================================== SUBROUTINE SCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX, $ A, AA, AS, B, BB, BS, C, CC, CS, CT, G, $ IORDER ) + IMPLICIT NONE * * Tests SSYRK. * @@ -1433,7 +1467,7 @@ SUBROUTINE SCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, REAL EPS, THRESH INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA, IORDER LOGICAL FATAL, REWI, TRACE - CHARACTER*12 SNAME + CHARACTER*13 SNAME * .. Array Arguments .. REAL A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ), $ AS( NMAX*NMAX ), B( NMAX, NMAX ), @@ -1461,9 +1495,9 @@ SUBROUTINE SCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, INTRINSIC MAX * .. Scalars in Common .. INTEGER INFOT, NOUTC - LOGICAL OK + LOGICAL LERR, OK * .. Common blocks .. - COMMON /INFOC/INFOT, NOUTC, OK + COMMON /INFOC/INFOT, NOUTC, OK, LERR * .. Data statements .. DATA ICHT/'NTC'/, ICHU/'UL'/ * .. Executable Statements .. @@ -1672,21 +1706,21 @@ SUBROUTINE SCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, 130 CONTINUE RETURN * -10003 FORMAT( ' ', A12,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ', +10003 FORMAT( ' ', A13,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ', $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', $ 'RATIO ', F8.2, ' - SUSPECT *******' ) -10002 FORMAT( ' ', A12,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ', +10002 FORMAT( ' ', A13,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ', $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', $ 'RATIO ', F8.2, ' - SUSPECT *******' ) -10001 FORMAT( ' ', A12,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS', +10001 FORMAT( ' ', A13,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS', $ ' (', I6, ' CALL', 'S)' ) -10000 FORMAT( ' ', A12,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS', +10000 FORMAT( ' ', A13,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS', $ ' (', I6, ' CALL', 'S)' ) 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', $ 'ANGED INCORRECTLY *******' ) - 9996 FORMAT( ' ******* ', A12,' FAILED ON CALL NUMBER:' ) + 9996 FORMAT( ' ******* ', A13,' FAILED ON CALL NUMBER:' ) 9995 FORMAT( ' THESE ARE THE RESULTS FOR COLUMN ', I3 ) - 9994 FORMAT( 1X, I6, ': ', A12,'(', 2( '''', A1, ''',' ), 2( I3, ',' ), + 9994 FORMAT( 1X, I6, ': ', A13,'(', 2( '''', A1, ''',' ), 2( I3, ',' ), $ F4.1, ', A,', I3, ',', F4.1, ', C,', I3, ') .' ) 9993 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', $ '******' ) @@ -1694,13 +1728,16 @@ SUBROUTINE SCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * End of SCHK4. * END -* + +* ===================================================================== SUBROUTINE SPRCN4(NOUT, NC, SNAME, IORDER, UPLO, TRANSA, $ N, K, ALPHA, LDA, BETA, LDC) + IMPLICIT NONE + INTEGER NOUT, NC, IORDER, N, K, LDA, LDC REAL ALPHA, BETA CHARACTER*1 UPLO, TRANSA - CHARACTER*12 SNAME + CHARACTER*13 SNAME CHARACTER*14 CRC, CU, CA IF (UPLO.EQ.'U')THEN @@ -1723,15 +1760,17 @@ SUBROUTINE SPRCN4(NOUT, NC, SNAME, IORDER, UPLO, TRANSA, WRITE(NOUT, FMT = 9995)NC, SNAME, CRC, CU, CA WRITE(NOUT, FMT = 9994)N, K, ALPHA, LDA, BETA, LDC - 9995 FORMAT( 1X, I6, ': ', A12,'(', 3( A14, ',') ) + 9995 FORMAT( 1X, I6, ': ', A13,'(', 3( A14, ',') ) 9994 FORMAT( 20X, 2( I3, ',' ), $ F4.1, ', A,', I3, ',', F4.1, ', C,', I3, ').' ) END -* + +* ===================================================================== SUBROUTINE SCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX, $ AB, AA, AS, BB, BS, C, CC, CS, CT, G, W, $ IORDER ) + IMPLICIT NONE * * Tests SSYR2K. * @@ -1750,7 +1789,7 @@ SUBROUTINE SCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, REAL EPS, THRESH INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA, IORDER LOGICAL FATAL, REWI, TRACE - CHARACTER*12 SNAME + CHARACTER*13 SNAME * .. Array Arguments .. REAL AA( NMAX*NMAX ), AB( 2*NMAX*NMAX ), $ ALF( NALF ), AS( NMAX*NMAX ), BB( NMAX*NMAX ), @@ -1778,9 +1817,9 @@ SUBROUTINE SCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, INTRINSIC MAX * .. Scalars in Common .. INTEGER INFOT, NOUTC - LOGICAL OK + LOGICAL LERR, OK * .. Common blocks .. - COMMON /INFOC/INFOT, NOUTC, OK + COMMON /INFOC/INFOT, NOUTC, OK, LERR * .. Data statements .. DATA ICHT/'NTC'/, ICHU/'UL'/ * .. Executable Statements .. @@ -2027,21 +2066,21 @@ SUBROUTINE SCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, 160 CONTINUE RETURN * -10003 FORMAT( ' ', A12,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ', +10003 FORMAT( ' ', A13,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ', $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', $ 'RATIO ', F8.2, ' - SUSPECT *******' ) -10002 FORMAT( ' ', A12,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ', +10002 FORMAT( ' ', A13,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ', $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', $ 'RATIO ', F8.2, ' - SUSPECT *******' ) -10001 FORMAT( ' ', A12,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS', +10001 FORMAT( ' ', A13,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS', $ ' (', I6, ' CALL', 'S)' ) -10000 FORMAT( ' ', A12,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS', +10000 FORMAT( ' ', A13,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS', $ ' (', I6, ' CALL', 'S)' ) 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', $ 'ANGED INCORRECTLY *******' ) - 9996 FORMAT( ' ******* ', A12,' FAILED ON CALL NUMBER:' ) + 9996 FORMAT( ' ******* ', A13,' FAILED ON CALL NUMBER:' ) 9995 FORMAT( ' THESE ARE THE RESULTS FOR COLUMN ', I3 ) - 9994 FORMAT( 1X, I6, ': ', A12,'(', 2( '''', A1, ''',' ), 2( I3, ',' ), + 9994 FORMAT( 1X, I6, ': ', A13,'(', 2( '''', A1, ''',' ), 2( I3, ',' ), $ F4.1, ', A,', I3, ', B,', I3, ',', F4.1, ', C,', I3, ') ', $ ' .' ) 9993 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', @@ -2050,13 +2089,16 @@ SUBROUTINE SCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * End of SCHK5. * END -* + +* ===================================================================== SUBROUTINE SPRCN5(NOUT, NC, SNAME, IORDER, UPLO, TRANSA, $ N, K, ALPHA, LDA, LDB, BETA, LDC) + IMPLICIT NONE + INTEGER NOUT, NC, IORDER, N, K, LDA, LDB, LDC REAL ALPHA, BETA CHARACTER*1 UPLO, TRANSA - CHARACTER*12 SNAME + CHARACTER*13 SNAME CHARACTER*14 CRC, CU, CA IF (UPLO.EQ.'U')THEN @@ -2079,13 +2121,15 @@ SUBROUTINE SPRCN5(NOUT, NC, SNAME, IORDER, UPLO, TRANSA, WRITE(NOUT, FMT = 9995)NC, SNAME, CRC, CU, CA WRITE(NOUT, FMT = 9994)N, K, ALPHA, LDA, LDB, BETA, LDC - 9995 FORMAT( 1X, I6, ': ', A12,'(', 3( A14, ',') ) + 9995 FORMAT( 1X, I6, ': ', A13,'(', 3( A14, ',') ) 9994 FORMAT( 20X, 2( I3, ',' ), $ F4.1, ', A,', I3, ', B', I3, ',', F4.1, ', C,', I3, ').' ) END -* + +* ===================================================================== SUBROUTINE SMAKE( TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, RESET, $ TRANSL ) + IMPLICIT NONE * * Generates values for an M by N matrix A. * Stores the values in the array AA in the data structure required @@ -2197,9 +2241,12 @@ SUBROUTINE SMAKE( TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, RESET, * End of SMAKE. * END + +* ===================================================================== SUBROUTINE SMMCH( TRANSA, TRANSB, M, N, KK, ALPHA, A, LDA, B, LDB, $ BETA, C, LDC, CT, G, CC, LDCC, EPS, ERR, FATAL, $ NOUT, MV ) + IMPLICIT NONE * * Checks the results of the computational tests. * @@ -2319,7 +2366,10 @@ SUBROUTINE SMMCH( TRANSA, TRANSB, M, N, KK, ALPHA, A, LDA, B, LDB, * End of SMMCH. * END + +* ===================================================================== LOGICAL FUNCTION LSE( RI, RJ, LR ) + IMPLICIT NONE * * Tests if two arrays are identical. * @@ -2351,7 +2401,10 @@ LOGICAL FUNCTION LSE( RI, RJ, LR ) * End of LSE. * END + +* ===================================================================== LOGICAL FUNCTION LSERES( TYPE, UPLO, M, N, AA, AS, LDA ) + IMPLICIT NONE * * Tests if selected elements in two arrays are equal. * @@ -2413,7 +2466,10 @@ LOGICAL FUNCTION LSERES( TYPE, UPLO, M, N, AA, AS, LDA ) * End of LSERES. * END + +* ===================================================================== REAL FUNCTION SBEG( RESET ) + IMPLICIT NONE * * Generates random numbers uniformly distributed between -0.5 and 0.5. * @@ -2459,7 +2515,10 @@ REAL FUNCTION SBEG( RESET ) * End of SBEG. * END + +* ===================================================================== REAL FUNCTION SDIFF( X, Y ) + IMPLICIT NONE * * Auxiliary routine for test program for Level 3 Blas. * @@ -2478,3 +2537,481 @@ REAL FUNCTION SDIFF( X, Y ) * End of SDIFF. * END + +* ===================================================================== + SUBROUTINE SCHK6( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, + $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX, + $ A, AA, AS, B, BB, BS, C, CC, CS, CT, G, + $ IORDER) + IMPLICIT NONE +* +* Tests SGEMMTR. +* +* Auxiliary routine for test program for Level 3 Blas. +* +* -- Written on 19-July-2023. +* Martin Koehler, MPI Magdeburg +* +* .. Parameters .. + REAL ZERO + PARAMETER ( ZERO = 0.0 ) +* .. Scalar Arguments .. + REAL EPS, THRESH + INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA, IORDER + LOGICAL FATAL, REWI, TRACE + CHARACTER*13 SNAME +* .. Array Arguments .. + REAL A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ), + $ AS( NMAX*NMAX ), B( NMAX, NMAX ), + $ BB( NMAX*NMAX ), BET( NBET ), BS( NMAX*NMAX ), + $ C( NMAX, NMAX ), CC( NMAX*NMAX ), + $ CS( NMAX*NMAX ), CT( NMAX ), G( NMAX ) + INTEGER IDIM( NIDIM ) +* .. Local Scalars .. + REAL ALPHA, ALS, BETA, BLS, ERR, ERRMAX + INTEGER I, IA, IB, ICA, ICB, IK, IN, K, KS, LAA, + $ LBB, LCC, LDA, LDAS, LDB, LDBS, LDC, LDCS, + $ MA, MB, N, NA, NARGS, NB, NC, NS, IS + LOGICAL NULL, RESET, SAME, TRANA, TRANB + CHARACTER*1 TRANAS, TRANBS, TRANSA, TRANSB, UPLO, UPLOS + CHARACTER*3 ICH + CHARACTER*2 ISHAPE +* .. Local Arrays .. + LOGICAL ISAME( 13 ) +* .. External Functions .. + LOGICAL LSE, LSERES + EXTERNAL LSE, LSERES +* .. External Subroutines .. + EXTERNAL CSGEMMTR, SMAKE, SMMTCH, SPRCN8 +* .. Intrinsic Functions .. + INTRINSIC MAX +* .. Scalars in Common .. + INTEGER INFOT, NOUTC + LOGICAL LERR, OK +* .. Common blocks .. + COMMON /INFOC/INFOT, NOUTC, OK, LERR +* .. Data statements .. + DATA ICH/'NTC'/ + DATA ISHAPE/'UL'/ +* .. Executable Statements .. +* + NARGS = 13 + NC = 0 + RESET = .TRUE. + ERRMAX = ZERO +* + DO 100 IN = 1, NIDIM + N = IDIM( IN ) +* Set LDC to 1 more than minimum value if room. + LDC = N + IF( LDC.LT.NMAX ) + $ LDC = LDC + 1 +* Skip tests if not enough room. + IF( LDC.GT.NMAX ) + $ GO TO 100 + LCC = LDC*N + NULL = N.LE.0 +* + DO 90 IK = 1, NIDIM + K = IDIM( IK ) +* + DO 80 ICA = 1, 3 + TRANSA = ICH( ICA: ICA ) + TRANA = TRANSA.EQ.'T'.OR.TRANSA.EQ.'C' +* + IF( TRANA )THEN + MA = K + NA = N + ELSE + MA = N + NA = K + END IF +* Set LDA to 1 more than minimum value if room. + LDA = MA + IF( LDA.LT.NMAX ) + $ LDA = LDA + 1 +* Skip tests if not enough room. + IF( LDA.GT.NMAX ) + $ GO TO 80 + LAA = LDA*NA +* +* Generate the matrix A. +* + CALL SMAKE( 'GE', ' ', ' ', MA, NA, A, NMAX, AA, LDA, + $ RESET, ZERO ) +* + DO 70 ICB = 1, 3 + TRANSB = ICH( ICB: ICB ) + TRANB = TRANSB.EQ.'T'.OR.TRANSB.EQ.'C' +* + IF( TRANB )THEN + MB = N + NB = K + ELSE + MB = K + NB = N + END IF +* Set LDB to 1 more than minimum value if room. + LDB = MB + IF( LDB.LT.NMAX ) + $ LDB = LDB + 1 +* Skip tests if not enough room. + IF( LDB.GT.NMAX ) + $ GO TO 70 + LBB = LDB*NB +* +* Generate the matrix B. +* + CALL SMAKE( 'GE', ' ', ' ', MB, NB, B, NMAX, BB, + $ LDB, RESET, ZERO ) +* + DO 60 IA = 1, NALF + ALPHA = ALF( IA ) +* + DO 50 IB = 1, NBET + BETA = BET( IB ) + + DO 45 IS = 1, 2 + UPLO = ISHAPE( IS: IS ) + +* +* Generate the matrix C. +* + CALL SMAKE( 'GE', UPLO, ' ', N, N, C, + $ NMAX, CC, LDC, RESET, ZERO ) +* + NC = NC + 1 +* +* Save every datum before calling the +* subroutine. +* + UPLOS = UPLO + TRANAS = TRANSA + TRANBS = TRANSB + NS = N + KS = K + ALS = ALPHA + DO 10 I = 1, LAA + AS( I ) = AA( I ) + 10 CONTINUE + LDAS = LDA + DO 20 I = 1, LBB + BS( I ) = BB( I ) + 20 CONTINUE + LDBS = LDB + BLS = BETA + DO 30 I = 1, LCC + CS( I ) = CC( I ) + 30 CONTINUE + LDCS = LDC +* +* Call the subroutine. +* + IF( TRACE ) + $ CALL SPRCN8(NTRA, NC, SNAME, IORDER, UPLO, + $ TRANSA, TRANSB, N, K, ALPHA, LDA, + $ LDB, BETA, LDC) + IF( REWI ) + $ REWIND NTRA + CALL CSGEMMTR( IORDER, UPLO, TRANSA, TRANSB, + $ N, K, ALPHA, AA, LDA, BB, LDB, + $ BETA, CC, LDC ) +* +* Check if error-exit was taken incorrectly. +* + IF( .NOT.OK )THEN + WRITE( NOUT, FMT = 9994 ) + FATAL = .TRUE. + GO TO 120 + END IF +* +* See what data changed inside subroutines. +* + ISAME( 1 ) = UPLO.EQ.UPLOS + ISAME( 2 ) = TRANSA.EQ.TRANAS + ISAME( 3 ) = TRANSB.EQ.TRANBS + ISAME( 4 ) = NS.EQ.N + ISAME( 5 ) = KS.EQ.K + ISAME( 6 ) = ALS.EQ.ALPHA + ISAME( 7 ) = LSE( AS, AA, LAA ) + ISAME( 8 ) = LDAS.EQ.LDA + ISAME( 9 ) = LSE( BS, BB, LBB ) + ISAME( 10 ) = LDBS.EQ.LDB + ISAME( 11 ) = BLS.EQ.BETA + IF( NULL )THEN + ISAME( 12 ) = LSE( CS, CC, LCC ) + ELSE + ISAME( 12 ) = LSERES( 'GE', ' ', N, N, + $ CS, CC, LDC ) + END IF + ISAME( 13 ) = LDCS.EQ.LDC +* +* If data was incorrectly changed, report +* and return. +* + SAME = .TRUE. + DO 40 I = 1, NARGS + SAME = SAME.AND.ISAME( I ) + IF( .NOT.ISAME( I ) ) + $ WRITE( NOUT, FMT = 9998 )I + 40 CONTINUE + IF( .NOT.SAME )THEN + FATAL = .TRUE. + GO TO 120 + END IF +* + IF( .NOT.NULL )THEN +* +* Check the result. +* + CALL SMMTCH( UPLO, TRANSA, TRANSB, + $ N, K, + $ ALPHA, A, NMAX, B, NMAX, BETA, + $ C, NMAX, CT, G, CC, LDC, EPS, + $ ERR, FATAL, NOUT, .TRUE. ) + ERRMAX = MAX( ERRMAX, ERR ) +* If got really bad answer, report and +* return. + IF( FATAL ) + $ GO TO 120 + END IF +* + 45 CONTINUE +* + 50 CONTINUE +* + 60 CONTINUE +* + 70 CONTINUE +* + 80 CONTINUE +* + 90 CONTINUE +* + 100 CONTINUE +* +* +* Report result. +* + IF( ERRMAX.LT.THRESH )THEN + IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10000 )SNAME, NC + IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10001 )SNAME, NC + ELSE + IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10002 )SNAME, NC, ERRMAX + IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10003 )SNAME, NC, ERRMAX + END IF + GO TO 130 +* + 120 CONTINUE + WRITE( NOUT, FMT = 9996 )SNAME + CALL SPRCN8(NOUT, NC, SNAME, IORDER, UPLO, TRANSA, TRANSB, + $ N, K, ALPHA, LDA, LDB, BETA, LDC) +* + 130 CONTINUE + RETURN +* +10003 FORMAT( ' ', A13,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ', + $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', + $ 'RATIO ', F8.2, ' - SUSPECT *******' ) +10002 FORMAT( ' ', A13,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ', + $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', + $ 'RATIO ', F8.2, ' - SUSPECT *******' ) +10001 FORMAT( ' ', A13,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS', + $ ' (', I6, ' CALL', 'S)' ) +10000 FORMAT( ' ', A13,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS', + $ ' (', I6, ' CALL', 'S)' ) + 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', + $ 'ANGED INCORRECTLY *******' ) + 9997 FORMAT( ' ', A13, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, + $ ' C', 'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', + $ F8.2, ' - SUSPECT *******' ) + 9996 FORMAT( ' ******* ', A13, ' FAILED ON CALL NUMBER:' ) + 9995 FORMAT( 1X, I6, ': ', A13, '(''',A1, ''',''',A1, ''',''', A1, + $ ''',', 2( I3, ',' ), F4.1, ', A,', I3, ', B,', I3, ',', + $ F4.1, ', ', 'C,', I3, ').' ) + 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', + $ '******' ) +* +* End of SCHK6 +* + END + +* ===================================================================== + SUBROUTINE SPRCN8(NOUT, NC, SNAME, IORDER, UPLO, + $ TRANSA, TRANSB, N, + $ K, ALPHA, LDA, LDB, BETA, LDC) + IMPLICIT NONE + + INTEGER NOUT, NC, IORDER, N, K, LDA, LDB, LDC + REAL ALPHA, BETA + CHARACTER*1 TRANSA, TRANSB, UPLO + CHARACTER*13 SNAME + CHARACTER*14 CRC, CTA,CTB,CUPLO + + IF (UPLO.EQ.'U') THEN + CUPLO = 'CblasUpper' + ELSE + CUPLO = 'CblasLower' + END IF + IF (TRANSA.EQ.'N')THEN + CTA = ' CblasNoTrans' + ELSE IF (TRANSA.EQ.'T')THEN + CTA = ' CblasTrans' + ELSE + CTA = 'CblasConjTrans' + END IF + IF (TRANSB.EQ.'N')THEN + CTB = ' CblasNoTrans' + ELSE IF (TRANSB.EQ.'T')THEN + CTB = ' CblasTrans' + ELSE + CTB = 'CblasConjTrans' + END IF + IF (IORDER.EQ.1)THEN + CRC = ' CblasRowMajor' + ELSE + CRC = ' CblasColMajor' + END IF + WRITE(NOUT, FMT = 9995)NC,SNAME,CRC, CUPLO, CTA,CTB + WRITE(NOUT, FMT = 9994)N, K, ALPHA, LDA, LDB, BETA, LDC + + 9995 FORMAT( 1X, I6, ': ', A13,'(', A14, ',', A14, ',', A14, ',', + $ A14, ',') + 9994 FORMAT( 10X, 2( I3, ',' ) ,' ', F4.1,' , A,', + $ I3, ', B,', I3, ', ', F4.1,' , C,', I3, ').' ) + END + +* ===================================================================== + SUBROUTINE SMMTCH( UPLO, TRANSA, TRANSB, N, KK, ALPHA, A, LDA, + $ B, LDB, BETA, C, LDC, CT, G, CC, LDCC, EPS, ERR, + $ FATAL, NOUT, MV ) + IMPLICIT NONE +* +* Checks the results of the computational tests. +* +* Auxiliary routine for test program for Level 3 Blas. (DGEMMTR) +* +* -- Written on 19-July-2023. +* Martin Koehler, MPI Magdeburg +* +* .. Parameters .. + REAL ZERO, ONE + PARAMETER ( ZERO = 0.0, ONE = 1.0 ) +* .. Scalar Arguments .. + REAL ALPHA, BETA, EPS, ERR + INTEGER KK, LDA, LDB, LDC, LDCC, N, NOUT + LOGICAL FATAL, MV + CHARACTER*1 UPLO, TRANSA, TRANSB +* .. Array Arguments .. + REAL A( LDA, * ), B( LDB, * ), C( LDC, * ), + $ CC( LDCC, * ), CT( * ), G( * ) +* .. Local Scalars .. + REAL ERRI + INTEGER I, J, K, ISTART, ISTOP + LOGICAL TRANA, TRANB, UPPER +* .. Intrinsic Functions .. + INTRINSIC ABS, MAX, SQRT +* .. Executable Statements .. + UPPER = UPLO.EQ.'U' + TRANA = TRANSA.EQ.'T'.OR.TRANSA.EQ.'C' + TRANB = TRANSB.EQ.'T'.OR.TRANSB.EQ.'C' +* +* Compute expected result, one column at a time, in CT using data +* in A, B and C. +* Compute gauges in G. +* + ISTART = 1 + ISTOP = N + + DO 120 J = 1, N +* + IF ( UPPER ) THEN + ISTART = 1 + ISTOP = J + ELSE + ISTART = J + ISTOP = N + END IF + DO 10 I = ISTART, ISTOP + CT( I ) = ZERO + G( I ) = ZERO + 10 CONTINUE + IF( .NOT.TRANA.AND..NOT.TRANB )THEN + DO 30 K = 1, KK + DO 20 I = ISTART, ISTOP + CT( I ) = CT( I ) + A( I, K )*B( K, J ) + G( I ) = G( I ) + ABS( A( I, K ) )*ABS( B( K, J ) ) + 20 CONTINUE + 30 CONTINUE + ELSE IF( TRANA.AND..NOT.TRANB )THEN + DO 50 K = 1, KK + DO 40 I = ISTART, ISTOP + CT( I ) = CT( I ) + A( K, I )*B( K, J ) + G( I ) = G( I ) + ABS( A( K, I ) )*ABS( B( K, J ) ) + 40 CONTINUE + 50 CONTINUE + ELSE IF( .NOT.TRANA.AND.TRANB )THEN + DO 70 K = 1, KK + DO 60 I = ISTART, ISTOP + CT( I ) = CT( I ) + A( I, K )*B( J, K ) + G( I ) = G( I ) + ABS( A( I, K ) )*ABS( B( J, K ) ) + 60 CONTINUE + 70 CONTINUE + ELSE IF( TRANA.AND.TRANB )THEN + DO 90 K = 1, KK + DO 80 I = ISTART, ISTOP + CT( I ) = CT( I ) + A( K, I )*B( J, K ) + G( I ) = G( I ) + ABS( A( K, I ) )*ABS( B( J, K ) ) + 80 CONTINUE + 90 CONTINUE + END IF + DO 100 I = ISTART, ISTOP + CT( I ) = ALPHA*CT( I ) + BETA*C( I, J ) + G( I ) = ABS( ALPHA )*G( I ) + ABS( BETA )*ABS( C( I, J ) ) + 100 CONTINUE +* +* Compute the error ratio for this result. +* + ERR = ZERO + DO 110 I = ISTART, ISTOP + ERRI = ABS( CT( I ) - CC( I, J ) )/EPS + IF( G( I ).NE.ZERO ) + $ ERRI = ERRI/G( I ) + ERR = MAX( ERR, ERRI ) + IF( ERR*SQRT( EPS ).GE.ONE ) + $ GO TO 130 + 110 CONTINUE +* + 120 CONTINUE +* +* If the loop completes, all results are at least half accurate. + GO TO 150 +* +* Report fatal error. +* + 130 FATAL = .TRUE. + WRITE( NOUT, FMT = 9999 ) + DO 140 I = ISTART, ISTOP + IF( MV )THEN + WRITE( NOUT, FMT = 9998 )I, CT( I ), CC( I, J ) + ELSE + WRITE( NOUT, FMT = 9998 )I, CC( I, J ), CT( I ) + END IF + 140 CONTINUE + IF( N.GT.1 ) + $ WRITE( NOUT, FMT = 9997 )J +* + 150 CONTINUE + RETURN +* + 9999 FORMAT( ' ******* FATAL ERROR - COMPUTED RESULT IS LESS THAN HAL', + $ 'F ACCURATE *******', /' EXPECTED RESULT COMPU', + $ 'TED RESULT' ) + 9998 FORMAT( 1X, I7, 2G18.6 ) + 9997 FORMAT( ' THESE ARE THE RESULTS FOR COLUMN ', I3 ) +* +* End of SMMTCH +* + END + + diff --git a/CBLAS/testing/c_xerbla.c b/CBLAS/testing/c_xerbla.c index 8c6674e11b..2b88a39d67 100644 --- a/CBLAS/testing/c_xerbla.c +++ b/CBLAS/testing/c_xerbla.c @@ -7,8 +7,8 @@ void cblas_xerbla(CBLAS_INT info, const char *rout, const char *form, ...) { - extern int cblas_lerr, cblas_info, cblas_ok; - extern int link_xerbla; + extern CBLAS_INT cblas_lerr, cblas_info, cblas_ok; + extern CBLAS_INT link_xerbla; extern int RowMajorStrg; extern char *cblas_rout; @@ -33,13 +33,18 @@ void cblas_xerbla(CBLAS_INT info, const char *rout, const char *form, ...) * for A and B, lda is in position 11 instead of 9, and ldb is in * position 9 instead of 11. */ - if (strstr(rout,"gemm") != 0) + if (strstr(rout,"gemm") != 0 && strstr(rout, "gemmtr") == 0) { if (info == 5 ) info = 4; else if (info == 4 ) info = 5; else if (info == 11) info = 9; else if (info == 9 ) info = 11; + } else if (strstr(rout, "gemmtr") != 0) + { + if (info == 11) info = 9; + else if (info == 9 ) info = 11; } + else if (strstr(rout,"symm") != 0 || strstr(rout,"hemm") != 0) { if (info == 5 ) info = 4; @@ -78,32 +83,36 @@ void cblas_xerbla(CBLAS_INT info, const char *rout, const char *form, ...) } if (info != cblas_info){ - printf("***** XERBLA WAS CALLED WITH INFO = %d INSTEAD OF %d in %s *******\n",info, cblas_info, rout); + printf("***** XERBLA WAS CALLED WITH INFO = %" CBLAS_IFMT " INSTEAD OF %d in %s *******\n",info, (int) cblas_info, rout); cblas_lerr = PASSED; cblas_ok = FALSE; } else cblas_lerr = FAILED; } #ifdef F77_Char -void F77_xerbla(F77_Char F77_srname, void *vinfo) +void F77_xerbla(F77_Char F77_srname, void *vinfo #else -void F77_xerbla(char *srname, void *vinfo) +void F77_xerbla(char *srname, void *vinfo #endif +#ifdef BLAS_FORTRAN_STRLEN_END +, FORTRAN_STRLEN srname_len +#endif +) { #ifdef F77_Char char *srname; #endif - char rout[] = {'c','b','l','a','s','_','\0','\0','\0','\0','\0','\0','\0'}; + char rout[] = {'c','b','l','a','s','_','\0','\0','\0','\0','\0','\0','\0', '\0', '\0'}; #ifdef F77_Integer F77_Integer *info=vinfo; F77_Integer i; extern F77_Integer link_xerbla; #else - int *info=vinfo; - int i; - extern int link_xerbla; + CBLAS_INT *info=vinfo; + CBLAS_INT i; + extern CBLAS_INT link_xerbla; #endif #ifdef F77_Char srname = F2C_STR(F77_srname, XerblaStrLen); @@ -115,8 +124,12 @@ void F77_xerbla(char *srname, void *vinfo) link_xerbla = 0; return; } - for(i=0; i < 6; i++) rout[i+6] = tolower(srname[i]); - for(i=11; i >= 9; i--) if (rout[i] == ' ') rout[i] = '\0'; +#ifndef BLAS_FORTRAN_STRLEN_END + const int srname_len = 6; +#endif + + for(i=0; i < srname_len; i++) rout[i+6] = tolower(srname[i]); + for(i=13; i >= 9; i--) if (rout[i] == ' ') rout[i] = '\0'; /* We increment *info by 1 since the CBLAS interface adds one more * argument to all level 2 and 3 routines. diff --git a/CBLAS/testing/c_z2chke.c b/CBLAS/testing/c_z2chke.c index 65e552da3e..f86c483c2a 100644 --- a/CBLAS/testing/c_z2chke.c +++ b/CBLAS/testing/c_z2chke.c @@ -3,28 +3,36 @@ #include "cblas.h" #include "cblas_test.h" -int cblas_ok, cblas_lerr, cblas_info; -int link_xerbla=TRUE; +CBLAS_INT cblas_ok, cblas_lerr, cblas_info; +CBLAS_INT link_xerbla=TRUE; char *cblas_rout; #ifdef F77_Char -void F77_xerbla(F77_Char F77_srname, void *vinfo); +void F77_xerbla(F77_Char F77_srname, void *vinfo #else -void F77_xerbla(char *srname, void *vinfo); +void F77_xerbla(char *srname, void *vinfo #endif +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN srname_len +#endif +); void chkxer(void) { - extern int cblas_ok, cblas_lerr, cblas_info; - extern int link_xerbla; + extern CBLAS_INT cblas_ok, cblas_lerr, cblas_info; + extern CBLAS_INT link_xerbla; extern char *cblas_rout; if (cblas_lerr == 1 ) { - printf("***** ILLEGAL VALUE OF PARAMETER NUMBER %d NOT DETECTED BY %s *****\n", cblas_info, cblas_rout); + printf("***** ILLEGAL VALUE OF PARAMETER NUMBER %d NOT DETECTED BY %s *****\n", (int) cblas_info, cblas_rout); cblas_ok = 0 ; } cblas_lerr = 1 ; } -void F77_z2chke(char *rout) { +void F77_z2chke(char *rout +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN rout_len +#endif +) { char *sf = ( rout ) ; double A[2] = {0.0,0.0}, X[2] = {0.0,0.0}, @@ -32,7 +40,7 @@ void F77_z2chke(char *rout) { ALPHA[2] = {0.0,0.0}, BETA[2] = {0.0,0.0}, RALPHA = 0.0; - extern int cblas_info, cblas_lerr, cblas_ok; + extern CBLAS_INT cblas_info, cblas_lerr, cblas_ok; extern int RowMajorStrg; extern char *cblas_rout; @@ -40,10 +48,11 @@ void F77_z2chke(char *rout) { if (link_xerbla) /* call these first to link */ { cblas_xerbla(cblas_info,cblas_rout,""); - F77_xerbla(cblas_rout,&cblas_info); + F77_xerbla(cblas_rout,&cblas_info, 1); } #endif + link_xerbla = 0; cblas_ok = TRUE ; cblas_lerr = PASSED ; diff --git a/CBLAS/testing/c_z3chke.c b/CBLAS/testing/c_z3chke.c index 30840489af..44febcaff8 100644 --- a/CBLAS/testing/c_z3chke.c +++ b/CBLAS/testing/c_z3chke.c @@ -3,28 +3,36 @@ #include "cblas.h" #include "cblas_test.h" -int cblas_ok, cblas_lerr, cblas_info; -int link_xerbla=TRUE; +CBLAS_INT cblas_ok, cblas_lerr, cblas_info; +CBLAS_INT link_xerbla=TRUE; char *cblas_rout; #ifdef F77_Char -void F77_xerbla(F77_Char F77_srname, void *vinfo); +void F77_xerbla(F77_Char F77_srname, void *vinfo #else -void F77_xerbla(char *srname, void *vinfo); +void F77_xerbla(char *srname, void *vinfo #endif +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN srname_len +#endif +); void chkxer(void) { - extern int cblas_ok, cblas_lerr, cblas_info; - extern int link_xerbla; + extern CBLAS_INT cblas_ok, cblas_lerr, cblas_info; + extern CBLAS_INT link_xerbla; extern char *cblas_rout; if (cblas_lerr == 1 ) { - printf("***** ILLEGAL VALUE OF PARAMETER NUMBER %d NOT DETECTED BY %s *****\n", cblas_info, cblas_rout); + printf("***** ILLEGAL VALUE OF PARAMETER NUMBER %d NOT DETECTED BY %s *****\n", (int) cblas_info, cblas_rout); cblas_ok = 0 ; } cblas_lerr = 1 ; } -void F77_z3chke(char * rout) { +void F77_z3chke(char *rout +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN rout_len +#endif +) { char *sf = ( rout ) ; double A[4] = {0.0,0.0,0.0,0.0}, B[4] = {0.0,0.0,0.0,0.0}, @@ -32,7 +40,7 @@ void F77_z3chke(char * rout) { ALPHA[2] = {0.0,0.0}, BETA[2] = {0.0,0.0}, RALPHA = 0.0, RBETA = 0.0; - extern int cblas_info, cblas_lerr, cblas_ok; + extern CBLAS_INT cblas_info, cblas_lerr, cblas_ok; extern int RowMajorStrg; extern char *cblas_rout; @@ -43,11 +51,242 @@ void F77_z3chke(char * rout) { if (link_xerbla) /* call these first to link */ { cblas_xerbla(cblas_info,cblas_rout,""); - F77_xerbla(cblas_rout,&cblas_info); + F77_xerbla(cblas_rout,&cblas_info, 1); } #endif - if (strncmp( sf,"cblas_zgemm" ,11)==0) { + link_xerbla = 0; + if (strncmp( sf,"cblas_zgemmtr" ,13)==0) { + cblas_rout = "cblas_zgemmtr" ; + + cblas_info = 1; + cblas_zgemmtr( INVALID, CblasUpper, CblasNoTrans, CblasNoTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 1; + cblas_zgemmtr( INVALID, CblasUpper, CblasNoTrans, CblasTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 1; + cblas_zgemmtr( INVALID, CblasUpper,CblasTrans, CblasNoTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 1; + cblas_zgemmtr( INVALID, CblasUpper, CblasTrans, CblasTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + cblas_info = 1; + cblas_zgemmtr( INVALID, CblasLower, CblasNoTrans, CblasNoTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 1; + cblas_zgemmtr( INVALID, CblasLower, CblasNoTrans, CblasTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 1; + cblas_zgemmtr( INVALID, CblasLower,CblasTrans, CblasNoTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 1; + cblas_zgemmtr( INVALID, CblasLower, CblasTrans, CblasTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + cblas_info = 2; RowMajorStrg = FALSE; + cblas_zgemmtr( CblasColMajor, INVALID, CblasNoTrans, CblasNoTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 2; RowMajorStrg = FALSE; + cblas_zgemmtr( CblasColMajor, INVALID, CblasNoTrans, CblasTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + cblas_info = 3; RowMajorStrg = FALSE; + cblas_zgemmtr( CblasColMajor, CblasUpper, INVALID, CblasNoTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 3; RowMajorStrg = FALSE; + cblas_zgemmtr( CblasColMajor, CblasUpper, INVALID, CblasTrans, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + cblas_info = 4; RowMajorStrg = FALSE; + cblas_zgemmtr( CblasColMajor, CblasUpper, CblasNoTrans, INVALID, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 4; RowMajorStrg = FALSE; + cblas_zgemmtr( CblasColMajor, CblasUpper, CblasTrans, INVALID, 0, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + + cblas_info = 5; RowMajorStrg = FALSE; + cblas_zgemmtr( CblasColMajor, CblasUpper, CblasNoTrans, CblasNoTrans, INVALID, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 5; RowMajorStrg = FALSE; + cblas_zgemmtr( CblasColMajor, CblasUpper, CblasNoTrans, CblasTrans, INVALID, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 5; RowMajorStrg = FALSE; + cblas_zgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasNoTrans, INVALID, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 5; RowMajorStrg = FALSE; + cblas_zgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasTrans, INVALID, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + cblas_info = 6; RowMajorStrg = FALSE; + cblas_zgemmtr( CblasColMajor, CblasUpper, CblasNoTrans, CblasNoTrans, 0, INVALID, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 6; RowMajorStrg = FALSE; + cblas_zgemmtr( CblasColMajor, CblasUpper, CblasNoTrans, CblasTrans, 0, INVALID, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 6; RowMajorStrg = FALSE; + cblas_zgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasNoTrans, 0, INVALID, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 6; RowMajorStrg = FALSE; + cblas_zgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasTrans, 0, INVALID, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + + cblas_info = 9; RowMajorStrg = FALSE; + cblas_zgemmtr( CblasColMajor, CblasUpper, CblasNoTrans, CblasNoTrans, 2, 0, + ALPHA, A, 1, B, 1, BETA, C, 2 ); + chkxer(); + cblas_info = 9; RowMajorStrg = FALSE; + cblas_zgemmtr( CblasColMajor, CblasUpper, CblasNoTrans, CblasTrans, 2, 0, + ALPHA, A, 1, B, 1, BETA, C, 2 ); + chkxer(); + cblas_info = 9; RowMajorStrg = FALSE; + cblas_zgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasNoTrans, 0, 2, + ALPHA, A, 1, B, 2, BETA, C, 1 ); + chkxer(); + cblas_info = 9; RowMajorStrg = FALSE; + cblas_zgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasTrans, 0, 2, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + cblas_info = 11; RowMajorStrg = FALSE; + cblas_zgemmtr( CblasColMajor, CblasUpper, CblasNoTrans, CblasNoTrans, 0, 2, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 11; RowMajorStrg = FALSE; + cblas_zgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasNoTrans, 0, 2, + ALPHA, A, 2, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 11; RowMajorStrg = FALSE; + cblas_zgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasTrans, 2, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + cblas_info = 14; RowMajorStrg = FALSE; + cblas_zgemmtr( CblasColMajor, CblasUpper, CblasNoTrans, CblasNoTrans, 2, 0, + ALPHA, A, 2, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 14; RowMajorStrg = FALSE; + cblas_zgemmtr( CblasColMajor, CblasUpper, CblasNoTrans, CblasTrans, 2, 0, + ALPHA, A, 2, B, 2, BETA, C, 1 ); + chkxer(); + + cblas_info = 14; RowMajorStrg = FALSE; + cblas_zgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasNoTrans, 2, 0, + ALPHA, A, 2, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 14; RowMajorStrg = FALSE; + cblas_zgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasTrans, 2, 0, + ALPHA, A, 2, B, 2, BETA, C, 1 ); + chkxer(); + + /* Row Major */ + cblas_info = 5; RowMajorStrg = TRUE; + cblas_zgemmtr( CblasRowMajor, CblasUpper, CblasNoTrans, CblasNoTrans, INVALID, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 5; RowMajorStrg = TRUE; + cblas_zgemmtr( CblasRowMajor, CblasUpper, CblasNoTrans, CblasTrans, INVALID, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 5; RowMajorStrg = TRUE; + cblas_zgemmtr( CblasRowMajor, CblasUpper, CblasTrans, CblasNoTrans, INVALID, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 5; RowMajorStrg = TRUE; + cblas_zgemmtr( CblasRowMajor, CblasUpper, CblasTrans, CblasTrans, INVALID, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + cblas_info = 6; RowMajorStrg = TRUE; + cblas_zgemmtr( CblasRowMajor, CblasUpper, CblasNoTrans, CblasNoTrans, 0, INVALID, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 6; RowMajorStrg = TRUE; + cblas_zgemmtr( CblasRowMajor, CblasUpper, CblasNoTrans, CblasTrans, 0, INVALID, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 6; RowMajorStrg = TRUE; + cblas_zgemmtr( CblasRowMajor, CblasUpper, CblasTrans, CblasNoTrans, 0, INVALID, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 6; RowMajorStrg = TRUE; + cblas_zgemmtr( CblasRowMajor, CblasUpper, CblasTrans, CblasTrans, 0, INVALID, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + cblas_info = 9; RowMajorStrg = TRUE; + cblas_zgemmtr( CblasRowMajor, CblasUpper, CblasNoTrans, CblasNoTrans, 0, 2, + ALPHA, A, 1, B, 1, BETA, C, 2 ); + chkxer(); + cblas_info = 9; RowMajorStrg = TRUE; + cblas_zgemmtr( CblasRowMajor, CblasUpper, CblasNoTrans, CblasTrans, 0, 2, + ALPHA, A, 1, B, 2, BETA, C, 2 ); + chkxer(); + cblas_info = 9; RowMajorStrg = TRUE; + cblas_zgemmtr( CblasRowMajor, CblasUpper, CblasTrans, CblasNoTrans, 2, 0, + ALPHA, A, 1, B, 2, BETA, C, 1 ); + chkxer(); + cblas_info = 9; RowMajorStrg = TRUE; + cblas_zgemmtr( CblasRowMajor, CblasUpper, CblasTrans, CblasTrans, 2, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + cblas_info = 11; RowMajorStrg = TRUE; + cblas_zgemmtr( CblasColMajor, CblasUpper, CblasNoTrans, CblasNoTrans, 0, 2, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 11; RowMajorStrg = TRUE; + cblas_zgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasNoTrans, 0, 2, + ALPHA, A, 2, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 11; RowMajorStrg = TRUE; + cblas_zgemmtr( CblasColMajor, CblasUpper, CblasTrans, CblasTrans, 2, 0, + ALPHA, A, 1, B, 1, BETA, C, 1 ); + chkxer(); + + cblas_info = 14; RowMajorStrg = TRUE; + cblas_zgemmtr( CblasRowMajor, CblasUpper, CblasNoTrans, CblasNoTrans, 2, 0, + ALPHA, A, 2, B, 2, BETA, C, 1 ); + chkxer(); + cblas_info = 14; RowMajorStrg = TRUE; + cblas_zgemmtr( CblasRowMajor, CblasUpper, CblasNoTrans, CblasTrans, 2, 0, + ALPHA, A, 2, B, 1, BETA, C, 1 ); + chkxer(); + cblas_info = 14; RowMajorStrg = TRUE; + cblas_zgemmtr( CblasRowMajor, CblasUpper, CblasTrans, CblasNoTrans, 2, 0, + ALPHA, A, 2, B, 2, BETA, C, 1 ); + chkxer(); + cblas_info = 14; RowMajorStrg = TRUE; + cblas_zgemmtr( CblasRowMajor, CblasUpper, CblasTrans, CblasTrans, 2, 0, + ALPHA, A, 2, B, 2, BETA, C, 1 ); + chkxer(); + + } else if (strncmp( sf,"cblas_zgemm" ,11)==0) { cblas_rout = "cblas_zgemm" ; cblas_info = 1; @@ -1702,7 +1941,7 @@ void F77_z3chke(char * rout) { } if (cblas_ok == 1 ) - printf(" %-12s PASSED THE TESTS OF ERROR-EXITS\n", cblas_rout); + printf(" %-13s PASSED THE TESTS OF ERROR-EXITS\n", cblas_rout); else printf("***** %s FAILED THE TESTS OF ERROR-EXITS *******\n",cblas_rout); } diff --git a/CBLAS/testing/c_zblas1.c b/CBLAS/testing/c_zblas1.c index 2b21d8f187..48d7eaf61f 100644 --- a/CBLAS/testing/c_zblas1.c +++ b/CBLAS/testing/c_zblas1.c @@ -8,67 +8,75 @@ */ #include "cblas_test.h" #include "cblas.h" -void F77_zaxpy(const int *N, const void *alpha, void *X, - const int *incX, void *Y, const int *incY) +void F77_zaxpy(const CBLAS_INT *N, const void *alpha, void *X, + const CBLAS_INT *incX, void *Y, const CBLAS_INT *incY) { cblas_zaxpy(*N, alpha, X, *incX, Y, *incY); return; } -void F77_zcopy(const int *N, void *X, const int *incX, - void *Y, const int *incY) + +void F77_zaxpby(const CBLAS_INT *N, const void *alpha, void *X, + const CBLAS_INT *incX, const void *beta, void *Y, const CBLAS_INT *incY) +{ + cblas_zaxpby(*N, alpha, X, *incX, beta, Y, *incY); + return; +} + +void F77_zcopy(const CBLAS_INT *N, void *X, const CBLAS_INT *incX, + void *Y, const CBLAS_INT *incY) { cblas_zcopy(*N, X, *incX, Y, *incY); return; } -void F77_zdotc(const int *N, const void *X, const int *incX, - const void *Y, const int *incY,void *dotc) +void F77_zdotc(const CBLAS_INT *N, const void *X, const CBLAS_INT *incX, + const void *Y, const CBLAS_INT *incY,void *dotc) { cblas_zdotc_sub(*N, X, *incX, Y, *incY, dotc); return; } -void F77_zdotu(const int *N, void *X, const int *incX, - void *Y, const int *incY,void *dotu) +void F77_zdotu(const CBLAS_INT *N, void *X, const CBLAS_INT *incX, + void *Y, const CBLAS_INT *incY,void *dotu) { cblas_zdotu_sub(*N, X, *incX, Y, *incY, dotu); return; } -void F77_zdscal(const int *N, const double *alpha, void *X, - const int *incX) +void F77_zdscal(const CBLAS_INT *N, const double *alpha, void *X, + const CBLAS_INT *incX) { cblas_zdscal(*N, *alpha, X, *incX); return; } -void F77_zscal(const int *N, const void * *alpha, void *X, - const int *incX) +void F77_zscal(const CBLAS_INT *N, const void * *alpha, void *X, + const CBLAS_INT *incX) { cblas_zscal(*N, alpha, X, *incX); return; } -void F77_zswap( const int *N, void *X, const int *incX, - void *Y, const int *incY) +void F77_zswap( const CBLAS_INT *N, void *X, const CBLAS_INT *incX, + void *Y, const CBLAS_INT *incY) { cblas_zswap(*N,X,*incX,Y,*incY); return; } -int F77_izamax(const int *N, const void *X, const int *incX) +CBLAS_INT F77_izamax(const CBLAS_INT *N, const void *X, const CBLAS_INT *incX) { if (*N < 1 || *incX < 1) return(0); return(cblas_izamax(*N, X, *incX)+1); } -double F77_dznrm2(const int *N, const void *X, const int *incX) +double F77_dznrm2(const CBLAS_INT *N, const void *X, const CBLAS_INT *incX) { return cblas_dznrm2(*N, X, *incX); } -double F77_dzasum(const int *N, void *X, const int *incX) +double F77_dzasum(const CBLAS_INT *N, void *X, const CBLAS_INT *incX) { return cblas_dzasum(*N, X, *incX); } diff --git a/CBLAS/testing/c_zblas2.c b/CBLAS/testing/c_zblas2.c index b6fbdd628d..0de71d2497 100644 --- a/CBLAS/testing/c_zblas2.c +++ b/CBLAS/testing/c_zblas2.c @@ -8,13 +8,17 @@ #include "cblas.h" #include "cblas_test.h" -void F77_zgemv(int *layout, char *transp, int *m, int *n, +void F77_zgemv(CBLAS_INT *layout, char *transp, CBLAS_INT *m, CBLAS_INT *n, const void *alpha, - CBLAS_TEST_ZOMPLEX *a, int *lda, const void *x, int *incx, - const void *beta, void *y, int *incy) { + CBLAS_TEST_ZOMPLEX *a, CBLAS_INT *lda, const void *x, CBLAS_INT *incx, + const void *beta, void *y, CBLAS_INT *incy +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN transp_len +#endif +) { CBLAS_TEST_ZOMPLEX *A; - int i,j,LDA; + CBLAS_INT i,j,LDA; CBLAS_TRANSPOSE trans; get_transpose_type(transp, &trans); @@ -38,13 +42,17 @@ void F77_zgemv(int *layout, char *transp, int *m, int *n, *m, *n, alpha, a, *lda, x, *incx, beta, y, *incy ); } -void F77_zgbmv(int *layout, char *transp, int *m, int *n, int *kl, int *ku, - CBLAS_TEST_ZOMPLEX *alpha, CBLAS_TEST_ZOMPLEX *a, int *lda, - CBLAS_TEST_ZOMPLEX *x, int *incx, - CBLAS_TEST_ZOMPLEX *beta, CBLAS_TEST_ZOMPLEX *y, int *incy) { +void F77_zgbmv(CBLAS_INT *layout, char *transp, CBLAS_INT *m, CBLAS_INT *n, CBLAS_INT *kl, CBLAS_INT *ku, + CBLAS_TEST_ZOMPLEX *alpha, CBLAS_TEST_ZOMPLEX *a, CBLAS_INT *lda, + CBLAS_TEST_ZOMPLEX *x, CBLAS_INT *incx, + CBLAS_TEST_ZOMPLEX *beta, CBLAS_TEST_ZOMPLEX *y, CBLAS_INT *incy +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN transp_len +#endif +) { CBLAS_TEST_ZOMPLEX *A; - int i,j,irow,jcol,LDA; + CBLAS_INT i,j,irow,jcol,LDA; CBLAS_TRANSPOSE trans; get_transpose_type(transp, &trans); @@ -85,12 +93,12 @@ void F77_zgbmv(int *layout, char *transp, int *m, int *n, int *kl, int *ku, *incx, beta, y, *incy ); } -void F77_zgeru(int *layout, int *m, int *n, CBLAS_TEST_ZOMPLEX *alpha, - CBLAS_TEST_ZOMPLEX *x, int *incx, CBLAS_TEST_ZOMPLEX *y, int *incy, - CBLAS_TEST_ZOMPLEX *a, int *lda){ +void F77_zgeru(CBLAS_INT *layout, CBLAS_INT *m, CBLAS_INT *n, CBLAS_TEST_ZOMPLEX *alpha, + CBLAS_TEST_ZOMPLEX *x, CBLAS_INT *incx, CBLAS_TEST_ZOMPLEX *y, CBLAS_INT *incy, + CBLAS_TEST_ZOMPLEX *a, CBLAS_INT *lda){ CBLAS_TEST_ZOMPLEX *A; - int i,j,LDA; + CBLAS_INT i,j,LDA; if (*layout == TEST_ROW_MJR) { LDA = *n+1; @@ -114,11 +122,11 @@ void F77_zgeru(int *layout, int *m, int *n, CBLAS_TEST_ZOMPLEX *alpha, cblas_zgeru( UNDEFINED, *m, *n, alpha, x, *incx, y, *incy, a, *lda ); } -void F77_zgerc(int *layout, int *m, int *n, CBLAS_TEST_ZOMPLEX *alpha, - CBLAS_TEST_ZOMPLEX *x, int *incx, CBLAS_TEST_ZOMPLEX *y, int *incy, - CBLAS_TEST_ZOMPLEX *a, int *lda) { +void F77_zgerc(CBLAS_INT *layout, CBLAS_INT *m, CBLAS_INT *n, CBLAS_TEST_ZOMPLEX *alpha, + CBLAS_TEST_ZOMPLEX *x, CBLAS_INT *incx, CBLAS_TEST_ZOMPLEX *y, CBLAS_INT *incy, + CBLAS_TEST_ZOMPLEX *a, CBLAS_INT *lda) { CBLAS_TEST_ZOMPLEX *A; - int i,j,LDA; + CBLAS_INT i,j,LDA; if (*layout == TEST_ROW_MJR) { LDA = *n+1; @@ -142,12 +150,16 @@ void F77_zgerc(int *layout, int *m, int *n, CBLAS_TEST_ZOMPLEX *alpha, cblas_zgerc( UNDEFINED, *m, *n, alpha, x, *incx, y, *incy, a, *lda ); } -void F77_zhemv(int *layout, char *uplow, int *n, CBLAS_TEST_ZOMPLEX *alpha, - CBLAS_TEST_ZOMPLEX *a, int *lda, CBLAS_TEST_ZOMPLEX *x, - int *incx, CBLAS_TEST_ZOMPLEX *beta, CBLAS_TEST_ZOMPLEX *y, int *incy){ +void F77_zhemv(CBLAS_INT *layout, char *uplow, CBLAS_INT *n, CBLAS_TEST_ZOMPLEX *alpha, + CBLAS_TEST_ZOMPLEX *a, CBLAS_INT *lda, CBLAS_TEST_ZOMPLEX *x, + CBLAS_INT *incx, CBLAS_TEST_ZOMPLEX *beta, CBLAS_TEST_ZOMPLEX *y, CBLAS_INT *incy +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len +#endif +){ CBLAS_TEST_ZOMPLEX *A; - int i,j,LDA; + CBLAS_INT i,j,LDA; CBLAS_UPLO uplo; get_uplo_type(uplow,&uplo); @@ -172,13 +184,17 @@ void F77_zhemv(int *layout, char *uplow, int *n, CBLAS_TEST_ZOMPLEX *alpha, beta, y, *incy ); } -void F77_zhbmv(int *layout, char *uplow, int *n, int *k, - CBLAS_TEST_ZOMPLEX *alpha, CBLAS_TEST_ZOMPLEX *a, int *lda, - CBLAS_TEST_ZOMPLEX *x, int *incx, CBLAS_TEST_ZOMPLEX *beta, - CBLAS_TEST_ZOMPLEX *y, int *incy){ +void F77_zhbmv(CBLAS_INT *layout, char *uplow, CBLAS_INT *n, CBLAS_INT *k, + CBLAS_TEST_ZOMPLEX *alpha, CBLAS_TEST_ZOMPLEX *a, CBLAS_INT *lda, + CBLAS_TEST_ZOMPLEX *x, CBLAS_INT *incx, CBLAS_TEST_ZOMPLEX *beta, + CBLAS_TEST_ZOMPLEX *y, CBLAS_INT *incy +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len +#endif +){ CBLAS_TEST_ZOMPLEX *A; -int i,irow,j,jcol,LDA; +CBLAS_INT i,irow,j,jcol,LDA; CBLAS_UPLO uplo; @@ -236,12 +252,16 @@ int i,irow,j,jcol,LDA; beta, y, *incy ); } -void F77_zhpmv(int *layout, char *uplow, int *n, CBLAS_TEST_ZOMPLEX *alpha, - CBLAS_TEST_ZOMPLEX *ap, CBLAS_TEST_ZOMPLEX *x, int *incx, - CBLAS_TEST_ZOMPLEX *beta, CBLAS_TEST_ZOMPLEX *y, int *incy){ +void F77_zhpmv(CBLAS_INT *layout, char *uplow, CBLAS_INT *n, CBLAS_TEST_ZOMPLEX *alpha, + CBLAS_TEST_ZOMPLEX *ap, CBLAS_TEST_ZOMPLEX *x, CBLAS_INT *incx, + CBLAS_TEST_ZOMPLEX *beta, CBLAS_TEST_ZOMPLEX *y, CBLAS_INT *incy +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len +#endif +){ CBLAS_TEST_ZOMPLEX *A, *AP; - int i,j,k,LDA; + CBLAS_INT i,j,k,LDA; CBLAS_UPLO uplo; get_uplo_type(uplow,&uplo); @@ -292,11 +312,15 @@ void F77_zhpmv(int *layout, char *uplow, int *n, CBLAS_TEST_ZOMPLEX *alpha, *incy ); } -void F77_ztbmv(int *layout, char *uplow, char *transp, char *diagn, - int *n, int *k, CBLAS_TEST_ZOMPLEX *a, int *lda, CBLAS_TEST_ZOMPLEX *x, - int *incx) { +void F77_ztbmv(CBLAS_INT *layout, char *uplow, char *transp, char *diagn, + CBLAS_INT *n, CBLAS_INT *k, CBLAS_TEST_ZOMPLEX *a, CBLAS_INT *lda, CBLAS_TEST_ZOMPLEX *x, + CBLAS_INT *incx +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len, FORTRAN_STRLEN transp_len, FORTRAN_STRLEN diagn_len +#endif +) { CBLAS_TEST_ZOMPLEX *A; - int irow, jcol, i, j, LDA; + CBLAS_INT irow, jcol, i, j, LDA; CBLAS_TRANSPOSE trans; CBLAS_UPLO uplo; CBLAS_DIAG diag; @@ -355,12 +379,16 @@ void F77_ztbmv(int *layout, char *uplow, char *transp, char *diagn, cblas_ztbmv(UNDEFINED, uplo, trans, diag, *n, *k, a, *lda, x, *incx); } -void F77_ztbsv(int *layout, char *uplow, char *transp, char *diagn, - int *n, int *k, CBLAS_TEST_ZOMPLEX *a, int *lda, CBLAS_TEST_ZOMPLEX *x, - int *incx) { +void F77_ztbsv(CBLAS_INT *layout, char *uplow, char *transp, char *diagn, + CBLAS_INT *n, CBLAS_INT *k, CBLAS_TEST_ZOMPLEX *a, CBLAS_INT *lda, CBLAS_TEST_ZOMPLEX *x, + CBLAS_INT *incx +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len, FORTRAN_STRLEN transp_len, FORTRAN_STRLEN diagn_len +#endif +) { CBLAS_TEST_ZOMPLEX *A; - int irow, jcol, i, j, LDA; + CBLAS_INT irow, jcol, i, j, LDA; CBLAS_TRANSPOSE trans; CBLAS_UPLO uplo; CBLAS_DIAG diag; @@ -419,10 +447,14 @@ void F77_ztbsv(int *layout, char *uplow, char *transp, char *diagn, cblas_ztbsv(UNDEFINED, uplo, trans, diag, *n, *k, a, *lda, x, *incx); } -void F77_ztpmv(int *layout, char *uplow, char *transp, char *diagn, - int *n, CBLAS_TEST_ZOMPLEX *ap, CBLAS_TEST_ZOMPLEX *x, int *incx) { +void F77_ztpmv(CBLAS_INT *layout, char *uplow, char *transp, char *diagn, + CBLAS_INT *n, CBLAS_TEST_ZOMPLEX *ap, CBLAS_TEST_ZOMPLEX *x, CBLAS_INT *incx +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len, FORTRAN_STRLEN transp_len, FORTRAN_STRLEN diagn_len +#endif +) { CBLAS_TEST_ZOMPLEX *A, *AP; - int i, j, k, LDA; + CBLAS_INT i, j, k, LDA; CBLAS_TRANSPOSE trans; CBLAS_UPLO uplo; CBLAS_DIAG diag; @@ -474,10 +506,14 @@ void F77_ztpmv(int *layout, char *uplow, char *transp, char *diagn, cblas_ztpmv( UNDEFINED, uplo, trans, diag, *n, ap, x, *incx ); } -void F77_ztpsv(int *layout, char *uplow, char *transp, char *diagn, - int *n, CBLAS_TEST_ZOMPLEX *ap, CBLAS_TEST_ZOMPLEX *x, int *incx) { +void F77_ztpsv(CBLAS_INT *layout, char *uplow, char *transp, char *diagn, + CBLAS_INT *n, CBLAS_TEST_ZOMPLEX *ap, CBLAS_TEST_ZOMPLEX *x, CBLAS_INT *incx +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len, FORTRAN_STRLEN transp_len, FORTRAN_STRLEN diagn_len +#endif +) { CBLAS_TEST_ZOMPLEX *A, *AP; - int i, j, k, LDA; + CBLAS_INT i, j, k, LDA; CBLAS_TRANSPOSE trans; CBLAS_UPLO uplo; CBLAS_DIAG diag; @@ -529,11 +565,15 @@ void F77_ztpsv(int *layout, char *uplow, char *transp, char *diagn, cblas_ztpsv( UNDEFINED, uplo, trans, diag, *n, ap, x, *incx ); } -void F77_ztrmv(int *layout, char *uplow, char *transp, char *diagn, - int *n, CBLAS_TEST_ZOMPLEX *a, int *lda, CBLAS_TEST_ZOMPLEX *x, - int *incx) { +void F77_ztrmv(CBLAS_INT *layout, char *uplow, char *transp, char *diagn, + CBLAS_INT *n, CBLAS_TEST_ZOMPLEX *a, CBLAS_INT *lda, CBLAS_TEST_ZOMPLEX *x, + CBLAS_INT *incx +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len, FORTRAN_STRLEN transp_len, FORTRAN_STRLEN diagn_len +#endif +) { CBLAS_TEST_ZOMPLEX *A; - int i,j,LDA; + CBLAS_INT i,j,LDA; CBLAS_TRANSPOSE trans; CBLAS_UPLO uplo; CBLAS_DIAG diag; @@ -558,11 +598,15 @@ void F77_ztrmv(int *layout, char *uplow, char *transp, char *diagn, else cblas_ztrmv(UNDEFINED, uplo, trans, diag, *n, a, *lda, x, *incx); } -void F77_ztrsv(int *layout, char *uplow, char *transp, char *diagn, - int *n, CBLAS_TEST_ZOMPLEX *a, int *lda, CBLAS_TEST_ZOMPLEX *x, - int *incx) { +void F77_ztrsv(CBLAS_INT *layout, char *uplow, char *transp, char *diagn, + CBLAS_INT *n, CBLAS_TEST_ZOMPLEX *a, CBLAS_INT *lda, CBLAS_TEST_ZOMPLEX *x, + CBLAS_INT *incx +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len, FORTRAN_STRLEN transp_len, FORTRAN_STRLEN diagn_len +#endif +) { CBLAS_TEST_ZOMPLEX *A; - int i,j,LDA; + CBLAS_INT i,j,LDA; CBLAS_TRANSPOSE trans; CBLAS_UPLO uplo; CBLAS_DIAG diag; @@ -588,10 +632,14 @@ void F77_ztrsv(int *layout, char *uplow, char *transp, char *diagn, cblas_ztrsv(UNDEFINED, uplo, trans, diag, *n, a, *lda, x, *incx ); } -void F77_zhpr(int *layout, char *uplow, int *n, double *alpha, - CBLAS_TEST_ZOMPLEX *x, int *incx, CBLAS_TEST_ZOMPLEX *ap) { +void F77_zhpr(CBLAS_INT *layout, char *uplow, CBLAS_INT *n, double *alpha, + CBLAS_TEST_ZOMPLEX *x, CBLAS_INT *incx, CBLAS_TEST_ZOMPLEX *ap +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len +#endif +) { CBLAS_TEST_ZOMPLEX *A, *AP; - int i,j,k,LDA; + CBLAS_INT i,j,k,LDA; CBLAS_UPLO uplo; get_uplo_type(uplow,&uplo); @@ -663,11 +711,15 @@ void F77_zhpr(int *layout, char *uplow, int *n, double *alpha, cblas_zhpr(UNDEFINED, uplo, *n, *alpha, x, *incx, ap ); } -void F77_zhpr2(int *layout, char *uplow, int *n, CBLAS_TEST_ZOMPLEX *alpha, - CBLAS_TEST_ZOMPLEX *x, int *incx, CBLAS_TEST_ZOMPLEX *y, int *incy, - CBLAS_TEST_ZOMPLEX *ap) { +void F77_zhpr2(CBLAS_INT *layout, char *uplow, CBLAS_INT *n, CBLAS_TEST_ZOMPLEX *alpha, + CBLAS_TEST_ZOMPLEX *x, CBLAS_INT *incx, CBLAS_TEST_ZOMPLEX *y, CBLAS_INT *incy, + CBLAS_TEST_ZOMPLEX *ap +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len +#endif +) { CBLAS_TEST_ZOMPLEX *A, *AP; - int i,j,k,LDA; + CBLAS_INT i,j,k,LDA; CBLAS_UPLO uplo; get_uplo_type(uplow,&uplo); @@ -740,10 +792,14 @@ void F77_zhpr2(int *layout, char *uplow, int *n, CBLAS_TEST_ZOMPLEX *alpha, cblas_zhpr2( UNDEFINED, uplo, *n, alpha, x, *incx, y, *incy, ap ); } -void F77_zher(int *layout, char *uplow, int *n, double *alpha, - CBLAS_TEST_ZOMPLEX *x, int *incx, CBLAS_TEST_ZOMPLEX *a, int *lda) { +void F77_zher(CBLAS_INT *layout, char *uplow, CBLAS_INT *n, double *alpha, + CBLAS_TEST_ZOMPLEX *x, CBLAS_INT *incx, CBLAS_TEST_ZOMPLEX *a, CBLAS_INT *lda +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len +#endif +) { CBLAS_TEST_ZOMPLEX *A; - int i,j,LDA; + CBLAS_INT i,j,LDA; CBLAS_UPLO uplo; get_uplo_type(uplow,&uplo); @@ -772,12 +828,16 @@ void F77_zher(int *layout, char *uplow, int *n, double *alpha, cblas_zher( UNDEFINED, uplo, *n, *alpha, x, *incx, a, *lda ); } -void F77_zher2(int *layout, char *uplow, int *n, CBLAS_TEST_ZOMPLEX *alpha, - CBLAS_TEST_ZOMPLEX *x, int *incx, CBLAS_TEST_ZOMPLEX *y, int *incy, - CBLAS_TEST_ZOMPLEX *a, int *lda) { +void F77_zher2(CBLAS_INT *layout, char *uplow, CBLAS_INT *n, CBLAS_TEST_ZOMPLEX *alpha, + CBLAS_TEST_ZOMPLEX *x, CBLAS_INT *incx, CBLAS_TEST_ZOMPLEX *y, CBLAS_INT *incy, + CBLAS_TEST_ZOMPLEX *a, CBLAS_INT *lda +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len +#endif +) { CBLAS_TEST_ZOMPLEX *A; - int i,j,LDA; + CBLAS_INT i,j,LDA; CBLAS_UPLO uplo; get_uplo_type(uplow,&uplo); diff --git a/CBLAS/testing/c_zblas3.c b/CBLAS/testing/c_zblas3.c index 65a821359c..43dd335df7 100644 --- a/CBLAS/testing/c_zblas3.c +++ b/CBLAS/testing/c_zblas3.c @@ -5,19 +5,24 @@ * Modified by T. H. Do, 4/15/98, SGI/CRAY Research. */ #include +#include #include "cblas.h" #include "cblas_test.h" #define TEST_COL_MJR 0 #define TEST_ROW_MJR 1 #define UNDEFINED -1 -void F77_zgemm(int *layout, char *transpa, char *transpb, int *m, int *n, - int *k, CBLAS_TEST_ZOMPLEX *alpha, CBLAS_TEST_ZOMPLEX *a, int *lda, - CBLAS_TEST_ZOMPLEX *b, int *ldb, CBLAS_TEST_ZOMPLEX *beta, - CBLAS_TEST_ZOMPLEX *c, int *ldc ) { +void F77_zgemm(CBLAS_INT *layout, char *transpa, char *transpb, CBLAS_INT *m, CBLAS_INT *n, + CBLAS_INT *k, CBLAS_TEST_ZOMPLEX *alpha, CBLAS_TEST_ZOMPLEX *a, CBLAS_INT *lda, + CBLAS_TEST_ZOMPLEX *b, CBLAS_INT *ldb, CBLAS_TEST_ZOMPLEX *beta, + CBLAS_TEST_ZOMPLEX *c, CBLAS_INT *ldc +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN transpa_len, FORTRAN_STRLEN transpb_len +#endif +) { CBLAS_TEST_ZOMPLEX *A, *B, *C; - int i,j,LDA, LDB, LDC; + CBLAS_INT i,j,LDA, LDB, LDC; CBLAS_TRANSPOSE transa, transb; get_transpose_type(transpa, &transa); @@ -87,13 +92,99 @@ void F77_zgemm(int *layout, char *transpa, char *transpb, int *m, int *n, cblas_zgemm( UNDEFINED, transa, transb, *m, *n, *k, alpha, a, *lda, b, *ldb, beta, c, *ldc ); } -void F77_zhemm(int *layout, char *rtlf, char *uplow, int *m, int *n, - CBLAS_TEST_ZOMPLEX *alpha, CBLAS_TEST_ZOMPLEX *a, int *lda, - CBLAS_TEST_ZOMPLEX *b, int *ldb, CBLAS_TEST_ZOMPLEX *beta, - CBLAS_TEST_ZOMPLEX *c, int *ldc ) { + + +void F77_zgemmtr(CBLAS_INT *layout, char *uplop, char *transpa, char *transpb, CBLAS_INT *n, + CBLAS_INT *k, CBLAS_TEST_ZOMPLEX *alpha, CBLAS_TEST_ZOMPLEX *a, CBLAS_INT *lda, + CBLAS_TEST_ZOMPLEX *b, CBLAS_INT *ldb, CBLAS_TEST_ZOMPLEX *beta, + CBLAS_TEST_ZOMPLEX *c, CBLAS_INT *ldc ) { + + CBLAS_TEST_ZOMPLEX *A, *B, *C; + CBLAS_INT i,j,LDA, LDB, LDC; + CBLAS_TRANSPOSE transa, transb; + CBLAS_UPLO uplo; + + get_transpose_type(transpa, &transa); + get_transpose_type(transpb, &transb); + get_uplo_type(uplop, &uplo); + + if (*layout == TEST_ROW_MJR) { + if (transa == CblasNoTrans) { + LDA = *k+1; + A=(CBLAS_TEST_ZOMPLEX*)malloc((*n)*LDA*sizeof(CBLAS_TEST_ZOMPLEX)); + for( i=0; i<*n; i++ ) + for( j=0; j<*k; j++ ) { + A[i*LDA+j].real=a[j*(*lda)+i].real; + A[i*LDA+j].imag=a[j*(*lda)+i].imag; + } + } + else { + LDA = *n+1; + A=(CBLAS_TEST_ZOMPLEX* )malloc(LDA*(*k)*sizeof(CBLAS_TEST_ZOMPLEX)); + for( i=0; i<*k; i++ ) + for( j=0; j<*n; j++ ) { + A[i*LDA+j].real=a[j*(*lda)+i].real; + A[i*LDA+j].imag=a[j*(*lda)+i].imag; + } + } + + if (transb == CblasNoTrans) { + LDB = *n+1; + B=(CBLAS_TEST_ZOMPLEX* )malloc((*k)*LDB*sizeof(CBLAS_TEST_ZOMPLEX) ); + for( i=0; i<*k; i++ ) + for( j=0; j<*n; j++ ) { + B[i*LDB+j].real=b[j*(*ldb)+i].real; + B[i*LDB+j].imag=b[j*(*ldb)+i].imag; + } + } + else { + LDB = *k+1; + B=(CBLAS_TEST_ZOMPLEX* )malloc(LDB*(*n)*sizeof(CBLAS_TEST_ZOMPLEX)); + for( i=0; i<*n; i++ ) + for( j=0; j<*k; j++ ) { + B[i*LDB+j].real=b[j*(*ldb)+i].real; + B[i*LDB+j].imag=b[j*(*ldb)+i].imag; + } + } + + LDC = *n+1; + C=(CBLAS_TEST_ZOMPLEX* )malloc((*n)*LDC*sizeof(CBLAS_TEST_ZOMPLEX)); + for( j=0; j<*n; j++ ) + for( i=0; i<*n; i++ ) { + C[i*LDC+j].real=c[j*(*ldc)+i].real; + C[i*LDC+j].imag=c[j*(*ldc)+i].imag; + } + cblas_zgemmtr( CblasRowMajor, uplo, transa, transb, *n, *k, alpha, A, LDA, + B, LDB, beta, C, LDC ); + for( j=0; j<*n; j++ ) + for( i=0; i<*n; i++ ) { + c[j*(*ldc)+i].real=C[i*LDC+j].real; + c[j*(*ldc)+i].imag=C[i*LDC+j].imag; + } + free(A); + free(B); + free(C); + } + else if (*layout == TEST_COL_MJR) + cblas_zgemmtr( CblasColMajor, uplo, transa, transb, *n, *k, alpha, a, *lda, + b, *ldb, beta, c, *ldc ); + else + cblas_zgemmtr( UNDEFINED, uplo, transa, transb, *n, *k, alpha, a, *lda, + b, *ldb, beta, c, *ldc ); +} + + +void F77_zhemm(CBLAS_INT *layout, char *rtlf, char *uplow, CBLAS_INT *m, CBLAS_INT *n, + CBLAS_TEST_ZOMPLEX *alpha, CBLAS_TEST_ZOMPLEX *a, CBLAS_INT *lda, + CBLAS_TEST_ZOMPLEX *b, CBLAS_INT *ldb, CBLAS_TEST_ZOMPLEX *beta, + CBLAS_TEST_ZOMPLEX *c, CBLAS_INT *ldc +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN rtlf_len, FORTRAN_STRLEN uplow_len +#endif +) { CBLAS_TEST_ZOMPLEX *A, *B, *C; - int i,j,LDA, LDB, LDC; + CBLAS_INT i,j,LDA, LDB, LDC; CBLAS_UPLO uplo; CBLAS_SIDE side; @@ -151,13 +242,17 @@ void F77_zhemm(int *layout, char *rtlf, char *uplow, int *m, int *n, cblas_zhemm( UNDEFINED, side, uplo, *m, *n, alpha, a, *lda, b, *ldb, beta, c, *ldc ); } -void F77_zsymm(int *layout, char *rtlf, char *uplow, int *m, int *n, - CBLAS_TEST_ZOMPLEX *alpha, CBLAS_TEST_ZOMPLEX *a, int *lda, - CBLAS_TEST_ZOMPLEX *b, int *ldb, CBLAS_TEST_ZOMPLEX *beta, - CBLAS_TEST_ZOMPLEX *c, int *ldc ) { +void F77_zsymm(CBLAS_INT *layout, char *rtlf, char *uplow, CBLAS_INT *m, CBLAS_INT *n, + CBLAS_TEST_ZOMPLEX *alpha, CBLAS_TEST_ZOMPLEX *a, CBLAS_INT *lda, + CBLAS_TEST_ZOMPLEX *b, CBLAS_INT *ldb, CBLAS_TEST_ZOMPLEX *beta, + CBLAS_TEST_ZOMPLEX *c, CBLAS_INT *ldc +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN rtlf_len, FORTRAN_STRLEN uplow_len +#endif +) { CBLAS_TEST_ZOMPLEX *A, *B, *C; - int i,j,LDA, LDB, LDC; + CBLAS_INT i,j,LDA, LDB, LDC; CBLAS_UPLO uplo; CBLAS_SIDE side; @@ -206,11 +301,15 @@ void F77_zsymm(int *layout, char *rtlf, char *uplow, int *m, int *n, beta, c, *ldc ); } -void F77_zherk(int *layout, char *uplow, char *transp, int *n, int *k, - double *alpha, CBLAS_TEST_ZOMPLEX *a, int *lda, - double *beta, CBLAS_TEST_ZOMPLEX *c, int *ldc ) { +void F77_zherk(CBLAS_INT *layout, char *uplow, char *transp, CBLAS_INT *n, CBLAS_INT *k, + double *alpha, CBLAS_TEST_ZOMPLEX *a, CBLAS_INT *lda, + double *beta, CBLAS_TEST_ZOMPLEX *c, CBLAS_INT *ldc +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len, FORTRAN_STRLEN transp_len +#endif +) { - int i,j,LDA,LDC; + CBLAS_INT i,j,LDA,LDC; CBLAS_TEST_ZOMPLEX *A, *C; CBLAS_UPLO uplo; CBLAS_TRANSPOSE trans; @@ -262,11 +361,15 @@ void F77_zherk(int *layout, char *uplow, char *transp, int *n, int *k, c, *ldc ); } -void F77_zsyrk(int *layout, char *uplow, char *transp, int *n, int *k, - CBLAS_TEST_ZOMPLEX *alpha, CBLAS_TEST_ZOMPLEX *a, int *lda, - CBLAS_TEST_ZOMPLEX *beta, CBLAS_TEST_ZOMPLEX *c, int *ldc ) { +void F77_zsyrk(CBLAS_INT *layout, char *uplow, char *transp, CBLAS_INT *n, CBLAS_INT *k, + CBLAS_TEST_ZOMPLEX *alpha, CBLAS_TEST_ZOMPLEX *a, CBLAS_INT *lda, + CBLAS_TEST_ZOMPLEX *beta, CBLAS_TEST_ZOMPLEX *c, CBLAS_INT *ldc +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len, FORTRAN_STRLEN transp_len +#endif +) { - int i,j,LDA,LDC; + CBLAS_INT i,j,LDA,LDC; CBLAS_TEST_ZOMPLEX *A, *C; CBLAS_UPLO uplo; CBLAS_TRANSPOSE trans; @@ -317,11 +420,15 @@ void F77_zsyrk(int *layout, char *uplow, char *transp, int *n, int *k, cblas_zsyrk(UNDEFINED, uplo, trans, *n, *k, alpha, a, *lda, beta, c, *ldc ); } -void F77_zher2k(int *layout, char *uplow, char *transp, int *n, int *k, - CBLAS_TEST_ZOMPLEX *alpha, CBLAS_TEST_ZOMPLEX *a, int *lda, - CBLAS_TEST_ZOMPLEX *b, int *ldb, double *beta, - CBLAS_TEST_ZOMPLEX *c, int *ldc ) { - int i,j,LDA,LDB,LDC; +void F77_zher2k(CBLAS_INT *layout, char *uplow, char *transp, CBLAS_INT *n, CBLAS_INT *k, + CBLAS_TEST_ZOMPLEX *alpha, CBLAS_TEST_ZOMPLEX *a, CBLAS_INT *lda, + CBLAS_TEST_ZOMPLEX *b, CBLAS_INT *ldb, double *beta, + CBLAS_TEST_ZOMPLEX *c, CBLAS_INT *ldc +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len, FORTRAN_STRLEN transp_len +#endif +) { + CBLAS_INT i,j,LDA,LDB,LDC; CBLAS_TEST_ZOMPLEX *A, *B, *C; CBLAS_UPLO uplo; CBLAS_TRANSPOSE trans; @@ -381,11 +488,15 @@ void F77_zher2k(int *layout, char *uplow, char *transp, int *n, int *k, cblas_zher2k(UNDEFINED, uplo, trans, *n, *k, alpha, a, *lda, b, *ldb, *beta, c, *ldc ); } -void F77_zsyr2k(int *layout, char *uplow, char *transp, int *n, int *k, - CBLAS_TEST_ZOMPLEX *alpha, CBLAS_TEST_ZOMPLEX *a, int *lda, - CBLAS_TEST_ZOMPLEX *b, int *ldb, CBLAS_TEST_ZOMPLEX *beta, - CBLAS_TEST_ZOMPLEX *c, int *ldc ) { - int i,j,LDA,LDB,LDC; +void F77_zsyr2k(CBLAS_INT *layout, char *uplow, char *transp, CBLAS_INT *n, CBLAS_INT *k, + CBLAS_TEST_ZOMPLEX *alpha, CBLAS_TEST_ZOMPLEX *a, CBLAS_INT *lda, + CBLAS_TEST_ZOMPLEX *b, CBLAS_INT *ldb, CBLAS_TEST_ZOMPLEX *beta, + CBLAS_TEST_ZOMPLEX *c, CBLAS_INT *ldc +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN uplow_len, FORTRAN_STRLEN transp_len +#endif +) { + CBLAS_INT i,j,LDA,LDB,LDC; CBLAS_TEST_ZOMPLEX *A, *B, *C; CBLAS_UPLO uplo; CBLAS_TRANSPOSE trans; @@ -445,10 +556,14 @@ void F77_zsyr2k(int *layout, char *uplow, char *transp, int *n, int *k, cblas_zsyr2k(UNDEFINED, uplo, trans, *n, *k, alpha, a, *lda, b, *ldb, beta, c, *ldc ); } -void F77_ztrmm(int *layout, char *rtlf, char *uplow, char *transp, char *diagn, - int *m, int *n, CBLAS_TEST_ZOMPLEX *alpha, CBLAS_TEST_ZOMPLEX *a, - int *lda, CBLAS_TEST_ZOMPLEX *b, int *ldb) { - int i,j,LDA,LDB; +void F77_ztrmm(CBLAS_INT *layout, char *rtlf, char *uplow, char *transp, char *diagn, + CBLAS_INT *m, CBLAS_INT *n, CBLAS_TEST_ZOMPLEX *alpha, CBLAS_TEST_ZOMPLEX *a, + CBLAS_INT *lda, CBLAS_TEST_ZOMPLEX *b, CBLAS_INT *ldb +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN rtlf_len, FORTRAN_STRLEN uplow_len, FORTRAN_STRLEN transp_len, FORTRAN_STRLEN diagn_len +#endif +) { + CBLAS_INT i,j,LDA,LDB; CBLAS_TEST_ZOMPLEX *A, *B; CBLAS_SIDE side; CBLAS_DIAG diag; @@ -504,10 +619,14 @@ void F77_ztrmm(int *layout, char *rtlf, char *uplow, char *transp, char *diagn, a, *lda, b, *ldb); } -void F77_ztrsm(int *layout, char *rtlf, char *uplow, char *transp, char *diagn, - int *m, int *n, CBLAS_TEST_ZOMPLEX *alpha, CBLAS_TEST_ZOMPLEX *a, - int *lda, CBLAS_TEST_ZOMPLEX *b, int *ldb) { - int i,j,LDA,LDB; +void F77_ztrsm(CBLAS_INT *layout, char *rtlf, char *uplow, char *transp, char *diagn, + CBLAS_INT *m, CBLAS_INT *n, CBLAS_TEST_ZOMPLEX *alpha, CBLAS_TEST_ZOMPLEX *a, + CBLAS_INT *lda, CBLAS_TEST_ZOMPLEX *b, CBLAS_INT *ldb +#ifdef BLAS_FORTRAN_STRLEN_END + , FORTRAN_STRLEN rtlf_len, FORTRAN_STRLEN uplow_len, FORTRAN_STRLEN transp_len, FORTRAN_STRLEN diagn_len +#endif +) { + CBLAS_INT i,j,LDA,LDB; CBLAS_TEST_ZOMPLEX *A, *B; CBLAS_SIDE side; CBLAS_DIAG diag; diff --git a/CBLAS/testing/c_zblat1.f b/CBLAS/testing/c_zblat1.f index cd0c8541df..6454dba172 100644 --- a/CBLAS/testing/c_zblat1.f +++ b/CBLAS/testing/c_zblat1.f @@ -1,4 +1,6 @@ +* ===================================================================== PROGRAM ZCBLAT1 + IMPLICIT NONE * Test program for the COMPLEX*16 Level 1 CBLAS. * Based upon the original CBLAS test routine together with: * F06GAF Example Program Text @@ -19,7 +21,7 @@ PROGRAM ZCBLAT1 DATA SFAC/9.765625D-4/ * .. Executable Statements .. WRITE (NOUT,99999) - DO 20 IC = 1, 10 + DO 20 IC = 1, 11 ICASE = IC CALL HEADER * @@ -32,7 +34,7 @@ PROGRAM ZCBLAT1 INCX = 9999 INCY = 9999 MODE = 9999 - IF (ICASE.LE.5) THEN + IF (ICASE.LE.5 .OR. ICASE .EQ. 11) THEN CALL CHECK2(SFAC) ELSE IF (ICASE.GE.6) THEN CALL CHECK1(SFAC) @@ -45,7 +47,10 @@ PROGRAM ZCBLAT1 99999 FORMAT (' Complex CBLAS Test Program Results',/1X) 99998 FORMAT (' ----- PASS -----') END + +* ===================================================================== SUBROUTINE HEADER + IMPLICIT NONE * .. Parameters .. INTEGER NOUT PARAMETER (NOUT=6) @@ -53,7 +58,7 @@ SUBROUTINE HEADER INTEGER ICASE, INCX, INCY, MODE, N LOGICAL PASS * .. Local Arrays .. - CHARACTER*15 L(10) + CHARACTER*15 L(11) * .. Common blocks .. COMMON /COMBLA/ICASE, N, INCX, INCY, MODE, PASS * .. Data statements .. @@ -67,13 +72,18 @@ SUBROUTINE HEADER DATA L(8)/'CBLAS_ZSCAL'/ DATA L(9)/'CBLAS_ZDSCAL'/ DATA L(10)/'CBLAS_IZAMAX'/ + DATA L(11)/'CBLAS_ZAXPBY'/ + * .. Executable Statements .. WRITE (NOUT,99999) ICASE, L(ICASE) RETURN * 99999 FORMAT (/' Test of subprogram number',I3,9X,A15) END + +* ===================================================================== SUBROUTINE CHECK1(SFAC) + IMPLICIT NONE * .. Parameters .. INTEGER NOUT PARAMETER (NOUT=6) @@ -274,7 +284,10 @@ SUBROUTINE CHECK1(SFAC) END IF RETURN END + +* ===================================================================== SUBROUTINE CHECK2(SFAC) + IMPLICIT NONE * .. Parameters .. INTEGER NOUT PARAMETER (NOUT=6) @@ -284,23 +297,26 @@ SUBROUTINE CHECK2(SFAC) INTEGER ICASE, INCX, INCY, MODE, N LOGICAL PASS * .. Local Scalars .. - COMPLEX*16 CA,ZTEMP + COMPLEX*16 CA,CB,ZTEMP INTEGER I, J, KI, KN, KSIZE, LENX, LENY, MX, MY * .. Local Arrays .. COMPLEX*16 CDOT(1), CSIZE1(4), CSIZE2(7,2), CSIZE3(14), + CT10X(7,4,4), CT10Y(7,4,4), CT6(4,4), CT7(4,4), - + CT8(7,4,4), CX(7), CX1(7), CY(7), CY1(7) + + CT8(7,4,4), CX(7), CX1(7), CY(7), CY1(7), + + CT11(7,4,4) INTEGER INCXS(4), INCYS(4), LENS(4,2), NS(4) * .. External Functions .. EXTERNAL ZDOTCTEST, ZDOTUTEST * .. External Subroutines .. EXTERNAL ZAXPYTEST, ZCOPYTEST, ZSWAPTEST, CTEST + + ZAXPBYTEST * .. Intrinsic Functions .. INTRINSIC ABS, MIN * .. Common blocks .. COMMON /COMBLA/ICASE, N, INCX, INCY, MODE, PASS * .. Data statements .. DATA CA/(0.4D0,-0.7D0)/ + DATA CB/(0.7D0,-0.4D0)/ DATA INCXS/1, 2, -2, -1/ DATA INCYS/1, -2, 1, -2/ DATA LENS/1, 1, 2, 4, 1, 1, 3, 7/ @@ -470,6 +486,53 @@ SUBROUTINE CHECK2(SFAC) + (1.54D0,1.54D0), (1.54D0,1.54D0), + (1.54D0,1.54D0), (1.54D0,1.54D0), + (1.54D0,1.54D0), (1.54D0,1.54D0)/ + DATA ((CT11(I,J,1),I=1,7),J=1,4)/(0.6D0,-0.6D0), + + (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0), + + (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0), + + (-0.1D0,-1.47D0), (0.0D0,0.0D0), (0.0D0,0.0D0), + + (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0), + + (0.0D0,0.0D0), (-0.1D0,-1.47D0), + + (-1.08D0,0.71D0), (0.0D0,0.0D0), (0.0D0,0.0D0), + + (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0), + + (-0.1D0,-1.47D0), (-1.08D0,0.71D0), + + (-0.42D0,-0.99D0), (-0.61D0,-0.85D0), + + (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0)/ + DATA ((CT11(I,J,2),I=1,7),J=1,4)/(0.6D0,-0.6D0), + + (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0), + + (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0), + + (-0.1D0,-1.47D0), (0.0D0,0.0D0), (0.0D0,0.0D0), + + (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0), + + (0.0D0,0.0D0), (-0.49D0,-0.95D0), + + (-0.9D0,0.5D0),(-0.03D0,-1.51D0), (0.0D0,0.0D0), + + (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0), + + (0.36D0,0.00D0), (-0.9D0,0.5D0), + + (-0.39D0,-0.23D0), (0.1D0,-0.5D0), + + (-0.82D0,-0.39D0), (-0.5D0,-0.3D0), + + (0.0D0,-1.62D0)/ + DATA ((CT11(I,J,3),I=1,7),J=1,4)/(0.6D0,-0.6D0), + + (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0), + + (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0), + + (-0.1D0,-1.47D0), (0.0D0,0.0D0), (0.0D0,0.0D0), + + (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0), + + (0.0D0,0.0D0), (-0.49D0,-0.95D0), + + (-0.71D0,-0.1D0), (0.0D0,0.0D0), (0.0D0,0.0D0), + + (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0), + + (0.36D0,0.00D0), (-1.07D0,1.18D0), + + (-0.42D0,-0.99D0), (-0.41D0,-1.2D0), + + (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0)/ + DATA ((CT11(I,J,4),I=1,7),J=1,4)/(0.6D0,-0.6D0), + + (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0), + + (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0), + + (-0.1D0,-1.47D0), (0.0D0,0.0D0), (0.0D0,0.0D0), + + (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0), + + (0.0D0,0.0D0), (-0.1D0,-1.47D0), (-0.9D0,0.5D0), + + (-0.4D0,-0.7D0), (0.0D0,0.0D0), (0.0D0,0.0D0), + + (0.0D0,0.0D0), (0.0D0,0.0D0), (-0.1D0,-1.47D0), + + (-0.9D0,0.5D0),(-0.4D0,-0.7D0), (0.1D0,-0.5D0), + + (-0.82D0,-0.39D0), (-0.5D0,-0.3D0), + + (-0.2D0,-1.27D0)/ + + * .. Executable Statements .. DO 60 KI = 1, 4 INCX = INCXS(KI) @@ -501,6 +564,10 @@ SUBROUTINE CHECK2(SFAC) * .. ZAXPYTEST .. CALL ZAXPYTEST(N,CA,CX,INCX,CY,INCY) CALL CTEST(LENY,CY,CT8(1,KN,KI),CSIZE2(1,KSIZE),SFAC) + ELSE IF (ICASE.EQ.11) THEN +* .. ZAXPBYTEST .. + CALL ZAXPBYTEST(N,CA,CX,INCX,CB,CY,INCY) + CALL CTEST(LENY,CY,CT11(1,KN,KI),CSIZE2(1,KSIZE),SFAC) ELSE IF (ICASE.EQ.4) THEN * .. ZCOPYTEST .. CALL ZCOPYTEST(N,CX,INCX,CY,INCY) @@ -519,7 +586,10 @@ SUBROUTINE CHECK2(SFAC) 60 CONTINUE RETURN END + +* ===================================================================== SUBROUTINE STEST(LEN,SCOMP,STRUE,SSIZE,SFAC) + IMPLICIT NONE * ********************************* STEST ************************** * * THIS SUBR COMPARES ARRAYS SCOMP() AND STRUE() OF LENGTH LEN TO @@ -574,7 +644,10 @@ SUBROUTINE STEST(LEN,SCOMP,STRUE,SSIZE,SFAC) + ' SIZE(I)',/1X) 99997 FORMAT (1X,I4,I3,3I5,I3,2D36.8,2D12.4) END + +* ===================================================================== SUBROUTINE STEST1(SCOMP1,STRUE1,SSIZE,SFAC) + IMPLICIT NONE * ************************* STEST1 ***************************** * * THIS IS AN INTERFACE SUBROUTINE TO ACCOMMODATE THE FORTRAN @@ -599,7 +672,10 @@ SUBROUTINE STEST1(SCOMP1,STRUE1,SSIZE,SFAC) * RETURN END + +* ===================================================================== DOUBLE PRECISION FUNCTION SDIFF(SA,SB) + IMPLICIT NONE * ********************************* SDIFF ************************** * COMPUTES DIFFERENCE OF TWO NUMBERS. C. L. LAWSON, JPL 1974 FEB 15 * @@ -609,7 +685,10 @@ DOUBLE PRECISION FUNCTION SDIFF(SA,SB) SDIFF = SA - SB RETURN END + +* ===================================================================== SUBROUTINE CTEST(LEN,CCOMP,CTRUE,CSIZE,SFAC) + IMPLICIT NONE * **************************** CTEST ***************************** * * C.L. LAWSON, JPL, 1978 DEC 6 @@ -640,7 +719,10 @@ SUBROUTINE CTEST(LEN,CCOMP,CTRUE,CSIZE,SFAC) CALL STEST(2*LEN,SCOMP,STRUE,SSIZE,SFAC) RETURN END + +* ===================================================================== SUBROUTINE ITEST1(ICOMP,ITRUE) + IMPLICIT NONE * ********************************* ITEST1 ************************* * * THIS SUBROUTINE COMPARES THE VARIABLES ICOMP AND ITRUE FOR diff --git a/CBLAS/testing/c_zblat2.f b/CBLAS/testing/c_zblat2.f index 4392602302..21424468c8 100644 --- a/CBLAS/testing/c_zblat2.f +++ b/CBLAS/testing/c_zblat2.f @@ -1,4 +1,6 @@ +* ===================================================================== PROGRAM ZBLAT2 + IMPLICIT NONE * * Test program for the COMPLEX*16 Level 2 Blas. * @@ -349,13 +351,13 @@ PROGRAM ZBLAT2 CALL ZCHK3( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE, $ REWI, FATAL, NIDIM, IDIM, NKB, KB, NINC, INC, $ NMAX, INCMAX, A, AA, AS, Y, YY, YS, YT, G, Z, - $ 0 ) + $ 0 ) END IF IF (RORDER) THEN CALL ZCHK3( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE, $ REWI, FATAL, NIDIM, IDIM, NKB, KB, NINC, INC, $ NMAX, INCMAX, A, AA, AS, Y, YY, YS, YT, G, Z, - $ 1 ) + $ 1 ) END IF GO TO 200 * Test ZGERC, 12, ZGERU, 13. @@ -459,10 +461,13 @@ PROGRAM ZBLAT2 * End of ZBLAT2. * END + +* ===================================================================== SUBROUTINE ZCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF, NBET, $ BET, NINC, INC, NMAX, INCMAX, A, AA, AS, X, XX, $ XS, Y, YY, YS, YT, G, IORDER ) + IMPLICIT NONE * * Tests CGEMV and CGBMV. * @@ -815,10 +820,13 @@ SUBROUTINE ZCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * End of ZCHK1. * END + +* ===================================================================== SUBROUTINE ZCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF, NBET, $ BET, NINC, INC, NMAX, INCMAX, A, AA, AS, X, XX, $ XS, Y, YY, YS, YT, G, IORDER ) + IMPLICIT NONE * * Tests CHEMV, CHBMV and CHPMV. * @@ -1172,9 +1180,12 @@ SUBROUTINE ZCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * End of CZHK2. * END + +* ===================================================================== SUBROUTINE ZCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NKB, KB, NINC, INC, NMAX, $ INCMAX, A, AA, AS, X, XX, XS, XT, G, Z, IORDER ) + IMPLICIT NONE * * Tests ZTRMV, ZTBMV, ZTPMV, ZTRSV, ZTBSV and ZTPSV. * @@ -1554,10 +1565,13 @@ SUBROUTINE ZCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * End of ZCHK3. * END + +* ===================================================================== SUBROUTINE ZCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX, $ INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G, $ Z, IORDER ) + IMPLICIT NONE * * Tests ZGERC and ZGERU. * @@ -1832,10 +1846,13 @@ SUBROUTINE ZCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * End of ZCHK4. * END + +* ===================================================================== SUBROUTINE ZCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX, $ INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G, $ Z, IORDER ) + IMPLICIT NONE * * Tests ZHER and ZHPR. * @@ -2126,10 +2143,13 @@ SUBROUTINE ZCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * End of CZHK5. * END + +* ===================================================================== SUBROUTINE ZCHK6( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX, $ INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G, $ Z, IORDER ) + IMPLICIT NONE * * Tests ZHER2 and ZHPR2. * @@ -2454,8 +2474,11 @@ SUBROUTINE ZCHK6( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * End of ZCHK6. * END + +* ===================================================================== SUBROUTINE ZMVCH( TRANS, M, N, ALPHA, A, NMAX, X, INCX, BETA, Y, $ INCY, YT, G, YY, EPS, ERR, FATAL, NOUT, MV ) + IMPLICIT NONE * * Checks the results of the computational tests. * @@ -2586,7 +2609,10 @@ SUBROUTINE ZMVCH( TRANS, M, N, ALPHA, A, NMAX, X, INCX, BETA, Y, * End of ZMVCH. * END + +* ===================================================================== LOGICAL FUNCTION LZE( RI, RJ, LR ) + IMPLICIT NONE * * Tests if two arrays are identical. * @@ -2616,7 +2642,10 @@ LOGICAL FUNCTION LZE( RI, RJ, LR ) * End of LZE. * END + +* ===================================================================== LOGICAL FUNCTION LZERES( TYPE, UPLO, M, N, AA, AS, LDA ) + IMPLICIT NONE * * Tests if selected elements in two arrays are equal. * @@ -2676,7 +2705,10 @@ LOGICAL FUNCTION LZERES( TYPE, UPLO, M, N, AA, AS, LDA ) * End of LZERES. * END + +* ===================================================================== COMPLEX*16 FUNCTION ZBEG( RESET ) + IMPLICIT NONE * * Generates complex numbers as pairs of random numbers uniformly * distributed between -0.5 and 0.5. @@ -2728,7 +2760,10 @@ COMPLEX*16 FUNCTION ZBEG( RESET ) * End of ZBEG. * END + +* ===================================================================== DOUBLE PRECISION FUNCTION DDIFF( X, Y ) + IMPLICIT NONE * * Auxiliary routine for test program for Level 2 Blas. * @@ -2744,8 +2779,11 @@ DOUBLE PRECISION FUNCTION DDIFF( X, Y ) * End of DDIFF. * END + +* ===================================================================== SUBROUTINE ZMAKE( TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, KL, $ KU, RESET, TRANSL ) + IMPLICIT NONE * * Generates values for an M by N matrix A within the bandwidth * defined by KL and KU. diff --git a/CBLAS/testing/c_zblat3.f b/CBLAS/testing/c_zblat3.f index 21e743d171..a68a64a14e 100644 --- a/CBLAS/testing/c_zblat3.f +++ b/CBLAS/testing/c_zblat3.f @@ -1,10 +1,12 @@ +* ===================================================================== PROGRAM ZBLAT3 + IMPLICIT NONE * * Test program for the COMPLEX*16 Level 3 Blas. * * The program must be driven by a short data file. The first 13 records * of the file are read using list-directed input, the last 9 records -* are read using the format ( A12,L2 ). An annotated example of a data +* are read using the format ( A13,L2 ). An annotated example of a data * file can be obtained by deleting the first 3 characters from the * following 22 lines: * 'CBLAT3.SNAP' NAME OF SNAPSHOT OUTPUT FILE @@ -20,16 +22,17 @@ PROGRAM ZBLAT3 * (0.0,0.0) (1.0,0.0) (0.7,-0.9) VALUES OF ALPHA * 3 NUMBER OF VALUES OF BETA * (0.0,0.0) (1.0,0.0) (1.3,-1.1) VALUES OF BETA -* ZGEMM T PUT F FOR NO TEST. SAME COLUMNS. -* ZHEMM T PUT F FOR NO TEST. SAME COLUMNS. -* ZSYMM T PUT F FOR NO TEST. SAME COLUMNS. -* ZTRMM T PUT F FOR NO TEST. SAME COLUMNS. -* ZTRSM T PUT F FOR NO TEST. SAME COLUMNS. -* ZHERK T PUT F FOR NO TEST. SAME COLUMNS. -* ZSYRK T PUT F FOR NO TEST. SAME COLUMNS. -* ZHER2K T PUT F FOR NO TEST. SAME COLUMNS. -* ZSYR2K T PUT F FOR NO TEST. SAME COLUMNS. -* +* cblas_zgemm T PUT F FOR NO TEST. SAME COLUMNS. +* cblas_zhemm T PUT F FOR NO TEST. SAME COLUMNS. +* cblas_zsymm T PUT F FOR NO TEST. SAME COLUMNS. +* cblas_ztrmm T PUT F FOR NO TEST. SAME COLUMNS. +* cblas_ztrsm T PUT F FOR NO TEST. SAME COLUMNS. +* cblas_zherk T PUT F FOR NO TEST. SAME COLUMNS. +* cblas_zsyrk T PUT F FOR NO TEST. SAME COLUMNS. +* cblas_zher2k T PUT F FOR NO TEST. SAME COLUMNS. +* cblas_zsyr2k T PUT F FOR NO TEST. SAME COLUMNS. +* cblas_zgemmtr T PUT F FOR NO TEST. SAME COLUMNS. + * See: * * Dongarra J. J., Du Croz J. J., Duff I. S. and Hammarling S. @@ -49,7 +52,7 @@ PROGRAM ZBLAT3 INTEGER NIN, NOUT PARAMETER ( NIN = 5, NOUT = 6 ) INTEGER NSUBS - PARAMETER ( NSUBS = 9 ) + PARAMETER ( NSUBS = 10 ) COMPLEX*16 ZERO, ONE PARAMETER ( ZERO = ( 0.0D0, 0.0D0 ), $ ONE = ( 1.0D0, 0.0D0 ) ) @@ -66,7 +69,7 @@ PROGRAM ZBLAT3 LOGICAL FATAL, LTESTT, REWI, SAME, SFATAL, TRACE, $ TSTERR, CORDER, RORDER CHARACTER*1 TRANSA, TRANSB - CHARACTER*12 SNAMET + CHARACTER*13 SNAMET CHARACTER*32 SNAPS * .. Local Arrays .. COMPLEX*16 AA( NMAX*NMAX ), AB( NMAX, 2*NMAX ), @@ -78,19 +81,19 @@ PROGRAM ZBLAT3 DOUBLE PRECISION G( NMAX ) INTEGER IDIM( NIDMAX ) LOGICAL LTEST( NSUBS ) - CHARACTER*12 SNAMES( NSUBS ) + CHARACTER*13 SNAMES( NSUBS ) * .. External Functions .. DOUBLE PRECISION DDIFF LOGICAL LZE EXTERNAL DDIFF, LZE * .. External Subroutines .. - EXTERNAL ZCHK1, ZCHK2, ZCHK3, ZCHK4, ZCHK5,ZMMCH + EXTERNAL ZCHK1, ZCHK2, ZCHK3, ZCHK4, ZCHK5, ZCHK6, ZMMCH * .. Intrinsic Functions .. INTRINSIC MAX, MIN * .. Scalars in Common .. INTEGER INFOT, NOUTC LOGICAL LERR, OK - CHARACTER*12 SRNAMT + CHARACTER*13 SRNAMT * .. Common blocks .. COMMON /INFOC/INFOT, NOUTC, OK, LERR COMMON /SRNAMC/SRNAMT @@ -98,7 +101,7 @@ PROGRAM ZBLAT3 DATA SNAMES/'cblas_zgemm ', 'cblas_zhemm ', $ 'cblas_zsymm ', 'cblas_ztrmm ', 'cblas_ztrsm ', $ 'cblas_zherk ', 'cblas_zsyrk ', 'cblas_zher2k', - $ 'cblas_zsyr2k'/ + $ 'cblas_zsyr2k', 'cblas_zgemmtr'/ * .. Executable Statements .. * NOUTC = NOUT @@ -296,7 +299,7 @@ PROGRAM ZBLAT3 OK = .TRUE. FATAL = .FALSE. GO TO ( 140, 150, 150, 160, 160, 170, 170, - $ 180, 180 )ISNUM + $ 180, 180, 185) ISNUM * Test ZGEMM, 01. 140 IF (CORDER) THEN CALL ZCHK1(SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE, @@ -330,13 +333,13 @@ PROGRAM ZBLAT3 CALL ZCHK3(SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE, $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NMAX, AB, $ AA, AS, AB( 1, NMAX + 1 ), BB, BS, CT, G, C, - $ 0 ) + $ 0 ) END IF IF (RORDER) THEN CALL ZCHK3(SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE, $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NMAX, AB, $ AA, AS, AB( 1, NMAX + 1 ), BB, BS, CT, G, C, - $ 1 ) + $ 1 ) END IF GO TO 190 * Test ZHERK, 06, ZSYRK, 07. @@ -358,13 +361,27 @@ PROGRAM ZBLAT3 CALL ZCHK5(SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE, $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, $ NMAX, AB, AA, AS, BB, BS, C, CC, CS, CT, G, W, - $ 0 ) + $ 0 ) END IF IF (RORDER) THEN CALL ZCHK5(SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE, $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, $ NMAX, AB, AA, AS, BB, BS, C, CC, CS, CT, G, W, - $ 1 ) + $ 1 ) + END IF + GO TO 190 +* Test ZGEMMTR, 10 + 185 IF (CORDER) THEN + CALL ZCHK6(SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE, + $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, + $ NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C, + $ CC, CS, CT, G, 0 ) + END IF + IF (RORDER) THEN + CALL ZCHK6(SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE, + $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, + $ NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C, + $ CC, CS, CT, G, 1 ) END IF GO TO 190 * @@ -406,7 +423,7 @@ PROGRAM ZBLAT3 $ 7( '(', F4.1, ',', F4.1, ') ', : ) ) 9991 FORMAT( ' AMEND DATA FILE OR INCREASE ARRAY SIZES IN PROGRAM', $ /' ******* TESTS ABANDONED *******' ) - 9990 FORMAT(' SUBPROGRAM NAME ', A12,' NOT RECOGNIZED', /' ******* T', + 9990 FORMAT(' SUBPROGRAM NAME ', A13,' NOT RECOGNIZED', /' ******* T', $ 'ESTS ABANDONED *******' ) 9989 FORMAT(' ERROR IN ZMMCH - IN-LINE DOT PRODUCTS ARE BEING EVALU', $ 'ATED WRONGLY.', /' ZMMCH WAS CALLED WITH TRANSA = ', A1, @@ -414,8 +431,8 @@ PROGRAM ZBLAT3 $ ' ERR = ', F12.3, '.', /' THIS MAY BE DUE TO FAULTS IN THE ', $ 'ARITHMETIC OR THE COMPILER.', /' ******* TESTS ABANDONED ', $ '*******' ) - 9988 FORMAT( A12,L2 ) - 9987 FORMAT( 1X, A12,' WAS NOT TESTED' ) + 9988 FORMAT( A13,L2 ) + 9987 FORMAT( 1X, A13,' WAS NOT TESTED' ) 9986 FORMAT( /' END OF TESTS' ) 9985 FORMAT( /' ******* FATAL ERROR - TESTS ABANDONED *******' ) 9984 FORMAT( ' ERROR-EXITS WILL NOT BE TESTED' ) @@ -423,10 +440,13 @@ PROGRAM ZBLAT3 * End of ZBLAT3. * END + +* ===================================================================== SUBROUTINE ZCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX, $ A, AA, AS, B, BB, BS, C, CC, CS, CT, G, $ IORDER ) + IMPLICIT NONE * * Tests ZGEMM. * @@ -447,7 +467,7 @@ SUBROUTINE ZCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, DOUBLE PRECISION EPS, THRESH INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA, IORDER LOGICAL FATAL, REWI, TRACE - CHARACTER*12 SNAME + CHARACTER*13 SNAME * .. Array Arguments .. COMPLEX*16 A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ), $ AS( NMAX*NMAX ), B( NMAX, NMAX ), @@ -695,20 +715,20 @@ SUBROUTINE ZCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, 130 CONTINUE RETURN * -10003 FORMAT( ' ', A12,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ', +10003 FORMAT( ' ', A13,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ', $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', $ 'RATIO ', F8.2, ' - SUSPECT *******' ) -10002 FORMAT( ' ', A12,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ', +10002 FORMAT( ' ', A13,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ', $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', $ 'RATIO ', F8.2, ' - SUSPECT *******' ) -10001 FORMAT( ' ', A12,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS', +10001 FORMAT( ' ', A13,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS', $ ' (', I6, ' CALL', 'S)' ) -10000 FORMAT( ' ', A12,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS', +10000 FORMAT( ' ', A13,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS', $ ' (', I6, ' CALL', 'S)' ) 9998 FORMAT(' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', $ 'ANGED INCORRECTLY *******' ) - 9996 FORMAT( ' ******* ', A12,' FAILED ON CALL NUMBER:' ) - 9995 FORMAT( 1X, I6, ': ', A12,'(''', A1, ''',''', A1, ''',', + 9996 FORMAT( ' ******* ', A13,' FAILED ON CALL NUMBER:' ) + 9995 FORMAT( 1X, I6, ': ', A13,'(''', A1, ''',''', A1, ''',', $ 3( I3, ',' ), '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, $ ',(', F4.1, ',', F4.1, '), C,', I3, ').' ) 9994 FORMAT(' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', @@ -717,13 +737,15 @@ SUBROUTINE ZCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * End of ZCHK1. * END -* + +* ===================================================================== SUBROUTINE ZPRCN1(NOUT, NC, SNAME, IORDER, TRANSA, TRANSB, M, N, $ K, ALPHA, LDA, LDB, BETA, LDC) + IMPLICIT NONE INTEGER NOUT, NC, IORDER, M, N, K, LDA, LDB, LDC DOUBLE COMPLEX ALPHA, BETA CHARACTER*1 TRANSA, TRANSB - CHARACTER*12 SNAME + CHARACTER*13 SNAME CHARACTER*14 CRC, CTA,CTB IF (TRANSA.EQ.'N')THEN @@ -748,15 +770,17 @@ SUBROUTINE ZPRCN1(NOUT, NC, SNAME, IORDER, TRANSA, TRANSB, M, N, WRITE(NOUT, FMT = 9995)NC,SNAME,CRC, CTA,CTB WRITE(NOUT, FMT = 9994)M, N, K, ALPHA, LDA, LDB, BETA, LDC - 9995 FORMAT( 1X, I6, ': ', A12,'(', A14, ',', A14, ',', A14, ',') + 9995 FORMAT( 1X, I6, ': ', A13,'(', A14, ',', A14, ',', A14, ',') 9994 FORMAT( 10X, 3( I3, ',' ) ,' (', F4.1,',',F4.1,') , A,', $ I3, ', B,', I3, ', (', F4.1,',',F4.1,') , C,', I3, ').' ) END -* + +* ===================================================================== SUBROUTINE ZCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX, $ A, AA, AS, B, BB, BS, C, CC, CS, CT, G, $ IORDER ) + IMPLICIT NONE * * Tests ZHEMM and ZSYMM. * @@ -777,7 +801,7 @@ SUBROUTINE ZCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, DOUBLE PRECISION EPS, THRESH INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA, IORDER LOGICAL FATAL, REWI, TRACE - CHARACTER*12 SNAME + CHARACTER*13 SNAME * .. Array Arguments .. COMPLEX*16 A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ), $ AS( NMAX*NMAX ), B( NMAX, NMAX ), @@ -1021,20 +1045,20 @@ SUBROUTINE ZCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, 120 CONTINUE RETURN * -10003 FORMAT( ' ', A12,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ', +10003 FORMAT( ' ', A13,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ', $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', $ 'RATIO ', F8.2, ' - SUSPECT *******' ) -10002 FORMAT( ' ', A12,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ', +10002 FORMAT( ' ', A13,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ', $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', $ 'RATIO ', F8.2, ' - SUSPECT *******' ) -10001 FORMAT( ' ', A12,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS', +10001 FORMAT( ' ', A13,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS', $ ' (', I6, ' CALL', 'S)' ) -10000 FORMAT( ' ', A12,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS', +10000 FORMAT( ' ', A13,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS', $ ' (', I6, ' CALL', 'S)' ) 9998 FORMAT(' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', $ 'ANGED INCORRECTLY *******' ) - 9996 FORMAT( ' ******* ', A12,' FAILED ON CALL NUMBER:' ) - 9995 FORMAT(1X, I6, ': ', A12,'(', 2( '''', A1, ''',' ), 2( I3, ',' ), + 9996 FORMAT( ' ******* ', A13,' FAILED ON CALL NUMBER:' ) + 9995 FORMAT(1X, I6, ': ', A13,'(', 2( '''', A1, ''',' ), 2( I3, ',' ), $ '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ',(', F4.1, $ ',', F4.1, '), C,', I3, ') .' ) 9994 FORMAT(' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', @@ -1043,13 +1067,16 @@ SUBROUTINE ZCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * End of ZCHK2. * END -* + +* ===================================================================== SUBROUTINE ZPRCN2(NOUT, NC, SNAME, IORDER, SIDE, UPLO, M, N, $ ALPHA, LDA, LDB, BETA, LDC) + IMPLICIT NONE + INTEGER NOUT, NC, IORDER, M, N, LDA, LDB, LDC DOUBLE COMPLEX ALPHA, BETA CHARACTER*1 SIDE, UPLO - CHARACTER*12 SNAME + CHARACTER*13 SNAME CHARACTER*14 CRC, CS,CU IF (SIDE.EQ.'L')THEN @@ -1070,14 +1097,16 @@ SUBROUTINE ZPRCN2(NOUT, NC, SNAME, IORDER, SIDE, UPLO, M, N, WRITE(NOUT, FMT = 9995)NC,SNAME,CRC, CS,CU WRITE(NOUT, FMT = 9994)M, N, ALPHA, LDA, LDB, BETA, LDC - 9995 FORMAT( 1X, I6, ': ', A12,'(', A14, ',', A14, ',', A14, ',') + 9995 FORMAT( 1X, I6, ': ', A13,'(', A14, ',', A14, ',', A14, ',') 9994 FORMAT( 10X, 2( I3, ',' ),' (',F4.1,',',F4.1, '), A,', I3, $ ', B,', I3, ', (',F4.1,',',F4.1, '), ', 'C,', I3, ').' ) END -* + +* ===================================================================== SUBROUTINE ZCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NMAX, A, AA, AS, $ B, BB, BS, CT, G, C, IORDER ) + IMPLICIT NONE * * Tests ZTRMM and ZTRSM. * @@ -1098,7 +1127,7 @@ SUBROUTINE ZCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, DOUBLE PRECISION EPS, THRESH INTEGER NALF, NIDIM, NMAX, NOUT, NTRA, IORDER LOGICAL FATAL, REWI, TRACE - CHARACTER*12 SNAME + CHARACTER*13 SNAME * .. Array Arguments .. COMPLEX*16 A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ), $ AS( NMAX*NMAX ), B( NMAX, NMAX ), @@ -1373,20 +1402,20 @@ SUBROUTINE ZCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, 160 CONTINUE RETURN * -10003 FORMAT( ' ', A12,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ', +10003 FORMAT( ' ', A13,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ', $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', $ 'RATIO ', F8.2, ' - SUSPECT *******' ) -10002 FORMAT( ' ', A12,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ', +10002 FORMAT( ' ', A13,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ', $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', $ 'RATIO ', F8.2, ' - SUSPECT *******' ) -10001 FORMAT( ' ', A12,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS', +10001 FORMAT( ' ', A13,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS', $ ' (', I6, ' CALL', 'S)' ) -10000 FORMAT( ' ', A12,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS', +10000 FORMAT( ' ', A13,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS', $ ' (', I6, ' CALL', 'S)' ) 9998 FORMAT(' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', $ 'ANGED INCORRECTLY *******' ) - 9996 FORMAT(' ******* ', A12,' FAILED ON CALL NUMBER:' ) - 9995 FORMAT(1X, I6, ': ', A12,'(', 4( '''', A1, ''',' ), 2( I3, ',' ), + 9996 FORMAT(' ******* ', A13,' FAILED ON CALL NUMBER:' ) + 9995 FORMAT(1X, I6, ': ', A13,'(', 4( '''', A1, ''',' ), 2( I3, ',' ), $ '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ') ', $ ' .' ) 9994 FORMAT(' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', @@ -1395,13 +1424,16 @@ SUBROUTINE ZCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * End of ZCHK3. * END -* + +* ===================================================================== SUBROUTINE ZPRCN3(NOUT, NC, SNAME, IORDER, SIDE, UPLO, TRANSA, $ DIAG, M, N, ALPHA, LDA, LDB) + IMPLICIT NONE + INTEGER NOUT, NC, IORDER, M, N, LDA, LDB DOUBLE COMPLEX ALPHA CHARACTER*1 SIDE, UPLO, TRANSA, DIAG - CHARACTER*12 SNAME + CHARACTER*13 SNAME CHARACTER*14 CRC, CS, CU, CA, CD IF (SIDE.EQ.'L')THEN @@ -1434,15 +1466,17 @@ SUBROUTINE ZPRCN3(NOUT, NC, SNAME, IORDER, SIDE, UPLO, TRANSA, WRITE(NOUT, FMT = 9995)NC,SNAME,CRC, CS,CU WRITE(NOUT, FMT = 9994)CA, CD, M, N, ALPHA, LDA, LDB - 9995 FORMAT( 1X, I6, ': ', A12,'(', A14, ',', A14, ',', A14, ',') + 9995 FORMAT( 1X, I6, ': ', A13,'(', A14, ',', A14, ',', A14, ',') 9994 FORMAT( 10X, 2( A14, ',') , 2( I3, ',' ), ' (', F4.1, ',', $ F4.1, '), A,', I3, ', B,', I3, ').' ) END -* + +* ===================================================================== SUBROUTINE ZCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX, $ A, AA, AS, B, BB, BS, C, CC, CS, CT, G, $ IORDER ) + IMPLICIT NONE * * Tests ZHERK and ZSYRK. * @@ -1463,7 +1497,7 @@ SUBROUTINE ZCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, DOUBLE PRECISION EPS, THRESH INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA, IORDER LOGICAL FATAL, REWI, TRACE - CHARACTER*12 SNAME + CHARACTER*13 SNAME * .. Array Arguments .. COMPLEX*16 A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ), $ AS( NMAX*NMAX ), B( NMAX, NMAX ), @@ -1755,24 +1789,24 @@ SUBROUTINE ZCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, 130 CONTINUE RETURN * -10003 FORMAT( ' ', A12,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ', +10003 FORMAT( ' ', A13,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ', $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', $ 'RATIO ', F8.2, ' - SUSPECT *******' ) -10002 FORMAT( ' ', A12,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ', +10002 FORMAT( ' ', A13,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ', $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', $ 'RATIO ', F8.2, ' - SUSPECT *******' ) -10001 FORMAT( ' ', A12,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS', +10001 FORMAT( ' ', A13,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS', $ ' (', I6, ' CALL', 'S)' ) -10000 FORMAT( ' ', A12,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS', +10000 FORMAT( ' ', A13,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS', $ ' (', I6, ' CALL', 'S)' ) 9998 FORMAT(' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', $ 'ANGED INCORRECTLY *******' ) - 9996 FORMAT( ' ******* ', A12,' FAILED ON CALL NUMBER:' ) + 9996 FORMAT( ' ******* ', A13,' FAILED ON CALL NUMBER:' ) 9995 FORMAT( ' THESE ARE THE RESULTS FOR COLUMN ', I3 ) - 9994 FORMAT(1X, I6, ': ', A12,'(', 2( '''', A1, ''',' ), 2( I3, ',' ), + 9994 FORMAT(1X, I6, ': ', A13,'(', 2( '''', A1, ''',' ), 2( I3, ',' ), $ F4.1, ', A,', I3, ',', F4.1, ', C,', I3, ') ', $ ' .' ) - 9993 FORMAT(1X, I6, ': ', A12,'(', 2( '''', A1, ''',' ), 2( I3, ',' ), + 9993 FORMAT(1X, I6, ': ', A13,'(', 2( '''', A1, ''',' ), 2( I3, ',' ), $ '(', F4.1, ',', F4.1, ') , A,', I3, ',(', F4.1, ',', F4.1, $ '), C,', I3, ') .' ) 9992 FORMAT(' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', @@ -1781,13 +1815,15 @@ SUBROUTINE ZCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * End of CCHK4. * END -* + +* ===================================================================== SUBROUTINE ZPRCN4(NOUT, NC, SNAME, IORDER, UPLO, TRANSA, $ N, K, ALPHA, LDA, BETA, LDC) + IMPLICIT NONE INTEGER NOUT, NC, IORDER, N, K, LDA, LDC DOUBLE COMPLEX ALPHA, BETA CHARACTER*1 UPLO, TRANSA - CHARACTER*12 SNAME + CHARACTER*13 SNAME CHARACTER*14 CRC, CU, CA IF (UPLO.EQ.'U')THEN @@ -1810,18 +1846,20 @@ SUBROUTINE ZPRCN4(NOUT, NC, SNAME, IORDER, UPLO, TRANSA, WRITE(NOUT, FMT = 9995)NC, SNAME, CRC, CU, CA WRITE(NOUT, FMT = 9994)N, K, ALPHA, LDA, BETA, LDC - 9995 FORMAT( 1X, I6, ': ', A12,'(', 3( A14, ',') ) + 9995 FORMAT( 1X, I6, ': ', A13,'(', 3( A14, ',') ) 9994 FORMAT( 10X, 2( I3, ',' ), ' (', F4.1, ',', F4.1 ,'), A,', $ I3, ', (', F4.1,',', F4.1, '), C,', I3, ').' ) END -* -* + +* ===================================================================== SUBROUTINE ZPRCN6(NOUT, NC, SNAME, IORDER, UPLO, TRANSA, $ N, K, ALPHA, LDA, BETA, LDC) + IMPLICIT NONE + INTEGER NOUT, NC, IORDER, N, K, LDA, LDC DOUBLE PRECISION ALPHA, BETA CHARACTER*1 UPLO, TRANSA - CHARACTER*12 SNAME + CHARACTER*13 SNAME CHARACTER*14 CRC, CU, CA IF (UPLO.EQ.'U')THEN @@ -1844,15 +1882,17 @@ SUBROUTINE ZPRCN6(NOUT, NC, SNAME, IORDER, UPLO, TRANSA, WRITE(NOUT, FMT = 9995)NC, SNAME, CRC, CU, CA WRITE(NOUT, FMT = 9994)N, K, ALPHA, LDA, BETA, LDC - 9995 FORMAT( 1X, I6, ': ', A12,'(', 3( A14, ',') ) + 9995 FORMAT( 1X, I6, ': ', A13,'(', 3( A14, ',') ) 9994 FORMAT( 10X, 2( I3, ',' ), $ F4.1, ', A,', I3, ',', F4.1, ', C,', I3, ').' ) END -* + +* ===================================================================== SUBROUTINE ZCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX, $ AB, AA, AS, BB, BS, C, CC, CS, CT, G, W, $ IORDER ) + IMPLICIT NONE * * Tests ZHER2K and ZSYR2K. * @@ -1873,7 +1913,7 @@ SUBROUTINE ZCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, DOUBLE PRECISION EPS, THRESH INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA, IORDER LOGICAL FATAL, REWI, TRACE - CHARACTER*12 SNAME + CHARACTER*13 SNAME * .. Array Arguments .. COMPLEX*16 AA( NMAX*NMAX ), AB( 2*NMAX*NMAX ), $ ALF( NALF ), AS( NMAX*NMAX ), BB( NMAX*NMAX ), @@ -2208,24 +2248,24 @@ SUBROUTINE ZCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, 160 CONTINUE RETURN * -10003 FORMAT( ' ', A12,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ', +10003 FORMAT( ' ', A13,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ', $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', $ 'RATIO ', F8.2, ' - SUSPECT *******' ) -10002 FORMAT( ' ', A12,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ', +10002 FORMAT( ' ', A13,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ', $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', $ 'RATIO ', F8.2, ' - SUSPECT *******' ) -10001 FORMAT( ' ', A12,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS', +10001 FORMAT( ' ', A13,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS', $ ' (', I6, ' CALL', 'S)' ) -10000 FORMAT( ' ', A12,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS', +10000 FORMAT( ' ', A13,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS', $ ' (', I6, ' CALL', 'S)' ) 9998 FORMAT(' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', $ 'ANGED INCORRECTLY *******' ) - 9996 FORMAT( ' ******* ', A12,' FAILED ON CALL NUMBER:' ) + 9996 FORMAT( ' ******* ', A13,' FAILED ON CALL NUMBER:' ) 9995 FORMAT( ' THESE ARE THE RESULTS FOR COLUMN ', I3 ) - 9994 FORMAT(1X, I6, ': ', A12,'(', 2( '''', A1, ''',' ), 2( I3, ',' ), + 9994 FORMAT(1X, I6, ': ', A13,'(', 2( '''', A1, ''',' ), 2( I3, ',' ), $ '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ',', F4.1, $ ', C,', I3, ') .' ) - 9993 FORMAT(1X, I6, ': ', A12,'(', 2( '''', A1, ''',' ), 2( I3, ',' ), + 9993 FORMAT(1X, I6, ': ', A13,'(', 2( '''', A1, ''',' ), 2( I3, ',' ), $ '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ',(', F4.1, $ ',', F4.1, '), C,', I3, ') .' ) 9992 FORMAT(' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', @@ -2234,13 +2274,16 @@ SUBROUTINE ZCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, * End of ZCHK5. * END -* + +* ===================================================================== SUBROUTINE ZPRCN5(NOUT, NC, SNAME, IORDER, UPLO, TRANSA, $ N, K, ALPHA, LDA, LDB, BETA, LDC) + IMPLICIT NONE + INTEGER NOUT, NC, IORDER, N, K, LDA, LDB, LDC DOUBLE COMPLEX ALPHA, BETA CHARACTER*1 UPLO, TRANSA - CHARACTER*12 SNAME + CHARACTER*13 SNAME CHARACTER*14 CRC, CU, CA IF (UPLO.EQ.'U')THEN @@ -2263,19 +2306,21 @@ SUBROUTINE ZPRCN5(NOUT, NC, SNAME, IORDER, UPLO, TRANSA, WRITE(NOUT, FMT = 9995)NC, SNAME, CRC, CU, CA WRITE(NOUT, FMT = 9994)N, K, ALPHA, LDA, LDB, BETA, LDC - 9995 FORMAT( 1X, I6, ': ', A12,'(', 3( A14, ',') ) + 9995 FORMAT( 1X, I6, ': ', A13,'(', 3( A14, ',') ) 9994 FORMAT( 10X, 2( I3, ',' ), ' (', F4.1, ',', F4.1, '), A,', $ I3, ', B', I3, ', (', F4.1, ',', F4.1, '), C,', I3, ').' ) END -* -* + +* ===================================================================== SUBROUTINE ZPRCN7(NOUT, NC, SNAME, IORDER, UPLO, TRANSA, $ N, K, ALPHA, LDA, LDB, BETA, LDC) + IMPLICIT NONE + INTEGER NOUT, NC, IORDER, N, K, LDA, LDB, LDC DOUBLE COMPLEX ALPHA DOUBLE PRECISION BETA CHARACTER*1 UPLO, TRANSA - CHARACTER*12 SNAME + CHARACTER*13 SNAME CHARACTER*14 CRC, CU, CA IF (UPLO.EQ.'U')THEN @@ -2298,13 +2343,15 @@ SUBROUTINE ZPRCN7(NOUT, NC, SNAME, IORDER, UPLO, TRANSA, WRITE(NOUT, FMT = 9995)NC, SNAME, CRC, CU, CA WRITE(NOUT, FMT = 9994)N, K, ALPHA, LDA, LDB, BETA, LDC - 9995 FORMAT( 1X, I6, ': ', A12,'(', 3( A14, ',') ) + 9995 FORMAT( 1X, I6, ': ', A13,'(', 3( A14, ',') ) 9994 FORMAT( 10X, 2( I3, ',' ), ' (', F4.1, ',', F4.1, '), A,', $ I3, ', B', I3, ',', F4.1, ', C,', I3, ').' ) END -* + +* ===================================================================== SUBROUTINE ZMAKE( TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, RESET, $ TRANSL ) + IMPLICIT NONE * * Generates values for an M by N matrix A. * Stores the values in the array AA in the data structure required @@ -2432,9 +2479,12 @@ SUBROUTINE ZMAKE( TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, RESET, * End of ZMAKE. * END + +* ===================================================================== SUBROUTINE ZMMCH( TRANSA, TRANSB, M, N, KK, ALPHA, A, LDA, B, LDB, $ BETA, C, LDC, CT, G, CC, LDCC, EPS, ERR, FATAL, $ NOUT, MV ) + IMPLICIT NONE * * Checks the results of the computational tests. * @@ -2622,7 +2672,10 @@ SUBROUTINE ZMMCH( TRANSA, TRANSB, M, N, KK, ALPHA, A, LDA, B, LDB, * End of ZMMCH. * END + +* ===================================================================== LOGICAL FUNCTION LZE( RI, RJ, LR ) + IMPLICIT NONE * * Tests if two arrays are identical. * @@ -2654,7 +2707,10 @@ LOGICAL FUNCTION LZE( RI, RJ, LR ) * End of LZE. * END + +* ===================================================================== LOGICAL FUNCTION LZERES( TYPE, UPLO, M, N, AA, AS, LDA ) + IMPLICIT NONE * * Tests if selected elements in two arrays are equal. * @@ -2716,7 +2772,10 @@ LOGICAL FUNCTION LZERES( TYPE, UPLO, M, N, AA, AS, LDA ) * End of LZERES. * END + +* ===================================================================== COMPLEX*16 FUNCTION ZBEG( RESET ) + IMPLICIT NONE * * Generates complex numbers as pairs of random numbers uniformly * distributed between -0.5 and 0.5. @@ -2770,7 +2829,10 @@ COMPLEX*16 FUNCTION ZBEG( RESET ) * End of ZBEG. * END + +* ===================================================================== DOUBLE PRECISION FUNCTION DDIFF( X, Y ) + IMPLICIT NONE * * Auxiliary routine for test program for Level 3 Blas. * @@ -2790,3 +2852,545 @@ DOUBLE PRECISION FUNCTION DDIFF( X, Y ) * END +* ===================================================================== + SUBROUTINE ZCHK6( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, + $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX, + $ A, AA, AS, B, BB, BS, C, CC, CS, CT, G, + $ IORDER ) + IMPLICIT NONE +* +* Tests CGEMMTR. +* +* Auxiliary routine for test program for Level 3 Blas. +* +* -- Written on 24-June-2024. +* Martin Koehler, Max Planck Institute Magdeburg +* +* .. Parameters .. + COMPLEX*16 ZERO + PARAMETER ( ZERO = ( 0.0, 0.0 ) ) + DOUBLE PRECISION RZERO + PARAMETER ( RZERO = 0.0 ) +* .. Scalar Arguments .. + DOUBLE PRECISION EPS, THRESH + INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA, IORDER + LOGICAL FATAL, REWI, TRACE + CHARACTER*13 SNAME +* .. Array Arguments .. + COMPLEX*16 A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ), + $ AS( NMAX*NMAX ), B( NMAX, NMAX ), + $ BB( NMAX*NMAX ), BET( NBET ), BS( NMAX*NMAX ), + $ C( NMAX, NMAX ), CC( NMAX*NMAX ), + $ CS( NMAX*NMAX ), CT( NMAX ) + DOUBLE PRECISION G( NMAX ) + INTEGER IDIM( NIDIM ) +* .. Local Scalars .. + COMPLEX*16 ALPHA, ALS, BETA, BLS + DOUBLE PRECISION ERR, ERRMAX + INTEGER I, IA, IB, ICA, ICB, IK, IM, IN, K, KS, LAA, + $ LBB, LCC, LDA, LDAS, LDB, LDBS, LDC, LDCS, + $ MA, MB, N, NA, NARGS, NB, NC, NS, IS + LOGICAL NULL, RESET, SAME, TRANA, TRANB + CHARACTER*1 TRANAS, TRANBS, TRANSA, TRANSB, UPLO, UPLOS + CHARACTER*3 ICH + CHARACTER*2 ISHAPE +* .. Local Arrays .. + LOGICAL ISAME( 13 ) +* .. External Functions .. + LOGICAL LZE, LZERES + EXTERNAL LZE, LZERES +* .. External Subroutines .. + EXTERNAL CZGEMMTR, ZMAKE, ZMMTCH, ZPRCN8 +* .. Intrinsic Functions .. + INTRINSIC MAX +* .. Scalars in Common .. + INTEGER INFOT, NOUTC + LOGICAL LERR, OK +* .. Common blocks .. + COMMON /INFOC/INFOT, NOUTC, OK, LERR +* .. Data statements .. + DATA ICH/'NTC'/ + DATA ISHAPE/'UL'/ +* .. Executable Statements .. +* + NARGS = 13 + NC = 0 + RESET = .TRUE. + ERRMAX = RZERO +* + DO 100 IN = 1, NIDIM + N = IDIM( IN ) +* Set LDC to 1 more than minimum value if room. + LDC = N + IF( LDC.LT.NMAX ) + $ LDC = LDC + 1 +* Skip tests if not enough room. + IF( LDC.GT.NMAX ) + $ GO TO 100 + LCC = LDC*N + NULL = N.LE.0. +* + DO 90 IK = 1, NIDIM + K = IDIM( IK ) +* + DO 80 ICA = 1, 3 + TRANSA = ICH( ICA: ICA ) + TRANA = TRANSA.EQ.'T'.OR.TRANSA.EQ.'C' +* + IF( TRANA )THEN + MA = K + NA = N + ELSE + MA = N + NA = K + END IF +* Set LDA to 1 more than minimum value if room. + LDA = MA + IF( LDA.LT.NMAX ) + $ LDA = LDA + 1 +* Skip tests if not enough room. + IF( LDA.GT.NMAX ) + $ GO TO 80 + LAA = LDA*NA +* +* Generate the matrix A. +* + CALL ZMAKE( 'ge', ' ', ' ', MA, NA, A, NMAX, AA, LDA, + $ RESET, ZERO ) +* + DO 70 ICB = 1, 3 + TRANSB = ICH( ICB: ICB ) + TRANB = TRANSB.EQ.'T'.OR.TRANSB.EQ.'C' +* + IF( TRANB )THEN + MB = N + NB = K + ELSE + MB = K + NB = N + END IF +* Set LDB to 1 more than minimum value if room. + LDB = MB + IF( LDB.LT.NMAX ) + $ LDB = LDB + 1 +* Skip tests if not enough room. + IF( LDB.GT.NMAX ) + $ GO TO 70 + LBB = LDB*NB +* +* Generate the matrix B. +* + CALL ZMAKE( 'ge', ' ', ' ', MB, NB, B, NMAX, BB, + $ LDB, RESET, ZERO ) +* + DO 60 IA = 1, NALF + ALPHA = ALF( IA ) +* + DO 50 IB = 1, NBET + BETA = BET( IB ) + DO 45 IS = 1, 2 + UPLO = ISHAPE(IS:IS) +* +* Generate the matrix C. +* + CALL ZMAKE( 'ge', UPLO, ' ', N, N, C, NMAX, + $ CC, LDC, RESET, ZERO ) +* + NC = NC + 1 +* +* Save every datum before calling the +* subroutine. +* + UPLOS = UPLO + TRANAS = TRANSA + TRANBS = TRANSB + NS = N + KS = K + ALS = ALPHA + DO 10 I = 1, LAA + AS( I ) = AA( I ) + 10 CONTINUE + LDAS = LDA + DO 20 I = 1, LBB + BS( I ) = BB( I ) + 20 CONTINUE + LDBS = LDB + BLS = BETA + DO 30 I = 1, LCC + CS( I ) = CC( I ) + 30 CONTINUE + LDCS = LDC +* +* Call the subroutine. +* + IF( TRACE ) + $ CALL ZPRCN8(NTRA, NC, SNAME, IORDER, UPLO, + $ TRANSA, TRANSB, N, K, ALPHA, LDA, + $ LDB, BETA, LDC) + IF( REWI ) + $ REWIND NTRA + CALL CZGEMMTR(IORDER, UPLO, TRANSA, TRANSB, + $ N, K, ALPHA, AA, LDA, BB, LDB, + $ BETA, CC, LDC ) +* +* Check if error-exit was taken incorrectly. +* + IF( .NOT.OK )THEN + WRITE( NOUT, FMT = 9994 ) + FATAL = .TRUE. + GO TO 120 + END IF +* +* See what data changed inside subroutines. +* + ISAME( 1 ) = UPLO .EQ. UPLOS + ISAME( 2 ) = TRANSA.EQ.TRANAS + ISAME( 3 ) = TRANSB.EQ.TRANBS + ISAME( 4 ) = NS.EQ.N + ISAME( 5 ) = KS.EQ.K + ISAME( 6 ) = ALS.EQ.ALPHA + ISAME( 7 ) = LZE( AS, AA, LAA ) + ISAME( 8 ) = LDAS.EQ.LDA + ISAME( 9 ) = LZE( BS, BB, LBB ) + ISAME( 10 ) = LDBS.EQ.LDB + ISAME( 11 ) = BLS.EQ.BETA + IF( NULL )THEN + ISAME( 12 ) = LZE( CS, CC, LCC ) + ELSE + ISAME( 12 ) = LZERES( 'ge', ' ', N, N, CS, + $ CC, LDC ) + END IF + ISAME( 13 ) = LDCS.EQ.LDC +* +* If data was incorrectly changed, report +* and return. +* + SAME = .TRUE. + DO 40 I = 1, NARGS + SAME = SAME.AND.ISAME( I ) + IF( .NOT.ISAME( I ) ) + $ WRITE( NOUT, FMT = 9998 )I + 40 CONTINUE + IF( .NOT.SAME )THEN + FATAL = .TRUE. + GO TO 120 + END IF +* + IF( .NOT.NULL )THEN +* +* Check the result. +* + CALL ZMMTCH( UPLO, TRANSA, TRANSB, N, K, + $ ALPHA, A, NMAX, B, NMAX, BETA, + $ C, NMAX, CT, G, CC, LDC, EPS, + $ ERR, FATAL, NOUT, .TRUE. ) + ERRMAX = MAX( ERRMAX, ERR ) +* If got really bad answer, report and +* return. + IF( FATAL ) + $ GO TO 120 + END IF +* + 45 CONTINUE +* + 50 CONTINUE +* + 60 CONTINUE +* + 70 CONTINUE +* + 80 CONTINUE +* + 90 CONTINUE +* + 100 CONTINUE +* +* +* Report result. +* + IF( ERRMAX.LT.THRESH )THEN + IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10000 )SNAME, NC + IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10001 )SNAME, NC + ELSE + IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10002 )SNAME, NC, ERRMAX + IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10003 )SNAME, NC, ERRMAX + END IF + GO TO 130 +* + 120 CONTINUE + WRITE( NOUT, FMT = 9996 )SNAME + CALL ZPRCN8(NOUT, NC, SNAME, IORDER, UPLO, TRANSA, TRANSB, + $ N, K, ALPHA, LDA, LDB, BETA, LDC) +* + 130 CONTINUE + RETURN +* +10003 FORMAT( ' ', A13,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ', + $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', + $ 'RATIO ', F8.2, ' - SUSPECT *******' ) +10002 FORMAT( ' ', A13,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ', + $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ', + $ 'RATIO ', F8.2, ' - SUSPECT *******' ) +10001 FORMAT( ' ', A13,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS', + $ ' (', I6, ' CALL', 'S)' ) +10000 FORMAT( ' ', A13,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS', + $ ' (', I6, ' CALL', 'S)' ) + 9998 FORMAT(' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', + $ 'ANGED INCORRECTLY *******' ) + 9996 FORMAT( ' ******* ', A13,' FAILED ON CALL NUMBER:' ) + 9995 FORMAT( 1X, I6, ': ', A13,'(''', A1, ''',''', A1, ''',', + $ 3( I3, ',' ), '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, + $ ',(', F4.1, ',', F4.1, '), C,', I3, ').' ) + 9994 FORMAT(' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', + $ '******' ) +* +* End of ZCHK6. +* + END + +* ===================================================================== + SUBROUTINE ZPRCN8(NOUT, NC, SNAME, IORDER, UPLO, + $ TRANSA, TRANSB, N, + $ K, ALPHA, LDA, LDB, BETA, LDC) + IMPLICIT NONE + + INTEGER NOUT, NC, IORDER, N, K, LDA, LDB, LDC + COMPLEX*16 ALPHA, BETA + CHARACTER*1 TRANSA, TRANSB, UPLO + CHARACTER*13 SNAME + CHARACTER*14 CRC, CTA,CTB,CUPLO + + IF (UPLO.EQ.'U') THEN + CUPLO = 'CblasUpper' + ELSE + CUPLO = 'CblasLower' + END IF + IF (TRANSA.EQ.'N')THEN + CTA = ' CblasNoTrans' + ELSE IF (TRANSA.EQ.'T')THEN + CTA = ' CblasTrans' + ELSE + CTA = 'CblasConjTrans' + END IF + IF (TRANSB.EQ.'N')THEN + CTB = ' CblasNoTrans' + ELSE IF (TRANSB.EQ.'T')THEN + CTB = ' CblasTrans' + ELSE + CTB = 'CblasConjTrans' + END IF + IF (IORDER.EQ.1)THEN + CRC = ' CblasRowMajor' + ELSE + CRC = ' CblasColMajor' + END IF + WRITE(NOUT, FMT = 9995)NC,SNAME,CRC, CUPLO, CTA,CTB + WRITE(NOUT, FMT = 9994)N, K, ALPHA, LDA, LDB, BETA, LDC + + 9995 FORMAT( 1X, I6, ': ', A13,'(', A14, ',', A14, ',', A14, ',', + $ A14, ',') + 9994 FORMAT( 10X, 2( I3, ',' ) ,' (', F4.1,',',F4.1,') , A,', + $ I3, ', B,', I3, ', (', F4.1,',',F4.1,') , C,', I3, ').' ) + END + +* ===================================================================== + SUBROUTINE ZMMTCH(UPLO, TRANSA, TRANSB, N, KK, ALPHA, A, LDA, + $ B, LDB, + $ BETA, C, LDC, CT, G, CC, LDCC, EPS, ERR, FATAL, + $ NOUT, MV ) + IMPLICIT NONE +* +* Checks the results of the computational tests for GEMMTR. +* +* Auxiliary routine for test program for Level 3 Blas. +* +* -- Written on 24-June-2024. +* Martin Koehler, Max Planck Institute, Magdeburg +* +* .. Parameters .. + COMPLEX*16 ZERO + PARAMETER ( ZERO = ( 0.0, 0.0 ) ) + DOUBLE PRECISION RZERO, RONE + PARAMETER ( RZERO = 0.0, RONE = 1.0 ) +* .. Scalar Arguments .. + COMPLEX*16 ALPHA, BETA + DOUBLE PRECISION EPS, ERR + INTEGER KK, LDA, LDB, LDC, LDCC, N, NOUT + LOGICAL FATAL, MV + CHARACTER*1 TRANSA, TRANSB, UPLO +* .. Array Arguments .. + COMPLEX*16 A( LDA, * ), B( LDB, * ), C( LDC, * ), + $ CC( LDCC, * ), CT( * ) + DOUBLE PRECISION G( * ) +* .. Local Scalars .. + COMPLEX*16 CL + DOUBLE PRECISION ERRI + INTEGER I, J, K, ISTART, ISTOP + LOGICAL CTRANA, CTRANB, TRANA, TRANB, UPPER +* .. Intrinsic Functions .. + INTRINSIC DABS, DIMAG, DCONJG, MAX, DBLE, DSQRT +* .. Statement Functions .. + DOUBLE PRECISION ABS1 +* .. Statement Function definitions .. + ABS1( CL ) = DABS( DBLE( CL ) ) + DABS( DIMAG( CL ) ) +* .. Executable Statements .. + + UPPER = UPLO.EQ.'U' + TRANA = TRANSA.EQ.'T'.OR.TRANSA.EQ.'C' + TRANB = TRANSB.EQ.'T'.OR.TRANSB.EQ.'C' + CTRANA = TRANSA.EQ.'C' + CTRANB = TRANSB.EQ.'C' + + ISTART = 1 + ISTOP = N +* +* Compute expected result, one column at a time, in CT using data +* in A, B and C. +* Compute gauges in G. +* + DO 220 J = 1, N +* + IF (UPPER) THEN + ISTART = 1 + ISTOP = J + ELSE + ISTART = J + ISTOP = N + END IF + DO 10 I = ISTART, ISTOP + CT( I ) = ZERO + G( I ) = RZERO + 10 CONTINUE + IF( .NOT.TRANA.AND..NOT.TRANB )THEN + DO 30 K = 1, KK + DO 20 I = ISTART, ISTOP + CT( I ) = CT( I ) + A( I, K )*B( K, J ) + G( I ) = G( I ) + ABS1( A( I, K ) )*ABS1( B( K, J ) ) + 20 CONTINUE + 30 CONTINUE + ELSE IF( TRANA.AND..NOT.TRANB )THEN + IF( CTRANA )THEN + DO 50 K = 1, KK + DO 40 I = ISTART, ISTOP + CT( I ) = CT( I ) + DCONJG( A( K, I ) )*B( K, J ) + G( I ) = G( I ) + ABS1( A( K, I ) )* + $ ABS1( B( K, J ) ) + 40 CONTINUE + 50 CONTINUE + ELSE + DO 70 K = 1, KK + DO 60 I = ISTART, ISTOP + CT( I ) = CT( I ) + A( K, I )*B( K, J ) + G( I ) = G( I ) + ABS1( A( K, I ) )* + $ ABS1( B( K, J ) ) + 60 CONTINUE + 70 CONTINUE + END IF + ELSE IF( .NOT.TRANA.AND.TRANB )THEN + IF( CTRANB )THEN + DO 90 K = 1, KK + DO 80 I = ISTART, ISTOP + CT( I ) = CT( I ) + A( I, K )*DCONJG( B( J, K ) ) + G( I ) = G( I ) + ABS1( A( I, K ) )* + $ ABS1( B( J, K ) ) + 80 CONTINUE + 90 CONTINUE + ELSE + DO 110 K = 1, KK + DO 100 I = ISTART, ISTOP + CT( I ) = CT( I ) + A( I, K )*B( J, K ) + G( I ) = G( I ) + ABS1( A( I, K ) )* + $ ABS1( B( J, K ) ) + 100 CONTINUE + 110 CONTINUE + END IF + ELSE IF( TRANA.AND.TRANB )THEN + IF( CTRANA )THEN + IF( CTRANB )THEN + DO 130 K = 1, KK + DO 120 I = ISTART, ISTOP + CT( I ) = CT( I ) + DCONJG( A( K, I ) )* + $ DCONJG( B( J, K ) ) + G( I ) = G( I ) + ABS1( A( K, I ) )* + $ ABS1( B( J, K ) ) + 120 CONTINUE + 130 CONTINUE + ELSE + DO 150 K = 1, KK + DO 140 I = ISTART, ISTOP + CT( I ) = CT( I ) + DCONJG( A( K, I ) )*B( J, K ) + G( I ) = G( I ) + ABS1( A( K, I ) )* + $ ABS1( B( J, K ) ) + 140 CONTINUE + 150 CONTINUE + END IF + ELSE + IF( CTRANB )THEN + DO 170 K = 1, KK + DO 160 I = ISTART, ISTOP + CT( I ) = CT( I ) + A( K, I )*DCONJG( B( J, K ) ) + G( I ) = G( I ) + ABS1( A( K, I ) )* + $ ABS1( B( J, K ) ) + 160 CONTINUE + 170 CONTINUE + ELSE + DO 190 K = 1, KK + DO 180 I = ISTART, ISTOP + CT( I ) = CT( I ) + A( K, I )*B( J, K ) + G( I ) = G( I ) + ABS1( A( K, I ) )* + $ ABS1( B( J, K ) ) + 180 CONTINUE + 190 CONTINUE + END IF + END IF + END IF + DO 200 I = ISTART, ISTOP + CT( I ) = ALPHA*CT( I ) + BETA*C( I, J ) + G( I ) = ABS1( ALPHA )*G( I ) + + $ ABS1( BETA )*ABS1( C( I, J ) ) + 200 CONTINUE +* +* Compute the error ratio for this result. +* + ERR = ZERO + DO 210 I = ISTART, ISTOP + ERRI = ABS1( CT( I ) - CC( I, J ) )/EPS + IF( G( I ).NE.RZERO ) + $ ERRI = ERRI/G( I ) + ERR = MAX( ERR, ERRI ) + IF( ERR*DSQRT( EPS ).GE.RONE ) + $ GO TO 230 + 210 CONTINUE +* + 220 CONTINUE +* +* If the loop completes, all results are at least half accurate. + GO TO 250 +* +* Report fatal error. +* + 230 FATAL = .TRUE. + WRITE( NOUT, FMT = 9999 ) + DO 240 I = ISTART, ISTOP + IF( MV )THEN + WRITE( NOUT, FMT = 9998 )I, CT( I ), CC( I, J ) + ELSE + WRITE( NOUT, FMT = 9998 )I, CC( I, J ), CT( I ) + END IF + 240 CONTINUE + IF( N.GT.1 ) + $ WRITE( NOUT, FMT = 9997 )J +* + 250 CONTINUE + RETURN +* + 9999 FORMAT(' ******* FATAL ERROR - COMPUTED RESULT IS LESS THAN HAL', + $ 'F ACCURATE *******', /' EXPECTED RE', + $ 'SULT COMPUTED RESULT' ) + 9998 FORMAT( 1X, I7, 2( ' (', G15.6, ',', G15.6, ')' ) ) + 9997 FORMAT( ' THESE ARE THE RESULTS FOR COLUMN ', I3 ) +* +* End of ZMMTCH. +* + END + diff --git a/CBLAS/testing/cin3 b/CBLAS/testing/cin3 index 7b34f267bb..093bf8e26a 100644 --- a/CBLAS/testing/cin3 +++ b/CBLAS/testing/cin3 @@ -20,3 +20,4 @@ cblas_cherk T PUT F FOR NO TEST. SAME COLUMNS. cblas_csyrk T PUT F FOR NO TEST. SAME COLUMNS. cblas_cher2k T PUT F FOR NO TEST. SAME COLUMNS. cblas_csyr2k T PUT F FOR NO TEST. SAME COLUMNS. +cblas_cgemmtr T PUT F FOR NO TEST. SAME COLUMNS. diff --git a/CBLAS/testing/din3 b/CBLAS/testing/din3 index 1f777156f0..350544d66f 100644 --- a/CBLAS/testing/din3 +++ b/CBLAS/testing/din3 @@ -11,9 +11,10 @@ T LOGICAL FLAG, T TO TEST ERROR EXITS. 0.0 1.0 0.7 VALUES OF ALPHA 3 NUMBER OF VALUES OF BETA 0.0 1.0 1.3 VALUES OF BETA -cblas_dgemm T PUT F FOR NO TEST. SAME COLUMNS. -cblas_dsymm T PUT F FOR NO TEST. SAME COLUMNS. -cblas_dtrmm T PUT F FOR NO TEST. SAME COLUMNS. -cblas_dtrsm T PUT F FOR NO TEST. SAME COLUMNS. -cblas_dsyrk T PUT F FOR NO TEST. SAME COLUMNS. -cblas_dsyr2k T PUT F FOR NO TEST. SAME COLUMNS. +cblas_dgemm T PUT F FOR NO TEST. SAME COLUMNS. +cblas_dsymm T PUT F FOR NO TEST. SAME COLUMNS. +cblas_dtrmm T PUT F FOR NO TEST. SAME COLUMNS. +cblas_dtrsm T PUT F FOR NO TEST. SAME COLUMNS. +cblas_dsyrk T PUT F FOR NO TEST. SAME COLUMNS. +cblas_dsyr2k T PUT F FOR NO TEST. SAME COLUMNS. +cblas_dgemmtr T PUT F FOR NO TEST. SAME COLUMNS. diff --git a/CBLAS/testing/sin3 b/CBLAS/testing/sin3 index aa18530cb4..f332c8a9e0 100644 --- a/CBLAS/testing/sin3 +++ b/CBLAS/testing/sin3 @@ -11,9 +11,10 @@ T LOGICAL FLAG, T TO TEST ERROR EXITS. 0.0 1.0 0.7 VALUES OF ALPHA 3 NUMBER OF VALUES OF BETA 0.0 1.0 1.3 VALUES OF BETA -cblas_sgemm T PUT F FOR NO TEST. SAME COLUMNS. -cblas_ssymm T PUT F FOR NO TEST. SAME COLUMNS. -cblas_strmm T PUT F FOR NO TEST. SAME COLUMNS. -cblas_strsm T PUT F FOR NO TEST. SAME COLUMNS. -cblas_ssyrk T PUT F FOR NO TEST. SAME COLUMNS. -cblas_ssyr2k T PUT F FOR NO TEST. SAME COLUMNS. +cblas_sgemm T PUT F FOR NO TEST. SAME COLUMNS. +cblas_ssymm T PUT F FOR NO TEST. SAME COLUMNS. +cblas_strmm T PUT F FOR NO TEST. SAME COLUMNS. +cblas_strsm T PUT F FOR NO TEST. SAME COLUMNS. +cblas_ssyrk T PUT F FOR NO TEST. SAME COLUMNS. +cblas_ssyr2k T PUT F FOR NO TEST. SAME COLUMNS. +cblas_sgemmtr T PUT F FOR NO TEST. SAME COLUMNS. diff --git a/CBLAS/testing/zin3 b/CBLAS/testing/zin3 index 90a657592c..7e00e13ced 100644 --- a/CBLAS/testing/zin3 +++ b/CBLAS/testing/zin3 @@ -11,12 +11,13 @@ T LOGICAL FLAG, T TO TEST ERROR EXITS. (0.0,0.0) (1.0,0.0) (0.7,-0.9) VALUES OF ALPHA 3 NUMBER OF VALUES OF BETA (0.0,0.0) (1.0,0.0) (1.3,-1.1) VALUES OF BETA -cblas_zgemm T PUT F FOR NO TEST. SAME COLUMNS. -cblas_zhemm T PUT F FOR NO TEST. SAME COLUMNS. -cblas_zsymm T PUT F FOR NO TEST. SAME COLUMNS. -cblas_ztrmm T PUT F FOR NO TEST. SAME COLUMNS. -cblas_ztrsm T PUT F FOR NO TEST. SAME COLUMNS. -cblas_zherk T PUT F FOR NO TEST. SAME COLUMNS. -cblas_zsyrk T PUT F FOR NO TEST. SAME COLUMNS. -cblas_zher2k T PUT F FOR NO TEST. SAME COLUMNS. -cblas_zsyr2k T PUT F FOR NO TEST. SAME COLUMNS. +cblas_zgemm T PUT F FOR NO TEST. SAME COLUMNS. +cblas_zhemm T PUT F FOR NO TEST. SAME COLUMNS. +cblas_zsymm T PUT F FOR NO TEST. SAME COLUMNS. +cblas_ztrmm T PUT F FOR NO TEST. SAME COLUMNS. +cblas_ztrsm T PUT F FOR NO TEST. SAME COLUMNS. +cblas_zherk T PUT F FOR NO TEST. SAME COLUMNS. +cblas_zsyrk T PUT F FOR NO TEST. SAME COLUMNS. +cblas_zher2k T PUT F FOR NO TEST. SAME COLUMNS. +cblas_zsyr2k T PUT F FOR NO TEST. SAME COLUMNS. +cblas_zgemmtr T PUT F FOR NO TEST. SAME COLUMNS. diff --git a/CMAKE/CheckFortranTypeSizes.cmake b/CMAKE/CheckFortranTypeSizes.cmake index 585ca26e72..17c0df80e8 100644 --- a/CMAKE/CheckFortranTypeSizes.cmake +++ b/CMAKE/CheckFortranTypeSizes.cmake @@ -1,4 +1,4 @@ -# This module perdorms several try-compiles to determine the default integer +# This module performs several try-compiles to determine the default integer # size being used by the fortran compiler # # After execution, the following variables are set. If they are un set then diff --git a/CMAKE/CheckLAPACKCompilerFlags.cmake b/CMAKE/CheckLAPACKCompilerFlags.cmake index d727a15923..2aa2a0aba3 100644 --- a/CMAKE/CheckLAPACKCompilerFlags.cmake +++ b/CMAKE/CheckLAPACKCompilerFlags.cmake @@ -10,75 +10,216 @@ # Copyright 2011 #============================================================================= -macro( CheckLAPACKCompilerFlags ) +macro(CheckLAPACKCompilerFlags) -set( FPE_EXIT FALSE ) - -# GNU Fortran -if( CMAKE_Fortran_COMPILER_ID STREQUAL "GNU" ) - if( "${CMAKE_Fortran_FLAGS}" MATCHES "-ffpe-trap=[izoupd]") - set( FPE_EXIT TRUE ) + # FORTRAN ILP default + set(FOPT_ILP64) + if(CMAKE_Fortran_COMPILER_ID MATCHES "Intel") + if(WIN32) + set(FOPT_ILP64 /integer-size:64) + else() + set(FOPT_ILP64 "SHELL:-integer-size 64") + endif() + elseif((CMAKE_Fortran_COMPILER_ID STREQUAL "VisualAge") OR # CMake 2.6 + (CMAKE_Fortran_COMPILER_ID STREQUAL "XL")) # CMake 2.8 + set(FOPT_ILP64 -qintsize=8) + elseif(CMAKE_Fortran_COMPILER_ID STREQUAL "NAG") + if(WIN32) + set(FOPT_ILP64 /i8) + else() + set(FOPT_ILP64 -i8) + endif() + elseif(CMAKE_Fortran_COMPILER_ID STREQUAL "NVHPC") + if(WIN32) + set(FOPT_ILP64 /i8) + else() + set(FOPT_ILP64 -i8) + endif() + else() + set(CPE_ENV $ENV{PE_ENV}) + if(CPE_ENV STREQUAL "CRAY") + set(FOPT_ILP64 -sinteger64) + elseif(CPE_ENV STREQUAL "NVIDIA") + set(FOPT_ILP64 -i8) + else() + set(FOPT_ILP64 -fdefault-integer-8) + endif() endif() - -# Intel Fortran -elseif( CMAKE_Fortran_COMPILER_ID STREQUAL "Intel" ) - if( "${CMAKE_Fortran_FLAGS}" MATCHES "[-/]fpe(-all=|)0" ) - set( FPE_EXIT TRUE ) + if(FORTRAN_ILP) + add_compile_options("$<$:${FOPT_ILP64}>") endif() -# SunPro F95 -elseif( CMAKE_Fortran_COMPILER_ID STREQUAL "SunPro" ) - if( ("${CMAKE_Fortran_FLAGS}" MATCHES "-ftrap=") AND - NOT ("${CMAKE_Fortran_FLAGS}" MATCHES "-ftrap=(%|)none") ) - set( FPE_EXIT TRUE ) - elseif( NOT (CMAKE_Fortran_FLAGS MATCHES "-ftrap=") ) - message( STATUS "Disabling FPE trap handlers with -ftrap=%none" ) - set( CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -ftrap=%none" - CACHE STRING "Flags for Fortran compiler." FORCE ) - endif() + # GNU Fortran + if(CMAKE_Fortran_COMPILER_ID STREQUAL "GNU") + set(FPE_EXIT_FLAG "-ffpe-trap=[izoupd]") -# IBM XL Fortran -elseif( (CMAKE_Fortran_COMPILER_ID STREQUAL "VisualAge" ) OR # CMake 2.6 - (CMAKE_Fortran_COMPILER_ID STREQUAL "XL" ) ) # CMake 2.8 - if( "${CMAKE_Fortran_FLAGS}" MATCHES "-qflttrap=[a-zA-Z:]:enable" ) - set( FPE_EXIT TRUE ) - endif() + add_compile_options("$<$:-frecursive>") + + if(CMAKE_Fortran_COMPILER_VERSION VERSION_LESS "8") + add_compile_definitions("$<$:FORTRAN_STRLEN=int>") + endif() + + # Disabling loop vectorization for GNU Fortran versions affected by + # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=122408. See issue + # https://github.com/Reference-LAPACK/lapack/issues/1160 as well. + if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "arm|arm64|aarch64") + if((CMAKE_Fortran_COMPILER_VERSION VERSION_GREATER_EQUAL "14.0" AND + CMAKE_Fortran_COMPILER_VERSION VERSION_LESS_EQUAL "14.4") OR + (CMAKE_Fortran_COMPILER_VERSION VERSION_GREATER_EQUAL "15.0" AND + CMAKE_Fortran_COMPILER_VERSION VERSION_LESS_EQUAL "15.2")) + message(WARNING + "Disabling loop vectorization for GNU Fortran (14.0-14.4, 15.0-15.2) on ARM " + "due to a compiler bug (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=122408). " + "For full performance, consider changing to a different compiler or compiler version.") + add_compile_options("$<$:-fno-tree-loop-vectorize>") + endif() + endif() + + # Intel Fortran + elseif(CMAKE_Fortran_COMPILER_ID MATCHES "Intel") + set(FPE_EXIT_FLAG "[-/]fpe(-all=|)0") + + add_compile_options("$<$:-recursive>") + if(UNIX) + add_compile_options("$<$:SHELL:-fp-model strict>") + endif() + + # SunPro F95 + elseif(CMAKE_Fortran_COMPILER_ID STREQUAL "SunPro") + set(FPE_EXIT_FLAG "-ftrap=") + set(FPE_DISABLE_FLAG "-ftrap=(%|)none") + + message(STATUS "Disabling FPE trap handlers with -ftrap=%none") + add_compile_options("$<$:-ftrap=%none>") + + if(UNIX) + # Delete libmtsk in linking sequence for Sun/Oracle Fortran Compiler. + # This library is not present in the Sun package SolarisStudio12.3-linux-x86-bin + string(REPLACE \;mtsk\; \; CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES + "${CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES}") + endif() + + # IBM XL Fortran + elseif((CMAKE_Fortran_COMPILER_ID STREQUAL "VisualAge") OR # CMake 2.6 + (CMAKE_Fortran_COMPILER_ID STREQUAL "XL")) # CMake 2.8 + set(FPE_EXIT_FLAG "-qflttrap=[a-zA-Z:]:enable") + + add_compile_options("$<$:-qrecur>") + if(UNIX) + add_compile_options("$<$:-qnosave>") + add_compile_options("$<$:-qstrict>") + endif() + + # HP Fortran + elseif(CMAKE_Fortran_COMPILER_ID STREQUAL "HP") + set(FPE_EXIT_FLAG "\\+fp_exception") -# HP Fortran -elseif( CMAKE_Fortran_COMPILER_ID STREQUAL "HP" ) - if( "${CMAKE_Fortran_FLAGS}" MATCHES "\\+fp_exception" ) - set( FPE_EXIT TRUE ) + message(STATUS "Enabling strict float conversion with +fltconst_strict") + add_compile_options("$<$:+fltconst_strict>") + + # Most versions of cmake don't have good default options for the HP compiler + add_compile_options("$<$,$>:-g>") + add_compile_options("$<$,$>:+Osize>") + add_compile_options("$<$,$>:+O2>") + add_compile_options("$<$,$>:+O2 -g>") + + # NAG Fortran + elseif(CMAKE_Fortran_COMPILER_ID STREQUAL "NAG") + set(FPE_EXIT_FLAG "[-/]ieee=(stop|nonstd)") + + add_compile_options("$<$:-ieee=full>") + add_compile_options("$<$:-dcfuns>") + add_compile_options("$<$:-thread_safe>") + add_link_options("$<$:-thread_safe>") + add_compile_options("$<$:-recursive>") + + # By default NAG Fortran uses 32bit integers as hidden STRLEN arguments + if(UNIX) + if(APPLE) + add_compile_definitions("$<$:FORTRAN_STRLEN=int>") + else() + # Get all flags added via `add_compile_options(...)` + get_directory_property(COMP_OPTIONS COMPILE_OPTIONS) + + if(NOT("${CMAKE_Fortran_FLAGS};${COMP_OPTIONS}" MATCHES "-abi=64c")) + add_compile_definitions("$<$:FORTRAN_STRLEN=int>") + endif() + endif() + endif() + + # Disable warnings + add_compile_options("$<$:-w=obs>") + add_compile_options("$<$:-w=x77>") + add_compile_options("$<$:-w=ques>") + add_compile_options("$<$:-w=unused>") + + # Suppress compiler banner and summary + include(CheckFortranCompilerFlag) + check_fortran_compiler_flag("-quiet" _quiet) + add_compile_options("$<$,$>:-quiet>") + add_link_options("$<$,$>:-quiet>") + + # NVIDIA HPC SDK + elseif(CMAKE_Fortran_COMPILER_ID STREQUAL "NVHPC") + set(FPE_EXIT_FLAG "-Ktrap=") + set(FPE_DISABLE_FLAG "-Ktrap=none") + + add_compile_options("$<$:-Kieee>") + add_compile_options("$<$:-Mrecursive>") + + # Flang Fortran + elseif(CMAKE_Fortran_COMPILER_ID STREQUAL "Flang") + add_compile_options("$<$:-Mrecursive>") + + # Compaq Fortran + elseif(CMAKE_Fortran_COMPILER_ID STREQUAL "Compaq") + if(WIN32) + if(CMAKE_GENERATOR STREQUAL "NMake Makefiles") + get_filename_component(CMAKE_Fortran_COMPILER_CMDNAM ${CMAKE_Fortran_COMPILER} NAME_WE) + message(STATUS "Using Compaq Fortran compiler with command name ${CMAKE_Fortran_COMPILER_CMDNAM}") + set(cmd ${CMAKE_Fortran_COMPILER_CMDNAM}) + string(TOLOWER "${cmd}" cmdlc) + if(cmdlc STREQUAL "df") + message(STATUS "Assume the Compaq Visual Fortran Compiler is being used") + set(CMAKE_Fortran_USE_RESPONSE_FILE_FOR_OBJECTS 1) + set(CMAKE_Fortran_USE_RESPONSE_FILE_FOR_INCLUDES 1) + #This is a workaround that is needed to avoid forward-slashes in the + #filenames listed in response files from incorrectly being interpreted as + #introducing compiler command options + if(${BUILD_SHARED_LIBS}) + message(FATAL_ERROR "Making of shared libraries with CVF has not been tested.") + endif() + set(str "NMake version 9 or later should be used. NMake version 6.0 which is\n") + set(str "${str} included with the CVF distribution fails to build Lapack because\n") + set(str "${str} the number of source files exceeds the limit for NMake v6.0\n") + message(STATUS ${str}) + set(CMAKE_Fortran_LINK_EXECUTABLE "LINK /out: ") + endif() + endif() + endif() + + else() + message(WARNING "Fortran local arrays should be allocated on the stack." + " Please use a compiler which guarantees that feature." + " See https://github.com/Reference-LAPACK/lapack/pull/188 and references therein.") endif() - if( NOT ("${CMAKE_Fortran_FLAGS}" MATCHES "\\+fltconst_strict") ) - message( STATUS "Enabling strict float conversion with +fltconst_strict" ) - set( CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} +fltconst_strict" - CACHE STRING "Flags for Fortran compiler." FORCE ) + if("${CMAKE_Fortran_FLAGS_RELEASE}" MATCHES "O[3-9]") + message(STATUS "Reducing RELEASE optimization level to O2") + string(REGEX REPLACE "O[3-9]" "O2" CMAKE_Fortran_FLAGS_RELEASE + "${CMAKE_Fortran_FLAGS_RELEASE}") endif() - # Most versions of cmake don't have good default options for the HP compiler - set( CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG} -g" - CACHE STRING "Flags used by the compiler during debug builds" FORCE ) - set( CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_MINSIZEREL} +Osize" - CACHE STRING "Flags used by the compiler during release minsize builds" FORCE ) - set( CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_RELEASE} +O2" - CACHE STRING "Flags used by the compiler during release builds" FORCE ) - set( CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_RELWITHDEBINFO} +O2 -g" - CACHE STRING "Flags used by the compiler during release with debug info builds" FORCE ) -else() -endif() - -if( "${CMAKE_Fortran_FLAGS_RELEASE}" MATCHES "O[3-9]" ) - message( STATUS "Reducing RELEASE optimization level to O2" ) - string( REGEX REPLACE "O[3-9]" "O2" CMAKE_Fortran_FLAGS_RELEASE - "${CMAKE_Fortran_FLAGS_RELEASE}" ) - set( CMAKE_Fortran_FLAGS_RELEASE "${CMAKE_Fortran_FLAGS_RELEASE}" - CACHE STRING "Flags used by the compiler during release builds" FORCE ) -endif() - - -if( FPE_EXIT ) - message( FATAL_ERROR "Floating Point Exception (FPE) trap handlers are currently explicitly enabled in the compiler flags. LAPACK is designed to check for and handle these cases internally and enabling these traps will likely cause LAPACK to crash. Please re-configure with floating point exception trapping disabled." ) -endif() + # Get all flags added via `add_compile_options(...)` + get_directory_property(COMP_OPTIONS COMPILE_OPTIONS) + + if(("${CMAKE_Fortran_FLAGS};${COMP_OPTIONS}" MATCHES "${FPE_EXIT_FLAG}") AND NOT + ("${CMAKE_Fortran_FLAGS};${COMP_OPTIONS}" MATCHES "${FPE_DISABLE_FLAG}")) + message( FATAL_ERROR "Floating Point Exception (FPE) trap handlers are" + " currently explicitly enabled in the compiler flags. LAPACK is designed" + " to check for and handle these cases internally and enabling these traps" + " will likely cause LAPACK to crash. Please re-configure with floating" + " point exception trapping disabled.") + endif() endmacro() diff --git a/CMAKE/CheckTimeFunction.cmake b/CMAKE/CheckTimeFunction.cmake index b57394887c..2399684fc1 100644 --- a/CMAKE/CheckTimeFunction.cmake +++ b/CMAKE/CheckTimeFunction.cmake @@ -7,22 +7,25 @@ macro(CHECK_TIME_FUNCTION FUNCTION VARIABLE) - try_compile(RES + try_compile(RES ${PROJECT_BINARY_DIR}/INSTALL ${PROJECT_SOURCE_DIR}/INSTALL TIMING secondtst_${FUNCTION} + CMAKE_FLAGS + -DCMAKE_OSX_DEPLOYMENT_TARGET:STRING=${CMAKE_OSX_DEPLOYMENT_TARGET} + -DCMAKE_Fortran_FLAGS:STRING=${CMAKE_Fortran_FLAGS} + -DCMAKE_EXE_LINKER_FLAGS:STRING=${CMAKE_EXE_LINKER_FLAGS} + -DCMAKE_VERBOSE_MAKEFILE=ON OUTPUT_VARIABLE OUTPUT) - if(RES) - set(${VARIABLE} ${FUNCTION} CACHE INTERNAL "Have Fortran function ${FUNCTION}") - message(STATUS "Looking for Fortran ${FUNCTION} - found") - file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log - "Fortran ${FUNCTION} exists. ${OUTPUT} \n\n") - else() - message(STATUS "Looking for Fortran ${FUNCTION} - not found") - file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log - "Fortran ${FUNCTION} does not exist. \n ${OUTPUT} \n") - endif() + if(RES) + set(${VARIABLE} ${FUNCTION} CACHE INTERNAL "Have Fortran function ${FUNCTION}") + message(STATUS "Looking for Fortran ${FUNCTION} - found") + file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log + "Fortran ${FUNCTION} exists. ${OUTPUT} \n\n") + else() + message(STATUS "Looking for Fortran ${FUNCTION} - not found") + file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log + "Fortran ${FUNCTION} does not exist. \n ${OUTPUT} \n") + endif() endmacro() - - diff --git a/CMAKE/Findcodecov.cmake b/CMAKE/Findcodecov.cmake index 3840640072..93db45130e 100644 --- a/CMAKE/Findcodecov.cmake +++ b/CMAKE/Findcodecov.cmake @@ -36,7 +36,7 @@ function(add_coverage TNAME) endfunction() -# Find the reuired flags foreach language. +# Find the required flags foreach language. set(CMAKE_REQUIRED_QUIET_SAVE ${CMAKE_REQUIRED_QUIET}) set(CMAKE_REQUIRED_QUIET ${codecov_FIND_QUIETLY}) @@ -118,7 +118,7 @@ function (codecov_path_of_source FILE RETURN_VAR) # If expression was found, SOURCEFILE is a generator-expression for an # object library. Currently we found no way to call this function automatic - # for the referenced target, so it must be called in the directoryso of the + # for the referenced target, so it must be called in the directory of the # object library definition. if(NOT "${_source}" STREQUAL "") set(${RETURN_VAR} "" PARENT_SCOPE) diff --git a/CMakeLists.txt b/CMakeLists.txt index 07df064d23..59aaed1525 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,15 +1,19 @@ -cmake_minimum_required(VERSION 3.2) +cmake_minimum_required(VERSION 3.13) -project(LAPACK Fortran C) +project(LAPACK C) set(LAPACK_MAJOR_VERSION 3) -set(LAPACK_MINOR_VERSION 10) -set(LAPACK_PATCH_VERSION 0) +set(LAPACK_MINOR_VERSION 12) +set(LAPACK_PATCH_VERSION 1) set( LAPACK_VERSION ${LAPACK_MAJOR_VERSION}.${LAPACK_MINOR_VERSION}.${LAPACK_PATCH_VERSION} ) +# Allow setting a prefix for the library names +set(CMAKE_STATIC_LIBRARY_PREFIX "lib${LIBRARY_PREFIX}") +set(CMAKE_SHARED_LIBRARY_PREFIX "lib${LIBRARY_PREFIX}") + # Add the CMake directory for custom CMake modules set(CMAKE_MODULE_PATH "${LAPACK_SOURCE_DIR}/CMAKE" ${CMAKE_MODULE_PATH}) @@ -41,6 +45,48 @@ if(_is_coverage_build) find_package(codecov) endif() +# Use valgrind if it is found +option( LAPACK_TESTING_USE_PYTHON "Use Python for testing. Disable it on memory checks." ON ) +find_program( MEMORYCHECK_COMMAND valgrind ) +if( MEMORYCHECK_COMMAND ) + message( STATUS "Found valgrind: ${MEMORYCHECK_COMMAND}" ) + set( MEMORYCHECK_COMMAND_OPTIONS "--leak-check=full --show-leak-kinds=all --track-origins=yes" ) +endif() + +# By default test Fortran compiler complex abs and complex division +option(TEST_FORTRAN_COMPILER "Test Fortran compiler complex abs and complex division" OFF) +if( TEST_FORTRAN_COMPILER ) + + add_executable( test_zcomplexabs ${LAPACK_SOURCE_DIR}/INSTALL/test_zcomplexabs.f ) + add_custom_target( run_test_zcomplexabs + COMMAND test_zcomplexabs 2> test_zcomplexabs.err + WORKING_DIRECTORY ${LAPACK_BINARY_DIR}/INSTALL + COMMENT "Running test_zcomplexabs in ${LAPACK_BINARY_DIR}/INSTALL with stderr: test_zcomplexabs.err" + SOURCES ${LAPACK_SOURCE_DIR}/INSTALL/test_zcomplexabs.f ) + + add_executable( test_zcomplexdiv ${LAPACK_SOURCE_DIR}/INSTALL/test_zcomplexdiv.f ) + add_custom_target( run_test_zcomplexdiv + COMMAND test_zcomplexdiv 2> test_zcomplexdiv.err + WORKING_DIRECTORY ${LAPACK_BINARY_DIR}/INSTALL + COMMENT "Running test_zcomplexdiv in ${LAPACK_BINARY_DIR}/INSTALL with stderr: test_zcomplexdiv.err" + SOURCES ${LAPACK_SOURCE_DIR}/INSTALL/test_zcomplexdiv.f ) + + add_executable( test_zcomplexmult ${LAPACK_SOURCE_DIR}/INSTALL/test_zcomplexmult.f ) + add_custom_target( run_test_zcomplexmult + COMMAND test_zcomplexmult 2> test_zcomplexmult.err + WORKING_DIRECTORY ${LAPACK_BINARY_DIR}/INSTALL + COMMENT "Running test_zcomplexmult in ${LAPACK_BINARY_DIR}/INSTALL with stderr: test_zcomplexmult.err" + SOURCES ${LAPACK_SOURCE_DIR}/INSTALL/test_zcomplexmult.f ) + + add_executable( test_zminMax ${LAPACK_SOURCE_DIR}/INSTALL/test_zminMax.f ) + add_custom_target( run_test_zminMax + COMMAND test_zminMax 2> test_zminMax.err + WORKING_DIRECTORY ${LAPACK_BINARY_DIR}/INSTALL + COMMENT "Running test_zminMax in ${LAPACK_BINARY_DIR}/INSTALL with stderr: test_zminMax.err" + SOURCES ${LAPACK_SOURCE_DIR}/INSTALL/test_zminMax.f ) + +endif() + # By default static library option(BUILD_SHARED_LIBS "Build shared libraries" OFF) @@ -53,7 +99,7 @@ if(BUILD_INDEX64) set(LAPACKELIB "lapacke64") set(TMGLIB "tmglib64") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWeirdNEC -DLAPACK_ILP64 -DHAVE_LAPACK_CONFIG_H") - set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -fdefault-integer-8") + set(FORTRAN_ILP TRUE) else() set(BLASLIB "blas") set(CBLASLIB "cblas") @@ -62,22 +108,20 @@ else() set(TMGLIB "tmglib") endif() -include(GNUInstallDirs) - -# Updated OSX RPATH settings -# In response to CMake 3.0 generating warnings regarding policy CMP0042, -# the OSX RPATH settings have been updated per recommendations found -# in the CMake Wiki: -# http://www.cmake.org/Wiki/CMake_RPATH_handling#Mac_OS_X_and_the_RPATH -set(CMAKE_MACOSX_RPATH ON) -set(CMAKE_SKIP_BUILD_RPATH FALSE) -set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) -list(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES ${CMAKE_INSTALL_FULL_LIBDIR} isSystemDir) -if("${isSystemDir}" STREQUAL "-1") - set(CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_FULL_LIBDIR}) - set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) +# By default build extended _64 API for supported compilers only. This needs +# CMake >= 3.18! Let's disable it by default for CMake < 3.18. +if(CMAKE_VERSION VERSION_LESS "3.18") + set(INDEX64_EXT_API_DEFAULT OFF) +else() + set(INDEX64_EXT_API_DEFAULT ON) endif() +set(INDEX64_EXT_API_COMPILERS "Intel|GNU") +option(BUILD_INDEX64_EXT_API + "Build Index-64 API as extended API with _64 suffix (needs CMake >= 3.18)" + ${INDEX64_EXT_API_DEFAULT}) +message(STATUS "Build Index-64 API as extended API with _64 suffix: ${BUILD_INDEX64_EXT_API}") +include(GNUInstallDirs) # Configure the warning and code coverage suppression file configure_file( @@ -89,82 +133,38 @@ configure_file( include(PreventInSourceBuilds) include(PreventInBuildInstalls) -# Check if recursive flag exists -include(CheckFortranCompilerFlag) -check_fortran_compiler_flag("-recursive" _recursiveFlag) -check_fortran_compiler_flag("-frecursive" _frecursiveFlag) -check_fortran_compiler_flag("-Mrecursive" _MrecursiveFlag) - -# Add recursive flag -if(_recursiveFlag) - string(REGEX MATCH "-recursive" output_test "${CMAKE_Fortran_FLAGS}") - if(NOT output_test) - set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -recursive" - CACHE STRING "Recursive flag must be set" FORCE) - endif() -elseif(_frecursiveFlag) - string(REGEX MATCH "-frecursive" output_test "${CMAKE_Fortran_FLAGS}") - if(NOT output_test) - set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -frecursive" - CACHE STRING "Recursive flag must be set" FORCE) - endif() -elseif(_MrecursiveFlag) - string(REGEX MATCH "-Mrecursive" output_test "${CMAKE_Fortran_FLAGS}") - if(NOT output_test) - set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -Mrecursive" - CACHE STRING "Recursive flag must be set" FORCE) - endif() -endif() +# Add option to enable flat namespace for symbol resolution on macOS +if(APPLE) + option(USE_FLAT_NAMESPACE "Use flat namespaces for symbol resolution during build and runtime." OFF) -if(UNIX) - if(CMAKE_Fortran_COMPILER_ID STREQUAL Intel) - set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -fp-model strict") - endif() - if(CMAKE_Fortran_COMPILER_ID STREQUAL XL) - set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -qnosave -qstrict=none") - endif() -# Delete libmtsk in linking sequence for Sun/Oracle Fortran Compiler. -# This library is not present in the Sun package SolarisStudio12.3-linux-x86-bin - string(REPLACE \;mtsk\; \; CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES "${CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES}") -endif() - -if(CMAKE_Fortran_COMPILER_ID STREQUAL Compaq) - if(WIN32) - if(CMAKE_GENERATOR STREQUAL "NMake Makefiles") - get_filename_component(CMAKE_Fortran_COMPILER_CMDNAM ${CMAKE_Fortran_COMPILER} NAME_WE) - message(STATUS "Using Compaq Fortran compiler with command name ${CMAKE_Fortran_COMPILER_CMDNAM}") - set(cmd ${CMAKE_Fortran_COMPILER_CMDNAM}) - string(TOLOWER "${cmd}" cmdlc) - if(cmdlc STREQUAL "df") - message(STATUS "Assume the Compaq Visual Fortran Compiler is being used") - set(CMAKE_Fortran_USE_RESPONSE_FILE_FOR_OBJECTS 1) - set(CMAKE_Fortran_USE_RESPONSE_FILE_FOR_INCLUDES 1) - #This is a workaround that is needed to avoid forward-slashes in the - #filenames listed in response files from incorrectly being interpreted as - #introducing compiler command options - if(${BUILD_SHARED_LIBS}) - message(FATAL_ERROR "Making of shared libraries with CVF has not been tested.") - endif() - set(str "NMake version 9 or later should be used. NMake version 6.0 which is\n") - set(str "${str} included with the CVF distribution fails to build Lapack because\n") - set(str "${str} the number of source files exceeds the limit for NMake v6.0\n") - message(STATUS ${str}) - set(CMAKE_Fortran_LINK_EXECUTABLE "LINK /out: ") - endif() + if(USE_FLAT_NAMESPACE) + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-flat_namespace") + set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-flat_namespace") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-flat_namespace") + else() + if(BUILD_SHARED_LIBS AND BUILD_TESTING) + message(WARNING + "LAPACK test suite might fail with shared libraries and the default two-level namespace. " + "Disable shared libraries or enable flat namespace for symbol resolution via -DUSE_FLAT_NAMESPACE=ON.") endif() endif() endif() - # -------------------------------------------------- set(LAPACK_INSTALL_EXPORT_NAME ${LAPACKLIB}-targets) +set(LAPACK_BINARY_PATH_SUFFIX "" CACHE STRING "Path suffix appended to the install path of binaries") + +if(NOT "${LAPACK_BINARY_PATH_SUFFIX}" STREQUAL "" AND NOT "${LAPACK_BINARY_PATH_SUFFIX}" MATCHES "^/") + set(LAPACK_BINARY_PATH_SUFFIX "/${LAPACK_BINARY_PATH_SUFFIX}") +endif() + macro(lapack_install_library lib) install(TARGETS ${lib} EXPORT ${LAPACK_INSTALL_EXPORT_NAME} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT Development - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT RuntimeLibraries - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT RuntimeLibraries + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}${LAPACK_BINARY_PATH_SUFFIX}" COMPONENT Development + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}${LAPACK_BINARY_PATH_SUFFIX}" COMPONENT RuntimeLibraries + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}${LAPACK_BINARY_PATH_SUFFIX}" COMPONENT RuntimeLibraries ) endmacro() @@ -196,26 +196,6 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LAPACK_BINARY_DIR}/bin) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LAPACK_BINARY_DIR}/lib) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LAPACK_BINARY_DIR}/lib) -# -------------------------------------------------- -# Check for any necessary platform specific compiler flags -include(CheckLAPACKCompilerFlags) -CheckLAPACKCompilerFlags() - -# -------------------------------------------------- -# Check second function - -include(CheckTimeFunction) -set(NONE ${TIME_FUNC}) -CHECK_TIME_FUNCTION(NONE TIME_FUNC) -CHECK_TIME_FUNCTION(INT_CPU_TIME TIME_FUNC) -CHECK_TIME_FUNCTION(EXT_ETIME TIME_FUNC) -CHECK_TIME_FUNCTION(EXT_ETIME_ TIME_FUNC) -CHECK_TIME_FUNCTION(INT_ETIME TIME_FUNC) -message(STATUS "--> Will use second_${TIME_FUNC}.f and dsecnd_${TIME_FUNC}.f as timing function.") - -set(SECOND_SRC ${LAPACK_SOURCE_DIR}/INSTALL/second_${TIME_FUNC}.f) -set(DSECOND_SRC ${LAPACK_SOURCE_DIR}/INSTALL/dsecnd_${TIME_FUNC}.f) - # deprecated LAPACK and LAPACKE routines option(BUILD_DEPRECATED "Build deprecated routines" OFF) message(STATUS "Build deprecated routines: ${BUILD_DEPRECATED}") @@ -238,12 +218,14 @@ if(NOT (BUILD_SINGLE OR BUILD_DOUBLE OR BUILD_COMPLEX OR BUILD_COMPLEX16)) BUILD_SINGLE, BUILD_DOUBLE, BUILD_COMPLEX, BUILD_COMPLEX16.") endif() + # -------------------------------------------------- # Subdirectories that need to be processed option(USE_OPTIMIZED_BLAS "Whether or not to use an optimized BLAS library instead of included netlib BLAS" OFF) # Check the usage of the user provided BLAS libraries if(BLAS_LIBRARIES) + enable_language(Fortran) include(CheckFortranFunctionExists) set(CMAKE_REQUIRED_LIBRARIES ${BLAS_LIBRARIES}) CHECK_FORTRAN_FUNCTION_EXISTS("dgemm" BLAS_FOUND) @@ -268,15 +250,7 @@ if(NOT BLAS_FOUND) add_subdirectory(BLAS) set(BLAS_LIBRARIES ${BLASLIB}) else() - set(CMAKE_EXE_LINKER_FLAGS - "${CMAKE_EXE_LINKER_FLAGS} ${BLAS_LINKER_FLAGS}" - CACHE STRING "Linker flags for executables" FORCE) - set(CMAKE_MODULE_LINKER_FLAGS - "${CMAKE_MODULE_LINKER_FLAGS} ${BLAS_LINKER_FLAGS}" - CACHE STRING "Linker flags for modules" FORCE) - set(CMAKE_SHARED_LINKER_FLAGS - "${CMAKE_SHARED_LINKER_FLAGS} ${BLAS_LINKER_FLAGS}" - CACHE STRING "Linker flags for shared libs" FORCE) + add_link_options(${BLAS_LINKER_FLAGS}) endif() @@ -307,18 +281,27 @@ endif() # Check the usage of the user provided or automatically found LAPACK libraries if(LAPACK_LIBRARIES) - include(CheckFortranFunctionExists) - set(CMAKE_REQUIRED_LIBRARIES ${LAPACK_LIBRARIES}) - # Check if new routine of 3.4.0 is in LAPACK_LIBRARIES - CHECK_FORTRAN_FUNCTION_EXISTS("dgeqrt" LATESTLAPACK_FOUND) - unset(CMAKE_REQUIRED_LIBRARIES) - if(LATESTLAPACK_FOUND) - message(STATUS "--> LAPACK supplied by user is WORKING, will use ${LAPACK_LIBRARIES}.") + include(CheckLanguage) + check_language(Fortran) + if(CMAKE_Fortran_COMPILER) + enable_language(Fortran) + include(CheckFortranFunctionExists) + set(CMAKE_REQUIRED_LIBRARIES ${LAPACK_LIBRARIES}) + # Check if new routine of 3.4.0 is in LAPACK_LIBRARIES + CHECK_FORTRAN_FUNCTION_EXISTS("dgeqrt" LATESTLAPACK_FOUND) + unset(CMAKE_REQUIRED_LIBRARIES) + if(LATESTLAPACK_FOUND) + message(STATUS "--> LAPACK supplied by user is WORKING, will use ${LAPACK_LIBRARIES}.") + else() + message(ERROR "--> LAPACK supplied by user is not WORKING or is older than LAPACK 3.4.0, CANNOT USE ${LAPACK_LIBRARIES}.") + message(ERROR "--> Will use REFERENCE LAPACK (by default)") + message(ERROR "--> Or Correct your LAPACK_LIBRARIES entry ") + message(ERROR "--> Or Consider checking USE_OPTIMIZED_LAPACK") + endif() else() - message(ERROR "--> LAPACK supplied by user is not WORKING or is older than LAPACK 3.4.0, CANNOT USE ${LAPACK_LIBRARIES}.") - message(ERROR "--> Will use REFERENCE LAPACK (by default)") - message(ERROR "--> Or Correct your LAPACK_LIBRARIES entry ") - message(ERROR "--> Or Consider checking USE_OPTIMIZED_LAPACK") + message(STATUS "--> LAPACK supplied by user is ${LAPACK_LIBRARIES}.") + message(STATUS "--> CMake couldn't find a Fortran compiler, so it cannot check if the provided LAPACK library works.") + set(LATESTLAPACK_FOUND TRUE) endif() endif() @@ -326,17 +309,30 @@ endif() if(NOT LATESTLAPACK_FOUND) message(STATUS "Using supplied NETLIB LAPACK implementation") set(LAPACK_LIBRARIES ${LAPACKLIB}) + + enable_language(Fortran) + + # Check for any necessary platform specific compiler flags + include(CheckLAPACKCompilerFlags) + CheckLAPACKCompilerFlags() + + # Check second function + include(CheckTimeFunction) + set(TIME_FUNC NONE) + CHECK_TIME_FUNCTION(NONE TIME_FUNC) + CHECK_TIME_FUNCTION(INT_CPU_TIME TIME_FUNC) + CHECK_TIME_FUNCTION(EXT_ETIME TIME_FUNC) + CHECK_TIME_FUNCTION(EXT_ETIME_ TIME_FUNC) + CHECK_TIME_FUNCTION(INT_ETIME TIME_FUNC) + + # Set second function + message(STATUS "--> Will use second_${TIME_FUNC}.f and dsecnd_${TIME_FUNC}.f as timing function.") + set(SECOND_SRC ${LAPACK_SOURCE_DIR}/INSTALL/second_${TIME_FUNC}.f) + set(DSECOND_SRC ${LAPACK_SOURCE_DIR}/INSTALL/dsecnd_${TIME_FUNC}.f) + add_subdirectory(SRC) else() - set(CMAKE_EXE_LINKER_FLAGS - "${CMAKE_EXE_LINKER_FLAGS} ${LAPACK_LINKER_FLAGS}" - CACHE STRING "Linker flags for executables" FORCE) - set(CMAKE_MODULE_LINKER_FLAGS - "${CMAKE_MODULE_LINKER_FLAGS} ${LAPACK_LINKER_FLAGS}" - CACHE STRING "Linker flags for modules" FORCE) - set(CMAKE_SHARED_LINKER_FLAGS - "${CMAKE_SHARED_LINKER_FLAGS} ${LAPACK_LINKER_FLAGS}" - CACHE STRING "Linker flags for shared libs" FORCE) + add_link_options(${LAPACK_LINKER_FLAGS}) endif() if(BUILD_TESTING) @@ -358,9 +354,11 @@ endif() # Cache export target set(LAPACK_INSTALL_EXPORT_NAME_CACHE ${LAPACK_INSTALL_EXPORT_NAME}) if(BUILD_TESTING OR LAPACKE_WITH_TMG) + enable_language(Fortran) if(LATESTLAPACK_FOUND AND LAPACKE_WITH_TMG) set(CMAKE_REQUIRED_LIBRARIES ${LAPACK_LIBRARIES}) # Check if dlatms (part of tmg) is found + include(CheckFortranFunctionExists) CHECK_FORTRAN_FUNCTION_EXISTS("dlatms" LAPACK_WITH_TMGLIB_FOUND) unset(CMAKE_REQUIRED_LIBRARIES) if(NOT LAPACK_WITH_TMGLIB_FOUND) @@ -375,10 +373,17 @@ endif() set(LAPACK_INSTALL_EXPORT_NAME ${LAPACK_INSTALL_EXPORT_NAME_CACHE}) unset(LAPACK_INSTALL_EXPORT_NAME_CACHE) + +#------------------------------------- +# LAPACKE +# Include lapack.h and lapacke_mangling.h even if LAPACKE is not built +add_subdirectory(LAPACKE/include) + if(LAPACKE) add_subdirectory(LAPACKE) endif() + #------------------------------------- # BLAS++ / LAPACK++ option(BLAS++ "Build BLAS++" OFF) @@ -399,9 +404,9 @@ if (BLAS++) include(ExternalProject) ExternalProject_Add(blaspp URL https://bitbucket.org/icl/blaspp/downloads/blaspp-2020.10.02.tar.gz - CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env LIBRARY_PATH=${CMAKE_BINARY_DIR}/lib LD_LIBRARY_PATH=${PROJECT_BINARY_DIR}/lib ${CMAKE_COMMAND} -DCMAKE_INSTALL_PREFIX=${PROJECT_BINARY_DIR} -DCMAKE_INSTALL_LIBDIR=lib -DBUILD_SHARED_LIBS=${BUILD_SHARED_LIBS} ${PROJECT_BINARY_DIR}/blaspp-prefix/src/blaspp - BUILD_COMMAND ${CMAKE_COMMAND} -E env LIBRARY_PATH=${PROJECT_BINARY_DIR}/lib LIB_SUFFIX="" make - INSTALL_COMMAND make PREFIX=${PROJECT_BINARY_DIR} LIB_SUFFIX="" install + CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env LIBRARY_PATH=$ENV{LIBRARY_PATH}:${CMAKE_BINARY_DIR}/lib LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH}:${PROJECT_BINARY_DIR}/lib ${CMAKE_COMMAND} -DCMAKE_INSTALL_PREFIX=${PROJECT_BINARY_DIR} -DCMAKE_INSTALL_LIBDIR=lib -DBUILD_SHARED_LIBS=${BUILD_SHARED_LIBS} ${PROJECT_BINARY_DIR}/blaspp-prefix/src/blaspp + BUILD_COMMAND ${CMAKE_COMMAND} -E env LIBRARY_PATH=$ENV{LIBRARY_PATH}:${PROJECT_BINARY_DIR}/lib LIB_SUFFIX="" ${CMAKE_COMMAND} --build . + INSTALL_COMMAND ${CMAKE_COMMAND} -E env PREFIX=${PROJECT_BINARY_DIR} LIB_SUFFIX="" ${CMAKE_COMMAND} --install . ) ExternalProject_Add_StepDependencies(blaspp build ${BLAS_LIBRARIES}) endif() @@ -412,17 +417,17 @@ if (LAPACK++) if (BUILD_SHARED_LIBS) ExternalProject_Add(lapackpp URL https://bitbucket.org/icl/lapackpp/downloads/lapackpp-2020.10.02.tar.gz - CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env LIBRARY_PATH=${CMAKE_BINARY_DIR}/lib LD_LIBRARY_PATH=${PROJECT_BINARY_DIR}/lib ${CMAKE_COMMAND} -DCMAKE_INSTALL_PREFIX=${PROJECT_BINARY_DIR} -DCMAKE_INSTALL_LIBDIR=lib -DLAPACK_LIBRARIES=${LAPACK_LIBRARIES} -DBUILD_SHARED_LIBS=${BUILD_SHARED_LIBS} ${PROJECT_BINARY_DIR}/lapackpp-prefix/src/lapackpp - BUILD_COMMAND ${CMAKE_COMMAND} -E env LIBRARY_PATH=${PROJECT_BINARY_DIR}/lib LIB_SUFFIX="" make - INSTALL_COMMAND make PREFIX=${PROJECT_BINARY_DIR} LIB_SUFFIX="" install + CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env LIBRARY_PATH=$ENV{LIBRARY_PATH}:${CMAKE_BINARY_DIR}/lib LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH}:${PROJECT_BINARY_DIR}/lib ${CMAKE_COMMAND} -DCMAKE_INSTALL_PREFIX=${PROJECT_BINARY_DIR} -DCMAKE_INSTALL_LIBDIR=lib -DLAPACK_LIBRARIES=${LAPACK_LIBRARIES} -DBUILD_SHARED_LIBS=${BUILD_SHARED_LIBS} ${PROJECT_BINARY_DIR}/lapackpp-prefix/src/lapackpp + BUILD_COMMAND ${CMAKE_COMMAND} -E env LIBRARY_PATH=$ENV{LIBRARY_PATH}:${PROJECT_BINARY_DIR}/lib LIB_SUFFIX="" ${CMAKE_COMMAND} --build . + INSTALL_COMMAND ${CMAKE_COMMAND} -E env PREFIX=${PROJECT_BINARY_DIR} LIB_SUFFIX="" ${CMAKE_COMMAND} --install . ) else () # FIXME this does not really work as the libraries list gets converted to a semicolon-separated list somewhere in the lapack++ build files ExternalProject_Add(lapackpp URL https://bitbucket.org/icl/lapackpp/downloads/lapackpp-2020.10.02.tar.gz - CONFIGURE_COMMAND env LIBRARY_PATH=${CMAKE_BINARY_DIR}/lib LD_LIBRARY_PATH=${PROJECT_BINARY_DIR}/lib ${CMAKE_COMMAND} -DCMAKE_INSTALL_PREFIX=${PROJECT_BINARY_DIR} -DCMAKE_INSTALL_LIBDIR=lib -DLAPACK_LIBRARIES="${PROJECT_BINARY_DIR}/lib/liblapack.a -lgfortran" -DBUILD_SHARED_LIBS=${BUILD_SHARED_LIBS} ${PROJECT_BINARY_DIR}/lapackpp-prefix/src/lapackpp - BUILD_COMMAND env LIBRARY_PATH=${PROJECT_BINARY_DIR}/lib LIB_SUFFIX="" make - INSTALL_COMMAND make PREFIX=${PROJECT_BINARY_DIR} LIB_SUFFIX="" install + CONFIGURE_COMMAND env LIBRARY_PATH=$ENV{LIBRARY_PATH}:${CMAKE_BINARY_DIR}/lib LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH}:${PROJECT_BINARY_DIR}/lib ${CMAKE_COMMAND} -DCMAKE_INSTALL_PREFIX=${PROJECT_BINARY_DIR} -DCMAKE_INSTALL_LIBDIR=lib -DLAPACK_LIBRARIES="${PROJECT_BINARY_DIR}/lib/liblapack.a -lgfortran" -DBUILD_SHARED_LIBS=${BUILD_SHARED_LIBS} ${PROJECT_BINARY_DIR}/lapackpp-prefix/src/lapackpp + BUILD_COMMAND env LIBRARY_PATH=$ENV{LIBRARY_PATH}:${PROJECT_BINARY_DIR}/lib LIB_SUFFIX="" ${CMAKE_COMMAND} --build . + INSTALL_COMMAND ${CMAKE_COMMAND} -E env PREFIX=${PROJECT_BINARY_DIR} LIB_SUFFIX="" ${CMAKE_COMMAND} --install . ) endif() ExternalProject_Add_StepDependencies(lapackpp build blaspp ${BLAS_LIBRARIES} ${LAPACK_LIBRARIES}) @@ -442,7 +447,7 @@ set(CPACK_MONOLITHIC_INSTALL ON) set(CPACK_PACKAGE_INSTALL_DIRECTORY "LAPACK") if(WIN32 AND NOT UNIX) # There is a bug in NSI that does not handle full unix paths properly. Make - # sure there is at least one set of four (4) backlasshes. + # sure there is at least one set of four (4) backslashes. set(CPACK_NSIS_HELP_LINK "http:\\\\\\\\http://icl.cs.utk.edu/lapack-forum") set(CPACK_NSIS_URL_INFO_ABOUT "http:\\\\\\\\www.netlib.org/lapack") set(CPACK_NSIS_CONTACT "lapack@eecs.utk.edu") @@ -536,7 +541,7 @@ install(FILES if (LAPACK++) install( DIRECTORY "${LAPACK_BINARY_DIR}/lib/" - DESTINATION ${CMAKE_INSTALL_LIBDIR} + DESTINATION "${CMAKE_INSTALL_LIBDIR}${LAPACK_BINARY_PATH_SUFFIX}" FILES_MATCHING REGEX "liblapackpp.(a|so)$" ) install( @@ -569,7 +574,7 @@ if (BLAS++) ) install( DIRECTORY "${LAPACK_BINARY_DIR}/lib/" - DESTINATION ${CMAKE_INSTALL_LIBDIR} + DESTINATION "${CMAKE_INSTALL_LIBDIR}${LAPACK_BINARY_PATH_SUFFIX}" FILES_MATCHING REGEX "libblaspp.(a|so)$" ) install( @@ -596,50 +601,81 @@ if(BUILD_HTML_DOCUMENTATION OR BUILD_MAN_DOCUMENTATION) set(DOXYGEN_PROJECT_BRIEF "LAPACK: Linear Algebra PACKage") set(DOXYGEN_PROJECT_NUMBER ${LAPACK_VERSION}) - set(DOXYGEN_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/DOCS) - set(PROJECT_LOGO ${CMAKE_CURRENT_SOURCE_DIR}/DOCS/lapack.png) + set(DOXYGEN_OUTPUT_DIRECTORY DOCS) + set(DOXYGEN_PROJECT_LOGO DOCS/lapack.png) set(DOXYGEN_OPTIMIZE_FOR_FORTRAN YES) set(DOXYGEN_SOURCE_BROWSER YES) - set(DISTRIBUTE_GROUP_DOC YES) set(DOXYGEN_CREATE_SUBDIRS YES) set(DOXYGEN_SEPARATE_MEMBER_PAGES YES) + set(DOXYGEN_TAB_SIZE 8) set(DOXYGEN_EXTRACT_ALL YES) - set(DOXYGEN_FILE_PATTERNS "*.f;*.c;*.h") + set(DOXYGEN_FILE_PATTERNS *.f *.f90 *.c *.h ) set(DOXYGEN_RECURSIVE YES) set(DOXYGEN_GENERATE_TREEVIEW YES) + set(DOXYGEN_DOT_IMAGE_FORMAT svg) set(DOXYGEN_INTERACTIVE_SVG YES) - set(DOXYGEN_QUIET YES) - set(DOXYGEN_WARNINGS NO) - set(DOXYGEN_GENERATE_HTML NO) - set(DOXYGEN_GENERATE_MAN NO) - + set(DOXYGEN_WARN_NO_PARAMDOC YES) + set(DOXYGEN_WARN_LOGFILE doxygen_error) + set(DOXYGEN_LAYOUT_FILE "DOCS/DoxygenLayout.xml") + + # Exclude functions that are duplicated, creating conflicts. + set(DOXYGEN_EXCLUDE .git + .github + SRC/VARIANTS + BLAS/SRC/lsame.f + BLAS/SRC/xerbla.f + BLAS/SRC/xerbla_array.f + INSTALL/slamchf77.f + INSTALL/dlamchf77.f ) if (BUILD_HTML_DOCUMENTATION) set(DOXYGEN_GENERATE_HTML YES) - set(DOXYGEN_HTML_OUTPUT explore-html) + set(DOXYGEN_GENERATE_MAN NO) set(DOXYGEN_INLINE_SOURCES YES) set(DOXYGEN_CALL_GRAPH YES) set(DOXYGEN_CALLER_GRAPH YES) + set(DOXYGEN_HTML_OUTPUT explore-html) + set(DOXYGEN_HTML_TIMESTAMP YES) doxygen_add_docs( html - ${PROJECT_SOURCE_DIR} + + # Doxygen INPUT = + BLAS + CBLAS + SRC + INSTALL + TESTING + DOCS/groups-usr.dox + README.md + COMMENT "Generating html LAPACK documentation (it will take some time... time to grab a coffee)" ) + unset(DOXYGEN_HTML_OUTPUT) + unset(DOXYGEN_HTML_TIMESTAMP) endif() if (BUILD_MAN_DOCUMENTATION) + set(DOXYGEN_GENERATE_HTML NO) set(DOXYGEN_GENERATE_MAN YES) - set(DOXYGEN_EXCLUDE SRC/VARIANTS) - set(DOXYGEN_MAN_LINKS YES) set(DOXYGEN_INLINE_SOURCES NO) set(DOXYGEN_CALL_GRAPH NO) set(DOXYGEN_CALLER_GRAPH NO) + set(DOXYGEN_MAN_LINKS YES) doxygen_add_docs( man - ${PROJECT_SOURCE_DIR} + + # Doxygen INPUT = + BLAS + CBLAS + SRC + INSTALL + TESTING + DOCS/groups-usr.dox + COMMENT "Generating man LAPACK documentation" ) + unset(DOXYGEN_MAN_LINKS) endif() endif() diff --git a/CTestCustom.cmake.in b/CTestCustom.cmake.in index 01f15db240..ed57467072 100644 --- a/CTestCustom.cmake.in +++ b/CTestCustom.cmake.in @@ -48,7 +48,8 @@ set(CTEST_CUSTOM_WARNING_EXCEPTION # Only run post test if suitable python interpreter was found set(PYTHON_EXECUTABLE @PYTHON_EXECUTABLE@) -if(PYTHON_EXECUTABLE) +set(LAPACK_TESTING_USE_PYTHON @LAPACK_TESTING_USE_PYTHON@) +if(PYTHON_EXECUTABLE AND LAPACK_TESTING_USE_PYTHON) set(CTEST_CUSTOM_POST_TEST "${PYTHON_EXECUTABLE} ./lapack_testing.py -s -d TESTING") endif() diff --git a/DOCS/CBLAS.md b/DOCS/CBLAS.md new file mode 100644 index 0000000000..5ee02e779d --- /dev/null +++ b/DOCS/CBLAS.md @@ -0,0 +1,143 @@ +# THE CBLAS C INTERFACE TO BLAS + +## Contents +[1. Introduction](#1-introduction) + +[1.1 Naming Schemes](#11-naming-schemes) + +[1.2 Integers](#12-integers) + +[2. Function List](#2-function-list) + +[2.1 BLAS Level 1](#21-blas-level-1) + +[2.2 BLAS Level 2](#22-blas-level-2) + +[2.3 BLAS Level 3](#23-blas-level-3) + +[3. Examples](#3-examples) + +[3.1 Calling DGEMV](#31-calling-dgemv) + +[3.2 Calling DGEMV_64](#32-calling-dgemv_64) + +## 1. Introduction +This document describes CBLAS, the C language interface to the Basic Linear Algebra Subprograms (BLAS). +In comparison to BLAS Fortran interfaces CBLAS interfaces support both row-major and column-major matrix +ordering with the `layout` parameter. +The prototypes for CBLAS interfaces, associated macros and type definitions are contained in the header +file [cblas.h](../CBLAS/include/cblas.h) + +### 1.1 Naming Schemes +The naming scheme for the CBLAS interface is to take the Fortran BLAS routine name, make it lower case, +and add the prefix `cblas_`. For example, the BLAS routine `DGEMM` becomes `cblas_dgemm`. + +CBLAS routines also support `_64` suffix that enables large data arrays support in the LP64 interface library +(default build configuration). This suffix allows mixing LP64 and ILP64 programming models in one application. +For example, `cblas_dgemm` with 32-bit integer type support can be mixed with `cblas_dgemm_64` +that supports 64-bit integer type. + +### 1.2 Integers +Variables with the Fortran type integer are converted to `CBLAS_INT` in CBLAS. By default +the CBLAS interface is built with 32-bit integer type, but it can be re-defined to 64-bit integer type. + +## 2. Function List +This section contains the list of the currently available CBLAS interfaces. + +### 2.1 BLAS Level 1 +* Single Precision Real: + ``` + SROTG SROTMG SROT SROTM SSWAP SSCAL + SCOPY SAXPY SDOT SDSDOT SNRM2 SASUM + ISAMAX + ``` +* Double Precision Real: + ``` + DROTG DROTMG DROT DROTM DSWAP DSCAL + DCOPY DAXPY DDOT DSDOT DNRM2 DASUM + IDAMAX + ``` +* Single Precision Complex: + ``` + CROTG CSROT CSWAP CSCAL CSSCAL CCOPY + CAXPY CDOTU_SUB CDOTC_SUB ICAMAX SCABS1 + ``` +* Double Precision Complex: + ``` + ZROTG ZDROT ZSWAP ZSCAL ZDSCAL ZCOPY + ZAXPY ZDOTU_SUB ZDOTC_SUB IZAMAX DCABS1 + DZNRM2 DZASUM + ``` +### 2.2 BLAS Level 2 +* Single Precision Real: + ``` + SGEMV SGBMV SGER SSBMV SSPMV SSPR + SSPR2 SSYMV SSYR SSYR2 STBMV STBSV + STPMV STPSV STRMV STRSV + ``` +* Double Precision Real: + ``` + DGEMV DGBMV DGER DSBMV DSPMV DSPR + DSPR2 DSYMV DSYR DSYR2 DTBMV DTBSV + DTPMV DTPSV DTRMV DTRSV + ``` +* Single Precision Complex: + ``` + CGEMV CGBMV CHEMV CHBMV CHPMV CTRMV + CTBMV CTPMV CTRSV CTBSV CTPSV CGERU + CGERC CHER CHER2 CHPR CHPR2 + ``` +* Double Precision Complex: + ``` + ZGEMV ZGBMV ZHEMV ZHBMV ZHPMV ZTRMV + ZTBMV ZTPMV ZTRSV ZTBSV ZTPSV ZGERU + ZGERC ZHER ZHER2 ZHPR ZHPR2 + ``` +### 2.3 BLAS Level 3 +* Single Precision Real: + ``` + SGEMM SSYMM SSYRK SSERK2K STRMM STRSM + ``` +* Double Precision Real: + ``` + DGEMM DSYMM DSYRK DSERK2K DTRMM DTRSM + ``` +* Single Precision Complex: + ``` + CGEMM CSYMM CHEMM CHERK CHER2K CTRMM + CTRSM CSYRK CSYR2K + ``` +* Double Precision Complex: + ``` + ZGEMM ZSYMM ZHEMM ZHERK ZHER2K ZTRMM + ZTRSM ZSYRK ZSYR2K + ``` + +## 3. Examples +This section contains examples of calling CBLAS functions from a C program. + +### 3.1 Calling DGEMV +The variable declarations should be as follows: +``` + double *a, *x, *y; + double alpha, beta; + CBLAS_INT m, n, lda, incx, incy; +``` +The CBLAS function call is then: +``` +cblas_dgemv( CblasColMajor, CblasNoTrans, m, n, alpha, a, lda, x, incx, beta, + y, incy ); +``` + +### 3.2 Calling DGEMV_64 +The variable declarations should be as follows: +``` + double *a, *x, *y; + double alpha, beta; + int64_t m, n, lda, incx, incy; +``` +The CBLAS function call is then: +``` +cblas_dgemv_64( CblasColMajor, CblasNoTrans, m, n, alpha, a, lda, x, incx, beta, + y, incy ); +``` diff --git a/DOCS/Doxyfile b/DOCS/Doxyfile index c3c4b21375..efb4ddaf16 100644 --- a/DOCS/Doxyfile +++ b/DOCS/Doxyfile @@ -1,7 +1,7 @@ -# Doxyfile 1.9.1 +# Doxyfile 1.12.0 # This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project. +# Doxygen (www.doxygen.org) for a project. # # All text after a double hash (##) is considered a comment and is placed in # front of the TAG it is preceding. @@ -12,6 +12,16 @@ # For lists, items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (\" \"). +# +# Note: +# +# Use Doxygen to compare the used configuration file with the template +# configuration file: +# doxygen -x [configFile] +# Use Doxygen to compare the used configuration file with the template +# configuration file without replacing the environment variables or CMake type +# replacement variables: +# doxygen -x_noenv [configFile] #--------------------------------------------------------------------------- # Project related configuration options @@ -38,7 +48,7 @@ PROJECT_NAME = LAPACK # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 3.10.0 +PROJECT_NUMBER = 3.12.1 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a @@ -53,24 +63,42 @@ PROJECT_BRIEF = "LAPACK: Linear Algebra PACKage" PROJECT_LOGO = DOCS/lapack.png +# With the PROJECT_ICON tag one can specify an icon that is included in the tabs +# when the HTML document is shown. Doxygen will copy the logo to the output +# directory. + +PROJECT_ICON = + # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path # into which the generated documentation will be written. If a relative path is -# entered, it will be relative to the location where doxygen was started. If +# entered, it will be relative to the location where Doxygen was started. If # left blank the current directory will be used. OUTPUT_DIRECTORY = DOCS -# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- -# directories (in 2 levels) under the output directory of each output format and -# will distribute the generated files over these directories. Enabling this -# option can be useful when feeding doxygen a huge amount of source files, where +# If the CREATE_SUBDIRS tag is set to YES then Doxygen will create up to 4096 +# sub-directories (in 2 levels) under the output directory of each output format +# and will distribute the generated files over these directories. Enabling this +# option can be useful when feeding Doxygen a huge amount of source files, where # putting all generated files in the same directory would otherwise causes -# performance problems for the file system. +# performance problems for the file system. Adapt CREATE_SUBDIRS_LEVEL to +# control the number of sub-directories. # The default value is: NO. CREATE_SUBDIRS = YES -# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII +# Controls the number of sub-directories that will be created when +# CREATE_SUBDIRS tag is set to YES. Level 0 represents 16 directories, and every +# level increment doubles the number of directories, resulting in 4096 +# directories at level 8 which is the default and also the maximum value. The +# sub-directories are organized in 2 levels, the first level always has a fixed +# number of 16 directories. +# Minimum value: 0, maximum value: 8, default value: 8. +# This tag requires that the tag CREATE_SUBDIRS is set to YES. + +CREATE_SUBDIRS_LEVEL = 8 + +# If the ALLOW_UNICODE_NAMES tag is set to YES, Doxygen will allow non-ASCII # characters to appear in the names of generated files. If set to NO, non-ASCII # characters will be escaped, for example _xE3_x81_x84 will be used for Unicode # U+3044. @@ -79,36 +107,28 @@ CREATE_SUBDIRS = YES ALLOW_UNICODE_NAMES = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this +# documentation generated by Doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. -# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, -# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), -# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, -# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), -# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, -# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, -# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, -# Ukrainian and Vietnamese. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Bulgarian, +# Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, English +# (United States), Esperanto, Farsi (Persian), Finnish, French, German, Greek, +# Hindi, Hungarian, Indonesian, Italian, Japanese, Japanese-en (Japanese with +# English messages), Korean, Korean-en (Korean with English messages), Latvian, +# Lithuanian, Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, +# Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, +# Swedish, Turkish, Ukrainian and Vietnamese. # The default value is: English. OUTPUT_LANGUAGE = English -# The OUTPUT_TEXT_DIRECTION tag is used to specify the direction in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all generated output in the proper direction. -# Possible values are: None, LTR, RTL and Context. -# The default value is: None. - -OUTPUT_TEXT_DIRECTION = None - -# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member +# If the BRIEF_MEMBER_DESC tag is set to YES, Doxygen will include brief member # descriptions after the members that are listed in the file and class # documentation (similar to Javadoc). Set to NO to disable this. # The default value is: YES. BRIEF_MEMBER_DESC = YES -# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief +# If the REPEAT_BRIEF tag is set to YES, Doxygen will prepend the brief # description of a member or function before the detailed description # # Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the @@ -126,16 +146,26 @@ REPEAT_BRIEF = YES # the entity):The $name class, The $name widget, The $name file, is, provides, # specifies, contains, represents, a, an and the. -ABBREVIATE_BRIEF = +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# doxygen will generate a detailed section even if there is only a brief +# Doxygen will generate a detailed section even if there is only a brief # description. # The default value is: NO. ALWAYS_DETAILED_SEC = NO -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# If the INLINE_INHERITED_MEMB tag is set to YES, Doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. @@ -143,7 +173,7 @@ ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO -# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path +# If the FULL_PATH_NAMES tag is set to YES, Doxygen will prepend the full path # before files name in the file list and in the header files. If set to NO the # shortest path that makes the file name unique will be used # The default value is: YES. @@ -153,11 +183,11 @@ FULL_PATH_NAMES = YES # The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. # Stripping is only done if one of the specified strings matches the left-hand # part of the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the path to +# If left blank the directory from which Doxygen is run is used as the path to # strip. # # Note that you can specify absolute paths here, but also relative paths, which -# will be relative from the directory where doxygen is started. +# will be relative from the directory where Doxygen is started. # This tag requires that the tag FULL_PATH_NAMES is set to YES. STRIP_FROM_PATH = @@ -171,14 +201,14 @@ STRIP_FROM_PATH = STRIP_FROM_INC_PATH = -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# If the SHORT_NAMES tag is set to YES, Doxygen will generate much shorter (but # less readable) file names. This can be useful is your file systems doesn't # support long names like on DOS, Mac, or CD-ROM. # The default value is: NO. SHORT_NAMES = NO -# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen will interpret the # first line (until the first dot) of a Javadoc-style comment as the brief # description. If set to NO, the Javadoc-style will behave just like regular Qt- # style comments (thus requiring an explicit @brief command for a brief @@ -187,17 +217,17 @@ SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO -# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line +# If the JAVADOC_BANNER tag is set to YES then Doxygen will interpret a line # such as # /*************** # as being the beginning of a Javadoc-style comment "banner". If set to NO, the # Javadoc-style will behave just like regular comments and it will not be -# interpreted by doxygen. +# interpreted by Doxygen. # The default value is: NO. JAVADOC_BANNER = NO -# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will interpret the first # line (until the first dot) of a Qt-style comment as the brief description. If # set to NO, the Qt-style will behave just like regular Qt-style comments (thus # requiring an explicit \brief command for a brief description.) @@ -205,7 +235,7 @@ JAVADOC_BANNER = NO QT_AUTOBRIEF = NO -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen treat a # multi-line C++ special comment block (i.e. a block of //! or /// comments) as # a brief description. This used to be the default behavior. The new default is # to treat a multi-line C++ comment block as a detailed description. Set this @@ -217,10 +247,10 @@ QT_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO -# By default Python docstrings are displayed as preformatted text and doxygen's +# By default Python docstrings are displayed as preformatted text and Doxygen's # special commands cannot be used. By setting PYTHON_DOCSTRING to NO the -# doxygen's special commands can be used and the contents of the docstring -# documentation blocks is shown as doxygen documentation. +# Doxygen's special commands can be used and the contents of the docstring +# documentation blocks is shown as Doxygen documentation. # The default value is: YES. PYTHON_DOCSTRING = YES @@ -231,7 +261,7 @@ PYTHON_DOCSTRING = YES INHERIT_DOCS = YES -# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new +# If the SEPARATE_MEMBER_PAGES tag is set to YES then Doxygen will produce a new # page for each member. If set to NO, the documentation of a member will be part # of the file/class/namespace that contains it. # The default value is: NO. @@ -248,16 +278,16 @@ TAB_SIZE = 8 # the documentation. An alias has the form: # name=value # For example adding -# "sideeffect=@par Side Effects:\n" +# "sideeffect=@par Side Effects:^^" # will allow you to put the command \sideeffect (or @sideeffect) in the # documentation, which will result in a user-defined paragraph with heading -# "Side Effects:". You can put \n's in the value part of an alias to insert -# newlines (in the resulting output). You can put ^^ in the value part of an -# alias to insert a newline as if a physical newline was in the original file. -# When you need a literal { or } or , in the value part of an alias you have to -# escape them by means of a backslash (\), this can lead to conflicts with the -# commands \{ and \} for these it is advised to use the version @{ and @} or use -# a double escape (\\{ and \\}) +# "Side Effects:". Note that you cannot put \n's in the value part of an alias +# to insert newlines (in the resulting output). You can put ^^ in the value part +# of an alias to insert a newline as if a physical newline was in the original +# file. When you need a literal { or } or , in the value part of an alias you +# have to escape them by means of a backslash (\), this can lead to conflicts +# with the commands \{ and \} for these it is advised to use the version @{ and +# @} or use a double escape (\\{ and \\}) ALIASES = @@ -301,30 +331,30 @@ OPTIMIZE_OUTPUT_SLICE = NO # parses. With this tag you can assign which parser to use for a given # extension. Doxygen has a built-in mapping, but you can override or extend it # using this tag. The format is ext=language, where ext is a file extension, and -# language is one of the parsers supported by doxygen: IDL, Java, JavaScript, -# Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice, VHDL, -# Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: +# language is one of the parsers supported by Doxygen: IDL, Java, JavaScript, +# Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice, +# VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: # FortranFree, unknown formatted Fortran: Fortran. In the later case the parser # tries to guess whether the code is fixed or free formatted code, this is the -# default for Fortran type files). For instance to make doxygen treat .inc files +# default for Fortran type files). For instance to make Doxygen treat .inc files # as Fortran files (default is PHP), and .f files as C (default is Fortran), # use: inc=Fortran f=C. # # Note: For files without extension you can use no_extension as a placeholder. # # Note that for custom extensions you also need to set FILE_PATTERNS otherwise -# the files are not read by doxygen. When specifying no_extension you should add +# the files are not read by Doxygen. When specifying no_extension you should add # * to the FILE_PATTERNS. # # Note see also the list of default file extension mappings. EXTENSION_MAPPING = -# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# If the MARKDOWN_SUPPORT tag is enabled then Doxygen pre-processes all comments # according to the Markdown format, which allows for more readable # documentation. See https://daringfireball.net/projects/markdown/ for details. -# The output of markdown processing is further processed by doxygen, so you can -# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# The output of markdown processing is further processed by Doxygen, so you can +# mix Doxygen, HTML, and XML commands with Markdown formatting. Disable only in # case of backward compatibilities issues. # The default value is: YES. @@ -334,12 +364,23 @@ MARKDOWN_SUPPORT = YES # to that level are automatically included in the table of contents, even if # they do not have an id attribute. # Note: This feature currently applies only to Markdown headings. -# Minimum value: 0, maximum value: 99, default value: 5. +# Minimum value: 0, maximum value: 99, default value: 6. # This tag requires that the tag MARKDOWN_SUPPORT is set to YES. TOC_INCLUDE_HEADINGS = 5 -# When enabled doxygen tries to link words that correspond to documented +# The MARKDOWN_ID_STYLE tag can be used to specify the algorithm used to +# generate identifiers for the Markdown headings. Note: Every identifier is +# unique. +# Possible values are: DOXYGEN use a fixed 'autotoc_md' string followed by a +# sequence number starting at 0 and GITHUB use the lower case version of title +# with any whitespace replaced by '-' and punctuation characters removed. +# The default value is: DOXYGEN. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +MARKDOWN_ID_STYLE = DOXYGEN + +# When enabled Doxygen tries to link words that correspond to documented # classes, or namespaces to their corresponding documentation. Such a link can # be prevented in individual cases by putting a % sign in front of the word or # globally by setting AUTOLINK_SUPPORT to NO. @@ -349,10 +390,10 @@ AUTOLINK_SUPPORT = YES # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should set this -# tag to YES in order to let doxygen match functions declarations and +# tag to YES in order to let Doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); -# versus func(std::string) {}). This also make the inheritance and collaboration -# diagrams that involve STL classes more complete and accurate. +# versus func(std::string) {}). This also makes the inheritance and +# collaboration diagrams that involve STL classes more complete and accurate. # The default value is: NO. BUILTIN_STL_SUPPORT = NO @@ -364,16 +405,16 @@ BUILTIN_STL_SUPPORT = NO CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip (see: -# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen -# will parse them like normal C++ but will assume all classes use public instead -# of private inheritance when no explicit protection keyword is present. +# https://www.riverbankcomputing.com/software) sources only. Doxygen will parse +# them like normal C++ but will assume all classes use public instead of private +# inheritance when no explicit protection keyword is present. # The default value is: NO. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate # getter and setter methods for a property. Setting this option to YES will make -# doxygen to replace the get and set methods by a property in the documentation. +# Doxygen to replace the get and set methods by a property in the documentation. # This will only work if the methods are indeed getting or setting a simple # type. If this is not the case, or you want to show the methods anyway, you # should set this option to NO. @@ -382,12 +423,12 @@ SIP_SUPPORT = NO IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES then doxygen will reuse the documentation of the first +# tag is set to YES then Doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. # The default value is: NO. -DISTRIBUTE_GROUP_DOC = YES +DISTRIBUTE_GROUP_DOC = NO # If one adds a struct or class to a group and this option is enabled, then also # any nested class or struct is added to the same group. By default this option @@ -440,34 +481,42 @@ TYPEDEF_HIDES_STRUCT = NO # The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This # cache is used to resolve symbols given their name and scope. Since this can be # an expensive process and often the same symbol appears multiple times in the -# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small -# doxygen will become slower. If the cache is too large, memory is wasted. The +# code, Doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# Doxygen will become slower. If the cache is too large, memory is wasted. The # cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range # is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 -# symbols. At the end of a run doxygen will report the cache usage and suggest +# symbols. At the end of a run Doxygen will report the cache usage and suggest # the optimal cache size from a speed point of view. # Minimum value: 0, maximum value: 9, default value: 0. LOOKUP_CACHE_SIZE = 0 -# The NUM_PROC_THREADS specifies the number threads doxygen is allowed to use -# during processing. When set to 0 doxygen will based this on the number of +# The NUM_PROC_THREADS specifies the number of threads Doxygen is allowed to use +# during processing. When set to 0 Doxygen will based this on the number of # cores available in the system. You can set it explicitly to a value larger # than 0 to get more control over the balance between CPU load and processing # speed. At this moment only the input processing can be done using multiple # threads. Since this is still an experimental feature the default is set to 1, -# which efficively disables parallel processing. Please report any issues you +# which effectively disables parallel processing. Please report any issues you # encounter. Generating dot graphs in parallel is controlled by the # DOT_NUM_THREADS setting. # Minimum value: 0, maximum value: 32, default value: 1. NUM_PROC_THREADS = 1 +# If the TIMESTAMP tag is set different from NO then each generated page will +# contain the date or date and time when the page was generated. Setting this to +# NO can help when comparing the output of multiple runs. +# Possible values are: YES, NO, DATETIME and DATE. +# The default value is: NO. + +TIMESTAMP = YES + #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- -# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in +# If the EXTRACT_ALL tag is set to YES, Doxygen will assume all entities in # documentation are documented, even if no documentation was available. Private # class members and static file members will be hidden unless the # EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. @@ -533,7 +582,7 @@ EXTRACT_ANON_NSPACES = NO RESOLVE_UNNAMED_PARAMS = YES -# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members inside documented classes or files. If set to NO these # members will be included in the various overviews, but no documentation # section is generated. This option has no effect if EXTRACT_ALL is enabled. @@ -541,22 +590,23 @@ RESOLVE_UNNAMED_PARAMS = YES HIDE_UNDOC_MEMBERS = NO -# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. If set # to NO, these classes will be included in the various overviews. This option -# has no effect if EXTRACT_ALL is enabled. +# will also hide undocumented C++ concepts if enabled. This option has no effect +# if EXTRACT_ALL is enabled. # The default value is: NO. HIDE_UNDOC_CLASSES = NO -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all friend # declarations. If set to NO, these declarations will be included in the # documentation. # The default value is: NO. HIDE_FRIEND_COMPOUNDS = NO -# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. If set to NO, these # blocks will be appended to the function's detailed documentation block. # The default value is: NO. @@ -570,37 +620,44 @@ HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO -# With the correct setting of option CASE_SENSE_NAMES doxygen will better be +# With the correct setting of option CASE_SENSE_NAMES Doxygen will better be # able to match the capabilities of the underlying filesystem. In case the # filesystem is case sensitive (i.e. it supports files in the same directory # whose names only differ in casing), the option must be set to YES to properly # deal with such files in case they appear in the input. For filesystems that -# are not case sensitive the option should be be set to NO to properly deal with +# are not case sensitive the option should be set to NO to properly deal with # output files written for symbols that only differ in casing, such as for two # classes, one named CLASS and the other named Class, and to also support # references to files without having to specify the exact matching casing. On -# Windows (including Cygwin) and MacOS, users should typically set this option +# Windows (including Cygwin) and macOS, users should typically set this option # to NO, whereas on Linux or other Unix flavors it should typically be set to # YES. -# The default value is: system dependent. +# Possible values are: SYSTEM, NO and YES. +# The default value is: SYSTEM. CASE_SENSE_NAMES = NO -# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# If the HIDE_SCOPE_NAMES tag is set to NO then Doxygen will show members with # their full class and namespace scopes in the documentation. If set to YES, the # scope will be hidden. # The default value is: NO. HIDE_SCOPE_NAMES = NO -# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then Doxygen will # append additional text to a page's title, such as Class Reference. If set to # YES the compound reference will be hidden. # The default value is: NO. HIDE_COMPOUND_REFERENCE= NO -# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# If the SHOW_HEADERFILE tag is set to YES then the documentation for a class +# will show which file needs to be included to use the class. +# The default value is: YES. + +SHOW_HEADERFILE = YES + +# If the SHOW_INCLUDE_FILES tag is set to YES then Doxygen will put a list of # the files that are included by a file in the documentation of that file. # The default value is: YES. @@ -613,7 +670,7 @@ SHOW_INCLUDE_FILES = YES SHOW_GROUPED_MEMB_INC = NO -# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen will list include # files with double quotes in the documentation rather than with sharp brackets. # The default value is: NO. @@ -625,14 +682,14 @@ FORCE_LOCAL_INCLUDES = NO INLINE_INFO = YES -# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# If the SORT_MEMBER_DOCS tag is set to YES then Doxygen will sort the # (detailed) documentation of file and class members alphabetically by member # name. If set to NO, the members will appear in declaration order. # The default value is: YES. SORT_MEMBER_DOCS = YES -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# If the SORT_BRIEF_DOCS tag is set to YES then Doxygen will sort the brief # descriptions of file, namespace and class members alphabetically by member # name. If set to NO, the members will appear in declaration order. Note that # this will also influence the order of the classes in the class list. @@ -640,7 +697,7 @@ SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO -# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then Doxygen will sort the # (brief and detailed) documentation of class members so that constructors and # destructors are listed first. If set to NO the constructors will appear in the # respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. @@ -652,7 +709,7 @@ SORT_BRIEF_DOCS = NO SORT_MEMBERS_CTORS_1ST = NO -# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# If the SORT_GROUP_NAMES tag is set to YES then Doxygen will sort the hierarchy # of group names into alphabetical order. If set to NO the group names will # appear in their defined order. # The default value is: NO. @@ -669,11 +726,11 @@ SORT_GROUP_NAMES = NO SORT_BY_SCOPE_NAME = NO -# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# If the STRICT_PROTO_MATCHING option is enabled and Doxygen fails to do proper # type resolution of all parameters of a function it will reject a match between # the prototype and the implementation of a member function even if there is # only one candidate or it is obvious which candidate to choose by doing a -# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# simple string match. By disabling STRICT_PROTO_MATCHING Doxygen will still # accept a match between prototype and implementation in such cases. # The default value is: NO. @@ -743,27 +800,28 @@ SHOW_FILES = YES SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from +# Doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command command input-file, where command is the value of the # FILE_VERSION_FILTER tag, and input-file is the name of an input file provided -# by doxygen. Whatever the program writes to standard output is used as the file +# by Doxygen. Whatever the program writes to standard output is used as the file # version. For an example see the documentation. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed -# by doxygen. The layout file controls the global structure of the generated +# by Doxygen. The layout file controls the global structure of the generated # output files in an output format independent way. To create the layout file -# that represents doxygen's defaults, run doxygen with the -l option. You can +# that represents Doxygen's defaults, run Doxygen with the -l option. You can # optionally specify a file name after the option, if omitted DoxygenLayout.xml -# will be used as the name of the layout file. +# will be used as the name of the layout file. See also section "Changing the +# layout of pages" for information. # -# Note that if you run doxygen from a directory containing a file called -# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# Note that if you run Doxygen from a directory containing a file called +# DoxygenLayout.xml, Doxygen will parse it automatically even if the LAYOUT_FILE # tag is left empty. -LAYOUT_FILE = +LAYOUT_FILE = DOCS/DoxygenLayout.xml # The CITE_BIB_FILES tag can be used to specify one or more bib files containing # the reference definitions. This must be a list of .bib files. The .bib @@ -775,19 +833,35 @@ LAYOUT_FILE = CITE_BIB_FILES = +# The EXTERNAL_TOOL_PATH tag can be used to extend the search path (PATH +# environment variable) so that external tools such as latex and gs can be +# found. +# Note: Directories specified with EXTERNAL_TOOL_PATH are added in front of the +# path already specified by the PATH variable, and are added in the order +# specified. +# Note: This option is particularly useful for macOS version 14 (Sonoma) and +# higher, when running Doxygen from Doxywizard, because in this case any user- +# defined changes to the PATH are ignored. A typical example on macOS is to set +# EXTERNAL_TOOL_PATH = /Library/TeX/texbin /usr/local/bin +# together with the standard path, the full search path used by doxygen when +# launching external tools will then become +# PATH=/Library/TeX/texbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin + +EXTERNAL_TOOL_PATH = + #--------------------------------------------------------------------------- # Configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated to -# standard output by doxygen. If QUIET is set to YES this implies that the +# standard output by Doxygen. If QUIET is set to YES this implies that the # messages are off. # The default value is: NO. -QUIET = YES +QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are -# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES +# generated to standard error (stderr) by Doxygen. If WARNINGS is set to YES # this implies that the warnings are on. # # Tip: Turn warnings on while writing the documentation. @@ -795,54 +869,91 @@ QUIET = YES WARNINGS = YES -# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate +# If the WARN_IF_UNDOCUMENTED tag is set to YES then Doxygen will generate # warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag # will automatically be disabled. # The default value is: YES. WARN_IF_UNDOCUMENTED = YES -# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some parameters -# in a documented function, or documenting parameters that don't exist or using -# markup commands wrongly. +# If the WARN_IF_DOC_ERROR tag is set to YES, Doxygen will generate warnings for +# potential errors in the documentation, such as documenting some parameters in +# a documented function twice, or documenting parameters that don't exist or +# using markup commands wrongly. # The default value is: YES. WARN_IF_DOC_ERROR = YES +# If WARN_IF_INCOMPLETE_DOC is set to YES, Doxygen will warn about incomplete +# function parameter documentation. If set to NO, Doxygen will accept that some +# parameters have no documentation without warning. +# The default value is: YES. + +WARN_IF_INCOMPLETE_DOC = YES + # This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that # are documented, but have no documentation for their parameters or return -# value. If set to NO, doxygen will only warn about wrong or incomplete -# parameter documentation, but not about the absence of documentation. If -# EXTRACT_ALL is set to YES then this flag will automatically be disabled. +# value. If set to NO, Doxygen will only warn about wrong parameter +# documentation, but not about the absence of documentation. If EXTRACT_ALL is +# set to YES then this flag will automatically be disabled. See also +# WARN_IF_INCOMPLETE_DOC # The default value is: NO. -WARN_NO_PARAMDOC = NO +WARN_NO_PARAMDOC = YES -# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when +# If WARN_IF_UNDOC_ENUM_VAL option is set to YES, Doxygen will warn about +# undocumented enumeration values. If set to NO, Doxygen will accept +# undocumented enumeration values. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: NO. + +WARN_IF_UNDOC_ENUM_VAL = NO + +# If the WARN_AS_ERROR tag is set to YES then Doxygen will immediately stop when # a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS -# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but -# at the end of the doxygen process doxygen will return with a non-zero status. -# Possible values are: NO, YES and FAIL_ON_WARNINGS. +# then Doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but +# at the end of the Doxygen process Doxygen will return with a non-zero status. +# If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS_PRINT then Doxygen behaves +# like FAIL_ON_WARNINGS but in case no WARN_LOGFILE is defined Doxygen will not +# write the warning messages in between other messages but write them at the end +# of a run, in case a WARN_LOGFILE is defined the warning messages will be +# besides being in the defined file also be shown at the end of a run, unless +# the WARN_LOGFILE is defined as - i.e. standard output (stdout) in that case +# the behavior will remain as with the setting FAIL_ON_WARNINGS. +# Possible values are: NO, YES, FAIL_ON_WARNINGS and FAIL_ON_WARNINGS_PRINT. # The default value is: NO. WARN_AS_ERROR = NO -# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# The WARN_FORMAT tag determines the format of the warning messages that Doxygen # can produce. The string should contain the $file, $line, and $text tags, which # will be replaced by the file and line number from which the warning originated # and the warning text. Optionally the format may contain $version, which will # be replaced by the version of the file (if it could be obtained via # FILE_VERSION_FILTER) +# See also: WARN_LINE_FORMAT # The default value is: $file:$line: $text. WARN_FORMAT = "$file:$line: $text" +# In the $text part of the WARN_FORMAT command it is possible that a reference +# to a more specific place is given. To make it easier to jump to this place +# (outside of Doxygen) the user can define a custom "cut" / "paste" string. +# Example: +# WARN_LINE_FORMAT = "'vi $file +$line'" +# See also: WARN_FORMAT +# The default value is: at line $line of file $file. + +WARN_LINE_FORMAT = "at line $line of file $file" + # The WARN_LOGFILE tag can be used to specify a file to which warning and error # messages should be written. If left blank the output is written to standard -# error (stderr). +# error (stderr). In case the file specified cannot be opened for writing the +# warning and error messages are written to standard error. When as file - is +# specified the warning and error messages are written to standard output +# (stdout). -WARN_LOGFILE = output_err +WARN_LOGFILE = doxygen_error #--------------------------------------------------------------------------- # Configuration options related to the input files @@ -854,39 +965,55 @@ WARN_LOGFILE = output_err # spaces. See also FILE_PATTERNS and EXTENSION_MAPPING # Note: If this tag is empty the current directory is searched. -INPUT = . \ - DOCS/groups-usr.dox +INPUT = BLAS \ + CBLAS \ + SRC \ + INSTALL \ + TESTING \ + DOCS/groups-usr.dox \ + README.md # This tag can be used to specify the character encoding of the source files -# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# that Doxygen parses. Internally Doxygen uses the UTF-8 encoding. Doxygen uses # libiconv (or the iconv built into libc) for the transcoding. See the libiconv # documentation (see: # https://www.gnu.org/software/libiconv/) for the list of possible encodings. +# See also: INPUT_FILE_ENCODING # The default value is: UTF-8. INPUT_ENCODING = UTF-8 +# This tag can be used to specify the character encoding of the source files +# that Doxygen parses The INPUT_FILE_ENCODING tag can be used to specify +# character encoding on a per file pattern basis. Doxygen will compare the file +# name with each pattern and apply the encoding instead of the default +# INPUT_ENCODING) if there is a match. The character encodings are a list of the +# form: pattern=encoding (like *.php=ISO-8859-1). +# See also: INPUT_ENCODING for further information on supported encodings. + +INPUT_FILE_ENCODING = + # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and # *.h) to filter out the source-files in the directories. # # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not -# read by doxygen. +# read by Doxygen. # # Note the list of default checked file patterns might differ from the list of # default file extension mappings. # -# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, -# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, -# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, -# *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C comment), -# *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd, *.vhdl, -# *.ucf, *.qsf and *.ice. - -FILE_PATTERNS = *.c \ - *.f \ +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cxxm, +# *.cpp, *.cppm, *.ccm, *.c++, *.c++m, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, +# *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, *.h++, *.ixx, *.l, *.cs, *.d, +# *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to +# be provided as Doxygen C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, +# *.f18, *.f, *.for, *.vhd, *.vhdl, *.ucf, *.qsf and *.ice. + +FILE_PATTERNS = *.f \ *.f90 \ + *.c \ *.h # The RECURSIVE tag can be used to specify whether or not subdirectories should @@ -899,37 +1026,17 @@ RECURSIVE = YES # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. # -# Note that relative paths are relative to the directory from which doxygen is +# Note that relative paths are relative to the directory from which Doxygen is # run. -EXCLUDE = CMAKE \ - DOCS \ - .svn \ - CBLAS/.svn \ - CBLAS/src/.svn \ - CBLAS/testing/.svn \ - CBLAS/example/.svn \ - CBLAS/include/.svn \ - BLAS/.svn \ - BLAS/SRC/.svn \ - BLAS/TESTING/.svn \ - SRC/.svn \ - SRC/VARIANTS/.svn \ - SRC/VARIANTS/LIB/.svn \ - SRC/VARIANTS/cholesky/.svn \ - SRC/VARIANTS/cholesky/RL/.svn \ - SRC/VARIANTS/cholesky/TOP/.svn \ - SRC/VARIANTS/lu/.svn \ - SRC/VARIANTS/lu/CR/.svn \ - SRC/VARIANTS/lu/LL/.svn \ - SRC/VARIANTS/lu/REC/.svn \ - SRC/VARIANTS/qr/.svn \ - SRC/VARIANTS/qr/LL/.svn \ - INSTALL/.svn \ - TESTING/.svn \ - TESTING/EIG/.svn \ - TESTING/MATGEN/.svn \ - TESTING/LIN/.svn +EXCLUDE = .git \ + .github \ + SRC/VARIANTS \ + BLAS/SRC/lsame.f \ + BLAS/SRC/xerbla.f \ + BLAS/SRC/xerbla_array.f \ + INSTALL/slamchf77.f \ + INSTALL/dlamchf77.f # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded @@ -945,20 +1052,13 @@ EXCLUDE_SYMLINKS = NO # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories for example use the pattern */test/* -EXCLUDE_PATTERNS = *.py \ - *.txt \ - *.in \ - *.inc \ - Makefile +EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, -# AClass::ANamespace, ANamespace::*Test -# -# Note that the wildcards are matched against the file with absolute path, so to -# exclude all test directories use the pattern */test/* +# ANamespace::AClass, ANamespace::*Test EXCLUDE_SYMBOLS = @@ -973,7 +1073,7 @@ EXAMPLE_PATH = # *.h) to filter out the source-files in the directories. If left blank all # files are included. -EXAMPLE_PATTERNS = +EXAMPLE_PATTERNS = * # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude commands @@ -988,7 +1088,7 @@ EXAMPLE_RECURSIVE = NO IMAGE_PATH = -# The INPUT_FILTER tag can be used to specify a program that doxygen should +# The INPUT_FILTER tag can be used to specify a program that Doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command: # @@ -1003,9 +1103,14 @@ IMAGE_PATH = # code is scanned, but not when the output code is generated. If lines are added # or removed, the anchors will not be placed correctly. # +# Note that Doxygen will use the data processed and written to standard output +# for further processing, therefore nothing else, like debug statements or used +# commands (so in case of a Windows batch file always use @echo OFF), should be +# written to standard output. +# # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not -# properly processed by doxygen. +# properly processed by Doxygen. INPUT_FILTER = @@ -1018,7 +1123,7 @@ INPUT_FILTER = # # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not -# properly processed by doxygen. +# properly processed by Doxygen. FILTER_PATTERNS = @@ -1040,10 +1145,19 @@ FILTER_SOURCE_PATTERNS = # If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that # is part of the input, its contents will be placed on the main page # (index.html). This can be useful if you have a project on for instance GitHub -# and want to reuse the introduction page also for the doxygen output. +# and want to reuse the introduction page also for the Doxygen output. USE_MDFILE_AS_MAINPAGE = +# The Fortran standard specifies that for fixed formatted Fortran code all +# characters from position 72 are to be considered as comment. A common +# extension is to allow longer lines before the automatic comment starts. The +# setting FORTRAN_COMMENT_AFTER will also make it possible that longer lines can +# be processed before the automatic comment starts. +# Minimum value: 7, maximum value: 10000, default value: 72. + +FORTRAN_COMMENT_AFTER = 72 + #--------------------------------------------------------------------------- # Configuration options related to source browsing #--------------------------------------------------------------------------- @@ -1058,12 +1172,13 @@ USE_MDFILE_AS_MAINPAGE = SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body of functions, -# classes and enums directly into the documentation. +# multi-line macros, enums or list initialized variables directly into the +# documentation. # The default value is: NO. INLINE_SOURCES = YES -# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct Doxygen to hide any # special comment blocks from generated source code fragments. Normal C, C++ and # Fortran comments will always remain visible. # The default value is: YES. @@ -1101,7 +1216,7 @@ REFERENCES_LINK_SOURCE = YES SOURCE_TOOLTIPS = YES # If the USE_HTAGS tag is set to YES then the references to source code will -# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# point to the HTML generated by the htags(1) tool instead of Doxygen built-in # source browser. The htags tool is part of GNU's global source tagging system # (see https://www.gnu.org/software/global/global.html). You will need version # 4.8.6 or higher. @@ -1115,14 +1230,14 @@ SOURCE_TOOLTIPS = YES # Doxygen will invoke htags (and that will in turn invoke gtags), so these # tools must be available from the command line (i.e. in the search path). # -# The result: instead of the source browser generated by doxygen, the links to +# The result: instead of the source browser generated by Doxygen, the links to # source code will now point to the output of htags. # The default value is: NO. # This tag requires that the tag SOURCE_BROWSER is set to YES. USE_HTAGS = NO -# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# If the VERBATIM_HEADERS tag is set the YES then Doxygen will generate a # verbatim copy of the header file for each class for which an include is # specified. Set to NO to disable this. # See also: Section \class. @@ -1130,6 +1245,46 @@ USE_HTAGS = NO VERBATIM_HEADERS = YES +# If the CLANG_ASSISTED_PARSING tag is set to YES then Doxygen will use the +# clang parser (see: +# http://clang.llvm.org/) for more accurate parsing at the cost of reduced +# performance. This can be particularly helpful with template rich C++ code for +# which Doxygen's built-in parser lacks the necessary type information. +# Note: The availability of this option depends on whether or not Doxygen was +# generated with the -Duse_libclang=ON option for CMake. +# The default value is: NO. + +CLANG_ASSISTED_PARSING = NO + +# If the CLANG_ASSISTED_PARSING tag is set to YES and the CLANG_ADD_INC_PATHS +# tag is set to YES then Doxygen will add the directory of each input to the +# include path. +# The default value is: YES. +# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. + +CLANG_ADD_INC_PATHS = YES + +# If clang assisted parsing is enabled you can provide the compiler with command +# line options that you would normally use when invoking the compiler. Note that +# the include paths will already be set by Doxygen for the files and directories +# specified with INPUT and INCLUDE_PATH. +# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. + +CLANG_OPTIONS = + +# If clang assisted parsing is enabled you can provide the clang parser with the +# path to the directory containing a file called compile_commands.json. This +# file is the compilation database (see: +# http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) containing the +# options used when the source files were built. This is equivalent to +# specifying the -p option to a clang tool, such as clang-check. These options +# will then be passed to the parser. Any options specified with CLANG_OPTIONS +# will be added as well. +# Note: The availability of this option depends on whether or not Doxygen was +# generated with the -Duse_libclang=ON option for CMake. + +CLANG_DATABASE_PATH = + #--------------------------------------------------------------------------- # Configuration options related to the alphabetical class index #--------------------------------------------------------------------------- @@ -1141,10 +1296,11 @@ VERBATIM_HEADERS = YES ALPHABETICAL_INDEX = YES -# In case all classes in a project start with a common prefix, all classes will -# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag -# can be used to specify a prefix (or a list of prefixes) that should be ignored -# while generating the index headers. +# The IGNORE_PREFIX tag can be used to specify a prefix (or a list of prefixes) +# that should be ignored while generating the index headers. The IGNORE_PREFIX +# tag works for classes, function and member names. The entity will be placed in +# the alphabetical list under the first letter of the entity name that remains +# after removing the prefix. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES. IGNORE_PREFIX = @@ -1153,7 +1309,7 @@ IGNORE_PREFIX = # Configuration options related to the HTML output #--------------------------------------------------------------------------- -# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output +# If the GENERATE_HTML tag is set to YES, Doxygen will generate HTML output # The default value is: YES. GENERATE_HTML = YES @@ -1174,40 +1330,40 @@ HTML_OUTPUT = explore-html HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a user-defined HTML header file for -# each generated HTML page. If the tag is left blank doxygen will generate a +# each generated HTML page. If the tag is left blank Doxygen will generate a # standard header. # # To get valid HTML the header file that includes any scripts and style sheets -# that doxygen needs, which is dependent on the configuration options used (e.g. +# that Doxygen needs, which is dependent on the configuration options used (e.g. # the setting GENERATE_TREEVIEW). It is highly recommended to start with a # default header using # doxygen -w html new_header.html new_footer.html new_stylesheet.css # YourConfigFile # and then modify the file new_header.html. See also section "Doxygen usage" -# for information on how to generate the default header that doxygen normally +# for information on how to generate the default header that Doxygen normally # uses. # Note: The header is subject to change so you typically have to regenerate the -# default header when upgrading to a newer version of doxygen. For a description +# default header when upgrading to a newer version of Doxygen. For a description # of the possible markers and block names see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each -# generated HTML page. If the tag is left blank doxygen will generate a standard +# generated HTML page. If the tag is left blank Doxygen will generate a standard # footer. See HTML_HEADER for more information on how to generate a default # footer and what special commands can be used inside the footer. See also # section "Doxygen usage" for information on how to generate the default footer -# that doxygen normally uses. +# that Doxygen normally uses. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading style # sheet that is used by each HTML page. It can be used to fine-tune the look of -# the HTML output. If left blank doxygen will generate a default style sheet. +# the HTML output. If left blank Doxygen will generate a default style sheet. # See also section "Doxygen usage" for information on how to generate the style -# sheet that doxygen normally uses. +# sheet that Doxygen normally uses. # Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as # it is more robust and this tag (HTML_STYLESHEET) will in the future become # obsolete. @@ -1217,13 +1373,18 @@ HTML_STYLESHEET = # The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined # cascading style sheets that are included after the standard style sheets -# created by doxygen. Using this option one can overrule certain style aspects. +# created by Doxygen. Using this option one can overrule certain style aspects. # This is preferred over using HTML_STYLESHEET since it does not replace the # standard style sheet and is therefore more robust against future updates. # Doxygen will copy the style sheet files to the output directory. # Note: The order of the extra style sheet files is of importance (e.g. the last # style sheet in the list overrules the setting of the previous ones in the -# list). For an example see the documentation. +# list). +# Note: Since the styling of scrollbars can currently not be overruled in +# Webkit/Chromium, the styling will be left out of the default doxygen.css if +# one or more extra stylesheets have been specified. So if scrollbar +# customization is desired it has to be added explicitly. For an example see the +# documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_STYLESHEET = @@ -1238,9 +1399,22 @@ HTML_EXTRA_STYLESHEET = HTML_EXTRA_FILES = +# The HTML_COLORSTYLE tag can be used to specify if the generated HTML output +# should be rendered with a dark or light theme. +# Possible values are: LIGHT always generates light mode output, DARK always +# generates dark mode output, AUTO_LIGHT automatically sets the mode according +# to the user preference, uses light mode if no preference is set (the default), +# AUTO_DARK automatically sets the mode according to the user preference, uses +# dark mode if no preference is set and TOGGLE allows a user to switch between +# light and dark mode via a button. +# The default value is: AUTO_LIGHT. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE = AUTO_LIGHT + # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen # will adjust the colors in the style sheet and background images according to -# this color. Hue is specified as an angle on a colorwheel, see +# this color. Hue is specified as an angle on a color-wheel, see # https://en.wikipedia.org/wiki/Hue for more information. For instance the value # 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 # purple, and 360 is red again. @@ -1250,7 +1424,7 @@ HTML_EXTRA_FILES = HTML_COLORSTYLE_HUE = 220 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors -# in the HTML output. For a value of 0 the output will use grayscales only. A +# in the HTML output. For a value of 0 the output will use gray-scales only. A # value of 255 will produce the most vivid colors. # Minimum value: 0, maximum value: 255, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. @@ -1268,15 +1442,6 @@ HTML_COLORSTYLE_SAT = 100 HTML_COLORSTYLE_GAMMA = 80 -# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML -# page will contain the date and time when the page was generated. Setting this -# to YES can help to show when doxygen was last run and thus if the -# documentation is up to date. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_TIMESTAMP = YES - # If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML # documentation will contain a main index with vertical navigation menus that # are dynamically created via JavaScript. If disabled, the navigation index will @@ -1296,6 +1461,33 @@ HTML_DYNAMIC_MENUS = YES HTML_DYNAMIC_SECTIONS = NO +# If the HTML_CODE_FOLDING tag is set to YES then classes and functions can be +# dynamically folded and expanded in the generated HTML source code. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_CODE_FOLDING = YES + +# If the HTML_COPY_CLIPBOARD tag is set to YES then Doxygen will show an icon in +# the top right corner of code and text fragments that allows the user to copy +# its content to the clipboard. Note this only works if supported by the browser +# and the web page is served via a secure context (see: +# https://www.w3.org/TR/secure-contexts/), i.e. using the https: or file: +# protocol. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COPY_CLIPBOARD = YES + +# Doxygen stores a couple of settings persistently in the browser (via e.g. +# cookies). By default these settings apply to all HTML pages generated by +# Doxygen across all projects. The HTML_PROJECT_COOKIE tag can be used to store +# the settings under a project specific key, such that the user preferences will +# be stored separately. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_PROJECT_COOKIE = + # With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries # shown in the various tree structured indices initially; the user can expand # and collapse entries dynamically later on. Doxygen will expand the tree to @@ -1313,7 +1505,7 @@ HTML_INDEX_NUM_ENTRIES = 100 # generated that can be used as input for Apple's Xcode 3 integrated development # environment (see: # https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To -# create a documentation set, doxygen will generate a Makefile in the HTML +# create a documentation set, Doxygen will generate a Makefile in the HTML # output directory. Running make will produce the docset in that directory and # running make install will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at @@ -1332,6 +1524,13 @@ GENERATE_DOCSET = NO DOCSET_FEEDNAME = "Doxygen generated docs" +# This tag determines the URL of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDURL = + # This tag specifies a string that should uniquely identify the documentation # set bundle. This should be a reverse domain-name style string, e.g. # com.mycompany.MyDocSet. Doxygen will append .docset to the name. @@ -1354,14 +1553,18 @@ DOCSET_PUBLISHER_ID = org.doxygen.Publisher DOCSET_PUBLISHER_NAME = Publisher -# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# If the GENERATE_HTMLHELP tag is set to YES then Doxygen generates three # additional HTML index files: index.hhp, index.hhc, and index.hhk. The # index.hhp is a project file that can be read by Microsoft's HTML Help Workshop -# (see: -# https://www.microsoft.com/en-us/download/details.aspx?id=21138) on Windows. +# on Windows. In the beginning of 2021 Microsoft took the original page, with +# a.o. the download links, offline the HTML help workshop was already many years +# in maintenance mode). You can download the HTML help workshop from the web +# archives at Installation executable (see: +# http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo +# ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe). # # The HTML Help Workshop contains a compiler that can convert all HTML output -# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# generated by Doxygen into a single compiled HTML file (.chm). Compiled HTML # files are now used as the Windows 98 help format, and will replace the old # Windows help format (.hlp) on all Windows platforms in the future. Compressed # HTML files also contain an index, a table of contents, and you can search for @@ -1381,7 +1584,7 @@ CHM_FILE = # The HHC_LOCATION tag can be used to specify the location (absolute path # including file name) of the HTML help compiler (hhc.exe). If non-empty, -# doxygen will try to run the HTML help compiler on the generated index.hhp. +# Doxygen will try to run the HTML help compiler on the generated index.hhp. # The file has to be specified with full path. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. @@ -1415,6 +1618,16 @@ BINARY_TOC = NO TOC_EXPAND = NO +# The SITEMAP_URL tag is used to specify the full URL of the place where the +# generated documentation will be placed on the server by the user during the +# deployment of the documentation. The generated sitemap is called sitemap.xml +# and placed on the directory specified by HTML_OUTPUT. In case no SITEMAP_URL +# is specified no sitemap is generated. For information about the sitemap +# protocol see https://www.sitemaps.org +# This tag requires that the tag GENERATE_HTML is set to YES. + +SITEMAP_URL = + # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that # can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help @@ -1473,7 +1686,7 @@ QHP_CUST_FILTER_ATTRS = QHP_SECT_FILTER_ATTRS = # The QHG_LOCATION tag can be used to specify the location (absolute path -# including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to +# including file name) of Qt's qhelpgenerator. If non-empty Doxygen will try to # run qhelpgenerator on the generated .qhp file. # This tag requires that the tag GENERATE_QHP is set to YES. @@ -1517,18 +1730,30 @@ DISABLE_INDEX = NO # to work a browser that supports JavaScript, DHTML, CSS and frames is required # (i.e. any modern browser). Windows users are probably better off using the # HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can -# further fine-tune the look of the index. As an example, the default style -# sheet generated by doxygen has an example that shows how to put an image at -# the root of the tree instead of the PROJECT_NAME. Since the tree basically has -# the same information as the tab index, you could consider setting -# DISABLE_INDEX to YES when enabling this option. +# further fine tune the look of the index (see "Fine-tuning the output"). As an +# example, the default style sheet generated by Doxygen has an example that +# shows how to put an image at the root of the tree instead of the PROJECT_NAME. +# Since the tree basically has the same information as the tab index, you could +# consider setting DISABLE_INDEX to YES when enabling this option. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_TREEVIEW = YES +# When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the +# FULL_SIDEBAR option determines if the side bar is limited to only the treeview +# area (value NO) or if it should extend to the full height of the window (value +# YES). Setting this to YES gives a layout similar to +# https://docs.readthedocs.io with more room for contents, but less room for the +# project logo, title, and description. If either GENERATE_TREEVIEW or +# DISABLE_INDEX is set to NO, this option has no effect. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FULL_SIDEBAR = NO + # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that -# doxygen will group on one line in the generated HTML documentation. +# Doxygen will group on one line in the generated HTML documentation. # # Note that a value of 0 will completely suppress the enum values from appearing # in the overview section. @@ -1537,6 +1762,12 @@ GENERATE_TREEVIEW = YES ENUM_VALUES_PER_LINE = 4 +# When the SHOW_ENUM_VALUES tag is set doxygen will show the specified +# enumeration values besides the enumeration mnemonics. +# The default value is: NO. + +SHOW_ENUM_VALUES = NO + # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used # to set the initial width (in pixels) of the frame in which the tree is shown. # Minimum value: 0, maximum value: 1500, default value: 250. @@ -1544,14 +1775,21 @@ ENUM_VALUES_PER_LINE = 4 TREEVIEW_WIDTH = 250 -# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to +# If the EXT_LINKS_IN_WINDOW option is set to YES, Doxygen will open links to # external symbols imported via tag files in a separate window. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. EXT_LINKS_IN_WINDOW = NO -# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg +# If the OBFUSCATE_EMAILS tag is set to YES, Doxygen will obfuscate email +# addresses. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +OBFUSCATE_EMAILS = YES + +# If the HTML_FORMULA_FORMAT option is set to svg, Doxygen will use the pdf2svg # tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see # https://inkscape.org) to generate formulas as SVG images instead of PNGs for # the HTML output. These images will generally look nicer at scaled resolutions. @@ -1564,24 +1802,13 @@ HTML_FORMULA_FORMAT = png # Use this tag to change the font size of LaTeX formulas included as images in # the HTML documentation. When you change the font size after a successful -# doxygen run you need to manually remove any form_*.png images from the HTML +# Doxygen run you need to manually remove any form_*.png images from the HTML # output directory to force them to be regenerated. # Minimum value: 8, maximum value: 50, default value: 10. # This tag requires that the tag GENERATE_HTML is set to YES. FORMULA_FONTSIZE = 10 -# Use the FORMULA_TRANSPARENT tag to determine whether or not the images -# generated for formulas are transparent PNGs. Transparent PNGs are not -# supported properly for IE 6.0, but are supported on all modern browsers. -# -# Note that when changing this option you need to delete any form_*.png files in -# the HTML output directory before the changes have effect. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. - -FORMULA_TRANSPARENT = YES - # The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands # to create new LaTeX commands to be used in formulas as building blocks. See # the section "Including formulas" for details. @@ -1599,11 +1826,29 @@ FORMULA_MACROFILE = USE_MATHJAX = NO +# With MATHJAX_VERSION it is possible to specify the MathJax version to be used. +# Note that the different versions of MathJax have different requirements with +# regards to the different settings, so it is possible that also other MathJax +# settings have to be changed when switching between the different MathJax +# versions. +# Possible values are: MathJax_2 and MathJax_3. +# The default value is: MathJax_2. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_VERSION = MathJax_2 + # When MathJax is enabled you can set the default output format to be used for -# the MathJax output. See the MathJax site (see: -# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. +# the MathJax output. For more details about the output format see MathJax +# version 2 (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) and MathJax version 3 +# (see: +# http://docs.mathjax.org/en/latest/web/components/output.html). # Possible values are: HTML-CSS (which is slower, but has the best -# compatibility), NativeMML (i.e. MathML) and SVG. +# compatibility. This is the name for Mathjax version 2, for MathJax version 3 +# this will be translated into chtml), NativeMML (i.e. MathML. Only supported +# for MathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This +# is the name for Mathjax version 3, for MathJax version 2 this will be +# translated into HTML-CSS) and SVG. # The default value is: HTML-CSS. # This tag requires that the tag USE_MATHJAX is set to YES. @@ -1616,20 +1861,26 @@ MATHJAX_FORMAT = HTML-CSS # MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax # Content Delivery Network so you can quickly see the result without installing # MathJax. However, it is strongly recommended to install a local copy of -# MathJax from https://www.mathjax.org before deployment. -# The default value is: https://cdn.jsdelivr.net/npm/mathjax@2. +# MathJax from https://www.mathjax.org before deployment. The default value is: +# - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2 +# - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3 # This tag requires that the tag USE_MATHJAX is set to YES. -MATHJAX_RELPATH = http://www.mathjax.org/mathjax +MATHJAX_RELPATH = https://cdn.jsdelivr.net/npm/mathjax@2 # The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax # extension names that should be enabled during MathJax rendering. For example +# for MathJax version 2 (see +# https://docs.mathjax.org/en/v2.7-latest/tex.html#tex-and-latex-extensions): # MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# For example for MathJax version 3 (see +# http://docs.mathjax.org/en/latest/input/tex/extensions/index.html): +# MATHJAX_EXTENSIONS = ams # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_EXTENSIONS = -# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# The MATHJAX_CODEFILE tag can be used to specify a file with JavaScript pieces # of code that will be used on startup of the MathJax code. See the MathJax site # (see: # http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an @@ -1638,12 +1889,12 @@ MATHJAX_EXTENSIONS = MATHJAX_CODEFILE = -# When the SEARCHENGINE tag is enabled doxygen will generate a search box for -# the HTML output. The underlying search engine uses javascript and DHTML and +# When the SEARCHENGINE tag is enabled Doxygen will generate a search box for +# the HTML output. The underlying search engine uses JavaScript and DHTML and # should work on any modern browser. Note that when using HTML help # (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) # there is already a search function so this one should typically be disabled. -# For large projects the javascript based search engine can be slow, then +# For large projects the JavaScript based search engine can be slow, then # enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to # search using the keyboard; to jump to the search box use + S # (what the is depends on the OS and browser, but it is typically @@ -1662,7 +1913,7 @@ SEARCHENGINE = YES # When the SERVER_BASED_SEARCH tag is enabled the search engine will be # implemented using a web server instead of a web client using JavaScript. There # are two flavors of web server based searching depending on the EXTERNAL_SEARCH -# setting. When disabled, doxygen will generate a PHP script for searching and +# setting. When disabled, Doxygen will generate a PHP script for searching and # an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing # and searching needs to be provided by external tools. See the section # "External Indexing and Searching" for details. @@ -1671,7 +1922,7 @@ SEARCHENGINE = YES SERVER_BASED_SEARCH = NO -# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP +# When EXTERNAL_SEARCH tag is enabled Doxygen will no longer generate the PHP # script for searching. Instead the search results are written to an XML file # which needs to be processed by an external indexer. Doxygen will invoke an # external search engine pointed to by the SEARCHENGINE_URL option to obtain the @@ -1716,7 +1967,7 @@ SEARCHDATA_FILE = searchdata.xml EXTERNAL_SEARCH_ID = -# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen +# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through Doxygen # projects other than the one defined by this configuration file, but that are # all added to the same external search index. Each project needs to have a # unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of @@ -1730,7 +1981,7 @@ EXTRA_SEARCH_MAPPINGS = # Configuration options related to the LaTeX output #--------------------------------------------------------------------------- -# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output. +# If the GENERATE_LATEX tag is set to YES, Doxygen will generate LaTeX output. # The default value is: YES. GENERATE_LATEX = NO @@ -1753,7 +2004,7 @@ LATEX_OUTPUT = latex # the output language. # This tag requires that the tag GENERATE_LATEX is set to YES. -LATEX_CMD_NAME = latex +LATEX_CMD_NAME = # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate # index for LaTeX. @@ -1775,7 +2026,7 @@ MAKEINDEX_CMD_NAME = makeindex LATEX_MAKEINDEX_CMD = makeindex -# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX +# If the COMPACT_LATEX tag is set to YES, Doxygen generates more compact LaTeX # documents. This may be useful for small projects and may help to save some # trees in general. # The default value is: NO. @@ -1804,36 +2055,38 @@ PAPER_TYPE = a4 EXTRA_PACKAGES = -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the -# generated LaTeX document. The header should contain everything until the first -# chapter. If it is left blank doxygen will generate a standard header. See -# section "Doxygen usage" for information on how to let doxygen write the -# default header to a separate file. +# The LATEX_HEADER tag can be used to specify a user-defined LaTeX header for +# the generated LaTeX document. The header should contain everything until the +# first chapter. If it is left blank Doxygen will generate a standard header. It +# is highly recommended to start with a default header using +# doxygen -w latex new_header.tex new_footer.tex new_stylesheet.sty +# and then modify the file new_header.tex. See also section "Doxygen usage" for +# information on how to generate the default header that Doxygen normally uses. # -# Note: Only use a user-defined header if you know what you are doing! The -# following commands have a special meaning inside the header: $title, -# $datetime, $date, $doxygenversion, $projectname, $projectnumber, -# $projectbrief, $projectlogo. Doxygen will replace $title with the empty -# string, for the replacement values of the other commands the user is referred -# to HTML_HEADER. +# Note: Only use a user-defined header if you know what you are doing! +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of Doxygen. The following +# commands have a special meaning inside the header (and footer): For a +# description of the possible markers and block names see the documentation. # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_HEADER = -# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the -# generated LaTeX document. The footer should contain everything after the last -# chapter. If it is left blank doxygen will generate a standard footer. See +# The LATEX_FOOTER tag can be used to specify a user-defined LaTeX footer for +# the generated LaTeX document. The footer should contain everything after the +# last chapter. If it is left blank Doxygen will generate a standard footer. See # LATEX_HEADER for more information on how to generate a default footer and what -# special commands can be used inside the footer. -# -# Note: Only use a user-defined footer if you know what you are doing! +# special commands can be used inside the footer. See also section "Doxygen +# usage" for information on how to generate the default footer that Doxygen +# normally uses. Note: Only use a user-defined footer if you know what you are +# doing! # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_FOOTER = # The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined # LaTeX style sheets that are included after the standard style sheets created -# by doxygen. Using this option one can overrule certain style aspects. Doxygen +# by Doxygen. Using this option one can overrule certain style aspects. Doxygen # will copy the style sheet files to the output directory. # Note: The order of the extra style sheet files is of importance (e.g. the last # style sheet in the list overrules the setting of the previous ones in the @@ -1859,7 +2112,7 @@ LATEX_EXTRA_FILES = PDF_HYPERLINKS = YES -# If the USE_PDFLATEX tag is set to YES, doxygen will use the engine as +# If the USE_PDFLATEX tag is set to YES, Doxygen will use the engine as # specified with LATEX_CMD_NAME to generate the PDF file directly from the LaTeX # files. Set this option to YES, to get a higher quality PDF documentation. # @@ -1869,32 +2122,28 @@ PDF_HYPERLINKS = YES USE_PDFLATEX = YES -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode -# command to the generated LaTeX files. This will instruct LaTeX to keep running -# if errors occur, instead of asking the user for help. This option is also used -# when generating formulas in HTML. +# The LATEX_BATCHMODE tag signals the behavior of LaTeX in case of an error. +# Possible values are: NO same as ERROR_STOP, YES same as BATCH, BATCH In batch +# mode nothing is printed on the terminal, errors are scrolled as if is +# hit at every error; missing files that TeX tries to input or request from +# keyboard input (\read on a not open input stream) cause the job to abort, +# NON_STOP In nonstop mode the diagnostic message will appear on the terminal, +# but there is no possibility of user interaction just like in batch mode, +# SCROLL In scroll mode, TeX will stop only for missing files to input or if +# keyboard input is necessary and ERROR_STOP In errorstop mode, TeX will stop at +# each error, asking for user intervention. # The default value is: NO. # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_BATCHMODE = NO -# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the +# If the LATEX_HIDE_INDICES tag is set to YES then Doxygen will not include the # index chapters (such as File Index, Compound Index, etc.) in the output. # The default value is: NO. # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_HIDE_INDICES = NO -# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source -# code with syntax highlighting in the LaTeX output. -# -# Note that which sources are shown also depends on other settings such as -# SOURCE_BROWSER. -# The default value is: NO. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_SOURCE_CODE = NO - # The LATEX_BIB_STYLE tag can be used to specify the style to use for the # bibliography, e.g. plainnat, or ieeetr. See # https://en.wikipedia.org/wiki/BibTeX and \cite for more info. @@ -1903,14 +2152,6 @@ LATEX_SOURCE_CODE = NO LATEX_BIB_STYLE = plain -# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated -# page will contain the date and time when the page was generated. Setting this -# to NO can help when comparing the output of multiple runs. -# The default value is: NO. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_TIMESTAMP = NO - # The LATEX_EMOJI_DIRECTORY tag is used to specify the (relative or absolute) # path from which the emoji images will be read. If a relative path is entered, # it will be relative to the LATEX_OUTPUT directory. If left blank the @@ -1923,7 +2164,7 @@ LATEX_EMOJI_DIRECTORY = # Configuration options related to the RTF output #--------------------------------------------------------------------------- -# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The +# If the GENERATE_RTF tag is set to YES, Doxygen will generate RTF output. The # RTF output is optimized for Word 97 and may not look too pretty with other RTF # readers/editors. # The default value is: NO. @@ -1938,7 +2179,7 @@ GENERATE_RTF = NO RTF_OUTPUT = rtf -# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF +# If the COMPACT_RTF tag is set to YES, Doxygen generates more compact RTF # documents. This may be useful for small projects and may help to save some # trees in general. # The default value is: NO. @@ -1956,40 +2197,38 @@ COMPACT_RTF = NO # The default value is: NO. # This tag requires that the tag GENERATE_RTF is set to YES. -RTF_HYPERLINKS = YES +RTF_HYPERLINKS = NO -# Load stylesheet definitions from file. Syntax is similar to doxygen's +# Load stylesheet definitions from file. Syntax is similar to Doxygen's # configuration file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. # # See also section "Doxygen usage" for information on how to generate the -# default style sheet that doxygen normally uses. +# default style sheet that Doxygen normally uses. # This tag requires that the tag GENERATE_RTF is set to YES. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an RTF document. Syntax is -# similar to doxygen's configuration file. A template extensions file can be +# similar to Doxygen's configuration file. A template extensions file can be # generated using doxygen -e rtf extensionFile. # This tag requires that the tag GENERATE_RTF is set to YES. RTF_EXTENSIONS_FILE = -# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code -# with syntax highlighting in the RTF output. -# -# Note that which sources are shown also depends on other settings such as -# SOURCE_BROWSER. -# The default value is: NO. +# The RTF_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the RTF_OUTPUT output directory. +# Note that the files will be copied as-is; there are no commands or markers +# available. # This tag requires that the tag GENERATE_RTF is set to YES. -RTF_SOURCE_CODE = NO +RTF_EXTRA_FILES = #--------------------------------------------------------------------------- # Configuration options related to the man page output #--------------------------------------------------------------------------- -# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for +# If the GENERATE_MAN tag is set to YES, Doxygen will generate man pages for # classes and files. # The default value is: NO. @@ -2020,20 +2259,20 @@ MAN_EXTENSION = .3 MAN_SUBDIR = -# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, then it # will generate one additional man file for each entity documented in the real # man page(s). These additional files only source the real man page, but without # them the man command would be unable to find the correct page. # The default value is: NO. # This tag requires that the tag GENERATE_MAN is set to YES. -MAN_LINKS = YES +MAN_LINKS = NO #--------------------------------------------------------------------------- # Configuration options related to the XML output #--------------------------------------------------------------------------- -# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that +# If the GENERATE_XML tag is set to YES, Doxygen will generate an XML file that # captures the structure of the code including all documentation. # The default value is: NO. @@ -2047,7 +2286,7 @@ GENERATE_XML = NO XML_OUTPUT = xml -# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program +# If the XML_PROGRAMLISTING tag is set to YES, Doxygen will dump the program # listings (including syntax highlighting and cross-referencing information) to # the XML output. Note that enabling this will significantly increase the size # of the XML output. @@ -2056,7 +2295,7 @@ XML_OUTPUT = xml XML_PROGRAMLISTING = YES -# If the XML_NS_MEMB_FILE_SCOPE tag is set to YES, doxygen will include +# If the XML_NS_MEMB_FILE_SCOPE tag is set to YES, Doxygen will include # namespace members in file scope as well, matching the HTML output. # The default value is: NO. # This tag requires that the tag GENERATE_XML is set to YES. @@ -2067,7 +2306,7 @@ XML_NS_MEMB_FILE_SCOPE = NO # Configuration options related to the DOCBOOK output #--------------------------------------------------------------------------- -# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files +# If the GENERATE_DOCBOOK tag is set to YES, Doxygen will generate Docbook files # that can be used to generate PDF. # The default value is: NO. @@ -2081,32 +2320,49 @@ GENERATE_DOCBOOK = NO DOCBOOK_OUTPUT = docbook -# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the -# program listings (including syntax highlighting and cross-referencing -# information) to the DOCBOOK output. Note that enabling this will significantly -# increase the size of the DOCBOOK output. -# The default value is: NO. -# This tag requires that the tag GENERATE_DOCBOOK is set to YES. - -DOCBOOK_PROGRAMLISTING = NO - #--------------------------------------------------------------------------- # Configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- -# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an -# AutoGen Definitions (see http://autogen.sourceforge.net/) file that captures +# If the GENERATE_AUTOGEN_DEF tag is set to YES, Doxygen will generate an +# AutoGen Definitions (see https://autogen.sourceforge.net/) file that captures # the structure of the code including all documentation. Note that this feature # is still experimental and incomplete at the moment. # The default value is: NO. GENERATE_AUTOGEN_DEF = NO +#--------------------------------------------------------------------------- +# Configuration options related to Sqlite3 output +#--------------------------------------------------------------------------- + +# If the GENERATE_SQLITE3 tag is set to YES Doxygen will generate a Sqlite3 +# database with symbols found by Doxygen stored in tables. +# The default value is: NO. + +GENERATE_SQLITE3 = NO + +# The SQLITE3_OUTPUT tag is used to specify where the Sqlite3 database will be +# put. If a relative path is entered the value of OUTPUT_DIRECTORY will be put +# in front of it. +# The default directory is: sqlite3. +# This tag requires that the tag GENERATE_SQLITE3 is set to YES. + +SQLITE3_OUTPUT = sqlite3 + +# The SQLITE3_RECREATE_DB tag is set to YES, the existing doxygen_sqlite3.db +# database file will be recreated with each Doxygen run. If set to NO, Doxygen +# will warn if a database file is already found and not modify it. +# The default value is: YES. +# This tag requires that the tag GENERATE_SQLITE3 is set to YES. + +SQLITE3_RECREATE_DB = YES + #--------------------------------------------------------------------------- # Configuration options related to the Perl module output #--------------------------------------------------------------------------- -# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module +# If the GENERATE_PERLMOD tag is set to YES, Doxygen will generate a Perl module # file that captures the structure of the code including all documentation. # # Note that this feature is still experimental and incomplete at the moment. @@ -2114,7 +2370,7 @@ GENERATE_AUTOGEN_DEF = NO GENERATE_PERLMOD = NO -# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary +# If the PERLMOD_LATEX tag is set to YES, Doxygen will generate the necessary # Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI # output from the Perl module output. # The default value is: NO. @@ -2144,13 +2400,13 @@ PERLMOD_MAKEVAR_PREFIX = # Configuration options related to the preprocessor #--------------------------------------------------------------------------- -# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all +# If the ENABLE_PREPROCESSING tag is set to YES, Doxygen will evaluate all # C-preprocessor directives found in the sources and include files. # The default value is: YES. ENABLE_PREPROCESSING = YES -# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names +# If the MACRO_EXPANSION tag is set to YES, Doxygen will expand all macro names # in the source code. If set to NO, only conditional compilation will be # performed. Macro expansion can be done in a controlled way by setting # EXPAND_ONLY_PREDEF to YES. @@ -2176,7 +2432,8 @@ SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by the -# preprocessor. +# preprocessor. Note that the INCLUDE_PATH is not recursive, so the setting of +# RECURSIVE has no effect here. # This tag requires that the tag SEARCH_INCLUDES is set to YES. INCLUDE_PATH = @@ -2208,7 +2465,7 @@ PREDEFINED = EXPAND_AS_DEFINED = -# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will +# If the SKIP_FUNCTION_MACROS tag is set to YES then Doxygen's preprocessor will # remove all references to function-like macros that are alone on a line, have # an all uppercase name, and do not end with a semicolon. Such function macros # are typically used for boiler-plate code, and will confuse the parser if not @@ -2232,26 +2489,26 @@ SKIP_FUNCTION_MACROS = YES # section "Linking to external documentation" for more information about the use # of tag files. # Note: Each tag file must have a unique name (where the name does NOT include -# the path). If a tag file is not located in the directory in which doxygen is +# the path). If a tag file is not located in the directory in which Doxygen is # run, you must also specify the path to the tagfile here. TAGFILES = -# When a file name is specified after GENERATE_TAGFILE, doxygen will create a +# When a file name is specified after GENERATE_TAGFILE, Doxygen will create a # tag file that is based on the input files it reads. See section "Linking to # external documentation" for more information about the usage of tag files. GENERATE_TAGFILE = -# If the ALLEXTERNALS tag is set to YES, all external class will be listed in -# the class index. If set to NO, only the inherited external classes will be -# listed. +# If the ALLEXTERNALS tag is set to YES, all external classes and namespaces +# will be listed in the class and namespace index. If set to NO, only the +# inherited external classes will be listed. # The default value is: NO. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed -# in the modules index. If set to NO, only the current project's groups will be +# in the topic index. If set to NO, only the current project's groups will be # listed. # The default value is: YES. @@ -2265,42 +2522,26 @@ EXTERNAL_GROUPS = YES EXTERNAL_PAGES = YES #--------------------------------------------------------------------------- -# Configuration options related to the dot tool +# Configuration options related to diagram generator tools #--------------------------------------------------------------------------- -# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram -# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to -# NO turns the diagrams off. Note that this option also works with HAVE_DOT -# disabled, but it is recommended to install and use dot, since it yields more -# powerful graphs. -# The default value is: YES. - -CLASS_DIAGRAMS = YES - -# You can include diagrams made with dia in doxygen documentation. Doxygen will -# then run dia to produce the diagram and insert it in the documentation. The -# DIA_PATH tag allows you to specify the directory where the dia binary resides. -# If left empty dia is assumed to be found in the default search path. - -DIA_PATH = - # If set to YES the inheritance and collaboration graphs will hide inheritance # and usage relations if the target is undocumented or is not a class. # The default value is: YES. HIDE_UNDOC_RELATIONS = YES -# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# If you set the HAVE_DOT tag to YES then Doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz (see: -# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent +# https://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent # Bell Labs. The other options in this section have no effect if this option is # set to NO # The default value is: NO. HAVE_DOT = YES -# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed -# to run in parallel. When set to 0 doxygen will base this on the number of +# The DOT_NUM_THREADS specifies the number of dot invocations Doxygen is allowed +# to run in parallel. When set to 0 Doxygen will base this on the number of # processors available in the system. You can set it explicitly to a value # larger than 0 to get control over the balance between CPU load and processing # speed. @@ -2309,55 +2550,83 @@ HAVE_DOT = YES DOT_NUM_THREADS = 0 -# When you want a differently looking font in the dot files that doxygen -# generates you can specify the font name using DOT_FONTNAME. You need to make -# sure dot is able to find the font, which can be done by putting it in a -# standard location or by setting the DOTFONTPATH environment variable or by -# setting DOT_FONTPATH to the directory containing the font. -# The default value is: Helvetica. +# DOT_COMMON_ATTR is common attributes for nodes, edges and labels of +# subgraphs. When you want a differently looking font in the dot files that +# Doxygen generates you can specify fontname, fontcolor and fontsize attributes. +# For details please see Node, +# Edge and Graph Attributes specification You need to make sure dot is able +# to find the font, which can be done by putting it in a standard location or by +# setting the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the +# directory containing the font. Default graphviz fontsize is 14. +# The default value is: fontname=Helvetica,fontsize=10. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_FONTNAME = Helvetica +DOT_COMMON_ATTR = "fontname=Helvetica,fontsize=10" -# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of -# dot graphs. -# Minimum value: 4, maximum value: 24, default value: 10. +# DOT_EDGE_ATTR is concatenated with DOT_COMMON_ATTR. For elegant style you can +# add 'arrowhead=open, arrowtail=open, arrowsize=0.5'. Complete documentation about +# arrows shapes. +# The default value is: labelfontname=Helvetica,labelfontsize=10. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_FONTSIZE = 10 +DOT_EDGE_ATTR = "labelfontname=Helvetica,labelfontsize=10" -# By default doxygen will tell dot to use the default font as specified with -# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set -# the path where dot can find it using this tag. +# DOT_NODE_ATTR is concatenated with DOT_COMMON_ATTR. For view without boxes +# around nodes set 'shape=plain' or 'shape=plaintext' Shapes specification +# The default value is: shape=box,height=0.2,width=0.4. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_NODE_ATTR = "shape=box,height=0.2,width=0.4" + +# You can set the path where dot can find font specified with fontname in +# DOT_COMMON_ATTR and others dot attributes. # This tag requires that the tag HAVE_DOT is set to YES. DOT_FONTPATH = -# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for -# each documented class showing the direct and indirect inheritance relations. -# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO. +# If the CLASS_GRAPH tag is set to YES or GRAPH or BUILTIN then Doxygen will +# generate a graph for each documented class showing the direct and indirect +# inheritance relations. In case the CLASS_GRAPH tag is set to YES or GRAPH and +# HAVE_DOT is enabled as well, then dot will be used to draw the graph. In case +# the CLASS_GRAPH tag is set to YES and HAVE_DOT is disabled or if the +# CLASS_GRAPH tag is set to BUILTIN, then the built-in generator will be used. +# If the CLASS_GRAPH tag is set to TEXT the direct and indirect inheritance +# relations will be shown as texts / links. Explicit enabling an inheritance +# graph or choosing a different representation for an inheritance graph of a +# specific class, can be accomplished by means of the command \inheritancegraph. +# Disabling an inheritance graph can be accomplished by means of the command +# \hideinheritancegraph. +# Possible values are: NO, YES, TEXT, GRAPH and BUILTIN. # The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. CLASS_GRAPH = YES -# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a +# If the COLLABORATION_GRAPH tag is set to YES then Doxygen will generate a # graph for each documented class showing the direct and indirect implementation # dependencies (inheritance, containment, and class references variables) of the -# class with other documented classes. +# class with other documented classes. Explicit enabling a collaboration graph, +# when COLLABORATION_GRAPH is set to NO, can be accomplished by means of the +# command \collaborationgraph. Disabling a collaboration graph can be +# accomplished by means of the command \hidecollaborationgraph. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. COLLABORATION_GRAPH = YES -# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for -# groups, showing the direct groups dependencies. +# If the GROUP_GRAPHS tag is set to YES then Doxygen will generate a graph for +# groups, showing the direct groups dependencies. Explicit enabling a group +# dependency graph, when GROUP_GRAPHS is set to NO, can be accomplished by means +# of the command \groupgraph. Disabling a directory graph can be accomplished by +# means of the command \hidegroupgraph. See also the chapter Grouping in the +# manual. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. GROUP_GRAPHS = YES -# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and +# If the UML_LOOK tag is set to YES, Doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. # The default value is: NO. @@ -2378,10 +2647,10 @@ UML_LOOK = NO UML_LIMIT_NUM_FIELDS = 10 -# If the DOT_UML_DETAILS tag is set to NO, doxygen will show attributes and +# If the DOT_UML_DETAILS tag is set to NO, Doxygen will show attributes and # methods without types and arguments in the UML graphs. If the DOT_UML_DETAILS -# tag is set to YES, doxygen will add type and arguments for attributes and -# methods in the UML graphs. If the DOT_UML_DETAILS tag is set to NONE, doxygen +# tag is set to YES, Doxygen will add type and arguments for attributes and +# methods in the UML graphs. If the DOT_UML_DETAILS tag is set to NONE, Doxygen # will not generate fields with class member information in the UML graphs. The # class diagrams will look similar to the default class diagrams but using UML # notation for the relationships. @@ -2393,8 +2662,8 @@ DOT_UML_DETAILS = NO # The DOT_WRAP_THRESHOLD tag can be used to set the maximum number of characters # to display on a single line. If the actual line length exceeds this threshold -# significantly it will wrapped across multiple lines. Some heuristics are apply -# to avoid ugly line breaks. +# significantly it will be wrapped across multiple lines. Some heuristics are +# applied to avoid ugly line breaks. # Minimum value: 0, maximum value: 1000, default value: 17. # This tag requires that the tag HAVE_DOT is set to YES. @@ -2409,24 +2678,29 @@ DOT_WRAP_THRESHOLD = 17 TEMPLATE_RELATIONS = NO # If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to -# YES then doxygen will generate a graph for each documented file showing the +# YES then Doxygen will generate a graph for each documented file showing the # direct and indirect include dependencies of the file with other documented -# files. +# files. Explicit enabling an include graph, when INCLUDE_GRAPH is is set to NO, +# can be accomplished by means of the command \includegraph. Disabling an +# include graph can be accomplished by means of the command \hideincludegraph. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. INCLUDE_GRAPH = YES # If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are -# set to YES then doxygen will generate a graph for each documented file showing +# set to YES then Doxygen will generate a graph for each documented file showing # the direct and indirect include dependencies of the file with other documented -# files. +# files. Explicit enabling an included by graph, when INCLUDED_BY_GRAPH is set +# to NO, can be accomplished by means of the command \includedbygraph. Disabling +# an included by graph can be accomplished by means of the command +# \hideincludedbygraph. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. INCLUDED_BY_GRAPH = YES -# If the CALL_GRAPH tag is set to YES then doxygen will generate a call +# If the CALL_GRAPH tag is set to YES then Doxygen will generate a call # dependency graph for every global function or class method. # # Note that enabling this option will significantly increase the time of a run. @@ -2438,7 +2712,7 @@ INCLUDED_BY_GRAPH = YES CALL_GRAPH = YES -# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller +# If the CALLER_GRAPH tag is set to YES then Doxygen will generate a caller # dependency graph for every global function or class method. # # Note that enabling this option will significantly increase the time of a run. @@ -2450,26 +2724,36 @@ CALL_GRAPH = YES CALLER_GRAPH = YES -# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical +# If the GRAPHICAL_HIERARCHY tag is set to YES then Doxygen will graphical # hierarchy of all classes instead of a textual one. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. GRAPHICAL_HIERARCHY = YES -# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the +# If the DIRECTORY_GRAPH tag is set to YES then Doxygen will show the # dependencies a directory has on other directories in a graphical way. The # dependency relations are determined by the #include relations between the -# files in the directories. +# files in the directories. Explicit enabling a directory graph, when +# DIRECTORY_GRAPH is set to NO, can be accomplished by means of the command +# \directorygraph. Disabling a directory graph can be accomplished by means of +# the command \hidedirectorygraph. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. DIRECTORY_GRAPH = YES +# The DIR_GRAPH_MAX_DEPTH tag can be used to limit the maximum number of levels +# of child directories generated in directory dependency graphs by dot. +# Minimum value: 1, maximum value: 25, default value: 1. +# This tag requires that the tag DIRECTORY_GRAPH is set to YES. + +DIR_GRAPH_MAX_DEPTH = 1 + # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. For an explanation of the image formats see the section # output formats in the documentation of the dot tool (Graphviz (see: -# http://www.graphviz.org/)). +# https://www.graphviz.org/)). # Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order # to make the SVG files visible in IE 9+ (other browsers do not have this # requirement). @@ -2506,11 +2790,12 @@ DOT_PATH = DOTFILE_DIRS = -# The MSCFILE_DIRS tag can be used to specify one or more directories that -# contain msc files that are included in the documentation (see the \mscfile -# command). +# You can include diagrams made with dia in Doxygen documentation. Doxygen will +# then run dia to produce the diagram and insert it in the documentation. The +# DIA_PATH tag allows you to specify the directory where the dia binary resides. +# If left empty dia is assumed to be found in the default search path. -MSCFILE_DIRS = +DIA_PATH = # The DIAFILE_DIRS tag can be used to specify one or more directories that # contain dia files that are included in the documentation (see the \diafile @@ -2518,35 +2803,35 @@ MSCFILE_DIRS = DIAFILE_DIRS = -# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the -# path where java can find the plantuml.jar file. If left blank, it is assumed -# PlantUML is not used or called during a preprocessing step. Doxygen will -# generate a warning when it encounters a \startuml command in this case and -# will not generate output for the diagram. +# When using PlantUML, the PLANTUML_JAR_PATH tag should be used to specify the +# path where java can find the plantuml.jar file or to the filename of jar file +# to be used. If left blank, it is assumed PlantUML is not used or called during +# a preprocessing step. Doxygen will generate a warning when it encounters a +# \startuml command in this case and will not generate output for the diagram. PLANTUML_JAR_PATH = -# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a -# configuration file for plantuml. +# When using PlantUML, the PLANTUML_CFG_FILE tag can be used to specify a +# configuration file for PlantUML. PLANTUML_CFG_FILE = -# When using plantuml, the specified paths are searched for files specified by -# the !include statement in a plantuml block. +# When using PlantUML, the specified paths are searched for files specified by +# the !include statement in a PlantUML block. PLANTUML_INCLUDE_PATH = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes # that will be shown in the graph. If the number of nodes in a graph becomes -# larger than this value, doxygen will truncate the graph, which is visualized -# by representing a node as a red box. Note that doxygen if the number of direct +# larger than this value, Doxygen will truncate the graph, which is visualized +# by representing a node as a red box. Note that if the number of direct # children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that # the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. # Minimum value: 0, maximum value: 10000, default value: 50. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_GRAPH_MAX_NODES = 50 +DOT_GRAPH_MAX_NODES = 200 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs # generated by dot. A depth value of 3 means that only nodes reachable from the @@ -2560,18 +2845,6 @@ DOT_GRAPH_MAX_NODES = 50 MAX_DOT_GRAPH_DEPTH = 0 -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, because dot on Windows does not seem -# to support this out of the box. -# -# Warning: Depending on the platform used, enabling this option may lead to -# badly anti-aliased labels on the edges of a graph (i.e. they become hard to -# read). -# The default value is: NO. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_TRANSPARENT = NO - # Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) support @@ -2581,19 +2854,37 @@ DOT_TRANSPARENT = NO DOT_MULTI_TARGETS = NO -# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page +# If the GENERATE_LEGEND tag is set to YES Doxygen will generate a legend page # explaining the meaning of the various boxes and arrows in the dot generated # graphs. +# Note: This tag requires that UML_LOOK isn't set, i.e. the Doxygen internal +# graphical representation for inheritance and collaboration diagrams is used. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. GENERATE_LEGEND = YES -# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate +# If the DOT_CLEANUP tag is set to YES, Doxygen will remove the intermediate # files that are used to generate the various graphs. # -# Note: This setting is not only used for dot files but also for msc and -# plantuml temporary files. +# Note: This setting is not only used for dot files but also for msc temporary +# files. # The default value is: YES. DOT_CLEANUP = YES + +# You can define message sequence charts within Doxygen comments using the \msc +# command. If the MSCGEN_TOOL tag is left empty (the default), then Doxygen will +# use a built-in version of mscgen tool to produce the charts. Alternatively, +# the MSCGEN_TOOL tag can also specify the name an external tool. For instance, +# specifying prog as the value, Doxygen will call the tool as prog -T +# -o . The external tool should support +# output file formats "png", "eps", "svg", and "ismap". + +MSCGEN_TOOL = + +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the \mscfile +# command). + +MSCFILE_DIRS = diff --git a/DOCS/Doxyfile_man b/DOCS/Doxyfile_man deleted file mode 100644 index 191e4aa4ee..0000000000 --- a/DOCS/Doxyfile_man +++ /dev/null @@ -1,2578 +0,0 @@ -# Doxyfile 1.9.1 - -# This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project. -# -# All text after a double hash (##) is considered a comment and is placed in -# front of the TAG it is preceding. -# -# All text after a single hash (#) is considered a comment and will be ignored. -# The format is: -# TAG = value [value, ...] -# For lists, items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (\" \"). - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- - -# This tag specifies the encoding used for all characters in the configuration -# file that follow. The default is UTF-8 which is also the encoding used for all -# text before the first occurrence of this tag. Doxygen uses libiconv (or the -# iconv built into libc) for the transcoding. See -# https://www.gnu.org/software/libiconv/ for the list of possible encodings. -# The default value is: UTF-8. - -DOXYFILE_ENCODING = UTF-8 - -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by -# double-quotes, unless you are using Doxywizard) that should identify the -# project for which the documentation is generated. This name is used in the -# title of most generated pages and in a few other places. -# The default value is: My Project. - -PROJECT_NAME = LAPACK - -# The PROJECT_NUMBER tag can be used to enter a project or revision number. This -# could be handy for archiving the generated documentation or if some version -# control system is used. - -PROJECT_NUMBER = 3.10.0 - -# Using the PROJECT_BRIEF tag one can provide an optional one line description -# for a project that appears at the top of each page and should give viewer a -# quick idea about the purpose of the project. Keep the description short. - -PROJECT_BRIEF = "LAPACK: Linear Algebra PACKage" - -# With the PROJECT_LOGO tag one can specify a logo or an icon that is included -# in the documentation. The maximum height of the logo should not exceed 55 -# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy -# the logo to the output directory. - -PROJECT_LOGO = DOCS/lapack.png - -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path -# into which the generated documentation will be written. If a relative path is -# entered, it will be relative to the location where doxygen was started. If -# left blank the current directory will be used. - -OUTPUT_DIRECTORY = DOCS - -# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- -# directories (in 2 levels) under the output directory of each output format and -# will distribute the generated files over these directories. Enabling this -# option can be useful when feeding doxygen a huge amount of source files, where -# putting all generated files in the same directory would otherwise causes -# performance problems for the file system. -# The default value is: NO. - -CREATE_SUBDIRS = NO - -# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII -# characters to appear in the names of generated files. If set to NO, non-ASCII -# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode -# U+3044. -# The default value is: NO. - -ALLOW_UNICODE_NAMES = NO - -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, -# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), -# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, -# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), -# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, -# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, -# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, -# Ukrainian and Vietnamese. -# The default value is: English. - -OUTPUT_LANGUAGE = English - -# The OUTPUT_TEXT_DIRECTION tag is used to specify the direction in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all generated output in the proper direction. -# Possible values are: None, LTR, RTL and Context. -# The default value is: None. - -OUTPUT_TEXT_DIRECTION = None - -# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member -# descriptions after the members that are listed in the file and class -# documentation (similar to Javadoc). Set to NO to disable this. -# The default value is: YES. - -BRIEF_MEMBER_DESC = YES - -# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief -# description of a member or function before the detailed description -# -# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the -# brief descriptions will be completely suppressed. -# The default value is: YES. - -REPEAT_BRIEF = YES - -# This tag implements a quasi-intelligent brief description abbreviator that is -# used to form the text in various listings. Each string in this list, if found -# as the leading text of the brief description, will be stripped from the text -# and the result, after processing the whole list, is used as the annotated -# text. Otherwise, the brief description is used as-is. If left blank, the -# following values are used ($name is automatically replaced with the name of -# the entity):The $name class, The $name widget, The $name file, is, provides, -# specifies, contains, represents, a, an and the. - -ABBREVIATE_BRIEF = - -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# doxygen will generate a detailed section even if there is only a brief -# description. -# The default value is: NO. - -ALWAYS_DETAILED_SEC = NO - -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all -# inherited members of a class in the documentation of that class as if those -# members were ordinary class members. Constructors, destructors and assignment -# operators of the base classes will not be shown. -# The default value is: NO. - -INLINE_INHERITED_MEMB = NO - -# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path -# before files name in the file list and in the header files. If set to NO the -# shortest path that makes the file name unique will be used -# The default value is: YES. - -FULL_PATH_NAMES = NO - -# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. -# Stripping is only done if one of the specified strings matches the left-hand -# part of the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the path to -# strip. -# -# Note that you can specify absolute paths here, but also relative paths, which -# will be relative from the directory where doxygen is started. -# This tag requires that the tag FULL_PATH_NAMES is set to YES. - -STRIP_FROM_PATH = - -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the -# path mentioned in the documentation of a class, which tells the reader which -# header file to include in order to use a class. If left blank only the name of -# the header file containing the class definition is used. Otherwise one should -# specify the list of include paths that are normally passed to the compiler -# using the -I flag. - -STRIP_FROM_INC_PATH = - -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but -# less readable) file names. This can be useful is your file systems doesn't -# support long names like on DOS, Mac, or CD-ROM. -# The default value is: NO. - -SHORT_NAMES = NO - -# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the -# first line (until the first dot) of a Javadoc-style comment as the brief -# description. If set to NO, the Javadoc-style will behave just like regular Qt- -# style comments (thus requiring an explicit @brief command for a brief -# description.) -# The default value is: NO. - -JAVADOC_AUTOBRIEF = NO - -# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line -# such as -# /*************** -# as being the beginning of a Javadoc-style comment "banner". If set to NO, the -# Javadoc-style will behave just like regular comments and it will not be -# interpreted by doxygen. -# The default value is: NO. - -JAVADOC_BANNER = NO - -# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first -# line (until the first dot) of a Qt-style comment as the brief description. If -# set to NO, the Qt-style will behave just like regular Qt-style comments (thus -# requiring an explicit \brief command for a brief description.) -# The default value is: NO. - -QT_AUTOBRIEF = NO - -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a -# multi-line C++ special comment block (i.e. a block of //! or /// comments) as -# a brief description. This used to be the default behavior. The new default is -# to treat a multi-line C++ comment block as a detailed description. Set this -# tag to YES if you prefer the old behavior instead. -# -# Note that setting this tag to YES also means that rational rose comments are -# not recognized any more. -# The default value is: NO. - -MULTILINE_CPP_IS_BRIEF = NO - -# By default Python docstrings are displayed as preformatted text and doxygen's -# special commands cannot be used. By setting PYTHON_DOCSTRING to NO the -# doxygen's special commands can be used and the contents of the docstring -# documentation blocks is shown as doxygen documentation. -# The default value is: YES. - -PYTHON_DOCSTRING = YES - -# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the -# documentation from any documented member that it re-implements. -# The default value is: YES. - -INHERIT_DOCS = YES - -# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new -# page for each member. If set to NO, the documentation of a member will be part -# of the file/class/namespace that contains it. -# The default value is: NO. - -SEPARATE_MEMBER_PAGES = NO - -# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen -# uses this value to replace tabs by spaces in code fragments. -# Minimum value: 1, maximum value: 16, default value: 4. - -TAB_SIZE = 8 - -# This tag can be used to specify a number of aliases that act as commands in -# the documentation. An alias has the form: -# name=value -# For example adding -# "sideeffect=@par Side Effects:\n" -# will allow you to put the command \sideeffect (or @sideeffect) in the -# documentation, which will result in a user-defined paragraph with heading -# "Side Effects:". You can put \n's in the value part of an alias to insert -# newlines (in the resulting output). You can put ^^ in the value part of an -# alias to insert a newline as if a physical newline was in the original file. -# When you need a literal { or } or , in the value part of an alias you have to -# escape them by means of a backslash (\), this can lead to conflicts with the -# commands \{ and \} for these it is advised to use the version @{ and @} or use -# a double escape (\\{ and \\}) - -ALIASES = - -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources -# only. Doxygen will then generate output that is more tailored for C. For -# instance, some of the names that are used will be different. The list of all -# members will be omitted, etc. -# The default value is: NO. - -OPTIMIZE_OUTPUT_FOR_C = NO - -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or -# Python sources only. Doxygen will then generate output that is more tailored -# for that language. For instance, namespaces will be presented as packages, -# qualified scopes will look different, etc. -# The default value is: NO. - -OPTIMIZE_OUTPUT_JAVA = NO - -# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran -# sources. Doxygen will then generate output that is tailored for Fortran. -# The default value is: NO. - -OPTIMIZE_FOR_FORTRAN = YES - -# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL -# sources. Doxygen will then generate output that is tailored for VHDL. -# The default value is: NO. - -OPTIMIZE_OUTPUT_VHDL = NO - -# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice -# sources only. Doxygen will then generate output that is more tailored for that -# language. For instance, namespaces will be presented as modules, types will be -# separated into more groups, etc. -# The default value is: NO. - -OPTIMIZE_OUTPUT_SLICE = NO - -# Doxygen selects the parser to use depending on the extension of the files it -# parses. With this tag you can assign which parser to use for a given -# extension. Doxygen has a built-in mapping, but you can override or extend it -# using this tag. The format is ext=language, where ext is a file extension, and -# language is one of the parsers supported by doxygen: IDL, Java, JavaScript, -# Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice, VHDL, -# Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: -# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser -# tries to guess whether the code is fixed or free formatted code, this is the -# default for Fortran type files). For instance to make doxygen treat .inc files -# as Fortran files (default is PHP), and .f files as C (default is Fortran), -# use: inc=Fortran f=C. -# -# Note: For files without extension you can use no_extension as a placeholder. -# -# Note that for custom extensions you also need to set FILE_PATTERNS otherwise -# the files are not read by doxygen. When specifying no_extension you should add -# * to the FILE_PATTERNS. -# -# Note see also the list of default file extension mappings. - -EXTENSION_MAPPING = - -# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments -# according to the Markdown format, which allows for more readable -# documentation. See https://daringfireball.net/projects/markdown/ for details. -# The output of markdown processing is further processed by doxygen, so you can -# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in -# case of backward compatibilities issues. -# The default value is: YES. - -MARKDOWN_SUPPORT = YES - -# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up -# to that level are automatically included in the table of contents, even if -# they do not have an id attribute. -# Note: This feature currently applies only to Markdown headings. -# Minimum value: 0, maximum value: 99, default value: 5. -# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. - -TOC_INCLUDE_HEADINGS = 5 - -# When enabled doxygen tries to link words that correspond to documented -# classes, or namespaces to their corresponding documentation. Such a link can -# be prevented in individual cases by putting a % sign in front of the word or -# globally by setting AUTOLINK_SUPPORT to NO. -# The default value is: YES. - -AUTOLINK_SUPPORT = YES - -# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want -# to include (a tag file for) the STL sources as input, then you should set this -# tag to YES in order to let doxygen match functions declarations and -# definitions whose arguments contain STL classes (e.g. func(std::string); -# versus func(std::string) {}). This also make the inheritance and collaboration -# diagrams that involve STL classes more complete and accurate. -# The default value is: NO. - -BUILTIN_STL_SUPPORT = NO - -# If you use Microsoft's C++/CLI language, you should set this option to YES to -# enable parsing support. -# The default value is: NO. - -CPP_CLI_SUPPORT = NO - -# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: -# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen -# will parse them like normal C++ but will assume all classes use public instead -# of private inheritance when no explicit protection keyword is present. -# The default value is: NO. - -SIP_SUPPORT = NO - -# For Microsoft's IDL there are propget and propput attributes to indicate -# getter and setter methods for a property. Setting this option to YES will make -# doxygen to replace the get and set methods by a property in the documentation. -# This will only work if the methods are indeed getting or setting a simple -# type. If this is not the case, or you want to show the methods anyway, you -# should set this option to NO. -# The default value is: YES. - -IDL_PROPERTY_SUPPORT = YES - -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. -# The default value is: NO. - -DISTRIBUTE_GROUP_DOC = YES - -# If one adds a struct or class to a group and this option is enabled, then also -# any nested class or struct is added to the same group. By default this option -# is disabled and one has to add nested compounds explicitly via \ingroup. -# The default value is: NO. - -GROUP_NESTED_COMPOUNDS = NO - -# Set the SUBGROUPING tag to YES to allow class member groups of the same type -# (for instance a group of public functions) to be put as a subgroup of that -# type (e.g. under the Public Functions section). Set it to NO to prevent -# subgrouping. Alternatively, this can be done per class using the -# \nosubgrouping command. -# The default value is: YES. - -SUBGROUPING = YES - -# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions -# are shown inside the group in which they are included (e.g. using \ingroup) -# instead of on a separate page (for HTML and Man pages) or section (for LaTeX -# and RTF). -# -# Note that this feature does not work in combination with -# SEPARATE_MEMBER_PAGES. -# The default value is: NO. - -INLINE_GROUPED_CLASSES = NO - -# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions -# with only public data fields or simple typedef fields will be shown inline in -# the documentation of the scope in which they are defined (i.e. file, -# namespace, or group documentation), provided this scope is documented. If set -# to NO, structs, classes, and unions are shown on a separate page (for HTML and -# Man pages) or section (for LaTeX and RTF). -# The default value is: NO. - -INLINE_SIMPLE_STRUCTS = NO - -# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or -# enum is documented as struct, union, or enum with the name of the typedef. So -# typedef struct TypeS {} TypeT, will appear in the documentation as a struct -# with name TypeT. When disabled the typedef will appear as a member of a file, -# namespace, or class. And the struct will be named TypeS. This can typically be -# useful for C code in case the coding convention dictates that all compound -# types are typedef'ed and only the typedef is referenced, never the tag name. -# The default value is: NO. - -TYPEDEF_HIDES_STRUCT = NO - -# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This -# cache is used to resolve symbols given their name and scope. Since this can be -# an expensive process and often the same symbol appears multiple times in the -# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small -# doxygen will become slower. If the cache is too large, memory is wasted. The -# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range -# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 -# symbols. At the end of a run doxygen will report the cache usage and suggest -# the optimal cache size from a speed point of view. -# Minimum value: 0, maximum value: 9, default value: 0. - -LOOKUP_CACHE_SIZE = 0 - -# The NUM_PROC_THREADS specifies the number threads doxygen is allowed to use -# during processing. When set to 0 doxygen will based this on the number of -# cores available in the system. You can set it explicitly to a value larger -# than 0 to get more control over the balance between CPU load and processing -# speed. At this moment only the input processing can be done using multiple -# threads. Since this is still an experimental feature the default is set to 1, -# which efficively disables parallel processing. Please report any issues you -# encounter. Generating dot graphs in parallel is controlled by the -# DOT_NUM_THREADS setting. -# Minimum value: 0, maximum value: 32, default value: 1. - -NUM_PROC_THREADS = 1 - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in -# documentation are documented, even if no documentation was available. Private -# class members and static file members will be hidden unless the -# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. -# Note: This will also disable the warnings about undocumented members that are -# normally produced when WARNINGS is set to YES. -# The default value is: NO. - -EXTRACT_ALL = YES - -# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will -# be included in the documentation. -# The default value is: NO. - -EXTRACT_PRIVATE = NO - -# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual -# methods of a class will be included in the documentation. -# The default value is: NO. - -EXTRACT_PRIV_VIRTUAL = NO - -# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal -# scope will be included in the documentation. -# The default value is: NO. - -EXTRACT_PACKAGE = NO - -# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be -# included in the documentation. -# The default value is: NO. - -EXTRACT_STATIC = NO - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined -# locally in source files will be included in the documentation. If set to NO, -# only classes defined in header files are included. Does not have any effect -# for Java sources. -# The default value is: YES. - -EXTRACT_LOCAL_CLASSES = YES - -# This flag is only useful for Objective-C code. If set to YES, local methods, -# which are defined in the implementation section but not in the interface are -# included in the documentation. If set to NO, only methods in the interface are -# included. -# The default value is: NO. - -EXTRACT_LOCAL_METHODS = NO - -# If this flag is set to YES, the members of anonymous namespaces will be -# extracted and appear in the documentation as a namespace called -# 'anonymous_namespace{file}', where file will be replaced with the base name of -# the file that contains the anonymous namespace. By default anonymous namespace -# are hidden. -# The default value is: NO. - -EXTRACT_ANON_NSPACES = NO - -# If this flag is set to YES, the name of an unnamed parameter in a declaration -# will be determined by the corresponding definition. By default unnamed -# parameters remain unnamed in the output. -# The default value is: YES. - -RESOLVE_UNNAMED_PARAMS = YES - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all -# undocumented members inside documented classes or files. If set to NO these -# members will be included in the various overviews, but no documentation -# section is generated. This option has no effect if EXTRACT_ALL is enabled. -# The default value is: NO. - -HIDE_UNDOC_MEMBERS = NO - -# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. If set -# to NO, these classes will be included in the various overviews. This option -# has no effect if EXTRACT_ALL is enabled. -# The default value is: NO. - -HIDE_UNDOC_CLASSES = NO - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend -# declarations. If set to NO, these declarations will be included in the -# documentation. -# The default value is: NO. - -HIDE_FRIEND_COMPOUNDS = NO - -# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any -# documentation blocks found inside the body of a function. If set to NO, these -# blocks will be appended to the function's detailed documentation block. -# The default value is: NO. - -HIDE_IN_BODY_DOCS = NO - -# The INTERNAL_DOCS tag determines if documentation that is typed after a -# \internal command is included. If the tag is set to NO then the documentation -# will be excluded. Set it to YES to include the internal documentation. -# The default value is: NO. - -INTERNAL_DOCS = NO - -# With the correct setting of option CASE_SENSE_NAMES doxygen will better be -# able to match the capabilities of the underlying filesystem. In case the -# filesystem is case sensitive (i.e. it supports files in the same directory -# whose names only differ in casing), the option must be set to YES to properly -# deal with such files in case they appear in the input. For filesystems that -# are not case sensitive the option should be be set to NO to properly deal with -# output files written for symbols that only differ in casing, such as for two -# classes, one named CLASS and the other named Class, and to also support -# references to files without having to specify the exact matching casing. On -# Windows (including Cygwin) and MacOS, users should typically set this option -# to NO, whereas on Linux or other Unix flavors it should typically be set to -# YES. -# The default value is: system dependent. - -CASE_SENSE_NAMES = NO - -# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with -# their full class and namespace scopes in the documentation. If set to YES, the -# scope will be hidden. -# The default value is: NO. - -HIDE_SCOPE_NAMES = NO - -# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will -# append additional text to a page's title, such as Class Reference. If set to -# YES the compound reference will be hidden. -# The default value is: NO. - -HIDE_COMPOUND_REFERENCE= NO - -# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of -# the files that are included by a file in the documentation of that file. -# The default value is: YES. - -SHOW_INCLUDE_FILES = YES - -# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each -# grouped member an include statement to the documentation, telling the reader -# which file to include in order to use the member. -# The default value is: NO. - -SHOW_GROUPED_MEMB_INC = NO - -# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include -# files with double quotes in the documentation rather than with sharp brackets. -# The default value is: NO. - -FORCE_LOCAL_INCLUDES = NO - -# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the -# documentation for inline members. -# The default value is: YES. - -INLINE_INFO = YES - -# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the -# (detailed) documentation of file and class members alphabetically by member -# name. If set to NO, the members will appear in declaration order. -# The default value is: YES. - -SORT_MEMBER_DOCS = YES - -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief -# descriptions of file, namespace and class members alphabetically by member -# name. If set to NO, the members will appear in declaration order. Note that -# this will also influence the order of the classes in the class list. -# The default value is: NO. - -SORT_BRIEF_DOCS = NO - -# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the -# (brief and detailed) documentation of class members so that constructors and -# destructors are listed first. If set to NO the constructors will appear in the -# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. -# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief -# member documentation. -# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting -# detailed member documentation. -# The default value is: NO. - -SORT_MEMBERS_CTORS_1ST = NO - -# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy -# of group names into alphabetical order. If set to NO the group names will -# appear in their defined order. -# The default value is: NO. - -SORT_GROUP_NAMES = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by -# fully-qualified names, including namespaces. If set to NO, the class list will -# be sorted only by class name, not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the alphabetical -# list. -# The default value is: NO. - -SORT_BY_SCOPE_NAME = NO - -# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper -# type resolution of all parameters of a function it will reject a match between -# the prototype and the implementation of a member function even if there is -# only one candidate or it is obvious which candidate to choose by doing a -# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still -# accept a match between prototype and implementation in such cases. -# The default value is: NO. - -STRICT_PROTO_MATCHING = NO - -# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo -# list. This list is created by putting \todo commands in the documentation. -# The default value is: YES. - -GENERATE_TODOLIST = YES - -# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test -# list. This list is created by putting \test commands in the documentation. -# The default value is: YES. - -GENERATE_TESTLIST = YES - -# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug -# list. This list is created by putting \bug commands in the documentation. -# The default value is: YES. - -GENERATE_BUGLIST = YES - -# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) -# the deprecated list. This list is created by putting \deprecated commands in -# the documentation. -# The default value is: YES. - -GENERATE_DEPRECATEDLIST= YES - -# The ENABLED_SECTIONS tag can be used to enable conditional documentation -# sections, marked by \if ... \endif and \cond -# ... \endcond blocks. - -ENABLED_SECTIONS = - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the -# initial value of a variable or macro / define can have for it to appear in the -# documentation. If the initializer consists of more lines than specified here -# it will be hidden. Use a value of 0 to hide initializers completely. The -# appearance of the value of individual variables and macros / defines can be -# controlled using \showinitializer or \hideinitializer command in the -# documentation regardless of this setting. -# Minimum value: 0, maximum value: 10000, default value: 30. - -MAX_INITIALIZER_LINES = 30 - -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at -# the bottom of the documentation of classes and structs. If set to YES, the -# list will mention the files that were used to generate the documentation. -# The default value is: YES. - -SHOW_USED_FILES = YES - -# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This -# will remove the Files entry from the Quick Index and from the Folder Tree View -# (if specified). -# The default value is: YES. - -SHOW_FILES = YES - -# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces -# page. This will remove the Namespaces entry from the Quick Index and from the -# Folder Tree View (if specified). -# The default value is: YES. - -SHOW_NAMESPACES = YES - -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from -# the version control system). Doxygen will invoke the program by executing (via -# popen()) the command command input-file, where command is the value of the -# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided -# by doxygen. Whatever the program writes to standard output is used as the file -# version. For an example see the documentation. - -FILE_VERSION_FILTER = - -# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed -# by doxygen. The layout file controls the global structure of the generated -# output files in an output format independent way. To create the layout file -# that represents doxygen's defaults, run doxygen with the -l option. You can -# optionally specify a file name after the option, if omitted DoxygenLayout.xml -# will be used as the name of the layout file. -# -# Note that if you run doxygen from a directory containing a file called -# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE -# tag is left empty. - -LAYOUT_FILE = - -# The CITE_BIB_FILES tag can be used to specify one or more bib files containing -# the reference definitions. This must be a list of .bib files. The .bib -# extension is automatically appended if omitted. This requires the bibtex tool -# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info. -# For LaTeX the style of the bibliography can be controlled using -# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the -# search path. See also \cite for info how to create references. - -CITE_BIB_FILES = - -#--------------------------------------------------------------------------- -# Configuration options related to warning and progress messages -#--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated to -# standard output by doxygen. If QUIET is set to YES this implies that the -# messages are off. -# The default value is: NO. - -QUIET = NO - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES -# this implies that the warnings are on. -# -# Tip: Turn warnings on while writing the documentation. -# The default value is: YES. - -WARNINGS = YES - -# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate -# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag -# will automatically be disabled. -# The default value is: YES. - -WARN_IF_UNDOCUMENTED = YES - -# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some parameters -# in a documented function, or documenting parameters that don't exist or using -# markup commands wrongly. -# The default value is: YES. - -WARN_IF_DOC_ERROR = YES - -# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that -# are documented, but have no documentation for their parameters or return -# value. If set to NO, doxygen will only warn about wrong or incomplete -# parameter documentation, but not about the absence of documentation. If -# EXTRACT_ALL is set to YES then this flag will automatically be disabled. -# The default value is: NO. - -WARN_NO_PARAMDOC = NO - -# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when -# a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS -# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but -# at the end of the doxygen process doxygen will return with a non-zero status. -# Possible values are: NO, YES and FAIL_ON_WARNINGS. -# The default value is: NO. - -WARN_AS_ERROR = NO - -# The WARN_FORMAT tag determines the format of the warning messages that doxygen -# can produce. The string should contain the $file, $line, and $text tags, which -# will be replaced by the file and line number from which the warning originated -# and the warning text. Optionally the format may contain $version, which will -# be replaced by the version of the file (if it could be obtained via -# FILE_VERSION_FILTER) -# The default value is: $file:$line: $text. - -WARN_FORMAT = "$file:$line: $text" - -# The WARN_LOGFILE tag can be used to specify a file to which warning and error -# messages should be written. If left blank the output is written to standard -# error (stderr). - -WARN_LOGFILE = output_err - -#--------------------------------------------------------------------------- -# Configuration options related to the input files -#--------------------------------------------------------------------------- - -# The INPUT tag is used to specify the files and/or directories that contain -# documented source files. You may enter file names like myfile.cpp or -# directories like /usr/src/myproject. Separate the files or directories with -# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING -# Note: If this tag is empty the current directory is searched. - -INPUT = . \ - DOCS/groups-usr.dox - -# This tag can be used to specify the character encoding of the source files -# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses -# libiconv (or the iconv built into libc) for the transcoding. See the libiconv -# documentation (see: -# https://www.gnu.org/software/libiconv/) for the list of possible encodings. -# The default value is: UTF-8. - -INPUT_ENCODING = UTF-8 - -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and -# *.h) to filter out the source-files in the directories. -# -# Note that for custom extensions or not directly supported extensions you also -# need to set EXTENSION_MAPPING for the extension otherwise the files are not -# read by doxygen. -# -# Note the list of default checked file patterns might differ from the list of -# default file extension mappings. -# -# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, -# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, -# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, -# *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C comment), -# *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd, *.vhdl, -# *.ucf, *.qsf and *.ice. - -FILE_PATTERNS = *.c \ - *.f \ - *.h - -# The RECURSIVE tag can be used to specify whether or not subdirectories should -# be searched for input files as well. -# The default value is: NO. - -RECURSIVE = YES - -# The EXCLUDE tag can be used to specify files and/or directories that should be -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. -# -# Note that relative paths are relative to the directory from which doxygen is -# run. - -EXCLUDE = CMAKE \ - DOCS \ - BLAS/TESTING \ - CBLAS \ - LAPACKE/mangling \ - INSTALL \ - SRC/DEPRECATED \ - TESTING - -# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or -# directories that are symbolic links (a Unix file system feature) are excluded -# from the input. -# The default value is: NO. - -EXCLUDE_SYMLINKS = NO - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. -# -# Note that the wildcards are matched against the file with absolute path, so to -# exclude all test directories for example use the pattern */test/* - -EXCLUDE_PATTERNS = *.py \ - *.txt \ - *.in \ - *.inc \ - Makefile - -# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names -# (namespaces, classes, functions, etc.) that should be excluded from the -# output. The symbol name can be a fully qualified name, a word, or if the -# wildcard * is used, a substring. Examples: ANamespace, AClass, -# AClass::ANamespace, ANamespace::*Test -# -# Note that the wildcards are matched against the file with absolute path, so to -# exclude all test directories use the pattern */test/* - -EXCLUDE_SYMBOLS = - -# The EXAMPLE_PATH tag can be used to specify one or more files or directories -# that contain example code fragments that are included (see the \include -# command). - -EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and -# *.h) to filter out the source-files in the directories. If left blank all -# files are included. - -EXAMPLE_PATTERNS = - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude commands -# irrespective of the value of the RECURSIVE tag. -# The default value is: NO. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or directories -# that contain images that are to be included in the documentation (see the -# \image command). - -IMAGE_PATH = - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command: -# -# -# -# where is the value of the INPUT_FILTER tag, and is the -# name of an input file. Doxygen will then use the output that the filter -# program writes to standard output. If FILTER_PATTERNS is specified, this tag -# will be ignored. -# -# Note that the filter must not add or remove lines; it is applied before the -# code is scanned, but not when the output code is generated. If lines are added -# or removed, the anchors will not be placed correctly. -# -# Note that for custom extensions or not directly supported extensions you also -# need to set EXTENSION_MAPPING for the extension otherwise the files are not -# properly processed by doxygen. - -INPUT_FILTER = - -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. The filters are a list of the form: pattern=filter -# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how -# filters are used. If the FILTER_PATTERNS tag is empty or if none of the -# patterns match the file name, INPUT_FILTER is applied. -# -# Note that for custom extensions or not directly supported extensions you also -# need to set EXTENSION_MAPPING for the extension otherwise the files are not -# properly processed by doxygen. - -FILTER_PATTERNS = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will also be used to filter the input files that are used for -# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). -# The default value is: NO. - -FILTER_SOURCE_FILES = NO - -# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file -# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and -# it is also possible to disable source filtering for a specific pattern using -# *.ext= (so without naming a filter). -# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. - -FILTER_SOURCE_PATTERNS = - -# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that -# is part of the input, its contents will be placed on the main page -# (index.html). This can be useful if you have a project on for instance GitHub -# and want to reuse the introduction page also for the doxygen output. - -USE_MDFILE_AS_MAINPAGE = - -#--------------------------------------------------------------------------- -# Configuration options related to source browsing -#--------------------------------------------------------------------------- - -# If the SOURCE_BROWSER tag is set to YES then a list of source files will be -# generated. Documented entities will be cross-referenced with these sources. -# -# Note: To get rid of all source code in the generated output, make sure that -# also VERBATIM_HEADERS is set to NO. -# The default value is: NO. - -SOURCE_BROWSER = YES - -# Setting the INLINE_SOURCES tag to YES will include the body of functions, -# classes and enums directly into the documentation. -# The default value is: NO. - -INLINE_SOURCES = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any -# special comment blocks from generated source code fragments. Normal C, C++ and -# Fortran comments will always remain visible. -# The default value is: YES. - -STRIP_CODE_COMMENTS = YES - -# If the REFERENCED_BY_RELATION tag is set to YES then for each documented -# entity all documented functions referencing it will be listed. -# The default value is: NO. - -REFERENCED_BY_RELATION = NO - -# If the REFERENCES_RELATION tag is set to YES then for each documented function -# all documented entities called/used by that function will be listed. -# The default value is: NO. - -REFERENCES_RELATION = NO - -# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set -# to YES then the hyperlinks from functions in REFERENCES_RELATION and -# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will -# link to the documentation. -# The default value is: YES. - -REFERENCES_LINK_SOURCE = YES - -# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the -# source code will show a tooltip with additional information such as prototype, -# brief description and links to the definition and documentation. Since this -# will make the HTML file larger and loading of large files a bit slower, you -# can opt to disable this feature. -# The default value is: YES. -# This tag requires that the tag SOURCE_BROWSER is set to YES. - -SOURCE_TOOLTIPS = YES - -# If the USE_HTAGS tag is set to YES then the references to source code will -# point to the HTML generated by the htags(1) tool instead of doxygen built-in -# source browser. The htags tool is part of GNU's global source tagging system -# (see https://www.gnu.org/software/global/global.html). You will need version -# 4.8.6 or higher. -# -# To use it do the following: -# - Install the latest version of global -# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file -# - Make sure the INPUT points to the root of the source tree -# - Run doxygen as normal -# -# Doxygen will invoke htags (and that will in turn invoke gtags), so these -# tools must be available from the command line (i.e. in the search path). -# -# The result: instead of the source browser generated by doxygen, the links to -# source code will now point to the output of htags. -# The default value is: NO. -# This tag requires that the tag SOURCE_BROWSER is set to YES. - -USE_HTAGS = NO - -# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a -# verbatim copy of the header file for each class for which an include is -# specified. Set to NO to disable this. -# See also: Section \class. -# The default value is: YES. - -VERBATIM_HEADERS = YES - -#--------------------------------------------------------------------------- -# Configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- - -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all -# compounds will be generated. Enable this if the project contains a lot of -# classes, structs, unions or interfaces. -# The default value is: YES. - -ALPHABETICAL_INDEX = YES - -# In case all classes in a project start with a common prefix, all classes will -# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag -# can be used to specify a prefix (or a list of prefixes) that should be ignored -# while generating the index headers. -# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. - -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the HTML output -#--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output -# The default value is: YES. - -GENERATE_HTML = NO - -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a -# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of -# it. -# The default directory is: html. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_OUTPUT = explore-html - -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each -# generated HTML page (for example: .htm, .php, .asp). -# The default value is: .html. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_FILE_EXTENSION = .html - -# The HTML_HEADER tag can be used to specify a user-defined HTML header file for -# each generated HTML page. If the tag is left blank doxygen will generate a -# standard header. -# -# To get valid HTML the header file that includes any scripts and style sheets -# that doxygen needs, which is dependent on the configuration options used (e.g. -# the setting GENERATE_TREEVIEW). It is highly recommended to start with a -# default header using -# doxygen -w html new_header.html new_footer.html new_stylesheet.css -# YourConfigFile -# and then modify the file new_header.html. See also section "Doxygen usage" -# for information on how to generate the default header that doxygen normally -# uses. -# Note: The header is subject to change so you typically have to regenerate the -# default header when upgrading to a newer version of doxygen. For a description -# of the possible markers and block names see the documentation. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_HEADER = - -# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each -# generated HTML page. If the tag is left blank doxygen will generate a standard -# footer. See HTML_HEADER for more information on how to generate a default -# footer and what special commands can be used inside the footer. See also -# section "Doxygen usage" for information on how to generate the default footer -# that doxygen normally uses. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_FOOTER = - -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style -# sheet that is used by each HTML page. It can be used to fine-tune the look of -# the HTML output. If left blank doxygen will generate a default style sheet. -# See also section "Doxygen usage" for information on how to generate the style -# sheet that doxygen normally uses. -# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as -# it is more robust and this tag (HTML_STYLESHEET) will in the future become -# obsolete. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_STYLESHEET = - -# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined -# cascading style sheets that are included after the standard style sheets -# created by doxygen. Using this option one can overrule certain style aspects. -# This is preferred over using HTML_STYLESHEET since it does not replace the -# standard style sheet and is therefore more robust against future updates. -# Doxygen will copy the style sheet files to the output directory. -# Note: The order of the extra style sheet files is of importance (e.g. the last -# style sheet in the list overrules the setting of the previous ones in the -# list). For an example see the documentation. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_EXTRA_STYLESHEET = - -# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or -# other source files which should be copied to the HTML output directory. Note -# that these files will be copied to the base HTML output directory. Use the -# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these -# files. In the HTML_STYLESHEET file, use the file name only. Also note that the -# files will be copied as-is; there are no commands or markers available. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_EXTRA_FILES = - -# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen -# will adjust the colors in the style sheet and background images according to -# this color. Hue is specified as an angle on a colorwheel, see -# https://en.wikipedia.org/wiki/Hue for more information. For instance the value -# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 -# purple, and 360 is red again. -# Minimum value: 0, maximum value: 359, default value: 220. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_HUE = 220 - -# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors -# in the HTML output. For a value of 0 the output will use grayscales only. A -# value of 255 will produce the most vivid colors. -# Minimum value: 0, maximum value: 255, default value: 100. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_SAT = 100 - -# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the -# luminance component of the colors in the HTML output. Values below 100 -# gradually make the output lighter, whereas values above 100 make the output -# darker. The value divided by 100 is the actual gamma applied, so 80 represents -# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not -# change the gamma. -# Minimum value: 40, maximum value: 240, default value: 80. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_GAMMA = 80 - -# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML -# page will contain the date and time when the page was generated. Setting this -# to YES can help to show when doxygen was last run and thus if the -# documentation is up to date. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_TIMESTAMP = YES - -# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML -# documentation will contain a main index with vertical navigation menus that -# are dynamically created via JavaScript. If disabled, the navigation index will -# consists of multiple levels of tabs that are statically embedded in every HTML -# page. Disable this option to support browsers that do not have JavaScript, -# like the Qt help browser. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_DYNAMIC_MENUS = YES - -# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML -# documentation will contain sections that can be hidden and shown after the -# page has loaded. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_DYNAMIC_SECTIONS = NO - -# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries -# shown in the various tree structured indices initially; the user can expand -# and collapse entries dynamically later on. Doxygen will expand the tree to -# such a level that at most the specified number of entries are visible (unless -# a fully collapsed tree already exceeds this amount). So setting the number of -# entries 1 will produce a full collapsed tree by default. 0 is a special value -# representing an infinite number of entries and will result in a full expanded -# tree by default. -# Minimum value: 0, maximum value: 9999, default value: 100. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_INDEX_NUM_ENTRIES = 100 - -# If the GENERATE_DOCSET tag is set to YES, additional index files will be -# generated that can be used as input for Apple's Xcode 3 integrated development -# environment (see: -# https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To -# create a documentation set, doxygen will generate a Makefile in the HTML -# output directory. Running make will produce the docset in that directory and -# running make install will install the docset in -# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at -# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy -# genXcode/_index.html for more information. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_DOCSET = NO - -# This tag determines the name of the docset feed. A documentation feed provides -# an umbrella under which multiple documentation sets from a single provider -# (such as a company or product suite) can be grouped. -# The default value is: Doxygen generated docs. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_FEEDNAME = "Doxygen generated docs" - -# This tag specifies a string that should uniquely identify the documentation -# set bundle. This should be a reverse domain-name style string, e.g. -# com.mycompany.MyDocSet. Doxygen will append .docset to the name. -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_BUNDLE_ID = org.doxygen.Project - -# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify -# the documentation publisher. This should be a reverse domain-name style -# string, e.g. com.mycompany.MyDocSet.documentation. -# The default value is: org.doxygen.Publisher. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_PUBLISHER_ID = org.doxygen.Publisher - -# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. -# The default value is: Publisher. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_PUBLISHER_NAME = Publisher - -# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three -# additional HTML index files: index.hhp, index.hhc, and index.hhk. The -# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop -# (see: -# https://www.microsoft.com/en-us/download/details.aspx?id=21138) on Windows. -# -# The HTML Help Workshop contains a compiler that can convert all HTML output -# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML -# files are now used as the Windows 98 help format, and will replace the old -# Windows help format (.hlp) on all Windows platforms in the future. Compressed -# HTML files also contain an index, a table of contents, and you can search for -# words in the documentation. The HTML workshop also contains a viewer for -# compressed HTML files. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_HTMLHELP = NO - -# The CHM_FILE tag can be used to specify the file name of the resulting .chm -# file. You can add a path in front of the file if the result should not be -# written to the html output directory. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -CHM_FILE = - -# The HHC_LOCATION tag can be used to specify the location (absolute path -# including file name) of the HTML help compiler (hhc.exe). If non-empty, -# doxygen will try to run the HTML help compiler on the generated index.hhp. -# The file has to be specified with full path. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -HHC_LOCATION = - -# The GENERATE_CHI flag controls if a separate .chi index file is generated -# (YES) or that it should be included in the main .chm file (NO). -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -GENERATE_CHI = NO - -# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) -# and project file content. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -CHM_INDEX_ENCODING = - -# The BINARY_TOC flag controls whether a binary table of contents is generated -# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it -# enables the Previous and Next buttons. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -BINARY_TOC = NO - -# The TOC_EXPAND flag can be set to YES to add extra items for group members to -# the table of contents of the HTML help documentation and to the tree view. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -TOC_EXPAND = NO - -# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and -# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that -# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help -# (.qch) of the generated HTML documentation. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_QHP = NO - -# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify -# the file name of the resulting .qch file. The path specified is relative to -# the HTML output folder. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QCH_FILE = - -# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help -# Project output. For more information please see Qt Help Project / Namespace -# (see: -# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_NAMESPACE = org.doxygen.Project - -# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt -# Help Project output. For more information please see Qt Help Project / Virtual -# Folders (see: -# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders). -# The default value is: doc. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_VIRTUAL_FOLDER = doc - -# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom -# filter to add. For more information please see Qt Help Project / Custom -# Filters (see: -# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_CUST_FILTER_NAME = - -# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the -# custom filter to add. For more information please see Qt Help Project / Custom -# Filters (see: -# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_CUST_FILTER_ATTRS = - -# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this -# project's filter section matches. Qt Help Project / Filter Attributes (see: -# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_SECT_FILTER_ATTRS = - -# The QHG_LOCATION tag can be used to specify the location (absolute path -# including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to -# run qhelpgenerator on the generated .qhp file. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHG_LOCATION = - -# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be -# generated, together with the HTML files, they form an Eclipse help plugin. To -# install this plugin and make it available under the help contents menu in -# Eclipse, the contents of the directory containing the HTML and XML files needs -# to be copied into the plugins directory of eclipse. The name of the directory -# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. -# After copying Eclipse needs to be restarted before the help appears. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_ECLIPSEHELP = NO - -# A unique identifier for the Eclipse help plugin. When installing the plugin -# the directory name containing the HTML and XML files should also have this -# name. Each documentation set should have its own identifier. -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. - -ECLIPSE_DOC_ID = org.doxygen.Project - -# If you want full control over the layout of the generated HTML pages it might -# be necessary to disable the index and replace it with your own. The -# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top -# of each HTML page. A value of NO enables the index and the value YES disables -# it. Since the tabs in the index contain the same information as the navigation -# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -DISABLE_INDEX = NO - -# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index -# structure should be generated to display hierarchical information. If the tag -# value is set to YES, a side panel will be generated containing a tree-like -# index structure (just like the one that is generated for HTML Help). For this -# to work a browser that supports JavaScript, DHTML, CSS and frames is required -# (i.e. any modern browser). Windows users are probably better off using the -# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can -# further fine-tune the look of the index. As an example, the default style -# sheet generated by doxygen has an example that shows how to put an image at -# the root of the tree instead of the PROJECT_NAME. Since the tree basically has -# the same information as the tab index, you could consider setting -# DISABLE_INDEX to YES when enabling this option. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_TREEVIEW = YES - -# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that -# doxygen will group on one line in the generated HTML documentation. -# -# Note that a value of 0 will completely suppress the enum values from appearing -# in the overview section. -# Minimum value: 0, maximum value: 20, default value: 4. -# This tag requires that the tag GENERATE_HTML is set to YES. - -ENUM_VALUES_PER_LINE = 4 - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used -# to set the initial width (in pixels) of the frame in which the tree is shown. -# Minimum value: 0, maximum value: 1500, default value: 250. -# This tag requires that the tag GENERATE_HTML is set to YES. - -TREEVIEW_WIDTH = 250 - -# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to -# external symbols imported via tag files in a separate window. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -EXT_LINKS_IN_WINDOW = NO - -# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg -# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see -# https://inkscape.org) to generate formulas as SVG images instead of PNGs for -# the HTML output. These images will generally look nicer at scaled resolutions. -# Possible values are: png (the default) and svg (looks nicer but requires the -# pdf2svg or inkscape tool). -# The default value is: png. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_FORMULA_FORMAT = png - -# Use this tag to change the font size of LaTeX formulas included as images in -# the HTML documentation. When you change the font size after a successful -# doxygen run you need to manually remove any form_*.png images from the HTML -# output directory to force them to be regenerated. -# Minimum value: 8, maximum value: 50, default value: 10. -# This tag requires that the tag GENERATE_HTML is set to YES. - -FORMULA_FONTSIZE = 10 - -# Use the FORMULA_TRANSPARENT tag to determine whether or not the images -# generated for formulas are transparent PNGs. Transparent PNGs are not -# supported properly for IE 6.0, but are supported on all modern browsers. -# -# Note that when changing this option you need to delete any form_*.png files in -# the HTML output directory before the changes have effect. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. - -FORMULA_TRANSPARENT = YES - -# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands -# to create new LaTeX commands to be used in formulas as building blocks. See -# the section "Including formulas" for details. - -FORMULA_MACROFILE = - -# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see -# https://www.mathjax.org) which uses client side JavaScript for the rendering -# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX -# installed or if you want to formulas look prettier in the HTML output. When -# enabled you may also need to install MathJax separately and configure the path -# to it using the MATHJAX_RELPATH option. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -USE_MATHJAX = NO - -# When MathJax is enabled you can set the default output format to be used for -# the MathJax output. See the MathJax site (see: -# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. -# Possible values are: HTML-CSS (which is slower, but has the best -# compatibility), NativeMML (i.e. MathML) and SVG. -# The default value is: HTML-CSS. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_FORMAT = HTML-CSS - -# When MathJax is enabled you need to specify the location relative to the HTML -# output directory using the MATHJAX_RELPATH option. The destination directory -# should contain the MathJax.js script. For instance, if the mathjax directory -# is located at the same level as the HTML output directory, then -# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax -# Content Delivery Network so you can quickly see the result without installing -# MathJax. However, it is strongly recommended to install a local copy of -# MathJax from https://www.mathjax.org before deployment. -# The default value is: https://cdn.jsdelivr.net/npm/mathjax@2. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_RELPATH = http://www.mathjax.org/mathjax - -# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax -# extension names that should be enabled during MathJax rendering. For example -# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_EXTENSIONS = - -# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces -# of code that will be used on startup of the MathJax code. See the MathJax site -# (see: -# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an -# example see the documentation. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_CODEFILE = - -# When the SEARCHENGINE tag is enabled doxygen will generate a search box for -# the HTML output. The underlying search engine uses javascript and DHTML and -# should work on any modern browser. Note that when using HTML help -# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) -# there is already a search function so this one should typically be disabled. -# For large projects the javascript based search engine can be slow, then -# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to -# search using the keyboard; to jump to the search box use + S -# (what the is depends on the OS and browser, but it is typically -# , /