Ejemplo n.º 1
0
void CDECL Error::TraceTime (TCHAR * t)
{
	TCHAR buf[256];
#if !defined(EXCLUDE_FROM_XARLIB)
	CamProfile::GetTimeString(buf, 256);
#else
	camStrcpy(buf, _T("unknown"));
#endif
	TraceAll(_T("[%s] %s"), buf, t);
}
Ejemplo n.º 2
0
bool SynGenerator::ComputeSyn( const std::string& staname, const float slon, const float slat, int npts, float delta,
                               SacRec& sacz, SacRec& sac1, SacRec& sac2, bool rotate, float f1, float f2, float f3, float f4 ) {
    // trace all GCPs
    if( ! traced ) TraceAll();

    /*/ calc base size
    int nbase = 2; n2pow = 1;
    while( n2pow<13 && nbase<npoints ) { n2pow++; nbase <<= 1; }
    std::cerr<<"n2pow = "<<n2pow<<"  nbase = "<<nbase<<"  npoints = "<<npoints<<"\n";
    nf = nbase / 2;
    df = 1. / (dt*nbase);// f0 = 0.; */

    // period range
    //if(TMAX.gt.(nt-1)*dper+per1)TMAX=PERMAX-2.*dper	// these are what misha had in the fortran version
    //if(TMIN.lt.per1)TMIN=PERMIN+2.*dper					// cannot understand the logic...
    if( f1==NaN || f1<1./permax ) {
        f1 = 1./permax;
        f2 = f1 * 1.1;
    }
    if( f4==NaN || f4>1./permin ) {
        f4 = 1./permin;
        f3 = f4 * 0.9;
    }
    if( f2 > f3 ) f2 = f3 = sqrt(f1*f4);

    //if( f1<1./permax || f4>1./permin )
    //throw std::runtime_error("Error(SynGenerator::ComputeSyn): corner freq out of range!");

    // search for the requested station in the list
    int ista = 0;
    for(; ista<nsta; ista++) {
        if( staname == std::string(sta[ista]) &&
                slon == lon[ista] && slat == lat[ista] ) break;
    }
    if( ista == nsta ) return false;

    // station found. Produce synthetics
    std::string netname = net[ista];// staname = sta[ista];
    //std::cerr<<ista<<" STA = "<<staname<<" NET = "<<netname<<" STLAT = "<<lat[ista]<<" STLON = "<<lon[ista]<<"\n";
    // prepare sac headers
    //SacRec sacz, sac1, sac2;
    std::string chnprefix = delta>=1 ? "LH" : "BH";
    auto init_sac = [&]( const char comp, SacRec& sac ) {
        std::string chn = chnprefix + comp;
        WriteSACHeader( sac.shd, npts, delta, elat, elon, staname, lat[ista], lon[ista], chn, netname );
        sac.ResizeSig();
    };
    init_sac( 'Z', sacz );
    if(rotate) {
        init_sac( 'N', sac1 );
        init_sac( 'E', sac2 );
    }
    else {
        init_sac( 'R', sac1 );
        init_sac( 'T', sac2 );
    }
    //sacz.MutateAs(sacz); sac1.MutateAs(sacz); sac2.MutateAs(sacz);
    int ista_f = ista+1;
    cal_synsac_( &ista_f, &its, &sigR, &sigL, pcor.get(), &f1, &f2, &f3, &f4, &vmax, &fix_vel, &iq,
                 &npts, freq, &delta, &nper, &key_compr, &elatc, &elonc, qR, qL,
                 &im, &aM, tm, ampl, cl, cr, ul, ur, wvl, wvr, v, dvdz, ratio, I0,
                 &(latc[ista]), &(lon[ista]), sacz.sig.get(), sac1.sig.get(), sac2.sig.get(), &rotate );
    // check results
    bool valid = sigR=='+' ? sacz.isValid() : sac2.isValid();
    if( ! valid ) return false;
    // flip (misha's coordinate is upside down)
    sacz.Mul(-1.);
    if( !rotate ) sac2.Mul(-1.);
    // shift b times to match the data (origin-time = b-time-of-real-data + t0)
    sacz.shd.b += minfo.t0;
    sac1.shd.b += minfo.t0;
    sac2.shd.b += minfo.t0;

    return true;
}