From a1e1ba5e99b037c45dee7dc6b43350b236647f4f Mon Sep 17 00:00:00 2001 From: Rob Falck Date: Thu, 15 Jan 2026 09:46:20 -0500 Subject: [PATCH 01/28] first attempt at windows compatibility --- .github/workflows/test_workflow_pixi.yml | 27 ++++++++++++++++++++---- build_pyoptsparse/snopt_module.py | 15 +++++++++++-- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/.github/workflows/test_workflow_pixi.yml b/.github/workflows/test_workflow_pixi.yml index 757d788..985eabb 100644 --- a/.github/workflows/test_workflow_pixi.yml +++ b/.github/workflows/test_workflow_pixi.yml @@ -36,7 +36,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-latest, macos-latest] + os: [ubuntu-latest, macos-latest, windows-latest] pixi-environment: ['default', 'py311', 'py312', 'py314'] runs-on: ${{ matrix.os }} @@ -67,7 +67,7 @@ jobs: run: | mkdir -p ~/.ssh/ echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa - sudo chmod 600 ~/.ssh/id_rsa + chmod 600 ~/.ssh/id_rsa echo "$SSH_KNOWN_HOSTS" > ~/.ssh/known_hosts - name: Checkout code @@ -113,14 +113,16 @@ jobs: - name: Build SNOPT module if: env.HAS_SNOPT_ACCESS == 'true' + env: + FC: ${{ runner.os == 'Windows' && 'ifx' || 'gfortran' }} run: | echo "=============================================================" echo "Build SNOPT module with build_pyoptsparse" echo "=============================================================" pixi run -e ${{ matrix.pixi-environment }} python -m build_pyoptsparse.snopt_module SNOPT/src - - name: Test SNOPT module - if: env.HAS_SNOPT_ACCESS == 'true' + - name: Test SNOPT module (Unix) + if: env.HAS_SNOPT_ACCESS == 'true' && runner.os != 'Windows' run: | echo "=============================================================" echo "Test that SNOPT module can be imported" @@ -135,6 +137,23 @@ jobs: ls -la pixi run -e ${{ matrix.pixi-environment }} python -m unittest build_pyoptsparse/test/test_snopt_module.py + - name: Test SNOPT module (Windows) + if: env.HAS_SNOPT_ACCESS == 'true' && runner.os == 'Windows' + shell: pwsh + run: | + Write-Host "=============================================================" + Write-Host "Test that SNOPT module can be imported" + Write-Host "=============================================================" + pixi run -e ${{ matrix.pixi-environment }} python -c "from pyoptsparse import SNOPT; print('SNOPT loaded successfully!')" + + Write-Host "=============================================================" + Write-Host "Test SNOPT optimization" + Write-Host "=============================================================" + $env:SNOPT_SRC_PATH = "SNOPT/src" + Write-Host $PWD + Get-ChildItem + pixi run -e ${{ matrix.pixi-environment }} python -m unittest build_pyoptsparse/test/test_snopt_module.py + # Enable tmate debugging of manually-triggered workflows if the input option was provided - name: Setup tmate session if: github.event_name == 'workflow_dispatch' && inputs.debug_enabled diff --git a/build_pyoptsparse/snopt_module.py b/build_pyoptsparse/snopt_module.py index 432ab51..895894d 100644 --- a/build_pyoptsparse/snopt_module.py +++ b/build_pyoptsparse/snopt_module.py @@ -303,7 +303,18 @@ def create_meson_build_file(build_dir: Path | str, command: [py3, '-m', 'numpy.f2py', '@INPUT@', '--lower', '--build-dir', '.'] ) -# Build extension module +fc = meson.get_compiler('fortran') +fc_id = fc.get_id() + +# Set compiler-specific flags for fixed-form Fortran +if fc_id == 'intel' or fc_id == 'intel-cl' + fortran_flags = ['-fixed', '-extend-source', '80'] +elif fc_id == 'gcc' + fortran_flags = ['-ffixed-form', '-ffixed-line-length-80'] +else + fortran_flags = ['-ffixed-form', '-ffixed-line-length-80'] # Default to gfortran style +endif + py3.extension_module('snopt', snopt_source, fortranobject_c, @@ -311,7 +322,7 @@ def create_meson_build_file(build_dir: Path | str, include_directories: [inc_np, inc_f2py], dependencies: py3_dep, install: false, - fortran_args: '-ffixed-line-length-80' + fortran_args: fortran_flags ) message('SNOPT module will be built') From 6228b7ca123ae4ae40742b84a3fca10c26347957 Mon Sep 17 00:00:00 2001 From: Rob Falck Date: Thu, 15 Jan 2026 10:24:23 -0500 Subject: [PATCH 02/28] more work on windows --- .github/workflows/test_workflow_pixi.yml | 18 +- pixi.lock | 878 +++++++++++++++++++++++ pixi.toml | 12 +- 3 files changed, 897 insertions(+), 11 deletions(-) diff --git a/.github/workflows/test_workflow_pixi.yml b/.github/workflows/test_workflow_pixi.yml index 985eabb..141d215 100644 --- a/.github/workflows/test_workflow_pixi.yml +++ b/.github/workflows/test_workflow_pixi.yml @@ -84,7 +84,7 @@ jobs: echo "=============================================================" echo "Install build_pyoptsparse in pixi environment" echo "=============================================================" - pixi run -e ${{ matrix.pixi-environment }} pip install -e . + pixi run --frozen -e ${{ matrix.pixi-environment }} pip install -e . - name: Display environment run: | @@ -97,9 +97,9 @@ jobs: echo "=============================================================" echo "Check Python, NumPy versions" echo "=============================================================" - pixi run -e ${{ matrix.pixi-environment }} python -c "import sys; print(f'Python: {sys.version}')" - pixi run -e ${{ matrix.pixi-environment }} python -c "import numpy; print(f'NumPy: {numpy.__version__}')" - pixi run -e ${{ matrix.pixi-environment }} python -c "import pyoptsparse; print(f'pyoptsparse: {pyoptsparse.__version__}')" + pixi run --frozen -e ${{ matrix.pixi-environment }} python -c "import sys; print(f'Python: {sys.version}')" + pixi run --frozen -e ${{ matrix.pixi-environment }} python -c "import numpy; print(f'NumPy: {numpy.__version__}')" + pixi run --frozen -e ${{ matrix.pixi-environment }} python -c "import pyoptsparse; print(f'pyoptsparse: {pyoptsparse.__version__}')" - name: Copy SNOPT source files if: env.HAS_SNOPT_ACCESS == 'true' @@ -119,7 +119,7 @@ jobs: echo "=============================================================" echo "Build SNOPT module with build_pyoptsparse" echo "=============================================================" - pixi run -e ${{ matrix.pixi-environment }} python -m build_pyoptsparse.snopt_module SNOPT/src + pixi run --frozen -e ${{ matrix.pixi-environment }} python -m build_pyoptsparse.snopt_module SNOPT/src - name: Test SNOPT module (Unix) if: env.HAS_SNOPT_ACCESS == 'true' && runner.os != 'Windows' @@ -127,7 +127,7 @@ jobs: echo "=============================================================" echo "Test that SNOPT module can be imported" echo "=============================================================" - pixi run -e ${{ matrix.pixi-environment }} python -c "from pyoptsparse import SNOPT; print('SNOPT loaded successfully!')" + pixi run --frozen -e ${{ matrix.pixi-environment }} python -c "from pyoptsparse import SNOPT; print('SNOPT loaded successfully!')" echo "=============================================================" echo "Test SNOPT optimization" @@ -135,7 +135,7 @@ jobs: export SNOPT_SRC_PATH="SNOPT/src" echo $PWD ls -la - pixi run -e ${{ matrix.pixi-environment }} python -m unittest build_pyoptsparse/test/test_snopt_module.py + pixi run --frozen -e ${{ matrix.pixi-environment }} python -m unittest build_pyoptsparse/test/test_snopt_module.py - name: Test SNOPT module (Windows) if: env.HAS_SNOPT_ACCESS == 'true' && runner.os == 'Windows' @@ -144,7 +144,7 @@ jobs: Write-Host "=============================================================" Write-Host "Test that SNOPT module can be imported" Write-Host "=============================================================" - pixi run -e ${{ matrix.pixi-environment }} python -c "from pyoptsparse import SNOPT; print('SNOPT loaded successfully!')" + pixi run --frozen -e ${{ matrix.pixi-environment }} python -c "from pyoptsparse import SNOPT; print('SNOPT loaded successfully!')" Write-Host "=============================================================" Write-Host "Test SNOPT optimization" @@ -152,7 +152,7 @@ jobs: $env:SNOPT_SRC_PATH = "SNOPT/src" Write-Host $PWD Get-ChildItem - pixi run -e ${{ matrix.pixi-environment }} python -m unittest build_pyoptsparse/test/test_snopt_module.py + pixi run --frozen -e ${{ matrix.pixi-environment }} python -m unittest build_pyoptsparse/test/test_snopt_module.py # Enable tmate debugging of manually-triggered workflows if the input option was provided - name: Setup tmate session diff --git a/pixi.lock b/pixi.lock index 44ddf74..129c2a3 100644 --- a/pixi.lock +++ b/pixi.lock @@ -224,6 +224,51 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda + win-64: + - conda: https://conda.anaconda.org/conda-forge/noarch/ansicolors-1.1.8-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.2-h637d24d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2024.2.1-h57928b3_1083.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-35_h5709861_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-35_h2a3cdd5_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libflang-5.0.0-h6538335_20180525.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-35_hf9ab0e9_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libpgmath-2021.08.06-h39d44d4_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.51.2-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.1-h3cfd58e_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.1-h779ef1b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/llvm-meta-5.0.0-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/mdolab-baseclasses-1.8.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/meson-1.10.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.2.2-h57928b3_15.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ninja-1.13.2-h477610d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.1-py313hce7ae62_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openmp-5.0.0-vc14_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-25.3-pyh145f28c_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyoptsparse-2.14.5-py313hc65ffb4_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.11-h09917c8_100_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.17.0-py313he51e9a2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sqlitedict-2.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.13.0-h3155e25_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.44.35208-h38c0c73_34.conda py311: channels: - url: https://conda.anaconda.org/conda-forge/ @@ -454,6 +499,52 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda + win-64: + - conda: https://conda.anaconda.org/conda-forge/noarch/ansicolors-1.1.8-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.2-h637d24d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2024.2.1-h57928b3_1083.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-35_h5709861_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-35_h2a3cdd5_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libflang-5.0.0-h6538335_20180525.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-35_hf9ab0e9_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libpgmath-2021.08.06-h39d44d4_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.51.2-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.1-h3cfd58e_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.1-h779ef1b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/llvm-meta-5.0.0-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/mdolab-baseclasses-1.8.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/meson-1.10.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.2.2-h57928b3_15.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ninja-1.13.2-h477610d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.1-py311h80b3fa1_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openmp-5.0.0-vc14_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-25.3-pyh8b19718_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyoptsparse-2.14.5-py311hf10c8ea_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.14-h0159041_2_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.17.0-py311h9c22a71_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sqlitedict-2.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.13.0-h3155e25_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.44.35208-h38c0c73_34.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda py312: channels: - url: https://conda.anaconda.org/conda-forge/ @@ -684,6 +775,52 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda + win-64: + - conda: https://conda.anaconda.org/conda-forge/noarch/ansicolors-1.1.8-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.2-h637d24d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2024.2.1-h57928b3_1083.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-35_h5709861_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-35_h2a3cdd5_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libflang-5.0.0-h6538335_20180525.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-35_hf9ab0e9_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libpgmath-2021.08.06-h39d44d4_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.51.2-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.1-h3cfd58e_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.1-h779ef1b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/llvm-meta-5.0.0-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/mdolab-baseclasses-1.8.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/meson-1.10.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.2.2-h57928b3_15.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ninja-1.13.2-h477610d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.1-py312ha72d056_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openmp-5.0.0-vc14_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-25.3-pyh8b19718_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyoptsparse-2.14.5-py312h69e7fca_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.12.12-h0159041_1_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.17.0-py312h9b3c559_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sqlitedict-2.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.13.0-h3155e25_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.44.35208-h38c0c73_34.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda py314: channels: - url: https://conda.anaconda.org/conda-forge/ @@ -908,6 +1045,52 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda + win-64: + - conda: https://conda.anaconda.org/conda-forge/noarch/ansicolors-1.1.8-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.2-h637d24d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2024.2.1-h57928b3_1083.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-35_h5709861_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-35_h2a3cdd5_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libflang-5.0.0-h6538335_20180525.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-35_hf9ab0e9_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libpgmath-2021.08.06-h39d44d4_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.51.2-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.1-h3cfd58e_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.1-h779ef1b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/llvm-meta-5.0.0-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/mdolab-baseclasses-1.8.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/meson-1.10.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.2.2-h57928b3_15.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ninja-1.13.2-h477610d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.1-py314h06c3c77_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openmp-5.0.0-vc14_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-25.3-pyh145f28c_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyoptsparse-2.14.5-py314h96e4a21_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.2-h4b44e0e_100_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.17.0-py314h221f224_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sqlitedict-2.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.13.0-h3155e25_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.44.35208-h38c0c73_34.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda packages: - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 @@ -1014,6 +1197,17 @@ packages: license_family: BSD size: 125061 timestamp: 1757437486465 +- conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda + sha256: d882712855624641f48aa9dc3f5feea2ed6b4e6004585d3616386a18186fe692 + md5: 1077e9333c41ff0be8edd1a5ec0ddace + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: bzip2-1.0.6 + license_family: BSD + size: 55977 + timestamp: 1757437738856 - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-1.11.0-h4d9bdce_0.conda sha256: 8e7a40f16400d7839c82581410aa05c1f8324a693c9d50079f8c50dc9fb241f0 md5: abd85120de1187b0d1ec305c2173c71b @@ -1049,6 +1243,14 @@ packages: license_family: BSD size: 6697 timestamp: 1753098737760 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-h4c7d964_0.conda + sha256: 4ddcb01be03f85d3db9d881407fb13a673372f1b9fac9c836ea441893390e049 + md5: 84d389c9eee640dda3d26fc5335c67d8 + depends: + - __win + license: ISC + size: 147139 + timestamp: 1767500904211 - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda sha256: b5974ec9b50e3c514a382335efa81ed02b05906849827a34061c496f4defa0b2 md5: bddacf101bb4dd0e51811cb69c7790e2 @@ -1709,6 +1911,24 @@ packages: license_family: MIT size: 12358010 timestamp: 1767970350308 +- conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.2-h637d24d_0.conda + sha256: 5a41fb28971342e293769fc968b3414253a2f8d9e30ed7c31517a15b4887246a + md5: 0ee3bb487600d5e71ab7d28951b2016a + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + size: 13222158 + timestamp: 1767970128854 +- conda: https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2024.2.1-h57928b3_1083.conda + sha256: 0fd2b0b84c854029041b0ede8f4c2369242ee92acc0092f8407b1fe9238a8209 + md5: 2d89243bfb53652c182a7c73182cce4f + license: LicenseRef-IntelSimplifiedSoftwareOct2022 + license_family: Proprietary + size: 1852356 + timestamp: 1723739573141 - conda: https://conda.anaconda.org/conda-forge/osx-64/isl-0.26-imath32_h2e86a7b_101.conda sha256: d39bf147cb9958f197dafa0b8ad8c039b7374778edac05b5c78b712786e305c7 md5: d06222822a9144918333346f145b68c6 @@ -1865,6 +2085,21 @@ packages: license_family: BSD size: 18546 timestamp: 1765819094137 +- conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-35_h5709861_mkl.conda + build_number: 35 + sha256: 4180e7ab27ed03ddf01d7e599002fcba1b32dcb68214ee25da823bac371ed362 + md5: 45d98af023f8b4a7640b1f713ce6b602 + depends: + - mkl >=2024.2.2,<2025.0a0 + constrains: + - blas 2.135 mkl + - liblapack 3.9.0 35*_mkl + - libcblas 3.9.0 35*_mkl + - liblapacke 3.9.0 35*_mkl + license: BSD-3-Clause + license_family: BSD + size: 66044 + timestamp: 1757003486248 - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda build_number: 5 sha256: 0cbdcc67901e02dc17f1d19e1f9170610bd828100dc207de4d5b6b8ad1ae7ad8 @@ -1907,6 +2142,20 @@ packages: license_family: BSD size: 18548 timestamp: 1765819108956 +- conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-35_h2a3cdd5_mkl.conda + build_number: 35 + sha256: 88939f6c1b5da75bd26ce663aa437e1224b26ee0dab5e60cecc77600975f397e + md5: 9639091d266e92438582d0cc4cfc8350 + depends: + - libblas 3.9.0 35_h5709861_mkl + constrains: + - blas 2.135 mkl + - liblapack 3.9.0 35*_mkl + - liblapacke 3.9.0 35*_mkl + license: BSD-3-Clause + license_family: BSD + size: 66398 + timestamp: 1757003514529 - conda: https://conda.anaconda.org/conda-forge/osx-64/libclang-cpp19.1-19.1.7-default_hd70426c_7.conda sha256: 3e8588828d2586722328ea39a7cf48c50a32f7661b55299075741ef7c8875ad5 md5: b671ac86f33848f3bc3a6066d21c37dd @@ -2012,6 +2261,19 @@ packages: license_family: MIT size: 67800 timestamp: 1763549994166 +- conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda + sha256: 844ab708594bdfbd7b35e1a67c379861bcd180d6efe57b654f482ae2f7f5c21e + md5: 8c9e4f1a0e688eef2e95711178061a0f + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - expat 2.7.3.* + license: MIT + license_family: MIT + size: 70137 + timestamp: 1763550049107 - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda sha256: 25cbdfa65580cfab1b8d15ee90b4c9f1e0d72128f1661449c9a999d341377d54 md5: 35f29eec58405aaf55e01cb470d8c26a @@ -2040,6 +2302,28 @@ packages: license_family: MIT size: 40251 timestamp: 1760295839166 +- conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda + sha256: ddff25aaa4f0aa535413f5d831b04073789522890a4d8626366e43ecde1534a3 + md5: ba4ad812d2afc22b9a34ce8327a0930f + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + size: 44866 + timestamp: 1760295760649 +- conda: https://conda.anaconda.org/conda-forge/win-64/libflang-5.0.0-h6538335_20180525.tar.bz2 + sha256: 0b893b511190332320f4a3e3d6424fbd350271ffbca34eb25b5cd8bc451f1a05 + md5: 9f473a344e18668e99a93f7e21a54b69 + depends: + - openmp 5.0.0 + - vc >=14,<15.0a0 + track_features: + - flang + license: Apache 2.0 + size: 531143 + timestamp: 1527899216421 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_16.conda sha256: 6eed58051c2e12b804d53ceff5994a350c61baf117ec83f5f10c953a3f311451 md5: 6d0363467e6ed84f11435eb309f2ff06 @@ -2185,6 +2469,20 @@ packages: license_family: GPL size: 603284 timestamp: 1765256703881 +- conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda + sha256: 8cdf11333a81085468d9aa536ebb155abd74adc293576f6013fc0c85a7a90da3 + md5: 3b576f6860f838f950c570f4433b086e + depends: + - libwinpthread >=12.0.0.r4.gg4f2fc60ca + - libxml2 + - libxml2-16 >=2.14.6 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + size: 2411241 + timestamp: 1765104337762 - conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda sha256: a1c8cecdf9966921e13f0ae921309a1f415dfbd2b791f2117cf7e8f5e61a48b6 md5: 210a85a1119f97ea7887188d176db135 @@ -2201,6 +2499,16 @@ packages: license: LGPL-2.1-only size: 750379 timestamp: 1754909073836 +- conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda + sha256: 0dcdb1a5f01863ac4e8ba006a8b0dc1a02d2221ec3319b5915a1863254d7efa7 + md5: 64571d1dd6cdcfa25d0664a5950fdaa2 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: LGPL-2.1-only + size: 696926 + timestamp: 1754909290005 - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda build_number: 5 sha256: c723b6599fcd4c6c75dee728359ef418307280fa3e2ee376e14e85e5bbdda053 @@ -2243,6 +2551,20 @@ packages: license_family: BSD size: 18551 timestamp: 1765819121855 +- conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-35_hf9ab0e9_mkl.conda + build_number: 35 + sha256: 56e0992fb58eed8f0d5fa165b8621fa150b84aa9af1467ea0a7a9bb7e2fced4f + md5: 0c6ed9d722cecda18f50f17fb3c30002 + depends: + - libblas 3.9.0 35_h5709861_mkl + constrains: + - blas 2.135 mkl + - libcblas 3.9.0 35*_mkl + - liblapacke 3.9.0 35*_mkl + license: BSD-3-Clause + license_family: BSD + size: 78485 + timestamp: 1757003541803 - conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm19-19.1.7-h56e7563_2.conda sha256: 375a634873b7441d5101e6e2a9d3a42fec51be392306a03a2fa12ae8edecec1a md5: 05a54b479099676e75f80ad0ddd38eff @@ -2302,6 +2624,18 @@ packages: license: 0BSD size: 92286 timestamp: 1749230283517 +- conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda + sha256: 55764956eb9179b98de7cc0e55696f2eff8f7b83fc3ebff5e696ca358bca28cc + md5: c15148b2e18da456f5108ccb5e411446 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - xz 5.8.1.* + license: 0BSD + size: 104935 + timestamp: 1749230611612 - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda sha256: 3aa92d4074d4063f2a162cd8ecb45dccac93e543e565c01a787e16a43501f7ee md5: c7e925f37e3b40d893459e625f6a53f1 @@ -2330,6 +2664,17 @@ packages: license_family: BSD size: 71829 timestamp: 1748393749336 +- conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda + sha256: fc529fc82c7caf51202cc5cec5bb1c2e8d90edbac6d0a4602c966366efe3c7bf + md5: 74860100b2029e2523cf480804c76b9b + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-2-Clause + license_family: BSD + size: 88657 + timestamp: 1723861474602 - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda sha256: 927fe72b054277cde6cb82597d0fcf6baf127dcbce2e0a9d8925a68f1265eef5 md5: d864d34357c3b65a4b731f78c0801dc4 @@ -2382,6 +2727,16 @@ packages: license_family: BSD size: 4285762 timestamp: 1761749506256 +- conda: https://conda.anaconda.org/conda-forge/win-64/libpgmath-2021.08.06-h39d44d4_0.tar.bz2 + sha256: ef5ad871ff6d1d102ced2b7b58256301b787fa894f66562ae8418e1e915acf8a + md5: a7f973973462dc964b8382098bff1ace + depends: + - vc >=14.1,<15.0a0 + - vs2015_runtime >=14.16.27012 + license: Apache-2.0 + license_family: Apache + size: 1518006 + timestamp: 1628425265878 - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_16.conda sha256: 21765d3fa780eb98055a9f40e9d4defa1eaffe254ee271a3e49555a89e37d6c9 md5: 0617b134e4dc4474c1038707499f7eed @@ -2443,6 +2798,16 @@ packages: license: blessing size: 909777 timestamp: 1768148320535 +- conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.51.2-hf5d6505_0.conda + sha256: 756478128e3e104bd7e7c3ce6c1b0efad7e08c7320c69fdc726e039323c63fbb + md5: 903979414b47d777d548e5f0165e6cd8 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: blessing + size: 1291616 + timestamp: 1768148278261 - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda sha256: 813427918316a00c904723f1dfc3da1bbc1974c5cfe1ed1e704c6f4e0798cbc6 md5: 68f68355000ec3f1d6f26ea13e8f525f @@ -2474,6 +2839,17 @@ packages: license_family: BSD size: 40311 timestamp: 1766271528534 +- conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda + sha256: 0fccf2d17026255b6e10ace1f191d0a2a18f2d65088fd02430be17c701f8ffe0 + md5: 8a86073cf3b343b87d03f41790d8b4e5 + depends: + - ucrt + constrains: + - pthreads-win32 <0.0a0 + - msys2-conda-epoch <0.0a0 + license: MIT AND BSD-3-Clause-Clear + size: 36621 + timestamp: 1759768399557 - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c md5: 5aa797f8787fe7a17d1b0821485b5adc @@ -2511,6 +2887,22 @@ packages: license_family: MIT size: 40607 timestamp: 1766327501392 +- conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.1-h779ef1b_1.conda + sha256: 8b47d5fb00a6ccc0f495d16787ab5f37a434d51965584d6000966252efecf56d + md5: 68dc154b8d415176c07b6995bd3a65d9 + depends: + - icu >=78.1,<79.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libxml2-16 2.15.1 h3cfd58e_1 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + size: 43387 + timestamp: 1766327259710 - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.1-hd57b93d_1.conda sha256: abdeaea43d0e882679942cc2385342d701873e18669828e40637a70a140ce614 md5: 060f6892620dc862f3b54b9b2da8f177 @@ -2541,6 +2933,23 @@ packages: license_family: MIT size: 464886 timestamp: 1766327479416 +- conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.1-h3cfd58e_1.conda + sha256: a857e941156b7f462063e34e086d212c6ccbc1521ebdf75b9ed66bd90add57dc + md5: 07d73826fde28e7dbaec52a3297d7d26 + depends: + - icu >=78.1,<79.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - libxml2 2.15.1 + license: MIT + license_family: MIT + size: 518964 + timestamp: 1766327232819 - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 md5: edb0dca6bc32e4f4789199455a1dbeb8 @@ -2575,6 +2984,25 @@ packages: license_family: Other size: 46438 timestamp: 1727963202283 +- conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + sha256: ba945c6493449bed0e6e29883c4943817f7c79cbff52b83360f7b341277c6402 + md5: 41fbfac52c601159df6c01f875de31b9 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 55476 + timestamp: 1727963768015 +- conda: https://conda.anaconda.org/conda-forge/noarch/llvm-meta-5.0.0-0.tar.bz2 + sha256: 090bbeacc3297ff579b53f55ad184f05c30e316fe9d5d7df63df1d2ad4578b79 + md5: 213b5b5ad34008147a824460e50a691c + license: BSD-3-Clause + license_family: BSD + size: 2667 - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-21.1.8-h472b3d1_0.conda sha256: 2a41885f44cbc1546ff26369924b981efa37a29d20dc5445b64539ba240739e6 md5: e2d811e9f464dd67398b4ce1f9c7c872 @@ -2678,6 +3106,16 @@ packages: license_family: APACHE size: 759977 timestamp: 1765221106896 +- conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.2.2-h57928b3_15.conda + sha256: 592e17e20bb43c3e30b58bb43c9345490a442bff1c6a6236cbf3c39678f915af + md5: 5d760433dc75df74e8f9ede69d11f9ec + depends: + - intel-openmp 2024.* + - tbb 2021.* + license: LicenseRef-IntelSimplifiedSoftwareOct2022 + license_family: Proprietary + size: 102928701 + timestamp: 1753396273118 - conda: https://conda.anaconda.org/conda-forge/osx-64/mpc-1.3.1-h9d8efa1_1.conda sha256: dcf91571da6c2f0db96d43a1b639047def05a0e1b6436d42c9129ab14af47b10 md5: 0520855aaae268ea413d6bc913f1384c @@ -2776,6 +3214,20 @@ packages: license_family: APACHE size: 164450 timestamp: 1763688228613 +- conda: https://conda.anaconda.org/conda-forge/win-64/ninja-1.13.2-h477610d_0.conda + sha256: e41a945c34a5f0bd2109b73a65486cd93023fa0a9bcba3ef98f9a3da40ba1180 + md5: 7ecb9f2f112c66f959d2bb7dbdb89b67 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: Apache-2.0 + license_family: APACHE + size: 309417 + timestamp: 1763688227932 - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.1-py311h2e04523_0.conda sha256: 51b04fafacedb05ef2865dccce212161112f22bfedd7655f8ae04489f85ce083 md5: 716357afd11c16214cdac522da447704 @@ -2988,6 +3440,86 @@ packages: license_family: BSD size: 6991931 timestamp: 1768085575848 +- conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.1-py311h80b3fa1_0.conda + sha256: 51c0314092c3e1077679379703af41b0ab89b5eacfdfba142ad2670fdce3ca32 + md5: 387094bb33448f55432ea38cf9b62f1f + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - liblapack >=3.9.0,<4.0a0 + - python_abi 3.11.* *_cp311 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + size: 7799698 + timestamp: 1768085583840 +- conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.1-py312ha72d056_0.conda + sha256: 06d2acce4c5cfe230213c4bc62823de3fa032d053f83c93a28478c7b8ee769bc + md5: e06f225f5bf5784b3412b21a2a44da72 + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - libcblas >=3.9.0,<4.0a0 + - liblapack >=3.9.0,<4.0a0 + - libblas >=3.9.0,<4.0a0 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + size: 7163582 + timestamp: 1768085586766 +- conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.1-py313hce7ae62_0.conda + sha256: 1e28379c323859e7e83bf91b0dcbd1ddc0c13a3a6939aacab3bd7db5c2e9ccde + md5: 2490cec55c24dbf3d3be2da6b61a6646 + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.13.* *_cp313 + - liblapack >=3.9.0,<4.0a0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + size: 7251637 + timestamp: 1768085589970 +- conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.1-py314h06c3c77_0.conda + sha256: 4bcbbe320525c49f2ddf61123e4281ff76d2ba9a737dea90e14370534c6ec1f9 + md5: 794ac87f08dcca30be8c6ebfa8a5b2d1 + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.14.* *_cp314 + - liblapack >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libblas >=3.9.0,<4.0a0 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + size: 7306379 + timestamp: 1768085588568 +- conda: https://conda.anaconda.org/conda-forge/win-64/openmp-5.0.0-vc14_1.tar.bz2 + sha256: 05c19170938b589f59049679d4e0679c98160fecc6fd1bf721b0f4980bd235dd + md5: 8284c925330fa53668ade00db3c9e787 + depends: + - llvm-meta 5.0.0|5.0.0.* + - vc 14.* + license: NCSA + size: 590466 - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda sha256: a47271202f4518a484956968335b2521409c8173e123ab381e775c358c67fe6d md5: 9ee58d5c534af06558933af3c845a780 @@ -3019,6 +3551,18 @@ packages: license_family: Apache size: 3108371 timestamp: 1762839712322 +- conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda + sha256: 6d72d6f766293d4f2aa60c28c244c8efed6946c430814175f959ffe8cab899b3 + md5: 84f8fb4afd1157f59098f618cd2437e4 + depends: + - ca-certificates + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: Apache + size: 9440812 + timestamp: 1762841722179 - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda sha256: 289861ed0c13a15d7bbb408796af4de72c2fe67e2bcb0de98f4c3fce259d7991 md5: 58335b26c38bf4a20f399384c33cbcf9 @@ -3285,6 +3829,86 @@ packages: license_family: LGPL size: 476629 timestamp: 1765741524167 +- conda: https://conda.anaconda.org/conda-forge/win-64/pyoptsparse-2.14.5-py311hf10c8ea_0.conda + sha256: 7835742ec612718078c31e4a8fed5a4f4f176b2b2a5cdf494002b6c1d3d9534f + md5: 453600292cb3882d637db1846b01d53c + depends: + - libflang >=5.0.0,<6.0.0.a0 + - libpgmath >=2021.8.6,<2021.8.7.0a0 + - mdolab-baseclasses >=1.3.1 + - numpy >=1.23,<3 + - packaging + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - scipy >1.2 + - sqlitedict >=1.6 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: LGPL-3.0-only + license_family: LGPL + size: 961336 + timestamp: 1765741421941 +- conda: https://conda.anaconda.org/conda-forge/win-64/pyoptsparse-2.14.5-py312h69e7fca_0.conda + sha256: 81e2b7fc8369cf850891032fb78a59654a172c92cb0db0f1e8599ae32e58a6a0 + md5: b6b10b4095f57835b8492abeba503d71 + depends: + - libflang >=5.0.0,<6.0.0.a0 + - libpgmath >=2021.8.6,<2021.8.7.0a0 + - mdolab-baseclasses >=1.3.1 + - numpy >=1.23,<3 + - packaging + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - scipy >1.2 + - sqlitedict >=1.6 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: LGPL-3.0-only + license_family: LGPL + size: 947403 + timestamp: 1765741306645 +- conda: https://conda.anaconda.org/conda-forge/win-64/pyoptsparse-2.14.5-py313hc65ffb4_0.conda + sha256: 47658c449a870bd9d28352dd8beaac15592daf72c8401f7bf600431791b2c5ad + md5: 135273415c3dddb0668f277b167fcd07 + depends: + - libflang >=5.0.0,<6.0.0.a0 + - libpgmath >=2021.8.6,<2021.8.7.0a0 + - mdolab-baseclasses >=1.3.1 + - numpy >=1.23,<3 + - packaging + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + - scipy >1.2 + - sqlitedict >=1.6 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: LGPL-3.0-only + license_family: LGPL + size: 963597 + timestamp: 1765741443915 +- conda: https://conda.anaconda.org/conda-forge/win-64/pyoptsparse-2.14.5-py314h96e4a21_0.conda + sha256: 40b983d0ea3eb7e23f12ae327faa4180d5d727f5f84ca255f0530360b8e61979 + md5: b231fc56d94c7840899da43bedd81b4b + depends: + - libflang >=5.0.0,<6.0.0.a0 + - libpgmath >=2021.8.6,<2021.8.7.0a0 + - mdolab-baseclasses >=1.3.1 + - numpy >=1.23,<3 + - packaging + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - scipy >1.2 + - sqlitedict >=1.6 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: LGPL-3.0-only + license_family: LGPL + size: 969388 + timestamp: 1765741304570 - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.14-hd63d673_2_cpython.conda build_number: 2 sha256: 5b872f7747891e50e990a96d2b235236a5c66cc9f8c9dcb7149aee674ea8145a @@ -3574,6 +4198,97 @@ packages: size: 13575758 timestamp: 1765021280625 python_site_packages_path: lib/python3.14/site-packages +- conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.14-h0159041_2_cpython.conda + build_number: 2 + sha256: d5f455472597aefcdde1bc39bca313fcb40bf084f3ad987da0441f2a2ec242e4 + md5: 02a9ba5950d8b78e6c9862d6ba7a5045 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.1,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - liblzma >=5.8.1,<6.0a0 + - libsqlite >=3.50.4,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.4,<4.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - python_abi 3.11.* *_cp311 + license: Python-2.0 + size: 18514691 + timestamp: 1761172844103 +- conda: https://conda.anaconda.org/conda-forge/win-64/python-3.12.12-h0159041_1_cpython.conda + build_number: 1 + sha256: 9b163b0426c92eee1881d5c838e230a750a3fa372092db494772886ab91c2548 + md5: 42ae551e4c15837a582bea63412dc0b4 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.1,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - liblzma >=5.8.1,<6.0a0 + - libsqlite >=3.50.4,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.4,<4.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - python_abi 3.12.* *_cp312 + license: Python-2.0 + size: 15883484 + timestamp: 1761175152489 +- conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.11-h09917c8_100_cp313.conda + build_number: 100 + sha256: 0ee0402368783e1fad10025719530499c517a3dbbdfbe18351841d9b7aef1d6a + md5: 9e4c9a7ee9c4ab5b3778ab73e583283e + depends: + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.3,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.51.1,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.4,<4.0a0 + - python_abi 3.13.* *_cp313 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Python-2.0 + size: 16617922 + timestamp: 1765019627175 + python_site_packages_path: Lib/site-packages +- conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.2-h4b44e0e_100_cp314.conda + build_number: 100 + sha256: 6857d7c97cc71fe9ba298dcb1d3b66cc7df425132ab801babd655faa3df48f32 + md5: c3c73414d5ae3f543c531c978d9cc8b8 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.3,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.51.1,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.4,<4.0a0 + - python_abi 3.14.* *_cp314 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - zstd >=1.5.7,<1.6.0a0 + license: Python-2.0 + size: 16833248 + timestamp: 1765020224759 + python_site_packages_path: Lib/site-packages - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda build_number: 8 sha256: fddf123692aa4b1fc48f0471e346400d9852d96eeed77dbfdd746fa50a8ff894 @@ -3893,6 +4608,82 @@ packages: license_family: BSD size: 13963441 timestamp: 1768136355974 +- conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.17.0-py311h9c22a71_0.conda + sha256: 687a5a457d163415d1802c876a8075f279947c1a931478fe5e31a67d4e69afdd + md5: 5a37e6e0b88c9fcfd1050ded185d07a1 + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - liblapack >=3.9.0,<4.0a0 + - numpy <2.7 + - numpy >=1.23,<3 + - numpy >=1.25.2 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + size: 15085719 + timestamp: 1768136780834 +- conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.17.0-py312h9b3c559_0.conda + sha256: 6f05352d921f1914f54c7805368842c07c116dee7ede90ed031a811d2a4efdcf + md5: b6edf419055109b566cd1e127dc81163 + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - liblapack >=3.9.0,<4.0a0 + - numpy <2.7 + - numpy >=1.23,<3 + - numpy >=1.25.2 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + size: 14944653 + timestamp: 1768137048439 +- conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.17.0-py313he51e9a2_0.conda + sha256: 1ee7142b35b5d0a9141735d04bba2ae02b5ee4f056b57774a7c1fd84cf0cd9da + md5: 94daca8e09c661a3445476c720fc3e6a + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - liblapack >=3.9.0,<4.0a0 + - numpy <2.7 + - numpy >=1.23,<3 + - numpy >=1.25.2 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + size: 15023367 + timestamp: 1768136974347 +- conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.17.0-py314h221f224_0.conda + sha256: 86f326841bdc05ac11e4e91d41003d0f1a6e9e2d90722eea171c345d373736cd + md5: fbed96dffff25b870c734c015a4a620e + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - liblapack >=3.9.0,<4.0a0 + - numpy <2.7 + - numpy >=1.23,<3 + - numpy >=1.25.2 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + size: 15104603 + timestamp: 1768136833397 - conda: https://conda.anaconda.org/conda-forge/noarch/sdkroot_env_osx-64-26.0-hda3c137_5.conda sha256: a8f7b6bec6772b9100713cc6e0f8d3d22b601e3a722be13ccf2465c2cab6cb3c md5: 9ba4c4f68b9817b7c81954cdc425a50d @@ -3978,6 +4769,18 @@ packages: license: NCSA size: 199699 timestamp: 1762535277608 +- conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.13.0-h3155e25_5.conda + sha256: d4ae2d8556fbbf48ce3e73105d4fa2d17c01207c3753b437f452d0859bb4edbc + md5: 65dea6d658cdf1a4edb27a3cc132d389 + depends: + - libhwloc >=2.12.2,<2.12.3.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: APACHE + size: 149643 + timestamp: 1767886812131 - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda sha256: 1544760538a40bcd8ace2b1d8ebe3eb5807ac268641f8acdc18c69c5ebfeaf64 md5: 86bc20552bf46075e3d92b67f089172d @@ -4011,12 +4814,75 @@ packages: license_family: BSD size: 3125484 timestamp: 1763055028377 +- conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda + sha256: 4581f4ffb432fefa1ac4f85c5682cc27014bcd66e7beaa0ee330e927a7858790 + md5: 7cb36e506a7dba4817970f8adb6396f9 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: TCL + license_family: BSD + size: 3472313 + timestamp: 1763055164278 - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda sha256: 1d30098909076af33a35017eed6f2953af1c769e273a0626a04722ac4acaba3c md5: ad659d0a2b3e47e38d829aa8cad2d610 license: LicenseRef-Public-Domain size: 119135 timestamp: 1767016325805 +- conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + sha256: 3005729dce6f3d3f5ec91dfc49fc75a0095f9cd23bab49efb899657297ac91a5 + md5: 71b24316859acd00bdb8b38f5e2ce328 + constrains: + - vc14_runtime >=14.29.30037 + - vs2015_runtime >=14.29.30037 + license: LicenseRef-MicrosoftWindowsSDK10 + size: 694692 + timestamp: 1756385147981 +- conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda + sha256: 9dc40c2610a6e6727d635c62cced5ef30b7b30123f5ef67d6139e23d21744b3a + md5: 1e610f2416b6acdd231c5f573d754a0f + depends: + - vc14_runtime >=14.44.35208 + track_features: + - vc14 + license: BSD-3-Clause + license_family: BSD + size: 19356 + timestamp: 1767320221521 +- conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda + sha256: 02732f953292cce179de9b633e74928037fa3741eb5ef91c3f8bae4f761d32a5 + md5: 37eb311485d2d8b2c419449582046a42 + depends: + - ucrt >=10.0.20348.0 + - vcomp14 14.44.35208 h818238b_34 + constrains: + - vs2015_runtime 14.44.35208.* *_34 + license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime + license_family: Proprietary + size: 683233 + timestamp: 1767320219644 +- conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda + sha256: 878d5d10318b119bd98ed3ed874bd467acbe21996e1d81597a1dbf8030ea0ce6 + md5: 242d9f25d2ae60c76b38a5e42858e51d + depends: + - ucrt >=10.0.20348.0 + constrains: + - vs2015_runtime 14.44.35208.* *_34 + license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime + license_family: Proprietary + size: 115235 + timestamp: 1767320173250 +- conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.44.35208-h38c0c73_34.conda + sha256: 63ff4ec6e5833f768d402f5e95e03497ce211ded5b6f492e660e2bfc726ad24d + md5: f276d1de4553e8fca1dfb6988551ebb4 + depends: + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + size: 19347 + timestamp: 1767320221943 - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda sha256: 1b34021e815ff89a4d902d879c3bd2040bc1bd6169b32e9427497fa05c55f1ce md5: 75cb7132eb58d97896e173ef12ac9986 @@ -4076,3 +4942,15 @@ packages: license_family: BSD size: 433413 timestamp: 1764777166076 +- conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda + sha256: 368d8628424966fd8f9c8018326a9c779e06913dd39e646cf331226acc90e5b2 + md5: 053b84beec00b71ea8ff7a4f84b55207 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 388453 + timestamp: 1764777142545 diff --git a/pixi.toml b/pixi.toml index cc37912..941bb00 100644 --- a/pixi.toml +++ b/pixi.toml @@ -1,7 +1,7 @@ [workspace] name = "build-pyoptsparse" channels = ["conda-forge"] -platforms = ["osx-arm64", "osx-64", "linux-64"] +platforms = ["osx-arm64", "osx-64", "linux-64", "win-64"] [dependencies] python = ">=3.10" @@ -12,7 +12,6 @@ meson = "*" ninja = "*" pip = ">=25.3,<26" pyoptsparse = "*" -compilers = ">=1.11.0,<2" [feature.py311.dependencies] python = "3.11.*" @@ -26,6 +25,15 @@ python = "3.13.*" [feature.py314.dependencies] python = "3.14.*" +[target.linux-64.dependencies] +compilers = ">=1.11.0,<2" + +[target.osx-64.dependencies] +compilers = ">=1.11.0,<2" + +[target.osx-arm64.dependencies] +compilers = ">=1.11.0,<2" + [environments] default = ["py313"] py311 = ["py311"] From 395748667f710f3c6a79b55d416e3909c81566dd Mon Sep 17 00:00:00 2001 From: Rob Falck Date: Thu, 15 Jan 2026 10:57:58 -0500 Subject: [PATCH 03/28] default to bash unless pwsh is specified --- .github/workflows/test_workflow_pixi.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.github/workflows/test_workflow_pixi.yml b/.github/workflows/test_workflow_pixi.yml index 141d215..934002d 100644 --- a/.github/workflows/test_workflow_pixi.yml +++ b/.github/workflows/test_workflow_pixi.yml @@ -25,6 +25,11 @@ on: required: false default: false +concurrency: + # Cancel any existing CI runs if we push to this branch + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + run-name: ${{ inputs.run_name }} jobs: @@ -41,6 +46,11 @@ jobs: runs-on: ${{ matrix.os }} + defaults: + run: + # Note this isn't passed to the composite action + shell: bash -l {0} + name: ${{ matrix.os }} / Python ${{ matrix.pixi-environment }} env: From 912c49f3ab3ef7d337cd65fcb883b357e502ff28 Mon Sep 17 00:00:00 2001 From: Rob Falck Date: Thu, 15 Jan 2026 11:10:26 -0500 Subject: [PATCH 04/28] install ifx from intel oneapi action --- .github/workflows/test_workflow_pixi.yml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/.github/workflows/test_workflow_pixi.yml b/.github/workflows/test_workflow_pixi.yml index 934002d..fb0de39 100644 --- a/.github/workflows/test_workflow_pixi.yml +++ b/.github/workflows/test_workflow_pixi.yml @@ -96,6 +96,12 @@ jobs: echo "=============================================================" pixi run --frozen -e ${{ matrix.pixi-environment }} pip install -e . + - name: Setup Intel Fortran Compiler (Windows) + if: runner.os == 'Windows' + uses: intel/setup-oneapi@v1 + with: + components: ifx + - name: Display environment run: | echo "=============================================================" @@ -104,13 +110,6 @@ jobs: pixi info pixi list -e ${{ matrix.pixi-environment }} - echo "=============================================================" - echo "Check Python, NumPy versions" - echo "=============================================================" - pixi run --frozen -e ${{ matrix.pixi-environment }} python -c "import sys; print(f'Python: {sys.version}')" - pixi run --frozen -e ${{ matrix.pixi-environment }} python -c "import numpy; print(f'NumPy: {numpy.__version__}')" - pixi run --frozen -e ${{ matrix.pixi-environment }} python -c "import pyoptsparse; print(f'pyoptsparse: {pyoptsparse.__version__}')" - - name: Copy SNOPT source files if: env.HAS_SNOPT_ACCESS == 'true' run: | From 11c075b99e610e68cc9636064788ee0f40fed025 Mon Sep 17 00:00:00 2001 From: Rob Falck Date: Thu, 15 Jan 2026 11:23:02 -0500 Subject: [PATCH 05/28] setup-fortran action on windows. --- .github/workflows/test_workflow_pixi.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test_workflow_pixi.yml b/.github/workflows/test_workflow_pixi.yml index fb0de39..dbb0cb4 100644 --- a/.github/workflows/test_workflow_pixi.yml +++ b/.github/workflows/test_workflow_pixi.yml @@ -96,11 +96,12 @@ jobs: echo "=============================================================" pixi run --frozen -e ${{ matrix.pixi-environment }} pip install -e . - - name: Setup Intel Fortran Compiler (Windows) - if: runner.os == 'Windows' - uses: intel/setup-oneapi@v1 + - uses: fortran-lang/setup-fortran@v1 + id: setup-fortran + if: env.HAS_SNOPT_ACCESS == 'true' && runner.os == 'Windows' with: - components: ifx + compiler: intel + version: latest - name: Display environment run: | From e0b10cd453282239d74303f15d9b04bda1e303de Mon Sep 17 00:00:00 2001 From: Rob Falck Date: Thu, 15 Jan 2026 11:32:06 -0500 Subject: [PATCH 06/28] ifx version --- .github/workflows/test_workflow_pixi.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test_workflow_pixi.yml b/.github/workflows/test_workflow_pixi.yml index dbb0cb4..f68eaa8 100644 --- a/.github/workflows/test_workflow_pixi.yml +++ b/.github/workflows/test_workflow_pixi.yml @@ -101,7 +101,7 @@ jobs: if: env.HAS_SNOPT_ACCESS == 'true' && runner.os == 'Windows' with: compiler: intel - version: latest + version: 2025.2 - name: Display environment run: | From 4e458a8c57526e0ca932853b533279fed6af6e00 Mon Sep 17 00:00:00 2001 From: Rob Falck Date: Thu, 15 Jan 2026 12:04:57 -0500 Subject: [PATCH 07/28] use cl for CC on windows --- .github/workflows/test_workflow_pixi.yml | 1 + build_pyoptsparse/snopt_module.py | 8 ++++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test_workflow_pixi.yml b/.github/workflows/test_workflow_pixi.yml index f68eaa8..523003e 100644 --- a/.github/workflows/test_workflow_pixi.yml +++ b/.github/workflows/test_workflow_pixi.yml @@ -125,6 +125,7 @@ jobs: if: env.HAS_SNOPT_ACCESS == 'true' env: FC: ${{ runner.os == 'Windows' && 'ifx' || 'gfortran' }} + CC: ${{ runner.os == 'Windows' && 'cl' || 'gcc' }} run: | echo "=============================================================" echo "Build SNOPT module with build_pyoptsparse" diff --git a/build_pyoptsparse/snopt_module.py b/build_pyoptsparse/snopt_module.py index 895894d..cf9550a 100644 --- a/build_pyoptsparse/snopt_module.py +++ b/build_pyoptsparse/snopt_module.py @@ -307,12 +307,16 @@ def create_meson_build_file(build_dir: Path | str, fc_id = fc.get_id() # Set compiler-specific flags for fixed-form Fortran -if fc_id == 'intel' or fc_id == 'intel-cl' +if fc_id == 'intel-cl' + # Intel on Windows - use Windows-style flags + fortran_flags = ['/fixed', '/extend-source:80'] +elif fc_id == 'intel' + # Intel on Linux/macOS - use Unix-style flags fortran_flags = ['-fixed', '-extend-source', '80'] elif fc_id == 'gcc' fortran_flags = ['-ffixed-form', '-ffixed-line-length-80'] else - fortran_flags = ['-ffixed-form', '-ffixed-line-length-80'] # Default to gfortran style + fortran_flags = ['-ffixed-form', '-ffixed-line-length-80'] endif py3.extension_module('snopt', From bbb45f2472da08216312ce4599fa323ce057bcab Mon Sep 17 00:00:00 2001 From: Rob Falck Date: Thu, 15 Jan 2026 12:14:37 -0500 Subject: [PATCH 08/28] debug --- build_pyoptsparse/snopt_module.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/build_pyoptsparse/snopt_module.py b/build_pyoptsparse/snopt_module.py index cf9550a..2f9eba0 100644 --- a/build_pyoptsparse/snopt_module.py +++ b/build_pyoptsparse/snopt_module.py @@ -305,20 +305,26 @@ def create_meson_build_file(build_dir: Path | str, fc = meson.get_compiler('fortran') fc_id = fc.get_id() +host_system = host_machine.system() # Set compiler-specific flags for fixed-form Fortran -if fc_id == 'intel-cl' +if host_system == 'windows' and (fc_id == 'intel' or fc_id == 'intel-cl') # Intel on Windows - use Windows-style flags fortran_flags = ['/fixed', '/extend-source:80'] -elif fc_id == 'intel' - # Intel on Linux/macOS - use Unix-style flags +elif fc_id == 'intel' or fc_id == 'intel-cl' + # Intel on Linux/macOS - use Unix-style flags fortran_flags = ['-fixed', '-extend-source', '80'] elif fc_id == 'gcc' fortran_flags = ['-ffixed-form', '-ffixed-line-length-80'] else + # Default to gfortran-style flags fortran_flags = ['-ffixed-form', '-ffixed-line-length-80'] endif +message('Fortran compiler ID: ' + fc_id) +message('Host system: ' + host_system) +message('Fortran flags: ' + ' '.join(fortran_flags)) + py3.extension_module('snopt', snopt_source, fortranobject_c, From 517124569475ddbf5a492cdde069c7da72beafda Mon Sep 17 00:00:00 2001 From: Rob Falck Date: Thu, 15 Jan 2026 12:28:19 -0500 Subject: [PATCH 09/28] meson windows update --- build_pyoptsparse/snopt_module.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build_pyoptsparse/snopt_module.py b/build_pyoptsparse/snopt_module.py index 2f9eba0..cffdba3 100644 --- a/build_pyoptsparse/snopt_module.py +++ b/build_pyoptsparse/snopt_module.py @@ -308,7 +308,7 @@ def create_meson_build_file(build_dir: Path | str, host_system = host_machine.system() # Set compiler-specific flags for fixed-form Fortran -if host_system == 'windows' and (fc_id == 'intel' or fc_id == 'intel-cl') +if host_system == 'windows' and (fc_id == 'intel' or fc_id == 'intel-cl' or fc_id == 'intel-llvm-cl') # Intel on Windows - use Windows-style flags fortran_flags = ['/fixed', '/extend-source:80'] elif fc_id == 'intel' or fc_id == 'intel-cl' From 9673bb02b60eb929bc1786fab0016852d56b83c1 Mon Sep 17 00:00:00 2001 From: Rob Falck Date: Thu, 15 Jan 2026 12:46:34 -0500 Subject: [PATCH 10/28] progress --- build_pyoptsparse/snopt_module.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build_pyoptsparse/snopt_module.py b/build_pyoptsparse/snopt_module.py index cffdba3..52d6037 100644 --- a/build_pyoptsparse/snopt_module.py +++ b/build_pyoptsparse/snopt_module.py @@ -310,7 +310,7 @@ def create_meson_build_file(build_dir: Path | str, # Set compiler-specific flags for fixed-form Fortran if host_system == 'windows' and (fc_id == 'intel' or fc_id == 'intel-cl' or fc_id == 'intel-llvm-cl') # Intel on Windows - use Windows-style flags - fortran_flags = ['/fixed', '/extend-source:80'] + fortran_flags = ['/fixed', '/extend-source:80', '/names:lowercase', '/assume:underscore'] elif fc_id == 'intel' or fc_id == 'intel-cl' # Intel on Linux/macOS - use Unix-style flags fortran_flags = ['-fixed', '-extend-source', '80'] From 7784c5c68abba2b33101222ccbfba0593ba47641 Mon Sep 17 00:00:00 2001 From: Rob Falck Date: Thu, 15 Jan 2026 13:16:59 -0500 Subject: [PATCH 11/28] set FC and CC when running test --- .github/workflows/test_workflow_pixi.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/test_workflow_pixi.yml b/.github/workflows/test_workflow_pixi.yml index 523003e..3b91273 100644 --- a/.github/workflows/test_workflow_pixi.yml +++ b/.github/workflows/test_workflow_pixi.yml @@ -161,6 +161,8 @@ jobs: Write-Host "Test SNOPT optimization" Write-Host "=============================================================" $env:SNOPT_SRC_PATH = "SNOPT/src" + $env:FC = "ifx" + $env:CC = "cl" Write-Host $PWD Get-ChildItem pixi run --frozen -e ${{ matrix.pixi-environment }} python -m unittest build_pyoptsparse/test/test_snopt_module.py From 78026c3c26a0e990b07a2c77bc5f6ffeaee32baa Mon Sep 17 00:00:00 2001 From: Rob Falck Date: Thu, 15 Jan 2026 13:18:16 -0500 Subject: [PATCH 12/28] lint --- .github/workflows/test_workflow_pixi.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test_workflow_pixi.yml b/.github/workflows/test_workflow_pixi.yml index 3b91273..94c1a94 100644 --- a/.github/workflows/test_workflow_pixi.yml +++ b/.github/workflows/test_workflow_pixi.yml @@ -152,6 +152,10 @@ jobs: if: env.HAS_SNOPT_ACCESS == 'true' && runner.os == 'Windows' shell: pwsh run: | + $env:SNOPT_SRC_PATH = "SNOPT/src" + $env:FC = "ifx" + $env:CC = "cl" + Write-Host "=============================================================" Write-Host "Test that SNOPT module can be imported" Write-Host "=============================================================" @@ -160,9 +164,6 @@ jobs: Write-Host "=============================================================" Write-Host "Test SNOPT optimization" Write-Host "=============================================================" - $env:SNOPT_SRC_PATH = "SNOPT/src" - $env:FC = "ifx" - $env:CC = "cl" Write-Host $PWD Get-ChildItem pixi run --frozen -e ${{ matrix.pixi-environment }} python -m unittest build_pyoptsparse/test/test_snopt_module.py From 0febb21333137607d4e92a95295d1d19f2b5ad94 Mon Sep 17 00:00:00 2001 From: Rob Falck Date: Thu, 15 Jan 2026 13:22:51 -0500 Subject: [PATCH 13/28] lint --- .github/workflows/test_workflow_pixi.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test_workflow_pixi.yml b/.github/workflows/test_workflow_pixi.yml index 94c1a94..0847e22 100644 --- a/.github/workflows/test_workflow_pixi.yml +++ b/.github/workflows/test_workflow_pixi.yml @@ -151,11 +151,10 @@ jobs: - name: Test SNOPT module (Windows) if: env.HAS_SNOPT_ACCESS == 'true' && runner.os == 'Windows' shell: pwsh + env: + FC: 'ifx' + CC: 'cl' run: | - $env:SNOPT_SRC_PATH = "SNOPT/src" - $env:FC = "ifx" - $env:CC = "cl" - Write-Host "=============================================================" Write-Host "Test that SNOPT module can be imported" Write-Host "=============================================================" From 5f1bc29ac83999096f5314a689ba6b672785e7d8 Mon Sep 17 00:00:00 2001 From: Rob Falck Date: Thu, 15 Jan 2026 13:27:37 -0500 Subject: [PATCH 14/28] lint --- .github/workflows/test_workflow_pixi.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/test_workflow_pixi.yml b/.github/workflows/test_workflow_pixi.yml index 0847e22..db4cc86 100644 --- a/.github/workflows/test_workflow_pixi.yml +++ b/.github/workflows/test_workflow_pixi.yml @@ -154,6 +154,7 @@ jobs: env: FC: 'ifx' CC: 'cl' + SNOPT_SRC_PATH: "SNOPT/src" run: | Write-Host "=============================================================" Write-Host "Test that SNOPT module can be imported" From b952b8b3936d7d11b7ea69727b85af236387116d Mon Sep 17 00:00:00 2001 From: Rob Falck Date: Thu, 15 Jan 2026 13:40:44 -0500 Subject: [PATCH 15/28] windows env fix, maybe. --- .github/workflows/test_workflow_pixi.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test_workflow_pixi.yml b/.github/workflows/test_workflow_pixi.yml index db4cc86..ef8768a 100644 --- a/.github/workflows/test_workflow_pixi.yml +++ b/.github/workflows/test_workflow_pixi.yml @@ -152,10 +152,13 @@ jobs: if: env.HAS_SNOPT_ACCESS == 'true' && runner.os == 'Windows' shell: pwsh env: - FC: 'ifx' - CC: 'cl' - SNOPT_SRC_PATH: "SNOPT/src" + FC: ifx + CC: cl + SNOPT_SRC_PATH: SNOPT/src run: | + # Add Intel compiler libraries to PATH + $env:PATH = "C:\Program Files (x86)\Intel\oneAPI\compiler\latest\bin;$env:PATH" + Write-Host "=============================================================" Write-Host "Test that SNOPT module can be imported" Write-Host "=============================================================" From dfbf06f76690997c5f92fab3333bd21875ff696c Mon Sep 17 00:00:00 2001 From: Rob Falck Date: Thu, 15 Jan 2026 14:01:18 -0500 Subject: [PATCH 16/28] debugging --- .github/workflows/test_workflow_pixi.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/.github/workflows/test_workflow_pixi.yml b/.github/workflows/test_workflow_pixi.yml index ef8768a..6751a06 100644 --- a/.github/workflows/test_workflow_pixi.yml +++ b/.github/workflows/test_workflow_pixi.yml @@ -159,6 +159,21 @@ jobs: # Add Intel compiler libraries to PATH $env:PATH = "C:\Program Files (x86)\Intel\oneAPI\compiler\latest\bin;$env:PATH" + # Check where SNOPT module was installed + Write-Host "Checking for SNOPT module installation..." + $pyoptPath = pixi run --frozen -e ${{ matrix.pixi-environment }} python -c "import pyoptsparse; print(pyoptsparse.__file__)" + Write-Host "pyoptsparse location: $pyoptPath" + + $snoptDir = Split-Path $pyoptPath | Join-Path -ChildPath "pySNOPT" + Write-Host "Expected SNOPT location: $snoptDir" + + if (Test-Path $snoptDir) { + Write-Host "Contents of pySNOPT directory:" + Get-ChildItem $snoptDir + } else { + Write-Host "pySNOPT directory not found!" + } + Write-Host "=============================================================" Write-Host "Test that SNOPT module can be imported" Write-Host "=============================================================" From 3473169d44a84750cde72b4cc26e9321832b5ca8 Mon Sep 17 00:00:00 2001 From: Rob Falck Date: Thu, 15 Jan 2026 14:12:08 -0500 Subject: [PATCH 17/28] try cmd instead of pwsh --- .github/workflows/test_workflow_pixi.yml | 36 ++++++------------------ 1 file changed, 9 insertions(+), 27 deletions(-) diff --git a/.github/workflows/test_workflow_pixi.yml b/.github/workflows/test_workflow_pixi.yml index 6751a06..a985bfc 100644 --- a/.github/workflows/test_workflow_pixi.yml +++ b/.github/workflows/test_workflow_pixi.yml @@ -150,40 +150,22 @@ jobs: - name: Test SNOPT module (Windows) if: env.HAS_SNOPT_ACCESS == 'true' && runner.os == 'Windows' - shell: pwsh + shell: cmd env: FC: ifx CC: cl SNOPT_SRC_PATH: SNOPT/src run: | - # Add Intel compiler libraries to PATH - $env:PATH = "C:\Program Files (x86)\Intel\oneAPI\compiler\latest\bin;$env:PATH" - - # Check where SNOPT module was installed - Write-Host "Checking for SNOPT module installation..." - $pyoptPath = pixi run --frozen -e ${{ matrix.pixi-environment }} python -c "import pyoptsparse; print(pyoptsparse.__file__)" - Write-Host "pyoptsparse location: $pyoptPath" - - $snoptDir = Split-Path $pyoptPath | Join-Path -ChildPath "pySNOPT" - Write-Host "Expected SNOPT location: $snoptDir" - - if (Test-Path $snoptDir) { - Write-Host "Contents of pySNOPT directory:" - Get-ChildItem $snoptDir - } else { - Write-Host "pySNOPT directory not found!" - } - - Write-Host "=============================================================" - Write-Host "Test that SNOPT module can be imported" - Write-Host "=============================================================" + call "C:\Program Files (x86)\Intel\oneAPI\setvars.bat" + + echo ============================================================= + echo Test that SNOPT module can be imported + echo ============================================================= pixi run --frozen -e ${{ matrix.pixi-environment }} python -c "from pyoptsparse import SNOPT; print('SNOPT loaded successfully!')" - Write-Host "=============================================================" - Write-Host "Test SNOPT optimization" - Write-Host "=============================================================" - Write-Host $PWD - Get-ChildItem + echo ============================================================= + echo Test SNOPT optimization + echo ============================================================= pixi run --frozen -e ${{ matrix.pixi-environment }} python -m unittest build_pyoptsparse/test/test_snopt_module.py # Enable tmate debugging of manually-triggered workflows if the input option was provided From 3f09cae9fb21464b9dff39d00b66beda5d3b9f42 Mon Sep 17 00:00:00 2001 From: Rob Falck Date: Thu, 15 Jan 2026 14:32:49 -0500 Subject: [PATCH 18/28] closer and closer --- .github/workflows/test_workflow_pixi.yml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/workflows/test_workflow_pixi.yml b/.github/workflows/test_workflow_pixi.yml index a985bfc..ae7d75f 100644 --- a/.github/workflows/test_workflow_pixi.yml +++ b/.github/workflows/test_workflow_pixi.yml @@ -151,17 +151,16 @@ jobs: - name: Test SNOPT module (Windows) if: env.HAS_SNOPT_ACCESS == 'true' && runner.os == 'Windows' shell: cmd - env: - FC: ifx - CC: cl - SNOPT_SRC_PATH: SNOPT/src run: | call "C:\Program Files (x86)\Intel\oneAPI\setvars.bat" + set FC=ifx + set CC=cl + set SNOPT_SRC_PATH=SNOPT\src echo ============================================================= echo Test that SNOPT module can be imported echo ============================================================= - pixi run --frozen -e ${{ matrix.pixi-environment }} python -c "from pyoptsparse import SNOPT; print('SNOPT loaded successfully!')" + pixi run --frozen -e ${{ matrix.pixi-environment }} python -c "from pyoptsparse import OPT; OPT('SNOOPT'); print('SNOPT loaded successfully!')" echo ============================================================= echo Test SNOPT optimization From fe8cc6856ea56619d1b9c0eb71075ac66dbc86d9 Mon Sep 17 00:00:00 2001 From: Rob Falck Date: Thu, 15 Jan 2026 14:39:25 -0500 Subject: [PATCH 19/28] debug --- .github/workflows/test_workflow_pixi.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test_workflow_pixi.yml b/.github/workflows/test_workflow_pixi.yml index ae7d75f..c68b4ef 100644 --- a/.github/workflows/test_workflow_pixi.yml +++ b/.github/workflows/test_workflow_pixi.yml @@ -160,7 +160,7 @@ jobs: echo ============================================================= echo Test that SNOPT module can be imported echo ============================================================= - pixi run --frozen -e ${{ matrix.pixi-environment }} python -c "from pyoptsparse import OPT; OPT('SNOOPT'); print('SNOPT loaded successfully!')" + pixi run --frozen -e ${{ matrix.pixi-environment }} python -c "from pyoptsparse import OPT; OPT('SNOPT'); print('SNOPT loaded successfully!')" echo ============================================================= echo Test SNOPT optimization From 200f8ad4ada6982819b3960aa3607f50ec43803f Mon Sep 17 00:00:00 2001 From: Rob Falck Date: Thu, 15 Jan 2026 14:43:58 -0500 Subject: [PATCH 20/28] debug --- .github/workflows/test_workflow_pixi.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/.github/workflows/test_workflow_pixi.yml b/.github/workflows/test_workflow_pixi.yml index c68b4ef..7def14c 100644 --- a/.github/workflows/test_workflow_pixi.yml +++ b/.github/workflows/test_workflow_pixi.yml @@ -157,6 +157,20 @@ jobs: set CC=cl set SNOPT_SRC_PATH=SNOPT\src + echo Current PATH: + echo %PATH% + echo. + + echo Checking for Intel Fortran runtime DLLs: + where libifcoremd.dll + where libmmd.dll + where svml_dispmd.dll + echo. + + echo Checking dependencies of snopt.pyd: + pixi run --frozen -e ${{ matrix.pixi-environment }} python -c "import os; print(os.environ.get('PATH', 'PATH not set'))" + echo. + echo ============================================================= echo Test that SNOPT module can be imported echo ============================================================= From d5c61b47d660ecbef8f88710fd2175f9df99ce7a Mon Sep 17 00:00:00 2001 From: Rob Falck Date: Thu, 15 Jan 2026 15:06:03 -0500 Subject: [PATCH 21/28] debug --- .github/workflows/test_workflow_pixi.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/test_workflow_pixi.yml b/.github/workflows/test_workflow_pixi.yml index 7def14c..a55b938 100644 --- a/.github/workflows/test_workflow_pixi.yml +++ b/.github/workflows/test_workflow_pixi.yml @@ -174,12 +174,13 @@ jobs: echo ============================================================= echo Test that SNOPT module can be imported echo ============================================================= - pixi run --frozen -e ${{ matrix.pixi-environment }} python -c "from pyoptsparse import OPT; OPT('SNOPT'); print('SNOPT loaded successfully!')" + echo Attempting to load snopt.pyd with detailed error info + pixi run --frozen -e ${{ matrix.pixi-environment }} python -c "import sys; import os; os.add_dll_directory('C:\\Program Files (x86)\\Intel\\oneAPI\\compiler\\latest\\bin'); from pyoptsparse import OPT; opt = OPT('SNOPT'); print('Success!')" - echo ============================================================= - echo Test SNOPT optimization - echo ============================================================= - pixi run --frozen -e ${{ matrix.pixi-environment }} python -m unittest build_pyoptsparse/test/test_snopt_module.py + # echo ============================================================= + # echo Test SNOPT optimization + # echo ============================================================= + # pixi run --frozen -e ${{ matrix.pixi-environment }} python -m unittest build_pyoptsparse/test/test_snopt_module.py # Enable tmate debugging of manually-triggered workflows if the input option was provided - name: Setup tmate session From cff7f154278e85de1b0e566cd4938095a323559b Mon Sep 17 00:00:00 2001 From: Rob Falck Date: Thu, 15 Jan 2026 15:31:47 -0500 Subject: [PATCH 22/28] debug --- .github/workflows/test_workflow_pixi.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test_workflow_pixi.yml b/.github/workflows/test_workflow_pixi.yml index a55b938..2ca25e8 100644 --- a/.github/workflows/test_workflow_pixi.yml +++ b/.github/workflows/test_workflow_pixi.yml @@ -177,10 +177,10 @@ jobs: echo Attempting to load snopt.pyd with detailed error info pixi run --frozen -e ${{ matrix.pixi-environment }} python -c "import sys; import os; os.add_dll_directory('C:\\Program Files (x86)\\Intel\\oneAPI\\compiler\\latest\\bin'); from pyoptsparse import OPT; opt = OPT('SNOPT'); print('Success!')" - # echo ============================================================= - # echo Test SNOPT optimization - # echo ============================================================= - # pixi run --frozen -e ${{ matrix.pixi-environment }} python -m unittest build_pyoptsparse/test/test_snopt_module.py + # echo ============================================================= + # echo Test SNOPT optimization + # echo ============================================================= + # pixi run --frozen -e ${{ matrix.pixi-environment }} python -m unittest build_pyoptsparse/test/test_snopt_module.py # Enable tmate debugging of manually-triggered workflows if the input option was provided - name: Setup tmate session From 9fb891cef38f149a4430b379acbb5596eafb72cf Mon Sep 17 00:00:00 2001 From: Rob Falck Date: Thu, 15 Jan 2026 15:47:53 -0500 Subject: [PATCH 23/28] set CONDA_DLL_SEARCH_MODIFICATION_ENABLE=1 to find ifort dlls on windows --- .github/workflows/test_workflow_pixi.yml | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test_workflow_pixi.yml b/.github/workflows/test_workflow_pixi.yml index 2ca25e8..a10df92 100644 --- a/.github/workflows/test_workflow_pixi.yml +++ b/.github/workflows/test_workflow_pixi.yml @@ -156,6 +156,7 @@ jobs: set FC=ifx set CC=cl set SNOPT_SRC_PATH=SNOPT\src + set CONDA_DLL_SEARCH_MODIFICATION_ENABLE=1 echo Current PATH: echo %PATH% @@ -176,11 +177,13 @@ jobs: echo ============================================================= echo Attempting to load snopt.pyd with detailed error info pixi run --frozen -e ${{ matrix.pixi-environment }} python -c "import sys; import os; os.add_dll_directory('C:\\Program Files (x86)\\Intel\\oneAPI\\compiler\\latest\\bin'); from pyoptsparse import OPT; opt = OPT('SNOPT'); print('Success!')" + pixi run --frozen -e ${{ matrix.pixi-environment }} python -c "from pyoptsparse import OPT; opt = OPT('SNOPT'); print('Success!')" - # echo ============================================================= - # echo Test SNOPT optimization - # echo ============================================================= - # pixi run --frozen -e ${{ matrix.pixi-environment }} python -m unittest build_pyoptsparse/test/test_snopt_module.py + echo ============================================================= + echo Test SNOPT optimization + echo ============================================================= + + pixi run --frozen -e ${{ matrix.pixi-environment }} python -m unittest build_pyoptsparse/test/test_snopt_module.py # Enable tmate debugging of manually-triggered workflows if the input option was provided - name: Setup tmate session From 4621476d8773583aa33714a89d34f04a31dd1f9e Mon Sep 17 00:00:00 2001 From: Rob Falck Date: Thu, 15 Jan 2026 16:08:27 -0500 Subject: [PATCH 24/28] Attempt to copy ifort dlls to same directory as pyd. Not ideal. --- .github/workflows/test_workflow_pixi.yml | 11 ++-- build_pyoptsparse/snopt_module.py | 64 ++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 7 deletions(-) diff --git a/.github/workflows/test_workflow_pixi.yml b/.github/workflows/test_workflow_pixi.yml index a10df92..2ca25e8 100644 --- a/.github/workflows/test_workflow_pixi.yml +++ b/.github/workflows/test_workflow_pixi.yml @@ -156,7 +156,6 @@ jobs: set FC=ifx set CC=cl set SNOPT_SRC_PATH=SNOPT\src - set CONDA_DLL_SEARCH_MODIFICATION_ENABLE=1 echo Current PATH: echo %PATH% @@ -177,13 +176,11 @@ jobs: echo ============================================================= echo Attempting to load snopt.pyd with detailed error info pixi run --frozen -e ${{ matrix.pixi-environment }} python -c "import sys; import os; os.add_dll_directory('C:\\Program Files (x86)\\Intel\\oneAPI\\compiler\\latest\\bin'); from pyoptsparse import OPT; opt = OPT('SNOPT'); print('Success!')" - pixi run --frozen -e ${{ matrix.pixi-environment }} python -c "from pyoptsparse import OPT; opt = OPT('SNOPT'); print('Success!')" - echo ============================================================= - echo Test SNOPT optimization - echo ============================================================= - - pixi run --frozen -e ${{ matrix.pixi-environment }} python -m unittest build_pyoptsparse/test/test_snopt_module.py + # echo ============================================================= + # echo Test SNOPT optimization + # echo ============================================================= + # pixi run --frozen -e ${{ matrix.pixi-environment }} python -m unittest build_pyoptsparse/test/test_snopt_module.py # Enable tmate debugging of manually-triggered workflows if the input option was provided - name: Setup tmate session diff --git a/build_pyoptsparse/snopt_module.py b/build_pyoptsparse/snopt_module.py index 52d6037..25c44d1 100644 --- a/build_pyoptsparse/snopt_module.py +++ b/build_pyoptsparse/snopt_module.py @@ -417,6 +417,64 @@ def find_built_module(build_dir): return None +def copy_intel_runtime_dlls(output_dir): + """Copy Intel Fortran runtime DLLs to output directory on Windows.""" + # Intel runtime DLLs needed by ifx-compiled code + required_dlls = [ + 'libifcoremd.dll', + 'libmmd.dll', + 'svml_dispmd.dll', + 'libiompstubs5md.dll', + ] + + # Find Intel compiler bin directory from PATH or known locations + intel_bin_dir = None + + # Check PATH first + path_dirs = os.environ.get('PATH', '').split(os.pathsep) + for path_dir in path_dirs: + if 'Intel' in path_dir and 'compiler' in path_dir and 'bin' in path_dir: + test_path = Path(path_dir) + if test_path.exists() and (test_path / 'libifcoremd.dll').exists(): + intel_bin_dir = test_path + break + + # Fallback to known locations + if not intel_bin_dir: + known_paths = [ + Path(r"C:\Program Files (x86)\Intel\oneAPI\compiler\latest\bin"), + Path(r"C:\Program Files (x86)\Intel\oneAPI\compiler\2025.2\bin"), + Path(r"C:\Program Files (x86)\Intel\oneAPI\compiler\2024.2\bin"), + ] + for path in known_paths: + if path.exists() and (path / 'libifcoremd.dll').exists(): + intel_bin_dir = path + break + + if not intel_bin_dir: + print("\nWarning: Could not find Intel runtime DLLs.") + print("The SNOPT module may not work unless Intel oneAPI is in the system PATH.") + return + + print(f"\nCopying Intel runtime DLLs from {intel_bin_dir}") + copied = [] + for dll in required_dlls: + src = intel_bin_dir / dll + if src.exists(): + dest = output_dir / dll + try: + shutil.copy2(src, dest) + copied.append(dll) + print(f" Copied {dll}") + except Exception as e: + print(f" Warning: Could not copy {dll}: {e}") + + if copied: + print(f"\nSuccessfully copied {len(copied)} Intel runtime DLLs") + print("SNOPT module should now work without requiring Intel oneAPI in PATH") + else: + print("\nWarning: No Intel runtime DLLs were copied") + def install_module(module_path, output_dir): """Copy the built module to the output directory.""" @@ -426,6 +484,12 @@ def install_module(module_path, output_dir): dest_file = output_path / module_path.name shutil.copy2(module_path, dest_file) + # On Windows with Intel compiler, copy runtime DLLs next to the .pyd + if platform.system() == 'Windows': + fc_compiler = os.environ.get('FC', '').lower() + if 'ifx' in fc_compiler or 'ifort' in fc_compiler: + copy_intel_runtime_dlls(output_path) + print(f"\nInstalled SNOPT module to: {dest_file}") return dest_file From efac9f765edc03bcd3e3a98f9e34513a43960b05 Mon Sep 17 00:00:00 2001 From: Rob Falck Date: Thu, 15 Jan 2026 16:17:03 -0500 Subject: [PATCH 25/28] no add_dll_directory --- .github/workflows/test_workflow_pixi.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test_workflow_pixi.yml b/.github/workflows/test_workflow_pixi.yml index 2ca25e8..e126465 100644 --- a/.github/workflows/test_workflow_pixi.yml +++ b/.github/workflows/test_workflow_pixi.yml @@ -175,7 +175,7 @@ jobs: echo Test that SNOPT module can be imported echo ============================================================= echo Attempting to load snopt.pyd with detailed error info - pixi run --frozen -e ${{ matrix.pixi-environment }} python -c "import sys; import os; os.add_dll_directory('C:\\Program Files (x86)\\Intel\\oneAPI\\compiler\\latest\\bin'); from pyoptsparse import OPT; opt = OPT('SNOPT'); print('Success!')" + pixi run --frozen -e ${{ matrix.pixi-environment }} python -c "from pyoptsparse import OPT; opt = OPT('SNOPT'); print('Success!')" # echo ============================================================= # echo Test SNOPT optimization From 390655101dd289d6579d98a9a84a3c4876c04eaf Mon Sep 17 00:00:00 2001 From: Rob Falck Date: Thu, 15 Jan 2026 16:21:56 -0500 Subject: [PATCH 26/28] copied dlls seem to be working, enable optimization test. --- .github/workflows/test_workflow_pixi.yml | 27 ++++-------------------- 1 file changed, 4 insertions(+), 23 deletions(-) diff --git a/.github/workflows/test_workflow_pixi.yml b/.github/workflows/test_workflow_pixi.yml index e126465..a234516 100644 --- a/.github/workflows/test_workflow_pixi.yml +++ b/.github/workflows/test_workflow_pixi.yml @@ -152,35 +152,16 @@ jobs: if: env.HAS_SNOPT_ACCESS == 'true' && runner.os == 'Windows' shell: cmd run: | - call "C:\Program Files (x86)\Intel\oneAPI\setvars.bat" - set FC=ifx - set CC=cl - set SNOPT_SRC_PATH=SNOPT\src - - echo Current PATH: - echo %PATH% - echo. - - echo Checking for Intel Fortran runtime DLLs: - where libifcoremd.dll - where libmmd.dll - where svml_dispmd.dll - echo. - - echo Checking dependencies of snopt.pyd: - pixi run --frozen -e ${{ matrix.pixi-environment }} python -c "import os; print(os.environ.get('PATH', 'PATH not set'))" - echo. - echo ============================================================= echo Test that SNOPT module can be imported echo ============================================================= echo Attempting to load snopt.pyd with detailed error info pixi run --frozen -e ${{ matrix.pixi-environment }} python -c "from pyoptsparse import OPT; opt = OPT('SNOPT'); print('Success!')" - # echo ============================================================= - # echo Test SNOPT optimization - # echo ============================================================= - # pixi run --frozen -e ${{ matrix.pixi-environment }} python -m unittest build_pyoptsparse/test/test_snopt_module.py + echo ============================================================= + echo Test SNOPT optimization + echo ============================================================= + pixi run --frozen -e ${{ matrix.pixi-environment }} python -m unittest build_pyoptsparse/test/test_snopt_module.py # Enable tmate debugging of manually-triggered workflows if the input option was provided - name: Setup tmate session From 5c9c9e3404dad38c5f372500a0af75c6639703bc Mon Sep 17 00:00:00 2001 From: Rob Falck Date: Thu, 15 Jan 2026 16:27:40 -0500 Subject: [PATCH 27/28] optimization runs incorrectly. --- build_pyoptsparse/test/test_snopt_module.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/build_pyoptsparse/test/test_snopt_module.py b/build_pyoptsparse/test/test_snopt_module.py index 71f8862..f5e4d68 100644 --- a/build_pyoptsparse/test/test_snopt_module.py +++ b/build_pyoptsparse/test/test_snopt_module.py @@ -101,8 +101,10 @@ def sens(xdict, funcs): # Solution sol = opt(optProb, sens=sens) - self.assertEqual(sol.optInform.value, 1) + print(sol) + self.assertEqual(sol.optInform.value, 1) + assert_almost_equal(sol.fStar, 17.014, decimal=2) if __name__ == '__main__': unittest.main() From cd42d4face72277f42345dba07f7de9de636c335 Mon Sep 17 00:00:00 2001 From: Rob Falck Date: Thu, 15 Jan 2026 18:59:47 -0500 Subject: [PATCH 28/28] less verbosity --- build_pyoptsparse/test/test_snopt_module.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/build_pyoptsparse/test/test_snopt_module.py b/build_pyoptsparse/test/test_snopt_module.py index f5e4d68..37134cc 100644 --- a/build_pyoptsparse/test/test_snopt_module.py +++ b/build_pyoptsparse/test/test_snopt_module.py @@ -92,17 +92,12 @@ def sens(xdict, funcs): # Objective optProb.addObj("obj") - # Check optimization problem: - print(optProb) - # Optimizer opt = OPT('SNOPT') # Solution sol = opt(optProb, sens=sens) - print(sol) - self.assertEqual(sol.optInform.value, 1) assert_almost_equal(sol.fStar, 17.014, decimal=2)