@@ -97,12 +97,14 @@ function vertically_adapt(model::OctreeDistributedDiscreteModel{Dc,Dp},
97
97
pXest_ghost_destroy (model. pXest_type,ptr_pXest_ghost)
98
98
pXest_lnodes_destroy (model. pXest_type,ptr_pXest_lnodes)
99
99
pXest_refinement_rule_type = PXestVerticalRefinementRuleType ()
100
+ stride = pXest_stride_among_children (model. pXest_type,pXest_refinement_rule_type,model. ptr_pXest)
100
101
adaptivity_glue = _compute_fine_to_coarse_model_glue (model. pXest_type,
101
102
pXest_refinement_rule_type,
102
103
model. parts,
103
104
model. dmodel,
104
105
fmodel,
105
- _refinement_and_coarsening_flags)
106
+ _refinement_and_coarsening_flags,
107
+ stride)
106
108
adaptive_models = map (local_views (model),
107
109
local_views (fmodel),
108
110
adaptivity_glue) do model, fmodel, glue
@@ -403,11 +405,27 @@ function generate_face_labeling(pXest_type::P6estType,
403
405
facet_to_entity = map (x-> x[Dc] , faces_to_entity)
404
406
cell_to_entity = map (x-> x[Dc+ 1 ], faces_to_entity)
405
407
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))
411
429
412
430
faces_to_entity= [vertex_to_entity,edget_to_entity,facet_to_entity,cell_to_entity]
413
431
@@ -460,3 +478,183 @@ face_labeling =
460
478
end
461
479
face_labeling
462
480
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