File Coverage

palsrc/palInvf.c
Criterion Covered Total %
statement 17 18 94.4
branch 1 2 50.0
condition n/a
subroutine n/a
pod n/a
total 18 20 90.0


line stmt bran cond sub pod time code
1             /*
2             *+
3             * Name:
4             * palInvf
5              
6             * Purpose:
7             * Invert a linear model of the type produced by the palFitxy routine.
8              
9             * Language:
10             * Starlink ANSI C
11              
12             * Type of Module:
13             * Library routine
14              
15             * Invocation:
16             * palInvf ( double fwds[6], double bkwds[6], int *j )
17              
18             * Arguments:
19             * fwds = double[6] (Given)
20             * model coefficients
21             * bkwds = double[6] (Returned)
22             * inverse model
23             * j = int (Returned)
24             * status: 0 = OK, -1 = no inverse
25              
26             * Description:
27             * The models relate two sets of [x,y] coordinates as follows.
28             * Naming the elements of fwds:
29             * ---
30             * fwds[0] = A
31             * fwds[1] = B
32             * fwds[2] = C
33             * fwds[3] = D
34             * fwds[4] = E
35             * fwds[5] = F
36             * ---
37             * where two sets of coordinates [x1,y1] and [x2,y2] are related
38             * thus:
39             * ---
40             * x2 = A + B * x1 + C * y1
41             * y2 = D + E * x1 + F * y1
42             * ---
43             * the present routine generates a new set of coefficients:
44             * ---
45             * bkwds[0] = P
46             * bkwds[1] = Q
47             * bkwds[2] = R
48             * bkwds[3] = S
49             * bkwds[4] = T
50             * bkwds[5] = U
51             * ---
52             * such that:
53             * ---
54             * x1 = P + Q * x2 + R * y2
55             * y1 = S + T * x2 + U * y2
56             * ---
57             * Two successive calls to palInvf will thus deliver a set
58             * of coefficients equal to the starting values.
59              
60             * See also:
61             * palFitxy, palPxy, palXy2xy and palDcmpf
62              
63             * Authors:
64             * PTW: Pat Wallace (STFC)
65             * GSB: Graham Bell (EAO)
66              
67             * History:
68             * 1990-04-11 (PTW):
69             * SLALIB implementation.
70             * 2004-12-26 (PTW):
71             * Documentation updated.
72             * 2018-10-23 (GSB):
73             * Initial version in C.
74              
75             * Copyright:
76             * Copyright P.T.Wallace. All rights reserved.
77             * Copyright (C) 2018 East Asian Observatory.
78              
79             * Licence:
80             * This program is free software; you can redistribute it and/or modify
81             * it under the terms of the GNU General Public License as published by
82             * the Free Software Foundation; either version 2 of the License, or
83             * (at your option) any later version.
84             *
85             * This program is distributed in the hope that it will be useful,
86             * but WITHOUT ANY WARRANTY; without even the implied warranty of
87             * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
88             * GNU General Public License for more details.
89             *
90             * You should have received a copy of the GNU General Public License
91             * along with this program (see SLA_CONDITIONS); if not, write to the
92             * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
93             * Boston, MA 02110-1301 USA
94             *-
95             */
96              
97 1           void palInvf ( double fwds[6], double bkwds[6], int *j ) {
98             double a, b, c, d, e, f, det;
99              
100 1           a = fwds[0];
101 1           b = fwds[1];
102 1           c = fwds[2];
103 1           d = fwds[3];
104 1           e = fwds[4];
105 1           f = fwds[5];
106 1           det = b * f - c * e;
107              
108 1 50         if ( det != 0.0 ) {
109 1           bkwds[0] = (c * d - a * f) / det;
110 1           bkwds[1] = f / det;
111 1           bkwds[2] = -c / det;
112 1           bkwds[3] = (a * e - b * d) / det;
113 1           bkwds[4] = -e / det;
114 1           bkwds[5] = b / det;
115 1           *j = 0;
116             } else {
117 0           *j = -1;
118             }
119 1           }