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.
simulacion-permeabilidad/fftma_module/gen/lib_src/cov_value.c

89 lines
2.6 KiB
C

#include "genlib.h"
#include "geostat.h"
#include "log.h"
#include "memory.h"
#include <math.h>
#include <time.h>
/*selection of model covariance*/
double cov_value(struct vario_mod variogram, double di, double dj, double dk, int cores) {
double* used_ram_t0 = malloc(sizeof(double));
getVirtualMemUsed(used_ram_t0);
clock_t t = clock();
log_info("RESULT = in progress, di = %f, dj = %f, dk = %f", di, dj, dk);
struct cpustat initial[cores];
struct cpustat final[cores];
for (int i = 0; i < cores; i++) {
get_stats(&initial[i], i - 1);
}
double hx, hy, hz, h;
double cov;
int k;
cov = 0.;
for (k = 0; k < variogram.Nvario; k++) {
hx = di * variogram.ap[9 * k] + dj * variogram.ap[9 * k + 1] + dk * variogram.ap[9 * k + 2];
hy = di * variogram.ap[9 * k + 3] + dj * variogram.ap[9 * k + 4] + dk * variogram.ap[9 * k + 5];
hz = di * variogram.ap[9 * k + 6] + dj * variogram.ap[9 * k + 7] + dk * variogram.ap[9 * k + 8];
h = sqrt(hx * hx + hy * hy + hz * hz);
switch (variogram.vario[k]) {
case 1:
cov += variogram.var[k] * exponential(h);
break;
case 2:
cov += variogram.var[k] * gaussian(h);
break;
case 3:
cov += variogram.var[k] * spherical(h);
break;
case 4:
cov += variogram.var[k] * cardsin(h, cores);
break;
case 5:
cov += variogram.var[k] * stable(h, variogram.alpha[k]);
break;
case 6:
cov += variogram.var[k] * gammf(h, variogram.alpha[k], cores);
break;
case 7:
cov += variogram.var[k] * cubic(h, cores);
break;
case 8:
cov += variogram.var[k] * nugget(h);
break;
case 9:
cov += variogram.var[k] * power(h, variogram.alpha[k]);
break;
}
}
t = clock() - t;
double time_taken = ((double)t)/CLOCKS_PER_SEC; // calculate the elapsed time
for (int i = 0; i < cores; i++) {
get_stats(&final[i], i - 1);
}
for (int i = 0; i < cores; i++) {
log_info("CPU %d: %lf%%", i, calculate_load(&initial[i], &final[i]));
}
double* used_ram_tf = malloc(sizeof(double));
getVirtualMemUsed(used_ram_tf);
log_info("RESULT = success, cov = %f, hx = %f, hy = %f, hz = %f, h = %f , ELAPSED = %f seconds, DIF USED VIRTUAL MEM = %5.1f MB", cov, hx, hy, hz, h, time_taken, *used_ram_tf - *used_ram_t0);
free(used_ram_t0);
free(used_ram_tf);
return cov;
}