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