- Notifications
You must be signed in to change notification settings - Fork10
ForCAD - A parallel Fortran library for geometric modeling using NURBS
License
gha3mi/forcad
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
ForCAD: A parallel Fortran library for geometric modeling using NURBS (Non-Uniform Rational B-Splines).
ForCAD supportsB-Spline,NURBS,Bezier andRational Bezier curves, surfaces and volumes.
- Table of Contents
- Main Features
- Examples
- Installation
- Configuration
- Dependencies
- CI Status
- API documentation
- Contributing
- Citation
- References
- 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 NURBS curves, surfaces and volumes.
- Numerical integration of: NURBS curve length, NURBS surface area and NURBS volume.
Below are some sample outputs from theexamples directory:
Fortran compiler:
- GNU Fortran (
gfortran) - Intel Fortran Compiler (
ifx) - NVIDIA HPC SDK Fortran Compiler (
nvfortran) - LLVM Flang (
flang)
Note: Latest compiler versions are required to ensure compatibility.
- GNU Fortran (
Build system:
Optional visualization tools:
Clone the ForCAD repository from GitHub:
git clone https://github.com/gha3mi/forcad.gitcd forcadTo install PyVista, run the following command:
pip install pyvista
By default PyVista visualization is enabled. To disable it, define the preprocessor flagNOSHOW_PYVISTA in thefpm.toml file or pass it as a compiler flag.
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 thevtk directory. To visualize these files, ashow() method is provided which utilizes PyVista. Alternatively, other visualization tools like ParaView can also be used.
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 yourfpm.toml file:
[dependencies]forcad = {git="https://github.com/gha3mi/forcad.git"}
cmake -S. -B build/cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX=. -G Ninjacmake --build build/cmake --config Releasecmake --install build/cmake --config Release --verbosecmake --build build/cmake --target uninstall
find_package(forcad REQUIRED)add_executable(app main.f90)target_link_libraries(appPRIVATE forcad::forcad)
Compiler flags for enablingdo 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) | -fopenmp -fdo-concurrent-to-openmp=[host|device] |
lfortran | ? |
flang-new 21.1.0: warning: Mappingdo concurrent to OpenMP is still experimental.
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 afpm.rsp file in the root directory of the project.
The library usesdouble 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 examplesexample_ppm1.f90,example_ppm2.f90 andexample_ppm3.f90 use theForColormap library, which only supportsREAL64 precision.
Example: Building with double precision
fpm build --profile release --flag"-DREAL64"flowchart LR N1[forcad] N2[forIGES] N3[fordebug] N4[forunittest] N5[forimage] N6[forcolormap] N7[fortime] N8[FACE] click N1 href "https://github.com/gha3mi/forcad" "A parallel Fortran library for geometric modeling using NURBS" click N2 href "https://github.com/rweed/forIGES" "Modern Fortran Library for Reading and Writing IGES CAD Files" click N3 href "https://github.com/gha3mi/fordebug" "A Fortran library for handling errors, warnings and info messages with debugging support in pure procedures" click N4 href "https://github.com/gha3mi/forunittest" "A Fortran library for unit testing" click N5 href "https://github.com/gha3mi/forimage" "A Fortran library for processing and editing images and managing colors" click N6 href "https://github.com/vmagnin/forcolormap" "A Fortran colormap library" click N7 href "https://github.com/gha3mi/fortime" "A Fortran library for measuring elapsed time, DATE_AND_TIME time, CPU time, OMP time and MPI time" click N8 href "https://github.com/szaghi/FACE" "Fortran Ansi Colors (and Styles) Environment" %% core dependencies N1 --> N2 N1 --> N3 N3 --> N7 N7 --> N8 %% example dependency (dashed line) N1 -.->|example| N6 N6 --> N5 %% test dependency (dotted line) N1 ...->|test| N4 N4 --> N8Graph generated withfpm-deps, modified to include example and test dependencies.
| Compiler | macos | ubuntu | windows |
|---|---|---|---|
flang-new | - | fpm ✅ cmake ✅ | fpm ✅ cmake ✅ |
gfortran | fpm ✅ cmake ✅ | fpm ✅ cmake ✅ | fpm ✅ cmake ✅ |
ifx | - | fpm ✅ cmake ✅ | fpm ✅ cmake ✅ |
nvfortran | - | fpm ✅ cmake ✅ | - |
This table is automatically generated by the CI workflow usingsetup-fortran-conda.
The most up-to-date API documentation for the master branch is availablehere.To generate the API documentation for ForCAD usingford run the followingcommand:
ford README.md
To contribute to ForCAD, please review theCONTRIBUTING.md.
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}}
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
About
ForCAD - A parallel Fortran library for geometric modeling using NURBS
Topics
Resources
License
Contributing
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Packages0
Uh oh!
There was an error while loading.Please reload this page.





















