Skip to content
Snippets Groups Projects
elipse.c 2.54 KiB
#include <math.h>
#include <stdlib.h>
#include <stdio.h>

#define NINT(x) ((int)((x)>0.0?(x)+0.5:(x)-0.5))
#define MAX(x,y) ((x) > (y) ? (x) : (y))
#define MIN(x,y) ((x) < (y) ? (x) : (y))

/**
* Elipse shaped contrast used in makemod
*
*   AUTHOR:
*           Jan Thorbecke (janth@xs4all.nl)
*           The Netherlands 
**/

void elipse(float *x, float *z, int nxp, float dx, float dz, float **gridcp, float **gridcs, float **gridro, float **cp, float **cs,
float **ro, float *interface, int *zp, int nz, int nx, float r1, float r2, float gradcp, float gradcs, float gradro)
{
	int   i, ix, iz, ixr, izr, ixm, izm;
	float r, zr, xr;

	izr = NINT(r1/dz);
	ixr = NINT(r2/dx);

	for (i = 0; i < nx; i++) {
		interface[i] = 0.0;
		zp[i] = 0;
	}

	if (gridcs == NULL && gridro == NULL) {
		for (i = 0; i < nxp; i++) {
			ixm = NINT(x[i]/dx);
			izm = NINT(z[i]/dz);
			interface[ixm] = z[i];
			zp[ixm] = izm;
            for (ix=MAX(ixm-ixr,0); ix<=MIN(ixm+ixr,nx-1); ix++) {
            	for (iz=MAX(izm-izr,0); iz<=MIN(izm+izr,nz-1); iz++) {
					xr=(ix-ixm)*dx/r2;
					zr=(iz-izm)*dz/r1;
					r = sqrt(xr*xr+zr*zr);
					if (r<=1.0) {
						gridcp[ix][iz] = cp[2][i];
						if (gradcp!=0) gridcp[ix][iz] += (float)(drand48()-0.5)*2.0*gradcp;
					}
				}
			}
		}
	}
	else if (gridcs == NULL) {
		for (i = 0; i < nxp; i++) {
			ixm = NINT(x[i]/dx);
			izm = NINT(z[i]/dz);
			interface[ixm] = z[i];
			zp[ixm] = izm;
            for (ix=MAX(ixm-ixr,0); ix<=MIN(ixm+ixr,nx-1); ix++) {
            	for (iz=MAX(izm-izr,0); iz<=MIN(izm+izr,nz-1); iz++) {
					xr=(ix-ixm)*dx/r2;
					zr=(iz-izm)*dz/r1;
					r = sqrt(xr*xr+zr*zr);
					if (r<=1.0) {
						gridcp[ix][iz] = cp[2][i];
						gridro[ix][iz] = ro[2][i];
						if (gradcp!=0) gridcp[ix][iz] += (float)(drand48()-0.5)*2.0*gradcp;
						if (gradro!=0) gridro[ix][iz] += (float)(drand48()-0.5)*2.0*gradro;
					}
				}
			}
		}
	}
	else {
		for (i = 0; i < nxp; i++) {
			ixm = NINT(x[i]/dx);
			izm = NINT(z[i]/dz);
			interface[ixm] = z[i];
			zp[ixm] = izm;
            for (ix=MAX(ixm-ixr,0); ix<=MIN(ixm+ixr,nx-1); ix++) {
            	for (iz=MAX(izm-izr,0); iz<=MIN(izm+izr,nz-1); iz++) {
					xr=(ix-ixm)*dx/r2;
					zr=(iz-izm)*dz/r1;
					r = sqrt(xr*xr+zr*zr);
					if (r<=1.0) {
						gridcp[ix][iz] = cp[2][i];
						gridro[ix][iz] = ro[2][i];
						gridcs[ix][iz] = cs[2][i];
						if (gradcp!=0) gridcp[ix][iz] += (float)(drand48()-0.5)*2.0*gradcp;
						if (gradcs!=0) gridcs[ix][iz] += (float)(drand48()-0.5)*2.0*gradcs;
						if (gradro!=0) gridro[ix][iz] += (float)(drand48()-0.5)*2.0*gradro;
					}
				}
			}
		}
	}

	return;
}