10int Pmfit (
double phi,
char mount,
int n,
double* obs,
int nt,
11 double* pm,
double* sigmas,
double* skysig )
60 #define BF(i,j) bf[i*2+j]
63 typedef struct {
double r, p;
double xy[2]; } SAM;
79 const int nitmax = 20;
81 int jstat, it, m, i, j, ij;
82 double tst, oblon, oblat, elon, elat, enclon, enclat, w, adj, sumr2,
87 if ( n < 1 )
return -1;
97 y = (SAM*) malloc ( n *
sizeof(SAM) );
100 bf = (
double*) malloc ( nt *
sizeof(
double) * 2 );
103 a = (
double*) malloc ( nt * nt *
sizeof(
double) );
106 ai = (
double*) malloc ( nt * nt *
sizeof(
double) );
109 v = (
double*) malloc ( nt *
sizeof(
double) );
112 if ( ! ( y && bf && a && ai && v ) ) {
121 for ( i = 0; i < nt; i++ ) pm[i] = 0.0;
127 for ( it = 0; it < nitmax; it++ ) {
135 for ( m = 0; m < n; m++ ) {
146 if (
Bfun ( nt, phi, mount, elon, elat, bf ) )
goto free;
147 for ( j = 0; j < nt; j++ ) {
148 elon += ( pm[j] *
BF(j,0) ) / cos(elat);
149 elat += pm[j] *
BF(j,1);
155 y[m].xy[0] =
iauAnpm(oblon-elon)*cos(oblat);
156 y[m].xy[1] =
iauAnpm(oblat-elat);
162 for ( i = 0; i < nt; i++ ) {
164 for ( j = 0; j < nt; j++ ) {
171 for ( m = 0; m < n; m++ ){
174 if (
Bfun ( nt, phi, mount, y[m].r, y[m].p, bf ) )
goto free;
177 for ( i = 0; i < nt; i++ ) {
178 v[i] +=
BF(i,0)*y[m].xy[0] +
BF(i,1)*y[m].xy[1];
179 for ( j = 0; j < nt; j++ ) {
181 a[ij] +=
BF(i,0)*
BF(j,0) +
BF(i,1)*
BF(j,1);
188 if (
Simeqn ( nt, a, v ) )
goto free;
192 for ( i = 0; i < nt; i++ ) {
197 if ( w >= tst )
break;
213 for ( m = 0; m < n; m++ ){
224 if (
Bfun ( nt, phi, mount, elon, elat, bf ) )
goto free;
225 for ( j = 0; j < nt; j++ ) {
226 elon += ( pm[j] *
BF(j,0) ) / cos(elat);
227 elat += pm[j] *
BF(j,1);
231 w =
iauAnpm(oblon-elon)*cos(oblat);
240 skyvar = sumr2 / (double) (n-nt);
243 for ( i = 0; i < nt; i++ ) sigmas[i] = sqrt ( skyvar * a[i*(nt+1)] );
246 *skysig = sqrt(skyvar);
267int Bfun (
int nt,
double phi,
char mount,
double rdem,
double pdem,
344 #define BF(i,j) bf[i*2+j]
347 const double nterms = 6;
349 double sp, cp, hdem, ddem, adem, edem,
350 sh, ch, sd, cd, sa, ca, se, ce;
354 if ( nt < 1 || nt > (
int)nterms )
return -1;
361 switch ( (
int) mount ) {
368 iauHd2ae ( hdem, ddem, phi, &adem, &edem );
376 iauAe2hd ( adem, edem, phi, &hdem, &ddem );
420 switch ( (
int) mount ) {
428 if (nt > 0) {
BF(0,0) = cd;
BF(0,1) = 0.0; }
429 if (nt > 1) {
BF(1,0) = 0.0;
BF(1,1) = 1.0; }
430 if (nt > 2) {
BF(2,0) = sh*sd;
BF(2,1) = ch; }
431 if (nt > 3) {
BF(3,0) = -ch*sd;
BF(3,1) = sh; }
432 if (nt > 4) {
BF(4,0) = 1.0;
BF(4,1) = 0.0; }
433 if (nt > 5) {
BF(5,0) = cp*sh;
BF(5,1) = cp*ch*sd-sp*cd; }
443 if (nt > 0) {
BF(0,0) = -ce;
BF(0,1) = 0.0; }
444 if (nt > 1) {
BF(1,0) = 0.0;
BF(1,1) = 1.0; }
445 if (nt > 2) {
BF(2,0) = -sa*se;
BF(2,1) = -ca; }
446 if (nt > 3) {
BF(3,0) = -ca*se;
BF(3,1) = sa; }
447 if (nt > 4) {
BF(4,0) = -1.0;
BF(4,1) = 0.0; }
448 if (nt > 5) {
BF(5,0) = 0.0;
BF(5,1) = -ce; }
510 #define SWAP(a,b) ( t=a, a=b, b=t )
514 int js, k, imx, i, j, ki;
524 if ( n < 1 )
return -1;
527 iw = (
int*) malloc ( n *
sizeof(
int) );
528 if ( ! iw )
return -2;
534 for ( k = 0, ak = a; k < n; k++, ak += n ) {
535 amx = fabs ( ak[k] );
539 for ( i = k+1, ai = ak+n; i < n; i++, ai += n ) {
548 if ( amx <
TINY )
goto free;
550 for ( j = 0; j < n; j++ ) {
551 SWAP ( ak[j], aimx[j] );
553 SWAP ( y[k], y[imx] );
557 for ( j = 0; j < n; j++ ) {
564 for ( i = 0, ai = a; i < n; i++, ai += n ) {
566 for ( j = 0; j < n; j++ ) {
568 ai[j] -= ai[k] * ak[j];
574 for ( i = 0, ai = a; i < n; i++, ai += n ) {
580 for ( k = n; k-- > 0; ) {
583 for ( i = 0, ai = a; i < n; i++, ai += n ) {
584 SWAP ( ai[k], ai[ki] );
int Pmfit(double phi, char mount, int n, double *obs, int nt, double *pm, double *sigmas, double *skysig)
int Bfun(int, double, char, double, double, double *)