Merge Dan White's contributed additions to spicefile/sp2sp:
[gwave-svn.git] / spicefile / test_read.c
blobd7aa6164612ebc62f6ba56b5f1972b6364ccb6d4
1 /*
2 * test routine for WaveFile data file readers
4 * $Log: not supported by cvs2svn $
5 * Revision 1.5 2003/07/30 06:18:49 sgt
6 * better handling of the last point in a wavevar,
7 * in particular when wv_interp_val asks for a point beyond the end of the iv range
8 * enhance test_read.c to
10 * Revision 1.4 2000/08/09 23:37:39 sgt
11 * ss_hspice.c - wrote sf_guessrows_hsbin routine.
12 * others - instrumented to count reallocs and print out the number.
14 * Revision 1.3 2000/01/07 05:04:48 tell
15 * updating with old changes as we construct the CVS
17 * Revision 1.2 1998/09/17 18:25:09 tell
18 * prints out variable type
20 * Revision 1.1 1998/08/31 21:00:28 tell
21 * Initial revision
25 #include <unistd.h>
26 #include <stdlib.h>
27 #include <stdio.h>
28 #include <string.h>
29 #include <errno.h>
30 #include <glib.h>
32 #include "wavefile.h"
34 void test_interp(WvTable *wt, double mytm);
35 void dump_table_info(WvTable *wt);
36 void dump_wavevar(gpointer p, gpointer u);
38 int
39 main(int argc, char **argv)
41 WaveFile *wf;
42 WvTable *wt;
43 int i, j;
44 extern int optind;
45 extern char *optarg;
46 int a_flag = 0;
47 int v_flag = 0;
48 int x_flag = 0;
49 int l_flag = 0;
50 int errflg = 0;
51 char *filetype = NULL;
52 int c;
54 while ((c = getopt (argc, argv, "alt:vx")) != EOF) {
55 switch(c) {
56 case 'a':
57 a_flag = 1;
58 break;
59 case 'v':
60 v_flag = 1;
61 break;
62 case 'l':
63 l_flag = 1;
64 break;
65 case 't':
66 filetype = optarg;
67 break;
68 case 'x':
69 x_flag = 1;
70 break;
71 default:
72 errflg = 1;
73 break;
77 if(errflg || optind >= argc) {
78 fprintf(stderr, "usage: %s [-altvx] file\n", argv[0]);
79 exit(1);
82 spicestream_msg_level = DBG;
83 wf = wf_read(argv[optind], filetype);
84 if(!wf) {
85 if(errno)
86 perror(argv[1]);
87 fprintf(stderr, "test_read: unable to read file\n");
88 exit(1);
90 printf("filename: \"%s\" #tables=%d\n",
91 wf->wf_filename, wf->wf_ntables);
93 for(i = 0; i < wf->wf_ntables; i++) {
94 printf("table %d", i);
95 wt = wf_wtable(wf, i);
96 if(wt->name) {
97 printf(" %s=%g", wt->name, wt->swval);
99 putchar('\n');
100 dump_table_info(wt);
102 wf_foreach_wavevar(wf, dump_wavevar, NULL);
104 wt = wf_wtable(wf, 0);
105 if(a_flag && wt->wt_ndv > 2) {
106 // test wf_add_var();
107 WaveVar *dv1;
108 WaveVar *dv2;
109 WaveVar *dvn;
110 char *nname;
111 int name_len;
113 printf("before add: ndv=%d\n", wt->wt_ndv);
114 dv1 = wt_dv(wt, wt->wt_ndv-2);
115 name_len = strlen(dv1->wv_name);
116 dv2 = wt_dv(wt, wt->wt_ndv-1);
117 name_len += strlen(dv2->wv_name);
118 name_len += 18;
119 nname = g_new0(char, name_len);
121 sprintf(nname, "calc( %s - %s )",
122 dv1->wv_name,
123 dv2->wv_name);
125 wf_add_var(wf, nname, 1, MATH, NULL);
126 printf("after add: ndv=%d\n", wt->wt_ndv);
127 dvn = wt_dv(wt, wt->wt_ndv-1);
129 for(j = 0; j < wt->nvalues; j++) {
130 wf_set_point(&dvn->wds[0], j,
131 wds_get_point(&dv1->wds[0], j) -
132 wds_get_point(&dv2->wds[0], j));
137 if(l_flag) {
138 int t;
139 WaveVar *dv;
140 for(t = 0; t < wf->wf_ntables; t++) {
141 printf("table %d: ", t);
142 wt = wf_wtable(wf, t);
143 if(wt->name) {
144 printf(" %s=%g", wt->name, wt->swval);
146 putchar('\n');
147 printf(" %10s", wt->iv->wv_name);
148 for(i = 0; i < wt->wt_ndv; i++) {
149 dv = wt_dv(wt, i);
150 printf(" %10s", dv->wv_name);
152 putchar('\n');
153 for(j = 0; j < wt->nvalues; j++) {
154 printf("[%3d] %10g", j, wds_get_point(wt->iv->wds, j));
155 for(i = 0; i < wt->wt_ndv; i++) {
156 dv = wt_dv(wt, i);
157 printf(" %10g",
158 wds_get_point(&dv->wds[0], j));
160 putchar('\n');
165 wt = wf_wtable(wf, 0);
166 if(v_flag) {
167 double mytm;
168 double delta;
170 mytm = wds_get_point(wt->iv->wds, 0);
171 delta = (wds_get_point(wt->iv->wds, wt->nvalues-1) - mytm) / 40.0;
172 printf("40 divisions, delta=%g\n", delta);
173 for(i = 0; i <= 41; i++, mytm += delta) {
174 test_interp(wt, mytm);
176 mytm = wds_get_point(wt->iv->wds, wt->nvalues-2);
177 putchar('\n');
178 test_interp(wt, mytm);
180 wf_free(wf);
181 exit(0);
184 void dump_table_info(WvTable *wt)
186 WaveFile *wf = wt->wf;
188 printf("independent variable:\n");
189 printf(" name: \"%s\"\n", wt->iv->wv_name);
190 printf(" type: %s\n", vartype_name_str(wt->iv->wv_type));
191 printf(" npts: %d\n", wt->nvalues);
192 printf(" min: %g\n", wt->iv->wds->min);
193 printf(" max: %g\n", wt->iv->wds->max);
194 printf(" blocks: %d/%d\n", wt->iv->wds->bpused, wt->iv->wds->bpsize);
195 printf(" reallocs: %d\n", wt->iv->wds->nreallocs);
197 printf("columns: %d\n", wf->wf_ncols);
198 printf("dependent variables: %d\n", wf->wf_ndv);
201 void
202 dump_wavevar(gpointer p, gpointer u)
204 WaveVar *wv = (WaveVar *)p;
205 int j;
207 printf(" dv %p \"%s\" ", wv, wv->wv_name);
208 printf(" (type=%s)", vartype_name_str(wv->wv_type));
210 if(wv->wv_ncols > 1)
211 printf(" (%d columns)\n", wv->wv_ncols);
213 for(j = 0; j < wv->wv_ncols; j++) {
214 if(wv->wv_ncols > 1)
215 printf(" col[%d] ", j);
216 printf("blocks=%d/%d ",
217 wv->wds[j].bpused, wv->wds[j].bpsize);
218 printf("min=%g ",wv->wds[j].min);
219 printf("max=%g ", wv->wds[j].max);
220 printf("first=%g ", wds_get_point(&wv->wds[j], 0));
221 printf("last=%g\n", wds_get_point(&wv->wds[j],
222 wv->wv_nvalues-1));
226 void
227 test_interp(WvTable *wt, double mytm)
229 int idx;
230 WaveVar *wv;
231 idx = wf_find_point(wt->iv, mytm);
232 printf("last %8s < %14.8g is %14.8g at [%4d];",
233 wt->iv->wv_name,
234 mytm,
235 wds_get_point(wt->iv->wds, idx),
236 idx);
237 fflush(stdout);
238 wv = wt_dv(wt, 0);
239 printf("%8s at %8s=%14.8g is %14.8g\n",
240 wv->wv_name,
241 wt->iv->wv_name,
242 mytm,
243 wv_interp_value(wv, mytm));