| 15 |  | #define sgn(x)          ((x) > 0 ? 1 : (x) < 0 ? -1 : 0) | 
| 16 |  |  | 
| 17 |  |  | 
| 18 | < | static PACKHEAD *complist;      /* list of beams to compute */ | 
| 19 | < | static int      complen;        /* length of complist */ | 
| 20 | < | static int      listpos;        /* current list position for next_pack */ | 
| 21 | < | static int      lastin;         /* last ordered position in list */ | 
| 18 | > | static PACKHEAD *complist=NULL; /* list of beams to compute */ | 
| 19 | > | static int      complen=0;      /* length of complist */ | 
| 20 | > | static int      listpos=0;      /* current list position for next_packet */ | 
| 21 | > | static int      lastin= -1;     /* last ordered position in list */ | 
| 22 |  |  | 
| 23 |  |  | 
| 24 |  | int | 
| 25 | + | beamcmp(b0, b1)                 /* comparison for descending compute order */ | 
| 26 | + | register PACKHEAD       *b0, *b1; | 
| 27 | + | { | 
| 28 | + | return( b1->nr*(bnrays(hdlist[b0->hd],b0->bi)+1) - | 
| 29 | + | b0->nr*(bnrays(hdlist[b1->hd],b1->bi)+1) ); | 
| 30 | + | } | 
| 31 | + |  | 
| 32 | + |  | 
| 33 | + | bundle_set(op, clist, nents)    /* bundle set operation */ | 
| 34 | + | int     op; | 
| 35 | + | PACKHEAD        *clist; | 
| 36 | + | int     nents; | 
| 37 | + | { | 
| 38 | + | BEAM    *b; | 
| 39 | + | PACKHEAD        *p; | 
| 40 | + | register int    i, n; | 
| 41 | + |  | 
| 42 | + | switch (op) { | 
| 43 | + | case BS_NEW:                    /* new computation set */ | 
| 44 | + | if (complen) | 
| 45 | + | free((char *)complist); | 
| 46 | + | if (nents <= 0) { | 
| 47 | + | complist = NULL; | 
| 48 | + | listpos = complen = 0; | 
| 49 | + | lastin = -1; | 
| 50 | + | return; | 
| 51 | + | } | 
| 52 | + | complist = (PACKHEAD *)malloc(nents*sizeof(PACKHEAD)); | 
| 53 | + | if (complist == NULL) | 
| 54 | + | goto memerr; | 
| 55 | + | bcopy((char *)clist, (char *)complist, nents*sizeof(PACKHEAD)); | 
| 56 | + | complen = nents; | 
| 57 | + | listpos = 0; | 
| 58 | + | lastin = -1;            /* flag for initial sort */ | 
| 59 | + | break; | 
| 60 | + | case BS_ADD:                    /* add to computation set */ | 
| 61 | + | if (nents <= 0) | 
| 62 | + | return; | 
| 63 | + | /* merge any common members */ | 
| 64 | + | for (i = 0; i < complen; i++) | 
| 65 | + | for (n = 0; n < nents; n++) | 
| 66 | + | if (clist[n].bi == complist[i].bi && | 
| 67 | + | clist[n].hd == complist[i].hd) { | 
| 68 | + | complist[i].nr += clist[n].nr; | 
| 69 | + | clist[n].nr = 0; | 
| 70 | + | lastin = -1;    /* flag full sort */ | 
| 71 | + | break; | 
| 72 | + | } | 
| 73 | + | /* sort updated list */ | 
| 74 | + | sortcomplist(); | 
| 75 | + | /* sort new entries */ | 
| 76 | + | qsort((char *)clist, nents, sizeof(PACKHEAD), beamcmp); | 
| 77 | + | /* what can't we satisfy? */ | 
| 78 | + | for (n = 0; n < nents && clist[n].nr > | 
| 79 | + | bnrays(hdlist[clist[n].hd],clist[n].bi); n++) | 
| 80 | + | ; | 
| 81 | + | if (n) {                /* allocate space for merged list */ | 
| 82 | + | PACKHEAD        *newlist; | 
| 83 | + | newlist = (PACKHEAD *)malloc( | 
| 84 | + | (complen+n)*sizeof(PACKHEAD) ); | 
| 85 | + | if (newlist == NULL) | 
| 86 | + | goto memerr; | 
| 87 | + | /* merge lists */ | 
| 88 | + | mergeclists(newlist, clist, n, complist, complen); | 
| 89 | + | if (complen) | 
| 90 | + | free((char *)complist); | 
| 91 | + | complist = newlist; | 
| 92 | + | complen += n; | 
| 93 | + | } | 
| 94 | + | listpos = 0; | 
| 95 | + | lastin = complen-1;     /* list is now sorted */ | 
| 96 | + | break; | 
| 97 | + | case BS_DEL:                    /* delete from computation set */ | 
| 98 | + | if (nents <= 0) | 
| 99 | + | return; | 
| 100 | + | /* find each member */ | 
| 101 | + | for (i = 0; i < complen; i++) | 
| 102 | + | for (n = 0; n < nents; n++) | 
| 103 | + | if (clist[n].bi == complist[i].bi && | 
| 104 | + | clist[n].hd == complist[i].hd) { | 
| 105 | + | if (clist[n].nr == 0 || | 
| 106 | + | clist[n].nr >= complist[i].nr) | 
| 107 | + | complist[i].nr = 0; | 
| 108 | + | else | 
| 109 | + | complist[i].nr -= clist[n].nr; | 
| 110 | + | lastin = -1;    /* flag full sort */ | 
| 111 | + | break; | 
| 112 | + | } | 
| 113 | + | if (lastin < 0)         /* sort updated list */ | 
| 114 | + | sortcomplist(); | 
| 115 | + | return;                 /* no display */ | 
| 116 | + | default: | 
| 117 | + | error(CONSISTENCY, "bundle_set called with unknown operation"); | 
| 118 | + | } | 
| 119 | + | n = 0;                          /* allocate packet holder */ | 
| 120 | + | for (i = 0; i < nents; i++) | 
| 121 | + | if (clist[i].nr > n) | 
| 122 | + | n = clist[i].nr; | 
| 123 | + | p = (PACKHEAD *)malloc(sizeof(PACKHEAD) + n*sizeof(RAYVAL)); | 
| 124 | + | if (p == NULL) | 
| 125 | + | goto memerr; | 
| 126 | + | /* display what we have */ | 
| 127 | + | for (i = 0; i < nents; i++) | 
| 128 | + | if ((b = hdgetbeam(hdlist[clist[i].hd], clist[i].bi)) != NULL) { | 
| 129 | + | bcopy((char *)hdbray(b), (char *)(p+1), | 
| 130 | + | (p->nr=b->nrm)*sizeof(RAYVAL)); | 
| 131 | + | disp_packet((PACKET *)p); | 
| 132 | + | } | 
| 133 | + | free((char *)p);                /* clean up */ | 
| 134 | + | return; | 
| 135 | + | memerr: | 
| 136 | + | error(SYSTEM, "out of memory in bundle_set"); | 
| 137 | + | } | 
| 138 | + |  | 
| 139 | + |  | 
| 140 | + | int | 
| 141 |  | weightf(hp, x0, x1, x2)         /* voxel weighting function */ | 
| 142 |  | register HOLO   *hp; | 
| 143 |  | register int    x0, x1, x2; | 
| 198 |  | } | 
| 199 |  |  | 
| 200 |  |  | 
| 85 | – | int | 
| 86 | – | beamcmp(b0, b1)                 /* comparison for descending compute order */ | 
| 87 | – | register PACKHEAD       *b0, *b1; | 
| 88 | – | { | 
| 89 | – | return( b1->nr*(bnrays(hdlist[b0->hd],b0->bi)+1) - | 
| 90 | – | b0->nr*(bnrays(hdlist[b1->hd],b1->bi)+1) ); | 
| 91 | – | } | 
| 92 | – |  | 
| 93 | – |  | 
| 201 |  | init_global()                   /* initialize global ray computation */ | 
| 202 |  | { | 
| 203 |  | long    wtotal = 0; | 
| 205 |  | int     lseg[2][3]; | 
| 206 |  | double  frac; | 
| 207 |  | register int    k; | 
| 208 | + | /* free old list */ | 
| 209 | + | if (complen > 0) | 
| 210 | + | free((char *)complist); | 
| 211 |  | /* allocate beam list */ | 
| 212 |  | complen = 0; | 
| 213 |  | for (j = 0; hdlist[j] != NULL; j++) | 
| 236 |  | while (k--) | 
| 237 |  | complist[k].nr = frac * complist[k].nr; | 
| 238 |  | } | 
| 239 | < | listpos = 0; lastin = -1; | 
| 239 | > | listpos = 0; lastin = -1;       /* flag initial sort */ | 
| 240 |  | } | 
| 241 |  |  | 
| 242 |  |  | 
| 266 |  | sortcomplist()                  /* fix our list order */ | 
| 267 |  | { | 
| 268 |  | PACKHEAD        *list2; | 
| 269 | + | register int    i; | 
| 270 | + |  | 
| 271 |  | /* empty queue */ | 
| 272 |  | done_packets(flush_queue()); | 
| 273 | + | if (complen <= 0)       /* check to see if there is even a list */ | 
| 274 | + | return; | 
| 275 |  | if (lastin < 0)         /* flag to sort entire list */ | 
| 276 |  | qsort((char *)complist, complen, sizeof(PACKHEAD), beamcmp); | 
| 277 |  | else if (listpos) {     /* else sort and merge sublist */ | 
| 284 |  | complist+listpos, complen-listpos); | 
| 285 |  | free((char *)list2); | 
| 286 |  | } | 
| 287 | < | listpos = 0; lastin = complen-1; | 
| 287 | > | /* check for all finished */ | 
| 288 | > | if (complist[0].nr <= bnrays(hdlist[complist[0].hd],complist[0].bi)) { | 
| 289 | > | free((char *)complist); | 
| 290 | > | complist = NULL; | 
| 291 | > | complen = 0; | 
| 292 | > | } | 
| 293 | > | /* drop satisfied requests */ | 
| 294 | > | for (i = complen; i-- && complist[i].nr <= | 
| 295 | > | bnrays(hdlist[complist[i].hd],complist[i].bi); ) | 
| 296 | > | ; | 
| 297 | > | if (i < 0) { | 
| 298 | > | free((char *)complist); | 
| 299 | > | complist = NULL; | 
| 300 | > | complen = 0; | 
| 301 | > | } else if (i < complen-1) { | 
| 302 | > | list2 = (PACKHEAD *)realloc((char *)complist, | 
| 303 | > | (i+1)*sizeof(PACKHEAD)); | 
| 304 | > | if (list2 != NULL) { | 
| 305 | > | complist = list2; | 
| 306 | > | complen = i+1; | 
| 307 | > | } | 
| 308 | > | } | 
| 309 | > | listpos = 0; lastin = i; | 
| 310 |  | } | 
| 311 |  |  | 
| 312 |  |  |