⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 corrlen.cc

📁 二维射线追踪地震层析成像
💻 CC
字号:
/* * corrlen.cc - correlation length functions' implementation *  * Jun Korenaga, MIT/WHOI * February 1999 */#include <iostream>#include <fstream>#include <util.h>#include "corrlen.h"CorrelationLength1d::CorrelationLength1d(const char* fn)    : eps(1e-6){    int n = countLines(fn);    ifstream in(fn);    xpos.resize(n); val.resize(n);    for (int i=1; i<=n; i++){	in >> xpos(i) >> val(i);    }}double CorrelationLength1d::at(double x) const{    if (x<=xpos.front()) return val.front();    if (x>=xpos.back()) return val.back();        int nx=xpos.size();    for (int i=1; i<nx; i++){	double xnode=xpos(i);	double xnode2=xpos(i+1);	if (abs(x-xnode)<eps){ // on a grid	    return val(i);	}else if (abs(x-xnode2)<eps){ // on a grid	    return val(i+1); 	}else if (x > xnode && x < xnode2){	    double r = (x-xnode)/(xnode2-xnode);	    double dv = val(i+1)-val(i);	    return val(i)+r*dv;	}    }    error("CorrelationLengh1d::at() - impossible!");}CorrelationLength2d::CorrelationLength2d(const char* fn){    ifstream s(fn);    if (!s){	cerr << "CorrelationLength2d::cannot open " << fn << "\n";	exit(1);    }    s >> nx >> nz;    xpos.resize(nx);    topo.resize(nx);    zpos.resize(nz);    hgrid.resize(nx,nz);    vgrid.resize(nx,nz);    for (int i=1; i<=nx; i++) s >> xpos(i);    for (int i=1; i<=nx; i++) s >> topo(i);    for (int k=1; k<=nz; k++) s >> zpos(k);    for (int i=1; i<=nx; i++){	for (int k=1; k<=nz; k++){	    s >> hgrid(i,k);	}    }    for (int i=1; i<=nx; i++){	for (int k=1; k<=nz; k++){	    s >> vgrid(i,k);	}    }    rdx_vec.resize(nx-1);    rdz_vec.resize(nz-1);    b_vec.resize(nx-1);    for (int i=1; i<nx; i++){	rdx_vec(i) = 1.0/(xpos(i+1)-xpos(i));	b_vec(i) = topo(i+1)-topo(i);    }    for (int k=1; k<nz; k++){	rdz_vec(k) = 1.0/(zpos(k+1)-zpos(k));    }}void CorrelationLength2d::upperleft(const Point2d& p, Index2d& index) const{    // note: this code guarantees that the final guess index is bounded by    //       valid range (1...nx-1)(1...nz-1).    int i_guess=1, k_guess=1;    if (xpos(i_guess)<=p.x()){	if (i_guess < nx) i_guess++;	while (xpos(i_guess)<=p.x() && i_guess<nx) i_guess++;	i_guess--;    }else{	while (xpos(i_guess)>p.x() && i_guess>1) i_guess--;    }    double r = (p.x()-xpos(i_guess))*rdx_vec(i_guess);    double dz = r*b_vec(i_guess)+topo(i_guess);    if (zpos(k_guess)+dz<=p.y()){	if (k_guess < nz) k_guess++;	while (zpos(k_guess)+dz<=p.y() && k_guess<nz) k_guess++;	k_guess--;    }else{	while (zpos(k_guess)+dz>p.y() && k_guess>1) k_guess--;    }    index.set(i_guess,k_guess);}void CorrelationLength2d::calc_local(const Point2d& pos, int i, int k,				     double& r, double& s, double& rr, double& ss) const{    double rDX = rdx_vec(i);    double rDZ = rdz_vec(k);    double B = b_vec(i);    // global coordinates with an origin at the upperleft node    double x = pos.x()-xpos(i);    double z = pos.y()-(zpos(k)+topo(i));	    // local coordinates    r = x*rDX;    s = (z-B*r)*rDZ;    rr=1-r;    ss=1-s;}void CorrelationLength2d::at(const Point2d& p, double& h, double& v) const{    Index2d index;    upperleft(p,index);    int i=index.i(), k=index.k();    double r,s,rr,ss;    calc_local(p,i,k,r,s,rr,ss);    h=rr*ss*hgrid(i,k)+rr*s*hgrid(i,k+1)	+r*s*hgrid(i+1,k+1)+r*ss*hgrid(i+1,k);    v=rr*ss*vgrid(i,k)+rr*s*vgrid(i,k+1)	+r*s*vgrid(i+1,k+1)+r*ss*vgrid(i+1,k);}DampingWeight2d::DampingWeight2d(const char* fn){    ifstream s(fn);    if (!s){	cerr << "DampingWeight2d::cannot open " << fn << "\n";	exit(1);    }    s >> nx >> nz;    xpos.resize(nx);    topo.resize(nx);    zpos.resize(nz);    wgrid.resize(nx,nz);    for (int i=1; i<=nx; i++) s >> xpos(i);    for (int i=1; i<=nx; i++) s >> topo(i);    for (int k=1; k<=nz; k++) s >> zpos(k);    for (int i=1; i<=nx; i++){	for (int k=1; k<=nz; k++){	    s >> wgrid(i,k);	}    }    rdx_vec.resize(nx-1);    rdz_vec.resize(nz-1);    b_vec.resize(nx-1);    for (int i=1; i<nx; i++){	rdx_vec(i) = 1.0/(xpos(i+1)-xpos(i));	b_vec(i) = topo(i+1)-topo(i);    }    for (int k=1; k<nz; k++){	rdz_vec(k) = 1.0/(zpos(k+1)-zpos(k));    }}void DampingWeight2d::upperleft(const Point2d& p, Index2d& index) const{    // note: this code guarantees that the final guess index is bounded by    //       valid range (1...nx-1)(1...nz-1).    int i_guess=1, k_guess=1;    if (xpos(i_guess)<=p.x()){	if (i_guess < nx) i_guess++;	while (xpos(i_guess)<=p.x() && i_guess<nx) i_guess++;	i_guess--;    }else{	while (xpos(i_guess)>p.x() && i_guess>1) i_guess--;    }    double r = (p.x()-xpos(i_guess))*rdx_vec(i_guess);    double dz = r*b_vec(i_guess)+topo(i_guess);    if (zpos(k_guess)+dz<=p.y()){	if (k_guess < nz) k_guess++;	while (zpos(k_guess)+dz<=p.y() && k_guess<nz) k_guess++;	k_guess--;    }else{	while (zpos(k_guess)+dz>p.y() && k_guess>1) k_guess--;    }    index.set(i_guess,k_guess);}void DampingWeight2d::calc_local(const Point2d& pos, int i, int k,				 double& r, double& s, double& rr, double& ss) const{    double rDX = rdx_vec(i);    double rDZ = rdz_vec(k);    double B = b_vec(i);    // global coordinates with an origin at the upperleft node    double x = pos.x()-xpos(i);    double z = pos.y()-(zpos(k)+topo(i));	    // local coordinates    r = x*rDX;    s = (z-B*r)*rDZ;    rr=1-r;    ss=1-s;}void DampingWeight2d::at(const Point2d& p, double& dw) const{    Index2d index;    upperleft(p,index);    int i=index.i(), k=index.k();    double r,s,rr,ss;    calc_local(p,i,k,r,s,rr,ss);    dw=rr*ss*wgrid(i,k)+rr*s*wgrid(i,k+1)	+r*s*wgrid(i+1,k+1)+r*ss*wgrid(i+1,k);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -