All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
0.2.1 - 2026-06
- New
splinepy.helpme.create.swept()function for generating swept surfaces and solids by sweeping a cross-section along a trajectory spline (examples/show_swept.py)- Supports curve (1D) and surface (2D) cross-sections to produce surfaces and solids respectively
- Cross-section orientation uses the projection-normal method (Siltanen & Woodward), following The NURBS Book, Piegl & Tiller, 2nd ed., Chapter 10.4
- Supports closed trajectories with orientation correction (p. 483 of the NURBS book)
anchorparameter controls which reference point of the cross-section is placed on the trajectory ("parametric","control_box","geometry_box", or"auto")set_on_trajectoryparameter selects between placement at trajectory knot evaluation points or trajectory control points- Optional
rotation_adaptionparameter for additional rotation of the cross-section around the trajectory tangent - Added swept surface image to README and documentation
- New
Transformationclass insplinepy.helpme.integrateencapsulating all quadrature and geometry transformation data needed for IGA discretization:- Precomputes quadrature points, supports, Jacobians, Jacobian inverses, and Jacobian determinants per element
- Configurable quadrature orders
- New
FieldIntegratorclass insplinepy.helpme.integrateproviding a high-level interface for PDE assembly:assemble_matrix(function)— assembles the global stiffness matrixassemble_vector(function)— assembles the global load vectorassemble_matrix_and_vector(function)— assembles both simultaneouslyL2_projection(function)— computes the L2 projection of a function onto the spline spacecompute_error(function, norm)— computes the L2 or H1 error of the current solutionapply_homogeneous_dirichlet_boundary_conditions()— enforces homogeneous Dirichlet BCsapply_dirichlet_boundary_conditions(function)— enforces inhomogeneous Dirichlet BCs from a given functionsolve_linear_system()— solves the assembled linear system usingscipy.sparse.linalg.spsolve- Uses sparse matrix assembly via
scipy.sparse.dok_matrix
- Extended
TileBasewith standardised class attributes and properties for parameter validation and introspection:_parameter_bounds/parameter_bounds— bounds for each tile parameter_parameters_shape/parameters_shape— shape of the parameter array_default_parameter_value/default_parameter_value— default values for tile parameters_sensitivities_implemented/sensitivities_implemented— flag indicating whether parameter sensitivities are implemented_closure_directions/closure_directions— list of supported closure directionscheck_params(parameters)— validates user-supplied parameters against bounds_process_input(parameters, parameter_sensitivities)— shared input-processing logic_check_custom_parameter(value, param_name, bounds)— validates individual parameters
- Derived tile classes now inherit common parameter-processing code from
TileBase, reducing code duplication - Changed
evaluation_points,para_dim, anddimfrom class methods to instance properties for consistency - Added
n_info_per_eval_pointproperty toTileBase - Derivatives (parameter sensitivities) implemented or fixed for:
HollowOctagon(with and without closure)HollowOctagonExtrude(added working closure, with derivatives)ArmadilloChitile (fixed)InverseCross3D(restructured and fixed)CubeVoid(fixed)EllipsVoid(fixed)
- Fourth-order accurate finite-difference calculation for numerical verification of parameter sensitivities
- Sensitivities calculation now outputs evaluation points when it fails for easier debugging
Microstructure: integers are now accepted as tile parameters alongside floats
- Added
Multipatch.set_interface_orientations(interface_orientations)setter for manually specifying interface orientations, enabling export of scalar-field splines where automatic Jacobian-based orientation computation is not possible
- Added
examples/show_swept.pydemonstrating swept surface and solid construction - Added
examples/iga/galerkin_laplace_problem_field_integrator.pydemonstrating Galerkin IGA for the Laplace problem usingFieldIntegrator - Added
examples/iga/collocation_stokes_problem_sparse.pydemonstrating IGA collocation for the Stokes problem using sparse matrices
- Dropped Python 3.9 support; added Python 3.14 support (updated workflows and
pyproject.tomlclassifiers) - Switched macOS CI runner from deprecated
macos-13tomacos-15-intelfor continued x86_64 testing - Fixed wheel naming convention issue in CI
- Refactored all tile classes to use common functions from
TileBase, reducing code duplication significantly TileBase: removed class methods in favour of instance/class properties fordim,para_dim, andevaluation_pointsTileBase: removed unneeded classmethods to simplify the class hierarchyMicrostructure: replaced bareassertstatements with properraiseexpressions for parameter validation; improved error messagesMicrostructure: updatedzipcalls to usestrict=Truefor stricter length checking (Python 3.10+)Chitile is now excluded from macro-sensitivity tests (analytical sensitivities not yet finalized)HollowOctagonExtruderemoved from the list of skipped test tiles
- Extracted
_default_quadrature_orders(spline)helper function (previously inlined in_get_quadrature_information) - Improved docstrings for
_get_integral_measure,_get_quadrature_information, and related functions - Corrected typos in docstrings (
paramtric→parametric,Determinante→Determinant)
- Added helper functions for Gismo export
- Fixed patch range text format for multi-patch exports
- Updated
zipcalls to usestrict=True
- Fixed test data for Cartesian 2D and 3D meshes
- Updated pull request template to use
developas the default base branch
helpme/create.py: Fixed error in rotation matrix calculation for e2 entries in swept surface generation; improved input validation and error messages throughouthelpme/integrate.py: Fixed typos and improved docstringsmicrostructure/tiles: Fixed incorrect ordering in finite-difference sensitivity calculation; fixed derivative implementations forChi,CubeVoid,EllipsVoid,InverseCross3D; fixed typo causing errors inHollowOctagonExtrudemicrostructure/microstructure.py: Fixed typo in class docstring (facilitatae→facilitate)multipatch.py: Added check to verify that Jacobians exist before computing interface orientationsbspline.py: Allow any negative number in the knot vector (previously restricted), fixing issue #476utils/data.py: Minor fixes- Various IO modules: Fixed miscellaneous issues and improved error handling
- Added
tests/test_microtiles.pywith comprehensive parametrised tests for all microtile classes:- All tiles lie within the unit cube for default parameters
- Tiles with non-default parameters
- Closure tests
- Tile derivative (sensitivity) tests, including closure derivatives
- Macro-sensitivity tests (finite-difference verification)
- Added
tests/test_microstructure.pywith additional microstructure integration tests - Added test for
Transformationclass intests/helpme/test_integrate.py - Extended
tests/helpme/test_create.pywith swept surface tests, including:- Comparison of swept vs extruded surfaces
- Custom cross-section normal vector
- Anchor modes
- Derivative checks
- Fixed RNG seed, sensitivity step size, and number of random test points for reproducible results
- Updated various existing tests for compatibility with Python 3.10+
zip(strict=True)changes
0.2.0 - 2025-06-01
- Physical function integration in
helpme/integrate.py - Gismo export helper functions
- Python 3.13 support
- Various bug fixes and CI/CD maintenance
0.1.3 - 2024
- Proximity / nearest-point query updates
0.1.2 - 2024
- MFEM 3D single-patch IO
- Padding initializer for splines
0.1.1 - 2024
- Initial stable release series