ForCAD

Find us on…

GitHub

ForCAD

GitHub Version Documentation Setup Fortran Conda CI/CD codecov License DOI

ForCAD: A parallel Fortran library for geometric modeling using NURBS (Non-Uniform Rational B-Splines).

ForCAD supports B-Spline, NURBS, Bezier and Rational Bezier curves, surfaces and volumes.

Table of Contents

Main Features

  • Parallelized using do concurrent.
  • Create NURBS objects by specifying control points, weights and knots.
  • Refine NURBS objects by inserting or removing knots and elevating degree.
  • Compute analytical basis functions and their first and second derivatives for NURBS and B-Spline objects.
  • Generation of IGA-compatible element connectivity and shape functions.
  • Obtain visualized elements connectivity and coordinates for geometry and control geometry.
  • Mesh insertion into a NURBS object.
  • Export NURBS objects to VTK files for visualization.
  • Export of NURBS curves and surfaces to IGES format (volumes currently not supported).
  • Includes predefined NURBS shapes: Circle, Half Circle, Tetragon, Hexahedron, 2D Ring, Half 2D Ring, 3D Ring, Half 3D Ring, C-shapes.
  • Rotate and translate NURBS objects.
  • Visualization using provided python PyVista scripts.
  • Least squares fitting for B-Spline curves, surfaces and volumes.
  • Numerical integration of: NURBS curve length, NURBS surface area and NURBS volume.

Examples

Below are some sample outputs from the examples directory:

Installation

Requirements

Note: Latest compiler versions are required to ensure compatibility.

Clone the repository

Clone the ForCAD repository from GitHub:

git clone https://github.com/gha3mi/forcad.git
cd forcad

Install PyVista (Optional)

To install PyVista, run the following command:

pip install pyvista

Using fpm

Running Examples with fpm

fpm run --example <file name excluding the .f90 extension> --compiler gfortran --profile release --flag "-ftree-parallelize-loops=8 -march=native"

After executing the examples, .vtk files will be generated in the vtk directory. To visualize these files, a show() method is provided which utilizes PyVista. Alternatively, other visualization tools like ParaView can also be used.

Using ForCAD as a fpm Dependency

If you want to use ForCAD as a dependency in your own fpm project, you can easily include it by adding the following line to your fpm.toml file:

[dependencies]
forcad = {git="https://github.com/gha3mi/forcad.git"}

Using CMake

Install

cmake -S . -B build/cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX=. -G Ninja
cmake --build build/cmake --config Release
cmake --install build/cmake --config Release --verbose

Uninstall

cmake --build build/cmake --target uninstall

Using ForCAD with CMake

find_package(forcad REQUIRED)
add_executable(app main.f90)
target_link_libraries(app PRIVATE forcad::forcad)

Configuration

Do Concurrent Support

Compiler flags for enabling do concurrent parallelism:

Compiler Flag(s)
gfortran -fopenmp -ftree-parallelize-loops=n
ifx -qopenmp -fopenmp-target-do-concurrent
nvfortran -stdpar=multicore,gpu -Minfo=stdpar,accel
flang-new ?
lfortran ?

Compiler flags can be passed to fpm using the --flag option, for example:

fpm build --flag "-stdpar=multicore,gpu -Minfo=stdpar,accel"

Alternatively, flags can be added to a fpm.rsp file in the root directory of the project.

Precision Configuration

The library uses double precision (real64) by default for all real-valued computations. To change the precision, you can define one of the following preprocessor flags during compilation:

Preprocessor Flag Fortran Kind Description
REAL32 selected_real_kind(6) Single precision
REAL64 (default) selected_real_kind(15) Double precision
REALXDP selected_real_kind(18) Extended double precision
REAL128 selected_real_kind(33) Quadruple precision

Note: The examples example_ppm1.f90, example_ppm2.f90 and example_ppm3.f90 use the ForColormap library, which only supports REAL64 precision.

Example: Building with double precision

fpm build --profile release --flag "-DREAL64"

CI Status

Compiler macos ubuntu windows
flang-new - fpm ✅ cmake ✅ fpm ✅ cmake ✅
gfortran fpm ✅ cmake ✅ fpm ✅ cmake ✅ fpm ✅ cmake ✅
ifx - fpm ✅ cmake ✅ fpm ✅ cmake ❌
lfortran fpm ❌ cmake ❌ fpm ❌ cmake ❌ fpm ❌ cmake ❌
nvfortran - fpm ✅ cmake ✅ -

This table is automatically generated by the CI workflow using setup-fortran-conda.

API documentation

The most up-to-date API documentation for the master branch is available here. To generate the API documentation for ForCAD using ford run the following command:

ford README.md

Roadmap

For a detailed roadmap outlining upcoming features and enhancements, please refer to ROADMAP.md.

Contributing

To contribute to ForCAD, please review the CONTRIBUTING.md.

Citation

If you use ForCAD in your research, please cite it as follows:

@software{seyed_ali_ghasemi_2025_10904447,
  author       = {Ghasemi, S. A.},
  title        = {gha3mi/ForCAD},
  year         = {2025},
  publisher    = {Zenodo},
  doi          = {10.5281/zenodo.10904447},
  url          = {https://doi.org/10.5281/zenodo.10904447}
}

References

  • Piegl, L., & Tiller, W. (1995). The NURBS Book. In Monographs in Visual Communications. Springer Berlin Heidelberg. https://doi.org/10.1007/978-3-642-97385-7

  • An Introduction to NURBS. (2001). Elsevier. https://doi.org/10.1016/b978-1-55860-669-2.x5000-3

  • Sullivan et al., (2019). PyVista: 3D plotting and mesh analysis through a streamlined interface for the Visualization Toolkit (VTK). Journal of Open Source Software, 4(37), 1450, https://doi.org/10.21105/joss.01450

  • Ahrens, James, Geveci, Berk, Law, Charles, ParaView: An End-User Tool for Large Data Visualization, Visualization Handbook, Elsevier, 2005, ISBN-13: 9780123875822

Developer Info

Seyed Ali Ghasemi