Name | splinepy JSON |
Version |
0.1.3
JSON |
| download |
home_page | None |
Summary | Library for prototyping spline geometries of arbitrary dimensions and degrees, and IGA |
upload_time | 2024-08-23 04:37:13 |
maintainer | None |
docs_url | None |
author | None |
requires_python | >=3.8 |
license | MIT License Copyright (c) 2021 Jaewook Lee Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Files: splinepy/include/splinepy/proximity/slsqp/slsqp.h splinepy/src/proximity/slsqp/slsqp.c (Original source: https://github.com/scipy/scipy/blob/d0ad5aa12fa4ef92a92ad55da23c472f1e2a7031/scipy/optimize/slsqp/slsqp_optmz.f) License: (1) Original implementation: BSD License. See .h file (2) Fixes and extensions: Copyright (c) 2001-2002 Enthought, Inc. 2003-2024, SciPy Developers. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
keywords |
bezier
rational bezier
bspline
nurbs
multi patch
|
VCS |
|
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
![txt_logo](https://raw.githubusercontent.com/tataratat/splinepy/main/docs/source/_static/splinepy_name.png)
**splinepy - Library for prototyping spline geometries of arbitrary dimensions and degrees, and IGA**
[![workflow](https://github.com/tataratat/splinepy/actions/workflows/main.yml/badge.svg)](https://github.com/tataratat/splinepy/actions)
[![PyPI version](https://badge.fury.io/py/splinepy.svg)](https://badge.fury.io/py/splinepy)
[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/tataratat/try-splinepy/main)
![gallery](https://raw.githubusercontent.com/tataratat/splinepy/main/docs/source/_static/gallery.png)
## Install guide
splinepy wheels are available for python3.8+ for MacOS, Linux, and Windows:
```bash
# including all optional dependencies
pip install "splinepy[all]" # quotation marks required for some shells
# or
pip install splinepy
```
You can install it directly from the source:
```bash
git clone git@github.com:tataratat/splinepy.git
cd splinepy
git submodule update --init --recursive
pip install -e .
```
## Documentation
Here are links to related documentation for the library:
- <a href='https://tataratat.github.io/splinepy'>Documentation home</a>
- <a href='https://tataratat.github.io/splinepy/spline_intro.html#introduction-to-splines'>Introduction to splines</a>
- <a href='https://tataratat.github.io/splinepy/spline_intro.html#visualizing-splines'>Spline visualization</a>
## Quick start
### 1. Create a spline
Here, we will create a <a href='https://tataratat.github.io/splinepy/_generated/splinepy.nurbs.NURBS.html#splinepy.nurbs.NURBS'>NURBS</a> for the following example. Alternatively, we can also create <a href='https://tataratat.github.io/splinepy/_generated/splinepy.bezier.Bezier.html#splinepy.bezier.Bezier'>Bezier</a>, <a href='https://tataratat.github.io/splinepy/_generated/splinepy.rational_bezier.RationalBezier.html#splinepy.rational_bezier.RationalBezier'>RationalBezier</a>, and <a href='https://tataratat.github.io/splinepy/_generated/splinepy.bspline.BSpline.html#splinepy.bspline.BSpline'>BSpline</a>.
```python
import splinepy
# Initialize nurbs with any array-like input
nurbs = splinepy.NURBS(
degrees=[2, 1],
knot_vectors=[
[0, 0, 0, 1, 1, 1],
[0, 0, 1, 1],
],
control_points=[
[-1.0, 0.0],
[-1.0, 1.0],
[0.0, 1.0],
[-2.0, 0.0],
[-2.0, 2.0],
[0.0, 2.0],
],
weights=[
[1.0],
[2**-0.5],
[1.0],
[1.0],
[2**-0.5],
[1.0],
],
)
# vizusalize
nurbs.show()
```
<p align="center"><img src="https://raw.githubusercontent.com/tataratat/splinepy/main/docs/source/_static/readme_nurbs.png" width="70%" title="nurbs"></p>
### 2. Modifications
All the splines can be modified. For example, by
1. directly accessing properties,
2. <a href='https://tataratat.github.io/splinepy/_generated/splinepy.spline.Spline.elevate_degrees.html#splinepy.spline.Spline.elevate_degrees'>elevating degrees</a>,
3. <a href='https://tataratat.github.io/splinepy/_generated/splinepy.bspline.BSplineBase.insert_knots.html#splinepy.bspline.BSplineBase.insert_knots'>inserting knots</a>,
4. <a href='https://tataratat.github.io/splinepy/_generated/splinepy.bspline.BSplineBase.reduce_degrees.html'>reducing degrees</a> and <a href='https://tataratat.github.io/splinepy/_generated/splinepy.bspline.BSplineBase.remove_knots.html'>removing knots</a> with a specified tolerance
*Note: currently {3, 4} are limited to BSpline families.*
```python
# start with a copy of the original spline
modified = nurbs.copy()
# manipulate control points
# 1. all at once
modified.control_points /= 2.0
# 2. indexwise (flat indexing)
modified.control_points[[3, 4, 5]] *= [1.3, 2.]
# 3. with grid-like indexing using multi_index helper
multi_index = modified.multi_index
modified.control_points[multi_index[0, 1]] = [-1.5, -.3]
modified.control_points[multi_index[2, :]] += [2., .1]
modified.show() # visualize Nr. 1
# elevate degrees and insert knots
modified.elevate_degrees([0, 1])
modified.show() # visualize Nr. 2
modified.insert_knots(1, [.5])
modified.show() # visualize Nr. 3
```
![modifications](https://raw.githubusercontent.com/tataratat/splinepy/main/docs/source/_static/readme_modifications.png)
### 3. Evaluate
You can evaluate spline's basis functions, mapping, and their derivatives by giving parametric coordinate queries.
They should be 2D array-like objects and functions return 2D np.ndarray.
![evaluate](https://raw.githubusercontent.com/tataratat/splinepy/main/docs/source/_static/readme_evaluate.png)
```python
# first, create parametric coordinate queries
queries = [
[0.1, 0.2], # first query
[0.4, 0.5], # second query
[0.1156, 0.9091], # third query
]
# evaluate basis, spline and derivatives.
# for derivatives, specify order per parametric dimension.
basis = nurbs.basis(queries)
basis_derivative = nurbs.basis_derivative(queries, [1, 1])
physical_coordinates = nurbs.evaluate(queries)
physical_derivatives = nurbs.derivative(queries, [2, 0])
```
Many of splinepy's multi-query functions can be executed in parallel using multithread executions on c++ side. For that, set either the global flag or pass the `nthreads` argument.
```python
p_basis0 = nurbs.basis(queries, nthreads=2)
# or
splinepy.settings.NTHREADS = 3
p_basis1 = nurbs.basis(queries)
```
We also implemented <a href='https://tataratat.github.io/splinepy/_generated/splinepy.spline.Spline.proximities.html#splinepy-spline-spline-proximities'>point inversion</a> for splines.
```python
# see docs for options
para_coordinates = nurbs.proximities(physical_coordinates)
import numpy as np
assert np.allclose(queries, para_coordinates)
```
In cases, where you may have to compute derivatives at the inverted locations or you just want to know more information about the search, you can set the keyword `return_verbose=True`:
```python
(
parametric_coordinates,
physical_coordindates,
physical_difference,
distance,
convergence_norm,
first_derivatives,
second_derivatives,
) = nurbs.proximities(physical_coordinates, return_verbose=True)
```
### 4. Helper Modules
There's a list of helper modules under the namespace `splinepy.helpme` to boost prototyping efficiencies. Please check out the full list <a href='https://tataratat.github.io/splinepy/_generated/splinepy.helpme.html'>here</a>!
Here are some highlights.
#### 4.1 Create
<a href='https://tataratat.github.io/splinepy/_generated/splinepy.helpme.create.html#module-splinepy.helpme.create'>splinepy.helpme.create</a> module can help you create several primitive shapes and another spline based on the existing spline.
```python
# basic splines
box = splinepy.helpme.create.box(1, 2, 3) # length per dim
disk = splinepy.helpme.create.disk(outer_radius=3, inner_radius=2, angle=256)
torus = splinepy.helpme.create.torus(torus_radius=3, section_outer_radius=1.5)
splinepy.show(["box", box], ["disk", disk], ["torus", torus])
```
![create_basic](https://raw.githubusercontent.com/tataratat/splinepy/main/docs/source/_static/readme_create_basic.png)
For the latter, you can directly access such functions through <a href='https://tataratat.github.io/splinepy/_generated/splinepy.spline.Spline.create.html#splinepy.spline.Spline.create'>spline.create</a>.
```python
# based on existing splines
extruded = nurbs.create.extruded(extrusion_vector=[1, 2, 3])
revolved = nurbs.create.revolved(axis=[1, 0, 0], center=[-1, -1, 0], angle=50)
splinepy.show(["extruded", extruded], ["revolved", revolved])
```
![create_derived](https://raw.githubusercontent.com/tataratat/splinepy/main/docs/source/_static/readme_create_derived.png)
### 4.2 Extract
Using <a href='https://tataratat.github.io/splinepy/_generated/splinepy.helpme.extract.html#module-splinepy.helpme.extract'>splinepy.helpme.extract</a> module, you can extract meshes (as a <a href='https://tataratat.github.io/gustaf/index.html'>gustaf</a> object)
```python
# extract meshes as gustaf objects
control_mesh = nurbs.extract.control_mesh()
control_points = nurbs.extract.control_points()
mesh = nurbs.extract.faces([201, 33]) # specify sample resolutions
splinepy.show(
["control mesh", control_mesh.to_edges()],
["control points", control_points],
["spline", mesh]
)
```
![extract_mesh](https://raw.githubusercontent.com/tataratat/splinepy/main/docs/source/_static/readme_extract_mesh.png)
or part of splines from an existing spline using <a href='https://tataratat.github.io/splinepy/_generated/splinepy.spline.Spline.extract.html#splinepy.spline.Spline.extract'>spline.extract</a>.
```python
# extract splines
boundaries = nurbs.extract.boundaries()
partial = nurbs.extract.spline(0, [.5, .78])
partial_partial = nurbs.extract.spline(0, [.1, .3]).extract.spline(1, [.65, .9])
bases = nurbs.extract.bases() # basis functions as splines
# insert knots to increase number of bezier patches
inserted = nurbs.copy()
inserted.insert_knots(0, [.13, .87])
beziers_patches = inserted.extract.beziers()
splinepy.show(
["boundaries and part of splines", boundaries, partial, partial_partial],
["beziers", beziers_patches],
["bases", bases],
)
```
![extract_spline](https://raw.githubusercontent.com/tataratat/splinepy/main/docs/source/_static/readme_extract_spline.png)
#### 4.3 Free-form deformation
Together with mesh types of <a href='https://tataratat.github.io/gustaf'>gustaf</a>, we can perform <a href='https://tataratat.github.io/splinepy/_generated/splinepy.helpme.ffd.FFD.html'>free-form deformation</a>
```python
import gustaf as gus
# create gustaf mesh using extract.spline()
# or use gustaf's io functions (gustaf.io)
mesh = splinepy.helpme.create.torus(2, 1).extract.faces([100, 100, 100])
# initialize ffd and move control points
ffd = splinepy.FFD(mesh=mesh)
multi_index = ffd.spline.multi_index
ffd.spline.control_points[multi_index[-1,:,-1]] += [3, .5, .1]
ffd.show()
# get deformed mesh - FFD.mesh attribute deforms mesh before returning
deformed = ffd.mesh
```
![ffd](https://raw.githubusercontent.com/tataratat/splinepy/main/docs/source/_static/readme_ffd.png)
#### 4.4 Fitting
You can <a href='https://tataratat.github.io/splinepy/_generated/splinepy.helpme.fit.html#module-splinepy.helpme.fit'>fit</a> your point data using splines.
```python
data = [[-0.955, 0.293], [-0.707, 0.707], [-0.293, 0.955],
[-1.911, 0.587], [-1.414, 1.414], [-0.587, 1.911]]
curve, residual_curve = splinepy.helpme.fit.curve(data, degree=2)
# you can also use any existing spline's basis
surface, residual_surface = splinepy.helpme.fit.surface(
data, size=[3, 2], fitting_spline=nurbs
)
# set visuals for data
d = gus.Vertices(data)
d.show_options.update(c="blue", r=15)
splinepy.show(
["curve fit", d, curve],
["surface fit", d, surface],
)
```
![fit](https://raw.githubusercontent.com/tataratat/splinepy/main/docs/source/_static/readme_fit.png)
#### 4.5 Mapper
<a href='https://tataratat.github.io/splinepy/_generated/splinepy.helpme.mapper.Mapper.html#splinepy.helpme.mapper.Mapper'>Mapper</a> class is a geometric mapping helper that brings expression and derivatives into the physical domain.
This is especially useful for trying collocation methods. Here, we show how you can create a left hand side matrix for a laplace problem - see <a href='https://github.com/tataratat/splinepy/blob/main/examples/iga/collocation_laplace_problem_sparse.py'>this example</a> for a full solution:
<p align="center"><img src="https://raw.githubusercontent.com/tataratat/splinepy/main/docs/source/_static/readme_matrix.png" width="70%" title="laplacian"></p>
```python
# create solution spline
solution_field = nurbs.create.embedded(1)
# refine
solution_field.elevate_degrees([0, 1])
solution_field.uniform_refine(n_knots=[4, 4])
# create matrix using mapper
# collocation points at greville abcissae
mapper = solution_field.mapper(reference=nurbs)
laplacian, support = mapper.basis_laplacian_and_support(
solution_field.greville_abscissae()
)
laplacian_matrix = splinepy.utils.data.make_matrix(
laplacian,
support,
n_cols=solution_field.control_points.shape[0],
)
```
### 5. Microstructure
(Rational) Bezier splines in splinepy are capable of <a href='https://tataratat.github.io/splinepy/_generated/splinepy.bezier.BezierBase.compose.html#splinepy.bezier.BezierBase.compose'>composition</a>, where you can place a spline (inner spline/function) into another spline (outer spline/function) in an exact fashion.
We can systematically perform this to create certain shapes that consist of multiple inner splines.
The resulting shapes are called <a href='https://tataratat.github.io/splinepy/_generated/splinepy.microstructure.microstructure.Microstructure.html#splinepy.microstructure.microstructure.Microstructure'>microstructure</a>s and the inner spline that serves as a basis shape is called <a href='https://tataratat.github.io/splinepy/_generated/splinepy.microstructure.tiles.tile_base.TileBase.html#splinepy.microstructure.tiles.tile_base.TileBase'>tile</a>.
splinepy has several tiles that are ready to use.
Implementations of available tiles can be found <a href='https://tataratat.github.io/splinepy/_generated/splinepy.microstructure.tiles.html'>here</a>.
However, it is easier to access them through <a href='https://tataratat.github.io/splinepy/_generated/splinepy.microstructure.tiles.html'>module functions</a>:
```python
splinepy.microstructure.tiles.show()
```
![tiles](https://raw.githubusercontent.com/tataratat/splinepy/main/docs/source/_static/readme_tiles.png)
You can also filter the available tiles by their parametric and geometric dimensions:
```python
# get specific dimensions as dict
para_2_dim_2 = splinepy.microstructure.tiles.by_dim(para_dim=2, dim=2)
dim_2 = splinepy.microstructure.tiles.by_dim(dim=2)
```
The composition can then be created as follows:
```python
# create microstructure generator
microstructure = splinepy.Microstructure()
# set outer spline and a (micro) tile
microstructure.deformation_function = nurbs
microstructure.microtile = splinepy.microstructure.tiles.get("Cross2D")
# tiling determines tile resolutions within each bezier patch
microstructure.tiling = [5, 3]
microstructure.show()
# extract only generated parts as multipatch
generated = microstructure.create()
```
![microstructures](https://raw.githubusercontent.com/tataratat/splinepy/main/docs/source/_static/readme_microstructure.png)
Please take a look at <a href='https://github.com/tataratat/splinepy/blob/main/examples/show_microstructures.py'>this example</a> for a broad overview of what microstructures can do!
### 6. Multipatch
In practice, including <a href='https://tataratat.github.io/splinepy/_generated/splinepy.microstructure.microstructure.Microstructure.html#splinepy.microstructure.microstructure.Microstructure'>Microstructure</a>s, it is common to work with multiple patches.
For that, we provide a <a href='https://tataratat.github.io/splinepy/_generated/splinepy.multipatch.Multipatch.html#splinepy.multipatch.Multipatch'>Multipatch</a> class, equipped with various useful functionalities:
- patch interface identification
- boundary patch identification
- boundary assignment with various options
- subpatch / boundary patch extraction
```python
# use previously generated microtiles
interface_info_array = generated.interfaces
# Mark boundaries to set boundary conditions
# In case of micro structure, you can use outer spline's boundary
def is_left_bdr(x):
left = nurbs.extract.boundaries()[3]
return (left.proximities(x, return_verbose=True)[3] < 1e-8).ravel()
generated.boundary_from_function(is_left_bdr, boundary_id=5)
splinepy.show(
["All", generated],
["Boundaries", generated.boundary_multipatch()],
["Boundary 5", generated.boundary_multipatch(5)]
)
# export for the solver
splinepy.io.gismo.export("microstructure.xml", generated)
```
![multipatch](https://raw.githubusercontent.com/tataratat/splinepy/main/docs/source/_static/readme_multipatch.png)
### 7. Input/output and vector graphics
splinepy supports various <a href='https://tataratat.github.io/splinepy/_generated/splinepy.io.html'>IO formats</a>.
Most notably, <a href='https://github.com/gismo/gismo'>gismo</a> and <a href='https://github.com/mfem/mfem'>mfem</a> formats allow a seamless transition to analysis. In addition splinepy is also able to import and export the `iges` format. Specifically, `Type 126` (B-Spline curve) and `Type 128` (B-Spline surface).
```python
# export
splinepy.io.mfem.export("quarter_circle.mesh", nurbs)
# load
quarter_circle = splinepy.io.mfem.load("quarter_circle.mesh")
```
<a href='https://tataratat.github.io/splinepy/_generated/splinepy.io.svg.export.html#splinepy.io.svg.export'>svg format</a> enables true vector graphic export which preserves the smoothness of splines for publications/documentation. Try to zoom in!
```python
splinepy.io.svg.export("nurbs.svg", nurbs)
```
<p align="center"><img src="https://raw.githubusercontent.com/tataratat/splinepy/main/docs/source/_static/nurbs.svg" width="50%" title="nurbs_svg"></p>
## Try online
You can also try splinepy online by clicking the <a href='https://mybinder.org/v2/gh/tataratat/try-splinepy/main'>Binder</a> badge above!
## Contributing
splinepy welcomes any form of contributions!
Feel free to write us an <a href='https://github.com/tataratat/splinepy/issues'>issue</a> or start a <a href='https://github.com/tataratat/splinepy/discussions'>discussion</a>.
Contribution guidelines can be found <a href='https://tataratat.github.io/splinepy/CONTRIBUTING.html'>here</a>.
Raw data
{
"_id": null,
"home_page": null,
"name": "splinepy",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": "bezier, rational bezier, bspline, nurbs, multi patch",
"author": null,
"author_email": "Jaewook Lee <jaewooklee042@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/40/b9/0f23b848119c43d0ac4a36b0e638b5b0b9fade9a0e5bd4d21192cdb1f7bd/splinepy-0.1.3.tar.gz",
"platform": null,
"description": "![txt_logo](https://raw.githubusercontent.com/tataratat/splinepy/main/docs/source/_static/splinepy_name.png)\n**splinepy - Library for prototyping spline geometries of arbitrary dimensions and degrees, and IGA**\n\n[![workflow](https://github.com/tataratat/splinepy/actions/workflows/main.yml/badge.svg)](https://github.com/tataratat/splinepy/actions)\n[![PyPI version](https://badge.fury.io/py/splinepy.svg)](https://badge.fury.io/py/splinepy)\n[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/tataratat/try-splinepy/main)\n\n![gallery](https://raw.githubusercontent.com/tataratat/splinepy/main/docs/source/_static/gallery.png)\n\n## Install guide\nsplinepy wheels are available for python3.8+ for MacOS, Linux, and Windows:\n```bash\n# including all optional dependencies\npip install \"splinepy[all]\" # quotation marks required for some shells\n# or\npip install splinepy\n```\n\n\nYou can install it directly from the source:\n```bash\ngit clone git@github.com:tataratat/splinepy.git\ncd splinepy\ngit submodule update --init --recursive\npip install -e .\n```\n\n## Documentation\nHere are links to related documentation for the library:\n- <a href='https://tataratat.github.io/splinepy'>Documentation home</a>\n- <a href='https://tataratat.github.io/splinepy/spline_intro.html#introduction-to-splines'>Introduction to splines</a>\n- <a href='https://tataratat.github.io/splinepy/spline_intro.html#visualizing-splines'>Spline visualization</a>\n\n\n## Quick start\n### 1. Create a spline\n\nHere, we will create a <a href='https://tataratat.github.io/splinepy/_generated/splinepy.nurbs.NURBS.html#splinepy.nurbs.NURBS'>NURBS</a> for the following example. Alternatively, we can also create <a href='https://tataratat.github.io/splinepy/_generated/splinepy.bezier.Bezier.html#splinepy.bezier.Bezier'>Bezier</a>, <a href='https://tataratat.github.io/splinepy/_generated/splinepy.rational_bezier.RationalBezier.html#splinepy.rational_bezier.RationalBezier'>RationalBezier</a>, and <a href='https://tataratat.github.io/splinepy/_generated/splinepy.bspline.BSpline.html#splinepy.bspline.BSpline'>BSpline</a>.\n\n```python\nimport splinepy\n\n# Initialize nurbs with any array-like input\nnurbs = splinepy.NURBS(\n degrees=[2, 1],\n knot_vectors=[\n [0, 0, 0, 1, 1, 1],\n [0, 0, 1, 1],\n ],\n control_points=[\n [-1.0, 0.0],\n [-1.0, 1.0],\n [0.0, 1.0],\n [-2.0, 0.0],\n [-2.0, 2.0],\n [0.0, 2.0],\n ],\n weights=[\n [1.0],\n [2**-0.5],\n [1.0],\n [1.0],\n [2**-0.5],\n [1.0],\n ],\n)\n\n# vizusalize\nnurbs.show()\n```\n <p align=\"center\"><img src=\"https://raw.githubusercontent.com/tataratat/splinepy/main/docs/source/_static/readme_nurbs.png\" width=\"70%\" title=\"nurbs\"></p>\n\n### 2. Modifications\nAll the splines can be modified. For example, by\n1. directly accessing properties,\n2. <a href='https://tataratat.github.io/splinepy/_generated/splinepy.spline.Spline.elevate_degrees.html#splinepy.spline.Spline.elevate_degrees'>elevating degrees</a>,\n3. <a href='https://tataratat.github.io/splinepy/_generated/splinepy.bspline.BSplineBase.insert_knots.html#splinepy.bspline.BSplineBase.insert_knots'>inserting knots</a>,\n4. <a href='https://tataratat.github.io/splinepy/_generated/splinepy.bspline.BSplineBase.reduce_degrees.html'>reducing degrees</a> and <a href='https://tataratat.github.io/splinepy/_generated/splinepy.bspline.BSplineBase.remove_knots.html'>removing knots</a> with a specified tolerance\n\n*Note: currently {3, 4} are limited to BSpline families.*\n```python\n# start with a copy of the original spline\nmodified = nurbs.copy()\n\n# manipulate control points\n# 1. all at once\nmodified.control_points /= 2.0\n# 2. indexwise (flat indexing)\nmodified.control_points[[3, 4, 5]] *= [1.3, 2.]\n# 3. with grid-like indexing using multi_index helper\nmulti_index = modified.multi_index\nmodified.control_points[multi_index[0, 1]] = [-1.5, -.3]\nmodified.control_points[multi_index[2, :]] += [2., .1]\n\nmodified.show() # visualize Nr. 1\n\n# elevate degrees and insert knots\nmodified.elevate_degrees([0, 1])\nmodified.show() # visualize Nr. 2\n\nmodified.insert_knots(1, [.5])\nmodified.show() # visualize Nr. 3\n```\n\n![modifications](https://raw.githubusercontent.com/tataratat/splinepy/main/docs/source/_static/readme_modifications.png)\n\n### 3. Evaluate\nYou can evaluate spline's basis functions, mapping, and their derivatives by giving parametric coordinate queries.\nThey should be 2D array-like objects and functions return 2D np.ndarray.\n![evaluate](https://raw.githubusercontent.com/tataratat/splinepy/main/docs/source/_static/readme_evaluate.png)\n```python\n# first, create parametric coordinate queries\nqueries = [\n [0.1, 0.2], # first query\n [0.4, 0.5], # second query\n [0.1156, 0.9091], # third query\n]\n\n# evaluate basis, spline and derivatives.\n# for derivatives, specify order per parametric dimension.\nbasis = nurbs.basis(queries)\nbasis_derivative = nurbs.basis_derivative(queries, [1, 1])\nphysical_coordinates = nurbs.evaluate(queries)\nphysical_derivatives = nurbs.derivative(queries, [2, 0])\n```\nMany of splinepy's multi-query functions can be executed in parallel using multithread executions on c++ side. For that, set either the global flag or pass the `nthreads` argument.\n```python\np_basis0 = nurbs.basis(queries, nthreads=2)\n# or\nsplinepy.settings.NTHREADS = 3\np_basis1 = nurbs.basis(queries)\n```\nWe also implemented <a href='https://tataratat.github.io/splinepy/_generated/splinepy.spline.Spline.proximities.html#splinepy-spline-spline-proximities'>point inversion</a> for splines.\n```python\n# see docs for options\npara_coordinates = nurbs.proximities(physical_coordinates)\n\nimport numpy as np\nassert np.allclose(queries, para_coordinates)\n```\nIn cases, where you may have to compute derivatives at the inverted locations or you just want to know more information about the search, you can set the keyword `return_verbose=True`:\n```python\n(\n parametric_coordinates,\n physical_coordindates,\n physical_difference,\n distance,\n convergence_norm,\n first_derivatives,\n second_derivatives,\n) = nurbs.proximities(physical_coordinates, return_verbose=True)\n```\n\n### 4. Helper Modules\nThere's a list of helper modules under the namespace `splinepy.helpme` to boost prototyping efficiencies. Please check out the full list <a href='https://tataratat.github.io/splinepy/_generated/splinepy.helpme.html'>here</a>!\nHere are some highlights.\n\n#### 4.1 Create\n<a href='https://tataratat.github.io/splinepy/_generated/splinepy.helpme.create.html#module-splinepy.helpme.create'>splinepy.helpme.create</a> module can help you create several primitive shapes and another spline based on the existing spline.\n```python\n# basic splines\nbox = splinepy.helpme.create.box(1, 2, 3) # length per dim\ndisk = splinepy.helpme.create.disk(outer_radius=3, inner_radius=2, angle=256)\ntorus = splinepy.helpme.create.torus(torus_radius=3, section_outer_radius=1.5)\n\nsplinepy.show([\"box\", box], [\"disk\", disk], [\"torus\", torus])\n```\n![create_basic](https://raw.githubusercontent.com/tataratat/splinepy/main/docs/source/_static/readme_create_basic.png)\nFor the latter, you can directly access such functions through <a href='https://tataratat.github.io/splinepy/_generated/splinepy.spline.Spline.create.html#splinepy.spline.Spline.create'>spline.create</a>.\n```python\n# based on existing splines\nextruded = nurbs.create.extruded(extrusion_vector=[1, 2, 3])\nrevolved = nurbs.create.revolved(axis=[1, 0, 0], center=[-1, -1, 0], angle=50)\n\nsplinepy.show([\"extruded\", extruded], [\"revolved\", revolved])\n```\n![create_derived](https://raw.githubusercontent.com/tataratat/splinepy/main/docs/source/_static/readme_create_derived.png)\n\n### 4.2 Extract\nUsing <a href='https://tataratat.github.io/splinepy/_generated/splinepy.helpme.extract.html#module-splinepy.helpme.extract'>splinepy.helpme.extract</a> module, you can extract meshes (as a <a href='https://tataratat.github.io/gustaf/index.html'>gustaf</a> object)\n```python\n# extract meshes as gustaf objects\ncontrol_mesh = nurbs.extract.control_mesh()\ncontrol_points = nurbs.extract.control_points()\nmesh = nurbs.extract.faces([201, 33]) # specify sample resolutions\n\nsplinepy.show(\n [\"control mesh\", control_mesh.to_edges()],\n [\"control points\", control_points],\n [\"spline\", mesh]\n)\n```\n![extract_mesh](https://raw.githubusercontent.com/tataratat/splinepy/main/docs/source/_static/readme_extract_mesh.png)\nor part of splines from an existing spline using <a href='https://tataratat.github.io/splinepy/_generated/splinepy.spline.Spline.extract.html#splinepy.spline.Spline.extract'>spline.extract</a>.\n```python\n# extract splines\nboundaries = nurbs.extract.boundaries()\npartial = nurbs.extract.spline(0, [.5, .78])\npartial_partial = nurbs.extract.spline(0, [.1, .3]).extract.spline(1, [.65, .9])\nbases = nurbs.extract.bases() # basis functions as splines\n# insert knots to increase number of bezier patches\ninserted = nurbs.copy()\ninserted.insert_knots(0, [.13, .87])\nbeziers_patches = inserted.extract.beziers()\n\nsplinepy.show(\n [\"boundaries and part of splines\", boundaries, partial, partial_partial],\n [\"beziers\", beziers_patches],\n [\"bases\", bases],\n)\n```\n![extract_spline](https://raw.githubusercontent.com/tataratat/splinepy/main/docs/source/_static/readme_extract_spline.png)\n\n#### 4.3 Free-form deformation\nTogether with mesh types of <a href='https://tataratat.github.io/gustaf'>gustaf</a>, we can perform <a href='https://tataratat.github.io/splinepy/_generated/splinepy.helpme.ffd.FFD.html'>free-form deformation</a>\n```python\nimport gustaf as gus\n\n# create gustaf mesh using extract.spline()\n# or use gustaf's io functions (gustaf.io)\nmesh = splinepy.helpme.create.torus(2, 1).extract.faces([100, 100, 100])\n\n# initialize ffd and move control points\nffd = splinepy.FFD(mesh=mesh)\nmulti_index = ffd.spline.multi_index\nffd.spline.control_points[multi_index[-1,:,-1]] += [3, .5, .1]\n\nffd.show()\n\n# get deformed mesh - FFD.mesh attribute deforms mesh before returning\ndeformed = ffd.mesh\n```\n\n![ffd](https://raw.githubusercontent.com/tataratat/splinepy/main/docs/source/_static/readme_ffd.png)\n\n#### 4.4 Fitting\nYou can <a href='https://tataratat.github.io/splinepy/_generated/splinepy.helpme.fit.html#module-splinepy.helpme.fit'>fit</a> your point data using splines.\n```python\n\ndata = [[-0.955, 0.293], [-0.707, 0.707], [-0.293, 0.955],\n [-1.911, 0.587], [-1.414, 1.414], [-0.587, 1.911]]\n\ncurve, residual_curve = splinepy.helpme.fit.curve(data, degree=2)\n# you can also use any existing spline's basis\nsurface, residual_surface = splinepy.helpme.fit.surface(\n data, size=[3, 2], fitting_spline=nurbs\n)\n\n# set visuals for data\nd = gus.Vertices(data)\nd.show_options.update(c=\"blue\", r=15)\n\nsplinepy.show(\n [\"curve fit\", d, curve],\n [\"surface fit\", d, surface],\n)\n```\n\n![fit](https://raw.githubusercontent.com/tataratat/splinepy/main/docs/source/_static/readme_fit.png)\n\n#### 4.5 Mapper\n\n<a href='https://tataratat.github.io/splinepy/_generated/splinepy.helpme.mapper.Mapper.html#splinepy.helpme.mapper.Mapper'>Mapper</a> class is a geometric mapping helper that brings expression and derivatives into the physical domain.\nThis is especially useful for trying collocation methods. Here, we show how you can create a left hand side matrix for a laplace problem - see <a href='https://github.com/tataratat/splinepy/blob/main/examples/iga/collocation_laplace_problem_sparse.py'>this example</a> for a full solution:\n <p align=\"center\"><img src=\"https://raw.githubusercontent.com/tataratat/splinepy/main/docs/source/_static/readme_matrix.png\" width=\"70%\" title=\"laplacian\"></p>\n\n```python\n# create solution spline\nsolution_field = nurbs.create.embedded(1)\n\n# refine\nsolution_field.elevate_degrees([0, 1])\nsolution_field.uniform_refine(n_knots=[4, 4])\n\n# create matrix using mapper\n# collocation points at greville abcissae\nmapper = solution_field.mapper(reference=nurbs)\nlaplacian, support = mapper.basis_laplacian_and_support(\n solution_field.greville_abscissae()\n)\nlaplacian_matrix = splinepy.utils.data.make_matrix(\n laplacian,\n support,\n n_cols=solution_field.control_points.shape[0],\n)\n```\n\n### 5. Microstructure\n(Rational) Bezier splines in splinepy are capable of <a href='https://tataratat.github.io/splinepy/_generated/splinepy.bezier.BezierBase.compose.html#splinepy.bezier.BezierBase.compose'>composition</a>, where you can place a spline (inner spline/function) into another spline (outer spline/function) in an exact fashion.\nWe can systematically perform this to create certain shapes that consist of multiple inner splines.\nThe resulting shapes are called <a href='https://tataratat.github.io/splinepy/_generated/splinepy.microstructure.microstructure.Microstructure.html#splinepy.microstructure.microstructure.Microstructure'>microstructure</a>s and the inner spline that serves as a basis shape is called <a href='https://tataratat.github.io/splinepy/_generated/splinepy.microstructure.tiles.tile_base.TileBase.html#splinepy.microstructure.tiles.tile_base.TileBase'>tile</a>.\n\n\nsplinepy has several tiles that are ready to use.\nImplementations of available tiles can be found <a href='https://tataratat.github.io/splinepy/_generated/splinepy.microstructure.tiles.html'>here</a>.\nHowever, it is easier to access them through <a href='https://tataratat.github.io/splinepy/_generated/splinepy.microstructure.tiles.html'>module functions</a>:\n```python\nsplinepy.microstructure.tiles.show()\n```\n![tiles](https://raw.githubusercontent.com/tataratat/splinepy/main/docs/source/_static/readme_tiles.png)\n\nYou can also filter the available tiles by their parametric and geometric dimensions:\n```python\n# get specific dimensions as dict\npara_2_dim_2 = splinepy.microstructure.tiles.by_dim(para_dim=2, dim=2)\n\ndim_2 = splinepy.microstructure.tiles.by_dim(dim=2)\n```\n\nThe composition can then be created as follows:\n```python\n# create microstructure generator\nmicrostructure = splinepy.Microstructure()\n# set outer spline and a (micro) tile\nmicrostructure.deformation_function = nurbs\nmicrostructure.microtile = splinepy.microstructure.tiles.get(\"Cross2D\")\n# tiling determines tile resolutions within each bezier patch\nmicrostructure.tiling = [5, 3]\n\nmicrostructure.show()\n\n# extract only generated parts as multipatch\ngenerated = microstructure.create()\n```\n![microstructures](https://raw.githubusercontent.com/tataratat/splinepy/main/docs/source/_static/readme_microstructure.png)\n\n\nPlease take a look at <a href='https://github.com/tataratat/splinepy/blob/main/examples/show_microstructures.py'>this example</a> for a broad overview of what microstructures can do!\n\n\n### 6. Multipatch\nIn practice, including <a href='https://tataratat.github.io/splinepy/_generated/splinepy.microstructure.microstructure.Microstructure.html#splinepy.microstructure.microstructure.Microstructure'>Microstructure</a>s, it is common to work with multiple patches.\nFor that, we provide a <a href='https://tataratat.github.io/splinepy/_generated/splinepy.multipatch.Multipatch.html#splinepy.multipatch.Multipatch'>Multipatch</a> class, equipped with various useful functionalities:\n- patch interface identification\n- boundary patch identification\n- boundary assignment with various options\n- subpatch / boundary patch extraction\n```python\n# use previously generated microtiles\ninterface_info_array = generated.interfaces\n\n# Mark boundaries to set boundary conditions\n# In case of micro structure, you can use outer spline's boundary\ndef is_left_bdr(x):\n left = nurbs.extract.boundaries()[3]\n return (left.proximities(x, return_verbose=True)[3] < 1e-8).ravel()\n\ngenerated.boundary_from_function(is_left_bdr, boundary_id=5)\n\nsplinepy.show(\n [\"All\", generated],\n [\"Boundaries\", generated.boundary_multipatch()],\n [\"Boundary 5\", generated.boundary_multipatch(5)]\n)\n\n# export for the solver\nsplinepy.io.gismo.export(\"microstructure.xml\", generated)\n```\n\n![multipatch](https://raw.githubusercontent.com/tataratat/splinepy/main/docs/source/_static/readme_multipatch.png)\n\n### 7. Input/output and vector graphics\nsplinepy supports various <a href='https://tataratat.github.io/splinepy/_generated/splinepy.io.html'>IO formats</a>.\nMost notably, <a href='https://github.com/gismo/gismo'>gismo</a> and <a href='https://github.com/mfem/mfem'>mfem</a> formats allow a seamless transition to analysis. In addition splinepy is also able to import and export the `iges` format. Specifically, `Type 126` (B-Spline curve) and `Type 128` (B-Spline surface).\n```python\n# export\nsplinepy.io.mfem.export(\"quarter_circle.mesh\", nurbs)\n\n# load\nquarter_circle = splinepy.io.mfem.load(\"quarter_circle.mesh\")\n```\n\n\n<a href='https://tataratat.github.io/splinepy/_generated/splinepy.io.svg.export.html#splinepy.io.svg.export'>svg format</a> enables true vector graphic export which preserves the smoothness of splines for publications/documentation. Try to zoom in!\n```python\nsplinepy.io.svg.export(\"nurbs.svg\", nurbs)\n```\n <p align=\"center\"><img src=\"https://raw.githubusercontent.com/tataratat/splinepy/main/docs/source/_static/nurbs.svg\" width=\"50%\" title=\"nurbs_svg\"></p>\n\n## Try online\nYou can also try splinepy online by clicking the <a href='https://mybinder.org/v2/gh/tataratat/try-splinepy/main'>Binder</a> badge above!\n\n## Contributing\nsplinepy welcomes any form of contributions!\nFeel free to write us an <a href='https://github.com/tataratat/splinepy/issues'>issue</a> or start a <a href='https://github.com/tataratat/splinepy/discussions'>discussion</a>.\nContribution guidelines can be found <a href='https://tataratat.github.io/splinepy/CONTRIBUTING.html'>here</a>.\n",
"bugtrack_url": null,
"license": "MIT License Copyright (c) 2021 Jaewook Lee Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Files: splinepy/include/splinepy/proximity/slsqp/slsqp.h splinepy/src/proximity/slsqp/slsqp.c (Original source: https://github.com/scipy/scipy/blob/d0ad5aa12fa4ef92a92ad55da23c472f1e2a7031/scipy/optimize/slsqp/slsqp_optmz.f) License: (1) Original implementation: BSD License. See .h file (2) Fixes and extensions: Copyright (c) 2001-2002 Enthought, Inc. 2003-2024, SciPy Developers. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.",
"summary": "Library for prototyping spline geometries of arbitrary dimensions and degrees, and IGA",
"version": "0.1.3",
"project_urls": {
"Homepage": "https://github.com/tataratat/splinepy"
},
"split_keywords": [
"bezier",
" rational bezier",
" bspline",
" nurbs",
" multi patch"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "b0fff7144fde877ffaad067efbbcd7c2077d0307f251dba3ab19e1276a231427",
"md5": "498c3cc3c8017337f221b93e93d133c5",
"sha256": "2e6739c3eb6a7ab9588ff90d7c5e7e5e3852bf1c5520d6b28094f7f79131d9dd"
},
"downloads": -1,
"filename": "splinepy-0.1.3-cp310-cp310-macosx_10_9_x86_64.whl",
"has_sig": false,
"md5_digest": "498c3cc3c8017337f221b93e93d133c5",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.8",
"size": 12700556,
"upload_time": "2024-08-23T04:36:15",
"upload_time_iso_8601": "2024-08-23T04:36:15.563347Z",
"url": "https://files.pythonhosted.org/packages/b0/ff/f7144fde877ffaad067efbbcd7c2077d0307f251dba3ab19e1276a231427/splinepy-0.1.3-cp310-cp310-macosx_10_9_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "e7344d22b1a4ee2a993819b22ba07d767aa89ff5aecce14ccea9793af3f2b26a",
"md5": "cf314f38a709b12ba29eb42e91b6ef0c",
"sha256": "c8d78c254cfb22335f01293940aedb3a8efbefddc1416ad7dd05b93644b46e2a"
},
"downloads": -1,
"filename": "splinepy-0.1.3-cp310-cp310-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "cf314f38a709b12ba29eb42e91b6ef0c",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.8",
"size": 10307473,
"upload_time": "2024-08-23T04:36:18",
"upload_time_iso_8601": "2024-08-23T04:36:18.339645Z",
"url": "https://files.pythonhosted.org/packages/e7/34/4d22b1a4ee2a993819b22ba07d767aa89ff5aecce14ccea9793af3f2b26a/splinepy-0.1.3-cp310-cp310-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "6f23f4f088566797c80885cb9186f066da96642d5a527882915f72abc90c9a3a",
"md5": "ffcefee8a8f02e44a2a7c1b017720130",
"sha256": "ee1b5ffd35f4faf5b9fcf6863412a076465f227471d408a37bb7eb697af4a0f7"
},
"downloads": -1,
"filename": "splinepy-0.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "ffcefee8a8f02e44a2a7c1b017720130",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.8",
"size": 36978845,
"upload_time": "2024-08-23T04:36:22",
"upload_time_iso_8601": "2024-08-23T04:36:22.735462Z",
"url": "https://files.pythonhosted.org/packages/6f/23/f4f088566797c80885cb9186f066da96642d5a527882915f72abc90c9a3a/splinepy-0.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "d92e9d2896965b6d407d99f3386888f0129e8d0e3ecc4fab5c09636abb3943de",
"md5": "05f6a84a584a2468fadc782aaaf556c1",
"sha256": "d98efe8478cfed253c4847ea6986e9241595b98912e263156daf392baf8a47b7"
},
"downloads": -1,
"filename": "splinepy-0.1.3-cp310-cp310-win_amd64.whl",
"has_sig": false,
"md5_digest": "05f6a84a584a2468fadc782aaaf556c1",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.8",
"size": 5819122,
"upload_time": "2024-08-23T04:36:26",
"upload_time_iso_8601": "2024-08-23T04:36:26.046264Z",
"url": "https://files.pythonhosted.org/packages/d9/2e/9d2896965b6d407d99f3386888f0129e8d0e3ecc4fab5c09636abb3943de/splinepy-0.1.3-cp310-cp310-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "052b8d811b1bdd9308cd9afe3b0179d7124e3e84e70659919b1ea34b4d3f575a",
"md5": "bb0a33a578274be384cc25c8ac9e2241",
"sha256": "63bfe82ad5864db615421ecb0512d713ebaadb0b3705ff7692344e4ded26cfe9"
},
"downloads": -1,
"filename": "splinepy-0.1.3-cp311-cp311-macosx_10_9_x86_64.whl",
"has_sig": false,
"md5_digest": "bb0a33a578274be384cc25c8ac9e2241",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.8",
"size": 12702265,
"upload_time": "2024-08-23T04:36:28",
"upload_time_iso_8601": "2024-08-23T04:36:28.331865Z",
"url": "https://files.pythonhosted.org/packages/05/2b/8d811b1bdd9308cd9afe3b0179d7124e3e84e70659919b1ea34b4d3f575a/splinepy-0.1.3-cp311-cp311-macosx_10_9_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "f23e18c37c05bd296d890f1a792b4a03d0898bfc2fdc773c5f657ef19fd0a8eb",
"md5": "072cb8bc8221d57bf484f0dc5c85abab",
"sha256": "69051476430124cc6d581623113bfc9ba02075ffcc240a6d29d111add939f4a9"
},
"downloads": -1,
"filename": "splinepy-0.1.3-cp311-cp311-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "072cb8bc8221d57bf484f0dc5c85abab",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.8",
"size": 10309150,
"upload_time": "2024-08-23T04:36:30",
"upload_time_iso_8601": "2024-08-23T04:36:30.726221Z",
"url": "https://files.pythonhosted.org/packages/f2/3e/18c37c05bd296d890f1a792b4a03d0898bfc2fdc773c5f657ef19fd0a8eb/splinepy-0.1.3-cp311-cp311-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "0ec64274c037589f98969a876fc0826f176852a29007c3008115c2259cbc53e0",
"md5": "e90d21c5c5f3959641cd51cd329c82aa",
"sha256": "4f95e473d0f5aeed870ec51300acf1bdf707c1014fecfe6cb3972432891d6010"
},
"downloads": -1,
"filename": "splinepy-0.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "e90d21c5c5f3959641cd51cd329c82aa",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.8",
"size": 37087868,
"upload_time": "2024-08-23T04:36:34",
"upload_time_iso_8601": "2024-08-23T04:36:34.229697Z",
"url": "https://files.pythonhosted.org/packages/0e/c6/4274c037589f98969a876fc0826f176852a29007c3008115c2259cbc53e0/splinepy-0.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "d3274039a7f55236278bb407c233278d4f900b587cdc7d9a34dd5d0715894143",
"md5": "f2a2352c489fe86ec2c2e3b5c6ff30f4",
"sha256": "42d069db198a686fac55241216d76179585dbaf26d0e4a72f0603bd3483a9e70"
},
"downloads": -1,
"filename": "splinepy-0.1.3-cp311-cp311-win_amd64.whl",
"has_sig": false,
"md5_digest": "f2a2352c489fe86ec2c2e3b5c6ff30f4",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.8",
"size": 5820682,
"upload_time": "2024-08-23T04:36:37",
"upload_time_iso_8601": "2024-08-23T04:36:37.568150Z",
"url": "https://files.pythonhosted.org/packages/d3/27/4039a7f55236278bb407c233278d4f900b587cdc7d9a34dd5d0715894143/splinepy-0.1.3-cp311-cp311-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "452b232d4fa22ca000588a1ae001694c669e313ceb90bceb9b9f5708b4a3a1a9",
"md5": "2dd1471546de870381901891c6e86bd6",
"sha256": "c942ed5b9c65b354a93cce3a71512134399e94d8539fb67f2d87f46065d469c2"
},
"downloads": -1,
"filename": "splinepy-0.1.3-cp312-cp312-macosx_10_9_x86_64.whl",
"has_sig": false,
"md5_digest": "2dd1471546de870381901891c6e86bd6",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.8",
"size": 12705870,
"upload_time": "2024-08-23T04:36:39",
"upload_time_iso_8601": "2024-08-23T04:36:39.480851Z",
"url": "https://files.pythonhosted.org/packages/45/2b/232d4fa22ca000588a1ae001694c669e313ceb90bceb9b9f5708b4a3a1a9/splinepy-0.1.3-cp312-cp312-macosx_10_9_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "3d543cd9429826115c5645723986b0709014d55e5b661646b5df727d54a92707",
"md5": "500f77ab373693acf2ed1486487cae24",
"sha256": "3633f7c301e0d7150fb3a27417a5b25b5a3891f432446b8b2618f5078cbad72b"
},
"downloads": -1,
"filename": "splinepy-0.1.3-cp312-cp312-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "500f77ab373693acf2ed1486487cae24",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.8",
"size": 10309466,
"upload_time": "2024-08-23T04:36:42",
"upload_time_iso_8601": "2024-08-23T04:36:42.345384Z",
"url": "https://files.pythonhosted.org/packages/3d/54/3cd9429826115c5645723986b0709014d55e5b661646b5df727d54a92707/splinepy-0.1.3-cp312-cp312-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "130f29c9f61eabe6309448075876bde28b0ef374e0fa48cbd3673eb36418b076",
"md5": "c340dea2fd1962886b21d476c1043fbc",
"sha256": "d6baec29228504a7556538df3ffb567ed6be5ec512b0c666cfe706ba1b6d94b8"
},
"downloads": -1,
"filename": "splinepy-0.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "c340dea2fd1962886b21d476c1043fbc",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.8",
"size": 37086810,
"upload_time": "2024-08-23T04:36:45",
"upload_time_iso_8601": "2024-08-23T04:36:45.584943Z",
"url": "https://files.pythonhosted.org/packages/13/0f/29c9f61eabe6309448075876bde28b0ef374e0fa48cbd3673eb36418b076/splinepy-0.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "aadd3a0de722c2224ec174eb2d83b79c8fd65eabb41a1f900b569813d939e003",
"md5": "b3c78efbcb6322a55237a7fcd890cdb8",
"sha256": "514e4a8a1c2d261ef68a4a1901830d1dd98d4e3736cbb7a1ab4106402b830c50"
},
"downloads": -1,
"filename": "splinepy-0.1.3-cp312-cp312-win_amd64.whl",
"has_sig": false,
"md5_digest": "b3c78efbcb6322a55237a7fcd890cdb8",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.8",
"size": 5823151,
"upload_time": "2024-08-23T04:36:48",
"upload_time_iso_8601": "2024-08-23T04:36:48.723452Z",
"url": "https://files.pythonhosted.org/packages/aa/dd/3a0de722c2224ec174eb2d83b79c8fd65eabb41a1f900b569813d939e003/splinepy-0.1.3-cp312-cp312-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "04ac5dc90dba5355a891d81c791fa433b9b76b1d78333cf585e258301a3364cc",
"md5": "507fee64f42b91d6d89a92ae90fcd6ed",
"sha256": "c24e72dd5b71d3cb6c0658a8ea373f7b24a7154e2188376c915878bf5709983e"
},
"downloads": -1,
"filename": "splinepy-0.1.3-cp38-cp38-macosx_10_9_x86_64.whl",
"has_sig": false,
"md5_digest": "507fee64f42b91d6d89a92ae90fcd6ed",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.8",
"size": 12700305,
"upload_time": "2024-08-23T04:36:50",
"upload_time_iso_8601": "2024-08-23T04:36:50.621547Z",
"url": "https://files.pythonhosted.org/packages/04/ac/5dc90dba5355a891d81c791fa433b9b76b1d78333cf585e258301a3364cc/splinepy-0.1.3-cp38-cp38-macosx_10_9_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "4db7a7a1c6c8ffb50e0ce4c678f52fa6d67222356850a51f7b10ba7a4257fbad",
"md5": "fd0396fb312517283e0313f8d229f544",
"sha256": "c1488112d2780d20aa07e20a2a4859fb5a65b370a23a21fe0531e40af32231b4"
},
"downloads": -1,
"filename": "splinepy-0.1.3-cp38-cp38-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "fd0396fb312517283e0313f8d229f544",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.8",
"size": 10306679,
"upload_time": "2024-08-23T04:36:53",
"upload_time_iso_8601": "2024-08-23T04:36:53.274061Z",
"url": "https://files.pythonhosted.org/packages/4d/b7/a7a1c6c8ffb50e0ce4c678f52fa6d67222356850a51f7b10ba7a4257fbad/splinepy-0.1.3-cp38-cp38-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "01abe7d9665df5bcbd4978aa79659e50903720df39a33acde40d0632d58d7424",
"md5": "e225e45a8f517bd79eb55165f7c032a4",
"sha256": "9aa802ecc90a64c042bf1fd8da715907aa02d0cd93a985e665d156039d2ddd6e"
},
"downloads": -1,
"filename": "splinepy-0.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "e225e45a8f517bd79eb55165f7c032a4",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.8",
"size": 36939777,
"upload_time": "2024-08-23T04:36:56",
"upload_time_iso_8601": "2024-08-23T04:36:56.324822Z",
"url": "https://files.pythonhosted.org/packages/01/ab/e7d9665df5bcbd4978aa79659e50903720df39a33acde40d0632d58d7424/splinepy-0.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "70580ea22cae4eaf57568a75ae521b74a55c87e3bff3c1ce3d62735a47e97b83",
"md5": "cf6e1ba81245ecf677d0d690f99a11db",
"sha256": "5551e42580d46dd4bf10c4dc2521c561763ae433e2838d5300dfa605263b30eb"
},
"downloads": -1,
"filename": "splinepy-0.1.3-cp38-cp38-win_amd64.whl",
"has_sig": false,
"md5_digest": "cf6e1ba81245ecf677d0d690f99a11db",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.8",
"size": 5819400,
"upload_time": "2024-08-23T04:36:59",
"upload_time_iso_8601": "2024-08-23T04:36:59.413349Z",
"url": "https://files.pythonhosted.org/packages/70/58/0ea22cae4eaf57568a75ae521b74a55c87e3bff3c1ce3d62735a47e97b83/splinepy-0.1.3-cp38-cp38-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "98bf81d9feb362e03636b614e6ad8fe25149fcfe28ab806c97a54d0203369c6d",
"md5": "fa4e1461e740b3dae0c82e58215d7379",
"sha256": "996ebcefa6759446d5967e8ede7fb2ed57bd0d53e4d6b6106a5b4a5b8549a4b1"
},
"downloads": -1,
"filename": "splinepy-0.1.3-cp39-cp39-macosx_10_9_x86_64.whl",
"has_sig": false,
"md5_digest": "fa4e1461e740b3dae0c82e58215d7379",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.8",
"size": 12699629,
"upload_time": "2024-08-23T04:37:01",
"upload_time_iso_8601": "2024-08-23T04:37:01.919346Z",
"url": "https://files.pythonhosted.org/packages/98/bf/81d9feb362e03636b614e6ad8fe25149fcfe28ab806c97a54d0203369c6d/splinepy-0.1.3-cp39-cp39-macosx_10_9_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "9126400b4d77b2d505e6b5153a0d5acea72ff05c890983141f949ff1dfda26b2",
"md5": "7fcecb204c0f5099b75e341ac97f6ef0",
"sha256": "e7b2cc6a6bd943b17346147d2eeca3ed61af2e3dbef9e773aa9f49ce3146fca5"
},
"downloads": -1,
"filename": "splinepy-0.1.3-cp39-cp39-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "7fcecb204c0f5099b75e341ac97f6ef0",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.8",
"size": 10307232,
"upload_time": "2024-08-23T04:37:04",
"upload_time_iso_8601": "2024-08-23T04:37:04.550777Z",
"url": "https://files.pythonhosted.org/packages/91/26/400b4d77b2d505e6b5153a0d5acea72ff05c890983141f949ff1dfda26b2/splinepy-0.1.3-cp39-cp39-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "c8871827724546137400976ed051d8758939f3a0733426e99afbfb66d62eddac",
"md5": "10183fdfb3f4ab8dcb73e6063e2d17e3",
"sha256": "e656b2de8ff394935fae02ec8c2a2de642525325b19880045e55d92f0f593d0a"
},
"downloads": -1,
"filename": "splinepy-0.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "10183fdfb3f4ab8dcb73e6063e2d17e3",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.8",
"size": 36984976,
"upload_time": "2024-08-23T04:37:08",
"upload_time_iso_8601": "2024-08-23T04:37:08.061690Z",
"url": "https://files.pythonhosted.org/packages/c8/87/1827724546137400976ed051d8758939f3a0733426e99afbfb66d62eddac/splinepy-0.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "8323bea17f808e5ffeee5ca978b64dd06acd46317edec4965ddfd8dca1a72494",
"md5": "bb529d7ebcd2014910e5648bc3e552c9",
"sha256": "002382d15c851e0c36530b455c6c358c0a9a0ecb2182b72002c6d151123d80c8"
},
"downloads": -1,
"filename": "splinepy-0.1.3-cp39-cp39-win_amd64.whl",
"has_sig": false,
"md5_digest": "bb529d7ebcd2014910e5648bc3e552c9",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.8",
"size": 5812966,
"upload_time": "2024-08-23T04:37:11",
"upload_time_iso_8601": "2024-08-23T04:37:11.024351Z",
"url": "https://files.pythonhosted.org/packages/83/23/bea17f808e5ffeee5ca978b64dd06acd46317edec4965ddfd8dca1a72494/splinepy-0.1.3-cp39-cp39-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "40b90f23b848119c43d0ac4a36b0e638b5b0b9fade9a0e5bd4d21192cdb1f7bd",
"md5": "1e37f17d5d82b1299c0ca6fdc211616f",
"sha256": "2714515d9cd709a68b7e860280156720673344e2a503b48168c636496d67a714"
},
"downloads": -1,
"filename": "splinepy-0.1.3.tar.gz",
"has_sig": false,
"md5_digest": "1e37f17d5d82b1299c0ca6fdc211616f",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 8211863,
"upload_time": "2024-08-23T04:37:13",
"upload_time_iso_8601": "2024-08-23T04:37:13.172926Z",
"url": "https://files.pythonhosted.org/packages/40/b9/0f23b848119c43d0ac4a36b0e638b5b0b9fade9a0e5bd4d21192cdb1f7bd/splinepy-0.1.3.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-08-23 04:37:13",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "tataratat",
"github_project": "splinepy",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "splinepy"
}