# Finite element method interpolation performance

I have a question about the performance in interpolation in finite element method.
In the Official Document, it is suggested to do small size array operations with `StaticArrays.jl`.
In my finite element program, the global node displacement is calculated first and stored in a `Vector`, and I want to calculate the displacement in the integral points inside the element. For each integral point, I get the node displacement of the element from the global displacement vector and store it as a `MVector` like

``````@views poidis.disfre_nod .= nodfre_nod[ithdim_poi,poidis.elecon_nod]
@views poidis.noddis_ele .= MVector{numnod_ele}(noddis_nod[poidis.disfre_nod])
``````

The shape function is also a `MVector`. Then I calculate the displacement of integral point by

``````poidis.poidis_poi[ithdim_poi,ithpoi_poi] = dot(poidis.shafun_ele,poidis.noddis_ele)
``````

I need to loop over all the elements, then I test the memory allocation ,the result is

``````        0             @views poidis.disfre_nod .= nodfre_nod[ithdim_poi,poidis.elecon_nod]
13747184             @views poidis.noddis_ele .= MVector{numnod_ele}(noddis_nod[poidis.disfre_nod])
3436800             poidis.poidis_poi[ithdim_poi,ithpoi_poi] = dot(poidis.shafun_ele,poidis.noddis_ele)
``````

As we can see, it is a huge number. I thought maybe the type conversion from `Vector` to `MVector` is time consuming, then I make a little change like

``````        0             @views poidis.disfre_nod .= nodfre_nod[ithdim_poi,poidis.elecon_nod]
-             # @views poidis.noddis_ele .= MVector{numnod_ele}(noddis_nod[poidis.disfre_nod])
10310352             @views poidis.noddis_ele .= noddis_nod[poidis.disfre_nod]
3436800             poidis.poidis_poi[ithdim_poi,ithpoi_poi] = dot(poidis.shafun_ele,poidis.noddis_ele)
``````

The memory allocation is lower, but still a big number. What is the possible reason?
Another question is that why the `dot` of two `MVector` need to allocate so much memory?
Thanks for your suggestions! If necessary, I will post the code.

I just solve it! I preallocated the `poidis.disfre_nod` and `poidis.noddis_ele` as `MVector`, but did not claim the dimention and numerical type, so the complier need to judge the type. After I claim the type of `poidis.disfre_nod` as `MVector{4,Float64}` and `poidis.noddis_ele` as `MVector{4,Int64}`, the memory allocation becomes little.

What is the “Official Document”?

Just the Documentation in julialang.org. See Julia Documentation · The Julia Language.