#include "grid.h" #include "except.hh" void init_default_axis(axis * a) { a->n=0; a->d=1.0; a->o=0.0; a->id=-1; } void init_axis(axis * a, size_t n, ireal d, ireal o) { a->n=n; a->d=d; a->o=o; a->id=-1; } void copy_axis(axis * tgt, const axis * src) { tgt->n = src->n; tgt->d = src->d; tgt->o = src->o; tgt->id = src->id; } void fprint_axis(FILE * fp, axis a) { fprintf(fp,"axis: n=%ld d=%e o=%e id=%d\n",(long) a.n,a.d,a.o,a.id); } void fprint_num_axis(FILE * fp, int i, axis a) { fprintf(fp,"axis: n%d=%ld d%d=%e o%d=%e id%d=%d\n",i+1,(long)a.n,i+1,a.d,i+1,a.o,i+1,a.id); } void print_axis(axis a) { fprint_axis(stdout,a); } #define MIN(a,b) ((a) < (b) ? (a) : (b)) int compare_axis(axis a1, axis a2) { int err=0; err = err || (a1.n != a2.n); err = err || (fabs((double)(a1.d-a2.d)) > TOL*MIN((double)(a1.d),(double)(a2.d))); err = err || (fabs((double)(a1.o-a2.o)) > TOL*MIN((double)(a1.d),(double)(a2.d))); err = err || (a1.id != a2.id); return err; } void init_default_grid(grid * g) { int i; g->dim=0; g->gdim=0; for (i=0;iaxes[i])); // g->axes[i].id=i; } } int init_grid(grid * g, int dim, int gdim) { int i; if (dim<1 || dim>gdim || gdim>IARR_MAX_NDIM) return E_BADINPUT; g->dim=dim; g->gdim=gdim; for (i=0;iaxes[i])); // g->axes[i].id=i; } return 0; } void copy_grid(grid * tgt, const grid * src) { int i; tgt->dim = src->dim; tgt->gdim = src->gdim; for (i=0;iaxes[i]),&(src->axes[i])); } void fprint_grid(FILE * fp, grid a) { int i; fprintf(fp,"Grid data structure:\n"); fprintf(fp,"gdim = %d axes\n",a.gdim); fprintf(fp,"dim = %d physical axes\n",a.dim); for (i=0;i TOL*g1.axes[i].d) return 3; rtest = g1.axes[i].o-g2.axes[i].o; itest = (int) (rtest/g1.axes[i].d); if ((iwave_abs((itest-1)*g1.axes[i].d-rtest) > TOL*g1.axes[i].d) && (iwave_abs((itest+0)*g1.axes[i].d-rtest) > TOL*g1.axes[i].d) && (iwave_abs((itest+1)*g1.axes[i].d-rtest) > TOL*g1.axes[i].d)) return 4; } return 0; } // dimension includes internal extended axes if any - i.e. not same // as spatial dimension, necessarily int get_dimension_grid(grid g) { _IPNT _id; get_id(_id,g); int _dim=0; for (int i=0;i g.gdim) { RVL::RVLException e; e<<"ERROR: grid::get_dimension_grid\n"; e<<" nonsense dim calc: obtained = "<<_dim<<"\n"; e<<" grid params:\n"; e<<" dim="< g.dim-1) && (_id[i] < EXTINT)) { sz*=_n[i]; id_check++; } } return sz; } void get_n(_IPNT n, grid g) { int i; IASN(n,IPNT_1); for (i=0;igdim; i++) { if (g->axes[i].id == ax->id) { // check for commensurable if (fabs(g->axes[i].d-ax->d) > TOL*g->axes[i].d) { fprintf(stderr,"d incompat: g = \n"); fprint_grid(stderr,*g); fprintf(stderr,"ax = \n"); fprint_axis(stderr,*ax); return false; } float dxo = g->axes[i].o - ax->o; float dx = g->axes[i].d; if (dxo - dx*((int)((dxo/dx)+2.0f*TOL)) > TOL) { fprintf(stderr,"Error: grid_union\n"); fprintf(stderr,"o incompat: g = \n"); fprint_grid(stderr,*g); fprintf(stderr,"ax = \n"); fprint_axis(stderr,*ax); return false; } // else, reset min, max, n float xmin = iwave_min(g->axes[i].o, ax->o); float xmax = iwave_max(g->axes[i].o+(g->axes[i].n-1)*dx, (ax->o+(ax->n-1)*dx)); g->axes[i].o = xmin; g->axes[i].n = 1+(int)((xmax-xmin+TOL)/dx); return true; } } // insert new axis in id order g->gdim++; // fprintf(stderr,"grid_union -> inserting new axis %d\n",g->gdim); if (g->gdim > RARR_MAX_NDIM) { fprintf(stderr,"Error: grid_union\n"); fprintf(stderr," attempt to exceed max # of axes = %d\n",RARR_MAX_NDIM); return false; } int idx = 0; while (g->axes[idx].id < ax->id && g->axes[idx].id > -1) idx++; // if at uninit id, just copy if (g->axes[idx].id < 0) { // fprintf(stderr,"grid_union: copy new axis onto axis %d\n",idx); copy_axis(&(g->axes[idx]),ax); // fprintf(stderr,"grid_union: resulting grid\n"); // fprint_grid(stderr,*g); } else { // else shift all subsequent axes out of way // fprintf(stderr,"grid_union: gdim=%d new ax id =%d idx=%d\n",g->gdim,ax->id,idx); for (int i=g->gdim-1; i>idx; i--) { // fprintf(stderr,"grid_union: copy axis %d onto axis %d\n",i-1,i); copy_axis(&(g->axes[i]),&(g->axes[i-1])); } // fprintf(stderr,"grid_union: copy new axis onto axis %d\n",idx); copy_axis(&(g->axes[idx]),ax); // fprintf(stderr,"grid_union: resulting grid\n"); // fprint_grid(stderr,*g); } return true; } bool init_step(grid g, IPNT step, bool fwd) { // sanity check dim, gdim if (!(g.dim IARR_MAX_NDIM) { return false; } // the global origin is ex def a member of every grid /* for (int i=g.dim; i< g.gdim; i++) { step[i] = (int)((g.axes[i].o+TOL)/g.axes[i].d); } */ get_gs(step, g); // time axis - index=dim: last data point if fwd = false (reverse) if (!fwd) { step[g.dim]+= g.axes[g.dim].n-1; } return true; } bool next_step(grid g, IPNT step) { bool more = true; IPNT istart; IPNT istop; get_gs(istart,g); get_ge(istop,g); for (int i=g.dim+1; i