411 type(
gs_t),
target,
intent(inout) :: gs
412 type(
mesh_t),
pointer :: msh
414 type(
stack_i4_t),
target :: local_dof, dof_local, shared_dof, dof_shared
415 type(
stack_i4_t),
target :: local_face_dof, face_dof_local
416 type(
stack_i4_t),
target :: shared_face_dof, face_dof_shared
417 integer :: i, j, k, l, lx, ly, lz, max_id, max_sid, id, lid, dm_size
423 sdm => gs%shared_dofs
428 dm_size =
dofmap%size()/lx
430 call dm%init(dm_size, i)
434 call sdm%init(
dofmap%size(), i)
437 call local_dof%init()
438 call dof_local%init()
440 call local_face_dof%init()
441 call face_dof_local%init()
443 call shared_dof%init()
444 call dof_shared%init()
446 call shared_face_dof%init()
447 call face_dof_shared%init()
459 if (
dofmap%shared_dof(1, 1, 1, i))
then
462 call shared_dof%push(id)
464 call dof_shared%push(lid)
470 call local_dof%push(id)
471 call dof_local%push(lid)
478 if (
dofmap%shared_dof(lx, 1, 1, i))
then
480 call shared_dof%push(id)
481 call dof_shared%push(lid)
484 call local_dof%push(id)
485 call dof_local%push(lid)
489 if (
dofmap%shared_dof(1, ly, 1, i))
then
491 call shared_dof%push(id)
492 call dof_shared%push(lid)
495 call local_dof%push(id)
496 call dof_local%push(lid)
500 if (
dofmap%shared_dof(lx, ly, 1, i))
then
502 call shared_dof%push(id)
503 call dof_shared%push(lid)
506 call local_dof%push(id)
507 call dof_local%push(lid)
511 if (
dofmap%shared_dof(1, 1, lz, i))
then
513 call shared_dof%push(id)
514 call dof_shared%push(lid)
517 call local_dof%push(id)
518 call dof_local%push(lid)
522 if (
dofmap%shared_dof(lx, 1, lz, i))
then
524 call shared_dof%push(id)
525 call dof_shared%push(lid)
528 call local_dof%push(id)
529 call dof_local%push(lid)
533 if (
dofmap%shared_dof(1, ly, lz, i))
then
535 call shared_dof%push(id)
536 call dof_shared%push(lid)
539 call local_dof%push(id)
540 call dof_local%push(lid)
544 if (
dofmap%shared_dof(lx, ly, lz, i))
then
546 call shared_dof%push(id)
547 call dof_shared%push(lid)
550 call local_dof%push(id)
551 call dof_local%push(lid)
568 if (
dofmap%shared_dof(2, 1, 1, i))
then
571 call shared_dof%push(id)
573 call dof_shared%push(id)
578 call local_dof%push(id)
580 call dof_local%push(id)
583 if (
dofmap%shared_dof(2, 1, lz, i))
then
586 call shared_dof%push(id)
588 call dof_shared%push(id)
593 call local_dof%push(id)
595 call dof_local%push(id)
599 if (
dofmap%shared_dof(2, ly, 1, i))
then
602 call shared_dof%push(id)
604 call dof_shared%push(id)
610 call local_dof%push(id)
612 call dof_local%push(id)
615 if (
dofmap%shared_dof(2, ly, lz, i))
then
618 call shared_dof%push(id)
620 call dof_shared%push(id)
625 call local_dof%push(id)
627 call dof_local%push(id)
634 if (
dofmap%shared_dof(1, 2, 1, i))
then
637 call shared_dof%push(id)
639 call dof_shared%push(id)
644 call local_dof%push(id)
646 call dof_local%push(id)
649 if (
dofmap%shared_dof(1, 2, lz, i))
then
652 call shared_dof%push(id)
654 call dof_shared%push(id)
659 call local_dof%push(id)
661 call dof_local%push(id)
665 if (
dofmap%shared_dof(lx, 2, 1, i))
then
668 call shared_dof%push(id)
670 call dof_shared%push(id)
675 call local_dof%push(id)
677 call dof_local%push(id)
680 if (
dofmap%shared_dof(lx, 2, lz, i))
then
683 call shared_dof%push(id)
685 call dof_shared%push(id)
690 call local_dof%push(id)
692 call dof_local%push(id)
698 if (
dofmap%shared_dof(1, 1, 2, i))
then
701 call shared_dof%push(id)
703 call dof_shared%push(id)
708 call local_dof%push(id)
710 call dof_local%push(id)
714 if (
dofmap%shared_dof(lx, 1, 2, i))
then
717 call shared_dof%push(id)
719 call dof_shared%push(id)
724 call local_dof%push(id)
726 call dof_local%push(id)
730 if (
dofmap%shared_dof(1, ly, 2, i))
then
733 call shared_dof%push(id)
735 call dof_shared%push(id)
740 call local_dof%push(id)
742 call dof_local%push(id)
746 if (
dofmap%shared_dof(lx, ly, 2, i))
then
749 call shared_dof%push(id)
751 call dof_shared%push(id)
756 call local_dof%push(id)
758 call dof_local%push(id)
777 if (msh%facet_neigh(3, i) .ne. 0)
then
778 if (
dofmap%shared_dof(2, 1, 1, i))
then
781 call shared_face_dof%push(id)
783 call face_dof_shared%push(id)
788 call local_face_dof%push(id)
790 call face_dof_local%push(id)
795 if (msh%facet_neigh(4, i) .ne. 0)
then
796 if (
dofmap%shared_dof(2, ly, 1, i))
then
800 call shared_face_dof%push(id)
802 call face_dof_shared%push(id)
809 call local_face_dof%push(id)
811 call face_dof_local%push(id)
819 if (msh%facet_neigh(1, i) .ne. 0)
then
820 if (
dofmap%shared_dof(1, 2, 1, i))
then
823 call shared_face_dof%push(id)
825 call face_dof_shared%push(id)
830 call local_face_dof%push(id)
832 call face_dof_local%push(id)
837 if (msh%facet_neigh(2, i) .ne. 0)
then
838 if (
dofmap%shared_dof(lx, 2, 1, i))
then
842 call shared_face_dof%push(id)
844 call face_dof_shared%push(id)
850 call local_face_dof%push(id)
852 call face_dof_local%push(id)
861 if (msh%facet_neigh(1, i) .ne. 0)
then
862 if (
dofmap%shared_dof(1, 2, 2, i))
then
867 call shared_face_dof%push(id)
869 call face_dof_shared%push(id)
877 call local_face_dof%push(id)
879 call face_dof_local%push(id)
885 if (msh%facet_neigh(2, i) .ne. 0)
then
886 if (
dofmap%shared_dof(lx, 2, 2, i))
then
891 call shared_face_dof%push(id)
893 call face_dof_shared%push(id)
901 call local_face_dof%push(id)
903 call face_dof_local%push(id)
910 if (msh%facet_neigh(3, i) .ne. 0)
then
911 if (
dofmap%shared_dof(2, 1, 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)
934 if (msh%facet_neigh(4, i) .ne. 0)
then
935 if (
dofmap%shared_dof(2, ly, 2, i))
then
940 call shared_face_dof%push(id)
942 call face_dof_shared%push(id)
950 call local_face_dof%push(id)
952 call face_dof_local%push(id)
959 if (msh%facet_neigh(5, i) .ne. 0)
then
960 if (
dofmap%shared_dof(2, 2, 1, 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)
983 if (msh%facet_neigh(6, i) .ne. 0)
then
984 if (
dofmap%shared_dof(2, 2, lz, i))
then
989 call shared_face_dof%push(id)
991 call face_dof_shared%push(id)
999 call local_face_dof%push(id)
1001 call face_dof_local%push(id)
1012 gs%nlocal = local_dof%size() + local_face_dof%size()
1013 gs%local_facet_offset = local_dof%size() + 1
1016 allocate(gs%local_dof_gs(gs%nlocal))
1023 select type (dof_array => local_dof%data)
1025 j = local_dof%size()
1027 gs%local_dof_gs(i) = dof_array(i)
1030 call local_dof%free()
1037 select type (dof_array => local_face_dof%data)
1039 do i = 1, local_face_dof%size()
1040 gs%local_dof_gs(i + j) = dof_array(i)
1043 call local_face_dof%free()
1046 allocate(gs%local_gs_dof(gs%nlocal))
1053 select type (dof_array => dof_local%data)
1055 j = dof_local%size()
1057 gs%local_gs_dof(i) = dof_array(i)
1060 call dof_local%free()
1065 select type (dof_array => face_dof_local%data)
1067 do i = 1, face_dof_local%size()
1068 gs%local_gs_dof(i+j) = dof_array(i)
1071 call face_dof_local%free()
1074 gs%nlocal, 1, gs%nlocal)
1077 gs%local_blk_off, gs%nlocal_blks, gs%nlocal, gs%local_facet_offset)
1080 allocate(gs%local_gs(gs%nlocal))
1082 gs%nshared = shared_dof%size() + shared_face_dof%size()
1083 gs%shared_facet_offset = shared_dof%size() + 1
1086 allocate(gs%shared_dof_gs(gs%nshared))
1093 select type (dof_array => shared_dof%data)
1095 j = shared_dof%size()
1097 gs%shared_dof_gs(i) = dof_array(i)
1100 call shared_dof%free()
1107 select type (dof_array => shared_face_dof%data)
1109 do i = 1, shared_face_dof%size()
1110 gs%shared_dof_gs(i + j) = dof_array(i)
1113 call shared_face_dof%free()
1116 allocate(gs%shared_gs_dof(gs%nshared))
1123 select type (dof_array => dof_shared%data)
1125 j = dof_shared%size()
1127 gs%shared_gs_dof(i) = dof_array(i)
1130 call dof_shared%free()
1135 select type (dof_array => face_dof_shared%data)
1137 do i = 1, face_dof_shared%size()
1138 gs%shared_gs_dof(i + j) = dof_array(i)
1141 call face_dof_shared%free()
1144 allocate(gs%shared_gs(gs%nshared))
1146 if (gs%nshared .gt. 0)
then
1148 gs%nshared, 1, gs%nshared)
1150 call gs_find_blks(gs%shared_dof_gs, gs%shared_blk_len, &
1151 gs%shared_blk_off, gs%nshared_blks, gs%nshared, &
1152 gs%shared_facet_offset)
1167 integer(kind=i8),
intent(inout) :: dof
1168 integer,
intent(inout) :: max_id
1171 if (map_%get(dof, id) .gt. 0)
then
1173 call map_%set(dof, max_id)
1181 integer,
intent(inout) :: n
1182 integer,
dimension(n),
intent(inout) :: dg
1183 integer,
dimension(n),
intent(inout) :: gd
1185 integer :: tmp, i, j, pivot
1189 pivot = dg((lo + hi) / 2)
1193 if (dg(i) .ge. pivot)
exit
1198 if (dg(j) .le. pivot)
exit
1209 else if (i .eq. j)
then
1223 integer,
intent(in) :: n
1224 integer,
intent(in) :: m
1225 integer,
dimension(n),
intent(inout) :: dg
1226 integer,
allocatable,
intent(inout) :: blk_len(:)
1227 integer,
allocatable,
intent(inout) :: blk_off(:)
1228 integer,
intent(inout) :: nblks
1230 integer :: id, count
1239 do while ( j+1 .le. n .and. dg(j+1) .eq. id)
1243 call blks%push(count)
1247 select type (blk_array => blks%data)
1250 allocate(blk_len(nblks))
1252 blk_len(i) = blk_array(i)
1254 allocate(blk_off(nblks))
1257 blk_off(i) = blk_off(i - 1) + blk_len(i - 1)