ISCE_INSAR/library/isceLib/pyx/Orbit.pyx

275 lines
8.7 KiB
Cython
Raw Normal View History

2019-01-16 19:40:08 +00:00
#cython: language_level=3
#
# Author: Joshua Cohen
# Copyright 2017
#
#################################################################
cdef extern from "Orbit.h" namespace "isceLib":
cdef cppclass Orbit:
int basis
int nVectors
double *position
double *velocity
double *UTCtime
Orbit() except +
Orbit(int,int) except +
Orbit(const Orbit&) except +
int isNull()
void resetStateVectors()
void getPositionVelocity(double,double[3],double[3])
void getStateVector(int,double&,double[3],double[3])
void setStateVector(int,double,double[3],double[3])
int interpolate(double,double[3],double[3],int)
int interpolateWGS84Orbit(double,double[3],double[3])
int interpolateLegendreOrbit(double,double[3],double[3])
int interpolateSCHOrbit(double,double[3],double[3])
int computeAcceleration(double,double[3])
void printOrbit()
void loadFromHDR(const char*,int)
void dumpToHDR(const char*)
cdef class PyOrbit:
cdef Orbit c_orbit
def __cinit__(self, a=None, b=None):
if (a): # Init with basis/nvec
self.basis = a
if (b):
self.nVectors = b
else:
self.nVectors = 0
elif (b):
if (a):
self.basis = a
else:
self.basis = 1
self.nVectors = b
@property
def basis(self):
return self.c_orbit.basis
@basis.setter
def basis(self, int a):
self.c_orbit.basis = a
@property
def nVectors(self):
return self.c_orbit.nVectors
@nVectors.setter
def nVectors(self, int a):
if (a < 0):
return
if (a == 0):
self.c_orbit.nVectors = 0
self.resetStateVectors()
self.UTCtime = []
self.position = []
self.velocity = []
return
t = self.UTCtime
p = self.position
v = self.velocity
for i in range(a-self.nVectors):
t.append(0.)
for j in range(3):
p.append(0.)
v.append(0.)
nt = []
np = []
nv = []
for i in range(a):
nt.append(t[i])
for j in range(3):
np.append(p[3*i+j])
nv.append(v[3*i+j])
self.c_orbit.nVectors = a
self.resetStateVectors()
self.UTCtime = nt
self.position = np
self.velocity = nv
@property
def UTCtime(self):
a = []
if (self.isNull() == 1):
return a
for i in range(self.nVectors):
a.append(self.c_orbit.UTCtime[i])
return a
@UTCtime.setter
def UTCtime(self, a):
if (self.isNull() == 1):
print("Warning: Memory was not malloc'd for storage. nVectors will be set appropriately.")
self.nVectors = len(a) # internal call to resetStateVectors()
if (self.nVectors != len(a)):
print("Error: Invalid input size (expected list of length "+str(self.nVectors)+")")
return
for i in range(self.nVectors):
self.c_orbit.UTCtime[i] = a[i]
@property
def position(self):
a = []
if (self.isNull() == 1):
return a
for i in range(3*self.nVectors):
a.append(self.c_orbit.position[i])
return a
@position.setter
def position(self, a):
if (len(a)%3 != 0):
print("Error: Expected list with length of a multiple of 3.")
return
if (self.isNull() == 1):
print("Warning: Memory was not malloc'd for storage. nVectors will be set appropriately.")
self.nVectors = len(a) / 3
if (3*self.nVectors != len(a)):
print("Error: Invalid input size (expected list of length "+str(3*self.nVectors)+")")
return
for i in range(3*self.nVectors):
self.c_orbit.position[i] = a[i]
@property
def velocity(self):
a = []
if (self.isNull() == 1):
return a
for i in range(3*self.nVectors):
a.append(self.c_orbit.velocity[i])
return a
@velocity.setter
def velocity(self, a):
if (len(a)%3 != 0):
print("Error: Expected list with length of a multiple of 3.")
return
if (self.isNull() == 1):
print("Warning: Memory was not malloc'd for storage. nVectors will be set appropriately.")
self.nVectors = len(a) / 3
if (3*self.nVectors != len(a)):
print("Error: Invalid input size (expected list of length "+str(3*self.nVectors)+")")
return
for i in range(3*self.nVectors):
self.c_orbit.velocity[i] = a[i]
def copy(self, orb):
try:
self.basis = orb.basis
self.nVectors = orb.nVectors
self.UTCtime = orb.UTCtime
self.position = orb.position
self.velocity = orb.velocity
except:
print("Error: Object passed in to copy is not of type PyOrbit.")
def dPrint(self):
self.printOrbit()
def isNull(self):
return self.c_orbit.isNull()
def resetStateVectors(self):
self.c_orbit.resetStateVectors()
def getPositionVelocity(self, double a, list b, list c):
cdef double _b[3]
cdef double _c[3]
for i in range(3):
_b[i] = b[i]
_c[i] = c[i]
self.c_orbit.getPositionVelocity(a,_b,_c)
for i in range(3):
b[i] = _b[i]
c[i] = _c[i]
def getStateVector(self, int a, b, list c, list d):
cdef double _c[3]
cdef double _d[3]
cdef double _b
if (type(b) != type([])):
print("Error: Python cannot pass primitives by reference.")
print("To call this function, please pass the function an empty 1-tuple in the")
print("second argument slot. The function will store the resulting time value")
print("as the first (and only) element in the 1-tuple.")
else:
_b = 0.
for i in range(3):
_c[i] = c[i]
_d[i] = d[i]
self.c_orbit.getStateVector(a,_b,_c,_d)
for i in range(3):
c[i] = _c[i]
d[i] = _d[i]
b[0] = _b
def setStateVector(self, int a, double b, list c, list d):
cdef double _c[3]
cdef double _d[3]
for i in range(3):
_c[i] = c[i]
_d[i] = d[i]
self.c_orbit.setStateVector(a,b,_c,_d)
for i in range(3):
c[i] = _c[i]
d[i] = _d[i]
def interpolate(self, double a, list b, list c, int d):
cdef double _b[3]
cdef double _c[3]
cdef int ret
for i in range(3):
_b[i] = b[i]
_c[i] = c[i]
ret = self.c_orbit.interpolate(a,_b,_c,d)
for i in range(3):
b[i] = _b[i]
c[i] = _c[i]
return ret
def interpolateWGS84Orbit(self, double a, list b, list c):
cdef double _b[3]
cdef double _c[3]
cdef int ret
for i in range(3):
_b[i] = b[i]
_c[i] = c[i]
ret = self.c_orbit.interpolateWGS84Orbit(a,_b,_c)
for i in range(3):
b[i] = _b[i]
c[i] = _c[i]
return ret
def interpolateLegendreOrbit(self, double a, list b, list c):
cdef double _b[3]
cdef double _c[3]
cdef int ret
for i in range(3):
_b[i] = b[i]
_c[i] = c[i]
ret = self.c_orbit.interpolateLegendreOrbit(a,_b,_c)
for i in range(3):
b[i] = _b[i]
c[i] = _c[i]
return ret
def interpolateSCHOrbit(self, double a, list b, list c):
cdef double _b[3]
cdef double _c[3]
cdef int ret
for i in range(3):
_b[i] = b[i]
_c[i] = c[i]
ret = self.c_orbit.interpolateSCHOrbit(a,_b,_c)
for i in range(3):
b[i] = _b[i]
c[i] = _c[i]
return ret
def computeAcceleration(self, double a, list b):
cdef double _b[3]
cdef int ret
for i in range(3):
_b[i] = b[i]
ret = self.c_orbit.computeAcceleration(a,_b)
for i in range(3):
b[i] = _b[i]
return ret
def printOrbit(self):
self.c_orbit.printOrbit()
def loadFromHDR(self, a, int b=1):
cdef bytes _a = a.encode()
cdef char *cstring = _a
self.c_orbit.loadFromHDR(cstring,b)
def dumpToHDR(self, a):
cdef bytes _a = a.encode()
cdef char *cstring = _a
self.c_orbit.dumpToHDR(cstring)