Installing

The BC variant is Fortran. There are two ways to get it, and the first is the one to try.

From PyPI

$ pip install "fresh-fvsbc[fvs]"

That is the whole install. The fvs extra pulls `fresh-fvsbc-pyfvs`, which is the BC variant itself: a self-contained wheel with libgfortran bundled inside it by auditwheel repair. Nothing else has to be installed — no gfortran, no meson, no patch sets — and the extension loads the bundled library through its patched RPATH.

The wheels are Linux x86_64, glibc 2.28 or later: RHEL 8+, Ubuntu 20.04+, Debian 10+, and every current cluster. ldd –version on the machine answers whether it will run there. One wheel is published per Python from 3.10 to 3.13.

Note

Do not install upstream ``pyfvs`` in the same environment. The fork installs the same pyfvs import package under a different distribution name, fresh-fvsbc-pyfvs, so that the two cannot be confused; pip will not stop you from installing both, and whichever wins the import is the one you get.

From source

If there is no wheel for your platform, the build recipe is ADR 0004, ADR 0006, and ADR 0013: clone the pinned fork, apply six patch sets, and build. It needs gfortran, meson, ninja and patchelf, and it takes a few minutes:

$ git clone https://github.com/UBC-FRESH/PyFVS.git
$ git -C PyFVS checkout e95172b
$ git -C PyFVS submodule update --init --recursive
$ gunzip -c notes/reference/pyfvs-patchset.diff.gz  | git -C PyFVS apply -
$ gunzip -c notes/reference/fvsbc-patchset.diff.gz   | git -C PyFVS/fvs apply -
$ gunzip -c notes/reference/calibration/w2-subzones.patch.gz | git -C PyFVS/fvs apply -
$ gunzip -c notes/reference/calibration/w3-habtyp-boundary.patch.gz | git -C PyFVS/fvs apply -
$ gunzip -c notes/reference/calibration/w2-five-zone.patch.gz | git -C PyFVS/fvs apply -
$ gunzip -c notes/reference/calibration/w4-sbps-small-tree.patch.gz | git -C PyFVS/fvs apply -
$ SETUPTOOLS_SCM_PRETEND_VERSION=0.4.1 pip install --no-build-isolation ./PyFVS \
    --config-settings=setup-args="-Dfvsvariants=bc"
$ pip install fresh-fvsbc

The third patch adds the 19 W2.3 subzones and their provisional defaults. Without it the variant still builds, but those codes fall back to ICHmw2/01; run_case refuses that fallback rather than returning a plausible run. The fourth fixes the KAM + MS boundary collision that made MSxk1 resolve as MSmm. The final two patches add the five-zone prototype and fix the SBPS small-tree height branch. The patched wheel is versioned 0.4.1 and is the fvs extra for fresh-fvsbc 0.21.4. The wrapper now accepts the five prototype zones; the binary carries their provisional parser and defaults. That is deployment plumbing, not calibration: IDFdk and SBS have passed holdouts; CWH and BWBS have unsigned growth pilots; none is certified. CDF, MH, and CMA are screening/validation-only.

What you get

$ python -c "import pyfvs; print(pyfvs.list_variants())"
{'BC': {'lib': 'pyfvs.fvsbc', 'status': 'OK'}}
$ fresh-fvsbc population.json --directory run --species FD --tree-age 21 ...

If list_variants() reports anything but OK for BC, the build did not produce the variant and no run will work. That is the first thing to check, and notes/reference/fvsbc-smoke-run.md is a worked example.