[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