void show_results (char *prefix, SpiceCell result, void(* udfuns)(SpiceDouble et,SpiceDouble * value)) { SpiceInt i; SpiceInt nres = wncard_c(&result); SpiceDouble beg, end, vbeg, vend; for (i=0; i<nres; i++) { wnfetd_c(&result,i,&beg,&end); udfuns(beg,&vbeg); udfuns(end,&vend); printf("%s %f %f %f %f '%s'\n",prefix,et2jd(beg),et2jd(end),vbeg,vend,s); } }
void findmins (SpiceDouble beg, SpiceDouble end) { SpiceInt i, count; // SPICEDOUBLE_CELLs are static, so must reinit them each time, sigh SPICEDOUBLE_CELL(result, 200); SPICEDOUBLE_CELL(cnfine,2); scard_c(0,&result); scard_c(0,&cnfine); // create interval wninsd_c(beg,end,&cnfine); // get results gfuds_c(gfq,gfdecrx,"LOCMIN",0.,0.,86400.,MAXWIN,&cnfine,&result); count = wncard_c(&result); for (i=0; i<count; i++) { wnfetd_c(&result,i,&beg,&end); // becuase beg and end are equal, overwriting end with actual value gfq(beg,&end); printf("M %f %f %f\n",et2jd(beg),r2d(end),r2d(sunminangle(beg,planetcount,planets))); } }
int main (int argc, char **argv) { SpiceInt i, nres; SPICEDOUBLE_CELL(cnfine,2); SPICEDOUBLE_CELL(result,2*MAXWIN); SpiceDouble beg,end; furnsh_c("/home/barrycarter/BCGIT/ASTRO/standard.tm"); // this will represent the stars position planets[0] = -1; // convert ra and dec to starpos radrec_c(1,atof(argv[1]),atof(argv[2]),starpos); // planets array and count for (i=1; i<argc-2; i++) {planets[i] = atoi(argv[i+2]);} planetcount = argc-2; printf("CONJUNCTIONS FOR %f degrees, planets: %s %s %d %d %d %d %d %d\n",r2d(MAXSEP),argv[1],argv[2],(int)planets[1],(int)planets[2],(int)planets[3],(int)planets[4],(int)planets[5],(int)planets[6]); // TODO: this is for testing only // wninsd_c(unix2et(0),unix2et(2147483647),&cnfine); wninsd_c (-479695089600.+86400*468, 479386728000., &cnfine); // 1 second tolerance (serious overkill, but 1e-6 is default, worse!) gfstol_c(1.); // find under MAXSEP degrees... // TODO: The 90 days below is just for testing, not accurate!!!! gfuds_c(gfq,gfdecrx,"<",MAXSEP,0.,86400.*90,MAXWIN,&cnfine,&result); nres = wncard_c(&result); for (i=0; i<nres; i++) { wnfetd_c(&result,i,&beg,&end); // R = range, M = min printf("R %f %f\n",et2jd(beg),et2jd(end)); findmins(beg,end); } // printf("There are %d results\n",wncard_c(&result)); return 0; }
int main( int argc, char **argv ) { SPICEDOUBLE_CELL(result,2*MAXWIN ); SPICEDOUBLE_CELL(resultr,2*MAXWIN ); // TODO: these windows can hold at most one interval????? SPICEDOUBLE_CELL(cnfine,2); SPICEDOUBLE_CELL(cnfiner,2); SpiceInt i,j; // which ephermis's to use furnsh_c( "/home/barrycarter/BCGIT/ASTRO/standard.tm" ); // TOL too small otherwise; this is one second gfstol_c(1.); // SPICE window for all DE431 wninsd_c (-479695089600.+86400*468, 479386728000., &cnfine); // FOR TESTING PURPOSES ONLY!!!! // wninsd_c (-946684800., 2147483647.+946684800., &cnfine); // I send these as: observer b1 b2, thus the odd argv order below // 0.10471975511965977462 radians = 6 degrees gfsep_c(argv[2],"POINT","J2000",argv[3],"POINT","J2000","NONE",argv[1], "<", 0.10471975511965977462,0,86400.,MAXWIN,&cnfine,&result); SpiceInt count = wncard_c(&result); SpiceDouble begtim, endtim, mintim1, mintim2; for (i=0; i<count; i++) { // find the ith result and print it wnfetd_c(&result,i,&begtim,&endtim); printf("%s %s %s 6deg %f %f\n",argv[1],argv[2],argv[3],et2jd(begtim),et2jd(endtim)); // find min separation in this interval // TODO: this is hideous coding (append/remove, must be a better way) appndd_c(begtim,&cnfiner); appndd_c(endtim,&cnfiner); wnvald_c(2,2,&cnfiner); // TODO: use of ABSMIN missed conjunctions, changed to LOCMIN gfsep_c(argv[2],"POINT","J2000",argv[3],"POINT","J2000","NONE",argv[1], "LOCMIN", 0,0,86400.,MAXWIN,&cnfiner,&resultr); SpiceInt count2 = wncard_c(&resultr); for (j=0; j<count2; j++) { wnfetd_c(&resultr,j,&mintim1,&mintim2); // mintim1 and mintim2 should be identical, printing them both anyway printf("%s %s %s min %f %f\n",argv[1],argv[2],argv[3],et2jd(mintim1),et2jd(mintim2)); } removd_c(endtim,&cnfiner); removd_c(begtim,&cnfiner); } }