Skip to content

Commit a7bfa3d

Browse files
feat(geometry): add GeometryArray for efficient repeated geometry instances
Add GeometryArray class that enables efficient representation of repeated geometric patterns using arrays of offsets and optional transformations.
1 parent 88e9306 commit a7bfa3d

12 files changed

Lines changed: 1212 additions & 14 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
88
## [Unreleased]
99

1010
### Added
11+
- Added `GeometryArray` class for efficiently representing multiple copies of a base geometry at specified offsets with transformation matrices. Includes a convenience method `geometry.array(offsets=..., transforms=...)` on all geometry objects.
1112
- Added `ModeSortSpec.keep_modes` which can be set to `"all"` to keep all modes in the mode solver (the default), `"filtered"` to keep only modes passing the filter defined by the `ModeSortSpec`, or an integer `N` to keep only the top `N` modes after filtering and sorting.
1213
- Added `fill_fraction_box` as a new filtering and sorting key which computes the field-energy fill fraction within a specified bounding box (`ModeSortSpec.bounding_box`).
1314
- Added `Grid.fine_mesh_info` property to identify and report locations where grid cell sizes are fine for understanding meshing hotspots.

docs/api/geometry.rst

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,36 @@ When working with a large number of geometry objects belonging to the same ``tid
242242
my_structure = Structure(geometry=my_geom_group, medium=my_medium)
243243
244244
245+
~~~~
246+
247+
Geometry Arrays
248+
---------------
249+
250+
.. autosummary::
251+
:toctree: _autosummary/
252+
:template: module.rst
253+
254+
tidy3d.GeometryArray
255+
tidy3d.Geometry.array
256+
257+
When creating many copies of the same geometry at different positions, ``GeometryArray`` provides a more memory-efficient alternative to ``GeometryGroup``. It stores a single base geometry with an array of offsets and optional per-instance transformation matrices.
258+
259+
.. code-block:: python
260+
261+
# create a grid of boxes using GeometryArray
262+
offsets = [[2*i, 2*j, 0] for i in range(5) for j in range(5)]
263+
my_geom_array = GeometryArray(geometry=Box(size=(1,1,1)), offsets=offsets)
264+
my_structure = Structure(geometry=my_geom_array, medium=my_medium)
265+
266+
# alternatively, use the convenience method on any geometry
267+
my_box = Box(size=(1,1,1))
268+
my_geom_array = my_box.array(offsets=offsets)
269+
270+
# optionally apply per-instance transforms before translation
271+
transforms = [Transformed.rotation(i * np.pi/12, axis=2) for i in range(25)]
272+
my_geom_array = my_box.array(offsets=offsets, transforms=transforms)
273+
274+
245275
~~~~
246276

247277
Working with GDS

schemas/EMESimulation.json

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1793,6 +1793,9 @@
17931793
{
17941794
"$ref": "#/definitions/Cylinder"
17951795
},
1796+
{
1797+
"$ref": "#/definitions/GeometryArray"
1798+
},
17961799
{
17971800
"$ref": "#/definitions/GeometryGroup"
17981801
},
@@ -1824,6 +1827,9 @@
18241827
{
18251828
"$ref": "#/definitions/Cylinder"
18261829
},
1830+
{
1831+
"$ref": "#/definitions/GeometryArray"
1832+
},
18271833
{
18281834
"$ref": "#/definitions/GeometryGroup"
18291835
},
@@ -5957,6 +5963,85 @@
59575963
],
59585964
"type": "object"
59595965
},
5966+
"GeometryArray": {
5967+
"additionalProperties": false,
5968+
"properties": {
5969+
"attrs": {
5970+
"default": {},
5971+
"type": "object"
5972+
},
5973+
"geometry": {
5974+
"anyOf": [
5975+
{
5976+
"$ref": "#/definitions/Box"
5977+
},
5978+
{
5979+
"$ref": "#/definitions/ClipOperation"
5980+
},
5981+
{
5982+
"$ref": "#/definitions/ComplexPolySlabBase"
5983+
},
5984+
{
5985+
"$ref": "#/definitions/Cylinder"
5986+
},
5987+
{
5988+
"$ref": "#/definitions/GeometryArray"
5989+
},
5990+
{
5991+
"$ref": "#/definitions/GeometryGroup"
5992+
},
5993+
{
5994+
"$ref": "#/definitions/PolySlab"
5995+
},
5996+
{
5997+
"$ref": "#/definitions/Sphere"
5998+
},
5999+
{
6000+
"$ref": "#/definitions/Transformed"
6001+
},
6002+
{
6003+
"$ref": "#/definitions/TriangleMesh"
6004+
}
6005+
]
6006+
},
6007+
"offsets": {
6008+
"items": {
6009+
"items": [
6010+
{
6011+
"type": "number"
6012+
},
6013+
{
6014+
"type": "number"
6015+
},
6016+
{
6017+
"type": "number"
6018+
}
6019+
],
6020+
"maxItems": 3,
6021+
"minItems": 3,
6022+
"type": "array"
6023+
},
6024+
"type": "array"
6025+
},
6026+
"transforms": {
6027+
"items": {
6028+
"type": "ArrayLike"
6029+
},
6030+
"type": "array"
6031+
},
6032+
"type": {
6033+
"default": "GeometryArray",
6034+
"enum": [
6035+
"GeometryArray"
6036+
],
6037+
"type": "string"
6038+
}
6039+
},
6040+
"required": [
6041+
"geometry"
6042+
],
6043+
"type": "object"
6044+
},
59606045
"GeometryGroup": {
59616046
"additionalProperties": false,
59626047
"properties": {
@@ -5972,6 +6057,7 @@
59726057
"ClipOperation": "#/definitions/ClipOperation",
59736058
"ComplexPolySlabBase": "#/definitions/ComplexPolySlabBase",
59746059
"Cylinder": "#/definitions/Cylinder",
6060+
"GeometryArray": "#/definitions/GeometryArray",
59756061
"GeometryGroup": "#/definitions/GeometryGroup",
59766062
"PolySlab": "#/definitions/PolySlab",
59776063
"Sphere": "#/definitions/Sphere",
@@ -5993,6 +6079,9 @@
59936079
{
59946080
"$ref": "#/definitions/Cylinder"
59956081
},
6082+
{
6083+
"$ref": "#/definitions/GeometryArray"
6084+
},
59966085
{
59976086
"$ref": "#/definitions/GeometryGroup"
59986087
},
@@ -7994,6 +8083,7 @@
79948083
"ClipOperation": "#/definitions/ClipOperation",
79958084
"ComplexPolySlabBase": "#/definitions/ComplexPolySlabBase",
79968085
"Cylinder": "#/definitions/Cylinder",
8086+
"GeometryArray": "#/definitions/GeometryArray",
79978087
"GeometryGroup": "#/definitions/GeometryGroup",
79988088
"PolySlab": "#/definitions/PolySlab",
79998089
"Sphere": "#/definitions/Sphere",
@@ -8015,6 +8105,9 @@
80158105
{
80168106
"$ref": "#/definitions/Cylinder"
80178107
},
8108+
{
8109+
"$ref": "#/definitions/GeometryArray"
8110+
},
80188111
{
80198112
"$ref": "#/definitions/GeometryGroup"
80208113
},
@@ -11519,6 +11612,7 @@
1151911612
"ClipOperation": "#/definitions/ClipOperation",
1152011613
"ComplexPolySlabBase": "#/definitions/ComplexPolySlabBase",
1152111614
"Cylinder": "#/definitions/Cylinder",
11615+
"GeometryArray": "#/definitions/GeometryArray",
1152211616
"GeometryGroup": "#/definitions/GeometryGroup",
1152311617
"PolySlab": "#/definitions/PolySlab",
1152411618
"Sphere": "#/definitions/Sphere",
@@ -11540,6 +11634,9 @@
1154011634
{
1154111635
"$ref": "#/definitions/Cylinder"
1154211636
},
11637+
{
11638+
"$ref": "#/definitions/GeometryArray"
11639+
},
1154311640
{
1154411641
"$ref": "#/definitions/GeometryGroup"
1154511642
},
@@ -12031,6 +12128,9 @@
1203112128
{
1203212129
"$ref": "#/definitions/Cylinder"
1203312130
},
12131+
{
12132+
"$ref": "#/definitions/GeometryArray"
12133+
},
1203412134
{
1203512135
"$ref": "#/definitions/GeometryGroup"
1203612136
},

schemas/HeatChargeSimulation.json

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -898,6 +898,9 @@
898898
{
899899
"$ref": "#/definitions/Cylinder"
900900
},
901+
{
902+
"$ref": "#/definitions/GeometryArray"
903+
},
901904
{
902905
"$ref": "#/definitions/GeometryGroup"
903906
},
@@ -929,6 +932,9 @@
929932
{
930933
"$ref": "#/definitions/Cylinder"
931934
},
935+
{
936+
"$ref": "#/definitions/GeometryArray"
937+
},
932938
{
933939
"$ref": "#/definitions/GeometryGroup"
934940
},
@@ -3915,6 +3921,85 @@
39153921
],
39163922
"type": "object"
39173923
},
3924+
"GeometryArray": {
3925+
"additionalProperties": false,
3926+
"properties": {
3927+
"attrs": {
3928+
"default": {},
3929+
"type": "object"
3930+
},
3931+
"geometry": {
3932+
"anyOf": [
3933+
{
3934+
"$ref": "#/definitions/Box"
3935+
},
3936+
{
3937+
"$ref": "#/definitions/ClipOperation"
3938+
},
3939+
{
3940+
"$ref": "#/definitions/ComplexPolySlabBase"
3941+
},
3942+
{
3943+
"$ref": "#/definitions/Cylinder"
3944+
},
3945+
{
3946+
"$ref": "#/definitions/GeometryArray"
3947+
},
3948+
{
3949+
"$ref": "#/definitions/GeometryGroup"
3950+
},
3951+
{
3952+
"$ref": "#/definitions/PolySlab"
3953+
},
3954+
{
3955+
"$ref": "#/definitions/Sphere"
3956+
},
3957+
{
3958+
"$ref": "#/definitions/Transformed"
3959+
},
3960+
{
3961+
"$ref": "#/definitions/TriangleMesh"
3962+
}
3963+
]
3964+
},
3965+
"offsets": {
3966+
"items": {
3967+
"items": [
3968+
{
3969+
"type": "number"
3970+
},
3971+
{
3972+
"type": "number"
3973+
},
3974+
{
3975+
"type": "number"
3976+
}
3977+
],
3978+
"maxItems": 3,
3979+
"minItems": 3,
3980+
"type": "array"
3981+
},
3982+
"type": "array"
3983+
},
3984+
"transforms": {
3985+
"items": {
3986+
"type": "ArrayLike"
3987+
},
3988+
"type": "array"
3989+
},
3990+
"type": {
3991+
"default": "GeometryArray",
3992+
"enum": [
3993+
"GeometryArray"
3994+
],
3995+
"type": "string"
3996+
}
3997+
},
3998+
"required": [
3999+
"geometry"
4000+
],
4001+
"type": "object"
4002+
},
39184003
"GeometryGroup": {
39194004
"additionalProperties": false,
39204005
"properties": {
@@ -3930,6 +4015,7 @@
39304015
"ClipOperation": "#/definitions/ClipOperation",
39314016
"ComplexPolySlabBase": "#/definitions/ComplexPolySlabBase",
39324017
"Cylinder": "#/definitions/Cylinder",
4018+
"GeometryArray": "#/definitions/GeometryArray",
39334019
"GeometryGroup": "#/definitions/GeometryGroup",
39344020
"PolySlab": "#/definitions/PolySlab",
39354021
"Sphere": "#/definitions/Sphere",
@@ -3951,6 +4037,9 @@
39514037
{
39524038
"$ref": "#/definitions/Cylinder"
39534039
},
4040+
{
4041+
"$ref": "#/definitions/GeometryArray"
4042+
},
39544043
{
39554044
"$ref": "#/definitions/GeometryGroup"
39564045
},
@@ -8532,6 +8621,7 @@
85328621
"ClipOperation": "#/definitions/ClipOperation",
85338622
"ComplexPolySlabBase": "#/definitions/ComplexPolySlabBase",
85348623
"Cylinder": "#/definitions/Cylinder",
8624+
"GeometryArray": "#/definitions/GeometryArray",
85358625
"GeometryGroup": "#/definitions/GeometryGroup",
85368626
"PolySlab": "#/definitions/PolySlab",
85378627
"Sphere": "#/definitions/Sphere",
@@ -8553,6 +8643,9 @@
85538643
{
85548644
"$ref": "#/definitions/Cylinder"
85558645
},
8646+
{
8647+
"$ref": "#/definitions/GeometryArray"
8648+
},
85568649
{
85578650
"$ref": "#/definitions/GeometryGroup"
85588651
},
@@ -9138,6 +9231,9 @@
91389231
{
91399232
"$ref": "#/definitions/Cylinder"
91409233
},
9234+
{
9235+
"$ref": "#/definitions/GeometryArray"
9236+
},
91419237
{
91429238
"$ref": "#/definitions/GeometryGroup"
91439239
},

0 commit comments

Comments
 (0)