探地雷达正演模拟,基于时域有限差分方法,三

news2024/12/27 10:58:32

        回顾上一章内容,主要讲了FDTD及基于C++的实现方式和边界条件处理,这一章主要内容有两点:1、基于实际操作流程的GPR正演模拟(宽角法和剖面法);2、简单并行化加速GPR正演模拟(基于OpenMP)。

        根据参考文献        在GPR勘探中,探测方式主要有两种,一种是宽角法,类似于地震勘探的共炮集记录,另一种是剖面法,但是宽角法在实际工区勘探中由于经费限制,无法大量布置接收天线在阵列,因此,实际工区内的主要勘探方式是剖面法,该方法中接收天线和发射天线以固定间距沿测线以固定步长移动,并将各道接收记录结合形成雷达剖面,本章以三层模型为例进行讲解。

        首先是宽角法,只需要在第二章FDTD函数中创建文件流,并输出测线接收记录即可:

// editor:WangBoHua
// date:2024.6.12
//创建文件流
fstream ofs;
//建立输出文件地址
string filename="file_path";
//打开文件
ofs.open(filename,ios::out);
for(int n=0;n<simulation_Step;n++){
    //Sample是采样率
    if(n%Sample==0){
        for(int i=0;i<cellNumForY;i++){
            ofs<<Ey[CpmlBound+1][i]<<'\t';
        }
        ofs<<endl;
    }

}
ofs.close()

        设计采样率为1*courant,这里给出Python绘图代码:

#editor:WangBoHua
#date:2024.6.12
# for gpr grawing
import numpy as np
import matplotlib.pyplot as plt
# 宽角法雷达记录
t=np.linspace(0,6000,7001,dtype=float)*courant*1e9
x=np.linspace(0,5,1000,dtype=float)
rec=np.genfromtxt("接受记录位置")
fig2=plt.figure(dpi=1000)
ax7=fig2.add_subplot(1, 1, 1)
ax7.pcolormesh(rec, vmin=-0.001,vmax=0.002, cmap='jet', rasterized=True)
ax7.tick_params(direction='in', width=0.5)
ax7.invert_yaxis()
ax7.set_xlabel("x/m")
ax7.set_ylabel("t/ns")
ax7.set_title("Wide")
ax7.xaxis.set_ticks_position('top') 
# np.savetxt("C:/Users/12981/Desktop/signal25.data",rec)
# plt.rcParams['savefig.dpi'] = 800  # 图片像素
# plt.savefig("A-Scan.png",
#             bbox_inches='tight')  # 直接保存成png格式图片就好
# plt.savefig("A-Scan.pdf",
#             bbox_inches='tight')  # 修图的话改成pdf格式保存

宽角度法的计算结果:

但就和上文中说的那样,实际工作中不可能构成天线阵列,宽角法只能是模拟后用作参考。

        是剖面法的计算成本较大,但较宽角法而言,剖面图像能够更加直观的反映地下结构和情况,实际实现方式也非常经济,所以在实际勘探工作中使用较多。这里由于时间原因,只展示代码和三层模型的剖面记录。

// editor:WangBoHua
// date:2024.6.12
//创建一个Main函数
int main(){
    for (int j = CpmlBound + 1; j < cellNumForY - CpmlBound - 1; j += 5) {
        int tracenum=0;
		if (j + 8 < cellNumForY - CpmlBound - 1) {
			cout << j + 8 << "trace" << endl;
			tracenum++;
			FDTD(j, j + 8,  SimulationSteps);//一次记录一个道集
		}
	}

}
//在FDTD函数中创建一个vector数组
    vector<double>receiver(Simulation_steps,0.0);
    //FDTD的FOR循环迭代中进行记录
        receiver[i]=Ey[cpmlBound+1][receive];
    //FDTD循环后创建文件流并输出
	char filename[200];
	sprintf_s(filename, "%s%d%s", "path", receivery, ".data");
	fstream ofs;
	ofs.open(filename, ios::out);
	ofs.clear();
    for(int i=0;i<simulation_Steps;i++){
    ofs<<receiver[i]<<endl;
    }
    ofs.close()    

时间原因,这里仅展示一幅三层剖面记录:

        

        这幅图的时间做的有点不对,但是仅是用来参考就行。

剖面记录合成代码,使用Python:

        

#editor: WangBoHua
#date:2024.6.12
# 剖面法雷达记录
import cv2
import numpy as np
from math import ceil
import matplotlib.pyplot as plt
Single = np.genfromtxt("某一道记录的位置")
# 合成时的路就修改
Path = "道集记录的位置"
tail = ".data"
Pathall = []
dt = 1.92e-11#就是Courant
Cpml = 20
Cell = 1000
i = Cpml+1
#中心是这一段,但是要根据自己代码的实际情况调试
while i+8 < Cell-Cpml-1:
    Pathall.append(Path+str(i+8)+tail)
    i = i+2
data = np.zeros([len(Single), len(Pathall)]).reshape(len(Single), len(Pathall))
for i in range(len(Pathall)):
    data[:, i] = np.genfromtxt(Pathall[i])
Gaussian = cv2.GaussianBlur(data, ksize=(
    ceil(2*3)+1, ceil(2*3)+1), sigmaX=0.5, sigmaY=0.5)#做不做高斯滤波都行,做完之后图像能平滑些
t = np.linspace(0, len(Single), len(Single), dtype='float')*dt*1e9
x = np.linspace(0, 30, len(Pathall), dtype='float')
x1=np.linspace(0, 30, 1000, dtype='float')
plt.figure(figsize=(16, 9))
plt.pcolormesh(x, t, data, vmin=-20, vmax=20,
               cmap='jet', rasterized=True)
plt.gca().invert_yaxis()
plt.gca().tick_params(direction='in', width=0.5)
plt.gca().xaxis.set_ticks_position('top') 
plt.xlabel("location")
plt.ylabel("time")
plt.show()

上述已经解决了宽角法和剖面法记录的计算和合成,下面看一个很有意思的问题:并行化计算以提高代码运行速度(In OpenMP):

        当前并行化方式主要有三种:1、OpenMP技术、2、MPI技术、3、CUDA编程。OpenMP和CUDA是较容易理解的并行计算方式,前者是榨干CPU的性能和运算效率,后者是使用显卡(最好是Nvidia的,其他公司的没接触过,也不太了解是否和英伟达CUDA逻辑相同,GPRMax已经实现了这种技术)进行计算,MPI技术个人认为如果能够连接多台电脑的话,也是可以试一试,但考虑到实验室代码不允许外传以及GPR正演的使用对象对并行编程要求并不是太高的情况,这里仅提供OpenMP加速的计算方式,其余两种可以根据参考文献5中的配套代码学习。

        OpenMP是一种非常简单的并行编程技术,可以简单的介绍一下:假如说,我们使用的计算机CPU有12个核心,那我们在OpenMP中就可以开启2倍的线程数量(但一般得空出来几个,不然电脑的其他后台程序会很卡),每个线程都可以单独计算,通过这种方式就能够有效缩短计算时间,提高计算效率。

Visual Studio已经集成了这种技术,在解决方案的属性中就可以打开:

应用并确定就好。

基本实现代码也不需要对第二章的代码进行修改,只需要添加语句如下:

#include<omp.h>
//main函数中
//设置线程数量
omp_set_num_threads(10)

#pragma omp parallel  for ordered schedule(guided) //代码并行语句,这里的guided是启发式内存分配:
	for (int i = 0; i < cellNumForX + 1; i++) {}

        值得注意的是,双重for循环中只能在外侧for循环上方添加,内层添加后计算数据会出错,而且有两个地方不可以使用,一是第二章中的CPML函数计算,不要添加OpenMP并行语句,另一个是FDTD中的时间循环,也是无法添加的。

        简单理解就是,我们使用OpenMP把for循环分布在不同核心上进行计算,这样就可以大幅提高计算效率了,可以做实际运算进行比较: 以2000步为例,使用OpenMP:

宽角法使用OpenMP加速计算用时

使用OpenMP用时约33.5s,

不适用OpenMP时:

宽角法不适用OpenMP计算用时

        加速比A约为9.34,使用OpenMP技术能够在一定程度上加速FDTD的计算,进一步帮助我们快速获得雷达接收信号以合成正演剖面。

声明:欢迎上述代码和图片引用,但请标注公式和图片来源,创作不易,请多多支持,非常感谢!

参考文献:葛德彪,闫玉波. 电磁波时域有限差分法第2版.西安:西安电子科技大学出版社,2005:133-137,37,118.

Shen, H, Y., Li, X, S., Duan, R, F., et al., (2023), Quality evaluation of ground improvement by deep cement mixing piles via ground-penetrating radar. Nature Communications,14,34-48. https://doi.org/10.1038/s41467-023-39236-4

冯德山,戴前伟,何继善等. 探地雷达GPR正演的时域有限差分实现(英文)[J].地球物理学进展,2006,(02):630-636.

冯德山。探地雷达数值模拟及程序实现。

何兵寿,宋鹏,刘颖等.并行编程原理与程序设计

李静,刘津杰,曾昭发等. 基于变换光学有限差分探地雷达数值模拟研究[J].地球物理学报,2016,59(06):2280-2289.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1814532.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mybatis Log Free

安装后重启 在 application.yml 配置 configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl 选择效果

搭建一个简单的深度神经网络

目录 一、引入所需要的库 二、制作数据集 三、搭建神经网络 四、训练网络 五、测试网络 本博客实验环境为jupyter 一、引入所需要的库 torch库是核心&#xff0c;其中torch.nn 提供了搭建网络所需的所有组件&#xff0c;nn即神经网络。matplotlib类似与matlab&#xff0…

Apple Intelligence全面来袭,熟悉但又不同的味道

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则提…

618购物节入手哪些数码好物好?年度必备好物清单大盘点

随着一年一度的618购物节的到来&#xff0c;数码市场再次掀起了热潮&#xff0c;在这个属于消费者的狂欢节里&#xff0c;各大品牌和商家纷纷推出优惠活动和新品&#xff0c;为数码爱好者们带来了无数的购物选择&#xff0c;那么在这个购物盛宴中&#xff0c;我们应该如何挑选那…

如何进行论文查重,选择合适的查重系统?

原创性是学术写作海洋中的航行灯塔&#xff0c;而论文查重&#xff08;www.check110.com&#xff09;则是保障这束光芒不被云雾遮蔽的工具。而查重系统如何对论文进行查重&#xff0c;又该如何选择论文查重系统呢&#xff1f; 一、论文查重 论文查重&#xff0c;就是检测学术…

Python基础教程(十三):file文件及相关的函数

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

idea中使用逆向工程生成数据库表的实体类

1、在idea中打开数据库视图&#xff1b; 2、点击database中的号创建数据源连接&#xff08;以MySQL为例&#xff09;&#xff1b; 填入账户密码以及数据库名&#xff1b; 点击测试连接&#xff0c;若出现爆红Server returns invalid timezone. Go to Advanced tab and set serv…

RawChat:优化AI对话体验,全面兼容GPT功能平台

文章目录 一、Rawchat简介1.1 RawChat的主要特性1.2 RawChat的技术原理简述 二、使用教程三、案例应用3.1 图片内容分析3.2 生图演示3.3 文档解析3.4 探索更多 四、小结 一、Rawchat简介 RawChat平台的诞生&#xff0c;其核心理念是降低用户访问类似ChatGPT这类先进AI服务的门…

MySQL复习题(期末考试)

MySQL复习题&#xff08;期末考试&#xff09; 1.MySQL支持的日期类型&#xff1f; DATE,DATETIME,TIMESTAMP,TIME,TEAR 2.为表添加列的语法&#xff1f; alter table 表名 add column 列名 数据类型; 3.修改表数据类型的语法是&#xff1f; alter table 表名 modify 列名 新…

文心智能体体验,打造你自己的GPTs应用

利用百度智能体搭建的《RPG冒险游戏大作战》已经发布啦&#xff01; RPG冒险游戏大作战 玩家扮演一位小小勇士女孩&#xff0c;从被巨龙毁灭的冒险小镇出发&#xff0c;一路披荆斩棘&#xff0c;集齐四件神器后&#xff0c;打败巨龙&#xff0c;夺回小镇的安宁&#xff01; 整…

python3的基本语法说明一

一. 简介 本文开始学习 python3 的基本语法。 二. python3的基本语法 1. 编码 默认情况下&#xff0c;Python 3 源码文件以 UTF-8 编码&#xff0c;所有字符串都是 unicode 字符串。 当然你也可以为源码文件指定不同的编码&#xff1a; # -*- coding: cp-1252 -*- 上述…

Unity图集

概述 相信在同学们学习过程中&#xff0c;在UI的的使用时候一定经常听说过图集的概念。 Unity有UI的组件&#xff0c;有同学们好奇&#xff0c;那为什么还要使用图集呢&#xff1f; 这就需要提到一个性能优化的问题了&#xff0c;因为过多的UI图片&#xff0c;会大幅增加Dra…

隔离式 AC-DC 反激电源设计原理分析

LinkSwitch-LP 系列旨在取代手机/无绳电话、PDA、数码相机和便携式音频播放器等应用中输出功率 < 2.5 W 的低效线频线性变压器电源。LinkSwitch-LP 还可用作白色家电等应用中的辅助电源。 LinkSwitch-LP 将高压功率 MOSFET 开关与 ON/OFF 控制器集成在一个设备中。它完全由…

Vue 路由传递参数 query、params

1、to的对象写法,绑定参数 <template> 2 <ul> 3 <li v-for"m in messlist" :key"m.id"> 4 <router-link :to"{ //使用params时&#xff0c;这个路径必须用name及别名......name: xiangqing, path: /bbb/message/deta…

自动驾驶#芯片-1

概述 汽车是芯片应用场景之一&#xff0c;汽车芯片需要具备车规级。  车规级芯片对加工工艺要求不高&#xff0c;但对质量要求高。需要经过的认证过程&#xff0c;包括质量管理标准ISO/TS 16949、可靠性标准 AEC-Q100、功能安全标准ISO26262等。  汽车内不同用途的芯片要求…

批量替换删除图片文件名称中相同数字:轻松管理文件结构新技巧大揭秘

特别是当图片文件名称中包含相同的数字时&#xff0c;想要快速找到或整理这些文件更是难上加难。今天&#xff0c;我要向大家揭秘一种轻松管理图片文件结构的新软件——文件批量改名高手。 进入“文件批量改命名高手”主页面&#xff0c;你会看到一个简洁明了的操作界面。在板…

聚焦新版综合编程能力面试考查汇总

目录 一、业务性编程和广度能力考查 &#xff08;一&#xff09;基本定义 &#xff08;二&#xff09;必要性分析 二、高频考查样题&#xff08;编程扩展问法&#xff09; 考题1: 用java 代码实现一个死锁用例&#xff0c;说说怎么解决死锁问题&#xff1f;&#xff08;高…

Python 组内序号

模仿SQL的row_number() over (partition by column order by column) import pandas as pd # 创建一个示例数据框 data { group: [A, A, A, B, B, C, C, C, C], value: [3, 1, 2, 5, 4, 6, 9, 7, 8] } df pd.DataFrame(data) # 先按group分组&#xff0c;再按val…

eclipse导入Tomcat9源码

环境准备 下载Tomcat源码 https://github.com/apache/tomcat/tagsJDK版本 Tomcat9要求JDK17以上版本 https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.htmlAnt安装 https://ant.apache.org/bindownload.cgi我这里装的是apache-ant-1.10.14版本 …

Ubuntu系统调试分析工具

文章目录 一、火焰图一、下载 FlameGraph二、安装 iperf三、使用二、Lockdep1、内核开启 Lockdep 配置2、判断 Lockdep 开启是否成功一、火焰图 一、下载 FlameGraph git clone https://github.com/brendangregg/FlameGraph.gitFlameGraph 介绍:   基本思想是将程序的函数…