source: MML/trunk/at/simulator/element/interpolate.c @ 4

Last change on this file since 4 was 4, checked in by zhangj, 10 years ago

Initial import--MML version from SOLEIL@2013

File size: 4.5 KB
Line 
1/* Interpolate.c
2   Accelerator Toolbox
3   Created: 14/11/08
4   Z.Marti­ zeus@cells.es
5 
6 
7 
8 Numerical recipies functions for 2D interpolation adapted to Matlab
9 * leanguagge
10 
11*/
12
13/*x1a is the direction of the colums: y and x1a the direction of the rows:x*/
14
15
16/****************************************************************************/
17/****************************Bilinear interpolation*****************************/
18/****************************************************************************/
19
20void linint(double *x1a, double *x2a, double *ya, int m, int n, double x1, double x2, double *y)
21{
22    int klo,khi,k,ilo,ihi,i;
23    double u,t,y1,y2,y3,y4,f;
24
25    if((x1<=x1a[m-1])&&(x1>=x1a[0])&&(x2<=x2a[n-1])&&(x2>=x2a[0]))
26    {
27        ilo=0;
28        ihi=m-1;       
29        klo=0;
30        khi=n-1;
31       
32        while (ihi-ilo > 1) 
33        {
34            i=(ihi+ilo) >> 1;
35            if (x1a[i] > x1) ihi=i;
36            else ilo=i;
37        }
38       
39        while (khi-klo > 1) 
40        {
41            k=(khi+klo) >> 1;
42            if (x2a[k] > x2) khi=k;
43            else klo=k;
44        }
45        y1=ya[ilo+klo*m];
46        y2=ya[ilo+khi*m];
47        y3=ya[ihi+khi*m];
48        y4=ya[ihi+klo*m];
49       
50        if (x1a[ihi]==x1a[ilo]||x2a[khi]==x2a[klo])
51        {
52            mexErrMsgTxt("Bad xa input to routine linint");
53        }
54   
55        else
56   
57        {
58            u=(x1-x1a[ilo])/(x1a[ihi]-x1a[ilo]);
59            t=(x2-x2a[klo])/(x2a[khi]-x2a[klo]);
60        }
61        f=(1-t)*(1-u)*y1+t*(1-u)*y2+t*u*y3+(1-t)*u*y4;
62       
63    }
64    else
65    {/*This is redundant...The limits have been taking as apertures previously*/
66        /*mexPrintf("Out of Id data range\n");*/
67        f=sqrt(-1);
68    }
69    *y=f; 
70}
71
72
73/****************************************************************************/
74/****************************Cubic interpolation*****************************/
75/****************************************************************************/
76
77
78
79void splin2(double *x1a, double *x2a, double *ya, double *y2a, int m, int n, double x1, double x2, double *y)
80{
81        void spline(double *x, double *y, int n, double yp1, double ypn, double *y2);
82    void splint(double xa[], double ya[], double y2a[], int n, double x, double *y);
83    int j,i;
84        double *ytmp,*yytmp,*yaj,*y2aj;
85     
86        ytmp=(double*)mxCalloc(m,sizeof(double));
87        yytmp=(double*)mxCalloc(m,sizeof(double));   
88        yaj=(double*)mxCalloc(n,sizeof(double));
89        y2aj=(double*)mxCalloc(n,sizeof(double)); 
90   
91
92        for (j=0;j<m;j++)
93    {       
94        /*Take one row of ya and y2a*/   
95        for (i=0;i<n;i++)
96        {
97            yaj[i]=ya[j+i*m];
98            y2aj[i]=y2a[j+i*m];
99        }
100        splint(x2a,yaj,y2aj,n,x2,&yytmp[j]);
101
102    }
103    mxFree(yaj);   
104    mxFree(y2aj);
105
106        spline(x1a,yytmp,m,1.0e30,1.0e30,ytmp);
107        splint(x1a,yytmp,ytmp,m,x1,y);
108    mxFree(ytmp);
109    mxFree(yytmp);
110   
111}
112
113
114void splie2(double *x1a, double *x2a, double *ya, int m, int n, double *y2a)
115{
116        void spline(double *x, double *y, int n, double yp1, double ypn, double *y2);
117    int j,i;
118    double *yaj,*y2aj;
119       
120
121    yaj=(double*)mxCalloc(n,sizeof(double));
122        y2aj=(double*)mxCalloc(n,sizeof(double)); 
123   
124     
125    for (j=0;j<m;j++)
126    {       
127        /*Take one row of ya and y2a*/   
128        for (i=0;i<n;i++)
129        {
130            yaj[i]=ya[j+i*m];
131            y2aj[i]=y2a[j+i*m];
132        }
133        spline(x2a,yaj,n,1.0e30,1.0e30,y2aj);
134    }   
135    mxFree(yaj); 
136    mxFree(y2aj);
137}
138
139
140
141void spline(double *x, double *y, int n, double yp1, double ypn, double *y2)
142{
143        int i,k;
144        double p,qn,sig,un,*u; 
145     
146        u=(double*)mxCalloc(n-1,sizeof(double));
147   
148        if (yp1 > 0.99e30)
149                y2[0]=u[0]=0.0;
150        else {
151                y2[0] = -0.5;
152                u[0]=(3.0/(x[1]-x[0]))*((y[1]-y[0])/(x[1]-x[0])-yp1);
153        }
154
155     
156        for (i=1;i<=n-2;i++) {
157                sig=(x[i]-x[i-1])/(x[i+1]-x[i-1]);
158                p=sig*y2[i-1]+2.0;
159                y2[i]=(sig-1.0)/p;
160                u[i]=(y[i+1]-y[i])/(x[i+1]-x[i]) - (y[i]-y[i-1])/(x[i]-x[i-1]);
161                u[i]=(6.0*u[i]/(x[i+1]-x[i-1])-sig*u[i-1])/p;
162        }
163
164        if (ypn > 0.99e30)
165                qn=un=0.0;
166        else {
167                qn=0.5;
168                un=(3.0/(x[n-1]-x[n-2]))*(ypn-(y[n-1]-y[n-2])/(x[n-1]-x[n-2]));
169        }
170       
171     
172    y2[n-1]=(un-qn*u[n-2])/(qn*y2[n-2]+1.0);
173
174   
175        for (k=n-2;k>=0;k--)
176                y2[k]=y2[k]*y2[k+1]+u[k];
177        mxFree(u);
178
179}
180
181
182void splint(double xa[], double ya[], double y2a[], int n, double x, double *y)
183{
184        int klo,khi,k;
185        double h,b,a;
186   
187
188
189        klo=1;
190        khi=n;
191        while (khi-klo > 1) {
192                k=(khi+klo) >> 1;
193                if (xa[k] > x) khi=k;
194                else klo=k;
195        }
196        h=xa[khi]-xa[klo];
197        if (h == 0.0) mexErrMsgTxt("Bad xa input to routine splint");
198        a=(xa[khi]-x)/h;
199        b=(x-xa[klo])/h;
200        *y=a*ya[klo]+b*ya[khi]+((a*a*a-a)*y2a[klo]+(b*b*b-b)*y2a[khi])*(h*h)/6.0;
201}
Note: See TracBrowser for help on using the repository browser.