Skip to content

Commit b4abb49

Browse files
Merge pull request #299 from gridap/CDLagrangianRefFEs
Cd lagrangian ref f es
2 parents 893b075 + 89a512b commit b4abb49

File tree

6 files changed

+133
-0
lines changed

6 files changed

+133
-0
lines changed
+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
const CONT = 0
2+
const DISC = 1
3+
4+
function CDLagrangianRefFE(::Type{T},p::Polytope{D},order::Int,cont) where {T,D}
5+
orders = tfill(order,Val{D}())
6+
CDLagrangianRefFE(T,p,orders,cont)
7+
end
8+
9+
function CDLagrangianRefFE(::Type{T},p::Polytope{D},orders,cont) where {T,D}
10+
11+
lrfe = LagrangianRefFE(T,p,orders)
12+
grfe = lrfe.data
13+
14+
face_own_nodes = _compute_cd_face_own_nodes(p,orders,cont)
15+
16+
face_own_dofs = _generate_face_own_dofs(face_own_nodes, grfe.dofs.node_and_comp_to_dof)
17+
18+
reffaces = compute_lagrangian_reffaces(T,p,orders)
19+
20+
_reffaces = vcat(reffaces...)
21+
22+
ndofs = length(grfe.dofs.dof_to_node)
23+
24+
face_own_dofs_permutations = _trivial_face_own_dofs_permutations(face_own_dofs)
25+
26+
GenericRefFE(
27+
grfe.ndofs,
28+
grfe.polytope,
29+
grfe.prebasis,
30+
grfe.dofs,
31+
face_own_dofs,
32+
face_own_dofs_permutations,
33+
grfe.face_dofs,
34+
grfe.shapefuns)
35+
36+
end
37+
38+
function _compute_cd_face_own_nodes(p::ExtrusionPolytope{D},orders::NTuple{D,<:Int},cont::NTuple{D,<:Int}) where D
39+
nodes_ijk = CartesianIndices(Tuple(orders.+1))
40+
nodes_i = LinearIndices(nodes_ijk)
41+
face_owned_nodes = Vector{Int64}[]
42+
for nf in p.dface.nfaces
43+
anc = nf.anchor
44+
ext = nf.extrusion
45+
fns = UnitRange{Int64}[]
46+
for (i,(e,a,c,o)) in enumerate(zip(ext,anc,cont,orders))
47+
if e==0 && c == DISC
48+
push!(fns,1:-1)
49+
break
50+
elseif e==0 && c == CONT
51+
push!(fns,a*o+1:a*o+1)
52+
elseif e==1 && c == DISC
53+
push!(fns,1:o+1)
54+
elseif e==1 && c == CONT
55+
push!(fns,2:o)
56+
end
57+
end
58+
n_ijk = CartesianIndices(Tuple(fns))
59+
if length(n_ijk) == 0
60+
n_i = Int64[]
61+
else
62+
n_i = Int64[nodes_i[n_ijk]...]
63+
end
64+
push!(face_owned_nodes,n_i)
65+
end
66+
face_owned_nodes
67+
end

src/ReferenceFEs/ReferenceFEs.jl

+6
Original file line numberDiff line numberDiff line change
@@ -142,12 +142,16 @@ export QUAD4
142142
export TET4
143143
export HEX8
144144

145+
export CONT
146+
export DISC
147+
145148
export SerendipityRefFE
146149
export DiscRefFE
147150
export PDiscRefFE
148151
export QDiscRefFE
149152
export RaviartThomasRefFE
150153
export NedelecRefFE
154+
export CDLagrangianRefFE
151155

152156
include("Polytopes.jl")
153157

@@ -173,4 +177,6 @@ include("RaviartThomasRefFEs.jl")
173177

174178
include("NedelecRefFEs.jl")
175179

180+
include("CDLagrangianRefFEs.jl")
181+
176182
end # module
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
module CDLagrangianFESpacesTests
2+
3+
using Test
4+
using Gridap
5+
using Gridap.Geometry
6+
using Gridap.ReferenceFEs
7+
using Gridap.FESpaces
8+
9+
domain =(0,1,0,1)
10+
partition = (3,3)
11+
model = CartesianDiscreteModel(domain,partition)
12+
trian = get_triangulation(model)
13+
14+
order = 1
15+
16+
T = VectorValue{2,Float64}
17+
reffe = CDLagrangianRefFE(T,QUAD,order,(DISC,CONT))
18+
V = FESpace(model=model,reffe=reffe)#),dirichlet_tags = [1,6])
19+
test_single_field_fe_space(V)
20+
21+
u(x) = x
22+
U = TrialFESpace(V,u)
23+
24+
uh = interpolate(U,u)
25+
26+
e = u - uh
27+
28+
trian = Triangulation(model)
29+
quad = CellQuadrature(trian,order)
30+
31+
el2 = sqrt(sum(integrate(inner(e,e),trian,quad)))
32+
@test el2 < 1.0e-10
33+
34+
#using Gridap.Visualization
35+
#
36+
#writevtk(trian,"trian",nsubcells=10,cellfields=["uh"=>uh])
37+
38+
end # module

test/FESpacesTests/runtests.jl

+2
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ using Test
3434

3535
@testset "DiscontinuousFESpaces" begin include("DiscontinuousFESpacesTests.jl") end
3636

37+
@testset "CDLagrangianFESpaces" begin include("CDLagrangianFESpacesTests.jl") end
38+
3739
@testset "FETerms" begin include("FETermsTests.jl") end
3840

3941
@testset "CellKernels" begin include("CellKernelsTests.jl") end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
module CDLagrangianRefFEsTests
2+
3+
using Gridap
4+
using Gridap.TensorValues
5+
using Gridap.ReferenceFEs
6+
7+
T = Float64
8+
reffe = CDLagrangianRefFE(T,SEGMENT,(2,),(DISC,))
9+
test_reference_fe(reffe)
10+
11+
reffe = CDLagrangianRefFE(T,QUAD,(2,2),(CONT,DISC))
12+
test_reference_fe(reffe)
13+
14+
T = VectorValue{3,Float64}
15+
reffe = CDLagrangianRefFE(T,HEX,(2,2,2),(CONT,CONT,DISC))
16+
test_reference_fe(reffe)
17+
18+
end # module

test/ReferenceFEsTests/runtests.jl

+2
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,6 @@ using Test
2626

2727
@testset "NedelecRefFEs" begin include("NedelecRefFEsTests.jl") end
2828

29+
@testset "CDLagrangianRefFEs" begin include("CDLagrangianRefFEsTests.jl") end
30+
2931
end # module

0 commit comments

Comments
 (0)