#include #include #include #include "geostat.h" /*FAST FOURIER TRANSFORM MOVING AVERAGE METHOD */ /*Turns a Gaussian white noise vector into a */ /*spatially correlated vector */ /*input: */ /*variogram: structure defining the variogram */ /* model */ /*grid: structure defining the grid */ /*n: vector with the number of cells along the */ /* X, Y and Z axes for the underlying grid */ /* i = [0 1 2] */ /* --> 0 0 0 : n will be computed and */ /* updated as output */ /* --> nx ny nz: these dimensions are used */ /*realin: structure defining a realization - */ /* must be a Gaussian white noise */ /*output: */ /*realout: structure defining a realization - */ void FFTMA2(struct vario_mod variogram,struct grid_mod grid,int n[3],struct realization_mod *realin,struct realization_mod *realout) { int NTOT,i,j,k,NMAX,NDIM,ntot,nmax,NXYZ,nxyz,maille0,maille1; int solver; double temp; double *ireal,*covar,*workr,*worki,*realization; string variable; /*covariance axis normalization*/ axes(variogram.ap,variogram.scf,variogram.Nvario); /*pseudo-grid definition*/ cgrid(variogram,grid,n); /*constant definition*/ NTOT = n[0]*n[1]*n[2]; ntot = NTOT+1; NMAX = n[0]; NDIM = 3; for (i=1;i<3;i++) { if (n[i] > NMAX) NMAX = n[i]; if (n[i] == 1) NDIM--; } nmax = NMAX+1; NXYZ = grid.NX*grid.NY*grid.NZ; nxyz = NXYZ+1; /*array initialization*/ covar = (double *) malloc(ntot * sizeof(double)); /* testmemory(covar); */ allouememoire(covar,'covar'); ireal = (double *) malloc(ntot * sizeof(double)); testmemory(ireal); realization = (double *) malloc(ntot * sizeof(double)); testmemory(realization); workr = (double *) malloc(nmax * sizeof(double)); testmemory(workr); worki = (double *) malloc(nmax * sizeof(double)); testmemory(worki); /*covariance function creation*/ covariance(covar,variogram,grid,n); /*power spectrum*/ fourt(covar,ireal,n,NDIM,1,0,workr,worki); /*organization of the input Gaussian white noise*/ solver=0; prebuild_gwn(grid,n,realin,realization,solver); /*forward fourier transform of the GWN*/ fourt(realization,ireal,n,NDIM,1,0,workr,worki); /* build realization in spectral domain */ build_real(n,NTOT,covar,realization,ireal); free(covar); /*backward fourier transform*/ fourt(realization,ireal,n,NDIM,0,1,workr,worki); free(ireal); free(workr); free(worki); /*output realization*/ clean_real(realin,n,grid,realization,realout); free(realization); return; }