diff --git a/mxgrdecl.c b/mxgrdecl.c
index fdb633e9..6782f970 100644
--- a/mxgrdecl.c
+++ b/mxgrdecl.c
@@ -32,37 +32,33 @@
along with OpenRS. If not, see .
*/
-#include
-#include
-#include
#include
+#include
+#include
+#include
+#include
+
#include
-
#include "grdecl.h"
-
-
-void mx_init_grdecl(struct grdecl *g, const mxArray *s);
+#include "mxgrdecl.h"
/* Get COORD, ZCORN, ACTNUM and DIMS from mxArray. */
/*-------------------------------------------------------*/
void mx_init_grdecl(struct grdecl *g, const mxArray *s)
{
int i,n;
- mxArray *field;
- int numel;
- double *tmp;
+ size_t numel;
mxArray *cartdims=NULL, *actnum=NULL, *coord=NULL, *zcorn=NULL;
if (!mxIsStruct(s)
|| !(cartdims = mxGetField(s, 0, "cartDims"))
- || !(actnum = mxGetField(s, 0, "ACTNUM"))
|| !(coord = mxGetField(s, 0, "COORD"))
- || !(zcorn = mxGetField(s, 0, "ZCORN"))
+ || !(zcorn = mxGetField(s, 0, "ZCORN"))
)
{
- char str[]="Input must be a single Matlab struct with fields\n"
- "cartDims, ACTNUM, COORD and ZCORN\n";
+ char str[]="Input must be a single MATLAB struct with fields\n"
+ "'cartDims', 'COORD' and 'ZCORN'. ACTNUM may be included.\n";
mexErrMsgTxt(str);
}
@@ -72,35 +68,44 @@ void mx_init_grdecl(struct grdecl *g, const mxArray *s)
mexErrMsgTxt("cartDims field must be 3 numbers");
}
- tmp = mxGetPr(cartdims);
- n = 1;
- for (i=0; i<3; ++i){
- g->dims[i] = tmp[i];
- n *= tmp[i];
+ if (mxIsDouble(cartdims)) {
+ double *tmp = mxGetPr(cartdims);
+ for (i = 0; i < 3; ++i) {
+ g->dims[i] = (int) tmp[i];
+ }
+ }
+ else if (mxIsInt32(cartdims)) {
+ int *tmp = mxGetData(cartdims);
+ memcpy(g->dims, tmp, 3 * sizeof *g->dims);
+ }
+
+ n = g->dims[0];
+ for (i = 1; i < 3; i++) { n *= g->dims[ i ]; }
+
+
+ if ((actnum = mxGetField(s, 0, "ACTNUM")) != NULL) {
+ numel = mxGetNumberOfElements(actnum);
+ if ((! mxIsInt32(actnum)) || (numel != (size_t)(n))) {
+ mexErrMsgTxt("ACTNUM field must be nx*ny*nz numbers int32");
+ }
+ g->actnum = mxGetData(actnum);
+ }
+ else {
+ g->actnum = NULL;
}
- numel = mxGetNumberOfElements(actnum);
- if (mxGetClassID(actnum) != mxINT32_CLASS ||
- numel != g->dims[0]*g->dims[1]*g->dims[2] ){
- mexErrMsgTxt("ACTNUM field must be nx*ny*nz numbers int32");
- }
- g->actnum = mxGetData(actnum);
-
-
-
- field = mxGetField(s, 0, "COORD");
numel = mxGetNumberOfElements(coord);
- if (mxGetClassID(coord) != mxDOUBLE_CLASS ||
- numel != 6*(g->dims[0]+1)*(g->dims[1]+1)){
+ if ((! mxIsDouble(coord)) ||
+ numel != (size_t)(6*(g->dims[0]+1)*(g->dims[1]+1))) {
mexErrMsgTxt("COORD field must have 6*(nx+1)*(ny+1) doubles.");
}
g->coord = mxGetPr(coord);
numel = mxGetNumberOfElements(zcorn);
- if (mxGetClassID(zcorn) != mxDOUBLE_CLASS ||
- numel != 8*g->dims[0]*g->dims[1]*g->dims[2]){
+ if ((! mxIsDouble(zcorn)) ||
+ numel != (size_t)(8*g->dims[0]*g->dims[1]*g->dims[2])) {
mexErrMsgTxt("ZCORN field must have 8*nx*ny*nz doubles.");
}
g->zcorn = mxGetPr(zcorn);
diff --git a/preprocess.c b/preprocess.c
index 734f7fb3..14641ed6 100644
--- a/preprocess.c
+++ b/preprocess.c
@@ -451,20 +451,30 @@ copy_and_permute_actnum(int nx, int ny, int nz, const int *in, int *out)
{
int i,j,k;
int *ptr = out;
+
/* Permute actnum such that values of each vertical stack of cells
* are adjacent in memory, i.e.,
-
- out = [in(0,0,:), in(1,0,:),..., in(nx-1, ny-1,:)]
-
- in Matlab pseudo-code.
- */
- for (j=0; j= 0);
ok = ok && (mxGetFieldNumber(prhs[0], "COORD" ) >= 0);
ok = ok && (mxGetFieldNumber(prhs[0], "ZCORN" ) >= 0);
+#if 0
ok = ok && (mxGetFieldNumber(prhs[0], "ACTNUM" ) >= 0);
+#endif
if (ok && (nrhs == 2)) {
ok = mxIsDouble(prhs[1]) && (mxGetNumberOfElements(prhs[1]) == 1);
@@ -454,7 +456,7 @@ mexFunction(int nlhs, mxArray *plhs[],
"G = %s(grdecl)\t%%or\n\t"
"G = %s(grdecl, tolerance)\n"
"The 'grdecl' must be a valid structure with fields\n"
- "\t'cartDims', 'COORD', 'ZCORN', and 'ACTNUM'",
+ "\t'cartDims', 'COORD', 'ZCORN'",
mexFunctionName(), mexFunctionName());
mexErrMsgTxt(errmsg);
}