2 #include "petsc/finclude/petsc.h" 13 SUBROUTINE part_mesh_m_t_h_phi(nb_proc,list_u, list_T_in, list_h_in, list_phi ,mesh,list_of_interfaces,part,my_periodic)
20 INTEGER,
DIMENSION(mesh%me) :: part
21 INTEGER,
DIMENSION(:) :: list_of_interfaces
22 INTEGER,
DIMENSION(:) :: list_u, list_T_in, list_h_in, list_phi
25 LOGICAL,
DIMENSION(mesh%mes) :: virgins
26 INTEGER,
DIMENSION(3,mesh%me) :: neigh_new
27 INTEGER,
DIMENSION(5) :: opts
28 INTEGER,
DIMENSION(SIZE(mesh%jjs,1)) :: i_loc
29 INTEGER,
DIMENSION(:),
ALLOCATABLE :: xadj_u, xadj_T, xadj_h, xadj_phi, list_h, list_T
30 INTEGER,
DIMENSION(:),
ALLOCATABLE :: xind_u, xind_T, xind_h, xind_phi
31 INTEGER,
DIMENSION(:),
ALLOCATABLE :: vwgt, adjwgt
32 INTEGER,
DIMENSION(:),
ALLOCATABLE :: u2glob, T2glob, h2glob, phi2glob
33 INTEGER,
DIMENSION(:),
ALLOCATABLE :: part_u, part_T, part_h, part_phi
34 INTEGER,
DIMENSION(1) :: jm_loc
35 INTEGER,
DIMENSION(mesh%np,3) :: per_pts
36 INTEGER,
DIMENSION(mesh%me) :: glob2loc
37 INTEGER,
DIMENSION(mesh%np) :: indicator
38 INTEGER,
DIMENSION(3) :: j_loc
39 INTEGER :: nb_neigh, edge, m, ms, n, nb, numflag, p, wgtflag, j, &
40 ns, nws, msop, nsop, proc, iop, mop, s2, k, me_u, me_T, me_h, me_phi, idm
46 REAL(KIND=4),
DIMENSION(:),
ALLOCATABLE :: tpwgts
47 REAL(KIND=4),
DIMENSION(1) :: ubvec
48 REAL(KIND=4) :: one_K4=1.0
50 INTEGER,
DIMENSION(METIS_NOPTIONS) :: metis_opt
51 petscmpiint :: nb_proc
53 petscerrorcode :: ierr
55 CALL mpi_comm_rank(mpi_comm_world,rank,ierr)
66 DO j = 1,
SIZE(list_t_in)
67 IF (minval(abs(list_t_in(j)-list_u))==0) cycle
72 DO j = 1,
SIZE(list_t_in)
73 IF (minval(abs(list_t_in(j)-list_u))==0) cycle
75 list_t(nb) = list_t_in(j)
81 DO j = 1,
SIZE(list_h_in)
82 IF (minval(abs(list_h_in(j)-list_t_in))==0) cycle
83 IF (minval(abs(list_h_in(j)-list_u))==0) cycle
88 DO j = 1,
SIZE(list_h_in)
89 IF (minval(abs(list_h_in(j)-list_t_in))==0) cycle
90 IF (minval(abs(list_h_in(j)-list_u))==0) cycle
92 list_h(nb) = list_h_in(j)
97 nws =
SIZE( mesh%jjs,1)
98 neigh_new = mesh%neigh
99 IF (
SIZE(list_of_interfaces)/=0)
THEN 102 IF (.NOT.virgins(ms)) cycle
103 IF (minval(abs(mesh%sides(ms)-list_of_interfaces))/=0) cycle
104 i_loc = mesh%jjs(:,ms)
105 DO msop = 1, mesh%mes
106 IF (msop==ms .OR. .NOT.virgins(msop)) cycle
107 IF (minval(abs(mesh%sides(msop)-list_of_interfaces))/=0) cycle
111 iop = mesh%jjs(nsop,msop)
112 IF (maxval(abs(mesh%rr(:,i_loc(ns))-mesh%rr(:,iop))).LT.
epsilon)
THEN 124 CALL error_petsc(.NOT.
'BUG in part_mesh_M_T_H_phi, test ')
127 IF (neigh_new(n,mesh%neighs(msop))==0)
THEN 128 neigh_new(n,mesh%neighs(msop)) = mesh%neighs(ms)
130 IF (neigh_new(n,mesh%neighs(ms))==0)
THEN 131 neigh_new(n,mesh%neighs(ms)) = mesh%neighs(msop)
134 virgins(ms) = .false.
135 virgins(msop) = .false.
141 IF (
PRESENT(my_periodic))
THEN 142 IF (my_periodic%nb_periodic_pairs/=0)
THEN 145 IF (minval(abs(mesh%sides(ms)-my_periodic%list_periodic(1,:))) == 0)
THEN 146 jm_loc = minloc(abs(mesh%sides(ms)-my_periodic%list_periodic(1,:)))
147 s2 = my_periodic%list_periodic(2,jm_loc(1))
149 DO msop = 1, mesh%mes
150 IF (mesh%sides(msop) /= s2) cycle
153 DO ns = 1,
SIZE(my_periodic%vect_e,1)
154 err = err + abs(sum(mesh%rr(ns,mesh%jjs(:,ms))-mesh%rr(ns,mesh%jjs(:,msop)) &
155 +my_periodic%vect_e(ns,jm_loc(1))))
164 CALL error_petsc(
'BUG in part_mesh_M_T_H_phi, mop not found')
166 mop = mesh%neighs(msop)
168 IF (neigh_new(n,m) == 0)
THEN 171 IF (neigh_new(n,mop) == 0)
THEN 188 IF (minval(abs(idm-list_u))==0)
THEN 190 ELSE IF (minval(abs(idm-list_t))==0)
THEN 192 ELSE IF (minval(abs(idm-list_h))==0)
THEN 194 ELSE IF (minval(abs(idm-list_phi))==0)
THEN 197 CALL error_petsc(
'BUG in part_mesh_M_T_H_phi : element not in the mesh')
200 ALLOCATE(u2glob(me_u), t2glob(me_t), h2glob(me_h), phi2glob(me_phi))
207 IF (minval(abs(idm-list_u))==0)
THEN 211 ELSE IF (minval(abs(idm-list_t))==0)
THEN 215 ELSE IF (minval(abs(idm-list_h))==0)
THEN 219 ELSE IF (minval(abs(idm-list_phi))==0)
THEN 224 CALL error_petsc(
'BUG in part_mesh_M_T_H_phi: element not in the mesh')
230 nb_neigh =
SIZE(mesh%neigh,1)
231 ALLOCATE(xind_u(me_u+1), xind_t(me_t+1), xind_h(me_h+1), xind_phi(me_phi+1))
239 IF (minval(abs(mesh%i_d(mop)-list_u))/=0) cycle
242 xind_u(k+1) = xind_u(k) + nb
251 IF (minval(abs(mesh%i_d(mop)-list_t))/=0) cycle
254 xind_t(k+1) = xind_t(k) + nb
263 IF (minval(abs(mesh%i_d(mop)-list_h))/=0) cycle
266 xind_h(k+1) = xind_h(k) + nb
275 IF (minval(abs(mesh%i_d(mop)-list_phi))/=0) cycle
278 xind_phi(k+1) = xind_phi(k) + nb
281 ALLOCATE(xadj_u(xind_u(me_u+1)-1))
282 ALLOCATE(xadj_t(xind_t(me_t+1)-1))
283 ALLOCATE(xadj_h(xind_h(me_h+1)-1))
284 ALLOCATE(xadj_phi(xind_phi(me_phi+1)-1))
291 IF (minval(abs(mesh%i_d(mop)-list_u))/=0) cycle
293 xadj_u(p) = glob2loc(mop)
296 IF (p/=xind_u(me_u+1)-1)
THEN 297 CALL error_petsc(
'BUG in part_mesh_M_T_H_phi, p/=xind_u(me_u+1)-1')
305 IF (minval(abs(mesh%i_d(mop)-list_t))/=0) cycle
307 xadj_t(p) = glob2loc(mop)
310 IF (p/=xind_t(me_t+1)-1)
THEN 311 CALL error_petsc(
'BUG in part_mesh_M_T_H_phi, p/=xind_T(me_T+1)-1')
319 IF (minval(abs(mesh%i_d(mop)-list_h))/=0) cycle
321 xadj_h(p) = glob2loc(mop)
324 IF (p/=xind_h(me_h+1)-1)
THEN 325 CALL error_petsc(
'BUG in part_mesh_M_T_H_phi, p/=xind_h(me_h+1)-1')
333 IF (minval(abs(mesh%i_d(mop)-list_phi))/=0) cycle
335 xadj_phi(p) = glob2loc(mop)
338 IF (p/=xind_phi(me_phi+1)-1)
THEN 339 CALL error_petsc(
'BUG in part_mesh_M_T_H_phi, p/=xind_phi(me_phi+1)-1')
347 ALLOCATE(tpwgts(nb_proc))
348 tpwgts=one_k4/nb_proc
349 CALL metis_setdefaultoptions(metis_opt)
353 ALLOCATE(vwgt(me_u), adjwgt(
SIZE(xadj_u)), part_u(me_u))
356 CALL metis_partgraphrecursive(me_u, 1, xind_u, xadj_u, vwgt, vwgt, adjwgt, nb_proc, tpwgts, ubvec, metis_opt, edge, part_u)
359 IF (
ALLOCATED(vwgt))
THEN 360 DEALLOCATE(vwgt, adjwgt)
362 ALLOCATE(vwgt(me_t), adjwgt(
SIZE(xadj_t)), part_t(me_t))
365 CALL metis_partgraphrecursive(me_t, 1, xind_t, xadj_t, vwgt, vwgt, adjwgt, nb_proc, tpwgts, ubvec, metis_opt, edge, part_t)
368 IF (
ALLOCATED(vwgt))
THEN 369 DEALLOCATE(vwgt, adjwgt)
371 ALLOCATE(vwgt(me_h), adjwgt(
SIZE(xadj_h)), part_h(me_h))
374 CALL metis_partgraphrecursive(me_h, 1, xind_h, xadj_h, vwgt, vwgt, adjwgt, nb_proc,tpwgts, ubvec, metis_opt, edge, part_h)
376 IF (me_phi /= 0)
THEN 377 IF (
ALLOCATED(vwgt))
THEN 378 DEALLOCATE(vwgt, adjwgt)
380 ALLOCATE(vwgt(me_phi), adjwgt(
SIZE(xadj_phi)), part_phi(me_phi))
383 CALL metis_partgraphrecursive(me_phi, 1, xind_phi,xadj_phi,vwgt, vwgt, adjwgt, nb_proc,tpwgts, &
384 ubvec, metis_opt, edge, part_phi)
389 part(u2glob(:)) = part_u
392 part(t2glob(:)) = part_t
395 part(h2glob(:)) = part_h
398 part(phi2glob(:)) = part_phi
400 IF (minval(part)==-1)
THEN 401 CALL error_petsc(
'BUG in part_mesh_mhd_bis, MINVAL(part) == -1')
407 IF (
SIZE(mesh%jj,1)/=3)
THEN 408 write(*,*)
'SIZE(mesh%jj,1)',
SIZE(mesh%jj,1)
409 CALL error_petsc(
'BUG in part_mesh_M_T_H_phi, SIZE(mesh%jj,1)/=3')
412 nws =
SIZE( mesh%jjs,1)
413 IF (
SIZE(list_of_interfaces)/=0)
THEN 416 IF (.NOT.virgins(ms)) cycle
417 IF (minval(abs(mesh%sides(ms)-list_of_interfaces))/=0) cycle
418 i_loc = mesh%jjs(:,ms)
419 DO msop = 1, mesh%mes
420 IF (msop==ms .OR. .NOT.virgins(msop)) cycle
421 IF (minval(abs(mesh%sides(msop)-list_of_interfaces))/=0) cycle
425 iop = mesh%jjs(nsop,msop)
426 IF (maxval(abs(mesh%rr(:,i_loc(ns))-mesh%rr(:,iop))).LT.
epsilon)
THEN 438 CALL error_petsc(.NOT.
'BUG in part_mesh_M_T_H_phi, test ')
440 IF (part(mesh%neighs(ms)) == part(mesh%neighs(msop))) cycle
441 proc = min(part(mesh%neighs(ms)),part(mesh%neighs(msop)))
442 part(mesh%neighs(ms)) = proc
443 part(mesh%neighs(msop)) = proc
444 virgins(ms) = .false.
445 virgins(msop) = .false.
446 indicator(mesh%jjs(:,ms)) = proc
447 indicator(mesh%jjs(:,msop)) = proc
455 n = maxval(indicator(j_loc))
457 IF (indicator(j_loc(1))*indicator(j_loc(2))*indicator(j_loc(3))<0) cycle
463 IF (
PRESENT(my_periodic))
THEN 464 IF (my_periodic%nb_periodic_pairs/=0)
THEN 471 IF ((minval(abs(mesh%sides(ms)-my_periodic%list_periodic(1,:))) /=0) .AND. &
472 (minval(abs(mesh%sides(ms)-my_periodic%list_periodic(2,:))) /=0) ) cycle
473 DO ns = 1,
SIZE(mesh%jjs,1)
476 DO msop = 1, mesh%mes
477 IF (minval(abs(mesh%sides(msop)-my_periodic%list_periodic(:,:))) /=0 ) cycle
478 IF (msop == ms) cycle
479 DO nsop = 1,
SIZE(mesh%jjs,1)
480 IF (mesh%jjs(nsop,msop)==j)
THEN 481 per_pts(j,3) = mesh%neighs(msop)
490 IF (minval(abs(mesh%sides(ms)-my_periodic%list_periodic(1,:))) /= 0) cycle
491 jm_loc = minloc(abs(mesh%sides(ms)-my_periodic%list_periodic(1,:)))
492 s2 = my_periodic%list_periodic(2,jm_loc(1))
494 DO msop = 1, mesh%mes
495 IF (mesh%sides(msop) /= s2) cycle
497 DO ns = 1,
SIZE(my_periodic%vect_e,1)
498 err = err + abs(sum(mesh%rr(ns,mesh%jjs(:,ms))-mesh%rr(ns,mesh%jjs(:,msop)) &
499 +my_periodic%vect_e(ns,jm_loc(1))))
507 CALL error_petsc(
'BUG in part_mesh_M_T_H_phi, mop not found')
509 IF (part(mesh%neighs(ms)) /= part(mesh%neighs(msop)))
THEN 510 proc = min(part(mesh%neighs(ms)),part(mesh%neighs(msop)))
511 part(mesh%neighs(ms)) = proc
512 part(mesh%neighs(msop)) = proc
527 DEALLOCATE(vwgt,adjwgt)
528 IF (
ALLOCATED(xadj_u))
DEALLOCATE(xadj_u)
529 IF (
ALLOCATED(xadj_t))
DEALLOCATE(xadj_t)
530 IF (
ALLOCATED(xadj_h))
DEALLOCATE(xadj_h)
531 IF (
ALLOCATED(xadj_phi))
DEALLOCATE(xadj_phi)
532 IF (
ALLOCATED(list_t))
DEALLOCATE(list_t)
533 IF (
ALLOCATED(list_h))
DEALLOCATE(list_h)
534 IF (
ALLOCATED(xind_u))
DEALLOCATE(xind_u)
535 IF (
ALLOCATED(xind_t))
DEALLOCATE(xind_t)
536 IF (
ALLOCATED(xind_h))
DEALLOCATE(xind_h)
537 IF (
ALLOCATED(xind_phi))
DEALLOCATE(xind_phi)
538 IF (
ALLOCATED(u2glob))
DEALLOCATE(u2glob)
539 IF (
ALLOCATED(t2glob))
DEALLOCATE(t2glob)
540 IF (
ALLOCATED(h2glob))
DEALLOCATE(h2glob)
541 IF (
ALLOCATED(phi2glob))
DEALLOCATE(phi2glob)
542 IF (
ALLOCATED(part_u))
DEALLOCATE(part_u)
543 IF (
ALLOCATED(part_t))
DEALLOCATE(part_t)
544 IF (
ALLOCATED(part_h))
DEALLOCATE(part_h)
545 IF (
ALLOCATED(part_phi))
DEALLOCATE(part_phi)
551 SUBROUTINE part_mesh_mhd(nb_proc,vwgt,mesh,list_of_interfaces,part,my_periodic)
558 INTEGER,
DIMENSION(mesh%me+1) :: xind
559 INTEGER,
DIMENSION(mesh%me) :: vwgt, part
560 INTEGER,
DIMENSION(:) :: list_of_interfaces
563 LOGICAL,
DIMENSION(mesh%mes) :: virgins
564 INTEGER,
DIMENSION(3,mesh%me) :: neigh_new
565 INTEGER,
DIMENSION(5) :: opts
566 INTEGER,
DIMENSION(SIZE(mesh%jjs,1)) :: i_loc
567 INTEGER,
DIMENSION(:),
ALLOCATABLE :: xadj, adjwgt
568 INTEGER,
DIMENSION(1) :: jm_loc
569 INTEGER,
DIMENSION(mesh%np,3) :: per_pts
570 INTEGER :: nb_neigh, edge, m, ms, n, nb, numflag, p, wgtflag, j, &
571 ns, nws, msop, nsop, proc, iop, mop, s2
576 REAL(KIND=4),
DIMENSION(:),
ALLOCATABLE :: tpwgts
577 REAL(KIND=4),
DIMENSION(1) :: ubvec
578 REAL(KIND=4) :: one_K4=1.0
580 INTEGER,
DIMENSION(METIS_NOPTIONS) :: metis_opt
582 petscmpiint :: nb_proc
584 petscerrorcode :: ierr
592 nws =
SIZE( mesh%jjs,1)
593 neigh_new = mesh%neigh
594 IF (
SIZE(list_of_interfaces)/=0)
THEN 597 IF (.NOT.virgins(ms)) cycle
598 IF (minval(abs(mesh%sides(ms)-list_of_interfaces))/=0) cycle
599 i_loc = mesh%jjs(:,ms)
600 DO msop = 1, mesh%mes
601 IF (msop==ms .OR. .NOT.virgins(msop)) cycle
602 IF (minval(abs(mesh%sides(msop)-list_of_interfaces))/=0) cycle
606 iop = mesh%jjs(nsop,msop)
607 IF (maxval(abs(mesh%rr(:,i_loc(ns))-mesh%rr(:,iop))).LT.
epsilon)
THEN 619 CALL error_petsc(.NOT.
'BUG in part_mesh_mhd, test ')
622 IF (neigh_new(n,mesh%neighs(msop))==0)
THEN 623 neigh_new(n,mesh%neighs(msop)) = mesh%neighs(ms)
625 IF (neigh_new(n,mesh%neighs(ms))==0)
THEN 626 neigh_new(n,mesh%neighs(ms)) = mesh%neighs(msop)
629 virgins(ms) = .false.
630 virgins(msop) = .false.
635 IF (
PRESENT(my_periodic))
THEN 636 IF (my_periodic%nb_periodic_pairs/=0)
THEN 639 IF (minval(abs(mesh%sides(ms)-my_periodic%list_periodic(1,:))) == 0)
THEN 640 jm_loc = minloc(abs(mesh%sides(ms)-my_periodic%list_periodic(1,:)))
641 s2 = my_periodic%list_periodic(2,jm_loc(1))
643 DO msop = 1, mesh%mes
644 IF (mesh%sides(msop) /= s2) cycle
647 DO ns = 1,
SIZE(my_periodic%vect_e,1)
648 err = err + abs(sum(mesh%rr(ns,mesh%jjs(:,ms))-mesh%rr(ns,mesh%jjs(:,msop)) &
649 +my_periodic%vect_e(ns,jm_loc(1))))
660 mop = mesh%neighs(msop)
662 IF (neigh_new(n,m) == 0)
THEN 665 IF (neigh_new(n,mop) == 0)
THEN 677 nb_neigh =
SIZE(mesh%neigh,1)
682 IF (neigh_new(n,m)==0) cycle
685 xind(m+1) = xind(m) + nb
687 ALLOCATE(xadj(xind(mesh%me+1)-1))
691 IF (neigh_new(n,m)==0) cycle
693 xadj(p) = neigh_new(n,m)
696 IF (p/=xind(mesh%me+1)-1)
THEN 701 ALLOCATE(adjwgt(
SIZE(xadj)))
707 ALLOCATE(tpwgts(nb_proc))
708 tpwgts=one_k4/nb_proc
709 CALL metis_setdefaultoptions(metis_opt)
712 CALL metis_partgraphrecursive(mesh%me, 1, xind,xadj,vwgt, vwgt, adjwgt, nb_proc,tpwgts , ubvec, metis_opt, edge, part)
717 nws =
SIZE( mesh%jjs,1)
718 IF (
SIZE(list_of_interfaces)/=0)
THEN 721 IF (.NOT.virgins(ms)) cycle
722 IF (minval(abs(mesh%sides(ms)-list_of_interfaces))/=0) cycle
723 i_loc = mesh%jjs(:,ms)
724 DO msop = 1, mesh%mes
725 IF (msop==ms .OR. .NOT.virgins(msop)) cycle
726 IF (minval(abs(mesh%sides(msop)-list_of_interfaces))/=0) cycle
730 iop = mesh%jjs(nsop,msop)
731 IF (maxval(abs(mesh%rr(:,i_loc(ns))-mesh%rr(:,iop))).LT.
epsilon)
THEN 743 CALL error_petsc(.NOT.
'BUG in create_local_mesh, test ')
745 IF (part(mesh%neighs(ms)) == part(mesh%neighs(msop))) cycle
746 proc = min(part(mesh%neighs(ms)),part(mesh%neighs(msop)))
747 part(mesh%neighs(ms)) = proc
748 part(mesh%neighs(msop)) = proc
749 virgins(ms) = .false.
750 virgins(msop) = .false.
756 IF (
PRESENT(my_periodic))
THEN 757 IF (my_periodic%nb_periodic_pairs/=0)
THEN 766 IF ((minval(abs(mesh%sides(ms)-my_periodic%list_periodic(1,:))) /=0) .AND. &
767 (minval(abs(mesh%sides(ms)-my_periodic%list_periodic(2,:))) /=0) ) cycle
768 DO ns = 1,
SIZE(mesh%jjs,1)
771 DO msop = 1, mesh%mes
772 IF (minval(abs(mesh%sides(msop)-my_periodic%list_periodic(:,:))) /=0 ) cycle
773 IF (msop == ms) cycle
774 DO nsop = 1,
SIZE(mesh%jjs,1)
775 IF (mesh%jjs(nsop,msop)==j)
THEN 776 per_pts(j,3) = mesh%neighs(msop)
787 IF (minval(abs(mesh%sides(ms)-my_periodic%list_periodic(1,:))) /= 0) cycle
788 jm_loc = minloc(abs(mesh%sides(ms)-my_periodic%list_periodic(1,:)))
789 s2 = my_periodic%list_periodic(2,jm_loc(1))
791 DO msop = 1, mesh%mes
792 IF (mesh%sides(msop) /= s2) cycle
795 DO ns = 1,
SIZE(my_periodic%vect_e,1)
796 err = err + abs(sum(mesh%rr(ns,mesh%jjs(:,ms))-mesh%rr(ns,mesh%jjs(:,msop)) &
797 +my_periodic%vect_e(ns,jm_loc(1))))
808 IF (part(mesh%neighs(ms)) /= part(mesh%neighs(msop)))
THEN 809 proc = min(part(mesh%neighs(ms)),part(mesh%neighs(msop)))
810 part(mesh%neighs(ms)) = proc
811 part(mesh%neighs(msop)) = proc
820 CALL mpi_comm_rank(mpi_comm_world,rank,ierr)
827 DEALLOCATE(xadj,adjwgt)
833 SUBROUTINE part_mesh_mhd_bis(nb_proc,list_u, list_h_in, list_phi ,mesh,list_of_interfaces,part,my_periodic)
840 INTEGER,
DIMENSION(mesh%me) :: part
841 INTEGER,
DIMENSION(:) :: list_of_interfaces
842 INTEGER,
DIMENSION(:) :: list_u, list_h_in, list_phi
845 LOGICAL,
DIMENSION(mesh%mes) :: virgins
846 INTEGER,
DIMENSION(3,mesh%me) :: neigh_new
847 INTEGER,
DIMENSION(5) :: opts
848 INTEGER,
DIMENSION(SIZE(mesh%jjs,1)) :: i_loc
849 INTEGER,
DIMENSION(:),
ALLOCATABLE :: xadj_u, xadj_h, xadj_phi, list_h
850 INTEGER,
DIMENSION(:),
ALLOCATABLE :: xind_u, xind_h, xind_phi
851 INTEGER,
DIMENSION(:),
ALLOCATABLE :: vwgt, adjwgt
852 INTEGER,
DIMENSION(:),
ALLOCATABLE :: u2glob, h2glob, phi2glob
853 INTEGER,
DIMENSION(:),
ALLOCATABLE :: part_u, part_h, part_phi
854 INTEGER,
DIMENSION(1) :: jm_loc
856 INTEGER,
DIMENSION(mesh%np,3) :: per_pts
857 INTEGER,
DIMENSION(mesh%me) :: glob2loc
858 INTEGER,
DIMENSION(mesh%np) :: indicator
859 INTEGER,
DIMENSION(3) :: j_loc
860 INTEGER :: nb_neigh, edge, m, ms, n, nb, numflag, p, wgtflag, j, &
861 ns, nws, msop, nsop, proc, iop, mop, s2, k, me_u, me_h, me_phi, idm
867 REAL(KIND=4),
DIMENSION(:),
ALLOCATABLE :: tpwgts
868 REAL(KIND=4),
DIMENSION(1) :: ubvec
869 REAL(KIND=4) :: one_K4=1.0
871 INTEGER,
DIMENSION(METIS_NOPTIONS) :: metis_opt
872 petscmpiint :: nb_proc
874 petscerrorcode :: ierr
885 DO j = 1,
SIZE(list_h_in)
886 IF (minval(abs(list_h_in(j)-list_u))==0) cycle
891 DO j = 1,
SIZE(list_h_in)
892 IF (minval(abs(list_h_in(j)-list_u))==0) cycle
894 list_h(nb) = list_h_in(j)
899 nws =
SIZE( mesh%jjs,1)
900 neigh_new = mesh%neigh
901 IF (
SIZE(list_of_interfaces)/=0)
THEN 904 IF (.NOT.virgins(ms)) cycle
905 IF (minval(abs(mesh%sides(ms)-list_of_interfaces))/=0) cycle
906 i_loc = mesh%jjs(:,ms)
907 DO msop = 1, mesh%mes
908 IF (msop==ms .OR. .NOT.virgins(msop)) cycle
909 IF (minval(abs(mesh%sides(msop)-list_of_interfaces))/=0) cycle
913 iop = mesh%jjs(nsop,msop)
914 IF (maxval(abs(mesh%rr(:,i_loc(ns))-mesh%rr(:,iop))).LT.
epsilon)
THEN 926 CALL error_petsc(.NOT.
'BUG in part_mesh_mhd, test ')
929 IF (neigh_new(n,mesh%neighs(msop))==0)
THEN 930 neigh_new(n,mesh%neighs(msop)) = mesh%neighs(ms)
932 IF (neigh_new(n,mesh%neighs(ms))==0)
THEN 933 neigh_new(n,mesh%neighs(ms)) = mesh%neighs(msop)
936 virgins(ms) = .false.
937 virgins(msop) = .false.
943 IF (
PRESENT(my_periodic))
THEN 944 IF (my_periodic%nb_periodic_pairs/=0)
THEN 947 IF (minval(abs(mesh%sides(ms)-my_periodic%list_periodic(1,:))) == 0)
THEN 948 jm_loc = minloc(abs(mesh%sides(ms)-my_periodic%list_periodic(1,:)))
949 s2 = my_periodic%list_periodic(2,jm_loc(1))
951 DO msop = 1, mesh%mes
952 IF (mesh%sides(msop) /= s2) cycle
955 DO ns = 1,
SIZE(my_periodic%vect_e,1)
956 err = err + abs(sum(mesh%rr(ns,mesh%jjs(:,ms))-mesh%rr(ns,mesh%jjs(:,msop)) &
957 +my_periodic%vect_e(ns,jm_loc(1))))
968 mop = mesh%neighs(msop)
970 IF (neigh_new(n,m) == 0)
THEN 973 IF (neigh_new(n,mop) == 0)
THEN 988 IF (minval(abs(idm-list_u))==0)
THEN 990 ELSE IF (minval(abs(idm-list_h))==0)
THEN 992 ELSE IF (minval(abs(idm-list_phi))==0)
THEN 995 CALL error_petsc(
'BUG in part_mesh_mhd_bis : element not in the mesh')
998 ALLOCATE(u2glob(me_u), h2glob(me_h),phi2glob(me_phi))
1004 IF (minval(abs(idm-list_u))==0)
THEN 1008 ELSE IF (minval(abs(idm-list_h))==0)
THEN 1012 ELSE IF (minval(abs(idm-list_phi))==0)
THEN 1014 phi2glob(me_phi) = m
1015 glob2loc(m) = me_phi
1017 CALL error_petsc(
'BUG in part_mesh_mhd_bis : element not in the mesh')
1021 nb_neigh =
SIZE(mesh%neigh,1)
1022 ALLOCATE(xind_u(me_u+1), xind_h(me_h+1), xind_phi(me_phi+1))
1028 mop = neigh_new(n,m)
1030 IF (minval(abs(mesh%i_d(mop)-list_u))/=0) cycle
1033 xind_u(k+1) = xind_u(k) + nb
1040 mop = neigh_new(n,m)
1042 IF (minval(abs(mesh%i_d(mop)-list_h))/=0) cycle
1045 xind_h(k+1) = xind_h(k) + nb
1052 mop = neigh_new(n,m)
1054 IF (minval(abs(mesh%i_d(mop)-list_phi))/=0) cycle
1057 xind_phi(k+1) = xind_phi(k) + nb
1060 ALLOCATE(xadj_u(xind_u(me_u+1)-1))
1061 ALLOCATE(xadj_h(xind_h(me_h+1)-1))
1062 ALLOCATE(xadj_phi(xind_phi(me_phi+1)-1))
1067 mop = neigh_new(n,m)
1069 IF (minval(abs(mesh%i_d(mop)-list_u))/=0) cycle
1073 xadj_u(p) = glob2loc(mop)
1076 IF (p/=xind_u(me_u+1)-1)
THEN 1083 mop = neigh_new(n,m)
1085 IF (minval(abs(mesh%i_d(mop)-list_h))/=0) cycle
1089 xadj_h(p) = glob2loc(mop)
1092 IF (p/=xind_h(me_h+1)-1)
THEN 1099 mop = neigh_new(n,m)
1101 IF (minval(abs(mesh%i_d(mop)-list_phi))/=0) cycle
1105 xadj_phi(p) = glob2loc(mop)
1108 IF (p/=xind_phi(me_phi+1)-1)
THEN 1116 ALLOCATE(tpwgts(nb_proc))
1117 tpwgts=one_k4/nb_proc
1118 CALL metis_setdefaultoptions(metis_opt)
1122 ALLOCATE(vwgt(me_u), adjwgt(
SIZE(xadj_u)), part_u(me_u))
1125 CALL metis_partgraphrecursive(me_u, 1, xind_u,xadj_u,vwgt, vwgt, adjwgt, nb_proc,tpwgts , ubvec, metis_opt, edge, part_u)
1129 IF (
ALLOCATED(vwgt))
THEN 1130 DEALLOCATE(vwgt, adjwgt)
1132 ALLOCATE(vwgt(me_h), adjwgt(
SIZE(xadj_h)), part_h(me_h))
1135 CALL metis_partgraphrecursive(me_h, 1, xind_h,xadj_h,vwgt, vwgt, adjwgt, nb_proc,tpwgts , ubvec, metis_opt, edge, part_h)
1138 IF (me_phi /= 0)
THEN 1139 IF (
ALLOCATED(vwgt))
THEN 1140 DEALLOCATE(vwgt, adjwgt)
1142 ALLOCATE(vwgt(me_phi), adjwgt(
SIZE(xadj_phi)), part_phi(me_phi))
1145 CALL metis_partgraphrecursive(me_phi, 1, xind_phi,xadj_phi,vwgt, vwgt, adjwgt, nb_proc,tpwgts, &
1146 ubvec, metis_opt, edge, part_phi)
1165 part(u2glob(:)) = part_u
1168 part(h2glob(:)) = part_h
1171 part(phi2glob(:)) = part_phi
1173 IF (minval(part)==-1)
THEN 1174 CALL error_petsc(
'BUG in part_mesh_mhd_bis, MINVAL(part) == -1')
1180 IF (
SIZE(mesh%jj,1)/=3)
THEN 1181 write(*,*)
'SIZE(mesh%jj,1)',
SIZE(mesh%jj,1)
1182 CALL error_petsc(
'BUG in part_mesh_mhd_bis, SIZE(mesh%jj,1)/=3')
1185 nws =
SIZE( mesh%jjs,1)
1186 IF (
SIZE(list_of_interfaces)/=0)
THEN 1189 IF (.NOT.virgins(ms)) cycle
1190 IF (minval(abs(mesh%sides(ms)-list_of_interfaces))/=0) cycle
1191 i_loc = mesh%jjs(:,ms)
1192 DO msop = 1, mesh%mes
1193 IF (msop==ms .OR. .NOT.virgins(msop)) cycle
1194 IF (minval(abs(mesh%sides(msop)-list_of_interfaces))/=0) cycle
1198 iop = mesh%jjs(nsop,msop)
1199 IF (maxval(abs(mesh%rr(:,i_loc(ns))-mesh%rr(:,iop))).LT.
epsilon)
THEN 1211 CALL error_petsc(.NOT.
'BUG in create_local_mesh, test ')
1213 IF (part(mesh%neighs(ms)) == part(mesh%neighs(msop))) cycle
1214 proc = min(part(mesh%neighs(ms)),part(mesh%neighs(msop)))
1215 part(mesh%neighs(ms)) = proc
1216 part(mesh%neighs(msop)) = proc
1217 virgins(ms) = .false.
1218 virgins(msop) = .false.
1219 indicator(mesh%jjs(:,ms)) = proc
1220 indicator(mesh%jjs(:,msop)) = proc
1227 j_loc = mesh%jj(:,m)
1228 n = maxval(indicator(j_loc))
1230 IF (indicator(j_loc(1))*indicator(j_loc(2))*indicator(j_loc(3))<0) cycle
1236 IF (
PRESENT(my_periodic))
THEN 1237 IF (my_periodic%nb_periodic_pairs/=0)
THEN 1246 IF ((minval(abs(mesh%sides(ms)-my_periodic%list_periodic(1,:))) /=0) .AND. &
1247 (minval(abs(mesh%sides(ms)-my_periodic%list_periodic(2,:))) /=0) ) cycle
1248 DO ns = 1,
SIZE(mesh%jjs,1)
1251 DO msop = 1, mesh%mes
1252 IF (minval(abs(mesh%sides(msop)-my_periodic%list_periodic(:,:))) /=0 ) cycle
1253 IF (msop == ms) cycle
1254 DO nsop = 1,
SIZE(mesh%jjs,1)
1255 IF (mesh%jjs(nsop,msop)==j)
THEN 1256 per_pts(j,3) = mesh%neighs(msop)
1267 IF (minval(abs(mesh%sides(ms)-my_periodic%list_periodic(1,:))) /= 0) cycle
1268 jm_loc = minloc(abs(mesh%sides(ms)-my_periodic%list_periodic(1,:)))
1269 s2 = my_periodic%list_periodic(2,jm_loc(1))
1271 DO msop = 1, mesh%mes
1272 IF (mesh%sides(msop) /= s2) cycle
1275 DO ns = 1,
SIZE(my_periodic%vect_e,1)
1276 err = err + abs(sum(mesh%rr(ns,mesh%jjs(:,ms))-mesh%rr(ns,mesh%jjs(:,msop)) &
1277 +my_periodic%vect_e(ns,jm_loc(1))))
1288 IF (part(mesh%neighs(ms)) /= part(mesh%neighs(msop)))
THEN 1289 proc = min(part(mesh%neighs(ms)),part(mesh%neighs(msop)))
1290 part(mesh%neighs(ms)) = proc
1291 part(mesh%neighs(msop)) = proc
1300 CALL mpi_comm_rank(mpi_comm_world,rank,ierr)
1307 DEALLOCATE(vwgt,adjwgt)
1308 IF (
ALLOCATED(xadj_u))
DEALLOCATE(xadj_u)
1309 IF (
ALLOCATED(xadj_h))
DEALLOCATE(xadj_h)
1310 IF (
ALLOCATED(xadj_phi))
DEALLOCATE(xadj_phi)
1311 IF (
ALLOCATED(list_h))
DEALLOCATE(list_h)
1312 IF (
ALLOCATED(xind_u))
DEALLOCATE(xind_u)
1313 IF (
ALLOCATED(xind_h))
DEALLOCATE(xind_h)
1314 IF (
ALLOCATED(xind_phi))
DEALLOCATE(xind_phi)
1315 IF (
ALLOCATED(u2glob))
DEALLOCATE(u2glob)
1316 IF (
ALLOCATED(h2glob))
DEALLOCATE(h2glob)
1317 IF (
ALLOCATED(phi2glob))
DEALLOCATE(phi2glob)
1318 IF (
ALLOCATED(part_u))
DEALLOCATE(part_u)
1319 IF (
ALLOCATED(part_h))
DEALLOCATE(part_h)
1320 IF (
ALLOCATED(part_phi))
DEALLOCATE(part_phi)
1326 SUBROUTINE extract_mesh(communicator,nb_proc,mesh_glob,part,list_dom,mesh,mesh_loc)
1330 TYPE(
mesh_type) :: mesh_glob, mesh, mesh_loc
1331 INTEGER,
DIMENSION(:) :: part, list_dom
1332 INTEGER,
DIMENSION(mesh_glob%me) :: bat
1333 INTEGER,
DIMENSION(mesh_glob%np) :: i_old_to_new
1334 INTEGER,
DIMENSION(mesh_glob%mes) :: parts
1335 INTEGER,
DIMENSION(nb_proc) :: nblmt_per_proc, start, displ
1336 INTEGER,
DIMENSION(2) :: np_loc, me_loc, mes_loc
1337 INTEGER,
DIMENSION(:),
ALLOCATABLE :: list_m, tab, tabs
1338 INTEGER :: nb_proc, ms, i, index, m, mop, n
1339 petscerrorcode :: ierr
1341 mpi_comm :: communicator
1342 CALL mpi_comm_rank(communicator,rank,ierr)
1345 parts = part(mesh_glob%neighs)
1350 DO m = 1, mesh_glob%me
1351 IF (minval(abs(list_dom-mesh_glob%i_d(m)))/=0) cycle
1355 ALLOCATE (list_m(mesh%me))
1357 DO m = 1, mesh_glob%me
1358 IF (minval(abs(list_dom-mesh_glob%i_d(m)))/=0) cycle
1368 nblmt_per_proc(part(m)) = nblmt_per_proc(part(m)) + 1
1372 start(n) = start(n-1) + nblmt_per_proc(n-1)
1374 me_loc(1) = start(rank+1) + 1
1375 me_loc(2) = start(rank+1) + nblmt_per_proc(rank+1)
1380 ALLOCATE(tab(mesh%me))
1384 start(part(m)) = start(part(m)) + 1
1385 tab(start(part(m))) = m
1386 bat(m) = start(part(m))
1391 mesh%gauss%n_w =
SIZE(mesh_glob%jj,1)
1392 ALLOCATE(mesh%jj(
SIZE(mesh_glob%jj,1),mesh%me))
1396 DO n = 1,
SIZE(mesh_glob%jj,1)
1397 i = mesh_glob%jj(n,tab(m))
1398 IF (i_old_to_new(i)/=0)
THEN 1399 mesh%jj(n,m) = i_old_to_new(i)
1402 i_old_to_new(i) = index
1403 mesh%jj(n,m) = i_old_to_new(i)
1411 ALLOCATE(mesh%rr(2,mesh%np))
1412 DO i = 1, mesh_glob%np
1413 IF (i_old_to_new(i)==0) cycle
1414 mesh%rr(:,i_old_to_new(i)) = mesh_glob%rr(:,i)
1419 ALLOCATE(mesh%neigh(3,mesh%me))
1422 mop = mesh_glob%neigh(n,tab(m))
1426 mesh%neigh(n,m) = bat(mop)
1433 ALLOCATE(mesh%i_d(mesh%me))
1434 mesh%i_d = mesh_glob%i_d(tab)
1438 IF (displ(rank+1)/=0)
THEN 1439 np_loc(1) = maxval(mesh%jj(:,1:displ(rank+1))) + 1
1443 np_loc(2) = np_loc(1) - 1
1444 IF (me_loc(1).LE.me_loc(2))
THEN 1445 np_loc(2) = maxval(mesh%jj(:,me_loc(1):me_loc(2)))
1447 IF (np_loc(2) .LT. np_loc(1)-1)
THEN 1448 np_loc(2) = np_loc(1) - 1
1454 DO ms = 1, mesh_glob%mes
1455 IF (minval(abs(list_dom-mesh_glob%i_d(mesh_glob%neighs(ms))))/=0) cycle
1457 nblmt_per_proc(n) = nblmt_per_proc(n) + 1
1461 start(n) = start(n-1) + nblmt_per_proc(n-1)
1463 mes_loc(1) = start(rank+1) + 1
1464 mes_loc(2) = start(rank+1) + nblmt_per_proc(rank+1)
1465 mesh%mes = sum(nblmt_per_proc)
1469 ALLOCATE(tabs(mesh%mes))
1470 DO ms = 1, mesh_glob%mes
1471 IF (minval(abs(list_dom-mesh_glob%i_d(mesh_glob%neighs(ms))))/=0) cycle
1472 start(parts(ms)) = start(parts(ms)) + 1
1473 tabs(start(parts(ms))) = ms
1478 ALLOCATE(mesh%neighs(mesh%mes))
1479 mesh%neighs = bat(mesh_glob%neighs(tabs))
1483 ALLOCATE(mesh%sides(mesh%mes))
1484 mesh%sides = mesh_glob%sides(tabs)
1488 mesh%gauss%n_ws =
SIZE(mesh_glob%jjs,1)
1489 ALLOCATE(mesh%jjs(
SIZE(mesh_glob%jjs,1),mesh%mes))
1491 DO n = 1,
SIZE(mesh%jjs,1)
1492 mesh%jjs(n,:) = i_old_to_new(mesh_glob%jjs(n,tabs))
1497 mesh%edge_stab = .false.
1500 DEALLOCATE(list_m, tab, tabs)
1509 INTEGER,
DIMENSION(2),
INTENT(IN) :: me_loc, mes_loc, np_loc
1510 INTEGER,
DIMENSION(mesh%me) :: m_glob_to_loc
1511 INTEGER,
DIMENSION(:),
ALLOCATABLE :: m_loc_to_glob
1512 INTEGER,
DIMENSION(mesh%np) :: glob_to_loc,loc_to_glob
1513 LOGICAL,
DIMENSION(mesh%np) :: virgin
1514 INTEGER :: dim, nws, nw, m, ms, mop, ns, msup, minf, dof, &
1515 dom_me, nwc, dom_mes, dom_np, n, i
1518 dim =
SIZE(mesh%rr,1)
1519 nws =
SIZE(mesh%jjs,1)
1520 nw =
SIZE(mesh%jj,1)
1521 nwc =
SIZE(mesh%neigh,1)
1523 IF (me_loc(2) - me_loc(1) + 1==mesh%me)
THEN 1524 mesh_loc%me = mesh%me
1525 mesh_loc%np = mesh%np
1526 mesh_loc%mes = mesh%mes
1527 mesh_loc%dom_me = mesh%me
1528 mesh_loc%dom_np = mesh%np
1529 mesh_loc%dom_mes = mesh%mes
1530 mesh_loc%gauss%n_w = nw
1531 ALLOCATE(mesh_loc%jj(nw,mesh%me))
1532 mesh_loc%jj = mesh%jj
1533 ALLOCATE(mesh_loc%loc_to_glob(mesh%np))
1535 mesh_loc%loc_to_glob(n) = n
1537 ALLOCATE(mesh_loc%rr(dim,mesh%np))
1539 ALLOCATE(mesh_loc%neigh(nwc,mesh%me))
1540 mesh_loc%neigh = mesh%neigh
1541 ALLOCATE(mesh_loc%i_d(mesh%me))
1542 mesh_loc%i_d = mesh%i_d
1543 ALLOCATE(mesh_loc%neighs(mesh_loc%mes))
1544 mesh_loc%neighs = mesh%neighs
1545 ALLOCATE(mesh_loc%sides(mesh_loc%mes))
1546 mesh_loc%sides = mesh%sides
1547 mesh_loc%gauss%n_ws = nws
1548 ALLOCATE(mesh_loc%jjs(nws,mesh_loc%mes))
1549 mesh_loc%jjs = mesh%jjs
1556 dom_me = me_loc(2) - me_loc(1) + 1
1557 dom_mes = mes_loc(2) - mes_loc(1) + 1
1558 dom_np = np_loc(2) - np_loc(1) + 1
1559 mesh_loc%me = dom_me
1560 mesh_loc%mes = dom_mes
1561 mesh_loc%dom_me = dom_me
1562 mesh_loc%dom_np = dom_np
1563 mesh_loc%dom_mes = dom_mes
1566 ALLOCATE(mesh_loc%jj(0,0))
1567 ALLOCATE(mesh_loc%loc_to_glob(0))
1568 ALLOCATE(mesh_loc%rr(0,0))
1569 ALLOCATE(mesh_loc%neigh(0,0))
1570 ALLOCATE(mesh_loc%i_d(0))
1571 ALLOCATE(mesh_loc%neighs(0))
1572 ALLOCATE(mesh_loc%sides(0))
1573 ALLOCATE(mesh_loc%jjs(0,0))
1574 mesh_loc%gauss%n_w = 0
1575 mesh_loc%gauss%n_ws = 0
1577 ELSE IF (dom_me<0)
THEN 1578 CALL error_petsc(
'BUG in create_local_mesh, dom_me<0 ')
1580 mesh_loc%gauss%n_w = nw
1581 mesh_loc%gauss%n_ws = nws
1587 DO m = me_loc(1), me_loc(2)
1590 IF(.NOT.virgin(i) .OR. i.GE.np_loc(1)) cycle
1595 ALLOCATE(mesh_loc%jj(nw,mesh_loc%me))
1597 ALLOCATE(m_loc_to_glob(mesh_loc%me))
1601 DO m = me_loc(1), me_loc(2)
1606 IF (i .LT. np_loc(1))
THEN 1608 glob_to_loc(i) = dof
1609 loc_to_glob(dof) = i
1611 glob_to_loc(i) = i-np_loc(1) + 1
1612 loc_to_glob(i-np_loc(1) + 1) = i
1616 m_loc_to_glob(m-me_loc(1)+1) = m
1617 m_glob_to_loc(m) = m-me_loc(1)+1
1621 mesh_loc%jj(n,1:dom_me) = glob_to_loc(mesh%jj(n,me_loc(1):me_loc(2)))
1626 IF (maxval(mesh_loc%jj)/=dof)
THEN 1627 CALL error_petsc(
'BUG in create_local_mesh, mesh_loc%jj)/=dof')
1630 ALLOCATE(mesh_loc%loc_to_glob(mesh_loc%np))
1631 mesh_loc%loc_to_glob = loc_to_glob(1:mesh_loc%np)
1635 ALLOCATE(mesh_loc%rr(dim,mesh_loc%np))
1636 DO n = 1, mesh_loc%np
1637 mesh_loc%rr(:,n) = mesh%rr(:,mesh_loc%loc_to_glob(n))
1642 ALLOCATE(mesh_loc%neigh(nwc,mesh_loc%me))
1643 msup = maxval(m_loc_to_glob)
1644 minf = minval(m_loc_to_glob)
1645 DO m = 1, mesh_loc%me
1647 mop = mesh%neigh(n,m_loc_to_glob(m))
1649 mesh_loc%neigh(n,m) = 0
1650 ELSE IF(mop<minf .OR. mop>msup)
THEN 1652 mesh_loc%neigh(n,m) = -mop
1654 mesh_loc%neigh(n,m) = m_glob_to_loc(mop)
1661 ALLOCATE(mesh_loc%i_d(mesh_loc%me))
1662 mesh_loc%i_d = mesh%i_d(m_loc_to_glob)
1666 ALLOCATE(mesh_loc%neighs(mesh_loc%mes))
1667 mesh_loc%neighs = m_glob_to_loc(mesh%neighs(mes_loc(1):mes_loc(2)))
1672 ALLOCATE(mesh_loc%sides(mesh_loc%mes))
1673 mesh_loc%sides = mesh%sides(mes_loc(1):mes_loc(2))
1677 ALLOCATE(mesh_loc%jjs(nws,mesh_loc%mes))
1679 mesh_loc%jjs(ns,:) = glob_to_loc(mesh%jjs(ns,mes_loc(1):mes_loc(2)))
1685 DO ms = 1, mesh_loc%mes
1686 m = mesh_loc%neighs(ms)
1690 IF (maxval(abs(mesh_loc%rr(:,mesh_loc%jj(n,m))-mesh_loc%rr(:,mesh_loc%jjs(ns,ms)))) .LT. 1.d-10)
THEN 1695 WRITE(*,*)
'bug in create local mesh, non consistent numbering' 1703 DEALLOCATE(m_loc_to_glob)
1714 DEALLOCATE(mesh%jjs)
1716 DEALLOCATE(mesh%neigh)
1717 DEALLOCATE(mesh%sides)
1718 DEALLOCATE(mesh%neighs)
1719 DEALLOCATE(mesh%i_d)
1721 NULLIFY(mesh%loc_to_glob)
1726 IF (mesh%edge_stab)
THEN 1727 DEALLOCATE(mesh%iis)
1729 DEALLOCATE(mesh%jjsi)
1730 DEALLOCATE(mesh%neighi)
1741 mesh%edge_stab = .false.
1752 DEALLOCATE(interf%mesh1)
1753 DEALLOCATE(interf%mesh2)
1754 DEALLOCATE(interf%jjs1)
1755 DEALLOCATE(interf%jjs2)
1764 INTEGER,
DIMENSION(mesh%me),
INTENT(INOUT) :: partition
1765 INTEGER,
DIMENSION(mesh%np,3),
INTENT(IN) :: list_pts
1767 INTEGER :: i, j_loc, proc_min, index, i_loc, m, mop, n, proc1, proc2
1768 INTEGER,
DIMENSION(50) :: list_elmts
1774 IF (list_pts(i,2)==0) cycle
1775 j_loc = list_pts(i,1)
1778 list_elmts(index) = list_pts(i,2)
1785 mop = mesh%neigh(n, m)
1787 IF (minval(abs(mesh%jj(:,mop)-j_loc)) /=0) cycle
1788 IF (minval(abs(mop-list_elmts))==0) cycle
1791 IF (i_loc-index==2)
THEN 1792 CALL error_petsc(
'BUG in reassign_per_pts, how is that possible?')
1794 list_elmts(i_loc) = mop
1799 IF (list_pts(i,3) == 0)
THEN 1800 proc_min = minval(partition(list_elmts(1:index)))
1801 partition(list_elmts(1)) = proc_min
1803 IF (list_elmts(index) /= list_pts(i,3))
THEN 1804 CALL error_petsc(
'BUG in reassign_per_pts, wrong element')
1806 proc1 = partition(list_elmts(1))
1807 proc2 = partition(list_elmts(2))
1808 partition(list_elmts(2:index-1)) = min(proc1,proc2)
subroutine error_petsc(string)
subroutine, public free_interface(interf)
subroutine plot_const_p1_label(jj, rr, uu, file_name)
subroutine reassign_per_pts(mesh, partition, list_pts)
subroutine, public part_mesh_m_t_h_phi(nb_proc, list_u, list_T_in, list_h_in, list_phi, mesh, list_of_interfaces, part, my_periodic)
subroutine, public free_mesh(mesh)
subroutine, public part_mesh_mhd(nb_proc, vwgt, mesh, list_of_interfaces, part, my_periodic)
integer metis_option_numbering
subroutine, public part_mesh_mhd_bis(nb_proc, list_u, list_h_in, list_phi, mesh, list_of_interfaces, part, my_periodic)
subroutine, public extract_mesh(communicator, nb_proc, mesh_glob, part, list_dom, mesh, mesh_loc)
subroutine create_local_mesh(mesh, mesh_loc, me_loc, mes_loc, np_loc)