Skip to content

Commit 23bee11

Browse files
committed
Fix matrix cat + invert and test
1 parent 966ae30 commit 23bee11

File tree

2 files changed

+48
-12
lines changed

2 files changed

+48
-12
lines changed

src/frames.c

+4-3
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ static int invert_matrix(const novas_matrix *A, novas_matrix *I) {
7979
I->M[1][2] = A->M[1][0] * A->M[0][2] - A->M[0][0] * A->M[1][2];
8080
I->M[2][2] = A->M[0][0] * A->M[1][1] - A->M[1][0] * A->M[0][1];
8181

82-
idet = 1.0 / (A->M[0][0] * I->M[0][0] + A->M[1][1] * I->M[1][1] + A->M[2][2] * I->M[2][2]);
82+
idet = 1.0 / (A->M[0][0] * I->M[0][0] + A->M[0][1] * I->M[1][0] + A->M[0][2] * I->M[2][0]);
8383

8484
for(i = 3; --i >= 0;) {
8585
I->M[i][0] *= idet;
@@ -869,13 +869,14 @@ static int cat_transform(novas_transform *transform, const novas_matrix *compone
869869
double T[3][3];
870870

871871
memcpy(T, transform->matrix.M, sizeof(T));
872+
memset(transform->matrix.M, 0, sizeof(transform->matrix.M));
872873

873874
for(i = 3; --i >= 0;) {
874875
int j;
875876
for(j = 3; --j >= 0;) {
876877
int k;
877878
for(k = 3; --k >= 0;)
878-
transform->matrix.M[i][j] = T[i][k] * (dir < 0 ? component->M[j][k] : component->M[k][j]);
879+
transform->matrix.M[i][j] += T[i][k] * (dir < 0 ? component->M[j][k] : component->M[k][j]);
879880
}
880881
}
881882

@@ -1002,7 +1003,7 @@ int novas_make_transform(const novas_frame *frame, enum novas_reference_system f
10021003
*
10031004
* @param transform Pointer to a coordinate transformation matrix.
10041005
* @param[out] inverse Pointer to a coordinate transformation matrix to populate with the inverse
1005-
* transform.
1006+
* transform. It may be the same as the input.
10061007
* @return 0 if successful, or else -1 if the was an error (errno will indicate the
10071008
* type of error).
10081009
*

test/src/test-super.c

+44-9
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,14 @@ static int check_equal_pos(const double *posa, const double *posb, double tol) {
6161
tol = fabs(tol);
6262
if(tol < 1e-30) tol = 1e-30;
6363

64-
for(i = 0; i < 3; i++) if(fabs(posa[i] - posb[i]) > tol) {
64+
for(i = 0; i < 3; i++) {
65+
if(fabs(posa[i] - posb[i]) <= tol) continue;
66+
if(isnan(posa[i]) && isnan(posb[i])) continue;
67+
6568
fprintf(stderr, " A[%d] = %.9g vs B[%d] = %.9g\n", i, posa[i], i, posb[i]);
6669
return i + 1;
6770
}
71+
6872
return 0;
6973
}
7074

@@ -841,16 +845,10 @@ static int test_geom_posvel() {
841845
if(!is_ok("geom_posvel", novas_geom_posvel(&source, &frame, NOVAS_ICRS, pos0, vel0))) return 1;
842846

843847
if(!is_ok("geom_posvel:pos:null", novas_geom_posvel(&source, &frame, NOVAS_ICRS, NULL, vel))) return 1;
844-
if(check_equal_pos(vel, vel0, 1e-5)) {
845-
printf("geom_posvel:pos:null\n");
846-
return 1;
847-
}
848+
if(!is_ok("geom_posvel:pos:null:check", check_equal_pos(vel, vel0, 1e-5))) return 1;
848849

849850
if(!is_ok("geom_posvel:vel:null", novas_geom_posvel(&source, &frame, NOVAS_ICRS, pos, NULL))) return 1;
850-
if(check_equal_pos(pos, pos0, 1e-7)) {
851-
printf("geom_posvel:vel:null\n");
852-
return 1;
853-
}
851+
if(!is_ok("geom_posvel:vel:null:check", check_equal_pos(pos, pos0, 1e-7))) return 1;
854852

855853
return 0;
856854
}
@@ -1546,7 +1544,43 @@ static int test_change_observer() {
15461544
return 0;
15471545
}
15481546

1547+
static int test_transform() {
1548+
novas_timespec ts = {};
1549+
novas_frame frame = {};
1550+
observer obs = {};
1551+
novas_transform T = {}, I = {};
1552+
1553+
double pos0[3] = {1.0, 2.0, 3.0}, pos1[3] = {1.0, 2.0, 3.0};
1554+
sky_pos p0 = {}, p1 = {};
15491555

1556+
p0.r_hat[1] = 1.0;
1557+
p1.r_hat[1] = 1.0;
1558+
vector2radec(p0.r_hat, &p0.ra, &p0.dec);
1559+
1560+
novas_set_time(NOVAS_TT, NOVAS_JD_J2000 + 10000.0, 32, 0.0, &ts);
1561+
make_observer_at_geocenter(&obs);
1562+
1563+
if(!is_ok("transform:make_frame", novas_make_frame(NOVAS_REDUCED_ACCURACY, &obs, &ts, 1.0, 2.0, &frame))) return 1;
1564+
if(!is_ok("transform:make", novas_make_transform(&frame, NOVAS_ICRS, NOVAS_TOD, &T))) return 1;
1565+
if(!is_ok("transform:invert", novas_invert_transform(&T, &I))) return 1;
1566+
1567+
novas_transform_vector(pos0, &T, pos1);
1568+
if(!is_ok("transform:vec", !check_equal_pos(pos0, pos1, 1e-9))) return 1;
1569+
1570+
novas_transform_vector(pos1, &I, pos1);
1571+
if(!is_ok("transform:inv:vec", check_equal_pos(pos0, pos1, 1e-9))) return 1;
1572+
1573+
novas_transform_sky_pos(&p0, &T, &p1);
1574+
if(!is_ok("transform:sky", !check_equal_pos(p0.r_hat, p1.r_hat, 1e-9))) return 1;
1575+
1576+
novas_transform_sky_pos(&p1, &I, &p1);
1577+
if(!is_ok("transform:inv:sky", check_equal_pos(p0.r_hat, p1.r_hat, 1e-9))) return 1;
1578+
1579+
if(!is_equal("transform:inv:sky:ra", p0.ra, p1.ra, 1e-9)) return 1;
1580+
if(!is_equal("transform:inv:sky:dec", p0.dec, p1.dec, 1e-9)) return 1;
1581+
1582+
return 0;
1583+
}
15501584

15511585

15521586
int main() {
@@ -1590,6 +1624,7 @@ int main() {
15901624
if(test_radio_refraction()) n++;
15911625
if(test_make_frame()) n++;
15921626
if(test_change_observer()) n++;
1627+
if(test_transform()) n++;
15931628

15941629
n += test_dates();
15951630

0 commit comments

Comments
 (0)