123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319 |
- DESCRIPTION OF INTERPOLATION LIBRARY
- written by Irina Kosinovsky 1993
- updated by Mitasova Nov. 96
- NEEDS UPDATE FOR spatially variable smoothing and other changes
- done by Helena in 1997
- Note by Irina in 1993: Below is the collection of functions
- needed for interpolation programs. It should be
- divided into several libraries to provide better
- functionality.
- DATA STRUCTURES:
- ----------------
- struct interp_params
- {
- double zmult; /* multiplier for z-values */
- FILE *fdinp; /* input stream */
- int kmin; /* min number of points per segment for interpolation */
- int kmax; /* max number of points per segment */
- char *maskmap; /* name of mask */
- int nsizr,nsizc; /* number of rows and columns */
- double *az,*adx,*ady,*adxx,*adyy,*adxy; /* array for interpolated values */
- double fi; /* tension */
- int KMAX2; /* max num. of points for interp.*/
- int scik1,scik2,scik3; /* multipliers for interp. values*/
- double rsm; /* smoothing, for rsm<0 use variable smooth from sites */
- char *elev,*slope,*aspect,*pcurv,*tcurv,*mcurv; /* output files */
- double dmin; /* min distance between points */
- double x_orig, y_orig; /* origin */
- int deriv; /* 1 if compute partial derivs */
- FILE *Tmp_fd_z,*Tmp_fd_dx,*Tmp_fd_dy, /* temp files for writing interp.*/
- *Tmp_fd_xx,*Tmp_fd_yy,*Tmp_fd_xy; /* values */
- FILE *fddevi; /* pointer to deviations file */
- int (*grid_calc) (); /*calculates grid for given segm*/
- int (*matrix_create) (); /*creates matrix for a given segm*/
- int (*check_points) (); /*checks interp. func. at points */
- int (*secpar) (); /* calculates aspect,slope,curv. */
- double (*interp) (); /* radial basis function */
- int (*interpder) (); /* derivatives of radial basis function */
- int (*wr_temp) (); /* writes temp files */
- int c, /* cross validation */
- char *wheresql /* SQL WHERE */
- };
- FUNCTIONS:
- ----------
- void
- IL_init_params_2d(params,inp,zm,k1,k2,msk,rows,cols,ar1,ar2,ar3,ar4,ar5,ar6,
- tension,k3,sc1,sc2,sc3,sm,f1,f2,f3,f4,f5,f6,dm,x_or,y_or,
- der,t1,t2,t3,t4,t5,t6,dev)
- struct interp_params *params;
- FILE *inp; /* input stream */
- double zm; /* multiplier for z-values */
- int k1; /* min number of points per segment for interpolation */
- int k2; /* max number of points per segment */
- char *msk; /* name of mask */
- int rows,cols; /* number of rows and columns */
- double *ar1,*ar2,*ar3,*ar4,*ar5,*ar6; /* arrays for interpolated values */
- double tension; /* tension */
- int k3; /* max num. of points for interp.*/
- int sc1,sc2,sc3; /* multipliers for interp. values*/
- double sm; /* smoothing, if sm<0 take it from sites file input */
- char *f1,*f2,*f3,*f4,*f5,*f6; /*output files */
- double dm; /* min distance between points */
- double x_or, y_or; /* origin */
- int der; /* 1 if compute partial derivs */
- FILE *t1,*t2,*t3,*t4,*t5,*t6; /* temp files for writing interp. values */
- FILE *dev; /* pointer to deviations file */
- Initializes parameters called by the library
- void
- IL_init_func_2d(params,grid_f,matr_f,point_f,secp_f,interp_f,
- interpder_f,temp_f)
- struct interp_params *params;
- int (*grid_f) (); /*calculates grid for given segm*/
- int (*matr_f) (); /*creates matrix for a given segm*/
- int (*point_f) (); /*checks interp. func. at points */
- int (*secp_f) (); /* calculates aspect,slope,curv. */
- double (*interp_f) (); /* radial basis function*/
- int (*interpder_f) (); /* derivatives of radial basis fucntion */
- int (*temp_f) (); /* writes temp files */
- Initializes functions called by the library
- double
- IL_crst (r,fi)
- double r; /* distance squared*/
- double fi; /* tension */
- Radial basis function - regularized spline with tension (d=2)
- int
- IL_crstg (r, fi, gd1, gd2)
- double r; /* distance squared*/
- double fi; /* tension */
- double *gd1;
- double *gd2;
- Derivatives of radial basis function - regularized spline with tension(d=2)
- int
- IL_input_data_2d(params,info,xmin,xmax,ymin,ymax,zmin,zmax,MAXPOINTS,n_points)
- struct interp_params *params;
- struct tree_info *info; /* quadtree info */
- double *xmin,*xmax,*ymin,*ymax,*zmin,*zmax;
- int maxpoints; /* max number of points per segment for interpolation */
- int *n_points; /* number of points used for interpolation */
- Inserts input data inside the region into a quad tree.
- Also translates data.
- Returns number of segments in the quad tree.
- int IL_vector_input_data_2d(params,Map,dmax,cats,iselev,info,xmin,
- xmax,ymin,ymax,zmin,zmax,n_points)
- struct interp_params *params;
- struct Map_info *Map; /* input vector file */
- double dmax; /* max distance between points */
- struct Categories *cats; /* Cats file */
- int iselev; /* do zeroes represent elevation? */
- struct tree_info *info; /* quadtree info */
- double *xmin,*xmax,*ymin,*ymax,*zmin,*zmax;
- int *n_points; /* number of points used for interpolation */
- Inserts input data inside the region into a quad tree.
- Also translates data.
- Returns number of segments in the quad tree.
- struct BM *
- IL_create_bitmask(params)
- struct interp_params *params;
- Creates a bitmap mask from maskmap raster file and/or current MASK if
- present and returns a pointer to the bitmask. If no mask is in force returns
- NULL.
- int
- IL_grid_calc_2d(params,data,bitmask,zmin,zmax,zminac,zmaxac,gmin,gmax,
- c1min,c1max,c2min,c2max,ertot,b,offset1)
- struct interp_params *params;
- struct quaddata *data; /* given segment */
- struct BM *bitmask; /* bitmask */
- double zmin,zmax; /* min and max input z-values */
- double *zminac,*zmaxac, /* min and max interp. z-values */
- *gmin,*gmax, /* min and max inperp. slope val.*/
- *c1min,*c1max,*c2min,*c2max; /* min and max interp. curv. val.*/
- double *ertot; /* rms deviation of the interpolated surface */
- double *b; /* solutions of linear equations */
- int offset1; /* offset for temp file writing */
- Calculates grid for the given segment represented by data (contains n_rows,
- n_cols, ew_res,ns_res, and all points inside + overlap) using solutions of
- system of lin. equations and interpolating functions interp() and interpder().
- Also calls secpar() to compute slope, aspect and curvatures if required.
- int
- IL_matrix_create(params,points,n_points,matrix,indx)
- struct interp_params *params;
- struct triple *points; /* points for interpolation */
- int n_points; /* number of points */
- double **matrix; /* matrix */
- int *indx;
- Creates system of linear equations represented by matrix using given points
- and interpolating function interp()
-
- int
- IL_check_at_points_2d (params,n_points,points,b,ertot,zmin)
- struct interp_params *params;
- int n_points; /* number of points */
- struct triple *points; /* points for interpolation */
- double *b; /* solution of linear equations */
- double *ertot; /* rms deviation of the interpolated surface */
- double zmin; /* min z-value */
- Checks if interpolating function interp() evaluates correct z-values at given
- points. If smoothing is used calculate the maximum and rms deviation caused by smoothing.
- int
- IL_secpar_loop_2d(params,ngstc,nszc,k,bitmask,gmin,gmax,c1min,c1max,c2min,
- c2max,cond1,cond2)
- struct interp_params *params;
- int ngstc; /* starting column */
- int nszc; /* ending column */
- int k; /* current row */
- struct BM *bitmask;
- double *gmin,*gmax,*c1min,*c1max,*c2min,*c2max; /* min,max interp. values */
- int cond1,cond2; /*determine if particular values need to be computed*/
- Computes slope, aspect and curvatures (depending on cond1, cond2) for derivative
- arrays adx,...,adxy between columns ngstc and nszc.
- int
- IL_write_temp_2d(params,ngstc,nszc,offset2)
- struct interp_params *params;
- int ngstc,nszc,offset2; /* begin. and end. column, offset */
- Writes az,adx,...,adxy into appropriate place (depending on ngstc, nszc and
- offset) in corresponding temp file */
- int
- IL_interp_segments_2d (params,info,tree,bitmask,zmin,zmax,zminac,zmaxac,
- gmin,gmax,c1min,c1max,c2min,c2max,ertot,totsegm,offset1,dnorm)
- struct interp_params *params;
- struct tree_info *info; /* info for the quad tree */
- struct multtree *tree; /* current leaf of the quad tree */
- struct BM *bitmask; /* bitmask */
- double zmin,zmax; /* min and max input z-values */
- double *zminac,*zmaxac, /* min and max interp. z-values */
- *gmin,*gmax, /* min and max inperp. slope val.*/
- *c1min,*c1max,*c2min,*c2max; /* min and max interp. curv. val.*/
- double *ertot; /* rms deviation of the interpolated surface*/
- int totsegm; /* total number of segments */
- int offset1; /* offset for temp file writing */
- double dnorm; /* normalization factor */
- Recursively processes each segment in a tree by
- a) finding points from neighbouring segments so that the total number of
- points is between KMIN and KMAX2 by calling tree function MT_get_region().
- b) creating and solving the system of linear equations using these points
- and interp() by calling matrix_create() and G_ludcmp().
- c) checking the interpolated values at given points by calling
- check_points().
- d) computing grid for this segment using points and interp() by calling
- grid_calc().
-
- int
- IL_interp_segments_new_2d (params,info,tree,bitmask,
- zmin,zmax,zminac,zmaxac,gmin,gmax,c1min,c1max,
- c2min,c2max,ertot,totsegm,offset1,dnorm)
- struct interp_params *params;
- struct tree_info *info; /* info for the quad tree */
- struct multtree *tree; /* current leaf of the quad tree */
- struct BM *bitmask; /* bitmask */
- double zmin,zmax; /* min and max input z-values */
- double *zminac,*zmaxac, /* min and max interp. z-values */
- *gmin,*gmax, /* min and max inperp. slope val.*/
- *c1min,*c1max,*c2min,*c2max; /* min and max interp. curv. val.*/
- double *ertot; /* rms deviation of the interpolated surface*/
- int totsegm; /* total number of segments */
- int offset1; /* offset for temp file writing */
- double dnorm; /* normalization factor */
- The difference between this function and IL_interp_segments_2d() is making
- sure that additional points are taken from all directions, i.e. it finds
- equal number of points from neigbouring segments in each of 8 neigbourhoods.
- Recursively processes each segment in a tree by
- a) finding points from neighbouring segments so that the total number of
- points is between KMIN and KMAX2 by calling tree function MT_get_region().
- b) creating and solving the system of linear equations using these points
- and interp() by calling matrix_create() and G_ludcmp().
- c) checking the interpolated function values at points by calling
- check_points().
- d) computing grid for this segment using points and interp() by calling
- grid_calc().
-
- int
- IL_output_2d (params,cellhd,zmin,zmax,zminac,zmaxac,c1min,c1max,c2min,c2max,
- gmin,gmax,ertot,dnorm)
- struct interp_params *params;
- struct Cell_head *cellhd; /* current region */
- double zmin,zmax, /* min,max input z-values */
- zminac,zmaxac,c1min,c1max, /* min,max interpolated values */
- c2min,c2max,gmin,gmax;
- double *ertot; /* rms deviation of the interpolated surface*/
- double dnorm; /* normalization factor */
- Creates output files as well as history files and color tables for them.
|