首页 > 编程语言 >褶积方法制作合成地震记录c++

褶积方法制作合成地震记录c++

时间:2022-08-27 12:22:44浏览次数:61  
标签:ni nk facies int double c++ 褶积 item 地震

地震褶积方法制作合成地震记录

包括,(1)读取相模型,设置每种相的密度和速度,(2)计算反射系数,添加噪音,(3)设置子波,(4)进行褶积计算。具体的代码如下

void syntheticSeis(const string& faciesFileName, const string&synseisFileName, 
    vector<tuple<int, double, double>>faciesDenVelocity,
    double dt, double fm, int convLength)
{
    const double PI = 4 * (4 * atan(1.0f / 5) - atan(1.0f / 239));
    IModel3D<int> facies;
    facies.loadNumpy(faciesFileName);
    int ni = facies.getNi();
    int nj = facies.getNj();
    int nk = facies.getNk();
    auto faciesList = facies.getValueVec();
   
    for (auto item : faciesList) {
        bool find = false;
        for (auto fv : faciesDenVelocity) {
            if (get<0>(fv) == item) {
                find = true;
                break;
            }
        }
        if (find == false) {
            std::cout << "fail to find facies  " << item << 
                " in facies_velocity_set" << std::endl;
            return;
        }
    }
    
    // define the velocity of each facies
    auto impedance  = IModel3D<float>(nj,ni,nk,"veclocity");
    const int* faciesPtr = facies.grid().data();
    float* impPtr = impedance.grid().data();
    random_device dev;
    default_random_engine rnd(dev());
    uniform_real_distribution<double> u(0.95, 1);
    for (int i = 0; i < ni * nj * nk; i++) {
        int faciesV = faciesPtr[i];
        for (const auto& item : faciesDenVelocity) {
            if (get<0>(item) == faciesV) {
                //impPtr[i] = get<1>(item)* get<2>(item);
                impPtr[i] = get<1>(item) * get<2>(item) * u(rnd);  //with noise
                break;
            }
        }
    }

    // define the reflection coefficient
    auto refCoef = IModel3D<float>(nj, ni, nk, "reflectionCoefficient");
    for (int j = 0; j < nj; j++) {
        for (int i = 0; i < ni; i++) {
            refCoef.setValue(j, i, nk - 1, 0);
            for (int k = nk - 2; k >= 0; k--) {
                float imp1 = impedance.getValue(j, i, k + 1);
                float imp2 = impedance.getValue(j, i, k);
                float coef = (imp2 - imp1) / (imp2 + imp1);
                refCoef.setValue(j, i, k, coef);
            }
        }
    }
    float vMin = FLT_MAX, vMax = -FLT_MAX;
    refCoef.getMinMax(vMin, vMax);
    std::cout << "refcoef vmin= " << vMin << " vmax= " << vMax << std::endl;

    // calculate syntheic seismic
    int n = convLength;
    auto rickerWave = [=](int kk)->float {
        return (1 - 2 * pow(PI * fm * dt*kk, 2)) * exp(-pow(PI * fm * dt*kk, 2));
    };

    // define the synthetic seismic trace
    auto synSeis = IModel3D<float>(nj, ni, nk, "syntheticSeis");
    for (int j = 0; j < nj; j++) {
        for (int i = 0; i < ni; i++) {
            for (int k = nk - 1; k >= 0; k--) {
                // seismic convolution
                double trace = 0.0;
                for (int t = -int(n / 2); t<int(n / 2); t++) {
                    if (t + k < 0 || t + k >= nk)
                        continue;
                    else
                    {
                        double riker = rickerWave(t);
                        double coef = refCoef.getValue(j, i, k + t);
                        double value = riker * coef;
                        trace += value;
                    }
                }
                synSeis.setValue(j, i, k, trace);
            }
        }
    }
    synSeis.saveNumpy(synseisFileName);
    vMin = FLT_MAX;
    vMax = -FLT_MAX;
    synSeis.getMinMax(vMin, vMax);
    std::cout <<"create syntheitc seismic"<<synseisFileName<<  " synseis vmin= " << vMin << " vmax= " << vMax << std::endl;

}

效果如下

 

标签:ni,nk,facies,int,double,c++,褶积,item,地震
From: https://www.cnblogs.com/oliver2022/p/16630325.html

相关文章

  • C++停车场管理系统
    C++停车场管理系统停车场管理系统简介一、 问题描述设停车场是一个可停放若干辆辆汽车的狭多层平面区域,且只有一个大门可供汽车进出。若车场内已停满汽车,则后来的汽车只......
  • CCF 202112-2 序列查询新解(C++)
    该题关键点在于:分段计算先对f分段:for(inti=1;i<=n+1;i++)//以f(i)为区域划分计算在此区域内f的取值相同,值为:i-1。再对每个f值相同的区域按照g值进行分段:for(int......
  • C++基础-理解new和delete
    intmain(intargc,charconst*argv[]){ //C风格 int*p=(int*)malloc(sizeof(int)); if(p==NULL){ return-1; } *p=20;//初始化 free(p); int*q=(......
  • C++之多态
    C++之多态1静态联编和动态联编C++支持编译时多态(静态多态)和运行时多态(动态多态)。运算符重载和函数重载就是编译时多态,而派生类和虚函数就是运行时多态。静态多态和动态......
  • C++:理论基础篇
    class类特性封装:多态:继承:工厂函数 const与#define的区别const用来定义常量、修饰函数参数、修饰函数返回值,可以避免被修改,提高程序的健壮性define是宏定义,在......
  • C++课程设计题
    C++课程设计题题目列表:一、简单计算器的设计问题描述简单计算器的基本功能如下:四则运算,例如加减乘除等;除了整数的运算也可实现小数的各类运算;判断非法操作,例如判定......
  • Xmake v2.7.1 发布,更好的 C++ Modules 支持
    Xmake是一个基于Lua的轻量级跨平台构建工具。它非常的轻量,没有任何依赖,因为它内置了Lua运行时。它使用xmake.lua维护项目构建,相比makefile/CMakeLists.txt,配置语......
  • c++实现通讯录管理系统
    利用C++来实现一个通讯录管理系统系统中需要实现的功能如下:添加联系人:向通讯录中添加新人,信息包括(姓名、性别、年龄,联系电话、家庭住址)最多记录1000人显示联系人:显......
  • 关于c++的一些好玩的
    #defineA(x) #x:将x转换为字符串。#defineA(x) va##x:将x拼接在变量名后。next_permutation(a+1,a+n+1):把a数组变成字典序下一位,最大则变成最小的。random_s......
  • C++ 内联函数
    1.函数的作用:避免重复制造轮子。(避免重复多次写相同的代码)2.函数的缺点:每调用一次函数,就会为这个函数分配一个“栈”,在计算机底层做很多准备工作(保护原来的执行环境,切换......