diff --git a/fdelmodc3D/alloc3D.c b/fdelmodc3D/alloc3D.c new file mode 100644 index 0000000000000000000000000000000000000000..d82748fabacda9dd5605dae2aa35815a77d15997 --- /dev/null +++ b/fdelmodc3D/alloc3D.c @@ -0,0 +1,73 @@ +#include <stdlib.h> +#include"fdelmodc3D.h" + +/* Copyright (c) Colorado School of Mines, 2011.*/ +/* All rights reserved. */ + +/* allocate a 3-d array of floats */ +float ***alloc3float(modPar mod) +{ + size_t i3,i2,n1,n2,n3,size; + float ***p; + + n1 = mod.naz; + n2 = mod.nax; + n3 = mod.nay; + size = sizeof(float); + +/* allocate pointer arrays of n3 and n2 */ + if ((p=(float***)malloc(n3*sizeof(float**)))==NULL) + return NULL; + if ((p[0]=(float**)malloc(n3*n2*sizeof(float*)))==NULL) { + free(p); + return NULL; + } + +/* allocate data size and assign pointers to n1, n2 and n3 */ + if (mod.nfx==1 && mod.nfy==1 ) { // 1D model + fprintf(stderr,"Allocating 1D model \n"); + if ((p[0][0]=(float*)malloc(n1*size))==NULL) { + free(p); + return NULL; + } + for (i3=0; i3<n3; i3++) { + p[i3] = p[0]; + for (i2=0; i2<n2; i2++) + p[i3][i2] = (float*)p[0][0]; + } + } + else if (mod.nfy==1) { // 2D model + fprintf(stderr,"Allocating 2D model \n"); + if ((p[0][0]=(float*)malloc(n2*n1*size))==NULL) { + free(p); + return NULL; + } + for (i3=0; i3<n3; i3++) { + p[i3] = p[0]; + for (i2=0; i2<n2; i2++) + p[i3][i2] = (float*)p[0]+n1*i2; + } + } + else { // 3D model + fprintf(stderr,"Allocating 3D model \n"); + if ((p[0][0]=(float*)malloc(n3*n2*n1*size))==NULL) { + free(p[0]); + free(p); + return NULL; + } + for (i3=0; i3<n3; i3++) { + p[i3] = p[0]+n2*i3; + for (i2=0; i2<n2; i2++) + p[i3][i2] = (float*)p[0][0]+n1*(i2+n2*i3); + } + } + return p; +} + +void free3float(float ***p) +{ + free(p[0][0]); + free(p[0]); + free(p); +} +