-
Jan Thorbecke authoredJan Thorbecke authored
grid.c 5.56 KiB
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
/**
* fills the gridded model below the interface zp used in makemod.
* Vertical and horizontal gradients are taken into account
*
* AUTHOR:
* Jan Thorbecke (janth@xs4all.nl)
* The Netherlands
**/
#ifndef ABS
#define ABS(x) ((x) < 0 ? -(x) : (x))
#endif
#ifndef MAX
#define MAX(x,y) ((x) > (y) ? (x) : (y))
#endif
#ifndef MIN
#define MIN(x,y) ((x) < (y) ? (x) : (y))
#endif
#define NINT(x) ((int)((x)>0.0?(x)+0.5:(x)-0.5))
void grid(float **gridcp, float **gridcs, float **gridro, int *zp,
float **cp, float **cs, float **ro, int minx, int maxx, int optgrad,
float gradlen, float gradcp, float gradcs, float gradro, float dx,
float dz, int nz)
{
int g, ngrad, gradend, i, k, j;
float deltcp, deltcs, deltro, co;
if (gridcs == NULL && gridro == NULL) {
if (optgrad == 1) {
g = NINT(gradlen/dz)-1;
for (i = minx; i < maxx; i++) {
deltcp = (cp[1][i] - cp[0][i])/g;
if (zp[i] == 0) k = 1;
else k = 0;
ngrad = zp[i] + g;
gradend = MIN(ngrad, nz);
for (j = zp[i]; j <= gradend; j++) {
gridcp[i][j] = cp[0][i]+deltcp*k;
k += 1;
}
for (j = gradend+1, k = 0; j < nz; j++, k++) {
gridcp[i][j] = cp[1][i] + (float)k*gradcp;
}
}
}
else if (optgrad == 2) {
g = NINT(gradlen/dz)-1;
for (i = minx; i < maxx; i++) {
deltcp = (cp[1][i] - cp[0][i])/g;
if (zp[i] == 0) k = 1;
else k = 0;
ngrad = zp[i] + g;
gradend = MIN(ngrad, nz);
for (j = zp[i]; j <= gradend; j++) {
co = -g*(cos(M_PI*((float)k/(float)g))-1)/2.0;
gridcp[i][j] = cp[0][i]+deltcp*co;
k += 1;
}
for (j = gradend+1, k = 0; j < nz; j++, k++) {
gridcp[i][j] = cp[1][i] + (float)k*gradcp;
}
}
}
else if (optgrad == 3) {
for (i = minx; i < maxx; i++) {
for (j = zp[i], k = 0; j < nz; j++, k++) {
gridcp[i][j] = cp[1][i] + (float)k*gradcp;
}
}
}
else if (optgrad == 4) {
for (i = minx; i < maxx; i++) {
for (j = zp[i], k = 0; j < nz; j++, k++) {
gridcp[i][j] = cp[1][i] + (float)(drand48()-0.5)*2.0*gradcp;
}
}
}
return;
}
else if (gridcs == NULL) {
if (optgrad == 1) {
g = NINT(gradlen/dz)-1;
for (i = minx; i < maxx; i++) {
deltcp = (cp[1][i] - cp[0][i])/g;
deltro = (ro[1][i] - ro[0][i])/g;
if (zp[i] == 0) k = 1;
else k = 0;
ngrad = zp[i] + g;
gradend = MIN(ngrad, nz);
for (j = zp[i]; j <= gradend; j++) {
gridcp[i][j] = cp[0][i]+deltcp*k;
gridro[i][j] = ro[0][i]+deltro*k;
k += 1;
}
for (j = gradend+1, k = 0; j < nz; j++, k++) {
gridcp[i][j] = cp[1][i] + (float)k*gradcp;
gridro[i][j] = ro[1][i] + (float)k*gradro;
}
}
}
else if (optgrad == 2) {
g = NINT(gradlen/dz)-1;
for (i = minx; i < maxx; i++) {
deltcp = (cp[1][i] - cp[0][i])/g;
deltro = (ro[1][i] - ro[0][i])/g;
if (zp[i] == 0) k = 1;
else k = 0;
ngrad = zp[i] + g;
gradend = MIN(ngrad, nz);
for (j = zp[i]; j <= gradend; j++) {
co = -g*(cos(M_PI*((float)k/(float)g))-1)/2.0;
gridcp[i][j] = cp[0][i]+deltcp*co;
gridro[i][j] = ro[0][i]+deltro*co;
k += 1;
}
for (j = gradend+1, k = 0; j < nz; j++, k++) {
gridcp[i][j] = cp[1][i] + (float)k*gradcp;
gridro[i][j] = ro[1][i] + (float)k*gradro;
}
}
}
else if (optgrad == 3) {
for (i = minx; i < maxx; i++) {
for (j = zp[i], k = 0; j < nz; j++, k++) {
gridcp[i][j] = cp[1][i] + (float)k*gradcp;
gridro[i][j] = ro[1][i] + (float)k*gradro;
}
}
}
else if (optgrad == 4) {
for (i = minx; i < maxx; i++) {
for (j = zp[i], k = 0; j < nz; j++, k++) {
gridcp[i][j] = cp[1][i] + (float)(drand48()-0.5)*2.0*gradcp;
gridro[i][j] = ro[1][i] + (float)(drand48()-0.5)*2.0*gradro;
}
}
}
return;
}
else {
if (optgrad == 1) {
g = NINT(gradlen/dz)-1;
for (i = minx; i < maxx; i++) {
deltcp = (cp[1][i] - cp[0][i])/g;
deltcs = (cs[1][i] - cs[0][i])/g;
deltro = (ro[1][i] - ro[0][i])/g;
if (zp[i] == 0) k = 1;
else k = 0;
ngrad = zp[i] + g;
gradend = MIN(ngrad, nz);
for (j = zp[i]; j <= gradend; j++) {
gridcp[i][j] = cp[0][i]+deltcp*k;
gridcs[i][j] = cs[0][i]+deltcs*k;
gridro[i][j] = ro[0][i]+deltro*k;
k += 1;
}
for (j = gradend+1, k = 0; j < nz; j++, k++) {
gridcp[i][j] = cp[1][i] + (float)k*gradcp;
gridcs[i][j] = cs[1][i] + (float)k*gradcs;
gridro[i][j] = ro[1][i] + (float)k*gradro;
}
}
}
else if (optgrad == 2) {
g = NINT(gradlen/dz)-1;
for (i = minx; i < maxx; i++) {
deltcp = (cp[1][i] - cp[0][i])/g;
deltcs = (cs[1][i] - cs[0][i])/g;
deltro = (ro[1][i] - ro[0][i])/g;
if (zp[i] == 0) k = 1;
else k = 0;
ngrad = zp[i] + g;
gradend = MIN(ngrad, nz);
for (j = zp[i]; j <= gradend; j++) {
co = -g*(cos(M_PI*((float)k/(float)g))-1)/2.0;
gridcp[i][j] = cp[0][i]+deltcp*co;
gridcs[i][j] = cs[0][i]+deltcs*co;
gridro[i][j] = ro[0][i]+deltro*co;
k += 1;
}
for (j = gradend+1, k = 0; j < nz; j++, k++) {
gridcp[i][j] = cp[1][i] + (float)k*gradcp;
gridcs[i][j] = cs[1][i] + (float)k*gradcs;
gridro[i][j] = ro[1][i] + (float)k*gradro;
}
}
}
else if (optgrad == 3) {
for (i = minx; i < maxx; i++) {
for (j = zp[i], k = 0; j < nz; j++, k++) {
gridcp[i][j] = cp[1][i] + (float)k*gradcp;
gridcs[i][j] = cs[1][i] + (float)k*gradcs;
gridro[i][j] = ro[1][i] + (float)k*gradro;
}
}
}
else if (optgrad == 4) {
for (i = minx; i < maxx; i++) {
for (j = zp[i], k = 0; j < nz; j++, k++) {
gridcp[i][j] = cp[1][i] + (float)(drand48()-0.5)*2.0*gradcp;
gridcs[i][j] = cs[1][i] + (float)(drand48()-0.5)*2.0*gradcs;
gridro[i][j] = ro[1][i] + (float)(drand48()-0.5)*2.0*gradro;
}
}
}
return;
}
}