00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <stdio.h>
00025 #include <stdlib.h>
00026 #include <math.h>
00027
00028 #define minval(x,y) (((x) < (y)) ? (x) : (y))
00029 #define maxval(x,y) (((x) < (y)) ? (y) : (x))
00030
00031 #define MAXIMUML 1800
00032
00033 char *cvsinfo_setplm2 = "cvsinfo: $Header: /home/cvsuser/cvsroot/JSOC/proj/globalhs/libs/projection/setplm2.c,v 1.1 2013/04/28 07:46:05 tplarson Exp $";
00034
00035 setplm2(int lmin,int lmax,int m,long nx,int *indx,double *x,long nplm,double *plm,double *dplm)
00036 {
00037 double eps=1.0e-12;
00038 double *x1=malloc(nx*sizeof(double));
00039 double *x2=malloc(nx*sizeof(double));
00040 double *x3=malloc(nx*sizeof(double));
00041 if (lmax > MAXIMUML)
00042 {
00043 fprintf(stderr,"setplm2 called with lmax larger than %d\n", MAXIMUML);
00044 return 1;
00045 }
00046
00047 if (lmin < m)
00048 lmin=m;
00049
00050 long i,j;
00051 for (i=0;i<nx;i++)
00052 {
00053 x1[i]=minval(1.0-eps,maxval(-1.0+eps,x[i]));
00054 x2[i]=1.0/(x1[i]*x1[i]-1.0);
00055 x3[i]=x1[i]*x2[i];
00056 }
00057
00058 int im,im1;
00059 double c;
00060 if (lmin <= m+1)
00061 {
00062 im=indx[m];
00063 c=sqrt((2*m+1)/2.0);
00064 for (i=1;i<=m;i++)
00065 c*=-sqrt(1-0.5/i);
00066 }
00067
00068 if (lmin == m)
00069 {
00070 for (i=0;i<nx;i++)
00071 {
00072
00073 plm[im*nplm + i]=c;
00074 for (j=1;j<=m;j++)
00075
00076 plm[im*nplm + i]*=sqrt(1.0 - x1[i]*x1[i]);
00077 }
00078 }
00079
00080 if (lmax > m && lmin <= m+1)
00081 {
00082 im1=indx[m+1];
00083 c=sqrt(2*m + 3.0);
00084 for (i=0;i<nx;i++)
00085
00086 plm[im1*nplm + i]=x1[i]*c*plm[im*nplm + i];
00087 }
00088
00089 long m2,l,l2,il0,il1,il2;
00090 double c1,c2;
00091 m2=m*m;
00092 for (l=maxval(lmin,m+2);l<=lmax;l++)
00093 {
00094 l2=l*l;
00095 il0=indx[l];
00096 il1=indx[l-1];
00097 il2=indx[l-2];
00098 c1=sqrt((4*l2-1.0)/(l2-m2));
00099 c2=sqrt(((2*l+1.0)*(l+m-1)*(l-m-1))/((2*l-3.0)*(l2-m2)));
00100 for (i=0;i<nx;i++)
00101
00102 plm[il0*nplm + i]=c1*x1[i]*plm[il1*nplm + i]-c2*plm[il2*nplm + i];
00103 }
00104
00105 if (dplm != NULL)
00106 {
00107 im=indx[m];
00108 for (i=0;i<nx;i++)
00109
00110 dplm[im*nplm + i]=m*x3[i]*plm[im*nplm + i];
00111 for (l=m+1;l<=lmax;l++)
00112 {
00113 il0=indx[l];
00114 il1=indx[l-1];
00115 c=sqrt((2.0*l+1.0)*(l*l-m2)/(2.0*l-1));
00116 for (i=0;i<nx;i++)
00117
00118 dplm[il0*nplm + i]=l*x3[i]*plm[il0*nplm + i]-c*x2[i]*plm[il1*nplm + i];
00119
00120 }
00121 }
00122
00123 free(x1);
00124 free(x2);
00125 free(x3);
00126
00127 }