NCCOOS Trac Projects: Top | Web | Platforms | Processing | Viz | Sprints | Sandbox | (Wind)

root/gliderproc/trunk/MATLAB/opnml/MEX/ele2neimex5.c

Revision 495 (checked in by cbc, 12 years ago)

Initial import of Stark code.

Line 
1 #include <math.h>
2 #include <stdio.h>
3 #include "mex.h"
4 #define NEIMAX 20
5 #include "opnml_mex5_allocs.c"
6
7 /************************************************************
8
9   ####     ##     #####  ######  #    #    ##     #   #
10  #    #   #  #      #    #       #    #   #  #     # #
11  #       #    #     #    #####   #    #  #    #     #
12  #  ###  ######     #    #       # ## #  ######     #
13  #    #  #    #     #    #       ##  ##  #    #     #
14   ####   #    #     #    ######  #    #  #    #     #
15
16 ************************************************************/
17
18 /* PROTOTYPES */
19 void isort2(unsigned long n, int arr[], int brr[]);
20 void mexFunction(int            nlhs,
21                  mxArray       *plhs[],
22                  int            nrhs,
23                  const mxArray *prhs[])
24
25 {
26    /* all pointers start off as NULL */
27    int **ele,**nei=NULL,*numnei=NULL,*itheta=NULL,*ilist=NULL;
28    double *dnei, *dele, *x,*y,xc,yc,dx,dy;
29    int maxnei=0;
30    int i,j,k,kk,l,ll,ne,nn,no;
31
32 /* ---- check I/O arguments ----------------------------------------- */
33    if (nrhs != 3)  mexErrMsgTxt("ele2nei requires 3 input arguments.");
34    else if (nlhs!= 1)  mexErrMsgTxt("ele2nei requires 1 output arguments.");
35
36 /* ---- dereference input ------------------------------------------- */
37    dele=mxGetPr(prhs[0]);
38    ne=mxGetM(prhs[0]);
39    x=mxGetPr(prhs[1]);
40    y=mxGetPr(prhs[2]);
41    nn=mxGetM(prhs[1]);
42    fprintf(stderr,"NE = %d\n",ne); 
43    fprintf(stderr,"NN = %d\n",nn); 
44
45 /* ---- allocate space for int representation of dele &
46         convert double element representation to int         -------- */
47    ele=(int **)mxImatrix(1,ne,1,3);
48    for (i=1;i<=ne;i++){
49       for(j=1;j<=3;j++){
50          ele[i][j]=((int)dele[(i-1)+(j-1)*ne]);
51       }
52    }
53            
54 /* Allocate neighbor list array with matlab alloc routines in NRC style */
55    nei=(int **)mxImatrix(1,nn,1,NEIMAX);
56    numnei=(int *)mxIvector(1,nn);
57      
58    fprintf(stderr,"Computing neighbor list (Max=%d)...\n",NEIMAX); 
59    for(k=1;k<=nn;k++){
60       nei[k][1]=k;
61       numnei[k]=1;
62       for(l=1;l<=ne;l++){
63          for(ll=1;ll<=3;ll++){
64             if(ele[l][ll]==k)
65                goto l83;
66          }                   
67          goto l81;
68  l83:    no=numnei[k];
69          for(ll=1;ll<=3;ll++){
70             for(kk=1;kk<=no;kk++)
71                if(ele[l][ll]==nei[k][kk])goto l84;
72             /* new neighbor */
73             no++;
74             nei[k][no]=ele[l][ll];
75             numnei[k]=no;
76  l84:       continue;
77          }
78  l81:    continue;
79       }
80    }
81
82    maxnei=0;
83    for(k=1;k<=nn;k++)
84       maxnei=IMAX(maxnei,numnei[k]);
85    maxnei--;
86    fprintf(stderr,"Max Number of neighbors = %d\n",maxnei);
87
88 /* sort each node's neighbors into CCW around center node; ---------- */
89    puts("Sorting neighboring node order on ANGLE");
90    itheta=(int *)mxIvector(1,NEIMAX);
91    ilist=(int *)mxIvector(1,NEIMAX);
92    
93    for(k=1;k<=nn;k++){
94       xc=x[k-1];yc=y[k-1];
95       for(j=2;j<=numnei[k];j++){         
96          dx=x[nei[k][j]-1]-xc;
97          dy=y[nei[k][j]-1]-yc;
98          itheta[j-1]=(int)floor((atan2(dy,dx))*180./3.14159);
99          if(itheta[j-1]<0)itheta[j-1]=itheta[j-1]+360;
100          ilist[j-1]=nei[k][j];
101       }
102
103       isort2(numnei[k]-1,itheta,ilist);
104       for(j=2;j<=numnei[k];j++)
105          nei[k][j]=ilist[j-1];
106
107    }
108    puts("Sorting finished");
109    
110 /* allocate and fill double neighbor vector for return */
111    dnei=(double *)mxDvector(0,nn*maxnei);   
112    for(j=0;j<maxnei;j++)
113       for(k=0;k<nn;k++)
114          dnei[k+j*nn]=(double)nei[k+1][j+2];
115    
116    plhs[0]=mxCreateDoubleMatrix(nn,maxnei,mxREAL);
117    mxSetPr(plhs[0],dnei);
118          
119 /* ---- No need to free memory allocated with "mxCalloc"; MATLAB
120    does this automatically.  The CMEX allocation functions in
121    "opnml_allocs.c" use mxCalloc. ----------------------------------- */
122    return;   
123
124
125 }
126 /*  NRC isort2 routine */
127
128 #define M 7
129 #define NSTACK 50
130 #define SWAP(AA,BB) temp=(AA);(AA)=(BB);(BB)=temp;
131
132 void isort2(unsigned long n, int arr[], int brr[])
133 {
134    unsigned long i,ir=n,j,k,l=1;
135    int *istack,jstack=0;
136    int a,b,temp;
137
138    istack=(int *)Ivector(1,NSTACK);
139    for (;;) {
140       if (ir-l < M) {
141          for (j=l+1;j<=ir;j++) {
142             a=arr[j];
143             b=brr[j];
144             for (i=j-1;i>=1;i--) {
145                if (arr[i] <= a) break;
146                arr[i+1]=arr[i];
147                brr[i+1]=brr[i];
148             }
149             arr[i+1]=a;
150             brr[i+1]=b;
151          }
152          if (!jstack) {
153             free_Ivector(istack,1,NSTACK);
154             return;
155          }
156          ir=istack[jstack];
157          l=istack[jstack-1];
158          jstack -= 2;
159       } else {
160          k=(l+ir) >> 1;
161          SWAP(arr[k],arr[l+1])
162          SWAP(brr[k],brr[l+1])
163          if (arr[l+1] > arr[ir]) {
164             SWAP(arr[l+1],arr[ir])
165             SWAP(brr[l+1],brr[ir])
166          }
167          if (arr[l] > arr[ir]) {
168             SWAP(arr[l],arr[ir])
169             SWAP(brr[l],brr[ir])
170          }
171          if (arr[l+1] > arr[l]) {
172             SWAP(arr[l+1],arr[l])
173             SWAP(brr[l+1],brr[l])
174          }
175          i=l+1;
176          j=ir;
177          a=arr[l];
178          b=brr[l];
179          for (;;) {
180             do i++; while (arr[i] < a);
181             do j--; while (arr[j] > a);
182             if (j < i) break;
183             SWAP(arr[i],arr[j])
184             SWAP(brr[i],brr[j])
185          }
186          arr[l]=arr[j];
187          arr[j]=a;
188          brr[l]=brr[j];
189          brr[j]=b;
190          jstack += 2;
191          if (jstack > NSTACK) nrerror("NSTACK too small in isort2.");
192          if (ir-i+1 >= j-l) {
193             istack[jstack]=ir;
194             istack[jstack-1]=i;
195             ir=j-1;
196          } else {
197             istack[jstack]=j-1;
198             istack[jstack-1]=l;
199             l=i;
200          }
201       }
202    }
203 }
204 #undef M
205 #undef NSTACK
206
207
208
Note: See TracBrowser for help on using the browser.