Databox *CompFlux( Databox *k, Databox *h) { Databox *flux; int nx, ny, nz; double x, y, z; double dx, dy, dz; double *fluxp, *kp, *hp; double qxp, qxm, qyp, qym, qzp, qzm; int cell, cell_xm1, cell_xp1, cell_ym1, cell_yp1, cell_zm1, cell_zp1; int ii, jj, kk; nx = DataboxNx(k); ny = DataboxNy(k); nz = DataboxNz(k); x = DataboxX(k); y = DataboxY(k); z = DataboxZ(k); dx = DataboxDx(k); dy = DataboxDy(k); dz = DataboxDz(k); #if 0 /* ADD LATER */ if ((dx != DataboxDx(h)) || (dy != DataboxDy(h)) || (dz != DataboxDz(h))) { Error("Spacings are not compatible\n"); return NULL; } #endif if ((flux = NewDatabox(nx, ny, nz, x, y, z, dx, dy, dz)) == NULL) return((Databox*)NULL); kp = DataboxCoeffs(k); hp = DataboxCoeffs(h); fluxp = DataboxCoeffs(flux); cell = 0; cell_xm1 = cell - 1; cell_xp1 = cell + 1; cell_ym1 = cell - nx; cell_yp1 = cell + nx; cell_zm1 = cell - nx * ny; cell_zp1 = cell + nx * ny; kp += nx * ny; hp += nx * ny; fluxp += nx * ny; for (kk = 1; kk < (nz - 1); kk++) { kp += nx; hp += nx; fluxp += nx; for (jj = 1; jj < (ny - 1); jj++) { kp++; hp++; fluxp++; for (ii = 1; ii < (nx - 1); ii++) { qxp = -Mean(kp[cell_xp1], kp[cell]) * (hp[cell_xp1] - hp[cell]) / dx; qxm = -Mean(kp[cell], kp[cell_xm1]) * (hp[cell] - hp[cell_xm1]) / dx; qyp = -Mean(kp[cell_yp1], kp[cell]) * (hp[cell_yp1] - hp[cell]) / dy; qym = -Mean(kp[cell], kp[cell_ym1]) * (hp[cell] - hp[cell_ym1]) / dy; qzp = -Mean(kp[cell_zp1], kp[cell]) * (hp[cell_zp1] - hp[cell]) / dz; qzm = -Mean(kp[cell], kp[cell_zm1]) * (hp[cell] - hp[cell_zm1]) / dz; fluxp[cell] = (qxp - qxm) * dy * dz + (qyp - qym) * dx * dz + (qzp - qzm) * dx * dy; kp++; hp++; fluxp++; } kp++; hp++; fluxp++; } kp += nx; hp += nx; fluxp += nx; } return flux; }
Databox *ReadSDS(char *filename, int ds_num, double default_value) { Databox *v; int32 dim[MAX_VAR_DIMS]; int32 edges[3]; int32 start[3]; int i; int z; int32 type; char name[MAX_NC_NAME]; int32 sd_id; int32 sds_id; int32 rank, nt, nattrs; int nx, ny, nz; int m; double *double_ptr; sd_id = SDstart(filename, DFACC_RDONLY); sds_id = SDselect(sd_id, ds_num); SDgetinfo(sds_id, name, &rank, dim, &type, &nattrs); start[0] = start[1] = start[2] = 0; /* create the new databox structure */ if((v = NewDatabox(dim[2], dim[1], dim[0], 0, 0, 0, 0, 0, 0, default_value)) == NULL) return((Databox *)NULL); double_ptr = DataboxCoeffs(v); edges[0] = 1; edges[1] = DataboxNy(v); edges[2] = DataboxNx(v); switch (type) { case DFNT_FLOAT32 : { float32 *convert_ptr, *data; if( (data = convert_ptr = (float32 *)malloc(dim[1]*dim[2] * sizeof(float32))) == NULL) { exit(1); } for(z=0; z < dim[0]; z++) { start[0] = z; SDreaddata(sds_id, start, NULL, edges, data); convert_ptr = data; for(i=dim[1]*dim[2]; i--;) *double_ptr++ = *convert_ptr++; } free(data); break; }; case DFNT_FLOAT64 : { float64 *convert_ptr, *data; if( (data = convert_ptr = (float64 *)malloc(dim[1]*dim[2] * sizeof(float64))) == NULL) { exit(1); } for(z=0; z < dim[0]; z++) { start[0] = z; SDreaddata(sds_id, start, NULL, edges, data); convert_ptr = data; for(i=dim[1]*dim[2]; i--;) *double_ptr++ = *convert_ptr++; } free(data); break; }; case DFNT_INT8 : { int8 *convert_ptr, *data; if( (data = convert_ptr = (int8 *)malloc(dim[1]*dim[2] * sizeof(int8))) == NULL) { exit(1); } for(z=0; z < dim[0]; z++) { start[0] = z; SDreaddata(sds_id, start, NULL, edges, data); convert_ptr = data; for(i=dim[1]*dim[2]; i--;) *double_ptr++ = *convert_ptr++; } free(data); break; }; case DFNT_UINT8 : { uint8 *convert_ptr, *data; if( (data = convert_ptr = (uint8 *)malloc(dim[1]*dim[2] * sizeof(uint8))) == NULL) { exit(1); } for(z=0; z < dim[0]; z++) { start[0] = z; SDreaddata(sds_id, start, NULL, edges, data); convert_ptr = data; for(i=dim[1]*dim[2]; i--;) *double_ptr++ = *convert_ptr++; } free(data); break; }; case DFNT_INT16 : { int16 *convert_ptr, *data; if( (data = convert_ptr = (int16 *)malloc(dim[1]*dim[2] * sizeof(int16))) == NULL) { exit(1); } for(z=0; z < dim[0]; z++) { start[0] = z; SDreaddata(sds_id, start, NULL, edges, data); convert_ptr = data; for(i=dim[1]*dim[2]; i--;) *double_ptr++ = *convert_ptr++; } free(data); break; }; case DFNT_UINT16 : { uint16 *convert_ptr, *data; if( (data = convert_ptr = (uint16 *)malloc(dim[1]*dim[2] * sizeof(uint16))) == NULL) { exit(1); } for(z=0; z < dim[0]; z++) { start[0] = z; SDreaddata(sds_id, start, NULL, edges, data); convert_ptr = data; for(i=dim[1]*dim[2]; i--;) *double_ptr++ = *convert_ptr++; } free(data); break; }; case DFNT_INT32 : { int32 *convert_ptr, *data; if( (data = convert_ptr = (int32 *)malloc(dim[1]*dim[2] * sizeof(int32))) == NULL) { exit(1); } for(z=0; z < dim[0]; z++) { start[0] = z; SDreaddata(sds_id, start, NULL, edges, data); convert_ptr = data; for(i=dim[1]*dim[2]; i--;) *double_ptr++ = *convert_ptr++; } free(data); break; }; case DFNT_UINT32 : { uint32 *convert_ptr, *data; if( (data = convert_ptr = (uint32 *)malloc(dim[1]*dim[2] * sizeof(uint32))) == NULL) { exit(1); } for(z=0; z < dim[0]; z++) { start[0] = z; SDreaddata(sds_id, start, NULL, edges, data); convert_ptr = data; for(i=dim[1]*dim[2]; i--;) *double_ptr++ = *convert_ptr++; } free(data); break; }; } SDendaccess(sds_id); SDend(sd_id); return v; }