예제 #1
0
파일: iFFT.c 프로젝트: yuronfu/final
int main()
{
    double *x_r,*x_i,*y_r,*y_i;
    int k,n,p,q,r,N = 1;
    clock_t t1, t2;
    
    printf("p,q,r = ");
    scanf("%d %d %d",&p,&q,&r);
    for(k = 0 ; k < p ; k++) N*=2;
    for(k = 0 ; k < q ; k++) N*=3;
    for(k = 0 ; k < r ; k++) N*=5;
    
    printf("N = %d\n",N);
    
    x_r = (double *) malloc (N*sizeof(double));
    x_i = (double *) malloc (N*sizeof(double));
    
    y_r = (double *) malloc (N*sizeof(double));
    y_i = (double *) malloc (N*sizeof(double));
    
    for(k = 0 ; k < N ; k++)
    {
          *(x_r+k) = k;
          *(x_i+k) = 0;
          //printf("x_%d = %f + %f i\n",k,*(x_r+k),*(x_i+k));
    }
    system("pause");
    
    FFT(x_r,x_i,y_r,y_i,N);
    for(k = 0 ; k < N ; k++)
    {
          *(x_r+k) = y_r[k];
          *(x_i+k) = y_i[k];
          printf("x_%d = %f + %f i\n",k,*(x_r+k),*(x_i+k));
    }
    
    iFFT(x_r,x_i,y_r,y_i,N);
    for(k = 0 ; k < N ; k++) printf("y_%d : %f + %f i\n",k,y_r[k]/N,y_i[k]/N);
    
    free(x_r);
    free(x_i);
    free(y_r);
    free(y_i);
    system("pause");
    return 0;
}
예제 #2
0
파일: state4d.cpp 프로젝트: CRAVA/crava
std::vector<FFTGrid*>
State4D::doRockPhysicsInversion(TimeLine                               & time_line,
                                const std::vector<DistributionsRock *>   rock_distributions,
                                TimeEvolution                          & timeEvolution)
{
  LogKit::WriteHeader("Start 4D rock physics inversion");
  bool debug=true; // triggers printouts
  // inverse transform posterior
  iFFT();

  // Note rockSample contains rock sample for all time steps.
  int nSim=10000; // NBNB OK 100000->10000 for speed during debug

  LogKit::LogFormatted(LogKit::Low,"\nSampling rock physics distribution...");
  std::vector<std::vector<std::vector<double> > > rockSample = timeEvolution.returnCorrelatedSample(nSim,time_line, rock_distributions);
  LogKit::LogFormatted(LogKit::Low,"done\n\n");

  int nTimeSteps = static_cast<int>(rockSample.size());
  //nSim=rockSample[0].size();
  int nParam = static_cast<int>(rockSample[0][0].size());
  int nM = 3;  // number of seismic parameters.
  int nRockProperties = nParam-nM; // number of rock parameters



  //write rockSamples to check ok
  if(debug)
  {
    NRLib::Matrix rockSamples(nSim,nParam*nTimeSteps);

    for(int i = 0;i<nSim;i++)
      for(int j=0;j < nTimeSteps;j++ )
        for(int k=0;k<nParam;k++)
        {
          int ind=k+j*nParam;
          rockSamples(i,ind)=rockSample[j][i][k];
        }

    NRLib::WriteMatrixToFile("rockSample.dat", rockSamples);
  }

  std::vector<std::vector<double> > mSamp = makeSeismicParamsFromrockSample(rockSample);

  //write seismic parameters to check ok
  if(debug)
  {
    NRLib::Matrix seisPar(nSim,6);

    for(int i = 0;i<nSim;i++)
      for(int j=0;j < 6;j++ )
        {
          seisPar(i,j)=mSamp[j][i];
        }

    NRLib::WriteMatrixToFile("seisParSample.dat", seisPar);
  }


  NRLib::Vector fullPriorMean    = timeEvolution.computePriorMeanStaticAndDynamicLastTimeStep();
  NRLib::Matrix fullPriorCov     = timeEvolution.computePriorCovStaticAndDynamicLastTimeStep();
  NRLib::Matrix fullPosteriorCov = GetFullCov();


  if(debug)
  {
    NRLib::WriteMatrixToFile("priorCov.dat", fullPriorCov );
    NRLib::WriteMatrixToFile("posteriorCov.dat", fullPosteriorCov);
    NRLib::WriteVectorToFile("priorMean.dat",fullPriorMean );
  }

  LogKit::LogFormatted(LogKit::Low,"\nMaking rock-physics lookup tables, table 1 of %d\n",nRockProperties+1);

  RockPhysicsInversion4D* rockPhysicsInv = new RockPhysicsInversion4D(fullPriorMean,fullPriorCov,fullPosteriorCov,mSamp);
  //LogKit::LogFormatted(LogKit::Low,"done\n\n");

  std::vector<FFTGrid*> prediction(nRockProperties);

  LogKit::LogFormatted(LogKit::Low,"\nDoing rock-physics predictions...");

  for(int i=0;i<nRockProperties;i++)
  {
    LogKit::LogFormatted(LogKit::Low,"\nMaking rock-physics lookup tables, table %d of %d\n",i+2,nRockProperties+1);
    std::vector<double> rSamp = getRockPropertiesFromRockSample(rockSample,i);
    rockPhysicsInv->makeNewPredictionTable(mSamp,rSamp);
    prediction[i] = rockPhysicsInv->makePredictions(mu_static_, mu_dynamic_ );
  }
  LogKit::LogFormatted(LogKit::Low,"done\n\n");

  delete rockPhysicsInv;

  return prediction;
}