[cig-commits] r20216 - seismo/3D/FAULT_SOURCE/branches/new_fault_db/src

surendra at geodynamics.org surendra at geodynamics.org
Mon May 28 22:59:26 PDT 2012


Author: surendra
Date: 2012-05-28 22:59:26 -0700 (Mon, 28 May 2012)
New Revision: 20216

Modified:
   seismo/3D/FAULT_SOURCE/branches/new_fault_db/src/fault_solver.f90
Log:
Parallelized fault time-series output

Modified: seismo/3D/FAULT_SOURCE/branches/new_fault_db/src/fault_solver.f90
===================================================================
--- seismo/3D/FAULT_SOURCE/branches/new_fault_db/src/fault_solver.f90	2012-05-29 02:10:05 UTC (rev 20215)
+++ seismo/3D/FAULT_SOURCE/branches/new_fault_db/src/fault_solver.f90	2012-05-29 05:59:26 UTC (rev 20216)
@@ -39,8 +39,12 @@
   ! outputs on selected fault nodes at every time step:
   ! slip, slip velocity, fault stresses
   type dataT_type
-    integer                                    :: npoin
+    integer                                    :: npoin,npoin_local
     integer, dimension(:), pointer             :: iglob   ! on-fault global index of output nodes
+    integer, dimension(:,:), pointer             :: iglob_all
+    integer, dimension(:), pointer             :: islice,glob_indx
+    real(kind=CUSTOM_REAL), dimension(:), pointer  :: dist
+    real(kind=CUSTOM_REAL), dimension(:,:), pointer  :: dist_all
     real(kind=CUSTOM_REAL), dimension(:,:), pointer  :: d1,v1,t1,d2,v2,t2,t3,theta
     character(len=70), dimension(:), pointer   :: name
   end type dataT_type
@@ -958,7 +962,7 @@
   ! write dataXZ every NSNAP time step
   if ( mod(it,NSNAP) == 0) then
     if(.NOT. PARALLEL_FAULT) then
-      call write_dataXZ(bc%dataXZ,it,iflt)
+      if(bc%nspec > 0) call write_dataXZ(bc%dataXZ,it,iflt)
     else
       call gather_dataXZ(bc)
       if(myrank==0) call write_dataXZ(bc%dataXZ_all,it,iflt)
@@ -1166,6 +1170,7 @@
 !===============================================================
 ! OUTPUTS
 subroutine init_dataT(DataT,coord,nglob,NT,iflt)
+  use specfem_par, only : NPROC,myrank
   ! NT = total number of time steps
 
   integer, intent(in) :: nglob,NT,iflt
@@ -1176,6 +1181,8 @@
   integer :: i, iglob , IIN, ier, jflt, np, k
   character(len=70) :: tmpname
 
+  integer :: ipoin, ipoin_local, iproc
+
   !  1. read fault output coordinates from user file, 
   !  2. define iglob: the fault global index of the node nearest to user
   !     requested coordinate
@@ -1194,6 +1201,7 @@
 
   allocate(DataT%iglob(DataT%npoin))
   allocate(DataT%name(DataT%npoin))
+  allocate(DataT%dist(DataT%npoin)) !Surendra : for parallel fault
 
   open(IIN,file='DATA/FAULT/FAULT_STATIONS',status='old',action='read',iostat=ier)
   if( ier /= 0 ) stop 'error opening FAULT_STATIONS file'
@@ -1216,8 +1224,43 @@
         DataT%iglob(k) = iglob   
       endif
     enddo
+    DataT%dist(k) = distkeep !Surendra : for parallel fault
   enddo
 
+ !Surendra : for Parallel fault
+  if(PARALLEL_FAULT) then
+    allocate(DataT%islice(DataT%npoin)) 
+    allocate(DataT%iglob_all(DataT%npoin,0:NPROC-1))
+    allocate(DataT%dist_all(DataT%npoin,0:NPROC-1))
+    call gather_all_i(DataT%iglob,DataT%npoin,DataT%iglob_all,DataT%npoin,NPROC)
+    call gather_all_cr(DataT%dist,DataT%npoin,DataT%dist_all,DataT%npoin,NPROC)
+    if(myrank==0) then
+      do ipoin = 1,DataT%npoin
+        iproc = minloc(DataT%dist_all(ipoin,:), 1) - 1
+        DataT%islice(ipoin) = iproc
+        DataT%iglob(ipoin) = DataT%iglob_all(ipoin,iproc)
+      enddo
+    endif
+
+    call bcast_all_i(DataT%islice,DataT%npoin)
+    call bcast_all_i(DataT%iglob,DataT%npoin)
+
+    DataT%npoin_local = 0
+    do ipoin = 1,DataT%npoin
+      if(myrank == DataT%islice(ipoin)) DataT%npoin_local = DataT%npoin_local + 1
+    enddo
+    allocate(DataT%glob_indx(DataT%npoin_local)) 
+    do ipoin = 1,DataT%npoin
+      if(myrank == DataT%islice(ipoin)) then
+        ipoin_local = ipoin_local + 1
+        DataT%glob_indx(ipoin_local) = ipoin
+      endif
+    enddo
+  else
+    DataT%npoin_local = DataT%npoin
+  endif !Parallel_fault
+
+
   !  3. allocate arrays and set to zero
   allocate(DataT%d1(NT,DataT%npoin))
   allocate(DataT%v1(NT,DataT%npoin))
@@ -1248,9 +1291,14 @@
   real(kind=CUSTOM_REAL), dimension(:), intent(in) :: theta
   integer, intent(in) :: itime
 
-  integer :: i,k
+  integer :: i,k,ipoin
 
-  do i=1,dataT%npoin
+  do ipoin=1,dataT%npoin_local
+    if (PARALLEL_FAULT) then
+      i = DataT%glob_indx(ipoin)
+    else
+      i = ipoin
+    endif
     k = dataT%iglob(i)
     dataT%d1(itime,i) = d(1,k)
     dataT%d2(itime,i) = d(2,k)
@@ -1285,7 +1333,7 @@
   real(kind=CUSTOM_REAL), intent(in) :: DT
   integer, intent(in) :: NT
 
-  integer   :: i,k,IOUT
+  integer   :: i,k,IOUT,ipoin
   character :: NTchar*5
   integer ::  today(3), now(3)
 
@@ -1298,7 +1346,12 @@
   NTchar = adjustl(NTchar)
 
 1 format(I5)  
-  do i=1,dataT%npoin
+  do ipoin=1,dataT%npoin_local
+    if (PARALLEL_FAULT) then
+      i = DataT%glob_indx(ipoin)
+    else
+      i = ipoin
+    endif
 
     open(IOUT,file='OUTPUT_FILES/'//trim(dataT%name(i))//'.dat',status='replace')
     write(IOUT,*) "# problem=TPV102"



More information about the CIG-COMMITS mailing list