Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Grid refinement #838

Merged
merged 144 commits into from
Jan 26, 2023
Merged
Show file tree
Hide file tree
Changes from 21 commits
Commits
Show all changes
144 commits
Select commit Hold shift + click to select a range
e5d51ef
Created new Gridap Refinement module
JordiManyer Oct 10, 2022
4183bad
Added RefinedDiscreteModels
JordiManyer Oct 11, 2022
9c3454e
Added tests for RefinedDiscreteModels
JordiManyer Oct 11, 2022
741a43c
Added RefinedTriangulation
JordiManyer Oct 11, 2022
d33c58f
Fixed RefinedTriangulation
JordiManyer Oct 11, 2022
00aa757
Started implementing RefinementTransferOperators
JordiManyer Oct 12, 2022
a1f09c7
change_domain_f2c now only needs a RefinedTrian
JordiManyer Oct 12, 2022
fd906a4
Started testing change_domain methods.
JordiManyer Oct 12, 2022
b70ed79
Constructor for RefinedCartesianDiscreteModel
JordiManyer Oct 13, 2022
4b390ea
Integration working
JordiManyer Oct 14, 2022
8e23dc0
Started testing Transfer Ops
JordiManyer Oct 14, 2022
c96183f
TransferOps work from F to C
JordiManyer Oct 17, 2022
4c59bad
RefinementTransferOperators work both ways
JordiManyer Oct 17, 2022
38de653
Added RefinementTransferMap
JordiManyer Oct 17, 2022
5a648a1
Added some comments
JordiManyer Oct 17, 2022
7065340
Small bugfix in RefinedCartesianDiscreteModel
JordiManyer Oct 17, 2022
d3fbdcc
Projection can be now chosen by the user
JordiManyer Oct 17, 2022
79fa5ab
Enhanced tests
JordiManyer Oct 17, 2022
299602f
Moved code around
JordiManyer Oct 17, 2022
099907b
The reduce op on cell contribs is now lazy
JordiManyer Oct 17, 2022
898c0f2
Put tests in module
JordiManyer Oct 17, 2022
4ace6a4
Addressed some revissions
JordiManyer Oct 20, 2022
9865259
RefinedTriangulation constructor now has checks.
JordiManyer Oct 23, 2022
26a64d3
Bugfix in 1 of RefinedTriangulation constructors.
JordiManyer Oct 23, 2022
0f1ed7a
Minor changes
JordiManyer Oct 24, 2022
ecd87ba
RefinedDiscreteModel now enforces its background model not to be of t…
JordiManyer Oct 24, 2022
0e3c6eb
Broadened change_domain routines
JordiManyer Oct 24, 2022
9024942
Implemented refine() for CartesianModel
JordiManyer Oct 25, 2022
6698404
get_glue replaced by get_refinement_glue
JordiManyer Oct 25, 2022
58cdf46
RefinedTriangulation.model -> .refined_model
JordiManyer Oct 25, 2022
08c74e2
Added @nonimplementedif condition to change_domain_c2f
JordiManyer Oct 25, 2022
43fdbf2
bugfixes
JordiManyer Oct 25, 2022
f9d5da5
More fixes
JordiManyer Oct 25, 2022
49a64d9
More fixes
JordiManyer Oct 25, 2022
3db5b31
Added abstract type GridTransferOperators
JordiManyer Oct 25, 2022
4f93af9
ProjectionTransferoperator now accepts a general LinearSolver
JordiManyer Oct 25, 2022
356ddd7
Changes to RefinementGlue
JordiManyer Oct 25, 2022
b610222
Removed IterativeSolvers completely
JordiManyer Oct 25, 2022
64e5820
fixes
JordiManyer Oct 25, 2022
caeb975
fixes
JordiManyer Oct 26, 2022
0d26738
Merge branch 'master' of github.com:gridap/Gridap.jl into refined-dis…
JordiManyer Oct 26, 2022
8be1384
Increased support for skeleton triangulations
JordiManyer Oct 26, 2022
57a3a19
Started implementing refining for UnstructuredMeshes
JordiManyer Oct 27, 2022
21d4f47
fixes
JordiManyer Oct 28, 2022
3f284ea
bugfix
JordiManyer Nov 7, 2022
262dae7
Implemented CompositeMeasure
JordiManyer Nov 9, 2022
1c735b0
Commented some tests
JordiManyer Nov 9, 2022
0458a04
Changed wording from Refinement to Adaptivity
JordiManyer Nov 9, 2022
2863894
Cleaned up tests. Removed GridTransferOperators.
JordiManyer Nov 10, 2022
9e34132
Added comments
JordiManyer Nov 10, 2022
c4bc997
bugfix
JordiManyer Nov 10, 2022
3ee6709
Bugfix view(AdaptedTriangulation)
JordiManyer Nov 10, 2022
4839aba
Optimized f2c glue map. Added degenerated case.
JordiManyer Nov 14, 2022
587c9e2
bugfix
JordiManyer Nov 14, 2022
13266a0
Measure is now abstract 2 include CompositeMeasure
JordiManyer Nov 16, 2022
d06795e
change_domain now does dispatch with source trian.
JordiManyer Nov 17, 2022
bb8e30f
Added tests to test the new features.
JordiManyer Nov 17, 2022
323d825
Added missing method for compute_reference_grid
JordiManyer Nov 21, 2022
5d4385d
Started generalising for coarsening+refineing
JordiManyer Nov 21, 2022
b0016d5
Implemented CompositeQuadratures
JordiManyer Nov 21, 2022
7337a5b
Added tests for CompositeQuadratures
JordiManyer Nov 21, 2022
e163480
Added FineToCoarseFields
JordiManyer Nov 22, 2022
2918cb2
Bugfix: Tables now work with types without zero() method.
JordiManyer Nov 24, 2022
aaa231d
Added c2f capabilities
JordiManyer Nov 24, 2022
ad76529
Added tests for f2c
JordiManyer Nov 24, 2022
4288d78
More tests for f2c
JordiManyer Nov 24, 2022
91f4619
Merge branch 'master' of github.com:gridap/Gridap.jl into refined-dis…
JordiManyer Nov 24, 2022
c2cfc7c
Updated NEWS.md
JordiManyer Nov 24, 2022
fda6668
Added some checks for CompositeMeasure
JordiManyer Nov 24, 2022
d62cc0e
Minor cleanup
JordiManyer Nov 24, 2022
c8e6eec
Small bugfix
JordiManyer Nov 24, 2022
298270f
RefinementRule now only depends on Polytope
JordiManyer Nov 28, 2022
f584db8
FineToCoarseField evaluation optimized for vectors of pts
JordiManyer Nov 28, 2022
41c35e7
Added warning in f2c methods
JordiManyer Nov 28, 2022
a87dd18
AdaptiveGlueType -> AdaptivityGlueType
JordiManyer Nov 28, 2022
5e6c1ca
Added more interpolation tests
JordiManyer Nov 28, 2022
79e4f5f
Added tests for Multifield
JordiManyer Nov 28, 2022
00d4da4
Compressed instances of is_related()
JordiManyer Nov 28, 2022
d51d32e
More tests for MultiField
JordiManyer Nov 28, 2022
fc05ec4
Added RefinementRuleType parameter class
JordiManyer Nov 30, 2022
b3cba3f
Added Red-Green 2D refinement rules
JordiManyer Nov 30, 2022
1493d8f
Small bugfix
JordiManyer Nov 30, 2022
7307b5e
Added red-green propagation
JordiManyer Nov 30, 2022
9f43c1d
Continued implementing red-green refining
JordiManyer Dec 1, 2022
72b97db
Implemented unique(::CompressedArray)
JordiManyer Dec 1, 2022
3545550
Started testing RedGreenRefinement
JordiManyer Dec 2, 2022
db7ef11
RedGreen Ref: Added tests, small bugfix
JordiManyer Dec 4, 2022
072edc6
Moved routines around
JordiManyer Dec 4, 2022
d756833
Small Bugfix
JordiManyer Dec 4, 2022
e392d98
Added a new adapt method for future use
JordiManyer Dec 5, 2022
727c9e9
Added check in AdaptedTriangulation constructor
JordiManyer Dec 5, 2022
bf33178
Compacted is_related code
JordiManyer Dec 5, 2022
360dd0e
Small change to a docstring
JordiManyer Dec 5, 2022
1d41637
Compressed is_change_possible and best_target routines with metaprogr…
JordiManyer Dec 5, 2022
37e87a6
Added get_refined_polytopes
JordiManyer Dec 6, 2022
3f8baa0
Merge branch 'master' into refined-discrete-models
amartinhuertas Dec 6, 2022
dda8785
Small bugfix
JordiManyer Dec 6, 2022
c4e2543
Refactored refinement for cartesian meshes.
JordiManyer Dec 6, 2022
41cc1c6
Updated tests
JordiManyer Dec 6, 2022
fc2eab9
Merge branch 'refined-discrete-models' of github.com:gridap/Gridap.jl…
JordiManyer Dec 6, 2022
0054e62
Some tests now for D=1,..,4
JordiManyer Dec 7, 2022
7b442a0
Merge branch 'master' of github.com:gridap/Gridap.jl into refined-dis…
amartinhuertas Dec 8, 2022
69aad50
Merge branch 'refined-discrete-models' of github.com:gridap/Gridap.jl…
JordiManyer Dec 8, 2022
dcf959c
Separated FineToCoarseField into its own file.
JordiManyer Dec 9, 2022
cfc0006
Bugfix
JordiManyer Dec 9, 2022
05a2a7c
Minor bug-fix for:
amartinhuertas Dec 10, 2022
08fd294
Added more tests for D=1,2,3
JordiManyer Dec 11, 2022
296a6f2
Modified tests to reduce memory consumption
JordiManyer Dec 11, 2022
08c355a
Added coarsening interface
JordiManyer Dec 20, 2022
d45fcbd
Bugfix in fine->coarse when coarse trian was AdaptedTriangulation. Ad…
JordiManyer Dec 22, 2022
016fc9f
Merge branch 'master' of github.com:gridap/Gridap.jl into refined-dis…
amartinhuertas Dec 23, 2022
4412aee
Merge branch 'refined-discrete-models' of github.com:gridap/Gridap.jl…
amartinhuertas Dec 23, 2022
c347b34
Fixed minor style issues
JordiManyer Jan 5, 2023
f516d09
Minor style changes
JordiManyer Jan 5, 2023
d6eab6a
Changes to AdaptivityGlue
JordiManyer Jan 5, 2023
a85bb58
Started looking at fast evaluation of F2CFields
JordiManyer Jan 5, 2023
a1e5ad6
Merge branch 'master' of github.com:gridap/Gridap.jl into refined-dis…
JordiManyer Jan 5, 2023
4c345e4
Added another fast evaluation method for FineToCoarseFields
JordiManyer Jan 6, 2023
e4fd36a
Added FineToCoarseReferenceFEs
JordiManyer Jan 6, 2023
6b9e14f
Added missing get_metadata methods for some instances of ReferenceFEs
JordiManyer Jan 6, 2023
d6a2ab1
Bugfixes and rearrangements to FineToCoarseReferenceFEs
JordiManyer Jan 8, 2023
e73fd1b
Merge branch 'fine-to-coarse-fields-fast-evaluation' of github.com:gr…
JordiManyer Jan 8, 2023
ba12ed4
RefinementRule typing now homogeneous for mixed.
JordiManyer Jan 13, 2023
174621c
Updated tests
JordiManyer Jan 13, 2023
98c39c0
Bugfix: Correct labeling when refining with EdgeBasedRefinement
JordiManyer Jan 16, 2023
9da6379
Small bugfix
JordiManyer Jan 19, 2023
f0ccf2c
Updated NEWS.md
JordiManyer Jan 19, 2023
030402c
Added AdaptivityMethod
JordiManyer Jan 19, 2023
52b2e9c
Fixed typo
JordiManyer Jan 19, 2023
984a411
Small refactor
JordiManyer Jan 20, 2023
9bf14e1
EdgeBasedRefinement now yields Oriented simplex meshes
JordiManyer Jan 20, 2023
e0017e5
Minor change
JordiManyer Jan 20, 2023
3575c31
Bugfix: Mixed refined meshes should not be oriented
JordiManyer Jan 20, 2023
aad0e3c
Small bugfix
JordiManyer Jan 20, 2023
ae14c98
Small bugfix
JordiManyer Jan 20, 2023
623b651
Added more tests
JordiManyer Jan 23, 2023
0175bc2
Limited change_domain for AdaptedTriangulations to BodyFittedTriangul…
JordiManyer Jan 23, 2023
ca122b5
Minor bugfixes
JordiManyer Jan 24, 2023
a4e43ca
Increased number of tests for mixed-refinement meshes
JordiManyer Jan 24, 2023
f9c819f
More tests
JordiManyer Jan 24, 2023
c3c39a5
Bugfixes, enhanced tests
JordiManyer Jan 25, 2023
d1509fb
Better tests
JordiManyer Jan 26, 2023
b365f5a
Increased coverage
JordiManyer Jan 26, 2023
9d44c56
Updated NEWS.md
JordiManyer Jan 26, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ FastGaussQuadrature = "442a2c76-b920-505d-bb47-c5924d526838"
FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549"
FillArrays = "1a297f60-69ca-5386-bcde-b61e274b549b"
ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210"
IterativeSolvers = "42fd0dbc-a981-5370-80f2-aaf504508153"
JLD2 = "033835bb-8acc-5ee8-8aae-3f567f8a3819"
JSON = "682c06a0-de6a-54ab-a142-c8b1cf79cde6"
LineSearches = "d3d80556-e9d4-5f37-9878-2ab0fcc64255"
Expand Down
2 changes: 2 additions & 0 deletions src/Gridap.jl
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@ include("MultiField/MultiField.jl")

include("ODEs/ODEs.jl")

include("Refinement/Refinement.jl")

include("Exports.jl")

end # module
116 changes: 116 additions & 0 deletions src/Refinement/RefinedDiscreteModels.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@


"""
Refinement glue between two nested triangulations
- `f2c_faces_map` : Given a fine face gid, returns the gid of the coarse face containing it.
- `fcell_to_child_id` : Given a fine cell gid, returns the local child id within the coarse cell containing it.
- `f2c_ref_cell_map` : Ref coordinate map between the fcells and their parent ccell, i.e
for each fine cell defines Φ st. x_c = Φ(x_f)
"""
struct RefinementGlue{A,B,C} <: GridapType
f2c_faces_map::A
fcell_to_child_id::B
f2c_ref_cell_map::C

function RefinementGlue(f2c_faces_map,
fcell_to_child_id,
f2c_ref_cell_map)
A = typeof(f2c_faces_map)
B = typeof(fcell_to_child_id)
C = typeof(f2c_ref_cell_map)
new{A,B,C}(f2c_faces_map,fcell_to_child_id,f2c_ref_cell_map)
end
end

"""
Ref coordinate map from fcell ref coords to ccell ref coords.
Size -> Number of children per coarse cell.
"""
function get_f2c_ref_cell_map(reffe,ref)
ref_grid = Geometry.UnstructuredGrid(Visualization.compute_reference_grid(reffe,ref))
return get_cell_map(ref_grid)
end

"""
Ref coordinate map between fine and coarse cells.
Size -> Number of fine cells.
"""
function get_f2c_ref_coordinate_map(g::RefinementGlue)
m = Reindex(g.f2c_ref_cell_map)
return lazy_map(m,g.fcell_to_child_id)
end

#################################################################

"""
RefinedDiscreteModel

`DiscreteModel` created by refining another `DiscreteModel`.
The hierarchy is stored, allowing for the transfer of dofs
between `FESpaces` defined on this model and its parent using a
`RefinementTransferoperator`.
"""
struct RefinedDiscreteModel{Dc,Dp,A,B} <: DiscreteModel{Dc,Dp}
model ::A
parent ::B
glue ::RefinementGlue

function RefinedDiscreteModel(model::DiscreteModel{Dc,Dp},parent::DiscreteModel{Dc,Dp},glue) where {Dc,Dp}
A = typeof(model)
B = typeof(parent)
return new{Dc,Dp,A,B}(model,parent,glue)
end
end

# DiscreteModel API
Geometry.get_grid(model::RefinedDiscreteModel) = get_grid(model.model)
Geometry.get_grid_topology(model::RefinedDiscreteModel) = get_grid_topology(model.model)
Geometry.get_face_labeling(model::RefinedDiscreteModel) = get_face_labeling(model.model)

# Other getters
get_model(model::RefinedDiscreteModel) = model.model
get_parent(model::RefinedDiscreteModel) = model.parent
get_glue(model::RefinedDiscreteModel) = model.glue

function refine(model::DiscreteModel) :: RefinedDiscreteModel
@abstractmethod
end


# Cartesian builder

function RefinedCartesianDiscreteModel(domain::Tuple,nC::Int,ref::Int)
nF = ref*nC
# Models
parent = CartesianDiscreteModel(domain,(nC,nC))
child = CartesianDiscreteModel(domain,(nF,nF))

# Glue
faces_map = [Int[],Int[],_create_f2c_cell_map(nC,ref)]
fcell_child_id = _create_child_map(nC,ref)
reffe = LagrangianRefFE(Float64,QUAD,1)
ref_cell_map = get_f2c_ref_cell_map(reffe,ref)
glue = RefinementGlue(faces_map,fcell_child_id,ref_cell_map)

# RefinedModel
model = RefinedDiscreteModel(child,parent,glue)
return model
end

function _create_f2c_cell_map(nC::Int,ref::Int)
nF = nC*ref

idx = Tuple.(CartesianIndices((nF,nF)))
a = map((i,j)->(1+(i-1)÷ref,1+(j-1)÷ref),first.(idx),last.(idx))
b = map((i,j)->(i-1)*nC+j,first.(a),last.(a))
return Array(reshape(transpose(b),nF*nF))
end

function _create_child_map(nC::Int,ref::Int)
nF = nC*ref
elem = reshape(collect(1:ref*ref),(ref,ref))
slice = transpose(repeat(elem,nC))
mat = repeat(slice,nC)
return Array(reshape(transpose(mat),nF*nF))
end

132 changes: 132 additions & 0 deletions src/Refinement/RefinedTriangulations.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@


struct RefinedTriangulation{Dc,Dp,A<:Triangulation,B<:RefinedDiscreteModel} <: Triangulation{Dc,Dp}
trian::A
model::B

function RefinedTriangulation(trian::Triangulation{Dc,Dp},model) where {Dc,Dp}
A = typeof(trian)
B = typeof(model)
return new{Dc,Dp,A,B}(trian,model)
end
end

function get_refined_model(t::RefinedTriangulation)
return t.model
end

# Wrap Triangulation API
function Geometry.get_background_model(t::RefinedTriangulation)
get_background_model(t.trian)
end

function Geometry.get_grid(t::RefinedTriangulation)
get_grid(t.trian)
end

function Geometry.get_glue(t::RefinedTriangulation,::Val{d}) where d
get_glue(t.trian,Val(d))
end

function Base.view(t::RefinedTriangulation,ids::AbstractArray)
v = view(t.trian,ids)
return RefinedTriangulation(v,t.model)
end

# Wrap constructors for RefinedDiscreteModel
function Geometry.Triangulation(
::Type{ReferenceFE{d}},model::RefinedDiscreteModel,filter::AbstractArray) where d

trian = Triangulation(ReferenceFE{d},get_model(model),filter)
return RefinedTriangulation(trian,model)
end

function Geometry.Triangulation(
::Type{ReferenceFE{d}},model::RefinedDiscreteModel,labels::FaceLabeling;kwargs...) where d
trian = Triangulation(ReferenceFE{d},get_model(model),labels;kwargs...)
return RefinedTriangulation(trian,model)
end

function Geometry.Triangulation(trian::RefinedTriangulation,args...;kwargs...)
return RefinedTriangulation(Triangulation(trian.trian),trian.model)
end

# Domain changes
# TODO: This assumes we have the same type of triangulation on both refinement levels!
# we might want to change this in the future when doing hybrid methods etc...

function Geometry.is_change_possible(strian::RefinedTriangulation,ttrian::RefinedTriangulation)
(strian === ttrian) && (return true)
smodel = get_refined_model(strian)
tmodel = get_refined_model(ttrian)
a = get_parent(tmodel) === smodel # tmodel = refine(smodel)
b = get_parent(smodel) === tmodel # smodel = refine(tmodel)
return a || b
end

function Geometry.is_change_possible(strian::RefinedTriangulation,ttrian::T) where {T <: Triangulation}
smodel = get_refined_model(strian)
tmodel = get_background_model(ttrian)
a = get_model(smodel) === tmodel # It is fundamentally the same model
b = get_parent(smodel) === tmodel # smodel = refine(tmodel)
return a || b
end

function Geometry.is_change_possible(strian::T,ttrian::RefinedTriangulation) where {T <: Triangulation}
return is_change_possible(ttrian,strian)
end

function Geometry.best_target(strian::RefinedTriangulation,ttrian::RefinedTriangulation)
@check is_change_possible(strian,ttrian)
smodel = get_refined_model(strian)
tmodel = get_refined_model(ttrian)
a = get_model(smodel) === get_parent(tmodel)
b = get_parent(tmodel) === smodel # tmodel = refine(smodel)
a || b ? ttrian : strian
end

function Geometry.best_target(strian::RefinedTriangulation,ttrian::T) where {T <: Triangulation}
@check is_change_possible(strian,ttrian)
return strian
end

function Geometry.best_target(strian::T,ttrian::RefinedTriangulation) where {T <: Triangulation}
@check is_change_possible(strian,ttrian)
return ttrian
end


"""
Given a RefinedTriangualtion and a CellField defined on the parent(coarse) mesh,
returns an equivalent CellField on the fine mesh.
"""
function change_domain_c2f(f_coarse, ftrian::RefinedTriangulation{Dc,Dp}) where {Dc,Dp}
model = get_refined_model(ftrian)
glue = get_glue(model)
if (num_cells(ftrian) != 0)
# Coarse field but with fine indexing, i.e
# f_f2c[i_fine] = f_coarse[coarse_parent(i_fine)]
fcell_to_ccell = glue.f2c_faces_map[Dc+1]
m = Reindex(get_data(f_coarse))
f_f2c = lazy_map(m,fcell_to_ccell)

# Fine to coarse coordinate map: x_coarse = Φ^(-1)(x_fine)
ref_coord_map = get_f2c_ref_coordinate_map(glue)

# Final map: f_fine(x_fine) = f_f2c ∘ Φ^(-1)(x_fine) = f_coarse(x_coarse)
f_fine = lazy_map(∘,f_f2c,ref_coord_map)
return GenericCellField(f_fine,ftrian,ReferenceDomain())
else
f_fine = Fill(Gridap.Fields.ConstantField(0.0),num_cells(ftrian))
return GenericCellField(f_fine,ftrian,ReferenceDomain())
end
end

function CellData.change_domain(a::CellField,ttrian::RefinedTriangulation)
strian = get_triangulation(a)
if strian === ttrian
return a
end
@assert is_change_possible(strian,ttrian)
change_domain_c2f(a,ttrian)
end
42 changes: 42 additions & 0 deletions src/Refinement/Refinement.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
"""

"""
module Refinement

using FillArrays
using LinearAlgebra
using IterativeSolvers
using Gridap.Helpers
using Gridap.Arrays
using Gridap.Geometry
using Gridap.FESpaces
using Gridap.ReferenceFEs
using Gridap.CellData
using Gridap.Visualization

import Base: view
import LinearAlgebra: mul!
import Gridap.Geometry: get_grid, get_grid_topology, get_face_labeling
import Gridap.Geometry: Triangulation, is_change_possible, best_target, get_glue, get_background_model
import Gridap.CellData: change_domain

include("RefinedDiscreteModels.jl")
include("RefinedTriangulations.jl")
include("RefinementTransferOperators.jl")

export RefinementGlue
export get_f2c_ref_cell_map, get_f2c_ref_coordinate_map

export RefinedDiscreteModel
export get_model, get_parent, get_glue
export RefinedCartesianDiscreteModel

export RefinedTriangulation
export Triangulation, is_change_possible, best_target, get_refined_model
export change_domain_c2f, change_domain

export RefinementTransferOperator, RefinementTransferMap
export mul!


end # module
Loading