DIAdem

cancel
Showing results for 
Search instead for 
Did you mean: 

My HIC code is too slow

I am running the same code in Excel and Diadem.

 

Here is the Diadem version:

Sub HIC_Calc_EventClick(ByRef This) 'Created Event Handler
Dim Timestart, Timestop
Dim i,j,k ' counters
Dim HCMax ' max hic during calc loop
Dim IT11 ' temporary T1 of max hic in loop
Dim HIC_36, HIC_15, T1_36,T2_36, T1_15, T2_15 ' HIC and Times start
Dim SampFreq ' sample frequency input value
Dim PreED ' ms of pre event data
Dim Imax ' interval length for HIC calc (number of samples -> 15*freq/1000)
Dim IntArray() ' integral of the acceleration array
Dim DEL1, Dmax, DA, hc 
Dim oElem
Dim GrpName ' name of group
Dim GrpRefNum '  Group reference number
Dim ChnRefNum ' Channel referenc number in group
Dim NumDpts ' number of data points
Dim DC_in ' input data
Dim DC_inGN ' input data global channel number
Timestart = Timer
DC_in = ""
oElem = ""

SampFreq = LB_SampFreq.Value
PreED = EB_PreData.Text
Del1 = 1/SampFreq

For Each oElem in Portal.Structure.Selection
  If oElem.IsKindOf(eDataChannel) Then 
    DC_in = oElem.GetReference(ExtendChnName)
    ' loop to make the groupname
    i=0
    j=""
    while j <> "/"
       i=i+1
       j=mid(DC_in,i+1,1) 
    wend
    GrpName = Left(DC_in,i)
    GrpRefNum = GroupIndexGet(GrpName)
    ChnRefNum = ChnPropValGet(DC_in, "groupindex")
    NumDpts = ChnPropValGet(DC_in, "length")
    DC_inGN = CNo(DC_in)
    Redim IntArray(NumDpts-1)
    i=0
    j=0
    k=0
    IntArray(0) = 0
    for i = 0 to NumDpts-2
      IntArray(i+1) = IntArray(i) + 0.5*(CHdX(i+1,DC_inGN)+ChDX(i+2,DC_inGN))
    Next
   
    'HIC36 loop
    Imax = 0.036 / Del1
    HCmax = 0
    For k = 1 To imax + 1
        Dmax = 0
        For j = 0 To NumDpts -1 - k 
            DA = IntArray(j + k) - IntArray(j)
            If DA > Dmax Then
                Dmax = DA
                IT11 = j
            End If
        Next
        hc = Dmax * k ^ (-0.6)
        If hc > HCmax Then
            HCmax = hc
            T1_36 = IT11
            T2_36 = IT11 + k
        End If
    Next
    HIC_36 = DEL1*HCmax^(2.5)
    HIC_36 = Round(HIC_36,1)
 Timestop = Timer
    Call MsgBoxDisp("HIC 36 = " & HIC_36 & " over the range of time " & T1_36*1000*DEL1 & "ms to "  & T2_36*1000*DEL1 & "ms" & " it took " & Timestop - Timestart &" to calculate the HIC")
    'Call MsgBoxDisp("it took " & Timestart - Timestop &" to calculate the HIC")
    
    'HIC15 loop
    
    
    
    
  End If
Next
End Sub

 Diadem HIC.jpg

 

Excell  HIC.jpg

the excell takes 0.86 seconds and Diadem takes 2.98.  In this example I am calculating the HIC from data with 6000 samples.

 

I initially thought that reading the channel into the integral array was the slow part, but it actually seems to be looping calculation.

 

Any help speeding this up will be appreciated.

 

Thanks alot,

--matt

 

 

 

 

0 Kudos
Message 1 of 5
(3,887 Views)

Hello Matt,

 

Since I am not the greatest of programmers, I'll leave the actual execution speed improvement advice to someone who is better at that kind of thing.

 

I am not sure if you are aware of the fact that the HIC calculation is actually part of the DIAdem Crash Analysis Toolkit and is thus available "natively" (programmed in C++ vs VB) to users who have access to this toolkit.

 

Here is the ink to a brief description of the toolkit: https://www.ni.com/en-us/shop/product/diadem-crash-analysis-toolkit.html

 

The toolkit adds all the CFC filters in addition to the HIC and many other crash analysis related functions.

 

I thought I might just point that out to you in case you weren't aware of that functionality.

 

Sorry if I pointed out the obvious ...

 

     Otmar

Otmar D. Foehner
0 Kudos
Message 2 of 5
(3,881 Views)

We currently only have one license for the crash analysis package.  It is not always available.  I have used the package and it is much faster.

 

My problem with the built in functions is that the Dialog boxes are cumbersome and tend to cut-off the longer channel names.  I really want to do all my analysis functions from the VIEW tab.

 

This is what I am working towards...

 

 

 

My_View.jpg

 

I am not happy with the speed of the DIAdem VBS.  I had hoped it would be as fast as excel.

0 Kudos
Message 3 of 5
(3,878 Views)

Hi Matt,

 

I believe your code can be significantly accelerated by moving away from cell-by-cell reads and towards a Channel Calculation.  I would be happy to help with this, but in order to test execution speed I would need an example data set of yours.  Please post or email (brad.turpin@ni.com) one or more data sets, and I'll see what I can do to speed things up.

 

Brad Turpin

DIAdem Product Support Engineer

National Instruments

0 Kudos
Message 4 of 5
(3,852 Views)

I had the same thought initially and added a pop-up msg after the data was read into the array.  It popped very quickly.  I will email the SUD and CSV file with the resultant G data.

0 Kudos
Message 5 of 5
(3,848 Views)