434 type(
gs_t),
target,
intent(inout) :: gs
435 type(
mesh_t),
pointer :: msh
437 type(
stack_i4_t),
target :: local_dof, dof_local, shared_dof, dof_shared
438 type(
stack_i4_t),
target :: local_face_dof, face_dof_local
439 type(
stack_i4_t),
target :: shared_face_dof, face_dof_shared
440 integer :: i, j, k, l, lx, ly, lz, max_id, max_sid, id, lid, dm_size
446 sdm => gs%shared_dofs
451 dm_size =
dofmap%size()/lx
453 call dm%init(dm_size, i)
457 call sdm%init(
dofmap%size(), i)
460 call local_dof%init()
461 call dof_local%init()
463 call local_face_dof%init()
464 call face_dof_local%init()
466 call shared_dof%init()
467 call dof_shared%init()
469 call shared_face_dof%init()
470 call face_dof_shared%init()
482 if (
dofmap%shared_dof(1, 1, 1, i))
then
485 call shared_dof%push(id)
487 call dof_shared%push(lid)
493 call local_dof%push(id)
494 call dof_local%push(lid)
501 if (
dofmap%shared_dof(lx, 1, 1, i))
then
503 call shared_dof%push(id)
504 call dof_shared%push(lid)
507 call local_dof%push(id)
508 call dof_local%push(lid)
512 if (
dofmap%shared_dof(1, ly, 1, i))
then
514 call shared_dof%push(id)
515 call dof_shared%push(lid)
518 call local_dof%push(id)
519 call dof_local%push(lid)
523 if (
dofmap%shared_dof(lx, ly, 1, i))
then
525 call shared_dof%push(id)
526 call dof_shared%push(lid)
529 call local_dof%push(id)
530 call dof_local%push(lid)
534 if (
dofmap%shared_dof(1, 1, lz, i))
then
536 call shared_dof%push(id)
537 call dof_shared%push(lid)
540 call local_dof%push(id)
541 call dof_local%push(lid)
545 if (
dofmap%shared_dof(lx, 1, lz, i))
then
547 call shared_dof%push(id)
548 call dof_shared%push(lid)
551 call local_dof%push(id)
552 call dof_local%push(lid)
556 if (
dofmap%shared_dof(1, ly, lz, i))
then
558 call shared_dof%push(id)
559 call dof_shared%push(lid)
562 call local_dof%push(id)
563 call dof_local%push(lid)
567 if (
dofmap%shared_dof(lx, ly, lz, i))
then
569 call shared_dof%push(id)
570 call dof_shared%push(lid)
573 call local_dof%push(id)
574 call dof_local%push(lid)
591 if (
dofmap%shared_dof(2, 1, 1, i))
then
594 call shared_dof%push(id)
596 call dof_shared%push(id)
601 call local_dof%push(id)
603 call dof_local%push(id)
606 if (
dofmap%shared_dof(2, 1, lz, i))
then
609 call shared_dof%push(id)
611 call dof_shared%push(id)
616 call local_dof%push(id)
618 call dof_local%push(id)
622 if (
dofmap%shared_dof(2, ly, 1, i))
then
625 call shared_dof%push(id)
627 call dof_shared%push(id)
633 call local_dof%push(id)
635 call dof_local%push(id)
638 if (
dofmap%shared_dof(2, ly, lz, i))
then
641 call shared_dof%push(id)
643 call dof_shared%push(id)
648 call local_dof%push(id)
650 call dof_local%push(id)
657 if (
dofmap%shared_dof(1, 2, 1, i))
then
660 call shared_dof%push(id)
662 call dof_shared%push(id)
667 call local_dof%push(id)
669 call dof_local%push(id)
672 if (
dofmap%shared_dof(1, 2, lz, i))
then
675 call shared_dof%push(id)
677 call dof_shared%push(id)
682 call local_dof%push(id)
684 call dof_local%push(id)
688 if (
dofmap%shared_dof(lx, 2, 1, i))
then
691 call shared_dof%push(id)
693 call dof_shared%push(id)
698 call local_dof%push(id)
700 call dof_local%push(id)
703 if (
dofmap%shared_dof(lx, 2, lz, i))
then
706 call shared_dof%push(id)
708 call dof_shared%push(id)
713 call local_dof%push(id)
715 call dof_local%push(id)
721 if (
dofmap%shared_dof(1, 1, 2, i))
then
724 call shared_dof%push(id)
726 call dof_shared%push(id)
731 call local_dof%push(id)
733 call dof_local%push(id)
737 if (
dofmap%shared_dof(lx, 1, 2, i))
then
740 call shared_dof%push(id)
742 call dof_shared%push(id)
747 call local_dof%push(id)
749 call dof_local%push(id)
753 if (
dofmap%shared_dof(1, ly, 2, i))
then
756 call shared_dof%push(id)
758 call dof_shared%push(id)
763 call local_dof%push(id)
765 call dof_local%push(id)
769 if (
dofmap%shared_dof(lx, ly, 2, i))
then
772 call shared_dof%push(id)
774 call dof_shared%push(id)
779 call local_dof%push(id)
781 call dof_local%push(id)
800 if (msh%facet_neigh(3, i) .ne. 0)
then
801 if (
dofmap%shared_dof(2, 1, 1, i))
then
804 call shared_face_dof%push(id)
806 call face_dof_shared%push(id)
811 call local_face_dof%push(id)
813 call face_dof_local%push(id)
818 if (msh%facet_neigh(4, i) .ne. 0)
then
819 if (
dofmap%shared_dof(2, ly, 1, i))
then
823 call shared_face_dof%push(id)
825 call face_dof_shared%push(id)
832 call local_face_dof%push(id)
834 call face_dof_local%push(id)
842 if (msh%facet_neigh(1, i) .ne. 0)
then
843 if (
dofmap%shared_dof(1, 2, 1, i))
then
846 call shared_face_dof%push(id)
848 call face_dof_shared%push(id)
853 call local_face_dof%push(id)
855 call face_dof_local%push(id)
860 if (msh%facet_neigh(2, i) .ne. 0)
then
861 if (
dofmap%shared_dof(lx, 2, 1, i))
then
865 call shared_face_dof%push(id)
867 call face_dof_shared%push(id)
873 call local_face_dof%push(id)
875 call face_dof_local%push(id)
884 if (msh%facet_neigh(1, i) .ne. 0)
then
885 if (
dofmap%shared_dof(1, 2, 2, i))
then
890 call shared_face_dof%push(id)
892 call face_dof_shared%push(id)
900 call local_face_dof%push(id)
902 call face_dof_local%push(id)
908 if (msh%facet_neigh(2, i) .ne. 0)
then
909 if (
dofmap%shared_dof(lx, 2, 2, i))
then
914 call shared_face_dof%push(id)
916 call face_dof_shared%push(id)
924 call local_face_dof%push(id)
926 call face_dof_local%push(id)
933 if (msh%facet_neigh(3, i) .ne. 0)
then
934 if (
dofmap%shared_dof(2, 1, 2, i))
then
939 call shared_face_dof%push(id)
941 call face_dof_shared%push(id)
949 call local_face_dof%push(id)
951 call face_dof_local%push(id)
957 if (msh%facet_neigh(4, i) .ne. 0)
then
958 if (
dofmap%shared_dof(2, ly, 2, i))
then
963 call shared_face_dof%push(id)
965 call face_dof_shared%push(id)
973 call local_face_dof%push(id)
975 call face_dof_local%push(id)
982 if (msh%facet_neigh(5, i) .ne. 0)
then
983 if (
dofmap%shared_dof(2, 2, 1, i))
then
988 call shared_face_dof%push(id)
990 call face_dof_shared%push(id)
998 call local_face_dof%push(id)
1000 call face_dof_local%push(id)
1006 if (msh%facet_neigh(6, i) .ne. 0)
then
1007 if (
dofmap%shared_dof(2, 2, lz, i))
then
1012 call shared_face_dof%push(id)
1014 call face_dof_shared%push(id)
1022 call local_face_dof%push(id)
1024 call face_dof_local%push(id)
1035 gs%nlocal = local_dof%size() + local_face_dof%size()
1036 gs%local_facet_offset = local_dof%size() + 1
1039 allocate(gs%local_dof_gs(gs%nlocal))
1046 select type (dof_array => local_dof%data)
1048 j = local_dof%size()
1050 gs%local_dof_gs(i) = dof_array(i)
1053 call local_dof%free()
1060 select type (dof_array => local_face_dof%data)
1062 do i = 1, local_face_dof%size()
1063 gs%local_dof_gs(i + j) = dof_array(i)
1066 call local_face_dof%free()
1069 allocate(gs%local_gs_dof(gs%nlocal))
1076 select type (dof_array => dof_local%data)
1078 j = dof_local%size()
1080 gs%local_gs_dof(i) = dof_array(i)
1083 call dof_local%free()
1088 select type (dof_array => face_dof_local%data)
1090 do i = 1, face_dof_local%size()
1091 gs%local_gs_dof(i+j) = dof_array(i)
1094 call face_dof_local%free()
1097 gs%nlocal, 1, gs%nlocal)
1100 gs%local_blk_off, gs%nlocal_blks, gs%nlocal, gs%local_facet_offset)
1103 allocate(gs%local_gs(gs%nlocal))
1105 gs%nshared = shared_dof%size() + shared_face_dof%size()
1106 gs%shared_facet_offset = shared_dof%size() + 1
1109 allocate(gs%shared_dof_gs(gs%nshared))
1116 select type (dof_array => shared_dof%data)
1118 j = shared_dof%size()
1120 gs%shared_dof_gs(i) = dof_array(i)
1123 call shared_dof%free()
1130 select type (dof_array => shared_face_dof%data)
1132 do i = 1, shared_face_dof%size()
1133 gs%shared_dof_gs(i + j) = dof_array(i)
1136 call shared_face_dof%free()
1139 allocate(gs%shared_gs_dof(gs%nshared))
1146 select type (dof_array => dof_shared%data)
1148 j = dof_shared%size()
1150 gs%shared_gs_dof(i) = dof_array(i)
1153 call dof_shared%free()
1158 select type (dof_array => face_dof_shared%data)
1160 do i = 1, face_dof_shared%size()
1161 gs%shared_gs_dof(i + j) = dof_array(i)
1164 call face_dof_shared%free()
1167 allocate(gs%shared_gs(gs%nshared))
1169 if (gs%nshared .gt. 0)
then
1171 gs%nshared, 1, gs%nshared)
1173 call gs_find_blks(gs%shared_dof_gs, gs%shared_blk_len, &
1174 gs%shared_blk_off, gs%nshared_blks, gs%nshared, &
1175 gs%shared_facet_offset)
1190 integer(kind=i8),
intent(inout) :: dof
1191 integer,
intent(inout) :: max_id
1194 if (map_%get(dof, id) .gt. 0)
then
1196 call map_%set(dof, max_id)
1204 integer,
intent(inout) :: n
1205 integer,
dimension(n),
intent(inout) :: dg
1206 integer,
dimension(n),
intent(inout) :: gd
1208 integer :: tmp, i, j, pivot
1212 pivot = dg((lo + hi) / 2)
1216 if (dg(i) .ge. pivot)
exit
1221 if (dg(j) .le. pivot)
exit
1232 else if (i .eq. j)
then
1246 integer,
intent(in) :: n
1247 integer,
intent(in) :: m
1248 integer,
dimension(n),
intent(inout) :: dg
1249 integer,
allocatable,
intent(inout) :: blk_len(:)
1250 integer,
allocatable,
intent(inout) :: blk_off(:)
1251 integer,
intent(inout) :: nblks
1253 integer :: id, count
1262 do while ( j+1 .le. n .and. dg(j+1) .eq. id)
1266 call blks%push(count)
1270 select type (blk_array => blks%data)
1273 allocate(blk_len(nblks))
1275 blk_len(i) = blk_array(i)
1277 allocate(blk_off(nblks))
1280 blk_off(i) = blk_off(i - 1) + blk_len(i - 1)