IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 37630


Ignore:
Timestamp:
Nov 18, 2014, 8:22:08 PM (12 years ago)
Author:
eugene
Message:

add spherical harmonic fitting functions

Location:
branches/eam_branches/ipp-20140904/Ohana/src/opihi/cmd.data
Files:
2 added
3 edited

Legend:

Unmodified
Added
Removed
  • branches/eam_branches/ipp-20140904/Ohana/src/opihi/cmd.data/Makefile

    r37546 r37630  
    164164$(SRC)/shterms.$(ARCH).o           \
    165165$(SRC)/shfit.$(ARCH).o     \
     166$(SRC)/shdot.$(ARCH).o     \
     167$(SRC)/shapply.$(ARCH).o           \
    166168$(SRC)/wd.$(ARCH).o                \
    167169$(SRC)/write_vectors.$(ARCH).o     \
  • branches/eam_branches/ipp-20140904/Ohana/src/opihi/cmd.data/init.c

    r37546 r37630  
    152152int shterms          PROTO((int, char **));
    153153int shfit            PROTO((int, char **));
     154int shdot            PROTO((int, char **));
     155int shapply          PROTO((int, char **));
    154156int wd               PROTO((int, char **));
    155157int write_vectors    PROTO((int, char **));
     
    323325  {1, "shterms",      shterms,          "Spherical Harmonics terms"},
    324326  {1, "shfit",        shfit,            "Spherical Harmonics fits"},
     327  {1, "shdot",        shdot,            "Spherical Harmonics dot product"},
     328  {1, "shapply",      shapply,          "Spherical Harmonics fit application"},
    325329  {1, "wd",           wd,               "write an image to a file"},
    326330  {1, "write",        write_vectors,    "write vectors to datafile"},
  • branches/eam_branches/ipp-20140904/Ohana/src/opihi/cmd.data/shfit.c

    r37546 r37630  
    33int shfit (int argc, char **argv) {
    44 
    5   int i, j;
     5  int i, j, k;
    66  Vector *Rvec, *Dvec, *Fvec, *Lvec, *Mvec, *Frvec, *Fivec;
    77  double *Fr, *Fi;
     
    3434  ResetVector (Mvec,  OPIHI_FLT, terms->Nterms);
    3535
    36   // measure the dot product \sum(F_i * Ylm_i)
     36  double **Ar, **br, **Ai, **bi;
     37  ALLOCATE (Ar, double *, terms->Nterms);
     38  ALLOCATE (Ai, double *, terms->Nterms);
     39  ALLOCATE (br, double *, terms->Nterms);
     40  ALLOCATE (bi, double *, terms->Nterms);
     41  for (i = 0; i < terms->Nterms; i++) {
     42    ALLOCATE_ZERO (Ar[i], double, terms->Nterms);
     43    ALLOCATE_ZERO (Ai[i], double, terms->Nterms);
     44    ALLOCATE_ZERO (br[i], double, 1);
     45    ALLOCATE_ZERO (bi[i], double, 1);
     46  }
     47
     48  // measure the dot product \sum(F_i * Ylm_i) and the cross terms (\sum(Y_lm * Y_jk))
    3749  for (i = 0; i < Rvec->Nelements; i++) {
    3850
     
    4254
    4355    for (j = 0; j < terms->Nterms; j++) {
    44       Fr[j] += Fv * terms->Fr[j];
    45       Fi[j] += Fv * terms->Fi[j];
     56      br[j][0] += Fv * terms->Fr[j];
     57      bi[j][0] += Fv * terms->Fi[j];
     58    }
     59
     60    for (j = 0; j < terms->Nterms; j++) {
     61      for (k = j; k < terms->Nterms; k++) {
     62        Ar[j][k] += terms->Fr[j] * terms->Fr[k];
     63        Ai[j][k] += terms->Fi[j] * terms->Fi[k];
     64      }
    4665    }
    4766  }
    4867
    49   // for (j = 0; j < terms->Nterms; j++) {
    50   //   fprintf (stderr, "%d : %d %d : %f %f\n", j, terms->l[j], terms->m[j], Fr[j], Fi[j]);
    51   // }
     68  for (j = 1; j < terms->Nterms; j++) {
     69    for (k = 0; k < j; k++) {
     70      Ar[j][k] = Ar[k][j];
     71      Ai[j][k] = Ai[k][j];
     72    }   
     73  }
    5274
    5375  for (j = 0; j < terms->Nterms; j++) {
    54     Fr[j] /= Fvec->Nelements;
    55     Fi[j] /= Fvec->Nelements;
     76    if (terms->m[j] == 0) {
     77      Ai[j][j] = 1.0; // Im(Y_l0) == 0.0
     78      bi[j][0] = 0.0;
     79    } else {
     80      if (terms->m[j] < 0) {
     81        for (k = 0; k < terms->Nterms; k++) {
     82          Ar[j][k] = 0.0;
     83          Ar[k][j] = 0.0;
     84          Ai[j][k] = 0.0;
     85          Ai[k][j] = 0.0;
     86        }
     87        Ar[j][j] = 1.0;
     88        Ai[j][j] = 1.0;
     89        br[j][0] = 0.0;
     90        bi[j][0] = 0.0;
     91        // Re(Y_lm) = Re(Y_l(-m)) [m even], Re(Y_lm) = Re(-Y_l(-m)) [m odd]
     92      }
     93    }
     94  }
     95
     96  if (0) {
     97    fprintf (stderr, "--- Ar --- : br \n");
     98    for (i = 0; i < terms->Nterms; i++) {
     99      for (j = 0; j < terms->Nterms; j++) {
     100        fprintf (stderr, "%10.6f ", Ar[i][j]);
     101      }
     102      fprintf (stderr, " : %10.6f\n", br[i][0]);
     103    }
     104
     105    fprintf (stderr, "--- Ai --- : bi \n");
     106    for (i = 0; i < terms->Nterms; i++) {
     107      for (j = 0; j < terms->Nterms; j++) {
     108        fprintf (stderr, "%10.6f ", Ai[i][j]);
     109      }
     110      fprintf (stderr, " : %10.6f\n", bi[i][0]);
     111    }
     112  }
     113
     114  fprintf (stderr, "--- Ar --- : br \n");
     115  for (j = 0; j < terms->Nterms; j++) {
     116    fprintf (stderr, "%10.6f ", Ar[j][j]);
     117    fprintf (stderr, " : %10.6f\n", br[j][0]);
     118  }
     119
     120  fprintf (stderr, "--- Ai --- : bi \n");
     121  for (i = 0; i < terms->Nterms; i++) {
     122    fprintf (stderr, "%10.6f : ", Ai[i][i]);
     123    fprintf (stderr, " : %10.6f\n", bi[i][0]);
     124  }
     125
     126  if (!dgaussjordan (Ar, br, terms->Nterms, 1)) {
     127    gprint (GP_ERR, "failed to fit data : ill-conditioned matrix\n");
     128    return FALSE;
     129  }
     130  if (!dgaussjordan (Ai, bi, terms->Nterms, 1)) {
     131    gprint (GP_ERR, "failed to fit data : ill-conditioned matrix\n");
     132    return FALSE;
     133  }
     134
     135  for (j = 0; j < terms->Nterms; j++) {
     136    Fr[j] = br[j][0] / (float) Frvec[0].Nelements;
     137    Fi[j] = bi[j][0] / (float) Fivec[0].Nelements;
    56138  }
    57139
Note: See TracChangeset for help on using the changeset viewer.