Samstag, 14. Januar 2012

Weiter voran...

Die im letzten Post vorgestellte Idee: vom zentralen Kern der Swiss Ephemeris zu beginnen, nämlich der Berechnung einer einzelne Planetenposition direkt vom File, und dann nach und nach Fleisch hinzufügen, verfolge ich weiter.

Habe dazu ein neues Bit eingeführt:
const int SEFLG_NEW_MODE = 256*1024;

Dieses wird nun via iflag durch die Implementierung von swe_calc geschleust und steuert, dass die Berechnung mit den neu aufzubauenden Funktionen erfolgt. Es hat eine Weile gedauert, bis ich alle nötigen Bits beisammen hatte, um den Geradeausfall einer Jupiter-Position zu reproduzieren. Die auf dem File gespeicherten Positionen entsprechen folgender Bitkombination:

static void calcMainPlanetFromFile(double tjd, int ipl, ...) {
// Exploring the library with some tiny "spike" tests

// reduces positions for following command:
// swetest -j2452545 -p5 -i416048 -fxss
// SEFLG_BARYCTR 16384
// + SEFLG_XYZ 4096
// + SEFLG_EQUATORIAL 2048
// + SEFLG_TRUEPOS 16
// + SEFLG_J2000 32
// + SEFLG_ICRS 131072
// + SEFLG_SPEED 256
// + SEFLG_XYZ 4096
// + SEFLG_NEW_MODE 262144


So konnte ich mit swetest vergleichen und der Testuite tcr.fix einen Testfall hinzufügen.

Bevor ich hier fortfahre, werde ich mir die bei dieser Berechnung durchlaufenen Codestellen genau anschauen.

Der Zeiger auf swe_data kommt zwar schon mit, wird aber vorerst nicht benutzt. Nach der Regel, "premature optimization is the root of all evil" werde ich Pufferungen erst vorsehen, wenn Laufzeittests einen echten Bedarf ergeben.