beowulf zhang <beowulf.zhang@gmail.com> a écrit :
locOrbFrm object is referenced to another object.
My main function code is:
[snip]
// 生成目标当地轨道系
LocalOrbitalFrame lof = new
LocalOrbitalFrame(inertialFrame, LOFType.QSW, prop, "LOF");
[snip]
propS.addEventDetector(new CWAxisYDetector(initialOrbit,
lof, initialDate));
[snip]
SpacecraftState targ = prop.propagate(extrapDate);
SpacecraftState inter = propS.propagate(extrapDate);
PVCoordinates relst = inter.getPVCoordinates(lof);
It seems the numerical propagator "prop" is called simultaneously
from various places:
- directly from your code to compute targ
- somewhere from the other "propS" propagator through CWAxisYDetector
which in turn uses lof, which is based on "prop"
- somewhere in lof to compute relst
As this propagator is a numerical one, it stores the final state
after each call, so it is probably not safe to have it driven by so
many different callers which will use it back and forth in time, and
sometimes with zero size steps.
In order to compute relative position in a two-propagators setup, I
would suggest to not use LocalOrbitalFrame but instead to compute
directly the canonical vectors along the following lines (it is only
a rough guess, I did not check if the vectors I compute here are the
good ones):
PVCoordinates relInert = new PVCoordinates(inter.getPVCoordinates(),
targ.getPVCoordinates());
Vector3D q = inter.getPVCoordinates().getPosition().normalize();
Vector3D w = inter.getPVCoordinates().getMomentum().normalize();
Vector3D s = Vector3D.crossProduct(w, q);
PVCoordinates relst =
new PVCoordinates(new
Vector3D(Vector3D.dotProduct(relInert.getPosition(), q),
Vector3D.dotProduct(relInert.getPosition(), s),
Vector3D.dotProduct(relInert.getPosition(), w)),
new
Vector3D(Vector3D.dotProduct(relInert.getPosition(), q),
Vector3D.dotProduct(relInert.getPosition(), s),
Vector3D.dotProduct(relInert.getPosition(), w)));