You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
3.1 KiB
C
99 lines
3.1 KiB
C
#include "geostat.h"
|
|
#include "chunk_array.h"
|
|
#include <math.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <time.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 cores, long* seed) {
|
|
int NTOT, i, j, k, NMAX, NDIM, ntot, nmax, NXYZ, nxyz;
|
|
int solver;
|
|
double temp;
|
|
chunk_array_t *covar, *ireal, *realization;
|
|
double *workr, *worki;
|
|
|
|
/*covariance axis normalization*/
|
|
axes(variogram.ap, variogram.scf, variogram.Nvario);
|
|
|
|
/*pseudo-grid definition*/
|
|
cgrid(variogram, grid, n, cores);
|
|
|
|
/*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 = chunk_array_create("covar.txt", ntot, 1500);
|
|
ireal = chunk_array_create("ireal.txt", ntot, 1500);
|
|
realization = chunk_array_create("realization.txt", ntot, 1500);
|
|
|
|
workr = (double*)malloc(nmax * sizeof(double));
|
|
testmemory(workr);
|
|
|
|
worki = (double*)malloc(nmax * sizeof(double));
|
|
testmemory(worki);
|
|
|
|
/*covariance function creation*/
|
|
covariance(covar, variogram, grid, n, cores);
|
|
|
|
/*power spectrum*/
|
|
printf("Running with covar and ireal\n");
|
|
fourt(covar, ireal, n, NDIM, 1, 0, workr, worki, cores);
|
|
|
|
/*organization of the input Gaussian white noise*/
|
|
solver = 0;
|
|
prebuild_gwn(grid, n, realin, realization, solver, cores, seed);
|
|
|
|
/*forward fourier transform of the GWN*/
|
|
printf("Running with realization and ireal\n");
|
|
fourt(realization, ireal, n, NDIM, 1, 0, workr, worki, cores);
|
|
|
|
/* build realization in spectral domain */
|
|
build_real(n, NTOT, covar, realization, ireal, cores);
|
|
|
|
chunk_array_free(covar);
|
|
//remove("covar.txt");
|
|
|
|
/*backward fourier transform*/
|
|
printf("Running with realization and ireal\n");
|
|
fourt(realization, ireal, n, NDIM, 0, 1, workr, worki, cores);
|
|
|
|
chunk_array_free(ireal);
|
|
remove("ireal.txt");
|
|
|
|
free(workr);
|
|
free(worki);
|
|
|
|
/*output realization*/
|
|
clean_real(realin, n, grid, realization, realout, cores);
|
|
}
|