[cig-commits] r21803 - in seismo/3D/SPECFEM3D/trunk/src: generate_databases shared specfem3D
lefebvre at geodynamics.org
lefebvre at geodynamics.org
Wed Apr 10 14:16:02 PDT 2013
Author: lefebvre
Date: 2013-04-10 14:16:02 -0700 (Wed, 10 Apr 2013)
New Revision: 21803
Modified:
seismo/3D/SPECFEM3D/trunk/src/generate_databases/model_gll.f90
seismo/3D/SPECFEM3D/trunk/src/shared/constants.h.in
seismo/3D/SPECFEM3D/trunk/src/specfem3D/compute_kernels.f90
seismo/3D/SPECFEM3D/trunk/src/specfem3D/prepare_timerun.F90
seismo/3D/SPECFEM3D/trunk/src/specfem3D/read_mesh_databases.f90
seismo/3D/SPECFEM3D/trunk/src/specfem3D/save_adjoint_kernels.f90
seismo/3D/SPECFEM3D/trunk/src/specfem3D/specfem3D_par.f90
Log:
Merge branch 'full_aniso_kernels_matharu' into the trunk. This includes the anisotropy implementation of Gian.
Modified: seismo/3D/SPECFEM3D/trunk/src/generate_databases/model_gll.f90
===================================================================
--- seismo/3D/SPECFEM3D/trunk/src/generate_databases/model_gll.f90 2013-04-10 20:37:46 UTC (rev 21802)
+++ seismo/3D/SPECFEM3D/trunk/src/generate_databases/model_gll.f90 2013-04-10 21:16:02 UTC (rev 21803)
@@ -49,7 +49,7 @@
character(len=256) :: prname_lp,filename
! processors name
- write(prname_lp,'(a,i6.6,a)') trim(LOCAL_PATH)//'proc',myrank,'_'
+ write(prname_lp,'(a,i6.6,a)') trim(LOCAL_PATH)// '/' //'proc',myrank,'_'
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!! if only vp structure is available (as is often the case in exploration seismology),
Modified: seismo/3D/SPECFEM3D/trunk/src/shared/constants.h.in
===================================================================
--- seismo/3D/SPECFEM3D/trunk/src/shared/constants.h.in 2013-04-10 20:37:46 UTC (rev 21802)
+++ seismo/3D/SPECFEM3D/trunk/src/shared/constants.h.in 2013-04-10 21:16:02 UTC (rev 21803)
@@ -273,6 +273,21 @@
! postprocess the colors to balance them if Droux (1993) algorithm is not used
logical, parameter :: BALANCE_COLORS_SIMPLE_ALGO = .false.
+!!-----------------------------------------------------------
+!!
+!! adjoint kernel outputs
+!!
+!!-----------------------------------------------------------
+
+! this parameter must be set to .true. to compute anisotropic kernels
+! in crust and mantle (related to the 21 Cij in geographical coordinates)
+! default is .false. to compute isotropic kernels (related to alpha and beta)
+ logical, parameter :: ANISOTROPIC_KL = .false.
+
+! compute transverse isotropic kernels (alpha_v,alpha_h,beta_v,beta_h,eta,rho)
+! rather than fully anisotropic kernels in case ANISOTROPIC_KL is set to .true.
+ logical, parameter :: SAVE_TRANSVERSE_KL = .false.
+
!------------------------------------------------------
!----------- do not modify anything below -------------
!------------------------------------------------------
Modified: seismo/3D/SPECFEM3D/trunk/src/specfem3D/compute_kernels.f90
===================================================================
--- seismo/3D/SPECFEM3D/trunk/src/specfem3D/compute_kernels.f90 2013-04-10 20:37:46 UTC (rev 21802)
+++ seismo/3D/SPECFEM3D/trunk/src/specfem3D/compute_kernels.f90 2013-04-10 21:16:02 UTC (rev 21803)
@@ -74,6 +74,7 @@
implicit none
! local parameters
integer :: i,j,k,ispec,iglob
+ real(kind=CUSTOM_REAL),dimension(21) :: prod !, cijkl_kl_local
real(kind=CUSTOM_REAL), dimension(5) :: epsilondev_loc,b_epsilondev_loc
if( .not. GPU_MODE ) then
@@ -87,22 +88,7 @@
do j = 1, NGLLY
do i = 1, NGLLX
iglob = ibool(i,j,k,ispec)
-
- ! isotropic kernels
- ! note: takes displacement from backward/reconstructed (forward) field b_displ
- ! and acceleration from adjoint field accel (containing adjoint sources)
- !
- ! note: : time integral summation uses deltat
- !
- ! compare with Tromp et al. (2005), eq. (14), which takes adjoint displacement
- ! and forward acceleration, that is the symmetric form of what is calculated here
- ! however, this kernel expression is symmetric with regards
- ! to interchange adjoint - forward field
- rho_kl(i,j,k,ispec) = rho_kl(i,j,k,ispec) &
- + deltat * dot_product(accel(:,iglob), b_displ(:,iglob))
-
- ! kernel for shear modulus, see e.g. Tromp et al. (2005), equation (17)
- ! note: multiplication with 2*mu(x) will be done after the time loop
+
epsilondev_loc(1) = epsilondev_xx(i,j,k,ispec)
epsilondev_loc(2) = epsilondev_yy(i,j,k,ispec)
epsilondev_loc(3) = epsilondev_xy(i,j,k,ispec)
@@ -115,18 +101,46 @@
b_epsilondev_loc(4) = b_epsilondev_xz(i,j,k,ispec)
b_epsilondev_loc(5) = b_epsilondev_yz(i,j,k,ispec)
- mu_kl(i,j,k,ispec) = mu_kl(i,j,k,ispec) &
- + deltat * (epsilondev_loc(1)*b_epsilondev_loc(1) + epsilondev_loc(2)*b_epsilondev_loc(2) &
- + (epsilondev_loc(1)+epsilondev_loc(2)) * (b_epsilondev_loc(1)+b_epsilondev_loc(2)) &
- + 2 * (epsilondev_loc(3)*b_epsilondev_loc(3) + epsilondev_loc(4)*b_epsilondev_loc(4) + &
- epsilondev_loc(5)*b_epsilondev_loc(5)) )
+ rho_kl(i,j,k,ispec) = rho_kl(i,j,k,ispec) &
+ + deltat * dot_product(accel(:,iglob), b_displ(:,iglob))
- ! kernel for bulk modulus, see e.g. Tromp et al. (2005), equation (18)
- ! note: multiplication with kappa(x) will be done after the time loop
- kappa_kl(i,j,k,ispec) = kappa_kl(i,j,k,ispec) &
- + deltat * (9 * epsilon_trace_over_3(i,j,k,ispec) &
- * b_epsilon_trace_over_3(i,j,k,ispec))
+ ! For anisotropic kernels
+ if (ANISOTROPIC_KL) then
+ call compute_strain_product(prod,epsilon_trace_over_3(i,j,k,ispec),epsilondev_loc, &
+ b_epsilon_trace_over_3(i,j,k,ispec),b_epsilondev_loc)
+ cijkl_kl(:,i,j,k,ispec) = cijkl_kl(:,i,j,k,ispec) + deltat * prod(:)
+
+ else
+
+ ! isotropic kernels
+ ! note: takes displacement from backward/reconstructed (forward) field b_displ
+ ! and acceleration from adjoint field accel (containing adjoint sources)
+ !
+ ! and acceleration from adjoint field accel (containing adjoint sources)
+ !
+ ! note: : time integral summation uses deltat
+ !
+ ! compare with Tromp et al. (2005), eq. (14), which takes adjoint displacement
+ ! and forward acceleration, that is the symmetric form of what is calculated here
+ ! however, this kernel expression is symmetric with regards
+ ! to interchange adjoint - forward field
+
+ ! kernel for shear modulus, see e.g. Tromp et al. (2005), equation (17)
+ ! note: multiplication with 2*mu(x) will be done after the time loop
+
+ mu_kl(i,j,k,ispec) = mu_kl(i,j,k,ispec) &
+ + deltat * (epsilondev_loc(1)*b_epsilondev_loc(1) + epsilondev_loc(2)*b_epsilondev_loc(2) &
+ + (epsilondev_loc(1)+epsilondev_loc(2)) * (b_epsilondev_loc(1)+b_epsilondev_loc(2)) &
+ + 2 * (epsilondev_loc(3)*b_epsilondev_loc(3) + epsilondev_loc(4)*b_epsilondev_loc(4) + &
+ epsilondev_loc(5)*b_epsilondev_loc(5)) )
+
+ ! kernel for bulk modulus, see e.g. Tromp et al. (2005), equation (18)
+ ! note: multiplication with kappa(x) will be done after the time loop
+ kappa_kl(i,j,k,ispec) = kappa_kl(i,j,k,ispec) &
+ + deltat * (9 * epsilon_trace_over_3(i,j,k,ispec) &
+ * b_epsilon_trace_over_3(i,j,k,ispec))
+ endif
enddo
enddo
enddo
@@ -426,4 +440,65 @@
end subroutine compute_kernels_hessian
+!-------------------------------------------------------------------------------------------------
+!
+! Subroutine to compute the kernels for the 21 elastic coefficients
+! Last modified 19/04/2007
+!-------------------------------------------------------------------
+ subroutine compute_strain_product(prod,eps_trace_over_3,epsdev,&
+ b_eps_trace_over_3,b_epsdev)
+
+ ! Purpose : compute the 21 strain products at a grid point
+ ! (ispec,i,j,k fixed) and at a time t to compute then the kernels cij_kl (Voigt notation)
+ ! (eq. 15 of Tromp et al., 2005)
+ ! prod(1)=eps11*eps11 -> c11, prod(2)=eps11eps22 -> c12, prod(3)=eps11eps33 -> c13, ...
+ ! prod(7)=eps22*eps22 -> c22, prod(8)=eps22eps33 -> c23, prod(9)=eps22eps23 -> c24, ...
+ ! prod(19)=eps13*eps13 -> c55, prod(20)=eps13eps12 -> c56, prod(21)=eps12eps12 -> c66
+ ! This then gives how the 21 kernels are organized
+ ! For crust_mantle
+
+ ! Modif 09/11/2005
+
+ implicit none
+ include "constants.h"
+
+ real(kind=CUSTOM_REAL),dimension(21) :: prod
+ real(kind=CUSTOM_REAL) :: eps_trace_over_3,b_eps_trace_over_3
+ real(kind=CUSTOM_REAL),dimension(5) :: epsdev,b_epsdev
+ real(kind=CUSTOM_REAL), dimension(6) :: eps,b_eps
+ integer :: p,i,j
+
+ ! Building of the local matrix of the strain tensor
+ ! for the adjoint field and the regular backward field
+ eps(1:2)=epsdev(1:2)+eps_trace_over_3 !eps11 et eps22
+ eps(3)=-(eps(1)+eps(2))+3*eps_trace_over_3 !eps33
+ eps(4)=epsdev(5) !eps23
+ eps(5)=epsdev(4) !eps13
+ eps(6)=epsdev(3) !eps12
+
+ b_eps(1:2)=b_epsdev(1:2)+b_eps_trace_over_3
+ b_eps(3)=-(b_eps(1)+b_eps(2))+3*b_eps_trace_over_3
+ b_eps(4)=b_epsdev(5)
+ b_eps(5)=b_epsdev(4)
+ b_eps(6)=b_epsdev(3)
+
+ ! Computing the 21 strain products without assuming eps(i)*b_eps(j) = eps(j)*b_eps(i)
+ p=1
+ do i=1,6
+ do j=i,6
+ prod(p)=eps(i)*b_eps(j)
+ if(j>i) then
+ prod(p)=prod(p)+eps(j)*b_eps(i)
+ if(j>3 .and. i<4) prod(p)=prod(p)*2
+ endif
+ if(i>3) prod(p)=prod(p)*4
+ p=p+1
+ enddo
+ enddo
+
+ end subroutine compute_strain_product
+
+!
+!-------------------------------------------------------------------------------------------------
+
Modified: seismo/3D/SPECFEM3D/trunk/src/specfem3D/prepare_timerun.F90
===================================================================
--- seismo/3D/SPECFEM3D/trunk/src/specfem3D/prepare_timerun.F90 2013-04-10 20:37:46 UTC (rev 21802)
+++ seismo/3D/SPECFEM3D/trunk/src/specfem3D/prepare_timerun.F90 2013-04-10 21:16:02 UTC (rev 21803)
@@ -833,6 +833,7 @@
rho_kl(:,:,:,:) = 0._CUSTOM_REAL
mu_kl(:,:,:,:) = 0._CUSTOM_REAL
kappa_kl(:,:,:,:) = 0._CUSTOM_REAL
+ cijkl_kl(:,:,:,:,:) = 0._CUSTOM_REAL
if ( APPROXIMATE_HESS_KL ) &
hess_kl(:,:,:,:) = 0._CUSTOM_REAL
Modified: seismo/3D/SPECFEM3D/trunk/src/specfem3D/read_mesh_databases.f90
===================================================================
--- seismo/3D/SPECFEM3D/trunk/src/specfem3D/read_mesh_databases.f90 2013-04-10 20:37:46 UTC (rev 21802)
+++ seismo/3D/SPECFEM3D/trunk/src/specfem3D/read_mesh_databases.f90 2013-04-10 21:16:02 UTC (rev 21803)
@@ -713,6 +713,10 @@
allocate(kappa_kl(NGLLX,NGLLY,NGLLZ,NSPEC_ADJOINT),stat=ier)
if( ier /= 0 ) stop 'error allocating array kappa_kl'
+ ! anisotropic kernels
+ allocate(cijkl_kl(21,NGLLX,NGLLY,NGLLZ,NSPEC_ADJOINT),stat=ier)
+ if( ier /= 0 ) stop 'error allocating array cijkl_kl'
+
! derived kernels
! density prime kernel
allocate(rhop_kl(NGLLX,NGLLY,NGLLZ,NSPEC_ADJOINT),stat=ier)
Modified: seismo/3D/SPECFEM3D/trunk/src/specfem3D/save_adjoint_kernels.f90
===================================================================
--- seismo/3D/SPECFEM3D/trunk/src/specfem3D/save_adjoint_kernels.f90 2013-04-10 20:37:46 UTC (rev 21802)
+++ seismo/3D/SPECFEM3D/trunk/src/specfem3D/save_adjoint_kernels.f90 2013-04-10 21:16:02 UTC (rev 21803)
@@ -159,7 +159,15 @@
! local parameters
integer:: ispec,i,j,k,iglob,ier
real(kind=CUSTOM_REAL) :: rhol,mul,kappal
+ real(kind=CUSTOM_REAL),dimension(21) :: cijkl_kl_local
+ ! Transverse isotropic paramters
+ real(kind=CUSTOM_REAL) :: A,N,C,L,F,eta
+ real(kind=CUSTOM_REAL), dimension(21) :: an_kl
+ real(kind=CUSTOM_REAL), dimension(NGLLX,NGLLY,NGLLZ,NSPEC_ADJOINT):: &
+ alphav_kl,alphah_kl,betav_kl,betah_kl, &
+ eta_kl
+
! finalizes calculation of rhop, beta, alpha kernels
do ispec = 1, NSPEC_AB
@@ -170,41 +178,103 @@
do j = 1, NGLLY
do i = 1, NGLLX
iglob = ibool(i,j,k,ispec)
+
+ ! Store local material values
+ rhol = rho_vs(i,j,k,ispec)*rho_vs(i,j,k,ispec) / mustore(i,j,k,ispec)
+ mul = mustore(i,j,k,ispec)
+ kappal = kappastore(i,j,k,ispec)
- ! isotropic adjoint kernels (see e.g. Tromp et al. 2005)
- rhol = rho_vs(i,j,k,ispec)*rho_vs(i,j,k,ispec) / mustore(i,j,k,ispec)
- mul = mustore(i,j,k,ispec)
- kappal = kappastore(i,j,k,ispec)
+ if (ANISOTROPIC_KL) then
+
+ cijkl_kl_local = - cijkl_kl(:,i,j,k,ispec)
+
+ if (SAVE_TRANSVERSE_KL) then
+
+ ! Computes parameters for an isotropic model
+ A = kappal + FOUR_THIRDS * mul
+ C = A
+ L = mul
+ N = mul
+ F = kappal - 2._CUSTOM_REAL/3._CUSTOM_REAL * mul
+ eta = 1._CUSTOM_REAL
+
+ ! note: cijkl_kl_local() is fully anisotropic C_ij kernel components (non-dimensionalized)
+ ! for GLL point at (i,j,k,ispec)
+
+ ! Purpose : compute the kernels for the An coeffs (an_kl)
+ ! from the kernels for Cij (cijkl_kl_local)
+
+ ! Definition of the input array cij_kl :
+ ! cij_kl(1) = C11 ; cij_kl(2) = C12 ; cij_kl(3) = C13
+ ! cij_kl(4) = C14 ; cij_kl(5) = C15 ; cij_kl(6) = C16
+ ! cij_kl(7) = C22 ; cij_kl(8) = C23 ; cij_kl(9) = C24
+ ! cij_kl(10) = C25 ; cij_kl(11) = C26 ; cij_kl(12) = C33
+ ! cij_kl(13) = C34 ; cij_kl(14) = C35 ; cij_kl(15) = C36
+ ! cij_kl(16) = C44 ; cij_kl(17) = C45 ; cij_kl(18) = C46
+ ! cij_kl(19) = C55 ; cij_kl(20) = C56 ; cij_kl(21) = C66
+ ! where the Cij (Voigt's notation) are defined as function of
+ ! the components of the elastic tensor in spherical coordinates
+ ! by eq. (A.1) of Chen & Tromp, GJI 168 (2007)
+
+ ! From the relations giving Cij in function of An
+ ! Checked with Min Chen's results (routine build_cij)
- ! for a parameterization: (rho,mu,kappa) "primary" kernels
- ! density kernel
- ! multiplies with rho
- rho_kl(i,j,k,ispec) = - rhol * rho_kl(i,j,k,ispec)
+ an_kl(1) = cijkl_kl_local(1)+cijkl_kl_local(2)+cijkl_kl_local(7) !A
+ an_kl(2) = cijkl_kl_local(12) !C
+ an_kl(3) = -2*cijkl_kl_local(2)+cijkl_kl_local(21) !N
+ an_kl(4) = cijkl_kl_local(16)+cijkl_kl_local(19) !L
+ an_kl(5) = cijkl_kl_local(3)+cijkl_kl_local(8) !F
+
+ ! for parameterization: ( alpha_v, alpha_h, beta_v, beta_h, eta, rho )
+ ! K_alpha_v
+ alphav_kl(i,j,k,ispec) = 2*C*an_kl(2)
+ ! K_alpha_h
+ alphah_kl(i,j,k,ispec) = 2*A*an_kl(1) + 2*A*eta*an_kl(5)
+ ! K_beta_v
+ betav_kl(i,j,k,ispec) = 2*L*an_kl(4) - 4*L*eta*an_kl(5)
+ ! K_beta_h
+ betah_kl(i,j,k,ispec) = 2*N*an_kl(3)
+ ! K_eta
+ eta_kl(i,j,k,ispec) = F*an_kl(5)
- ! shear modulus kernel
- mu_kl(i,j,k,ispec) = - 2._CUSTOM_REAL * mul * mu_kl(i,j,k,ispec)
+ ! to check: isotropic kernels from transverse isotropic ones
+ alpha_kl(i,j,k,ispec) = alphav_kl(i,j,k,ispec) &
+ + alphah_kl(i,j,k,ispec)
+ beta_kl(i,j,k,ispec) = betav_kl(i,j,k,ispec) &
+ + betah_kl(i,j,k,ispec)
- ! bulk modulus kernel
- kappa_kl(i,j,k,ispec) = - kappal * kappa_kl(i,j,k,ispec)
+ endif ! SAVE_TRANSVERSE_KL
- ! for a parameterization: (rho,alpha,beta)
- ! density prime kernel
- rhop_kl(i,j,k,ispec) = rho_kl(i,j,k,ispec) + kappa_kl(i,j,k,ispec) + mu_kl(i,j,k,ispec)
+ else
+
+ ! isotropic kernels
- ! vs kernel
- beta_kl(i,j,k,ispec) = 2._CUSTOM_REAL * (mu_kl(i,j,k,ispec) &
- - 4._CUSTOM_REAL * mul / (3._CUSTOM_REAL * kappal) * kappa_kl(i,j,k,ispec))
+ ! isotropic adjoint kernels (see e.g. Tromp et al. 2005)
+ ! for a parameterization: (rho,mu,kappa) "primary" kernels
+ ! density kernel
+ ! multiplies with rho
+ rho_kl(i,j,k,ispec) = - rhol * rho_kl(i,j,k,ispec)
- ! vp kernel
- alpha_kl(i,j,k,ispec) = 2._CUSTOM_REAL * (1._CUSTOM_REAL &
- + 4._CUSTOM_REAL * mul / (3._CUSTOM_REAL * kappal) ) * kappa_kl(i,j,k,ispec)
+ ! shear modulus kernel
+ mu_kl(i,j,k,ispec) = - 2._CUSTOM_REAL * mul * mu_kl(i,j,k,ispec)
- ! for a parameterization: (rho,bulk, beta)
- ! where bulk wave speed is c = sqrt( kappa / rho)
- ! note: rhoprime is the same as for (rho,alpha,beta) parameterization
- !bulk_c_kl_crust_mantle(i,j,k,ispec) = 2._CUSTOM_REAL * kappa_kl(i,j,k,ispec)
- !bulk_beta_kl_crust_mantle(i,j,k,ispec ) = 2._CUSTOM_REAL * mu_kl(i,j,k,ispec)
+ ! bulk modulus kernel
+ kappa_kl(i,j,k,ispec) = - kappal * kappa_kl(i,j,k,ispec)
+ ! for a parameterization: (rho,alpha,beta)
+ ! density prime kernel
+ rhop_kl(i,j,k,ispec) = rho_kl(i,j,k,ispec) + kappa_kl(i,j,k,ispec) + mu_kl(i,j,k,ispec)
+
+ ! vs kernel
+ beta_kl(i,j,k,ispec) = 2._CUSTOM_REAL * (mu_kl(i,j,k,ispec) &
+ - 4._CUSTOM_REAL * mul / (3._CUSTOM_REAL * kappal) * kappa_kl(i,j,k,ispec))
+
+ ! vp kernel
+ alpha_kl(i,j,k,ispec) = 2._CUSTOM_REAL * (1._CUSTOM_REAL &
+ + 4._CUSTOM_REAL * mul / (3._CUSTOM_REAL * kappal) ) * kappa_kl(i,j,k,ispec)
+
+ endif
+
enddo
enddo
enddo
@@ -212,38 +282,85 @@
endif ! elastic
enddo
+
+ if (ANISOTROPIC_KL) then
- ! save kernels to binary files
- open(unit=27,file=prname(1:len_trim(prname))//'rho_kernel.bin',status='unknown',form='unformatted',iostat=ier)
- if( ier /= 0 ) stop 'error opening file rho_kernel.bin'
- write(27) rho_kl
- close(27)
+ ! outputs transverse isotropic kernels only
+ if (SAVE_TRANSVERSE_KL) then
+ ! transverse isotropic kernels
+ ! (alpha_v, alpha_h, beta_v, beta_h, eta, rho ) parameterization
+ open(unit=27,file=trim(prname)//'alphav_kernel.bin',status='unknown',form='unformatted',action='write')
+ write(27) alphav_kl
+ close(27)
+ open(unit=27,file=trim(prname)//'alphah_kernel.bin',status='unknown',form='unformatted',action='write')
+ write(27) alphah_kl
+ close(27)
+ open(unit=27,file=trim(prname)//'betav_kernel.bin',status='unknown',form='unformatted',action='write')
+ write(27) betav_kl
+ close(27)
+ open(unit=27,file=trim(prname)//'betah_kernel.bin',status='unknown',form='unformatted',action='write')
+ write(27) betah_kl
+ close(27)
+ open(unit=27,file=trim(prname)//'eta_kernel.bin',status='unknown',form='unformatted',action='write')
+ write(27) eta_kl
+ close(27)
- open(unit=27,file=prname(1:len_trim(prname))//'mu_kernel.bin',status='unknown',form='unformatted',iostat=ier)
- if( ier /= 0 ) stop 'error opening file mu_kernel.bin'
- write(27) mu_kl
- close(27)
+ ! transverse isotropic test kernels
+ open(unit=27,file=trim(prname)//'alpha_kernel.bin',status='unknown',form='unformatted',action='write')
+ write(27) alpha_kl
+ close(27)
+ open(unit=27,file=trim(prname)//'beta_kernel.bin',status='unknown',form='unformatted',action='write')
+ write(27) beta_kl
+ close(27)
- open(unit=27,file=prname(1:len_trim(prname))//'kappa_kernel.bin',status='unknown',form='unformatted',iostat=ier)
- if( ier /= 0 ) stop 'error opening file kappa_kernel.bin'
- write(27) kappa_kl
- close(27)
+ else
+ ! fully anisotropic kernels
+ ! note: the C_ij and density kernels are not for relative perturbations (delta ln( m_i) = delta m_i / m_i),
+ ! but absolute perturbations (delta m_i = m_i - m_0).
+ ! Kappa and mu are for absolute perturbations, can be used to check with purely isotropic versions.
+ open(unit=27,file=trim(prname)//'rho_kernel.bin',status='unknown',form='unformatted',action='write')
+ write(27) - rho_kl
+ close(27)
+ open(unit=27,file=trim(prname)//'cijkl_kernel.bin',status='unknown',form='unformatted',action='write')
+ write(27) - cijkl_kl
+ close(27)
- open(unit=27,file=prname(1:len_trim(prname))//'rhop_kernel.bin',status='unknown',form='unformatted',iostat=ier)
- if( ier /= 0 ) stop 'error opening file rhop_kernel.bin'
- write(27) rhop_kl
- close(27)
+ endif
- open(unit=27,file=prname(1:len_trim(prname))//'beta_kernel.bin',status='unknown',form='unformatted',iostat=ier)
- if( ier /= 0 ) stop 'error opening file beta_kernel.bin'
- write(27) beta_kl
- close(27)
+ else
+
+ ! save kernels to binary files
+ open(unit=27,file=prname(1:len_trim(prname))//'rho_kernel.bin',status='unknown',form='unformatted',iostat=ier)
+ if( ier /= 0 ) stop 'error opening file rho_kernel.bin'
+ write(27) rho_kl
+ close(27)
- open(unit=27,file=prname(1:len_trim(prname))//'alpha_kernel.bin',status='unknown',form='unformatted',iostat=ier)
- if( ier /= 0 ) stop 'error opening file alpha_kernel.bin'
- write(27) alpha_kl
- close(27)
+ open(unit=27,file=prname(1:len_trim(prname))//'mu_kernel.bin',status='unknown',form='unformatted',iostat=ier)
+ if( ier /= 0 ) stop 'error opening file mu_kernel.bin'
+ write(27) mu_kl
+ close(27)
+ open(unit=27,file=prname(1:len_trim(prname))//'kappa_kernel.bin',status='unknown',form='unformatted',iostat=ier)
+ if( ier /= 0 ) stop 'error opening file kappa_kernel.bin'
+ write(27) kappa_kl
+ close(27)
+
+ open(unit=27,file=prname(1:len_trim(prname))//'rhop_kernel.bin',status='unknown',form='unformatted',iostat=ier)
+ if( ier /= 0 ) stop 'error opening file rhop_kernel.bin'
+ write(27) rhop_kl
+ close(27)
+
+ open(unit=27,file=prname(1:len_trim(prname))//'beta_kernel.bin',status='unknown',form='unformatted',iostat=ier)
+ if( ier /= 0 ) stop 'error opening file beta_kernel.bin'
+ write(27) beta_kl
+ close(27)
+
+ open(unit=27,file=prname(1:len_trim(prname))//'alpha_kernel.bin',status='unknown',form='unformatted',iostat=ier)
+ if( ier /= 0 ) stop 'error opening file alpha_kernel.bin'
+ write(27) alpha_kl
+ close(27)
+ endif
+
if (SAVE_MOHO_MESH) then
open(unit=27,file=prname(1:len_trim(prname))//'moho_kernel.bin',status='unknown',form='unformatted',iostat=ier)
if( ier /= 0 ) stop 'error opening file moho_kernel.bin'
Modified: seismo/3D/SPECFEM3D/trunk/src/specfem3D/specfem3D_par.f90
===================================================================
--- seismo/3D/SPECFEM3D/trunk/src/specfem3D/specfem3D_par.f90 2013-04-10 20:37:46 UTC (rev 21802)
+++ seismo/3D/SPECFEM3D/trunk/src/specfem3D/specfem3D_par.f90 2013-04-10 21:16:02 UTC (rev 21803)
@@ -366,7 +366,10 @@
! adjoint kernels
real(kind=CUSTOM_REAL), dimension(:,:,:,:), allocatable :: rho_kl, mu_kl, kappa_kl, &
rhop_kl, beta_kl, alpha_kl
-
+
+ ! anisotropic kernels
+ real(kind=CUSTOM_REAL), dimension(:,:,:,:,:), allocatable :: cijkl_kl
+
! approximate hessian
real(kind=CUSTOM_REAL), dimension(:,:,:,:), allocatable :: hess_kl
More information about the CIG-COMMITS
mailing list