├── .gitignore ├── Biot_2D_FDTD_SG_CPML.m ├── FDcoeffDx.m ├── FDcoeffDxTS.m ├── FDcoeffDxx.m ├── FDcoeffDxxTS.m ├── FDcoeffDxz.m ├── Frequency_Acoustic_2D_FDTD_PML.m ├── FullElastic_2D_FDTD.m ├── FullElastic_2D_FDTD_SG.m ├── FullElastic_3D_FDTD.m ├── FullElastic_3D_FDTD_SG.m ├── LICENSE ├── README.md ├── Surfacewave_2D_FDTD_SG_CPML_FB.m ├── ViscoAcoustic_2D_FDTD_SG1.m ├── ViscoAcoustic_2D_FDTD_SG1_CMPL.m ├── ViscoAcoustic_2D_FDTD_SG2.m ├── ViscoAcoustic_2D_FDTD_SG2_CMPL.m ├── ViscoElastic_2D_FDTD_SG_CPML.m ├── acoustic_2D_FDTD.m ├── acoustic_2D_FDTD_SG.m ├── acoustic_2D_FDTD_SG_ABC.m ├── acoustic_2D_FDTD_SG_CFSPML.m ├── acoustic_2D_FDTD_SG_CPML.m ├── acoustic_2D_FDTD_SG_SPML.m ├── acoustic_3D_FDTD.m ├── acoustic_3D_FDTD_SG.m ├── acoustic_3D_FDTD_SG_CPML.m ├── bond.m ├── cfspml.m ├── cpml.m ├── doc └── A numerical tour of wave propagation.pdf ├── elastic_2D_FDTD_SG.m ├── elastic_2D_FDTD_SG_CPML.m ├── elastic_3D_FDTD_SG.m ├── elastic_3D_FDTD_SG_CPML.m ├── get2d_9seismat.m ├── img ├── 2DAcoustic.gif ├── 2DElasticVx.gif ├── 2DElasticVz.gif └── 3DAcoustic.gif └── wavelet.m /.gitignore: -------------------------------------------------------------------------------- 1 | FullElastic_vpvs_2D_FDTD.m -------------------------------------------------------------------------------- /Biot_2D_FDTD_SG_CPML.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaoqwei/WaveSimulation_Matlab/4b9450004ebb3390ab0a176e7d390bd7b6cf505a/Biot_2D_FDTD_SG_CPML.m -------------------------------------------------------------------------------- /FDcoeffDx.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaoqwei/WaveSimulation_Matlab/4b9450004ebb3390ab0a176e7d390bd7b6cf505a/FDcoeffDx.m -------------------------------------------------------------------------------- /FDcoeffDxTS.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaoqwei/WaveSimulation_Matlab/4b9450004ebb3390ab0a176e7d390bd7b6cf505a/FDcoeffDxTS.m -------------------------------------------------------------------------------- /FDcoeffDxx.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaoqwei/WaveSimulation_Matlab/4b9450004ebb3390ab0a176e7d390bd7b6cf505a/FDcoeffDxx.m -------------------------------------------------------------------------------- /FDcoeffDxxTS.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaoqwei/WaveSimulation_Matlab/4b9450004ebb3390ab0a176e7d390bd7b6cf505a/FDcoeffDxxTS.m -------------------------------------------------------------------------------- /FDcoeffDxz.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaoqwei/WaveSimulation_Matlab/4b9450004ebb3390ab0a176e7d390bd7b6cf505a/FDcoeffDxz.m -------------------------------------------------------------------------------- /Frequency_Acoustic_2D_FDTD_PML.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaoqwei/WaveSimulation_Matlab/4b9450004ebb3390ab0a176e7d390bd7b6cf505a/Frequency_Acoustic_2D_FDTD_PML.m -------------------------------------------------------------------------------- /FullElastic_2D_FDTD.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaoqwei/WaveSimulation_Matlab/4b9450004ebb3390ab0a176e7d390bd7b6cf505a/FullElastic_2D_FDTD.m -------------------------------------------------------------------------------- /FullElastic_2D_FDTD_SG.m: -------------------------------------------------------------------------------- 1 | clc,clear 2 | % 2D - full elastic wave simulation using finite difference. with staggered-grid. 3 | % By zhaoqingwei 4 | % Chengdu University of Technology (CDUT), 2021-2025 5 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 6 | %txx(tzz)--Vx--txx(tzz) 7 | % | | | 8 | % Vz------txz---vz 9 | % | | | 10 | %txx(tzz)--Vx--txx(tzz) 11 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 12 | 13 | FM=20; 14 | DT=0.001;dt=DT; 15 | T=2; 16 | nx=600; 17 | nz=600; 18 | DH=10;dx=DH;dz=DH; 19 | 20 | s=wavelet(FM,DT,T); 21 | vp=ones(nz,nx)*4000;vs=vp/2;rou=ones(nz,nx)*2; 22 | lamda=rou.*(vp.*vp-vs.*vs*2);mu=rou.*vs.*vs; 23 | Epsilon=0.2*ones(600,600);Delta=0.1*ones(600,600); 24 | c33=vp.*vp.*rou;c55=vs.*vs.*rou;c11=2*c33.*Epsilon+c33;c13=rou.*sqrt(((1+2*Delta).*vp.*vp-vs.*vs).*(vp.*vp-vs.*vs))-rou.*vs.*vs;c15=zeros(nz,nx);c35=zeros(nz,nx);%VTI 25 | c_old=[c11(1) c13(1) c15(1); 26 | c13(1) c33(1) c35(1); 27 | c15(1) c35(1) c55(1);]; 28 | M=bond([0 0 pi/4]);M1=M(1:2:5,1:2:5); 29 | c_new= M1*c_old*M1'; 30 | c11=ones(nz,nx)*c_new(1,1);c13=ones(nz,nx)*c_new(1,2);c15=ones(nz,nx)*c_new(1,3); 31 | c33=ones(nz,nx)*c_new(2,2);c35=ones(nz,nx)*c_new(2,3);c55=ones(nz,nx)*c_new(3,3); 32 | 33 | vx0=zeros(nz,nx);vx1=vx0; 34 | vz0=vx0;vz1=vx0; 35 | taoxx0=vx0;taoxx1=vx0; 36 | taozz0=vx0;taozz1=vx0; 37 | taoxz0=vx0;taoxz1=vx0; 38 | z0=round(nz/2);x0=round(nx/2); 39 | 40 | nn=3; 41 | dxd=FDcoeffDx(nn);ddz0=dxd';ddz1=[dxd 0]';ddx0=ddz0';ddx1=ddz1';Xdx0=[-0.25 0 0.25;-0.25 0 0.25];Xdx1=[Xdx0;zeros(1,3)];Xdz0=Xdx0';Xdz1=Xdx1'; 42 | TX=dt/dx;TZ=dt/dz; 43 | for t=DT:DT:T 44 | disp(t); 45 | k=round(t/DT); 46 | vx1=vx0+(TZ.*imfilter(taoxz0,ddz1)+TX.*imfilter(taoxx0,ddx0))./rou;% 47 | vz1=vz0+(TZ.*imfilter(taozz0,ddz0)+TX.*imfilter(taoxz0,ddx1))./rou; 48 | 49 | vz1(z0,x0)=vz1(z0,x0)+s(k); 50 | 51 | taoxx1=taoxx0+c13.*TZ.*imfilter(vz1,ddz1)+c15.*TX.*imfilter(vz1,Xdx1)+c11.*TX.*imfilter(vx1,ddx1)+c15.*TZ.*imfilter(vx1,Xdz1); 52 | taozz1=taozz0+c33.*TZ.*imfilter(vz1,ddz1)+c35.*TX.*imfilter(vz1,Xdx1)+c13.*TX.*imfilter(vx1,ddx1)+c35.*TZ.*imfilter(vx1,Xdz1); 53 | taoxz1=taoxz0+c55.*TZ.*imfilter(vx1,ddz0)+c15.*TX.*imfilter(vx1,Xdx0)+c55.*TX.*imfilter(vz1,ddx0)+c35.*TZ.*imfilter(vz1,Xdz0); 54 | 55 | taoxx0=taoxx1;taozz0=taozz1;taoxz0=taoxz1; 56 | vz0=vz1;vx0=vx1; 57 | 58 | if mod(t,0.5)==0 59 | figure(); 60 | imagesc(vz1); 61 | end 62 | end 63 | -------------------------------------------------------------------------------- /FullElastic_3D_FDTD.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaoqwei/WaveSimulation_Matlab/4b9450004ebb3390ab0a176e7d390bd7b6cf505a/FullElastic_3D_FDTD.m -------------------------------------------------------------------------------- /FullElastic_3D_FDTD_SG.m: -------------------------------------------------------------------------------- 1 | clc,clear 2 | % 3D - full elastic wave simulation using finite difference. with staggered-grid. 3 | % By zhaoqingwei 4 | % Chengdu University of Technology (CDUT), 2021-2025 5 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 6 | %%grid point 7 | % |vx |txx |vx 8 | % |txy |vy |txy 9 | % vx -- txx -- vx | |txz 10 | % | | /tyz| | / 11 | % txz -- vz -- txz / |v 12 | % | | | |txy 13 | % vx -- txx -- vx / 14 | % 15 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 16 | 17 | FM=20; 18 | DT=0.001;dt=DT; 19 | T=2; 20 | nx=200; 21 | ny=200; 22 | nz=200; 23 | DH=10;dx=DH;dz=DH;dy=DH; 24 | 25 | s=wavelet(FM,DT,T);z0=round(nz/2);x0=round(nx/2);y0=round(ny/2); 26 | vp=ones(nz,nx,ny)*2000;vs=vp/2;rou=ones(nz,nx,ny)*2; 27 | Epsilon=0.1*ones(nz,nx,ny);Delta=0.1*ones(nz,nx,ny);Gamma=0.2*ones(nz,nx,ny); 28 | c33=vp.*vp.*rou;c11=2*c33.*Epsilon+c33;c22=c11; 29 | c55=vs.*vs.*rou;c44=c55;c66=2*c44.*Gamma+c44; 30 | c13=rou.*sqrt(((1+2*Delta).*vp.*vp-vs.*vs).*(vp.*vp-vs.*vs))-rou.*vs.*vs;c23=c13;c12=c11-2*c66;%VTI 31 | 32 | c_old=[c11(1) c12(1) c13(1) 0 0 0; 33 | c12(1) c22(1) c23(1) 0 0 0; 34 | c13(1) c23(1) c33(1) 0 0 0; 35 | 0 0 0 c44(1) 0 0; 36 | 0 0 0 0 c55(1) 0; 37 | 0 0 0 0 0 c66(1);]; 38 | M=bond([0 0 pi/4]); 39 | c_new= M*c_old*M'; 40 | c11=ones(nz,nx,ny)*c_new(1,1);c12=ones(nz,nx,ny)*c_new(1,2);c13=ones(nz,nx,ny)*c_new(1,3); 41 | c14=ones(nz,nx,ny)*c_new(1,4);c15=ones(nz,nx,ny)*c_new(1,5);c16=ones(nz,nx,ny)*c_new(1,6); 42 | c22=ones(nz,nx,ny)*c_new(2,2);c23=ones(nz,nx,ny)*c_new(2,3); 43 | c24=ones(nz,nx,ny)*c_new(2,4);c25=ones(nz,nx,ny)*c_new(2,5);c26=ones(nz,nx,ny)*c_new(2,6); 44 | c33=ones(nz,nx,ny)*c_new(3,3);c34=ones(nz,nx,ny)*c_new(3,4);c35=ones(nz,nx,ny)*c_new(3,5);c36=ones(nz,nx,ny)*c_new(3,6); 45 | c44=ones(nz,nx,ny)*c_new(4,4);c45=ones(nz,nx,ny)*c_new(4,5);c46=ones(nz,nx,ny)*c_new(4,6); 46 | c55=ones(nz,nx,ny)*c_new(5,5);c56=ones(nz,nx,ny)*c_new(5,6);c66=ones(nz,nx,ny)*c_new(6,6); 47 | 48 | 49 | vx0=zeros(nz,nx,ny);vx1=vx0; 50 | vz0=vx0;vz1=vx0; 51 | vy0=vx0;vy1=vx0; 52 | taoxx0=vx0;taoxx1=vx0; 53 | taoyy0=vx0;taoyy1=vx0; 54 | taozz0=vx0;taozz1=vx0; 55 | taoxz0=vx0;taoxz1=vx0; 56 | taoyz0=vx0;taoyz1=vx0; 57 | taoxy0=vx0;taoxy1=vx0; 58 | 59 | nn=3; 60 | dxd=FDcoeffDx(nn);ddz0(:,1,1)=dxd';ddz1(:,1,1)=[dxd 0]'; 61 | ddx0=permute(ddz0,[2 1 3]);ddx1=permute(ddz1,[2 1 3]);ddy0=permute(ddz0,[3 2 1]);ddy1=permute(ddz1,[3 2 1]); 62 | Xdx0=[-0.25 0 0.25;-0.25 0 0.25];Xdx1=[Xdx0;zeros(1,3)];Xdz0=Xdx0';Xdz1=Xdx1';Xdy0=permute(Xdx0,[1 3 2]);Xdy1=permute(Xdx1,[1 3 2]); 63 | TX=dt/dx;TZ=dt/dz;TY=dt/dy; 64 | 65 | for t=DT:DT:T 66 | disp(t); 67 | k=round(t/DT); 68 | 69 | vx1=vx0+(TX.*imfilter(taoxx0,ddx1)+TY.*imfilter(taoxy0,ddy1)+TZ.*imfilter(taoxz0,ddz1))./rou; 70 | vy1=vy0+(TX.*imfilter(taoxy0,ddx0)+TY.*imfilter(taoyy0,ddy0)+TZ.*imfilter(taoyz0,ddz1))./rou; 71 | vz1=vz0+(TX.*imfilter(taoxz0,ddx0)+TY.*imfilter(taoyz0,ddy1)+TZ.*imfilter(taozz0,ddz0))./rou; 72 | 73 | vz1(z0,x0,y0)=vz1(z0,x0,y0)+s(k); 74 | 75 | taoxx1=taoxx0+c11.*TX.*imfilter(vx1,ddx0)+c16.*TY.*imfilter(vx1,Xdy1)+c15.*TZ.*imfilter(vx1,Xdz1)+... 76 | c12.*TY.*imfilter(vy1,ddy1)+c16.*TX.*imfilter(vy1,Xdx1)+c14.*TZ.*imfilter(vy1,Xdz1)+... 77 | c13.*TZ.*imfilter(vz1,ddz1)+c15.*TX.*imfilter(vz1,Xdx1)+c14.*TZ.*imfilter(vz1,Xdy1); 78 | taoyy1=taoyy0+c12.*TX.*imfilter(vx1,ddx0)+c26.*TY.*imfilter(vx1,Xdy1)+c25.*TZ.*imfilter(vx1,Xdz1)+... 79 | c22.*TY.*imfilter(vy1,ddy1)+c26.*TX.*imfilter(vy1,Xdx1)+c24.*TZ.*imfilter(vy1,Xdz1)+... 80 | c23.*TZ.*imfilter(vz1,ddz1)+c25.*TX.*imfilter(vz1,Xdx1)+c24.*TZ.*imfilter(vz1,Xdy1); 81 | taozz1=taozz0+c13.*TX.*imfilter(vx1,ddx0)+c36.*TY.*imfilter(vx1,Xdy1)+c35.*TZ.*imfilter(vx1,Xdz1)+... 82 | c23.*TY.*imfilter(vy1,ddy1)+c36.*TX.*imfilter(vy1,Xdx1)+c34.*TZ.*imfilter(vy1,Xdz1)+... 83 | c33.*TZ.*imfilter(vz1,ddz1)+c35.*TX.*imfilter(vz1,Xdx1)+c34.*TZ.*imfilter(vz1,Xdy1); 84 | taoyz1=taoyz0+c14.*TX.*imfilter(vx1,Xdx1)+c46.*TY.*imfilter(vx1,Xdy1)+c45.*TZ.*imfilter(vx1,Xdz1)+... 85 | c44.*TZ.*imfilter(vy1,ddz0)+c46.*TY.*imfilter(vy1,Xdx1)+c24.*TZ.*imfilter(vy1,Xdy1)+... 86 | c44.*TY.*imfilter(vz1,ddy0)+c45.*TY.*imfilter(vz1,Xdx1)+c34.*TZ.*imfilter(vz1,Xdz1); 87 | taoxz1=taoxz0+c55.*TZ.*imfilter(vx1,ddz0)+c15.*TY.*imfilter(vx1,Xdx1)+c56.*TZ.*imfilter(vx1,Xdy1)+... 88 | c56.*TX.*imfilter(vy1,Xdx1)+c25.*TY.*imfilter(vy1,Xdy1)+c45.*TZ.*imfilter(vy1,Xdz1)+... 89 | c55.*TX.*imfilter(vz1,ddx1)+c45.*TY.*imfilter(vz1,Xdy1)+c35.*TZ.*imfilter(vz1,Xdz1); 90 | taoxy1=taoxy0+c66.*TY.*imfilter(vx1,ddy0)+c16.*TY.*imfilter(vx1,Xdx1)+c56.*TZ.*imfilter(vx1,Xdz1)+... 91 | +c66.*TX.*imfilter(vy1,ddx1)+c26.*TY.*imfilter(vy1,Xdy1)+c46.*TZ.*imfilter(vy1,Xdz1)+... 92 | c56.*TX.*imfilter(vz1,Xdx1)+c46.*TY.*imfilter(vz1,Xdy1)+c36.*TZ.*imfilter(vz1,Xdz1); 93 | 94 | vx0=vx1; 95 | vy0=vy1; 96 | vz0=vz1; 97 | taoxx0=taoxx1; 98 | taoyy0=taoyy1; 99 | taozz0=taozz1; 100 | taoxz0=taoxz1; 101 | taoxy0=taoxy1; 102 | taoyz0=taoyz1; 103 | if mod(t,0.5)==0 104 | figure(); 105 | imagesc(vz1(:,:,y0)); 106 | end 107 | end 108 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Zhaoqingwei 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # WaveSimulation_Matlab 2 | **Author:** zhaoqingwei 3 | **Date:** April 24, 2023 4 | **email:** [zhaoqwei001@163.com](zhaoqwei001@163.com) 5 | 6 | ## SIMPLE SIMPLE SIMPLE!!! 7 | 8 | ## Main Purpose: 9 | I majored in geophysics with a direction in seismic exploration. Wave Simulation is the key to professional entry, so summarize your own code and share it with you. So the codes is just **simple** **simple** **simple**! The kernel code is just a few lines. 10 | Industrialization code, I recommend C, CUDA, MPI. 11 | 12 | #### Kernel Code: 13 | - 2D acoustic wave (three lines) 14 | ```matlab 15 | const1=v.*v*DT*DT/DH/DH; 16 | UU=imfilter(u2,dd); 17 | u3=2*u2-u1+const1.*UU+s(k)*f; 18 | ``` 19 | 20 | ## Keyword 21 | 22 | * **simple** **simple** **simple**! 23 | * 2-dimension; 3-dimension 24 | * acoustic wave;elastic wave;surface wave 25 | * sponge absorbing boundary condition;Split Perfectly Matched Layer;Convolutional Perfectly Matched Layer 26 | * isotropy,anisotropy media (VTI, HTI) 27 | * Finite Different Modeling 28 | * 简洁;简洁;简洁。2维;3维。声波;弹性波;面波;吸收边界;分裂pml;卷积pml。各向同性;各向异性(VTI,HTI)。有限差分模型。 29 | 30 | ## Notes 31 | 32 | 3-dimension program cost memory num\*nz\*nx\*ny\*8/1024/1024(MB).Care about memory。 33 | 34 | while nz=nx=ny=200,num=10; cost memory:610MB. 35 | while nz=nx=ny=600,num=50; cost memory:80GB. 36 | 37 | ## Thinks 38 | 39 | RToax [https://github.com/Rtoax](https://github.com/Rtoax) 40 | Guiting-geo [https://github.com/Guiting-geo](https://github.com/Guiting-geo) 41 | [Madagascar](https://reproducibility.org) 42 | [seismic unix (SU)](https://github.com/JohnWStockwellJr/SeisUnix) 43 | [CREWES](https://www.crewes.org/) 44 | 45 | ## Imag 46 | - 2D acoustic wave 47 | ![](./img/2DAcoustic.gif) 48 | - 2D elastic wave 49 | ![](./img/2DElasticVx.gif) 50 | ![](./img/2DElasticVz.gif) 51 | - 3D acoustic wave 52 | ![](./img/3DAcoustic.gif) 53 | -------------------------------------------------------------------------------- /Surfacewave_2D_FDTD_SG_CPML_FB.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaoqwei/WaveSimulation_Matlab/4b9450004ebb3390ab0a176e7d390bd7b6cf505a/Surfacewave_2D_FDTD_SG_CPML_FB.m -------------------------------------------------------------------------------- /ViscoAcoustic_2D_FDTD_SG1.m: -------------------------------------------------------------------------------- 1 | clc,clear 2 | % ViscoAcoustic wave simulation using finite difference. with staggered-grid. 3 | % By zhaoqingwei 4 | % Chengdu University of Technology (CDUT), 2021-2025 5 | %%%%%%%%%%%%%%%% 6 | % P--Vx--P 7 | % | | 8 | % Vz-----vz 9 | % | | 10 | % P--Vx--P 11 | %%%%%%%%%%%%%%% 12 | 13 | FM=20; 14 | DT=0.001;dt=DT; 15 | T=2; 16 | nx=600; 17 | nz=600; 18 | DH=10;dx=DH;dz=DH; 19 | 20 | s=wavelet(FM,DT,T)*1e5; 21 | vx0=zeros(nz,nx);vx1=vx0; 22 | vz0=vx0;vz1=vx0; 23 | p0=vx0;p1=vx0; 24 | v=ones(nz,nx)*4000;Q=ones(nz,nx)*100; 25 | z0=round(nz/2);x0=round(nx/2); 26 | 27 | nn=3; 28 | dxd=FDcoeffDx(nn);ddz0=dxd';ddz1=[dxd 0]';ddx0=ddz0';ddx1=ddz1'; 29 | TX=dt/dx;TZ=dt/dz; 30 | for t=DT:DT:T 31 | disp(t); 32 | k=round(t/DT); 33 | vz1=vz0+TZ*imfilter(p0,ddz0); 34 | vx1=vx0+TX*imfilter(p0,ddx0); 35 | p1=p0+(v.*v+1i*v.*v./Q).*(TZ.*imfilter(vz1,ddz1)+TX.*imfilter(vx1,ddx1)); 36 | 37 | p1(z0,x0)=p1(z0,x0)+s(k); 38 | p0=p1; 39 | vz0=vz1;vx0=vx1; 40 | 41 | if mod(t,0.5)==0 42 | figure(); 43 | imagesc(real(p1)); 44 | end 45 | end 46 | -------------------------------------------------------------------------------- /ViscoAcoustic_2D_FDTD_SG1_CMPL.m: -------------------------------------------------------------------------------- 1 | clc,clear 2 | % ViscoAcoustic wave simulation using finite difference. with staggered-grid. 3 | % By zhaoqingwei 4 | % Chengdu University of Technology (CDUT), 2021-2025 5 | %%%%%%%%%%%%%%%% 6 | % P--Vx--P 7 | % | | 8 | % Vz-----vz 9 | % | | 10 | % P--Vx--P 11 | %%%%%%%%%%%%%%% 12 | 13 | FM=20; 14 | DT=0.001;dt=DT; 15 | T=2; 16 | nx=600; 17 | nz=600; 18 | DH=10;dx=DH;dz=DH; 19 | 20 | s=wavelet(FM,DT,T)*1e5; 21 | v=ones(nz,nx)*4000;Q=ones(nz,nx)*100; 22 | z0=round(nz/2);x0=round(nx/2); 23 | 24 | vx0=zeros(nz,nx);vx1=vx0; 25 | vz0=vx0;vz1=vx0; 26 | p0=vx0;p1=vx0; 27 | 28 | EXX0=vx0;EXX1=vx0; 29 | EZZ0=vx0;EZZ1=vx0; 30 | HXX0=vx0;HXX1=vx0; 31 | HZZ0=vx0;HZZ1=vx0; 32 | [aaz,bbz,aax,bbx] = cpml(1e-6,[nz nx],20,max(v(:)),dt,dz); 33 | 34 | nn=3; 35 | dxd=FDcoeffDx(nn);ddz0=dxd';ddz1=[dxd 0]';ddx0=ddz0';ddx1=ddz1'; 36 | TX=dt/dx;TZ=dt/dz; 37 | for t=DT:DT:T 38 | disp(t); 39 | k=round(t/DT); 40 | EXX1=bbx.*EXX0+aax.*TX.*imfilter(p0,ddx0)/dt; 41 | EZZ1=bbz.*EZZ0+aaz.*TZ.*imfilter(p0,ddz0)/dt; 42 | vz1=vz0+TZ*imfilter(p0,ddz0)+EZZ1*dt; 43 | vx1=vx0+TX*imfilter(p0,ddx0)+EXX1*dt; 44 | 45 | HXX1=bbx.*HXX0+aax.*TX.*imfilter(vx1,ddx1)/dt; 46 | HZZ1=bbz.*HZZ0+aaz.*TZ.*imfilter(vz1,ddz1)/dt; 47 | p1=p0+(v.*v+1i*v.*v./Q).*(TZ.*imfilter(vz1,ddz1)+TX.*imfilter(vx1,ddx1)+(HXX1*dt+HZZ1*dt)); 48 | 49 | EXX0=EXX1;EZZ0=EZZ1; 50 | HXX0=HXX1;HZZ0=HZZ1; 51 | p1(z0,x0)=p1(z0,x0)+s(k); 52 | p0=p1; 53 | vz0=vz1;vx0=vx1; 54 | 55 | if mod(t,0.5)==0 56 | figure(); 57 | imagesc(real(p1)); 58 | end 59 | end 60 | -------------------------------------------------------------------------------- /ViscoAcoustic_2D_FDTD_SG2.m: -------------------------------------------------------------------------------- 1 | clc,clear 2 | % ViscoAcoustic wave simulation using finite difference. with staggered-grid. 3 | % By zhaoqingwei 4 | % Chengdu University of Technology (CDUT), 2021-2025 5 | %%%%%%%%%%%%%%%% 6 | % P--Vx--P 7 | % | | 8 | % Vz-----vz 9 | % | | 10 | % P--Vx--P 11 | %%%%%%%%%%%%%%% 12 | 13 | FM=20; 14 | DT=0.001;dt=DT; 15 | T=2; 16 | nx=600; 17 | nz=600; 18 | DH=10;dx=DH;dz=DH; 19 | 20 | s=wavelet(FM,DT,T)*1e5; 21 | vx0=zeros(nz,nx);vx1=vx0; 22 | vz0=vx0;vz1=vx0; 23 | p0=vx0;p1=vx0; 24 | v=ones(nz,nx)*4000;Q=ones(nz,nx)*100;vq=v./sqrt(Q*FM); 25 | z0=round(nz/2);x0=round(nx/2); 26 | 27 | nn=3; 28 | dxd=FDcoeffDx(nn);ddz0=dxd';ddz1=[dxd 0]';ddx0=ddz0';ddx1=ddz1'; 29 | TX=dt/dx;TZ=dt/dz; 30 | for t=DT:DT:T 31 | disp(t); 32 | k=round(t/DT); 33 | vz1=vz0+TZ*imfilter(p0,ddz0); 34 | vx1=vx0+TX*imfilter(p0,ddx0); 35 | vzt=TZ*imfilter(p0,ddz0)/dt; 36 | vxt=TX*imfilter(p0,ddx0)/dt; 37 | 38 | p1=p0+v.*v.*(TZ.*imfilter(vz1,ddz1)+TX.*imfilter(vx1,ddx1))+vq.*vq.*(TZ.*imfilter(vzt,ddz1)+TX.*imfilter(vxt,ddx1)); 39 | 40 | p1(z0,x0)=p1(z0,x0)+s(k); 41 | p0=p1; 42 | vz0=vz1;vx0=vx1; 43 | 44 | if mod(t,0.5)==0 45 | figure(); 46 | imagesc(real(p1)); 47 | end 48 | end 49 | -------------------------------------------------------------------------------- /ViscoAcoustic_2D_FDTD_SG2_CMPL.m: -------------------------------------------------------------------------------- 1 | clc,clear 2 | % ViscoAcoustic wave simulation using finite difference. with staggered-grid. 3 | % By zhaoqingwei 4 | % Chengdu University of Technology (CDUT), 2021-2025 5 | %%%%%%%%%%%%%%%% 6 | % P--Vx--P 7 | % | | 8 | % Vz-----vz 9 | % | | 10 | % P--Vx--P 11 | %%%%%%%%%%%%%%% 12 | 13 | FM=20; 14 | DT=0.001;dt=DT; 15 | T=2; 16 | nx=600; 17 | nz=600; 18 | DH=10;dx=DH;dz=DH; 19 | 20 | s=wavelet(FM,DT,T)*1e5; 21 | v=ones(nz,nx)*4000;Q=ones(nz,nx)*100;vq=v./sqrt(Q*FM); 22 | z0=round(nz/2);x0=round(nx/2); 23 | 24 | vx0=zeros(nz,nx);vx1=vx0; 25 | vz0=vx0;vz1=vx0; 26 | p0=vx0;p1=vx0; 27 | 28 | EXX0=vx0;EXX1=vx0; 29 | EZZ0=vx0;EZZ1=vx0; 30 | HXX0=vx0;HXX1=vx0; 31 | HZZ0=vx0;HZZ1=vx0; 32 | [aaz,bbz,aax,bbx] = cpml(1e-6,[nz nx],20,max(v(:)),dt,dz); 33 | 34 | nn=3; 35 | dxd=FDcoeffDx(nn);ddz0=dxd';ddz1=[dxd 0]';ddx0=ddz0';ddx1=ddz1'; 36 | TX=dt/dx;TZ=dt/dz; 37 | for t=DT:DT:T 38 | disp(t); 39 | k=round(t/DT); 40 | EXX1=bbx.*EXX0+aax.*TX.*imfilter(p0,ddx0)/dt; 41 | EZZ1=bbz.*EZZ0+aaz.*TZ.*imfilter(p0,ddz0)/dt; 42 | vz1=vz0+TZ*imfilter(p0,ddz0)+EZZ1*dt; 43 | vx1=vx0+TX*imfilter(p0,ddx0)+EXX1*dt; 44 | 45 | HXX1=bbx.*HXX0+aax.*TX.*imfilter(vx1,ddx1)/dt; 46 | HZZ1=bbz.*HZZ0+aaz.*TZ.*imfilter(vz1,ddz1)/dt; 47 | vzt=TZ*imfilter(p0,ddz0)/dt; 48 | vxt=TX*imfilter(p0,ddx0)/dt; 49 | p1=p0+v.*v.*(TZ.*imfilter(vz1,ddz1)+TX.*imfilter(vx1,ddx1)+(HXX1*dt+HZZ1*dt))+vq.*vq.*(TZ.*imfilter(vzt,ddz1)+TX.*imfilter(vxt,ddx1)); 50 | 51 | EXX0=EXX1;EZZ0=EZZ1; 52 | HXX0=HXX1;HZZ0=HZZ1; 53 | p1(z0,x0)=p1(z0,x0)+s(k); 54 | p0=p1; 55 | vz0=vz1;vx0=vx1; 56 | 57 | if mod(t,0.5)==0 58 | figure(); 59 | imagesc(real(p1)); 60 | end 61 | end 62 | -------------------------------------------------------------------------------- /ViscoElastic_2D_FDTD_SG_CPML.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaoqwei/WaveSimulation_Matlab/4b9450004ebb3390ab0a176e7d390bd7b6cf505a/ViscoElastic_2D_FDTD_SG_CPML.m -------------------------------------------------------------------------------- /acoustic_2D_FDTD.m: -------------------------------------------------------------------------------- 1 | clc,clear 2 | % Acoustic wave simulation using finite difference. 3 | % By zhaoqingwei 4 | % Chengdu University of Technology (CDUT), 2021-2025 5 | FM=20; 6 | DT=0.001; 7 | T=2; 8 | nx=600; 9 | nz=600; 10 | DH=10; 11 | 12 | s=wavelet(FM,DT,T); 13 | u1=zeros(nz,nx);u2=u1;u3=u1; 14 | v=ones(nz,nx)*2000; 15 | z0=round(nz/2);x0=round(nx/2); 16 | f=zeros(nx,nz);f(z0,x0)=1; 17 | 18 | nn=3; 19 | dxd=FDcoeffDxx(nn);dd=zeros(2*nn-1,2*nn-1);dd(nn,:)=dd(nn,:)+dxd;dd(:,nn)=dd(:,nn)+dxd'; 20 | for t=DT:DT:T 21 | k=round(t/DT); 22 | const1=v.*v*DT*DT/DH/DH; 23 | UU=imfilter(u2,dd); 24 | u3=2*u2-u1+const1.*UU+s(k)*f; 25 | 26 | u1=u2; 27 | u2=u3; 28 | 29 | if mod(t,0.5)==0 30 | figure(); 31 | imagesc(u3); 32 | end 33 | end 34 | -------------------------------------------------------------------------------- /acoustic_2D_FDTD_SG.m: -------------------------------------------------------------------------------- 1 | clc,clear 2 | % Acoustic wave simulation using finite difference. with staggered-grid. 3 | % By zhaoqingwei 4 | % Chengdu University of Technology (CDUT), 2021-2025 5 | %%%%%%%%%%%%%%%% 6 | % P--Vx--P 7 | % | | 8 | % Vz-----vz 9 | % | | 10 | % P--Vx--P 11 | %%%%%%%%%%%%%%% 12 | 13 | FM=20; 14 | DT=0.001;dt=DT; 15 | T=2; 16 | nx=600; 17 | nz=600; 18 | DH=10;dx=DH;dz=DH; 19 | 20 | s=wavelet(FM,DT,T); 21 | vx0=zeros(nz,nx);vx1=vx0; 22 | vz0=vx0;vz1=vx0; 23 | p0=vx0;p1=vx0; 24 | v=ones(nz,nx)*2000; 25 | z0=round(nz/2);x0=round(nx/2); 26 | 27 | nn=3; 28 | dxd=FDcoeffDx(nn);ddz0=dxd';ddz1=[dxd 0]';ddx0=ddz0';ddx1=ddz1'; 29 | TX=dt/dx;TZ=dt/dz; 30 | for t=DT:DT:T 31 | k=round(t/DT); 32 | vz1=vz0+TZ*imfilter(p0,ddz0); 33 | vx1=vx0+TX*imfilter(p0,ddx0); 34 | p1=p0+v.*v.*TZ.*imfilter(vz1,ddz1)+v.*v.*TX.*imfilter(vx1,ddx1); 35 | 36 | p1(z0,x0)=p1(z0,x0)+s(k); 37 | p0=p1; 38 | vz0=vz1;vx0=vx1; 39 | 40 | if mod(t,0.5)==0 41 | figure(); 42 | imagesc(p1); 43 | end 44 | end 45 | -------------------------------------------------------------------------------- /acoustic_2D_FDTD_SG_ABC.m: -------------------------------------------------------------------------------- 1 | clc,clear 2 | % Acoustic wave simulation using finite difference. 3 | % with staggered-grid; with sponge absorbing boundary condition; 4 | % By zhaoqingwei 5 | % Chengdu University of Technology (CDUT), 2021-2025 6 | %%%%%%%%%%%%%%%% 7 | % P--Vx--P 8 | % | | 9 | % Vz-----vz 10 | % | | 11 | % P--Vx--P 12 | %%%%%%%%%%%%%%% 13 | 14 | FM=20; 15 | DT=0.001;dt=DT; 16 | T=2; 17 | nx=600; 18 | nz=600; 19 | DH=10;dx=DH;dz=DH; 20 | 21 | s=wavelet(FM,DT,T); 22 | v=ones(nz,nx)*2000; 23 | z0=round(nz/2);x0=round(nx/2); 24 | 25 | vx0=zeros(nz,nx);vx1=vx0; 26 | vz0=vx0;vz1=vx0; 27 | p0=vx0;p1=vx0; 28 | 29 | [aaz,bbz,aax,bbx] = cpml(1e-10,[nz nx],20,max(v(:)),dt,dz); 30 | 31 | nn=3; 32 | dxd=FDcoeffDx(nn);ddz0=dxd';ddz1=[dxd 0]';ddx0=ddz0';ddx1=ddz1'; 33 | TX=dt/dx;TZ=dt/dz; 34 | for t=DT:DT:T 35 | k=round(t/DT); 36 | vz1=vz0+TZ*imfilter(p0,ddz0); 37 | vx1=vx0+TX*imfilter(p0,ddx0); 38 | vz1=vz1.*bbz; 39 | vx1=vx1.*bbx; 40 | p1=p0+v.*v.*TZ.*imfilter(vz1,ddz1)+v.*v.*TX.*imfilter(vx1,ddx1); 41 | p1=p1.*bbz.*bbx; 42 | 43 | p1(z0,x0)=p1(z0,x0)+s(k); 44 | p0=p1; 45 | vz0=vz1;vx0=vx1; 46 | 47 | if mod(t,0.5)==0 48 | figure(); 49 | imagesc(p1); 50 | end 51 | end 52 | -------------------------------------------------------------------------------- /acoustic_2D_FDTD_SG_CFSPML.m: -------------------------------------------------------------------------------- 1 | clc,clear 2 | % Acoustic wave simulation using finite difference. 3 | % with staggered-grid; with Convolutional Perfectly Matched Layer; 4 | % By zhaoqingwei 5 | % Chengdu University of Technology (CDUT), 2021-2025 6 | %%%%%%%%%%%%%%%% 7 | % P--Vx--P 8 | % | | 9 | % Vz-----vz 10 | % | | 11 | % P--Vx--P 12 | %%%%%%%%%%%%%%% 13 | FM=20; 14 | DT=0.001;dt=DT; 15 | T=2; 16 | nx=600; 17 | nz=600; 18 | DH=10;dx=DH;dz=DH; 19 | npml=20; 20 | 21 | s=wavelet(FM,DT,T); 22 | v=ones(nz,nx)*2000; 23 | z0=round(nz/2);x0=round(nx/2); 24 | 25 | vx0=zeros(nz,nx);vx1=vx0; 26 | vz0=vx0;vz1=vx0; 27 | p0=vx0;p1=vx0; 28 | 29 | EXX0=vx0;EXX1=vx0; 30 | EZZ0=vx0;EZZ1=vx0; 31 | HXX0=vx0;HXX1=vx0; 32 | HZZ0=vx0;HZZ1=vx0; 33 | [bbz,ccz,ddz,bbx,ccx,ddx] = cfspml(1e-4,[nz nx],npml,max(v(:)),dt,dz,2,FM*pi); 34 | aax=ccx;aaz=ccz; 35 | nn=3; 36 | dxd=FDcoeffDx(nn);ddz0=dxd';ddz1=[dxd 0]';ddx0=ddz0';ddx1=ddz1'; 37 | TX=dt/dx;TZ=dt/dz; 38 | 39 | for t=DT:DT:T 40 | k=round(t/DT); 41 | EXX1=bbx.*EXX0+aax.*TX.*imfilter(p0,ddx0)/dt; 42 | EZZ1=bbz.*EZZ0+aaz.*TZ.*imfilter(p0,ddz0)/dt; 43 | vz1=vz0+(ddz+1).*(TZ*imfilter(p0,ddz0))+(EZZ1*dt); 44 | vx1=vx0+(ddx+1).*(TX*imfilter(p0,ddx0))+(EXX1*dt); 45 | 46 | HXX1=bbx.*HXX0+aax.*TX.*imfilter(vx1,ddx1)/dt; 47 | HZZ1=bbz.*HZZ0+aaz.*TZ.*imfilter(vz1,ddz1)/dt; 48 | p1=p0+v.*v.*TZ.*(ddz+1).*imfilter(vz1,ddz1)+v.*v.*TX.*(ddx+1).*imfilter(vx1,ddx1)+v.*v.*(HXX1*dt+HZZ1*dt); 49 | 50 | EXX0=EXX1;EZZ0=EZZ1; 51 | HXX0=HXX1;HZZ0=HZZ1; 52 | p1(z0,x0)=p1(z0,x0)+s(k); 53 | p0=p1; 54 | vz0=vz1;vx0=vx1; 55 | 56 | if mod(t,0.5)==0 57 | figure(); 58 | imagesc(p1); 59 | end 60 | end 61 | -------------------------------------------------------------------------------- /acoustic_2D_FDTD_SG_CPML.m: -------------------------------------------------------------------------------- 1 | clc,clear 2 | % Acoustic wave simulation using finite difference. 3 | % with staggered-grid; with Convolutional Perfectly Matched Layer; 4 | % By zhaoqingwei 5 | % Chengdu University of Technology (CDUT), 2021-2025 6 | %%%%%%%%%%%%%%%% 7 | % P--Vx--P 8 | % | | 9 | % Vz-----vz 10 | % | | 11 | % P--Vx--P 12 | %%%%%%%%%%%%%%% 13 | 14 | FM=20; 15 | DT=0.001;dt=DT; 16 | T=2; 17 | nx=600; 18 | nz=600; 19 | DH=10;dx=DH;dz=DH; 20 | 21 | s=wavelet(FM,DT,T); 22 | v=ones(nz,nx)*2000; 23 | z0=round(nz/2);x0=round(nx/2); 24 | 25 | vx0=zeros(nz,nx);vx1=vx0; 26 | vz0=vx0;vz1=vx0; 27 | p0=vx0;p1=vx0; 28 | 29 | EXX0=vx0;EXX1=vx0; 30 | EZZ0=vx0;EZZ1=vx0; 31 | HXX0=vx0;HXX1=vx0; 32 | HZZ0=vx0;HZZ1=vx0; 33 | [aaz,bbz,aax,bbx] = cpml(1e-10,[nz nx],20,max(v(:)),dt,dz); 34 | 35 | nn=3; 36 | dxd=FDcoeffDx(nn);ddz0=dxd';ddz1=[dxd 0]';ddx0=ddz0';ddx1=ddz1'; 37 | TX=dt/dx;TZ=dt/dz; 38 | for t=DT:DT:T 39 | k=round(t/DT); 40 | EXX1=bbx.*EXX0+aax.*TX.*imfilter(p0,ddx0)/dt; 41 | EZZ1=bbz.*EZZ0+aaz.*TZ.*imfilter(p0,ddz0)/dt; 42 | vz1=vz0+TZ*imfilter(p0,ddz0)+EZZ1*dt; 43 | vx1=vx0+TX*imfilter(p0,ddx0)+EXX1*dt; 44 | 45 | HXX1=bbx.*HXX0+aax.*TX.*imfilter(vx1,ddx1)/dt; 46 | HZZ1=bbz.*HZZ0+aaz.*TZ.*imfilter(vz1,ddz1)/dt; 47 | p1=p0+v.*v.*TZ.*imfilter(vz1,ddz1)+v.*v.*TX.*imfilter(vx1,ddx1)+v.*v.*(HXX1*dt+HZZ1*dt); 48 | 49 | EXX0=EXX1;EZZ0=EZZ1; 50 | HXX0=HXX1;HZZ0=HZZ1; 51 | p1(z0,x0)=p1(z0,x0)+s(k); 52 | p0=p1; 53 | vz0=vz1;vx0=vx1; 54 | 55 | if mod(t,0.5)==0 56 | figure(); 57 | imagesc(p1); 58 | end 59 | end 60 | -------------------------------------------------------------------------------- /acoustic_2D_FDTD_SG_SPML.m: -------------------------------------------------------------------------------- 1 | clc,clear 2 | % Acoustic wave simulation using finite difference. 3 | % with staggered-grid; with Split Perfectly Matched Layer; 4 | % By zhaoqingwei 5 | % Chengdu University of Technology (CDUT), 2021-2025 6 | %%%%%%%%%%%%%%%% 7 | % P--Vx--P 8 | % | | 9 | % Vz-----vz 10 | % | | 11 | % P--Vx--P 12 | %%%%%%%%%%%%%%% 13 | 14 | FM=20; 15 | DT=0.001;dt=DT; 16 | T=2; 17 | nx=600; 18 | nz=600; 19 | DH=10;dx=DH;dz=DH; 20 | 21 | s=wavelet(FM,DT,T); 22 | v=ones(nz,nx)*2000; 23 | z0=round(nz/2);x0=round(nx/2); 24 | 25 | vx0=zeros(nz,nx);vx1=vx0; 26 | vz0=vx0;vz1=vx0; 27 | p0=vx0;p1=vx0; 28 | px0=vx0;px1=vx0;pz0=vx0;pz1=vx0; 29 | 30 | [aaz,bbz,aax,bbx] = cpml(1e-10,[nz nx],20,max(v(:)),dt,dz); 31 | ddz=-log(bbz)/dt;ddx=-log(bbx)/dt; 32 | 33 | nn=3; 34 | dxd=FDcoeffDx(nn);ddz0=dxd';ddz1=[dxd 0]';ddx0=ddz0';ddx1=ddz1'; 35 | TX=dt/dx;TZ=dt/dz; 36 | for t=DT:DT:T 37 | k=round(t/DT); 38 | 39 | vz1=(1-ddz*dt).*vz0+TZ*imfilter(p0,ddz0);% 40 | vx1=(1-ddx*dt).*vx0+TX*imfilter(p0,ddx0); 41 | 42 | pz1=(1-ddz*dt).*pz0+v.*v.*TZ.*imfilter(vz1,ddz1); 43 | px1=(1-ddx*dt).*px0+v.*v.*TX.*imfilter(vx1,ddx1); 44 | p1=pz1+px1; 45 | 46 | p1(z0,x0)=p1(z0,x0)+s(k); 47 | p0=p1; 48 | pz0=pz1;px0=px1; 49 | vz0=vz1;vx0=vx1; 50 | 51 | if mod(t,0.1)==0 52 | figure(); 53 | imagesc(p1); 54 | end 55 | end 56 | -------------------------------------------------------------------------------- /acoustic_3D_FDTD.m: -------------------------------------------------------------------------------- 1 | clc,clear 2 | % 3D - Acoustic wave simulation using finite difference. 3 | % By zhaoqingwei 4 | % Chengdu University of Technology (CDUT), 2021-2025 5 | FM=20; 6 | DT=0.001; 7 | T=2; 8 | nx=200; 9 | ny=200; 10 | nz=200; 11 | DH=10; 12 | 13 | s=wavelet(FM,DT,T); 14 | u1=zeros(nz,nx,ny);u2=u1;u3=u1; 15 | v=ones(nz,nx,ny)*2000; 16 | z0=round(nz/2);x0=round(nx/2);y0=round(ny/2); 17 | f=zeros(nz,nx,ny);f(z0,x0,x0)=1; 18 | 19 | nn=3; 20 | dxd=FDcoeffDxx(nn);ddz=zeros(2*nn-1,2*nn-1,2*nn-1);ddz(:,nn,nn)=dxd;ddx = permute(ddz,[2 1 3]);ddy = permute(ddz,[3 2 1]);dd=ddz+ddx+ddy; 21 | for t=DT:DT:T 22 | k=round(t/DT); 23 | const1=v.*v*DT*DT/DH/DH; 24 | UU=imfilter(u2,dd); 25 | u3=2*u2-u1+const1.*UU+s(k)*f; 26 | 27 | u1=u2; 28 | u2=u3; 29 | 30 | if mod(t,0.5)==0 31 | figure(); 32 | imagesc(u3(:,:,y0)); 33 | end 34 | end 35 | -------------------------------------------------------------------------------- /acoustic_3D_FDTD_SG.m: -------------------------------------------------------------------------------- 1 | clc,clear 2 | % 3D - Acoustic wave simulation using finite difference. with staggered-grid. 3 | % By zhaoqingwei 4 | % Chengdu University of Technology (CDUT), 2021-2025 5 | %%%%%%%%%%%%%%%%%%%%%%%%% 6 | % P--Vx--P 7 | % / / 8 | % Vy --- Vy 9 | % / / 10 | % P--Vx--P 11 | % | | 12 | % Vz-----vz 13 | % | | 14 | % P--Vx--P 15 | %%%%%%%%%%%%%%%%%%%%%%%%% 16 | 17 | FM=20; 18 | DT=0.001;dt=DT; 19 | T=2; 20 | nx=200; 21 | ny=200; 22 | nz=200; 23 | DH=10;dx=DH;dz=DH;dy=DH; 24 | 25 | s=wavelet(FM,DT,T); 26 | vx0=zeros(nz,nx,ny);vx1=vx0; 27 | vz0=vx0;vz1=vx0; 28 | vy0=vx0;vy1=vx0; 29 | p0=vx0;p1=vx0; 30 | v=ones(nz,nx,ny)*2000; 31 | z0=round(nz/2);x0=round(nx/2);y0=round(ny/2); 32 | 33 | nn=3; 34 | dxd=FDcoeffDx(nn);ddz0(:,1,1)=dxd';ddz1(:,1,1)=[dxd 0]'; 35 | ddx0=permute(ddz0,[2 1 3]);ddx1=permute(ddz1,[2 1 3]);ddy0=permute(ddz0,[3 2 1]);ddy1=permute(ddz1,[3 2 1]); 36 | TX=dt/dx;TZ=dt/dz;TY=dt/dy; 37 | 38 | for t=DT:DT:T 39 | k=round(t/DT); 40 | vz1=vz0+TZ*imfilter(p0,ddz0); 41 | vx1=vx0+TX*imfilter(p0,ddx0); 42 | vy1=vy0+TY*imfilter(p0,ddy0); 43 | p1=p0+v.*v.*TZ.*imfilter(vz1,ddz1)+v.*v.*TX.*imfilter(vx1,ddx1)+v.*v.*TY.*imfilter(vy1,ddy1); 44 | 45 | p1(z0,x0,y0)=p1(z0,x0,y0)+s(k); 46 | p0=p1; 47 | vz0=vz1;vx0=vx1;vy0=vy1; 48 | 49 | if mod(t,0.5)==0 50 | figure(); 51 | imagesc(p1(:,:,y0)); 52 | end 53 | end 54 | -------------------------------------------------------------------------------- /acoustic_3D_FDTD_SG_CPML.m: -------------------------------------------------------------------------------- 1 | clc,clear 2 | % 3D - Acoustic wave simulation using finite difference. 3 | % with staggered-grid; with Convolutional Perfectly Matched Layer; 4 | % By zhaoqingwei 5 | % Chengdu University of Technology (CDUT), 2021-2025 6 | %%%%%%%%%%%%%%%%%%%%%%%%% 7 | % P--Vx--P 8 | % / / 9 | % Vy --- Vy 10 | % / / 11 | % P--Vx--P 12 | % | | 13 | % Vz-----vz 14 | % | | 15 | % P--Vx--P 16 | %%%%%%%%%%%%%%%%%%%%%%%%% 17 | 18 | FM=20; 19 | DT=0.001;dt=DT; 20 | T=2; 21 | nx=200; 22 | ny=200; 23 | nz=200; 24 | DH=10;dx=DH;dz=DH;dy=DH; 25 | 26 | s=wavelet(FM,DT,T); 27 | v=ones(nz,nx,ny)*2000; 28 | z0=round(nz/2);x0=round(nx/2);y0=round(ny/2); 29 | vx0=zeros(nz,nx,ny);vx1=vx0; 30 | vz0=vx0;vz1=vx0; 31 | vy0=vx0;vy1=vx0; 32 | p0=vx0;p1=vx0; 33 | EXX0=vx0;EXX1=vx0; 34 | EYY0=vx0;EYY1=vx0; 35 | EZZ0=vx0;EZZ1=vx0; 36 | HXX0=vx0;HXX1=vx0; 37 | HYY0=vx0;HYY1=vx0; 38 | HZZ0=vx0;HZZ1=vx0; 39 | [aaz,bbz,aax,bbx,aay,bby] = cpml(1e-10,[nz nx ny],20,max(v(:)),dt,dz); 40 | 41 | nn=3; 42 | dxd=FDcoeffDx(nn);ddz0(:,1,1)=dxd';ddz1(:,1,1)=[dxd 0]'; 43 | ddx0=permute(ddz0,[2 1 3]);ddx1=permute(ddz1,[2 1 3]);ddy0=permute(ddz0,[3 2 1]);ddy1=permute(ddz1,[3 2 1]); 44 | TX=dt/dx;TZ=dt/dz;TY=dt/dy; 45 | for t=DT:DT:T 46 | disp(t); 47 | k=round(t/DT); 48 | EXX1=bbx.*EXX0+aax.*TX.*imfilter(p0,ddx0)/dt; 49 | EYY1=bby.*EYY0+aay.*TY.*imfilter(p0,ddy0)/dt; 50 | EZZ1=bbz.*EZZ0+aaz.*TZ.*imfilter(p0,ddz0)/dt; 51 | vz1=vz0+TZ*imfilter(p0,ddz0)+EZZ1*dt; 52 | vx1=vx0+TX*imfilter(p0,ddx0)+EXX1*dt; 53 | vy1=vy0+TY*imfilter(p0,ddy0)+EYY1*dt; 54 | 55 | HXX1=bbx.*HXX0+aax.*TX.*imfilter(vx1,ddx1)/dt; 56 | HYY1=bby.*HYY0+aay.*TY.*imfilter(vy1,ddy1)/dt; 57 | HZZ1=bbz.*HZZ0+aaz.*TZ.*imfilter(vz1,ddz1)/dt; 58 | p1=p0+v.*v.*TZ.*imfilter(vz1,ddz1)+v.*v.*TX.*imfilter(vx1,ddx1)+v.*v.*TY.*imfilter(vy1,ddy1)+v.*v.*(HXX1*dt+HZZ1*dt+HYY1*dt); 59 | 60 | p1(z0,x0,y0)=p1(z0,x0,y0)+s(k); 61 | p0=p1; 62 | vz0=vz1;vx0=vx1;vy0=vy1; 63 | EXX0=EXX1;EYY0=EYY1;EZZ0=EZZ1; 64 | HXX0=HXX1;HYY0=HYY1;HZZ0=HZZ1; 65 | 66 | if mod(t,0.5)==0 67 | figure(); 68 | imagesc(p1(:,:,y0)); 69 | end 70 | end 71 | -------------------------------------------------------------------------------- /bond.m: -------------------------------------------------------------------------------- 1 | function [ M ] = bond( angel ) 2 | %bond£º calculates the bond transformation of the elastic stiffness 3 | % By zhaoqingwei 4 | % Chengdu University of Technology (CDUT), 2021-2025 5 | a1=angel(1);a2=angel(2);a3=angel(3); 6 | A1=[cos(a1) sin(a1) 0;-sin(a1) cos(a1) 0;0 0 1;]; 7 | A2=[1 0 0;0 cos(a2) sin(a2);0 -sin(a2) cos(a2);]; 8 | A3=[cos(a3) 0 -sin(a3);0 1 0;sin(a3) 0 cos(a3);]; 9 | A=A1*A2*A3; 10 | M1=[A(1,1)*A(1,1) A(1,2)*A(1,2) A(1,3)*A(1,3); 11 | A(2,1)*A(2,1) A(2,2)*A(2,2) A(2,3)*A(2,3); 12 | A(3,1)*A(3,1) A(3,2)*A(3,2) A(3,3)*A(3,3);]; 13 | M2=[A(1,2)*A(1,3) A(1,3)*A(1,1) A(1,1)*A(1,2); 14 | A(2,2)*A(2,3) A(2,3)*A(2,1) A(2,1)*A(2,2); 15 | A(3,2)*A(3,3) A(3,3)*A(3,1) A(3,1)*A(3,2);]; 16 | M3=[A(2,1)*A(3,1) A(2,2)*A(3,2) A(2,3)*A(3,3); 17 | A(3,1)*A(1,1) A(3,2)*A(1,2) A(3,3)*A(1,3); 18 | A(1,1)*A(2,1) A(1,2)*A(2,2) A(1,3)*A(2,3);]; 19 | M4=[A(2,2)*A(3,3)+A(2,3)*A(3,2) A(2,1)*A(3,3)+A(2,3)*A(3,1) A(2,2)*A(3,1)+A(2,1)*A(3,2); 20 | A(1,2)*A(3,3)+A(1,3)*A(3,2) A(1,1)*A(3,3)+A(1,3)*A(3,1) A(1,1)*A(3,2)+A(1,2)*A(3,1); 21 | A(2,2)*A(1,3)+A(1,2)*A(2,3) A(1,1)*A(2,3)+A(1,3)*A(2,1) A(2,2)*A(1,1)+A(1,2)*A(2,1);]; 22 | M = [M1, 2*M2; M3, M4]; 23 | 24 | end 25 | 26 | -------------------------------------------------------------------------------- /cfspml.m: -------------------------------------------------------------------------------- 1 | function [bbz,ccz,dddz,bbx,ccx,dddx ] = cfspml( R,Size,pmln,Vmax,dt,dz,Gmax,Amax) 2 | %CFS-PML: make CFS Perfectly Matched Layer 3 | % By zhaoqingwei 4 | % Chengdu University of Technology (CDUT), 2021-2025 5 | if nargin < 6 6 | R=1e-10; 7 | pmln=20; 8 | Size=[600 600]; 9 | Vmax=2000; 10 | dt=0.001; 11 | dz=10; 12 | end 13 | nD=length(Size); 14 | if nD<2 15 | error('dimension size is error '); 16 | end 17 | 18 | if nD==2 19 | z=Size(1);x=Size(2); 20 | ddz=zeros(z,x);ddx=zeros(x,z); 21 | ggz=ones(z,x);ggx=ones(x,z); 22 | alphz=zeros(z,x);alphx=zeros(x,z); 23 | I=pmln; 24 | for iz=1:z 25 | if iz<=I 26 | ddz(iz,:)=(I-iz+1)*(I-iz+1)/I/I*ones(1,x); 27 | ggz(iz,:)=1+(Gmax-1)*(((I-iz+1)/I)^2)*ones(1,x); 28 | alphz(iz,:)=Amax*(iz)/I*ones(1,x); 29 | end 30 | if iz>z-I 31 | ddz(iz,:)=(-z+I+iz)*(-z+I+iz)/I/I*ones(1,x); 32 | ggz(iz,:)=1+(Gmax-1)*(((-z+I+iz)/I)^2)*ones(1,x); 33 | alphz(iz,:)=Amax*(z-iz+1)/I*ones(1,x); 34 | end 35 | end 36 | for ix=1:x 37 | if ix<=I 38 | ddx(ix,:)=(I-ix+1)*(I-ix+1)/I/I*ones(1,z); 39 | ggx(ix,:)=1+(Gmax-1)*(((I-ix+1)/I)^2)*ones(1,z); 40 | alphx(ix,:)=Amax*(ix)/I*ones(1,z); 41 | end 42 | if ix>x-I 43 | ddx(ix,:)=(-x+I+ix)*(-x+I+ix)/I/I*ones(1,z); 44 | ggx(ix,:)=1+(Gmax-1)*(((-x+I+ix)/I)^2)*ones(1,z); 45 | alphx(ix,:)=Amax*(x-ix+1)/I*ones(1,z); 46 | end 47 | end 48 | AA=-log(R)*Vmax*3/2/(pmln*dz); 49 | ddz=ddz*AA; 50 | bbz=exp(-(alphz+ddz./ggz)*dt); 51 | ccz=ddz./(ddz.*ggz+ggz.*ggz.*alphz).*(bbz-1); 52 | ccz(isnan(ccz))=0; 53 | dddz=(1-ggz)./ggz; 54 | 55 | 56 | AA=-log(R)*Vmax*3/2/(pmln*dz); 57 | ddx=ddx*AA; 58 | bbx1=exp(-(alphx+ddx./ggx)*dt); 59 | ccx1=ddx./(ddx.*ggx+ggx.*ggx.*alphx).*(bbx1-1); 60 | ccx1(isnan(ccx1))=0; 61 | dddx1=(1-ggx)./ggx; 62 | 63 | dddx = permute(dddx1,[2 1 3]); 64 | ccx = permute(ccx1,[2 1 3]); 65 | bbx = permute(bbx1,[2 1 3]); 66 | end 67 | end 68 | 69 | -------------------------------------------------------------------------------- /cpml.m: -------------------------------------------------------------------------------- 1 | function [ aaz,bbz,aax,bbx,aay,bby ] = cpml( R,Size,pmln,Vmax,dt,dz) 2 | %CPML: make Conv Perfectly Matched Layer 3 | % By zhaoqingwei 4 | % Chengdu University of Technology (CDUT), 2021-2025 5 | if nargin < 6 6 | R=1e-10; 7 | pmln=20; 8 | Size=[600 600]; 9 | Vmax=2000; 10 | dt=0.001; 11 | dz=10; 12 | end 13 | nD=length(Size); 14 | if nD<2 15 | error('dimension size is error '); 16 | end 17 | 18 | 19 | if nD==2 20 | z=Size(1);x=Size(2); 21 | ddz=zeros(z,x);ddx=zeros(x,z); 22 | I=pmln; 23 | for iz=1:z 24 | if iz<=I 25 | ddz(iz,:)=(I-iz+1)*(I-iz+1)/I/I*ones(1,x); 26 | end 27 | if iz>=z-I 28 | ddz(iz,:)=(-z+I+iz)*(-z+I+iz)/I/I*ones(1,x); 29 | end 30 | end 31 | for ix=1:x 32 | if ix<=I 33 | ddx(ix,:)=(I-ix+1)*(I-ix+1)/I/I*ones(1,z); 34 | end 35 | if ix>=x-I 36 | ddx(ix,:)=(-x+I+ix)*(-x+I+ix)/I/I*ones(1,z); 37 | end 38 | end 39 | 40 | AA=-log(R)*Vmax*3/2/(pmln*dz); 41 | ddz=ddz*AA; 42 | bbz=exp(-ddz*dt); 43 | aaz=bbz-1; 44 | ddx=ddx*AA; 45 | bbx1=exp(-ddx*dt); 46 | aax1=bbx1-1; 47 | 48 | bbx = permute(bbx1,[2 1 3]); 49 | aax = permute(aax1,[2 1 3]); 50 | bby=[]; 51 | aay=[]; 52 | end 53 | if nD==3 54 | z=Size(1);x=Size(2);y=Size(3); 55 | ddz=zeros(z,x,y);ddx=zeros(x,z,y);ddy=zeros(y,x,z); 56 | I=pmln; 57 | for iz=1:z 58 | if iz<=I 59 | ddz(iz,:,:)=(I-iz+1)*(I-iz+1)/I/I*ones(x,y); 60 | end 61 | if iz>=z-I 62 | ddz(iz,:,:)=(-z+I+iz)*(-z+I+iz)/I/I*ones(x,y); 63 | end 64 | end 65 | for ix=1:x 66 | if ix<=I 67 | ddx(ix,:,:)=(I-ix+1)*(I-ix+1)/I/I*ones(z,y); 68 | end 69 | if ix>=x-I 70 | ddx(ix,:,:)=(-x+I+ix)*(-x+I+ix)/I/I*ones(z,y); 71 | end 72 | end 73 | for iy=1:y 74 | if iy<=I 75 | ddy(iy,:,:)=(I-iy+1)*(I-iy+1)/I/I*ones(x,z); 76 | end 77 | if iy>=y-I 78 | ddy(iy,:,:)=(-y+I+iy)*(-y+I+iy)/I/I*ones(x,z); 79 | end 80 | end 81 | AA=-log(R)*Vmax*3/2/(pmln*dz); 82 | ddz=ddz*AA;ddx=ddx*AA;ddy=ddy*AA; 83 | bbz=exp(-ddz*dt);aaz=bbz-1; 84 | bbx1=exp(-ddx*dt);aax1=bbx1-1; 85 | bby1=exp(-ddy*dt);aay1=bby1-1; 86 | bbx = permute(bbx1,[2 1 3]);aax = permute(aax1,[2 1 3]); 87 | bby = permute(bby1,[3 2 1]);aay = permute(aay1,[3 2 1]); 88 | end 89 | end 90 | 91 | -------------------------------------------------------------------------------- /doc/A numerical tour of wave propagation.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaoqwei/WaveSimulation_Matlab/4b9450004ebb3390ab0a176e7d390bd7b6cf505a/doc/A numerical tour of wave propagation.pdf -------------------------------------------------------------------------------- /elastic_2D_FDTD_SG.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaoqwei/WaveSimulation_Matlab/4b9450004ebb3390ab0a176e7d390bd7b6cf505a/elastic_2D_FDTD_SG.m -------------------------------------------------------------------------------- /elastic_2D_FDTD_SG_CPML.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaoqwei/WaveSimulation_Matlab/4b9450004ebb3390ab0a176e7d390bd7b6cf505a/elastic_2D_FDTD_SG_CPML.m -------------------------------------------------------------------------------- /elastic_3D_FDTD_SG.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaoqwei/WaveSimulation_Matlab/4b9450004ebb3390ab0a176e7d390bd7b6cf505a/elastic_3D_FDTD_SG.m -------------------------------------------------------------------------------- /elastic_3D_FDTD_SG_CPML.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaoqwei/WaveSimulation_Matlab/4b9450004ebb3390ab0a176e7d390bd7b6cf505a/elastic_3D_FDTD_SG_CPML.m -------------------------------------------------------------------------------- /get2d_9seismat.m: -------------------------------------------------------------------------------- 1 | function seismat=get2d_9seismat(v,w,dx,dz,pmlx,pmlz) 2 | % nine points rotate grid different 3 | % 4 | [z,x]=size(v); 5 | a=0.5461;c=0.6248;d=0.09381; 6 | %1996year jo a=0.5461,c=0.6248,d=0.09381; 7 | 8 | %% 9 | dt=1;% Fake, no-uses 10 | [aaz,bbz,aax,bbx] = cpml(1e-10,[z,x],pmlx,max(v(:)),dt,dz); 11 | ddz=-log(bbz)/dt;ddx=-log(bbx)/dt; 12 | 13 | ex=1-1i*ddx/w; 14 | ez=1-1i*ddz/w; 15 | %% 16 | V_ma=reshape(v.',z*x,1); 17 | EX_ma=reshape(ex.',z*x,1); 18 | EZ_ma=reshape(ez.',z*x,1); 19 | 20 | %% 21 | med=2*(a./(EZ_ma.*EZ_ma*dz*dz))+2*(a./(EX_ma.*EX_ma*dx*dx))+2*((1-a)./(EZ_ma.*EZ_ma*(dx*dx+dz*dz)))... 22 | +2*((1-a)./(EX_ma.*EX_ma*(dx*dx+dz*dz)))-c*w*w./(V_ma.*V_ma); 23 | ax=2*(1-a)./(2*EX_ma.*EX_ma*(dx*dx+dz*dz))+(1-c-4*d)*w*w./(4*V_ma.*V_ma); 24 | az=2*(1-a)./(2*EZ_ma.*EZ_ma*(dx*dx+dz*dz))+(1-c-4*d)*w*w./(4*V_ma.*V_ma); 25 | bx=2*a./(2*(EX_ma.*EX_ma*dx*dx))+d*w*w./(V_ma.*V_ma); 26 | bz=2*a./(2*(EZ_ma.*EZ_ma*dz*dz))+d*w*w./(V_ma.*V_ma); 27 | seismat=-spdiags(med,0,x*z,x*z)+spdiags([0;bx(1:end-1)],1,x*z,x*z)+spdiags([bx(2:end);0],-1,x*z,x*z)+spdiags([zeros(x,1);bz(1:end-x)],x,x*z,x*z)+... 28 | spdiags([bz(1+x:end);zeros(x,1)],-x,x*z,x*z)+spdiags([zeros(x,1);ax(2:end-x);0],(x-1),x*z,x*z)+spdiags([0;ax(1+x:(end-1));zeros(x,1)],-(x-1),x*z,x*z)+... 29 | spdiags([zeros(x+1,1);az(1:(end-1-x))],(x+1),x*z,x*z)+spdiags([az(2+x:(end));zeros(x+1,1)],-(x+1),x*z,x*z); 30 | for k=(x+1):x:z*x 31 | seismat(k-1,k)=0;seismat(k,k-1)=0; 32 | end 33 | for k=(2*x+1):x:z*x 34 | seismat(k-x-1,k)=0;seismat(k,k-x-1)=0;seismat(k-x,k-1)=0;seismat(k-1,k-x)=0; 35 | end 36 | -------------------------------------------------------------------------------- /img/2DAcoustic.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaoqwei/WaveSimulation_Matlab/4b9450004ebb3390ab0a176e7d390bd7b6cf505a/img/2DAcoustic.gif -------------------------------------------------------------------------------- /img/2DElasticVx.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaoqwei/WaveSimulation_Matlab/4b9450004ebb3390ab0a176e7d390bd7b6cf505a/img/2DElasticVx.gif -------------------------------------------------------------------------------- /img/2DElasticVz.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaoqwei/WaveSimulation_Matlab/4b9450004ebb3390ab0a176e7d390bd7b6cf505a/img/2DElasticVz.gif -------------------------------------------------------------------------------- /img/3DAcoustic.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaoqwei/WaveSimulation_Matlab/4b9450004ebb3390ab0a176e7d390bd7b6cf505a/img/3DAcoustic.gif -------------------------------------------------------------------------------- /wavelet.m: -------------------------------------------------------------------------------- 1 | function s = wavelet(f,dt,T) 2 | %WAVELET make wavlet. 3 | % By zhaoqingwei 4 | % Chengdu University of Technology (CDUT), 2021-2025 5 | if nargin < 3 6 | f=20;dt=0.001;T=4; 7 | end 8 | fm=f; 9 | dtt=dt; 10 | t=1/f; 11 | tt=-t:dtt:t; 12 | s=zeros(1,round(T/dtt)); 13 | wave=(1-2*(pi*fm*tt).^2).*exp(-(pi*fm*tt).^2); 14 | 15 | s(1:length(wave))=wave; 16 | end 17 | 18 | --------------------------------------------------------------------------------