The CFD Utility Software Library, a.k.a. CFDTOOLS, contains nearly 30 numerical
analysis libraries and close to 100 utility applications built upon those
libraries. These utilities were developed over a roughly fifty year span to
support aerospace research and development activities at NASA Ames Research
Center (ARC). They are mostly written in Fortran 90 or 77 and are designed with
potential reuse in mind. The library also includes C translations of roughly a
dozen numerics routines in the C_utilities
module.
The library began as the ARC Aerodynamics Division Software Library, and is currently maintained by ARC Entry Systems and Technology Division. David Saunders and Robert Kennelly are the primary authors, with miscellaneous contributions from many others over the years. CFDTOOLS is expected to grow slowly as new functionality is required.
- Single-function tools for manipulating multiblock grids and flow solutions
- Rapid searching/interpolation for structured or unstructured grids (ADT methods)
- Automated gridding for axisymmetric capsules with curvature-based discretization
- Generic optimization frameworks with various applications
- General-purpose numerics subroutines and character-manipulation subroutines
A detailed summary of each library/application is provided below.
The CFDTOOLS software archive is available for download on NASA's public
Github. The software may be cloned
using git
in the typical fashion:
git clone https://www.github.com/nasa/cfdtools.git
Once downloaded, the software is compiled and installed using CMake. The software has no dependencies, and is known to build successfully using relatively recent compilers from Intel and GNU on Ubuntu and SUSE Linux. The basic installation process is as follows:
cd <cfdtools_source_dir>
mkdir build && cd build
cmake -DCMAKE_INSTALL_PREFIX=<cfdtools_install_dir> ..
cmake --build .
cmake --install .
Upon installation, all that is required to use the CFDTOOLS applications is to
add <cfdtools_install_dir>/bin
to the PATH environment variable. If you are
building software that links against the CFDTOOLS library using CMake, simply
add -DCMAKE_PREFIX_PATH=<cfdtools_install_dir>
to the initial CMake
configuration command for your project. Then, in your projects CMakeLists.txt
,
add the following:
find_package(cfdtools REQUIRED)
add_executable(my_program ...)
target_link_libraries(my_program cfdtools::<libname>)
CFDTOOLS also supports direct inclusion as a project submodules using CMake's
add_subdirectory
command.
This software is released under the NASA Open Source Agreement Version 1.3.
To contribute to this software package we require that non-NASA authors assign their rights in the contributed code to NASA. Contributor License Agreements (CLAs) are available in the contrib folder.
Copyright 2021 United States Government as represented by the Administrator of the National Aeronautics and Space Administration. No copyright is claimed in the United States under Title 17, U.S. Code. All Other Rights Reserved.
No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL SOFTWARE, AND DISTRIBUTES IT "AS IS."
Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT.
Component | Description |
---|---|
aa_nurbs | Supplements the DT_NURBS library, for B-spline airfoils |
adt | Rapid search/interpolation within computational meshes |
blaslib | Basic linear algebra subprogram utilities (vectors) |
blas2lib | NAG versions of the Level 2 BLAS Matrix-vector routines |
C_utilities | Handful of C translations from interplib, linsys, etc. |
dt_nurbs | (Dated) David Taylor Naval Research Center NURBS library |
eigenlib | Just the EISPACK routines used by CAVITY_MAP rotations |
forsythe | Original Forsythe, Malcolm & Moler library (historical) |
geomlib | Areas, rotations, nearest points, arc lengths, etc. |
grid_block_utilities | Volume grid analogues of the surface_patch_utilities |
gridlib | Mostly for structured 2/3-space grids; many 1-D distributions |
integrate | Numerical quadrature, mostly 1-D, with a driving program |
interplib | 1-D interpolation & smoothing utilities; see SMOOTH |
interp2d | 2-D interpolation, smoothing, & intersection utilities; see SMOOTH2D |
interp3d | 3-space interpolations, intersections, etc. |
intrinsics | Contains only trig_functions_in_degrees: g95 cosd, etc. |
kdtree | Matthew Kennel's open source package, now an option in FLOW_INTERP |
linsys | Linear system solvers, mostly dense factorization methods |
numodules | Miscellaneous utilities: finite differences, standard deviations, etc. |
obsolete | Still linked to by INTEGRATE, MAXMIN, PROFILE, and SMOOTH |
Optimal_Interpolation | Alexander Barth's Kriging-like package, with extensions |
optlib | 1-D zero/minimum finders; n-D unconstrained methods, etc. |
progtools | String-manipulation & prompting utilities, incl. string_justify module |
searchlib | 1-D search/sort routines; some for 2/3-D now deprecated |
special_functions | A few utilities related to erf(x), normal distributions, etc. |
surface_patch_utilities | For structured surface grids: scale/shift/transpose, etc. |
table_io | I/O utilities for plain text tables (headers + numeric rows) |
tecplot_io | Tecplot I/O package for structured multizone data |
triangulation_io | Tecplot I/O package for triangulated surface data |
ugridlib | Triangle and tetrahedron utilities |
xyq_io | PLOT2D-type multiblock structured grid I/O utilities, in xyzq_io folder |
xyzq_io | PLOT3D-type multiblock structured grid I/O utilities; see also f_io.f90 |
C = CFD, G = General Numerics, P = Programming Tool
Program | Type | Description |
---|---|---|
a2b | G | Converts a (large) ASCII file to a binary stream file. |
adjust_flow | C | Analogue of ADJUST_GRID for PLOT3D-format flow solutions |
adjust_grid | C | 20-odd options: shift/scale/rotate/swap coordinates, etc. |
aero_coefs | C | Aerodynamic force/moment coefs. for structured surface data containing p or Cp |
aerosurf | C | Wing/body/nacelle surface paneling; underlies shape optimization |
anchor | G | Applies Optimal_Interpolation package to aerodynamic or other unstructured data |
blayer | C | Boundary layer analysis of a structured flow solution |
bsprofile | C | B-spline curve analogue of PROFILE airfoil utility |
bump_factors | C | Compare related structured surface solutions as ratios |
capsule_grid | C | Automated surface grid for sphere/cone; many aft body options |
capsule_spokes | C | Supplements POLAR_INTERP by setting up spoked body points for a capsule |
cavity_map | C | Map local cavity flow solution to unit cube; slice it, etc. |
ch_grid | C | Stand-alone form of the automated C-H volume gridding in wing/body design code SYN87 |
columnedit | P | Insert/delete/replace column(s) in a dataset |
combine_blocks | C | Combine multiblock grids/solutions; cavity block options |
combine_blocks_turb | C | COMBINE_BLOCKS variant required for turbulent flows |
compare_blocks | C | Compare related structured grids: identical? maximum differences? |
compare_flows | C | Flow field analogue of COMPARE_BLOCKS (volume / surface) |
compare_patches | C | Surface grid analogue of COMPARE_BLOCKS |
compress2d | C | CAPSULE_GRID tool; adjust upstream boundary, wall spacing, # radial grid points, etc. |
cones_of_sight | C | Body-normal sets of 9 discretized lines forming cones for radiation calculations |
cross_sections | C | Slice a surface dataset (structured / unstructured) at many stations |
curvature | C | Evaluate curvature along X-Y curve; redistribute points according to curvature |
curvature3d | C | X-Y-Z curve analogue of CURVATURE |
deconstruct | C | Convert a multiblock structured surface or volume grid to unstructured form |
distribute | C | Drives available 1-D grid-point distribution utilities |
extract_blocks | C | Extract indicated block(s) from a multiblock grid/flow |
extract_blocks_2d | C | Extract indicated block(s) from a multiblock 2D grid/flow |
extract_columns | GP | Extract column(s); options to scale/shift/reformat |
extract_functions | C | Extract selected functions efficiently from a PLOT3D function file. |
extract_lines | GP | Extract every nth line starting from some line |
extract_peaks | CGP | For a list of files of column data, tabulate peak values |
filter_lines | GP | Remove non-numeric lines (excess headers?) from a table |
flow_interp | C | Volume grid search & flow interpolation (ADT method and KDTREE method) |
flow_interp_2d | C | 2-space analogue of FLOW_INTERP |
gen1d | G | Generate (x,y) datasets from a choice of y = f(x) functions |
gradient_based | CG | Redistribute points along a curve using abs(df/ds), where s is arc length, for some function f |
grid_faces | C | Extract grid block face(s) from a multiblock grid/flow |
gsmooth | C | Elliptic volume grid smoothing; option to detect bad cells |
gu | C | Ryan McDaniel's multi-option tool for PLOT3D grids/flows |
heat_shield | C | Forebody shape optimization, axisymmetric option; Newtonian CL/CD |
hemispheres_of_sight | C | Sets of discretized lines forming hemispheres for radiation calculations; see also SLOS, USLOS |
hyper_aero | C | Driver for available impact methods, including Modified Newtonian |
insert_lines | P | Insert lines from one file into another at some interval |
interp_1d | G | Interactive linear/local spline interpolation, 1-D |
interp_columns | GP | Adaptation of REGULARIZE; variable column to treat as "x" |
join_grid | C | SPLIT_GRID companion for merging blocks |
line_grid | GP | Uniform grid between 2 points in 3-space; extrapolation OK |
lines_of_sight | C | Body-normal |
lines_of_sight_2d | C | 2-space analogue of 3-space LINES_OF_SIGHT |
loc | P | Count lines of code & comments in a Fortran source file |
makelist | P | Make a list of integers for given i1, i2, increment |
maxmin | G | Analogue of SMOOTH for looking at 1st & 2nd derivatives |
merge_blocks | C | Variant of JOIN_GRID allowing for optional function file |
merge_files | C | Merge variables of two Tecplot files (same structured grid) |
merge_tables | GP | Rearrange columns from any number of tables into a new table |
nbyn | G | Interactive solution of square n x n systems; n <= 6 |
neqair_data | C | Converts line-of-sight data from PLOT3D form to NEQAIR form |
neqair_integration | C | Integrates radiances from hemisphere lines of sight to estimate radiative heat flux |
nozzle_throat_conditions | C | Axisymmetric variant of THROAT_CONDITIONS_3D |
npopt_driver | G | Framework for a [sequence of] constrained minimization[s] |
outbound | C | Off-line grid/shock alignment; other redistribution options |
p3d2tec | C | Convert between PLOT3D grid/flow format and Tecplot form |
polar_interp | C | Pad spoked forebody radiation data nonlinearly |
precision | G | Estimate objective function precision (difference table) |
prepare_local_analysis | C | Rapid set-up of DPLR-based damage/repair/feature calculations: cavity / protruding gap-filler |
prepare_neqair_data | C | Facilitates scripting of radiative heating calculations by NEQAIR |
profile | C | Airfoil geometry display/manipulation utility |
qnmdriver2 | G | Framework for one unconstrained optimization (QNMDIF2) |
qnmdriver3 | G | Framework for a sequence of unconstrained optimizations |
radial_interp | C | Rapid volume grid |
radial_interp_2d | C | 2-space RADIAL_INTERP analogue; both one layer of grid blocks |
rectify_grid | C | Ensure right-handedness for 3-space volume or surface grid |
redistribute_xy | C | Redistribute points in a 2- or 3-space line segment (1- or 2-sided stretching) |
refine_grid | C | Densify or thin multiblock grid/flow data, any multipliers |
reflect_blocks | C | Reflect 3-space grid/flow data; save reflected or both halves |
reflect_blocks_2d | C | Reflect 2-space grid/flow data; save reflected or both halves |
reorder_blocks | C | Reorder some or all grid blocks; optional flow file |
reorder_rows | GP | Reorder tabular data so leading n columns vary differently |
reorder_segments | GC | Reorder multiple 1-D Tecplot zones as 1 continuous zone |
reshape | G | For 2 of 2 or more columns, shift/scale/rotate/... (11 options) |
reshape3d | G | 3-space analogue of RESHAPE |
revolve_grid | C | 2-space volume grid --> 3-space; may need RADIAL_INTERP next |
scan_grid | C | Tabulate data range, etc., by grid block; optional flow |
shadowgraph | C | CFD density data --> shadowgraph/schlieren-like image |
shiftscale | G | Interactive calculation of linear coefficients for transforming [a, b] -> [p, q] |
shock_stand_off | C | For volume grid & flow field temperature, calculate shock stand-off distances |
slos | C | USLOS-type merge of LINES_OF_SIGHT & HEMISPHERES_OF_SIGHT (structured grid) |
smooth | G | Drives available 1-D interpolation & smoothing utilities |
smooth2d | G | Bivariate analogue of SMOOTH |
sort_rows | GP | Sorts the output from grep (say) or a list of file names containing numeric substrings. |
sort_surface_slice | C | Sort Tecplot surface slice into 1 or more curves for line plots |
split_grid | C | Split multiblock grid/flow and/or permute indices |
Stardust_Lines | C | Radiation lines of sight for airborne or ground observation of an entry capsule |
Stardust_Integration | C | Companion to Stardust_Lines |
surface_curvature | C | Gaussian/mean/principal curvatures for surface/volume grid |
surface_diffs | C | Map Tecplot surface grid 1 to grid 2; save [%]differences |
surface_interp | C | Interpolate 3-space Tecplot surface data at target data point(s) |
surface_interp_2d | C | Interpolate 2-space Tecplot surface data at target data point(s) |
surface_pad | C | Pad structured surface data nonlinearly: 1-D in i and/or j |
surface_patches | C | ADJUST_GRID variant with more surface_patch_utilities options |
table_arithmetic | G | Manipulate one or two data tables by columns |
template | C | Calculate block interface data and DPLR-type control file (structured volume grid) |
tet_interp | C | Interpolate tetrahedral volume data to a structured multiblock grid |
thin_flow | C | THIN_GRID analogue for multiblock flow data |
thin_grid | C | Extract every mth/nth[/kth] point in i/j[/k] directions |
thin_grid_2d | C | THIN_GRID analogue for 2-space; grid only |
throat_conditions_3d | C | Boundary conditions at arc-jet nozzle: rectangular, circular, semi-elliptic |
trail | GP | Truncate lines and/or strip trailing blanks |
traj_fit | C | Nonlinear least squares fitting of f(rho(t),V(t) = C rho(t)^m V(t)^n via the QNMDRIVER2 framework |
traj_opt | CG | Trajectory optimization: would need an NPOPT license from Stanford University |
tri_to_quad | C | Impose a structured surface on a Tecplot triangulation |
tri_to_tri | C | Interpolate a single-zone Tecplot triangulation dataset to another 1+-zone target triangulation |
triangulation_tool | C | Drives scale/shift/rotate transformations and area/volume/CM/moments of inertia calculations for a Tecplot unstructured surface or volume dataset (1+ zones) |
update_grid | C | Replace one or more grid blocks with same-sized block(s) from other file or files |
upsequence | C | Upsequence coarse cavity/plug/gap filler solution; impose fine local boundary flow |
uslos | C | Merge of LINES_OF_SIGHT & HEMISPHERES_OF_SIGHT for unstructured surfaces |
v2c | C | Convert grid [+ optional flow]: cell vertices to centers |
wingsections | C | B-spline sections + chord/thickness data --> B-spline wing |
xdeck | P | Ancient precursor of TRAIL: remove trailing / leading characters |
xline | P | Remove lines starting with a target string |
- Aug 30 2013: Initial preparation.
- Sep 20 2013: Initial summary uploads to SourceForge.
- Sep 30 2013: Still awaiting final NASA approval to upload software.
- Oct 17 2013: CAPSULE_GRID document uploaded following 2.5-week government shutdown hiatus.
- Oct 22 2013: Folders for all libraries are now set up with subroutine one- liner READMEs.
- Oct 30 2013: Folders for all applications are now set up with README files.
- Jan 24 2014: NASA approval for uploading the software proper.
- Jan 29 2014: All the library *.tar.gz files are now in place; applications still to do.
- Feb 05 2014: All straightforward applications have been uploaded with simple build scripts.
- Feb 10 2014: UPDATE_GRID has been added; it and GSMOOTH now use xyzq_io, not the earlier cfd_io_package.
- Jun 30 2014: Someone needed the DECONSTRUCT utility. A few updates since Feb 10 include solid angle utilities in ugridlib, a handful of functions in special_functions, and a reworked form of the HEMISPHERES_OF_SIGHT application that defines lines of sight at a point on a convex body via a triangulated quadrant of a hemisphere rather than via latitude/longitude discretization.
- Jul 03 2014: TRI_TO_TRI has been added; a triangulation_io glitch has been corrected.
- Aug 07 2014: EXTRACT_BLAYER_DATA has been added to the BLAYER folder.
- Aug 14 2014: Optimal_Interpolation now contains the package for treating unstructured data as modified at NASA Ames from Alexander Barth's original, following NASA approval of its added BSD 2-Clause License.
- Sep 05 2014: FILTER_LINES and MERGE_TABLES have been added.
- Sep 24 2014: Traj_Fit has been added. It curve-fits heat flux or pressure pulse data using f(rho(t),V(t)) = C rho(t)**m V(t)**n within the QNMDRIVER2 framework, as might be needed for TPS sizing at an entry vehicle body point from selected CFD data points.
- Oct 03 2014: The table_io module used by Traj_Fit has been updated.
- Oct 22 2014: The triangulation_io package has been extended with options for calculation of area, volume, CM, and moments of inertia. See the new TRIANGULATION_TOOL for driving these options along with shift/scale/rotate options.
- Nov 17 2014: Unstructured volume analogues of unstructured surface utilities have been added to triangulation_io and are driven by TRIANGULATION_TOOL.
- Mar 18 2015: An apparently inconsequential glitch in BLAYER has been remedied. This version can also read [unformatted] volume datasets to speed processing of large-grid cases.
- Mar 13 2015: OUTBOUND now has an option to applied a CONSTANT margin as a way of moving the forebody boundary a little while barely affecting the wake boundary.
- Apr 15 2015: The ADT rapid search package (/adt) now has 2-space multi- block curve analogues of the 3-space structured multiblock surface grid utilities. LINES_OF_SIGHT_2D uses these to deal with reflected axisymmetric 2-space volume grid. SURFACE_INTERP_2D has been added, using the same 2-space ADT utilities.
- Aug 23 2016: TET_INTERP has been added to interpolate tetrahedral volume data to a structured multiblock grid.
- Mar 17 2017: SORT_ROWS (added Feb 14) has been extended to allow more than one numeric string in a text column, and to allow output in descending order if desired. Other recent refinements: COLUMNEDIT now allows extraction of more than one column at a time; the table_io module has an updated table_io_read_alpha utility prompted by SORT_ROWS that handles the case of all lines/rows treated as text and having the same number of columns (with no header records assumed). Previously, all rows were interpreted as header records, meaning the table appeared empty.
- Jun 23 2017: NEQAIR_DATA, NEQAIR_Integration, and PREPARE_NEQAIR_DATA have been added to assist radiation calculations with NEQAIR. NEQAIR itself should be obtained through the Commercial Technology Office at NASA Ames Research Center.
- Jan 04 2018: Added A2B utility. Since June, minor changes have been made to GU, BLAYER, LINES_OF_SIGHT, SHOCK_STAND_OFF, and OUTBOUND.
- Jun 06 2018: Added Aero_Coefs application (supplement to DPLR's Postflow). Since January, updates have been made to geomlib, gridlib, progtools, searchlib, CAPSULE_GRID, CONVERTQ, GU, HEMISPHERES_- OF_SIGHT, NEQAIR_Integration, RADIAL_INTERP, and RESHAPE3D.
- Sep 19 2018: Added EXTRACT_BLOCKS_2D and EXTRACT_FUNCTIONS; xyq_io and f_io were missing from the xyzq_io folder; since June, several triangulation utilities have been extended to overcome any single-zone assumptions, NEQAIR_Integration has been improved, and POLAR_INTERP has had an option added to generate spoked body points (but see also CAPSULE_SPOKES, which had been over- looked here as well).
- Nov 07 2018: Added SLOS (structured grid form of USLOS for lines of sight).
- Mar 07 2021: Release updated CMake build system. Move repository to NASA's
public GitHub. Various
small improvements to
radial_interp
,refine
,capsule_grid
, andprepare_neqair_data
. - Nov 20 2021: Re-reviewed and approved for open source release by Ames Research center under the NASA Open Source License v1.3. Added updated license file and contributor license agreements.