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); }
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; }