[cig-commits] [commit] devel: fixed three warnings / errors from the gfortran compiler about undefined behavior when aggressive loop vectorization is used by the compiler (026de77)

cig_noreply at geodynamics.org cig_noreply at geodynamics.org
Wed Apr 9 08:57:25 PDT 2014


Repository : ssh://geoshell/specfem3d_globe

On branch  : devel
Link       : https://github.com/geodynamics/specfem3d_globe/compare/64e1b38f0c5ebb4056cce0b15d41c0b9f94ab6e5...099a4d330d5b173b21e51ad441f9f429e5d37842

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

commit 026de779d7e5d88be0c2d7f504594b682ac0968c
Author: Dimitri Komatitsch <komatitsch at lma.cnrs-mrs.fr>
Date:   Tue Apr 8 02:49:31 2014 +0200

    fixed three warnings / errors from the gfortran compiler about undefined behavior when aggressive loop vectorization is used by the compiler


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

026de779d7e5d88be0c2d7f504594b682ac0968c
 src/specfem3D/compute_kernels.F90    | 47 +++++++++++++++++++++++++++++++++---
 src/specfem3D/prepare_timerun.f90    |  3 ++-
 src/specfem3D/save_kernels.f90       | 43 +++++++++++++++++++++++++--------
 src/specfem3D/specfem3D_par.F90      |  8 +++---
 src/specfem3D/write_movie_volume.f90 | 21 ++++++++++++----
 5 files changed, 97 insertions(+), 25 deletions(-)

diff --git a/src/specfem3D/compute_kernels.F90 b/src/specfem3D/compute_kernels.F90
index 5538bee..bc7740e 100644
--- a/src/specfem3D/compute_kernels.F90
+++ b/src/specfem3D/compute_kernels.F90
@@ -32,13 +32,20 @@
   use specfem_par_innercore
   use specfem_par_outercore
   use specfem_par_movie
+
   implicit none
 
   ! crust mantle
   call compute_kernels_crust_mantle()
 
   ! outer core
-  call compute_kernels_outer_core()
+  call compute_kernels_outer_core(vector_displ_outer_core,vector_accel_outer_core,b_vector_displ_outer_core, &
+              displ_outer_core,accel_outer_core,b_displ_outer_core,b_accel_outer_core, &
+              rhostore_outer_core,kappavstore_outer_core, &
+              rho_kl_outer_core,alpha_kl_outer_core,beta_kl_outer_core, &
+              xix_outer_core, xiy_outer_core, xiz_outer_core, etax_outer_core, etay_outer_core, etaz_outer_core, &
+              gammax_outer_core, gammay_outer_core, gammaz_outer_core, ibool_outer_core, &
+              nspec_beta_kl_outer_core,deviatoric_outercore)
 
   ! inner core
   call compute_kernels_inner_core()
@@ -241,16 +248,48 @@
 !-------------------------------------------------------------------------------------------------
 !
 
-
-  subroutine compute_kernels_outer_core()
+!! DK DK put the list of parameters back here to avoid a warning / error from the gfortran compiler
+!! DK DK about undefined behavior when aggressive loop vectorization is used by the compiler
+  subroutine compute_kernels_outer_core(vector_displ_outer_core,vector_accel_outer_core,b_vector_displ_outer_core, &
+              displ_outer_core,accel_outer_core,b_displ_outer_core,b_accel_outer_core, &
+              rhostore_outer_core,kappavstore_outer_core, &
+              rho_kl_outer_core,alpha_kl_outer_core,beta_kl_outer_core, &
+              xix_outer_core, xiy_outer_core, xiz_outer_core, etax_outer_core, etay_outer_core, etaz_outer_core, &
+              gammax_outer_core, gammay_outer_core, gammaz_outer_core, ibool_outer_core, &
+              nspec_beta_kl_outer_core,deviatoric_outercore)
 
   use constants_solver
   use specfem_par,only: deltat,hprime_xx,hprime_yy,hprime_zz,myrank
   use specfem_par,only: GPU_MODE,Mesh_pointer
-  use specfem_par_outercore
 
   implicit none
 
+  integer :: nspec_beta_kl_outer_core
+
+  logical :: deviatoric_outercore
+
+  ! velocity potential
+  real(kind=CUSTOM_REAL), dimension(NGLOB_OUTER_CORE) :: displ_outer_core,accel_outer_core
+
+  ! ADJOINT
+  real(kind=CUSTOM_REAL), dimension(NGLOB_OUTER_CORE_ADJOINT) :: b_displ_outer_core,b_accel_outer_core
+
+  real(kind=CUSTOM_REAL), dimension(NDIM,NGLOB_OUTER_CORE_ADJOINT) :: &
+    vector_accel_outer_core,vector_displ_outer_core,b_vector_displ_outer_core
+
+  integer, dimension(NGLLX,NGLLY,NGLLZ,NSPEC_OUTER_CORE) :: ibool_outer_core
+
+  real(kind=CUSTOM_REAL), dimension(NGLLX,NGLLY,NGLLZ,NSPEC_OUTER_CORE) :: &
+    xix_outer_core,xiy_outer_core,xiz_outer_core,&
+    etax_outer_core,etay_outer_core,etaz_outer_core, &
+    gammax_outer_core,gammay_outer_core,gammaz_outer_core
+
+  real(kind=CUSTOM_REAL), dimension(NGLLX,NGLLY,NGLLZ,NSPEC_OUTER_CORE) :: rhostore_outer_core,kappavstore_outer_core
+
+  ! adjoint kernels
+  real(kind=CUSTOM_REAL), dimension(NGLLX,NGLLY,NGLLZ,NSPEC_OUTER_CORE_ADJOINT) :: rho_kl_outer_core,alpha_kl_outer_core
+  real(kind=CUSTOM_REAL), dimension(NGLLX,NGLLY,NGLLZ,nspec_beta_kl_outer_core) :: beta_kl_outer_core
+
   ! local parameters
   real(kind=CUSTOM_REAL) :: xixl,xiyl,xizl,etaxl,etayl,etazl,gammaxl,gammayl,gammazl,kappal
   real(kind=CUSTOM_REAL) :: tempx1l,tempx2l,tempx3l
diff --git a/src/specfem3D/prepare_timerun.f90 b/src/specfem3D/prepare_timerun.f90
index 25aa9c1..099dbf3 100644
--- a/src/specfem3D/prepare_timerun.f90
+++ b/src/specfem3D/prepare_timerun.f90
@@ -607,7 +607,8 @@
   allocate(nu_3dmovie(3,3,npoints_3dmovie),stat=ier)
   if( ier /= 0 ) call exit_MPI(myrank,'error allocating nu for 3d movie')
 
-  call write_movie_volume_mesh()
+  call write_movie_volume_mesh(nu_3dmovie,num_ibool_3dmovie,mask_3dmovie,mask_ibool, &
+                                          muvstore_crust_mantle_3dmovie,npoints_3dmovie)
 
   if(myrank == 0) then
     write(IMAIN,*)
diff --git a/src/specfem3D/save_kernels.f90 b/src/specfem3D/save_kernels.f90
index c16d9fb..d32a847 100644
--- a/src/specfem3D/save_kernels.f90
+++ b/src/specfem3D/save_kernels.f90
@@ -27,12 +27,17 @@
 
   subroutine save_kernels()
 
-  use constants_solver,only: SAVE_BOUNDARY_MESH
+  use constants_solver, only: SAVE_BOUNDARY_MESH
 
-  use specfem_par,only: NOISE_TOMOGRAPHY,SIMULATION_TYPE,nrec_local, &
+  use specfem_par, only: NOISE_TOMOGRAPHY,SIMULATION_TYPE,nrec_local, &
     APPROXIMATE_HESS_KL,SAVE_REGULAR_KL, &
     current_adios_handle,ADIOS_ENABLED,ADIOS_FOR_KERNELS
 
+  use specfem_par_innercore, only: rhostore_inner_core,muvstore_inner_core,kappavstore_inner_core, &
+    rho_kl_inner_core,alpha_kl_inner_core,beta_kl_inner_core
+
+  use specfem_par_outercore, only: rhostore_outer_core,kappavstore_outer_core,rho_kl_outer_core,alpha_kl_outer_core
+
   implicit none
 
   ! Open an handler to the ADIOS file in which kernel variables are written.
@@ -56,10 +61,11 @@
     endif
 
     ! outer core
-    call save_kernels_outer_core()
+    call save_kernels_outer_core(rhostore_outer_core,kappavstore_outer_core,rho_kl_outer_core,alpha_kl_outer_core)
 
     ! inner core
-    call save_kernels_inner_core()
+    call save_kernels_inner_core(rhostore_inner_core,muvstore_inner_core,kappavstore_inner_core, &
+                                     rho_kl_inner_core,alpha_kl_inner_core,beta_kl_inner_core)
 
     ! boundary kernel
     if (SAVE_BOUNDARY_MESH) then
@@ -509,19 +515,25 @@
 !-------------------------------------------------------------------------------------------------
 !
 
-  subroutine save_kernels_outer_core()
+!! DK DK put the list of parameters back here to avoid a warning / error from the gfortran compiler
+!! DK DK about undefined behavior when aggressive loop vectorization is used by the compiler
+  subroutine save_kernels_outer_core(rhostore_outer_core,kappavstore_outer_core,rho_kl_outer_core,alpha_kl_outer_core)
 
   use specfem_par
-  use specfem_par_outercore
 
   implicit none
 
+  real(kind=CUSTOM_REAL), dimension(NGLLX,NGLLY,NGLLZ,NSPEC_OUTER_CORE) :: rhostore_outer_core,kappavstore_outer_core
+
+  ! adjoint kernels
+  real(kind=CUSTOM_REAL), dimension(NGLLX,NGLLY,NGLLZ,NSPEC_OUTER_CORE_ADJOINT) :: rho_kl_outer_core,alpha_kl_outer_core
+
   ! local parameters
   real(kind=CUSTOM_REAL):: scale_kl
   real(kind=CUSTOM_REAL) :: rhol,kappal,rho_kl,alpha_kl
   integer :: ispec,i,j,k
 
-  scale_kl = scale_t/scale_displ * 1.d9
+  scale_kl = scale_t / scale_displ * 1.d9
 
   ! outer_core
   do ispec = 1, NSPEC_OUTER_CORE
@@ -561,19 +573,30 @@
 !-------------------------------------------------------------------------------------------------
 !
 
-  subroutine save_kernels_inner_core()
+!! DK DK put the list of parameters back here to avoid a warning / error from the gfortran compiler
+!! DK DK about undefined behavior when aggressive loop vectorization is used by the compiler
+  subroutine save_kernels_inner_core(rhostore_inner_core,muvstore_inner_core,kappavstore_inner_core, &
+                                     rho_kl_inner_core,alpha_kl_inner_core,beta_kl_inner_core)
 
   use specfem_par
-  use specfem_par_innercore
 
   implicit none
 
+  ! material parameters
+  ! (note: muvstore also needed for attenuation in case of anisotropic inner core)
+  real(kind=CUSTOM_REAL), dimension(NGLLX,NGLLY,NGLLZ,NSPEC_INNER_CORE) :: &
+    rhostore_inner_core,kappavstore_inner_core,muvstore_inner_core
+
+  ! adjoint kernels
+  real(kind=CUSTOM_REAL), dimension(NGLLX,NGLLY,NGLLZ,NSPEC_INNER_CORE_ADJOINT) :: &
+    rho_kl_inner_core,beta_kl_inner_core, alpha_kl_inner_core
+
   ! local parameters
   real(kind=CUSTOM_REAL):: scale_kl
   real(kind=CUSTOM_REAL) :: rhol,mul,kappal,rho_kl,alpha_kl,beta_kl
   integer :: ispec,i,j,k
 
-  scale_kl = scale_t/scale_displ * 1.d9
+  scale_kl = scale_t / scale_displ * 1.d9
 
   ! inner_core
   do ispec = 1, NSPEC_INNER_CORE
diff --git a/src/specfem3D/specfem3D_par.F90 b/src/specfem3D/specfem3D_par.F90
index 2557c4f..a728ca6 100644
--- a/src/specfem3D/specfem3D_par.F90
+++ b/src/specfem3D/specfem3D_par.F90
@@ -627,8 +627,7 @@ module specfem_par_outercore
   real(kind=CUSTOM_REAL), dimension(NGLOB_OUTER_CORE) :: &
     xstore_outer_core,ystore_outer_core,zstore_outer_core
 
-  real(kind=CUSTOM_REAL), dimension(NGLLX,NGLLY,NGLLZ,NSPEC_OUTER_CORE) :: &
-    rhostore_outer_core,kappavstore_outer_core
+  real(kind=CUSTOM_REAL), dimension(NGLLX,NGLLY,NGLLZ,NSPEC_OUTER_CORE) :: rhostore_outer_core,kappavstore_outer_core
 
   ! mass matrix
   real(kind=CUSTOM_REAL), dimension(NGLOB_OUTER_CORE), target :: rmass_outer_core
@@ -686,13 +685,12 @@ module specfem_par_outercore
   real(kind=CUSTOM_REAL), dimension(NGLLX,NGLLZ,NSPEC2DMAX_YMIN_YMAX_OC) :: jacobian2D_ymin_outer_core,jacobian2D_ymax_outer_core
 
   ! adjoint kernels
-  real(kind=CUSTOM_REAL), dimension(NGLLX,NGLLY,NGLLZ,NSPEC_OUTER_CORE_ADJOINT) :: &
-    rho_kl_outer_core,alpha_kl_outer_core
+  real(kind=CUSTOM_REAL), dimension(NGLLX,NGLLY,NGLLZ,NSPEC_OUTER_CORE_ADJOINT) :: rho_kl_outer_core,alpha_kl_outer_core
 
   ! check for deviatoric kernel for outer core region
   real(kind=CUSTOM_REAL), dimension(:,:,:,:),allocatable :: beta_kl_outer_core
   integer :: nspec_beta_kl_outer_core
-  logical,parameter:: deviatoric_outercore = .false.
+  logical, parameter :: deviatoric_outercore = .false.
 
   ! inner / outer elements outer core region
   integer :: num_phase_ispec_outer_core
diff --git a/src/specfem3D/write_movie_volume.f90 b/src/specfem3D/write_movie_volume.f90
index d725f0b..6936aeb 100644
--- a/src/specfem3D/write_movie_volume.f90
+++ b/src/specfem3D/write_movie_volume.f90
@@ -149,16 +149,26 @@
 !-------------------------------------------------------------------------------------------------
 !
 
-  subroutine write_movie_volume_mesh()
+!! DK DK put the list of parameters back here to avoid a warning / error from the gfortran compiler
+!! DK DK about undefined behavior when aggressive loop vectorization is used by the compiler
+  subroutine write_movie_volume_mesh(nu_3dmovie,num_ibool_3dmovie,mask_3dmovie,mask_ibool, &
+                                          muvstore_crust_mantle_3dmovie,npoints_3dmovie)
 
 ! writes meshfiles to merge with solver snapshots for 3D volume movies.  Also computes and outputs
 ! the rotation matrix nu_3dmovie required to transfer to a geographic coordinate system
 
   use specfem_par
   use specfem_par_crustmantle
-  use specfem_par_movie
+
   implicit none
 
+  integer :: npoints_3dmovie
+  integer, dimension(NGLOB_CRUST_MANTLE_3DMOVIE) :: num_ibool_3dmovie
+  real(kind=CUSTOM_REAL), dimension(3,3,npoints_3dmovie) :: nu_3dmovie
+  logical, dimension(NGLLX,NGLLY,NGLLZ,NSPEC_CRUST_MANTLE_3DMOVIE) :: mask_3dmovie
+  real(kind=CUSTOM_REAL), dimension(NGLLX,NGLLY,NGLLZ,NSPEC_CRUST_MANTLE_3DMOVIE) :: muvstore_crust_mantle_3dmovie
+  logical, dimension(NGLOB_CRUST_MANTLE_3DMOVIE) :: mask_ibool
+
   ! local parametes
   integer :: ipoints_3dmovie,ispecele,ispec,i,j,k
   integer :: iglob,iglob1,iglob2,iglob3,iglob4,iglob5,iglob6,iglob7,iglob8
@@ -176,8 +186,9 @@
     iNIT = 1
   endif
 
-  ! loops over all elements
   ipoints_3dmovie = 0
+
+  ! loops over all elements
   do ispec = 1,NSPEC_CRUST_MANTLE
 
     do k = 1,NGLLZ,iNIT
@@ -323,8 +334,7 @@
     epsilondev_xx_crust_mantle,epsilondev_yy_crust_mantle,epsilondev_xy_crust_mantle, &
     epsilondev_xz_crust_mantle,epsilondev_yz_crust_mantle
 
-  real(kind=CUSTOM_REAL), dimension(NGLLX,NGLLY,NGLLZ,NSPEC_CRUST_MANTLE_3DMOVIE) :: &
-    muvstore_crust_mantle_3dmovie
+  real(kind=CUSTOM_REAL), dimension(NGLLX,NGLLY,NGLLZ,NSPEC_CRUST_MANTLE_3DMOVIE) :: muvstore_crust_mantle_3dmovie
 
   logical, dimension(NGLLX,NGLLY,NGLLZ,NSPEC_CRUST_MANTLE_3DMOVIE) :: mask_3dmovie
 
@@ -362,6 +372,7 @@
   else if(MOVIE_VOLUME_TYPE == 3) then
     movie_prefix='P' ! potency, or integral of strain x \mu
   endif
+
   if(MOVIE_COARSE) then
    iNIT = NGLLX-1
   else



More information about the CIG-COMMITS mailing list