How to sum damage results by creating your own field using DPF

Vishnu
Vishnu Member, Employee Posts: 222
100 Comments 100 Likes Second Anniversary Name Dropper
✭✭✭✭
edited June 2023 in Structures

You can use the similar method to sum or manipulate contour results from multiple result objects.

this example shows how to sum the damage results from 2 damage result objects and plot them using python results

Tagged:

Answers

  • Vishnu
    Vishnu Member, Employee Posts: 222
    100 Comments 100 Likes Second Anniversary Name Dropper
    ✭✭✭✭
    edited January 2023 Answer ✓

    In this example we create our own scalar field and populate the data and id and use the created scalar fields to plot.

    The algorithm is like below:

    Algorithm

    Your sample code will look like below: I am getting damage result objects by name "damage". Please change that line according to your case.

    def post_started(sender, analysis):# Do not edit this line
        define_dpf_workflow(analysis)
    
    def define_dpf_workflow(analysis):
        analysis = ExtAPI.DataModel.AnalysisByName(ExtAPI.DataModel.AnalysisNames[0])
        import mech_dpf
        import Ans.DataProcessing as dpf
        
        ####################################
        # Get IDs of damage object to combine
        damageresults = ExtAPI.DataModel.GetObjectsByName("damage")
    
        # build set with all nodes
        all_scoped_nodes = []                           # Create List of nodes
        for damageobj in damageresults:
            all_scoped_nodes.extend(damageobj.PlotData.Values[1]) # add nodes from each UDR
        all_scoped_nodes_set = set(all_scoped_nodes)    # create set - eliminate multiple entries
        all_scoped_nodes = list(all_scoped_nodes_set)   # create list from set        
        
        ####################################
        ### Create new results
        
        #analysis=ExtAPI.DataModel.AnalysisByName('Static Structural')
        dataSource = dpf.DataSources(analysis.ResultFileName)
        
        # Read mesh in results file
        mesh_op = dpf.operators.mesh.mesh_provider() # operator instanciation
        mesh_op.inputs.data_sources.Connect(dataSource)
        mesh = mesh_op.outputs.mesh.GetData()
        
    
        field_list = []
        # go through all values of each damage results and feed them into created field
        for damageobj in damageresults:
            # Create Field of necessary size
            numnodes = len(all_scoped_nodes)                                  # number of nodes
            field = dpf.FieldsFactory.CreateScalarField(numnodes)    # create field with size
            field.MeshedRegionSupport = mesh                         # attach mesh
            field.ScopingIds = all_scoped_nodes                      # give list of nodes
            field.Data = [0. for i in range(0,len(all_scoped_nodes))]# fill field with zeros
            node_scope_udr = damageobj.PlotData.Values[1]
            val_udr = damageobj.PlotData.Values[len(damageobj.PlotData.Values)-1]
        
            for ii in range(0,len(node_scope_udr)):
                index=field.ScopingIds.IndexOf(node_scope_udr[ii])         # get index of node in created field
                field.UpdateEntityDataByEntityIndex(index,[val_udr[ii]])  
            field_list.append(field)
                    
    
    ################################
        sum_field_list = field_list[0]
        for i in range(0,len(field_list)-1,1):
           sum_field_list = dpf.operators.math.add(fieldA=sum_field_list,fieldB=field_list[i+1])
        # Create field operator for plotting
        combined_plot = dpf.operators.utility.forward_field() # operator instanciation
        combined_plot.inputs.field.Connect(sum_field_list)
        
        ####################################
        ### create plotting workflow
        
        dpf_workflow = dpf.Workflow()
        dpf_workflow.Add(combined_plot)
        
        dpf_workflow.SetOutputContour(combined_plot)
        
        dpf_workflow.Record('wf_id', True)
        this.WorkflowId = dpf_workflow.GetRecordedId()
    

    Summation of 2 damage results sum of damages