394 type(
gs_t),
target,
intent(inout) :: gs
395 type(
mesh_t),
pointer :: msh
397 type(
stack_i4_t),
target :: local_dof, dof_local, shared_dof, dof_shared
398 type(
stack_i4_t),
target :: local_face_dof, face_dof_local
399 type(
stack_i4_t),
target :: shared_face_dof, face_dof_shared
400 integer :: i, j, k, l, lx, ly, lz, max_id, max_sid, id, lid, dm_size
406 sdm => gs%shared_dofs
411 dm_size =
dofmap%size()/lx
413 call dm%init(dm_size, i)
417 call sdm%init(
dofmap%size(), i)
420 call local_dof%init()
421 call dof_local%init()
423 call local_face_dof%init()
424 call face_dof_local%init()
426 call shared_dof%init()
427 call dof_shared%init()
429 call shared_face_dof%init()
430 call face_dof_shared%init()
442 if (
dofmap%shared_dof(1, 1, 1, i))
then
445 call shared_dof%push(id)
447 call dof_shared%push(lid)
453 call local_dof%push(id)
454 call dof_local%push(lid)
461 if (
dofmap%shared_dof(lx, 1, 1, i))
then
463 call shared_dof%push(id)
464 call dof_shared%push(lid)
467 call local_dof%push(id)
468 call dof_local%push(lid)
472 if (
dofmap%shared_dof(1, ly, 1, i))
then
474 call shared_dof%push(id)
475 call dof_shared%push(lid)
478 call local_dof%push(id)
479 call dof_local%push(lid)
483 if (
dofmap%shared_dof(lx, ly, 1, i))
then
485 call shared_dof%push(id)
486 call dof_shared%push(lid)
489 call local_dof%push(id)
490 call dof_local%push(lid)
494 if (
dofmap%shared_dof(1, 1, lz, i))
then
496 call shared_dof%push(id)
497 call dof_shared%push(lid)
500 call local_dof%push(id)
501 call dof_local%push(lid)
505 if (
dofmap%shared_dof(lx, 1, lz, i))
then
507 call shared_dof%push(id)
508 call dof_shared%push(lid)
511 call local_dof%push(id)
512 call dof_local%push(lid)
516 if (
dofmap%shared_dof(1, ly, lz, i))
then
518 call shared_dof%push(id)
519 call dof_shared%push(lid)
522 call local_dof%push(id)
523 call dof_local%push(lid)
527 if (
dofmap%shared_dof(lx, ly, lz, i))
then
529 call shared_dof%push(id)
530 call dof_shared%push(lid)
533 call local_dof%push(id)
534 call dof_local%push(lid)
551 if (
dofmap%shared_dof(2, 1, 1, i))
then
554 call shared_dof%push(id)
556 call dof_shared%push(id)
561 call local_dof%push(id)
563 call dof_local%push(id)
566 if (
dofmap%shared_dof(2, 1, lz, i))
then
569 call shared_dof%push(id)
571 call dof_shared%push(id)
576 call local_dof%push(id)
578 call dof_local%push(id)
582 if (
dofmap%shared_dof(2, ly, 1, i))
then
585 call shared_dof%push(id)
587 call dof_shared%push(id)
593 call local_dof%push(id)
595 call dof_local%push(id)
598 if (
dofmap%shared_dof(2, ly, lz, i))
then
601 call shared_dof%push(id)
603 call dof_shared%push(id)
608 call local_dof%push(id)
610 call dof_local%push(id)
617 if (
dofmap%shared_dof(1, 2, 1, i))
then
620 call shared_dof%push(id)
622 call dof_shared%push(id)
627 call local_dof%push(id)
629 call dof_local%push(id)
632 if (
dofmap%shared_dof(1, 2, lz, i))
then
635 call shared_dof%push(id)
637 call dof_shared%push(id)
642 call local_dof%push(id)
644 call dof_local%push(id)
648 if (
dofmap%shared_dof(lx, 2, 1, i))
then
651 call shared_dof%push(id)
653 call dof_shared%push(id)
658 call local_dof%push(id)
660 call dof_local%push(id)
663 if (
dofmap%shared_dof(lx, 2, lz, i))
then
666 call shared_dof%push(id)
668 call dof_shared%push(id)
673 call local_dof%push(id)
675 call dof_local%push(id)
681 if (
dofmap%shared_dof(1, 1, 2, i))
then
684 call shared_dof%push(id)
686 call dof_shared%push(id)
691 call local_dof%push(id)
693 call dof_local%push(id)
697 if (
dofmap%shared_dof(lx, 1, 2, i))
then
700 call shared_dof%push(id)
702 call dof_shared%push(id)
707 call local_dof%push(id)
709 call dof_local%push(id)
713 if (
dofmap%shared_dof(1, ly, 2, i))
then
716 call shared_dof%push(id)
718 call dof_shared%push(id)
723 call local_dof%push(id)
725 call dof_local%push(id)
729 if (
dofmap%shared_dof(lx, ly, 2, i))
then
732 call shared_dof%push(id)
734 call dof_shared%push(id)
739 call local_dof%push(id)
741 call dof_local%push(id)
760 if (msh%facet_neigh(3, i) .ne. 0)
then
761 if (
dofmap%shared_dof(2, 1, 1, i))
then
764 call shared_face_dof%push(id)
766 call face_dof_shared%push(id)
771 call local_face_dof%push(id)
773 call face_dof_local%push(id)
778 if (msh%facet_neigh(4, i) .ne. 0)
then
779 if (
dofmap%shared_dof(2, ly, 1, i))
then
782 call shared_face_dof%push(id)
784 call face_dof_shared%push(id)
790 call local_face_dof%push(id)
792 call face_dof_local%push(id)
800 if (msh%facet_neigh(1, i) .ne. 0)
then
801 if (
dofmap%shared_dof(1, 2, 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(2, i) .ne. 0)
then
819 if (
dofmap%shared_dof(lx, 2, 1, i))
then
822 call shared_face_dof%push(id)
824 call face_dof_shared%push(id)
829 call local_face_dof%push(id)
831 call face_dof_local%push(id)
840 if (msh%facet_neigh(1, i) .ne. 0)
then
841 if (
dofmap%shared_dof(1, 2, 2, i))
then
845 call shared_face_dof%push(id)
847 call face_dof_shared%push(id)
854 call local_face_dof%push(id)
856 call face_dof_local%push(id)
862 if (msh%facet_neigh(2, i) .ne. 0)
then
863 if (
dofmap%shared_dof(lx, 2, 2, i))
then
867 call shared_face_dof%push(id)
869 call face_dof_shared%push(id)
876 call local_face_dof%push(id)
878 call face_dof_local%push(id)
885 if (msh%facet_neigh(3, i) .ne. 0)
then
886 if (
dofmap%shared_dof(2, 1, 2, i))
then
890 call shared_face_dof%push(id)
892 call face_dof_shared%push(id)
899 call local_face_dof%push(id)
901 call face_dof_local%push(id)
907 if (msh%facet_neigh(4, i) .ne. 0)
then
908 if (
dofmap%shared_dof(2, ly, 2, i))
then
912 call shared_face_dof%push(id)
914 call face_dof_shared%push(id)
921 call local_face_dof%push(id)
923 call face_dof_local%push(id)
930 if (msh%facet_neigh(5, i) .ne. 0)
then
931 if (
dofmap%shared_dof(2, 2, 1, i))
then
935 call shared_face_dof%push(id)
937 call face_dof_shared%push(id)
944 call local_face_dof%push(id)
946 call face_dof_local%push(id)
952 if (msh%facet_neigh(6, i) .ne. 0)
then
953 if (
dofmap%shared_dof(2, 2, lz, i))
then
957 call shared_face_dof%push(id)
959 call face_dof_shared%push(id)
966 call local_face_dof%push(id)
968 call face_dof_local%push(id)
979 gs%nlocal = local_dof%size() + local_face_dof%size()
980 gs%local_facet_offset = local_dof%size() + 1
983 allocate(gs%local_dof_gs(gs%nlocal))
990 select type(dof_array => local_dof%data)
994 gs%local_dof_gs(i) = dof_array(i)
997 call local_dof%free()
1004 select type(dof_array => local_face_dof%data)
1006 do i = 1, local_face_dof%size()
1007 gs%local_dof_gs(i + j) = dof_array(i)
1010 call local_face_dof%free()
1013 allocate(gs%local_gs_dof(gs%nlocal))
1020 select type(dof_array => dof_local%data)
1022 j = dof_local%size()
1024 gs%local_gs_dof(i) = dof_array(i)
1027 call dof_local%free()
1032 select type(dof_array => face_dof_local%data)
1034 do i = 1, face_dof_local%size()
1035 gs%local_gs_dof(i+j) = dof_array(i)
1038 call face_dof_local%free()
1041 gs%nlocal, 1, gs%nlocal)
1044 gs%nlocal_blks, gs%nlocal, gs%local_facet_offset)
1047 allocate(gs%local_gs(gs%nlocal))
1049 gs%nshared = shared_dof%size() + shared_face_dof%size()
1050 gs%shared_facet_offset = shared_dof%size() + 1
1053 allocate(gs%shared_dof_gs(gs%nshared))
1060 select type(dof_array => shared_dof%data)
1062 j = shared_dof%size()
1064 gs%shared_dof_gs(i) = dof_array(i)
1067 call shared_dof%free()
1074 select type(dof_array => shared_face_dof%data)
1076 do i = 1, shared_face_dof%size()
1077 gs%shared_dof_gs(i + j) = dof_array(i)
1080 call shared_face_dof%free()
1083 allocate(gs%shared_gs_dof(gs%nshared))
1090 select type(dof_array => dof_shared%data)
1092 j = dof_shared%size()
1094 gs%shared_gs_dof(i) = dof_array(i)
1097 call dof_shared%free()
1102 select type(dof_array => face_dof_shared%data)
1104 do i = 1, face_dof_shared%size()
1105 gs%shared_gs_dof(i + j) = dof_array(i)
1108 call face_dof_shared%free()
1111 allocate(gs%shared_gs(gs%nshared))
1113 if (gs%nshared .gt. 0)
then
1115 gs%nshared, 1, gs%nshared)
1117 call gs_find_blks(gs%shared_dof_gs, gs%shared_blk_len, &
1118 gs%nshared_blks, gs%nshared, gs%shared_facet_offset)
1133 integer(kind=i8),
intent(inout) :: dof
1134 integer,
intent(inout) :: max_id
1137 if (map_%get(dof, id) .gt. 0)
then
1139 call map_%set(dof, max_id)
1147 integer,
intent(inout) :: n
1148 integer,
dimension(n),
intent(inout) :: dg
1149 integer,
dimension(n),
intent(inout) :: gd
1151 integer :: tmp, i, j, pivot
1155 pivot = dg((lo + hi) / 2)
1159 if (dg(i) .ge. pivot)
exit
1164 if (dg(j) .le. pivot)
exit
1175 else if (i .eq. j)
then
1189 integer,
intent(in) :: n
1190 integer,
intent(in) :: m
1191 integer,
dimension(n),
intent(inout) :: dg
1192 integer,
allocatable,
intent(inout) :: blk_len(:)
1193 integer,
intent(inout) :: nblks
1195 integer :: id, count
1204 do while ( j+1 .le. n .and. dg(j+1) .eq. id)
1208 call blks%push(count)
1212 select type(blk_array => blks%data)
1215 allocate(blk_len(nblks))
1217 blk_len(i) = blk_array(i)