void push_point(DATA *d, const DPOINT *p) { int i; /* * add one point p to the data structure d * [counts on the fact that erealloc(NULL,size) calls malloc(size)] */ if (d->prob < 1.0) { ErrMsg(ER_IMPOSVAL, "sample in R, not in gstat"); } else if (d->every > 1) { /* EJP: WAS if ((d->n_list + d->offset) % d->every != 0) */ if ((d->n_list + d->skip + 1 - d->offset) % d->every != 0) { d->skip++; return; } } if (d->n_list < 0) { message("push_point: n_list < 0: %d (%s)\n", d->n_list, d->fname); ErrMsg(ER_NULL, "push_point(): n_list < 0"); } if (d->n_max < 0) { message("push_point: n_max < 0: %d (%s)\n", d->n_max, d->fname); ErrMsg(ER_NULL, "push_point(): n_max < 0"); } /* * use rather large blocks of memory for points: */ if (d->n_list == d->n_max) { /* increase memory: */ /* resize d->n_max: */ if (d->list == NULL) { if (d->init_max > 0) d->n_max = d->init_max; else d->n_max = MAX_DATA; } else { d->n_max += MAX_DATA; /* or else: d->n_max *= 2; */ if (d->init_max > 0 && DEBUG_DUMP) pr_warning("exceeding nmax, now %d", d->n_max); } /* resize blocked memory bases P_base and X_base, and list: */ d->P_base = (DPOINT *) erealloc(d->P_base, d->n_max * sizeof(DPOINT)); if (d->n_X > 0) { if (intercept_only(d)) { /* create a single instance of the X row: */ if (d->X_base == NULL) { /* first time */ d->X_base = (double *) emalloc(sizeof(double)); d->X_base[0] = 1.0; } } else /* each point needs it's own X row: */ d->X_base = (double *) erealloc(d->X_base, d->n_max * d->n_X * sizeof(double)); } d->list = (DPOINT **) erealloc(d->list, d->n_max * sizeof(DPOINT *)); /* * realloc'ing may have moved P_base or X_base, so reset all pointers: */ for (i = 0; i < d->n_list; i++) { d->list[i] = &(d->P_base[i]); if (d->n_X) { if (intercept_only(d)) /* d->P_base[i].X = d->X_base; */ d->list[i]->X = d->X_base; else /* d->P_base[i].X = &(d->X_base[d->n_X * i]); */ d->list[i]->X = &(d->X_base[d->n_X * i]); } else /* d->P_base[i].X = NULL; */ d->list[i]->X = NULL; } for (i = d->n_list; i < d->n_max; i++) d->list[i] = NULL; /* for savety */ /* rebuild qtree_root: this is avoided by setting nmax */ qtree_rebuild(d); datagrid_rebuild(d, 0); } /* * copy information on current point into P_base and X_base arrays: */ #ifdef SLOW d->P_base[d->n_list] = *p; #else memcpy(&(d->P_base[d->n_list]), p, sizeof(DPOINT)); #endif if (d->n_X > 0 && !intercept_only(d)) { #define SLOW 1 #ifdef SLOW /* slow... copy X row */ for (i = 0; i < d->n_X; i++) d->X_base[d->n_X * d->n_list + i] = p->X[i]; #else memcpy(&(d->X_base[d->n_X * d->n_list]), p->X, d->n_X * sizeof(double)); #endif } /* * adjust list and X pointer to this copy: */ d->list[d->n_list] = &(d->P_base[d->n_list]); if (intercept_only(d)) d->list[d->n_list]->X = d->X_base; else d->list[d->n_list]->X = &(d->X_base[d->n_X * d->n_list]); SET_INDEX(d->list[d->n_list], d->n_list); qtree_push_point(d, d->list[d->n_list]); grid_push_point(d, d->list[d->n_list], 0); /* * this will be ignored during read_gstat_data(), the tree structure will * be filled only during the first call to qtree_quick_select(). * Later on, it does have effect if simulated points are pushed. */ d->n_list++; return; }
static void init_predictions(PRED_AT w) { int i; DPOINT *bp; DATA **d = NULL; #ifdef WITH_SPIRAL DATA_GRIDMAP *grid; #endif est = (double *) emalloc(get_n_outfile() * sizeof(double)); bp = get_block_p(); d = get_gstat_data(); switch (w) { case AT_POINTS: if (o_filename == NULL) ErrMsg(ER_VARNOTSET, "please specify output file"); write_points(o_filename, val_data, NULL, NULL, get_n_outfile()); if (bp->x == -1.0) { /* set default */ bp->x = bp->y = 1.0; pr_warning("default block size set to: dx=1, dy=1"); } break; case AT_GRIDMAP: /* open mask files: */ get_maskX(NULL, NULL, 0, 0); /* re-initializes static arrays */ masks = (GRIDMAP **) emalloc(get_n_masks() * sizeof(GRIDMAP *)); for (i = 0; i < get_n_masks(); i++) masks[i] = check_open(get_mask_name(i), i); /* read as float */ if (n_pred_locs > 0) strata_min = floor(masks[0]->cellmin); outmap = (GRIDMAP **) emalloc(get_n_outfile() * sizeof(GRIDMAP *)); printlog("initializing maps "); for (i = 0; i < get_n_outfile(); i++) { if (get_outfile_namei(i) != NULL) { printlog("."); /* creating maps ..... */ if (get_method() == ISI) masks[0]->celltype = CT_UINT8; outmap[i] = map_dup(get_outfile_namei(i), masks[0]); } else outmap[i] = NULL; } printlog("\n"); if (bp->x == -1.0) { /* set default to map cellsize */ bp->x = masks[0]->cellsizex; bp->y = masks[0]->cellsizey; pr_warning("default block size set to dx=%g, dy=%g", bp->x, bp->y); } for (i = 0; i < get_n_vars(); i++) { if (d[i]->dummy) { d[i]->minX = masks[0]->x_ul + 0.5 * masks[0]->cellsizex; d[i]->maxX = masks[0]->x_ul + masks[0]->cellsizex * (masks[0]->cols - 0.5); d[i]->maxY = masks[0]->y_ul - 0.5 * masks[0]->cellsizey; d[i]->minY = masks[0]->y_ul - masks[0]->cellsizey * (masks[0]->rows - 0.5); d[i]->minZ = d[i]->maxZ = 0.0; } if (d[i]->togrid) datagrid_rebuild(d[i], 1); } break; } if (gl_nsim > 1) init_simulations(d); if (is_simulation(get_method()) && get_n_beta_set() != get_n_vars()) setup_beta(d, get_n_vars(), gl_nsim); } /* init_predictions() */