Changeset 13185
- Timestamp:
- May 2, 2007, 7:06:03 PM (19 years ago)
- Location:
- trunk/Ohana/src/addstar
- Files:
-
- 4 edited
-
include/skycells.h (modified) (2 diffs)
-
src/args_skycells.c (modified) (2 diffs)
-
src/sky_tessalation.c (modified) (2 diffs)
-
src/skycells.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Ohana/src/addstar/include/skycells.h
r12775 r13185 52 52 int VERBOSE; 53 53 int MODE; 54 int NMAX; 54 55 double SCALE; 55 56 … … 69 70 int sky_triangle_to_rectangle (Image *image, SkyTriangle *triangle); 70 71 71 Image *sky_tessalation (int level, int *nimages, int mode, double scale); 72 Image *sky_tessalation_triangles (int level, int *nimages, double scale); 73 Image *sky_tessalation_squares (int level, int *nimages, double scale); 72 int sky_tessalation (FITS_DB *db, int level, int Nmax, int mode, double scale); 73 int sky_tessalation_triangles (FITS_DB *db, int level, int Nmax); 74 int sky_tessalation_squares (FITS_DB *db, int level, int Nmax); 75 76 // migrate to libdvo eventually 77 int dvo_image_clear_vtable (FITS_DB *db); -
trunk/Ohana/src/addstar/src/args_skycells.c
r12775 r13185 27 27 } 28 28 29 /* what type of output files?*/29 /* pixel scale (arcsec/pixel) */ 30 30 SCALE = 1.0; 31 31 if ((N = get_argument (argc, argv, "-scale"))) { 32 32 remove_argument (N, &argc, argv); 33 33 SCALE = atof (argv[N]); 34 remove_argument (N, &argc, argv); 35 } 36 37 /* max number of skycells kept in memory */ 38 NMAX = 200000; 39 if ((N = get_argument (argc, argv, "-nmax"))) { 40 remove_argument (N, &argc, argv); 41 NMAX = atof (argv[N]); 34 42 remove_argument (N, &argc, argv); 35 43 } … … 40 48 } 41 49 42 fprintf (stderr, "USAGE: skycells (level) [-triangles] [-scale arcsec/pix] \n");50 fprintf (stderr, "USAGE: skycells (level) [-triangles] [-scale arcsec/pix] [-nmax Max Cells in memory]\n"); 43 51 exit (2); 44 52 } -
trunk/Ohana/src/addstar/src/sky_tessalation.c
r13105 r13185 6 6 static int warned = FALSE; 7 7 8 Image *sky_tessalation (int level, int *nimages, int mode, double scale) {9 10 Image *images;8 int sky_tessalation (FITS_DB *db, int level, int Nmax, int mode, double scale) { 9 10 sky_tessalation_init (scale); 11 11 12 12 if (mode == SQUARES) { 13 images = sky_tessalation_squares (level, nimages, scale);14 return images;13 sky_tessalation_squares (db, level, Nmax); 14 return TRUE; 15 15 } 16 16 17 17 if (mode == TRIANGLES) { 18 images = sky_tessalation_triangles (level, nimages, scale); 19 return images; 20 } 21 22 return NULL; 23 } 24 25 Image *sky_tessalation_triangles (int level, int *nimages, double scale) { 26 27 int i, Ndigit, Ntriangles; 28 SkyTriangle *tri, *new; 18 sky_tessalation_triangles (db, level, Nmax); 19 return TRUE; 20 } 21 22 return FALSE; 23 } 24 25 int sky_tessalation_triangles (FITS_DB *db, int level, int Nmax) { 26 27 int i, j, Ndigit, Ntriangles, Nbase, Ntotal, Ltop, Nimages; 28 double Ntop, fLtop; 29 SkyTriangle *base, *tri, *new; 29 30 Image *image; 30 31 char format[16]; 31 32 32 Ndigit = (int)(log10(20*pow(4.0, level))) + 1 ; 33 // generate the initial base set 34 base = sky_base_triangles (&Nbase); 35 36 // how many triangles total for this level? 37 Ntotal = Nbase*pow(4.0, level); 38 Ndigit = (int)(log10(Ntotal)) + 1 ; 33 39 snprintf (format, 16, "skytri.%%0%dd", Ndigit); 34 40 35 sky_tessalation_init (scale); 36 37 tri = sky_base_triangles (&Ntriangles); 38 39 for (i = 0; i < level; i++) { 40 new = sky_divide_triangles (tri, &Ntriangles); 41 // to what depth do we need to go to have only Nmax foreach subcell? 42 Ntop = Ntotal / Nmax; 43 if (Ntop > Nbase) { 44 fLtop = log10(Ntop / Nbase) / log10(4.0); 45 if (fLtop > (int)(fLtop)) { 46 Ltop = fLtop + 1; 47 } else { 48 Ltop = fLtop; 49 } 50 } else { 51 Ltop = 0; 52 } 53 54 // subdivide the base set to Ltop level 55 for (i = 0; i < Ltop; i++) { 56 new = sky_divide_triangles (base, &Nbase); 57 free (base); 58 base = new; 59 } 60 61 // for each base triangle, subdivide the rest of the way and save 62 for (i = 0; i < Nbase; i++) { 63 ALLOCATE (tri, SkyTriangle, 1); 64 tri[0] = base[i]; 65 Ntriangles = 1; 66 for (j = Ltop; j < level; j++) { 67 new = sky_divide_triangles (tri, &Ntriangles); 68 free (tri); 69 tri = new; 70 } 71 72 // convert the SkyTriangles to Image 73 ALLOCATE (image, Image, Ntriangles); 74 for (j = 0; j < Ntriangles; j++) { 75 sky_triangle_to_image (&image[j], &tri[j]); 76 snprintf (image[j].name, 32, format, j); 77 } 78 Nimages = Ntriangles; 79 80 /* add the new images and save */ 81 dvo_image_addrows (db, image, Nimages); 82 SetProtect (TRUE); 83 dvo_image_update (db, VERBOSE); 84 SetProtect (FALSE); 85 dvo_image_clear_vtable (db); 86 87 free (image); 41 88 free (tri); 42 tri = new; 43 } 44 45 ALLOCATE (image, Image, Ntriangles); 46 for (i = 0; i < Ntriangles; i++) { 47 sky_triangle_to_image (&image[i], &tri[i]); 48 snprintf (image[i].name, 32, format, i); 49 } 50 51 *nimages = Ntriangles; 52 return (image); 53 } 54 55 Image *sky_tessalation_squares (int level, int *nimages, double scale) { 56 57 int i, N, Ndigit, Ntriangles; 58 SkyTriangle *tri, *new; 59 Image *image, *outimage; 89 } 90 return (TRUE); 91 } 92 93 int sky_tessalation_squares (FITS_DB *db, int level, int Nmax) { 94 95 int i, j, Ndigit, Ntriangles, Nbase, Ntotal, Ntop, Ltop, Nout; 96 double fLtop; 97 SkyTriangle *base, *tri, *new; 98 Image *image, *out; 60 99 char format[16]; 61 100 62 // XXX I need to adjust for the number of cell subdivisions 63 Ndigit = (int)(log10(20*pow(4.0, level))) + 1 ; 101 // generate the initial base set 102 base = sky_base_triangles (&Nbase); 103 104 // how many total cells for this level (multiply by subdivisions, if used)? 105 Ntotal = Nbase*pow(4.0, level); 106 Ndigit = (int)(log10(Ntotal)) + 1 ; 64 107 snprintf (format, 16, "skycell.%%0%dd", Ndigit); 65 108 66 sky_tessalation_init (scale); 67 68 tri = sky_base_triangles (&Ntriangles); 69 70 for (i = 0; i < level; i++) { 71 new = sky_divide_triangles (tri, &Ntriangles); 109 // to what depth do we need to go to have only Nmax foreach subcell? 110 Ntop = Ntotal / Nmax; 111 if (Ntop > Nbase) { 112 fLtop = log10(Ntotal / (double)(Ntop * Nbase)) / log10(4.0); 113 if (fLtop > (int)(fLtop)) { 114 Ltop = fLtop + 1; 115 } else { 116 Ltop = fLtop; 117 } 118 } else { 119 Ltop = 0; 120 } 121 122 // subdivide the base set to Ltop level 123 for (i = 0; i < Ltop; i++) { 124 new = sky_divide_triangles (base, &Nbase); 125 free (base); 126 base = new; 127 } 128 129 // for each base triangle, subdivide the rest of the way and save 130 for (i = 0; i < Nbase; i++) { 131 ALLOCATE (tri, SkyTriangle, 1); 132 tri[0] = base[i]; 133 Ntriangles = 1; 134 for (j = Ltop; j < level; j++) { 135 new = sky_divide_triangles (tri, &Ntriangles); 136 free (tri); 137 tri = new; 138 } 139 140 // convert the SkyTriangles to Image 141 ALLOCATE (image, Image, Ntriangles); 142 for (j = 0; j < Ntriangles; j++) { 143 sky_triangle_to_rectangle (&image[j], &tri[j]); 144 } 145 146 // drop the appropriate subset 147 ALLOCATE (out, Image, Ntriangles); 148 for (j = Nout = 0; j < Ntriangles; j++) { 149 if (!strcmp(image[j].coords.ctype, "DROP")) continue; 150 memcpy (&out[Nout], &image[j], sizeof(Image)); 151 snprintf (out[Nout].name, 32, format, j); 152 Nout++; 153 } 154 free (image); 155 156 /* add the new images and save */ 157 dvo_image_addrows (db, out, Nout); 158 SetProtect (TRUE); 159 dvo_image_update (db, VERBOSE); 160 SetProtect (FALSE); 161 dvo_image_clear_vtable (db); 162 163 free (out); 72 164 free (tri); 73 tri = new; 74 } 75 76 ALLOCATE (image, Image, Ntriangles); 77 for (i = 0; i < Ntriangles; i++) { 78 sky_triangle_to_rectangle (&image[i], &tri[i]); 79 } 80 81 // FILE *f1 = fopen ("center.keep.dat", "w"); 82 // FILE *f2 = fopen ("center.drop.dat", "w"); 83 84 ALLOCATE (outimage, Image, Ntriangles); 85 for (i = N = 0; i < Ntriangles; i++) { 86 if (!strcmp(image[i].coords.ctype, "DROP")) { 87 // fprintf (f2, "%f %f\n", tri[i].r, tri[i].d); 88 continue; 89 } else { 90 // fprintf (f1, "%f %f\n", tri[i].r, tri[i].d); 91 } 92 memcpy (&outimage[N], &image[i], sizeof(Image)); 93 snprintf (outimage[N].name, 32, format, i); 94 N++; 95 } 96 free (image); 97 98 // fclose (f1); 99 // fclose (f2); 100 101 *nimages = N; 102 return (outimage); 165 } 166 return (TRUE); 103 167 } 104 168 … … 492 556 return (TRUE); 493 557 } 558 559 // free the space used by the current vtable entries 560 int dvo_image_clear_vtable (FITS_DB *db) { 561 562 int Nimages; 563 int i, N, Nx, Ny; 564 565 // free memory used by the current vtable rows 566 for (i = 0; i < db[0].vtable.Nrow; i++) { 567 free (db[0].vtable.buffer[i]); 568 } 569 REALLOCATE (db[0].vtable.buffer, char *, 1); 570 REALLOCATE (db[0].vtable.row, int, 1); 571 db[0].vtable.Nrow = 0; 572 573 // reset db[0].theader(NAXIS1) to match Image 574 gfits_modify (&db[0].theader, "NAXIS1", "%d", 1, sizeof(Image)); 575 db[0].theader.Naxis[0] = sizeof(Image); 576 577 return (TRUE); 578 } -
trunk/Ohana/src/addstar/src/skycells.c
r12775 r13185 13 13 level = atoi (argv[1]); 14 14 15 images = sky_tessalation (level, &Nimages, MODE, SCALE);16 17 15 /*** update the image table ***/ 18 16 /* setup image table format and lock */ … … 32 30 } 33 31 34 /* add the new images and save */ 35 dvo_image_addrows (&db, images, Nimages); 36 SetProtect (TRUE); 37 dvo_image_update (&db, VERBOSE); 38 SetProtect (FALSE); 32 // we have to put the database update calls deep down in the sky_tessalation code so we 33 // can write out the skycells in limited-sized chunks. 34 sky_tessalation (&db, level, NMAX, MODE, SCALE); 39 35 40 36 dvo_image_unlock (&db); 41 37 exit (0); 42 38 } 39 40 /* 41 * - we start with the image database loaded into memory (db) 42 * - we convert this to an empty vtable 43 * - add groups of images to the vtable 44 * - we write out the vtable data 45 * - zero-out the saved entries, 46 */ 47
Note:
See TracChangeset
for help on using the changeset viewer.
