    

 ## On this page

  

 

 # 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");