[cig-commits] r14154 - seismo/3D/SPECFEM3D_SESAME/trunk/UTILS/external_mesh/pre_meshfem3D_asteroid_subdivide
pieyre at geodynamics.org
pieyre at geodynamics.org
Thu Feb 26 05:45:48 PST 2009
Author: pieyre
Date: 2009-02-26 05:45:48 -0800 (Thu, 26 Feb 2009)
New Revision: 14154
Modified:
seismo/3D/SPECFEM3D_SESAME/trunk/UTILS/external_mesh/pre_meshfem3D_asteroid_subdivide/compil_all.sh
seismo/3D/SPECFEM3D_SESAME/trunk/UTILS/external_mesh/pre_meshfem3D_asteroid_subdivide/constants_pre_meshfem3D.h
seismo/3D/SPECFEM3D_SESAME/trunk/UTILS/external_mesh/pre_meshfem3D_asteroid_subdivide/part_pre_meshfem3D.f90
seismo/3D/SPECFEM3D_SESAME/trunk/UTILS/external_mesh/pre_meshfem3D_asteroid_subdivide/pre_meshfem3D.f90
Log:
added modifications to compute the max number of elements containing the same node and bound the max number of neighbours per element
Modified: seismo/3D/SPECFEM3D_SESAME/trunk/UTILS/external_mesh/pre_meshfem3D_asteroid_subdivide/compil_all.sh
===================================================================
--- seismo/3D/SPECFEM3D_SESAME/trunk/UTILS/external_mesh/pre_meshfem3D_asteroid_subdivide/compil_all.sh 2009-02-26 01:06:59 UTC (rev 14153)
+++ seismo/3D/SPECFEM3D_SESAME/trunk/UTILS/external_mesh/pre_meshfem3D_asteroid_subdivide/compil_all.sh 2009-02-26 13:45:48 UTC (rev 14154)
@@ -7,7 +7,7 @@
gfortran -c part_pre_meshfem3D.f90
gfortran -c pre_meshfem3D.f90
-gfortran pre_meshfem3D.o part_pre_meshfem3D.o ~/utils/metis-4.0/libmetis.a
-
+#gfortran pre_meshfem3D.o part_pre_meshfem3D.o ~/utils/metis-4.0/libmetis.a
+gfortran pre_meshfem3D.o part_pre_meshfem3D.o ~/Download/metis-4.0/libmetis.a
#gfortran pre_meshfem3D.o part_pre_meshfem3D.o ~/utils/scotch_5.1/lib/libscotchmetis.a ~/utils/scotch_5.1/lib/libscotch.a ~/utils/scotch_5.1/lib/libscotcherr.a
#gfortran pre_meshfem3D.o part_pre_meshfem3D.o ~/utils/scotch_5.1/lib/libscotch.a ~/utils/scotch_5.1/lib/libscotcherr.a
Modified: seismo/3D/SPECFEM3D_SESAME/trunk/UTILS/external_mesh/pre_meshfem3D_asteroid_subdivide/constants_pre_meshfem3D.h
===================================================================
--- seismo/3D/SPECFEM3D_SESAME/trunk/UTILS/external_mesh/pre_meshfem3D_asteroid_subdivide/constants_pre_meshfem3D.h 2009-02-26 01:06:59 UTC (rev 14153)
+++ seismo/3D/SPECFEM3D_SESAME/trunk/UTILS/external_mesh/pre_meshfem3D_asteroid_subdivide/constants_pre_meshfem3D.h 2009-02-26 13:45:48 UTC (rev 14154)
@@ -2,11 +2,14 @@
! Number of nodes per elements.
integer, parameter :: ESIZE = 8
+! Number of faces per element.
+integer, parameter :: nfaces = 6
+
! Max number of neighbours per elements.
- integer, parameter :: max_neighbour=60
+! integer, parameter :: max_neighbour=60
! Max number of elements that can contain the same node.
- integer, parameter :: nsize=20
+! integer, parameter :: nsize=20
! very large and very small values
double precision, parameter :: HUGEVAL = 1.d+30,TINYVAL = 1.d-9
Modified: seismo/3D/SPECFEM3D_SESAME/trunk/UTILS/external_mesh/pre_meshfem3D_asteroid_subdivide/part_pre_meshfem3D.f90
===================================================================
--- seismo/3D/SPECFEM3D_SESAME/trunk/UTILS/external_mesh/pre_meshfem3D_asteroid_subdivide/part_pre_meshfem3D.f90 2009-02-26 01:06:59 UTC (rev 14153)
+++ seismo/3D/SPECFEM3D_SESAME/trunk/UTILS/external_mesh/pre_meshfem3D_asteroid_subdivide/part_pre_meshfem3D.f90 2009-02-26 13:45:48 UTC (rev 14154)
@@ -7,17 +7,21 @@
!-----------------------------------------------
! Creating dual graph (adjacency is defined by 'ncommonnodes' between two elements).
!-----------------------------------------------
- subroutine mesh2dual_ncommonnodes(nelmnts, nnodes, elmnts, xadj, adjncy, nnodes_elmnts, nodes_elmnts, ncommonnodes)
+ subroutine mesh2dual_ncommonnodes(nelmnts, nnodes, nsize, sup_neighbour, elmnts, xadj, adjncy, &
+ nnodes_elmnts, nodes_elmnts, max_neighbour, ncommonnodes)
include './constants_pre_meshfem3D.h'
integer, intent(in) :: nelmnts
integer, intent(in) :: nnodes
+ integer, intent(in) :: nsize
+ integer, intent(in) :: sup_neighbour
integer, dimension(0:esize*nelmnts-1), intent(in) :: elmnts
integer, dimension(0:nelmnts) :: xadj
- integer, dimension(0:max_neighbour*nelmnts-1) :: adjncy
+ integer, dimension(0:sup_neighbour*nelmnts-1) :: adjncy
integer, dimension(0:nnodes-1) :: nnodes_elmnts
integer, dimension(0:nsize*nnodes-1) :: nodes_elmnts
+ integer, intent(out) :: max_neighbour
integer, intent(in) :: ncommonnodes
integer :: i, j, k, l, m, nb_edges
@@ -71,31 +75,33 @@
do m = 0, xadj(nodes_elmnts(k+j*nsize))
if ( .not.is_neighbour ) then
- if ( adjncy(nodes_elmnts(k+j*nsize)*max_neighbour+m) == nodes_elmnts(l+j*nsize) ) then
+ if ( adjncy(nodes_elmnts(k+j*nsize)*sup_neighbour+m) == nodes_elmnts(l+j*nsize) ) then
is_neighbour = .true.
end if
end if
end do
if ( .not.is_neighbour ) then
- adjncy(nodes_elmnts(k+j*nsize)*max_neighbour+xadj(nodes_elmnts(k+j*nsize))) = nodes_elmnts(l+j*nsize)
+ adjncy(nodes_elmnts(k+j*nsize)*sup_neighbour+xadj(nodes_elmnts(k+j*nsize))) = nodes_elmnts(l+j*nsize)
xadj(nodes_elmnts(k+j*nsize)) = xadj(nodes_elmnts(k+j*nsize)) + 1
- if (xadj(nodes_elmnts(k+j*nsize))>max_neighbour) stop 'ERROR : increase max_neighbour or modify the mesh.'
- adjncy(nodes_elmnts(l+j*nsize)*max_neighbour+xadj(nodes_elmnts(l+j*nsize))) = nodes_elmnts(k+j*nsize)
+ if (xadj(nodes_elmnts(k+j*nsize))>sup_neighbour) stop 'ERROR : too much neighbours per element, modify the mesh.'
+ adjncy(nodes_elmnts(l+j*nsize)*sup_neighbour+xadj(nodes_elmnts(l+j*nsize))) = nodes_elmnts(k+j*nsize)
xadj(nodes_elmnts(l+j*nsize)) = xadj(nodes_elmnts(l+j*nsize)) + 1
- if (xadj(nodes_elmnts(l+j*nsize))>max_neighbour) stop 'ERROR : increase max_neighbour or modify the mesh.'
+ if (xadj(nodes_elmnts(l+j*nsize))>sup_neighbour) stop 'ERROR : too much neighbours per element, modify the mesh.'
end if
end if
end do
end do
end do
+
+ max_neighbour = maxval(xadj)
! making adjacency arrays compact (to be used for partitioning)
do i = 0, nelmnts-1
k = xadj(i)
xadj(i) = nb_edges
do j = 0, k-1
- adjncy(nb_edges) = adjncy(i*max_neighbour+j)
+ adjncy(nb_edges) = adjncy(i*sup_neighbour+j)
nb_edges = nb_edges + 1
end do
end do
@@ -145,12 +151,12 @@
!--------------------------------------------------
! construct local numbering for the nodes in each partition
!--------------------------------------------------
- subroutine Construct_glob2loc_nodes(nelmnts, nnodes, nnodes_elmnts, nodes_elmnts, part, nparts, &
+ subroutine Construct_glob2loc_nodes(nelmnts, nnodes, nsize, nnodes_elmnts, nodes_elmnts, part, nparts, &
glob2loc_nodes_nparts, glob2loc_nodes_parts, glob2loc_nodes)
include './constants_pre_meshfem3D.h'
- integer, intent(in) :: nelmnts, nnodes, nparts
+ integer, intent(in) :: nelmnts, nnodes, nparts, nsize
integer, dimension(0:nelmnts-1), intent(in) :: part
integer, dimension(0:nnodes-1), intent(in) :: nnodes_elmnts
integer, dimension(0:nsize*nnodes-1), intent(in) :: nodes_elmnts
@@ -231,16 +237,16 @@
! 5/ second node, if relevant.
! No interface between acoustic and elastic elements.
!--------------------------------------------------
- subroutine Construct_interfaces(nelmnts, nparts, part, elmnts, xadj, adjncy, tab_interfaces, &
- tab_size_interfaces, ninterfaces, nb_materials, cs_material, num_material)
+ subroutine Construct_interfaces(nelmnts, nparts, sup_neighbour, part, elmnts, xadj, adjncy, &
+ tab_interfaces, tab_size_interfaces, ninterfaces, nb_materials, cs_material, num_material)
include './constants_pre_meshfem3D.h'
- integer, intent(in) :: nelmnts, nparts
+ integer, intent(in) :: nelmnts, nparts, sup_neighbour
integer, dimension(0:nelmnts-1), intent(in) :: part
integer, dimension(0:esize*nelmnts-1), intent(in) :: elmnts
integer, dimension(0:nelmnts), intent(in) :: xadj
- integer, dimension(0:max_neighbour*nelmnts-1), intent(in) :: adjncy
+ integer, dimension(0:sup_neighbour*nelmnts-1), intent(in) :: adjncy
integer, dimension(:),pointer :: tab_size_interfaces, tab_interfaces
integer, intent(out) :: ninterfaces
integer, dimension(1:nelmnts), intent(in) :: num_material
Modified: seismo/3D/SPECFEM3D_SESAME/trunk/UTILS/external_mesh/pre_meshfem3D_asteroid_subdivide/pre_meshfem3D.f90
===================================================================
--- seismo/3D/SPECFEM3D_SESAME/trunk/UTILS/external_mesh/pre_meshfem3D_asteroid_subdivide/pre_meshfem3D.f90 2009-02-26 01:06:59 UTC (rev 14153)
+++ seismo/3D/SPECFEM3D_SESAME/trunk/UTILS/external_mesh/pre_meshfem3D_asteroid_subdivide/pre_meshfem3D.f90 2009-02-26 13:45:48 UTC (rev 14154)
@@ -10,7 +10,7 @@
!!!!
- integer, parameter :: nparts=96
+ integer, parameter :: nparts=2
integer :: nspec
@@ -44,7 +44,8 @@
integer :: nb_materials
double precision, dimension(:), allocatable :: cs
integer, dimension(:), allocatable :: num_material
-
+
+ integer :: nsize ! Max number of elements that contain the same node.
integer :: edgecut
integer :: nb_edges
@@ -52,6 +53,8 @@
integer :: wgtflag
integer :: num_start
integer :: ngnod
+ integer :: max_neighbour ! Real maximum number of neighbours per element
+ integer :: sup_neighbour ! Majoration of the maximum number of neighbours per element
integer :: ipart, nnodes_loc, nspec_loc
character(len=256) :: prname
@@ -107,25 +110,33 @@
used_nodes_elmnts(elmnts(inode,ispec)) = used_nodes_elmnts(elmnts(inode,ispec)) + 1
enddo
enddo
+ !PLL
+ nsize = maxval(used_nodes_elmnts(:))
+ sup_neighbour = ngnod * nsize - (ngnod + (ngnod/2 - 1)*nfaces)
+ print*, 'nsize = ',nsize, 'sup_neighbour = ', sup_neighbour
+
print *, minval(used_nodes_elmnts(:)), maxval(used_nodes_elmnts(:))
do inode = 1, nnodes
if (.not. mask_nodes_elmnts(inode)) then
- stop('ERROR : nodes not used.')
+ stop 'ERROR : nodes not used.'
endif
enddo
- if (maxval(used_nodes_elmnts(:))>nsize) then
- stop 'ERROR : increase nsize or modify the mesh.'
- endif
+! if (maxval(used_nodes_elmnts(:))>nsize) then
+! stop 'ERROR : increase nsize or modify the mesh.'
+! endif
elmnts(:,:) = elmnts(:,:) - 1
allocate(xadj(1:nspec+1))
- allocate(adjncy(1:max_neighbour*nspec))
+ allocate(adjncy(1:sup_neighbour*nspec))
allocate(nnodes_elmnts(1:nnodes))
allocate(nodes_elmnts(1:nsize*nnodes))
- call mesh2dual_ncommonnodes(nspec, nnodes, elmnts, xadj, adjncy, nnodes_elmnts, nodes_elmnts,1)
+ call mesh2dual_ncommonnodes(nspec, nnodes, nsize, sup_neighbour, elmnts, xadj, adjncy, nnodes_elmnts, &
+ nodes_elmnts, max_neighbour, 1)
+ print*, 'max_neighbour = ',max_neighbour
+
! elmnts(:,:) = elmnts(:,:) + 1
! adjncy(:) = adjncy(:) + 1
! xadj(:) = xadj(:) + 1
@@ -210,7 +221,7 @@
call Construct_glob2loc_elmnts(nspec, part, nparts, glob2loc_elmnts)
! local number of each node for each partition
- call Construct_glob2loc_nodes(nspec, nnodes, nnodes_elmnts, nodes_elmnts, part, nparts, &
+ call Construct_glob2loc_nodes(nspec, nnodes,nsize, nnodes_elmnts, nodes_elmnts, part, nparts, &
glob2loc_nodes_nparts, glob2loc_nodes_parts, glob2loc_nodes)
nb_materials = 1
@@ -219,7 +230,7 @@
cs(:) = 1000.d0
num_material(:) = 1
- call Construct_interfaces(nspec, nparts, part, elmnts, xadj, adjncy, tab_interfaces, &
+ call Construct_interfaces(nspec, nparts, sup_neighbour, part, elmnts, xadj, adjncy, tab_interfaces, &
tab_size_interfaces, ninterfaces, nb_materials, cs, num_material)
allocate(my_interfaces(0:ninterfaces-1))
More information about the CIG-COMMITS
mailing list