|
|
1.1 root 1: #include <stdio.h>
2: #include "view2d.h"
3: #define NMAX 1030
4: char *progname;
5:
6: short timewarp;
7: double ts, te;
8: extern Rd2d rd;
9: int verbose;
10:
11: typedef struct Frame {
12: double time;
13: short *p;
14: } Frame;
15: Frame frame[3];
16: Frame *here, *tween, *there, *tframe;
17:
18: short nx, ny; /* input grid */
19: short mx, my; /* output grid */
20: float x[NMAX], y[NMAX];
21: int detrend;
22:
23: main(argc, argv)
24: int argc;
25: char **argv;
26: {
27: int i, j;
28: short *in; /* input values */
29: short *mid; /* intermediate values */
30: int nfr; /* number of frames to be drawn */
31: int ifr;
32: double tsi, tei; /* starting and ending time to be imposed */
33: int warpi = 0; /* internal timewarp */
34: double twtime, timestep, t;
35: short *a, *b, *c;
36: float *d; /* trend plane */
37: int fd;
38: int tinterp = 0;
39: int ulim = 0;
40: int timebar = 0;
41: int firstfr = 1; /* reading first frame? */
42: float ufmin, ufmax;
43: char *Malloc();
44:
45: timewarp = 0;
46: detrend = 0;
47: verbose = 0;
48: progname = argv[0];
49: here = frame+0;
50: tween = frame+1;
51: there = frame+2;
52: nfr = -1; mx = -1; my = -1; /* flag uninitialized values */
53:
54: for(argc--, argv++; *argv; argv++){
55: if(**argv == '-' ){
56: switch(argv[0][1]) {
57: case 'b':
58: i = sscanf(&argv[0][2], "%d", &timebar);
59: if(i!=1) timebar = -1;
60: break;
61: case 'f':
62: i = sscanf(&argv[0][2], "%d", &nfr);
63: tinterp = 1;
64: break;
65: case 'm':
66: i = sscanf(&argv[0][2], "%e, %e", &ufmin, &ufmax);
67: if(i!=2) error("bad fmin,fmax");
68: ulim++;
69: break;
70: case 'n':
71: i = sscanf(&argv[0][2], "%hd, %hd", &mx, &my);
72: if(i == 1) { my = mx; i = 2; }
73: if((i!=2)||(mx<0)||(mx>NMAX)||(my<0)||(my>NMAX)) error("bad NX, NY");
74: break;
75: case 'r':
76: detrend++;
77: break;
78: case 't':
79: warpi = sscanf(&argv[0][2], "%E, %E", &tsi, &tei);
80: if(warpi==0) error("bad TS,TE");
81: break;
82: case 'v':
83: verbose++;
84: break;
85: }
86: }else{
87: if(fd) error("can only read one file");
88: fd = Open(*argv,0);
89: }
90: }
91:
92: if(!tinterp){ /* if not interpolating, can use rd.c's -t processing */
93: timewarp=warpi;
94: ts = tsi;
95: if(timewarp==2) te = tei;
96: }
97: rd2dh(fd,&nx,&ny);
98: if(warpi<=0) tsi = ts;
99: if(warpi<=1) tei = te;
100: if(ulim){
101: rd.fmin = ufmin;
102: rd.fmax = ufmax;
103: g_rang2();
104: }
105: if(nfr==-1) nfr = rd.nfr;
106: if((nx > NMAX) || (ny > NMAX)) error("n too large");
107: if(mx==-1){ mx = nx; my = ny; }
108: if(verbose){
109: fprintf(stderr,"ts=%g te=%g\n",tsi,tei);
110: fprintf(stderr,"nx=%d ny=%d nframes=%d\n",nx,ny,rd.nfr);
111: fprintf(stderr,"mx=%d my=%d\n",mx,my);
112: fprintf(stderr,"global starting_time=%g ending_time=%g\n",rd.ts,rd.te);
113: fprintf(stderr,"fmin=%g fmax=%g\n",rd.fmin,rd.fmax);
114: fprintf(stderr,"pmin=%d pmax=%d\n",rd.pmin,rd.pmax);
115: fprintf(stderr,"u=%d v=%d\n",rd.u,rd.v);
116: }
117: if(tinterp&&(rd.nfr==1)) error("can't interpolate %d frames!",rd.nfr);
118: if(timebar&&(rd.ts==rd.te)){
119: fprintf(stderr,"couldn't determine boundary times for timebar\n");
120: timebar = 0;
121: }
122: for(i=0; i<nx; i++) x[i] = i/(nx-1.);
123: for(j=0; j<ny; j++) y[j] = j/(ny-1.);
124:
125: in = (short *)Malloc(nx*ny*sizeof(short));
126: mid = (short *)Malloc(mx*ny*sizeof(short));
127: if(timebar){
128: if(timebar==-1) timebar = my/30;
129: if(timebar<1) timebar = 1;
130: i = mx*(my+3*timebar)*sizeof(short);
131: }else{
132: i = mx*my*sizeof(short);
133: }
134: j = (nx*ny*sizeof(short)+mx*ny*sizeof(short)+3*i)/1000;
135: if(detrend) j += (8*mx*my)*sizeof(float)/1000;
136: if(j>900) fprintf(stderr,"using %dkB workspace\n",j);
137: here->p = 3*timebar*mx+(short *)Malloc(i);
138: tween->p = 3*timebar*mx+(short *)Malloc(i);
139: there->p = 3*timebar*mx+(short *)Malloc(i);
140: if(detrend) d = (float *)Malloc(mx*my*sizeof(float));
141:
142: if(tinterp){
143: ifr = 1;
144: twtime = tsi;
145: timestep = (tei-tsi)/((nfr-1.)+1e-20);
146: rdframe(here,in,mid);
147: if(detrend){ fit(here->p,d); rmfit(here->p,d); }
148: /* should fit first interpolated frame, but that's a nuisance */
149: rdframe(there,in,mid);
150: if(detrend) rmfit(there->p,d);
151: while( ifr<=nfr ){
152: while( twtime>there->time ){
153: tframe = there; there = here; here = tframe; /* swap */
154: if( rdframe(there,in,mid)==0 ) error("unexpected EOF!");
155: if(detrend) rmfit(there->p,d);
156: }
157: t = (twtime-here->time)/((there->time-here->time)+1e-30);
158: if(verbose)
159: fprintf(stderr,"time=%g %g(%g,%g)\n",twtime,t,here->time,there->time);
160: if( (t<0) || (t>1) ){
161: fprintf(stderr,"here=%g there=%g\n",here->time,there->time);
162: error("can't happen: extrap t=%g twtime=%g",t,twtime);
163: }
164: for(i=mx*my, a=here->p, b=there->p, c=tween->p; i>0; i--){
165: if( (*a < -BIG)||(*b < -BIG) ){
166: *c++ = -BIG-1; a++; b++;
167: }else{
168: *c++ = (1-t) * *a++ + t * *b++;
169: }
170: }
171: wrframe(twtime,tween->p,timebar);
172: ifr++;
173: twtime = tsi+(ifr-1)*timestep;
174: if(twtime>te) twtime=te;
175: if(twtime>rd.te) break;
176: }
177: }else{ /* no time interpolation */
178: while( rdframe(here,in,mid) ){
179: if(verbose) fprintf(stderr,"time=%g\n",here->time);
180: if(detrend){
181: if(firstfr){ fit(here->p,d); firstfr=0; }
182: rmfit(here->p,d);
183: }
184: wrframe(here->time,here->p,timebar);
185: }
186: }
187: exit(0);
188: }
189:
190:
191: wrframe(t,p,timebar)
192: double t;
193: short p[];
194: int timebar;
195: {
196: if(detrend){
197: view2d(1,mx,my,t,rd.u,rd.v,0,0,0,p);
198: }else{
199: if(timebar){
200: int i,j;
201: int k = mx*(t-rd.ts)/(rd.te-rd.ts);
202: short *q;
203: short space = -BIG-1; /* black */
204: short bar = rd.pmin + .8*((int)rd.pmax-rd.pmin); /* bar color */
205: short base = rd.pmin; /* base-bar color */
206: q = &p[-3*timebar*mx];
207: for(i=0;i<timebar;i++){
208: for(j=0;j<k;j++){ *q++ = bar; }
209: for(j=k;j<mx;j++){ *q++ = base; }
210: }
211: for(i=0;i<2*timebar*mx;i++){ *q++ = space; }
212: }
213: view2d(1,mx,my+3*timebar,t,rd.u,rd.v,1,rd.pmin,rd.pmax,&p[-3*timebar*mx]);
214: }
215: }
216:
217:
218: int /* returns 0 on EOF */
219: rdframe ( h, u, v )
220: Frame *h;
221: short *u;
222: short *v;
223: {
224: int i, ii, j, k, m;
225: float s, t;
226: short *w;
227: int umin, umax;
228:
229: if( rd2di( &h->time, u ) == 0 ) return(0);
230:
231: if((mx==nx)&&(my==ny)){
232: w = h->p;
233: m=nx*ny;
234: for(i = 0; i < m; i++){ *w++ = *u++; }
235: }else{
236: /* interpolate in x */
237: ii = 0;
238: for(i = 0; i < mx; i++){
239: t = i/(mx-1.);
240: while( (ii<nx-1) && (t>=x[ii+1]) ) ii++;
241: if(t == x[ii]) {
242: for(j = 0; j < ny; j++) {
243: v[i+j*mx] = u[ii+j*nx];
244: }
245: }else{
246: s = (t-x[ii])/(x[ii+1]-x[ii]);
247: for(j = 0; j < ny; j++){
248: k = ii+j*nx;
249: if( (u[k] < -BIG)||(u[k+1] < -BIG) ){
250: v[i+j*mx] = -BIG-1;
251: }else{
252: v[i+j*mx] = (u[k] + s*(u[k+1]-u[k]));
253: }
254: }
255: }
256: }
257:
258: /* interpolate in y */
259: w = h->p;
260: ii = 0;
261: for(i = 0; i < my; i++){
262: t = i/(my-1.);
263: while( (ii<ny-1) && (t>=y[ii+1]) ) ii++;
264: if(t == y[ii]){
265: for(j = 0; j < mx; j++){
266: w[j+i*mx] = v[j+ii*mx];
267: }
268: }else{
269: s = (t-y[ii])/(y[ii+1]-y[ii]);
270: for(j = 0; j < mx; j++){
271: k = j+ii*mx;
272: if( (v[k] < -BIG)||(v[k+mx] < -BIG) ){
273: w[j+i*mx] = -BIG-1;
274: }else{
275: w[j+i*mx] = (v[k] + s*(v[k+mx]-v[k]));
276: }
277: }
278: }
279: }
280: }
281: return(1);
282: }
283:
284:
285: fit(p,d)
286: short *p;
287: float *d; /* l2 fit to p */
288: {
289: float *z; /* floating copy of first frame data */
290: float *zz; /* pointer into z */
291: short *l; /* shares storage with z */
292: float *work, plane[3]; /* workspace for tl2fit */
293: float x, y;
294: float u2, v2, pow2();
295: int i, j;
296: int imx, imy, imxmy;
297: char *Malloc();
298:
299: i = mx*my*sizeof(float);
300: z = (float *)Malloc(i);
301: work = (float *)Malloc(6*i);
302: imx = mx; imy = my; imxmy = mx*my;
303: u2 = rd.u; v2 = pow2(rd.v);
304: for( i=mx*my, zz=z; i>0; i--){
305: *zz++ = ((*p++)-u2)*v2;
306: }
307: tl2fit_(&imx,&imy,&imxmy,z,work,plane);
308: free(z); free(work);
309: if(verbose) fprintf(stderr,"l2 plane: %g + %g x + %g y for 0<=x,y<=1\n",
310: plane[0], plane[1], plane[2]);
311:
312: for(j=1; j<=my; j++){
313: y = (j-1)/(my-1.);
314: for(i=1; i<=mx; i++){
315: x = (i-1)/(mx-1.);
316: *d++ = (plane[0] + x*plane[1] + y*plane[2])/v2 + u2;
317: }
318: }
319: }
320:
321: rmfit(p,d) /* p -= d */
322: short *p;
323: float *d;
324: {
325: int i;
326: float f;
327: short *p0, *p1;
328: p0 = p;
329: p1 = p+mx*my-1;
330: for(i=mx*my; i>0; i--, p++, d++){
331: f = *p - *d;
332: *p = (f>BIG)? BIG: ( (f<-BIG)? -BIG: f );
333: }
334: }
335:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.