Lattice Transition#
Design a lattice fill often means a combination of various styles and sizes across different parts of the component. The transition amongst these regional features could be a challenge task. Artisan is capable of automatically merging different lattice designs through the field based morphing algorithm.
Artisan treats the regional lattice designs as various fields, and the fields can be interpolated through certain mathematical ways, for example, a regional attractor or linearly interpolating between two lattices. Here we use a few simple examples to demonstrate the applications. User may find these examples under the folder \Test_json\FieldMerge\
.
Simple Transition#
Considering to fill a bar region with two different lattices, BC
on one side gradually transits to the other side and merged with BCCubic
lattice, see the JSON below.
{"Setup":{ "Type" : "Sample",
"Sample": {"Domain" : [[0.0,100.0],[0.0,30.0],[0.0,30.0]], "Shape": "Box"},
"Geomfile": "",
"Rot" : [0.0,0.0,0.0],
"res":[0.5,0.5,0.5],
"Padding": 1,
"onGPU": false,
"memorylimit": 1073741824000
},
"WorkFlow":{
"1": {"Add_Lattice":{
"la_name": "BC", "size": [10.0,10.0,10.0], "thk":1.2, "Rot":[0.0, 0.0, 0.0], "Trans":[0.0, 0.0, 0.0],
"Inv": false, "Fill": false, "Cube_Request": {}
}
},
"2":{"OP_FieldMerge":{ "la_name":"BCCubic", "size":[10.0,10.0,10.0], "thk":1.2, "Rot":[0.0, 0.0, 0.0], "Trans":[0.0, 0.0, 0.0],
"OP_para":{
"InterpType": "Linear",
"pt_01":[10.0,0.0,0.0], "n_vec_01":[ 1.0,0.0,0.0],
"pt_02":[90.0,0.0,0.0], "n_vec_02":[-1.0,0.0,0.0],
"Transition": {}
},
"Fill":true, "Cube_Request": {}
}
},
"3":{"Field_Boundary": {"Boundary": "Box"}},
"4":{"Export": {"outfile": ".//Test_results/Box_FieldMerge_Lin.stl"}}
},
"PostProcess":{"CombineMeshes": true,
"RemovePartitionMeshFile": false,
"RemoveIsolatedParts": false,
"ExportLazPts": false}
}
The item "2"
keywords OP_FieldMerge
in WorkFlow
defines the field base lattice transition. It is similar to the keywords Lin_Interpolate
which requires a definition of second field (an added on field), here the lattice field BCCubic
. OP_para
contains the parameters for calculating the transition of the geometric features.
|
Defines the plane that starts the transition from the main field. |
---|---|
|
Defines the plane that ends the transition at the second field. |
|
This parameter defines the influence lattice that used to guide the transition between two fields. If it is empty, no transition computation will be initiated. |
Note
Artisan 0.1.10 and later version does NOT require nJobs
and ScratchPath
parameters for the keywords OP_FieldMerge
. Historically nJobs
defines the number of parallel threading used for computation. If it is 0
or negative number, it will use all available resources, if 1
, normal serial computation. ScratchPath
defines the working folder for exchange of data during parallel computation.
The transition of two lattices should be looks like below. The vertical and horizontal beams were gradually growing until merged together.

Like many algorithm, the plain transition may not produce a “perfect” results. For instance, below shows a case that BC
lattice transiting to the Cubic
lattice.

The transition was mathematically right, but the resultant geometry had a large number of floating bits and the connectivity was broken at the middle part. In order to ensure the transition with good connectivity, Transition
parameter is introduced. The JSON below shows the connected transition between BC
and Cubic
through a bridging lattice BCCubic
.
{"Setup":{ "Type" : "Sample",
"Sample": {"Domain" : [[0.0,100.0],[0.0,30.0],[0.0,30.0]], "Shape": "Box"},
"Geomfile": "",
"Rot" : [0.0,0.0,0.0],
"res":[0.5,0.5,0.5],
"Padding": 1,
"onGPU": false,
"memorylimit": 1073741824000
},
"WorkFlow":{
"1": {"Add_Lattice":{
"la_name": "BC", "size": [10.0,10.0,10.0], "thk":1.2, "Rot":[0.0, 0.0, 0.0], "Trans":[0.0, 0.0, 0.0],
"Inv": false, "Fill": false, "Cube_Request": {}
}
},
"2":{"OP_FieldMerge":{ "la_name":"Cubic", "size":[10.0,10.0,10.0], "thk":1.2, "Rot":[0.0, 0.0, 0.0], "Trans":[0.0, 0.0, 0.0],
"OP_para":{
"InterpType": "Linear",
"pt_01":[10.0,0.0,0.0], "n_vec_01":[ 1.0,0.0,0.0],
"pt_02":[90.0,0.0,0.0], "n_vec_02":[-1.0,0.0,0.0],
"Transition": {"la_name":"BCCubic", "size":[10.0,10.0,10.0], "thk":1.2, "Weight": 0.2, "f_trans":0.15}
},
"Fill":true, "Cube_Request": {}
}
},
"3":{"Field_Boundary": {"Boundary": "Box"}},
"4":{"Export": {"outfile": ".//Test_results/Box_FieldMerge_Lin.stl"}}
},
"PostProcess":{"CombineMeshes": true,
"RemovePartitionMeshFile": false,
"RemoveIsolatedParts": false,
"ExportLazPts": false}
}
The parameter Transition
contains the following parameter to setup the bridging lattice field.
|
Defines the bridging lattice design. |
---|---|
|
Defines the influence factor of the third field on the transition calculation. |
|
Defines the transition rate of the bridging lattice towards the main lattice and the second lattice; if it is less than |

The BC
lattice transformed to Cubic
field through bridging lattice BCCubic
. User may try different Weight
and f_trans
to check how the factors affect the results.
In addition to Linear
transition, OP_FieldMerge
supports Attractor
transition which is similar to the keywords Add_Attractor
. The JSON below demonstrates the merging of Cubic
lattice with regionally varying size.
{"Setup":{ "Type" : "Sample",
"Sample": {"Domain" : [[0.0,100.0],[0.0,100.0],[0.0,100.0]], "Shape": "Box"},
"Geomfile": "",
"Rot" : [0.0,0.0,0.0],
"res":[0.5,0.5,0.5],
"Padding": 1,
"onGPU": false,
"memorylimit": 1073741824000
},
"WorkFlow":{
"1": {"Add_Lattice":{
"la_name": "Cubic", "size": [10.0,10.0,10.0], "thk":1.2, "Inv": false, "Fill": false,
"Cube_Request": {}
}
},
"2":{"OP_FieldMerge":{ "la_name":"Cubic", "size":[5.0,5.0,5.0], "thk":1.2, "Rot":[0.0, 0.0, 0.0], "Trans":[0.0, 0.0, 0.0],
"OP_para":{
"InterpType": "Attractor",
"pt_att": [100.0,100.0,100.0],
"pt_r": 125.0,
"Transition": {}
},
"Fill":true, "Cube_Request": {}
}
},
"3":{"Field_Boundary": {"Boundary": "Box"}},
"4":{"Export": {"outfile": ".//Test_results/Box_FieldMerge_VarSize.stl"}}
},
"PostProcess":{"CombineMeshes": true,
"RemovePartitionMeshFile": false,
"RemoveIsolatedParts": false,
"ExportLazPts": false}
}
The parameter pt_att
defines the coordinate of the attractor, and pt_r
defines the radius of the ball which covers the whole transition. The results are shown below. User may find the complete JSON in the file Box_FieldMerge_Attractor.json
.




The third option is the Annulus
transition. It defines the inner radius and outer radius, and the transition happens between-in the range of annulus area. User may find the example file Box_FieldMerge_Annulus.json
.
{"Setup":{ "Type" : "Sample",
"Sample": {"Domain" : [[0.0,100.0],[0.0,100.0],[0.0,100.0]], "Shape": "Box"},
"Geomfile": "",
"Rot" : [0.0,0.0,0.0],
"res":[0.5,0.5,0.5],
"Padding": 1,
"onGPU": false,
"memorylimit": 1073741824000
},
"WorkFlow":{
"1": {"Add_Lattice":{
"la_name": "BC", "size": [10.0,10.0,10.0], "thk":1.2, "Rot":[0.0,0.0,0.0], "Trans":[0.0,0.0,0.0], "Inv": false, "Fill": false,
"Cube_Request": {}
}
},
"2":{"OP_FieldMerge":{ "la_name":"Cubic", "size":[10.0,10.0,10.0], "thk":1.2, "Rot":[0.0,0.0,0.0], "Trans":[0.0,0.0,0.0],
"OP_para":{
"InterpType": "Annulus",
"pt_att": [100.0,100.0,100.0],
"inner_r": 40.0,
"outer_r": 100.0,
"Transition": {"la_name":"BCCubic", "size":[10.0,10.0,10.0], "thk":1.2, "Weight": 0.8, "f_trans":0.5}
},
"Fill":true, "Cube_Request": {}
}
},
"3":{"Field_Boundary": {"Boundary": "Box"}},
"4":{"Export": {"outfile": ".//Test_results/Box_FieldMerge_AnnulusAttractor.stl"}}
},
"PostProcess":{"CombineMeshes": true,
"RemovePartitionMeshFile": false,
"RemoveIsolatedParts": false,
"ExportLazPts": false}
}
The above JSON produce the result below. The inner radius defined a large area filled with Cubic lattice, where as the transition area becomes smaller compared with previous case. Larger transition area shall give better shape continuity.

Field Based Transition#
The physical quantities, such as stress, strain, and force, or other field can serve as external design parameters influencing the lattice transition. Similar to field operations, the keyword OP_FieldMerge
can be employed to read a field, evaluate the target lattice, and ultimately combine the current field with the global field. This merging operation is demonstrated using the bar model case - the same example from the field operation section. This example īs the file Bar_FieldMerge_Field.json
.
{"Setup":{ "Type" : "Geometry",
"Geomfile": ".//sample-obj//Bar//Bar.stl",
"Rot" : [0.0,0.0,0.0],
"res":[0.5, 0.5, 0.5],
"Padding": 1,
"onGPU": false,
"memorylimit": 16106127360
},
"WorkFlow":{
"1": {"Add_Lattice":{
"la_name": "BC", "size": [25.0, 25.0, 25.0], "thk":2.5, "Rot":[0.0,0.0,0.0], "Trans":[0.0,0.0,0.0], "Inv": false, "Fill": true,
"Cube_Request": {}
}
},
"2":{"OP_FieldMerge":{ "la_name":"BCCubic", "size":[25.0, 25.0, 25.0], "thk":2.5,
"Rot":[0.0,0.0,0.0], "Trans":[0.0,0.0,0.0],
"OP_para":{
"InterpType": "Field",
"FieldFile": ".//sample-obj//Bar//fielddata.csv",
"max_cap": 4500000,
"min_cap": 3500000,
"Transition": {}
},
"Fill":true, "Cube_Request": {}
}
},
"3":{"Field_Boundary": {"Boundary": "Box"}},
"4":{"Export": {"outfile": ".//Test_results/Bar_FieldMerge_Field.stl"}}
},
"PostProcess":{"CombineMeshes": true,
"RemovePartitionMeshFile": false,
"RemoveIsolatedParts": true,
"ExportLazPts": false}
}
The above JSON produce the following simple transition between BC
and BCCubic
lattice. The keyword OP_FieldMerge
has new OP_Para
parameter "InterpType": "Field"
, and the lattice transition occurs within the range specified by max_cap
and min_cap
.
Parameter |
Details |
---|---|
|
CSV file, has same file format to the field operation |
|
the maximum capped value in the given field, any spatial points with higher value will be considered as target lattice occupied area; |
|
the minimum capped value in the given field, any spatial points with higher value will be considered as current lattice occupied area; |
The results, depicted below, illustrate that the lattice transition progresses along the X-axis. The cubic-like lattice gradually transforms into a BC-like lattice. When overlaid with the given field, the results indicate that the high-temperature area also aligns with the X-axis. This transition effectively adheres to a simple logic that the material is only added to areas with higher field values.


Transition on Conformal Lattices#
The transition supports all lattice definitions in all circumstances. In other words, the lattices can be transformed to any given shape that forms a local lattice field. It would be good that two lattices share a similar geometric or topological similarity. The example below shows the transition of conformed BC
lattice to the conformed box-frame object lattice in a twisted bar geometry. Two lattices have similar shape features, however, with many different details.
{"Setup":{ "Type" : "Geometry",
"Geomfile": ".//sample-obj//Twisted_Bar//Twisted_Bar.stl",
"Rot" : [0.0,0.0,0.0],
"res":[3.0,3.0,3.0],
"Padding": 3,
"onGPU": false,
"memorylimit": 16106127360
},
"WorkFlow":{
"1": {"Add_Lattice":{
"la_name": ".//Test_json//LatticeMerge//Twisted_Bar_Conformal_La01.mld",
"size": [200.0,200.0,200.0], "thk":5.0, "Inv": false, "Fill": false,
"Cube_Request": {}
}
},
"2":{"OP_FieldMerge":{ "la_name":".//Test_json//LatticeMerge//Twisted_Bar_Conformal_La02.mld",
"size":[200.0,200.0,200.0], "thk":15.0, "Rot":[0.0, 0.0, 0.0], "Trans":[0.0, 0.0, 0.0],
"OP_para":{
"InterpType": "Linear",
"pt_01":[300.0,0.0,0.0], "n_vec_01":[ 1.0,0.0,0.0],
"pt_02":[900.0,0.0,0.0], "n_vec_02":[-1.0,0.0,0.0],
"Transition": {}
},
"Fill":false, "Cube_Request": {}
}
},
"3":{"Export": {"outfile": ".//Test_results/Twisted_Bar_ConformalCustomLattice.stl"}}
},
"PostProcess":{"CombineMeshes": true,
"RemovePartitionMeshFile": false,
"RemoveIsolatedParts": false,
"ExportLazPts": false}
}
The conformal lattice definition in Twisted_Bar_Conformal_La01.mld
:
{
"type": "ConformalLattice",
"definition": {
"meshfile": ".//sample-obj//Twisted_Bar//Twisted_Bar.med",
"la_name" : ".//Test_json//LatticeMerge//CustomLattice_Geom.txt"
}
}
and CustomLattice_Geom.txt
defines
{
"type": "Geom",
"definition": {
"file": ".//sample-obj//boxframe.obj",
"ladomain": "Hex"}
}
The second lattice definition in Twisted_Bar_Conformal_La02.mld
setup the Cubic
lattice.
{
"type": "ConformalLattice",
"definition": {
"meshfile": ".//sample-obj//Twisted_Bar//Twisted_Bar.med",
"la_name" : "Cubic"
}
}
The results below shows a good smooth transition from a customer defined geometric lattice to a beam-like Cubic
lattice.


Here are a few hits and keypoints of using OP_FieldMerge
algorithm:
The best pairing of two merged lattices shall have some topological similarities. This ensures a smooth and continuously connected transition.
The bridging lattice has to be considered to assist the lattices which have no close topological or geometric similarity.
User may requires standard shape cases studies, e.g. on the box or bar shape, to check the lattice transition before applying to actual design.
The computation of the merging algorithm is heavy, and requires longer time to finish the task. User shall expect a long computation time on the complex design.
Increasing the resolution, or the transition region, may improve the continuous connectivity of the lattice, however, this could yield a longer computation time.