diff --git a/.github/dependabot.yml b/.github/dependabot.yml index b49ab4d..5ace460 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -4,8 +4,3 @@ updates: directory: "/" schedule: interval: "weekly" - - - package-ecosystem: "pip" - directory: "/tests" - schedule: - interval: "weekly" diff --git a/.github/workflows/build-test.yml b/.github/workflows/build-test.yml index d5e5e37..51311bf 100644 --- a/.github/workflows/build-test.yml +++ b/.github/workflows/build-test.yml @@ -22,10 +22,6 @@ on: type: string default: '' required: false - deps-kind: - type: string - default: '' - required: false cache-build: type: boolean default: true @@ -56,15 +52,6 @@ on: default: '' required: false description: Build this OpenFOAM Git branch - deps-kind: - type: choice - required: false - description: Bundle dependencies in this manner - options: - - '' - - standalone - - bundled - - homebrew cache-build: type: boolean default: true @@ -73,92 +60,44 @@ on: env: MAKE_VARS: > - ${{ inputs.openfoam-version != '' && format('OPENFOAM_VERSION={0}', inputs.openfoam-version) || '' }} + ${{ inputs.openfoam-version != '' && format('OPENFOAM_VERSION={0} OPENFOAM_TARBALL_URL=https://raw.githubusercontent.com/gerlero/openfoam-tarballs/refs/heads/main/OpenFOAM-v{0}.tgz', inputs.openfoam-version) || '' }} ${{ inputs.app-version != '' && format('APP_VERSION={0}', inputs.app-version) || '' }} ${{ inputs.app-name != '' && format('APP_NAME={0}', inputs.app-name) || '' }} ${{ inputs.openfoam-git-branch != '' && format('OPENFOAM_GIT_BRANCH={0}', inputs.openfoam-git-branch) || '' }} - ${{ inputs.deps-kind != '' && format('DEPS_KIND={0}', inputs.deps-kind) || '' }} OPENFOAM: ${{ inputs.openfoam-version || inputs.openfoam-git-branch }} jobs: - deps: + build: runs-on: ${{ inputs.build-os }} - outputs: - deps-key: ${{ steps.keys.outputs.deps-key }} - build-key: ${{ steps.keys.outputs.build-key }} steps: - - name: Use Xcode Command Line Tools - run: sudo xcode-select --switch /Library/Developer/CommandLineTools - name: Checkout uses: actions/checkout@v4 + - name: Set up Pixi + uses: prefix-dev/setup-pixi@v0.8.14 - name: Prepare caching run: | - make deps --dry-run ${{ env.MAKE_VARS }} > make_deps.txt - make build --dry-run ${{ env.MAKE_VARS }} > make_build.txt - brew update - brew bundle list | xargs -I {} sh -c 'brew info {} | head -n 1' > brew_versions.txt - brew deps --union $(brew bundle list) | xargs -I {} sh -c 'brew info {} | head -n 1' >> brew_versions.txt - sort -u -o brew_versions.txt brew_versions.txt - cat brew_versions.txt - - name: Generate caching keys - id: keys - run: | - deps_key="build-${{ env.OPENFOAM }}-${{ inputs.build-os }}-${{ hashFiles('make_deps.txt', 'Brewfile', 'scripts/bundle_deps.py', 'brew_versions.txt') }}" - build_key="$deps_key-${{ hashFiles('make_build.txt', 'scripts/configure.sh', 'scripts/relativize_install_names.py') }}" - echo "deps-key=$deps_key" >> "$GITHUB_OUTPUT" - echo "build-key=$build_key" >> "$GITHUB_OUTPUT" - - name: Look up cached deps + pixi run make build --dry-run ${{ env.MAKE_VARS }} > make_build.txt + - name: Restore cached build id: cache uses: actions/cache/restore@v4 with: path: build/*.sparsebundle - key: ${{ steps.keys.outputs.build-key }} - restore-keys: ${{ steps.keys.outputs.deps-key }} - lookup-only: true - - name: Make deps - if: steps.cache.outputs.cache-matched-key == '' - run: | - make deps ${{ env.MAKE_VARS }} - - name: Save deps to cache - if: steps.cache.outputs.cache-matched-key == '' - uses: actions/cache/save@v4 - with: - path: build/*.sparsebundle - key: ${{ steps.keys.outputs.deps-key }} - - build: - needs: deps - runs-on: ${{ inputs.build-os }} - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Restore cached build or deps - id: cache - uses: actions/cache/restore@v4 - with: - path: build/*.sparsebundle - key: ${{ needs.deps.outputs.build-key }} - restore-keys: | - ${{ needs.deps.outputs.deps-key }} - fail-on-cache-miss: true + key: build-${{ env.OPENFOAM }}-${{ runner.arch }}-${{ hashFiles('make_build.txt', 'pixi.lock', 'configure.sh') }} - name: Build if: steps.cache.outputs.cache-hit != 'true' run: | - hdiutil attach build/*.sparsebundle - make --touch deps ${{ env.MAKE_VARS }} - make build ${{ env.MAKE_VARS }} + pixi run make build ${{ env.MAKE_VARS }} - name: Save build to cache if: steps.cache.outputs.cache-hit != 'true' && inputs.cache-build uses: actions/cache/save@v4 with: path: build/*.sparsebundle - key: ${{ needs.deps.outputs.build-key }} + key: ${{ steps.cache.outputs.cache-primary-key }} - name: Make app run: | - hdiutil attach build/*.sparsebundle - make --touch build ${{ env.MAKE_VARS }} - make zip ${{ env.MAKE_VARS }} + touch -c build/*.sparsebundle + pixi run make zip ${{ env.MAKE_VARS }} - name: Upload app artifact uses: actions/upload-artifact@v4 with: @@ -170,9 +109,8 @@ jobs: needs: build strategy: matrix: - os: [macos-12, macos-13, macos-14, macos-15] + os: [macos-13, macos-14, macos-15] exclude: - - os: ${{ inputs.build-os == 'macos-14' && 'macos-12' || ''}} - os: ${{ inputs.build-os == 'macos-14' && 'macos-13' || ''}} - os: ${{ inputs.build-os != 'macos-14' && 'macos-14' || ''}} - os: ${{ inputs.build-os != 'macos-14' && 'macos-15' || ''}} @@ -181,15 +119,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.x' - cache: pip - - name: Install Homebrew dependencies - if: inputs.deps-kind == 'homebrew' - run: | - brew bundle + - name: Set up Pixi + uses: prefix-dev/setup-pixi@v0.8.14 - name: Download app artifact uses: actions/download-artifact@v4 with: @@ -201,6 +132,6 @@ jobs: working-directory: build - name: Test run: | - make test ${{ env.MAKE_VARS }} + pixi run make test ${{ env.MAKE_VARS }} env: PRTE_MCA_rmaps_default_mapping_policy: ':oversubscribe' diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1607181..a803576 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,8 +7,6 @@ on: pull_request: branches: - main - schedule: - - cron: '0 6 * * 5' workflow_call: inputs: app-version: @@ -16,15 +14,6 @@ on: required: true workflow_dispatch: inputs: - deps-kind: - type: choice - required: false - description: Bundle dependencies in this manner - options: - - '' - - standalone - - bundled - - homebrew cache-build: type: boolean default: true @@ -35,13 +24,12 @@ jobs: ci: strategy: matrix: - build-os: [macos-14, macos-12] - openfoam-version: [2406, 2312] + build-os: [macos-14, macos-13] + openfoam-version: [2506, 2412] fail-fast: false uses: ./.github/workflows/build-test.yml with: build-os: ${{ matrix.build-os }} openfoam-version: ${{ matrix.openfoam-version }} app-version: ${{ inputs.app-version }} - deps-kind: ${{ inputs.deps-kind }} cache-build: ${{ github.event_name == 'workflow_dispatch' && inputs.cache-build || github.event_name != 'workflow_dispatch' }} diff --git a/.github/workflows/openfoam-dev-branches.yml b/.github/workflows/openfoam-dev-branches.yml index a49c95a..4521104 100644 --- a/.github/workflows/openfoam-dev-branches.yml +++ b/.github/workflows/openfoam-dev-branches.yml @@ -4,22 +4,12 @@ on: schedule: - cron: '0 6 * * 5' workflow_dispatch: - inputs: - deps-kind: - type: choice - required: false - description: Bundle dependencies in this manner - options: - - '' - - standalone - - bundled - - homebrew jobs: openfoam-dev-branch: strategy: matrix: - build-os: [macos-14, macos-12] + build-os: [macos-14, macos-13] openfoam-git-branch: [master, develop] fail-fast: false uses: ./.github/workflows/build-test.yml @@ -28,5 +18,4 @@ jobs: app-name: OpenFOAM-${{ matrix.openfoam-git-branch }} app-version: ${{ matrix.openfoam-git-branch }} openfoam-git-branch: ${{ matrix.openfoam-git-branch }} - deps-kind: ${{ inputs.deps-kind }} cache-build: false diff --git a/.github/workflows/update-lockfiles.yml b/.github/workflows/update-lockfiles.yml new file mode 100644 index 0000000..6a18d0e --- /dev/null +++ b/.github/workflows/update-lockfiles.yml @@ -0,0 +1,36 @@ +name: Update lockfiles + +permissions: + contents: write + pull-requests: write + +on: + workflow_dispatch: + schedule: + - cron: 0 5 1 * * + +jobs: + pixi-update: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Set up pixi + uses: prefix-dev/setup-pixi@v0.8.14 + with: + run-install: false + - name: Update lockfiles + run: | + set -o pipefail + pixi update --json | pixi exec pixi-diff-to-markdown >> diff.md + - name: Create pull request + uses: peter-evans/create-pull-request@v7 + with: + token: ${{ secrets.GITHUB_TOKEN }} + commit-message: Update pixi lockfile + title: Update pixi lockfile + body-path: diff.md + branch: update-pixi + base: main + labels: pixi + delete-branch: true + add-paths: pixi.lock diff --git a/.gitignore b/.gitignore index 00dfb09..fbe76e1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ /build -Brewfile.lock.json *.tgz +.pixi +/environment.tar +__pycache__ .DS_Store -venv diff --git a/Brewfile b/Brewfile deleted file mode 100644 index 43847fa..0000000 --- a/Brewfile +++ /dev/null @@ -1,17 +0,0 @@ -# Required dependencies -brew "open-mpi" -brew "libomp" - -# Optional dependencies (enabled by default) -brew "boost" -brew "cgal" -brew "fftw" -brew "kahip" -brew "metis" -brew "scotch" - -# Optional dependencies (uncomment to enable) -# brew "adios2" - -# Optional tools -brew "bash" diff --git a/Contents/Info.plist b/Contents/Info.plist deleted file mode 100644 index e28ff69..0000000 --- a/Contents/Info.plist +++ /dev/null @@ -1,14 +0,0 @@ - - - - - CFBundleExecutable - launch - CFBundleIconFile - icon.icns - CFBundleVersion - {{app_version}}-{{deps_kind}}-{{arch}} - CFBundleShortVersionString - {{app_version}} - - diff --git a/Contents/MacOS/bashrc b/Contents/MacOS/bashrc deleted file mode 120000 index 194e31c..0000000 --- a/Contents/MacOS/bashrc +++ /dev/null @@ -1 +0,0 @@ -../Resources/etc/bashrc \ No newline at end of file diff --git a/Contents/MacOS/openfoam b/Contents/MacOS/openfoam deleted file mode 120000 index 4887b1b..0000000 --- a/Contents/MacOS/openfoam +++ /dev/null @@ -1 +0,0 @@ -../Resources/etc/openfoam \ No newline at end of file diff --git a/Contents/Resources/etc/openfoam b/Contents/Resources/etc/openfoam index 0d28a2e..e648e28 100755 --- a/Contents/Resources/etc/openfoam +++ b/Contents/Resources/etc/openfoam @@ -10,7 +10,7 @@ if [ $# -eq 0 ]; then echo " ( ) | °°° $app_name.app °°° " 1>&2 echo " ( ) ( ) | " 1>&2 echo " ( ) | Native OpenFOAM for macOS " 1>&2 - echo " | {{APP_HOMEPAGE}} " 1>&2 + echo " | {{app_homepage}} " 1>&2 echo "---------------------------------------------------------------------------" 1>&2 "$app_bundle/Contents/Resources/volume" mount 1>&2 @@ -25,4 +25,4 @@ volume=$("$app_bundle/Contents/Resources/volume" -show-prefix) # Keep the volume directory open in this process (prevents accidental ejection) exec {fd}<"$volume" -PATH="$volume/usr/opt/bash/bin${PATH+:$PATH}" exec bash "$volume/etc/openfoam" "$@" +PATH="$volume/env/bin${PATH+:$PATH}" exec bash "$volume/etc/openfoam" "$@" diff --git a/Makefile b/Makefile index 6dc92ed..2bd4476 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ # Build configuration SHELL = /bin/bash -OPENFOAM_VERSION = 2406 +OPENFOAM_VERSION = 2506 APP_NAME = OpenFOAM-v$(OPENFOAM_VERSION) ifeq ($(OPENFOAM_VERSION),2112) @@ -16,7 +16,6 @@ OPENFOAM_GIT_REPO_URL = https://develop.openfoam.com/Development/openfoam.git OPENFOAM_GIT_BRANCH = VOLUME_FILESYSTEM = 'Case-sensitive APFS' WMAKE_NJOBS = -DEPS_KIND = standalone DMG_FORMAT = UDRO APP_HOMEPAGE = https://github.com/gerlero/openfoam-app APP_VERSION = @@ -31,23 +30,11 @@ volume = /Volumes/$(APP_NAME) # Build targets -app: | $(volume) - $(MAKE) build/$(APP_NAME).app - [ ! -d $(volume) ] || hdiutil detach $(volume) -build: | $(volume) - $(MAKE) $(volume)/platforms - [ ! -d $(volume) ] || hdiutil detach $(volume) -deps: | $(volume) - $(MAKE) $(volume)/Brewfile.lock.json - [ ! -d $(volume) ] || hdiutil detach $(volume) +app: build/$(APP_NAME).app +build: build/$(APP_NAME)-build.sparsebundle fetch-source: $(openfoam_tarball) -zip: | $(volume) - $(MAKE) build/$(DIST_NAME).zip - [ ! -d $(volume) ] || hdiutil detach $(volume) - -install: | $(volume) - $(MAKE) $(INSTALL_DIR)/$(APP_NAME).app - [ ! -d $(volume) ] || hdiutil detach $(volume) +zip: build/$(DIST_NAME).zip +install: $(INSTALL_DIR)/$(APP_NAME).app # Build rules @@ -55,15 +42,12 @@ volume_id_file = $(volume)/.vol_id app_contents = \ build/$(APP_NAME).app/Contents/Info.plist \ - build/$(APP_NAME).app/Contents/MacOS/launch \ build/$(APP_NAME).app/Contents/Resources/etc/openfoam \ build/$(APP_NAME).app/Contents/Resources/etc/bashrc \ build/$(APP_NAME).app/Contents/Resources/LICENSE \ build/$(APP_NAME).app/Contents/Resources/icon.icns \ build/$(APP_NAME).app/Contents/Resources/volume \ - build/$(APP_NAME).app/Contents/Resources/$(APP_NAME).dmg \ - build/$(APP_NAME).app/Contents/MacOS/openfoam \ - build/$(APP_NAME).app/Contents/MacOS/bashrc + build/$(APP_NAME).app/Contents/Resources/$(APP_NAME).dmg $(INSTALL_DIR)/$(APP_NAME).app: build/$(APP_NAME).app cp -r build/$(APP_NAME).app $(INSTALL_DIR)/ @@ -73,21 +57,26 @@ build/$(DIST_NAME).zip: build/$(APP_NAME).app shasum -a 256 build/$(DIST_NAME).zip build/$(APP_NAME).app: $(app_contents) + xattr -c -r $@ + codesign --force --deep --sign - $@ -build/$(APP_NAME).app/Contents/Info.plist: Contents/Info.plist | build/$(APP_NAME).app/Contents/MacOS/launch build/$(APP_NAME).app/Contents/Resources/icon.icns - mkdir -p build/$(APP_NAME).app/Contents - cp Contents/Info.plist build/$(APP_NAME).app/Contents/ - sed -i '' "s|{{app_version}}|$(APP_VERSION)|g" build/$(APP_NAME).app/Contents/Info.plist - sed -i '' "s|{{deps_kind}}|$(DEPS_KIND)|g" build/$(APP_NAME).app/Contents/Info.plist - sed -i '' "s|{{arch}}|$(shell uname -m)|g" build/$(APP_NAME).app/Contents/Info.plist - -build/$(APP_NAME).app/Contents/Resources/etc/openfoam: Contents/Resources/etc/openfoam | build/$(APP_NAME).app/Contents/Resources/volume +build/$(APP_NAME).app/Contents/Info.plist: + rm -rf build/$(APP_NAME).app + mkdir -p build + osacompile -o build/$(APP_NAME).app launch.applescript + plutil -replace CFBundleDevelopmentRegion -string "en" $@ + plutil -insert CFBundleVersion -string "$(APP_VERSION)-$(DEPENDENCIES_KIND)-$(shell uname -m)" $@ + plutil -insert CFBundleShortVersionString -string "$(APP_VERSION)" $@ + plutil -replace CFBundleIconFile -string "icon.icns" $@ + rm build/$(APP_NAME).app/Contents/Resources/applet.icns + +build/$(APP_NAME).app/Contents/Resources/etc/openfoam: Contents/Resources/etc/openfoam | build/$(APP_NAME).app/Contents/Info.plist mkdir -p build/$(APP_NAME).app/Contents/Resources/etc cp Contents/Resources/etc/openfoam build/$(APP_NAME).app/Contents/Resources/etc/ sed -i '' "s|{{app_name}}|$(APP_NAME)|g" build/$(APP_NAME).app/Contents/Resources/etc/openfoam sed -i '' "s|{{app_homepage}}|$(APP_HOMEPAGE)|g" build/$(APP_NAME).app/Contents/Resources/etc/openfoam -build/$(APP_NAME).app/Contents/Resources/volume: Contents/Resources/volume build/$(APP_NAME).app/Contents/Resources/$(APP_NAME).dmg +build/$(APP_NAME).app/Contents/Resources/volume: Contents/Resources/volume build/$(APP_NAME).app/Contents/Resources/$(APP_NAME).dmg | build/$(APP_NAME).app/Contents/Info.plist mkdir -p build/$(APP_NAME).app/Contents/Resources cp Contents/Resources/volume build/$(APP_NAME).app/Contents/Resources/ [ ! -d $(volume) ] || hdiutil detach $(volume) @@ -97,7 +86,7 @@ build/$(APP_NAME).app/Contents/Resources/volume: Contents/Resources/volume build sed -i '' "s|{{volume_id}}|$$(cat $(volume_id_file))|g" build/$(APP_NAME).app/Contents/Resources/volume hdiutil detach $(volume) -build/$(APP_NAME).app/Contents/Resources/LICENSE: LICENSE +build/$(APP_NAME).app/Contents/Resources/LICENSE: LICENSE | build/$(APP_NAME).app/Contents/Info.plist mkdir -p build/$(APP_NAME).app/Contents/Resources cp LICENSE build/$(APP_NAME).app/Contents/Resources/ @@ -105,7 +94,7 @@ build/$(APP_NAME).app/Contents/%: Contents/% mkdir -p $(@D) cp -a $< $@ -build/$(APP_NAME).app/Contents/Resources/$(APP_NAME).dmg: $(volume)/platforms Contents/Resources/icon.icns +build/$(APP_NAME).app/Contents/Resources/$(APP_NAME).dmg: build/$(APP_NAME)-build.sparsebundle Contents/Resources/icon.icns [ ! -d $(volume) ] || hdiutil detach $(volume) rm -f build/$(APP_NAME)-build.sparsebundle.shadow hdiutil attach \ @@ -116,10 +105,6 @@ build/$(APP_NAME).app/Contents/Resources/$(APP_NAME).dmg: $(volume)/platforms Co SetFile -a C $(volume) uuidgen > $(volume_id_file) cat $(volume_id_file) - rm -rf $(volume)/homebrew - [ -L $(volume)/usr ] || rm -f $(volume)/usr/bin/brew - rm $(volume)/Brewfile - rm $(volume)/Brewfile.lock.json rm -rf $(volume)/build rm -rf $(volume)/**/.git rm -f $(volume)/**/.DS_Store @@ -135,16 +120,17 @@ build/$(APP_NAME).app/Contents/Resources/$(APP_NAME).dmg: $(volume)/platforms Co hdiutil detach $(volume) rm build/$(APP_NAME)-build.sparsebundle.shadow -$(volume)/platforms: $(volume)/etc/prefs.sh $(volume)/Brewfile.lock.json scripts/relativize_install_names.py - cd $(volume) \ - && source etc/bashrc \ - && foamSystemCheck \ - && ( ./Allwmake -j $(WMAKE_NJOBS) -s -q -k || true ) \ - && ./Allwmake -j $(WMAKE_NJOBS) -s - cd $(volume) && "$(CURDIR)/scripts/relativize_install_names.py" - -$(volume)/etc/prefs.sh: $(openfoam_tarball) scripts/configure.sh | $(volume) - rm -rf $(volume)/etc +build/$(APP_NAME)-build.sparsebundle: $(openfoam_tarball) environment.tar configure.sh + [ ! -d $(volume) ] || hdiutil detach $(volume) + rm -f build/$(APP_NAME)-build.sparsebundle.shadow + mkdir -p build + hdiutil create \ + -size 50g \ + -fs $(VOLUME_FILESYSTEM) \ + -volname $(APP_NAME) \ + build/$(APP_NAME)-build.sparsebundle \ + -ov + hdiutil attach build/$(APP_NAME)-build.sparsebundle ifdef openfoam_tarball tar -xzf $(openfoam_tarball) --strip-components 1 -C $(volume) else ifdef OPENFOAM_GIT_BRANCH @@ -154,47 +140,18 @@ else ifdef OPENFOAM_GIT_BRANCH git -C $(volume) pull origin $(OPENFOAM_GIT_BRANCH) git -C $(volume) submodule update --init --recursive endif - cd $(volume) && "$(CURDIR)/scripts/configure.sh" - -$(volume)/Brewfile.lock.json: $(volume)/Brewfile | $(volume)/usr -ifeq ($(DEPS_KIND),standalone) - HOMEBREW_RELOCATABLE_INSTALL_NAMES=1 $(volume)/usr/bin/brew bundle --file $(volume)/Brewfile --cleanup --verbose - $(volume)/usr/bin/brew list --versions -else - brew bundle --file $(volume)/Brewfile --no-upgrade -endif -ifeq ($(DEPS_KIND),bundled) - rm -rf $(volume)/usr - cd $(volume) && "$(CURDIR)/scripts/bundle_deps.py" -endif - -$(volume)/usr: | $(volume) -ifeq ($(DEPS_KIND),standalone) - git clone https://github.com/Homebrew/brew $(volume)/homebrew - mkdir -p $(volume)/usr/bin - ln -s ../../homebrew/bin/brew $(volume)/usr/bin/ -else ifeq ($(DEPS_KIND),homebrew) - ln -s $(shell brew --prefix) $(volume)/usr -else ifeq ($(DEPS_KIND),bundled) - mkdir $(volume)/usr -else - $(error Invalid value for DEPS_KIND) -endif - -$(volume)/Brewfile: Brewfile | $(volume) - cp Brewfile $(volume)/ - -$(volume): | build/$(APP_NAME)-build.sparsebundle - hdiutil attach build/$(APP_NAME)-build.sparsebundle + pixi-unpack --output-directory $(volume) environment.tar + rm -f $(volume)/activate.sh + cd $(volume) && "$(CURDIR)/configure.sh" + cd $(volume) \ + && source etc/bashrc \ + && foamSystemCheck \ + && ( ./Allwmake -j $(WMAKE_NJOBS) -s -q -k || true ) \ + && ./Allwmake -j $(WMAKE_NJOBS) -s + hdiutil detach $(volume) -build/$(APP_NAME)-build.sparsebundle: - mkdir -p build - hdiutil create \ - -size 50g \ - -fs $(VOLUME_FILESYSTEM) \ - -volname $(APP_NAME) \ - build/$(APP_NAME)-build.sparsebundle \ - -ov +environment.tar: pixi.lock + pixi-pack --environment openfoam $(openfoam_tarball): | $(openfoam_tarball).sha256 curl -L -o $(openfoam_tarball) $(OPENFOAM_TARBALL_URL) @@ -205,14 +162,11 @@ $(openfoam_tarball).sha256: # Non-build targets and rules -test: | tests/venv - tests/venv/bin/pip install -r tests/requirements.txt - build/$(APP_NAME).app/Contents/Resources/etc/openfoam -c tests/venv/bin/pytest +test: + [ ! -d $(volume) ] || hdiutil detach $(volume) + build/$(APP_NAME).app/Contents/Resources/etc/openfoam pytest build/$(APP_NAME).app/Contents/Resources/volume eject && [ ! -d $(volume) ] -tests/venv: - python3 -m venv tests/venv - clean-app: [ ! -d $(volume) ] || hdiutil detach $(volume) rm -rf build/$(APP_NAME).app build/$(APP_NAME)-build.sparsebundle.shadow @@ -223,13 +177,12 @@ clean-build: clean-app rmdir build || true clean: clean-build - rm -f $(openfoam_tarball) Brewfile.lock.json - rm -rf tests/venv + rm -f $(openfoam_tarball) environment.tar uninstall: rm -rf $(INSTALL_DIR)/$(APP_NAME).app # Set special targets .PHONY: app build deps fetch-source zip install test clean-app clean-build clean uninstall -.SECONDARY: $(volume) $(openfoam_tarball) +.SECONDARY: $(openfoam_tarball) environment.tar .DELETE_ON_ERROR: diff --git a/README.md b/README.md index c2a4115..adc5c78 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,9 @@ # **OpenFOAM.app**: OpenFOAM for macOS +| 🎉 [OpenFOAM v2506 is now available!](#-install) | +| ---- | + **Native OpenFOAM as a Mac app**, with binaries compiled from the [OpenFOAM source code](https://develop.openfoam.com/Development/openfoam/-/blob/master/doc/Build.md). Intel and Apple silicon variants. [![CI](https://github.com/gerlero/openfoam-app/actions/workflows/ci.yml/badge.svg)](https://github.com/gerlero/openfoam-app/actions/workflows/ci.yml) @@ -15,7 +18,7 @@ * An Apple silicon or Intel Mac * A recent version of macOS * Apple silicon: macOS 14 Sonoma or later - * Intel: macOS 12 Monterey or later + * Intel: macOS 13 Ventura or later * _Running an older version of macOS? [See here](#i-have-an-older-version-of-macos-and-cannot-upgrade-to-a-supported-version-what-can-i-do)_ @@ -29,25 +32,25 @@ * Or, choose the OpenFOAM version(s) you want: - * **OpenFOAM v2406** + * **OpenFOAM v2506** * Install with [Homebrew](https://brew.sh): ```sh - brew install --no-quarantine gerlero/openfoam/openfoam@2406 + brew install --no-quarantine gerlero/openfoam/openfoam@2506 ``` - * Manual download: [⬇️ Apple silicon](https://github.com/gerlero/openfoam-app/releases/latest/download/openfoam2406-app-arm64.zip) | [⬇️ Intel](https://github.com/gerlero/openfoam-app/releases/latest/download/openfoam2406-app-x86_64.zip) + * Manual download: [⬇️ Apple silicon](https://github.com/gerlero/openfoam-app/releases/latest/download/openfoam2506-app-arm64.zip) | [⬇️ Intel](https://github.com/gerlero/openfoam-app/releases/latest/download/openfoam2506-app-x86_64.zip) - * **OpenFOAM v2312** + * **OpenFOAM v2412** * Install with [Homebrew](https://brew.sh): ```sh - brew install --no-quarantine gerlero/openfoam/openfoam@2312 + brew install --no-quarantine gerlero/openfoam/openfoam@2412 ``` - * Manual download: [⬇️ Apple silicon](https://github.com/gerlero/openfoam-app/releases/latest/download/openfoam2312-app-arm64.zip) | [⬇️ Intel](https://github.com/gerlero/openfoam-app/releases/latest/download/openfoam2312-app-x86_64.zip) + * Manual download: [⬇️ Apple silicon](https://github.com/gerlero/openfoam-app/releases/latest/download/openfoam2412-app-arm64.zip) | [⬇️ Intel](https://github.com/gerlero/openfoam-app/releases/latest/download/openfoam2412-app-x86_64.zip) * _Need an older version of OpenFOAM? [See here](#can-i-get-an-older-version-of-openfoam)_ @@ -68,7 +71,7 @@ openfoam If you did not install with Homebrew, you can get the same by invoking the following command (replace the path and app name as needed): ```sh -/Applications/OpenFOAM-v2406.app/Contents/Resources/etc/openfoam +/Applications/OpenFOAM-v2506.app/Contents/Resources/etc/openfoam ``` @@ -118,6 +121,8 @@ If you cannot upgrade to a newer macOS, you still have a few alternatives: * Apple silicon — last release tested with macOS 12 Monterey: [**OpenFOAM.app** 1.8.5](https://github.com/gerlero/openfoam-app/releases/tag/v1.8.5) ([⬇️ OpenFOAM v2206](https://github.com/gerlero/openfoam-app/releases/download/v1.8.5/openfoam2206-app-standalone-arm64.zip), [⬇️ OpenFOAM v2112](https://github.com/gerlero/openfoam-app/releases/download/v1.8.5/openfoam2112-app-standalone-arm64.zip)) + * Intel — last release tested with macOS 12 Monterey: [**OpenFOAM.app** 2.0.0](https://github.com/gerlero/openfoam-app/releases/tag/v2.0.0) ([⬇️ OpenFOAM v2406](https://github.com/gerlero/openfoam-app/releases/download/v2.0.0/openfoam2406-app-x86_64.zip), [⬇️ OpenFOAM v2312](https://github.com/gerlero/openfoam-app/releases/download/v2.0.0/openfoam2312-app-x86_64.zip)) + * Intel — last release tested with macOS 11 Big Sur: [**OpenFOAM.app** 1.11.1](https://github.com/gerlero/openfoam-app/releases/tag/v1.11.1) ([⬇️ OpenFOAM v2306](https://github.com/gerlero/openfoam-app/releases/download/v1.11.1/openfoam2306-app-x86_64.zip), [⬇️ OpenFOAM v2212](https://github.com/gerlero/openfoam-app/releases/download/v1.11.1/openfoam2212-app-x86_64.zip)) * Intel — last release tested with macOS 10.15 Catalina: [**OpenFOAM.app** 1.8.5](https://github.com/gerlero/openfoam-app/releases/tag/v1.8.5) ([⬇️ OpenFOAM v2206](https://github.com/gerlero/openfoam-app/releases/download/v1.8.5/openfoam2206-app-standalone-x86_64.zip), [⬇️ OpenFOAM v2112](https://github.com/gerlero/openfoam-app/releases/download/v1.8.5/openfoam2112-app-standalone-x86_64.zip)) @@ -132,6 +137,16 @@ If you need an older version of OpenFOAM, you can: * Use an older release of **OpenFOAM.app** (note that these apps are no longer updated): + * [**OpenFOAM-v2406.app** 2.1.0](https://github.com/gerlero/openfoam-app/releases/tag/v2.1.0) + * Homebrew: `brew install --no-quarantine gerlero/openfoam/openfoam@2406` + * [⬇️ Apple silicon](https://github.com/gerlero/openfoam-app/releases/download/v2.1.0/openfoam22406-app-arm64.zip): tested with macOS 14 Sonoma and macOS 15 Sequoia + * [⬇️ Intel](https://github.com/gerlero/openfoam-app/releases/download/v2.1.0/openfoam2406-app-x86_64.zip): tested with macOS 13 Ventura + + * [**OpenFOAM-v2312.app** 2.0.0](https://github.com/gerlero/openfoam-app/releases/tag/v2.0.0) + * Homebrew: `brew install --no-quarantine gerlero/openfoam/openfoam@2312` + * [⬇️ Apple silicon](https://github.com/gerlero/openfoam-app/releases/download/v2.0.0/openfoam2312-app-arm64.zip): tested with macOS 14 Sonoma and macOS 15 Sequoia + * [⬇️ Intel](https://github.com/gerlero/openfoam-app/releases/download/v2.0.0/openfoam2312-app-x86_64.zip): tested with macOS 12 Monterey and macOS 13 Ventura + * [**OpenFOAM-v2306.app** 1.13.1](https://github.com/gerlero/openfoam-app/releases/tag/v1.13.1) * Homebrew: `brew install --no-quarantine gerlero/openfoam/openfoam@2306` * [⬇️ Apple silicon](https://github.com/gerlero/openfoam-app/releases/download/v1.13.1/openfoam2306-app-arm64.zip): tested with macOS 14 Sonoma @@ -172,10 +187,10 @@ If you need to, building an **OpenFOAM.app** entirely from source is easy as clo ```sh git clone https://github.com/gerlero/openfoam-app.git cd openfoam-app -make +pixi run make ``` -The Xcode Command Line Tools are required. See the available configuration variables and alternative targets for `make` in the [`Makefile`](Makefile). Note that the compilation of OpenFOAM and the necessary dependencies from source may take a while. +[Pixi](https://pixi.sh/) and the Xcode Command Line Tools are required. See the available configuration variables and alternative targets for `make` in the [`Makefile`](Makefile). Note that the compilation of OpenFOAM from source may take a while. ## 📄 Legal notices diff --git a/scripts/configure.sh b/configure.sh similarity index 50% rename from scripts/configure.sh rename to configure.sh index d01435e..8d3c586 100755 --- a/scripts/configure.sh +++ b/configure.sh @@ -7,68 +7,71 @@ bin/tools/foamConfigurePaths \ -system-compiler Clang \ -openmpi \ - -adios-path '$WM_PROJECT_DIR/usr/opt/adios2' \ - -boost-path '$WM_PROJECT_DIR/usr/opt/boost' \ - -cgal-path '$WM_PROJECT_DIR/usr/opt/cgal' \ - -fftw-path '$WM_PROJECT_DIR/usr/opt/fftw' \ - -kahip-path '$WM_PROJECT_DIR/usr/opt/kahip' \ - -metis-path '$WM_PROJECT_DIR/usr/opt/metis' \ - -scotch-path '$WM_PROJECT_DIR/usr/opt/scotch' + -adios-path '$WM_PROJECT_DIR/env' \ + -boost-path '$WM_PROJECT_DIR/env' \ + -cgal-path '$WM_PROJECT_DIR/env' \ + -fftw-path '$WM_PROJECT_DIR/env' \ + -kahip-path '$WM_PROJECT_DIR/env' \ + -metis-path '$WM_PROJECT_DIR/env' \ + -scotch-path '$WM_PROJECT_DIR/env' + +if [ $(bin/foamEtcFile -show-api) -lt 2506 ]; then + sed -i '' 's|# export GMP_ARCH_PATH=...|export GMP_ARCH_PATH="$WM_PROJECT_DIR/env"|' etc/config.sh/CGAL + sed -i '' 's|# setenv GMP_ARCH_PATH ...|setenv GMP_ARCH_PATH "$WM_PROJECT_DIR/env"|' etc/config.csh/CGAL + + sed -i '' 's|# export MPFR_ARCH_PATH=...|export MPFR_ARCH_PATH="$WM_PROJECT_DIR/env"|' etc/config.sh/CGAL + sed -i '' 's|# setenv MPFR_ARCH_PATH ...|setenv MPFR_ARCH_PATH "$WM_PROJECT_DIR/env"|' etc/config.csh/CGAL +else + bin/tools/foamConfigurePaths \ + -gmp-path '$WM_PROJECT_DIR/env' \ + -mpfr-path '$WM_PROJECT_DIR/env' +fi # Set path to the MPI install -MPI_PATH='$WM_PROJECT_DIR/usr/opt/open-mpi' - echo 'export FOAM_MPI=openmpi' >> etc/config.sh/prefs.openmpi echo 'setenv FOAM_MPI openmpi' >> etc/config.csh/prefs.openmpi -echo "export MPI_ARCH_PATH=\"$MPI_PATH\"" >> etc/config.sh/prefs.openmpi -echo "setenv MPI_ARCH_PATH \"$MPI_PATH\"" >> etc/config.csh/prefs.openmpi - - -# Set paths of GMP and MPFR (dependencies of CGAL) -GMP_PATH='$WM_PROJECT_DIR/usr/opt/gmp' -MPFR_PATH='$WM_PROJECT_DIR/usr/opt/mpfr' - -sed -i '' "s|\# export GMP_ARCH_PATH=...|export GMP_ARCH_PATH=\"$GMP_PATH\"|" etc/config.sh/CGAL -sed -i '' "s|\# setenv GMP_ARCH_PATH ...|setenv GMP_ARCH_PATH \"$GMP_PATH\"|" etc/config.csh/CGAL - -sed -i '' "s|\# export MPFR_ARCH_PATH=...|export MPFR_ARCH_PATH=\"$MPFR_PATH\"|" etc/config.sh/CGAL -sed -i '' "s|\# setenv MPFR_ARCH_PATH ...|setenv MPFR_ARCH_PATH \"$MPFR_PATH\"|" etc/config.csh/CGAL +echo 'export MPI_ARCH_PATH="$WM_PROJECT_DIR/env"' >> etc/config.sh/prefs.openmpi +echo 'setenv MPI_ARCH_PATH "$WM_PROJECT_DIR/env"' >> etc/config.csh/prefs.openmpi # OpenMP support -OPENMP_PATH='$WM_PROJECT_DIR/usr/opt/libomp' - if [ $(bin/foamEtcFile -show-api) -lt 2212 ]; then - echo "export CPATH=\"$OPENMP_PATH/include\${CPATH+:\$CPATH}\"" >> etc/prefs.sh - echo "setenv CPATH \"$OPENMP_PATH/include\`[ \${?CPATH} == 1 ] && echo \":\${CPATH}\"\`\"" >> etc/prefs.csh + echo 'export CPATH="$WM_PROJECT_DIR/env/include${CPATH+:$CPATH}"' >> etc/prefs.sh + echo 'setenv CPATH "$WM_PROJECT_DIR/env/include`[ ${?CPATH} == 1 ] && echo ":${CPATH}"`"' >> etc/prefs.csh - echo "export LIBRARY_PATH=\"$OPENMP_PATH/lib\${LIBRARY_PATH+:\$LIBRARY_PATH}\"" >> etc/prefs.sh - echo "setenv LIBRARY_PATH \"$OPENMP_PATH/lib\`[ \${?LIBRARY_PATH} == 1 ] && echo \":\${LIBRARY_PATH}\"\`\"" >> etc/prefs.csh + echo 'export LIBRARY_PATH="$WM_PROJECT_DIR/env/lib${LIBRARY_PATH+:$LIBRARY_PATH}"' >> etc/prefs.sh + echo 'setenv LIBRARY_PATH "$WM_PROJECT_DIR/env/lib`[ ${?LIBRARY_PATH} == 1 ] && echo ":${LIBRARY_PATH}"`"' >> etc/prefs.csh else - echo "export FOAM_EXTRA_CFLAGS=\"-I$OPENMP_PATH/include \$FOAM_EXTRA_CFLAGS\"" >> etc/prefs.sh - echo "setenv FOAM_EXTRA_CFLAGS \"-I$OPENMP_PATH/include \$FOAM_EXTRA_CFLAGS\"" >> etc/prefs.csh + echo 'export FOAM_EXTRA_CFLAGS="-I$WM_PROJECT_DIR/env/include $FOAM_EXTRA_CFLAGS"' >> etc/prefs.sh + echo 'setenv FOAM_EXTRA_CFLAGS "-I$WM_PROJECT_DIR/env/include $FOAM_EXTRA_CFLAGS"' >> etc/prefs.csh - echo "export FOAM_EXTRA_CXXFLAGS=\"-I$OPENMP_PATH/include \$FOAM_EXTRA_CXXFLAGS\"" >> etc/prefs.sh - echo "setenv FOAM_EXTRA_CXXFLAGS \"-I$OPENMP_PATH/include \$FOAM_EXTRA_CXXFLAGS\"" >> etc/prefs.csh + echo 'export FOAM_EXTRA_CXXFLAGS="-I$WM_PROJECT_DIR/env/include $FOAM_EXTRA_CXXFLAGS"' >> etc/prefs.sh + echo 'setenv FOAM_EXTRA_CXXFLAGS "-I$WM_PROJECT_DIR/env/include $FOAM_EXTRA_CXXFLAGS"' >> etc/prefs.csh - echo "export FOAM_EXTRA_LDFLAGS=\"-L$OPENMP_PATH/lib \$FOAM_EXTRA_LDFLAGS\"" >> etc/prefs.sh - echo "setenv FOAM_EXTRA_LDFLAGS \"-L$OPENMP_PATH/lib \$FOAM_EXTRA_LDFLAGS\"" >> etc/prefs.csh + echo 'export FOAM_EXTRA_LDFLAGS="-L$WM_PROJECT_DIR/env/lib $FOAM_EXTRA_LDFLAGS"' >> etc/prefs.sh + echo 'setenv FOAM_EXTRA_LDFLAGS "-L$WM_PROJECT_DIR/env/lib $FOAM_EXTRA_LDFLAGS"' >> etc/prefs.csh fi # Use bundled Bash -BASH_PATH='$WM_PROJECT_DIR/usr/opt/bash' +echo 'export PATH="$WM_PROJECT_DIR/env/bin${PATH+:$PATH}"' >> etc/prefs.sh +echo 'setenv PATH $WM_PROJECT_DIR/env/bin:$PATH' >> etc/prefs.csh -echo "export PATH=\"$BASH_PATH/bin\${PATH+:\$PATH}\"" >> etc/prefs.sh -echo "setenv PATH $BASH_PATH/bin:\$PATH" >> etc/prefs.csh +echo 'export MANPATH="$WM_PROJECT_DIR/env/share/man${MANPATH+:$MANPATH}:"' >> etc/prefs.sh +echo 'setenv MANPATH "$WM_PROJECT_DIR/env/share/man`[ ${?MANPATH} == 1 ] && echo ":${MANPATH}"`"' >> etc/prefs.csh -echo "export MANPATH=\"$BASH_PATH/share/man\${MANPATH+:\$MANPATH}:\"" >> etc/prefs.sh -echo "setenv MANPATH $BASH_PATH/share/man\`[ \${?MANPATH} == 1 ] && echo \":\${MANPATH}\"\`:" >> etc/prefs.csh +echo 'export INFOPATH="$WM_PROJECT_DIR/envshare/info:${INFOPATH:-}"' >> etc/prefs.sh +echo 'setenv INFOPATH "$WM_PROJECT_DIR/env/share/info`[ ${?INFOPATH} == 1 ] && echo ":${INFOPATH}"`"' >> etc/prefs.csh -echo "export INFOPATH=\"$BASH_PATH/share/info:\${INFOPATH:-}\"" >> etc/prefs.sh -echo "setenv INFOPATH $BASH_PATH/share/info\`[ \${?INFOPATH} == 1 ] && echo \":\${INFOPATH}\"\`" >> etc/prefs.csh + +# Set RPATH to find bundled libraries +if [ $(bin/foamEtcFile -show-api) -lt 2506 ]; then + echo 'PROJECT_RPATH += -rpath @loader_path/../../../env/lib' >> wmake/rules/darwin64Clang/rpath +else + echo 'PROJECT_RPATH += -rpath @loader_path/../../../env/lib' >> wmake/rules/darwin64/rpath +fi # Disable floating point exception trapping when on Apple silicon @@ -88,7 +91,7 @@ echo "setenv INFOPATH $BASH_PATH/share/info\`[ \${?INFOPATH} == 1 ] && echo \":\ # Backport of https://develop.openfoam.com/Development/openfoam/-/issues/2555 -[ $(bin/foamEtcFile -show-api) -ge 2212 ] || patch src/meshTools/triSurface/triSurfaceTools/geompack/geompack.C < # include @@ -126,26 +129,3 @@ EOF # Backport of https://develop.openfoam.com/Development/openfoam/-/issues/3098 [ $(bin/foamEtcFile -show-api) -gt 2312 ] || sed -i '' 's|_foamAddLib "$FOAM_USER_LIBBIN:$FOAM_SITE_LIBBIN"|_foamAddLib "$FOAM_SITE_LIBBIN"\n_foamAddLib "$FOAM_USER_LIBBIN"|' etc/config.sh/setup [ $(bin/foamEtcFile -show-api) -gt 2312 ] || sed -i '' 's|_foamAddLib "$FOAM_USER_LIBBIN:$FOAM_SITE_LIBBIN"|_foamAddLib "$FOAM_SITE_LIBBIN"\n_foamAddLib "$FOAM_USER_LIBBIN"|' etc/config.csh/setup - - -# Compatibility with CGAL 6 (https://develop.openfoam.com/Development/openfoam/-/issues/3234) -sed -i '' 's|c++14|c++17|' wmake/rules/General/Clang/c++ -patch src/OpenFOAM/db/IOstreams/memory/ISpanStream.H <= 201703L - //- Construct (shallow copy) from std::string_view content - explicit ispanstream(std::string_view s) -- { -+ : - buffer_type(const_cast(s.data()), s.size()), -- stream_type(static_cast(this)); -- } -+ stream_type(static_cast(this)) -+ {} - #endif - - //- Construct (shallow copy) from span character content -EOF -sed -i '' 's|boost::optional|std::optional|' applications/utilities/preProcessing/viewFactorsGen/viewFactorsGen.C -sed -i '' 's|boost::optional|std::optional|' applications/utilities/surface/surfaceBooleanFeatures/surfaceBooleanFeatures.C -sed -i '' 's|boost::get|std::get_if|' applications/utilities/surface/surfaceBooleanFeatures/surfaceBooleanFeatures.C diff --git a/images/screenshot.png b/images/screenshot.png index e25baea..aa83f9c 100644 Binary files a/images/screenshot.png and b/images/screenshot.png differ diff --git a/Contents/MacOS/launch b/launch.applescript similarity index 63% rename from Contents/MacOS/launch rename to launch.applescript index 60a2708..e58ea6e 100755 --- a/Contents/MacOS/launch +++ b/launch.applescript @@ -1,6 +1,6 @@ #!/usr/bin/osascript -set openfoam to (path to me as text) & "::..:Resources:etc:openfoam" +set openfoam to (path to me as text) & "Contents:Resources:etc:openfoam" tell application "Terminal" do script (quoted form of POSIX path of openfoam) diff --git a/pixi.lock b/pixi.lock new file mode 100644 index 0000000..ea623ed --- /dev/null +++ b/pixi.lock @@ -0,0 +1,1586 @@ +version: 6 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + packages: + osx-64: + - conda: https://conda.anaconda.org/conda-forge/noarch/aioshutil-1.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.6.15-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/foamlib-1.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-32_h7f60823_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-32_hff6cab4_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-20.1.7-hf95d169_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.0-h240833e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.6-h281671d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-5.0.0-14_2_0_h51e75f0_103.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-14.2.0-h51e75f0_103.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-32_h236ab99_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.30-openmp_hbf64a52_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.50.2-he7d56d0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-20.1.7-ha54dae1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.3.1-py313hc518a0f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.5.0-hc426f3f_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pixi-pack-0.7.1-hffa81eb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pixi-unpack-0.7.1-hffa81eb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-asyncio-cooperative-0.37.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.13.5-hc3a4c56_102_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-7_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.0.0-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.0-h32cad80_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/noarch/aioshutil-1.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.6.15-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/foamlib-1.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-32_h10e41b3_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-32_hb3479ef_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-20.1.7-ha82da77_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.0-h286801f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.6-h1da3d7d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-14_2_0_h6c33f7e_103.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-14.2.0-h6c33f7e_103.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-32_hc9a63f6_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_hf332438_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.50.2-h6fb428d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-20.1.7-hdb05f8b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.3.1-py313h41a2e72_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.5.0-h81ee809_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixi-pack-0.7.1-h2b2570c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixi-unpack-0.7.1-h2b2570c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-asyncio-cooperative-0.37.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.5-hf3f3da0_102_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-7_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.0.0-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.0-h32cad80_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + openfoam: + channels: + - url: https://conda.anaconda.org/conda-forge/ + packages: + osx-64: + - conda: https://conda.anaconda.org/conda-forge/osx-64/bash-5.2.37-h9edc32d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/blas-2.132-blis.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/blas-devel-3.9.0-32_hcc04dd8_blis.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/blis-0.9.0-hec52a4b_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.6.15-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/cgal-cpp-5.6.1-hda30369_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/eigen-3.4.0-h1c7c39f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/fftw-3.3.10-nompi_h292e606_110.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/gmp-6.3.0-hf036a51_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-32_hcc31c3a_blis.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-1.86.0-hf0da243_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-devel-1.86.0-h20888b2_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-headers-1.86.0-h694c41f_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-32_h1b39828_blis.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-20.1.7-hf95d169_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libevent-2.1.12-ha90c15b_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libfabric-2.2.0-h694c41f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libfabric1-2.2.0-h6e16a3a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-5.0.0-14_2_0_h51e75f0_103.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-14.2.0-h51e75f0_103.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libhwloc-2.11.2-default_h4cdd727_1001.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.18-h4b5e92a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-12_h8d7f381_netlib.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapacke-3.9.0-12_hf157144_netlib.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libpmix-5.0.8-h2a508f7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libscotch-7.0.6-h7a28ce2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.13.8-h93c44a6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-20.1.7-ha54dae1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/mpfr-4.2.1-haed47dc_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/mpi-1.0-openmpi.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openmpi-5.0.8-h442dfbe_100.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.5.0-hc426f3f_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/scotch-7.0.6-h40132e6_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h8210216_2.conda + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bash-5.2.37-h5b2bd6a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/blas-2.132-accelerate.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/blas-devel-3.9.0-32_h55bc449_accelerate.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.6.15-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cgal-cpp-5.6.1-h5f86f28_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/eigen-3.4.0-h1995070_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fftw-3.3.10-nompi_h6637ab6_110.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-32_h504e6c8_accelerate.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-1.86.0-hc9fb7c5_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-devel-1.86.0-hf450f58_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-headers-1.86.0-hce30654_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-32_h8d39bcd_accelerate.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-20.1.7-ha82da77_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfabric-2.2.0-hce30654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfabric1-2.2.0-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-14_2_0_h6c33f7e_103.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-14.2.0-h6c33f7e_103.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libhwloc-2.11.2-default_hbce5d74_1001.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-hfe07756_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-32_h3c9cff3_accelerate.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapacke-3.9.0-32_h09be921_accelerate.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpmix-5.0.8-h6500a5a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libscotch-7.0.6-he56f69b_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.13.8-h52572c6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-20.1.7-hdb05f8b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpi-1.0-openmpi.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openmpi-5.0.8-hc9a84be_100.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.5.0-h81ee809_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scotch-7.0.6-hc1c4572_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_2.conda +packages: +- conda: https://conda.anaconda.org/conda-forge/noarch/aioshutil-1.5-pyhd8ed1ab_0.conda + sha256: 4d36789511c589a1f3933de3ac3c3b62db7323f6ffd492a4d04558f454392c1c + md5: 6c562696bdb74a8149442779d5469dd2 + depends: + - python >=3.8 + - typing-extensions + license: BSD-3-Clause + license_family: BSD + size: 10324 + timestamp: 1721492522583 +- conda: https://conda.anaconda.org/conda-forge/osx-64/bash-5.2.37-h9edc32d_0.conda + sha256: 02d11f98143dbecc3537cc608874e3c39f10c91ab245a9922efd69e5f706e9d5 + md5: 5c516db7e9e4b1677f9cf478bade02cd + depends: + - readline + - __osx >=10.13 + - readline >=8.2,<9.0a0 + license: GPL-3.0-or-later + license_family: GPL + size: 1754182 + timestamp: 1748631221509 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bash-5.2.37-h5b2bd6a_0.conda + sha256: 9addc6fab5b01dc2d4bc58b15cf7df2352a2cbd4c2344c70f2de70243c60e548 + md5: dd8fe1def8c4aecf00ec21ee96c74863 + depends: + - readline + - __osx >=11.0 + - readline >=8.2,<9.0a0 + license: GPL-3.0-or-later + license_family: GPL + size: 1715546 + timestamp: 1748631203521 +- conda: https://conda.anaconda.org/conda-forge/osx-64/blas-2.132-blis.conda + build_number: 32 + sha256: 5ed4782833f5e927873d3cf0abbc817dcc080eaa688e659234559fb3b3318989 + md5: e0a5ac23f85d5f17cb2b15f3f5e0dc5e + depends: + - blas-devel 3.9.0 32*_blis + license: BSD-3-Clause + license_family: BSD + size: 17538 + timestamp: 1750389065757 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/blas-2.132-accelerate.conda + build_number: 32 + sha256: 66d4fbc0cf0cb230413c10945e468237204830a99db27730de67d64d24fab54f + md5: da80137181edcb8cd6a3d3dc17e8bc02 + depends: + - blas-devel 3.9.0 32*_accelerate + license: BSD-3-Clause + license_family: BSD + size: 17671 + timestamp: 1750389130022 +- conda: https://conda.anaconda.org/conda-forge/osx-64/blas-devel-3.9.0-32_hcc04dd8_blis.conda + build_number: 32 + sha256: 0140ff2340a4247b3e6333444459b14885352de44e18f002ed966d5b3feb3103 + md5: 880c685e49d4e78ec478bffc47ddfb82 + depends: + - blis 0.9.0.* + - libblas 3.9.0 32_hcc31c3a_blis + - libcblas 3.9.0 32_h1b39828_blis + - liblapack 3.9.0 *_netlib + - liblapacke 3.9.0 *_netlib + license: BSD-3-Clause + license_family: BSD + size: 17099 + timestamp: 1750389029782 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/blas-devel-3.9.0-32_h55bc449_accelerate.conda + build_number: 32 + sha256: a1b7b5d4d239fd47d6dcf10d6d8d89fb211282c0214f2067e57e1f0609caaf93 + md5: f4d5f572ee79d1cfb960f47ca5e5d679 + depends: + - libblas 3.9.0 32_h504e6c8_accelerate + - libcblas 3.9.0 32_h8d39bcd_accelerate + - liblapack 3.9.0 32_h3c9cff3_accelerate + - liblapacke 3.9.0 32_h09be921_accelerate + license: BSD-3-Clause + license_family: BSD + size: 17028 + timestamp: 1750389100055 +- conda: https://conda.anaconda.org/conda-forge/osx-64/blis-0.9.0-hec52a4b_2.conda + sha256: 709d70079d8b629cc6a9f96c52e818546ffe67fe97c7e09b2264611f19551934 + md5: 2bbab6245067770bc4e9652a3e60de86 + depends: + - __osx >=10.9 + license: BSD-3-Clause + license_family: BSD + size: 1346304 + timestamp: 1713878136186 +- conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda + sha256: cad153608b81fb24fc8c509357daa9ae4e49dfc535b2cb49b91e23dbd68fc3c5 + md5: 7ed4301d437b59045be7e051a0308211 + depends: + - __osx >=10.13 + license: bzip2-1.0.6 + license_family: BSD + size: 134188 + timestamp: 1720974491916 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 + md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab + depends: + - __osx >=11.0 + license: bzip2-1.0.6 + license_family: BSD + size: 122909 + timestamp: 1720974522888 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.6.15-hbd8a1cb_0.conda + sha256: 7cfec9804c84844ea544d98bda1d9121672b66ff7149141b8415ca42dfcd44f6 + md5: 72525f07d72806e3b639ad4504c30ce5 + depends: + - __unix + license: ISC + size: 151069 + timestamp: 1749990087500 +- conda: https://conda.anaconda.org/conda-forge/osx-64/cgal-cpp-5.6.1-hda30369_2.conda + sha256: 7d71b03c35085fe49bed127afad8a014e83299ca7e45df9f962e939a5833f5a2 + md5: 6f188e0300be78871bbcb7880013108c + depends: + - __osx >=10.13 + - eigen + - libboost >=1.86.0,<1.87.0a0 + - libboost-devel + - libcxx >=16 + - mpfr >=4.2.1,<5.0a0 + license: GPL3/LGPL3 + size: 5769810 + timestamp: 1724406156034 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cgal-cpp-5.6.1-h5f86f28_2.conda + sha256: 7499a25eadef31d6ffed5f11f757236a26088abeeb7b3ec972ba34335c0fb0a0 + md5: ab750c243bc955a87a5c3b751bd7632e + depends: + - __osx >=11.0 + - eigen + - libboost >=1.86.0,<1.87.0a0 + - libboost-devel + - libcxx >=16 + - mpfr >=4.2.1,<5.0a0 + license: GPL3/LGPL3 + size: 5770597 + timestamp: 1724406149482 +- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 + md5: 962b9857ee8e7018c22f2776ffa0b2d7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 27011 + timestamp: 1733218222191 +- conda: https://conda.anaconda.org/conda-forge/osx-64/eigen-3.4.0-h1c7c39f_0.conda + sha256: 187c0677e0cdcdc39aed716687a6290dd5b7f52b49eedaef2ed76be6cd0a5a3d + md5: 5b2cfc277e3d42d84a2a648825761156 + depends: + - libcxx >=15.0.7 + license: MPL-2.0 + license_family: MOZILLA + size: 1090184 + timestamp: 1690272503232 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/eigen-3.4.0-h1995070_0.conda + sha256: c20b3677b16d8907343fce68e7c437184fef7f5ed0a765c104b775f8a485c5c9 + md5: 3691ea3ff568ba38826389bafc717909 + depends: + - libcxx >=15.0.7 + license: MPL-2.0 + license_family: MOZILLA + size: 1087751 + timestamp: 1690275869049 +- conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + sha256: ce61f4f99401a4bd455b89909153b40b9c823276aefcbb06f2044618696009ca + md5: 72e42d28960d875c7654614f8b50939a + depends: + - python >=3.9 + - typing_extensions >=4.6.0 + license: MIT and PSF-2.0 + size: 21284 + timestamp: 1746947398083 +- conda: https://conda.anaconda.org/conda-forge/osx-64/fftw-3.3.10-nompi_h292e606_110.conda + sha256: 6f5c64debf2d51f10522d4080b043ec4dc9825a770a4d38c96fa7bf6432b4769 + md5: e05219cbabb20b406ff0803a3e552419 + depends: + - __osx >=10.13 + - libcxx >=16 + - libgfortran >=5 + - libgfortran5 >=12.3.0 + - libgfortran5 >=13.2.0 + - llvm-openmp >=16.0.6 + license: GPL-2.0-or-later + license_family: GPL + size: 1801806 + timestamp: 1717758400349 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/fftw-3.3.10-nompi_h6637ab6_110.conda + sha256: ba72f1d9384584c774d4e58ff3174818a20687f817e5edde3e0d23edff88fd72 + md5: 622f99e8f4820c2ca1b208a3bb6ed5e6 + depends: + - __osx >=11.0 + - libcxx >=16 + - libgfortran >=5 + - libgfortran5 >=12.3.0 + - libgfortran5 >=13.2.0 + - llvm-openmp >=16.0.6 + license: GPL-2.0-or-later + license_family: GPL + size: 763281 + timestamp: 1717758160882 +- conda: https://conda.anaconda.org/conda-forge/noarch/foamlib-1.0.0-pyhd8ed1ab_0.conda + sha256: 771c985b33f87ade26429ed5c3b64fc5026dc0a2cd335fff7d0bd1ab07e7e897 + md5: c34af39587af076165b77df784861228 + depends: + - aioshutil >=1,<2 + - numpy >=1,<3 + - pyparsing >=3.1.2,<4 + - python >=3.9 + - rich >=13,<15 + - typing_extensions >=4,<5 + license: GPL-3.0-or-later + license_family: GPL + size: 43735 + timestamp: 1747523333028 +- conda: https://conda.anaconda.org/conda-forge/osx-64/gmp-6.3.0-hf036a51_2.conda + sha256: 75aa5e7a875afdcf4903b7dc98577672a3dc17b528ac217b915f9528f93c85fc + md5: 427101d13f19c4974552a4e5b072eef1 + depends: + - __osx >=10.13 + - libcxx >=16 + license: GPL-2.0-or-later OR LGPL-3.0-or-later + size: 428919 + timestamp: 1718981041839 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda + sha256: 76e222e072d61c840f64a44e0580c2503562b009090f55aa45053bf1ccb385dd + md5: eed7278dfbab727b56f2c0b64330814b + depends: + - __osx >=11.0 + - libcxx >=16 + license: GPL-2.0-or-later OR LGPL-3.0-or-later + size: 365188 + timestamp: 1718981343258 +- conda: https://conda.anaconda.org/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda + sha256: 2e64307532f482a0929412976c8450c719d558ba20c0962832132fd0d07ba7a7 + md5: d68d48a3060eb5abdc1cdc8e2a3a5966 + depends: + - __osx >=10.13 + license: MIT + license_family: MIT + size: 11761697 + timestamp: 1720853679409 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + sha256: 9ba12c93406f3df5ab0a43db8a4b4ef67a5871dfd401010fbe29b218b2cbe620 + md5: 5eb22c1d7b3fc4abb50d92d621583137 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 11857802 + timestamp: 1720853997952 +- conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + sha256: 0ec8f4d02053cd03b0f3e63168316530949484f80e16f5e2fb199a1d117a89ca + md5: 6837f3eff7dcea42ecd714ce1ac2b108 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 11474 + timestamp: 1733223232820 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-32_h7f60823_openblas.conda + build_number: 32 + sha256: e441fcc46858a9a073e4344c80e267aee3b95ec01b02e37205c36be79eec0694 + md5: 0f7197e3b4ecfa8aa24a371c3eaabb8a + depends: + - libopenblas >=0.3.30,<0.3.31.0a0 + - libopenblas >=0.3.30,<1.0a0 + constrains: + - liblapack 3.9.0 32*_openblas + - blas 2.132 openblas + - mkl <2025 + - liblapacke 3.9.0 32*_openblas + - libcblas 3.9.0 32*_openblas + license: BSD-3-Clause + license_family: BSD + size: 17571 + timestamp: 1750389030403 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-32_hcc31c3a_blis.conda + build_number: 32 + sha256: 24ecd5f9a1e5df0d238c1b8c6e7d07f07aebc6fb0d14ebbd0494c0836e70c09a + md5: 43555fd7d5834632ec978a56e2ebfb29 + depends: + - blis >=0.9.0,<0.9.1.0a0 + constrains: + - mkl <2025 + - libcblas 3.9.0 32*_blis + - blas 2.132 blis + track_features: + - blas_blis + license: BSD-3-Clause + license_family: BSD + size: 17401 + timestamp: 1750389009870 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-32_h10e41b3_openblas.conda + build_number: 32 + sha256: 2775472dd81d43dc20804b484028560bfecd5ab4779e39f1fb95684da3ff2029 + md5: d4a1732d2b330c9d5d4be16438a0ac78 + depends: + - libopenblas >=0.3.30,<0.3.31.0a0 + - libopenblas >=0.3.30,<1.0a0 + constrains: + - blas 2.132 openblas + - liblapack 3.9.0 32*_openblas + - mkl <2025 + - libcblas 3.9.0 32*_openblas + - liblapacke 3.9.0 32*_openblas + license: BSD-3-Clause + license_family: BSD + size: 17520 + timestamp: 1750388963178 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-32_h504e6c8_accelerate.conda + build_number: 32 + sha256: 7bac579856ed6fe52bc14de3235488df1c63469342fe083efdc6efbc58a2723b + md5: a786e7c40ac4ba20d00dd9199771cd05 + depends: + - __osx >=11.0 + - libgfortran 5.* + - libgfortran5 >=13.3.0 + constrains: + - blas 2.132 accelerate + - liblapacke 3.9.0 32*_accelerate + - mkl <2025 + - libcblas 3.9.0 32*_accelerate + - liblapack 3.9.0 32*_accelerate + track_features: + - blas_accelerate + license: BSD-3-Clause + license_family: BSD + size: 2583579 + timestamp: 1750389052515 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-1.86.0-hf0da243_3.conda + sha256: 7758971337b07d1f4fd0c55eed4bfb06e3c0512a7e4549c648a01383926c1fcd + md5: 1e25fad7b2c160cd3b9b52f3507eb272 + depends: + - __osx >=10.13 + - bzip2 >=1.0.8,<2.0a0 + - icu >=75.1,<76.0a0 + - libcxx >=18 + - liblzma >=5.6.3,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.6,<1.6.0a0 + constrains: + - boost-cpp <0.0a0 + license: BSL-1.0 + size: 2134033 + timestamp: 1733503407177 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-1.86.0-hc9fb7c5_3.conda + sha256: 793da2d2f7e2e14ed34549e3085771eefcc13ee6e06de2409a681ff0a545e905 + md5: 722715e61d51bcc7bd74f7a2b133f0d7 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - icu >=75.1,<76.0a0 + - libcxx >=18 + - liblzma >=5.6.3,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.6,<1.6.0a0 + constrains: + - boost-cpp <0.0a0 + license: BSL-1.0 + size: 1937185 + timestamp: 1733503730683 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-devel-1.86.0-h20888b2_3.conda + sha256: 297427f9edce4b04847d13bfaa2401326d69b351290bf7f61565844a503c7fc8 + md5: f4386c067b2bcd09be47d4092cf4c81d + depends: + - libboost 1.86.0 hf0da243_3 + - libboost-headers 1.86.0 h694c41f_3 + constrains: + - boost-cpp <0.0a0 + license: BSL-1.0 + size: 38825 + timestamp: 1733503676067 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-devel-1.86.0-hf450f58_3.conda + sha256: 785fec14fff95b87b1ef1e947367255cb54e8a580c67a9544ef51cf44399d638 + md5: b5ee687fa1ca8cb36149519a9e14541c + depends: + - libboost 1.86.0 hc9fb7c5_3 + - libboost-headers 1.86.0 hce30654_3 + constrains: + - boost-cpp <0.0a0 + license: BSL-1.0 + size: 37678 + timestamp: 1733503973845 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-headers-1.86.0-h694c41f_3.conda + sha256: 9e441c92ad0ff786cae47f6a66fb60fc0d146c69386e4f6f5b7ecdda89db878f + md5: 7f26ba01ef422fd27abfdc98ceb104f0 + constrains: + - boost-cpp <0.0a0 + license: BSL-1.0 + size: 14151060 + timestamp: 1733503490599 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-headers-1.86.0-hce30654_3.conda + sha256: b5287d295bb3ee2f074f8bfede7c021f220ecee681da3843d8e537a51aad83f2 + md5: 81b1cfe069c865273f8809ade3e80bf8 + constrains: + - boost-cpp <0.0a0 + license: BSL-1.0 + size: 14139980 + timestamp: 1733503796088 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-32_h1b39828_blis.conda + build_number: 32 + sha256: cbaf92be703413d467d25c60f662564e2602024a833ba01fe739e956d0631ffb + md5: 607e88701ec3898da9dba7d18a9e35d0 + depends: + - libblas 3.9.0 32_hcc31c3a_blis + constrains: + - blas 2.132 blis + track_features: + - blas_blis + license: BSD-3-Clause + license_family: BSD + size: 17393 + timestamp: 1750389019976 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-32_hff6cab4_openblas.conda + build_number: 32 + sha256: 745f6dd420389809c333734df6edc99d75caa3633e4778158c7549c6844af440 + md5: 2c1e774d4546cf542eaee5781eb8940b + depends: + - libblas 3.9.0 32_h7f60823_openblas + constrains: + - blas 2.132 openblas + - liblapack 3.9.0 32*_openblas + - liblapacke 3.9.0 32*_openblas + license: BSD-3-Clause + license_family: BSD + size: 17574 + timestamp: 1750389040732 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-32_h8d39bcd_accelerate.conda + build_number: 32 + sha256: 57174e02791df3b33f80afcc55978f80278efda9c0133632abfe889d465e4875 + md5: 09c14f32d516bd4abac28d4bc51a5d87 + depends: + - libblas 3.9.0 32_h504e6c8_accelerate + constrains: + - blas 2.132 accelerate + - liblapack 3.9.0 32*_accelerate + - liblapacke 3.9.0 32*_accelerate + track_features: + - blas_accelerate + license: BSD-3-Clause + license_family: BSD + size: 17490 + timestamp: 1750389072576 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-32_hb3479ef_openblas.conda + build_number: 32 + sha256: 25d46ace14c3ac45d4aa18b5f7a0d3d30cec422297e900f8b97a66334232061c + md5: d8e8ba717ae863b13a7495221f2b5a71 + depends: + - libblas 3.9.0 32_h10e41b3_openblas + constrains: + - blas 2.132 openblas + - liblapack 3.9.0 32*_openblas + - liblapacke 3.9.0 32*_openblas + license: BSD-3-Clause + license_family: BSD + size: 17485 + timestamp: 1750388970626 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-20.1.7-hf95d169_0.conda + sha256: f6e088a2e0e702a4908d1fc9f1a17b080bdcf63e1f8a9cb35dd158fc1d1eb2f5 + md5: 8b47ade37d4e75417b4e993179c09f5d + depends: + - __osx >=10.13 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 562573 + timestamp: 1749846921724 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-20.1.7-ha82da77_0.conda + sha256: a3fd34773f1252a4f089e74a075ff5f0f6b878aede097e83a405f35687c36f24 + md5: 881de227abdddbe596239fa9e82eb3ab + depends: + - __osx >=11.0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 567189 + timestamp: 1749847129529 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libevent-2.1.12-ha90c15b_1.conda + sha256: e0bd9af2a29f8dd74309c0ae4f17a7c2b8c4b89f875ff1d6540c941eefbd07fb + md5: e38e467e577bd193a7d5de7c2c540b04 + depends: + - openssl >=3.1.1,<4.0a0 + license: BSD-3-Clause + license_family: BSD + size: 372661 + timestamp: 1685726378869 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda + sha256: 8c136d7586259bb5c0d2b913aaadc5b9737787ae4f40e3ad1beaf96c80b919b7 + md5: 1a109764bff3bdc7bdd84088347d71dc + depends: + - openssl >=3.1.1,<4.0a0 + license: BSD-3-Clause + license_family: BSD + size: 368167 + timestamp: 1685726248899 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.0-h240833e_0.conda + sha256: 976f2e23ad2bb2b8e92c99bfa2ead3ad557b17a129b170f7e2dfcf233193dd7e + md5: 026d0a1056ba2a3dbbea6d4b08188676 + depends: + - __osx >=10.13 + constrains: + - expat 2.7.0.* + license: MIT + license_family: MIT + size: 71894 + timestamp: 1743431912423 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.0-h286801f_0.conda + sha256: ee550e44765a7bbcb2a0216c063dcd53ac914a7be5386dd0554bd06e6be61840 + md5: 6934bbb74380e045741eb8637641a65b + depends: + - __osx >=11.0 + constrains: + - expat 2.7.0.* + license: MIT + license_family: MIT + size: 65714 + timestamp: 1743431789879 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libfabric-2.2.0-h694c41f_0.conda + sha256: 3fc31ad30fce09c40cb4ae2969f57796100114ef668bb056ca0437ee8693070e + md5: e3b18c0040b8bcec7a09de6750bd1399 + depends: + - libfabric1 2.2.0 h6e16a3a_0 + license: BSD-2-Clause OR GPL-2.0-only + license_family: BSD + size: 14149 + timestamp: 1751278494551 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfabric-2.2.0-hce30654_0.conda + sha256: 4794160d94dc1aac6946f65d887fe187efad0f880ca7e7a890048bb16e5a3fe9 + md5: a7b9ab9125299c08dc9561b9e551d058 + depends: + - libfabric1 2.2.0 h5505292_0 + license: BSD-2-Clause OR GPL-2.0-only + license_family: BSD + size: 14175 + timestamp: 1751278650863 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libfabric1-2.2.0-h6e16a3a_0.conda + sha256: 12dc705c02eeb6051c0479adaa7215a262c0e02dde1388e43912b7eebc4b501f + md5: ce330e3ef16970f22e123c5743dcd7a0 + depends: + - __osx >=10.13 + license: BSD-2-Clause OR GPL-2.0-only + license_family: BSD + size: 361964 + timestamp: 1751278493329 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfabric1-2.2.0-h5505292_0.conda + sha256: 56b1ee3643eff9a73acf0053955edf93db240cec93102d7537b475d9de82aaba + md5: e290471d23f56b5fffcee2244fcac2da + depends: + - __osx >=11.0 + license: BSD-2-Clause OR GPL-2.0-only + license_family: BSD + size: 330314 + timestamp: 1751278648826 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.6-h281671d_1.conda + sha256: 6394b1bc67c64a21a5cc73d1736d1d4193a64515152e861785c44d2cfc49edf3 + md5: 4ca9ea59839a9ca8df84170fab4ceb41 + depends: + - __osx >=10.13 + license: MIT + license_family: MIT + size: 51216 + timestamp: 1743434595269 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.6-h1da3d7d_1.conda + sha256: c6a530924a9b14e193ea9adfe92843de2a806d1b7dbfd341546ece9653129e60 + md5: c215a60c2935b517dcda8cad4705734d + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 39839 + timestamp: 1743434670405 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-5.0.0-14_2_0_h51e75f0_103.conda + sha256: 124dcd89508bd16f562d9d3ce6a906336a7f18e963cd14f2877431adee14028e + md5: 090b3c9ae1282c8f9b394ac9e4773b10 + depends: + - libgfortran5 14.2.0 h51e75f0_103 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 156202 + timestamp: 1743862427451 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-14_2_0_h6c33f7e_103.conda + sha256: 8628746a8ecd311f1c0d14bb4f527c18686251538f7164982ccbe3b772de58b5 + md5: 044a210bc1d5b8367857755665157413 + depends: + - libgfortran5 14.2.0 h6c33f7e_103 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 156291 + timestamp: 1743863532821 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-14.2.0-h51e75f0_103.conda + sha256: d2ac5e09587e5b21b7bb5795d24f33257e44320749c125448611211088ef8795 + md5: 6183f7e9cd1e7ba20118ff0ca20a05e5 + depends: + - llvm-openmp >=8.0.0 + constrains: + - libgfortran 5.0.0 14_2_0_*_103 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 1225013 + timestamp: 1743862382377 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-14.2.0-h6c33f7e_103.conda + sha256: 8599453990bd3a449013f5fa3d72302f1c68f0680622d419c3f751ff49f01f17 + md5: 69806c1e957069f1d515830dcc9f6cbb + depends: + - llvm-openmp >=8.0.0 + constrains: + - libgfortran 5.0.0 14_2_0_*_103 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 806566 + timestamp: 1743863491726 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libhwloc-2.11.2-default_h4cdd727_1001.conda + sha256: 989917281abf762b7e7a2b5968db2b6b0e89f46e704042ab8ec61a66951e0e0b + md5: 52bbb10ac083c563d00df035c94f9a63 + depends: + - __osx >=10.13 + - libcxx >=18 + - libxml2 >=2.13.4,<2.14.0a0 + license: BSD-3-Clause + license_family: BSD + size: 2359326 + timestamp: 1731375067281 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libhwloc-2.11.2-default_hbce5d74_1001.conda + sha256: dcac7144ad93cf3f276ec14c5553aa34de07443a9b1db6b3cd8d2e117b173c40 + md5: ff6438cf47cff4899ae9900bf9253c41 + depends: + - __osx >=11.0 + - libcxx >=18 + - libxml2 >=2.13.4,<2.14.0a0 + license: BSD-3-Clause + license_family: BSD + size: 2332319 + timestamp: 1731375088576 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.18-h4b5e92a_1.conda + sha256: c2a9c65a245c7bcb8c17c94dd716dad2d42b7c98e0c17cc5553a5c60242c4dda + md5: 6283140d7b2b55b6b095af939b71b13f + depends: + - __osx >=10.13 + license: LGPL-2.1-only + size: 669052 + timestamp: 1740128415026 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-hfe07756_1.conda + sha256: d30780d24bf3a30b4f116fca74dedb4199b34d500fe6c52cced5f8cc1e926f03 + md5: 450e6bdc0c7d986acf7b8443dce87111 + depends: + - __osx >=11.0 + license: LGPL-2.1-only + size: 681804 + timestamp: 1740128227484 +- conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-12_h8d7f381_netlib.conda + build_number: 12 + sha256: a6b86e216788a405dd5c1c716a0ab054b019f0ecbafc4c94b4e1a064f15635c8 + md5: 2f01a380d335ee7559d1314eabf950d3 + depends: + - __osx >=10.13 + - libblas 3.9.0.* + - libgfortran 5.* + - libgfortran5 >=13.3.0 + - libgfortran5 >=14.2.0 + track_features: + - blas_netlib + - blas_netlib_2 + license: BSD-3-Clause + license_family: BSD + size: 2630711 + timestamp: 1745847577808 +- conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-32_h236ab99_openblas.conda + build_number: 32 + sha256: 1e26450b80525b3f656e9c75fd26a10ebaa1d339fe4ca9c7affbebd9acbeac03 + md5: ccdca0c0730ad795e064d81dbe540723 + depends: + - libblas 3.9.0 32_h7f60823_openblas + constrains: + - blas 2.132 openblas + - liblapacke 3.9.0 32*_openblas + - libcblas 3.9.0 32*_openblas + license: BSD-3-Clause + license_family: BSD + size: 17553 + timestamp: 1750389051033 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-32_h3c9cff3_accelerate.conda + build_number: 32 + sha256: 33678b227fad46dd33b46113b85a74ce2daa8a09e1ca32bbba402eae30a4d5c2 + md5: a811139fe73e262d677e6b76ababa1ca + depends: + - libblas 3.9.0 32_h504e6c8_accelerate + constrains: + - libcblas 3.9.0 32*_accelerate + - blas 2.132 accelerate + - liblapacke 3.9.0 32*_accelerate + track_features: + - blas_accelerate + license: BSD-3-Clause + license_family: BSD + size: 17491 + timestamp: 1750389082887 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-32_hc9a63f6_openblas.conda + build_number: 32 + sha256: 5e1cfa3581d1dec6b07a75084ff6cfa4b4465c646c6884a71c78a28543f83b61 + md5: bf9ead3fa92fd75ad473c6a1d255ffcb + depends: + - libblas 3.9.0 32_h10e41b3_openblas + constrains: + - blas 2.132 openblas + - libcblas 3.9.0 32*_openblas + - liblapacke 3.9.0 32*_openblas + license: BSD-3-Clause + license_family: BSD + size: 17507 + timestamp: 1750388977861 +- conda: https://conda.anaconda.org/conda-forge/osx-64/liblapacke-3.9.0-12_hf157144_netlib.conda + build_number: 12 + sha256: d69ddc6ac127896fb2a737d3f709ac7b85f1afd36222581a33b34c5b9b98860e + md5: d7a9628ce1de7e95f5cc4389fd723a4c + depends: + - __osx >=10.13 + - libblas 3.9.0.* + - libcblas 3.9.0.* + - libgfortran 5.* + - libgfortran5 >=13.3.0 + - libgfortran5 >=14.2.0 + - liblapack 3.9.0.* + track_features: + - blas_netlib + - blas_netlib_2 + license: BSD-3-Clause + license_family: BSD + size: 365900 + timestamp: 1745847597324 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapacke-3.9.0-32_h09be921_accelerate.conda + build_number: 32 + sha256: 3971dbbd9a161808520cc9ae7e81220345e573833292cc71955fec107511298d + md5: 5e5251f7613230dced77d1abb7dc095d + depends: + - libblas 3.9.0 32_h504e6c8_accelerate + - libcblas 3.9.0 32_h8d39bcd_accelerate + - liblapack 3.9.0 32_h3c9cff3_accelerate + constrains: + - blas 2.132 accelerate + track_features: + - blas_accelerate + license: BSD-3-Clause + license_family: BSD + size: 17516 + timestamp: 1750389096687 +- conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda + sha256: 7e22fd1bdb8bf4c2be93de2d4e718db5c548aa082af47a7430eb23192de6bb36 + md5: 8468beea04b9065b9807fc8b9cdc5894 + depends: + - __osx >=10.13 + constrains: + - xz 5.8.1.* + license: 0BSD + size: 104826 + timestamp: 1749230155443 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + sha256: 0cb92a9e026e7bd4842f410a5c5c665c89b2eb97794ffddba519a626b8ce7285 + md5: d6df911d4564d77c4374b02552cb17d1 + depends: + - __osx >=11.0 + constrains: + - xz 5.8.1.* + license: 0BSD + size: 92286 + timestamp: 1749230283517 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda + sha256: 98299c73c7a93cd4f5ff8bb7f43cd80389f08b5a27a296d806bdef7841cc9b9e + md5: 18b81186a6adb43f000ad19ed7b70381 + depends: + - __osx >=10.13 + license: BSD-2-Clause + license_family: BSD + size: 77667 + timestamp: 1748393757154 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda + sha256: 0a1875fc1642324ebd6c4ac864604f3f18f57fbcf558a8264f6ced028a3c75b2 + md5: 85ccccb47823dd9f7a99d2c7f530342f + depends: + - __osx >=11.0 + license: BSD-2-Clause + license_family: BSD + size: 71829 + timestamp: 1748393749336 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.30-openmp_hbf64a52_0.conda + sha256: 933eb95a778657649a66b0e3cf638d591283159954c5e92b3918d67347ed47a1 + md5: 29c54869a3c7d33b6a0add39c5a325fe + depends: + - __osx >=10.13 + - libgfortran 5.* + - libgfortran5 >=13.3.0 + - llvm-openmp >=18.1.8 + constrains: + - openblas >=0.3.30,<0.3.31.0a0 + license: BSD-3-Clause + license_family: BSD + size: 6179547 + timestamp: 1750380498501 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_hf332438_0.conda + sha256: 501c8c64f1a6e6b671e49835e6c483bc25f0e7147f3eb4bbb19a4c3673dcaf28 + md5: 5d7dbaa423b4c253c476c24784286e4b + depends: + - __osx >=11.0 + - libgfortran 5.* + - libgfortran5 >=13.3.0 + - llvm-openmp >=18.1.8 + constrains: + - openblas >=0.3.30,<0.3.31.0a0 + license: BSD-3-Clause + license_family: BSD + size: 4163399 + timestamp: 1750378829050 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libpmix-5.0.8-h2a508f7_0.conda + sha256: f2bab20573da94e14833a399e1a396dd5b16abf7f6defb204006ec8201f17133 + md5: 2806372714a26992d34ebbdc35f956fe + depends: + - __osx >=10.13 + - libevent >=2.1.12,<2.1.13.0a0 + - libhwloc >=2.11.2,<2.11.3.0a0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 589258 + timestamp: 1746901782821 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpmix-5.0.8-h6500a5a_0.conda + sha256: e7e90a617fb8ba88dbb88d50cb51df14e7585259dba3ea7d737197a1532d37b7 + md5: 797a85a082ec87c4dfa817cb29e34b6b + depends: + - __osx >=11.0 + - libevent >=2.1.12,<2.1.13.0a0 + - libhwloc >=2.11.2,<2.11.3.0a0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 532413 + timestamp: 1746901806284 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libscotch-7.0.6-h7a28ce2_1.conda + sha256: 69fc6e4ce84838595f7627c3c00e34039cfebf85678a3c547369c66eeefe25fc + md5: 8cc5332625e508f011cb8cfbf6242c17 + depends: + - __osx >=10.13 + - bzip2 >=1.0.8,<2.0a0 + - libgfortran >=5 + - libgfortran5 >=13.2.0 + - liblzma >=5.6.3,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + license: CECILL-C + size: 292800 + timestamp: 1737537133224 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libscotch-7.0.6-he56f69b_1.conda + sha256: b616a5943501e35f32699b5f29d4216a3a94bfca87b9ae30feda89a9fa5c2f7a + md5: 291ffb6a18b7e35bf42a317cc6856348 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libgfortran >=5 + - libgfortran5 >=13.2.0 + - liblzma >=5.6.3,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + license: CECILL-C + size: 273604 + timestamp: 1737537249207 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.50.2-he7d56d0_0.conda + sha256: bd3ab15e14d7e88851c962034d97519a135d86f79f88b3237fbfb34194c114cb + md5: 678284738efc450afcf90f70365f7318 + depends: + - __osx >=10.13 + - libzlib >=1.3.1,<2.0a0 + license: Unlicense + size: 980106 + timestamp: 1751135725501 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.50.2-h6fb428d_0.conda + sha256: 6b51a9e7366d6cd26e50d1d0646331d457999ebb88af258f06a74f075e95bf68 + md5: b2dc1707166040e738df2d514f8a1d22 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: Unlicense + size: 901519 + timestamp: 1751135765345 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.13.8-h93c44a6_0.conda + sha256: 4b29663164d7beb9a9066ddcb8578fc67fe0e9b40f7553ea6255cd6619d24205 + md5: e42a93a31cbc6826620144343d42f472 + depends: + - __osx >=10.13 + - icu >=75.1,<76.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + size: 609197 + timestamp: 1746634704204 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.13.8-h52572c6_0.conda + sha256: 13eb825eddce93761d965da3edaf3a42d868c61ece7d9cf21f7e2a13087c2abe + md5: d7884c7af8af5a729353374c189aede8 + depends: + - __osx >=11.0 + - icu >=75.1,<76.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + size: 583068 + timestamp: 1746634531197 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + sha256: 8412f96504fc5993a63edf1e211d042a1fd5b1d51dedec755d2058948fcced09 + md5: 003a54a4e32b02f7355b50a837e699da + depends: + - __osx >=10.13 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 57133 + timestamp: 1727963183990 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 46438 + timestamp: 1727963202283 +- conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-20.1.7-ha54dae1_0.conda + sha256: 18d3b64965c1f5f7cd24a140b3e4f49191dd579cc8ca6d3db220830caf8aae3d + md5: e240159643214102dc88395c4ecee9cf + depends: + - __osx >=10.13 + constrains: + - openmp 20.1.7|20.1.7.* + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + size: 306443 + timestamp: 1749892271445 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-20.1.7-hdb05f8b_0.conda + sha256: e7d95b50a90cdc9e0fc38bc37f493a61b9d08164114b562bbd9ff0034f45eca2 + md5: 741e1da0a0798d32e13e3724f2ca2dcf + depends: + - __osx >=11.0 + constrains: + - openmp 20.1.7|20.1.7.* + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + size: 281996 + timestamp: 1749892286735 +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + sha256: 0fbacdfb31e55964152b24d5567e9a9996e1e7902fb08eb7d91b5fd6ce60803a + md5: fee3164ac23dfca50cfcc8b85ddefb81 + depends: + - mdurl >=0.1,<1 + - python >=3.9 + license: MIT + license_family: MIT + size: 64430 + timestamp: 1733250550053 +- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 + md5: 592132998493b3ff25fd7479396e8351 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 14465 + timestamp: 1733255681319 +- conda: https://conda.anaconda.org/conda-forge/osx-64/mpfr-4.2.1-haed47dc_3.conda + sha256: dddb6721dff05b8dfb654c532725330231fcb81ff1e27d885ee0cdcc9fccf1c4 + md5: d511e58aaaabfc23136880d9956fa7a6 + depends: + - __osx >=10.13 + - gmp >=6.3.0,<7.0a0 + license: LGPL-3.0-only + license_family: LGPL + size: 373396 + timestamp: 1725746891597 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda + sha256: 4463e4e2aba7668e37a1b8532859191b4477a6f3602a5d6b4d64ad4c4baaeac5 + md5: 4e4ea852d54cc2b869842de5044662fb + depends: + - __osx >=11.0 + - gmp >=6.3.0,<7.0a0 + license: LGPL-3.0-only + license_family: LGPL + size: 345517 + timestamp: 1725746730583 +- conda: https://conda.anaconda.org/conda-forge/osx-64/mpi-1.0-openmpi.tar.bz2 + sha256: 1326b28195e8808cebc18a593f84c5cbd606826a150dd7e0365f11b86238b5df + md5: 8c3bc725bf4d10fc6e56031f7543771f + license: BSD 3-clause + size: 4394 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpi-1.0-openmpi.tar.bz2 + sha256: 7051ff40ca1208c06db24f8bf5cf72ee7ad03891e7fd365c3f7a4190938ae83a + md5: cb269c879b1ac5e5ab62a3c17528c40f + license: BSD 3-clause + size: 4294 + timestamp: 1605464601195 +- conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda + sha256: ea4a5d27ded18443749aefa49dc79f6356da8506d508b5296f60b8d51e0c4bd9 + md5: ced34dd9929f491ca6dab6a2927aff25 + depends: + - __osx >=10.13 + license: X11 AND BSD-3-Clause + size: 822259 + timestamp: 1738196181298 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733 + md5: 068d497125e4bf8a66bf707254fff5ae + depends: + - __osx >=11.0 + license: X11 AND BSD-3-Clause + size: 797030 + timestamp: 1738196177597 +- conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.3.1-py313hc518a0f_0.conda + sha256: a3a4c28b173227f32d99776212798b822deeef3907f87badc76b74931b27ed72 + md5: 1bd9317ab52825bc8fa33a32ccc17935 + depends: + - __osx >=10.13 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=18 + - liblapack >=3.9.0,<4.0a0 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + size: 7602309 + timestamp: 1751342608687 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.3.1-py313h41a2e72_0.conda + sha256: 35346fa9da0a6a8776d4235469c1513b116d2ba3844802da00d5e821bb3e9828 + md5: 3ed1eeb92906e8653c7346854c32dc6e + depends: + - __osx >=11.0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=18 + - liblapack >=3.9.0,<4.0a0 + - python >=3.13,<3.14.0a0 + - python >=3.13,<3.14.0a0 *_cp313 + - python_abi 3.13.* *_cp313 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + size: 6567388 + timestamp: 1751342678109 +- conda: https://conda.anaconda.org/conda-forge/osx-64/openmpi-5.0.8-h442dfbe_100.conda + sha256: 33f53b28c3bd992d97269d58a771150a241e850ecc5ced0b9621b5b5d1b91cbe + md5: e6d65e6c735f119f7c8fcdf671d00c3c + depends: + - __osx >=10.13 + - libcxx >=18 + - libevent >=2.1.12,<2.1.13.0a0 + - libfabric + - libfabric1 >=1.14.0 + - libgfortran 5.* + - libgfortran5 >=13.3.0 + - libgfortran5 >=14.2.0 + - libhwloc >=2.11.2,<2.11.3.0a0 + - libpmix >=5.0.8,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + - mpi 1.0 openmpi + constrains: + - libprrte ==0.0.0 + license: BSD-3-Clause + license_family: BSD + size: 2566988 + timestamp: 1748705118521 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openmpi-5.0.8-hc9a84be_100.conda + sha256: 286c3da1493d43feed2ab6806477706bce5b6343f2d706dcfcc7a4be91c1933d + md5: bc87585958dd4adcbd93f0726c153c7b + depends: + - __osx >=11.0 + - libcxx >=18 + - libevent >=2.1.12,<2.1.13.0a0 + - libfabric + - libfabric1 >=1.14.0 + - libgfortran 5.* + - libgfortran5 >=13.3.0 + - libgfortran5 >=14.2.0 + - libhwloc >=2.11.2,<2.11.3.0a0 + - libpmix >=5.0.8,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + - mpi 1.0 openmpi + constrains: + - libprrte ==0.0.0 + license: BSD-3-Clause + license_family: BSD + size: 2349281 + timestamp: 1748704985121 +- conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.5.0-hc426f3f_1.conda + sha256: bcac94cb82a458b4e3164da8d9bced08cc8c3da2bc3bd7330711a3689c1464a5 + md5: 919faa07b9647beb99a0e7404596a465 + depends: + - __osx >=10.13 + - ca-certificates + license: Apache-2.0 + license_family: Apache + size: 2739181 + timestamp: 1746224401118 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.5.0-h81ee809_1.conda + sha256: 73d366c1597a10bcd5f3604b5f0734b31c23225536e03782c6a13f9be9d01bff + md5: 5c7aef00ef60738a14e0e612cfc5bcde + depends: + - __osx >=11.0 + - ca-certificates + license: Apache-2.0 + license_family: Apache + size: 3064197 + timestamp: 1746223530698 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + sha256: 289861ed0c13a15d7bbb408796af4de72c2fe67e2bcb0de98f4c3fce259d7991 + md5: 58335b26c38bf4a20f399384c33cbcf9 + depends: + - python >=3.8 + - python + license: Apache-2.0 + license_family: APACHE + size: 62477 + timestamp: 1745345660407 +- conda: https://conda.anaconda.org/conda-forge/osx-64/pixi-pack-0.7.1-hffa81eb_0.conda + sha256: 745c3b0cc08bb62978ca19b950a7133bc4836e7bcdcde4085c427d24a7f07e9c + md5: c9c7946408cd9b507134891cd5cea78a + depends: + - __osx >=10.13 + - openssl >=3.5.0,<4.0a0 + constrains: + - __osx >=10.13 + license: BSD-3-Clause + license_family: BSD + size: 4055006 + timestamp: 1751015348578 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixi-pack-0.7.1-h2b2570c_0.conda + sha256: c21345d869cc8aafc61dee6347bd8e0726ede859bb359f3d0902cb6b27995e37 + md5: f1572b4748bcaf5789d4b6c04c9373a5 + depends: + - __osx >=11.0 + - openssl >=3.5.0,<4.0a0 + constrains: + - __osx >=11.0 + license: BSD-3-Clause + license_family: BSD + size: 4091428 + timestamp: 1751015410632 +- conda: https://conda.anaconda.org/conda-forge/osx-64/pixi-unpack-0.7.1-hffa81eb_0.conda + sha256: 3b453bd5f34d3f47fdb27b0d05feb2143a35cdb6bf3b65d7c586bbe9d0f2dc27 + md5: 80906e99a9d2d89118fec2146810ee45 + depends: + - __osx >=10.13 + - openssl >=3.5.0,<4.0a0 + constrains: + - __osx >=10.13 + license: BSD-3-Clause + license_family: BSD + size: 3905794 + timestamp: 1751015348578 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixi-unpack-0.7.1-h2b2570c_0.conda + sha256: d68bd1ba30132e1b75b4bbe6a9686af6cfb0d9c81995cabedeccac9a6ea86edd + md5: 3de0b54adae5fa0d45f159014cfd6dac + depends: + - __osx >=11.0 + - openssl >=3.5.0,<4.0a0 + constrains: + - __osx >=11.0 + license: BSD-3-Clause + license_family: BSD + size: 3887860 + timestamp: 1751015410631 +- conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + sha256: a8eb555eef5063bbb7ba06a379fa7ea714f57d9741fe0efdb9442dbbc2cccbcc + md5: 7da7ccd349dbf6487a7778579d2bb971 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 24246 + timestamp: 1747339794916 +- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + sha256: 5577623b9f6685ece2697c6eb7511b4c9ac5fb607c9babc2646c811b428fd46a + md5: 6b6ece66ebcae2d5f326c77ef2c5a066 + depends: + - python >=3.9 + license: BSD-2-Clause + license_family: BSD + size: 889287 + timestamp: 1750615908735 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda + sha256: b92afb79b52fcf395fd220b29e0dd3297610f2059afac45298d44e00fcbf23b6 + md5: 513d3c262ee49b54a8fec85c5bc99764 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 95988 + timestamp: 1743089832359 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda + sha256: 93e267e4ec35353e81df707938a6527d5eb55c97bf54c3b87229b69523afb59d + md5: a49c2283f24696a7b30367b7346a0144 + depends: + - colorama >=0.4 + - exceptiongroup >=1 + - iniconfig >=1 + - packaging >=20 + - pluggy >=1.5,<2 + - pygments >=2.7.2 + - python >=3.9 + - tomli >=1 + constrains: + - pytest-faulthandler >=2 + license: MIT + license_family: MIT + size: 276562 + timestamp: 1750239526127 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-asyncio-cooperative-0.37.0-pyhd8ed1ab_0.conda + sha256: f9a717b72e5058acac7029ef4c87a3f8d0c7a8f863709683cf43f9eebc2cfa4f + md5: 16e23a1ae321fc74cb4a2bd5826b060e + depends: + - pytest + - python >=3.7 + license: BSD-3-Clause + license_family: BSD + size: 14317 + timestamp: 1724014353378 +- conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.13.5-hc3a4c56_102_cp313.conda + build_number: 102 + sha256: 8b2f14010eb0baf04ed1eb3908c9e184cd14512c4d64c43f313251b90e75b345 + md5: afa9492a7d31f6f7189ca8f08aceadac + depends: + - __osx >=10.13 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.0,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.50.1,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.0,<4.0a0 + - python_abi 3.13.* *_cp313 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + license: Python-2.0 + size: 13955531 + timestamp: 1750063132430 + python_site_packages_path: lib/python3.13/site-packages +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.5-hf3f3da0_102_cp313.conda + build_number: 102 + sha256: ee1b09fb5563be8509bb9b29b2b436a0af75488b5f1fa6bcd93fe0fba597d13f + md5: 123b7f04e7b8d6fc206cf2d3466f8a4b + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.0,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.50.1,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.0,<4.0a0 + - python_abi 3.13.* *_cp313 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + license: Python-2.0 + size: 12931515 + timestamp: 1750062475020 + python_site_packages_path: lib/python3.13/site-packages +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-7_cp313.conda + build_number: 7 + sha256: 0595134584589064f56e67d3de1d8fcbb673a972946bce25fb593fb092fdcd97 + md5: e84b44e6300f1703cb25d29120c5b1d8 + constrains: + - python 3.13.* *_cp313 + license: BSD-3-Clause + license_family: BSD + size: 6988 + timestamp: 1745258852285 +- conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda + sha256: 53017e80453c4c1d97aaf78369040418dea14cf8f46a2fa999f31bd70b36c877 + md5: 342570f8e02f2f022147a7f841475784 + depends: + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + size: 256712 + timestamp: 1740379577668 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + sha256: 7db04684d3904f6151eff8673270922d31da1eea7fa73254d01c437f49702e34 + md5: 63ef3f6e6d6d5c589e64f11263dc5676 + depends: + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + size: 252359 + timestamp: 1740379663071 +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.0.0-pyh29332c3_0.conda + sha256: d10e2b66a557ec6296844e04686db87818b0df87d73c06388f2332fda3f7d2d5 + md5: 202f08242192ce3ed8bdb439ba40c0fe + depends: + - markdown-it-py >=2.2.0 + - pygments >=2.13.0,<3.0.0 + - python >=3.9 + - typing_extensions >=4.0.0,<5.0.0 + - python + license: MIT + license_family: MIT + size: 200323 + timestamp: 1743371105291 +- conda: https://conda.anaconda.org/conda-forge/osx-64/scotch-7.0.6-h40132e6_1.conda + sha256: 4aa1c7c0e204c5bca2ac5182ccd0c7daef596947675bb94f9f40b53f6880f758 + md5: b27c6557f9770700b323d33375cb5e3d + depends: + - libscotch 7.0.6 h7a28ce2_1 + license: CECILL-C + size: 73534 + timestamp: 1737537275388 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/scotch-7.0.6-hc1c4572_1.conda + sha256: c421e67cd3a181260ab5c00516d998298aa9f83fc94a5bc02b3411bebf07f332 + md5: 46252b1112d47b6f3631b77682f285ed + depends: + - libscotch 7.0.6 he56f69b_1 + license: CECILL-C + size: 76008 + timestamp: 1737537359259 +- conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_2.conda + sha256: b24468006a96b71a5f4372205ea7ec4b399b0f2a543541e86f883de54cd623fc + md5: 9864891a6946c2fe037c02fca7392ab4 + depends: + - __osx >=10.13 + - libzlib >=1.3.1,<2.0a0 + license: TCL + license_family: BSD + size: 3259809 + timestamp: 1748387843735 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda + sha256: cb86c522576fa95c6db4c878849af0bccfd3264daf0cc40dd18e7f4a7bfced0e + md5: 7362396c170252e7b7b0c8fb37fe9c78 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: TCL + license_family: BSD + size: 3125538 + timestamp: 1748388189063 +- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda + sha256: 18636339a79656962723077df9a56c0ac7b8a864329eb8f847ee3d38495b863e + md5: ac944244f1fed2eb49bae07193ae8215 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 19167 + timestamp: 1733256819729 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.0-h32cad80_0.conda + sha256: b8cabfa54432b0f124c0af6b6facdf8110892914fa841ac2e80ab65ac52c1ba4 + md5: a1cdd40fc962e2f7944bc19e01c7e584 + depends: + - typing_extensions ==4.14.0 pyhe01879c_0 + license: PSF-2.0 + license_family: PSF + size: 90310 + timestamp: 1748959427551 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.0-pyhe01879c_0.conda + sha256: 8561db52f278c5716b436da6d4ee5521712a49e8f3c70fcae5350f5ebb4be41c + md5: 2adcd9bb86f656d3d43bf84af59a1faf + depends: + - python >=3.9 + - python + license: PSF-2.0 + license_family: PSF + size: 50978 + timestamp: 1748959427551 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + sha256: 5aaa366385d716557e365f0a4e9c3fca43ba196872abbbe3d56bb610d131e192 + md5: 4222072737ccff51314b5ece9c7d6f5a + license: LicenseRef-Public-Domain + size: 122968 + timestamp: 1742727099393 +- conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h8210216_2.conda + sha256: c171c43d0c47eed45085112cb00c8c7d4f0caa5a32d47f2daca727e45fb98dca + md5: cd60a4a5a8d6a476b30d8aa4bb49251a + depends: + - __osx >=10.13 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 485754 + timestamp: 1742433356230 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_2.conda + sha256: 0d02046f57f7a1a3feae3e9d1aa2113788311f3cf37a3244c71e61a93177ba67 + md5: e6f69c7bcccdefa417f056fa593b40f0 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 399979 + timestamp: 1742433432699 diff --git a/pixi.toml b/pixi.toml new file mode 100644 index 0000000..fa1ab71 --- /dev/null +++ b/pixi.toml @@ -0,0 +1,33 @@ +[project] +authors = ["Gabriel S. Gerlero "] +channels = ["conda-forge"] +description = "Native OpenFOAM for macOS" +name = "openfoam-app" +platforms = ["osx-arm64", "osx-64"] + +[system-requirements] +macos = "11" + +[dependencies] +pixi-pack = ">=0.7.0" +pixi-unpack = ">=0.7.0" +pytest = ">=8.3.3" +pytest-asyncio-cooperative = ">=0.37.0" +foamlib = ">=0.6.6" + +[feature.openfoam.dependencies] +llvm-openmp = ">=19.1.1" +openmpi = ">=5.0.5" +fftw = ">=3.3.10" +scotch = ">=7.0.5" +cgal-cpp = ">=5.6.1,<6" +bash = ">=5.2.21" + +[feature.openfoam.target.osx-64.dependencies] +blas = { version = ">=2.128,<3", build = "blis" } + +[feature.openfoam.target.osx-arm64.dependencies] +blas = { version = ">=2.128,<3", build = "accelerate" } + +[environments] +openfoam = {features = ["openfoam"], no-default-feature = true} diff --git a/scripts/bundle_deps.py b/scripts/bundle_deps.py deleted file mode 100755 index 3eb5803..0000000 --- a/scripts/bundle_deps.py +++ /dev/null @@ -1,63 +0,0 @@ -#!/usr/bin/env python3 -""" -Copy Homebrew dependencies installed with Homebrew Bundle. -""" -import subprocess -import shutil - -from pathlib import Path - -import macho - -SRC_PREFIX = Path(subprocess.run(["brew", "--prefix"], stdout=subprocess.PIPE, text=True, check=True).stdout.strip()) - -def bundle_list(): - return subprocess.run(["brew", "bundle", "list"], stdout=subprocess.PIPE, text=True, check=True).stdout.splitlines() - -def deps(*formulae, union=False): - cmd = ["brew", "deps"] - if union: - cmd.append("--union") - return subprocess.run([*cmd, *formulae], stdout=subprocess.PIPE, text=True, check=True).stdout.splitlines() - -def copy_installed_formula(formula, dst_prefix, *, relative_install_names=False): - dst_prefix = Path(dst_prefix) - - _, _, name = formula.rpartition("/") - - src_opt = SRC_PREFIX / "opt" / name - dst_opt = dst_prefix / "opt" / name - - src_cellar = SRC_PREFIX / "Cellar" / name - dst_cellar = dst_prefix / "Cellar" / name - - shutil.copytree(src_cellar, dst_cellar) - - dst_opt.parent.mkdir(exist_ok=True) - shutil.copy(src_opt, dst_opt, follow_symlinks=False) - - # Relocate binaries - for file in dst_cellar.rglob("*"): - if not file.is_file(): - continue - if (file.suffix == ".dylib" or file.suffix == ".so"): - macho.change_dylib_id(file, dst_opt.absolute() / Path(*file.relative_to(dst_cellar).parts[1:])) - if (file.suffix == "" or file.suffix == ".dylib" or file.suffix == ".so"): - for install_name in macho.get_install_names(file): - if install_name.is_absolute() and install_name.is_relative_to(SRC_PREFIX): - if install_name.is_relative_to(SRC_PREFIX): - new_install_name = dst_prefix.absolute() / install_name.relative_to(SRC_PREFIX) - macho.change_install_name(file, install_name, new_install_name, relative=relative_install_names) - - -dst_prefix = Path("usr") -formulae = bundle_list() - -for formula in formulae: - print(f"Bundling {formula}") - copy_installed_formula(formula, dst_prefix, relative_install_names=True) - -for formula in deps(*formulae, union=True): - if formula not in formulae: - print(f"Bundling {formula} (indirect dependency)") - copy_installed_formula(formula, dst_prefix, relative_install_names=True) diff --git a/scripts/macho.py b/scripts/macho.py deleted file mode 100644 index 8d21651..0000000 --- a/scripts/macho.py +++ /dev/null @@ -1,38 +0,0 @@ -""" -Utility functions for working with macOS Mach-O files. -""" -import subprocess -import platform -import sys - -if sys.version_info < (3, 12): - import os - -from pathlib import Path - -def _codesign(file): - subprocess.run(["codesign", "--sign", "-", "--force", "--preserve-metadata=entitlements,requirements,flags,runtime", file], check=True) - -def change_dylib_id(lib, id): - subprocess.run(["install_name_tool", "-id", id, lib], check=True) - if platform.machine() == "arm64": - _codesign(lib) - -def get_install_names(file): - otool_stdout = subprocess.run(["otool", "-L", file], stdout=subprocess.PIPE, text=True, check=True).stdout - install_names = [Path(line.rpartition(" (compatibility version ")[0].strip()) for line in otool_stdout.splitlines()[1:]] - return install_names - -def change_install_name(file, old_install_name, new_install_name, *, relative=False): - file = Path(file).absolute() - if relative: - new_install_name = Path(new_install_name) - assert new_install_name.is_absolute() - if sys.version_info >= (3, 12): - new_install_name = new_install_name.relative_to(file.parent, walk_up=True) - else: # No walk_up parameter in Python < 3.12 - new_install_name = Path(os.path.relpath(new_install_name, start=file.parent)) - new_install_name = "@loader_path" / new_install_name - subprocess.run(["install_name_tool", "-change", old_install_name, new_install_name, file], check=True) - if platform.machine() == "arm64": - _codesign(file) diff --git a/scripts/relativize_install_names.py b/scripts/relativize_install_names.py deleted file mode 100755 index 5875cf6..0000000 --- a/scripts/relativize_install_names.py +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env python3 -""" -Replace absolute references to dylibs in OpenFOAM binaries with relative references. -""" - -import subprocess - -from pathlib import Path - -import macho - -def relativize_install_names(file, lib_dirs): - for install_name in macho.get_install_names(file): - if install_name.is_absolute(): - for lib_dir,new_lib_dir in lib_dirs.items(): - lib_dir = lib_dir.absolute() - if install_name.is_relative_to(lib_dir): - new_install_name = new_lib_dir.absolute() / install_name.relative_to(lib_dir) - macho.change_install_name(file, install_name, new_install_name, relative=True) - break - -# Replace references to dependencies -lib_dirs = {Path("usr").resolve(): Path("usr")} # In case "usr" is a symlink - -# Replace references to OpenFOAM libraries if necessary -OPENFOAM_VERSION = int(subprocess.run(["bin/foamEtcFile", "-show-api"], stdout=subprocess.PIPE, text=True, check=True).stdout) -if OPENFOAM_VERSION < 2312: - # References are already relative in OpenFOAM >= 2312 - # See https://develop.openfoam.com/Development/openfoam/-/issues/2948 - LIB_DIR, = list(Path("platforms").glob("*/lib")) - MPI_LIB_DIR, = list(Path("platforms").glob("*/lib/*mpi*")) - DUMMY_LIB_DIR, = list(Path("platforms").glob("*/lib/dummy")) - lib_dirs[DUMMY_LIB_DIR] = MPI_LIB_DIR # Replace references to dummy MPI libraries with the actual MPI libraries - lib_dirs[LIB_DIR] = LIB_DIR - - -for lib in Path("platforms").glob("*/lib/**/*.dylib"): - relativize_install_names(lib, lib_dirs) - -for bin in Path("platforms").glob("*/bin/*"): - relativize_install_names(bin, lib_dirs) diff --git a/sources/OpenFOAM-v2412.tgz.sha256 b/sources/OpenFOAM-v2412.tgz.sha256 new file mode 100644 index 0000000..e7e5824 --- /dev/null +++ b/sources/OpenFOAM-v2412.tgz.sha256 @@ -0,0 +1 @@ +c353930105c39b75dac7fa7cfbfc346390caa633a868130fd8c9816ef5f732cd sources/OpenFOAM-v2412.tgz diff --git a/sources/OpenFOAM-v2506.tgz.sha256 b/sources/OpenFOAM-v2506.tgz.sha256 new file mode 100644 index 0000000..e0e564f --- /dev/null +++ b/sources/OpenFOAM-v2506.tgz.sha256 @@ -0,0 +1 @@ +63d26f48ae7ee9a7806a0ceb339ef8a0ba485a4714d54fbfb31e78e1a4849965 sources/OpenFOAM-v2506.tgz diff --git a/tests/requirements.txt b/tests/requirements.txt deleted file mode 100644 index f96574f..0000000 --- a/tests/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -pytest>=7,<7.3 -pytest-asyncio-cooperative>=0.37.0,<0.38 -foamlib>=0.6.0,<0.7.0 diff --git a/tests/test_basic.py b/tests/test_basic.py index 5da3a50..10711dd 100644 --- a/tests/test_basic.py +++ b/tests/test_basic.py @@ -6,10 +6,11 @@ from foamlib import AsyncFoamCase @pytest.fixture -async def pitz_case(tmp_path): +async def pitz(): case = AsyncFoamCase(Path(os.environ["FOAM_TUTORIALS"]) / "incompressible" / "simpleFoam" / "pitzDaily") - return await case.clone(tmp_path / case.name) + async with case.clone() as clone: + yield clone @pytest.mark.asyncio_cooperative -async def test_pitz(pitz_case): - await pitz_case.run() +async def test_pitz(pitz): + await pitz.run() diff --git a/tests/test_foamy.py b/tests/test_foamy.py index 3bb5aab..7566893 100644 --- a/tests/test_foamy.py +++ b/tests/test_foamy.py @@ -6,9 +6,10 @@ from foamlib import AsyncFoamCase @pytest.fixture -async def blob(tmp_path): +async def blob(): case = AsyncFoamCase(Path(os.environ["FOAM_TUTORIALS"]) / "mesh" / "foamyHexMesh" / "blob") - return await case.clone(tmp_path / case.name) + async with case.clone() as clone: + yield clone @pytest.mark.parametrize("parallel", [False, True]) @pytest.mark.asyncio_cooperative diff --git a/tests/test_parallel.py b/tests/test_parallel.py index b9894cb..e0e5093 100644 --- a/tests/test_parallel.py +++ b/tests/test_parallel.py @@ -6,9 +6,10 @@ from foamlib import AsyncFoamCase @pytest.fixture -async def flange(tmp_path): +async def flange(): case = AsyncFoamCase(Path(os.environ["FOAM_TUTORIALS"]) / "basic" / "laplacianFoam" / "flange") - return await case.clone(tmp_path / case.name) + async with case.clone() as clone: + yield clone @pytest.mark.asyncio_cooperative async def test_serial(flange): diff --git a/tests/test_regression.py b/tests/test_regression.py index 7ec5a08..d4eb76e 100644 --- a/tests/test_regression.py +++ b/tests/test_regression.py @@ -7,9 +7,10 @@ from foamlib import AsyncFoamCase @pytest.fixture -async def step(tmp_path): +async def step(): case = AsyncFoamCase(Path(os.environ["FOAM_TUTORIALS"]) / "incompressible" / "simpleFoam" / "backwardFacingStep2D") - return await case.clone(tmp_path / case.name) + async with case.clone() as clone: + yield clone @pytest.mark.asyncio_cooperative async def test_step(step):