436 type(
gs_t),
target,
intent(inout) :: gs
437 type(
mesh_t),
pointer :: msh
439 type(
stack_i4_t),
target :: local_dof, dof_local, shared_dof, dof_shared
440 type(
stack_i4_t),
target :: local_face_dof, face_dof_local
441 type(
stack_i4_t),
target :: shared_face_dof, face_dof_shared
442 integer :: i, j, k, l, lx, ly, lz, max_id, max_sid, id, lid, dm_size
448 sdm => gs%shared_dofs
453 dm_size =
dofmap%size()/lx
455 call dm%init(dm_size, i)
459 call sdm%init(
dofmap%size(), i)
462 call local_dof%init()
463 call dof_local%init()
465 call local_face_dof%init()
466 call face_dof_local%init()
468 call shared_dof%init()
469 call dof_shared%init()
471 call shared_face_dof%init()
472 call face_dof_shared%init()
484 if (
dofmap%shared_dof(1, 1, 1, i))
then
487 call shared_dof%push(id)
489 call dof_shared%push(lid)
495 call local_dof%push(id)
496 call dof_local%push(lid)
503 if (
dofmap%shared_dof(lx, 1, 1, i))
then
505 call shared_dof%push(id)
506 call dof_shared%push(lid)
509 call local_dof%push(id)
510 call dof_local%push(lid)
514 if (
dofmap%shared_dof(1, ly, 1, i))
then
516 call shared_dof%push(id)
517 call dof_shared%push(lid)
520 call local_dof%push(id)
521 call dof_local%push(lid)
525 if (
dofmap%shared_dof(lx, ly, 1, i))
then
527 call shared_dof%push(id)
528 call dof_shared%push(lid)
531 call local_dof%push(id)
532 call dof_local%push(lid)
536 if (
dofmap%shared_dof(1, 1, lz, i))
then
538 call shared_dof%push(id)
539 call dof_shared%push(lid)
542 call local_dof%push(id)
543 call dof_local%push(lid)
547 if (
dofmap%shared_dof(lx, 1, lz, i))
then
549 call shared_dof%push(id)
550 call dof_shared%push(lid)
553 call local_dof%push(id)
554 call dof_local%push(lid)
558 if (
dofmap%shared_dof(1, ly, lz, i))
then
560 call shared_dof%push(id)
561 call dof_shared%push(lid)
564 call local_dof%push(id)
565 call dof_local%push(lid)
569 if (
dofmap%shared_dof(lx, ly, lz, i))
then
571 call shared_dof%push(id)
572 call dof_shared%push(lid)
575 call local_dof%push(id)
576 call dof_local%push(lid)
593 if (
dofmap%shared_dof(2, 1, 1, i))
then
596 call shared_dof%push(id)
598 call dof_shared%push(id)
603 call local_dof%push(id)
605 call dof_local%push(id)
608 if (
dofmap%shared_dof(2, 1, lz, i))
then
611 call shared_dof%push(id)
613 call dof_shared%push(id)
618 call local_dof%push(id)
620 call dof_local%push(id)
624 if (
dofmap%shared_dof(2, ly, 1, i))
then
627 call shared_dof%push(id)
629 call dof_shared%push(id)
635 call local_dof%push(id)
637 call dof_local%push(id)
640 if (
dofmap%shared_dof(2, ly, lz, i))
then
643 call shared_dof%push(id)
645 call dof_shared%push(id)
650 call local_dof%push(id)
652 call dof_local%push(id)
659 if (
dofmap%shared_dof(1, 2, 1, i))
then
662 call shared_dof%push(id)
664 call dof_shared%push(id)
669 call local_dof%push(id)
671 call dof_local%push(id)
674 if (
dofmap%shared_dof(1, 2, lz, i))
then
677 call shared_dof%push(id)
679 call dof_shared%push(id)
684 call local_dof%push(id)
686 call dof_local%push(id)
690 if (
dofmap%shared_dof(lx, 2, 1, i))
then
693 call shared_dof%push(id)
695 call dof_shared%push(id)
700 call local_dof%push(id)
702 call dof_local%push(id)
705 if (
dofmap%shared_dof(lx, 2, lz, i))
then
708 call shared_dof%push(id)
710 call dof_shared%push(id)
715 call local_dof%push(id)
717 call dof_local%push(id)
723 if (
dofmap%shared_dof(1, 1, 2, i))
then
726 call shared_dof%push(id)
728 call dof_shared%push(id)
733 call local_dof%push(id)
735 call dof_local%push(id)
739 if (
dofmap%shared_dof(lx, 1, 2, i))
then
742 call shared_dof%push(id)
744 call dof_shared%push(id)
749 call local_dof%push(id)
751 call dof_local%push(id)
755 if (
dofmap%shared_dof(1, ly, 2, i))
then
758 call shared_dof%push(id)
760 call dof_shared%push(id)
765 call local_dof%push(id)
767 call dof_local%push(id)
771 if (
dofmap%shared_dof(lx, ly, 2, i))
then
774 call shared_dof%push(id)
776 call dof_shared%push(id)
781 call local_dof%push(id)
783 call dof_local%push(id)
802 if (msh%facet_neigh(3, i) .ne. 0)
then
803 if (
dofmap%shared_dof(2, 1, 1, i))
then
806 call shared_face_dof%push(id)
808 call face_dof_shared%push(id)
813 call local_face_dof%push(id)
815 call face_dof_local%push(id)
820 if (msh%facet_neigh(4, i) .ne. 0)
then
821 if (
dofmap%shared_dof(2, ly, 1, i))
then
825 call shared_face_dof%push(id)
827 call face_dof_shared%push(id)
834 call local_face_dof%push(id)
836 call face_dof_local%push(id)
844 if (msh%facet_neigh(1, i) .ne. 0)
then
845 if (
dofmap%shared_dof(1, 2, 1, i))
then
848 call shared_face_dof%push(id)
850 call face_dof_shared%push(id)
855 call local_face_dof%push(id)
857 call face_dof_local%push(id)
862 if (msh%facet_neigh(2, i) .ne. 0)
then
863 if (
dofmap%shared_dof(lx, 2, 1, i))
then
867 call shared_face_dof%push(id)
869 call face_dof_shared%push(id)
875 call local_face_dof%push(id)
877 call face_dof_local%push(id)
886 if (msh%facet_neigh(1, i) .ne. 0)
then
887 if (
dofmap%shared_dof(1, 2, 2, i))
then
892 call shared_face_dof%push(id)
894 call face_dof_shared%push(id)
902 call local_face_dof%push(id)
904 call face_dof_local%push(id)
910 if (msh%facet_neigh(2, i) .ne. 0)
then
911 if (
dofmap%shared_dof(lx, 2, 2, i))
then
916 call shared_face_dof%push(id)
918 call face_dof_shared%push(id)
926 call local_face_dof%push(id)
928 call face_dof_local%push(id)
935 if (msh%facet_neigh(3, i) .ne. 0)
then
936 if (
dofmap%shared_dof(2, 1, 2, i))
then
941 call shared_face_dof%push(id)
943 call face_dof_shared%push(id)
951 call local_face_dof%push(id)
953 call face_dof_local%push(id)
959 if (msh%facet_neigh(4, i) .ne. 0)
then
960 if (
dofmap%shared_dof(2, ly, 2, i))
then
965 call shared_face_dof%push(id)
967 call face_dof_shared%push(id)
975 call local_face_dof%push(id)
977 call face_dof_local%push(id)
984 if (msh%facet_neigh(5, i) .ne. 0)
then
985 if (
dofmap%shared_dof(2, 2, 1, i))
then
990 call shared_face_dof%push(id)
992 call face_dof_shared%push(id)
1000 call local_face_dof%push(id)
1002 call face_dof_local%push(id)
1008 if (msh%facet_neigh(6, i) .ne. 0)
then
1009 if (
dofmap%shared_dof(2, 2, lz, i))
then
1014 call shared_face_dof%push(id)
1016 call face_dof_shared%push(id)
1024 call local_face_dof%push(id)
1026 call face_dof_local%push(id)
1037 gs%nlocal = local_dof%size() + local_face_dof%size()
1038 gs%local_facet_offset = local_dof%size() + 1
1041 allocate(gs%local_dof_gs(gs%nlocal))
1048 select type (dof_array => local_dof%data)
1050 j = local_dof%size()
1052 gs%local_dof_gs(i) = dof_array(i)
1055 call local_dof%free()
1062 select type (dof_array => local_face_dof%data)
1064 do i = 1, local_face_dof%size()
1065 gs%local_dof_gs(i + j) = dof_array(i)
1068 call local_face_dof%free()
1071 allocate(gs%local_gs_dof(gs%nlocal))
1078 select type (dof_array => dof_local%data)
1080 j = dof_local%size()
1082 gs%local_gs_dof(i) = dof_array(i)
1085 call dof_local%free()
1090 select type (dof_array => face_dof_local%data)
1092 do i = 1, face_dof_local%size()
1093 gs%local_gs_dof(i+j) = dof_array(i)
1096 call face_dof_local%free()
1099 gs%nlocal, 1, gs%nlocal)
1102 gs%local_blk_off, gs%nlocal_blks, gs%nlocal, gs%local_facet_offset)
1105 allocate(gs%local_gs(gs%nlocal))
1107 gs%nshared = shared_dof%size() + shared_face_dof%size()
1108 gs%shared_facet_offset = shared_dof%size() + 1
1111 allocate(gs%shared_dof_gs(gs%nshared))
1118 select type (dof_array => shared_dof%data)
1120 j = shared_dof%size()
1122 gs%shared_dof_gs(i) = dof_array(i)
1125 call shared_dof%free()
1132 select type (dof_array => shared_face_dof%data)
1134 do i = 1, shared_face_dof%size()
1135 gs%shared_dof_gs(i + j) = dof_array(i)
1138 call shared_face_dof%free()
1141 allocate(gs%shared_gs_dof(gs%nshared))
1148 select type (dof_array => dof_shared%data)
1150 j = dof_shared%size()
1152 gs%shared_gs_dof(i) = dof_array(i)
1155 call dof_shared%free()
1160 select type (dof_array => face_dof_shared%data)
1162 do i = 1, face_dof_shared%size()
1163 gs%shared_gs_dof(i + j) = dof_array(i)
1166 call face_dof_shared%free()
1169 allocate(gs%shared_gs(gs%nshared))
1171 if (gs%nshared .gt. 0)
then
1173 gs%nshared, 1, gs%nshared)
1175 call gs_find_blks(gs%shared_dof_gs, gs%shared_blk_len, &
1176 gs%shared_blk_off, gs%nshared_blks, gs%nshared, &
1177 gs%shared_facet_offset)
1192 integer(kind=i8),
intent(inout) :: dof
1193 integer,
intent(inout) :: max_id
1196 if (map_%get(dof, id) .gt. 0)
then
1198 call map_%set(dof, max_id)
1206 integer,
intent(inout) :: n
1207 integer,
dimension(n),
intent(inout) :: dg
1208 integer,
dimension(n),
intent(inout) :: gd
1210 integer :: tmp, i, j, pivot
1214 pivot = dg((lo + hi) / 2)
1218 if (dg(i) .ge. pivot)
exit
1223 if (dg(j) .le. pivot)
exit
1234 else if (i .eq. j)
then
1248 integer,
intent(in) :: n
1249 integer,
intent(in) :: m
1250 integer,
dimension(n),
intent(inout) :: dg
1251 integer,
allocatable,
intent(inout) :: blk_len(:)
1252 integer,
allocatable,
intent(inout) :: blk_off(:)
1253 integer,
intent(inout) :: nblks
1255 integer :: id, count
1264 do while ( j+1 .le. n .and. dg(j+1) .eq. id)
1268 call blks%push(count)
1272 select type (blk_array => blks%data)
1275 allocate(blk_len(nblks))
1277 blk_len(i) = blk_array(i)
1279 allocate(blk_off(nblks))
1282 blk_off(i) = blk_off(i - 1) + blk_len(i - 1)