void SpicePosition::getinterval(const std::vector<std::string> &kernels, BodyId body, EphemeridesInterval &interval) { SPICEDOUBLE_CELL ( cover, 2000); bool first = true; for (std::vector<std::string>::const_iterator i = kernels.begin(); i != kernels.end(); i++) { scard_c(0, &cover); spkcov_c(i->c_str(), body, &cover); SpiceInt niv = wncard_c (&cover); for (SpiceInt j = 0; j < niv; j++) { SpiceDouble a, b; wnfetd_c(&cover, j, &a, &b); if (first) { first = false; interval.a = a; interval.b = b; } else { interval.a = std::min(interval.a, a); interval.b = std::max(interval.b, b); } } } char timea[1000], timeb[1000]; timout_c (interval.a, "YYYY ::TDB", sizeof(timea), timea); timout_c (interval.b, "YYYY ::TDB", sizeof(timeb), timeb); }
// Extract the temporal coverages for a given object in an SPK kernel std::vector< std::vector<double> > spkcoverage(std::string kernel, int obj) { SPICEDOUBLE_CELL(cover,2000); scard_c(0,&cover); spkcov_c(kernel.c_str(),obj,&cover); int niv = wncard_c(&cover); std::vector< std::vector<double> > ret(niv,std::vector<double>(2,0.0)); for(int j=0; j<niv; j++) { double b,e; wnfetd_c(&cover,j,&b,&e); ret[j][0] = b; ret[j][1] = e; } return ret; }
//------------------------------------------------------------------------------ void SpiceOrbitKernelReader::GetCoverageStartAndEnd(StringArray &kernels, Integer forNaifId, Real &start, Real &end) { // first check to see if a kernel specified is not loaded; if not, // try to load it for (unsigned int ii = 0; ii < kernels.size(); ii++) if (!IsLoaded(kernels.at(ii))) LoadKernel(kernels.at(ii)); SpiceInt idSpice = forNaifId; SpiceInt arclen = 4; SpiceInt typlen = 5; bool firstInt = true; bool idOnKernel = false; ConstSpiceChar *kernelName = NULL; SpiceInt objId = 0; SpiceInt numInt = 0; SpiceChar *kernelType; SpiceChar *arch; SpiceDouble b; SpiceDouble e; Real bA1; Real eA1; SPICEINT_CELL(ids, 200); SPICEDOUBLE_CELL(cover, 200000); char kStr[5] = " "; char aStr[4] = " "; // look through each kernel for (unsigned int ii = 0; ii < kernels.size(); ii++) { #ifdef DEBUG_SPK_COVERAGE MessageInterface::ShowMessage(wxT("Checking coverage for ID %d on kernel %s\n"), forNaifId, (kernels.at(ii)).c_str()); #endif kernelName = kernels[ii].char_str(); // check the type of kernel arch = aStr; kernelType = kStr; getfat_c(kernelName, arclen, typlen, arch, kernelType); if (failed_c()) { ConstSpiceChar option[] = "LONG"; SpiceInt numChar = MAX_LONG_MESSAGE_VALUE; //SpiceChar err[MAX_LONG_MESSAGE_VALUE]; SpiceChar *err = new SpiceChar[MAX_LONG_MESSAGE_VALUE]; getmsg_c(option, numChar, err); wxString errStr(wxString::FromAscii(err)); wxString errmsg = wxT("Error determining type of kernel \""); errmsg += kernels.at(ii) + wxT("\". Message received from CSPICE is: "); errmsg += errStr + wxT("\n"); reset_c(); delete [] err; throw UtilityException(errmsg); } #ifdef DEBUG_SPK_COVERAGE MessageInterface::ShowMessage(wxT("Kernel is of type %s\n"), kernelType); #endif // only deal with SPK kernels if (eqstr_c( kernelType, "spk" )) { spkobj_c(kernelName, &ids); // get the list of objects (IDs) for which data exists in the SPK kernel for (SpiceInt jj = 0; jj < card_c(&ids); jj++) { objId = SPICE_CELL_ELEM_I(&ids,jj); #ifdef DEBUG_SPK_COVERAGE MessageInterface::ShowMessage(wxT("Kernel contains data for object %d\n"), (Integer) objId); #endif // look to see if this kernel contains data for the object we're interested in if (objId == idSpice) { idOnKernel = true; break; } } // only deal with kernels containing data for the object we're interested in if (idOnKernel) { #ifdef DEBUG_SPK_COVERAGE MessageInterface::ShowMessage(wxT("Checking kernel %s for data for object %d\n"), (kernels.at(ii)).c_str(), (Integer) objId); #endif scard_c(0, &cover); // reset the coverage cell spkcov_c (kernelName, idSpice, &cover); if (failed_c()) { ConstSpiceChar option[] = "LONG"; SpiceInt numChar = MAX_LONG_MESSAGE_VALUE; //SpiceChar err[MAX_LONG_MESSAGE_VALUE]; SpiceChar *err = new SpiceChar[MAX_LONG_MESSAGE_VALUE]; getmsg_c(option, numChar, err); wxString errStr(wxString::FromAscii(err)); wxString errmsg = wxT("Error determining coverage for SPK kernel \""); errmsg += kernels.at(ii) + wxT("\". Message received from CSPICE is: "); errmsg += errStr + wxT("\n"); reset_c(); delete [] err; throw UtilityException(errmsg); } numInt = wncard_c(&cover); #ifdef DEBUG_SPK_COVERAGE MessageInterface::ShowMessage(wxT("Number of intervals found = %d\n"), (Integer) numInt); #endif if ((firstInt) && (numInt > 0)) { wnfetd_c(&cover, 0, &b, &e); if (failed_c()) { ConstSpiceChar option[] = "LONG"; SpiceInt numChar = MAX_LONG_MESSAGE_VALUE; //SpiceChar err[MAX_LONG_MESSAGE_VALUE]; SpiceChar *err = new SpiceChar[MAX_LONG_MESSAGE_VALUE]; getmsg_c(option, numChar, err); wxString errStr(wxString::FromAscii(err)); wxString errmsg = wxT("Error getting interval times for SPK kernel \""); errmsg += kernels.at(ii) + wxT("\". Message received from CSPICE is: "); errmsg += errStr + wxT("\n"); reset_c(); delete [] err; throw UtilityException(errmsg); } start = SpiceTimeToA1(b); end = SpiceTimeToA1(e); firstInt = false; } for (SpiceInt jj = 0; jj < numInt; jj++) { wnfetd_c(&cover, jj, &b, &e); bA1 = SpiceTimeToA1(b); eA1 = SpiceTimeToA1(e); if (bA1 < start) start = bA1; if (eA1 > end) end = eA1; } } } } if (firstInt) { wxString errmsg(wxT("")); errmsg << wxT("Error - no data available for body with NAIF ID ") << forNaifId << wxT(" on specified SPK kernels\n"); throw UtilityException(errmsg); } }
int main (int argc, char **argv) { SpiceDouble et, mat[3][3], mat2[3][3], jac[3][3], nut, obq, dboq; SpiceDouble pos[3], newpos[3]; SpiceDouble lt; SpiceInt planets[6], i; SPICEDOUBLE_CELL (range, 2); SpiceDouble beg,end,stime,etime,*array; char test2[2000]; furnsh_c("/home/barrycarter/BCGIT/ASTRO/standard.tm"); exit(-1); for (i=-20000; i<=20000; i++) { timout_c(year2et(i), "ERAYYYY##-MON-DD HR:MN:SC.############# ::MCAL", 50, test2); printf("TIME: %d %s\n", i, test2); } exit(-1); spkcov_c("/home/barrycarter/SPICE/KERNELS/de431_part-1.bsp", 399, &range); wnfetd_c (&range, 0, &stime, &end); spkcov_c("/home/barrycarter/SPICE/KERNELS/de431_part-2.bsp", 399, &range); wnfetd_c(&range, 0, &beg, &etime); printf("TIMES: %f %f\n", beg, etime); str2et_c("2017-10-17 07:59", &et); printf("ET: %f\n", et); spkezp_c(1, et, "EQEQDATE", "CN+S", 399, pos, <); printf("ET: %f\n", et); printf("POS: %f %f %f %f %f\n", et, pos[0], pos[1], pos[2], lt); // eqeq2eclip(et, mat, jac); mxv_c(mat, pos, newpos); printf("NEWPOS: %f %f %f\n", newpos[0], newpos[1], newpos[2]); exit(0); zzwahr_(&et, &nut); zzmobliq_(&et, &obq, &dboq); printf("NUTATION: %f\n", nut); printf("OBLIQUITY: %f\n", obq); pxform_c("EQEQDATE", "ECLIPDATE", et, mat); for (i=0; i<=2; i++) { printf("ALPHA: %d %f %f %f\n", i, mat[i][0], mat[i][1], mat[i][2]); } eqeq2eclip(et, mat2); printf("ALPHATEST\n"); for (i=0; i<=2; i++) { printf("BETA: %d %f %f %f\n", i, mat2[i][0], mat2[i][1], mat2[i][2]); } exit(0); str2et_c("10400-FEB-28 00:00:00", &et); printf("ET: %f\n", et); str2et_c("10400-MAR-01 00:00:00", &et); printf("ET: %f\n", et); exit(0); timout_c(0, "ERAYYYY##-MON-DD HR:MN:SC.############# ::MCAL", 41, test2); printf("%s\n", test2); exit(0); long long test = -pow(2,63); printf("TEST: %lld\n",test); exit(0); if (!strcmp(argv[1],"posxyz")) { double time = atof(argv[2]); int planet = atoi(argv[3]); posxyz(time,planet,pos); printf("%f -> %f %f %f\n",time,pos[0],pos[1],pos[2]); }; if (!strcmp(argv[1],"earthvector")) { double time = atof(argv[2]); int planet = atoi(argv[3]); earthvector(time,planet,pos); printf("%f -> %f %f %f\n",time,pos[0],pos[1],pos[2]); }; if (!strcmp(argv[1],"earthangle")) { double time = atof(argv[2]); int p1 = atoi(argv[3]); int p2 = atoi(argv[4]); SpiceDouble sep = earthangle(time,p1,p2); printf("%f -> %f\n",time,sep); }; if (!strcmp(argv[1],"earthmaxangle")) { double time = atof(argv[2]); for (i=3; i<argc; i++) {planets[i-3] = atoi(argv[i]);} SpiceDouble sep = earthmaxangle(time,argc-3,planets); printf("%f -> %f\n",time,sep); }; }