Assume I have two Remote Points in my Model called 'Remote Point 1' and 'Remote Point 2'. How can I calculate the distance between the two across all timesets using DPF?
To achieve this, first determine the initial position of each Remote Point. Then, add the displacement at each time interval. Finally, subtract the resultant position of each Remote Point for each time interval.
The following script can be used in a Mechanical Scripting environment:
import mech_dpf import Ans.DataProcessing as dpf import math mech_dpf.setExtAPI(ExtAPI) #Get path to result file analysis = ExtAPI.DataModel.Project.Model.Analyses[0] filepath = analysis.ResultFileName #Data sources dataSources = dpf.DataSources() dataSources.SetResultFilePath(filepath) # Streams streams_op = dpf.operators.metadata.streams_provider() streams_op.inputs.data_sources.Connect(dataSources) my_streams_container = streams_op.outputs.streams_container.GetData() # Time Scoping time_op = dpf.operators.metadata.time_freq_provider() time_op.inputs.streams_container.Connect(my_streams_container) time_op.inputs.data_sources.Connect(dataSources) my_time_freq_support = time_op.outputs.time_freq_support.GetData() timeScoping = dpf.Scoping() timeScoping.Ids = range(1,my_time_freq_support.NumberSets+1,1) timeScoping.Location = 'Time' # Model model=dpf.Model(dataSources) # Remote Points rp_1 = DataModel.GetObjectsByName('Remote Point 1')[0] rp_2 = DataModel.GetObjectsByName('Remote Point 2')[0] solverData = analysis.Solution.SolverData rp_1_data = solverData.GetObjectData(rp_1) rp_2_data = solverData.GetObjectData(rp_2) ### Remote Point 1 ### # Original Position rp_1_node = model.Mesh.NodeById(rp_1_data.NodeId) # Original Position Field rp_1_origField = dpf.FieldsFactory.Create3DVectorField(4,"Nodal") rp_1_origField.Add(rp_1_data.NodeId,[rp_1_node.X,rp_1_node.Y,rp_1_node.Z]) # Mesh Scoping rp_1_scoping = dpf.Scoping() rp_1_scoping.Location="Nodal" rp_1_scoping.Ids = [rp_1_data.NodeId] # Displacement Field rp_1_disp_op = dpf.operators.result.displacement() rp_1_disp_op.inputs.time_scoping.Connect(timeScoping) rp_1_disp_op.inputs.mesh_scoping.Connect(rp_1_scoping) rp_1_disp_op.inputs.data_sources.Connect(dataSources) rp_1_dispField = rp_1_disp_op.outputs.fields_container.GetData() rp_1_vect=[] for time in range(0,my_time_freq_support.NumberSets,1): mathAdd=dpf.operators.math.add() mathAdd.inputs.fieldA.Connect(rp_1_dispField[time]) mathAdd.inputs.fieldB.Connect(rp_1_origField) rp_1_vect.append(mathAdd.outputs.field.GetData()) ### Remote Point 2 ### # Original Position rp_2_node = model.Mesh.NodeById(rp_2_data.NodeId) # Original Position Field rp_2_origField = dpf.FieldsFactory.Create3DVectorField(4,"Nodal") rp_2_origField.Add(rp_2_data.NodeId,[rp_2_node.X,rp_2_node.Y,rp_2_node.Z]) # Mesh Scoping rp_2_scoping = dpf.Scoping() rp_2_scoping.Location="Nodal" rp_2_scoping.Ids = [rp_2_data.NodeId] # Displacement Field rp_2_disp_op = dpf.operators.result.displacement() rp_2_disp_op.inputs.time_scoping.Connect(timeScoping) rp_2_disp_op.inputs.mesh_scoping.Connect(rp_2_scoping) rp_2_disp_op.inputs.data_sources.Connect(dataSources) rp_2_dispField = rp_2_disp_op.outputs.fields_container.GetData() rp_2_vect=[] for time in range(0,my_time_freq_support.NumberSets,1): mathAdd=dpf.operators.math.add() mathAdd.inputs.fieldA.Connect(rp_2_dispField[time]) mathAdd.inputs.fieldB.Connect(rp_2_origField) rp_2_vect.append(mathAdd.outputs.field.GetData()) ### Distance Calculation ### dist_res = {'time':[], 'disp_x':[], 'disp_y':[], 'disp_z':[], 'distance':[]} for time in range(0,my_time_freq_support.NumberSets,1): ux = rp_2_vect[time].Data[0] - rp_1_vect[time].Data[0] uy = rp_2_vect[time].Data[1] - rp_1_vect[time].Data[1] uz = rp_2_vect[time].Data[2] - rp_1_vect[time].Data[2] u = math.sqrt(ux**2 + uy**2 + uz**2) dist_res['time'].append(my_time_freq_support.TimeFreqs.Data[time]) dist_res['disp_x'].append(ux) dist_res['disp_y'].append(uy) dist_res['disp_z'].append(uz) dist_res['distance'].append(u) model.ReleaseStreams()