Annotation of researchv10no/cmd/view2d/regrid.c, revision 1.1

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: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.