Skip to main content

Fortran to Python interface generator with derived type support

Project description

f90wrap: Fortran to Python interface generator with derived type support

Build Status Documentation

f90wrap is a tool to automatically generate Python extension modules which interface to Fortran code that makes use of derived types. It builds on the capabilities of the popular f2py utility by generating a simpler Fortran 90 interface to the original Fortran code which is then suitable for wrapping with f2py, together with a higher-level Pythonic wrapper that makes the existance of an additional layer transparent to the final user.

Copyright (C) James Kermode 2011-2021. Released under the GNU Lesser General Public License, version 3. Parts originally based on f90doc - automatic documentation generator for Fortran 90. Copyright (C) 2004 Ian Rutt.

If you would like to license the source code under different terms, please contact James Kermode james.kermode@gmail.com

Dependencies

  1. Python 3.9+ (Python 2.7 no longer supported)
  2. Recent version of numpy which includes f2py
  3. Fortran compiler - tested with gfortran 4.6+ and recent ifort 12+

Installation

For the latest stable release, install with pip:

pip install f90wrap

There is also a conda package on conda-forge:

conda install -c conda-forge f90wrap

For the development version, installation is as follows:

pip install git+https://github.com/jameskermode/f90wrap

Note that if your Fortran 90 compiler has a non-standard name (e.g. gfortran-9) then you need to set the F90 environment variable prior to installing f90wrap to ensure it uses the correct one, e.g.

F90=gfortran-9 pip install f90wrap

Examples and Testing

To test the installation, run make test from the examples/ directory. You may find the code in the various examples useful.

Citing f90wrap

If you find f90wrap useful in academic work, please cite the following (open access) publication:

J. R. Kermode, f90wrap: an automated tool for constructing deep Python interfaces to modern Fortran codes. J. Phys. Condens. Matter (2020) doi:10.1088/1361-648X/ab82d2

BibTeX entry:

@ARTICLE{Kermode2020-f90wrap,
  title    = "f90wrap: an automated tool for constructing deep Python
              interfaces to modern Fortran codes",
  author   = "Kermode, James R",
  journal  = "J. Phys. Condens. Matter",
  month    =  mar,
  year     =  2020,
  keywords = "Fortran; Interfacing; Interoperability; Python; Wrapping codes;
              f2py",
  language = "en",
  issn     = "0953-8984, 1361-648X",
  pmid     = "32209737",
  doi      = "10.1088/1361-648X/ab82d2"
}

Case studies

f90wrap has been used to wrap the following large-scale scientific applications:

  • QUIP - molecular dynamics code
  • CASTEP - CasPyTep wrappers for electronic structure code
  • QEpy - Python wrapper for Quantum Espresso electronic structure code

See this Jupyter notebook from a recent seminar for more details.

Usage

To use f90wrap to wrap a set of Fortran 90 source files and produce wrappers suitable for input to f2py use:

f90wrap -m MODULE F90_FILES

where MODULE is the name of the Python module you want to produce (e.g. the name of the Fortran code you are wrapping) and F90_FILES is a list of Fortran 90 source files containing the modules, types and subroutines you would like to expose via Python.

This will produce two types of output: Fortran 90 wrapper files suitable for input to f2py to produce a low-level Python extension module, and a high-level Python module desinged to be used together with the f2py-generated module to give a more Pythonic interface.

One Fortran 90 wrapper file is written for each source file, named f90wrap_F90_FILE.f90, plus possibly an extra file named f90wrap_toplevel.f90 if there are any subroutines or functions defined outside of modules in F90_FILES.

To use f2py to compile these wrappers into an extension module, use:

f2py -c -m _MODULE OBJ_FILES f90wrap_*.f90 *.o

where _MODULE is the name of the low-level extension module.

Optionally, you can replace f2py with f2py-f90wrap, which is a slightly modified version of f2py included in this distribution that introduces the following features:

  1. Allow the Fortran present() intrinsic function to work correctly with optional arguments. If an argument to an f2py wrapped function is optional and is not given, replace it with NULL.
  2. Allow Fortran routines to raise a RuntimeError exception with a message by calling an external function f90wrap_abort(). This is implemented using a setjmp()/longjmp() trap.
  3. Allow Fortran routines to be interrupted with Ctrl+C by installing a custom interrupt handler before the call into Fortran is made. After the Fortran routine returns, the previous interrupt handler is restored.

Direct-C mode extensions

Quick build: f90wrap --build -m mymodule source.f90

Manual compilation: f90wrap --direct-c -m mymodule source.f90

Python package (pyproject.toml + setup.py):

[build-system]
requires = ["setuptools", "numpy", "f90wrap"]

[project]
name = "mypackage"
version = "0.1.0"

[tool.setuptools.packages]
find = {}
# setup.py
from setuptools import setup
from f90wrap.setuptools_ext import F90WrapExtension, build_ext_cmdclass

setup(ext_modules=[F90WrapExtension("mymodule", ["src/mymodule.f90"])],
      cmdclass=build_ext_cmdclass())

Result: import mypackage then use mypackage.mymodule

Notes

  • Unlike standard f2py, f90wrap converts all intent(out) arrays to intent(in, out). This was a deliberate design decision to allow allocatable and automatic arrays of unknown output size to be used. It is hard in general to work out what size array needs to be allocated, so relying on the the user to pre-allocate from Python is the safest solution.
  • Scalar arguments without intent are treated as intent(in) by f2py. To have inout scalars, you need to call f90wrap with the --default-to-inout flag and declare the python variables as 1-length numpy arrays (numpy.zeros(1) for example).
  • Pointer arguments are not supported.
  • Arrays of derived types are currently not fully supported: a workaround is provided for 1D-fixed-length arrays, i.e. type(a), dimension(b) :: c. In this case, the super-type Type_a_Xb_Array will be created, and the array of types can be accessed through c.items. Note that dimension b can not be :, but can be a parameter.
  • Doxygen documentation in Fortran sources are parsed and given as docstring in corresponding python interfaces. Doxygen support is partial and keyword support is limited to brief, details, file, author and copyright.

Troubleshooting

NumPy 2.0+ and Meson Backend Issues

Starting with NumPy 2.0, the f2py build system transitioned from distutils to meson. This can cause issues with f90wrap, particularly when Fortran module files (.mod files) cannot be found during compilation.

Symptom: Errors like "Cannot open module file 'modulename.mod' for reading" during the f2py-f90wrap compilation step.

Workarounds:

  1. Set FFLAGS to include current directory (recommended):

    export FFLAGS="-I$(pwd)"
    f2py-f90wrap -c -m _mymodule f90wrap_*.f90 *.o
    
  2. Use the --build-dir option with f2py-f90wrap:

    f2py-f90wrap --build-dir build -c -m _mymodule f90wrap_*.f90 mymodule.f90
    

    Note: When using --build-dir, pass the original .f90 source files instead of pre-compiled .o files, as the meson backend needs to compile them in the build directory where the .mod files will be generated.

  3. Downgrade to NumPy < 2.0 (temporary):

    pip install 'numpy<2.0'
    

Note: The f2py-f90wrap script includes patches to help with the meson backend, including automatic handling of include paths and library directories when using --build-dir. If you encounter issues, please report them at https://github.com/jameskermode/f90wrap/issues

How f90wrap works

There are five steps in the process of wrapping a Fortran 90 routine to allow it to be called from Python.

  1. The Fortran source files are scanned, building up an abstract symbol tree (AST) which describes all the modules, types, subroutines and functions found.

  2. The AST is transformed to remove nodes which should not be wrapped (e.g. private symbols in modules, routines with arguments of a derived type not defined in the project, etc.)

  3. The f90wrap.f90wrapgen.F90WrapperGenerator class is used to write a simplified Fortran 90 prototype for each routine, with derived type arguments replaced by integer arrays containing a representation of a pointer to the derived type, in the manner described in Pletzer2008. This allows opaque references to the true Fortran derived type data structures to be passed back and forth between Python and Fortran.

  4. Standard mode (default): f2py is used to combine the F90 wrappers and the original compiled functions into a Python extension module (optionally, f2py can be replaced by f2py-f90wrap, a slightly modified version which adds support for exception handling and interruption during exceution of Fortran code).

    Direct-C mode (--direct-c): As an alternative to f2py, the f90wrap.directc_cgen package generates C code using the Python C API to call the F90 wrappers directly. This eliminates the f2py dependency.

  5. The f90wrap.pywrapgen.PythonWrapperGenerator class is used to write a thin object-oriented layer on top of the f2py (or Direct-C) generated wrapper functions which handles conversion between Python object instances and Fortran derived-type variables, converting arguments back and forth automatically.

Advanced Features

Additional command line arguments can be passed to f90wrap to customize how the wrappers are generated. See the examples/ directory to see how some of the options are used:

  -h, --help            show this help message and exit
  -v, --verbose         set verbosity level [default: None]
  -V, --version         show program's version number and exit
  -p PREFIX, --prefix PREFIX
                        Prefix to prepend to arguments and subroutines.
  -c [CALLBACK [CALLBACK ...]], --callback [CALLBACK [CALLBACK ...]]
                        Names of permitted callback routines.
  -C [CONSTRUCTORS [CONSTRUCTORS ...]], --constructors [CONSTRUCTORS [CONSTRUCTORS ...]]
                        Names of constructor routines.
  -D [DESTRUCTORS [DESTRUCTORS ...]], --destructors [DESTRUCTORS [DESTRUCTORS ...]]
                        Names of destructor routines.
  -k KIND_MAP, --kind-map KIND_MAP
                        File containting Python dictionary in f2py_f2cmap
                        format
  -s STRING_LENGTHS, --string-lengths STRING_LENGTHS
                        "File containing Python dictionary mapping string
                        length names to values
  -S DEFAULT_STRING_LENGTH, --default-string-length DEFAULT_STRING_LENGTH
                        Default length of character strings
  -i INIT_LINES, --init-lines INIT_LINES
                        File containing Python dictionary mapping type names
                        to necessary initialisation code
  -I INIT_FILE, --init-file INIT_FILE
                        Python source file containing code to be added to
                        autogenerated __init__.py
  -A ARGUMENT_NAME_MAP, --argument-name-map ARGUMENT_NAME_MAP
                        File containing Python dictionary to rename Fortran
                        arguments
  --short-names SHORT_NAMES
                        File containing Python dictionary mapping full type
                        names to abbreviations
  --py-mod-names PY_MOD_NAMES
                        File containing Python dictionary mapping Fortran
                        module names to Python ones
  --class-names CLASS_NAMES
                        File containing Python dictionary mapping Fortran type
                        names to Python classes
  --joint-modules JOINT_MODULES
                        File containing Python dictionary mapping modules
                        defining times to list of additional modules defining
                        methods
  -m MOD_NAME, --mod-name MOD_NAME
                        Name of output extension module (without .so
                        extension).
  -M, --move-methods    Convert routines with derived type instance as first
                        agument into class methods
  --shorten-routine-names
                        Remove type name prefix from routine names, e.g.
                        cell_symmetrise() -> symmetrise()
  -P, --package         Generate a Python package instead of a single module
  -a ABORT_FUNC, --abort-func ABORT_FUNC
                        Name of Fortran subroutine to invoke if a fatal error
                        occurs
  --auto-raise-error AUTO_RAISE_ERROR
                        Generate calls to abort subroutine in f90wrap fortran wrappers: 'err_num_variable,err_msg_variable'
  --only [ONLY [ONLY ...]]
                        Subroutines to include in wrapper
  --skip [SKIP [SKIP ...]]
                        Subroutines to exclude modules and subroutines from
                        wrapper
  --skip-types [SKIP_TYPES [SKIP_TYPES ...]]
                        Subroutines to exclude types from wrapper
  --force-public [FORCE_PUBLIC [FORCE_PUBLIC ...]]
                        Names which are forced to be make public
  --default-to-inout    Sets all arguments without intent to intent(inout)
  --conf-file CONF_FILE
                        Use Python configuration script to set options
  --documentation-plugin DOCUMENTATION_PLUGIN
                        Use Python script for expanding the documentation of
                        functions and subroutines. All lines of the given tree
                        object are passed to it with a reference to its
                        documentation
  --py-max-line-length PY_MAX_LINE_LENGTH
                        Maximum length of lines in python files written.
                        Default: 80
  --f90-max-line-length F90_MAX_LINE_LENGTH
                        Maximum length of lines in fortan files written.
                        Default: 120
  --type-check          Check for type/shape matching of Python argument with the wrapped Fortran subroutine
  --direct-c            Generate direct-C extension instead of relying on f2py

Author

James Kermode jameskermode

Key Contributors

Developer Notes

Triggering the wheel build

Wheels are built on push and pull requests to master using cibuildwheel with this workflow.

To make a release candidate create a tag with a suffix such as -rc1 for the first attempt, push to trigger the build:

git commit -m 'release v0.x.z.rc1'
git tag v0.x.y.rc1
git push --tags

If all goes well, the .whl files will show up as assets within a new GitHub release. The installation process can now be tested locally.

Release wheels to PyPI

Once everything works correctly, make a full release (i.e. create a tag named just v0.x.y without the -rc1 suffix). This will trigger the upload of wheels and source distribution to PyPI.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

f90wrap-0.3.0.tar.gz (3.0 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

f90wrap-0.3.0-cp313-cp313-win_amd64.whl (187.2 kB view details)

Uploaded CPython 3.13Windows x86-64

f90wrap-0.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (166.7 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

f90wrap-0.3.0-cp313-cp313-macosx_13_0_x86_64.whl (161.7 kB view details)

Uploaded CPython 3.13macOS 13.0+ x86-64

f90wrap-0.3.0-cp313-cp313-macosx_13_0_arm64.whl (161.6 kB view details)

Uploaded CPython 3.13macOS 13.0+ ARM64

f90wrap-0.3.0-cp312-cp312-win_amd64.whl (187.2 kB view details)

Uploaded CPython 3.12Windows x86-64

f90wrap-0.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (166.7 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

f90wrap-0.3.0-cp312-cp312-macosx_13_0_x86_64.whl (161.7 kB view details)

Uploaded CPython 3.12macOS 13.0+ x86-64

f90wrap-0.3.0-cp312-cp312-macosx_13_0_arm64.whl (161.6 kB view details)

Uploaded CPython 3.12macOS 13.0+ ARM64

f90wrap-0.3.0-cp311-cp311-win_amd64.whl (186.9 kB view details)

Uploaded CPython 3.11Windows x86-64

f90wrap-0.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (166.5 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

f90wrap-0.3.0-cp311-cp311-macosx_13_0_x86_64.whl (161.3 kB view details)

Uploaded CPython 3.11macOS 13.0+ x86-64

f90wrap-0.3.0-cp311-cp311-macosx_13_0_arm64.whl (161.3 kB view details)

Uploaded CPython 3.11macOS 13.0+ ARM64

f90wrap-0.3.0-cp310-cp310-win_amd64.whl (186.9 kB view details)

Uploaded CPython 3.10Windows x86-64

f90wrap-0.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (166.5 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

f90wrap-0.3.0-cp310-cp310-macosx_13_0_x86_64.whl (161.3 kB view details)

Uploaded CPython 3.10macOS 13.0+ x86-64

f90wrap-0.3.0-cp310-cp310-macosx_13_0_arm64.whl (161.3 kB view details)

Uploaded CPython 3.10macOS 13.0+ ARM64

f90wrap-0.3.0-cp39-cp39-win_amd64.whl (186.7 kB view details)

Uploaded CPython 3.9Windows x86-64

f90wrap-0.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (166.4 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

f90wrap-0.3.0-cp39-cp39-macosx_13_0_x86_64.whl (161.4 kB view details)

Uploaded CPython 3.9macOS 13.0+ x86-64

File details

Details for the file f90wrap-0.3.0.tar.gz.

File metadata

  • Download URL: f90wrap-0.3.0.tar.gz
  • Upload date:
  • Size: 3.0 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.14

File hashes

Hashes for f90wrap-0.3.0.tar.gz
Algorithm Hash digest
SHA256 9c9f08768fe7e9d60de9e913e30909fa1bdc67828f49dffd7149089703d74836
MD5 8eccd7329ce4ae0f20e4b00e047ce3b5
BLAKE2b-256 7f9713c692bec83025e3ba04141d5d7d27056350e6dba2676ac90674c7685776

See more details on using hashes here.

File details

Details for the file f90wrap-0.3.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: f90wrap-0.3.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 187.2 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.9

File hashes

Hashes for f90wrap-0.3.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 f42f6cf5e0e45aff5c69da0a35a7c04ff3b2ba6f28017101076bce2dcf2befbc
MD5 204c872ad171fc07837419bc5d1af1cf
BLAKE2b-256 f6dfd2c1a599cb33262f83b347603ae1644aff11b6c8591d41cb3187ad47b134

See more details on using hashes here.

File details

Details for the file f90wrap-0.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for f90wrap-0.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 cee36bbc32e71ab833b9337800a0b3d783c0499fbf59c620c039d1595b9ac409
MD5 61ab610bcf7430f51f734e5220ff654b
BLAKE2b-256 c729244ef14e8e66af40f7b9aeff8dab907c305f5339cab2f4fa1a66d958e71d

See more details on using hashes here.

File details

Details for the file f90wrap-0.3.0-cp313-cp313-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for f90wrap-0.3.0-cp313-cp313-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 ad6eaef0381f3ffdee04f335b292153c6f7255e97d05391c1f8387ab304e12e3
MD5 8f1944f276580fe9634bd73653588aea
BLAKE2b-256 1d3426da7af98368d9a73b19e06a14677e589f7b678788614e3d0c49a0deedaf

See more details on using hashes here.

File details

Details for the file f90wrap-0.3.0-cp313-cp313-macosx_13_0_arm64.whl.

File metadata

File hashes

Hashes for f90wrap-0.3.0-cp313-cp313-macosx_13_0_arm64.whl
Algorithm Hash digest
SHA256 633b9a535427d88d40a4e07c0ad171163b91557d4907945629d26387b23ad12e
MD5 c86242242b7c1eb7781486882065c913
BLAKE2b-256 685e06422bca5b4aa5cbd518da036477ba16ca5fcde507c3d7e412f2b9c6a23e

See more details on using hashes here.

File details

Details for the file f90wrap-0.3.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: f90wrap-0.3.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 187.2 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.9

File hashes

Hashes for f90wrap-0.3.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 16e2667769e79479c9b3da31c661abf6a5e3c9ac1291c8ea666530ead75ac7e9
MD5 d5190875d7e5592ecc86ab09f2effb56
BLAKE2b-256 6ba0b6e713396b6c08cdb96877a972d4d2b8578b7f6da0d8cd55b4dc832e32b9

See more details on using hashes here.

File details

Details for the file f90wrap-0.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for f90wrap-0.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7025ae7fe5dca83e7956bc90b8ad5f6507a9ff1426e3ee987f175603ee466760
MD5 c9e2c7efd6038ea828163834e714103a
BLAKE2b-256 7fa7457aaa2d6c0810e235e82b92acb91a29bb83a5e2410ca5524222800fe699

See more details on using hashes here.

File details

Details for the file f90wrap-0.3.0-cp312-cp312-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for f90wrap-0.3.0-cp312-cp312-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 943e2f2a5a0cadd7bedb70714688a9f2a0ba2d5560ad59dfcc5b277b874ad45f
MD5 8a5b66b0b6e89af2fe51aa37a9815c59
BLAKE2b-256 a98b77c54f8992c7a1cd7dc4a855d9a8822d6b38d7d4ffeefaf408b5e7fae12d

See more details on using hashes here.

File details

Details for the file f90wrap-0.3.0-cp312-cp312-macosx_13_0_arm64.whl.

File metadata

File hashes

Hashes for f90wrap-0.3.0-cp312-cp312-macosx_13_0_arm64.whl
Algorithm Hash digest
SHA256 9fc0900d979b0a09f299dd13c8769034f4972f5ba0ff0ffea2e18a3b19931ecd
MD5 abc152e01f17640cab7f76cb34db2cd7
BLAKE2b-256 67256d6a42cbd2c9756c05e97fe58d15824b070eef8489027771d09c4ce0517c

See more details on using hashes here.

File details

Details for the file f90wrap-0.3.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: f90wrap-0.3.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 186.9 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.9

File hashes

Hashes for f90wrap-0.3.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 d1bafe9368f1dbbb24f4b1ba9d3e1b28a016c7ac8c21fe47324926d528f022a4
MD5 4f7cbd0f158552dd3da13ae1d3b72dc6
BLAKE2b-256 23e97bef02f6387791b4c3e76f345922945dcd421271d251b9fabe921ba3b1c7

See more details on using hashes here.

File details

Details for the file f90wrap-0.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for f90wrap-0.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f8523e8522cb2454650a67a0cf2f638d3778da817f1a700c656217936c37e881
MD5 5abe87b756b88e0c0700c18ee8cb2620
BLAKE2b-256 9b1520a02538c70f5154bbdf0839eba96dd33a1169fcedb8da2cc7838678ba94

See more details on using hashes here.

File details

Details for the file f90wrap-0.3.0-cp311-cp311-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for f90wrap-0.3.0-cp311-cp311-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 9d3d55646406e77abdb0a4eb0aa01750868e32fa012ce3353d8b6ecd229385d6
MD5 199ec8ea8e9836ceb5145553f32a39cf
BLAKE2b-256 7f5c8fe292f02eaefb19a62cd89b00d8780b6c141e776a42decf42ef93d16126

See more details on using hashes here.

File details

Details for the file f90wrap-0.3.0-cp311-cp311-macosx_13_0_arm64.whl.

File metadata

File hashes

Hashes for f90wrap-0.3.0-cp311-cp311-macosx_13_0_arm64.whl
Algorithm Hash digest
SHA256 26ba42d17a0df8d5db72c855213330338f0baf991ebaa1e2877b64f1f1b3b2d8
MD5 b9a4b4119a0bdc80b749713bd8ee7e7c
BLAKE2b-256 8656e452ce3b971c985ecdf338c995091e5ac5385da0cbeeee92bdce8bb852c5

See more details on using hashes here.

File details

Details for the file f90wrap-0.3.0-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: f90wrap-0.3.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 186.9 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.9

File hashes

Hashes for f90wrap-0.3.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 a75a8ef8f46acbcbc030a5bfe9fe639c183a059f03e3cb35c1497dbd3dd0f307
MD5 7f7e8bf6279bbf244e2d0b37dcf2ba7c
BLAKE2b-256 3749049983e9a0c1ec70169803ae463e2724844161b6c4e341dc90bc22d15ebf

See more details on using hashes here.

File details

Details for the file f90wrap-0.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for f90wrap-0.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d046c8b97103cc72a87f015cbcab9a1276d1361eb77d78aaff2469604545b47b
MD5 034388f41dff267374e0e3b6dd5c8ead
BLAKE2b-256 e6a8aa6527a31072babaa922d2018f0153c8e50e8c39c4b190f5108f7a687bb5

See more details on using hashes here.

File details

Details for the file f90wrap-0.3.0-cp310-cp310-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for f90wrap-0.3.0-cp310-cp310-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 e3b4f8e546c69f9ab4dfc87df1b621f1de76948bd13fb29014799113e095ca73
MD5 fe5ba6a1624a2e6a69850b33aba37c16
BLAKE2b-256 1ff652165b731209455551f7e6a7c662b7b687fc82bc623dd76f1eebd9af297f

See more details on using hashes here.

File details

Details for the file f90wrap-0.3.0-cp310-cp310-macosx_13_0_arm64.whl.

File metadata

File hashes

Hashes for f90wrap-0.3.0-cp310-cp310-macosx_13_0_arm64.whl
Algorithm Hash digest
SHA256 142ff46bb2fe9d8f1b4f7f1296bf89fece716947bfaf06e251cc26b592b9e703
MD5 76c1b6e01e89b30c8387244efa1e33e7
BLAKE2b-256 a6d3152a8359e227b267a39c98260dbb0b3e6a5c268e544a43f5d16c78fae4b0

See more details on using hashes here.

File details

Details for the file f90wrap-0.3.0-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: f90wrap-0.3.0-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 186.7 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.9

File hashes

Hashes for f90wrap-0.3.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 c5dca1cb6c18cf097a3a39945365ac3325a4ece4ac2e96cec7e3114d2eb2e74b
MD5 d3453341862a455b8de2ecedf191bedb
BLAKE2b-256 ff67f582273f43a9f951e7af04fba71f2e6f2f40016ea6e2bf6ac1dd69ce1baf

See more details on using hashes here.

File details

Details for the file f90wrap-0.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for f90wrap-0.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 24102783437c2b1142e15592baa872607cfb8300632b3c099accffa5f687cd44
MD5 4e9b270c558d36539fb9627ed7d71cbc
BLAKE2b-256 f58a95555dc08fd0d49749054d0def836d3d8924da006fdf92c7ad7260c1b43d

See more details on using hashes here.

File details

Details for the file f90wrap-0.3.0-cp39-cp39-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for f90wrap-0.3.0-cp39-cp39-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 a49b31ba97764c9291a2a4b8bb8277f30c9bf64f2f5de95eb73bff864eeeea27
MD5 bca2bc05b4d3e469eb601565ec4eebf9
BLAKE2b-256 0ba4f2382ed32db6da9d86b6b3adeb969ab078d38ec054b082a46cdc6264c766

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page