Conda: mac-arm builds of legacy dolfin and development version available

For folks using legacy dolfin via conda, there are two recent developments that might be of interest:

  • there are now native mac arm builds of legacy dolfin on conda-forge, so arm mac users can now conda install fenics without having to use the intel builds via emulation.

  • Since it was requested, the current development version of legacy dolfin is now also available under the fenics-dev label, which you can get with:

    conda install -c conda-forge -c conda-forge/label/fenics-dev fenics-dolfin mpich
    

    The version of fenics-dolfin will be 2019.2.0.dev20240219.

2 Likes

Hi @minrk, I would try to install the 2019.2.0dev version of fenics with conda in order to try and reproduce this issue

This is my environment.yml file:

name: festim-workshop_dev_fenics
channels:
  - conda-forge
  - defaults
  - conda-forge/label/fenics-dev
dependencies:
  - fenics-dolfin
  - mpich
  - matplotlib
  - meshio[all]
  - numpy==1.24
  - pip>=20.1
  - ipykernel
  - nbconvert
  - mpi4py<4
  - mshr
  - pip:
    - festim~=1.3
    - pyparsing
    - h-transport-materials==0.16

Env created with conda env create -f environment.yml.

conda list fenics gives:

# packages in environment at /home/remidm/miniconda3/envs/festim-workshop_dev_fenics:
#
# Name                    Version                   Build  Channel
fenics-dijitso            2019.1.0          pyhd8ed1ab_39    conda-forge
fenics-dolfin             2019.1.0        py311h849a80a_48    conda-forge
fenics-ffc                2019.1.0          pyhd8ed1ab_39    conda-forge
fenics-fiat               2019.1.0          pyhd8ed1ab_39    conda-forge
fenics-libdolfin          2019.1.0            h1268e15_48    conda-forge
fenics-ufl                2019.1.0        py311h38be061_38    conda-forge

I expected 2019.2.0

Am I missing something?

Two reasons: channel priority and mshr

channel priority means that packages on conda-forge that satisfy requirements will be preferred to those in conda-forge/label/fenics-dev because it appears earlier in the list, so use:

channels:
  - conda-forge/label/fenics-dev
  - conda-forge

to prefer packages with the fenics-dev label. Alternatively, specify the version you want (fenics-dolfinx=2019.2).

(note: it’s advisable to remove defaults from your channel lists if you are using conda-forge)

The second reason is that mshr requires fenics-dolfin 2019.1, so can’t be installed together with the 2019.2.dev and there isn’t a dev build of mshr. So if you remove mshr, you’ll get 2019.2.dev.

If you request 2019.2 explicitly, you’ll get more informative conflict errors if it’s unsatisfiable, rather than just not getting the version you expect.

1 Like

Unfortunately, the installation doesn’t seem to work well on Ubuntu 24.04 via the conda command mentioned. (I can’t import the legacy dolfin library as shown below in newly created conda environment.)

~$ python3 --version
> Python 3.12.7

~$ python3 -c "import dolfin;print(dolfin.__version__)"
> Traceback (most recent call last):
  File "<string>", line 1, in <module>
ModuleNotFoundError: No module named 'dolfin'

Is it possible to use the legacy dolfin 2019.2.0.dev version on Ubuntu? I was wondering if folks have any specific plans.

Please do a conda env export, so that one can see what is in the environment.

Thanks for the reply @dokken! :+1:
The legacy dolfin 2019.2.0.dev (Python 3.12.7) environment is built with the command

~$ conda create -n dolfin-2019.2.0.dev -c conda-forge -c conda-forge/label/fenics-dev fenics-dolfin mpich
~$ conda install -c conda-forge https://conda.anaconda.org/conda-forge/label/fenics-dev/linux-64/fenics-dolfin-2019.2.0.dev20240219-py39hfa0d945_0.conda

I extracted the conda environment I built now, and it looks like below.

name: dolfin-2019.2.0.dev
channels:
  - conda-forge/label/fenics-dev
  - conda-forge
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
dependencies:
  - _libgcc_mutex=0.1=conda_forge
  - _openmp_mutex=4.5=2_gnu
  - binutils_impl_linux-64=2.43=h4bf12b8_2
  - binutils_linux-64=2.43=h4852527_2
  - bzip2=1.0.8=h4bc722e_7
  - c-ares=1.34.2=heb4867d_0
  - ca-certificates=2024.8.30=hbcca054_0
  - cpython=3.12.7=py312hd8ed1ab_0
  - eigen=3.4.0=h00ab1b0_0
  - fenics-dijitso=2019.1.0=pyhd8ed1ab_39
  - fenics-dolfin=2019.2.0.dev20240219=py39hfa0d945_0
  - fenics-ffc=2019.1.0=pyhd8ed1ab_39
  - fenics-fiat=2019.1.0=pyhd8ed1ab_39
  - fenics-libdolfin=2019.1.0=h1cfe99e_49
  - fenics-ufl=2019.1.0=pyhd8ed1ab_16
  - fftw=3.3.10=mpi_mpich_hbcf76dd_10
  - gcc=13.3.0=h9576a4e_1
  - gcc_impl_linux-64=13.3.0=hfea6d02_1
  - gcc_linux-64=13.3.0=hc28eda2_5
  - gmp=6.3.0=hac33072_2
  - gmpy2=2.1.5=py312h7201bc8_2
  - gxx=13.3.0=h9576a4e_1
  - gxx_impl_linux-64=13.3.0=hdbfa832_1
  - gxx_linux-64=13.3.0=h6834431_5
  - hdf5=1.14.3=mpi_mpich_h0f54ddc_5
  - hypre=2.31.0=mpi_mpich_hd1da18f_1
  - icu=75.1=he02047a_0
  - kernel-headers_linux-64=3.10.0=he073ed8_18
  - keyutils=1.6.1=h166bdaf_0
  - krb5=1.21.3=h659f571_0
  - ld_impl_linux-64=2.43=h712a8e2_2
  - libaec=1.1.3=h59595ed_0
  - libblas=3.9.0=25_linux64_openblas
  - libboost=1.84.0=hb8260a3_6
  - libboost-headers=1.86.0=ha770c72_2
  - libcblas=3.9.0=25_linux64_openblas
  - libcurl=8.10.1=hbbe4b11_0
  - libedit=3.1.20191231=he28a2e2_2
  - libev=4.33=hd590300_2
  - libexpat=2.6.4=h5888daf_0
  - libffi=3.4.2=h7f98852_5
  - libgcc=14.2.0=h77fa898_1
  - libgcc-devel_linux-64=13.3.0=h84ea5a7_101
  - libgcc-ng=14.2.0=h69a702a_1
  - libgfortran=14.2.0=h69a702a_1
  - libgfortran-ng=14.2.0=h69a702a_1
  - libgfortran5=14.2.0=hd5240d6_1
  - libgomp=14.2.0=h77fa898_1
  - libhwloc=2.11.2=default_he43201b_1000
  - libiconv=1.17=hd590300_2
  - liblapack=3.9.0=25_linux64_openblas
  - libnghttp2=1.64.0=h161d5f1_0
  - libnsl=2.0.1=hd590300_0
  - libopenblas=0.3.28=pthreads_h94d23a6_1
  - libptscotch=7.0.4=h2376d02_5
  - libsanitizer=13.3.0=heb74ff8_1
  - libscotch=7.0.4=h3055ed5_5
  - libsqlite=3.47.0=hadc24fc_1
  - libssh2=1.11.0=h0841786_0
  - libstdcxx=14.2.0=hc0a3c3a_1
  - libstdcxx-devel_linux-64=13.3.0=h84ea5a7_101
  - libstdcxx-ng=14.2.0=h4852527_1
  - libuuid=2.38.1=h0b41bf4_0
  - libxcrypt=4.4.36=hd590300_1
  - libxml2=2.13.4=hb346dea_2
  - libzlib=1.3.1=hb9d3cd8_2
  - metis=5.1.0=hd0bcaf9_1007
  - mpc=1.3.1=h24ddda3_1
  - mpfr=4.2.1=h90cbb55_3
  - mpi=1.0.1=mpich
  - mpi4py=4.0.1=py312h0a6c937_0
  - mpich=4.2.3=h670b19f_100
  - mpmath=1.3.0=pyhd8ed1ab_0
  - mumps-include=5.7.3=ha770c72_0
  - mumps-mpi=5.7.3=hd6ed86c_0
  - ncurses=6.5=he02047a_1
  - numpy=1.26.4=py312heda63a1_0
  - openssl=3.3.2=hb9d3cd8_0
  - parmetis=4.0.3=hc7bef4e_1007
  - petsc=3.21.5=real_hbe534a9_101
  - petsc4py=3.21.5=py312h23142ab_1
  - pip=24.3.1=pyh8b19718_0
  - pkg-config=0.29.2=h4bc722e_1009
  - pkgconfig=1.5.5=pyhd8ed1ab_4
  - pybind11=2.13.5=py312h68727a3_1
  - pybind11-global=2.13.5=py312h68727a3_1
  - python=3.12.7=hc5c86c4_0_cpython
  - python_abi=3.12=5_cp312
  - readline=8.2=h8228510_1
  - scalapack=2.2.0=h7e29ba8_4
  - setuptools=75.3.0=pyhd8ed1ab_0
  - six=1.16.0=pyh6c4a22f_0
  - slepc=3.21.2=real_h00a54ed_300
  - slepc4py=3.21.2=py312h7b22130_0
  - suitesparse=7.8.3=hb42a789_0
  - superlu=5.2.2=h00795ac_0
  - superlu_dist=9.0.0=h3feb4ed_1
  - sympy=1.13.3=pyh2585a3b_104
  - sysroot_linux-64=2.17=h4a8ded7_18
  - tbb=2022.0.0=hceb3a55_0
  - tk=8.6.13=noxft_h4845f30_101
  - tzdata=2024b=hc8b5060_0
  - wheel=0.44.0=pyhd8ed1ab_0
  - xz=5.2.6=h166bdaf_0
  - yaml=0.2.5=h7f98852_2
  - zlib=1.3.1=hb9d3cd8_2
  - zstd=1.5.6=ha6fb4c9_0
prefix: ~/miniconda3/envs/dolfin-2019.2.0.dev

When the first conda environment was created, the version of legacy dolfin was 2019.1.0.
I wonder if there is a problem with linking while executing the second command (updating to legacy dolfin 2019.2.0.dev)… I don’t know how to solve it.

P.S.) Actually, I wanted to run the code with additional constraints in legacy FEniCS.
I know I should probably use dolfinx_mpc (I’m studying because I don’t understand the concept very well. If you have any easy-to-understand study material, I’d love to hear about it.), but I wanted to make sure it would run on legacy FEniCS as well.

I mainly use the conda environment, so I didn’t proceed with a local legacy FEniCS installation with PPA added.
(I was worried about package conflicts between legacy FEniCS and FEniCSx each version :pleading_face:)

Passing a full package URL to conda install is a way to skip solving the environment for dependencies. It only downloads and extracts that exact package (this is a way to test installing packages that conda would otherwise refuse to install due to broken dependencies).

The reason you are not getting the dev version is you have specified the conda-forge channel as higher priority than fenics-dev and not specified a version. Since there is a version of fenics-dolfin on conda-forge, the fenics-dev label is never considered. Both of these should work:

prefer fenics-dev label to default conda-forge by putting it first:

conda create -n dolfin-2019.2.0.dev -c conda-forge/label/fenics-dev -c conda-forge fenics-dolfin mpich

or (even better) tell conda the version you want to install:

conda create -n dolfin-2019.2.0.dev -c conda-forge/label/fenics-dev -c conda-forge 'fenics-dolfin=2019.2.*' mpich
2 Likes

I found that the order of conda environment commands is also important. Both methods you showed me work, @minrk thanks! :+1: