Skip to content

Commit 8fc1207

Browse files
Horizontal refinement working in serial
1 parent 06ba274 commit 8fc1207

9 files changed

+826
-262
lines changed

Project.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ ArgParse = "1"
1919
FillArrays = "0.8.4, 0.9, 0.10, 0.11, 0.12, 1"
2020
Gridap = "0.17.22"
2121
MPI = "0.20"
22-
P4est_wrapper = "0.2.0"
22+
P4est_wrapper = "0.2.1"
2323
PartitionedArrays = "0.3.3"
2424
julia = "1.5,1.6,1.7,1.8,1.9"
2525

src/AnisotropicallyAdapted3DDistributedDiscreteModels.jl

+204-6
Original file line numberDiff line numberDiff line change
@@ -97,12 +97,14 @@ function vertically_adapt(model::OctreeDistributedDiscreteModel{Dc,Dp},
9797
pXest_ghost_destroy(model.pXest_type,ptr_pXest_ghost)
9898
pXest_lnodes_destroy(model.pXest_type,ptr_pXest_lnodes)
9999
pXest_refinement_rule_type = PXestVerticalRefinementRuleType()
100+
stride = pXest_stride_among_children(model.pXest_type,pXest_refinement_rule_type,model.ptr_pXest)
100101
adaptivity_glue = _compute_fine_to_coarse_model_glue(model.pXest_type,
101102
pXest_refinement_rule_type,
102103
model.parts,
103104
model.dmodel,
104105
fmodel,
105-
_refinement_and_coarsening_flags)
106+
_refinement_and_coarsening_flags,
107+
stride)
106108
adaptive_models = map(local_views(model),
107109
local_views(fmodel),
108110
adaptivity_glue) do model, fmodel, glue
@@ -403,11 +405,27 @@ function generate_face_labeling(pXest_type::P6estType,
403405
facet_to_entity = map(x->x[Dc] , faces_to_entity)
404406
cell_to_entity = map(x->x[Dc+1], faces_to_entity)
405407

406-
function cell_to_faces(topology,cell_dim,face_dim)
407-
map(topology) do topology
408-
Gridap.Geometry.get_faces(topology,cell_dim,face_dim)
409-
end
410-
end
408+
polytope = HEX
409+
410+
update_face_to_entity_with_ghost_data!(vertex_to_entity,
411+
cell_prange,
412+
num_faces(polytope,0),
413+
cell_to_faces(topology,Dc,0))
414+
415+
update_face_to_entity_with_ghost_data!(edget_to_entity,
416+
cell_prange,
417+
num_faces(polytope,1),
418+
cell_to_faces(topology,Dc,1))
419+
420+
update_face_to_entity_with_ghost_data!(facet_to_entity,
421+
cell_prange,
422+
num_faces(polytope,Dc-1),
423+
cell_to_faces(topology,Dc,Dc-1))
424+
425+
update_face_to_entity_with_ghost_data!(cell_to_entity,
426+
cell_prange,
427+
num_faces(polytope,Dc),
428+
cell_to_faces(topology,Dc,Dc))
411429

412430
faces_to_entity=[vertex_to_entity,edget_to_entity,facet_to_entity,cell_to_entity]
413431

@@ -460,3 +478,183 @@ face_labeling =
460478
end
461479
face_labeling
462480
end
481+
482+
function num_locally_owned_columns(octree_model)
483+
@assert octree_model.pXest_type==P6estType()
484+
map(octree_model.parts) do _
485+
pXest=octree_model.ptr_pXest[]
486+
num_cols = 0
487+
num_trees = Cint(pXest.columns[].connectivity[].num_trees)
488+
for itree = 0:num_trees-1
489+
tree = pXest_tree_array_index(octree_model.pXest_type,pXest,itree)[]
490+
num_cols += tree.quadrants.elem_count
491+
end
492+
num_cols
493+
end
494+
end
495+
496+
497+
function _horizontally_refine_coarsen_balance!(model::OctreeDistributedDiscreteModel{Dc,Dp},
498+
refinement_and_coarsening_flags::MPIArray{<:Vector}) where {Dc,Dp}
499+
500+
pXest_type = model.pXest_type
501+
init_fn_callback_c = p6est_horizontally_adapt_reset_callbacks()
502+
coarsen_fn_callback_c = p6est_horizontally_coarsen_callbacks()
503+
refine_callback_c,refine_replace_callback_c = p6est_horizontally_refine_callbacks()
504+
505+
num_cols = num_locally_owned_columns(model)
506+
507+
map(refinement_and_coarsening_flags,num_cols) do flags, num_cols
508+
# The length of the local flags array has to match the number of locally owned columns in the model
509+
@assert num_cols==length(flags)
510+
println("BBB: $(flags)")
511+
pXest_reset_data!(pXest_type, model.ptr_pXest, Cint(sizeof(Cint)), init_fn_callback_c, pointer(flags))
512+
println("CCC: $(flags)")
513+
end
514+
515+
516+
# # Copy input p4est, refine and balance
517+
ptr_new_pXest = pXest_copy(pXest_type, model.ptr_pXest)
518+
519+
p6est_horizontally_refine!(ptr_new_pXest,
520+
refine_callback_c,
521+
refine_replace_callback_c)
522+
523+
p6est_horizontally_coarsen!(ptr_new_pXest, coarsen_fn_callback_c)
524+
525+
pXest_balance!(pXest_type, ptr_new_pXest)
526+
527+
p6est_horizontally_adapt_update_flags!(model.ptr_pXest,ptr_new_pXest)
528+
529+
ptr_new_pXest
530+
end
531+
532+
533+
function horizontally_adapt(model::OctreeDistributedDiscreteModel{Dc,Dp},
534+
refinement_and_coarsening_flags::MPIArray{<:Vector{<:Integer}};
535+
parts=nothing) where {Dc,Dp}
536+
537+
Gridap.Helpers.@notimplementedif parts!=nothing
538+
539+
_refinement_and_coarsening_flags = map(refinement_and_coarsening_flags) do flags
540+
convert(Vector{Cint},flags)
541+
end
542+
543+
ptr_new_pXest = _horizontally_refine_coarsen_balance!(model, _refinement_and_coarsening_flags)
544+
545+
# Extract ghost and lnodes
546+
ptr_pXest_ghost = setup_pXest_ghost(model.pXest_type, ptr_new_pXest)
547+
ptr_pXest_lnodes = setup_pXest_lnodes_nonconforming(model.pXest_type, ptr_new_pXest, ptr_pXest_ghost)
548+
549+
# Build fine-grid mesh
550+
fmodel,non_conforming_glue = setup_non_conforming_distributed_discrete_model(model.pXest_type,
551+
model.parts,
552+
model.coarse_model,
553+
model.ptr_pXest_connectivity,
554+
ptr_new_pXest,
555+
ptr_pXest_ghost,
556+
ptr_pXest_lnodes)
557+
558+
pXest_ghost_destroy(model.pXest_type,ptr_pXest_ghost)
559+
pXest_lnodes_destroy(model.pXest_type,ptr_pXest_lnodes)
560+
pXest_refinement_rule_type = PXestHorizontalRefinementRuleType()
561+
562+
_extruded_flags = _extrude_refinement_and_coarsening_flags(_refinement_and_coarsening_flags,
563+
model.ptr_pXest,
564+
ptr_new_pXest)
565+
stride = pXest_stride_among_children(model.pXest_type,pXest_refinement_rule_type,model.ptr_pXest)
566+
adaptivity_glue = _compute_fine_to_coarse_model_glue(model.pXest_type,
567+
pXest_refinement_rule_type,
568+
model.parts,
569+
model.dmodel,
570+
fmodel,
571+
_extruded_flags,
572+
stride)
573+
adaptive_models = map(local_views(model),
574+
local_views(fmodel),
575+
adaptivity_glue) do model, fmodel, glue
576+
Gridap.Adaptivity.AdaptedDiscreteModel(fmodel,model,glue)
577+
end
578+
fmodel = GridapDistributed.GenericDistributedDiscreteModel(adaptive_models,get_cell_gids(fmodel))
579+
ref_model = OctreeDistributedDiscreteModel(Dc,Dp,
580+
model.parts,
581+
fmodel,
582+
non_conforming_glue,
583+
model.coarse_model,
584+
model.ptr_pXest_connectivity,
585+
ptr_new_pXest,
586+
model.pXest_type,
587+
pXest_refinement_rule_type,
588+
false,
589+
model)
590+
return ref_model, adaptivity_glue
591+
end
592+
593+
function _extrude_refinement_and_coarsening_flags(
594+
refinement_and_coarsening_flags::MPIArray{<:Vector{<:Integer}},
595+
ptr_pXest_old,
596+
ptr_pXest_new)
597+
598+
pXest_old = ptr_pXest_old[]
599+
pXest_new = ptr_pXest_new[]
600+
pXest_type = P6estType()
601+
602+
num_trees = Cint(pXest_old.columns[].connectivity[].num_trees)
603+
@assert num_trees == Cint(pXest_new.columns[].connectivity[].num_trees)
604+
605+
map(refinement_and_coarsening_flags) do flags
606+
current_old_quad=1
607+
current_cell_old=1
608+
total=0
609+
for itree=0:num_trees-1
610+
tree = pXest_tree_array_index(pXest_type,pXest_old,itree)[]
611+
num_quads = Cint(tree.quadrants.elem_count)
612+
q = pXest_quadrant_array_index(pXest_type,tree,0)
613+
f,l=P6EST_COLUMN_GET_RANGE(q[])
614+
num_layers=l-f
615+
total+=num_quads*num_layers
616+
end
617+
extruded_flags=similar(flags, total)
618+
619+
# Go over trees
620+
for itree=0:num_trees-1
621+
tree = pXest_tree_array_index(pXest_type,pXest_old,itree)[]
622+
num_quads = Cint(tree.quadrants.elem_count)
623+
iquad=0
624+
# Go over columns of current tree
625+
while iquad<num_quads
626+
q = pXest_quadrant_array_index(pXest_type,tree,iquad)
627+
f,l=P6EST_COLUMN_GET_RANGE(q[])
628+
num_layers=l-f
629+
if (flags[current_old_quad]==nothing_flag)
630+
for j=1:num_layers
631+
extruded_flags[current_cell_old] = nothing_flag
632+
current_cell_old += 1
633+
end
634+
iquad+=1
635+
current_old_quad+=1
636+
elseif (flags[current_old_quad]==refine_flag)
637+
for j=1:num_layers
638+
extruded_flags[current_cell_old]=refine_flag
639+
current_cell_old += 1
640+
end
641+
iquad+=1
642+
current_old_quad+=1
643+
else
644+
@assert flags[current_old_quad ]==coarsen_flag
645+
@assert flags[current_old_quad+1]==coarsen_flag
646+
@assert flags[current_old_quad+2]==coarsen_flag
647+
@assert flags[current_old_quad+3]==coarsen_flag
648+
for j=1:num_layers*4
649+
extruded_flags[current_cell_old]=coarsen_flag
650+
current_cell_old += 1
651+
end
652+
iquad+=4
653+
current_old_quad+=4
654+
end
655+
end
656+
end
657+
658+
extruded_flags
659+
end
660+
end

0 commit comments

Comments
 (0)