-
joeri.brackenhoff authoredjoeri.brackenhoff authored
sourceOnSurface3D.c 23.56 KiB
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#include<assert.h>
#include"fdelmodc3D.h"
#define ISODD(n) ((n) & 01)
static float *src1x, *src1y, *src1z, *src2x, *src2y, *src2z;
static long first=1;
void vmess(char *fmt, ...);
long allocStoreSourceOnSurface3D(srcPar src)
{
/* allocated 2x size for dipole Potential sources */
src1x = (float *)calloc(2*src.n, sizeof(float));
src1y = (float *)calloc(2*src.n, sizeof(float));
src1z = (float *)calloc(2*src.n, sizeof(float));
src2x = (float *)calloc(2*src.n, sizeof(float));
src2y = (float *)calloc(2*src.n, sizeof(float));
src2z = (float *)calloc(2*src.n, sizeof(float));
first = 0;
return 0;
}
long freeStoreSourceOnSurface3D(void)
{
free(src1x);
free(src1y);
free(src1z);
free(src2x);
free(src2y);
free(src2z);
first = 1;
return 0;
}
long storeSourceOnSurface3D(modPar mod, srcPar src, bndPar bnd,
long ixsrc, long iysrc, long izsrc, float *vx, float *vy, float *vz,
float *tzz, float *tyy, float *txx, float *txz, float *txy, float *tyz, long verbose)
{
/**********************************************************************
AUTHOR:
Jan Thorbecke (janth@xs4all.nl)
The Netherlands
***********************************************************************/
long ixs, iys, izs, isrc, is0;
long ibndz, ibndy, ibndx, store;
long nx, ny, nz, n1, n2;
nx = mod.nx;
ny = mod.ny;
nz = mod.nz;
n1 = mod.naz;
n2 = mod.nax;
if (src.type==6) {
ibndz = mod.ioXz;
ibndy = mod.ioXy;
ibndx = mod.ioXx;
}
else if (src.type==7) {
ibndz = mod.ioZz;
ibndy = mod.ioZy;
ibndx = mod.ioZx;
}
else if (src.type==2) {
ibndz = mod.ioTz;
ibndy = mod.ioTy;
ibndx = mod.ioTx;
if (bnd.lef==4 || bnd.lef==2) ibndx += bnd.ntap;
if (bnd.fro==4 || bnd.fro==2) ibndy += bnd.ntap;
}
else {
ibndz = mod.ioPz;
ibndy = mod.ioPy;
ibndx = mod.ioPx;
if (bnd.lef==4 || bnd.lef==2) ibndx += bnd.ntap;
if (bnd.fro==4 || bnd.fro==2) ibndy += bnd.ntap;
}
/* check if there are sources placed on the boundaries */
is0 = -1*floor((src.n-1)/2);
#pragma omp for private (isrc, ixs, iys, izs, store)
for (isrc=0; isrc<src.n; isrc++) {
/* calculate the source position */
if (src.random || src.multiwav) {
ixs = src.x[isrc] + ibndx;
iys = src.y[isrc] + ibndy;
izs = src.z[isrc] + ibndz;
}
else { /* plane wave and point sources */
ixs = ixsrc + ibndx + is0 + isrc;
iys = iysrc + ibndy + is0 + isrc;
izs = izsrc + ibndz;
}
/* check if there are source positions placed on the boundaries.
* In that case store them and reapply them after the boundary
* conditions have been set */
store=0;
if ( (ixs <= ibndx+1) && ISODD(bnd.lef)) store=1;
if ( (ixs >= nx+ibndx) && ISODD(bnd.rig)) store=1;
if ( (iys <= ibndy+1) && ISODD(bnd.fro)) store=1;
if ( (iys >= ny+ibndy) && ISODD(bnd.bac)) store=1;
if ( (izs <= ibndz+1) && ISODD(bnd.top)) store=1;
if ( (izs >= nz+ibndz) && ISODD(bnd.bot)) store=1;
if (mod.ischeme <= 2) { /* Acoustic scheme */
if (store) {
if (verbose>=5) vmess("source at x=%li y=%li z=%li stored before free surface", ixs, iys, izs);
/* Compressional source */
if (src.type == 1) {
if (src.orient==1) { /* monopole */
src1z[isrc] = tzz[iys*n1*n2+ixs*n1+izs];
}
else if (src.orient==2) { /* dipole +/- */
src1z[isrc] = tzz[iys*n1*n2+ixs*n1+izs];
src2z[isrc] = tzz[iys*n1*n2+ixs*n1+izs+1];
}
else if (src.orient==3) { /* dipole - + */
src1z[isrc] = tzz[iys*n1*n2+ixs*n1+izs];
src2z[isrc] = tzz[iys*n1*n2+(ixs-1)*n1+izs];
}
else if (src.orient==4) { /* dipole +/0/- */
if (izs > ibndz)
src1z[isrc] = tzz[iys*n1*n2+ixs*n1+izs-1];
if (izs < mod.nz+ibndz-1)
src2z[isrc] = tzz[iys*n1*n2+ixs*n1+izs+1];
}
else if (src.orient==5) { /* dipole + - */
src1z[isrc] = tzz[iys*n1*n2+ixs*n1+izs];
src2z[isrc] = tzz[iys*n1*n2+(ixs+1)*n1+izs];
}
}
else if (src.type==6) {
src1x[isrc] = vx[iys*n1*n2+ixs*n1+izs];
}
else if (src.type==7) {
src1z[isrc] = vz[iys*n1*n2+ixs*n1+izs];
}
}
}
else { /* Elastic scheme */
if (store) {
if (verbose>=5) vmess("source at x=%li y=%li z=%li stored before free surface", ixs, iys, izs);
if (src.type==1) {
if (src.orient==1) { /* monopole */
src1x[isrc] = txx[iys*n1*n2+ixs*n1+izs];
src1y[isrc] = tyy[iys*n1*n2+ixs*n1+izs];
src1z[isrc] = tzz[iys*n1*n2+ixs*n1+izs];
}
else if (src.orient==2) { /* dipole +/- */
src1x[isrc] = txx[iys*n1*n2+ixs*n1+izs];
src1y[isrc] = tyy[iys*n1*n2+ixs*n1+izs];
src1z[isrc] = tzz[iys*n1*n2+ixs*n1+izs];
src2x[isrc] = txx[iys*n1*n2+ixs*n1+izs+1];
src2y[isrc] = tyy[iys*n1*n2+ixs*n1+izs+1];
src2z[isrc] = tzz[iys*n1*n2+ixs*n1+izs+1];
}
else if (src.orient==3) { /* dipole - + */
src1x[isrc] = txx[iys*n1*n2+ixs*n1+izs];
src1y[isrc] = tyy[iys*n1*n2+ixs*n1+izs];
src1z[isrc] = tzz[iys*n1*n2+ixs*n1+izs];
src2x[isrc] = txx[iys*n1*n2+(ixs-1)*n1+izs];
src2y[isrc] = tyy[iys*n1*n2+(ixs-1)*n1+izs];
src2z[isrc] = tzz[iys*n1*n2+(ixs-1)*n1+izs];
}
else if (src.orient==4) { /* dipole +/0/- */
if (izs > ibndz) {
src1x[isrc] = txx[iys*n1*n2+ixs*n1+izs-1];
src1y[isrc] = tyy[iys*n1*n2+ixs*n1+izs-1];
src1z[isrc] = tzz[iys*n1*n2+ixs*n1+izs-1];
}
if (izs < mod.nz+ibndz-1) {
src1x[isrc] = txx[iys*n1*n2+ixs*n1+izs+1];
src1y[isrc] = tyy[iys*n1*n2+ixs*n1+izs+1];
src1z[isrc] = tzz[iys*n1*n2+ixs*n1+izs+1];
}
}
else if (src.orient==5) { /* dipole + - */
src1x[isrc] = txx[iys*n1*n2+ixs*n1+izs];
src1y[isrc] = tyy[iys*n1*n2+ixs*n1+izs];
src1z[isrc] = tzz[iys*n1*n2+ixs*n1+izs];
src2x[isrc] = txx[iys*n1*n2+(ixs+1)*n1+izs];
src2y[isrc] = tyy[iys*n1*n2+(ixs+1)*n1+izs];
src2z[isrc] = tzz[iys*n1*n2+(ixs+1)*n1+izs];
}
}
else if (src.type==2) {
/* Txz source */
if ((izs == ibndz) && bnd.top==1) {
src1x[isrc] = txz[iys*n1*n2+(ixs-1)*n1+izs-1];
src2x[isrc] = txz[iys*n1*n2+ixs*n1+izs-1];
}
else {
src1x[isrc] = txz[iys*n1*n2+ixs*n1+izs];
}
/* possible dipole orientations for a txz source */
if (src.orient == 2) { /* dipole +/- */
src2x[isrc] = txz[iys*n1*n2+ixs*n1+izs+1];
}
else if (src.orient == 3) { /* dipole - + */
src2x[isrc] = txz[iys*n1*n2+(ixs-1)*n1+izs];
}
else if (src.orient == 4) { /* dipole +/O/- */
/* correction: subtrace previous value to prevent z-1 values. */
src1x[isrc] = txz[iys*n1*n2+ixs*n1+izs];
src2x[isrc] = txz[iys*n1*n2+ixs*n1+izs+1];
}
else if (src.orient == 5) { /* dipole + - */
src2x[isrc] = txz[iys*n1*n2+(ixs+1)*n1+izs];
}
}
else if (src.type==3) {
src1z[isrc] = tzz[iys*n1*n2+ixs*n1+izs];
}
else if (src.type==4) {
src1x[isrc] = txx[iys*n1*n2+ixs*n1+izs];
}
else if (src.type==5) {
src1x[isrc] = vx[iys*n1*n2+ixs*n1+izs];
src1y[isrc] = vy[iys*n1*n2+ixs*n1+izs];
src1z[isrc] = vz[iys*n1*n2+ixs*n1+izs];
src2x[isrc] = vx[iys*n1*n2+ixs*n1+izs-1];
src2y[isrc] = vy[(iys-1)*n1*n2+ixs*n1+izs];
src2z[isrc] = vz[iys*n1*n2+(ixs-1)*n1+izs];
/* determine second position of dipole */
if (src.orient == 2) { /* dipole +/- vertical */
izs += 1;
src1x[isrc+src.n] = vx[iys*n1*n2+ixs*n1+izs];
src1y[isrc+src.n] = vy[iys*n1*n2+ixs*n1+izs];
src1z[isrc+src.n] = vz[iys*n1*n2+ixs*n1+izs];
src2x[isrc+src.n] = vx[iys*n1*n2+ixs*n1+izs-1];
src2y[isrc+src.n] = vz[(iys-1)*n1*n2+ixs*n1+izs];
src2z[isrc+src.n] = vz[iys*n1*n2+(ixs-1)*n1+izs];
}
else if (src.orient == 3) { /* dipole - + horizontal */
ixs += 1;
src1x[isrc+src.n] = vx[iys*n1*n2+ixs*n1+izs];
src1y[isrc+src.n] = vy[iys*n1*n2+ixs*n1+izs];
src1z[isrc+src.n] = vz[iys*n1*n2+ixs*n1+izs];
src2x[isrc+src.n] = vx[iys*n1*n2+ixs*n1+izs-1];
src2y[isrc+src.n] = vz[(iys-1)*n1*n2+ixs*n1+izs];
src2z[isrc+src.n] = vz[iys*n1*n2+(ixs-1)*n1+izs];
}
}
else if (src.type==6) {
src1x[isrc] = vx[iys*n1*n2+ixs*n1+izs];
}
else if (src.type==7) {
src1z[isrc] = vz[iys*n1*n2+ixs*n1+izs];
}
else if (src.type==8) {
src1x[isrc] = vx[iys*n1*n2+(ixs+1)*n1+izs];
src1y[isrc] = vy[(iys+1)*n1*n2+ixs*n1+izs];
src1z[isrc] = vz[iys*n1*n2+ixs*n1+izs+1];
src2x[isrc] = vx[iys*n1*n2+ixs*n1+izs];
src2y[isrc] = vy[iys*n1*n2+ixs*n1+izs];
src2z[isrc] = vz[iys*n1*n2+ixs*n1+izs];
/* determine second position of dipole */
if (src.orient == 2) { /* dipole +/- vertical */
izs += 1;
src1x[isrc+src.n] = vx[iys*n1*n2+(ixs+1)*n1+izs];
src1y[isrc] = vy[(iys+1)*n1*n2+ixs*n1+izs];
src1z[isrc+src.n] = vz[iys*n1*n2+ixs*n1+izs+1];
src2x[isrc+src.n] = vx[iys*n1*n2+ixs*n1+izs];
src2y[isrc] = vy[iys*n1*n2+ixs*n1+izs];
src2z[isrc+src.n] = vz[iys*n1*n2+ixs*n1+izs];
}
else if (src.orient == 3) { /* dipole - + horizontal */
ixs += 1;
src1x[isrc+src.n] = vx[iys*n1*n2+(ixs+1)*n1+izs];
src1y[isrc] = vy[(iys+1)*n1*n2+ixs*n1+izs];
src1z[isrc+src.n] = vz[iys*n1*n2+ixs*n1+izs+1];
src2x[isrc+src.n] = vx[iys*n1*n2+ixs*n1+izs];
src2y[isrc] = vy[iys*n1*n2+ixs*n1+izs];
src2z[isrc+src.n] = vz[iys*n1*n2+ixs*n1+izs];
}
} /* end of source.type */
}
}
}
return 0;
}
long reStoreSourceOnSurface3D(modPar mod, srcPar src, bndPar bnd,
long ixsrc, long iysrc, long izsrc, float *vx, float *vy, float *vz,
float *tzz, float *tyy, float *txx, float *txz, float *txy, float *tyz, long verbose)
{
/**********************************************************************
AUTHOR:
Jan Thorbecke (janth@xs4all.nl)
The Netherlands
***********************************************************************/
long ixs, iys, izs, isrc, is0;
long ibndz, ibndy, ibndx, store;
long nx, ny, nz, n1, n2;
nx = mod.nx;
ny = mod.ny;
nz = mod.nz;
n1 = mod.naz;
n2 = mod.nax;
if (src.type==6) {
ibndz = mod.ioXz;
ibndy = mod.ioXy;
ibndx = mod.ioXx;
}
else if (src.type==7) {
ibndz = mod.ioZz;
ibndy = mod.ioZy;
ibndx = mod.ioZx;
}
else if (src.type==2) {
ibndz = mod.ioTz;
ibndy = mod.ioTy;
ibndx = mod.ioTx;
if (bnd.lef==4 || bnd.lef==2) ibndx += bnd.ntap;
if (bnd.fro==4 || bnd.fro==2) ibndy += bnd.ntap;
}
else {
ibndz = mod.ioPz;
ibndy = mod.ioPy;
ibndx = mod.ioPx;
if (bnd.lef==4 || bnd.lef==2) ibndx += bnd.ntap;
if (bnd.fro==4 || bnd.fro==2) ibndy += bnd.ntap;
}
/* restore source positions on the edge */
is0 = -1*floor((src.n-1)/2);
#pragma omp for private (isrc, ixs, iys, izs, store)
for (isrc=0; isrc<src.n; isrc++) {
/* calculate the source position */
if (src.random || src.multiwav) {
ixs = src.x[isrc] + ibndx;
iys = src.y[isrc] + ibndy;
izs = src.z[isrc] + ibndz;
}
else { /* plane wave and point sources */
ixs = ixsrc + ibndx + is0 + isrc;
iys = iysrc + ibndy + is0 + isrc;
izs = izsrc + ibndz;
}
store=0;
if ( (ixs <= ibndx+1) && ISODD(bnd.lef)) store=1;
if ( (ixs >= nx+ibndx) && ISODD(bnd.rig)) store=1;
if ( (iys <= ibndy+1) && ISODD(bnd.fro)) store=1;
if ( (iys >= ny+ibndy) && ISODD(bnd.bac)) store=1;
if ( (izs <= ibndz+1) && ISODD(bnd.top)) store=1;
if ( (izs >= nz+ibndz) && ISODD(bnd.bot)) store=1;
if (mod.ischeme <= 2) { /* Acoustic scheme */
if (store) {
if (verbose>=5) vmess("source at x=%li y=%li z=%li restored at free surface", ixs, iys, izs);
/* Compressional source */
if (src.type == 1) {
if (src.orient==1) { /* monopole */
tzz[iys*n1*n2+ixs*n1+izs]= src1z[isrc];
}
else if (src.orient==2) { /* dipole +/- */
tzz[iys*n1*n2+ixs*n1+izs] = src1z[isrc];
tzz[iys*n1*n2+ixs*n1+izs+1] = src2z[isrc];
}
else if (src.orient==3) { /* dipole - + */
tzz[iys*n1*n2+ixs*n1+izs] = src1z[isrc];
tzz[iys*n1*n2+(ixs-1)*n1+izs] = src2z[isrc];
}
else if (src.orient==4) { /* dipole +/0/- */
if (izs > ibndz)
tzz[iys*n1*n2+ixs*n1+izs-1] = src1z[isrc];
if (izs < mod.nz+ibndz-1)
tzz[iys*n1*n2+ixs*n1+izs+1] = src2z[isrc];
}
else if (src.orient==5) { /* dipole + - */
tzz[iys*n1*n2+ixs*n1+izs] = src1z[isrc];
tzz[iys*n1*n2+(ixs+1)*n1+izs] = src2z[isrc];
}
}
else if (src.type==6) {
vx[iys*n1*n2+ixs*n1+izs] = src1x[isrc];
}
else if (src.type==7) {
vz[iys*n1*n2+ixs*n1+izs] = src1z[isrc];
}
}
}
else { /* Elastic scheme */
if (store) {
if (verbose>=5) vmess("source at x=%li y=%li z=%li restored at free surface", ixs, iys, izs);
if (src.type==1) {
if (src.orient==1) { /* monopole */
txx[iys*n1*n2+ixs*n1+izs] = src1x[isrc];
tyy[iys*n1*n2+ixs*n1+izs] = src1y[isrc];
tzz[iys*n1*n2+ixs*n1+izs] = src1z[isrc];
}
else if (src.orient==2) { /* dipole +/- */
txx[iys*n1*n2+ixs*n1+izs] = src1x[isrc];
tyy[iys*n1*n2+ixs*n1+izs] = src1y[isrc];
tzz[iys*n1*n2+ixs*n1+izs] = src1z[isrc];
txx[iys*n1*n2+ixs*n1+izs+1] = src2x[isrc];
tyy[iys*n1*n2+ixs*n1+izs+1] = src2y[isrc];
tzz[iys*n1*n2+ixs*n1+izs+1] = src2z[isrc];
}
else if (src.orient==3) { /* dipole - + */
txx[iys*n1*n2+ixs*n1+izs] = src1x[isrc];
tyy[iys*n1*n2+ixs*n1+izs] = src1y[isrc];
tzz[iys*n1*n2+ixs*n1+izs] = src1z[isrc];
txx[iys*n1*n2+(ixs-1)*n1+izs] = src2x[isrc];
tyy[iys*n1*n2+(ixs-1)*n1+izs] = src2y[isrc];
tzz[iys*n1*n2+(ixs-1)*n1+izs] = src2z[isrc];
}
else if (src.orient==4) { /* dipole +/0/- */
if (izs > ibndz) {
txx[iys*n1*n2+ixs*n1+izs-1] = src1x[isrc];
tyy[iys*n1*n2+ixs*n1+izs-1] = src1y[isrc];
tzz[iys*n1*n2+ixs*n1+izs-1] = src1z[isrc];
}
if (izs < mod.nz+ibndz-1) {
txx[iys*n1*n2+ixs*n1+izs+1] = src1x[isrc];
tyy[iys*n1*n2+ixs*n1+izs+1] = src1y[isrc];
tzz[iys*n1*n2+ixs*n1+izs+1] = src1z[isrc];
}
}
else if (src.orient==5) { /* dipole + - */
txx[iys*n1*n2+ixs*n1+izs] = src1x[isrc];
tyy[iys*n1*n2+ixs*n1+izs] = src1y[isrc];
tzz[iys*n1*n2+ixs*n1+izs] = src1z[isrc];
txx[iys*n1*n2+(ixs+1)*n1+izs] = src2x[isrc];
tyy[iys*n1*n2+(ixs+1)*n1+izs] = src2y[isrc];
tzz[iys*n1*n2+(ixs+1)*n1+izs] = src2z[isrc];
}
}
else if (src.type==2) {
/* Txz source */
if ((izs == ibndz) && bnd.top==1) {
txz[iys*n1*n2+(ixs-1)*n1+izs-1] = src1x[isrc];
txz[iys*n1*n2+ixs*n1+izs-1] = src2x[isrc];
}
else {
txz[iys*n1*n2+ixs*n1+izs] = src1x[isrc];
}
/* possible dipole orientations for a txz source */
if (src.orient == 2) { /* dipole +/- */
txz[iys*n1*n2+ixs*n1+izs+1] = src2x[isrc];
}
else if (src.orient == 3) { /* dipole - + */
txz[iys*n1*n2+(ixs-1)*n1+izs] = src2x[isrc];
}
else if (src.orient == 4) { /* dipole +/O/- */
/* correction: subtrace previous value to prevent z-1 values. */
txz[iys*n1*n2+ixs*n1+izs] = src1x[isrc];
txz[iys*n1*n2+ixs*n1+izs+1] = src2x[isrc];
}
else if (src.orient == 5) { /* dipole + - */
txz[iys*n1*n2+(ixs+1)*n1+izs] = src2x[isrc];
}
}
else if (src.type==3) {
tzz[iys*n1*n2+ixs*n1+izs] = src1z[isrc];
}
else if (src.type==4) {
txx[iys*n1*n2+ixs*n1+izs] = src1x[isrc];
}
else if (src.type==5) {
vx[iys*n1*n2+ixs*n1+izs]= src1x[isrc];
vy[iys*n1*n2+ixs*n1+izs] = src1y[isrc];
vz[iys*n1*n2+ixs*n1+izs] = src1z[isrc];
vx[iys*n1*n2+ixs*n1+izs-1] = src2x[isrc];
vy[(iys-1)*n1*n2+ixs*n1+izs] = src2y[isrc];
vz[iys*n1*n2+(ixs-1)*n1+izs] = src2z[isrc];
/* determine second position of dipole */
if (src.orient == 2) { /* dipole +/- vertical */
izs += 1;
vx[iys*n1*n2+ixs*n1+izs] = src1x[isrc+src.n];
vy[iys*n1*n2+ixs*n1+izs] = src1y[isrc+src.n];
vz[iys*n1*n2+ixs*n1+izs] = src1z[isrc+src.n];
vx[iys*n1*n2+ixs*n1+izs-1] = src2x[isrc+src.n];
vy[(iys-1)*n1*n2+ixs*n1+izs] = src2y[isrc+src.n];
vz[iys*n1*n2+(ixs-1)*n1+izs] = src2z[isrc+src.n];
}
else if (src.orient == 3) { /* dipole - + horizontal */
ixs += 1;
vx[iys*n1*n2+ixs*n1+izs] = src1x[isrc+src.n];
vy[iys*n1*n2+ixs*n1+izs] = src1y[isrc+src.n];
vz[iys*n1*n2+ixs*n1+izs] = src1z[isrc+src.n];
vx[iys*n1*n2+ixs*n1+izs-1] = src2x[isrc+src.n];
vy[(iys-1)*n1*n2+ixs*n1+izs] = src2y[isrc+src.n];
vz[iys*n1*n2+(ixs-1)*n1+izs] = src2z[isrc+src.n];
}
}
else if (src.type==6) {
vx[iys*n1*n2+ixs*n1+izs] = src1x[isrc];
}
else if (src.type==7) {
vz[iys*n1*n2+ixs*n1+izs] = src1z[isrc];
}
else if (src.type==8) {
vx[iys*n1*n2+(ixs+1)*n1+izs] = src1x[isrc];
vy[(iys+1)*n1*n2+ixs*n1+izs] = src1z[isrc];
vz[iys*n1*n2+ixs*n1+izs+1] = src1z[isrc];
vx[iys*n1*n2+ixs*n1+izs] = src2x[isrc];
vy[iys*n1*n2+ixs*n1+izs] = src2y[isrc];
vz[iys*n1*n2+ixs*n1+izs] = src2z[isrc];
/* determine second position of dipole */
if (src.orient == 2) { /* dipole +/- vertical */
izs += 1;
vx[iys*n1*n2+(ixs+1)*n1+izs] = src1x[isrc+src.n];
vy[(iys+1)*n1*n2+ixs*n1+izs] = src1y[isrc+src.n];
vz[iys*n1*n2+ixs*n1+izs+1] = src1z[isrc+src.n];
vx[iys*n1*n2+ixs*n1+izs] = src2x[isrc+src.n];
vy[iys*n1*n2+ixs*n1+izs] = src2y[isrc+src.n];
vz[iys*n1*n2+ixs*n1+izs] = src2z[isrc+src.n];
}
else if (src.orient == 3) { /* dipole - + horizontal */
ixs += 1;
vx[iys*n1*n2+(ixs+1)*n1+izs] = src1x[isrc+src.n];
vy[(iys+1)*n1*n2+ixs*n1+izs] = src1y[isrc+src.n];
vz[iys*n1*n2+ixs*n1+izs+1] = src1z[isrc+src.n];
vx[iys*n1*n2+ixs*n1+izs] = src2x[isrc+src.n];
vy[iys*n1*n2+ixs*n1+izs] = src2y[isrc+src.n];
vz[iys*n1*n2+ixs*n1+izs] = src2z[isrc+src.n];
}
}
}
}
}
return 0;
}