Introduce more argument checks.

This commit is contained in:
Jostein R. Natvig 2009-06-18 16:10:37 +00:00
parent e704b2bce9
commit 40addf9f02
2 changed files with 39 additions and 15 deletions

View File

@ -11,28 +11,34 @@
/* Get COORD, ZCORN, ACTNUM and DIMS from mxArray. */ /* Get COORD, ZCORN, ACTNUM and DIMS from mxArray. */
/*-------------------------------------------------------*/ /*-------------------------------------------------------*/
void mxInitGrdecl(struct grdecl *g, const mxArray *prhs[]) void mx_init_grdecl(struct grdecl *g, const mxArray *s)
{ {
int i,j,k,n; int i,j,k,n;
if (mxGetClassID(mxGetField(prhs[0], 0, "ACTNUM")) != mxINT32_CLASS){ mxArray *field;
mexErrMsgTxt("ACTNUM field of grid declaration must be int32"); int numel;
field = mxGetField(s, 0, "cartDims");
numel = mxGetNumberOfElements(field);
double *tmp = mxGetPr(field);
if (numel != 3){
mexErrMsgTxt("cartDims field must be 3 numbers");
} }
g->coord = mxGetPr(mxGetField(prhs[0], 0, "COORD"));
double *tmp = mxGetPr(mxGetField(prhs[0], 0, "cartDims"));
n = 1; n = 1;
for (i=0; i<3; ++i){ for (i=0; i<3; ++i){
g->dims[i] = tmp[i]; g->dims[i] = tmp[i];
n *= tmp[i]; n *= tmp[i];
} }
/* mexPrintf("dimensions: %d %d %d\n", */
/* g->dims[0], */
/* g->dims[1], */
/* g->dims[2]); */
field = mxGetField(s, 0, "ACTNUM");
numel = mxGetNumberOfElements(field);
if (mxGetClassID(field) != mxINT32_CLASS ||
numel != g->dims[0]*g->dims[1]*g->dims[2] ){
mexErrMsgTxt("ACTNUM field must be nx*ny*nz numbers int32");
}
/* grdecl.actnum = permute(actnum, [3,1,2]); */ /* grdecl.actnum = permute(actnum, [3,1,2]); */
int *actnum = mxGetData(mxGetField(prhs[0], 0, "ACTNUM")); int *actnum = mxGetData(field);
int *a = malloc(n* sizeof(*g->actnum)); int *a = malloc(n* sizeof(*g->actnum));
int *iptr = a; int *iptr = a;
@ -44,9 +50,26 @@ void mxInitGrdecl(struct grdecl *g, const mxArray *prhs[])
} }
} }
g->actnum = a; g->actnum = a;
field = mxGetField(s, 0, "COORD");
numel = mxGetNumberOfElements(field);
if (mxGetClassID(field) != mxDOUBLE_CLASS ||
numel != 6*(g->dims[0]+1)*(g->dims[1]+1)){
mexErrMsgTxt("COORD field must have 6*(nx+1)*(ny+1) doubles.");
}
g->coord = mxGetPr(field);
field = mxGetField(s, 0, "ZCORN");
numel = mxGetNumberOfElements(field);
if (mxGetClassID(field) != mxDOUBLE_CLASS ||
numel != 8*g->dims[0]*g->dims[1]*g->dims[2]){
mexErrMsgTxt("ZCORN field must have 8*nx*ny*nz doubles.");
}
double *zcorn = mxGetPr(field);
/* grdecl.zcorn = permute(zcorn, [3,1,2]); */ /* grdecl.zcorn = permute(zcorn, [3,1,2]); */
double *zcorn = mxGetPr(mxGetField(prhs[0], 0, "ZCORN"));
double *z = malloc(n*8*sizeof(*g->zcorn)); double *z = malloc(n*8*sizeof(*g->zcorn));
double *dptr = z; double *dptr = z;
for (j=0; j<2*g->dims[1]; ++j){ for (j=0; j<2*g->dims[1]; ++j){
@ -63,7 +86,7 @@ void mxInitGrdecl(struct grdecl *g, const mxArray *prhs[])
/* Free stuff that was allocated in initgrdecl. */ /* Free stuff that was allocated in initgrdecl. */
/*-------------------------------------------------------*/ /*-------------------------------------------------------*/
void freeGrdecl(struct grdecl *g) void free_grdecl(struct grdecl *g)
{ {
free((double*)g->zcorn); g->zcorn = NULL; free((double*)g->zcorn); g->zcorn = NULL;
free((double*)g->actnum); g->actnum = NULL; free((double*)g->actnum); g->actnum = NULL;

View File

@ -1,7 +1,8 @@
#ifndef MXGRDECL_H #ifndef MXGRDECL_H
#define MXGRDECL_H #define MXGRDECL_H
void mxInitGrdecl (struct grdecl *g, const mxArray *prhs[]);
void freeGrdecl (struct grdecl *g); void mx_init_grdecl (struct grdecl *g, const mxArray *s);
void free_grdecl (struct grdecl *g);
#endif #endif