2020get_ncomponents(FEType:: Type{<:H1P2} ) = FEType. parameters[1 ]
2121get_edim(FEType:: Type{<:H1P2} ) = FEType. parameters[2 ]
2222
23- get_ndofs(:: Type{<:AssemblyType} , FEType:: Type{<: H1P2} , EG:: Type{<:AbstractElementGeometry0D} ) = FEType . parameters[ 1 ]
24- get_ndofs(:: Union{ Type{<:ON_EDGES }, Type{<:ON_BEDGES}} , FEType:: Type{<: H1P2} , EG:: Type{<:AbstractElementGeometry1D} ) = 3 * FEType . parameters[ 1 ]
25- get_ndofs(:: Union{ Type{<:ON_FACES }, Type{<:ON_BFACES}} , FEType:: Type{<: H1P2} , EG:: Type{<:Union{AbstractElementGeometry1D, Triangle2D, Tetrahedron3D}} ) = Int((FEType . parameters[ 2 ]) * (FEType . parameters[ 2 ] + 1 ) / 2 * FEType . parameters[ 1 ])
26- get_ndofs(:: Type{<:ON_CELLS } , FEType:: Type{<: H1P2} , EG:: Type{<:Union{AbstractElementGeometry1D, Triangle2D, Tetrahedron3D}} ) = Int((FEType . parameters[ 2 ] + 1 ) * (FEType . parameters[ 2 ] + 2 ) / 2 * FEType . parameters[ 1 ])
23+ get_ndofs(:: Type{<:AssemblyType} , FEType:: Type{H1P2{n, e}} , EG:: Type{<:AbstractElementGeometry0D} ) where {n, e} = n
24+ get_ndofs(:: Type{<:AssemblyType } , FEType:: Type{H1P2{n, e}} , EG:: Type{<:AbstractElementGeometry1D} ) where {n, e} = 3 * n
25+ get_ndofs(:: Type{<:AssemblyType } , FEType:: Type{H1P2{n, e}} , EG:: Type{<:Triangle2D} ) where {n, e} = 6 * n
26+ get_ndofs(:: Type{<:AssemblyType } , FEType:: Type{H1P2{n, e}} , EG:: Type{<:Tetrahedron3D} ) where {n, e} = 10 * n
2727
2828get_polynomialorder(:: Type{<:H1P2} , :: Type{<:Edge1D} ) = 2 ;
2929get_polynomialorder(:: Type{<:H1P2} , :: Type{<:Triangle2D} ) = 2 ;
@@ -43,18 +43,13 @@ isdefined(FEType::Type{<:H1P2}, ::Type{<:Tetrahedron3D}) = true
4343
4444interior_dofs_offset(:: Type{<:AssemblyType} , :: Type{H1P2{ncomponents, edim}} , :: Type{Edge1D} ) where {ncomponents, edim} = 2
4545
46- function ExtendableGrids. interpolate!(Target, FE:: FESpace{Tv, Ti, FEType, APT} , :: Type{AT_NODES} , exact_function!; items = [], kwargs... ) where {Tv, Ti, FEType <: H1P2 , APT}
47- edim = get_edim(FEType)
48- nnodes = size(FE. dofgrid[Coordinates], 2 )
49- if edim == 1
50- nedges = num_sources(FE. dofgrid[CellNodes])
51- elseif edim == 2
52- nedges = num_sources(FE. dofgrid[FaceNodes])
53- elseif edim == 3
54- nedges = num_sources(FE. dofgrid[EdgeNodes])
55- end
46+ init_interpolator!(FES:: FESpace{Tv, Ti, FEType, APT} , :: Type{AT_NODES} ) where {Tv, Ti, FEType <: H1P2 , APT} = NodalInterpolator(FES)
47+ init_interpolator!(FES:: FESpace{Tv, Ti, FEType, APT} , :: Type{ON_FACES} ) where {Tv, Ti, FEType <: H1P2 , APT} = MomentInterpolator(FES, ON_FACES)
48+ init_interpolator!(FES:: FESpace{Tv, Ti, FEType, APT} , :: Type{ON_EDGES} ) where {Tv, Ti, FEType <: H1P2 , APT} = MomentInterpolator(FES, ON_EDGES)
49+ init_interpolator!(FES:: FESpace{Tv, Ti, FEType, APT} , :: Type{ON_CELLS} ) where {Tv, Ti, FEType <: H1P2 , APT} = MomentInterpolator(FES, ON_CELLS)
5650
57- return point_evaluation!(Target, FE, AT_NODES, exact_function!; items = items, component_offset = nnodes + nedges, kwargs... )
51+ function ExtendableGrids. interpolate!(Target, FE:: FESpace{Tv, Ti, FEType, APT} , :: Type{AT_NODES} , exact_function!; items = [], kwargs... ) where {Tv, Ti, FEType <: H1P2 , APT}
52+ return get_interpolator(FE, AT_NODES). evaluate!(Target, exact_function!, items; kwargs... )
5853end
5954
6055function ExtendableGrids. interpolate!(Target, FE:: FESpace{Tv, Ti, FEType, APT} , :: Type{ON_EDGES} , exact_function!; items = [], kwargs... ) where {Tv, Ti, FEType <: H1P2 , APT}
@@ -65,7 +60,7 @@ function ExtendableGrids.interpolate!(Target, FE::FESpace{Tv, Ti, FEType, APT},
6560 interpolate!(Target, FE, AT_NODES, exact_function!; items = subitems, kwargs... )
6661
6762 # perform edge mean interpolation
68- ensure_moments!(Target, FE, ON_EDGES, exact_function!; items = items, kwargs ... )
63+ get_interpolator( FE, ON_EDGES) . evaluate!(Target , exact_function!, items )
6964 end
7065end
7166
@@ -77,7 +72,7 @@ function ExtendableGrids.interpolate!(Target, FE::FESpace{Tv, Ti, FEType, APT},
7772 interpolate!(Target, FE, AT_NODES, exact_function!; items = subitems, kwargs... )
7873
7974 # perform face mean interpolation
80- ensure_moments!(Target, FE, ON_FACES, exact_function!; items = items, kwargs... )
75+ get_interpolator( FE, ON_FACES) . evaluate!(Target , exact_function!, items; kwargs... )
8176 elseif edim == 3
8277 # delegate face edges to edge interpolation
8378 subitems = slice(FE. dofgrid[FaceEdges], items)
@@ -106,7 +101,7 @@ function ExtendableGrids.interpolate!(Target, FE::FESpace{Tv, Ti, FEType, APT},
106101 interpolate!(Target, FE, AT_NODES, exact_function!; items = subitems, kwargs... )
107102
108103 # preserve cell integral
109- ensure_moments!(Target, FE, ON_CELLS, exact_function!; items = items, kwargs... )
104+ get_interpolator( FE, ON_CELLS) . evaluate!(Target , exact_function!, items; kwargs... )
110105 end
111106end
112107
0 commit comments