[CIG-SEISMO] Problem with Absorbing Boundary Condition

Seçkin Polat seckinpolat at hotmail.com.tr
Sat May 6 20:28:56 PDT 2017


Hello,

My name is Seckin Polat, I am a master’s student in Geophysics, I have been using Specfem2D for a while for my research. I placed a void inside of one layer model whose dimension is 50 m. x 50 m. And I would like to observe the seismic wave propagation while they travel along the void.  I am using Gmsh to generate external models then I run them with Specfem2D and I have never encountered this problem before and I decided to ask for it. When I assign absorbing boundary condition for left, right, and bottom boundaries, my model is working fine when there attenuation is zero, however when I assign the attenuation to 30, all my boundary conditions are behaving like free surface that I did not assign.


My .geo file for Gmsh is;

// Geometry File of Perfect Shape Tunnel With Receiver and Source That is Not Located in Wells

cl1=0.25;

//Boundary Points of Square
Point(1) = {0, 0, 0, cl1};
Point(2) = {50, 0, 0, cl1};
Point(3) = {50, 50, 0, cl1};
Point(14) = {0, 50, 0, cl1};

//Connection Points
Point(5) = {25, 50, 0, cl1};

//Points of Boundary of Tunnel
Point(7) = {25, 31, 0, cl1};
Point(8) = {24.5 , 30.5, 0, cl1};
Point(9) = {24.5, 29.5, 0, cl1};
Point(10) = {25.5, 29.5, 0, cl1};
Point(11) = {25.5, 30.5, 0, cl1};

//Points of Center of Tunnel and Its Circles
Point(12) = {25, 30.5, 0, cl1};
Point(13) = {25, 29.5, 0, cl1};

//Lines of Square
Line(1) = {1, 2};
Line(2) = {2, 3};
Line(4) = {3, 5};
Line(14) = {5, 14};
Line(15) = {14, 1};

//Lines of Connection
Line(5) = {5, 7};

//Lines of Tunnel
Circle(7) = {7,12, 8};
Line(8) = {8, 9};
Circle(9) = {9, 13, 10};
Line(10) = {10, 11};
Circle(11) = {11, 12, 7};

//Loops
Line Loop(1) = {1, 2, 4, 5, 7, 8, 9, 10, 11, -5, 14, 15};
Plane Surface(1) = {1};
Physical Line("Top") = {4, 14};
Physical Line("Bottom") = {1};
Physical Line("Left") = {15};
Physical Line("Right") = {2};

//Physical Surfaces
Physical Surface("M1") = {1};


Then I mesh this .geo file and saved it as .mesh, then I transfer this files into Specfem2D, and run “process_the_Gmsh_file_once_and_for_all.sh” command line which is written below.

#!/bin/bash
#
# create the absorbing and free surface files from the Gmsh file
#
##cd MESH/

python /home/spolat/specfem2d/utils/Gmsh/LibGmsh2Specfem_convert_Gmsh_to_Specfem2D_official.py perfectshape.msh -t F -b A -r A -l A

cd ../


And my source file is written below as;

#source 1.  The components of a moment tensor source must be given in N.m, not in dyne.cm as in the DATA/CMTSOLUTION source file of the 3D version of the code.
source_surf                     = .false.        # source inside the medium or at the surface
xs                              = 10.395             # source location x in meters
zs                              = ABCD           # source location z in meters
source_type                     = 1              # elastic force or acoustic pressure = 1 or moment tensor = 2
time_function_type              = 1              # Ricker = 1, first derivative = 2, Gaussian = 3, Dirac = 4, Heaviside = 5
# time function_type == 8 source read from file, if time function_type == 9 : burst
# If time_function_type == 8, enter below the custom source file to read (two columns file with time and amplitude) :
# (For the moment dt must be equal to the dt of the simulation. File name can't exceed 150 characters)
name_of_source_file             = ""             # Only for option 8 : file containing the source wavelet
burst_band_width                = 0.             # Only for option 9 : band width of the burst
f0                              = 4000           # dominant source frequency (Hz) if not Dirac or Heaviside
tshift                          = 0.0            # time shift when multi sources (if one source, must be zero)
anglesource                     = 90.0            # angle of the source (for a force only)
Mxx                             = 1.             # Mxx component (for a moment tensor source only)
Mzz                             = 1.             # Mzz component (for a moment tensor source only)
Mxz                             = 0.             # Mxz component (for a moment tensor source only)
factor                          = 1.d10          # amplification factor



In this example, I designed the model as  the top as free surface, and other surfaces have absorbing boundary condition.
However, when I run Specfem2D, absorbing boundaries are acting like free surfaces. My Par_file is written below.


#-----------------------------------------------------------------------------
#
# simulation input parameters
#
#-----------------------------------------------------------------------------

# title of job
title                           = Subsurface Modeling for Detection of a Tunnel with One Receiver Set

# forward or adjoint simulation
# 1 = forward, 2 = adjoint, 3 = both simultaneously
# note: 2 is purposely UNUSED (for compatibility with the numbering of our 3D codes)
SIMULATION_TYPE                 = 1
# 0 = regular wave propagation simulation, 1/2/3 = noise simulation
NOISE_TOMOGRAPHY                = 0
# save the last frame, needed for adjoint simulation
SAVE_FORWARD                    = .false.

# parameters concerning partitioning
NPROC                           = 256              # number of processes
partitioning_method             = 3              # SCOTCH = 3, ascending order (very bad idea) = 1

# number of control nodes per element (4 or 9)
ngnod                           = 4

# time step parameters
# total number of time steps
NSTEP                           =65000
# duration of a time step (see section "How to choose the time step" of the manual for how to do this)
DT                              = 5.d-7

# time stepping
# 1 = Newmark (2nd order), 2 = LDDRK4-6 (4th-order 6-stage low storage Runge-Kutta), 3 = classical RK4 4th-order 4-stage Runge-Kutta
time_stepping_scheme            = 1

# axisymmetric (2.5D) or Cartesian planar (2D) simulation
AXISYM                          = .false.

# set the type of calculation (P-SV or SH/membrane waves)
P_SV                            = .true.

# set to true to use GPUs
GPU_MODE                        = .false.

# available models
#   default       - define model using nbmodels below
#   ascii         - read model from ascii database file
#   binary        - read model from binary databse file
#   binary_voigt  - read Voigt model from binary database file
#   external      - define model using define_external_model subroutine
#   gll           - read GLL model from binary database file
#   legacy        - read model from model_velocity.dat_input
MODEL                           = default

# Output the model with the requested type, does not save if turn to default or .false.
# (available output formats: ascii,binary,gll,legacy)
SAVE_MODEL                      = default


#-----------------------------------------------------------------------------
#
# attenuation
#
#-----------------------------------------------------------------------------

# attenuation parameters
ATTENUATION_VISCOELASTIC  = .true.        # turn attenuation (viscoelasticity) on or off for non-poroelastic solid parts of the model
ATTENUATION_PORO_FLUID_PART     = .false.        # turn viscous attenuation on or off for the fluid part of poroelastic parts of the model
Q0                              = 30              # quality factor for viscous attenuation
freq0                           = 4000             # frequency for viscous attenuation

# for viscoelastic attenuation
N_SLS                           = 2              # number of standard linear solids for attenuation (3 is usually the minimum)
f0_attenuation                  = 4000 # (Hz) relevant only if source is a Dirac or a Heaviside, otherwise it is f0 the dominant frequency of the source in the DATA/SOURCE file
READ_VELOCITIES_AT_f0           = .false.        # shift velocities to account for physical dispersion (see user manual for more information)

# to undo attenuation for sensitivity kernel calculations or forward runs with SAVE_FORWARD
# use the flag below. It performs undoing of attenuation in an exact way for sensitivity kernel calculations
# but requires disk space for temporary storage, and uses a significant amount of memory used as buffers for temporary storage.
# When that option is on the second parameter indicates how often the code dumps restart files to disk (if in doubt, use something between 100 and 1000).
UNDO_ATTENUATION                = .false.
NT_DUMP_ATTENUATION             = 500


#-----------------------------------------------------------------------------
#
# sources
#
#-----------------------------------------------------------------------------

# source parameters
NSOURCES                        = 1              # number of sources (source information is then read from the DATA/SOURCE file)
force_normal_to_surface         = .false.        # angleforce normal to surface (external mesh and curve file needed)

# use an existing initial wave field as source or start from zero (medium initially at rest)
initialfield                    = .false.
add_Bielak_conditions_bottom    = .false.        # add Bielak conditions or not if initial plane wave
add_Bielak_conditions_right     = .false.
add_Bielak_conditions_top       = .false.
add_Bielak_conditions_left      = .false.

# acoustic forcing
ACOUSTIC_FORCING                = .false.        # acoustic forcing of an acoustic medium with a rigid interface


#-----------------------------------------------------------------------------
#
# receivers
#
#-----------------------------------------------------------------------------

# receiver set parameters for recording stations (i.e. recording points)
seismotype                      = 1              # record 1=displ 2=veloc 3=accel 4=pressure 5=curl of displ 6=the fluid potential

# subsampling of the seismograms to create smaller files (but less accurately sampled in time)
subsamp_seismos                 = 1

# so far, this option can only be used if all the receivers are in acoustic elements
USE_TRICK_FOR_BETTER_PRESSURE   = .false.

# every how many time steps we save the seismograms
# (costly, do not use a very small value; if you use a very large value that is larger than the total number
#  of time steps of the run, the seismograms will automatically be saved once at the end of the run anyway)
NSTEP_BETWEEN_OUTPUT_SEISMOS    = 5000000

# Compute the field int_0^t v^2 dt for a set of GLL points and write it to file. Use
# the script utils/visualisation/plotIntegratedEnergyFile.py to watch. It is refreshed at the same time than the seismograms
COMPUTE_INTEGRATED_ENERGY_FIELD = .false.

# use this t0 as earliest starting time rather than the automatically calculated one
USER_T0                         = 0.0d0

# seismogram formats
save_ASCII_seismograms          = .true.         # save seismograms in ASCII format or not
save_binary_seismograms_single  = .true.         # save seismograms in single precision binary format or not (can be used jointly with ASCII above to save both)
save_binary_seismograms_double  = .false.        # save seismograms in double precision binary format or not (can be used jointly with both flags above to save all)
SU_FORMAT                       = .true.        # output single precision binary seismograms in Seismic Unix format (adjoint traces will be read in the same format)

# use an existing STATION file found in ./DATA or create a new one from the receiver positions below in this Par_file
use_existing_STATIONS           = .false.

# number of receiver sets (i.e. number of receiver lines to create below)
nreceiversets                   = 1

# orientation
anglerec                        = 0.d0           # angle to rotate components at receivers
rec_normal_to_surface           = .false.        # base anglerec normal to surface (external mesh and curve file needed)

# first receiver set (repeat these 6 lines and adjust nreceiversets accordingly)
nrec                            = 39             # number of receivers
xdeb                            = 10.395           # first receiver x in meters
zdeb                            = 49            # first receiver z in meters
xfin                            = 10.395            # last receiver x in meters (ignored if only one receiver)
zfin                            = 11            # last receiver z in meters (ignored if only one receiver)
record_at_surface_same_vertical = .false.        # receivers inside the medium or at the surface

#-----------------------------------------------------------------------------
#
# adjoint kernel outputs
#
#-----------------------------------------------------------------------------

# save sensitivity kernels in ASCII format (much bigger files, but compatible with current GMT scripts) or in binary format
save_ASCII_kernels              = .true.


#-----------------------------------------------------------------------------
#
# boundary conditions
#
#-----------------------------------------------------------------------------

# Perfectly Matched Layer (PML) boundaries
# absorbing boundary active or not
PML_BOUNDARY_CONDITIONS         = .false.
NELEM_PML_THICKNESS             = 3
ROTATE_PML_ACTIVATE             = .false.
ROTATE_PML_ANGLE                = 30.

# Stacey ABC
STACEY_ABSORBING_CONDITIONS     = .true.

# periodic boundaries
ADD_PERIODIC_CONDITIONS         = .false.
PERIODIC_HORIZ_DIST             = 0.3597d0


#-----------------------------------------------------------------------------
#
# velocity and density models
#
#-----------------------------------------------------------------------------
nbmodels                        = 1
# available material types (see user manual for more information)
#   acoustic:    model_number 1 rho Vp 0  0 0 QKappa Qmu 0 0 0 0 0 0
#   elastic:     model_number 1 rho Vp Vs 0 0 QKappa Qmu 0 0 0 0 0 0
#   anistoropic: model_number 2 rho c11 c13 c15 c33 c35 c55 c12 c23 c25 0 0 0
#   poroelastic: model_number 3 rhos rhof phi c kxx kxz kzz Ks Kf Kfr etaf mufr Qmu
#   tomo:        model_number -1 0 0 A 0 0 0 0 0 0 0 0 0 0
1 1 2600.d0 3000.d0 1500.0d0 0 0 10.d0 10.d0 0 0 0 0 0 0
#2 1 2400.d0 2500.d0  800.0d0 0 0 10.d0 10.d0 0 0 0 0 0 0

#1 1 2600.d0 3000.d0 1500.0d0 0 0 10.d0 10.d0 0 0 0 0 0 0
#2 1 1000.d0 1477.d0        0 0 0 10.d0 10.d0 0 0 0 0 0 0

# external tomography file
TOMOGRAPHY_FILE                 = dummy

# use an external mesh created by an external meshing tool or use the internal mesher
read_external_mesh              = .true.


#-----------------------------------------------------------------------------
#
# PARAMETERS FOR EXTERNAL MESHING
#
#-----------------------------------------------------------------------------

# data concerning mesh, when generated using third-party app (more info in README)
# (see also absorbing_conditions above)
mesh_file                       = Mesh_perfectshape         # file containing the mesh
nodes_coords_file               = Nodes_perfectshape        # file containing the nodes coordinates
materials_file                  = Material_perfectshape     # file containing the material number for each element
free_surface_file               = Surf_free_perfectshape    # file containing the free surface
axial_elements_file             = dummy                     # file containing the axial elements if AXISYM is true
absorbing_surface_file          = Surf_abs_perfectshape     # file containing the absorbing surface
acoustic_forcing_surface_file   = dummy                     # file containing the acoustic forcing surface
absorbing_cpml_file              = dummy                     # file containing the CPML element numbers
tangential_detection_curve_file = dummy                     # file containing the curve delimiting the velocity model

#-----------------------------------------------------------------------------
#
# PARAMETERS FOR INTERNAL MESHING
#
#-----------------------------------------------------------------------------

# file containing interfaces for internal mesh
interfacesfile                  = dummy

# geometry of the model (origin lower-left corner = 0,0) and mesh description
xmin                            = -1.d0          # abscissa of left side of the model
xmax                            = 4.d0           # abscissa of right side of the model
nx                              = 835            # number of elements along X

# absorbing boundary parameters (see absorbing_conditions above)
absorbbottom                    = .true.
absorbright                     = .true.
absorbtop                       = .true.
absorbleft                      = .true.

# define the different regions of the model in the (nx,nz) spectral-element mesh
nbregions                       = 2              # then set below the different regions and model number for each region
1 835  1 71 1
1 835 72 96 2

#-----------------------------------------------------------------------------
#
# display parameters
#
#-----------------------------------------------------------------------------

# every how many time steps we display information about the simulation (costly, do not use a very small value)
NSTEP_BETWEEN_OUTPUT_INFO       = 300

# meshing output
output_grid_Gnuplot             = .false.        # generate a GNUPLOT file containing the grid, and a script to plot it
output_grid_ASCII               = .false.        # dump the grid in an ASCII text file consisting of a set of X,Y,Z points or not

# compute and output total acoustic and elastic energy curves (slows down the code significantly)
OUTPUT_ENERGY                   = .false.

# every how many time steps we compute energy (which is a bit expensive to compute)
NTSTEP_BETWEEN_OUTPUT_ENERGY    = 10

#-----------------------------------------------------------------------------
#
# movies/images/snaphots
#
#-----------------------------------------------------------------------------

# every how many time steps we draw JPEG or PostScript pictures of the simulation (costly, do not use a very small value)
NSTEP_BETWEEN_OUTPUT_IMAGES     = 100

# every how many time steps we dump results of the simulation as ASCII or binary files (costly, do not use a very small value)
NSTEP_BETWEEN_OUTPUT_WAVE_DUMPS = 100

# minimum amplitude kept in % for the JPEG and PostScript snapshots; amplitudes below that are muted
cutsnaps                        = 1.

#### for JPEG color images ####
output_color_image              = .true.         # output JPEG color image of the results every NSTEP_BETWEEN_OUTPUT_IMAGES time steps or not
imagetype_JPEG                  = 10             # display 1=displ_Ux 2=displ_Uz 3=displ_norm 4=veloc_Vx 5=veloc_Vz 6=veloc_norm 7=accel_Ax 8=accel_Az 9=accel_norm 10=pressure
factor_subsample_image          = 1.0d0          # (double precision) factor to subsample color images output by the code (useful for very large models)
USE_CONSTANT_MAX_AMPLITUDE      = .false.        # by default the code normalizes each image independently to its maximum; use this option to use the global maximum below instead
CONSTANT_MAX_AMPLITUDE_TO_USE   = 1.17d4         # constant maximum amplitude to use for all color images if the above USE_CONSTANT_MAX_AMPLITUDE option is true
POWER_DISPLAY_COLOR             = 0.30d0         # non linear display to enhance small amplitudes in JPEG color images
DRAW_SOURCES_AND_RECEIVERS      = .true.         # display sources as orange crosses and receivers as green squares in JPEG images or not
DRAW_WATER_IN_BLUE              = .true.         # display acoustic layers as constant blue in JPEG images, because they likely correspond to water in the case of ocean acoustics or in the case of offshore oil industry experiments (if off, display them as greyscale, as for elastic or poroelastic elements, for instance for acoustic-only oil industry models of solid media)
USE_SNAPSHOT_NUMBER_IN_FILENAME = .false.        # use snapshot number in the file name of JPEG color snapshots instead of the time step (for instance to create movies in an easier way later)

#### for PostScript snapshots ####
output_postscript_snapshot      = .false.        # output Postscript snapshot of the results every NSTEP_BETWEEN_OUTPUT_IMAGES time steps or not
imagetype_postscript            = 1              # display 1=displ vector 2=veloc vector 3=accel vector; small arrows are displayed for the vectors
meshvect                        = .true.         # display mesh on PostScript plots or not
modelvect                       = .false.        # display velocity model on PostScript plots or not
boundvect                       = .true.         # display boundary conditions on PostScript plots or not
interpol                        = .true.         # interpolation of the PostScript display on a regular grid inside each spectral element, or use the non-evenly spaced GLL points
pointsdisp                      = 6              # number of points in each direction for interpolation of PostScript snapshots (set to 1 for lower-left corner only)
subsamp_postscript              = 1              # subsampling of background velocity model in PostScript snapshots
sizemax_arrows                  = 1.d0           # maximum size of arrows on PostScript plots in centimeters
US_LETTER                       = .false.        # use US letter or European A4 paper for PostScript plots

#### for wavefield dumps ####
output_wavefield_dumps          = .false.        # output wave field to a text file every NSTEP_BETWEEN_OUTPUT_TEXT_DUMPS time steps (creates very big files)
imagetype_wavefield_dumps       = 1              # display 1=displ vector 2=veloc vector 3=accel vector 4=pressure
use_binary_for_wavefield_dumps  = .false.        # use ASCII or single-precision binary format for the wave field dumps


Is there any ideas that why my model is not working as it was assigned as absorbing boundary condition?
Thank you very much for your help.

Sincerely,

Seckin
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.geodynamics.org/pipermail/cig-seismo/attachments/20170507/1d0b9460/attachment-0001.html>


More information about the CIG-SEISMO mailing list