Skip to main content

optiSLang 3D Postprocessing Script API 2025 R1

A simple example to post process field data computing the 3-vec norm

Last update: 16.07.2025
-- -------------
-- User input --
-- -------------
-- set base path to input data
bpath = "examples/lsdyna/metal_forming__eroded_elements/sampling"
-- set project path and name
ppath = "normdisp.sdb"
-- OK to overwrite? (If false and ppath exists, an error will be thrown)
overwrite = true
-- Load reference mesh
mesh = sos.importMesh_LSDynaK( bpath .. "/ref-mesh.k" );
sos.setReferenceMesh(sos.database(), mesh);
mesh = nil
print( "Finished: Set new reference mesh");
-- execute: Import Field Designs
sos.referenceDesign():setBasePath( bpath .. "/Design0001" );
sos.referenceDesign():addFile_LSPrePost( sos.database(), bpath .. "/Design0001/NW/displacements.k");
importer = sos.ImportDesigns(sos.referenceDesign());
importer:scanDesignRanges();
importer:filterDesignsByOptiSLang( bpath .. "/optislang_bin_file.bin" );
importer:import(sos.database())
print( "Finished: Import field designs");
-- deactivate incomplete designs (keep data sets with eroded elements)
sos.database():deactivateIncompleteDesigns();
print("Compute displacement norm")
-- get node data
all_node_objects = sos.database():data():filterType(sos.NODE_DATA)
-- get number of designs
n_designs = all_node_objects:filterQuantity("NODAL_DISPLACEMENT[1]"):samples():size()
-- get design IDs
designs = all_node_objects:filterQuantity("NODAL_DISPLACEMENT[1]"):samples():designs()
-- loop over designs
for ni=0,n_designs-1 do
-- designs[ni] gives the design ID for the running index
print("processing design #" .. designs[ni])
-- get nodal displacement components for each design
-- find(designs[ni]...) avoids sorting problems
cmp1 = sos.database():data():find(designs[ni], "NODAL_DISPLACEMENT[1]"):getData()
cmp2 = sos.database():data():find(designs[ni], "NODAL_DISPLACEMENT[2]"):getData()
cmp3 = sos.database():data():find(designs[ni], "NODAL_DISPLACEMENT[3]"):getData()
-- compute displacement norm
-- operator :CW() extracts elements from tmath vector for element-wise operations
norm = (cmp1:CW():Square() + cmp2:CW():Square() + cmp3:CW():Square()):CW():Sqrt()
-- get indicators of missing data (eroded elements) for each component for each design
miss1 = sos.database():data():find(designs[ni], "NODAL_DISPLACEMENT[1]"):getMissingData():getData()
miss2 = sos.database():data():find(designs[ni], "NODAL_DISPLACEMENT[2]"):getMissingData():getData()
miss3 = sos.database():data():find(designs[ni], "NODAL_DISPLACEMENT[3]"):getMissingData():getData()
-- union of missing data indicators of all components
missing_obj = (miss1 + miss2 + miss3):CW():Min(1)
-- create node data object of displacement norm with missing data indicator
norm_obj = sos.createNodeDataObject( sos.database(), norm, missing_obj, true)
-- store displacement norm as new quantity for each design
sos.database():data():insert( sos.DataObjectKey(designs[ni], "NODAL_DISPLACEMENT_NORM"), norm_obj)
end
-- execute: Save database file as
settings = sos.SaveDataBaseSettings( ppath );
settings.replace_files = overwrite;
sos.saveDataBase(sos.database(), settings);
print( "Finished: Save database file");

Connect with Ansys