有限差分法在地震波二维正演模拟中的应用(OUC大作业,文末有源码)

1. 雷克子波

中心频率f=25,控制频带宽度的参数γ=3
中心频率f=25,控制频带宽度的参数γ=3]
matlab代码
在这里插入图片描述

2. 设置一个均匀介质模型,整个区域的速度值可设为常数,即只有一种介质,将震源点放在模型中间,分别记录两个时刻的波前快照(即该时刻区域内所有网格点的波场值)。第一时刻为地震波还未传播到边界上的某时刻,第二时刻为地震波已经传播到边界上的某时刻,体会其人工边界反射

0.4s Tn=800
在这里插入图片描述
在这里插入图片描述

3. 给定水平层状介质模型,震源位于浅层中央处,绘制波前快照和地震记录,观测直达波、透射波、反射波

在这里插入图片描述
震源3,100
上层 2000m/s 0-80
中层 2500m/s 80-130
下层 3000m/s 130-200

波前快照
Tn=100
在这里插入图片描述
Tn=500
在这里插入图片描述
Tn=900
在这里插入图片描述

Tn=1100
在这里插入图片描述
Tn=1200
在这里插入图片描述
Tn=1300
在这里插入图片描述
地震记录
在这里插入图片描述

4. 自主设计模型和观测方式,至少观测如下一种波:多次波、绕射波、折射波,波前和记录都要有。

模型
在这里插入图片描述
分界面方程
i>(10*(j-100)^2+50)

震源3,60
低速2000
高速3000

Tn=500
在这里插入图片描述
Tn=700
在这里插入图片描述
Tn=800
在这里插入图片描述

Tn=1200
在这里插入图片描述
地震记录
在这里插入图片描述

5. 拓展:

①模拟倾斜界面、起伏界面、断层、盆地等特殊地质构造中地震波传播
②研究实现吸收边界处理
③地震波传播过程中的几何扩散效应及波形变化规律(后面节内容)

分界面方程
i>(50sin(jpi/50)+100)
低速2000
高速3000
震源3,100

在这里插入图片描述

波前记录
Tn=200

在这里插入图片描述
Tn=500
在这里插入图片描述
Tn=700
在这里插入图片描述
Tn=900
在这里插入图片描述
地震记录
在这里插入图片描述

6. 源码

6.1 C++

#include <stdio.h>
#include <math.h>
#include <stdlib.h>


int Tn;
int Xn; 
int Zn;
#define PI 3.141592653589793


#define X 3
#define Y 60


#define DH 8.0
#define DT 0.0005

#define Frequency 25
#define Round 3

int main()
{

	printf("Hello this is a program to caculate acoustic wave equation\n");
	printf("Please input the Xn, Zn and Tn\n");
	printf("Xn is :");
	if (scanf_s("%d", &Xn) != 1 || Xn <= 0)
	{
		printf("What youinput is nonesense! \n");
		exit(1);
	}
	printf("Zn is :");
	if (scanf_s("%d", &Zn) != 1 || Xn <= 0)
	{
		printf("what youinput is nonesense !\n");
		exit(1);
	}
	printf("Tn is : ");
	if (scanf_s("%d", &Tn) != 1 || Xn <= 0)
	{
		printf("what youinput is nonesense!\n");
		exit(1);
	}


	double* w = (double*)malloc(sizeof(double) * Tn);


	for (int i = 0; i < Tn; i++)
	{
		w[i] = exp(-(2 * PI * Frequency / Round) * (2 * PI * Frequency / Round) * DT * (i - 90) * (i - 90) * DT) * cos(2 * PI * Frequency * DT * (i - 90));
	}

	double** vel = (double**)malloc(sizeof(double*) * Xn);
	for (int i = 0; i < Xn; i++)
	{
		vel[i] = (double*)malloc(sizeof(double) * Zn);
	}

    //绕射
	/*
		for (int i = 0; i < Xn; i++)
			for (int j = 0; j < Zn; j++)
			{
				vel[i][j] = 3000;//均匀介质
			}

		*/
	
	/*
	for (int i = 0; i < Xn; i++)
		for (int j = 0; j < Zn; j++)
			if (i > (10 * pow((j - 100) , 2) + 50))
			{
				vel[i][j] = 3000; 
			}
			else
			{
				vel[i][j] = 2000; 
			}
    */

	//起伏界面
	/*
	for (int i = 0; i < Xn; i++)
		for (int j = 0; j < Zn; j++)
			if (i > (50* sin(j*PI/50)) + 100))
			{
				vel[i][j] = 3000;
			}
			else
			{
				vel[i][j] = 2000;
			}
    */

    //盆地
	/*
	for (int i = 0; i < Xn; i++)
	{
		for (int j = 0; j < Zn; j++)
		{
			if (j < (i-400)||(j>900-i)||(i>450))
			{
				vel[i][j] = 2000;
			}
			else
			{
				vel[i][j] = 3000;
			}
		}
	}*/

	//malloc the size for the grid
	double** p_now = (double**)malloc(sizeof(double*) * Xn);
	for (int i = 0; i < Xn; i++)
	{
		p_now[i] = (double*)malloc(sizeof(double) * Zn);
	}


	double** p_past = (double**)malloc(sizeof(double*) * Xn);
	for (int i = 0; i < Xn; i++)
	{
		p_past[i] = (double*)malloc(sizeof(double) * Zn);
	}


	double** temp = (double**)malloc(sizeof(double*) * Xn);
	for (int i = 0; i < Xn; i++)
	{
		temp[i] = (double*)malloc(sizeof(double) * Zn);
	}

    //波前
	double** wavefront = (double**)malloc(sizeof(double*) * Tn);
	for (int i = 0; i < Tn; i++)
	{
		wavefront[i] = (double*)malloc(sizeof(double) * Zn);
	}


	double** p_temp;

	for (int i = 0; i < Xn; i++)
	{
		for (int j = 0; j < Zn; j++)
		{
			p_now[i][j] = 0;
			p_past[i][j] = 0;
			temp[i][j] = 0;
		}
	}
	for (int i = 0; i < Tn; i++)
	{
		for (int j = 0; j < Zn; j++)
		{
			wavefront[i][j]=0;
		}
	}
	

	for (int k = 0; k < Tn; k++)
	{
		for (int i = 2; i < Xn - 2; i++)
		{
			for (int j = 2; j < Zn - 2; j++)
			{
				//吸收边界
				/*int A = vel[i][j] * DH/DT  ;
				p_now[2][j] = (2 - 2 * A - pow(A, 2)) * temp[2][j] + 2 * A * (1 + A) * temp[3][j] - pow(A, 2) * temp[4][j] + (2 * A - 1) * p_past[2][j] - 2 * A * p_past[3][j];//左边界
				p_now[Xn - 3][j] = (2 - 2 * A - pow(A, 2)) * temp[Xn - 3][j] + 2 * A * (1 + A) * temp[Xn - 4][j] - pow(A, 2) * temp[Xn - 5][j] + (2 * A - 1) * p_past[Xn - 3][j] - 2 * A * p_past[Xn - 4][j];//右边界
				p_now[i][2] = (2 - 2 * A - pow(A, 2)) * temp[i][2] + 2 * A * (1 + A) * temp[i][3] - pow(A, 2) * temp[i][4] + (2 * A - 1) * p_past[i][2] - 2 * A * p_past[i][3];//上边界
				p_now[i][Zn - 3] = (2 - 2 * A - pow(A, 2)) * temp[i][Zn - 3] + 2 * A * (1 + A) * temp[i][Zn - 4] - pow(A, 2) * temp[i][Zn - 5] + (2 * A - 1) * p_past[i][Zn - 3] - 2 * A * p_past[i][Zn - 4];//下边界*/
				p_now[i][j] = 2 * temp[i][j] - p_past[i][j] + (vel[i][j] * vel[i][j] * DT * DT / (DH * DH)) * (-1.0 / 12 * (temp[i - 2][j]
					+ temp[i + 2][j]) + 4 / 3.0 * (temp[i - 1][j] + temp[i + 1][j]) - 5 / 2.0 * temp[i][j] - 1.0 / 12 * (temp[i][j - 2] + temp[i][j + 2])
					+ 4 / 3.0 * (temp[i][j - 1] + temp[i][j + 1]) - 5 / 2.0 * temp[i][j]) + w[k] * (i == X && j == Y) ;
				/*wavefront[k] [j]= p_now[2][j];//地震记录*/
			}
		}

		p_temp = p_now;
		p_now = p_past;
		p_past = temp;
		temp = p_temp;
	}

	printf("Xn is %d,Zn is %d,Tn is %d\n", Xn, Zn, Tn);

	//将矩阵数据写入文件
	FILE* fp;
	errno_t error;
	error = fopen_s(&fp, "wavefront.dat", "w+");

	//波前记录
	if (error != 0)
	{
		printf("打开失败");
	}
	else 
	{
		for (int i = 0; i < Xn; i++)
		{
			for (int j = 0; j < Zn; j++)
			{
				fprintf(fp, "%lf ", temp[i][j]);
			}
			fprintf(fp, "\n");
		}
	}

	//地震记录
	/*
	if (error != 0)
	{
		printf("打开失败");
	}
	else
	{
		for (int i = 0; i < Tn; i++)
		{
			for (int j = 0; j < Zn; j++)
			{
				fprintf(fp, "%lf ", wavefront[i][j]);
			}
			fprintf(fp, "\n");
		}
	}
	*/

	//释放指针
	fclose(fp);
	free(w);
	for (int i = 0; i < Xn; i++)
	{
		free(p_now[i]);
	}
	for (int i = 0; i < Xn; i++)
	{
		free(p_past[i]);
	}
	for (int i = 0; i < Xn; i++)
	{
		free(temp[i]);
	}
	for (int i = 0; i < Xn; i++)
	{
		free(vel[i]);
	}
	free(temp);
	free(p_now);
	free(p_past);
	free(vel);
	
	return 0;
}

6.2 matlab

在这里插入图片描述

  • 16
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
OUC数据库复习CSDN是指在国软件开发者社区CSDN上,通过学习和复习国海洋大学(OUC)数据库相关的知识。 国海洋大学数据库课程是计算机相关专业的重要课程之一,强调学生对数据库的理论知识和实践技能的掌握。学生在学习数据库课程期间,可以通过CSDN平台上的相关资源进行复习。 CSDN是国最大的技术社区之一,拥有大量的技术博客、论坛和教程资源。在CSDN上,有很多关于数据库的博文和教程,涵盖了数据库的基本概念、SQL语言、存储过程、触发器等方面的知识。这些博文和教程不仅可以帮助学生复习数据库的各个方面,还能够深入了解数据库的应用和开发技巧。 另外,CSDN上还有一些数据库相关的实例教程和项目案例,可以帮助学生将理论知识转化为实际应用。这些教程和案例提供了数据库在不同领域的应用实例,如电子商务、社交网络、医疗健康等,能够帮助学生更好地理解数据库的实际应用场景。 通过在CSDN上复习OUC数据库课程,学生可以获得更广泛的数据库知识,并与其他开发者交流和分享经验。另外,CSDN还提供了一些数据库技术的最新动态和行业趋势,帮助学生了解数据库领域的最新发展。 综上所述,OUC数据库复习CSDN是一种便捷高效的学习方式,学生通过CSDN平台可以找到大量的数据库相关资源,帮助他们巩固和提升数据库知识和技能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值