[cig-commits] [commit] devel, master: Added parallel netcdf kernel write for CEM. (f90eb91)

cig_noreply at geodynamics.org cig_noreply at geodynamics.org
Thu Nov 6 08:31:48 PST 2014


Repository : https://github.com/geodynamics/specfem3d_globe

On branches: devel,master
Link       : https://github.com/geodynamics/specfem3d_globe/compare/bc58e579b3b0838a0968725a076f5904845437ca...be63f20cbb6f462104e949894dbe205d2398cd7f

>---------------------------------------------------------------

commit f90eb9158cf23ae04831c668f8c114fcdb427fee
Author: Michael Afanasiev <michael.afanasiev at erdw.ethz.ch>
Date:   Tue Sep 23 15:19:21 2014 +0200

    Added parallel netcdf kernel write for CEM.


>---------------------------------------------------------------

f90eb9158cf23ae04831c668f8c114fcdb427fee
 src/specfem3D/read_write_netcdf.f90 | 58 ++++++++++++++++++++++++++++++++-----
 src/specfem3D/save_kernels.F90      |  8 ++++-
 2 files changed, 58 insertions(+), 8 deletions(-)

diff --git a/src/specfem3D/read_write_netcdf.f90 b/src/specfem3D/read_write_netcdf.f90
index 639e705..7f66816 100644
--- a/src/specfem3D/read_write_netcdf.f90
+++ b/src/specfem3D/read_write_netcdf.f90
@@ -1,5 +1,7 @@
 subroutine write_kernel_netcdf (fName, param)
   
+  ! This guy converts the kernels to global numbering, and writes to a NetCDF file in parallel.
+  
   use :: mpi
   use :: netcdf
   use :: specfem_par
@@ -14,14 +16,25 @@ subroutine write_kernel_netcdf (fName, param)
   real (kind=CUSTOM_REAL), dimension (:), allocatable :: paramUnpacked
   real (kind=CUSTOM_REAL), dimension (NGLLX, NGLLY, NGLLZ, NSPEC_CRUST_MANTLE) :: param
   
-  integer, parameter :: shuOn=1
-  integer, parameter :: comLvl=9
-  integer, parameter :: comOn=1
-  integer            :: ncid, stat
-  integer            :: i, j, k, ispec, iglob
+  integer, parameter         :: NDIMS=2  
+  integer, parameter         :: shuOn=1
+  integer, parameter         :: comLvl=9
+  integer, parameter         :: comOn=1
+                            
+  integer                    :: ncid, stat
+  integer                    :: i, j, k, ispec, iglob
+  integer                    :: commWorldSize
+  integer                    :: procDimId, kernDimId, varId
+  
+  integer, dimension (NDIMS) :: start, count, ids
+  
+  ! Get the total number of processors.
+  call world_size (commWorldSize)
   
+  ! Allocate the kernel dump array.
   allocate (paramUnpacked (NGLOB_CRUST_MANTLE))
   
+  ! Convert kernels to global numbering.
   do ispec = 1, NSPEC_CRUST_MANTLE
     do k = 1, NGLLZ
       do j = 1, NGLLY
@@ -35,13 +48,44 @@ subroutine write_kernel_netcdf (fName, param)
     end do
   end do
   
-  call checkNC ( nf90_create (fName, IOR(NF90_NETCDF4, NF90_MPIIO), ncid, &
+  ! Create the parallel NetCDF file.
+  call checkNC (nf90_create (fName, IOR(NF90_NETCDF4, NF90_MPIIO), ncid, &
     comm = MPI_COMM_WORLD, info = MPI_INFO_NULL))
     
+  ! Define the processor array.
+  call checkNC (nf90_def_dim (ncid, 'glob', NGLOB_CRUST_MANTLE, kernDimId))
+  call checkNC (nf90_def_dim (ncid, 'proc', commWorldSize, procDimID))
+  
+  ! Sort ids into array.
+  ids = (/ kernDimID, procDimID /)
+  
+  ! Define the kernel variable.
+  call checkNC (nf90_def_var (ncid, 'rawKernel', NF90_float, ids, varId))
+  
+  ! Deflate (compress) the variable. Doesn't work in parallel.
+  ! call checkNC (nf90_def_var_deflate (ncid, varId, shuOn, comOn, comLvl))
+  
+  ! End definition.
+  call checkNC (nf90_enddef (ncid))
+  
+  ! Each processor writes one row.
+  start = (/ 1, myRank + 1 /)
+  count = (/ NGLOB_CRUST_MANTLE, 1 /)
+  call checkNC (nf90_put_var (ncid, varId, paramUnpacked, start = start, count = count))
+  
+  ! Close the netcdf file.
+  call checkNC (nf90_close (ncid))
+  
+  ! Deallocate the kernel dump array.
+  deallocate (paramUnpacked)
+  
 end subroutine write_kernel_netcdf
 
 subroutine checkNC (status)
   
+  ! This little guy just checks for an error from the NetCDF libraries and throws a tantrum if
+  ! one's found.
+  
   use :: netcdf
   
   implicit none
@@ -50,7 +94,7 @@ subroutine checkNC (status)
   
   if (status /= nf90_noerr) then
     print *, trim (nf90_strerror (status))
-    stop 2
+    stop 'Netcdf error.'
   end if
   
 end subroutine checkNC
\ No newline at end of file
diff --git a/src/specfem3D/save_kernels.F90 b/src/specfem3D/save_kernels.F90
index a492754..0ee9e1f 100644
--- a/src/specfem3D/save_kernels.F90
+++ b/src/specfem3D/save_kernels.F90
@@ -435,9 +435,15 @@
         write(IOUT) rho_kl_crust_mantle
         close(IOUT)
 
+        ! Output these kernels as netcdf files -- one per processor.
 #if defined (CEM)
 
-        call write_kernel_netcdf ('alphav_kernel.nc', alphav_kl_crust_mantle)
+        call write_kernel_netcdf ('alphavKernelCrustMantle.nc', alphav_kl_crust_mantle)
+        call write_kernel_netcdf ('alphahKernelCrustMantle.nc', alphah_kl_crust_mantle)
+        call write_kernel_netcdf ('betavKernelCrustMantle.nc',  betav_kl_crust_mantle)
+        call write_kernel_netcdf ('betahKernelCrustMantle.nc',  betah_kl_crust_mantle)
+        call write_kernel_netcdf ('etaKernelCrustMantle.nc',    eta_kl_crust_mantle)
+        call write_kernel_netcdf ('rhoKernelCrustMantle.nc',    rho_kl_crust_mantle)
                 
 #endif
 



More information about the CIG-COMMITS mailing list